diff --git a/src/Module/Logistique/Infrastructure/Controller/WeighingTicketExportController.php b/src/Module/Logistique/Infrastructure/Controller/WeighingTicketExportController.php index f15cd56..5e0ad85 100644 --- a/src/Module/Logistique/Infrastructure/Controller/WeighingTicketExportController.php +++ b/src/Module/Logistique/Infrastructure/Controller/WeighingTicketExportController.php @@ -146,8 +146,11 @@ final class WeighingTicketExportController { return [ 'Numéro', - 'Type contrepartie', - 'Contrepartie', + // Contrepartie eclatee en 3 colonnes mutuellement exclusives (miroir de + // la liste / repertoire, ERP-193) plutot que « type + nom ». + 'Fournisseur', + 'Client', + 'Autre', 'Date', 'Immatriculation', 'Poids vide (kg)', @@ -155,6 +158,7 @@ final class WeighingTicketExportController 'Poids net (kg)', 'DSD vide', 'DSD plein', + 'Statut', ]; } @@ -166,10 +170,14 @@ final class WeighingTicketExportController private function buildRows(array $tickets): iterable { foreach ($tickets as $ticket) { + $type = $ticket->getCounterpartyType(); + yield [ - $ticket->getNumber(), - $this->counterpartyTypeLabel($ticket->getCounterpartyType()), - $this->counterpartyName($ticket), + $ticket->getNumber() ?? '', + // Une seule des 3 colonnes est renseignee selon le type (RG-5.03). + 'FOURNISSEUR' === $type ? ($ticket->getSupplier()?->getCompanyName() ?? '') : '', + 'CLIENT' === $type ? ($ticket->getClient()?->getCompanyName() ?? '') : '', + 'AUTRE' === $type ? ($ticket->getOtherLabel() ?? '') : '', $ticket->getDisplayDate()?->format('d/m/Y H:i') ?? '', $ticket->getImmatriculation() ?? '', $ticket->getEmptyWeight() ?? '', @@ -177,36 +185,22 @@ final class WeighingTicketExportController $ticket->getNetWeight() ?? '', $ticket->getEmptyDsd() ?? '', $ticket->getFullDsd() ?? '', + $this->statusLabel($ticket->getStatus()), ]; } } /** - * Libelle FR du type de contrepartie (RG-5.03). Renvoie la valeur brute pour - * une valeur inattendue (garde-fou : ne masque pas une donnee corrompue). + * Libelle FR du statut du cycle de vie (ERP-193) : « En attente » (DRAFT) ou + * « Terminée » (VALIDATED). Renvoie la valeur brute pour une valeur inattendue + * (garde-fou : ne masque pas une donnee corrompue). */ - private function counterpartyTypeLabel(?string $type): string + private function statusLabel(string $status): string { - return match ($type) { - 'CLIENT' => 'Client', - 'FOURNISSEUR' => 'Fournisseur', - 'AUTRE' => 'Autre', - default => $type ?? '', - }; - } - - /** - * Nom de la contrepartie selon le type (RG-5.03) : raison sociale du client, - * du fournisseur, ou libelle libre « Autre ». Client / Supplier sont - * fetch-joines par le repository (anti N+1, § 4.0). - */ - private function counterpartyName(WeighingTicket $ticket): string - { - return match ($ticket->getCounterpartyType()) { - 'CLIENT' => $ticket->getClient()?->getCompanyName() ?? '', - 'FOURNISSEUR' => $ticket->getSupplier()?->getCompanyName() ?? '', - 'AUTRE' => $ticket->getOtherLabel() ?? '', - default => '', + return match ($status) { + WeighingTicket::STATUS_DRAFT => 'En attente', + WeighingTicket::STATUS_VALIDATED => 'Terminée', + default => $status, }; } diff --git a/tests/Module/Logistique/Api/WeighingTicketExportControllerTest.php b/tests/Module/Logistique/Api/WeighingTicketExportControllerTest.php index 4f967df..bc372b4 100644 --- a/tests/Module/Logistique/Api/WeighingTicketExportControllerTest.php +++ b/tests/Module/Logistique/Api/WeighingTicketExportControllerTest.php @@ -72,8 +72,10 @@ final class WeighingTicketExportControllerTest extends AbstractApiTestCase // 1re ligne = en-tetes attendus (ordre des colonnes § 4.5). $header = $this->gridFromResponse($response->getContent())[0]; self::assertSame('Numéro', $header[0]); - self::assertContains('Type contrepartie', $header); - self::assertContains('Contrepartie', $header); + // Contrepartie eclatee en 3 colonnes (miroir liste, ERP-193). + self::assertContains('Fournisseur', $header); + self::assertContains('Client', $header); + self::assertContains('Autre', $header); self::assertContains('Date', $header); self::assertContains('Immatriculation', $header); self::assertContains('Poids vide (kg)', $header); @@ -81,6 +83,7 @@ final class WeighingTicketExportControllerTest extends AbstractApiTestCase self::assertContains('Poids net (kg)', $header); self::assertContains('DSD vide', $header); self::assertContains('DSD plein', $header); + self::assertContains('Statut', $header); } /** @@ -99,8 +102,11 @@ final class WeighingTicketExportControllerTest extends AbstractApiTestCase $cell = static fn (string $label) => $row[array_search($label, $header, true)] ?? null; - self::assertSame('Client', $cell('Type contrepartie')); - self::assertStringContainsString('BÉTON SA', (string) $cell('Contrepartie')); + // Contrepartie Client → colonne « Client » renseignée, « Fournisseur » / « Autre » vides. + self::assertStringContainsString('BÉTON SA', (string) $cell('Client')); + self::assertSame('', (string) $cell('Fournisseur')); + self::assertSame('', (string) $cell('Autre')); + self::assertSame('Terminée', $cell('Statut')); self::assertSame('AB-123-CD', $cell('Immatriculation')); self::assertSame(7150, (int) $cell('Poids vide (kg)')); self::assertSame(14300, (int) $cell('Poids plein (kg)')); @@ -184,6 +190,7 @@ final class WeighingTicketExportControllerTest extends AbstractApiTestCase $ticket->setFullDsd(42); $ticket->setFullMode('AUTO'); $ticket->setNetWeight(7150); + $ticket->setStatus(WeighingTicket::STATUS_VALIDATED); $em->persist($ticket); $em->flush();