<?php
namespace ProxaImportExportExtension\Subscribers;
use ProxaImportExportExtension\ProxaImportExportExtension;
use Shopware\Core\Checkout\Document\DocumentEntity;
use Shopware\Core\Checkout\Order\Aggregate\OrderAddress\OrderAddressEntity;
use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity;
use Shopware\Core\Content\ImportExport\Event\ImportExportBeforeExportRecordEvent;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ImportExportSubscriber implements EventSubscriberInterface
{
/**
* @var EntityRepositoryInterface
*/
private EntityRepositoryInterface $repositoryDocuments;
/**
* @var EntityRepositoryInterface
*/
private EntityRepositoryInterface $repositoryOrderAddress;
/**
* @var EntityRepositoryInterface
*/
private EntityRepositoryInterface $repositoryOrderTransaction;
/**
* @param EntityRepositoryInterface $repositoryDocuments
* @param EntityRepositoryInterface $repositoryOrderAddress
* @param EntityRepositoryInterface $repositoryOrderTransaction
*/
public function __construct(
EntityRepositoryInterface $repositoryDocuments,
EntityRepositoryInterface $repositoryOrderAddress,
EntityRepositoryInterface $repositoryOrderTransaction
)
{
$this->repositoryDocuments = $repositoryDocuments;
$this->repositoryOrderAddress = $repositoryOrderAddress;
$this->repositoryOrderTransaction = $repositoryOrderTransaction;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
ImportExportBeforeExportRecordEvent::class => 'onImportExportBeforeExportRecord'
];
}
/**
* @param ImportExportBeforeExportRecordEvent $event
* @return void
*/
public function onImportExportBeforeExportRecord(ImportExportBeforeExportRecordEvent $event): void
{
if ($event->getConfig()->get('profileName') != ProxaImportExportExtension::IMPORT_EXPORT_PROFILE_ORDER_NAME) {
return;
}
$record = $event->getRecord();
$record[ProxaImportExportExtension::INVOICE_NUMBER['mappedKey']] = $this->getInvoiceNumber($event->getOriginalRecord());
$record[ProxaImportExportExtension::TOTAL_WITHOUT_SHIPPING['mappedKey']] = $this->calculateTotalWithoutShipping($event->getOriginalRecord());
$record[ProxaImportExportExtension::CUSTOMER_ADDRESS['mappedKey']] = $this->getCustomerAddress($event->getOriginalRecord());
$record[ProxaImportExportExtension::PAYMENT_METHOD['mappedKey']] = $this->getPaymentMethod($event->getOriginalRecord());
$event->setRecord($record);
}
/**
* @param array $record
* @return float
*/
private function calculateTotalWithoutShipping(array $record): float
{
return round($record['amountTotal'] - $record['shippingCosts']->getTotalPrice(), 2);
}
/**
* @param array $record
* @return string|null
*/
private function getInvoiceNumber(array $record): ?string
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('orderId', $record['id']));
$searchResult = $this->repositoryDocuments->search($criteria, Context::createDefaultContext());
/** @var DocumentEntity $document */
foreach ($searchResult as $document) {
$config = $document->getConfig();
if (
isset($config['name'])
&& $config['name'] == 'invoice'
) {
return $config['documentNumber'] ?? null;
}
}
return null;
}
/**
* @param array $record
* @return string|null
*/
private function getCustomerAddress(array $record): ?string
{
$criteria = new Criteria([$record['billingAddressId']]);
$criteria->addAssociation('country');
/** @var OrderAddressEntity|null $result */
$result = $this->repositoryOrderAddress->search($criteria, Context::createDefaultContext())->first();
if (!$result) {
return null;
}
$address = [
$result->getStreet(),
$result->getZipcode(),
$result->getCity(),
$result->getCountry()->getIso()
];
return implode(' | ', $address);
}
private function getPaymentMethod(array $record): string
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('orderId', $record['id']));
$criteria->addAssociation('paymentMethod');
$result = $this->repositoryOrderTransaction->search($criteria, Context::createDefaultContext());
$names = [];
/** @var OrderTransactionEntity $entity */
foreach ($result as $entity) {
$names[] = $entity->getPaymentMethod()->getName();
}
return implode(' | ', $names);
}
}