<?php
namespace App\EventListener;
use App\Entity\ActionLog;
use App\Manager\AssetManager;
use App\Manager\ArticleManager;
use Pimcore\Model\Property\Predefined;
use Psr\Log\LoggerInterface;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\Asset;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use App\Service\ActionLogService;
use App\Repository\ActionLogRepository;
use Doctrine\Persistence\ManagerRegistry;
use App\Service\ControlService;
use App\Manager\EclateManager;
use App\Manager\CatalogueManager;
use Pimcore\Log\ApplicationLogger;
use App\Model\DataObject\Article;
use Pimcore\Model\DataObject\Catalogue;
class ArticleListener
{
private HttpClientInterface $client;
private ArticleManager $articleManager;
private EclateManager $eclateManager;
private CatalogueManager $catalogueManager;
private LoggerInterface $logger;
private $shercoNetworkSync;
private ActionLogService $actionLogService;
private ControlService $controlService;
private $managerRegistry;
public function __construct($shercoNetworkSync, HttpClientInterface $client, ArticleManager $articleManager, EclateManager $eclateManager, CatalogueManager $catalogueManager,
LoggerInterface $logger, ActionLogService $actionLogService, ControlService $controlService, ManagerRegistry $managerRegistry)
{
$this->shercoNetworkSync = $shercoNetworkSync;
$this->client = $client;
$this->articleManager = $articleManager;
$this->eclateManager = $eclateManager;
$this->catalogueManager = $catalogueManager;
$this->logger = $logger;
$this->actionLogService = $actionLogService;
$this->controlService = $controlService;
$this->managerRegistry = $managerRegistry;
}
public function onArticlePostAdd(DataObjectEvent $o)
{
$article = $o->getObject();
if ($this->articleManager->objectIsArticle($article)) {
$type = 'article';
if ($article->getType() != 'folder') {
if ($article->get("o_className") == "Article") {
$statut = $article->isPublished() ? 'valide' : 'en-cours';
$this->actionLogService->logActionArticle($o, 'add', $type, $statut);
$obsolete = $article->getArticle_obsolete() ? $article->getArticle_obsolete() : false;
if($obsolete) {
$this->manageObsolete($article);
}
}
}
}
}
public function onArticlePostUpdate(DataObjectEvent $o)
{
$article = $o->getObject();
if ($article->getType() != 'folder') {
if ($article->get("o_className") == "Article") {
if ($article->isPublished()) {
$this->actionLogService->logActionArticle($o, 'update', 'article', "valide");
} else {
$repository = $this->managerRegistry->getRepository(ActionLog::class);
$actionLog = $repository->findOneBy(['objectId' => $article->getId(), 'status' => "valide"], ['date' => 'desc']);
if (isset($actionLog) && $actionLog->getAction() != 'delete') {
$this->actionLogService->logActionArticle($o, 'delete', 'article', "valide");
} else {
$this->actionLogService->logActionArticle($o, 'update', 'article', "en-cours");
}
}
$obsolete = $article->getArticle_obsolete() ? $article->getArticle_obsolete() : false;
if($obsolete) {
$this->manageObsolete($article);
}
}
}
}
public function onArticlePostDelete(DataObjectEvent $o)
{
$article = $o->getObject();
if ($this->articleManager->objectIsArticle($article)) {
$type = 'article';
if ($article->getType() != 'folder') {
if ($article->get("o_className") == "Article") {
if ($article->isPublished()) {
$repository = $this->managerRegistry->getRepository(ActionLog::class);
$actionLog = $repository->findOneBy(['objectId' => $article->getId(), 'status' => "valide"], ['date' => 'desc']);
if (isset($actionLog) && $actionLog->getAction() != 'delete') {
$this->actionLogService->logActionArticle($o, 'delete', $type, "valide");
}
} else {
$this->actionLogService->logActionArticle($o, 'delete', 'article', "en-cours");
}
}
}
}
}
public function manageObsolete($article){
$this->manageEclates($article);
$this->manageCatalogues($article);
}
public function manageCatalogues($article){
ApplicationLogger::getInstance()->info('in manage catalogue : '.$article->getArticle_code1());
$catalogueList = $this->catalogueManager->findAllCatalogueWithArticleId($article->getId());
$catalogueArticleDataList = $this->catalogueManager->findAllCatalogueArticleDataWithArticleId($article->getId());
if(!isset($catalogueList) && !isset($catalogueArticleDataList)) {
return;
}
if ($article->getArticle_obsolete_code()) {
foreach($catalogueList as $catalogue){
$this->changeCatalogueValue($article, $catalogue, $article->getArticle_obsolete_code());
}
foreach($catalogueArticleDataList as $catalogueArticleData) {
$this->changeCatalogueArticleDataValue($article, $catalogueArticleData, $article->getArticle_obsolete_code());
}
} else {
foreach($catalogueList as $catalogue){
$this->changeCatalogueValue($article, $catalogue, '');
}
foreach($catalogueArticleDataList as $catalogueArticleData) {
$this->changeCatalogueArticleDataValue($article, $catalogueArticleData, '');
}
}
}
public function changeCatalogueValue(Article $article, Catalogue $catalogue, $value){
if (!$value) {
return false;
}
// On récupère le nouvel article via son code
$newArticleObject = Article::getByArticle_code1($value, ['limit' => 1, 'unpublished' => true]);
if (!$newArticleObject) {
ApplicationLogger::getInstance()->error('pas d\'article trouvé pour : '. $article->getId());
return false;
}
/** @var Fieldcollection|null $fc */
$articlesCollection = $catalogue->getCatalogue_articles2();
if (!$articlesCollection) {
// rien à modifier
return false;
}
$changed = false;
foreach ($articlesCollection->getItems() as $relation) {
$updatedArticles = [];
$relatedArticles = $relation->getArticles() ?? [];
foreach($relatedArticles as $relatedArticle) {
if ($relatedArticle && $relatedArticle->getId() === $article->getId()) {
$updatedArticles[] = $newArticleObject;
\Pimcore\Log\ApplicationLogger::getInstance()->info("Remplacé article ID {$article->getId()} par {$newArticleObject->getId()} dans catalogue ID {$catalogue->getId()}");
$changed = true;
} else {
$updatedArticles[] = $relatedArticle;
}
}
$relation->setArticles($updatedArticles);
}
if ($changed) {
$catalogue->setCatalogue_articles2($articlesCollection);
$catalogue->save();
\Pimcore\Log\ApplicationLogger::getInstance()->info("Catalogue {$catalogue->getId()} mis à jour");
}
}
public function changeCatalogueArticleDataValue(Article $article, $catalogueArticleData, $value){
if (!$value) {
ApplicationLogger::getInstance()->error('impossible de remplacer par une valeur vide dans catalogue ');
return false;
}
$newArticleObject = \Pimcore\Model\DataObject\Article::getByArticle_code1($value, ['limit' => 1, 'unpublished' => true]);
if (!$newArticleObject) {
ApplicationLogger::getInstance()->error('pas d\'article trouvé pour : '. $article->getId());
return false;
}
$updatedRelations = [];
foreach ($catalogueArticleData->getArticleData() as $relation) {
$relatedArticle = $relation->getObject();
if ($relatedArticle && $relatedArticle->getId() === $article->getId()) {
ApplicationLogger::getInstance()->info(sprintf('Article lié: code=%s | order=%s | year=%s',
$relatedArticle->getArticle_code1(), $relation->getOrder(), $relation->getYear()
));
$relation->setObject($newArticleObject);
}
$updatedRelations[] = $relation;
}
if(!empty($updatedRelations)) {
$catalogueArticleData->setArticleData($updatedRelations);
$catalogueArticleData->save();
}
if ($catalogueArticleData->getParentArticle() && $catalogueArticleData->getParentArticle()->getId() === $article->getId()) {
$catalogueList = $this->catalogueManager->getCatalogueObjectByCatalogueSubarticleId($catalogueArticleData->getId());
if(empty($catalogueList) || !isset($catalogueList)) {
return;
}
foreach ($catalogueList as $catalogue) {
/*$newRelations = [];
foreach ($catalogue->getCatalogue_articles2() as $relation) {
$relatedArticle = $relation->getArticle();
if ($relatedArticle && $relatedArticle->getId() === $article->getId()) {
$newRelation = clone $relation;
$newRelation->setArticle($newArticleObject);
$newRelations[] = $newRelation;
\Pimcore\Log\ApplicationLogger::getInstance()->info("Remplacé article ID {$article->getId()} par {$newArticleObject->getId()} dans catalogue ID {$catalogue->getId()}");
} else {
$newRelations[] = $relation;
}
}
if (!empty($newRelations)) {
$catalogue->setCatalogue_articles2($newRelations);
$catalogue->save();
\Pimcore\Log\ApplicationLogger::getInstance()->info("Catalogue {$catalogue->getId()} mis à jour");
}*/
//TODO : possiblement à supprimer vu qu'on aura déjà modifié les catalogue dans manageCatalogues()
//sauf si le catalogueListener se met à vérifier la correlation article / subarticle
$this->changeCatalogueValue($article, $catalogue, $value);
}
$catalogueArticleData->setParentArticle($newArticleObject);
$catalogueArticleData->save();
}
return true;
}
public function manageEclates($article){
$associationReferenceList = $this->eclateManager->findAllAssociationReferenceWithArticle($article);
if(empty($associationReferenceList) || !isset($associationReferenceList)) {
return;
}
if ($article->getArticle_obsolete_code()) {
foreach($associationReferenceList as $associationReference) {
$this->changeEclateValue($article, $associationReference, $article->getArticle_obsolete_code());
}
} else {
foreach($associationReferenceList as $associationReference) {
$this->changeEclateValue($article, $associationReference, '');
}
}
}
public function changeEclateValue($article, $associationReference, $value){
$newArray = [];
foreach ($associationReference->getEclateReferences() as $line) {
$isTargetRef = $line["Reference"] === $article->getArticle_code1();
$newArray[] = [
"Position" => $line["Position"],
"CoordX" => $line["CoordX"],
"CoordY" => $line["CoordY"],
"Confidence" => $line["Confidence"],
"Reference" => $isTargetRef ? $value : $line["Reference"],
"Quantite" => $line["Quantite"],
];
}
if(!empty($newArray)) {
$associationReference->setEclateReferences($newArray);
$associationReference->save();
}
if ($associationReference->getRelationArticle()?->getId() === $article->getId()) {
if ($value) {
$newArticleObject = \Pimcore\Model\DataObject\Article::getByArticle_code1($value, ['limit' => 1, 'unpublished' => true]);
if (!$newArticleObject) {
ApplicationLogger::getInstance()->error('pas d\'article trouvé pour : '. $article->getId());
return false;
}
$associationReference->setRelationArticle($newArticleObject);
$associationReference->save();
} else {
ApplicationLogger::getInstance()->error('impossible de remplacer par une valeur vide dans : '. $associationReference->getId());
return false;
}
}
return true;
}
}