<?php declare(strict_types=1);
namespace SmartDato\DatoElectronicInvoicing;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
use Shopware\Core\Framework\Plugin\Context\UninstallContext;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use SmartDato\DatoElectronicInvoicing\Bootstrap\SchemaManager;
use Throwable;
/**
* Class DatoElectronicInvoicingSw6
*
* @package SmartDato\DatoElectronicInvoicing
*/
class DatoElectronicInvoicingSw6 extends Plugin
{
/**
* @inheritDoc
*/
public function postInstall(InstallContext $installContext): void
{
parent::postInstall($installContext);
try {
$this->addCustomFields(SchemaManager::CUSTOM_FIELDS, $installContext);
} catch (Throwable $ex) {
echo ($ex->getMessage()) . PHP_EOL;
}
}
/**
* @inheritDoc
*/
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if ($uninstallContext->keepUserData()) {
return;
}
try {
$this->deleteCustomFields(SchemaManager::CUSTOM_FIELDS, $uninstallContext);
} catch (Throwable $ex) {
echo ($ex->getMessage()) . PHP_EOL;
}
}
/**
* Add custom fields
*
* @param array $customFields
* @param InstallContext $installContext
*/
private function addCustomFields(array $customFields, InstallContext $installContext): void
{
/** @var EntityRepositoryInterface $customFieldSetRepository */
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$customFieldSetRepository->create($customFields, $installContext->getContext());
}
/**
* Delete custom fields
*
* @param array $customFields
* @param UninstallContext $uninstallContext
*/
private function deleteCustomFields(array $customFields, UninstallContext $uninstallContext): void
{
$ids = $this->getCustomFieldsIdsByNames($customFields, $uninstallContext);
if (!$ids) {
return;
}
$this->deleteCustomFieldsByIds($uninstallContext, $ids);
}
/**
* Get custom fields ids by custom fields names
*
* @param array $customFields
* @param UninstallContext $uninstallContext
*
* @return string[]|null
*/
private function getCustomFieldsIdsByNames(array $customFields, UninstallContext $uninstallContext): ?array
{
try {
$criteria = new Criteria();
} catch (InconsistentCriteriaIdsException $ex) {
return null;
}
$criteria->addFilter(new EqualsAnyFilter('name', array_column($customFields, 'name')));
/** @var EntityRepositoryInterface $customFieldSetRepository */
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$idSearchResult = $customFieldSetRepository->searchIds($criteria, $uninstallContext->getContext());
return $idSearchResult->getIds();
}
/**
* Delete custom fields by ids
*
* @param UninstallContext $uninstallContext
* @param array $ids
*/
private function deleteCustomFieldsByIds(UninstallContext $uninstallContext, array $ids): void
{
$deleteData = [];
foreach ($ids as $id) {
$deleteData[] = ['id' => $id];
}
/** @var EntityRepositoryInterface $customFieldSetRepository */
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$customFieldSetRepository->delete($deleteData, $uninstallContext->getContext());
}
}