src/Controller/Api/Prive/ApiStatistiqueController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\Prive;
  3. use App\Entity\Appel;
  4. use App\Entity\Appelstatut;
  5. use App\Entity\Campagne;
  6. use App\Entity\Campagneprospect;
  7. use App\Entity\Client;
  8. use App\Entity\Contact;
  9. use App\Entity\Prospect;
  10. use App\Entity\Rdv;
  11. use App\Entity\Rdvstatut;
  12. use App\Entity\Utilisateur;
  13. use App\Entity\Ville;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. /**
  18.  * @Route("/statistique")
  19.  */
  20. class ApiStatistiqueController extends ApiController
  21. {
  22.    
  23.     /**
  24.      * @Route("/appelparstatut", name="api_Statistique_appelparstatut", methods={"POST"})
  25.      * @param Request $request
  26.      * @return JsonResponse
  27.      */
  28.     public function appelparstatut(Request $request)
  29.     {
  30.         $data json_decode($request->getContent(), true);
  31.         $date date("Ymd"strtotime("-30 days"strtotime(date("Ymd"))));
  32.         $where " WHERE appel.dateappel >= ".$date;
  33.             if (isset($data['params']['collaborateurId'])) {
  34.                 $where .=  ' AND appel.utilisateur='.$data['params']['collaborateurId'];
  35.             }else {
  36.                 if (isset($data['params']['espaceagent']) && $data['params']['espaceagent']) {
  37.                     $where .=  ' AND appel.utilisateur='.$this->getUtilisateurConnecte()->getId();
  38.                 }
  39.             }
  40.         $sql "
  41.                 SELECT       
  42.                 DATE_FORMAT(appel.dateappel, '%d/%m/%Y') AS jour,
  43.                 appelstatut.libelle AS statutappel,
  44.                 appelstatut.couleur AS couleurstatut,                
  45.                 count(appel.id) AS nombreappel    
  46.                 FROM ".Appel::class." AS appel
  47.                 LEFT JOIN ".Appelstatut::class." as appelstatut WITH appel.appelstatut = appelstatut.id
  48.                 LEFT JOIN ".Campagneprospect::class." AS campagneprospect WITH appel.campagneprospect = campagneprospect.id
  49.                 LEFT JOIN ".Campagne::class." AS campagne WITH campagneprospect.campagne = campagne.id
  50.                 LEFT JOIN ".Client::class." AS client WITH campagne.client = client.id
  51.                 ".$where."
  52.                 GROUP BY jour, statutappel
  53.                 ORDER BY appel.dateappel asc
  54.                 ";
  55.         $query $this->em->createQuery($sql);
  56.         $reponse $query->getResult();
  57.         return $this->apiOk($reponse);
  58.     }
  59.     /**
  60.      * @Route("/campagneparstatut/{id}", name="api_Statistique_campagneparstatut", methods={"GET"})
  61.      * @param int $id
  62.      * @return JsonResponse
  63.      */
  64.     public function campagneparstatut(int $id)
  65.     {
  66.         if ($id == null || $id <= 0) {
  67.             return $this->apiKo("Campagne non-trouvĂ©e !");
  68.         }
  69.         $where "WHERE campagneprospect.campagne = ".$id ;
  70.         $sql "
  71.                 SELECT 
  72.                 (case when appelstatut.couleur IS NULL then '#7c65ad' ELSE appelstatut.couleur END) AS couleurstatut ,
  73.                 (case when appelstatut.libelle IS NULL then 'Pas encore contactĂ©' ELSE appelstatut.libelle END) AS statutappel ,
  74.                 COUNT(campagneprospect.id) AS nombreprospect
  75.                 FROM
  76.                 ".Campagneprospect::class." AS campagneprospect
  77.                 LEFT join ".Appelstatut::class." AS appelstatut WITH appelstatut.id = campagneprospect.appelstatut
  78.                 ".$where."
  79.                 GROUP BY appelstatut.libelle, appelstatut.couleur
  80.                 ";
  81.         $query $this->em->createQuery($sql);
  82.         $reponse $query->getResult();
  83.         return $this->apiOk($reponse);
  84.     }
  85.     /**
  86.      * @Route("/avancementcampagneappel", name="api_Statistique_avancementcampagneappel", methods={"POST"})
  87.      * @param Request $request
  88.      * @return JsonResponse
  89.      */
  90.     public function avancementcampagneappel(Request $request)
  91.     {
  92.         $data json_decode($request->getContent(), true);
  93.         $where $this->paramstowhere($data);
  94.         $sql "SELECT
  95.                 (case when campagneprospect.utilisateur IS NULL then 'NON' ELSE 'OUI' END) AS estcontacte,
  96.                 COUNT(campagneprospect.id) AS nombreprospect
  97.                 FROM
  98.                 ".Campagneprospect::class." AS campagneprospect
  99.                 ".$where."
  100.                 GROUP BY estcontacte
  101.                 ";
  102.         $query $this->em->createQuery($sql);
  103.         $reponse $query->getResult();
  104.         return $this->apiOk($reponse);
  105.     }
  106.     /**
  107.      * @Route("/avancementcampagneobjectif", name="api_Statistique_avancementcampagneobjectif", methods={"POST"})
  108.      * @param Request $request
  109.      * @return JsonResponse
  110.      */
  111.     public function avancementcampagneobjectif(Request $request)
  112.     {
  113.         $data json_decode($request->getContent(), true);
  114.         $where $this->paramstowhere($data);
  115.         $sql "SELECT
  116.                 campagne.id AS idcampagne,
  117.                 campagne.objectif AS totalarealiser,
  118.                 COUNT(rdv.id) AS totalrealise
  119.                 FROM
  120.                 ".Rdv::class." AS rdv
  121.                 LEFT JOIN ".Rdvstatut::class." AS rdvstatut WITH rdv.rdvstatut = rdvstatut.id
  122.                 LEFT JOIN ".Campagne::class." AS campagne WITH rdv.campagne = campagne.id
  123.                 ".$where."
  124.                 GROUP BY campagne.id";
  125.         $query $this->em->createQuery($sql);
  126.         $reponse $query->getResult();
  127.         return $this->apiOk($reponse);
  128.     }
  129.    /**
  130.      * @Route("/collaborateurappelstatut", name="api_Statistique_collaborateurappelstatut", methods={"POST"})
  131.      * @param Request $request
  132.      * @return JsonResponse
  133.      */
  134.     public function collaborateurappelstatut(Request $request)
  135.     {
  136.         $data json_decode($request->getContent(), true);
  137.         $where $this->paramstowhere($data);
  138.         $sql "SELECT
  139.                 CASE WHEN utilisateur.id IS NULL then 0 ELSE utilisateur.id end AS idcollaborateur , 
  140.                 CASE WHEN utilisateur.id IS NULL then 'PAS ENCORE AFFECTE' ELSE UPPER(concat(utilisateur.nom,' ',utilisateur.prenom)) end AS collaborateur , 
  141.                 CASE WHEN appelstatut.id IS NULL then 0 ELSE appelstatut.id end AS idappelstatut ,
  142.                 CASE WHEN appelstatut.id IS NULL then 'PAS ENCORE APPELE' ELSE UPPER(appelstatut.libelle) end AS statut ,
  143.                 COUNT(campagneprospect.id) AS nombreprospect
  144.                 FROM 
  145.                 ".Campagneprospect::class." AS campagneprospect
  146.                 LEFT JOIN ".Utilisateur::class." AS utilisateur WITH campagneprospect.traitementpar = utilisateur.id
  147.                 LEFT JOIN ".Appelstatut::class." AS appelstatut WITH campagneprospect.appelstatut = appelstatut.id
  148.                 ".$where."
  149.                 GROUP BY utilisateur.id,appelstatut.id";
  150.         $query $this->em->createQuery($sql);
  151.         $reponse $query->getResult();
  152.         return $this->apiOk($reponse);
  153.     }
  154.     /**
  155.      * @Route("/collaborateurappels", name="api_Statistique_collaborateurappels", methods={"POST"})
  156.      * @param Request $request
  157.      * @return JsonResponse
  158.      */
  159.     public function collaborateurappels(Request $request)
  160.     {
  161.         $data json_decode($request->getContent(), true);
  162.         $where $this->paramstowhere($data);
  163.         $sql "SELECT
  164.                 utilisateur.id AS idutilisateur,
  165.                 CONCAT(utilisateur.nom,' ',utilisateur.prenom) AS nomutilisateur,
  166.                 DATE_FORMAT(appel.dateappel, '%Y-%m-%d') AS datetraitement,
  167.                 COUNT(appel.id) AS nombreappel,
  168.                 SUM(appel.dureeappel) dureetraitement
  169.                 FROM ".Appel::class." as appel
  170.                 LEFT JOIN ".Campagneprospect::class." as campagneprospect WITH campagneprospect.id = appel.campagneprospect
  171.                 LEFT JOIN ".Utilisateur::class." as utilisateur WITH utilisateur.id = appel.utilisateur
  172.                 ".$where."
  173.                 GROUP BY idutilisateur,nomutilisateur, datetraitement
  174.                 ORDER BY appel.dateappel asc";
  175.         $query $this->em->createQuery($sql);
  176.         $reponse $query->getResult();
  177.         return $this->apiOk($reponse);
  178.     }
  179.     ////////////////////////////STATISTIQUE GLOBAL ////////////////////////
  180.     /**
  181.      * @Route("/prospectsglobal", name="api_Statistique_prospectsglobal", methods={"GET"})
  182.      * @return JsonResponse
  183.      */
  184.     public function prospectsglobal()
  185.     {
  186.         $sqlprospects "SELECT
  187.                 COUNT(prospect.id) AS total,
  188.                 CASE prospect.email WHEN '' then 0 ELSE 1 END AS avecemail,
  189.                 CASE prospect.standard WHEN '' then 0 ELSE 1 END AS avecstandard
  190.                 FROM ".Prospect::class." as prospect
  191.                 GROUP BY avecemail,avecstandard";
  192.         $sqlcontacts "SELECT
  193.                 COUNT(contact.id) AS total,
  194.                 CASE contact.email WHEN '' then 0 ELSE 1 END AS avecemail,
  195.                 CASE contact.fixe WHEN '' then 0 ELSE 1 END AS avecfixe,
  196.                 CASE contact.mobile WHEN '' then 0 ELSE 1 END AS avecmobile
  197.                 FROM ".Contact::class." as contact
  198.                 GROUP BY avecemail,avecfixe,avecmobile";
  199.         $queryprospects $this->em->createQuery($sqlprospects);
  200.         $querycontacts $this->em->createQuery($sqlcontacts);
  201.         $prospects $queryprospects->getResult();
  202.         $contacts $querycontacts->getResult();
  203.         $reponse = [
  204.             "prospects" => $prospects,
  205.             "contacts" => $contacts,
  206.         ];
  207.         return $this->apiOk($reponse);
  208.     }
  209.     /**
  210.      * @Route("/prospectsevolution", name="api_Statistique_prospectsevolution", methods={"POST"})
  211.      * @param Request $request
  212.      * @return JsonResponse
  213.      */
  214.     public function prospectsevolution(Request $request)
  215.     {
  216.         $date date("Ymd"strtotime("-365 days"strtotime(date("Ymd"))));
  217.         $where " WHERE appel.dateappel >= ".$date;
  218.         $sqlcreation "SELECT
  219.                         COUNT(prospect.id) AS total,
  220.                         year(prospect.datecreation) AS annee,
  221.                         month(prospect.datecreation) as mois
  222.                         FROM ".Prospect::class." as prospect
  223.                         WHERE prospect.datecreation >= ".$date."
  224.                         GROUP BY annee,mois
  225.                         ORDER BY annee, mois asc";
  226.         $sqlmodification "SELECT
  227.                         COUNT(prospect.id) AS total,
  228.                         year(prospect.datemodification) AS annee,
  229.                         month(prospect.datemodification) as mois
  230.                         FROM ".Prospect::class." as prospect
  231.                         WHERE prospect.datemodification >= ".$date."
  232.                         GROUP BY annee,mois
  233.                         ORDER BY annee, mois asc";
  234.         $querycreation $this->em->createQuery($sqlcreation);
  235.         $querymodification $this->em->createQuery($sqlmodification);
  236.         $creation $querycreation->getResult();
  237.         $modification $querymodification->getResult();
  238.         $reponse = [
  239.             "creation" => $creation,
  240.             "modification" => $modification,
  241.         ];
  242.         return $this->apiOk($reponse);
  243.     }
  244.     /**
  245.      * @Route("/prospectscp", name="api_Statistique_prospectscp", methods={"GET"})
  246.      * @return JsonResponse
  247.      */
  248.     public function prospectscp()
  249.     {
  250.         $sqltotal "SELECT
  251.                 COUNT(prospect.id) as total,
  252.                 SUBSTRING(ville.codepostal,1,2) as cp
  253.                 FROM ".Prospect::class." as prospect
  254.                 LEFT JOIN ".Ville::class." as ville WITH ville.id = prospect.ville
  255.                 GROUP BY cp";
  256.         $sqlavecemail "SELECT
  257.                 COUNT(prospect.id) as total,
  258.                 SUBSTRING(ville.codepostal,1,2) as cp
  259.                 FROM ".Prospect::class." as prospect
  260.                 LEFT JOIN ".Ville::class." as ville WITH ville.id = prospect.ville
  261.                 WHERE prospect.email not like ''
  262.                 GROUP BY cp";
  263.         $sqlavecstandard "SELECT
  264.                 COUNT(prospect.id) as total,
  265.                 SUBSTRING(ville.codepostal,1,2) as cp
  266.                 FROM ".Prospect::class." as prospect
  267.                 LEFT JOIN ".Ville::class." as ville WITH ville.id = prospect.ville
  268.                 WHERE prospect.standard not like ''
  269.                 GROUP BY cp";
  270.         $querytotal $this->em->createQuery($sqltotal);
  271.         $queryavecemail $this->em->createQuery($sqlavecemail);
  272.         $queryavecstandard $this->em->createQuery($sqlavecstandard);
  273.         $total $querytotal->getResult();
  274.         $totalavecemail $queryavecemail->getResult();
  275.         $totalavecstandard $queryavecstandard->getResult();
  276.         $reponse = [
  277.             "total" => $total,
  278.             "totalavecemail" => $totalavecemail,
  279.             "totalavecstandard" => $totalavecstandard,
  280.         ];
  281.         return $this->apiOk($reponse);
  282.     }
  283.     /***************************** HELPERS *****************/
  284.     /**
  285.      * @param array $data
  286.      * @return string
  287.      */
  288.     public function paramstowhere(array $data) : string{
  289.         //AND
  290.         $and " 1=1";
  291.         if (isset($data['filter']['and'])) {
  292.             $filtres $data['filter']['and'];
  293.             if (sizeof($filtres) != 0) {
  294.                 $and "( 1=1";
  295.                 foreach ($filtres as $key => $value) {
  296.                     $and .= " AND " $key " " $value;
  297.                 }
  298.                 $and .= " )";
  299.             }
  300.         }
  301.         //OR
  302.         $or "";
  303.         if (isset($data['filter']['or'])) {
  304.             $filtres $data['filter']['or'];
  305.             if (sizeof($filtres) != 0) {
  306.                 $or " ( 1=0";
  307.                 foreach ($filtres as $key => $value) {
  308.                     $or .= " OR " $key " " $value;
  309.                 }
  310.                 $or .= " )";
  311.             }
  312.         }
  313.         $where " WHERE ".$and;
  314.         if ($or != "") {
  315.             $where .= " AND " $or;
  316.         }
  317.         return $where;
  318.     }
  319. }