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

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(), $addressesId, true);
  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. }