<?php
namespace App\Controller\Articles;
use App\Entity\Articles\Article;
use App\Entity\Articles\Categorie;
use App\Entity\Articles\Marque;
use App\Entity\FO\Societe;
use App\Entity\Inventaires\ArticleInventaire;
use App\Entity\Inventaires\Inventaire;
use App\Library\Datatable\Util\Datatable;
use App\Service\Articles\ArticleService;
use App\Service\Articles\MouvementStockService;
use App\Service\Utilisateur\ColonneTableauService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Knp\Snappy\Pdf;
class StockController extends AbstractController
{
/**
* @Route("/stock/regulation", name="dtc_stock_regulation")
*/
public function regulationAction(Request $request, MouvementStockService $mouvementStockService, TranslatorInterface $translator,
ValidatorInterface $validator
) {
if ($request->isMethod('POST')) {
$parametres = $request->request->all();
$mouvementStockService->regulation($parametres);
$this->addFlash('notice', $translator->trans('Régulation de stock ajouté avec succès !'));
}
return $this->render('Articles/Stock/regulation.html.twig', []);
}
/**
* @Route("/stock/valorisation", name="dtc_stock_valorisation")
*/
public function valorisationAction(Request $request, TranslatorInterface $translator)
{
$titre_modal = $translator->trans("Valorisation du stock");
$inventaire = $request->query->get('inventaire');
if ($request->isMethod('POST')) {
$type = "valorisation";
$suffixe = "aaaa";
$param = $request->request->all();
$param['inventaire'] = $inventaire;
//$this->pdfValorisationAction($suffixe,$param,false);
if ($request->request->get('typeSortie') == 'csv') {
$url = $this->generateUrl('dtc_stock_valorisation_export_csv', ['id' => $suffixe, 'param' => $param]);
} else {
$url = $this->generateUrl('dtc_stock_valorisation_pdf', ['id' => $suffixe, 'param' => $param, 't' => time()]);
}
} else {
$type = "";
$url = "";
}
$rendu = $this->renderView('Articles/Stock/valorisation.html.twig', [
'inventaire' => $inventaire,
]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => $url, 'titre' => $titre_modal, "type" => $type]
);
}
/**
* @Route("/stock/valorisation/csv", name="dtc_stock_valorisation_csv")
*/
public function valorisationCsvAction(Request $request, TranslatorInterface $translator)
{
$titre_modal = $translator->trans("Valorisation du stock");
$inventaire = $request->query->get('inventaire');
if ($request->isMethod('POST')) {
$type = "valorisation";
$suffixe = "aaaa";
$param = $request->request->all();
$param['inventaire'] = $inventaire;
//var_dump($param);die;
//$this->pdfValorisationAction($suffixe,$param,false);
$url = $this->generateUrl('dtc_stock_valorisation_export_csv', ['id' => $suffixe, 'param' => $param]);
} else {
$type = "";
$url = "";
}
$rendu = $this->renderView('Articles/Stock/valorisation.html.twig', [
'inventaire' => $inventaire,
]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => $url, 'titre' => $titre_modal, "type" => $type]
);
}
/**
* @Route("/stock/valorisation/export-csv/{id}", name="dtc_stock_valorisation_export_csv")
*/
public function valorisationExportCsvAction(Request $request, $id, EntityManagerInterface $em, ArticleService $article_service, MouvementStockService $mouvement_service)
{
//ini_set('memory_limit', '512');
set_time_limit(300);
$param = $request->query->All();
//dump($param);
$param = $param['param'];
//dump($param);
$date = new \Datetime();
$dir = 'Export/valorisation/'.date("Y").'/'.date("m").'/'.date("d").'/';
if ( ! is_dir($dir)) {
mkdir($dir, 755, true);
}
$file = $dir.'export_valorisation_'.date_format($date, 'Ymd_hms').'.csv';
if (is_file($file)) {
unlink($file);
}
$handle = fopen($file, 'w+');
$delimiter = ';';
if (array_key_exists('date', $param)) {
fputcsv($handle, ["Stock a la date du : ".$param['date']], $delimiter);
} else {
$param['date'] = $date->format('d/m/Y');
}
if (array_key_exists('marque', $param)) {
fputcsv($handle, ["Marque : ".$param['marque']], $delimiter);
}
if (array_key_exists('article', $param)) {
fputcsv($handle, ["Article : ".$param['article']], $delimiter);
}
if (array_key_exists('inventaire', $param)) {
fputcsv($handle, ["Inventaire N°".$param['inventaire']], $delimiter);
}
if (array_key_exists('code', $param)) {
fputcsv($handle, ["Code de prix : ".$param['code']], $delimiter);
}
if (array_key_exists('stock', $param) && $param['stock'] == 1) {
fputcsv($handle, ["Stock = 0 : oui"], $delimiter);
} else {
fputcsv($handle, ["Stock = 0 : non"], $delimiter);
}
$quantiteTotale = 0;
$valeurStockTotale = 0;
if (array_key_exists('inventaire', $param)) {
$result = ['Reference', 'Libelle', 'Qte Stock'];
} else {
$result = ['Reference', 'Libelle', 'Qte Stock'];
}
if (array_key_exists('code', $param) && $param['code'] == "pump") {
$result[] = "PUMP";
} elseif (array_key_exists('code', $param) && $param['code'] == "dernier") {
$result[] = "Dernier P. Achat";
} else {
$result[] = "P. Achat net";
}
$result[] = 'Valeur Stock';
fputcsv($handle, $result, $delimiter);
$articles = [];
if (array_key_exists('inventaire', $param)) {
//inventaire
//dump($param['tri']);
$articlesInventaire = $em->getRepository(ArticleInventaire::class)->findByTri($param['inventaire'], $param['tri']);
//dump($articlesInventaire);
$inventaireObjet = $em->getRepository(Inventaire::class)->find($param['inventaire']);
foreach ($articlesInventaire as $articleInventaire) {
$result = [];
$result[] = $articleInventaire['reference'];
$result[] = $articleInventaire['libelle'];
$stockValorisation = floatval($articleInventaire['stockReleve']);
if (array_key_exists('code', $param) && $param['code'] == "pump") {
$prixUnitaire = $article_service->getCump($articleInventaire['article_id'], $inventaireObjet->getDate()->format('Y-m-d H:i:s'));
} elseif (array_key_exists('code', $param) && $param['code'] == "pump") {
$prixUnitaire = $mouvement_service->getDernierPrixAchat($articleInventaire['article_id'], $inventaireObjet->getDate());
} else {
$prixUnitaire = $article_service->getPrixAchat($articleInventaire['article_id'], $inventaireObjet->getDate()->format('d/m/Y'));
}
$result[] = $stockValorisation;
$result[] = round($prixUnitaire, 2);
$valeurStock = $stockValorisation * $prixUnitaire;
$result[] = round($valeurStock, 2);
fputcsv($handle, $result, $delimiter);
$quantiteTotale += $stockValorisation;
$valeurStockTotale += $valeurStock;
}
fputcsv($handle, ['', '', $quantiteTotale, '', $valeurStockTotale], $delimiter);
} else {
$articles = $em->getRepository(Article::class)->valorisation($param);
if (count($articles) > 0) {
foreach ($articles as $article) {
//$result[] = $article['stock_date'];
if (array_key_exists('code', $param) && $param['code'] == "pump") {
//$prixUnitaire = $article['pump'];
$dernierMouvementDate = $mouvement_service->getDernierMouvementDate($article['article_id'], $param['date']);
$prixUnitaire = $dernierMouvementDate["pumpHorsFrais"];
if ($prixUnitaire == "" or $prixUnitaire == 0) {
$prixUnitaire = $article['pump_hors_frais'];
}
$stockValorisation = $dernierMouvementDate["stock"];
} elseif (array_key_exists('code', $param) && $param['code'] == "dernier") {
$prixUnitaire = $article_service->getDernierPrixAchat($article['article_id'], $param['date']);
$dernierMouvementDate = $mouvement_service->getDernierMouvementDate($article['article_id'], $param['date']);
$stockValorisation = $dernierMouvementDate["stock"];
} else {
$prixUnitaire = $article_service->getPrixAchat($article['article_id'], $param['date']);
$dernierMouvementDate = $mouvement_service->getDernierMouvementDate($article['article_id'], $param['date']);
$stockValorisation = $dernierMouvementDate["stock"];
}
$afficher = false;
if ($stockValorisation > 0 or $param['stock'] == "1") {
$afficher = true;
}
if(!is_numeric($stockValorisation)) {
$stockValorisation = 0;
}
if ($afficher) {
$result = [];
$result[] = $article['reference'];
$result[] = $article['libelle'];
$result[] = $stockValorisation;
$result[] = $prixUnitaire;
$valeurStock = $stockValorisation * $prixUnitaire;
$result[] = $valeurStock;
fputcsv($handle, $result, $delimiter);
$quantiteTotale += $stockValorisation;
$valeurStockTotale += $valeurStock;
}
/*
$result[] = $prixUnitaire;
$valeurStock = $article['stock_date'] * $prixUnitaire;
$result[] = $valeurStock;
fputcsv($handle, $result, $delimiter);
$quantiteTotale += $article['stock_date'];
$valeurStockTotale += $valeurStock;
*/
}
}
fputcsv($handle, ['', $quantiteTotale, '', $valeurStockTotale], $delimiter);
}
//var_dump($articles);die;
//die;
rewind($handle);
$content = stream_get_contents($handle);
fclose($handle);
$filename = 'valorisation_'.date_format($date, 'Ymd_hms').'.csv';
return new Response($content, 200, [
'Content-Type' => 'application/force-download; charset=ISO-8859-1',
'Content-Disposition' => 'attachment; filename="'.$filename.'"',
]);
}
/**
* @Route("/stock/valorisation/pdf/{id}", name="dtc_stock_valorisation_pdf")
*/
public function pdfValorisationAction(Request $request, $id, $param = "", $retour = true, EntityManagerInterface $em, Pdf $snappy)
{
$param = $request->query->all();
//print_r($param['param']);
$societe = $em->getRepository(Societe::class)->find(1);
//return $this->render('GestionComerciale/BonLivraison/template_pdf.html.twig',array('commande' => $bonPreparation,'societe' => $societe));
$footer = $this->renderView('FO/PDF/footer_pagination_pdf.html.twig', ['societe' => $societe]);
//$header = $this->renderView('FO/PDF/header_bl_pdf.html.twig', array('societe' => $societe,'commande' => $bonPreparation));
$header = "";
//$snappy = $this->get('knp_snappy.pdf');
//$snappy->setOption('page-size', 'A4');
$snappy->setOption('header-html', $header);
$snappy->setOption('footer-html', $footer);
//$snappy->setOption('header-html',$footer);
$snappy->setOption('margin-bottom', "10");
//$snappy->setOption('margin-top',"10");
//$snappy->setOption('zoom', 1 );
//$snappy->setOption('dpi', 300 );
//echo "<br/><br/><br/>";
//print_r($articles);
$marque = "";
$donnees = [
'societe' => $societe,
'parametres' => $param['param'],
];
if (array_key_exists('marque', $param['param']) && $param['param']['marque'] != "") {
$marque = $em->getRepository(Marque::class)->find($param['param']['marque']);
}
if (array_key_exists('inventaire', $param['param']) && $param['param']['inventaire'] != '') {
//$articlesInventaire = $em->getRepository('DTCInventairesBundle:ArticleInventaire')->findBy(array('inventaire'=>$param['param']['inventaire']));
$articlesInventaire = $em->getRepository(ArticleInventaire::class)->findByTri($param['param']['inventaire'], $param['param']['tri']);
$inventaire = $em->getRepository(Inventaire::class)->find($param['param']['inventaire']);
$donnees['inventaire'] = $inventaire;
$donnees['articlesInventaire'] = $articlesInventaire;
$chemin_pdf = 'PDF/STOCK/VALORISATION-INVENTAIRE'.$param['param']['inventaire'].'.pdf';
} else {
$articles = $em->getRepository(Article::class)->valorisation($param['param']);
$chemin_pdf = 'PDF/STOCK/VALORISATION-'.$id.'.pdf';
}
if (file_exists($chemin_pdf)) {
unlink($chemin_pdf);
}
if (array_key_exists('inventaire', $param['param']) && $param['param']['inventaire'] != '') {
$snappy->generateFromHtml(
$this->renderView(
'Articles/Stock/valorisation_inventaire_template_pdf.html.twig',
$donnees
),
$chemin_pdf
);
} else {
$snappy->generateFromHtml(
$this->renderView(
'Articles/Stock/valorisation_template_pdf.html.twig',
[
'societe' => $societe,
'articles' => $articles,
'parametres' => $param['param'],
'marque' => $marque,
]
),
$chemin_pdf
);
}
if ($retour == true) {
return $this->render('FO/PDF/conteneur_pdf.html.twig', ['chemin_pdf' => '/'.$chemin_pdf]);
//return new RedirectResponse("/".$chemin_pdf);
}
//if($retour == true) return new RedirectResponse("/".$chemin_pdf);
}
/**
* @Route("/stock", name="dtc_stock_liste")
*/
public function listerAction(Request $request, Datatable $datatable, EntityManagerInterface $em, TranslatorInterface $translator, ColonneTableauService $serviceColonneTableau)
{
//\Doctrine\Common\Util\Debug::dump($filters);
$tableau_class_cellule[] = ["searchable" => false, "className" => "colonne_id", "targets" => [0], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = [
"searchable" => false,
"className" => "colonne_id",
"targets" => [1],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Article::class, "id"),
];
$tableau_class_cellule[] = [
"searchable" => false,
"className" => "colonne_libelle",
"targets" => [2],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Article::class, "reference"),
];
$tableau_class_cellule[] = [
"searchable" => false,
"className" => "colonne_libelle",
"targets" => [3],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Article::class, "libelle"),
];
$tableau_class_cellule[] = [
"searchable" => false,
"className" => "colonne_libelle",
"targets" => [4],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Article::class, "marque"),
];
$tableau_class_cellule[] = [
"searchable" => false,
"className" => "colonne_prixBase",
"targets" => [5],
"visible" => $serviceColonneTableau->getColonneUtilisateur(Article::class, "stock"),
];
$categorie_enfants = [];
$repo_categorie_article = $em->getRepository(Categorie::class);
$categorie_article_racine = $repo_categorie_article->findBy(["categorieParent" => 1]);
$param = $request->query->all();
if (array_key_exists('categorie_article', $param) and $param["categorie_article"] > 0) {
$parent = $repo_categorie_article->find($param["categorie_article"]);
if (is_object($parent)) {
$categorie_enfants = $repo_categorie_article->findBy(["categorieParent" => $parent]);
}
}
$this->datatable($request, $datatable, $em, $translator);
return $this->render('Articles/Stock/lister.html.twig', [
'name' => 'article',
'tableauClassColonne' => $tableau_class_cellule,
'parametres' => $param,
"categorie_article" => $categorie_article_racine,
"sous_categorie_article" => $categorie_enfants,
]);
}
private function datatable(Request $request, Datatable $datatable, EntityManagerInterface $em, TranslatorInterface $translator)
{
$param = $request->query->all();
$parametres = [];
$where = "";
//print_r($param);
if ( ! array_key_exists('parametres', $param)) {
$param["parametres"] = $param;
}
$conn = $em->getConnection();
$conn->getConfiguration()->setSQLLogger(null);
$qb = $em->createQueryBuilder();
$qb->select(
"
x.id as x_id,
x.libelle as x_libelle,
x.reference as x_reference,
x.descriptionCourte as x_descriptionCourte,
x.prixVente as x_prixVente,
x.tauxMarge as x_tauxMarge,
x.cpump as x_cpump,
x.stock as x_stock,
x.statut as x_statut,
m.libelle as m_libelle,
r.id as r_id,
r.tauxDefaut as r_tauxDefaut
"
)
->from(Article::class, "x")
->join('x.marque', 'm', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->join('x.regleTaxe', 'r', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
if (array_key_exists('categorie_article', $param['parametres']) and $param['parametres']['categorie_article'] != "") {
$qb->join('x.articleCategorie', 'ac', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$qb->join('ac.categorie', 'cat', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$where .= " AND cat.id = :categorie";
$parametres['categorie'] = $param['parametres']['categorie_article'];
if (array_key_exists('sous_categorie_article', $param['parametres']) and $param['parametres']['sous_categorie_article'] != "") {
$qb->join('x.articleCategorie', 'ac2', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$qb->join('ac2.categorie', 'cat2', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$where .= " AND cat2.id = :categorie2";
$parametres['categorie2'] = $param['parametres']['sous_categorie_article'];
}
}
$qb->where('x.temporaire is null and (x.archive = 0 or x.archive is null)'.$where);
if (count($parametres) > 0) {
$qb->setParameters($parametres);
}
$qb->orderBy("x.id", "desc");
$datatable
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Réf") => 'x.reference',
$translator->trans("Libellé") => 'x.libelle',
$translator->trans("Marque") => 'm.libelle',
$translator->trans("Stock") => 'x.stock',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id'
/*
$translator->trans("AA") => 'x.id',
$translator->trans("BB") => 'x.libelle',
"cc" => 'x.libelle',
"dd" => 'x.libelle',
"ee" => 'x.libelle',
"ff" => 'x.libelle',
"gg" => 'x.libelle',
"hh" => 'x.libelle',
"ii" => 'x.libelle',
"jj" => 'x.libelle',
"kk" => 'x.libelle',
"ll" => 'x.libelle',
"_identifier_" => 'x.id'
*/
]
)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/article_id.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
2 => [
'view' => 'FO/DataTable/article_id.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
],
],
5 => [
'view' => 'FO/DataTable/article_actions.html.twig',
'params' => [
'edit_route' => 'dtc_article_modifier',
//'dupliquer_route' => 'dtc_article_dupliquer_formulaire',
'objet' => Article::class,
],
],
]
)
->setSearch(true)
->setGlobalSearch(1)
->setSearchFields([2, 3])
->setFilteringType([2 => 'e', 3 => 'e'])
->setSearchFields([2, 3])
->setMultiple(
[
'delete' => [
'title' => 'Non disponible',
'route' => 'dtc_client_liste_supprimer',
],
]
);
$datatable->getQueryBuilder()->setDoctrineQueryBuilder($qb);
return $datatable;
}
/**
* @Route("/stock/grid", name="dtc_stock_liste_grid")
*/
public function gridAction(Request $request, Datatable $datatable, EntityManagerInterface $em, TranslatorInterface $translator)
{
return $this->datatable($request, $datatable, $em, $translator)->execute();
}
}