src/EventListener/ArticleListener.php line 78

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\ActionLog;
  4. use App\Manager\AssetManager;
  5. use App\Manager\ArticleManager;
  6. use Pimcore\Model\Property\Predefined;
  7. use Psr\Log\LoggerInterface;
  8. use Pimcore\Event\Model\DataObjectEvent;
  9. use Pimcore\Model\Asset;
  10. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  11. use Symfony\Contracts\HttpClient\HttpClientInterface;
  12. use App\Service\ActionLogService;
  13. use App\Repository\ActionLogRepository;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use App\Service\ControlService;
  16. use App\Manager\EclateManager;
  17. use App\Manager\CatalogueManager;
  18. use Pimcore\Log\ApplicationLogger;
  19. use App\Model\DataObject\Article;
  20. use Pimcore\Model\DataObject\Catalogue;
  21. class ArticleListener
  22. {
  23.     private HttpClientInterface $client;
  24.     private ArticleManager $articleManager;
  25.     private EclateManager $eclateManager;
  26.     private CatalogueManager $catalogueManager;
  27.     private LoggerInterface $logger;
  28.     private $shercoNetworkSync;
  29.     private ActionLogService $actionLogService;
  30.     private ControlService $controlService;
  31.     private $managerRegistry;
  32.     public function __construct($shercoNetworkSyncHttpClientInterface $clientArticleManager $articleManagerEclateManager $eclateManagerCatalogueManager $catalogueManager,
  33.                                 LoggerInterface $loggerActionLogService $actionLogServiceControlService $controlServiceManagerRegistry $managerRegistry)
  34.     {
  35.         $this->shercoNetworkSync $shercoNetworkSync;
  36.         $this->client $client;
  37.         $this->articleManager $articleManager;
  38.         $this->eclateManager $eclateManager;
  39.         $this->catalogueManager $catalogueManager;
  40.         $this->logger $logger;
  41.         $this->actionLogService $actionLogService;
  42.         $this->controlService $controlService;
  43.         $this->managerRegistry $managerRegistry;
  44.     }
  45.     public function onArticlePostAdd(DataObjectEvent $o)
  46.     {
  47.         $article $o->getObject();
  48.         if ($this->articleManager->objectIsArticle($article)) {
  49.             $type 'article';
  50.             if ($article->getType() != 'folder') {
  51.                 if ($article->get("o_className") == "Article") {
  52.                     $statut $article->isPublished() ? 'valide' 'en-cours';
  53.                     $this->actionLogService->logActionArticle($o'add'$type$statut);
  54.                     $obsolete $article->getArticle_obsolete() ? $article->getArticle_obsolete() : false;
  55.                     if($obsolete) {
  56.                         $this->manageObsolete($article);
  57.                     }
  58.                 }
  59.             }
  60.         }
  61.     }
  62.     public function onArticlePostUpdate(DataObjectEvent $o)
  63.     {
  64.         $article $o->getObject();
  65.         if ($article->getType() != 'folder') {
  66.             if ($article->get("o_className") == "Article") {
  67.                 if ($article->isPublished()) {
  68.                     $this->actionLogService->logActionArticle($o'update''article'"valide");
  69.                 } else {
  70.                     $repository $this->managerRegistry->getRepository(ActionLog::class);
  71.                     $actionLog $repository->findOneBy(['objectId' => $article->getId(), 'status' => "valide"], ['date' => 'desc']);
  72.                     if (isset($actionLog) && $actionLog->getAction() != 'delete') {
  73.                         $this->actionLogService->logActionArticle($o'delete''article'"valide");
  74.                     } else {
  75.                         $this->actionLogService->logActionArticle($o'update''article'"en-cours");
  76.                     }
  77.                 }
  78.                 $obsolete $article->getArticle_obsolete() ? $article->getArticle_obsolete() : false;
  79.                 if($obsolete) {
  80.                     $this->manageObsolete($article);
  81.                 }
  82.             }
  83.         }
  84.     }
  85.     public function onArticlePostDelete(DataObjectEvent $o)
  86.     {
  87.         $article $o->getObject();
  88.         if ($this->articleManager->objectIsArticle($article)) {
  89.             $type 'article';
  90.             if ($article->getType() != 'folder') {
  91.                 if ($article->get("o_className") == "Article") {
  92.                     if ($article->isPublished()) {
  93.                         $repository $this->managerRegistry->getRepository(ActionLog::class);
  94.                         $actionLog $repository->findOneBy(['objectId' => $article->getId(), 'status' => "valide"], ['date' => 'desc']);
  95.                         if (isset($actionLog) && $actionLog->getAction() != 'delete') {
  96.                             $this->actionLogService->logActionArticle($o'delete'$type"valide");
  97.                         }
  98.                     } else {
  99.                         $this->actionLogService->logActionArticle($o'delete''article'"en-cours");
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.     }
  105.     public function manageObsolete($article){        
  106.         $this->manageEclates($article);
  107.         $this->manageCatalogues($article);
  108.     }
  109.     public function manageCatalogues($article){
  110.         ApplicationLogger::getInstance()->info('in manage catalogue : '.$article->getArticle_code1());
  111.         $catalogueList $this->catalogueManager->findAllCatalogueWithArticleId($article->getId());
  112.         $catalogueArticleDataList $this->catalogueManager->findAllCatalogueArticleDataWithArticleId($article->getId());
  113.         if(!isset($catalogueList) && !isset($catalogueArticleDataList)) {
  114.             return;
  115.         }
  116.         if ($article->getArticle_obsolete_code()) {
  117.             foreach($catalogueList as $catalogue){
  118.                 $this->changeCatalogueValue($article$catalogue$article->getArticle_obsolete_code());
  119.             }
  120.             foreach($catalogueArticleDataList as $catalogueArticleData) {
  121.                 $this->changeCatalogueArticleDataValue($article$catalogueArticleData$article->getArticle_obsolete_code());
  122.             }
  123.         } else {
  124.             foreach($catalogueList as $catalogue){
  125.                 $this->changeCatalogueValue($article$catalogue'');
  126.             }
  127.             foreach($catalogueArticleDataList as $catalogueArticleData) {
  128.                 $this->changeCatalogueArticleDataValue($article$catalogueArticleData'');
  129.             }
  130.         }
  131.     }
  132.     public function changeCatalogueValue(Article $articleCatalogue $catalogue$value){
  133.         if (!$value) {
  134.             return false;
  135.         }
  136.         
  137.         // On récupère le nouvel article via son code
  138.         $newArticleObject Article::getByArticle_code1($value, ['limit' => 1'unpublished' => true]);
  139.         if (!$newArticleObject) {
  140.             ApplicationLogger::getInstance()->error('pas d\'article trouvé pour  : '$article->getId());
  141.             return false;
  142.         }
  143.         /** @var Fieldcollection|null $fc */
  144.         $articlesCollection $catalogue->getCatalogue_articles2();
  145.         if (!$articlesCollection) {
  146.             // rien à modifier
  147.             return false;
  148.         }
  149.         $changed false;
  150.         foreach ($articlesCollection->getItems() as $relation) {
  151.             $updatedArticles = [];
  152.             $relatedArticles $relation->getArticles()  ?? [];
  153.             foreach($relatedArticles as $relatedArticle) {
  154.                 if ($relatedArticle && $relatedArticle->getId() === $article->getId()) {
  155.                     $updatedArticles[] = $newArticleObject;
  156.                     \Pimcore\Log\ApplicationLogger::getInstance()->info("Remplacé article ID {$article->getId()} par {$newArticleObject->getId()} dans catalogue ID {$catalogue->getId()}");
  157.                     $changed true;
  158.                 } else {
  159.                     $updatedArticles[] = $relatedArticle;
  160.                 }
  161.             }
  162.             $relation->setArticles($updatedArticles);
  163.         }
  164.     
  165.         if ($changed) {
  166.             $catalogue->setCatalogue_articles2($articlesCollection);
  167.             $catalogue->save();
  168.             \Pimcore\Log\ApplicationLogger::getInstance()->info("Catalogue {$catalogue->getId()} mis à jour");
  169.         }
  170.     }
  171.     
  172.     public function changeCatalogueArticleDataValue(Article $article$catalogueArticleData$value){
  173.         if (!$value) {
  174.             ApplicationLogger::getInstance()->error('impossible de remplacer par une valeur vide dans catalogue ');
  175.             return false;
  176.         }
  177.         
  178.         $newArticleObject \Pimcore\Model\DataObject\Article::getByArticle_code1($value, ['limit' => 1'unpublished' => true]);
  179.         if (!$newArticleObject) {
  180.             ApplicationLogger::getInstance()->error('pas d\'article trouvé pour  : '$article->getId());
  181.             return false;
  182.         }
  183.         $updatedRelations = [];
  184.         foreach ($catalogueArticleData->getArticleData() as $relation) {
  185.             $relatedArticle $relation->getObject(); 
  186.             if ($relatedArticle && $relatedArticle->getId() === $article->getId()) {
  187.                 ApplicationLogger::getInstance()->info(sprintf('Article lié: code=%s | order=%s | year=%s',
  188.                     $relatedArticle->getArticle_code1(), $relation->getOrder(), $relation->getYear()
  189.                 ));
  190.                 $relation->setObject($newArticleObject);
  191.             }
  192.             
  193.             $updatedRelations[] = $relation;
  194.         }
  195.         
  196.         if(!empty($updatedRelations)) {
  197.             $catalogueArticleData->setArticleData($updatedRelations);
  198.             $catalogueArticleData->save();
  199.         }
  200.         if ($catalogueArticleData->getParentArticle() && $catalogueArticleData->getParentArticle()->getId() === $article->getId()) {
  201.             $catalogueList $this->catalogueManager->getCatalogueObjectByCatalogueSubarticleId($catalogueArticleData->getId());
  202.             if(empty($catalogueList) || !isset($catalogueList)) {
  203.                 return;
  204.             }
  205.             foreach ($catalogueList as $catalogue) {
  206.                 /*$newRelations = [];
  207.                 foreach ($catalogue->getCatalogue_articles2() as $relation) {
  208.                     $relatedArticle = $relation->getArticle();
  209.                     if ($relatedArticle && $relatedArticle->getId() === $article->getId()) {
  210.                         $newRelation = clone $relation;
  211.                         $newRelation->setArticle($newArticleObject); 
  212.                         $newRelations[] = $newRelation;
  213.             
  214.                         \Pimcore\Log\ApplicationLogger::getInstance()->info("Remplacé article ID {$article->getId()} par {$newArticleObject->getId()} dans catalogue ID {$catalogue->getId()}");
  215.             
  216.                     } else {
  217.                         $newRelations[] = $relation;
  218.                     }
  219.                 }
  220.             
  221.                 if (!empty($newRelations)) {
  222.                     $catalogue->setCatalogue_articles2($newRelations);
  223.                     $catalogue->save();
  224.                     \Pimcore\Log\ApplicationLogger::getInstance()->info("Catalogue {$catalogue->getId()} mis à jour");
  225.                 }*/
  226.                 //TODO : possiblement à supprimer vu qu'on aura déjà modifié les catalogue dans manageCatalogues() 
  227.                 //sauf si le catalogueListener se met à vérifier la correlation article / subarticle
  228.                 $this->changeCatalogueValue($article$catalogue$value);
  229.             }
  230.             $catalogueArticleData->setParentArticle($newArticleObject);
  231.             $catalogueArticleData->save();
  232.         }
  233.         return true;
  234.     }
  235.     public function manageEclates($article){
  236.         $associationReferenceList $this->eclateManager->findAllAssociationReferenceWithArticle($article);
  237.         if(empty($associationReferenceList) || !isset($associationReferenceList)) {
  238.             return;
  239.         }
  240.         if ($article->getArticle_obsolete_code()) {
  241.             foreach($associationReferenceList as $associationReference) {
  242.                 $this->changeEclateValue($article$associationReference$article->getArticle_obsolete_code());
  243.             }
  244.         } else {
  245.             foreach($associationReferenceList as $associationReference) {
  246.                 $this->changeEclateValue($article$associationReference'');
  247.             }
  248.         }
  249.     }
  250.     
  251.     public function changeEclateValue($article$associationReference$value){
  252.         $newArray = [];
  253.         foreach ($associationReference->getEclateReferences() as $line) {
  254.             $isTargetRef $line["Reference"] === $article->getArticle_code1();
  255.             $newArray[] = [
  256.                 "Position"   => $line["Position"],
  257.                 "CoordX"     => $line["CoordX"],
  258.                 "CoordY"     => $line["CoordY"],
  259.                 "Confidence" => $line["Confidence"],
  260.                 "Reference"  => $isTargetRef $value $line["Reference"],
  261.                 "Quantite"   => $line["Quantite"],
  262.             ];
  263.         }
  264.         if(!empty($newArray)) {
  265.             $associationReference->setEclateReferences($newArray);
  266.             $associationReference->save();
  267.         }
  268.         if ($associationReference->getRelationArticle()?->getId() === $article->getId()) {
  269.             if ($value) {
  270.                 $newArticleObject \Pimcore\Model\DataObject\Article::getByArticle_code1($value, ['limit' => 1'unpublished' => true]);
  271.                 if (!$newArticleObject) {
  272.                     ApplicationLogger::getInstance()->error('pas d\'article trouvé pour  : '$article->getId());
  273.                     return false;
  274.                 }
  275.                 $associationReference->setRelationArticle($newArticleObject);
  276.                 $associationReference->save();
  277.             } else {
  278.                 ApplicationLogger::getInstance()->error('impossible de remplacer par une valeur vide dans : '$associationReference->getId());
  279.                 return false;
  280.             }
  281.             
  282.         }
  283.         return true;
  284.     }
  285. }