76e7a59ba7
Logique métier d'écriture et de lecture du ticket de pesée (M5).
Processor (POST/PATCH) :
- résolution du site courant (CurrentSiteProvider) + attribution du numéro
{siteCode}-TP-{NNNN} à la création, immuables ensuite (RG-5.02 / RG-5.09) ;
- exclusivité de la contrepartie CLIENT/FOURNISSEUR/AUTRE — null-ification des
champs hors-branche (RG-5.03, garde-fou CHECK Postgres) ;
- normalisation immatriculation trim/UPPER + masque XX-000-XX hors « Tout
format », 422 inline sur le champ si invalide (RG-5.01 / RG-5.10) ;
- DSD autoritaire pour les pesées AUTO via DsdAllocator (verrou), MANUEL conservé
(RG-5.04) ;
- poids net = plein − vide recalculé (RG-5.05).
Provider (GET) : liste paginée (Paginator ORM, règle n°13), recherche ?search=,
tri ?order[displayDate], cloisonnement par site courant appliqué dans le provider
(le SiteScopedQueryExtension ne traverse pas un provider custom), fetch-join
client/supplier/site anti-N+1, 404 hors périmètre / soft-delete.
Ajouts : WeighingTicketNumberAllocator (compteur weighing_ticket_counter,
SELECT FOR UPDATE), WeighingTicketFieldNormalizer, InvalidImmatriculationException
+ alias DI.
make test vert (811), Architecture vert (CollectionsArePaginatedTest).
33 lines
1.2 KiB
PHP
33 lines
1.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Module\Logistique\Application\Service;
|
|
|
|
use App\Module\Sites\Domain\Entity\Site;
|
|
|
|
/**
|
|
* Allocateur du numero de ticket de pesee (RG-5.02, § 2.5).
|
|
*
|
|
* Le numero a le format {siteCode}-TP-{NNNN} (ex. 86-TP-0001), UNIQUE PAR SITE
|
|
* et immuable. Chaque site porte sa propre sequence : 86-TP-0001 et 17-TP-0001
|
|
* coexistent.
|
|
*
|
|
* Le code du site (prefixe) vit sur l'entite Site (site.code, ERP-183) — d'ou le
|
|
* type-hint sur Site concret (et non SiteInterface qui n'expose pas getCode()) ;
|
|
* c'est la meme reference ORM partagee que celle consommee par WeighingTicket
|
|
* (§ 2.1, pas de logique inter-module).
|
|
*
|
|
* Port (couche Application) ; l'implementation (WeighingTicketNumberAllocator,
|
|
* Infrastructure) incremente le compteur weighing_ticket_counter sous verrou ligne
|
|
* `SELECT ... FOR UPDATE` pour garantir l'unicite meme en concurrence.
|
|
*/
|
|
interface WeighingTicketNumberAllocatorInterface
|
|
{
|
|
/**
|
|
* Attribue et renvoie le prochain numero formate {siteCode}-TP-{NNNN} pour le
|
|
* site, en persistant l'increment de maniere atomique (verrou ligne).
|
|
*/
|
|
public function allocate(Site $site): string;
|
|
}
|