<?php
namespace CioBudget\Subscriber;
use CioBudget\Definition\BudgetDivision\BudgetDivisionEntity;
use CioBudget\Service\SessionService;
use CioMasterdata\Definition\Masterdata\MasterdataEntity;
use CioMasterdata\Service\MasterdataService;
use CioPromotionalOfficeApi\Event\AdditionalDataCollectAfterEvent;
use CioPromotionalOfficeApi\Event\ImportFieldsCollectAfterEvent;
use CioPromotionalOfficeApi\Event\ItemAddEvent;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Checkout\Customer\CustomerEntity;
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 OrderPlaced implements EventSubscriberInterface
{
const KEY_SALESREP_ORDERNUMBER = 'salesrepresentative_ordernumber';
private EntityRepositoryInterface $orderRepository;
private SessionService $sessionService;
private EntityRepositoryInterface $budgetDivisionRepository;
private EntityRepositoryInterface $customerRepository;
private MasterdataService $masterdataService;
public function __construct(EntityRepositoryInterface $orderRepository, EntityRepositoryInterface $budgetDivisionRepository, EntityRepositoryInterface $customerRepository, MasterdataService $masterdataService)
{
$this->orderRepository = $orderRepository;
$this->budgetDivisionRepository = $budgetDivisionRepository;
$this->customerRepository = $customerRepository;
$this->masterdataService = $masterdataService;
}
public function setSessionService(SessionService $sessionService)
{
$this->sessionService = $sessionService;
}
public static function getSubscribedEvents(): array
{
return [
CheckoutOrderPlacedEvent::class => 'onCheckoutOrderPlaced',
ImportFieldsCollectAfterEvent::class => 'onImportFieldsCollectAfter',
AdditionalDataCollectAfterEvent::class => 'onAdditionalDataCollectAfter',
ItemAddEvent::class => 'onItemAddEvent'
];
}
public function onCheckoutOrderPlaced(CheckoutOrderPlacedEvent $event): void
{
$order = $event->getOrder();
$budget = $this->sessionService->getBudgetEntityFromSession($event->getContext());
if ($budget) {
$customFields = $order->getCustomFields();
$division = $this->budgetDivisionRepository->search(new Criteria([$budget->getStore()->getDivisionId()]), $event->getContext())->first();
if ($division instanceof BudgetDivisionEntity) {
$customFields[self::KEY_SALESREP_ORDERNUMBER] = $division->getOrdernumber();
$order->setCustomFields($customFields);
$this->orderRepository->update([
[
'id' => $order->getId(),
'customFields' => $order->getCustomFields()
]
], Context::createDefaultContext());
}
}
}
public function onImportFieldsCollectAfter(ImportFieldsCollectAfterEvent $event): void
{
$order = $event->getOrder();
$customFields = $order->getCustomFields();
$customerCriteria = (new Criteria())->addFilter(new EqualsFilter('id', $order->getOrderCustomer()->getCustomerId()));
$customerEntity = $this->customerRepository->search($customerCriteria, Context::createDefaultContext())->first();
$vpNumber = null;
if ($customerEntity instanceof CustomerEntity) {
$masterDataEntities = $this->masterdataService->getMasterdatasForCustomer($customerEntity);
if (count($masterDataEntities) && $masterDataEntities->first() instanceof MasterdataEntity) {
/** @var MasterdataEntity $masterDataEntity */
$masterDataEntity = $masterDataEntities->first();
$vpNumber = $masterDataEntity->getVpNummer();
}
}
if (is_array($customFields)) {
foreach ($event->getImportFields()->ImportFieldDataItem as $importField) {
if ($importField->FieldIdentifier == 'Indent.CustomerText') {
$importField->FieldData = join(' / ', [$importField->FieldData, $vpNumber]);
}
}
}
$event->getImportFields()->Add('Indent.PaymentModes', 'Indent.PaymentModes1');
}
public function onAdditionalDataCollectAfter(AdditionalDataCollectAfterEvent $event): void
{
$event->getAdditionalData()->Add('Indent.PaymentModes1.Name', 14);
}
public function onItemAddEvent(ItemAddEvent $event): void
{
$customFields = $event->getOrder()->getCustomFields();
if (array_key_exists(self::KEY_SALESREP_ORDERNUMBER, $customFields)) {
$event->getAdditionalData()->Add($event->getApi()->getItemPositionKey('CustomerArticleIndentText'), $customFields[self::KEY_SALESREP_ORDERNUMBER]);
}
}
}