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:
+22
-28
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user