<?php
namespace App\Service\Articles;
use App\Entity\Articles\Article;
use App\Entity\Articles\ConditionAchat;
use App\Entity\Articles\MouvementStock;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Output\OutputInterface;
class ArticlePumpService
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function majArticlePump(Article $article, OutputInterface $output = null, MouvementStock $mouvementStock = null)
{
if ($article->getStock() === 0) {
$conditionAchat = $article->getConditionAchatDefaut();
if ($conditionAchat instanceof ConditionAchat && $conditionAchat->getPrixAchatNet() > 0) {
$article->setPump($conditionAchat->getPrixAchatNet());
}
} else {
$conn = $this->em->getConnection();
$conn->getConfiguration()->setSQLLogger(null);
$repo_article = $this->em->getRepository(Article::class);
$repo_condha = $this->em->getRepository(ConditionAchat::class);
if ($article->getVirtuel() === false) {
$articleId = $article->getId();
if ($output !== null) {
$output->writeln("ARTICLE_ID :".$articleId);
}
$tab_article_probleme = array();
$tab_virtuel_id = array();
$sql_mvt = "
SELECT *
FROM article__mouvement_stock
WHERE article_id = ".$articleId."
AND dateSuppression is null
ORDER BY date_mouvement asc,id asc";
//$output->writeln($sql_mvt);
$stmt_mvt = $conn->executeQuery($sql_mvt);
$mouvements = $stmt_mvt->fetchAllAssociative();
$sql_composants = "SELECT * FROM `article__article_composant` WHERE date_supression is null and `article_id` = ".$articleId;
$stmt_composants = $conn->executeQuery($sql_composants);
$composants_bdd = $stmt_composants->fetchAllAssociative();
if (count($composants_bdd) > 0) {
foreach ($composants_bdd as $compo_bdd) {
if ( ! in_array($compo_bdd["article_compose_id"], $tab_virtuel_id)) {
$tab_virtuel_id[] = $compo_bdd["article_compose_id"];
}
}
}
$pump = 0;
$pumpHorsfrais = 0;
$tab_augmenter = array(3, 4, 5, 8, 9, 13, 15, 16, 21, 29, 31, 32);
// $tab_augmenter = array(3, 13);
$mv_pec = null;
$pump_tmp = 0;
$pumpHorsfrais_tmp = 0;
if (count($mouvements) > 0) {
$compteur_mvt = 0;
foreach ($mouvements as $mvt) {
if($output !== null) {
$output->writeln("MVT ID :".$mvt["id"]);
$output->writeln("MVT DATE :".$mvt["date"]);
$output->writeln("MVT TYPE :".$mvt["raison_mouvement_stock_id"]);
}
if ($compteur_mvt == 0) {
if ($output !== null) {
$output->writeln("COMTPEUR 0");
}
if (in_array($mvt["raison_mouvement_stock_id"], $tab_augmenter)) {
$pump_tmp = $mvt['prix_achat_unitaire_avec_frais'];
$pumpHorsfrais_tmp = $mvt['prix_achat'];
} else {
if ($output !== null) {
$output->writeln("PAS 3 29 30");
}
$condHa = $repo_condha->findOneBy(array("article" => $articleId, "defaut" => 1));
if ( ! is_object($condHa)) {
$condHa = $repo_condha->findOneBy(array("article" => $articleId));
}
if (is_object($condHa)) {
$prix = $condHa->getPrixAchatNet();
if ($condHa->getCoefficientConditionnement() != 0) {
$prix = $prix / $condHa->getCoefficientConditionnement();
}
$tauxChange = 1;
$fournisseur = $condHa->getFournisseur();
if ($fournisseur !== null) {
$devise = $fournisseur->getDevise();
}
if ($devise !== null && $devise->getTauxChange() != 0) {
$tauxChange = $devise->getTauxChange();
}
$pump_tmp = $prix * $tauxChange;
$pumpHorsfrais_tmp = $prix * $tauxChange;
} else {
if ($output !== null) {
$output->writeln("PREMIER MVT NON ACHAT ET PAS DE CONDITION ACHAT");
}
$tab_article_probleme[] = $articleId;
break;
}
}
} elseif (in_array($mvt["raison_mouvement_stock_id"], $tab_augmenter)) {
if ($output !== null) {
$output->writeln("TAB AUGMENTER");
}
if ($mvt["raison_mouvement_stock_id"] == 32) {
$mvt["quantite"] = abs($mvt["quantite"]);
}
if (floatval($mvt["stock"]) < 0) {
$mvt["stock"] = 0;
}
if (floatval($mv_pec["stock"]) < 0) {
$mv_pec["stock"] = 0;
}
$diviseur = (floatval($mv_pec["stock"]) + floatval($mvt["quantite"]));
if ($diviseur == 0) {
} else {
if ($output !== null) {
$output->writeln("STOCK PREC :".floatval($mv_pec["stock"]));
$output->writeln("PUMP:".floatval($pump_tmp));
$output->writeln("PUMP HF:".floatval($pumpHorsfrais_tmp));
$output->writeln("QTE:".floatval($mvt["quantite"]));
$output->writeln("PRIX_ACHAT:".floatval($mvt["prix_achat_unitaire_avec_frais"]));
$output->writeln("PRIX_ACHAT_SANS_FRAIS:".floatval($mvt["prix_achat"]));
$output->writeln("");
}
$pump_tmp = (floatval($mv_pec["stock"]) * floatval($pump_tmp)) + (floatval($mvt["quantite"]) * floatval($mvt["prix_achat_unitaire_avec_frais"]));
$pump_tmp = $pump_tmp / (floatval($mv_pec["stock"]) + floatval($mvt["quantite"]));
$pump_tmp = round($pump_tmp, 2);
$pumpHorsfrais_tmp = (floatval($mv_pec["stock"]) * floatval($pumpHorsfrais_tmp)) + (floatval($mvt["quantite"]) * floatval($mvt["prix_achat"]));
$pumpHorsfrais_tmp = $pumpHorsfrais_tmp / (floatval($mv_pec["stock"]) + floatval($mvt["quantite"]));
$pumpHorsfrais_tmp = round($pumpHorsfrais_tmp, 2);
}
} else {
if ($output !== null) {
$output->writeln("ELSE");
}
}
$mv_pec = $mvt;
if ($output !== null) {
$output->writeln("PUMP :".$pump_tmp);
$output->writeln("PUMP HORS FRAIS :".$pumpHorsfrais_tmp);
}
$tableau_donnee = array();
$tableau_donnee['pump'] = $pump_tmp;
$tableau_donnee['pump_hors_frais'] = $pumpHorsfrais_tmp;
$conn->update('article__mouvement_stock', $tableau_donnee, array('id' => $mvt['id']));
$compteur_mvt++;
if ($output !== null) {
$output->writeln("####################################");
}
}
}
$article->setPump($pump_tmp);
$article->setPumpHorsFrais($pumpHorsfrais_tmp);
// $article->setMajPump(0);
if($mouvementStock !== null) {
$mouvementStock->setPumpHorsFrais($pumpHorsfrais_tmp);
$mouvementStock->setPump($pump_tmp);
}
} else {
$articleId = $article->getId();
if ($output !== null) {
$output->writeln("ARTICLE_ID :".$articleId);
}
$pump = 0;
$pump_hors_frais = 0;
if ($output !== null) {
$output->writeln("");
$output->writeln("****************************************************");
$output->writeln("");
}
$sql_mvt = "
SELECT *
FROM article__mouvement_stock
WHERE article_id = ".$articleId."
and dateSuppression is null
ORDER BY date_mouvement asc,id asc";
$stmt_mvt = $conn->executeQuery($sql_mvt);
$mouvements = $stmt_mvt->fetchAllAssociative();
$mv_pec = null;
$pump_tmp = 0;
$pumpHorsfrais_tmp = 0;
$total_mvt_virtuel = count($mouvements);
$compteur_mvt_virtuel = 0;
$sql_composants = "SELECT * FROM `article__article_composant` WHERE date_supression is null and `article_compose_id` = ".$articleId;
$stmt_composants = $conn->executeQuery($sql_composants);
$composants_bdd = $stmt_composants->fetchAllAssociative();
if (count($mouvements) > 0) {
if (count($composants_bdd) > 0) {
$compteur_mvt = 0;
foreach ($mouvements as $mvt) {
$compteur_mvt_virtuel++;
if ($output !== null) {
$output->writeln("MVT ID :".$mvt["id"]);
$output->writeln("MVT DATE :".$mvt["date"]);
$output->writeln("");
}
$pump = 0;
$pump_hors_frais = 0;
foreach ($composants_bdd as $compo_bdd) {
$sql_article = "SELECT id,exclure_pump,pump,pump_hors_frais FROM `article__article` WHERE id = ".$compo_bdd["article_id"];
$stmt_article = $conn->executeQuery($sql_article);
$article_bdd = $stmt_article->fetchAllAssociative();
if (count($article_bdd) == 1 && (is_null($article_bdd[0]["exclure_pump"]) or $article_bdd[0]["exclure_pump"] == 0)) {
if ($output !== null) {
$output->writeln("COMPOSANT ARTICLE ID :".$compo_bdd["article_id"]." QTE :".$compo_bdd["quantite"]);
}
$sql_mvt_composant = "SELECT * FROM `article__mouvement_stock` WHERE article_id = ".$compo_bdd["article_id"]." AND date_mouvement <= '".$mvt["date"]."' ORDER BY date_mouvement desc LIMIT 0,1 ";
$stmt_mvt_composants = $conn->executeQuery($sql_mvt_composant);
$mvt_composants_bdd = $stmt_mvt_composants->fetchAllAssociative();
if ($output !== null) {
$output->writeln($sql_mvt_composant);
}
if (count($mvt_composants_bdd) == 1) {
if ($output !== null) {
$output->writeln("PUMP MVT :".$mvt_composants_bdd[0]["pump"]);
$output->writeln("PUMP HORS FRAIS MVT :".$mvt_composants_bdd[0]["pump_hors_frais"]);
}
$pump += $mvt_composants_bdd[0]["pump"] * $compo_bdd["quantite"];
$pump_hors_frais += $mvt_composants_bdd[0]["pump_hors_frais"] * $compo_bdd["quantite"];
} else {
}
} elseif (count($article_bdd) == 1) {
if ($output !== null) {
$output->writeln("EXCLU PUMP V1:".$article_bdd[0]["id"]);
}
}
if ($output !== null) {
$output->writeln("");
}
}
$pump = round($pump, 2);
$pump_hors_frais = round($pump_hors_frais, 2);
if ($output !== null) {
$output->writeln("PUMP CALCULE :".$pump);
$output->writeln("PUMP HORS FRAIS CALCULE :".$pump_hors_frais);
}
$tableau_donnee = array();
$tableau_donnee['pump'] = $pump;
$tableau_donnee['pump_hors_frais'] = $pump_hors_frais;
$conn->update('article__mouvement_stock', $tableau_donnee, array('id' => $mvt['id']));
if ($output !== null) {
$output->writeln("");
$output->writeln("**************************************************** ".$compteur_mvt_virtuel."/".$total_mvt_virtuel);
$output->writeln("");
}
}
}
}
$pump = 0;
$pump_hors_frais = 0;
if (count($composants_bdd) > 0) {
foreach ($composants_bdd as $compo_bdd) {
$sql_article = "SELECT id,exclure_pump,pump,pump_hors_frais FROM `article__article` WHERE id = ".$compo_bdd["article_id"];
$stmt_article = $conn->executeQuery($sql_article);
$article_bdd = $stmt_article->fetchAllAssociative();
if ($output !== null) {
print_r($article_bdd);
}
if (count($article_bdd) == 1 && (is_null($article_bdd[0]["exclure_pump"]) or $article_bdd[0]["exclure_pump"] == 0)) {
$pump += $article_bdd[0]["pump"] * $compo_bdd["quantite"];
$pump_hors_frais += $article_bdd[0]["pump_hors_frais"] * $compo_bdd["quantite"];
} elseif (count($article_bdd) == 1) {
if ($output !== null) {
$output->writeln("EXCLU PUMP V2:".$article_bdd[0]["id"]);
}
}
}
}
$tableau_donnee = array();
$pump = round($pump, 2);
$pump_hors_frais = round($pump_hors_frais, 2);
$article->setPump($pump);
$article->setPumpHorsFrais($pump_hors_frais);
$article->setMajPump(false);
}
}
$this->em->flush();
}
}