src/Repository/Articles/MouvementStockRepository.php line 384

Open in your IDE?
  1. <?php
  2. namespace App\Repository\Articles;
  3. use App\Entity\Articles\Article;
  4. use App\Entity\Articles\MouvementStock;
  5. use App\Entity\GestionComerciale\CommandeFournisseur;
  6. use DateInterval;
  7. use DateTime;
  8. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. /**
  11.  * MouvementStockRepository
  12.  *
  13.  * This class was generated by the Doctrine ORM. Add your own custom
  14.  * repository methods below.
  15.  */
  16. class MouvementStockRepository extends ServiceEntityRepository
  17. {
  18.     public function __construct(ManagerRegistry $registry)
  19.     {
  20.         parent::__construct($registryMouvementStock::class);
  21.     }
  22.     public function getIdMaxArticleHasMvtStockLimit(){
  23.         $query $this->createQueryBuilder('ms')
  24.                         ->select("a.id")
  25.                         //->leftJoin('p.fournisseurs', 'f')//, 'WITH', 'p.fournisseur = f.id'
  26.                         ->leftJoin('ms.article''a')
  27.                         //->join("App\Entity\Fournisseurs\Four f")
  28.             //->where('ms ')
  29.             //->setParameters(array('cond' => $cond))
  30.             //->orderBy('p.prenom', 'ASC');
  31.             //->setFirstResult(0)
  32.                         ->orderBy('a.id''DESC')
  33.             ->setMaxResults(1)
  34.                         ;
  35.         $res $query->getQuery()->getResult();
  36.         return $res;
  37.     }
  38.     private function nbJoursMois($m$y)
  39.     {
  40.       $mois mktime000$m1$y );
  41.       //setlocale('LC_ALL', 'fr_FR');
  42.       return date("t",$mois);
  43.     }
  44.     public function getStockMois($articleId$m$y) {
  45.         $dateDebut = new DateTime($y.'-'.$m.'-01 00:00:00');
  46.         $dateFin = clone $dateDebut;
  47.         //$date = new \DateTime('01/'.$m.'/'.$y);
  48.         //$date = new \DateTime($m.'/01/'.$y);
  49.         $retour = [];
  50.         $periode $this->nbJoursMois($m$y);
  51.         $dateFin->add(new DateInterval('P'.$periode.'D'));
  52.         //$dateFin = $date->sub(new \DateInterval('P'.$periode.'D'));
  53.         //return $dateDebut->format('d-m-Y').'/'.$dateFin->format('d-m-Y');
  54.     $stockMoisResult $this->getEntityManager()
  55.             ->createQuery(
  56.                 "SELECT count(ms.id) as total, SUM(ms.stock) as stock
  57.                 FROM App\Entity\Articles\MouvementStock ms
  58.                 WHERE ms.article = :id and ms.dateMvt >= :dateDebut and ms.dateMvt < :dateFin and ms.stock is not null
  59.                 "
  60.             )
  61.             ->setParameters(['id' => $articleId'dateDebut' => $dateDebut'dateFin' => $dateFin])//
  62.             ->getResult();
  63.         if ($stockMoisResult[0]['total'] != 0)
  64.             $stockMois $stockMoisResult[0]['stock']/$stockMoisResult[0]['total'];
  65.         else {
  66.             $stockMois 0;
  67.         }
  68.         $retour['date'] = $dateFin;
  69.         $retour["stockMois"] = $stockMois;
  70.         $retour["totalMvt"] = $stockMoisResult[0]['total'];
  71.         //return $stockMois;
  72.         return $retour;
  73.     }
  74.     public function getVariationsStockParMois($articleId$nbMois) {
  75.         $date = new DateTime();
  76.         $date->sub(new DateInterval('P'.$nbMois.'M'));
  77.         $mois = (int)$date->format('m');
  78.         $annee = (int)$date->format('Y');
  79.         $tempStock 0;
  80.         $moisTmp $mois;
  81.        for($i=0;$i<=$nbMois;$i++){
  82.             if ($moisTmp 10)
  83.                 $id $annee.'-0'.$moisTmp;
  84.             else
  85.                 $id $annee.'-'.$moisTmp;
  86.             $stockCalcul $this->getStockMois($articleId$moisTmp$annee);
  87.             $retour[$id] = $stockCalcul["stockMois"];
  88.             if($stockCalcul["totalMvt"] == 0) {
  89.                 $retour[$id] = $tempStock;
  90.             } else {
  91.                $tempStock =  $retour[$id];
  92.             }
  93.             if($moisTmp+1>12){
  94.                 $moisTmp 1;
  95.                 $annee += 1;
  96.             } else {
  97.                 $moisTmp += 1;
  98.             }
  99.         }
  100.         //return array_reverse($retour);
  101.         return $retour;
  102.     }
  103.     public function __getVariationsStockParMois($articleId$nbMois) {
  104.         $date = new DateTime();
  105.         $mois = (int)$date->format('m');
  106.         $annee = (int)$date->format('Y');
  107.         //$date->sub(new \DateInterval('P'.$periode.'D'));
  108.         $moisTmp $mois;
  109.         for($i=1;$i<=$nbMois;$i++){
  110.             if ($moisTmp 10)
  111.                 $id $annee.'-0'.$moisTmp;
  112.             else
  113.                 $id $annee.'-'.$moisTmp;
  114.             $retour[$id] = $this->getStockMois($articleId$moisTmp$annee);
  115.             if($moisTmp-1>0){
  116.                 $moisTmp -= 1;
  117.             } else {
  118.                 $moisTmp 12;
  119.                 $annee -= 1;
  120.             }
  121.         }
  122.         return array_reverse($retour);
  123.     }
  124.     public function getPumpMois($articleId$m$y) {
  125.         $dateDebut = new DateTime($y.'-'.$m.'-01 00:00:00');
  126.         $date = new DateTime($y.'-'.$m.'-01 00:00:00');
  127.         //$date = new \DateTime('01/'.$m.'/'.$y);
  128.         //$date = new \DateTime($m.'/01/'.$y);
  129.         $periode $this->nbJoursMois($m$y);
  130.         $dateFin $date->add(new DateInterval('P'.$periode.'D'));
  131.         //$dateFin = $date->sub(new \DateInterval('P'.$periode.'D'));
  132.         //return $dateDebut->format('d-m-Y').'/'.$dateFin->format('d-m-Y');
  133.     $pumpMoisResult $this->getEntityManager()
  134.             ->createQuery(
  135.                 "SELECT count(ms.id) as total, SUM(ms.cpump) as pump
  136.                 FROM App\Entity\Articles\MouvementStock ms
  137.                 WHERE ms.article = :id and ms.dateMvt >= :dateDebut and ms.dateMvt < :dateFin
  138.                 "
  139.             )
  140.             ->setParameters(['id' => $articleId'dateDebut' => $dateDebut'dateFin' => $dateFin])//
  141.             ->getResult();
  142.         if ($pumpMoisResult[0]['total'] != 0)
  143.             $pumpMois $pumpMoisResult[0]['pump']/$pumpMoisResult[0]['total'];
  144.         else {
  145.             $pumpMois 0;
  146.         }
  147.         return $pumpMois;
  148.         //return number_format($pumpMois, 2, ',', ' ');
  149.     }
  150.     public function getVariationsPumpParMois($articleId$nbMois) {
  151.         $date = new DateTime();
  152.         $mois = (int)$date->format('m');
  153.         $annee = (int)$date->format('Y');
  154.         //$date->sub(new \DateInterval('P'.$periode.'D'));
  155.         $tempPump =  $this->getEntityManager()->getRepository(Article::class)->find($articleId)->getCpump();
  156.         $moisTmp $mois;
  157.         for($i=$nbMois;$i>0;$i--){
  158.             if ($moisTmp 10)
  159.                 $id $annee.'-0'.$moisTmp;
  160.             else
  161.                 $id $annee.'-'.$moisTmp;
  162.             $retour[$id] = $this->getPumpMois($articleId$moisTmp$annee);
  163.             if($retour[$id] == 0) {
  164.                 $retour[$id] = $tempPump;
  165.             }
  166.             else {
  167.                $tempPump =  $retour[$id];
  168.             }
  169.             if($moisTmp-1>0){
  170.                 $moisTmp -= 1;
  171.             } else {
  172.                 $moisTmp 12;
  173.                 $annee -= 1;
  174.             }
  175.         }
  176.         return array_reverse($retour);
  177.     }
  178.      public function getCpumpMois($articleId$m$y) {
  179.     }
  180.     public function getVariationsCpumpParMois($articleId$nbMois) {
  181.     }
  182.     public function getQteLivreeByCommandeFAndArticle(CommandeFournisseur $commandeFournisseurArticle $article){
  183.         $query $this->createQueryBuilder('mvt')
  184.             ->select("COALESCE(SUM(mvt.quantite),0) as total")
  185.                     ->where('mvt.commandeFournisseur = :commandeFournisseur and mvt.article = :article')
  186.                     ->setParameters(['commandeFournisseur' => $commandeFournisseur->getId(), 'article' =>$article->getId()])
  187.                     ;
  188.         $total $query->getQuery()->getSingleScalarResult();
  189.         return $total;
  190.     }
  191.     public function getQteVenduSurPeriode($article$nbMois=0$nbMoisDecalage=0){
  192.         $date = new Datetime();
  193.         $nbMoisDebut $nbMois $nbMoisDecalage;
  194.         $dateDebut = clone $date;
  195.         $dateDebut->sub(new DateInterval('P'.$nbMoisDebut.'M'));
  196.         $dateFin = clone $date;
  197.         $dateFin->sub(new DateInterval('P'.$nbMoisDecalage.'M'));
  198.         $qteVendue $this->getEntityManager()
  199.             ->createQuery(
  200.                 "SELECT SUM(ms.quantite) as total, ms.id, ms.quantite
  201.                 FROM App\Entity\Articles\MouvementStock ms
  202.                 JOIN ms.raisonMouvementStock rms
  203.                 JOIN ms.commande c
  204.                 WHERE ms.article = :id and ms.dateMvt >= :dateDebut and ms.dateMvt < :dateFin and ms.commande is not null and rms.action = :raison
  205.                 "
  206.             )
  207.             ->setParameters(['id' => $article->getId(), 'dateDebut' => $dateDebut'dateFin' => $dateFin'raison' => 'diminuer'])//
  208.             ->getOneOrNullResult();
  209.         return $qteVendue['total'];
  210.     }
  211.     public function getMvtsPlusRecent(MouvementStock $ms){
  212.         $date $ms->getDateMvt();
  213.         $query $this->createQueryBuilder('ms')
  214.             ->leftJoin('ms.article''a')
  215.             ->where('a.id = :articleId and ms.dateMvt >= :dateMvt ')
  216.             ->setParameters(['articleId' => $ms->getArticle()->getId(), 'dateMvt' => $date->format("Y-m-d H:i:s")])
  217.             ->orderBy('ms.dateMvt''ASC')
  218.             //->orderBy('a.id', 'DESC')
  219.             ;
  220.     $res $query->getQuery()->getResult();
  221.     return $res;
  222.     }
  223.     public function getMvtsPlusRecentByArticle($articleId$date){
  224.         $query $this->createQueryBuilder('ms')
  225.             ->select('ms.id')
  226.             ->leftJoin('ms.article''a')
  227.             ->where('a.id = :articleId and ms.dateMvt >= :dateMvt ')
  228.             ->setParameters(['articleId' => $articleId'dateMvt' => $date->format("Y-m-d H:i:s")])
  229.             ->orderBy('ms.dateMvt''ASC')
  230.             //->orderBy('a.id', 'DESC')
  231.             ;
  232.     $res $query->getQuery()->getResult();
  233.     return $res;
  234.     }
  235.     public function getDernierMouvementDateHeure($articleId$date=''){
  236.         if($date == ''$date = new Datetime();
  237.         /*
  238.         if(!is_object($date)){
  239.             $date = \DateTime::createFromFormat('d/m/Y',$date);
  240.             $date->setTime(23,59,59);
  241.         }
  242.         */
  243.         $where 'a.id = :articleId and ms.dateMvt <= :dateMvt and ms.dateSuppression IS NULL';
  244.         $parameters = ['articleId' => $articleId'dateMvt' => $date];
  245.         $query $this->createQueryBuilder('ms')
  246.             ->select('ms.id,ms.stock,ms.pump,ms.prixAchat,ms.prixSansRemise,ms.cpump')
  247.             ->leftJoin('ms.article''a')
  248.             ->leftjoin('ms.emplacement''e')
  249.             ->where($where)
  250.             ->setParameters($parameters)
  251.             ->addOrderBy('ms.dateMvt''DESC')
  252.             ->addOrderBy('ms.id''DESC')
  253.             ->setMaxResults(1)
  254.             ;
  255.     $res $query->getQuery()->getResult();
  256.     //echo "TEST";
  257.     //print_r($res[0]);
  258.         if(isset($res[0])) {
  259.             return $res[0];
  260.             //return floatval($res[0]['stock']);
  261.         }
  262.         else {
  263.             return $res[0]= ["id" =>"""cpump" =>"""pump" =>"""stock" =>"""prixAchat" =>"""prixSansRemise" =>""];
  264.             return $res[0];
  265.         }
  266.     }
  267.     public function getDernierMouvementDate($articleId$date){
  268.         if(!is_object($date)){
  269.             $date DateTime::createFromFormat('d/m/Y',$date);
  270.             $date->setTime(23,59,59);
  271.         }
  272.         $where 'a.id = :articleId and ms.dateMvt <= :dateMvt ';
  273.         $parameters = ['articleId' => $articleId'dateMvt' => $date->format("Y-m-d H:i:s")];
  274.         $query $this->createQueryBuilder('ms')
  275.             ->select('ms.id,ms.stock,ms.pump,ms.cpump,ms.pumpHorsFrais')
  276.             ->leftJoin('ms.article''a')
  277.             ->leftjoin('ms.emplacement''e')
  278.             ->where($where)
  279.             ->setParameters($parameters)
  280.             ->addOrderBy('ms.dateMvt''DESC')
  281.             ->addOrderBy('ms.id''DESC')
  282.             ->setMaxResults(1)
  283.             ;
  284.     $res $query->getQuery()->getResult();
  285.     //echo "TEST";
  286.     //print_r($res[0]);
  287.         if(isset($res[0])) {
  288.             return $res[0];
  289.             //return floatval($res[0]['stock']);
  290.         }
  291.         else {
  292.             return $res[0]= ["cpump" =>"""pump" =>"""stock" =>""'pumpHorsFrais' => ''];
  293.             return $res[0];
  294.         }
  295.     }
  296.     public function getStockArticleAuneDate($articleId$emplacementId=''$date){
  297.         $where 'a.id = :articleId and ms.dateMvt < :dateMvt ';
  298.         $parameters = ['articleId' => $articleId'dateMvt' => $date->format("Y-m-d H:i:s")];
  299.         if($emplacementId != ''){
  300.             $where .= 'and e.id = :emplacementId';
  301.             $parameters['emplacementId'] = $emplacementId;
  302.         }
  303.         $query $this->createQueryBuilder('ms')
  304.             ->select('ms.stock')
  305.             ->leftJoin('ms.article''a')
  306.             ->leftjoin('ms.emplacement''e')
  307.             ->where($where)
  308.             ->setParameters($parameters)
  309.             ->orderBy('ms.dateMvt''DESC')
  310.             ->setMaxResults(1)
  311.             ;
  312.     $res $query->getQuery()->getResult();
  313.         if(isset($res[0]['stock']))
  314.             return floatval($res[0]['stock']);
  315.         else
  316.             return null;
  317.     }
  318.     public function getDernierPrixAchat($articleId,$date) {
  319.         if(!is_object($date)){
  320.             $date DateTime::createFromFormat('d/m/Y',$date);
  321.             $date->setTime(23,59,59);
  322.         }
  323.         $query $this->createQueryBuilder('ms')
  324.             ->select('ms.prixAchat as prixAchat')
  325.             ->leftJoin('ms.article''a')
  326.             ->leftJoin('ms.raisonMouvementStock''r')
  327.             ->where('a.id = :articleId and ms.date < :date and r.id = :raisonId')
  328.             ->setParameters(['articleId' => $articleId'date' => $date->format("Y-m-d H:i:s"), 'raisonId' => 3])//Achat
  329.             ->orderBy('ms.dateMvt''DESC')
  330.             ->setMaxResults(1)
  331.             ;
  332.     $res $query->getQuery()->getResult();
  333.         return $res[0]['prixAchat'] ?? 0;
  334.     }
  335.     public function getMvtsDeviseAutreEuro(){
  336.         $query $this->createQueryBuilder('ms')
  337.                 ->select('ms.id')
  338.                 ->join('ms.fournisseur''f')
  339.                 ->join('ms.commandeFournisseur''cf')
  340.                 ->join('f.devise''d')
  341.                 ->where('d.id NOT IN (1)')
  342.         ;
  343.         return $query->getQuery()->getResult();
  344.     }
  345.     public function getMvtsRecalculPump(){
  346.         $query $this->createQueryBuilder('ms')
  347.                 ->select('ms.id')
  348.                 //->where('ms.prixAchat IS NOT NULL AND ms.prixAchat != 0 AND ms.stock IS NOT NULL AND ms.stock != 0 AND ms.idImport IS NULL')
  349.                 ->where('ms.stock IS NOT NULL AND ms.stock != 0 AND ms.idImport IS NULL')
  350.         ;
  351.         return $query->getQuery()->getResult();
  352.     }
  353.     public function getMvtsRecalculPumpAchatQteNegative(){
  354.         $query $this->createQueryBuilder('ms')
  355.                 ->select('ms.id')
  356.                 ->leftJoin('ms.raisonMouvementStock''r')
  357.                 //->where('ms.stock IS NOT NULL AND ms.stock != 0 AND ms.idImport IS NULL AND ms.quantite < 0 AND r.id = 3')
  358.                 ->where('ms.idImport IS NULL AND ms.quantite < 0 AND r.id = 3')
  359.         ;
  360.         return $query->getQuery()->getResult();
  361.     }
  362. }