<?php declare(strict_types=1);
namespace Wexo\Profitmetrics;
use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
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\CustomFieldSetEntity;
use Shopware\Core\System\CustomField\CustomFieldTypes;
/**
* Class WexoProfitmetrics
* @package Wexo\Profitmetrics
*/
class WexoProfitmetrics extends Plugin
{
public const IMPORT_REPLACEMENTS_ERROR = 'integration.import-replacements.error';
public const NAVISION_CONFIG_PREFIX = 'WexoNavision.config.';
public const PROFIT_METRICS_PRODUCT = 'profitmetrics_product';
public const PROFIT_METRICS_ORDER = 'profitmetrics_order';
public const PROFIT_METRICS_BUY_PRICE = 'buy_price';
public const PROFIT_METRICS_VISITOR_ID = 'profitmetrics_visitor_id';
public const PROFIT_METRICS_SEND_DATE = 'profitmetrics_sent_date';
protected ?EntityRepositoryInterface $customFieldSetRepository = null;
protected ?EntityRepositoryInterface $customFieldRepository = null;
protected ?Context $context = null;
/**
* @param InstallContext $installContext
*/
public function install(InstallContext $installContext): void
{
parent::install($installContext);
$this->updateCustomFields();
}
public function update(UpdateContext $updateContext): void
{
parent::update($updateContext);
$this->updateCustomFields();
}
/**
* @param UninstallContext $uninstallContext
*/
public function uninstall(UninstallContext $uninstallContext): void
{
parent::uninstall($uninstallContext);
if (!$uninstallContext->keepUserData()) {
$context = $uninstallContext->getContext();
$productSetId = $this->getFieldSetByName(self::PROFIT_METRICS_PRODUCT, $context);
if ($productSetId) {
$this->removeFieldSetById($productSetId, $context);
}
$orderCustomSetId = $this->getFieldSetByName(self::PROFIT_METRICS_ORDER, $context);
if ($orderCustomSetId) {
$this->removeFieldSetById($orderCustomSetId, $context);
}
$connection = $this->container->get(Connection::class);
$connection->executeQuery('DROP TABLE IF EXISTS `profitmetrics_visitor`');
}
}
protected function getFieldSetByName($fieldSetName, $context) :?string
{
/** @var EntityRepositoryInterface $customFieldSetRepository */
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$criteria = new Criteria();
$criteria->addFilter(
new EqualsFilter('name', $fieldSetName)
);
return $customFieldSetRepository->search($criteria, $context)->first()->getId();
}
protected function removeFieldSetById($customFieldSetId, $context):void
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
if ($customFieldSetId) {
$customFieldSetRepository->delete(
[
[
'id' => $customFieldSetId
]
],
$context
);
}
}
protected function updateCustomFields(): void
{
$productCustomFieldSet = $this->addCustomFieldSet(
self::PROFIT_METRICS_PRODUCT,
[
'en-GB' => 'Profitmetrics',
'da-DK' => 'Profitmetrics',
'de-DE' => 'Profitmetrics',
],
'Product'
);
$this->addCustomField(
self::PROFIT_METRICS_BUY_PRICE,
CustomFieldTypes::TEXT,
[
'en-GB' => 'Buy Price',
'da-DK' => 'Købspris',
'de-DE' => 'Kaufpreis',
],
0,
$productCustomFieldSet->getId()
);
$orderCustomFieldSet = $this->addCustomFieldSet(
self::PROFIT_METRICS_ORDER,
[
'en-GB' => 'Profitmetrics',
'da-DK' => 'Profitmetrics',
'de-DE' => 'Profitmetrics',
],
'order'
);
$this->addCustomField(
self::PROFIT_METRICS_VISITOR_ID,
CustomFieldTypes::TEXT,
[
'en-GB' => 'Profitmetrics Visitor ID',
'da-DK' => 'Profitmetrics besøgende-id',
'de-DE' => 'Profitmetrics Besucher-ID',
],
0,
$orderCustomFieldSet->getId()
);
$this->addCustomField(
self::PROFIT_METRICS_SEND_DATE,
CustomFieldTypes::DATETIME,
[
'en-GB' => 'Time of order data sending to profitmetrics',
'da-DK' => 'Tidspunkt for ordredata, der sendes til profitmetrics',
'de-DE' => 'Zeitpunkt der Auftragsdatenübertragung an Profitmetrics',
],
0,
$orderCustomFieldSet->getId()
);
}
/**
* @param string $name
* @param array $labels
* @param string $entity
* @return CustomFieldSetEntity
*/
protected function addCustomFieldSet(
string $name,
array $labels,
string $entity
): CustomFieldSetEntity {
$this->context = $this->context ?? Context::createDefaultContext();
if (! $this->customFieldSetRepository) {
$this->customFieldSetRepository = $this->container->get('custom_field_set.repository');
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', $name));
/** @var CustomFieldSetEntity $customFieldSet */
$customFieldSet = $this->customFieldSetRepository->search(
$criteria,
$this->context
)->first();
if (! $customFieldSet) {
$this->customFieldSetRepository->create(
[
[
'name' => $name,
'config' => [
'label' => $labels
],
'relations' => [
[
'entityName' => $entity,
],
],
],
],
$this->context
);
$customFieldSet = $this->customFieldSetRepository->search(
$criteria,
$this->context
)->first();
}
return $customFieldSet;
}
/**
* @param string $name
* @param string $type
* @param array $labels
* @param int $position
* @param string $customFieldSetId
*/
protected function addCustomField(
string $name,
string $type,
array $labels,
int $position,
string $customFieldSetId
): void {
$this->context = $this->context ?? Context::createDefaultContext();
if (! $this->customFieldRepository) {
$this->customFieldRepository = $this->container->get('custom_field.repository');
}
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('name', $name));
$customFieldExists = $this->customFieldRepository->searchIds(
$criteria,
$this->context
)->firstId();
if (!$customFieldExists) {
if (! $this->customFieldSetRepository) {
$this->customFieldSetRepository = $this->container->get('custom_field_set.repository');
}
$this->customFieldSetRepository->upsert([
[
'id' => $customFieldSetId,
'customFields' => [
[
'name' => $name,
'type' => $type,
'config' => [
'label' => $labels,
'componentName' => 'sw-field',
'customFieldType' => $type == CustomFieldTypes::BOOL ? 'checkbox' : $type,
'customFieldPosition' => $position,
],
]
]
]
], $this->context);
}
}
}