<?php
namespace App\Controller\GestionComerciale;
use App\Entity\Articles\ColisModele;
use App\Entity\FO\Societe;
use App\Entity\GestionComerciale\ArticleCommande;
use App\Entity\GestionComerciale\Colisage;
use App\Entity\GestionComerciale\Commande;
use App\Library\Datatable\Util\Datatable;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Snappy\Pdf;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ColisageController extends AbstractController
{
/**
* @Route("/vente/colisage/nouveau/{id}/{type}", name="dtc_colisage_ajouter")
*/
public function ajouterAction(Request $request, $id, $type = "", EntityManagerInterface $em, TranslatorInterface $translator)
{
$titre_modal = $translator->trans("Bon de colisage");
$user = $this->getUser();
$idsArticleCommande = $request->request->get('choixArticles');
$qte = $request->request->get('qteDispo');
$libelles = $request->request->get('libelles');
$repo_article_commande = $em->getRepository(ArticleCommande::class);
$tableau_final = [];
if (count($idsArticleCommande) > 0) {
for ($i = 0; $i < count($idsArticleCommande); $i++) {
$article_temp = null;
$article_commande = $repo_article_commande->find($idsArticleCommande[$i]);
if (is_object($article_commande) && is_object($article_commande->getArticle())) {
$article_temp = $article_commande->getArticle();
if ($article_temp->getProduitInterne()) {
if (count($article_temp->getArticlesComposants()) > 0) {
foreach ($article_temp->getArticlesComposants() as $composants) {
//echo "<div>REF ".$composants->getArticle()->getReference()."</div>";
$article_temp = $composants->getArticle();
if (array_key_exists($article_temp->getId(), $tableau_final)) {
$tableau_final[$article_temp->getId()]["quantiteColis"] = $tableau_final[$article_temp->getId()]["quantiteColis"] + $composants->getQuantite();
} else {
$tableau_final[$article_temp->getId()] = [
"idArticleColis" => $article_temp->getId(),
"idArticleCommandeColis" => $idsArticleCommande[$i],
"quantiteColis" => $composants->getQuantite(),
"libelleColis" => $article_temp->getLibelle(),
"referenceColis" => $article_temp->getReference(),
];
}
}
}
} else {
if (array_key_exists($article_temp->getId(), $tableau_final)) {
$tableau_final[$article_temp->getId()]["quantiteColis"] = $tableau_final[$article_temp->getId()]["quantiteColis"] + $qte[$i];
} else {
$tableau_final[$article_temp->getId()] = [
"idArticleColis" => $article_temp->getId(),
"idArticleCommandeColis" => $idsArticleCommande[$i],
"quantiteColis" => $qte[$i],
"libelleColis" => $article_temp->getLibelle(),
"referenceColis" => $article_temp->getReference(),
];
}
}
}
//$tableau_final[]=array("idArticleCommandeColis"=>$idsArticleCommande[$i],"quantiteColis"=>$qte[$i],"libelleColis"=>$libelles[$i]);
}
}
$errors = [];
$rendu = $this->renderView('GestionComerciale/Colisage/ajouter.html.twig', ['errors' => $errors, 'articleCommandeColis' => $tableau_final]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("", name="")
*/
public function ___ajouterAction(Request $request, $id, $type = "", EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$titre_modal = $translator->trans("Bon de colisage");
$user = $this->getUser();
$idsArticleCommande = $request->request->get('choixArticles');
$qte = $request->request->get('qteDispo');
$libelles = $request->request->get('libelles');
$tableau_final = [];
if (count($idsArticleCommande) > 0) {
for ($i = 0; $i < count($idsArticleCommande); $i++) {
$tableau_final[] = ["idArticleCommandeColis" => $idsArticleCommande[$i], "quantiteColis" => $qte[$i], "libelleColis" => $libelles[$i]];
}
}
$errors = [];
$rendu = $this->renderView('GestionComerciale/Colisage/ajouter.html.twig', ['errors' => $errors, 'articleCommandeColis' => $tableau_final]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("/vente/colisage", name="dtc_colisage_liste")
*/
public function listerAction(Request $request, $id = "0", $type = "a", EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
$repo_objet = $em->getRepository(Commande::class);
$objet = $repo_objet->find($id);
$param = $request->query->all();
if (is_object($objet)) {
$tableau_class_cellule = [];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id text-center", "targets" => [0], "visible" => true, "orderable" => true];
//$tableau_class_cellule[]=array("className"=>"visible_export colonne_id","targets"=>array(1),"visible"=>true,"orderable"=>true);
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [2], "visible" => true];
$this->datatableCommande($objet, $type, $datatable, $translator);
return $this->render(
'GestionComerciale/Colisage/lister_commande.html.twig',
['tableauClassColonne' => $tableau_class_cellule, "id" => $id, "type" => $type, 'parametres' => $param]
);
}
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatableCommande($objet, $type = "", Datatable $datatable, TranslatorInterface $translator)
{
//$type_jointure = 'x.'.$type;
$datatable->setDatatableId('dta-colisage')->setEntity(Colisage::class, "x");
//$repo_statut_document = $em->getRepository('DTCGestionComercialeBundle:StatutCommande');
//$liste_statut = $repo_statut_document->findBy(array("documentCommercial"=>6,"ordre"=>array(0)));
$parameters = ['objet' => $objet];
$datatable->addJoin('x.colisageArticleCommande', 'cac', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$datatable->addJoin('cac.articleCommandeBl', 'ac', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$datatable->addJoin('ac.commande', 'bl', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$where = "bl.id = :objet";
$parameters['objet'] = $objet->getId();
$datatable
->setFields(
[
//$translator->trans("ID") => 'x.id',
$translator->trans("Date") => 'x.date',
$translator->trans("Réf") => 'x.reference',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->setWhere(
$where,
$parameters
)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/heure.html.twig',
'params' => [
'edit_route' => 'dtc_colisage_afficher',
],
],
2 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
//'edit_route' => 'dtc_colisage_modifier',
//'supprimer_route' => 'dtc_colisage_supprimer',
'pdf_route' => 'dtc_colisage_2_pdf',
'id' => $objet->getId(),
'type' => $type,
'entite' => 'colisage',
'objet' => Colisage::class,
'deplier' => false,
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)//->setSearchFields(array(1,2))
;
$datatable->setGroupBy('x.id');
return $datatable;
}
/**
* @Route("/vente/colisage/grid/{id}/{type}", name="dtc_colisage_liste_grid")
*/
public function gridAction(Request $request, $id = "", $type = "", EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
$repo_objet = $em->getRepository(Commande::class);
$objet = $repo_objet->find($id);
if (is_object($objet)) {
return $this->datatableCommande($objet, $type, $datatable, $translator)->execute();
} else {
return $this->datatable()->execute();
}
}
/**
* @Route("", name="")
*/
public function imprimerMultipleAction(Request $request, EntityManagerInterface $em)
{
$data = $request->get('dataTables');
$ids = $data['actions'];
$tableauPdf = [];
$pdfRelier = 'PDF/COLISAGE/FAC-'.date('d-m-Y').'.pdf';
for ($i = 0; $i < count($ids); $i++) {
$repo = $em->getRepository(Commande::class);
$bon = $repo->find($ids[$i]);
if (is_object($bon)) {
$this->pdfColisageAction($bon, false);
$tableauPdf[] = $chemin_pdf = 'PDF/COLISAGE/FAC-'.$bon->getReference().'.pdf';
}
}
$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$pdfRelier ";
foreach ($tableauPdf as $file) {
$cmd .= $file." ";
}
$result = shell_exec($cmd);
return new JsonResponse(['target' => '_blank', 'url' => '/'.$pdfRelier, 'valide' => '1']);
}
/**
* @Route("/colisage/pdf/{id}", name="dtc_colisage_pdf")
*/
public function pdfColisageAction(Request $request, Colisage $colisage, EntityManagerInterface $em, Pdf $snappy)
{
$societe = $em->getRepository(Societe::class)->find(1);
$date_Y = date("Y");
$date_M = date("m");
$date_D = date("d");
$date = $date_Y.'/'.$date_M.'/'.$date_D;
$chemin_pdf = 'PDF/COLISAGE/'.$date.'/COLIS-'.$colisage->getReference().'.pdf';
if (file_exists($chemin_pdf)) {
unlink($chemin_pdf);
}
//return $this->render('GestionComerciale/Facture/template_pdf.html.twig',array('commande' => $colisage,'societe' => $societe));
$restant = $request->query->get('restant');
//$footer = $this->renderView('FO/PDF/footer_pagination_pdf.html.twig', array('societe' => $societe));
$header = $this->renderView('FO/PDF/header_colisage_pdf.html.twig', ['societe' => $societe, 'colisage' => $colisage, 'dev' =>false]);
//$snappy->setOption('page-size', 'A4');
// $snappy->setOption('header-html', $header);
$snappy->setOption('disable-smart-shrinking', true);
$donnees = [
'colisage' => $colisage,
'societe' => $societe,
];
$template = 'GestionComerciale/Colisage/template_pdf.html.twig';
$snappy->generateFromHtml(
$this->renderView(
$template,
$donnees
),
$chemin_pdf
);
return $this->render('FO/PDF/conteneur_pdf.html.twig', ['objet' => $colisage, 'chemin_pdf' => '/'.$chemin_pdf]);
//return new RedirectResponse("/".$chemin_pdf);
}
/**
* @Route("/vente/colisage/{id}/proposition", name="dtc_colisage_proposition_ajax")
*/
public function propositionAction(Request $request, Commande $bp, EntityManagerInterface $em)
{
$rendu = '';
$colis = [];
$erreurs = [];
$colisModeles = $em->getRepository(ColisModele::class)->findBY([], ['poids' => 'ASC']);
//les articles qui ne passent dans aucun colis de part leur taille.
$erreursHorsGabarit = [];
//les articles qui ne passent dans aucun colis de part leur poids.
$erreursPoids = [];
//les articles dont les données dimensions/poids ne sont pas renseignées.
$erreursRenseignement = [];
$articlesCommandes = $em->getRepository(ArticleCommande::class)->getArticlesCommandesByCommande(['commande' => $bp, 'poidsSort' => 'DESC']);
//carton tmp
$cartons = [];
$newCarton = true;
foreach ($articlesCommandes as $ac) {
$article = $ac->getArticle();
if ( ! $article->getPrestation() && ! $article->getMainOeuvre()) {
$longueurArticle = $article->getProfondeur();
$largeurArticle = $article->getLargeur();
$hauteurArticle = $article->getHauteur();
$poidsArticle = $article->getPoids();
if ($longueurArticle == '' || $largeurArticle == '' || $hauteurArticle == '' || $poidsArticle == '') {
$erreursRenseignement[$ac->getId()] = $ac;
}
if ($newCarton) {
$cartons = $this->addCarton($cartons, $ac, $colisModeles, true);
$newCarton = false;
}
$quantite = $ac->getQuantite();
for ($i = 1; $i <= $quantite; $i++) {
$addCarton = true;
foreach ($cartons as $key => $carton) {
if ($this->verifierDimensions($carton, $article)) {
if (empty($cartons[$key]['acs'][$ac->getId()])) {
$cartons[$key]['acs'][$ac->getId()] = ['ac' => $ac, 'quantite' => 1];
} else {
$cartons[$key]['acs'][$ac->getId()]['quantite'] += 1;
}
$cartons[$key]['poids'] += $poidsArticle;
$cartons[$key]['volume'] += $longueurArticle * $largeurArticle * $hauteurArticle;
$cartons[$key]['nbArticles'] += 1;
$addCarton = false;
break;
}
}
if ($addCarton) {
$cartons = $this->addCarton($cartons, $ac, $colisModeles);
foreach ($cartons as $key => $carton) {
if ($this->verifierDimensions($carton, $article)) {
if (empty($cartons[$key]['acs'][$ac->getId()])) {
$cartons[$key]['acs'][$ac->getId()] = ['ac' => $ac, 'quantite' => 1];
} else {
$cartons[$key]['acs'][$ac->getId()]['quantite'] += 1;
}
$cartons[$key]['poids'] += $poidsArticle;
$cartons[$key]['volume'] += $longueurArticle * $largeurArticle * $hauteurArticle;
$cartons[$key]['nbArticles'] += 1;
//$addCarton = false;
break;
}
}
}
}
}
}
if (count($erreursRenseignement)) {
$erreurs['erreursRenseignement'] = $erreursRenseignement;
}
if (count($erreursPoids)) {
$erreurs['erreursPoids'] = $erreursPoids;
}
if (count($erreursHorsGabarit)) {
$erreurs['erreursHorsGabarit'] = $erreursHorsGabarit;
}
/*
$colisage = array(
'nbArticles'=>2,
'poids' => 4.1,
'articlesCommandes' => $bp->getArticleCommande(),
'typeCarton' => 'A',
);
$colis[] = $colisage;
$colisage = array(
'nbArticles'=>3,
'poids' => 2.7,
'articlesCommandes' => $bp->getArticleCommande(),
'typeCarton' => 'C',
);
$colis[] = $colisage;
'colis'=>$colis,
*/
$rendu = $this->renderView('GestionComerciale/Colisage/proposition.html.twig', ['cartons' => $cartons, 'erreurs' => $erreurs]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '1']);
}
private function verifierDimensions($carton, $article, $quantite = 1)
{
$modele = $carton['modele'];
$volumeCarton = $carton['volume'];
$poidsCarton = $carton['poids'];
$longueurCarton = $modele->getProfondeur();
$largeurCarton = $modele->getLargeur();
$hauteurCarton = $modele->getHauteur();
$poidsMaxCarton = $modele->getPoids();
$volumeMaxCarton = $longueurCarton * $largeurCarton * $hauteurCarton;
$longueurArticle = $article->getProfondeur();
$largeurArticle = $article->getLargeur();
$hauteurArticle = $article->getHauteur() * $quantite;
$poidsArticle = $article->getPoids();
$volumeArticle = $longueurArticle * $largeurArticle * $hauteurArticle * $quantite;
if ($volumeMaxCarton < ($volumeCarton + $volumeArticle)) {
return false;
}
if (($poidsMaxCarton - 0.01) < ($poidsCarton + $poidsArticle)) {
return false;
}
if ($longueurCarton != '' && $largeurCarton != '' && $hauteurCarton != '' && $longueurArticle != '' && $largeurArticle != '' && $hauteurArticle != '') {
//verification dans les 3 axes / 6 possibilités
if ($longueurCarton > $longueurArticle && $largeurCarton > $largeurArticle && $hauteurCarton > $hauteurArticle) {
return true;
}
if ($longueurCarton > $longueurArticle && $largeurCarton > $hauteurArticle && $hauteurCarton > $largeurArticle) {
return true;
}
if ($longueurCarton > $largeurArticle && $largeurCarton > $longueurArticle && $hauteurCarton > $hauteurArticle) {
return true;
}
if ($longueurCarton > $largeurArticle && $largeurCarton > $hauteurArticle && $hauteurCarton > $longueurArticle) {
return true;
}
if ($longueurCarton > $hauteurArticle && $largeurCarton > $longueurArticle && $hauteurCarton > $largeurArticle) {
return true;
}
if ($longueurCarton > $hauteurArticle && $largeurCarton > $largeurArticle && $hauteurCarton > $longueurArticle) {
return true;
}
return false;
}
return false;
}
private function addCarton($cartons, $articleCommande, $colisModeles, $premierCarton = false)
{
$article = $articleCommande->getArticle();
$quantite = $articleCommande->getQuantite();
if ($premierCarton) {
$tmp = [];
foreach ($colisModeles as $colisModele) {
$cartonTmp = [
'modele' => $colisModele,
'volume' => 0,
'poids' => 0,
'nbArticles' => 0,
];
//ajouter le carton acceptant la quantité maximale
for ($i = $quantite; $i > 1; $i--) {
if ($this->verifierDimensions($cartonTmp, $article, $i)) {
//$cartons[] = $cartonTmp;
//return $cartons;
$tmp[$i] = $cartonTmp;
}
}
}
if (count($tmp)) {
$max = max(array_keys($tmp));
$cartons[] = $tmp[$max];
return $cartons;
}
}
foreach ($colisModeles as $colisModele) {
$cartonTmp = [
'modele' => $colisModele,
'volume' => 0,
'poids' => 0,
'nbArticles' => 0,
];
if ($this->verifierDimensions($cartonTmp, $article, $quantite)) {
$cartons[] = $cartonTmp;
return $cartons;
}
}
return $cartons;
}
/**
* @Route("/colisage/pdf-2/{id}", name="dtc_colisage_2_pdf")
*/
public function pdfColisage2Action(Request $request, Colisage $colisage, EntityManagerInterface $em, Pdf $snappy)
{
$societe = $em->getRepository(Societe::class)->find(1);
$date_Y = date("Y");
$date_M = date("m");
$date_D = date("d");
$date = $date_Y.'/'.$date_M.'/'.$date_D;
$chemin_pdf = 'PDF/COLISAGE/'.$date.'/COLIS-'.$colisage->getReference().'.pdf';
if (file_exists($chemin_pdf)) {
unlink($chemin_pdf);
}
//return $this->render('GestionComerciale/Facture/template_pdf.html.twig',array('commande' => $colisage,'societe' => $societe));
$restant = $request->query->get('restant');
//$footer = $this->renderView('FO/PDF/footer_pagination_pdf.html.twig', array('societe' => $societe));
$header = $this->renderView('FO/PDF/header_colisage_2_pdf.html.twig', ['societe' => $societe, 'colisage' => $colisage, 'dev' =>false]);
$snappy->setOption('margin-left', 0);
$snappy->setOption('margin-right', 0);
$snappy->setOption('margin-top', 0);
$snappy->setOption('header-spacing', "4");
$snappy->setOption('footer-spacing', "3");
$snappy->setOption('disable-smart-shrinking', true);
//$snappy->setOption('print-media-type', false );
$snappy->setOption('page-height', "297");
$snappy->setOption('page-width', "210");
$donnees = [
'colisage' => $colisage,
'societe' => $societe,
];
$template = 'GestionComerciale/Colisage/template2_pdf.html.twig';
// $template = 'GestionComerciale/BonLivraison/template_pdf.html.twig';
$snappy->generateFromHtml(
$this->renderView(
$template,
$donnees
),
$chemin_pdf
);
return $this->render('FO/PDF/conteneur_pdf.html.twig', ['objet' => $colisage, 'chemin_pdf' => '/'.$chemin_pdf]);
//return new RedirectResponse("/".$chemin_pdf);
}
}