vendor/ibexa/corporate-account/src/lib/Form/Processor/ShippingAddressFormProcessor.php line 107

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\CorporateAccount\Form\Processor;
  8. use Ibexa\ContentForms\Data\Content\ContentCreateData;
  9. use Ibexa\ContentForms\Data\Content\ContentUpdateData;
  10. use Ibexa\ContentForms\Event\FormActionEvent;
  11. use Ibexa\Contracts\CorporateAccount\Values\Company;
  12. use Ibexa\Contracts\CorporateAccount\Values\ShippingAddress;
  13. use Ibexa\Core\Base\Exceptions\InvalidArgumentException;
  14. use Ibexa\CorporateAccount\Event\DispatcherEvents;
  15. use Ibexa\CorporateAccount\Form\Data\Company\CompanyUpdateDefaultShippingAddressData;
  16. use Ibexa\CorporateAccount\Form\Data\ShippingAddress\ShippingAddressItemDeleteData;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. class ShippingAddressFormProcessor extends FormProcessor
  19. {
  20.     /**
  21.      * @return array<string, mixed>
  22.      */
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             DispatcherEvents::SHIPPING_ADDRESS_PUBLISH => ['processPublish'10],
  27.             DispatcherEvents::SHIPPING_ADDRESS_SET_AS_DEFAULT => ['updateDefault'10],
  28.             DispatcherEvents::SHIPPING_ADDRESS_DELETE => ['processDelete'10],
  29.         ];
  30.     }
  31.     public function updateDefault(FormActionEvent $event): void
  32.     {
  33.         $data $event->getData();
  34.         if (!$data instanceof CompanyUpdateDefaultShippingAddressData) {
  35.             return;
  36.         }
  37.         $company $this->companyService->getCompany($data->getCompany()->id);
  38.         $shippingAddress $this->shippingAddressService->getShippingAddress($data->getAddress()->id);
  39.         $this->companyService->setDefaultShippingAddress(
  40.             $company,
  41.             $shippingAddress
  42.         );
  43.     }
  44.     public function processDelete(FormActionEvent $event): void
  45.     {
  46.         $data $event->getData();
  47.         if (!$data instanceof ShippingAddressItemDeleteData) {
  48.             return;
  49.         }
  50.         $toBeRemovedList $data->getAddressBookItems();
  51.         if (!is_array($toBeRemovedList)) {
  52.             return;
  53.         }
  54.         /** @var \Ibexa\Contracts\CorporateAccount\Values\Company $company */
  55.         $company $event->getOption('company');
  56.         $currentDefault $this->shippingAddressService->getCompanyDefaultShippingAddress($company);
  57.         foreach ($toBeRemovedList as $shippingAddress) {
  58.             $this->shippingAddressService->deleteShippingAddress($shippingAddress);
  59.         }
  60.         $this->setNewDefaultIfOldIsDeleted($company$toBeRemovedList$currentDefault);
  61.     }
  62.     /**
  63.      * @param \Ibexa\Contracts\CorporateAccount\Values\ShippingAddress[] $toBeRemovedList
  64.      */
  65.     private function setNewDefaultIfOldIsDeleted(
  66.         Company $company,
  67.         array $toBeRemovedList,
  68.         ?ShippingAddress $currentDefault null
  69.     ): void {
  70.         if ($currentDefault === null) {
  71.             return;
  72.         }
  73.         $addressesId array_map(static fn (ShippingAddress $shippingAddress) => $shippingAddress->getId(), $toBeRemovedList);
  74.         $defaultIsDeleted in_array($currentDefault->getId(), $addressesIdtrue);
  75.         if (!$defaultIsDeleted) {
  76.             return;
  77.         }
  78.         $addressList $this->shippingAddressService->getCompanyShippingAddresses($company);
  79.         if (empty($addressList)) {
  80.             return;
  81.         }
  82.         $this->companyService->setDefaultShippingAddress(
  83.             $company,
  84.             reset($addressList)
  85.         );
  86.     }
  87.     public function processPublish(FormActionEvent $event): void
  88.     {
  89.         /** @var \Ibexa\Contracts\Core\Repository\Values\Content\ContentStruct $data */
  90.         $data $event->getData();
  91.         $form $event->getForm();
  92.         if (!$data instanceof ContentUpdateData && !$data instanceof ContentCreateData) {
  93.             throw new InvalidArgumentException(
  94.                 '$data',
  95.                 'Expected ContentUpdateData or ContentCreateData'
  96.             );
  97.         }
  98.         $languageCode $form->getConfig()->getOption('languageCode');
  99.         $company $event->getOption('company');
  100.         if ($data->isNew()) {
  101.             /** @var \Ibexa\ContentForms\Data\Content\ContentCreateData $data */
  102.             $this->createShippingAddress($company$data$languageCode);
  103.         } else {
  104.             /** @var \Ibexa\ContentForms\Data\Content\ContentUpdateData $data */
  105.             $this->updateShippingAddress($data$languageCode);
  106.         }
  107.         $redirectUrl = ($form['redirectUrlAfterPublish'] && $form['redirectUrlAfterPublish']->getData())
  108.             ? $form['redirectUrlAfterPublish']->getData()
  109.             : $this->urlGenerator->generate(
  110.                 'ibexa.corporate_account.company.details',
  111.                 [
  112.                     'companyId' => $company->getId(),
  113.                     '_fragment' => 'ibexa-tab-address_book',
  114.                 ]
  115.             );
  116.         $event->setResponse(new RedirectResponse($redirectUrl));
  117.     }
  118.     public function createShippingAddress(
  119.         Company $company,
  120.         ContentCreateData $contentCreateData,
  121.         string $languageCode
  122.     ): ShippingAddress {
  123.         $companyCreateStruct $this->shippingAddressService->newShippingAddressCreateStruct();
  124.         $companyCreateStruct->contentType $contentCreateData->contentType;
  125.         $companyCreateStruct->mainLanguageCode $contentCreateData->mainLanguageCode;
  126.         $companyCreateStruct->alwaysAvailable $contentCreateData->alwaysAvailable;
  127.         $mainLanguageCode $this->resolveMainLanguageCode($contentCreateData);
  128.         foreach ($contentCreateData->fieldsData as $fieldDefIdentifier => $fieldData) {
  129.             if ($mainLanguageCode != $languageCode && !$fieldData->fieldDefinition->isTranslatable) {
  130.                 continue;
  131.             }
  132.             $companyCreateStruct->setField($fieldDefIdentifier$fieldData->value$languageCode);
  133.         }
  134.         return $this->shippingAddressService->createShippingAddress($company$companyCreateStruct);
  135.     }
  136.     public function updateShippingAddress(
  137.         ContentUpdateData $contentUpdateData,
  138.         string $languageCode
  139.     ): ShippingAddress {
  140.         $companyUpdateStruct $this->shippingAddressService->newShippingAddressUpdateStruct();
  141.         $companyUpdateStruct->initialLanguageCode $contentUpdateData->initialLanguageCode;
  142.         $companyUpdateStruct->creatorId $contentUpdateData->creatorId;
  143.         $mainLanguageCode $this->resolveMainLanguageCode($contentUpdateData);
  144.         foreach ($contentUpdateData->fieldsData as $fieldDefIdentifier => $fieldData) {
  145.             if ($mainLanguageCode != $languageCode && !$fieldData->fieldDefinition->isTranslatable) {
  146.                 continue;
  147.             }
  148.             $companyUpdateStruct->setField($fieldDefIdentifier$fieldData->value$languageCode);
  149.         }
  150.         $shippingAddress $this->shippingAddressService->getShippingAddress($contentUpdateData->contentDraft->id);
  151.         return $this->shippingAddressService->updateShippingAddress($shippingAddress$companyUpdateStruct);
  152.     }
  153. }