src/Controller/Client/ClientController.php line 198

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Client;
  3. use App\Entity\Admin;
  4. use App\Entity\Adminevent;
  5. use App\Entity\Client;
  6. use App\Entity\Clientdocument;
  7. use App\Entity\Clientrelation;
  8. use App\Entity\Clientvente;
  9. use App\Entity\Fournisseur;
  10. use App\Form\User\AdmineventType;
  11. use App\Form\User\ClientdocumentType;
  12. use App\Form\User\ClientType;
  13. use App\Utils\Dates\MalysDates;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Knp\Component\Pager\PaginatorInterface;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. /**
  21. * @Route("/client")
  22. */
  23. class ClientController extends AbstractController
  24. {
  25. private $malysDates;
  26. /**
  27. * @required
  28. */
  29. public function setMalysDates(MalysDates $malysDates)
  30. {
  31. $this->malysDates = $malysDates;
  32. }
  33. private PaginatorInterface $paginator;
  34. public function __construct(PaginatorInterface $paginator)
  35. {
  36. $this->paginator = $paginator;
  37. }
  38. /* AFFICHAGE INDEX CLIENT */
  39. /**
  40. * @Route("/index/{id}", name="malys_client_index", defaults={"id"=0})
  41. */
  42. public function indexAction($id, EntityManagerInterface $em)
  43. {
  44. /* RECUPERATION DU CLIENT EN BASE */
  45. $client = $em->getRepository(Client::class)->find($id);
  46. /* RECUPERATION DES RDV DU CLIENT */
  47. $rdv = $em->getRepository(Adminevent::class)->findBy(array('idclient' => $client, 'type' => 'rdv'), array('datefr' => 'desc'), 5, 0);
  48. /* RECUPERATION DES PROBLEMES DU CLIENT */
  49. $pbm = $em->getRepository(Adminevent::class)->findBy(array('idclient' => $client, 'type' => 'pbm'), array('datefr' => 'desc'), 5, 0);
  50. /* COORDONNEES POUR LA MAP */
  51. $geocode = explode('|', $client->getGeocode());
  52. $lat = isset($geocode[1]) ? $geocode[0] : null;
  53. $lng = isset($geocode[1]) ? $geocode[1] : null;
  54. /* annee courante par défaut */
  55. $date = date('Y');
  56. /* RECUPERATION CA CLIENT */
  57. $cv = $em->getRepository(Clientvente::class)->findMyClientCa($id, "all");
  58. /* tableau a afficher */
  59. $totalCaGenere = array();
  60. $totalCaCommission = array();
  61. $totalSolde = array();
  62. $t_ListeCA = array();
  63. $t_ListeMois = array();
  64. $t_ListeDetail = array();
  65. $t_ListeFamille = array();
  66. foreach ($cv as $v) {
  67. //echo $v[0]->getIdfournisseur()->getFamille()." // ".$v['ca_genere']."<br/>";
  68. //TABLEAU DETAILLE
  69. $t_ListeCA[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()][intval($v[0]->getDatefr()->format('m'))]['ca_genere'] = $v['ca_genere'];
  70. $t_ListeCA[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()][intval($v[0]->getDatefr()->format('m'))]['ca_commission'] = ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  71. $t_ListeCA[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()][intval($v[0]->getDatefr()->format('m'))]['solde'] = number_format($v[0]->getSolde(), 2, '.', '');
  72. $t_ListeCA[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()]['idclient'] = $v[0]->getIdclient()->getId();
  73. $t_ListeCA[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()]['idfournisseur'] = $v[0]->getIdfournisseur()->getId();
  74. //TABLEAU CA PAR FAMILLE
  75. if (intval($v[0]->getDatefr()->format('Y')) == $date)
  76. ($v[0]->getIdfournisseur()->getFamille() != "") ? $t_ListeFamille[$v[0]->getIdfournisseur()->getFamille()] += $v['ca_genere'] : $t_ListeFamille["Autre"] += $v['ca_genere'];
  77. //TABLEAU MOIS PAR MOIS
  78. if (!isset($t_ListeMois[intval($v[0]->getDatefr()->format('Y'))][intval($v[0]->getDatefr()->format('m'))]))
  79. $t_ListeMois[intval($v[0]->getDatefr()->format('Y'))][intval($v[0]->getDatefr()->format('m'))] = array('ca_genere' => 0, 'ca_commission' => 0, 'solde' => 0);
  80. $t_ListeMois[intval($v[0]->getDatefr()->format('Y'))][intval($v[0]->getDatefr()->format('m'))]['ca_genere'] += number_format($v['ca_genere'], 2, '.', '');
  81. $t_ListeMois[intval($v[0]->getDatefr()->format('Y'))][intval($v[0]->getDatefr()->format('m'))]['ca_commission'] += ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  82. $t_ListeMois[intval($v[0]->getDatefr()->format('Y'))][intval($v[0]->getDatefr()->format('m'))]['solde'] += number_format($v[0]->getSolde(), 2, '.', '');
  83. // TOTAUX
  84. if (isset($totalCaGenere[intval($v[0]->getDatefr()->format('Y'))])) {
  85. $totalCaGenere[intval($v[0]->getDatefr()->format('Y'))] += number_format($v['ca_genere'], 2, '.', '');
  86. } else {
  87. $totalCaGenere[intval($v[0]->getDatefr()->format('Y'))] = number_format($v['ca_genere'], 2, '.', '');
  88. }
  89. if (isset($totalCaGenere[intval($v[0]->getDatefr()->format('Y'))])) {
  90. $totalCaCommission[intval($v[0]->getDatefr()->format('Y'))] += ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  91. $totalSolde[intval($v[0]->getDatefr()->format('Y'))] += number_format($v[0]->getSolde(), 2, '.', '');
  92. } else {
  93. $totalCaCommission[intval($v[0]->getDatefr()->format('Y'))] = ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  94. $totalSolde[intval($v[0]->getDatefr()->format('Y'))] = number_format($v[0]->getSolde(), 2, '.', '');
  95. }
  96. //TABLEAU PAR TYPE DETAIL
  97. if (!isset($t_ListeDetail[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()]))
  98. $t_ListeDetail[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()] = array('ca_genere' => 0, 'ca_commission' => 0, 'solde' => 0);
  99. $t_ListeDetail[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()]['ca_genere'] += number_format($v['ca_genere'], 2, '.', '');
  100. $t_ListeDetail[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()]['ca_commission'] += ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  101. $t_ListeDetail[intval($v[0]->getDatefr()->format('Y'))][$v[0]->getIdfournisseur()->getNom()]['solde'] += number_format($v[0]->getSolde(), 2, '.', '');
  102. }
  103. //CREATE JSON AND ORDER T_CHART_FAMILLE
  104. $t_ca_famille = array();
  105. foreach ($t_ListeFamille as $key => $value) {
  106. array_push($t_ca_famille, array($key, $value));
  107. }
  108. $volume = array();
  109. foreach ($t_ca_famille as $key => $row) {
  110. $volume[$key] = $row[1];
  111. $edition[$key] = $row[0];
  112. }
  113. if ($volume) {
  114. array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $t_ca_famille);
  115. }
  116. $t_ListeFamille = array();
  117. array_push($t_ListeFamille, (object)array('type' => 'pie', 'name' => 'Famille', 'data' => $t_ca_famille));
  118. $t_famille_chart_json = json_encode($t_ListeFamille);
  119. //INSERT DIFF
  120. for ($i = $date - 2; $i <= $date; $i++) {
  121. if (isset($t_ListeCA[$i])) {
  122. foreach ($t_ListeCA[$i] as $key => $v) {
  123. for ($j = 1; $j <= 12; $j++) {
  124. if (isset($t_ListeCA[$i][$key][$j - 1]['ca_genere']) && isset($t_ListeCA[$i][$key][$j]['ca_genere'])) {
  125. $t_ListeCA[$i][$key][$j]['diff'] = number_format(($t_ListeCA[$i][$key][$j]['ca_genere'] - $t_ListeCA[$i][$key][$j - 1]['ca_genere']) / $t_ListeCA[$i][$key][$j - 1]['ca_genere'] * 100, 2, '.', '');
  126. }
  127. }
  128. }
  129. }
  130. }
  131. //CREATE JSON FOR CHART CA
  132. $t_ca_chart = array();
  133. foreach ($t_ListeMois as $key => $item_ca) {
  134. $t_ca = array();
  135. for ($i = 1; $i <= 12; $i++) {
  136. (isset($item_ca[$i]['ca_genere']) && intval($item_ca[$i]['ca_genere']) != 0) ? array_push($t_ca, $item_ca[$i]['ca_genere']) : array_push($t_ca, null);
  137. }
  138. ($key == date("Y")) ? array_push($t_ca_chart, (object)array('name' => $key, 'data' => $t_ca)) : array_push($t_ca_chart, (object)array('name' => $key, 'visible' => false, 'data' => $t_ca));
  139. }
  140. $t_ca_chart_json = json_encode($t_ca_chart);
  141. /* mois du tableau */
  142. $tab_mois_fr = $this->malysDates->getTabMoisFr();
  143. return $this->render('client/index.html.twig', array(
  144. 'lat' => $lat,
  145. 'lng' => $lng,
  146. 'client' => $client,
  147. 'rdv' => $rdv,
  148. 'pbm' => $pbm,
  149. 'user' => $this->getUser()->getFamille(),
  150. 't_ListeCA' => $t_ListeCA,
  151. 't_ListeMois' => $t_ListeMois,
  152. 't_ListeDetail' => $t_ListeDetail,
  153. 'tab_mois_fr' => $tab_mois_fr,
  154. 'totalCaGenere' => $totalCaGenere,
  155. 'totalSolde' => $totalSolde,
  156. 'totalCaCommission' => $totalCaCommission,
  157. 't_famille_chart_json' => $t_famille_chart_json,
  158. 't_ca_chart_json' => $t_ca_chart_json
  159. ));
  160. }
  161. /* AJOUT/MODIFICATION DE CLIENT */
  162. /**
  163. * @Route("/modifier/{id}", name="malys_client_modify", defaults={"id"=0})
  164. */
  165. public function modifyAction($id, Request $request, EntityManagerInterface $em)
  166. {
  167. if ($id)
  168. $client = $em->getRepository(Client::class)->find($id);
  169. else
  170. $client = new Client;
  171. if ($id && $this->isGranted('ROLE_ADMIN'))
  172. $form = $this->createForm(ClientType::class, $client, ['prospect' => $client->getProspect(), 'isAdmin' => false]);
  173. else
  174. $form = $this->createForm(ClientType::class, $client, [
  175. 'prospect' => $client->getProspect(),
  176. 'isAdmin' => true
  177. ]);
  178. if ($request->getMethod() == 'POST') {
  179. $form->handleRequest($request);
  180. if ($form->isValid()) {
  181. if (!$client->getProspect() && $form->get('sameAsAdresse')->getData()) {
  182. $client->setAdresseFacturation($client->getAdresse());
  183. $client->setCpFacturation($client->getCp());
  184. $client->setVilleFacturation($client->getVille());
  185. }
  186. /* EST */
  187. if ($client->getDateclientfr() == null)
  188. $client->setDateclientfr($client->getDatefr());
  189. if ($client->getIdadmin() == null)
  190. $client->setIdadmin($this->getUser());
  191. $em->persist($client);
  192. $em->flush();
  193. return $this->redirect($this->generateUrl('malys_client_show', array('id' => $client->getId())));
  194. }
  195. }
  196. return $this->render('client/modify.html.twig', array('form' => $form->createView(), 'client' => $client));
  197. }
  198. /* AFFICHAGE FICHE CLIENT */
  199. /**
  200. * @Route("/voir/{id}", name="malys_client_show")
  201. */
  202. public function showAction($id, EntityManagerInterface $em)
  203. {
  204. /* RECUPERATION DU CLIENT EN BASE */
  205. $client = $em->getRepository(Client::class)->find($id);
  206. /* RECUPERATION DES DOCUMENTS DU CLIENT */
  207. $docs = $em->getRepository(Clientdocument::class)->findClientDocuments($id);
  208. /* RECUPERATION DES RDV DU CLIENT */
  209. $rdv = $em->getRepository(Adminevent::class)->findBy(array('idclient' => $client, 'type' => 'rdv'), array('datefr' => 'desc'), 5, 0);
  210. /* RECUPERATION DES PROBLEMES DU CLIENT */
  211. $pbm = $em->getRepository(Adminevent::class)->findBy(array('idclient' => $client, 'type' => 'pbm'), array('datefr' => 'desc'), 5, 0);
  212. /* COORDONNEES POUR LA MAP */
  213. $geocode = explode('|', $client->getGeocode());
  214. $lat = isset($geocode[1]) ? $geocode[0] : null;
  215. $lng = isset($geocode[1]) ? $geocode[1] : null;
  216. $tab_fonction = array(
  217. 1 => 'Chef',
  218. 2 => 'Patron',
  219. 3 => 'Resp Bar',
  220. 4 => 'Gerant',
  221. 5 => 'Autre'
  222. );
  223. $tab_typeaffaire = array('0' => 'Restaurant traditionnel', '1' => 'VAE', '2' => 'Bitrot <100 couverts/jours', '3' => 'Brasserie', '4' => 'Bar pur', '5' => 'Hotel', '6' => 'Boite de nuit', '7' => 'Traiteur', '8' => 'Autre');
  224. $tab_typecontrat = array(
  225. 1 => 'Pret',
  226. 2 => 'MaD',
  227. 3 => 'Avance sur remise'
  228. );
  229. $relations = $em->getRepository(Clientrelation::class)->findBy(array('idclient' => $id));
  230. return $this->render('client/show.html.twig', array(
  231. 'lat' => $lat,
  232. 'lng' => $lng,
  233. 'client' => $client,
  234. 'rdv' => $rdv,
  235. 'pbm' => $pbm,
  236. 'docs' => $docs,
  237. 'tab_fonction' => $tab_fonction,
  238. 'tab_typeaffaire' => $tab_typeaffaire,
  239. 'tab_typecontrat' => $tab_typecontrat,
  240. 'relations' => $relations,
  241. //'contrat' => $client.contrat
  242. ));
  243. }
  244. /* PASSE PROSPECT EN CLIENT */
  245. /**
  246. * @Route("/passer_en_client/{id}", name="malys_client_siwtchToClient")
  247. */
  248. public function swicthToClientAction($id,Request $request, EntityManagerInterface $em)
  249. {
  250. $client = $em->getRepository(Client::class)->find($id);
  251. if (!$client) {
  252. throw $this->createNotFoundException('Client non trouvé');
  253. }
  254. $client->setSameAsAdresse(false);
  255. // Créer un formulaire pour le client
  256. if ($id && $this->isGranted('ROLE_ADMIN'))
  257. $form = $this->createForm(ClientType::class, $client, [
  258. 'prospect' => $client->getProspect(),
  259. 'isAdmin' => true
  260. ]);
  261. else
  262. $form = $this->createForm(ClientType::class, $client, [
  263. 'prospect' => $client->getProspect(),
  264. 'isAdmin' => false
  265. ]);
  266. // Soumettre le formulaire si la requête est POST
  267. $client->setProspect(0);
  268. $client->setNote(0);
  269. $client->setActivite(1);
  270. $client->setDateclientfr(new \DateTime("now"));
  271. $em->persist($client);
  272. $em->flush();
  273. if ($request->getMethod() == 'POST') {
  274. $form->handleRequest($request);
  275. if ($form->isValid()) {
  276. $em->persist($client);
  277. $em->flush();
  278. // Redirection vers la page du client
  279. return $this->redirect($this->generateUrl('malys_client_show', array('id' => $id)));
  280. }
  281. }
  282. // Si le formulaire n'est pas valide, on retourne à la page de modification du client avec les erreurs
  283. return $this->render('client/modify.html.twig', array('form' => $form->createView(), 'client' => $client));
  284. }
  285. /* LIEN FOURNISSEURS */
  286. /**
  287. * @Route("/fournisseurs/{id}", name="malys_client_fournisseurs")
  288. */
  289. public function linkSupplierAction($id,Request $request, EntityManagerInterface $em)
  290. {
  291. $client = $em->getRepository(Client::class)->find($id);
  292. $clientrelation = $em->getRepository(Clientrelation::class)->findByIdclient($id);
  293. $fournisseurs = $em->getRepository(Fournisseur::class)->findBySource($client->getSource(), array('nom' => 'asc'));
  294. /* LIEN DES FOURNISSEURS */
  295. $rel = array();
  296. foreach ($clientrelation as $c)
  297. $rel[$c->getIdfournisseur()->getId()] = $c->getCode();
  298. $pdf = $this->get('white_october.tcpdf')->create();
  299. if ($request->getMethod() == 'POST') {
  300. $em->createQuery("DELETE App\Entity\Clientrelation r WHERE r.idclient = " . $id)->execute();
  301. $chcode = $request->request->get('chcode');
  302. $chclient = $request->request->get('chclient');
  303. foreach ($chclient as $key => $val) {
  304. $r = new Clientrelation;
  305. $r->setCode(isset($chcode[$key]) ? $chcode[$key] : '');
  306. $r->setIdclient($client);
  307. $r->setIdfournisseur($this->getFournisseur($fournisseurs, $val));
  308. $client = $em->getRepository(Client::class)->find($id);
  309. $joursLivraison = $client->getJoursLivraison();
  310. // Doctrine gère automatiquement la désérialisation JSON
  311. $fournisseur = $em->getRepository(Fournisseur::class)->find($r->getIdfournisseur()->getId());
  312. // Générer le contenu HTML avec le moteur Twig
  313. $html = $this->render('client/ouverture.html.twig', [
  314. 'title' => 'Fiche ouverture de compte Adhérent / MALYS-PRESTACHEF',
  315. 'client' => $client,
  316. 'fournisseur' => $fournisseur,
  317. 'joursLivraison' => is_array($joursLivraison) ? $joursLivraison : [],
  318. ])->getContent(); // récupère le contenu HTML généré
  319. // Ajouter une page au PDF
  320. $pdf->AddPage('P', 'A4'); // Orientation portrait, taille A4
  321. // Désactiver les marges pour occuper toute la page
  322. $pdf->SetAutoPageBreak(false); // Désactive la rupture automatique de page
  323. // Écrire le contenu HTML dans le PDF
  324. $pdf->writeHTML($html); // Appeler cette méthode sur l'objet TCPDF
  325. // 📌 Spécifier le chemin de sauvegarde
  326. $documentPath = $this->getParameter('kernel.project_dir') . '/public/documents'; // Répertoire de sauvegarde
  327. // Créer le nom du fichier PDF avec un nom dynamique (par exemple, basé sur l'ID du client)
  328. $pdfFileName = 'fiche_ouverture_' . $client->getId() . '.pdf';
  329. // 📌 Sauvegarder le fichier PDF dans le répertoire spécifié
  330. $pdf->Output($documentPath . $pdfFileName, 'F'); // 'F' pour enregistrer le fichier sur le système
  331. $r->setFichierOuverture($documentPath . $pdfFileName); // Enregistrez le chemin du fichier
  332. echo $documentPath . $pdfFileName;
  333. exit;
  334. $em->persist($r);
  335. }
  336. $em->flush();
  337. return $this->redirect($this->generateUrl('malys_client_fournisseurs', array('id' => $client->getId())));
  338. }
  339. return $this->render('client/fournisseurs.html.twig', array('client' => $client, 'fournisseurs' => $fournisseurs, 'clientrelation' => $rel));
  340. }
  341. /* CA GENERE */
  342. /**
  343. * @Route("/ca/{id}/{date}", name="malys_client_ca", defaults={"date"=0})
  344. */
  345. public function caAction($id, $date, EntityManagerInterface $em)
  346. {
  347. /* annee courante par défaut */
  348. if ($date == 0)
  349. $date = date('Y');
  350. $client = $em->getRepository(Client::class)->find($id);
  351. $cv = $em->getRepository(Clientvente::class)->findMyClientCa($id, $date);
  352. /* tableau a afficher */
  353. $totalCaGenere = 0;
  354. $totalCaCommission = 0;
  355. $totalSolde = 0;
  356. $t_ListeCA = array();
  357. $t_ListeMois = array();
  358. $t_ListeDetail = array();
  359. foreach ($cv as $v) {
  360. //TABLEAU DETAILLE
  361. $t_ListeCA[$v[0]->getIdfournisseur()->getNom()][intval($v[0]->getDatefr()->format('m'))]['ca_genere'] = $v['ca_genere'];
  362. $t_ListeCA[$v[0]->getIdfournisseur()->getNom()][intval($v[0]->getDatefr()->format('m'))]['ca_commission'] = ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  363. $t_ListeCA[$v[0]->getIdfournisseur()->getNom()][intval($v[0]->getDatefr()->format('m'))]['solde'] = number_format($v[0]->getSolde(), 2, '.', '');
  364. $t_ListeCA[$v[0]->getIdfournisseur()->getNom()]['idclient'] = $v[0]->getIdclient()->getId();
  365. $t_ListeCA[$v[0]->getIdfournisseur()->getNom()]['idfournisseur'] = $v[0]->getIdfournisseur()->getId();
  366. //TABLEAU MOIS PAR MOIS
  367. if (!isset($t_ListeMois[intval($v[0]->getDatefr()->format('m'))]))
  368. $t_ListeMois[intval($v[0]->getDatefr()->format('m'))] = array('ca_genere' => 0, 'ca_commission' => 0, 'solde' => 0);
  369. $t_ListeMois[intval($v[0]->getDatefr()->format('m'))]['ca_genere'] += number_format($v['ca_genere'], 2, '.', '');
  370. $t_ListeMois[intval($v[0]->getDatefr()->format('m'))]['ca_commission'] += ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  371. $t_ListeMois[intval($v[0]->getDatefr()->format('m'))]['solde'] += number_format($v[0]->getSolde(), 2, '.', '');
  372. // TOTAUX
  373. $totalCaGenere += number_format($v['ca_genere'], 2, '.', '');
  374. $totalCaCommission += ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  375. $totalSolde += number_format($v[0]->getSolde(), 2, '.', '');
  376. //TABLEAU PAR TYPE DETAIL
  377. if (!isset($t_ListeDetail[$v[0]->getIdfournisseur()->getNom()]))
  378. $t_ListeDetail[$v[0]->getIdfournisseur()->getNom()] = array('ca_genere' => 0, 'ca_commission' => 0, 'solde' => 0);
  379. $t_ListeDetail[$v[0]->getIdfournisseur()->getNom()]['ca_genere'] += number_format($v['ca_genere'], 2, '.', '');
  380. $t_ListeDetail[$v[0]->getIdfournisseur()->getNom()]['ca_commission'] += ($v[0]->getIdadmin()->getId() == $this->getUser()->getId()) ? number_format($v['ca_commission'], 2, '.', '') : 0;
  381. $t_ListeDetail[$v[0]->getIdfournisseur()->getNom()]['solde'] += number_format($v[0]->getSolde(), 2, '.', '');
  382. }
  383. /* selecteur de date */
  384. $begin = date("Y", time()) - 3;
  385. $end = date("Y", time()) + 1;
  386. /* mois du tableau */
  387. $tab_mois_fr = $this->malysDates->getTabMoisFr();
  388. return $this->render('client/ca.html.twig', array(
  389. 'date' => $date,
  390. 'client' => $client,
  391. 'begin' => $begin,
  392. 'end' => $end,
  393. 't_ListeCA' => $t_ListeCA,
  394. 't_ListeMois' => $t_ListeMois,
  395. 't_ListeDetail' => $t_ListeDetail,
  396. 'tab_mois_fr' => $tab_mois_fr,
  397. 'totalCaGenere' => $totalCaGenere,
  398. 'totalSolde' => $totalSolde,
  399. 'totalCaCommission' => $totalCaCommission
  400. ));
  401. }
  402. /* AJOUT/MODIFICATION D'EVENEMENT */
  403. /**
  404. * @Route("/ajouter_event/{id_client}/{type}/{id_event}", name="malys_client_addevent", defaults={"id_event"=0})
  405. */
  406. public function addEventAction($id_client, $id_event, $type,Request $request, EntityManagerInterface $em)
  407. {
  408. if ($id_event)
  409. $event = $em->getRepository(Adminevent::class)->find($id_event);
  410. else
  411. $event = new Adminevent;
  412. $client = $em->getRepository(Client::class)->find($id_client);
  413. $form = $this->createForm(AdmineventType::class, $event, [
  414. 'prospect' => $client->getProspect(),
  415. 'type' => $type,
  416. 'em' => $em,
  417. ]);
  418. if ($request->getMethod() == 'POST') {
  419. $form->handleRequest($request);
  420. if ($form->isValid()) {
  421. $event->setType($request->get('chtype'));
  422. $event->setIdadmin($this->getUser());
  423. $event->setIdclient($client);
  424. $em->persist($event);
  425. $em->flush();
  426. return $this->redirect($this->generateUrl('malys_client_show', array('id' => $client->getId())));
  427. }
  428. }
  429. return $this->render('client/addEvent.html.twig', array('form' => $form->createView(), 'client' => $client, 'type' => $type));
  430. }
  431. /* SUPPRESSION D'UN EVENEMENT */
  432. /**
  433. * @Route("/supprimer_event/{id_client}/{id_event}", name="malys_client_delevent")
  434. */
  435. public function delEventAction($id_client, $id_event, EntityManagerInterface $em)
  436. {
  437. $event = $em->getRepository(Adminevent::class)->find($id_event);
  438. $em->remove($event);
  439. $em->flush();
  440. return $this->redirect($this->generateUrl('malys_client_show', array('id' => $id_client)));
  441. }
  442. /* AJOUT DE DOCUMENT */
  443. /**
  444. * @Route("/ajouter_document/{id_client}", name="malys_client_adddoc")
  445. */
  446. public function addDocAction($id_client, Request $request, EntityManagerInterface $em)
  447. {
  448. $doc = new Clientdocument();
  449. $client = $em->getRepository(Client::class)->find($id_client);
  450. $form = $this->createForm( ClientdocumentType::class, $doc);
  451. if ($request->isMethod('POST')) {
  452. $form->handleRequest($request);
  453. if ($form->isValid()) {
  454. $doc->upload($client->getId());
  455. $doc->setIdclient($client);
  456. $em->persist($doc);
  457. $em->flush();
  458. return $this->redirect($this->generateUrl('malys_client_show', array('id' => $id_client)));
  459. }
  460. }
  461. return $this->render('client/addDoc.html.twig', array('form' => $form->createView(), 'client' => $client));
  462. }
  463. /* SUPPRESSION D'UN DOCUMENT */
  464. /**
  465. * @Route("/supprimer_document/{id_client}/{id_doc}", name="malys_client_deldoc")
  466. */
  467. public function delDocAction($id_client, $id_doc, EntityManagerInterface $em)
  468. {
  469. $doc = $em->getRepository(Clientdocument::class)->find($id_doc);
  470. $doc->setEtat(0);
  471. $em->remove($doc);
  472. $em->flush();
  473. return $this->redirect($this->generateUrl('malys_client_show', array('id' => $id_client)));
  474. }
  475. /* MAINTENANCE CLIENT */
  476. /**
  477. * @Route("/admin/maintenance", name="malys_client_maintenance")
  478. */
  479. public function maintenanceAction(Request $request, EntityManagerInterface $em)
  480. {
  481. $page = $request->query->getInt('page', 1);
  482. $affiche = $request->query->getInt('affiche');
  483. $type = $request->query->getInt('type');
  484. $nom = $request->query->get('nom');
  485. //RECUPERATION DES CLIENTS
  486. $clients = $em->getRepository(Client::class)->findAllOrderByAfficheProspectNom($page, $nom, $type, $affiche, $this->paginator);
  487. return $this->render('client/maintenance.html.twig', array('clients' => $clients));
  488. }
  489. /* AFFICHE OU NON UN CLIENT */
  490. /**
  491. * @Route("/admin/affiche/{id}", name="malys_client_affiche")
  492. */
  493. public function afficheAction($id, Request $request, EntityManagerInterface $em)
  494. {
  495. $client = $em->getRepository(Client::class)->find($id);
  496. if ($client->getAffiche() == 1)
  497. $client->setAffiche(0);
  498. else
  499. $client->setAffiche(1);
  500. $em->flush();
  501. return $this->redirect($this->generateUrl('malys_client_maintenance', [
  502. 'nom' => $request->query->get('nom'),
  503. 'type' => $request->query->get('type'),
  504. 'affiche' => $request->query->get('affiche'),
  505. 'page' => $request->query->get('page'),
  506. ]));
  507. }
  508. /**
  509. * @Route("/admin/supprimer/{id}", name="malys_client_supprimer")
  510. */
  511. public function supprimerAction($id,Request $request, EntityManagerInterface $em)
  512. {
  513. $client = $em->getRepository(Client::class)->find($id);
  514. if (!$client) {
  515. throw $this->createNotFoundException('Client non trouvé.');
  516. }
  517. $ventes = $em->getRepository(Clientvente::class)->findBy(['idclient' => $client]);
  518. foreach ($ventes as $vente) {
  519. $em->remove($vente);
  520. }
  521. $em->remove($client);
  522. $em->flush();
  523. $this->addFlash('success', 'Client supprimé avec succès.');
  524. return $this->redirectToRoute('malys_client_maintenance', [
  525. 'nom' => $request->query->get('nom'),
  526. 'type' => $request->query->get('type'),
  527. 'affiche' => $request->query->get('affiche'),
  528. 'page' => $request->query->get('page'),
  529. ]); // Redirection après suppression
  530. }
  531. /**
  532. * @Route("/sans_commandes/{date}", name="malys_client_sans_commandes", defaults={"date"=0})
  533. */
  534. public function withoutOrderAction($date, EntityManagerInterface $em)
  535. {
  536. /* mois du tableau */
  537. $tab_mois_fr = $this->malysDates->getTabMoisFr();
  538. /* annee courante par défaut */
  539. if ($date == 0)
  540. $date = date('Y');
  541. //RECUPERATION DES DONNEES FACTURES
  542. $clientVente = $em->getRepository(Clientvente::class)->getAllClientsVentesInYear($date);
  543. $t_ListeCA = array();
  544. $t_ListeMois = array();
  545. $t_ListeDetail = array();
  546. foreach ($clientVente as $cv) {
  547. //TABLEAU DETAILLE
  548. $key = $cv['idClient'] . $cv['nomFournisseur'];
  549. $mois = intval($cv[0]['datefr']->format('m'));
  550. $t_ListeCA[$key][$mois]['ca_genere'] = number_format($cv[0]['montantht'], 2, '.', '');
  551. $t_ListeCA[$key]['client'] = $cv['nomClient'];
  552. $t_ListeCA[$key]['fournisseur'] = $cv['nomFournisseur'];
  553. $t_ListeCA[$key]['commercial'] = $cv['contact'];
  554. $t_ListeCA[$key]['cp'] = $cv['cpClient'];
  555. $t_ListeCA[$key]['idclient'] = $cv['idClient'];
  556. $t_ListeCA[$key]['idfournisseur'] = $cv['idFournisseur'];
  557. //TABLEAU MOIS PAR MOIS
  558. if (!isset($t_ListeMois[$mois]))
  559. $t_ListeMois[$mois] = array('ca_genere' => 0);
  560. $t_ListeMois[$mois]['ca_genere'] += number_format($cv[0]['montantht'], 2, '.', '');
  561. $t_ListeMois[$mois]['client'] = $cv['nomClient'];
  562. $t_ListeMois[$mois]['fournisseur'] = $cv['nomFournisseur'];
  563. $t_ListeMois[$mois]['commercial'] = $cv['contact'];
  564. $t_ListeMois[$mois]['cp'] = $cv['cpClient'];
  565. //TABLEAU PAR TYPE DETAIL
  566. if (!isset($t_ListeDetail[$key]))
  567. $t_ListeDetail[$key] = array('ca_genere' => 0);
  568. $t_ListeDetail[$key]['ca_genere'] += number_format($cv[0]['montantht'], 2, '.', '');
  569. $t_ListeDetail[$key]['client'] = $cv['nomClient'];
  570. $t_ListeDetail[$key]['fournisseur'] = $cv['nomFournisseur'];
  571. $t_ListeDetail[$key]['commercial'] = $cv['contact'];
  572. $t_ListeDetail[$key]['cp'] = $cv['cpClient'];
  573. }
  574. /* selecteur de date */
  575. $begin = date("Y", time()) - 3;
  576. $end = date("Y", time()) + 1;
  577. return $this->render('client/withoutOrder.html.twig', array(
  578. 'begin' => $begin,
  579. 'end' => $end,
  580. 'date' => $date,
  581. 'tab_mois_fr' => $tab_mois_fr,
  582. 't_ListeCA' => $t_ListeCA,
  583. 't_ListeMois' => $t_ListeMois,
  584. 't_ListeDetail' => $t_ListeDetail,
  585. ));
  586. }
  587. /* AFFICHAGE DE LA MAP CLIENT */
  588. /**
  589. * @Route("/carte", name="malys_client_map")
  590. */
  591. public function mapAction(Request $request, EntityManagerInterface $em)
  592. {
  593. //RECUPERATION DES UTILISATEURS POUR LISTE DEROULANTE
  594. $admins = $em->getRepository(Admin::class)->findAllOrderByContact();
  595. /* GENERATION DE LA LISTE CLIENT */
  596. $t_emplacements = array();
  597. $t_clients = array();
  598. if ($request->getMethod() == 'POST') {
  599. $clients = $em->getRepository(Client::class)->findClientsForMap($request->get('chtype'), $request->get('chcp'), $request->get('chactivite'), $request->get('chnote'), $request->get('chidadmin'));
  600. foreach ($clients as $c) {
  601. $t_geoloc = explode("|", $c->getGeocode());
  602. if ($c->getGeocode() != '0|0' && count($t_geoloc) == 2 && $t_geoloc[0] != 0 && $t_geoloc[1] != 0)
  603. $t_emplacements[] = "'" . str_replace("'", "", $c->getNom() . " - " . $c->getIdadmin()->getContact()) . "' , " . $t_geoloc[0] . ", " . $t_geoloc[1] . ", 1";
  604. $t_clients[] = str_replace("'", "", $c->getNom() . " - " . $c->getIdadmin()->getContact());
  605. }
  606. }
  607. return $this->render('client/map.html.twig', array(
  608. 'admins' => $admins,
  609. 't_emplacements' => $t_emplacements,
  610. 't_clients' => $t_clients,
  611. ));
  612. }
  613. /* CALCUL DES GEOCODES */
  614. /**
  615. * @Route("/calcul_geocode", name="malys_client_geocode")
  616. */
  617. public function calcGeocodeAction(EntityManagerInterface $em)
  618. {
  619. //RECUPERATION DES CLIENTS SANS GEOCODE
  620. $clients = $em->getRepository(Client::class)->findAllWithoutGeocode(150);
  621. foreach ($clients as $c) {
  622. $reponseGoogle = file_get_contents('http://maps.google.com/maps/geo?q=' . urlencode($c->getAdresse() . " " . $c->getCp() . " " . $c->getVille() . " " . $c->getPays()) . '&output=csv&key=ABQIAAAADxbV76bneFH864wunOoZxhR6dygP_f_bLnyCVNpf2ThnBuN3bxS3r1o22-RHvHY7f17qJiY06l3LHQ');
  623. if ($reponseGoogle != '') {
  624. $codes = explode(",", $reponseGoogle);
  625. $c->setGeocode($codes[2] . "|" . $codes[3]);
  626. }
  627. }
  628. $em->flush();
  629. return $this->redirect($this->generateUrl('malys_client_map'));
  630. }
  631. /* GET FOURNISSEUR IN ARRAY */
  632. private function getFournisseur($fournisseurs, $id)
  633. {
  634. foreach ($fournisseurs as $f)
  635. if ($f->getId() == $id)
  636. return $f;
  637. return null;
  638. }
  639. /**
  640. * @Route("/chercher/client", name="malys_client_recherche")
  641. */
  642. public function searchClientsAction(Request $request, EntityManagerInterface $em)
  643. {
  644. $searchTerm = $request->get('q');
  645. $clients = $em->getRepository(Client::class)
  646. ->createQueryBuilder('c')
  647. ->where('c.nom LIKE :term')
  648. ->andWhere('c.prospect =:prospect')
  649. ->andWhere('c.affiche =:affiche')
  650. ->setParameter('term', $searchTerm . '%')
  651. ->setParameter('prospect', 0)
  652. ->setParameter('affiche', 1)
  653. ->getQuery()
  654. ->getResult();
  655. $results = [];
  656. foreach ($clients as $client) {
  657. $results[] = [
  658. 'id' => $client->getId(),
  659. 'text' => $client->getNom(),
  660. ];
  661. }
  662. return new JsonResponse($results);
  663. }
  664. /**
  665. * @Route("/chercher/prospect", name="malys_prospect_recherche")
  666. */
  667. public function searchProspectsAction(Request $request, EntityManagerInterface $em)
  668. {
  669. $searchTerm = $request->get('q'); // Le terme de recherche
  670. // Rechercher les prospects en fonction du nom (ou tout autre champ pertinent)
  671. $prospects = $em->getRepository(Client::class)
  672. ->createQueryBuilder('c')
  673. ->where('c.nom LIKE :term')
  674. ->andWhere('c.prospect =:prospect')
  675. ->andWhere('c.affiche =:affiche')
  676. ->setParameter('term', $searchTerm . '%')
  677. ->setParameter('prospect', 1)
  678. ->setParameter('affiche', 1)
  679. ->getQuery()
  680. ->getResult();
  681. $results = [];
  682. foreach ($prospects as $prospect) {
  683. $noteSymbol = ($prospect->getNote() == 2) ? '+' : '-';
  684. $results[] = [
  685. 'id' => $prospect->getId(),
  686. 'text' => $prospect->getNom() . ' ' . $noteSymbol,
  687. ];
  688. }
  689. return new JsonResponse($results);
  690. }
  691. }