<?php
namespace App\Repository\Articles;
use App\Entity\Articles\Article;
use App\Entity\Articles\MouvementStock;
use App\Entity\GestionComerciale\CommandeFournisseur;
use DateInterval;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* MouvementStockRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class MouvementStockRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, MouvementStock::class);
}
public function getIdMaxArticleHasMvtStockLimit(){
$query = $this->createQueryBuilder('ms')
->select("a.id")
//->leftJoin('p.fournisseurs', 'f')//, 'WITH', 'p.fournisseur = f.id'
->leftJoin('ms.article', 'a')
//->join("App\Entity\Fournisseurs\Four f")
//->where('ms ')
//->setParameters(array('cond' => $cond))
//->orderBy('p.prenom', 'ASC');
//->setFirstResult(0)
->orderBy('a.id', 'DESC')
->setMaxResults(1)
;
$res = $query->getQuery()->getResult();
return $res;
}
private function nbJoursMois($m, $y)
{
$mois = mktime( 0, 0, 0, $m, 1, $y );
//setlocale('LC_ALL', 'fr_FR');
return date("t",$mois);
}
public function getStockMois($articleId, $m, $y) {
$dateDebut = new DateTime($y.'-'.$m.'-01 00:00:00');
$dateFin = clone $dateDebut;
//$date = new \DateTime('01/'.$m.'/'.$y);
//$date = new \DateTime($m.'/01/'.$y);
$retour = [];
$periode = $this->nbJoursMois($m, $y);
$dateFin->add(new DateInterval('P'.$periode.'D'));
//$dateFin = $date->sub(new \DateInterval('P'.$periode.'D'));
//return $dateDebut->format('d-m-Y').'/'.$dateFin->format('d-m-Y');
$stockMoisResult = $this->getEntityManager()
->createQuery(
"SELECT count(ms.id) as total, SUM(ms.stock) as stock
FROM App\Entity\Articles\MouvementStock ms
WHERE ms.article = :id and ms.dateMvt >= :dateDebut and ms.dateMvt < :dateFin and ms.stock is not null
"
)
->setParameters(['id' => $articleId, 'dateDebut' => $dateDebut, 'dateFin' => $dateFin])//
->getResult();
if ($stockMoisResult[0]['total'] != 0)
$stockMois = $stockMoisResult[0]['stock']/$stockMoisResult[0]['total'];
else {
$stockMois = 0;
}
$retour['date'] = $dateFin;
$retour["stockMois"] = $stockMois;
$retour["totalMvt"] = $stockMoisResult[0]['total'];
//return $stockMois;
return $retour;
}
public function getVariationsStockParMois($articleId, $nbMois) {
$date = new DateTime();
$date->sub(new DateInterval('P'.$nbMois.'M'));
$mois = (int)$date->format('m');
$annee = (int)$date->format('Y');
$tempStock = 0;
$moisTmp = $mois;
for($i=0;$i<=$nbMois;$i++){
if ($moisTmp < 10)
$id = $annee.'-0'.$moisTmp;
else
$id = $annee.'-'.$moisTmp;
$stockCalcul = $this->getStockMois($articleId, $moisTmp, $annee);
$retour[$id] = $stockCalcul["stockMois"];
if($stockCalcul["totalMvt"] == 0) {
$retour[$id] = $tempStock;
} else {
$tempStock = $retour[$id];
}
if($moisTmp+1>12){
$moisTmp = 1;
$annee += 1;
} else {
$moisTmp += 1;
}
}
//return array_reverse($retour);
return $retour;
}
public function __getVariationsStockParMois($articleId, $nbMois) {
$date = new DateTime();
$mois = (int)$date->format('m');
$annee = (int)$date->format('Y');
//$date->sub(new \DateInterval('P'.$periode.'D'));
$moisTmp = $mois;
for($i=1;$i<=$nbMois;$i++){
if ($moisTmp < 10)
$id = $annee.'-0'.$moisTmp;
else
$id = $annee.'-'.$moisTmp;
$retour[$id] = $this->getStockMois($articleId, $moisTmp, $annee);
if($moisTmp-1>0){
$moisTmp -= 1;
} else {
$moisTmp = 12;
$annee -= 1;
}
}
return array_reverse($retour);
}
public function getPumpMois($articleId, $m, $y) {
$dateDebut = new DateTime($y.'-'.$m.'-01 00:00:00');
$date = new DateTime($y.'-'.$m.'-01 00:00:00');
//$date = new \DateTime('01/'.$m.'/'.$y);
//$date = new \DateTime($m.'/01/'.$y);
$periode = $this->nbJoursMois($m, $y);
$dateFin = $date->add(new DateInterval('P'.$periode.'D'));
//$dateFin = $date->sub(new \DateInterval('P'.$periode.'D'));
//return $dateDebut->format('d-m-Y').'/'.$dateFin->format('d-m-Y');
$pumpMoisResult = $this->getEntityManager()
->createQuery(
"SELECT count(ms.id) as total, SUM(ms.cpump) as pump
FROM App\Entity\Articles\MouvementStock ms
WHERE ms.article = :id and ms.dateMvt >= :dateDebut and ms.dateMvt < :dateFin
"
)
->setParameters(['id' => $articleId, 'dateDebut' => $dateDebut, 'dateFin' => $dateFin])//
->getResult();
if ($pumpMoisResult[0]['total'] != 0)
$pumpMois = $pumpMoisResult[0]['pump']/$pumpMoisResult[0]['total'];
else {
$pumpMois = 0;
}
return $pumpMois;
//return number_format($pumpMois, 2, ',', ' ');
}
public function getVariationsPumpParMois($articleId, $nbMois) {
$date = new DateTime();
$mois = (int)$date->format('m');
$annee = (int)$date->format('Y');
//$date->sub(new \DateInterval('P'.$periode.'D'));
$tempPump = $this->getEntityManager()->getRepository(Article::class)->find($articleId)->getCpump();
$moisTmp = $mois;
for($i=$nbMois;$i>0;$i--){
if ($moisTmp < 10)
$id = $annee.'-0'.$moisTmp;
else
$id = $annee.'-'.$moisTmp;
$retour[$id] = $this->getPumpMois($articleId, $moisTmp, $annee);
if($retour[$id] == 0) {
$retour[$id] = $tempPump;
}
else {
$tempPump = $retour[$id];
}
if($moisTmp-1>0){
$moisTmp -= 1;
} else {
$moisTmp = 12;
$annee -= 1;
}
}
return array_reverse($retour);
}
public function getCpumpMois($articleId, $m, $y) {
}
public function getVariationsCpumpParMois($articleId, $nbMois) {
}
public function getQteLivreeByCommandeFAndArticle(CommandeFournisseur $commandeFournisseur, Article $article){
$query = $this->createQueryBuilder('mvt')
->select("COALESCE(SUM(mvt.quantite),0) as total")
->where('mvt.commandeFournisseur = :commandeFournisseur and mvt.article = :article')
->setParameters(['commandeFournisseur' => $commandeFournisseur->getId(), 'article' =>$article->getId()])
;
$total = $query->getQuery()->getSingleScalarResult();
return $total;
}
public function getQteVenduSurPeriode($article, $nbMois=0, $nbMoisDecalage=0){
$date = new Datetime();
$nbMoisDebut = $nbMois + $nbMoisDecalage;
$dateDebut = clone $date;
$dateDebut->sub(new DateInterval('P'.$nbMoisDebut.'M'));
$dateFin = clone $date;
$dateFin->sub(new DateInterval('P'.$nbMoisDecalage.'M'));
$qteVendue = $this->getEntityManager()
->createQuery(
"SELECT SUM(ms.quantite) as total, ms.id, ms.quantite
FROM App\Entity\Articles\MouvementStock ms
JOIN ms.raisonMouvementStock rms
JOIN ms.commande c
WHERE ms.article = :id and ms.dateMvt >= :dateDebut and ms.dateMvt < :dateFin and ms.commande is not null and rms.action = :raison
"
)
->setParameters(['id' => $article->getId(), 'dateDebut' => $dateDebut, 'dateFin' => $dateFin, 'raison' => 'diminuer'])//
->getOneOrNullResult();
return $qteVendue['total'];
}
public function getMvtsPlusRecent(MouvementStock $ms){
$date = $ms->getDateMvt();
$query = $this->createQueryBuilder('ms')
->leftJoin('ms.article', 'a')
->where('a.id = :articleId and ms.dateMvt >= :dateMvt ')
->setParameters(['articleId' => $ms->getArticle()->getId(), 'dateMvt' => $date->format("Y-m-d H:i:s")])
->orderBy('ms.dateMvt', 'ASC')
//->orderBy('a.id', 'DESC')
;
$res = $query->getQuery()->getResult();
return $res;
}
public function getMvtsPlusRecentByArticle($articleId, $date){
$query = $this->createQueryBuilder('ms')
->select('ms.id')
->leftJoin('ms.article', 'a')
->where('a.id = :articleId and ms.dateMvt >= :dateMvt ')
->setParameters(['articleId' => $articleId, 'dateMvt' => $date->format("Y-m-d H:i:s")])
->orderBy('ms.dateMvt', 'ASC')
//->orderBy('a.id', 'DESC')
;
$res = $query->getQuery()->getResult();
return $res;
}
public function getDernierMouvementDateHeure($articleId, $date=''){
if($date == '') $date = new Datetime();
/*
if(!is_object($date)){
$date = \DateTime::createFromFormat('d/m/Y',$date);
$date->setTime(23,59,59);
}
*/
$where = 'a.id = :articleId and ms.dateMvt <= :dateMvt and ms.dateSuppression IS NULL';
$parameters = ['articleId' => $articleId, 'dateMvt' => $date];
$query = $this->createQueryBuilder('ms')
->select('ms.id,ms.stock,ms.pump,ms.prixAchat,ms.prixSansRemise,ms.cpump')
->leftJoin('ms.article', 'a')
->leftjoin('ms.emplacement', 'e')
->where($where)
->setParameters($parameters)
->addOrderBy('ms.dateMvt', 'DESC')
->addOrderBy('ms.id', 'DESC')
->setMaxResults(1)
;
$res = $query->getQuery()->getResult();
//echo "TEST";
//print_r($res[0]);
if(isset($res[0])) {
return $res[0];
//return floatval($res[0]['stock']);
}
else {
return $res[0]= ["id" =>"", "cpump" =>"", "pump" =>"", "stock" =>"", "prixAchat" =>"", "prixSansRemise" =>""];
return $res[0];
}
}
public function getDernierMouvementDate($articleId, $date){
if(!is_object($date)){
$date = DateTime::createFromFormat('d/m/Y',$date);
$date->setTime(23,59,59);
}
$where = 'a.id = :articleId and ms.dateMvt <= :dateMvt ';
$parameters = ['articleId' => $articleId, 'dateMvt' => $date->format("Y-m-d H:i:s")];
$query = $this->createQueryBuilder('ms')
->select('ms.id,ms.stock,ms.pump,ms.cpump,ms.pumpHorsFrais')
->leftJoin('ms.article', 'a')
->leftjoin('ms.emplacement', 'e')
->where($where)
->setParameters($parameters)
->addOrderBy('ms.dateMvt', 'DESC')
->addOrderBy('ms.id', 'DESC')
->setMaxResults(1)
;
$res = $query->getQuery()->getResult();
//echo "TEST";
//print_r($res[0]);
if(isset($res[0])) {
return $res[0];
//return floatval($res[0]['stock']);
}
else {
return $res[0]= ["cpump" =>"", "pump" =>"", "stock" =>"", 'pumpHorsFrais' => ''];
return $res[0];
}
}
public function getStockArticleAuneDate($articleId, $emplacementId='', $date){
$where = 'a.id = :articleId and ms.dateMvt < :dateMvt ';
$parameters = ['articleId' => $articleId, 'dateMvt' => $date->format("Y-m-d H:i:s")];
if($emplacementId != ''){
$where .= 'and e.id = :emplacementId';
$parameters['emplacementId'] = $emplacementId;
}
$query = $this->createQueryBuilder('ms')
->select('ms.stock')
->leftJoin('ms.article', 'a')
->leftjoin('ms.emplacement', 'e')
->where($where)
->setParameters($parameters)
->orderBy('ms.dateMvt', 'DESC')
->setMaxResults(1)
;
$res = $query->getQuery()->getResult();
if(isset($res[0]['stock']))
return floatval($res[0]['stock']);
else
return null;
}
public function getDernierPrixAchat($articleId,$date) {
if(!is_object($date)){
$date = DateTime::createFromFormat('d/m/Y',$date);
$date->setTime(23,59,59);
}
$query = $this->createQueryBuilder('ms')
->select('ms.prixAchat as prixAchat')
->leftJoin('ms.article', 'a')
->leftJoin('ms.raisonMouvementStock', 'r')
->where('a.id = :articleId and ms.date < :date and r.id = :raisonId')
->setParameters(['articleId' => $articleId, 'date' => $date->format("Y-m-d H:i:s"), 'raisonId' => 3])//Achat
->orderBy('ms.dateMvt', 'DESC')
->setMaxResults(1)
;
$res = $query->getQuery()->getResult();
return $res[0]['prixAchat'] ?? 0;
}
public function getMvtsDeviseAutreEuro(){
$query = $this->createQueryBuilder('ms')
->select('ms.id')
->join('ms.fournisseur', 'f')
->join('ms.commandeFournisseur', 'cf')
->join('f.devise', 'd')
->where('d.id NOT IN (1)')
;
return $query->getQuery()->getResult();
}
public function getMvtsRecalculPump(){
$query = $this->createQueryBuilder('ms')
->select('ms.id')
//->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')
->where('ms.stock IS NOT NULL AND ms.stock != 0 AND ms.idImport IS NULL')
;
return $query->getQuery()->getResult();
}
public function getMvtsRecalculPumpAchatQteNegative(){
$query = $this->createQueryBuilder('ms')
->select('ms.id')
->leftJoin('ms.raisonMouvementStock', 'r')
//->where('ms.stock IS NOT NULL AND ms.stock != 0 AND ms.idImport IS NULL AND ms.quantite < 0 AND r.id = 3')
->where('ms.idImport IS NULL AND ms.quantite < 0 AND r.id = 3')
;
return $query->getQuery()->getResult();
}
}