custom/plugins/LenzPlatformVatIdValidation/src/LenzPlatformVatIdValidation.php line 19

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace LenzPlatformVatIdValidation;
  3. use Doctrine\DBAL\Connection;
  4. use Exception;
  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\ActivateContext;
  11. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  12. use Shopware\Core\Framework\Plugin\Context\UninstallContext;
  13. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  14. use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetEntity;
  15. use Shopware\Core\System\CustomField\CustomFieldTypes;
  16. class LenzPlatformVatIdValidation extends Plugin
  17. {
  18.     public function install(InstallContext $installContext): void
  19.     {
  20.         if(!extension_loaded('soap')) {
  21.             throw new Exception('PHP-Extension "soap" is not installed, but is a requirement for this plugin.');
  22.         }
  23.         foreach (array_keys($this->customFieldSets) as $key)
  24.         {
  25.             $this->createOrUpdateCustomFields($key);
  26.         }
  27.     }
  28.     public function activate(ActivateContext $activateContext): void
  29.     {
  30.         foreach (array_keys($this->customFieldSets) as $key)
  31.         {
  32.             $this->createOrUpdateCustomFields($key);
  33.         }
  34.     }
  35.     public function update(UpdateContext $updateContext): void
  36.     {
  37.         foreach (array_keys($this->customFieldSets) as $key)
  38.         {
  39.             $this->createOrUpdateCustomFields($key);
  40.         }
  41.     }
  42.     public function uninstall(UninstallContext $uninstallContext): void
  43.     {
  44.         if(!$uninstallContext->keepUserData()) {
  45.             $connection $this->container->get(Connection::class);
  46.             $tablesToDelete = [
  47.                 'lenz_platform_vat_id_validation_result',
  48.             ];
  49.             foreach ($tablesToDelete as $table) {
  50.                 try {
  51.                     $connection->executeStatement('DROP TABLE IF EXISTS `' $table '`');
  52.                 } catch(Exception $e) {
  53.                     echo "Table \"" $table "\" not deleted.\n\r";
  54.                 }
  55.             }
  56.             foreach (array_keys($this->customFieldSets) as $key)
  57.             {
  58.                 $this->deleteCustomFieldSet($key);
  59.             }
  60.         }
  61.     }
  62.     // -- Custom fields
  63.     private array $customFieldSets = [
  64.         'lenz_platform_vat_id_validation_customer' => [
  65.             'name' => 'lenz_platform_vat_id_validation_customer',
  66.             'config' => [
  67.                 'label' => [
  68.                     'en-GB' => 'VatID Validation - Customer',
  69.                     'de-DE' => 'USTID Validierung - Kunde',
  70.                 ],
  71.             ],
  72.             'relations' => [
  73.                 ['entityName' => 'customer']
  74.             ],
  75.             'customFields' => [
  76.                 [
  77.                     'name' => 'lenz_platform_vat_id_validation_customer_validation_type',
  78.                     'type' => CustomFieldTypes::SELECT,
  79.                     'config' => [
  80.                         'customFieldType' => 'select',
  81.                         'componentName' => 'sw-single-select',
  82.                         'customFieldPosition' => 101,
  83.                         'label' => [
  84.                             'en-GB' => 'Validation type',
  85.                             'de-DE' => 'Validierungstyp',
  86.                         ],
  87.                         'placeholder' => [
  88.                             'en-GB' => 'Alternative validation type for this customer (Validation on taxfree delivery + checkout)',
  89.                             'de-DE' => 'Alternativer Validierungstyp für diesen Kunden (Validierung bei Steuerfreiheit + Bestellabschluss)',
  90.                         ],
  91.                         'options' => [
  92.                             [
  93.                                 'label' => [
  94.                                     'en-GB' => 'None',
  95.                                     'de-DE' => 'Keine',
  96.                                 ],
  97.                                 'value' => 0
  98.                             ],
  99.                             [
  100.                                 'label' => [
  101.                                     'en-GB' => 'Offline (only syntax)',
  102.                                     'de-DE' => 'Offline (nur Syntax)',
  103.                                 ],
  104.                                 'value' => 1
  105.                             ],
  106.                             [
  107.                                 'label' => [
  108.                                     'en-GB' => 'Simple (DE + EU)',
  109.                                     'de-DE' => 'Einfach (DE + EU)',
  110.                                 ],
  111.                                 'value' => 2
  112.                             ],
  113.                             [
  114.                                 'label' => [
  115.                                     'en-GB' => 'Extended (DE + EU with suggestions) (recommended)',
  116.                                     'de-DE' => 'Erweitert (DE + EU mit Vorschlägen) (empfohlen)',
  117.                                 ],
  118.                                 'value' => 3
  119.                             ]
  120.                         ],
  121.                     ],
  122.                 ],
  123.             ],
  124.         ],
  125.     ];
  126.     private function findCustomFieldSet($name): ?CustomFieldSetEntity
  127.     {
  128.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  129.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  130.         $criteria = new Criteria();
  131.         $criteria->addFilter(new EqualsFilter('name'$name));
  132.         $criteria->addAssociation('customFields');
  133.         $criteria->addAssociation('relations');
  134.         /** @var CustomFieldSetEntity|null $customFieldSet */
  135.         return $customFieldSetRepository->search($criteriaContext::createDefaultContext())->first();
  136.     }
  137.     public function createOrUpdateCustomFields($name)
  138.     {
  139.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  140.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  141.         $customFieldSet $this->findCustomFieldSet($name);
  142.         $customFieldSetId null;
  143.         $customFieldName2Id = [];
  144.         $relationEntity2Id = [];
  145.         if(!empty($customFieldSet)) {
  146.             $customFieldSetId $customFieldSet->getId();
  147.             foreach ($customFieldSet->getCustomFields() as $customField) {
  148.                 $customFieldName2Id[$customField->getName()] = $customField->getId();
  149.             }
  150.             foreach ($customFieldSet->getRelations() as $relation) {
  151.                 $relationEntity2Id[$relation->getEntityName()] = $relation->getId();
  152.             }
  153.         }
  154.         $customFieldSet $this->customFieldSets[$name];
  155.         $customFieldSet['id'] = $customFieldSetId;
  156.         foreach ($customFieldSet['customFields'] as $customFieldKey => $customField) {
  157.             if(!array_key_exists($customField['name'], $customFieldName2Id)) {
  158.                 continue;
  159.             }
  160.             $customFieldSet['customFields'][$customFieldKey]['id'] = $customFieldName2Id[$customField['name']];
  161.         }
  162.         foreach ($customFieldSet['relations'] as $relationKey => $relation) {
  163.             if(!array_key_exists($relation['entityName'], $relationEntity2Id)) {
  164.                 continue;
  165.             }
  166.             $customFieldSet['relations'][$relationKey]['id'] = $relationEntity2Id[$relation['entityName']];
  167.         }
  168.         $customFieldSetRepository->upsert(
  169.             [ $customFieldSet ],
  170.             Context::createDefaultContext()
  171.         );
  172.     }
  173.     private function deleteCustomFieldSet(string $name)
  174.     {
  175.         /** @var EntityRepositoryInterface $customFieldSetRepository */
  176.         $customFieldSetRepository $this->container->get('custom_field_set.repository');
  177.         $customFieldSet $this->findCustomFieldSet($name);
  178.         if ($customFieldSet === null) {
  179.             return;
  180.         }
  181.         $customFieldSetRepository->delete(
  182.             [
  183.                 ['id' => $customFieldSet->getId()],
  184.             ],
  185.             Context::createDefaultContext()
  186.         );
  187.     }
  188. }