vendor/store.shopware.com/wexoprofitmetrics/src/WexoProfitmetrics.php line 21

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Wexo\Profitmetrics;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\Context;
  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\Plugin\Context\UninstallContext;
  11. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  12. use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetEntity;
  13. use Shopware\Core\System\CustomField\CustomFieldTypes;
  14. /**
  15.  * Class WexoProfitmetrics
  16.  * @package Wexo\Profitmetrics
  17.  */
  18. class WexoProfitmetrics extends Plugin
  19. {
  20.     public const IMPORT_REPLACEMENTS_ERROR 'integration.import-replacements.error';
  21.     public const NAVISION_CONFIG_PREFIX 'WexoNavision.config.';
  22.     public const PROFIT_METRICS_PRODUCT 'profitmetrics_product';
  23.     public const PROFIT_METRICS_ORDER 'profitmetrics_order';
  24.     public const PROFIT_METRICS_BUY_PRICE 'buy_price';
  25.     public const PROFIT_METRICS_VISITOR_ID 'profitmetrics_visitor_id';
  26.     public const PROFIT_METRICS_SEND_DATE 'profitmetrics_sent_date';
  27.     protected ?EntityRepositoryInterface $customFieldSetRepository null;
  28.     protected ?EntityRepositoryInterface $customFieldRepository null;
  29.     protected ?Context $context null;
  30.     /**
  31.      * @param InstallContext $installContext
  32.      */
  33.     public function install(InstallContext $installContext): void
  34.     {
  35.         parent::install($installContext);
  36.         $this->updateCustomFields();
  37.     }
  38.     public function update(UpdateContext $updateContext): void
  39.     {
  40.         parent::update($updateContext);
  41.         $this->updateCustomFields();
  42.     }
  43.     /**
  44.      * @param UninstallContext $uninstallContext
  45.      */
  46.     public function uninstall(UninstallContext $uninstallContext): void
  47.     {
  48.         parent::uninstall($uninstallContext);
  49.         if (!$uninstallContext->keepUserData()) {
  50.             $context $uninstallContext->getContext();
  51.             $productSetId $this->getFieldSetByName(self::PROFIT_METRICS_PRODUCT$context);
  52.             if ($productSetId) {
  53.                 $this->removeFieldSetById($productSetId$context);
  54.             }
  55.             $orderCustomSetId $this->getFieldSetByName(self::PROFIT_METRICS_ORDER$context);
  56.             if ($orderCustomSetId) {
  57.                 $this->removeFieldSetById($orderCustomSetId$context);
  58.             }
  59.             $connection $this->container->get(Connection::class);
  60.             $connection->executeQuery('DROP TABLE IF EXISTS `profitmetrics_visitor`');
  61.         }
  62.     }
  63.     protected function getFieldSetByName($fieldSetName$context) :?string
  64.     {
  65.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  66.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  67.         $criteria = new Criteria();
  68.         $criteria->addFilter(
  69.             new EqualsFilter('name'$fieldSetName)
  70.         );
  71.         return $customFieldSetRepository->search($criteria$context)->first()->getId();
  72.     }
  73.     protected function removeFieldSetById($customFieldSetId$context):void
  74.     {
  75.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  76.         if ($customFieldSetId) {
  77.             $customFieldSetRepository->delete(
  78.                 [
  79.                     [
  80.                         'id' => $customFieldSetId
  81.                     ]
  82.                 ],
  83.                 $context
  84.             );
  85.         }
  86.     }
  87.     protected function updateCustomFields(): void
  88.     {
  89.         $productCustomFieldSet $this->addCustomFieldSet(
  90.             self::PROFIT_METRICS_PRODUCT,
  91.             [
  92.                 'en-GB' => 'Profitmetrics',
  93.                 'da-DK' => 'Profitmetrics',
  94.                 'de-DE' => 'Profitmetrics',
  95.             ],
  96.             'Product'
  97.         );
  98.         $this->addCustomField(
  99.             self::PROFIT_METRICS_BUY_PRICE,
  100.             CustomFieldTypes::TEXT,
  101.             [
  102.                 'en-GB' => 'Buy Price',
  103.                 'da-DK' => 'Købspris',
  104.                 'de-DE' => 'Kaufpreis',
  105.             ],
  106.             0,
  107.             $productCustomFieldSet->getId()
  108.         );
  109.         $orderCustomFieldSet $this->addCustomFieldSet(
  110.             self::PROFIT_METRICS_ORDER,
  111.             [
  112.                 'en-GB' => 'Profitmetrics',
  113.                 'da-DK' => 'Profitmetrics',
  114.                 'de-DE' => 'Profitmetrics',
  115.             ],
  116.             'order'
  117.         );
  118.         $this->addCustomField(
  119.             self::PROFIT_METRICS_VISITOR_ID,
  120.             CustomFieldTypes::TEXT,
  121.             [
  122.                 'en-GB' => 'Profitmetrics Visitor ID',
  123.                 'da-DK' => 'Profitmetrics besøgende-id',
  124.                 'de-DE' => 'Profitmetrics Besucher-ID',
  125.             ],
  126.             0,
  127.             $orderCustomFieldSet->getId()
  128.         );
  129.         $this->addCustomField(
  130.             self::PROFIT_METRICS_SEND_DATE,
  131.             CustomFieldTypes::DATETIME,
  132.             [
  133.                 'en-GB' => 'Time of order data sending to profitmetrics',
  134.                 'da-DK' => 'Tidspunkt for ordredata, der sendes til profitmetrics',
  135.                 'de-DE' => 'Zeitpunkt der Auftragsdatenübertragung an Profitmetrics',
  136.             ],
  137.             0,
  138.             $orderCustomFieldSet->getId()
  139.         );
  140.     }
  141.     /**
  142.      * @param string $name
  143.      * @param array $labels
  144.      * @param string $entity
  145.      * @return CustomFieldSetEntity
  146.      */
  147.     protected function addCustomFieldSet(
  148.         string $name,
  149.         array $labels,
  150.         string $entity
  151.     ): CustomFieldSetEntity {
  152.         $this->context $this->context ?? Context::createDefaultContext();
  153.         if (! $this->customFieldSetRepository) {
  154.             $this->customFieldSetRepository $this->container->get('custom_field_set.repository');
  155.         }
  156.         $criteria = new Criteria();
  157.         $criteria->addFilter(new EqualsFilter('name'$name));
  158.         /** @var CustomFieldSetEntity $customFieldSet */
  159.         $customFieldSet $this->customFieldSetRepository->search(
  160.             $criteria,
  161.             $this->context
  162.         )->first();
  163.         if (! $customFieldSet) {
  164.             $this->customFieldSetRepository->create(
  165.                 [
  166.                     [
  167.                         'name' => $name,
  168.                         'config' => [
  169.                             'label' => $labels
  170.                         ],
  171.                         'relations' => [
  172.                             [
  173.                                 'entityName' => $entity,
  174.                             ],
  175.                         ],
  176.                     ],
  177.                 ],
  178.                 $this->context
  179.             );
  180.             $customFieldSet $this->customFieldSetRepository->search(
  181.                 $criteria,
  182.                 $this->context
  183.             )->first();
  184.         }
  185.         return $customFieldSet;
  186.     }
  187.     /**
  188.      * @param string $name
  189.      * @param string $type
  190.      * @param array $labels
  191.      * @param int $position
  192.      * @param string $customFieldSetId
  193.      */
  194.     protected function addCustomField(
  195.         string $name,
  196.         string $type,
  197.         array $labels,
  198.         int $position,
  199.         string $customFieldSetId
  200.     ): void {
  201.         $this->context $this->context ?? Context::createDefaultContext();
  202.         if (! $this->customFieldRepository) {
  203.             $this->customFieldRepository $this->container->get('custom_field.repository');
  204.         }
  205.         $criteria = new Criteria();
  206.         $criteria->addFilter(new EqualsFilter('name'$name));
  207.         $customFieldExists $this->customFieldRepository->searchIds(
  208.             $criteria,
  209.             $this->context
  210.         )->firstId();
  211.         if (!$customFieldExists) {
  212.             if (! $this->customFieldSetRepository) {
  213.                 $this->customFieldSetRepository $this->container->get('custom_field_set.repository');
  214.             }
  215.             $this->customFieldSetRepository->upsert([
  216.                 [
  217.                     'id'           => $customFieldSetId,
  218.                     'customFields' => [
  219.                         [
  220.                             'name'   => $name,
  221.                             'type'   => $type,
  222.                             'config' => [
  223.                                 'label'               => $labels,
  224.                                 'componentName'       => 'sw-field',
  225.                                 'customFieldType'     => $type == CustomFieldTypes::BOOL 'checkbox' $type,
  226.                                 'customFieldPosition' => $position,
  227.                             ],
  228.                         ]
  229.                     ]
  230.                 ]
  231.             ], $this->context);
  232.         }
  233.     }
  234. }