feat : parser SerieBoucles dans EarTagSeriesDto typé (#4)
All checks were successful
Auto Tag Develop / tag (push) Successful in 8s
Build Release Artefact / build (push) Successful in 41s

| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [ ] Pas de régression
- [ ] TU/TI/TF rédigée
- [ ] TU/TI/TF OK
- [ ] CHANGELOG modifié

Reviewed-on: #4
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #4.
This commit is contained in:
2026-04-22 09:11:53 +00:00
committed by Autin
parent 366143ce36
commit a60a6e46de
6 changed files with 531 additions and 18 deletions

View File

@@ -5,18 +5,31 @@ declare(strict_types=1);
namespace Malio\EdnotifBundle\Bovin\Dto;
/**
* Wrapper minimal d'une entrée `SerieBoucles` du message de l'opération
* `IpBGetInventaire` (quand `includeEarTagStock: true`).
* Série de boucles (ear tags) en stock chez l'exploitation, retournée dans
* la réponse de `IpBGetInventaire` quand `includeEarTagStock: true`.
*
* Le noeud XSD `typeSerieBoucles` est riche (plages de numéros, fournisseur,
* statut, dates...). En Phase 1 on garde volontairement la structure brute
* via `$rawNode` : les consommateurs qui ont besoin d'un champ précis y
* accèdent par `$serie->rawNode->NomDuChamp`. Si un cas d'usage métier concret
* remonte (rebouclage, commande de boucles), on parsera dans un DTO dédié.
* Correspond au type XSD `typeSerieBoucles` (resources/ednotif-ws/IpBNotif_v1.xsd) :
* une plage contigüe de `quantity` boucles à partir du numéro `startNumber`
* dans le pays `countryCode`.
*
* Les numéros sont stockés en string pour préserver le zero-padding du XSD
* (10 chiffres, pattern `0[1-9][0-9]{8}|[1-9][0-9]{9}`).
*/
final readonly class EarTagSeriesDto
{
public function __construct(
public object $rawNode,
public string $countryCode,
public string $startNumber,
public int $quantity,
) {}
public function endNumber(): string
{
return str_pad(
(string) ((int) $this->startNumber + $this->quantity - 1),
10,
'0',
STR_PAD_LEFT,
);
}
}

View File

@@ -50,7 +50,11 @@ final class InventoryMapper
if (!is_object($serieNode)) {
continue;
}
$earTagSeries[] = new EarTagSeriesDto(rawNode: $serieNode);
$earTagSeries[] = new EarTagSeriesDto(
countryCode: $this->toNullableString($serieNode->CodePays ?? null) ?? '',
startNumber: $this->toNullableString($serieNode->DebutSerie ?? null) ?? '',
quantity: $this->toNullableInt($serieNode->Quantite ?? null) ?? 0,
);
}
}