src/Manager/ArticleManager.php line 462

Open in your IDE?
  1. <?php
  2. namespace App\Manager;
  3. use App\Core\CoreBundle\Manager\BaseManager;
  4. use App\Core\CoreBundle\Traits\Updatable;
  5. use App\Entity\Config;
  6. use App\Entity\Media;
  7. use App\Entity\Univers;
  8. use App\Entity\User;
  9. use App\Service\Convert;
  10. class ArticleManager extends BaseManager
  11. {
  12.     use Updatable;
  13.     protected Convert $converter;
  14.     public function setConverter(Convert $converter)
  15.     {
  16.         $this->converter $converter;
  17.     }
  18.     public function convert($data)
  19.     {
  20.         return $data;
  21.     }
  22.     public function getMetiIds()
  23.     {
  24.         $r = [];
  25.         $sql "SELECT * FROM app_article";
  26.         $cnx $this->em->getConnection();
  27.         $stmt $cnx->prepare($sql);
  28.         $items $stmt->executeQuery()->fetchAllAssociative();
  29.         foreach ($items as $item) {
  30.             $r[] = $item['meti_id'];
  31.         }
  32.         return $r;
  33.     }
  34.     public function getMetiIdsByBdd()
  35.     {
  36.         $r = [];
  37.         $sql "SELECT * FROM app_article AS a LEFT JOIN app_univers AS u ON a.univer_id=u.id";
  38.         $cnx $this->em->getConnection();
  39.         $stmt $cnx->prepare($sql);
  40.         $items $stmt->executeQuery()->fetchAllAssociative();
  41.         foreach ($items as $item) {
  42.             $r[$item['bdd']][] = $item['meti_id'];
  43.         }
  44.         return $r;
  45.     }
  46.     public function convertImportArticle()
  47.     {
  48.         $r = [];
  49.         $sql "SELECT * FROM app_article";
  50.         $cnx $this->em->getConnection();
  51.         $stmt $cnx->prepare($sql);
  52.         $items $stmt->executeQuery()->fetchAllAssociative();
  53.         foreach ($items as $item) {
  54.             $r[$item['meti_id']] = $item['id'];
  55.         }
  56.         return $r;
  57.     }
  58.     public function convertImportArticleCodeMarque()
  59.     {
  60.         $r = [];
  61.         $sql "SELECT * FROM app_article";
  62.         $cnx $this->em->getConnection();
  63.         $stmt $cnx->prepare($sql);
  64.         $items $stmt->executeQuery()->fetchAllAssociative();
  65.         foreach ($items as $item) {
  66.             $r[$item['meti_id']] = [
  67.                 'id' => $item['id'],
  68.                 'stock' => $item['stock'],
  69.                 'stockReel' => $item['stock_reel'],
  70.             ];
  71.         }
  72.         return $r;
  73.     }
  74.     public function convertImportArticleEAN()
  75.     {
  76.         $r = [];
  77.         $sql "SELECT * FROM app_article";
  78.         $cnx $this->em->getConnection();
  79.         $stmt $cnx->prepare($sql);
  80.         $items $stmt->executeQuery()->fetchAllAssociative();
  81.         foreach ($items as $item) {
  82.             $r[$item['code_ean']] = $item['id'];
  83.         }
  84.         $sql "SELECT * FROM app_ean";
  85.         $cnx $this->em->getConnection();
  86.         $stmt $cnx->prepare($sql);
  87.         $items $stmt->executeQuery()->fetchAllAssociative();
  88.         foreach ($items as $item) {
  89.             $r[$item['code_ean']] = $item['article_id'];
  90.         }
  91.         return $r;
  92.     }
  93.     public function getArticlesAPIByUniversSQL($universId$magasinId$codeTarif$request$client$commandeCourante)
  94.     {
  95.         $r = [];
  96.         $items = [];
  97.         $now time();
  98.         /** @var Univers $univers */
  99.         $univers $this->container->get('app.manager.univers')->find($universId);
  100.         $ssFamilleAccess $univers $univers->getSsFamille() : false;
  101.         // gestion des images par defaut
  102.         /** @var Config $config */
  103.         $config $this->container->get('app.manager.config')->find(1);
  104.         $imageDefault = ($config->getImageDefault() instanceof Media) ? $config->getImageDefault()->getName() : null;
  105.         $userId $this->container->get('session')->get('user');
  106.         /** @var User $user */
  107.         $user $this->container->get('app.manager.user')->find($userId);
  108.         $favorisA $this->container->get('app.manager.favoris')->getFavorisByUserAndMagasin($userId$magasinId);
  109.         $types $this->container->get('app.manager.magasin')->find($this->container->get('session')->get('magasin'))->getTypeNames();
  110.         $commande null;
  111.         if (isset($request['panier']) and $request['panier'] == 'true') {
  112.             $commande $this->container->get('session')->get('commandeCourante');
  113.         }
  114.         // @todo => faire le système d'eanscan par session qui se reset apres la requete
  115.         if ($this->container->get('session')->get('eanscan')) { // cas de la recherche par scan
  116.             $articles $this->getRepository()->getArticlesAPIByUniversSQL($universId$request$favorisA$commande$this->container->get('session')->get('eanscan'));
  117.             $familles = [];
  118.             foreach ($articles as $article) {
  119.                 $article['eanscan'] = true;
  120.                 $items[] = $article;
  121.                 $familles[] = $article['nf_id'];
  122.             }
  123.             $articles $this->getRepository()->getArticlesAPIByUniversSQL($universId$request$favorisA$commandenullarray_unique($familles));
  124.             foreach ($articles as $article) {
  125.                 $items[] = $article;
  126.             }
  127.             $this->container->get('session')->remove('eanscan');
  128.         } else {
  129.             $items $this->getRepository()->getArticlesAPIByUniversSQL($universId$request$favorisA$commande);
  130.         }
  131.         // Afin de recuperer l'historique
  132.         $magasinArticles $this->container->get('app.manager.magasin_article')->getByMagasinAndUnivers($magasinId$universId);
  133.         // dans le cas d'un univers stock import frais, on recupere les fraisCommandeArticle
  134.         $fraisCommandeArticle null;
  135.         if ($univers->getFrais()) {
  136.             $fraisCommandeArticle $this->container->get('app.manager.frais_commande_article')->findForCatalogue($universId);
  137.         }
  138.         // permet d'enlever un niveau au tableau (pour retirer la clé de la commande)
  139.         $commandeCourante array_shift($commandeCourante);
  140.         $articlesPresent = [];
  141.         $commandeArticlesU = [];
  142.         foreach ($items as $item) {
  143.             if (!in_array((int)$item['a_id'], $articlesPresent)) { // evite les doublons du aux jointures
  144.                 if ( // permet de filter par type que peut voir le magasin
  145.                     !$item['a_type_name'] or
  146.                     in_array($item['a_type_name'], $types)
  147.                 ) {
  148.                     $pcb $item['a_pcb'];
  149.                     $tarifU $item['a_prix_' $codeTarif];
  150.                     if ($tarifU != 0) {
  151.                         $tarifT round($pcb $tarifU2);
  152.                         $favoris in_array($item['a_id'], $favorisA);
  153.                         $quantite 0;
  154.                         $quantiteReel 0;
  155.                         $quantiteCommande 0;
  156.                         $quantiteDepassement 0;
  157.                         $tarifHT 0;
  158.                         $caId null;
  159.                         if (!empty($commandeCourante) and array_key_exists($item['a_id'], $commandeCourante)) {
  160.                             $caId $commandeCourante[$item['a_id']]['ca_id'];
  161.                             $quantite $commandeCourante[$item['a_id']]['ca_quantite_commande'];
  162.                             $quantiteReel $commandeCourante[$item['a_id']]['ca_quantite'];
  163.                             $quantiteCommande $commandeCourante[$item['a_id']]['ca_quantite_commande'];
  164.                             $quantiteDepassement $commandeCourante[$item['a_id']]['ca_quantite_depassement'];
  165.                             $tarifHT $commandeCourante[$item['a_id']]['ca_tarif_ht'];
  166.                         }
  167.                         $nouveauteApp $item['a_nouveaute_app'];
  168.                         if ($nouveauteApp) {
  169.                             if (
  170.                                 strtotime($item['a_nouveaute_app_debut']) <= $now &&
  171.                                 strtotime($item['a_nouveaute_app_fin']) >= $now
  172.                             ) {
  173.                                 $nouveauteApp true;
  174.                             } else {
  175.                                 $nouveauteApp false;
  176.                             }
  177.                         }
  178.                         $promoApp $item['a_promo_app'];
  179.                         if ($promoApp) {
  180.                             if (
  181.                                 strtotime($item['a_promo_app_debut']) <= $now &&
  182.                                 strtotime($item['a_promo_app_fin']) >= $now
  183.                             ) {
  184.                                 $promoApp true;
  185.                             } else {
  186.                                 $promoApp false;
  187.                             }
  188.                         }
  189.                         $repartitionStock = ($fraisCommandeArticle) ? $this->calculRepartitionStock($item['a_pcb'], $item['a_stock'], $quantiteCommande) : null;
  190.                         $repartitionArrivage = ($fraisCommandeArticle) ? $this->calculRepartitionArrivage(
  191.                             $item['a_pcb'],
  192.                             $item['a_stock'],
  193.                             (int)$item['a_id'],
  194.                             $quantiteCommande,
  195.                             $fraisCommandeArticle
  196.                         ) : null;
  197.                         $repartitionReste = ($fraisCommandeArticle) ? $this->calculRepartitionReste(
  198.                             $item['a_pcb'],
  199.                             $item['a_stock'],
  200.                             (int)$item['a_id'],
  201.                             $quantiteCommande,
  202.                             $fraisCommandeArticle
  203.                         ) : null;
  204.                         if(
  205.                             !array_key_exists('showArrivage'$request) or
  206.                             $request['showArrivage'] != 'true' or
  207.                             (is_array($fraisCommandeArticle) and array_key_exists((int)$item['a_id'],$fraisCommandeArticle))
  208.                         ) {
  209.                             // gestion de l'image
  210.                             if($item['a_image']) {
  211.                                 $image $item['a_image'];
  212.                             } elseif ($item['a_image_perso']) {
  213.                                 $image $item['a_image_perso'];
  214.                             } else {
  215.                                 $image $imageDefault;
  216.                             }
  217.                             $r[] = [
  218.                                 'user' => $userId,
  219.                                 'id' => (int)$item['a_id'],
  220.                                 'reference' => $item['a_meti_id'],
  221.                                 'referenceF' => $item['a_meti_id'] . ' | ' $item['a_ean'] . ' | ' $item['a_pcb'],
  222.                                 'ean' => $item['a_ean'],
  223.                                 'article' => $item['a_name'],
  224.                                 'nomenclature' => $item['nd_name'] . ' | ' $item['nr_name'] . ' | ' $item['nf_name'] . ' | ' $item['nsf_name'],
  225.                                 'departement' => $item['nd_name'],
  226.                                 'rayon' => $item['nr_name'],
  227.                                 'famille' => $item['nf_name'],
  228.                                 'ssFamille' => $item['nsf_name'],
  229.                                 'showSF' => $ssFamilleAccess,
  230.                                 'departementId' => $item['nd_id'],
  231.                                 'rayonId' => $item['nr_id'],
  232.                                 'familleId' => $item['nf_id'],
  233.                                 'favoris' => $favoris,
  234.                                 'pcb' => $item['a_pcb'],
  235.                                 'tarifU' => $this->converter->mf($tarifU),
  236.                                 'tarifT' => $this->converter->mf($tarifT),
  237.                                 'stock' => $item['a_stock'],
  238.                                 'arrivage' => is_array($fraisCommandeArticle) and array_key_exists((int)$item['a_id'],$fraisCommandeArticle),
  239.                                 'quantite_arrivage' => $this->calculArrivage($item['a_pcb'],(int)$item['a_id'], $fraisCommandeArticle),
  240.                                 'stock_reel' => $item['a_stock_reel'],
  241.                                 'stock_pcb' => ($item['a_pcb']) ? $item['a_stock'] / $item['a_pcb'] : 0,
  242.                                 'stock_reel_pcb' => ($item['a_pcb']) ? $item['a_stock_reel'] / $item['a_pcb'] : 0,
  243.                                 //'arrivage'             => $this->calculArrivage($item, $fraisCommandeArticle),
  244.                                 'quantite' => $quantite,
  245.                                 'quantite_reel' => $quantiteReel,
  246.                                 'quantite_commande' => $quantiteCommande,
  247.                                 'quantite_depassement' => $quantiteDepassement,
  248.                                 'ca_tarifHT' => $this->converter->mf($tarifHT),
  249.                                 'ca_id' => $caId,
  250.                                 'nouveaute' => ($item['a_nouveaute'] or $nouveauteApp),
  251.                                 'promo' => ($item['a_promo'] or $promoApp),
  252.                                 'promo_content' => $item['a_promo_app_content'],
  253.                                 'promo_ancien_prix' => $item['a_promo_app_ancien_prix'],
  254.                                 'top' => ($item['a_top'] or $item['a_top_app']),
  255.                                 'content' => $item['a_content'],
  256.                                 'image' => $image,
  257.                                 'avenir' => $item['a_avenir'],
  258.                                 'avenir_date' => $this->convertDate($item['a_avenir_date']),
  259.                                 'historique' => (array_key_exists($item['a_id'], $magasinArticles)) ? $magasinArticles[$item['a_id']] : [],
  260.                                 'historiqueF' => (array_key_exists($item['a_id'], $magasinArticles)) ? $this->formatHistoriqueForExcel($magasinArticles[$item['a_id']]) : [],
  261.                                 'labelF' => $this->formatLabelForExcel($item),
  262.                                 'eanscan' => (array_key_exists('eanscan'$item)),
  263.                                 'repartition_stock' => $repartitionStock,
  264.                                 'repartition_arrivage' => $repartitionArrivage,
  265.                                 'repartition_reste' => $repartitionReste,
  266.                                 'dlc_date' => $this->convertDate($item['a_dlc_date']),
  267.                                 'canSeeStock' => $user->getCanSeeStock(),
  268.                             ];
  269.                             $articlesPresent[] = (int)$item['a_id'];
  270.                         }
  271.                     }
  272.                 }
  273.             }
  274.         }
  275.         if (empty($request)) {
  276.             $this->container->get('session')->set('countArticleTotal'sizeof($r));
  277.             $this->container->get('session')->set('countArticleFiltered'sizeof($r));
  278.         } else {
  279.             $this->container->get('session')->set('countArticleFiltered'sizeof($r));
  280.         }
  281.         return $r;
  282.     }
  283.     public function calculRepartitionStock($pcb$stock$quantiteCommande)
  284.     {
  285.         $stockPcb = ($pcb) ? $stock $pcb 0;
  286.         return ($quantiteCommande >= $stockPcb) ? $stockPcb $quantiteCommande;
  287.     }
  288.     public function calculRepartitionArrivage($pcb$stock$id$quantiteCommande$fraisCommandeArticle)
  289.     {
  290.         $stockPcb = ($pcb) ? $stock $pcb 0;
  291.         $arrivage $this->calculArrivage($pcb$id$fraisCommandeArticle);
  292.         if ($quantiteCommande <= $stockPcb) {
  293.             return 0;
  294.         } else {
  295.             $quantiteArrivage $quantiteCommande $stockPcb;
  296.             if ($quantiteArrivage <= $arrivage) {
  297.                 return $quantiteArrivage;
  298.             } else {
  299.                 return $arrivage;
  300.             }
  301.         }
  302.     }
  303.     public function calculRepartitionReste($pcb$stock$id$quantiteCommande$fraisCommandeArticle)
  304.     {
  305.         $stockPcb = ($pcb) ? $stock $pcb 0;
  306.         $arrivage $this->calculArrivage($pcb$id$fraisCommandeArticle);
  307.         $stockArrivage $stockPcb $arrivage;
  308.         if ($quantiteCommande <= $stockArrivage) {
  309.             return 0;
  310.         } else {
  311.             return $quantiteCommande $stockArrivage;
  312.         }
  313.     }
  314.     public function calculArrivage($pcb$id$fraisCommandeArticle)
  315.     {
  316.         return ($pcb and $fraisCommandeArticle and array_key_exists($id$fraisCommandeArticle)) ? $fraisCommandeArticle[$id] : 0;
  317.     }
  318.     public function convertDate($date)
  319.     {
  320.         if ($date != '') {
  321.             $date explode('-'$date);
  322.             return $date[2] . '/' $date[1] . '/' $date[0];
  323.         }
  324.         return '';
  325.     }
  326.     public function getNomenclatureAPIByUniversSQL($universId)
  327.     {
  328.         $ret = [];
  329.         $items $this->getRepository()->getNomenclatureAPIByUniversSQL($universId);
  330.         foreach ($items as $item) {
  331.             $d $item['departementId'];
  332.             $r $item['rayonId'];
  333.             $f $item['familleId'];
  334.             $sf $item['ssfamilleId'];
  335.             if (!array_key_exists($d$ret)) {
  336.                 $ret[$d] = [];
  337.                 $ret[$d]['id'] = $d;
  338.                 $ret[$d]['name'] = $item['departement'];
  339.                 $ret[$d]['rayons'] = [];
  340.             }
  341.             if (!array_key_exists($r$ret[$d]['rayons'])) {
  342.                 $ret[$d]['rayons'][$r] = [];
  343.                 $ret[$d]['rayons'][$r]['id'] = $r;
  344.                 $ret[$d]['rayons'][$r]['name'] = $item['rayon'];
  345.                 $ret[$d]['rayons'][$r]['familles'] = [];
  346.             }
  347.             if (!array_key_exists($f$ret[$d]['rayons'][$r]['familles'])) {
  348.                 $ret[$d]['rayons'][$r]['familles'][$f] = [];
  349.                 $ret[$d]['rayons'][$r]['familles'][$f]['id'] = $f;
  350.                 $ret[$d]['rayons'][$r]['familles'][$f]['name'] = $item['famille'];
  351.                 $ret[$d]['rayons'][$r]['familles'][$f]['ssFamilles'] = [];
  352.             }
  353.             if (!array_key_exists($sf$ret[$d]['rayons'][$r]['familles'][$f]['ssFamilles'])) {
  354.                 $ret[$d]['rayons'][$r]['familles'][$f]['ssFamilles'][$sf] = [];
  355.                 $ret[$d]['rayons'][$r]['familles'][$f]['ssFamilles'][$sf]['id'] = $sf;
  356.                 $ret[$d]['rayons'][$r]['familles'][$f]['ssFamilles'][$sf]['name'] = $item['ssFamille'];
  357.             }
  358.         }
  359.         return $ret;
  360.     }
  361.     public function getArticlesForMobile($request$codeTarif$image$removeA = [], $commandecourante)
  362.     {
  363.         $r = [];
  364.         $commandecourante array_shift($commandecourante);
  365.         $articles $this->getRepository()->getArticlesAPIByUniversSQL($request['univers'], $request);
  366.         foreach ($articles as $article) {
  367.             if (empty($removeA) or !in_array($article['a_id'], $removeA)) {
  368.                 $data $article;
  369.                 $data['a_prix'] = $article['a_prix_' $codeTarif];
  370.                 for ($i 1$i <= 6$i++) {
  371.                     unset($data['a_prix_' $i]);
  372.                 }
  373.                 $data['a_image'] = ($data['a_image']) ?? $image;
  374.                 $data['ca_quantite'] = 0;
  375.                 $data['ca_tarif_ht'] = 0;
  376.                 $data['ca_id'] = null;
  377.                 if ($commandecourante and array_key_exists($article['a_id'], $commandecourante)) {
  378.                     $data['ca_quantite'] = (int)$commandecourante[$article['a_id']]['ca_quantite'];
  379.                     $data['ca_tarif_ht'] = $data['ca_quantite'] * $data['a_pcb'] * $data['a_prix'];
  380.                     $data['ca_id'] = (int)$commandecourante[$article['a_id']]['ca_id'];
  381.                 }
  382.                 $r[] = $data;
  383.             }
  384.         }
  385.         return $r;
  386.     }
  387.     private function formatHistoriqueForExcel(mixed $a_id)
  388.     {
  389.         $r = [];
  390.         foreach ($a_id as $value) {
  391.             foreach ($value as $day => $quantite) {
  392.                 $r[] = $day ' -' $quantite;
  393.             }
  394.         }
  395.         return implode(' | '$r);
  396.     }
  397.     private function formatLabelForExcel(mixed $item)
  398.     {
  399.         return $item['a_name'] .' | '.$this->convertDate($item['a_dlc_date']);
  400.     }
  401. }