custom/static-plugins/K3nLogistics/src/K3nLogistics.php line 19

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace K3n\Logistics;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\Context;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\Framework\Plugin;
  10. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  11. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  12. use Shopware\Core\System\Language\LanguageEntity;
  13. use Shopware\Core\System\StateMachine\Aggregation\StateMachineState\StateMachineStateEntity;
  14. use Shopware\Core\System\StateMachine\StateMachineEntity;
  15. class K3nLogistics extends Plugin
  16. {
  17.     private const STATE_MACHINE_STATE_MISSING_DOCUMENTS 'missing_documents';
  18.     private const STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID '52430dcb6e53bb3b4d0bc71729a9f367';
  19.     private const STATE_MACHINE_TRANSITION_OPEN_TO_MISSING_DOCUMENTS_ID        '1379e36c314356ff1083f6e7f4b4bb27';
  20.     private const STATE_MACHINE_TRANSITION_IN_PROGRESS_TO_MISSING_DOCUMENTS_ID '0c0952754a26683fc6f116a6c7e67624';
  21.     private const STATE_MACHINE_TRANSITION_MISSING_DOCUMENTS_TO_COMPLETED_ID   '90286a9972c90767b4056d87a9e6bf9e';
  22.     private const STATE_MACHINE_TRANSITION_MISSING_DOCUMENTS_TO_OPEN_ID        'b85bc7625590a591782bcff6f9ea2516';
  23.     public function install(InstallContext $installContext): void
  24.     {
  25.         $this->createLogisticsRole($installContext->getContext());
  26.         $this->createOrderStatus($installContext->getContext());
  27.     }
  28.     private function createLogisticsRole(Context $context)
  29.     {
  30.         /**
  31.          * @var EntityRepositoryInterface
  32.          */
  33.         $aclRoleRepository $this->container->get('acl_role.repository');
  34.         $aclLogisticsRole = [
  35.             'id' => '1a1b40f6a91c4c2abe61c410361b923b',
  36.             'name' => 'Logistics',
  37.             'description' => 'As a Logistics User You can see all the orders and You can change the status of the order to done / missing documents',
  38.             'privileges' => [
  39.                 "country:read",
  40.                 "country_state:read",
  41.                 "currency:read",
  42.                 "custom_field:read",
  43.                 "custom_field_set:read",
  44.                 "custom_field_set_relation:read",
  45.                 "customer:read",
  46.                 "customer_address:read",
  47.                 "document:create",
  48.                 "document:read",
  49.                 "document:update",
  50.                 "document_type:read",
  51.                 "iwv_extra_order_file:create",
  52.                 "iwv_extra_order_file:delete",
  53.                 "iwv_extra_order_file:read",
  54.                 "iwv_extra_order_file:update",
  55.                 "language:read",
  56.                 "locale:read",
  57.                 "log_entry:create",
  58.                 "mail_template:read",
  59.                 "mail_template_sales_channel:create",
  60.                 "mail_template_sales_channel:read",
  61.                 "mail_template_type:read",
  62.                 "message_queue_stats:read",
  63.                 "order.editor",
  64.                 "order.viewer",
  65.                 "order:delete",
  66.                 "order:read",
  67.                 "order:update",
  68.                 "order_address:create",
  69.                 "order_address:read",
  70.                 "order_address:update",
  71.                 "order_customer:read",
  72.                 "order_customer:update",
  73.                 "order_delivery:read",
  74.                 "order_delivery:update",
  75.                 "order_line_item:create",
  76.                 "order_line_item:read",
  77.                 "order_line_item:update",
  78.                 "order_tag:create",
  79.                 "order_tag:delete",
  80.                 "order_tag:read",
  81.                 "order_tag:update",
  82.                 "order_transaction:read",
  83.                 "payment_method:read",
  84.                 "product:read",
  85.                 "product_visibility:read",
  86.                 "property_group:read",
  87.                 "property_group_option:read",
  88.                 "sales_channel:read",
  89.                 "salutation:read",
  90.                 "shipping_method:read",
  91.                 "state_machine:read",
  92.                 "state_machine_history:create",
  93.                 "state_machine_history:read",
  94.                 "state_machine_state:read",
  95.                 "state_machine_transition:read",
  96.                 "swag_language_pack_language:read",
  97.                 "tag:create",
  98.                 "tag:read",
  99.                 "user:read",
  100.                 "user_config:create",
  101.                 "user_config:read",
  102.                 "user_config:update",
  103.                 "vio_representative_agent:read",
  104.                 "customer_group:read"
  105.             ]
  106.         ];
  107.         $aclRoleRepository->upsert([$aclLogisticsRole], $context);
  108.     }
  109.     private function createOrderStatus(Context $context)
  110.     {
  111.         $stateMachineStateRepository $this->container->get('state_machine_state.repository');
  112.         $stateMachineTransitionRepository $this->container->get('state_machine_transition.repository');
  113.         // 'missing_documents' state
  114.         $stateMachineMissingDocumentsState $stateMachineStateRepository->search(new Criteria([self::STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID]), $context)->getElements();
  115.         $STATE_MACHINE_ORDER_ID $this->getOrderStateMachineId($context);
  116.         $GERMAN_LANGUAGE_ID  $this->getLanguageId($context'de-DE');
  117.         $ENGLISH_LANGUAGE_ID $this->getLanguageId($context'en-GB');
  118.         $POLISH_LANGUAGE_ID  $this->getLanguageId($context'pl-PL');
  119.         $STATE_MACHINE_STATE_OPEN_ID        $this->getOrderStateMachineStateId($context$STATE_MACHINE_ORDER_ID'open');
  120.         $STATE_MACHINE_STATE_IN_PROGRESS_ID $this->getOrderStateMachineStateId($context$STATE_MACHINE_ORDER_ID'in_progress');
  121.         $STATE_MACHINE_STATE_COMPLETED_ID   $this->getOrderStateMachineStateId($context$STATE_MACHINE_ORDER_ID'completed');
  122.         if (count($stateMachineMissingDocumentsState) == 0) {
  123.             $stateMachineStateRepository->create([
  124.                 [
  125.                     'id' => self::STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID,
  126.                     'technicalName' => self::STATE_MACHINE_STATE_MISSING_DOCUMENTS,
  127.                     'name' => 'Missing documents',
  128.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  129.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  130.                     'translations' => [
  131.                         $GERMAN_LANGUAGE_ID => [
  132.                             'name' => 'Fehlende Unterlagen'
  133.                         ],
  134.                         $ENGLISH_LANGUAGE_ID => [
  135.                             'name' => 'Missing documents'
  136.                         ],
  137.                         $POLISH_LANGUAGE_ID => [
  138.                             'name' => 'BrakujÄ…ce dokumenty'
  139.                         ]
  140.                     ]
  141.                 ],
  142.             ], $context);
  143.         }
  144.         $stateMachineOpenToMissingDocumentTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_OPEN_TO_MISSING_DOCUMENTS_ID]), $context)->getElements();
  145.         if (count($stateMachineOpenToMissingDocumentTransition) == 0) {
  146.             $stateMachineTransitionRepository->create([
  147.                 [
  148.                     'id' => self::STATE_MACHINE_TRANSITION_OPEN_TO_MISSING_DOCUMENTS_ID,
  149.                     'actionName' => 'open_to_missing_document',
  150.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  151.                     'fromStateId' => $STATE_MACHINE_STATE_OPEN_ID,
  152.                     'toStateId' => self::STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID,
  153.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  154.                 ],
  155.             ], $context);
  156.         }
  157.         $stateMachineInProgressToMissingDocumentTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_IN_PROGRESS_TO_MISSING_DOCUMENTS_ID]), $context)->getElements();
  158.         if (count($stateMachineInProgressToMissingDocumentTransition) == 0) {
  159.             $stateMachineTransitionRepository->create([
  160.                 [
  161.                     'id' => self::STATE_MACHINE_TRANSITION_IN_PROGRESS_TO_MISSING_DOCUMENTS_ID,
  162.                     'actionName' => 'in_progress_to_missing_document',
  163.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  164.                     'fromStateId' => $STATE_MACHINE_STATE_IN_PROGRESS_ID,
  165.                     'toStateId' => self::STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID,
  166.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  167.                 ],
  168.             ], $context);
  169.         }
  170.         $stateMachineMissingDocumentsToCompletedTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_MISSING_DOCUMENTS_TO_COMPLETED_ID]), $context)->getElements();
  171.         if (count($stateMachineMissingDocumentsToCompletedTransition) == 0) {
  172.             $stateMachineTransitionRepository->create([
  173.                 [
  174.                     'id' => self::STATE_MACHINE_TRANSITION_MISSING_DOCUMENTS_TO_COMPLETED_ID,
  175.                     'actionName' => 'missing_documents_to_completed',
  176.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  177.                     'fromStateId' => self::STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID,
  178.                     'toStateId' => $STATE_MACHINE_STATE_COMPLETED_ID,
  179.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  180.                 ],
  181.             ], $context);
  182.         }
  183.         $stateMachineMissingDocumentsToOpenTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_MISSING_DOCUMENTS_TO_OPEN_ID]), $context)->getElements();
  184.         if (count($stateMachineMissingDocumentsToOpenTransition) == 0) {
  185.             $stateMachineTransitionRepository->create([
  186.                 [
  187.                     'id' => self::STATE_MACHINE_TRANSITION_MISSING_DOCUMENTS_TO_OPEN_ID,
  188.                     'actionName' => 'missing_documents_to_open',
  189.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  190.                     'fromStateId' => self::STATE_MACHINE_STATE_MISSING_DOCUMENTS_ID,
  191.                     'toStateId' => $STATE_MACHINE_STATE_OPEN_ID,
  192.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  193.                 ],
  194.             ], $context);
  195.         }
  196.     }
  197.     private function deleteLogisticsRole(Context $context)
  198.     {
  199.         /**
  200.          * @var EntityRepositoryInterface $repository
  201.          */
  202.         $aclRoleRepository $this->container->get('acl_role.repository');
  203.         $aclRoleRepository->delete([['id' => '1a1b40f6a91c4c2abe61c410361b923b']], $context);
  204.     }
  205.     private function getLanguageId(Context $contextstring $languageCode): ?string
  206.     {
  207.         /**
  208.          * @var EntityRepositoryInterface $languageRepository
  209.          */
  210.         $languageRepository $this->container->get('language.repository');
  211.         $criteria = new Criteria();
  212.         $criteria->addAssociation('locale');
  213.         $criteria->addFilter(new EqualsFilter('locale.code'$languageCode));
  214.         /**
  215.          * @var LanguageEntity $language
  216.          */
  217.         $language $languageRepository->search($criteria$context)->first();
  218.         if ($language) {
  219.             return $language->getId();
  220.         }
  221.         return null;
  222.     }
  223.     private function getOrderStateMachineId(Context $context): string
  224.     {
  225.         /**
  226.          * @var EntityRepositoryInterface $stateMachineRepository
  227.          */
  228.         $stateMachineRepository $this->container->get('state_machine.repository');
  229.         $criteria = new Criteria();
  230.         $criteria->addFilter(new EqualsFilter('technicalName''order.state'));
  231.         /**
  232.          * @var StateMachineEntity $orderStateMachine
  233.          */
  234.         $orderStateMachine $stateMachineRepository->search($criteria$context)->first();
  235.         return $orderStateMachine->getId();
  236.     }
  237.     private function getOrderStateMachineStateId(Context $contextstring $orderStateMachineIdstring $technicalName): string
  238.     {
  239.         /**
  240.          * @var EntityRepositoryInterface $stateMachineStateRepository
  241.          */
  242.         $stateMachineStateRepository $this->container->get('state_machine_state.repository');
  243.         $criteria = new Criteria();
  244.         $criteria->addFilter(new EqualsFilter('stateMachineId'$orderStateMachineId));
  245.         $criteria->addFilter(new EqualsFilter('technicalName'$technicalName));
  246.         /**
  247.          * @var StateMachineStateEntity $stateMachineState
  248.          */
  249.         $stateMachineState $stateMachineStateRepository->search($criteria$context)->first();
  250.         return $stateMachineState->getId();
  251.     }
  252. }