siteByCode('86'); $http = $this->authManageOnSite($site); $client = $this->seedTestClient('Num'); $first = $this->postTicket($http, $this->validClientTicketPayload($client)); self::assertResponseStatusCodeSame(201); $second = $this->postTicket($http, $this->validClientTicketPayload($client)); self::assertResponseStatusCodeSame(201); $n1 = (string) $first->toArray()['number']; $n2 = (string) $second->toArray()['number']; self::assertMatchesRegularExpression('/^86-TP-\d{4}$/', $n1); self::assertMatchesRegularExpression('/^86-TP-\d{4}$/', $n2); self::assertNotSame($n1, $n2, 'Deux tickets du meme site portent des numeros distincts (unicite).'); // Sequence : le second numero = premier + 1 (compteur par site). self::assertSame($this->suffix($n1) + 1, $this->suffix($n2)); } public function testNumberingIsIsolatedPerSite(): void { $client = $this->seedTestClient('IsoSite'); $http86 = $this->authManageOnSite($this->siteByCode('86')); $http17 = $this->authManageOnSite($this->siteByCode('17')); $n86 = (string) $this->postTicket($http86, $this->validClientTicketPayload($client))->toArray()['number']; $n17 = (string) $this->postTicket($http17, $this->validClientTicketPayload($client))->toArray()['number']; // Chaque site encode son propre code dans le numero ; sequences disjointes. self::assertStringStartsWith('86-TP-', $n86); self::assertStringStartsWith('17-TP-', $n17); } public function testNumberAndSiteAreImmutableOnPatch(): void { $site = $this->siteByCode('86'); $http = $this->authManageOnSite($site); $client = $this->seedTestClient('Immutable'); $created = $this->postTicket($http, $this->validClientTicketPayload($client))->toArray(); $id = (int) $created['id']; $number = (string) $created['number']; // Tentative de re-ecriture du numero et du site (aucun groupe d'ecriture) + // changement legitime de la pesee a plein -> net recalcule. $patched = $http->request('PATCH', '/api/weighing_tickets/'.$id, [ 'headers' => ['Content-Type' => self::MERGE], 'json' => [ 'number' => 'HACK-TP-9999', 'site' => '/api/sites/'.$this->siteByCode('17')->getId(), 'fullWeight' => 20000, ], ])->toArray(); self::assertSame($number, $patched['number'], 'Le numero est immuable (RG-5.02 / RG-5.09).'); self::assertSame('86', $patched['site']['code'], 'Le site est immuable (RG-5.09).'); // Net recalcule : 20000 - 7150 = 12850 (RG-5.05). self::assertSame(12850, $patched['netWeight']); } /** Suffixe numerique {NNNN} d'un numero {siteCode}-TP-{NNNN}. */ private function suffix(string $number): int { return (int) substr($number, strrpos($number, '-') + 1); } }