<?php
namespace App\Controller\Adresses;
use App\Entity\Adresses\Adresse;
use App\Entity\Localisation\Zone;
use App\Form\Adresse\AdresseType;
use App\Form\Adresse\SupprimerAdresseType;
use App\Library\Datatable\Util\Datatable;
use App\Library\Uploader\Services\FileUploader;
use App\Security\Voter\EntityVoter;
use App\Service\GestionComerciale\EmailService;
use App\Service\Utilisateur\ColonneTableauService;
use Doctrine\ORM\EntityManagerInterface;
use JMS\Serializer\SerializerBuilder;
use Knp\Component\Pager\PaginatorInterface;
use Knp\Snappy\Pdf;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use JMS\Serializer\SerializationContext;
class AdresseController extends AbstractController
{
/**
* @Route("/compte/adresse", name="dtc_adresse_liste")
*/
public function listerAction(Request $request, EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator, ColonneTableauService $serviceColonneTableau)
{
$tableau_class_cellule = array();
$tableau_class_cellule[] = ["className" => "visible_export colonne_id text-center", "targets" => [0], "visible" => false, "orderable" => false];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id text-left", "targets" => [1], "visible" => true, "orderable" => false];
$tableau_class_cellule[] = ["className" => "visible_export colonne_id text-left", "targets" => [2], "visible" => false, "orderable" => false];
$response = new Response();
$this->datatable($request, $em, $datatable, $translator, $response);
$param = $request->query->all();
return $this->render('Adresses/Adresse/lister.html.twig',
[
'tableauClassColonne' => $tableau_class_cellule,
'parametres'=> $param,
]
,$response);
}
/**
* set datatable configs
*
* @return \App\Library\Datatable\Util\Datatable
*/
private function datatable(Request $request, EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
$user = $this->getUser();
$param = $request->query->all();
$datatable
->setDatatableId('liste_adresses')
->setEntity(Adresse::class, "x")
->setFields(
[
$translator->trans("Date") => 'x.date',
$translator->trans("Adresses") => 'x.libelle',
$translator->trans("Actions") => 'x.id',
"_identifier_" => 'x.id',
]
)
//->addJoin('x.transporteur', 't', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN)
->setRenderers(
[
0 => [
'view' => 'FO/DataTable/heure.html.twig',
],
1 => [
'view' => 'FO/DataTable/adresse.html.twig',
'params' => [
'edit_route' => 'dtc_commande_liste',
],
],
2 => [
'view' => 'FO/DataTable/actions.html.twig',
'params' => [
'edit_route' => 'dtc_adresse_modifier',
//'supprimer_route' => 'dtc_commande_supprimer',
'objet' => Adresse::class,
'deplier' => false,
'table' => "liste_adresse",
],
],
]
)
->setMultiple([])
->setOrder("x.date", "desc")
->setSearch(true)
->setSearchFields([]);
$where = "";
//$where = "x.typeDocumentCommercial = :typeDocumentCommercial and x.utilisateur = :utilisateur";
//$parameters = ['typeDocumentCommercial' => TypeDocumentCommercial::FACTURE,'utilisateur'=>$user->getId()];
$client_id = 10000000000000;
if($user->getClient()) $client_id = $user->getClient()->getId();
$param["parametres"]["client"] = $client_id;
if (array_key_exists('parametres', $param)) {
$response = new Response();
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 .= "x.client = :client";
}
if (array_key_exists('date_debut', $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('transporteur', $param["parametres"]) and $param["parametres"]["transporteur"] > 0) {
//$datatable->addJoin('x.client', 'client', \Doctrine\ORM\Query\Expr\Join::LEFT_JOIN);
$parameters["transporteur"] = $param["parametres"]["transporteur"];
if ($where != "") {
$where .= " AND ";
}
$where .= "t.id = :transporteur";
}
if (array_key_exists('date_fin', $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";
}
}
if ($where != "") {
$where .= " AND ";
}
$where .= "x.visible = :visible";
$parameters["visible"]=1;
if ($where != '') {
$datatable->setWhere($where, $parameters);
$qb = $datatable->getQueryBuilder()->getDoctrineQueryBuilder();
}
return $datatable;
}
/**
* @Route("/compte/adresse/grid", name="dtc_adresse_liste_grid")
*/
public function gridAction(Request $request, EntityManagerInterface $em, Datatable $datatable, TranslatorInterface $translator)
{
return $this->datatable($request, $em, $datatable, $translator)->execute();
}
/**
* @Route("/adresse/recherche", name="dtc_adresse_recherche")
*/
public function rechercheAction(Request $request, EntityManagerInterface $em, PaginatorInterface $paginator)
{
$q = $request->query->get('q');
$client = $request->query->get('client');
$client = $user = $this->getUser()->getClient()->getid();
$repo = $em->getRepository(Adresse::class);
if (empty($client)) {
$results = [];
} else {
$results = $repo->getRechercheAdresse($q, 25, ['client' => $client]);
}
$pagination = $paginator->paginate(
$results, /* query NOT result */
$request->query->getInt('page', 1)/*page number*/,
10
);
$pagination_results = $pagination->getItems();
$pagination_results_array = $pagination->getItems();
$option_placeholde = ["libelle" => "Sélectionnez", "id" => "0"];
if ($request->query->getInt('page', 1) == 1) {
array_unshift($pagination_results_array, $option_placeholde);
}
$pagination->setItems($pagination_results);
$serializer = SerializerBuilder::create()->build();
$context = SerializationContext::create()->setSerializeNull(true);
return JsonResponse::fromJsonString($serializer->serialize($pagination, 'json', $context));
}
/**
* @Route("/adresse/ajouter", name="dtc_adresse_ajouter")
*/
public function ajouterAction(Request$request, EntityManagerInterface $em,TranslatorInterface $translator,ValidatorInterface $validator)
{
$titre_modal = "Nouvelle adresse de livraison";
$user = $this->getUser();
$adresse = new Adresse();
$adresse->setLibelle("Adresse de livraison");
$adresse->setClient($user->getClient());
$france = $em->getRepository(Zone::class)->findOneBy(["type"=>"1","titre"=>"FRANCE"]);
$adresse->setPays($france);
$form = $this->createForm(AdresseType::class, $adresse);
$errors = [];
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->persist($adresse);
$em->flush();
$em->refresh($adresse);
$villeTxt = "";
$cpTxt = "";
$paysTxt = "";
if(is_object($adresse->getVille())) $villeTxt = $adresse->getVille()->getTitre();
if(is_object($adresse->getCodePostal())) $cpTxt = $adresse->getCodePostal()->getCodePostal();
if(is_object($adresse->getPays())) $paysTxt = $adresse->getPays()->getTitre();
$dataAdresse = [
'id' => $adresse->getId(),
'libelle' => $adresse->getLibelle(),
'prenom' => $adresse->getPrenom(),
'nom' => $adresse->getNom(),
'numero' => $adresse->getNumero(),
'rue' => $adresse->getRue(),
'complement' => $adresse->getComplement(),
'complement2' => $adresse->getComplement2(),
'codePostal' => $cpTxt,
'ville' => $villeTxt,
'pays' => $paysTxt,
'email' => $adresse->getEmail(),
'telephone' => $adresse->getTelephone(),
];
return new Response(
json_encode(['adresse' => $dataAdresse, 'valide' => '1', 'url' => '', 'type' => 'callBackAddAdresse']),
200,
['Content-Type' => 'application/json']
);
}
else {
$errors = $validator->validate($adresse);
}
}
$rendu = $this->renderView('Adresses/Adresse/ajouter.html.twig',['form' => $form->createView(), 'errors' => $errors,'adresse'=>$adresse]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("/adresse/modifier/{page}/{id}", name="dtc_adresse_modifier")
*/
public function modifierAction($page,Adresse $adresse,Request$request, EntityManagerInterface $em,TranslatorInterface $translator,ValidatorInterface $validator)
{
$titre_modal = "Modifier adresse de livraison ";
$user = $this->getUser();
$form = $this->createForm(AdresseType::class, $adresse);
$errors = [];
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$em->persist($adresse);
$em->flush();
$em->refresh($adresse);
$villeTxt = "";
$cpTxt = "";
$paysTxt = "";
if(is_object($adresse->getVille())) $villeTxt = $adresse->getVille()->getTitre();
if(is_object($adresse->getCodePostal())) $cpTxt = $adresse->getCodePostal()->getCodePostal();
if(is_object($adresse->getPays())) $paysTxt = $adresse->getPays()->getTitre();
$dataAdresse = [
'id' => $adresse->getId(),
'libelle' => $adresse->getLibelle(),
'prenom' => $adresse->getPrenom(),
'nom' => $adresse->getNom(),
'numero' => $adresse->getNumero(),
'rue' => $adresse->getRue(),
'complement' => $adresse->getComplement(),
'complement2' => $adresse->getComplement2(),
'codePostal' => $cpTxt,
'ville' => $villeTxt,
'pays' => $paysTxt,
'email' => $adresse->getEmail(),
'telephone' => $adresse->getTelephone(),
];
$callBack = "callBackAddAdresse";
if($page == "adresses") $callBack = "callBackEditAdresse";
return new Response(
json_encode(['adresse' => $dataAdresse, 'valide' => '1', 'url' => '', 'type' => $callBack]),
200,
['Content-Type' => 'application/json']
);
}
else {
$errors = $validator->validate($adresse);
}
}
$rendu = $this->renderView('Adresses/Adresse/ajouter.html.twig',['form' => $form->createView(), 'errors' => $errors,'adresse'=>$adresse]);
return new JsonResponse(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]);
}
/**
* @Route("/adresse/supprimer/{page}/{id}", name="dtc_adresse_supprimer")
*/
public function supprimerAction($page,Adresse $adresse,Request$request, EntityManagerInterface $em,TranslatorInterface $translator,ValidatorInterface $validator)
{
$titre_modal = $translator->trans("Demande de confirmation");
$user = $this->getUser();
if($user->getClient()->getId() != $adresse->getClient()->getId() ) {
return false;
}
$get = $request->query->all();
$form = $this->createForm(SupprimerAdresseType::class, $adresse);
$errors = "";
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$adresse->setVisible(0);
$em->persist($adresse);
$em->flush();
$url = "";
$callBack = "callBackEditAdresse";
return new Response(json_encode([ 'valide' => '1', 'url' => '', 'type' => $callBack]),200,['Content-Type' => 'application/json']);
}
else {
$errors = $validator->validate($adresse);
$rendu = $this->renderView(
'FO/Supprimer/supprimer.html.twig',
['form' => $form->createView(), 'errors' => $errors, 'id' => $id, 'type' => $type, 'objet' => $adresse]
);
return new Response(json_encode(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]));
}
}
$rendu = $this->renderView('FO/Supprimer/supprimer.html.twig', ['form' => $form->createView(), 'errors' => $errors, 'objet' => $adresse]);
return new Response(json_encode(['rendu' => $rendu, 'valide' => '0', 'url' => '', 'titre' => $titre_modal]));
}
}