custom/plugins/ProxaImportExportExtension/src/Subscribers/ImportExportSubscriber.php line 61

Open in your IDE?
  1. <?php
  2. namespace ProxaImportExportExtension\Subscribers;
  3. use ProxaImportExportExtension\ProxaImportExportExtension;
  4. use Shopware\Core\Checkout\Document\DocumentEntity;
  5. use Shopware\Core\Checkout\Order\Aggregate\OrderAddress\OrderAddressEntity;
  6. use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
  7. use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeExportRecordEvent;
  8. use Shopware\Core\Framework\Context;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class ImportExportSubscriber implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var EntityRepositoryInterface
  17.      */
  18.     private EntityRepositoryInterface $repositoryDocuments;
  19.     /**
  20.      * @var EntityRepositoryInterface
  21.      */
  22.     private EntityRepositoryInterface $repositoryOrderAddress;
  23.     /**
  24.      * @var EntityRepositoryInterface
  25.      */
  26.     private EntityRepositoryInterface $repositoryOrderTransaction;
  27.     /**
  28.      * @param EntityRepositoryInterface $repositoryDocuments
  29.      * @param EntityRepositoryInterface $repositoryOrderAddress
  30.      * @param EntityRepositoryInterface $repositoryOrderTransaction
  31.      */
  32.     public function __construct(
  33.         EntityRepositoryInterface $repositoryDocuments,
  34.         EntityRepositoryInterface $repositoryOrderAddress,
  35.         EntityRepositoryInterface $repositoryOrderTransaction
  36.     )
  37.     {
  38.         $this->repositoryDocuments $repositoryDocuments;
  39.         $this->repositoryOrderAddress $repositoryOrderAddress;
  40.         $this->repositoryOrderTransaction $repositoryOrderTransaction;
  41.     }
  42.     /**
  43.      * @return string[]
  44.      */
  45.     public static function getSubscribedEvents(): array
  46.     {
  47.         return [
  48.             ImportExportBeforeExportRecordEvent::class => 'onImportExportBeforeExportRecord'
  49.         ];
  50.     }
  51.     /**
  52.      * @param ImportExportBeforeExportRecordEvent $event
  53.      * @return void
  54.      */
  55.     public function onImportExportBeforeExportRecord(ImportExportBeforeExportRecordEvent $event): void
  56.     {
  57.         if ($event->getConfig()->get('profileName') != ProxaImportExportExtension::IMPORT_EXPORT_PROFILE_ORDER_NAME) {
  58.             return;
  59.         }
  60.         $record $event->getRecord();
  61.         $record[ProxaImportExportExtension::INVOICE_NUMBER['mappedKey']] = $this->getInvoiceNumber($event->getOriginalRecord());
  62.         $record[ProxaImportExportExtension::TOTAL_WITHOUT_SHIPPING['mappedKey']] = $this->calculateTotalWithoutShipping($event->getOriginalRecord());
  63.         $record[ProxaImportExportExtension::CUSTOMER_ADDRESS['mappedKey']] = $this->getCustomerAddress($event->getOriginalRecord());
  64.         $record[ProxaImportExportExtension::PAYMENT_METHOD['mappedKey']] = $this->getPaymentMethod($event->getOriginalRecord());
  65.         $event->setRecord($record);
  66.     }
  67.     /**
  68.      * @param array $record
  69.      * @return float
  70.      */
  71.     private function calculateTotalWithoutShipping(array $record): float
  72.     {
  73.         return round($record['amountTotal'] - $record['shippingCosts']->getTotalPrice(), 2);
  74.     }
  75.     /**
  76.      * @param array $record
  77.      * @return string|null
  78.      */
  79.     private function getInvoiceNumber(array $record): ?string
  80.     {
  81.         $criteria = new Criteria();
  82.         $criteria->addFilter(new EqualsFilter('orderId'$record['id']));
  83.         $searchResult $this->repositoryDocuments->search($criteriaContext::createDefaultContext());
  84.         /** @var DocumentEntity $document */
  85.         foreach ($searchResult as $document) {
  86.             $config $document->getConfig();
  87.             if (
  88.                 isset($config['name'])
  89.                 && $config['name'] == 'invoice'
  90.             ) {
  91.                 return $config['documentNumber'] ?? null;
  92.             }
  93.         }
  94.         return null;
  95.     }
  96.     /**
  97.      * @param array $record
  98.      * @return string|null
  99.      */
  100.     private function getCustomerAddress(array $record): ?string
  101.     {
  102.         $criteria = new Criteria([$record['billingAddressId']]);
  103.         $criteria->addAssociation('country');
  104.         /** @var OrderAddressEntity|null $result */
  105.         $result $this->repositoryOrderAddress->search($criteriaContext::createDefaultContext())->first();
  106.         if (!$result) {
  107.             return null;
  108.         }
  109.         $address = [
  110.             $result->getStreet(),
  111.             $result->getZipcode(),
  112.             $result->getCity(),
  113.             $result->getCountry()->getIso()
  114.         ];
  115.         return implode(' | '$address);
  116.     }
  117.     private function getPaymentMethod(array $record): string
  118.     {
  119.         $criteria = new Criteria();
  120.         $criteria->addFilter(new EqualsFilter('orderId'$record['id']));
  121.         $criteria->addAssociation('paymentMethod');
  122.         $result $this->repositoryOrderTransaction->search($criteriaContext::createDefaultContext());
  123.         $names = [];
  124.         /** @var OrderTransactionEntity $entity */
  125.         foreach ($result as $entity) {
  126.             $names[] = $entity->getPaymentMethod()->getName();
  127.         }
  128.         return implode(' | '$names);
  129.     }
  130. }