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

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace K3n\Merchant;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  8. use Shopware\Core\Framework\Plugin;
  9. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  10. use Shopware\Core\Framework\Context;
  11. use Shopware\Core\System\Language\LanguageEntity;
  12. use Shopware\Core\System\StateMachine\Aggregation\StateMachineState\StateMachineStateEntity;
  13. use Shopware\Core\System\StateMachine\StateMachineEntity;
  14. use Shopware\Core\Framework\Uuid\Uuid;
  15. class K3nMerchant extends Plugin
  16. {
  17.     private const STATE_MACHINE_STATE_ACCEPTED 'accepted';
  18.     private const STATE_MACHINE_STATE_ACCEPTED_ID '6ae733b8491047c9bac615e399105a7e';
  19.     private const STATE_MACHINE_STATE_REJECTED 'rejected';
  20.     private const STATE_MACHINE_STATE_REJECTED_ID '3d17146ff9a24e9a809b7e75ac39df82';
  21.     private const STATE_MACHINE_STATE_PURCHASE 'purchase';
  22.     private const STATE_MACHINE_STATE_PURCHASE_ID 'ef4c30a065535c27e2f5818ff550e0d8';
  23.     private const STATE_MACHINE_TRANSITION_ACCEPTED_ID '6fd97d792b549594df4fb55b617c4f9b';
  24.     private const STATE_MACHINE_TRANSITION_REJECTED_ID 'd51c3cc92d88cbf02f32408cbbee97bc';
  25.     private const STATE_MACHINE_TRANSITION_CANCEL_REJECTED_ID '1d45e961e8fedf3dd1ed953818804f7c';
  26.     private const STATE_MACHINE_TRANSITION_PURCHASE_ID 'c13a25d781e8ceb3309626c1a50bc868';
  27.     private const STATE_MACHINE_TRANSITION_OPEN_PURCHASED_ID 'ab2f9d882cdea7dd4f25cb9e97c14eb1';
  28.     private const STATE_MACHINE_TRANSITION_REJECT_ACCEPTED_ID 'baef4894edd1d48807d24f53517b8294';
  29.     private const STATE_MACHINE_TRANSITION_OPEN_DONE_ID 'cf20a65c00fa9f274791243e4939324a';
  30.     public function install(InstallContext $installContext): void
  31.     {
  32.         $context $installContext->getContext();
  33.         $stateMachineStateRepository $this->container->get('state_machine_state.repository');
  34.         $stateMachineTransitionRepository $this->container->get('state_machine_transition.repository');
  35.         // 'accepted' state
  36.         $stateMachineAcceptedState $stateMachineStateRepository->search(new Criteria([self::STATE_MACHINE_STATE_ACCEPTED_ID]), $context)->getElements();
  37.         $STATE_MACHINE_ORDER_ID $this->getOrderStateMachineId($context);
  38.         $GERMAN_LANGUAGE_ID  $this->getLanguageId($context'de-DE');
  39.         $ENGLISH_LANGUAGE_ID $this->getLanguageId($context'en-GB');
  40.         $POLISH_LANGUAGE_ID  $this->getLanguageId($context'pl-PL');
  41.         $STATE_MACHINE_STATE_OPEN_ID      $this->getOrderStateMachineStateId($context$STATE_MACHINE_ORDER_ID'open');
  42.         $STATE_MACHINE_STATE_CANCELLED_ID $this->getOrderStateMachineStateId($context$STATE_MACHINE_ORDER_ID'cancelled');
  43.         $STATE_MACHINE_STATE_DONE_ID      $this->getOrderStateMachineStateId($context$STATE_MACHINE_ORDER_ID'completed');
  44.         if (count($stateMachineAcceptedState) == 0) {
  45.             $stateMachineStateRepository->create([
  46.                 [
  47.                     'id' => self::STATE_MACHINE_STATE_ACCEPTED_ID,
  48.                     'technicalName' => self::STATE_MACHINE_STATE_ACCEPTED,
  49.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  50.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  51.                     'translations' => [
  52.                         $GERMAN_LANGUAGE_ID => [
  53.                             'name' => 'Akzeptiert'
  54.                         ],
  55.                         $ENGLISH_LANGUAGE_ID => [
  56.                             'name' => 'Accepted'
  57.                         ],
  58.                         $POLISH_LANGUAGE_ID => [
  59.                             'name' => 'PrzyjÄ™ty'
  60.                         ]
  61.                     ]
  62.                 ],
  63.             ], $context);
  64.         }
  65.         $stateMachineAcceptedTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_ACCEPTED_ID]), $context)->getElements();
  66.         if (count($stateMachineAcceptedTransition) == 0) {
  67.             $stateMachineTransitionRepository->create([
  68.                 [
  69.                     'id' => self::STATE_MACHINE_TRANSITION_ACCEPTED_ID,
  70.                     'actionName' => 'accepted',
  71.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  72.                     'fromStateId' => $STATE_MACHINE_STATE_OPEN_ID,
  73.                     'toStateId' => self::STATE_MACHINE_STATE_ACCEPTED_ID,
  74.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  75.                 ],
  76.             ], $context);
  77.         }
  78.         // 'rejected' state
  79.         $stateMachineRejectedState $stateMachineStateRepository->search(new Criteria([self::STATE_MACHINE_STATE_REJECTED_ID]), $context)->getElements();
  80.         if (count($stateMachineRejectedState) == 0) {
  81.             $stateMachineStateRepository->create([
  82.                 [
  83.                     'id' => self::STATE_MACHINE_STATE_REJECTED_ID,
  84.                     'technicalName' => self::STATE_MACHINE_STATE_REJECTED,
  85.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  86.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  87.                     'translations' => [
  88.                         $GERMAN_LANGUAGE_ID => [
  89.                             'name' => 'Abgelehnt'
  90.                         ],
  91.                         $ENGLISH_LANGUAGE_ID => [
  92.                             'name' => 'Rejected'
  93.                         ],
  94.                         $POLISH_LANGUAGE_ID => [
  95.                             'name' => 'Odrzucony'
  96.                         ],
  97.                     ]
  98.                 ],
  99.             ], $context);
  100.         }
  101.         $stateMachineRejectedTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_REJECTED_ID]), $context)->getElements();
  102.         if (count($stateMachineRejectedTransition) == 0) {
  103.             $stateMachineTransitionRepository->create([
  104.                 [
  105.                     'id' => self::STATE_MACHINE_TRANSITION_REJECTED_ID,
  106.                     'actionName' => 'rejected',
  107.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  108.                     'fromStateId' => $STATE_MACHINE_STATE_OPEN_ID,
  109.                     'toStateId' => self::STATE_MACHINE_STATE_REJECTED_ID,
  110.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  111.                 ],
  112.             ], $context);
  113.         }
  114.         $stateMachineCancelRejectedTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_CANCEL_REJECTED_ID]), $context)->getElements();
  115.         if (count($stateMachineCancelRejectedTransition) == 0) {
  116.             $stateMachineTransitionRepository->create([
  117.                 [
  118.                     'id' => self::STATE_MACHINE_TRANSITION_CANCEL_REJECTED_ID,
  119.                     'actionName' => 'cancel_rejected',
  120.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  121.                     'fromStateId' => self::STATE_MACHINE_STATE_REJECTED_ID,
  122.                     'toStateId' => $STATE_MACHINE_STATE_CANCELLED_ID,
  123.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  124.                 ],
  125.             ], $context);
  126.         }
  127.         // 'purchase' state
  128.         $stateMachinePurchaseState $stateMachineStateRepository->search(new Criteria([self::STATE_MACHINE_STATE_PURCHASE_ID]), $context)->getElements();
  129.         if (count($stateMachinePurchaseState) == 0) {
  130.             $stateMachineStateRepository->create([
  131.                 [
  132.                     'id' => self::STATE_MACHINE_STATE_PURCHASE_ID,
  133.                     'technicalName' => self::STATE_MACHINE_STATE_PURCHASE,
  134.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  135.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  136.                     'translations' => [
  137.                         $GERMAN_LANGUAGE_ID => [
  138.                             'name' => 'Kauf'
  139.                         ],
  140.                         $ENGLISH_LANGUAGE_ID => [
  141.                             'name' => 'Purchase'
  142.                         ],
  143.                         $POLISH_LANGUAGE_ID => [
  144.                             'name' => 'Zakup'
  145.                         ],
  146.                     ]
  147.                 ],
  148.             ], $context);
  149.         }
  150.         $stateMachinePurchaseTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_PURCHASE_ID]), $context)->getElements();
  151.         if (count($stateMachinePurchaseTransition) == 0) {
  152.             $stateMachineTransitionRepository->create([
  153.                 [
  154.                     'id' => self::STATE_MACHINE_TRANSITION_PURCHASE_ID,
  155.                     'actionName' => 'purchase',
  156.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  157.                     'fromStateId' => self::STATE_MACHINE_STATE_ACCEPTED_ID,
  158.                     'toStateId' => self::STATE_MACHINE_STATE_PURCHASE_ID,
  159.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  160.                 ],
  161.             ], $context);
  162.         }
  163.         $stateMachineOpenPurchasedTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_OPEN_PURCHASED_ID]), $context)->getElements();
  164.         if (count($stateMachineOpenPurchasedTransition) == 0) {
  165.             $stateMachineTransitionRepository->create([
  166.                 [
  167.                     'id' => self::STATE_MACHINE_TRANSITION_OPEN_PURCHASED_ID,
  168.                     'actionName' => 'open_purchased',
  169.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  170.                     'fromStateId' => self::STATE_MACHINE_STATE_PURCHASE_ID,
  171.                     'toStateId' => $STATE_MACHINE_STATE_OPEN_ID,
  172.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  173.                 ],
  174.             ], $context);
  175.         }
  176.         // transition from accepted to rejected
  177.         $stateMachineRejectAcceptedTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_REJECT_ACCEPTED_ID]), $context)->getElements();
  178.         if (count($stateMachineRejectAcceptedTransition) == 0) {
  179.             $stateMachineTransitionRepository->create([
  180.                 [
  181.                     'id' => self::STATE_MACHINE_TRANSITION_REJECT_ACCEPTED_ID,
  182.                     'actionName' => 'reject_accepted',
  183.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  184.                     'fromStateId' => self::STATE_MACHINE_STATE_ACCEPTED_ID,
  185.                     'toStateId' => self::STATE_MACHINE_STATE_REJECTED_ID,
  186.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  187.                 ],
  188.             ], $context);
  189.         }
  190.         // transition from open to done
  191.         $stateMachineOpenDoneTransition $stateMachineTransitionRepository->search(new Criteria([self::STATE_MACHINE_TRANSITION_OPEN_DONE_ID]), $context)->getElements();
  192.         if (count($stateMachineOpenDoneTransition) == 0) {
  193.             $stateMachineTransitionRepository->create([
  194.                 [
  195.                     'id' => self::STATE_MACHINE_TRANSITION_OPEN_DONE_ID,
  196.                     'actionName' => 'reject_accepted',
  197.                     'stateMachineId' => $STATE_MACHINE_ORDER_ID,
  198.                     'fromStateId' => $STATE_MACHINE_STATE_OPEN_ID,
  199.                     'toStateId' => $STATE_MACHINE_STATE_DONE_ID ,
  200.                     'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  201.                 ],
  202.             ], $context);
  203.         }
  204.     }
  205.     private function getOrderStateMachineId(Context $context): string
  206.     {
  207.         /**
  208.          * @var EntityRepositoryInterface $stateMachineRepository
  209.          */
  210.         $stateMachineRepository $this->container->get('state_machine.repository');
  211.         $criteria = new Criteria();
  212.         $criteria->addFilter(new EqualsFilter('technicalName''order.state'));
  213.         /**
  214.          * @var StateMachineEntity $orderStateMachine
  215.          */
  216.         $orderStateMachine $stateMachineRepository->search($criteria$context)->first();
  217.         return $orderStateMachine->getId();
  218.     }
  219.     private function getLanguageId(Context $contextstring $languageCode): ?string
  220.     {
  221.         /**
  222.          * @var EntityRepositoryInterface $languageRepository
  223.          */
  224.         $languageRepository $this->container->get('language.repository');
  225.         $criteria = new Criteria();
  226.         $criteria->addAssociation('locale');
  227.         $criteria->addFilter(new EqualsFilter('locale.code'$languageCode));
  228.         /**
  229.          * @var LanguageEntity $language
  230.          */
  231.         $language $languageRepository->search($criteria$context)->first();
  232.         if ($language) {
  233.             return $language->getId();
  234.         }
  235.         return null;
  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.     public function update(InstallContext $installContext): void
  253.     {
  254.         $this->updateRetailerRole($installContext->getContext());
  255.     }
  256.     private function updateRetailerRole(Context $context)
  257.     {
  258.         /**
  259.          * @var EntityRepositoryInterface
  260.          */
  261.         $aclRoleRepository $this->container->get('acl_role.repository');
  262.         $aclRetailerRole = [
  263.             'id' => 'a390397f72be4b4ab1f8d61e08849108',
  264.             'name' => 'Retailer',
  265.             'description' => 'As a Retailer you can see your own orders.',
  266.             'privileges' => [
  267.                 "country:read",
  268.                 "country_state:read",
  269.                 "currency:read",
  270.                 "custom_field:read",
  271.                 "custom_field_set:read",
  272.                 "custom_field_set_relation:read",
  273.                 "customer:read",
  274.                 "customer_address:read",
  275.                 "document:create",
  276.                 "document:read",
  277.                 "document:update",
  278.                 "document_type:read",
  279.                 "iwv_extra_order_file:create",
  280.                 "iwv_extra_order_file:delete",
  281.                 "iwv_extra_order_file:read",
  282.                 "iwv_extra_order_file:update",
  283.                 "language:read",
  284.                 "locale:read",
  285.                 "log_entry:create",
  286.                 "mail_template:read",
  287.                 "mail_template_sales_channel:create",
  288.                 "mail_template_sales_channel:read",
  289.                 "mail_template_type:read",
  290.                 "message_queue_stats:read",
  291.                 "order.editor",
  292.                 "order.viewer",
  293.                 "order:delete",
  294.                 "order:read",
  295.                 "order:update",
  296.                 "order_address:create",
  297.                 "order_address:read",
  298.                 "order_address:update",
  299.                 "order_customer:read",
  300.                 "order_customer:update",
  301.                 "order_delivery:read",
  302.                 "order_delivery:update",
  303.                 "order_line_item:create",
  304.                 "order_line_item:read",
  305.                 "order_line_item:update",
  306.                 "order_tag:create",
  307.                 "order_tag:delete",
  308.                 "order_tag:read",
  309.                 "order_tag:update",
  310.                 "order_transaction:read",
  311.                 "payment_method:read",
  312.                 "product:read",
  313.                 "product_visibility:read",
  314.                 "property_group:read",
  315.                 "property_group_option:read",
  316.                 "sales_channel:read",
  317.                 "salutation:read",
  318.                 "shipping_method:read",
  319.                 "state_machine:read",
  320.                 "state_machine_history:create",
  321.                 "state_machine_history:read",
  322.                 "state_machine_state:read",
  323.                 "state_machine_transition:read",
  324.                 "swag_language_pack_language:read",
  325.                 "tag:create",
  326.                 "tag:read",
  327.                 "user:read",
  328.                 "user_config:create",
  329.                 "user_config:read",
  330.                 "user_config:update",
  331.                 "vio_representative_agent:read",
  332.                 "customer_group:read",
  333.                 "acl_role:read"// Result in error: Access to entity "acl_role" are not allowed in scope "user"
  334.                 "version:delete"
  335.             ]
  336.         ];
  337.         $aclRoleRepository->upsert([$aclRetailerRole], $context);
  338.     }
  339. }