<?php
namespace App\Controller\GestionComerciale;
use App\Entity\Clients\Client;
use App\Entity\FO\Societe;
use App\Entity\GestionComerciale\ArticleCommande;
use App\Entity\GestionComerciale\Commande;
use App\Entity\GestionComerciale\OrdreRep;
use App\Entity\GestionComerciale\StatutCommande;
use App\Model\GestionCommerciale\TypeDocumentCommercial;
use App\Entity\Projets\Intervention;
use App\Entity\Utilisateur\Utilisateur;
use App\Form\GestionComerciale\OrdreReparationType;
use App\Form\GestionComerciale\OrdreRepType;
use App\Library\Datatable\Util\Datatable;
use App\Security\Voter\EntityVoter;
use App\Service\GestionComerciale\AcompteService;
use App\Service\GestionComerciale\OrdreRepService;
use App\Service\Utilisateur\ColonneTableauService;
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 OrdreRepController extends AbstractController
{
/**
* @Route("/vente/or/nouveau", name="dtc_ordre_reparation_ajouter")
* @Route("/ordre-reparation/nouveau", name="dtc_ordre_reparation_ajouter")
*/
public function ajouterAction(Request $request, EntityManagerInterface $em, OrdreRepService $ordreRepService, TranslatorInterface $translator, ValidatorInterface $validator)
{
set_time_limit(300);
$commande = new Commande();
$commande->setDateBon(null);
$user = $this->getUser();
$commande->setUtilisateur($user);
$bpa = 0;
$clie = "";
$operation = $request->request->get('operation');
$client = $request->get('client');
if ($client != "") {
$repoClient = $em->getRepository(Client::class);
$clie = $repoClient->find($client);
if (is_object($clie)) {
$commande->setClient($clie);
}
}
$form = $this->createForm(OrdreReparationType::class, $commande);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->persist($commande);
$em->flush();
//echo "BBBB ".$request->request->get('operation');
//$articles = array('ids'=>$request->request->get('ids'),'commentaire'=>$request->request->get('commentaire'),'libelles'=>$request->request->get('libelles'),'tva'=>$request->request->get('tva'),'remiseSuppl'=>$request->request->get('remiseSuppl'),'prix'=>$request->request->get('prix'),'qte'=>$request->request->get('qte'));
$articles = [
'ids' => $request->request->get('ids'),
'idArticleCommande' => $request->request->get('idArticleCommande'),
'idArticleCommandeOrigine' => $request->request->get('idArticleCommandeOrigine'),
'remise' => $request->request->get('remise'),
'remiseCalcule' => $request->request->get('remiseCalcule'),
'montantRemise' => $request->request->get('montantRemise'),
'commentaire' => $request->request->get('commentaire'),
'libellesSecondaires' => $request->request->get('libellesSecondaires'),
'libelles' => $request->request->get('libelles'),
'tva' => $request->request->get('tva'),
'remiseSuppl' => $request->request->get('remiseSuppl'),
'prix' => $request->request->get('prix'),
'qte' => $request->request->get('qte'),
'qtePrepa' => $request->request->get('qtePrepa'),
'qteDispo' => $request->request->get('qteDispo'),
'force' => $request->request->get('force'),
'dateCT' => $request->request->get('dateCT'),
'kilometrage' => $request->request->get('kilometrage'),
'commentaireSuppl' => $request->request->get('commentaireSuppl'),
'emplacement' => $request->request->get('emplacement'),
'nbEmplacement' => $request->request->get('nbEmplacement'),
'articlesCommandeRepris' => $request->request->get('articlesCommandeRepris'),
];
if ($operation == 'facture') {
$operation = 'factureDirecte';
}
$valeurs = ["articles" => $articles, 'typeDocument' => 'commande', 'operation' => $operation, 'toggle-devis-devis-or' => ''];
$retour = $ordreRepService->sauvegarderOrdre($commande, $valeurs);
if ($retour['bpa'] == 1) {
$bpa = 1;
}
if ($operation == 'factureDirecte') {
$this->addFlash(
'notice',
$translator->trans('Facture et Ordre de réparation ajoutés avec succès !')
);
return $this->redirectToRoute('dtc_facture_afficher', ["id" => $commande->getFacture()->getId(), 'operation' => $operation]);
}
$this->addFlash(
'notice',
$translator->trans('Ordre de réparation ajouté avec succès !')
);
return $this->redirectToRoute('dtc_ordre_reparation_modifier', ["id" => $commande->getId(), 'operation' => $operation, "bpa" => $bpa, 'forceQteDispo' => true]);
} else {
$errors = $validator->validate($commande);
//echo "PAS VALIDE";
}
}
return $this->render(
'GestionComerciale/OrdreRep/ajouter.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'operation' => $operation, 'client' => $clie, 'forceQteDispo' => true]
);
}
/**
* @Route("/ordre-reparation/modifier/{id}", name="dtc_ordre_reparation_modifier")
*/
public function modifierAction(Request $request, Commande $commande, EntityManagerInterface $em, OrdreRepService $ordreRepService,
AcompteService $serviceAcompte, TranslatorInterface $translator,
ValidatorInterface $validator
) {
set_time_limit(300);
$user = $this->getUser();
$commande->setUtilisateur($user);
$annuler = $request->request->get('annuler');
$forceQteDispo = $request->query->get('forceQteDispo');
if ($annuler == "annuler" || $annuler == "annuler_devis" || $annuler == "annuler_cmde") {
if (is_int($commande->getTypeDocumentCommercial()) and $commande->getTypeDocumentCommercial() == TypeDocumentCommercial::DEVIS0) {
//$commande->setVisible(false);
$this->addFlash(
'notice',
$translator->trans('Devis OR supprimé avec succès!')
);
$em->persist($commande);
$em->flush();
return $this->redirectToRoute('dtc_devis_or_liste');
} else {
$ordreRepService->annuler($commande, $annuler);
$remboursement = $serviceAcompte->proposerRemboursement($commande->getClient());
$this->addFlash(
'notice',
$translator->trans('Ordre de réparation annulé avec succès !')
);
return $this->redirectToRoute('dtc_ordre_reparation_liste', ["r" => $remboursement, "c" => $commande->getClient()->getId()]);
}
}
$form = $this->createForm(OrdreReparationType::class, $commande);
$operation = $request->request->get('operation');
$bpa = $request->query->get('bpa');
if ($operation == "") {
$operation = $request->query->get('operation');
}
//$articles = array('ids'=>$request->request->get('ids'),'qte'=>$request->request->get('qte'),'remise'=>$request->request->get('remise'));
$articles = [
'ids' => $request->request->get('ids'),
'idArticleCommande' => $request->request->get('idArticleCommande'),
'idArticleCommandeOrigine' => $request->request->get('idArticleCommandeOrigine'),
'remise' => $request->request->get('remise'),
'remiseCalcule' => $request->request->get('remiseCalcule'),
'montantRemise' => $request->request->get('montantRemise'),
'commentaire' => $request->request->get('commentaire'),
'libellesSecondaires' => $request->request->get('libellesSecondaires'),
'libelles' => $request->request->get('libelles'),
'tva' => $request->request->get('tva'),
'remiseSuppl' => $request->request->get('remiseSuppl'),
'prix' => $request->request->get('prix'),
'qte' => $request->request->get('qte'),
'qtePrepa' => $request->request->get('qtePrepa'),
'force' => $request->request->get('force'),
'dateCT' => $request->request->get('dateCT'),
'kilometrage' => $request->request->get('kilometrage'),
'commentaireSuppl' => $request->request->get('commentaireSuppl'),
'emplacement' => $request->request->get('emplacement'),
'nbEmplacement' => $request->request->get('nbEmplacement'),
'articlesCommandeRepris' => $request->request->get('articlesCommandeRepris'),
'qteDispo' => $request->request->get('qteDispo'),
];
$valeurs = ["articles" => $articles, 'operation' => $operation, 'toggle-devis-devis-or' => ''];
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($ordreRepService->estEditable($commande)) {
$droit = $this->isGranted(EntityVoter::UPDATE, OrdreRep::class);
if ( ! $droit) {
return $this->redirectToRoute('dtc_ordre_reparation_modifier', ["id" => $commande->getId()]);
}
if ($form->isValid()) {
if ($request->request->get('annuler') != '') {
$ordreRepService->annulerOrdre($commande);
$this->addFlash(
'notice',
$translator->trans('Ordre de réparation annulé avec succès !')
);
return $this->redirectToRoute('dtc_ordre_reparation_liste', ['operation' => $operation]);
}
if ($request->request->get('toggle-devis-devis-or') != '') {
$valeurs['toggle-devis-devis-or'] = 'toggle-devis-devis-or';
}
$em->persist($commande);
$em->flush();
$retour = $ordreRepService->sauvegarderOrdre($commande, $valeurs);
if ($retour['bpa'] == 1) {
$bpa = 1;
} else {
$bpa = 0;
}
if ($operation == "facture") {
$this->addFlash(
'notice',
$translator->trans('Facture sauvegardée avec succès !')
);
$repo_statut_document = $em->getRepository(StatutCommande::class);
$liste_statut = $repo_statut_document->findOneBy(["documentCommercial" => 6, "ordre" => [1]]);
$typeFac = TypeDocumentCommercial::FACTURE;
$repo_fac = $em->getRepository(Commande::class);
$facture = $repo_fac->findOneBy(["commande" => $commande, "typeDocumentCommercial" => $typeFac, "visible" => 1, "statutCommande" => $liste_statut]);
return $this->redirectToRoute('dtc_facture_afficher', ["id" => $facture->getId()]);
} else {
$this->addFlash(
'notice',
$translator->trans('Ordre de réparation sauvegardé avec succès !')
);
//return $this->redirectToRoute('dtc_ordre_reparation_modifier',array("id"=>$commande->getId(),'operation'=>$operation));
if ($request->request->get('toggle-devis-devis-or') != '') {
return $this->redirectToRoute('dtc_devis_modifier', ["id" => $commande->getId(), 'forceQteDispo' => true]);
} else {
return $this->redirectToRoute(
'dtc_ordre_reparation_modifier',
["id" => $commande->getId(), 'operation' => $operation, "bpa" => $bpa, 'forceQteDispo' => true]
);
}
}
} else {
//echo "ERREUR";
$errors = $validator->validate($commande);
//\Doctrine\Common\Util\Debug::dump($errors);
}
} else {
$this->addFlash(
'warning',
"L'ordre de réparation n'est plus éditable !"
);
//return $this->redirectToRoute('dtc_ordre_reparation_modifier',array("id"=>$commande->getId(),'operation'=>$operation));
//echo "<div>PAS EDIT OK</div>";
}
}
if ($bpa == 1) {
$repo_bp = $em->getRepository(Commande::class);
$dernierBpa = $repo_bp->getDernierBonPrepaAtelier($commande);
if (count($dernierBpa) > 0) {
$bpa = $dernierBpa["id"];
}
}
return $this->render(
'GestionComerciale/OrdreRep/ajouter.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'commande' => $commande, 'operation' => $operation, "bpa" => $bpa, 'forceQteDispo' => $forceQteDispo]
);
}
/**
* @Route("/vente/or/nouveau/modal/{id}/{type}", name="dtc_ordre_reparation_ajouter_modal")
*/
public function ajouterModalAction(Request $request, $id, $type = "", EntityManagerInterface $em, OrdreRepService $ordreReprationService, TranslatorInterface $translator,
ValidatorInterface $validator
) {
$titre_modal = $translator->trans("Nouveau OR");
$repo_objet = $em->getRepository(Commande::class);
$objet = $repo_objet->find($id);
$ordreRep = clone $objet;
$ordreRep->setDateBon(new \DateTime());
$user = $this->getUser();
$ordreRep->setUtilisateur($user);
$form = $this->createForm(OrdreRepType::class, $ordreRep);
$errors = "";
$form->handleRequest($request);
$idsArticleCommande = $request->query->get('choixArticles');
$repo_objet = $em->getRepository(Commande::class);
$objet = $repo_objet->find($id);
$ordreRep->setCommande($objet);
$link = $this->generateUrl('dtc_ordre_reparation_ajouter', ['id' => $objet->getId(), 'type' => 'commande']);
$articleCommande = $em->getRepository(ArticleCommande::class)->listeArticleCommandeSelectionne($idsArticleCommande);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$url = $this->generateUrl('dtc_commande_modifier', ['id' => $objet->getId(), 'tab' => 'or']);
$articles = [
'idArticleCommande' => $request->request->get('idArticleCommande'),
'quantiteInit' => $request->request->get('quantiteInit'),
'quantite' => $request->request->get('quantite'),
];
$valeurs = ["articles" => $articles];
$ordreReprationService->sauvegarder($ordreRep, $valeurs);
$this->addFlash(
'notice',
$translator->trans('Ordre de réparation ajouté avec succès !')
);
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
} else {
$errors = $validator->validate($ordreRep);
$rendu = $this->renderView(
'GestionComerciale/OrdreRep/ajouter_modal.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'articleCommande' => $articleCommande]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView(
'GestionComerciale/OrdreRep/ajouter_modal.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'articleCommande' => $articleCommande]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'link' => $link, 'titre' => $titre_modal]);
}
/**
* @Route("/vente/or", name="dtc_ordre_reparation_liste")
* @Route("/ordre-reparation", name="dtc_ordre_reparation_liste")
*/
public function listerAction(Request $request, $id = "0", $type = "a", EntityManagerInterface $em, ColonneTableauService $serviceColonneTableau, Datatable $datatable,
TranslatorInterface $translator
) {
$repo_objet = $em->getRepository(Commande::class);
$objet = $repo_objet->find($id);
$param = $request->query->all();
if (is_object($objet)) {
$this->datatableCommande($datatable, $translator,$objet, $type);
return $this->render('GestionComerciale/OrdreRep/lister_commande.html.twig', ["id" => $id, "type" => $type, 'parametres' => $param]);
} else {
$statutCommande = $request->query->get('statutCommande');
$tableau_class_cellule[] = ["className" => "colonne_id", "targets" => [0], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [1],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "id"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [2],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "reference"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [3],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "date"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [4],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "statutCommande"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [5],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "refclient"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [6],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "client"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [7],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "rdv"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [8],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "equipier"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [9],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "immat"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [10],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "marque"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [11],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "modele"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [12],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "km"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [13],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "serie"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [14],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "commentaire"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [15],
"visible" => $serviceColonneTableau->getColonneUtilisateur(OrdreRep::class, "refCli"),
];
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [16], "visible" => true];
$this->datatable($request, $datatable, $translator);
return $this->render(
'GestionComerciale/OrdreRep/lister.html.twig',
["id" => $id, "type" => $type, 'tableauClassColonne' => $tableau_class_cellule, 'statutCommande' => $statutCommande, 'parametres' => $param]
);
}
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatable(Request $request, Datatable $datatable, TranslatorInterface $translator)
{
$param = $request->query->all();
$datatable->setEntity(Commande::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Réf") => 'x.reference',
$translator->trans("Date") => 'x.date',
$translator->trans("Statut") => 'sc.id',
$translator->trans("Réf client") => 'c.reference',
$translator->trans("Client") => 'c.nom',
$translator->trans("RDV ") => 'x.dateBon',
$translator->trans("Équipier") => 'u.reference',
$translator->trans("Immat") => 'v.immatriculation',
$translator->trans("Marque") => 'm.libelle',
$translator->trans("Modèle") => 'mo.libelle',
$translator->trans("Km") => 'v.kilometrage',
$translator->trans("Num serie") => 'v.numSerie',
$translator->trans("Comm") => 'x.commentaire',
$translator->trans("Réf cmde cli") => 'x.referenceClient',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.vehiculesClient', 'v', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('v.marque', 'm', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.statutCommande', 'sc', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('v.modele', 'mo', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.etatCommande', 'ec', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.client', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.utilisateur', 'u', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.facture', 'f', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_ordre_reparation_modifier',
],
],
1 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_ordre_reparation_modifier',
],
],
2 => [
'view' => 'FO/DataTable/heure.html.twig',
],
3 => [
'view' => 'FO/DataTable/statut-commande-fournisseur.html.twig',
],
4 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_client_modifier',
'typeDocument' => 'client',
],
],
5 => [
'view' => 'FO/DataTable/client.html.twig',
'params' => [],
],
6 => [
'view' => 'FO/DataTable/heure.html.twig',
],
7 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_utilisateur_modifier',
'typeDocument' => 'equipier',
],
],
9 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_vehicule_marque_modifier',
'typeDocument' => 'marqueVehiculeOr',
],
],
10 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_vehicule_modele_modifier',
'typeDocument' => 'modeleVehiculeOr',
],
],
13 => [
'view' => 'FO/DataTable/commentaire.html.twig',
],
15 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
'edit_route' => 'dtc_ordre_reparation_modifier',
//'supprimer_route' => 'dtc_commande_supprimer',
'objet' => Commande::class,
'deplier' => true,
],
],
]
)
->setMultiple(
[
'delete' => [
'title' => 'Non disponible',
'route' => 'dtc_commande_liste_supprimer',
],
]
)
->setOrder("x.date", "desc")
//->setOrder("ec.ordre", "desc")
->setSearch(true)
->setSearchFields([1, 3, 4, 5, 8, 9, 10, 12]);
$where = '';
$parameters = [];
if (is_object($request)) {
$statutCommande = $request->query->get('statutCommande');
if ($statutCommande == '' || $statutCommande == '19') {
if ($where != '') {
$where .= ' AND ';
}
$where .= 'sc.id IN (:statutCommande) AND x.typeDocumentCommercial = :typeDocumentCommercial';//AND f.id IS NULL
$parameters['statutCommande'] = [14, 15];
$parameters['typeDocumentCommercial'] = 3;
} else {
if ($where != '') {
$where .= ' AND ';
}
$where .= 'sc.id = :statutCommande AND x.typeDocumentCommercial = :typeDocumentCommercial';
$parameters['statutCommande'] = $statutCommande;
$parameters['typeDocumentCommercial'] = 3;
}
} else {
$where .= 'sc.id IN (:statutCommande) AND x.typeDocumentCommercial = :typeDocumentCommercial AND f.id IS NULL';
$parameters['statutCommande'] = [14, 15];
$parameters['typeDocumentCommercial'] = 3;
}
if (array_key_exists('parametres', $param)) {
if (array_key_exists('client', $param["parametres"]) and $param["parametres"]["client"] > 0) {
//$datatable->addJoin('x.client', 'client', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$parameters["client"] = $param["parametres"]["client"];
if ($where != "") {
$where .= " AND ";
}
$where .= "c.id = :client";
}
if (array_key_exists('client', $param["parametres"]) and $param["parametres"]["date_debut"] != "") {
$param["parametres"]["date_debut"] = \DateTime::createFromFormat('d/m/Y', $param["parametres"]["date_debut"]);
$param["parametres"]["date_debut"]->setTime(00, 00, 00);
$parameters["date_debut"] = $param["parametres"]["date_debut"];
if ($where != "") {
$where .= " AND ";
}
$where .= "x.date >= :date_debut";
}
if (array_key_exists('client', $param["parametres"]) and $param["parametres"]["date_fin"] != "") {
$param["parametres"]["date_fin"] = \DateTime::createFromFormat('d/m/Y', $param["parametres"]["date_fin"]);
$param["parametres"]["date_fin"]->setTime(23, 59, 59);
$parameters["date_fin"] = $param["parametres"]["date_fin"];
if ($where != "") {
$where .= " AND ";
}
$where .= "x.date <= :date_fin";
}
}
//echo $where;
if ($where != '') {
//echo $where;
$datatable->setWhere($where, $parameters);
}
//$datatable->setSearchFields(array(0,2));
return $datatable;
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatableCommande(Datatable $datatable, TranslatorInterface $translator, $objet, $type = "")
{
$type_jointure = 'x.'.$type;
$datatable->setDatatableId('dta-or')
->setEntity(Commande::class, "x")
->setFields(
[
$translator->trans("ID") => 'x.id',
$translator->trans("Réf") => 'x.reference',
$translator->trans("Véhicule") => 'vc.id',
$translator->trans("Date") => 'x.dateBon',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
//->addJoin('x.client', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.vehiculesClient', 'vc', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('vc.marque', 'ma', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('vc.modele', 'm', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
/*->setWhere(
$type_jointure.' = :objet',
array('objet' => $objet)
)
*/
->setWhere(
'x.commande = :objet AND x.typeDocumentCommercial = :typeDocumentCommercial',
['objet' => $objet, 'typeDocumentCommercial' => TypeDocumentCommercial::ORDREREPARATION]
)
->setRenderers(
[
2 => [
'view' => 'FO/DataTable/vehicule_client.html.twig',
'params' => [
'objet' => $objet,
],
],
3 => [
'view' => 'FO/DataTable/date.html.twig',
'params' => [],
],
4 => [
'view' => 'FO/DataTable/actions_modal.html.twig',
'params' => [
//'edit_route' => 'dtc_ordre_reparation_modifier',
//'supprimer_route' => 'dtc_ordre_reparation_supprimer',
'pdf_route' => 'dtc_ordre_reparation_pdf',
'id' => $objet->getId(),
'type' => $type,
'entite' => 'ordreRep',
'objet' => Commande::class,
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)//->setSearchFields(array(1,2))
;
return $datatable;
}
/**
* Grid action
* @return Response
*/
/**
* @Route("/vente/or/grid/{id}/{type}", name="dtc_ordre_reparation_liste_grid")
* @Route("/ordre-reparation/grid", name="dtc_ordre_reparation_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($datatable, $translator,$objet, $type)->execute();
} else {
return $this->datatable($request, $datatable, $translator)->execute();
}
}
/**
* Grid action
* @return Response
*/
/**
* @Route("/or/pdf/{id}", name="dtc_ordre_reparation_pdf")
*/
public function pdfOrdreReparationAction(Request $request, Commande $ordreRepration, EntityManagerInterface $em, Pdf $snappy)
{
$prix = $request->query->get('prix');
$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/OR/'.$date.'/OR-'.$ordreRepration->getReference().'.pdf';
if (file_exists($chemin_pdf)) {
unlink($chemin_pdf);
}
//return $this->render('GestionComerciale/OrdreRep/template_pdf.html.twig',array('commande' => $ordreRepration,'societe' => $societe));
$footer = $this->renderView('FO/PDF/footer_pagination_pdf.html.twig', ['societe' => $societe]);
$header = $this->renderView('FO/PDF/header_or_pdf.html.twig', ['societe' => $societe, 'commande' => $ordreRepration]);
//return $header;
//$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',"2");
//$snappy->setOption('zoom', 1 );
//$snappy->setOption('dpi', 300 );
$reference = $request->query->get('reference');
$snappy->generateFromHtml(
$this->renderView(
'GestionComerciale/OrdreRep/template_pdf.html.twig',
[
'commande' => $ordreRepration,
'societe' => $societe,
'prix' => $prix,
'reference' => $reference,
]
),
$chemin_pdf
);
return $this->render('FO/PDF/conteneur_pdf.html.twig', ['objet' => $ordreRepration, 'chemin_pdf' => '/'.$chemin_pdf]);
//return new RedirectResponse("/".$chemin_pdf);
}
/**
* @Route("/vente/or/imprimer/multiple", name="dtc_ordre_reparation_pdf_multiple")
*/
public function imprimerMultipleAction(Request $request, EntityManagerInterface $em, Pdf $snappy)
{
$data = $request->get('dataTables');
$ids = $data['actions'];
$tableauPdf = [];
$pdfRelier = 'PDF/OR/OR-'.date('d-m-Y').'.pdf';
//$ids = array("118","101","93");
for ($i = 0; $i < count($ids); $i++) {
$repo = $em->getRepository(Commande::class);
$bon = $repo->find($ids[$i]);
if (is_object($bon)) {
$this->pdfOrdreReparationAction($request, $bon, $em, $snappy);
$tableauPdf[] = $chemin_pdf = 'PDF/OR/OR-'.$bon->getReference().'.pdf';
}
}
$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$pdfRelier ";
foreach ($tableauPdf as $file) {
$cmd .= $file." ";
}
//echo "<div>".$cmd."</div>";
$result = shell_exec($cmd);
return new JsonResponse(['target' => '_blank', 'url' => '/'.$pdfRelier, 'valide' => '1']);
}
/**
* @Route("/ordre-reparation/suivi-main-oeuvre", name="dtc_ordre_reparation_suivi_mo_liste")
*/
public function suiviMainOeuvreAction(Request $request, EntityManagerInterface $em, ColonneTableauService $serviceColonneTableau, Datatable $datatable, TranslatorInterface $translator)
{
$repo_utilisateur = $em->getRepository(Utilisateur::class);
$repo_interventions = $em->getRepository(Intervention::class);
$repo_commande = $em->getRepository(Commande::class);
$mecanicien = 0;
$mecanicienId = 0;
$dateDebut = new \DateTime('first day of');
$dateFin = new \DateTime();
$dateFinPlusUn = new \DateTime();
if ($request->getMethod() == 'POST') {
$dateDebutRequest = $request->request->get('dateDebut');
$dateFinRequest = $request->request->get('dateFin');
$mecanicien = $request->request->get('mecanicien');
$dateDebut = date_create_from_format('d/m/Y', $dateDebutRequest);
$dateFin = date_create_from_format('d/m/Y', $dateFinRequest);
$dateFinPlusUn = date_create_from_format('d/m/Y', $dateFinRequest);
$dateDebut->setTime(00, 00, 00);
$dateFin->setTime(23, 59, 59);
$dateFinPlusUn->setTime(23, 59, 59);
}
$interval = new \DateInterval('P1D');
$dateFinPlusUn->add($interval);
$mecanos = $repo_utilisateur->findByType(4);
if ($mecanicien != 0 && $mecanicien != '') {
$mecanicien = $repo_utilisateur->find($mecanicien);
if (is_object($mecanicien)) {
$nbMecanos = 1;
$mecanicienId = $mecanicien->getId();
}
} else {
$nbMecanos = count($mecanos);
}
//Nbre de jours ouvrables sur la période * 7h * nombre de mécanos
$nbHFacturables = $this->get_nb_open_days(strtotime($dateDebut->format('Y-m-d')), strtotime($dateFin->format('Y-m-d'))) * 7 * $nbMecanos;
//Nombre heures travaillees sur la période = somme des des durees interventions dont la date d'intervention est dans la période
$nbHPassees = max(0, $repo_interventions->getTotalTempsInterventionDsPeriode($dateDebut, $dateFin, $mecanicien));
//Nombre d'heures de mo sur les factures de la période
$nbHFacturees = max(0, $repo_commande->getTotalHeuresFactureesDsPeriode($dateDebut, $dateFin, $mecanicienId));
if (is_numeric($nbHFacturees) && $nbHPassees != 0) {
$taux = $nbHFacturees / $nbHPassees;
} else {
$taux = '';
}
$tableau_class_cellule = [];
// $tableau_class_cellule[]=array("className"=>"visible_export colonne_id","targets"=>array(0),"visible"=>true,"orderable"=>false);
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [0],
// TODO CHANGE THIS
"visible" => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi", "date"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [1],
"visible" => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi", "numero"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [2],
"visible" => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi", "nom"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [3],
"visible" => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi", "heure"),
];
$tableau_class_cellule[] = [
"className" => "visible_export colonne_id",
"targets" => [4],
"visible" => $serviceColonneTableau->getColonneUtilisateur("DTCGestionComercialeBundle:Suivi", "heurefac"),
];
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [5], "visible" => true];
//$tableau_class_cellule[]=array("className"=>"colonne_id","targets"=>array(4),"visible"=>$serviceColonneTableau->getColonneUtilisateur(OrdreRep::class,"client"));
//$tableau_class_cellule[]=array("className"=>"colonne_id","targets"=>array(5),"visible"=>$serviceColonneTableau->getColonneUtilisateur(OrdreRep::class,"heuresPassees"));
//$tableau_class_cellule[]=array("className"=>"colonne_id","targets"=>array(6),"visible"=>$serviceColonneTableau->getColonneUtilisateur(OrdreRep::class,"heuresFacturees"));
$this->datatableSuiviMainOeuvre($datatable, $translator, $mecanicienId, $dateDebut->format('Y-m-d'), $dateFinPlusUn->format('Y-m-d'));
return $this->render('GestionComerciale/OrdreRep/lister-suivi-main-oeuvre.html.twig', [
'tableauClassColonne' => $tableau_class_cellule,
'nbHFacturables' => $nbHFacturables,
'nbHPassees' => $nbHPassees,
'nbHFacturees' => $nbHFacturees,
'taux' => $taux,
'dateDebut' => $dateDebut,
'dateFin' => $dateFin,
'dateFinPlusUn' => $dateFinPlusUn,
'mecanos' => $mecanos,
'mecanicien' => $mecanicien,
'mecanicienId' => $mecanicienId,
]);
}
private function datatableSuiviMainOeuvre(Datatable $datatable, TranslatorInterface $translator, $mecanicien = null, $dateDebut = null, $dateFin = null)
{
$where = "x.typeDocumentCommercial = :typeDocumentCommercial";
$parameters = ['typeDocumentCommercial' => TypeDocumentCommercial::ORDREREPARATION];
if ($dateDebut != null && $dateFin != null) {
$where .= " and x.dateBon >= :dateDebut and x.dateBon < :dateFin";
$parameters['dateDebut'] = $dateDebut;
$parameters['dateFin'] = $dateFin;
}
$datatable->setDatatableId('dta-or')
->setEntity(Commande::class, "x")
->setFields(
[
//$translator->trans("ID") => 'x.id',
$translator->trans("Date OR") => 'x.dateBon',
$translator->trans("Numéro OR") => 'x.reference',
$translator->trans("Nom client") => 'c.id',
$translator->trans("Nombre heures passées") => 'x.tempsPasse',
$translator->trans("Nombre heures facturées") => 'x.id',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.client', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('vc.marque', 'ma', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
//->addJoin('vc.modele', 'm', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
/*->setWhere(
$type_jointure.' = :objet',
array('objet' => $objet)
)
*/
;
if ($mecanicien != null && $mecanicien != 0) {
$where .= ' and m.id = :mecanicien';
$parameters['mecanicien'] = $mecanicien;
$datatable->addJoin('x.interventions', 'i', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('i.mecanicien', 'm', \Doctrine\ORM\Query\Expr\Join::INNER_JOIN);
}
$datatable->setWhere($where, $parameters)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/heure.html.twig',
],
1 => [
'view' => 'FO/DataTable/avec_lien_edit_route.html.twig',
'params' => [
'edit_route' => 'dtc_ordre_reparation_modifier',
],
],
2 => [
'view' => 'FO/DataTable/prenom_nom.html.twig',
'params' => [
'typeUtilisateur' => 'client',
],
],
3 => [
'view' => 'FO/DataTable/num2chiffres.html.twig',
],
4 => [
'view' => 'FO/DataTable/heures_facturees.html.twig',
],
5 => [
'view' => 'FO/DataTable/actions_modal.html.twig',
'params' => [
//'edit_route' => 'dtc_ordre_reparation_modifier',
//'supprimer_route' => 'dtc_ordre_reparation_supprimer',
'pdf_route' => 'dtc_ordre_reparation_pdf',
'entite' => 'ordreRep',
'objet' => Commande::class,
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setGroupBy('x.id')
->setSearchFields([1, 2, 3, 4]);
return $datatable;
}
/**
* @Route("/ordre-reparation/suivi-main-oeuvre/grid", name="dtc_ordre_reparation_suivi_mo_liste_grid")
*/
public function suiviMainOeuvreGridAction(Request $request, Datatable $datatable, TranslatorInterface $translator)
{
$mecanicien = $request->query->get('mecanicien');
$dateDebut = $request->query->get('dateDebut');
$dateFin = $request->query->get('dateFin');
return $this->datatableSuiviMainOeuvre($datatable, $translator, $mecanicien, $dateDebut, $dateFin)->execute();
}
// Fonction permettant de compter le nombre de jours ouvrés entre deux dates
public function get_nb_open_days($date_start, $date_stop)
{
$arr_bank_holidays = []; // Tableau des jours feriés
// On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée
$diff_year = date('Y', $date_stop) - date('Y', $date_start);
for ($i = 0; $i <= $diff_year; $i++) {
$year = (int)date('Y', $date_start) + $i;
// Liste des jours feriés
$arr_bank_holidays[] = '1_1_'.$year; // Jour de l'an
$arr_bank_holidays[] = '1_5_'.$year; // Fete du travail
$arr_bank_holidays[] = '8_5_'.$year; // Victoire 1945
$arr_bank_holidays[] = '14_7_'.$year; // Fete nationale
$arr_bank_holidays[] = '15_8_'.$year; // Assomption
$arr_bank_holidays[] = '1_11_'.$year; // Toussaint
$arr_bank_holidays[] = '11_11_'.$year; // Armistice 1918
$arr_bank_holidays[] = '25_12_'.$year; // Noel
// Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote
$easter = easter_date($year);
$arr_bank_holidays[] = date('j_n_'.$year, $easter + 86400); // Paques
$arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400 * 39)); // Ascension
$arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400 * 50)); // Pentecote
}
//print_r($arr_bank_holidays);
$nb_days_open = 0;
// Mettre <= si on souhaite prendre en compte le dernier jour dans le décompte
while ($date_start < $date_stop) {
// Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on incrémente les jours ouvrés
if ( ! in_array(date('w', $date_start), [0, 6])
&& ! in_array(date('j_n_'.date('Y', $date_start), $date_start), $arr_bank_holidays)) {
$nb_days_open++;
}
$date_start = mktime(date('H', $date_start), date('i', $date_start), date('s', $date_start), date('m', $date_start), date('d', $date_start) + 1, date('Y', $date_start));
}
return $nb_days_open;
}
}