feat(back) : export tickets de pesée — colonnes Fournisseur/Client/Autre + Statut (ERP-193)

Remplace les colonnes « Type contrepartie » + « Contrepartie » par 3 colonnes
mutuellement exclusives Fournisseur / Client / Autre (miroir de la liste), et
ajoute une colonne Statut (« En attente » / « Terminée »).
This commit is contained in:
2026-06-24 15:15:25 +02:00
parent 819ac5e608
commit 31678cb716
2 changed files with 33 additions and 32 deletions
@@ -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,
};
}
@@ -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();