feat(composant) : add virtual getStructure() rebuilding legacy JSON from slot tables
Exposes structure as a computed property from pieceSlots, productSlots, and subcomponentSlots relations, including slotId for frontend quantity persistence. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -337,6 +337,59 @@ class Composant
|
|||||||
return $this->productSlots;
|
return $this->productSlots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Virtual property — rebuilds the legacy structure JSON from slot tables.
|
||||||
|
*
|
||||||
|
* @return null|array{pieces: list<array<string, mixed>>, products: list<array<string, mixed>>, subcomponents: list<array<string, mixed>>}
|
||||||
|
*/
|
||||||
|
#[Groups(['composant:read'])]
|
||||||
|
public function getStructure(): ?array
|
||||||
|
{
|
||||||
|
$pieces = [];
|
||||||
|
foreach ($this->pieceSlots as $slot) {
|
||||||
|
$pieces[] = [
|
||||||
|
'slotId' => $slot->getId(),
|
||||||
|
'typePieceId' => $slot->getTypePiece()?->getId(),
|
||||||
|
'selectedPieceId' => $slot->getSelectedPiece()?->getId(),
|
||||||
|
'quantity' => $slot->getQuantity(),
|
||||||
|
'position' => $slot->getPosition(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$products = [];
|
||||||
|
foreach ($this->productSlots as $slot) {
|
||||||
|
$products[] = [
|
||||||
|
'slotId' => $slot->getId(),
|
||||||
|
'typeProductId' => $slot->getTypeProduct()?->getId(),
|
||||||
|
'selectedProductId' => $slot->getSelectedProduct()?->getId(),
|
||||||
|
'familyCode' => $slot->getFamilyCode(),
|
||||||
|
'position' => $slot->getPosition(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$subcomponents = [];
|
||||||
|
foreach ($this->subcomponentSlots as $slot) {
|
||||||
|
$subcomponents[] = [
|
||||||
|
'slotId' => $slot->getId(),
|
||||||
|
'alias' => $slot->getAlias(),
|
||||||
|
'familyCode' => $slot->getFamilyCode(),
|
||||||
|
'typeComposantId' => $slot->getTypeComposant()?->getId(),
|
||||||
|
'selectedComponentId' => $slot->getSelectedComposant()?->getId(),
|
||||||
|
'position' => $slot->getPosition(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($pieces) && empty($products) && empty($subcomponents)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'pieces' => $pieces,
|
||||||
|
'products' => $products,
|
||||||
|
'subcomponents' => $subcomponents,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
public function addProductSlot(ComposantProductSlot $productSlot): static
|
public function addProductSlot(ComposantProductSlot $productSlot): static
|
||||||
{
|
{
|
||||||
if (!$this->productSlots->contains($productSlot)) {
|
if (!$this->productSlots->contains($productSlot)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user