src/EventSubscriber/Expediting/DocumentationKitGenerator.php line 42
<?php
namespace App\EventSubscriber\Expediting;
use App\Doctrine\Type\Expediting\TransitType;
use App\Dto\Expediting\DocumentationKitDatasheet;
use App\Dto\Expediting\DocumentationKitDatasheetContainerInput;
use App\Dto\Expediting\DocumentationKitDatasheetExpeditableInput;
use App\Dto\Expediting\DocumentationKitDatasheetExpeditablePackagingInput;
use App\Dto\Expediting\DocumentationKitDatasheetFreightInput;
use App\Dto\Expediting\DocumentationKitDatasheetPackageInput;
use App\Entity\Expediting\Document;
use App\Entity\Expediting\DocumentationKit;
use App\Entity\Expediting\Item;
use App\Entity\Expediting\Part;
use App\Entity\Expediting\Shipment;
use App\Event\Expediting\DocumentationKitRequestEvent;
use App\Event\Expediting\ShipmentEventInterface;
use App\EventSubscriber\TasksCancelerTrait;
use App\Repository\Scheduler\TaskRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
readonly class DocumentationKitGenerator implements EventSubscriberInterface
{
use TasksCancelerTrait;
public function __construct(
private EntityManagerInterface $entityManager,
private TaskRepository $taskRepository,
private Security $security,
) {}
public static function getSubscribedEvents(): array
{
return [
DocumentationKitRequestEvent::IDENTIFIER => ['onDocumentationKitRequest', 0],
];
}
public function onDocumentationKitRequest(ShipmentEventInterface $event): void
{
$shipment = $event->getShipment();
$documentationKit = (new DocumentationKit())
->setData($this->getKitDatasheet($shipment))
->setTransitType(TransitType::EXPORT)
->setCreatedBy($this->security->getUser());
$shipment->addDocumentationKit($documentationKit);
$this->entityManager->persist($shipment);
$this->entityManager->flush();
}
private function getKitDatasheet(Shipment $shipment): DocumentationKitDatasheet
{
$datasheet = new DocumentationKitDatasheet();
if ($shipment->getDocumentationKit()?->getData() instanceof DocumentationKitDatasheet) {
$previousKit = $shipment->getDocumentationKit()->getData();
$datasheet->shipper = $previousKit->shipper;
$datasheet->shipperAddress = $previousKit->shipperAddress;
$datasheet->buyer = $previousKit->buyer;
$datasheet->buyerAddress = $previousKit->buyerAddress;
$datasheet->consignee = $previousKit->consignee;
$datasheet->consigneeAddress = $previousKit->consigneeAddress;
$datasheet->notifyParty = $previousKit->notifyParty;
$datasheet->notifyPartyAddress = $previousKit->notifyPartyAddress;
$datasheet->formMNumber = $previousKit->formMNumber;
$datasheet->baNumber = $previousKit->baNumber;
} else {
$datasheet->shipper = 'Acme Corp';
$datasheet->shipperAddress = '123 Acme Way';
$datasheet->buyer = 'Buyer Inc';
$datasheet->buyerAddress = '456 Buyer Blvd';
$datasheet->consignee = 'Consignee Ltd';
$datasheet->consigneeAddress = '789 Consignee Street';
$datasheet->notifyParty = 'Notify LLC';
$datasheet->notifyPartyAddress = '321 Notify Circle';
$datasheet->formMNumber = 'FM00123';
$datasheet->baNumber = 'BA00123';
}
$datasheet->freights = $this->getFreights($shipment);
$datasheet->containers = $this->getContainers($shipment);
$datasheet->packages = $this->getPackages($shipment);
$datasheet->items = $this->getItems($shipment);
return $datasheet;
}
/** @return DocumentationKitDatasheetFreightInput[] */
private function getFreights(Shipment $shipment): array
{
$freights = [];
foreach ($shipment->getWorkOrders() as $workOrder) {
foreach ($workOrder->getFreights() as $freight) {
$itemsIds = [];
foreach ($freight->getItems() as $item) {
$itemsIds []= $item->getId();
}
$freights []= new DocumentationKitDatasheetFreightInput(
id: $freight->getId(),
workOrderReference: $workOrder->getReference(),
orderNumber: $freight->getOrder()->getNumber(),
supplier: $freight->getOrder()->getSupplier()->getName(),
invoicesNumbers: $freight->getInvoicesNumbers(),
itemsIds: $itemsIds,
);
}
}
return $freights;
}
/** @return DocumentationKitDatasheetContainerInput[] */
private function getContainers(Shipment $shipment): array
{
$containers = [];
foreach ($shipment->getContainers() as $container) {
$containers []= new DocumentationKitDatasheetContainerInput(
id: $container->getId(),
sealNumber: $container->getsealNumber(),
identificationNumber: $container->getidentificationNumber(),
containerType: $container->getcontainerType(),
containerSize: $container->getcontainerSize(),
);
}
return $containers;
}
/** @return DocumentationKitDatasheetPackageInput[] */
private function getPackages(Shipment $shipment): array
{
$packages = [];
foreach ($shipment->getPackages() as $package) {
$containerId = null;
foreach ($package->getContainers() as $container) {
if ($container->getShipment() === $shipment) {
$containerId = $container->getId();
break;
}
}
$ordersNumbers = [];
$workOrdersReferences = [];
foreach ($package->getItems() as $item) {
if ($item instanceof Item) {
$ordersNumbers []= $item->getOrder()->getNumber();
$workOrdersReferences []= $item->getFreight()->getWorkOrder()->getReference();
} elseif ($item instanceof Part) {
$ordersNumbers []= $item->getItem()->getOrder()->getNumber();
$ordersNumbers []= $item->getItem()->getFreight()->getWorkOrder()->getReference();
} elseif ($item instanceof Document) {
// TODO : Add documents !
}
}
$packages []= new DocumentationKitDatasheetPackageInput(
id: $package->getId(),
containerId: $containerId,
workOrdersReferences: $workOrdersReferences,
ordersNumbers: $ordersNumbers,
number: $package->getPackageNumber(),
type: $package->getCasingType(),
material: $package->getCasingMaterial(),
width: $package->getWidth(),
length: $package->getLength(),
height: $package->getHeight(),
weight: $package->getWeight(),
);
}
return $packages;
}
/** @return DocumentationKitDatasheetExpeditableInput[] */
private function getItems(Shipment $shipment): array
{
$map = [];
$packagesIds = [];
foreach ($shipment->getPackages() as $package) {
$packagesIds []= $package->getId();
foreach ($package->getItems() as $item) {
if ($item instanceof Part) {
$map[$item->getId()] = $item->getItem();
} elseif ($item instanceof Item) {
$map[$item->getId()] = $item;
} else {
// TODO : handle Document
}
}
}
$items = [];
foreach ($map as $item) {
$packagings = [];
foreach ($item->getParts() as $part) {
foreach ($part->getPackages() as $package) {
if (!in_array($package->getId(), $packagesIds)) {
continue;
}
$packagings []= new DocumentationKitDatasheetExpeditablePackagingInput(
id: $package->getId(),
quantity: 0,
isPart: true,
);
}
}
foreach ($item->getPackages() as $package) {
if (!in_array($package->getId(), $packagesIds)) {
continue;
}
$packagings []= new DocumentationKitDatasheetExpeditablePackagingInput(
id: $package->getId(),
quantity: $item->getQuantity(),
isPart: false,
);
}
$items []= new DocumentationKitDatasheetExpeditableInput(
id: $item->getId(),
workOrderReference: $item->getFreight()->getWorkOrder()->getReference(),
orderNumber: $item->getOrder()->getNumber(),
number: $item->getLineItem()->getNumber(),
materialNumber: $item->getLineItem()->getNumber(),
description: $item->getLineItem()->getCustomerDescription() ?? $item->getLineItem()->getSupplierDescription(),
quantity: $item->getQuantity(),
unitPrice: $item->getLineItem()->getValue() / $item->getLineItem()->getQuantity(),
countryOfOrigin: $item->getLineItem()->getCountryOfOrigin(),
hsCode: $item->getLineItem()->getHsCode(),
asset: $item->getLineItem()->getAsset()?->getName(),
isDangerous: $item->isDangerous(),
packagings: $packagings,
);
}
return $items;
}
}