<?php
namespace App\Controller\Utilisateur;
use App\Entity\Clients\Client;
use App\Entity\Fournisseurs\Fournisseur;
use App\Entity\Kanban\FicheContact;
use App\Entity\Transporteurs\Transporteur;
use App\Entity\Utilisateur\Contact;
use App\Form\Utilisateur\ContactType;
use App\Form\Utilisateur\SupprimerContactType;
use App\Library\Datatable\Util\Datatable;
use App\Security\Voter\EntityVoter;
use App\Service\Clients\ClientService;
use App\Service\Fournisseurs\FournisseurService;
use Doctrine\ORM\EntityManagerInterface;
use JMS\Serializer\SerializerBuilder;
use Knp\Component\Pager\PaginatorInterface;
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 ContactController extends AbstractController
{
/**
* @Route("/contact/nouveau/{id}/{type}", name="dtc_contact_ajouter")
*/
public function ajouterAction(Request $request, $id, $type = "", EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator,
FournisseurService $fournisseurService, ClientService $clientService
) {
$titre_modal = $translator->trans("Nouveau contact");
$contact = new Contact();
$user = $this->getUser();
$contact->setUtilisateur($user);
$form = $this->createForm(ContactType::class, $contact);
$errors = "";
$form->handleRequest($request);
$get = $request->query->all();
$typeForm = "";
$liste = "";
$id_contact = "";
$libelle = "";
if ($form->isSubmitted()) {
if ($form->isValid()) {
if ($type == 'commande') {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
$contact->setClient($objet);
$url = "";
$typeForm = "contact";
if (array_key_exists('liste', $get) && $get["liste"] != "") {
$liste = $get["liste"];
}
} elseif ($type == 'client') {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
$contact->setClient($objet);
$url = $this->generateUrl('dtc_client_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
} elseif ($type == 'transporteur') {
$repo_objet = $em->getRepository(Transporteur::class);
$objet = $repo_objet->find($id);
$contact->setTransporteur($objet);
$url = $this->generateUrl('dtc_transporteur_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
} elseif ($type == 'fournisseur') {
$repo_objet = $em->getRepository(Fournisseur::class);
$objet = $repo_objet->find($id);
$contact->setFournisseur($objet);
$url = $this->generateUrl('dtc_fournisseur_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
}
/*
if(count($objet->getContacts())>0) {
foreach($objet->getContacts() as $c)
{
if($c->getId() != $contact->getId() and $contact->getDefaut() == true) {
$c->setDefaut(false);
$em->persist($c);
}
if($c->getId() != $contact->getId() and $contact->getFacturationExpeditionDefaut() == true) {
$c->setFacturationExpeditionDefaut(false);
$em->persist($c);
}
}
}
*/
$em->persist($contact);
$em->flush();
$em->refresh($contact);
$libelle = trim($contact->getPrenom()." ".$contact->getNom());
if ($type == 'fournisseur') {
$message_historique = [];
$message_historique["titre"] = "Création d'un contact";
$message_historique["message"] = $libelle." (id : ".$contact->getId().")";
$fournisseurService->creerHistorique($objet, 'defaut', $message_historique);
} elseif ($type == 'client') {
$message_historique = [];
$message_historique["titre"] = "Création d'un contact";
$message_historique["message"] = $libelle." (id : ".$contact->getId().")";
$clientService->creerHistorique($objet, 'defaut', $message_historique);
}
if (is_object($objet)) {
$this->majContactParDefaut($contact, $objet, $em);
}
if (array_key_exists('table', $get) && $get["table"] != "") {
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => 'recharger_datatable', 'id_datatable' => $get["table"]]);
} else {
if ($type != 'commande') {
$this->addFlash('notice', $translator->trans('Contact ajouté avec succès !'));
}
return new JsonResponse(
['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => $typeForm, 'liste' => $liste, 'libelle' => $libelle, 'id_contact' => $contact->getId()]
);
}
} else {
$errors = $validator->validate($contact);
$rendu = $this->renderView('Utilisateur/Contact/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Utilisateur/Contact/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
//return $this->render('Utilisateur/Contact/ajouter.html.twig', array('form' => $form->createView(),'errors'=>$errors,'id'=>$id,'type'=>$type));
}
/**
* @Route("/contact/modifier/{objet}/{id}/{type}", name="dtc_contact_modifier")
*/
public function modifierAction(Request $request, Contact $objet, $id, $type, EntityManagerInterface $em, TranslatorInterface $translator,
ValidatorInterface $validator, FournisseurService $fournisseurService, ClientService $clientService
) {
$contact = $objet;
$titre_modal = $translator->trans("Modifier contact");
$get = $request->query->all();
$user = $this->getUser();
$contact->setUtilisateur($user);
$form = $this->createForm(ContactType::class, $contact);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
$droit = $this->isGranted(EntityVoter::UPDATE, Contact::class);
if ( ! $droit) {
$rendu = $this->renderView('Utilisateur/Contact/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
if ($form->isValid()) {
if ($type == 'client') {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
$contact->setClient($objet);
$url = $this->generateUrl('dtc_client_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
} elseif ($type == 'transporteur') {
$repo_objet = $em->getRepository(Transporteur::class);
$objet = $repo_objet->find($id);
$contact->setTransporteur($objet);
$url = $this->generateUrl('dtc_transporteur_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
} elseif ($type == 'fournisseur') {
$repo_objet = $em->getRepository(Fournisseur::class);
$objet = $repo_objet->find($id);
$contact->setFournisseur($objet);
$url = $this->generateUrl('dtc_fournisseur_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
}
/*
if(count($objet->getContacts())>0) {
foreach($objet->getContacts() as $c)
{
if($c->getId() != $contact->getId() and $contact->getDefaut() == true) {
$c->setDefaut(false);
$em->persist($c);
}
}
}
*/
$em->persist($contact);
$em->flush();
$libelle = trim($contact->getPrenom()." ".$contact->getNom()." (".$contact->getEmail().")");
if ($type == 'fournisseur') {
$message_historique = [];
$message_historique["titre"] = "Modification d'un contact";
$message_historique["message"] = $libelle." (id : ".$contact->getId().")";
$fournisseurService->creerHistorique($objet, 'defaut', $message_historique);
} elseif ($type == 'client') {
$message_historique = [];
$message_historique["titre"] = "Modification d'un contact";
$message_historique["message"] = $libelle." (id : ".$contact->getId().")";
$clientService->creerHistorique($objet, 'defaut', $message_historique);
}
if (is_object($objet)) {
$this->majContactParDefaut($contact, $objet, $em);
}
if (array_key_exists('table', $get) && $get["table"] != "") {
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => 'recharger_datatable', 'id_datatable' => $get["table"]]);
} else {
$this->addFlash('notice', $translator->trans('Contact modifié avec succès !'));
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
}
} else {
$errors = $validator->validate($contact);
$rendu = $this->renderView(
'Utilisateur/Contact/ajouter.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'contact' => $contact]
);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('Utilisateur/Contact/ajouter.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'contact' => $contact]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("", name="")
*/
public function listerAction(Request $request, $id, $type = "", EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
if ($type == 'client') {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
} elseif ($type == 'transporteur') {
$repo_objet = $em->getRepository(Transporteur::class);
$objet = $repo_objet->find($id);
} elseif ($type == 'fournisseur') {
$repo_objet = $em->getRepository(Fournisseur::class);
$objet = $repo_objet->find($id);
}
$tableau_class_cellule = [];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [0], "visible" => true, "orderable" => true, "searchable" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [1], "visible" => true, "orderable" => true, "searchable" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [2], "visible" => true, "orderable" => true, "searchable" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [3], "visible" => true, "orderable" => true, "searchable" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [4], "visible" => true, "orderable" => true, "searchable" => true];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id", "targets" => [5], "visible" => true, "orderable" => true, "searchable" => true];
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [6], "visible" => true, "orderable" => true];
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [7], "visible" => true, "orderable" => true];
$tableau_class_cellule[] = ["orderable" => false, "className" => "colonne_id", "targets" => [8], "visible" => true, "orderable" => false];
$this->datatable($datatable, $translator, $objet, $type);
return $this->render('Utilisateur/Contact/lister.html.twig', ['tableauClassColonne' => $tableau_class_cellule, "id" => $id, "type" => $type]);
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatable(Datatable $datatable, TranslatorInterface $translator, $objet, $type = "")
{
$type_jointure = 'x.'.$type;
$datatable->setDatatableId('dta-contacts')
->setEntity(Contact::class, "x")
->setFields(
[
//$translator->trans("ID") => 'x.id',
$translator->trans("Civilité") => 'c.libelle',
$translator->trans("Prénom") => 'x.prenom',
$translator->trans("Nom") => 'x.nom',
$translator->trans("Fonction") => 'x.fonction',
$translator->trans("Service") => 's.libelle',
$translator->trans("Email") => 'x.email',
$translator->trans("Téléphone") => 'x.telephone',
$translator->trans("Expédition Fac") => 'x.facturationExpeditionDefaut',
$translator->trans("Défaut") => 'x.defaut',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
->addJoin('x.civilite', 'c', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->addJoin('x.serviceObj', 's', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->setWhere(
$type_jointure.' = :objet',
['objet' => $objet]
)
->setRenderers(
[
/*0 => array(
'view' => 'FO/DataTable/edit_texte.html.twig',
'params' => array(
'objet' => 'DTCUtilisateurBundle:Contact',
'champ' => 'setPrenom',
),
),
1 => array(
'view' => 'FO/DataTable/edit_texte.html.twig',
'params' => array(
'objet' => 'DTCUtilisateurBundle:Contact',
'champ' => 'setNom',
),
),
2 => array(
'view' => 'FO/DataTable/edit_texte.html.twig',
'params' => array(
'objet' => 'DTCUtilisateurBundle:Contact',
'champ' => 'setEmail',
),
),
3 => array(
'view' => 'FO/DataTable/edit_texte.html.twig',
'params' => array(
'objet' => 'DTCUtilisateurBundle:Contact',
'champ' => 'setTelephone',
),
), */
7 => [
'view' => 'FO/DataTable/booleen.html.twig',
],
8 => [
'view' => 'FO/DataTable/booleen.html.twig',
],
9 => [
'view' => 'FO/DataTable/actions_modal.html.twig',
'params' => [
'edit_route' => 'dtc_contact_modifier',
'supprimer_route' => 'dtc_contact_supprimer',
'id' => $objet->getId(),
'type' => $type,
'entite' => 'contact',
'table' => 'dta-contacts',
'objet' => Contact::class,
],
],
]
)
->setOrder("x.id", "desc")
->setSearch(true)
->setSearchFields([0, 1, 2, 3, 4, 5]);
return $datatable;
}
/**
* Grid action
* @return Response
*/
/**
* @Route("/contact/grid/{id}/{type}", name="dtc_contact_liste_grid")
*/
public function gridAction(Request $request, $id = "", $type = "", EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
if ($type == 'client') {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
} elseif ($type == 'transporteur') {
$repo_objet = $em->getRepository(Transporteur::class);
$objet = $repo_objet->find($id);
} elseif ($type == 'fournisseur') {
$repo_objet = $em->getRepository(Fournisseur::class);
$objet = $repo_objet->find($id);
}
return $this->datatable($datatable, $translator, $objet, $type)->execute();
}
/**
* @Route("/contact/client/{id}", name="dtc_liste_contact_client")
*/
public function listerContactClientAction(Request $request, Client $client, EntityManagerInterface $em)
{
$options = '';
$optionsVehicule = '';
$pro = "0";
$cpt = 0;
$repo_client = $em->getRepository(Client::class);
foreach ($client->getContacts() as $contact) {
$libelleAdresse = "";
$libelleAdresse .= $contact->getPrenom().' '.$contact->getNom();
$options .= '<option value="'.$contact->getId().'">'.$libelleAdresse.'</option>';
$cpt++;
}
return new JsonResponse(['options' => $options]);
}
/**
* @Route("/contact/supprimer/{objet}/{id}/{type}", name="dtc_contact_supprimer")
*/
public function supprimerAction(Request $request, Contact $objet, $id, $type, EntityManagerInterface $em, TranslatorInterface $translator, ValidatorInterface $validator)
{
$contact = $objet;
$titre_modal = $translator->trans("Demande de confirmation");
$get = $request->query->all();
$user = $this->getUser();
$form = $this->createForm(SupprimerContactType::class, $contact);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
/*$em = $em;
$em->remove($contact);
$em->flush();
$this->addFlash(
'notice',
$translator->trans('Adresse supprimée avec succès !')
);*/
if ($type == 'client') {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
$contact->setClient(null);
$em->persist($contact);
$em->flush();
$url = $this->generateUrl('dtc_client_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
} elseif ($type == 'transporteur') {
$repo_objet = $em->getRepository(Transporteur::class);
$objet = $repo_objet->find($id);
$contact->setTransporteur(null);
$em->persist($contact);
$em->flush();
$url = $this->generateUrl('dtc_transporteur_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
} elseif ($type == 'fournisseur') {
$repo_objet = $em->getRepository(Fournisseur::class);
$objet = $repo_objet->find($id);
$contact->setFournisseur(null);
$em->persist($contact);
$em->flush();
$url = $this->generateUrl('dtc_fournisseur_modifier', ['id' => $objet->getId(), 'tab' => 'contacts']);
}
if (array_key_exists('table', $get) && $get["table"] != "") {
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url, 'type' => 'recharger_datatable', 'id_datatable' => $get["table"]]);
} else {
$this->addFlash('notice', $translator->trans('Contact supprimé avec succès !'));
return new JsonResponse(['rendu' => '', 'valide' => '1', 'url' => $url]);
}
} else {
$errors = $validator->validate($contact);
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'objet' => $objet]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
}
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'objet' => $objet]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
public function majContactParDefaut($contact, $objet, EntityManagerInterface $em)
{
if (method_exists($objet, 'getContacts') && ($contact->getDefaut() == 1 || $contact->getFacturationExpeditionDefaut() == 1)) {
foreach ($objet->getContacts() as $cont) {
if ($contact->getDefaut() == 1 && $contact->getId() != $cont->getId()) {
$cont->setDefaut(false);
}
if ($contact->getFacturationExpeditionDefaut() == 1 && $contact->getId() != $cont->getId()) {
$cont->setFacturationExpeditionDefaut(false);
}
$em->persist($cont);
}
$em->flush();
}
}
/**
* @Route("/contact/recherche", name="dtc_contact_recherche")
*/
public function rechercheAction(Request $request, EntityManagerInterface $em, TranslatorInterface $translator, PaginatorInterface $paginator)
{
$q = $request->query->get('q');
$page = $request->query->getInt('page', 1);
$client = $request->query->get('client');
$fiche = $request->query->get('fiche');
$repo = $em->getRepository(Contact::class);
//echo "TEST ==>".$fiche;
if ($client == "") {
$results = [];
} else {
$results = $repo->getRechercheContact(trim($q), $client);
}
$pagination = $paginator->paginate(
$results, /* query NOT result */
$request->query->getInt('page', 1)/*page number*/,
10/*limit per page*/
);
/*
$pagination_results = $pagination->getItems();
$option_placeholde = array("libelle" =>$translator->trans("Sélectionnez"),"id"=>"0");
if( $request->query->getInt('page', 1) == 1) array_unshift($pagination_results, $option_placeholde);
$pagination->setItems($pagination_results);
*/
$pagination_results = $pagination->getItems();
if ($fiche != "") {
$repo_fiche_contact = $em->getRepository(FicheContact::class);
foreach ($pagination_results as $key => $value) {
$fiche_contact_obj = $repo_fiche_contact->findOneBy(["fiche" => $fiche, "contact" => $value["id"]]);
if (is_object($fiche_contact_obj)) {
unset($pagination_results[$key]);
}
}
}
if ($q == "" && $page < 2) {
//$option_placeholde = array("libelle"=>"Choisir","id"=>"","departement_id"=>"");
$option_placeholde = ["libelle" => $translator->trans("Sélectionnez"), "id" => "0"];
array_unshift($pagination_results, $option_placeholde);
} elseif ($page < 2) {
/*
$contact_saisie_existe = $repo->findOneBy(array('prenom'=>$q));
if(!is_object($contact_saisie_existe)) {
$option_placeholde = array("libelle"=>"Nouveau contact : ".$q,"id"=>'['.$q.']');
array_unshift($pagination_results, $option_placeholde);
$option_placeholde = array("libelle" =>$translator->trans("Sélectionnez"),"id"=>"0");
array_unshift($pagination_results, $option_placeholde);
}
*/
$option_placeholde = ["libelle" => $translator->trans("Sélectionnez"), "id" => "0"];
array_unshift($pagination_results, $option_placeholde);
}
$pagination->setItems($pagination_results);
$serializer = SerializerBuilder::create()->build();
return JsonResponse::fromJsonString($serializer->serialize($pagination, 'json'));
}
/**
* @Route("/contact/charger-tableau/{id}/{type}", name="dtc_contact_client_charger_tableau")
* @Route("/contact/charger-tableau/{id}/{type}", name="dtc_contact_charger_tableau")
*/
public function chargerTableauAction(Request $request, $id = "0", $type = "", EntityManagerInterface $em)
{
$objet = null;
if ($type == "client") {
$repo_objet = $em->getRepository(Client::class);
$objet = $repo_objet->find($id);
} elseif ($type == "fournisseur") {
$repo_objet = $em->getRepository(Fournisseur::class);
$objet = $repo_objet->find($id);
}
$rendu = $this->renderView('Utilisateur/Contact/charger_tableau.html.twig', ["id" => $id, "type" => $type, "objet" => $objet]);
return new JsonResponse(['rendu' => $rendu]);
}
}