custom/plugins/CioTetra/src/Subscriber/OrderExportSubscriber.php line 49

Open in your IDE?
  1. <?php
  2. namespace CioTetra\Subscriber;
  3. use CioTetra\CioTetra;
  4. use CioTetra\Traits\SftpTrait;
  5. use CioTetra\Traits\UTF8Trait;
  6. use Shopware\Core\Framework\Context;
  7. use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
  8. use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity;
  9. use Shopware\Core\Checkout\Order\OrderEntity;
  10. use Shopware\Core\System\SystemConfig\SystemConfigService;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  15. class OrderExportSubscriber implements EventSubscriberInterface
  16. {
  17.     use SftpTrait;
  18.     use UTF8Trait;
  19.     private SystemConfigService $configService;
  20.     private EntityRepositoryInterface $customerRepository;
  21.     private EntityRepositoryInterface $countryRepository;
  22.     private EntityRepositoryInterface $languageRepository;
  23.     private $GERMAN_LANGUAGE_ID;
  24.     public function __construct(SystemConfigService $configService, EntityRepositoryInterface $customerRepository, EntityRepositoryInterface $countryRepository, EntityRepositoryInterface $languageRepository)
  25.     {
  26.         $this->configService = $configService;
  27.         $this->customerRepository = $customerRepository;
  28.         $this->countryRepository = $countryRepository;
  29.         $this->languageRepository = $languageRepository;
  30.         $this->GERMAN_LANGUAGE_ID = $this->getGermanLanguageId();
  31.     }
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
  36.         ];
  37.     }
  38.     public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
  39.     {
  40.         [$fullPath, $filename] = $this->getFileName($event->getOrder()->getOrderNumber());
  41.         $filecontent = $this->generateOrderFile($event->getOrder()->getOrderCustomer(), $event->getOrder(), $event);
  42.         if (file_put_contents($fullPath, $filecontent)) {
  43.             $uploadSuccess = $this->directUpload($fullPath, $filename, $filecontent);
  44.             if (!$uploadSuccess) {
  45. //            TODO: inplement false handling
  46.             }
  47.         } else {
  48. //            TODO: inplement false handling
  49.         }
  50.     }
  51.     private function getCountryNameInGerman($isoCode)
  52.     {
  53.         $criteria = new Criteria();
  54.         $criteria->addAssociation('translations');
  55.         $criteria->addFilter(new EqualsFilter('iso3', $isoCode));
  56.         $country =  $this->countryRepository->search($criteria, Context::createDefaultContext())->first();
  57.         foreach ($country->translations->getElements() as $item){
  58.             if( $item->getLanguageId() == $this->GERMAN_LANGUAGE_ID){
  59.                 return $item->getName();
  60.             }
  61.         }
  62.     }
  63.     private function getKStatus1($isoCode)
  64.     {
  65.         if( in_array($isoCode, ["DEU"]))
  66.         {
  67.             return "EU";
  68.         }
  69.         if( in_array($isoCode, ["AUT", "BEL", "BGR", "HRV", "CYP", "CZE", "DNK", "EST", "FIN", "FRA", "GRC", "HUN", "IRL", "ITA", "LVA", "LTU", "LUX", "MLT", "NLD", "POL", "PRT", "ROU", "SVK", "SVN", "ESP", "SWE"]))
  70.         {
  71.             return "EU";
  72.         }
  73.         return "Int";
  74.     }
  75.     private function getGermanLanguageId()
  76.     {
  77.         $criteria = new Criteria();
  78.         $criteria->addAssociation('locale');
  79.         $criteria->addFilter(new EqualsFilter('locale.code', 'de-DE'));
  80.         $language = $this->languageRepository->search($criteria, Context::createDefaultContext())->first();
  81.         return $language->getId();
  82.     }
  83.     private function getShippingCost($deliveries = null)
  84.     {
  85.         $shippingCost = 0;
  86.         if($deliveries){
  87.             foreach($deliveries as $delivery){
  88.                 if($delivery->getShippingCosts()->getTotalPrice() > $shippingCost){
  89.                     $shippingCost = $delivery->getShippingCosts()->getTotalPrice();
  90.                 }
  91.             }
  92.         }
  93.         return number_format($shippingCost,2,',', '');
  94.     }
  95.     private function getShippingCostDiscount($deliveries = null)
  96.     {
  97.         $shippingCostDiscount = 0;
  98.         if($deliveries){
  99.             foreach($deliveries as $delivery){
  100.                 if($delivery->getShippingCosts()->getTotalPrice() < $shippingCostDiscount){
  101.                     $shippingCostDiscount = $delivery->getShippingCosts()->getTotalPrice();
  102.                 }
  103.             }
  104.         }
  105.         return $shippingCostDiscount;
  106.     }
  107.     private function generateOrderFile(OrderCustomerEntity $customer, OrderEntity $order, CheckoutOrderPlacedEvent $event): string
  108.     {
  109.         $criteria = new Criteria([$customer->getCustomerId()]);
  110.         $customer = $this->customerRepository->search($criteria, Context::createDefaultContext())->first();
  111.         $existingCustomer         = false;
  112.         $differentDeliveryAddress = false;
  113.         $exportText[] = '[Vor]';
  114.         $exportText[] = 'Art=164';
  115.         $exportText[] = 'StArt=4';
  116.         $exportText[] = 'VDat=#' . $order->getCreatedAt()->format('m.d.Y') . '#';
  117.         $exportText[] = 'Zeichen="' . $order->getOrderNumber() . '"';
  118.         $exportText[] = 'Betreff="Webshop Bestellung"';
  119.         $useObjID = false;
  120.         $useObjIDString = '';
  121.         if( $order->getCustomerComment() != '') {
  122.             $useObjID = true;
  123.             $useObjIDString .= "Bestellkommentar: " . str_replace(array("\r\n", "\r", "\n"), " ", $order->getCustomerComment());
  124.         }
  125.         if( $order->getCustomFields() ){
  126.             if( array_key_exists('custom_field_budget_name_save_on_order', $order->getCustomFields())){
  127.                 if( $useObjID ){
  128.                     $useObjIDString .= " | ";
  129.                 }
  130.                 $useObjIDString .= 'Budgetbestellung: ' . $order->getCustomFields()['custom_field_budget_name_save_on_order'];
  131.             }
  132.         }
  133.         if( $useObjID == true ){
  134.             $exportText[] = 'ObjID="' . $useObjIDString . '"';
  135.         }
  136.         $customFields = $customer->getCustomFields();
  137.         $billingAddress  = $order->getAddresses()->first();
  138.         $shippingAddress = $order->getAddresses()->last();
  139.         if( $billingAddress->getId() != $shippingAddress->getId() )
  140.         {
  141.             $differentDeliveryAddress = true;
  142.         }
  143.         if(is_array($customFields))
  144.         {
  145.             if(array_key_exists('custom_customer_itpnumber', $customFields) && !empty($customFields['custom_customer_itpnumber']))
  146.             {
  147.                 $existingCustomer = true;
  148.                 $itpNumber        = $customFields['custom_customer_itpnumber'];
  149.             }
  150.         }
  151.         if( $existingCustomer )
  152.         {
  153.             $exportText[] = '[VAdr]';
  154.             $exportText[] = 'AdrNr="' . $itpNumber . '"';
  155.             $exportText[] = 'Name1="' . $billingAddress->getFirstName() . ' ' . $billingAddress->getLastName() . '"';
  156.             if( $differentDeliveryAddress )
  157.             {
  158.                 $exportText[] = '[Adr]';
  159.                 $exportText[] = 'AdrNr="######"';
  160.                 $exportText[] = 'Anrede="(Firma)"';
  161.                 $exportText[] = 'Name="' . $shippingAddress->getFirstName() . ' ' . $shippingAddress->getLastName() . '"';
  162.                 $exportText[] = 'Str="' . $shippingAddress->getStreet() . '"';
  163.                 $exportText[] = 'Plz="' . $shippingAddress->getZipcode() . '"';
  164.                 $exportText[] = 'Ort="' . $shippingAddress->getCity() . '"';
  165.                 $exportText[] = 'Nation=Nation("' . $this->getCountryNameInGerman($shippingAddress->getCountry()->getIso3()) . '")';
  166.                 $exportText[] = 'KGruppe=32';
  167.                 $exportText[] = 'KStatus1="' . $this->getKStatus1($shippingAddress->getCountry()->getIso3()) . '"';
  168.                 $exportText[] = '[Ansp]';
  169.                 $exportText[] = 'Anrede="Herr"';
  170.                 $exportText[] = 'Name="Ingo Hillebrand"';
  171.                 $exportText[] = '[Komm]';
  172.                 $exportText[] = 'MOpt=0';
  173.                 $exportText[] = 'Typ=48';
  174.                 $exportText[] = 'Nr="Ingo.Hillebrand@connect-io.de"';
  175.                 $exportText[] = '[VAdr]';
  176.                 $exportText[] = 'Typ=30';
  177.             }
  178.         }else
  179.         {
  180.             $exportText[] = '[Adr]';
  181.             $exportText[] = 'AdrNr="######"';
  182.             $exportText[] = 'Anrede="(Firma)"';
  183.             $exportText[] = 'Name="' . $customer->getCompany() . '"';
  184.             $exportText[] = 'Str="' . $billingAddress->getStreet() . '"';
  185.             $exportText[] = 'Plz="' . $billingAddress->getZipcode() . '"';
  186.             $exportText[] = 'Ort="' . $billingAddress->getCity() . '"';
  187.             $exportText[] = 'Nation=Nation("' . $billingAddress->getCountry()->getName() . '")';
  188.             $exportText[] = 'KGruppe=32';
  189.             $exportText[] = 'KStatus1="' . $this->getKStatus1($billingAddress->getCountry()->getIso3()) . '"';
  190.             $exportText[] = '[Ansp]';
  191.             $exportText[] = 'Anrede="' . $billingAddress->getSalutation()->getDisplayName() . '"';
  192.             $exportText[] = 'Name="' . $billingAddress->getFirstName() . ' ' . $billingAddress->getLastName() . '"';
  193.             $exportText[] = '[Komm]';
  194.             $exportText[] = 'MOpt=0';
  195.             $exportText[] = 'Typ=48';
  196.             $exportText[] = 'Nr="' . $customer->getEmail() . '"';
  197.             $exportText[] = '[VAdr]';
  198.             $exportText[] = 'Typ=0';
  199.             if( $differentDeliveryAddress )
  200.             {
  201.                 $exportText[] = 'AdrNr="######"';
  202.                 $exportText[] = 'Anrede="(Firma)"';
  203.                 $exportText[] = 'Name="' . $shippingAddress->getCompany() . '"';
  204.                 $exportText[] = 'Str="' . $shippingAddress->getStreet() . '"';
  205.                 $exportText[] = 'Plz="' . $shippingAddress->getZipcode() . '"';
  206.                 $exportText[] = 'Ort="' . $shippingAddress->getCity() . '"';
  207.                 $exportText[] = 'Nation=Nation("' . $shippingAddress->getCountry()->getName() . '")';
  208.                 $exportText[] = 'KGruppe=32';
  209.                 $exportText[] = 'KStatus1="' . $this->getKStatus1($shippingAddress->getCountry()->getIso3()) . '"';
  210.                 $exportText[] = '[Ansp]';
  211.                 $exportText[] = 'Anrede="' . $shippingAddress->getSalutation()->getDisplayName() . '"';
  212.                 $exportText[] = 'Name="' . $shippingAddress->getFirstName() . ' ' . $shippingAddress->getLastName() . '"';
  213.                 $exportText[] = '[Komm]';
  214.                 $exportText[] = 'MOpt=0';
  215.                 $exportText[] = 'Typ=48';
  216.                 $exportText[] = 'Nr="' . $customer->getEmail() . '"';
  217.                 $exportText[] = '[VAdr]';
  218.                 $exportText[] = 'Typ=30';
  219.             }
  220.         }
  221.         $i = 1;
  222.         $isShippingDiscountUsed = false;
  223.         foreach ($order->getLineItems() as $item) {
  224.             $payload = $item->getPayload();
  225.             if( $item->getType() == 'product' ) {
  226.                 if (array_key_exists('productNumber', $payload)) {
  227.                     $exportText[] = "[VPos]";
  228.                     $exportText[] = 'Pos=' . $i++;
  229.                     $exportText[] = 'ArtId=ArtNr2ID("' . $item->getPayload()['productNumber'] . '")';
  230.                     $exportText[] = 'VarId=ArtNr2ID("' . $item->getPayload()['productNumber'] . '-I";1)';
  231.                     $exportText[] = 'PosMg=' . number_format($item->getQuantity(), 2, ',', '');
  232.                     $exportText[] = 'Preis=' . number_format($item->getTotalPrice(), 2, ',', '');
  233.                 }
  234.             }
  235.             if( $item->getType() == 'promotion') {
  236.                 $price = $item->getTotalPrice();
  237.                 if( $price == 0 && $isShippingDiscountUsed == false ){
  238.                     $price += $this->getShippingCostDiscount($order->getDeliveries());
  239.                 }
  240.                 $exportText[] = "[VPos]";
  241.                 $exportText[] = 'Pos=' . $i++;
  242.                 $exportText[] = 'ObjID="Rabatt"';
  243.                 $exportText[] = 'ArtNr="Rabatt"';
  244.                 $exportText[] = 'PosMg=' . number_format($item->getQuantity(), 2, ',', '');
  245.                 $exportText[] = 'Preis=' . number_format($price, 2, ',', '');
  246.             }
  247.         }
  248.         $exportText[] = "[VPos]";
  249.         $exportText[] = 'Pos=' . $i++;
  250.         $exportText[] = 'ObjID="Versandkosten"';
  251.         $exportText[] = 'ArtNr="Versandkosten"';
  252.         $exportText[] = 'PosMg=1';
  253.         $exportText[] = 'Preis=' . $this->getShippingCost($order->getDeliveries());
  254.         $exportText = implode(PHP_EOL, $exportText);
  255.         return $exportText;
  256.     }
  257.     private function getFileName(string $ordernumber): array
  258.     {
  259.         $path = getcwd() . '/..' . CioTetra::ROUTE_EXPORT_DIRECTORY;
  260.         $filename = date('d_m_Y_H_i_s') . '_tetra_export-' . $ordernumber;
  261.         return [$path . $filename . '.txt', $filename . '.txt'];
  262.     }
  263.     private function directUpload(string $fullPath, string $filename, string $data): bool
  264.     {
  265.         $message = "Start direct Upload from Order File" . PHP_EOL;
  266.         $success = $this->uploadOrderFile($data, $filename, $message);
  267.         if ($success) {
  268.             unlink($fullPath);
  269.         }
  270.         return $success;
  271.     }
  272. }