<?php
declare(strict_types=1);
namespace VioB2BLogin;
use Doctrine\DBAL\Connection;
use RuntimeException;
use Shopware\Core\Checkout\Order\OrderDefinition;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin\Context\UpdateContext;
use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetDefinition;
use Shopware\Core\System\CustomField\CustomFieldTypes;
use VioB2BLogin\Entity\Employee\EmployeeDefinition;
class VioB2BLogin extends Plugin
{
public const CUSTOM_FIELDSET_NAME = 'vio_b2b';
public const EMPLOYEE_FIELD = 'vio_b2b_employee';
public function install(InstallContext $installContext): void
{
$this->updateCustomFields($installContext->getContext());
parent::install($installContext);
}
public function update(UpdateContext $updateContext): void
{
$this->updateCustomFields($updateContext->getContext());
parent::update($updateContext);
}
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if ($uninstallContext->keepUserData()) {
return;
}
$connection = $this->container->get(Connection::class);
if ($connection) {
$connection->executeStatement('DROP TABLE IF EXISTS vio_b2b_employee_address');
$connection->executeStatement('DROP TABLE IF EXISTS vio_b2b_employee_privilege');
$connection->executeStatement('DROP TABLE IF EXISTS vio_b2b_employee_recovery');
$connection->executeStatement('DROP TABLE IF EXISTS vio_b2b_employee');
$connection->executeStatement('DROP TABLE IF EXISTS vio_b2b_privilege');
}
// drop custom field
$this->removeCustomFields($uninstallContext->getContext());
}
/**
* @param Context $context
*/
private function updateCustomFields(Context $context): void
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
if (!$customFieldSetRepository) {
throw new RuntimeException("Couldn't resolve service 'custom_field_set.repository'");
}
$fieldSetName = static::CUSTOM_FIELDSET_NAME;
$fieldSetId = $customFieldSetRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('name', $fieldSetName)), $context)->firstId();
if ($fieldSetId === null) {
$fieldSetData = [
'name' => $fieldSetName,
'config' => [
'label' => [
'de-DE' => 'B2B Daten',
'en-GB' => 'B2B Data'
]
],
'relations' => [
['entityName' => OrderDefinition::ENTITY_NAME]
]
];
$fieldSetData['id'] = $fieldSetId;
/** @var string[] $primaryKeys */
$primaryKeys = $customFieldSetRepository
->upsert([$fieldSetData], $context)
->getPrimaryKeys(CustomFieldSetDefinition::ENTITY_NAME);
$fieldSetId = array_shift($primaryKeys);
}
if ($fieldSetId !== null) {
$this->updateCustomField(
$fieldSetId,
static::EMPLOYEE_FIELD,
[
'name' => static::EMPLOYEE_FIELD,
'type' => CustomFieldTypes::ENTITY,
'config' => [
'label' => [
'de-DE' => 'Verursachender Mitarbeiter',
'en-GB' => 'Initiating employee'
],
'entity' => EmployeeDefinition::ENTITY_NAME,
'componentName' => 'sw-entity-single-select',
'labelProperty' => ['number', 'firstName', 'lastName']
],
],
$context
);
}
}
/**
* @param string $fieldSetId
* @param string $fieldName
* @param array $fieldData
* @param Context $context
* @noinspection DuplicatedCode
* @noinspection PhpSameParameterValueInspection
*/
private function updateCustomField(string $fieldSetId, string $fieldName, array $fieldData, Context $context): void
{
$customFieldRepository = $this->container->get('custom_field.repository');
if (!$customFieldRepository) {
throw new RuntimeException("Couldn't resolve service 'custom_field.repository'");
}
if (!array_key_exists('name', $fieldData)) {
$fieldData['name'] = $fieldName;
}
if (!array_key_exists('customFieldSetId', $fieldData)) {
$fieldData['customFieldSetId'] = $fieldSetId;
}
$fieldId = $customFieldRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('name', $fieldName)), $context)->firstId();
if ($fieldId !== null) {
$fieldData['id'] = $fieldId;
}
$customFieldRepository->upsert([$fieldData], $context);
}
private function removeCustomFields(Context $context): void
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
if (!$customFieldSetRepository) {
throw new RuntimeException("Couldn't resolve service 'custom_field_set.repository'");
}
$fieldSetName = self::CUSTOM_FIELDSET_NAME;
$fieldSetId = $customFieldSetRepository->searchIds((new Criteria())->addFilter(new EqualsFilter('name', $fieldSetName)), $context)->firstId();
if ($fieldSetId) {
$customFieldSetRepository->delete([
[
'id' => $fieldSetId
]
], $context);
}
}
}