vendor/ibexa/corporate-account/src/lib/Form/Processor/CompanyFormProcessor.php line 31

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\Core\Base\Exceptions\InvalidArgumentException;
  13. use Ibexa\CorporateAccount\Event\DispatcherEvents;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. class CompanyFormProcessor extends FormProcessor
  16. {
  17. /**
  18. * @return array<string, mixed>
  19. */
  20. public static function getSubscribedEvents(): array
  21. {
  22. return [
  23. DispatcherEvents::COMPANY_PUBLISH => ['processPublish', 10],
  24. ];
  25. }
  26. public function processPublish(FormActionEvent $event): void
  27. {
  28. /** @var \Ibexa\Contracts\Core\Repository\Values\Content\ContentStruct $data */
  29. $data = $event->getData();
  30. $form = $event->getForm();
  31. if (!$data instanceof ContentUpdateData && !$data instanceof ContentCreateData) {
  32. throw new InvalidArgumentException(
  33. '$data',
  34. 'Expected ContentUpdateData or ContentCreateData'
  35. );
  36. }
  37. $languageCode = $form->getConfig()->getOption('languageCode');
  38. if ($data->isNew()) {
  39. /** @var \Ibexa\ContentForms\Data\Content\ContentCreateData $data */
  40. $company = $this->createCompany($data, $languageCode);
  41. } else {
  42. /** @var \Ibexa\ContentForms\Data\Content\ContentUpdateData $data */
  43. $company = $this->updateCompany($data, $languageCode);
  44. }
  45. if ($data->isNew()) {
  46. $this->companyService->createCompanyMembersUserGroup($company);
  47. $this->companyService->createCompanyAddressBookFolder($company);
  48. $company = $this->companyService->getCompany($company->getId());
  49. $this->companyService->setDefaultShippingAddress(
  50. $company,
  51. $this->shippingAddressService->createShippingAddressFromCompanyBillingAddress($company)
  52. );
  53. }
  54. $redirectUrl = ($form['redirectUrlAfterPublish'] && $form['redirectUrlAfterPublish']->getData())
  55. ? $form['redirectUrlAfterPublish']->getData()
  56. : $this->urlGenerator->generate(
  57. 'ibexa.corporate_account.company.details',
  58. [
  59. 'companyId' => $company->getId(),
  60. ]
  61. );
  62. $event->setResponse(new RedirectResponse($redirectUrl));
  63. }
  64. public function createCompany(
  65. ContentCreateData $contentCreateData,
  66. string $languageCode
  67. ): Company {
  68. $companyCreateStruct = $this->companyService->newCompanyCreateStruct();
  69. $companyCreateStruct->contentType = $contentCreateData->contentType;
  70. $companyCreateStruct->mainLanguageCode = $contentCreateData->mainLanguageCode;
  71. $companyCreateStruct->alwaysAvailable = $contentCreateData->alwaysAvailable;
  72. $mainLanguageCode = $this->resolveMainLanguageCode($contentCreateData);
  73. foreach ($contentCreateData->fieldsData as $fieldDefIdentifier => $fieldData) {
  74. if ($mainLanguageCode != $languageCode && !$fieldData->fieldDefinition->isTranslatable) {
  75. continue;
  76. }
  77. $companyCreateStruct->setField($fieldDefIdentifier, $fieldData->value, $languageCode);
  78. }
  79. return $this->companyService->createCompany($companyCreateStruct);
  80. }
  81. public function updateCompany(
  82. ContentUpdateData $contentUpdateData,
  83. string $languageCode
  84. ): Company {
  85. $companyUpdateStruct = $this->companyService->newCompanyUpdateStruct();
  86. $companyUpdateStruct->initialLanguageCode = $contentUpdateData->initialLanguageCode;
  87. $companyUpdateStruct->creatorId = $contentUpdateData->creatorId;
  88. $mainLanguageCode = $this->resolveMainLanguageCode($contentUpdateData);
  89. foreach ($contentUpdateData->fieldsData as $fieldDefIdentifier => $fieldData) {
  90. if ($mainLanguageCode != $languageCode && !$fieldData->fieldDefinition->isTranslatable) {
  91. continue;
  92. }
  93. $companyUpdateStruct->setField($fieldDefIdentifier, $fieldData->value, $languageCode);
  94. }
  95. $company = $this->companyService->getCompany($contentUpdateData->contentDraft->id);
  96. return $this->companyService->updateCompany($company, $companyUpdateStruct);
  97. }
  98. }