<?php
namespace App\Controller\Api\Prive;
use App\Entity\Appareil;
use App\Entity\Appel;
use App\Entity\Appelstatut;
use App\Entity\Campagne;
use App\Entity\Campagnecollaborateur;
use App\Entity\Campagneprospect;
use App\Entity\Campagneprospectsignalement;
use App\Entity\Cleaningdb;
use App\Entity\Cleaningdbcollaborateur;
use App\Entity\Commentaire;
use App\Entity\Contact;
use App\Entity\Fichier;
use App\Entity\Prospect;
use App\Entity\Prospectdetail;
use App\Entity\Rdv;
use App\Entity\Utilisateur;
use App\Helpers\Mailing;
use Doctrine\ORM\Query;
use Doctrine\ORM\Query\ResultSetMapping;
use phpDocumentor\Reflection\Types\Boolean;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/espaceagent")
*/
class ApiEspaceagentController extends ApiController
{
public function saveTrace(string $trace) {
//file_put_contents("text.json","azizo");
// save trace
$utilisateur = $this->getUtilisateurConnecte()->getId();
$today = date("Ymd");
$repertoire = "logs/".$utilisateur;
if (!is_dir($repertoire)) {
$filesystem = new Filesystem();
$filesystem->mkdir($repertoire, 0700);
}
$text = PHP_EOL."---------------------".date("Y-m-d H:i:s")."------------------------------".PHP_EOL.$trace;
file_put_contents($repertoire.'/log_'.$today.'.txt', $text , FILE_APPEND | LOCK_EX);
}
private function buildTransitionMessage($snapshotOuverture, Appelstatut $nouveauStatut, array $data, Utilisateur $utilisateur): string
{
$snapshot = $snapshotOuverture ?? [];
$ancienStatut = $snapshot['statutActuel']['libelle'] ?? null;
$ancienDateRappel = $snapshot['dateRappel'] ?? null;
$ancienUtilisateur = $snapshot['utilisateur'] ?? null;
$nouveauDateRappel = $nouveauStatut->getRappel() ? ($data['daterappel'] ?? null) : null;
$typeRappel = null;
if ($nouveauStatut->getRappel()) {
$partageRappel = isset($data['estpartagerappel']) ? (bool)$data['estpartagerappel'] : false;
$typeRappel = $partageRappel ? 'rappel partagé' : 'rappel ++';
}
$ancienStatutLabel = $ancienStatut ?: 'non renseigné';
$nouveauStatutLabel = $nouveauStatut->getLibelle() ?: 'non renseigné';
$ouverturePar = $ancienUtilisateur ? trim($ancienUtilisateur['prenom'] . ' ' . $ancienUtilisateur['nom']) : null;
$affecteA = trim($utilisateur->getPrenom() . ' ' . $utilisateur->getNom());
$dateRappelTexte = '';
if ($nouveauDateRappel) {
try {
$dateRappelObjet = new \DateTimeImmutable($nouveauDateRappel);
$dateRappelObjet = $dateRappelObjet->setTimezone(new \DateTimeZone('Europe/Paris'));
$dateRappelTexte = $dateRappelObjet->format('d/m/Y à H:i') . ' (Europe/Paris)';
} catch (\Exception $e) {
$dateRappelTexte = $nouveauDateRappel;
}
} elseif ($ancienDateRappel) {
try {
$dateRappelObjet = new \DateTimeImmutable($ancienDateRappel);
$dateRappelObjet = $dateRappelObjet->setTimezone(new \DateTimeZone('Europe/Paris'));
$dateRappelTexte = $dateRappelObjet->format('d/m/Y à H:i') . ' (Europe/Paris)';
} catch (\Exception $e) {
$dateRappelTexte = $ancienDateRappel;
}
}
$phrases = [];
$phrases[] = 'Le statut est passé de <strong>« ' . $ancienStatutLabel . ' »</strong> à <strong>« ' . $nouveauStatutLabel . ' »</strong>.';
if ($dateRappelTexte !== '') {
$phrases[] = 'Un rappel est prévu le <strong>' . $dateRappelTexte . '</strong>.';
}
if ($typeRappel) {
$phrases[] = 'Il s’agit d’un <strong>' . $typeRappel . '</strong>.';
}
if ($ouverturePar) {
$phrases[] = 'La fiche a été ouverte par <strong>' . $ouverturePar . '</strong>.';
}
$phrases[] = 'L’agent en charge est <strong>' . $affecteA . '</strong>.';
return '<div class="transition-comment"><p><strong>Transition de la fiche :</strong> ' . implode(' ', $phrases) . '</p></div>';
}
private function buildHistoriqueStatutSnapshot(?array $statut): ?array
{
if (!$statut) {
return null;
}
return [
'id' => $statut['id'] ?? null,
'libelle' => $statut['libelle'] ?? null,
];
}
/**
* @Route("/nextprospect", name="api_espaceagent_nextprospect", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function nextprospect(Request $request)
{
$data = json_decode($request->getContent(), true);
$id = $data['idCampagne'];
$getToutRappelPrive = $data['getRappelPrive'];
$getToutRappelPartage = $data['getRappelPartage'];
$trace = "Input : ".json_encode($data).PHP_EOL;
// Chercher les campagnesprospect utilisateur
/** @var Campagne $campagne */
$campagne = $this->em->getRepository(Campagne::class)->find($id);
if (!$campagne) {
return $this->apiKo("Campagne non trouvée !!");
}
/** @var Campagneprospect $campagneprospect */
$campagneprospect = $this->getCampagneprospect($campagne,$getToutRappelPrive,$getToutRappelPartage);
if (!$campagneprospect) {
$trace .= "OutPut : KO";
return $this->apiKo("Pas de prospect trouvé. Tous les prospects de la campagne ont été traités !");
}
$data = [
"id" => $campagneprospect->getId(),
"idCampagne" => $campagneprospect->getCampagne() ? $campagneprospect->getCampagne()->getId() : "",
"idAppelStatut" => $campagneprospect->getAppelstatut() ? $campagneprospect->getAppelstatut()->getId() : "",
"rappelprive" => $campagneprospect->getRappelprive(),
"daterappel" => $campagneprospect->getDaterappel(),
"idUtilisateur" => $campagneprospect->getUtilisateur() ? $campagneprospect->getUtilisateur()->getId():""
];
$trace .= "OutPut : ".json_encode($data).PHP_EOL;
$this->saveTrace($trace);
return $this->apioK($campagneprospect);
}
/**
* @Route("/enregistrerappel", name="api_espaceagent_enregistrerappel", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function enregistrerappel(Request $request)
{
$data = json_decode($request->getContent(), true);
try {
if (!isset($data['prospect'])) {
return $this->apiKo("Prospect non trouvé !!");
}
if (!isset($data['appelsatut'])) {
return $this->apiKo("Statut appel non trouvé !!");
}
if (!isset($data['campagneprospect'])) {
return $this->apiKo("Campagne prospect non trouvé !!");
}
// 1. Update info prospect
$prospect = $this->chercherProspect($data['prospect']);
$prospect = $this->saveProspect($prospect, $data['prospect']);
if (!$prospect instanceof Prospect) {
return $this->apiKo($prospect);
}
/*
campagneprospect: {id: this.campagneprospect.id},
prospect: this.prospect,
commentaire: this.commentaire,
appelsatut: {id: this.appelstatutSelected.id},
daterappel: this.dateRappel,
estpartagerappel: this.estPartageRappel,
affectera: {id: affecterA}, // affecter le rappel à
dureeappel: this.timerSecond,
contact: this.contactSelected,
numerotelephone: this.numerotelephone,
daterdv: this.dateRdv
*/
/** @var Utilisateur $utilisateur */
$utilisateur = $this->getUtilisateurConnecte();
/** @var Appelstatut $appelstatut */
$appelstatut = $this->getObject(Appelstatut::class, $data['appelsatut']['id']);
$numerotelephone = "";
if (isset($data['numerotelephone'])) {
$numerotelephone = $data['numerotelephone'];
}
$sourceOuverture = trim((string)($data['sourceouverture'] ?? $data['sourceOuverture'] ?? ''));
if ($sourceOuverture == '') {
$sourceOuverture = Appel::SOURCE_INCONNUE;
}
// 2. Commentaires
/** @var Commentaire $commentaire */
$commentaire = new Commentaire();
$commentaire->setProspect($prospect);
$commentaire->setUtilisateur($utilisateur);
$commentaire->setDate(new \DateTime());
$messageCommentaire = trim((string)($data['commentaire'] ?? ''));
$transitionMessage = $this->buildTransitionMessage($data['snapshotouverture'] ?? null, $appelstatut, $data, $utilisateur);
if ($messageCommentaire !== '') {
$commentaire->setMessage($messageCommentaire . '<br><br>' . $transitionMessage);
} else {
$commentaire->setMessage($transitionMessage);
}
$this->em->persist($commentaire);
$this->em->flush();
$commentairereponsable = new Commentaire();
$commentairereponsable->setDate(new \DateTime());
$commentairereponsable->setMessage("");
$this->em->persist($commentairereponsable);
$this->em->flush();
// 3. Update campagne prospect
/** @var Campagneprospect $campagneprospect */
$campagneprospect = $this->getObject(Campagneprospect::class, $data['campagneprospect']['id']);
// contact !
if (isset($data['contact'])) {
$historique = $campagneprospect->getHistorique();
if (is_null($historique) || $historique == "null") {
$historique = array([]);
}
$historique[] = [
"contact" => $data['contact']['id'],
"appelstatut" => $appelstatut->getLibelle()
];
$campagneprospect->setHistorique($historique);
}
$campagneprospect->setCommentaire($data['commentaire']);
$campagneprospect->setAppelstatut($appelstatut);
$campagneprospect->setRappelprive(2);
$campagneprospect->setTraitementdate(new \DateTime());
$campagneprospect->setTraitementencore(0);
$campagneprospect->setTraitementpar($utilisateur);
$campagneprospect->setUtilisateur($utilisateur); // Par defaut : affecté à utilisateur connecté
$campagneprospect->setDaterappel(null);
// TRAITER LE CAS RAPPELL
if ($appelstatut->getRappel() && isset($data['estpartagerappel']) && isset($data['daterappel'])) {
$campagneprospect->setRappelprive(!$data['estpartagerappel']);
$campagneprospect->setDaterappel(new \DateTime($data['daterappel']));
// cas rappel privé avec affectation à un autre collaborateur
if(!$data['estpartagerappel'] == true) {
$affecterA = 0;
if (isset($data['affectera']) && isset($data['affectera']['id'])) {
$affecterA = $data['affectera']['id'];
}
if ($affecterA > 0 && $affecterA != $utilisateur->getId()) {
$collaborateur = $this->getObject(Utilisateur::class,$affecterA);
if($collaborateur){
$campagneprospect->setUtilisateur($collaborateur);
}
}
}
}
$this->em->persist($campagneprospect);
// 3. Historique des appels
$historique = $campagneprospect->getHistorique();
if (is_null($historique) || $historique === 'null') {
$historique = [];
}
$historique[] = [
'type' => 'statut_fiche',
'date' => (new \DateTime())->format('c'),
'sourceOuverture' => $sourceOuverture,
'ancienStatut' => $this->buildHistoriqueStatutSnapshot($data['snapshotouverture']['statutActuel'] ?? null),
'nouveauStatut' => $this->buildHistoriqueStatutSnapshot([
'id' => $appelstatut->getId(),
'libelle' => $appelstatut->getLibelle()
]),
'dateRappel' => $appelstatut->getRappel() && isset($data['daterappel']) ? $data['daterappel'] : null,
'rappelPrive' => $appelstatut->getRappel() ? (!$data['estpartagerappel'] ? 1 : 0) : null,
'utilisateur' => [
'id' => $utilisateur->getId(),
'nom' => $utilisateur->getNom(),
'prenom' => $utilisateur->getPrenom()
],
'message' => $transitionMessage
];
$campagneprospect->setHistorique($historique);
/** @var Appel $appel */
$appel = new Appel();
$appel->setUtilisateur($utilisateur);
$appel->setCampagneprospect($campagneprospect);
$appel->setDateappel(new \DateTime());
$appel->setAppelstatut($appelstatut);
$appel->setDureeappel($data['dureeappel']);
$appel->setNumerotelephone($numerotelephone);
$appel->setSourceouverture($sourceOuverture);
$appel->setCommentaire($commentaire);
$this->em->persist($appel);
// TRAITER LE CAS RDV
if ($appelstatut->getRdv() && isset($data['daterdv'])) {
$rdv = new Rdv();
$rdv->setUtilisateur($utilisateur);
$rdv->setProspect($prospect);
$rdv->setCampagne($campagneprospect->getCampagne());
$rdv->setDaterdv(new \DateTime($data['daterdv']));
$rdv->setDatecreation(new \DateTime());
$rdv->setDatemodification(new \DateTime());
$rdv->setCommentaire($commentaire);
$rdv->setCommentaireresponsable($commentairereponsable);
// contact !
if (isset($data['contact']) && isset($data['contact']['id'])) {
/** @var Contact $contact */
$contact = $this->getObject(Contact::class, $data['contact']['id']);
if ($contact) {
$rdv->setContact($contact);
}
}
$this->em->persist($rdv);
// Notification
(new Mailing($this->mailer, $this->templating))->notificationstatutrdv($rdv);
}
//TRAITER LE CAS FICHEQUALIFIE
if ($appelstatut->getFichequalifie() || $appelstatut->getFichearequalifie()) {
// Transférer fiche vers campagne cible
$campagnecibleId = $campagneprospect->getCampagne()->getCampagnecible();
if($campagnecibleId>0){
$campagnecible = $this->getObject(Campagne::class,$campagnecibleId);
if($campagnecible){
// verifier l'existance prospect dans la campagne
/** @var Campagneprospect $campagneprospectCible */
$campagneprospectCible = $this->em->getRepository(Campagneprospect::class)->findOneBy(
["prospect" => $prospect,"campagne" => $campagnecible]
);
if(!$campagneprospectCible){
$campagneprospectCible = new Campagneprospect();
$campagneprospectCible->setProspect($prospect);
$campagneprospectCible->setCampagne($campagnecible);
}else{
$campagneprospectCible->setAppelstatut(null);
$campagneprospectCible->setUtilisateur(null);
$campagneprospectCible->setRappelprive(-1);
$campagneprospectCible->setDaterappel(null);
}
$campagneprospectCible->setCommentaire($campagneprospect->getCommentaire());
$this->em->persist($campagneprospectCible);
}
}
}
// Flush modification dans la bdd
$this->em->flush();
return $this->apioK("1");
} catch (\Exception $e) {
//throw $e;
return $this->apiKo($e->getMessage());
}
}
/////////////////////////////////////// ACTION CLEANING DB ///////////////////////////
/**
* @Route("/activecleaningdb", name="api_espaceagent_activecleaningdb", methods={"GET"})
* @return JsonResponse
*/
public function activecleaningdb()
{
/** @var Cleaningdbcollaborateur $cleaningCollaborateur */
$cleaningCollaborateur = $this->em->getRepository(Cleaningdbcollaborateur::class)->findOneBy(
[
"collaborateur" => $this->getUtilisateurConnecte()->getId()
]
);
if($cleaningCollaborateur == null){
return $this->apioK(false);
}
return $this->apioK(true);
}
/**
* @Route("/verifierdoublon/{id}", name="api_espaceagent_verifierdoublon", methods={"GET"})
* @param int $id
* @return JsonResponse
*/
public function verifierdoublon(int $id)
{
if($id == null && $id<=0){
return $this->apiOk([]);
}
$sql = "SELECT
p.id as id,
p.doublonSiret as siret,
p.doublonStandard as standard
FROM prospectdoublon AS p
WHERE p.id NOT IN (SELECT c.uid FROM cleaningdb as c WHERE c.action <>0)
AND (p.id like '%-".$id."' OR p.id like '".$id."-%') LIMIT 1";
$rsm = new ResultSetMapping();
$rsm->addScalarResult('id','id');
$rsm->addScalarResult('siret','siret');
$rsm->addScalarResult('standard','standard');
$items = $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
$reponse = [];
foreach ($items as $item){
$reponse = [
"estdoublon" => true,
"standard" => (int) $item["standard"],
"siret" => (int) $item["siret"],
"uid" => $item["id"]
];
}
return $this->apiOk($reponse);
}
/**
* @Route("/ouvrirdoublon/{uid}", name="api_espaceagent_ouvrirdoublon", methods={"GET"})
* @param string $uid
* @return JsonResponse
*/
public function ouvrirdoublon(string $uid)
{
if(!isset($uid)){
return $this->apiOk([]);
}
/** @var Utilisateur $utilisateur */
$utilisateur = $this->getUtilisateurConnecte();
/** @var Cleaningdb $cleaningdb */
$cleaningdb = $this->em->getRepository(Cleaningdb::class)->findOneBy(
[
"uid" =>$uid
]
);
if($cleaningdb != null){
$cleaningdb->setUtilisateur($utilisateur);
$this->em->persist($cleaningdb);
$this->em->flush();
}else{
$sql = "SELECT
p.id as id,
p.societe as societe,
p.siret as siret,
p.standard as standard
FROM prospectdoublon AS p
WHERE p.id = '".$uid."'
LIMIT 1";
$rsm = new ResultSetMapping();
$rsm->addScalarResult('id','id');
$rsm->addScalarResult('societe','societe');
$rsm->addScalarResult('siret','siret');
$rsm->addScalarResult('standard','standard');
$items = $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
foreach ($items as $item){
$cleaningdb = $this->em->getRepository(Cleaningdb::class)->findOneBy([
"uid" => $item["id"]
]);
if($cleaningdb == null){
$cleaningdb = new Cleaningdb();
$cleaningdb->setAction(0);
$cleaningdb->setUtilisateur($utilisateur);
$cleaningdb->setUid($item["id"] );
$cleaningdb->setSociete($item["societe"] );
$cleaningdb->setSiret($item["siret"] );
$cleaningdb->setStandard($item["standard"] );
$this->em->persist($cleaningdb);
$this->em->flush();
}
}
}
if($cleaningdb != null && $cleaningdb->getId()>0){
// retourn les prospect doublon
$ids = explode("-",$cleaningdb->getUid());
/** @var Prospect[] $prospects */
$prospects = $this->em->getRepository(Prospect::class)->findBy([
"id" => $ids
]);
$data = [
"id" => $cleaningdb->getId(),
"prospects" => $prospects,
"erreurMessage" => "",
"erreur" => false,
];
}else{
$data = [
"id" => "",
"prospects" => [],
"erreurMessage" => "Pas de prospect doublons trouvé !",
"erreur" => true,
];
}
return $this->apiOk($data);
}
/**
* @Route("/nextprospectdoublon", name="api_espaceagent_nextprospectdoublon", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function nextprospectdoublon(Request $request)
{
/** @var Utilisateur $utilisateur */
$utilisateur = $this->getUtilisateurConnecte();
// Recuperer Next Element à traiter
/** @var Cleaningdb $cleaningdb */
$cleaningdb = $this->em->getRepository(Cleaningdb::class)->findOneBy(
[
"utilisateur" => $utilisateur->getId(),
"action" => 0
]
);
if($cleaningdb == null){
$sql = "SELECT
p.id as id,
p.societe as societe,
p.siret as siret,
p.standard as standard
FROM prospectdoublon AS p
WHERE p.id NOT IN (SELECT c.uid FROM cleaningdb AS c )
LIMIT 2";
$rsm = new ResultSetMapping();
$rsm->addScalarResult('id','id');
$rsm->addScalarResult('societe','societe');
$rsm->addScalarResult('siret','siret');
$rsm->addScalarResult('standard','standard');
$items = $this->em->createNativeQuery($sql,$rsm)->getScalarResult();
foreach ($items as $item){
$cleaningdb = $this->em->getRepository(Cleaningdb::class)->findOneBy([
"uid" => $item["id"]
]);
if($cleaningdb == null){
$cleaningdb = new Cleaningdb();
$cleaningdb->setAction(0);
$cleaningdb->setUtilisateur($utilisateur);
$cleaningdb->setUid($item["id"] );
$cleaningdb->setSociete($item["societe"] );
$cleaningdb->setSiret($item["siret"] );
$cleaningdb->setStandard($item["standard"] );
$this->em->persist($cleaningdb);
$this->em->flush();
}
}
}
if($cleaningdb != null && $cleaningdb->getId()>0){
// retourn les prospect doublon
$ids = explode("-",$cleaningdb->getUid());
/** @var Prospect[] $prospects */
$prospects = $this->em->getRepository(Prospect::class)->findBy([
"id" => $ids
]);
$data = [
"id" => $cleaningdb->getId(),
"prospects" => $prospects,
"erreurMessage" => "",
"erreur" => false,
];
}else{
$data = [
"id" => $cleaningdb->getId(),
"prospects" => [],
"erreurMessage" => "Pas de prospect doublons trouvé !",
"erreur" => true,
];
}
return $this->apiOk($data);
}
/**
* @Route("/enregistrerdoublon", name="api_espaceagent_enregistrerdoublon", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function enregistrerdoublon(Request $request)
{
$data = json_decode($request->getContent(), true);
if(!isset($data["id"])
|| !isset($data["deletedProspects"])
|| !isset($data["savedProspects"])
|| !isset($data["prospectdetail"])
|| !isset($data["prospect"])
|| !isset($data["appreils"])
|| !isset($data["contacts"])
){
return $this->apiKo("Object des données n'est pas valide !");
}
$id = $data["id"];
/** @var Cleaningdb $cleaningdb */
$cleaningdb = $this->getObject(Cleaningdb::class,$id);
if($cleaningdb == null){
return $this->apiKo("Object des données n'est pas valide !");
}
//return $this->apiOk("OK");// a supprimer
$this->em->getConnection()->beginTransaction();
try {
//1. update prospect gardé
$prospect = $this->getObject(Prospect::class,$data["prospect"]["id"]);
$result = $this->saveProspect($prospect,$data["prospect"]);
if(!($result instanceof Prospect)){
throw new \Exception($result);
}
$prospectdetail = $this->saveProspectdetail($prospect, $data["prospectdetail"]);
if(!($prospectdetail instanceof Prospectdetail)){
throw new \Exception($prospectdetail);
}
//2. archivé les doublons
$ids = $data["deletedProspects"];
$historique = [];
foreach ($ids as $id){
/** @var Prospect $prospectArchive */
$prospectArchive = $this->getObject(Prospect::class,$id);
if($prospectArchive != null){
$historique = $this->ArchiverProspect($prospect,$prospectArchive);
}
}
if($historique instanceof \Exception){
throw $historique;
}
$cleaningdb->setHistorique($historique);
$this->em->getConnection()->commit();
$cleaningdb->setDeletedObjects($data["deletedProspects"]);
$cleaningdb->setSavedObjects($data["savedProspects"]);
$cleaningdb->setAction(1);
return $this->apioK("1");
} catch (\Exception $e) {
$this->em->getConnection()->rollBack();
$cleaningdb->setAction(-1);
$cleaningdb->setCommentaire($e->getMessage());
return $this->apiKo($e->getMessage());
} finally {
$this->em->persist($cleaningdb);
$this->em->flush();
}
}
/**
* @param int $id
*/
public function ArchiverProspect(Prospect $prospect,Prospect $prospectArchive){
$historique = [];
$histo = [];
try{
//1. Transfert Contacts
/** @var Contact[] $contacts */
$contacts = $this->em->getRepository(Contact::class)->findBy(
["prospect" => $prospectArchive->getId()]
);
/** @var Contact $contact */
foreach ($contacts as $contact){
$contact->setProspect($prospect);
$this->em->persist($contact);
$histo[] = ["id" => $contact->getId()];
}
$historique[] = ["contacts" => $histo];
$histo = [];
//2. Appareils
/** @var Appareil[] $appareils */
$appareils = $this->em->getRepository(Appareil::class)->findBy(
["prospect" => $prospectArchive->getId()]
);
/** @var Appareil $appareil */
foreach ($appareils as $appareil){
$appareil->setProspect($prospect);
$this->em->persist($appareil);
$histo[] = ["id" => $appareil->getId()];
}
$historique[] = ["appareils" => $histo];
$histo = [];
//3. CampagneProspect
/** @var Campagneprospect[] $campagneprospects */
$campagneprospects = $this->em->getRepository(Campagneprospect::class)->findBy(
["prospect" => $prospectArchive->getId()]
);
/** @var Campagneprospect $campagneprospect */
foreach ($campagneprospects as $campagneprospect){
$campagneprospect->setProspect($prospect);
$this->em->persist($campagneprospect);
$histo[] = ["id" => $campagneprospect->getId()];
}
$historique[] = ["campagneprospects" => $histo];
$histo = [];
//4.Commentaires
/** @var Commentaire[] $commentaires */
$commentaires = $this->em->getRepository(Commentaire::class)->findBy(
["prospect" => $prospectArchive->getId()]
);
/** @var Commentaire $commentaire */
foreach ($commentaires as $commentaire){
$commentaire->setProspect($prospect);
$this->em->persist($commentaire);
$histo[] = ["id" => $commentaire->getId()];
}
$historique[] = ["commentaires" => $histo];
$histo = [];
//5. Fichiers
/** @var Fichier[] $fichiers */
$fichiers = $this->em->getRepository(Fichier::class)->findBy(
["prospect" => $prospectArchive->getId()]
);
/** @var Fichier $fichier */
foreach ($fichiers as $fichier){
$fichier->setProspect($prospect);
$this->em->persist($fichier);
$histo[] = ["id" => $fichier->getId()];
}
$historique[] = ["fichiers" => $histo];
$histo = [];
//6.Rdv
/** @var Rdv[] $rdvs */
$rdvs = $this->em->getRepository(Rdv::class)->findBy(
["prospect" => $prospectArchive->getId()]
);
/** @var Rdv $rdv */
foreach ($rdvs as $rdv){
$rdv->setProspect($prospect);
$this->em->persist($rdv);
$histo[] = ["id" => $rdv->getId()];
}
$historique[] = ["rdvs" => $histo];
// Marquer prospect comme supprimé logiquement
$prospectArchive->setActive(2);
$this->em->persist($prospectArchive);
return [
"prospect" => $prospect->getId(),
"prospectArchive" => $prospectArchive->getId(),
"historique" => $historique,
];
}catch (\Exception $e){
return $e;
}
}
/*
* #############################STATS##############################
*/
/**
* @Route("/mesobjectifs/{id}", name="api_espaceagent_mesobjectifs", methods={"GET"})
* @param int $id
* @return JsonResponse
*/
public function mesobjectifs(int $id)
{
// Chercher les campagnesprospect utilisateur
/** @var Campagne $campagne */
$campagne = $this->em->getRepository(Campagne::class)->find($id);
if (!$campagne) {
return $this->apiKo("Campagne non trouvée !!");
}
/*
* SELECT
cam.id AS id,
cam.objectifagent AS objectif,
COUNT(rdv.id) AS realise
FROM
rdv AS rdv
left join campagne AS cam ON cam.id = rdv.campagne_id
LEFT JOIN campagnecollaborateur AS camcol ON camcol.campagne_id = cam.id
WHERE camcol.collaborateur_id=1
GROUP BY cam.id
*/
$realise = 0;
$objectif = 10;
$data = [
"aujourdhui" => [
"realise" => $realise,
"objectif" => $objectif
],
"cemois" => [
"realise" => 15,
"objectif" => 30
],
];
return $this->apioK($data);
}
/**
* @Route("/mesappels", name="api_espaceagent_mesappels", methods={"GET"})
* @return JsonResponse
*/
public function mesappels()
{
$data = [];
return $this->apioK($data);
}
/**
* @Route("/signalementficheauto", name="api_espaceagent_signalementficheauto", methods={"POST"})
* @param Request $request
* @return JsonResponse
*/
public function signalementficheauto(Request $request)
{
$data = json_decode($request->getContent(), true);
if (!is_array($data)) {
return $this->apiKo("Requete invalide !");
}
if (!isset($data['campagneprospect']['id'])) {
return $this->apiKo("Campagne prospect non trouvee !");
}
$sourceOuverture = trim((string)($data['sourceouverture'] ?? $data['sourceOuverture'] ?? ''));
if ($sourceOuverture !== Appel::SOURCE_AUTO_MISSION) {
return $this->apiKo("Le signalement est reserve au mode auto !");
}
$typeProbleme = trim((string)($data['typeprobleme'] ?? $data['typeProbleme'] ?? ''));
if (!in_array($typeProbleme, Campagneprospectsignalement::getTypesProbleme(), true)) {
return $this->apiKo("Type de probleme invalide !");
}
$motifDetaille = trim((string)($data['motifdetaille'] ?? $data['motifDetaille'] ?? ''));
if (mb_strlen($motifDetaille) < 10) {
return $this->apiKo("Le motif detaille doit contenir au moins 10 caracteres !");
}
/** @var Utilisateur $utilisateur */
$utilisateur = $this->getUtilisateurConnecte();
/** @var Campagneprospect|null $campagneprospect */
$campagneprospect = $this->em->getRepository(Campagneprospect::class)->find($data['campagneprospect']['id']);
if (!$campagneprospect) {
return $this->apiKo("Campagne prospect non trouvee !");
}
if ($campagneprospect->getUtilisateur() && $campagneprospect->getUtilisateur()->getId() !== $utilisateur->getId()) {
return $this->apiKo("Cette fiche n'est pas affectee a l'utilisateur connecte !");
}
if (!$campagneprospect->getCampagne() || !$campagneprospect->getProspect()) {
return $this->apiKo("La fiche n'est pas exploitable pour un signalement !");
}
$signalementExistant = $this->em
->getRepository(Campagneprospectsignalement::class)
->findByCampagneprospectAndUtilisateur($campagneprospect, $utilisateur);
if ($signalementExistant) {
return $this->apiKo("Un signalement existe deja pour cette fiche et cet utilisateur !");
}
$dateOuvertureValue = trim((string)($data['dateouverturefiche'] ?? $data['dateOuvertureFiche'] ?? ''));
try {
$dateOuvertureFiche = $dateOuvertureValue !== '' ? new \DateTime($dateOuvertureValue) : new \DateTime();
} catch (\Exception $e) {
return $this->apiKo("Date d'ouverture de fiche invalide !");
}
$datesignalement = new \DateTime();
$signalement = new Campagneprospectsignalement();
$signalement->setCampagneprospect($campagneprospect);
$signalement->setCampagne($campagneprospect->getCampagne());
$signalement->setProspect($campagneprospect->getProspect());
$signalement->setUtilisateur($utilisateur);
$signalement->setTypeprobleme($typeProbleme);
$signalement->setMotifdetaille($motifDetaille);
$signalement->setSourceouverture($sourceOuverture);
$signalement->setDateouverturefiche($dateOuvertureFiche);
$signalement->setDatesignalement($datesignalement);
$signalement->setStatuttraitement(Campagneprospectsignalement::STATUT_OUVERT);
$signalement->setMailenvoye(false);
$signalement->setActifpourblocageauto(true);
$signalement->setDateblocageauto($datesignalement);
$signalement->setSnapshot($this->buildSignalementSnapshot($campagneprospect, $utilisateur, $typeProbleme, $motifDetaille, $dateOuvertureFiche, $datesignalement));
$this->em->persist($signalement);
$this->em->flush();
$mailing = new Mailing($this->mailer, $this->templating);
$mailResult = $mailing->notificationSignalementFicheAuto($signalement);
if ($mailResult instanceof \Exception || $mailResult === false || $mailResult === 0) {
$signalement->setMailenvoye(false);
$signalement->setErreurmail($mailResult instanceof \Exception ? $mailResult->getMessage() : "Echec d'envoi du mail de signalement.");
} else {
$signalement->setMailenvoye(true);
$signalement->setDateenvoimail(new \DateTime());
$signalement->setErreurmail(null);
}
$this->em->persist($signalement);
$this->em->flush();
return $this->apiOk([
'success' => true,
'idSignalement' => $signalement->getId(),
'mailenvoye' => $signalement->getMailenvoye(),
], false);
}
/*
* #############################AUTRES##############################
*/
private function hasActiveSignalementBlocage(Campagneprospect $campagneprospect): bool
{
return $this->em
->getRepository(Campagneprospectsignalement::class)
->hasActiveAutoBlock($campagneprospect);
}
private function determineModeSelectionAuto(Campagneprospect $campagneprospect): string
{
if ($campagneprospect->getRappelprive() === 1) {
return 'RAPPEL_PRIVE';
}
if ($campagneprospect->getRappelprive() === 0) {
return 'RAPPEL_PARTAGE';
}
return 'NOUVELLE_FICHE';
}
private function buildSignalementSnapshot(
Campagneprospect $campagneprospect,
Utilisateur $utilisateur,
string $typeProbleme,
string $motifDetaille,
\DateTimeInterface $dateOuvertureFiche,
\DateTimeInterface $dateSignalement
): array {
$campagne = $campagneprospect->getCampagne();
$prospect = $campagneprospect->getProspect();
$appelstatut = $campagneprospect->getAppelstatut();
$utilisateurAffecte = $campagneprospect->getUtilisateur();
$traitementpar = $campagneprospect->getTraitementpar();
return [
'typeprobleme' => $typeProbleme,
'motifdetaille' => $motifDetaille,
'sourceouverture' => Appel::SOURCE_AUTO_MISSION,
'modeSelectionAuto' => $this->determineModeSelectionAuto($campagneprospect),
'dateouverturefiche' => $dateOuvertureFiche->format(DATE_ATOM),
'datesignalement' => $dateSignalement->format(DATE_ATOM),
'campagneprospect' => [
'id' => $campagneprospect->getId(),
'rappelprive' => $campagneprospect->getRappelprive(),
'daterappel' => $campagneprospect->getDaterappel() ? $campagneprospect->getDaterappel()->format(DATE_ATOM) : null,
'commentaire' => $campagneprospect->getCommentaire(),
'historique' => $campagneprospect->getHistorique(),
'traitementdate' => $campagneprospect->getTraitementdate() ? $campagneprospect->getTraitementdate()->format(DATE_ATOM) : null,
'traitementencore' => $campagneprospect->getTraitementencore(),
],
'campagne' => [
'id' => $campagne ? $campagne->getId() : null,
'libelle' => $campagne ? $campagne->getLibelle() : null,
],
'prospect' => [
'id' => $prospect ? $prospect->getId() : null,
'societe' => $prospect ? $prospect->getSociete() : null,
'siret' => $prospect ? $prospect->getSiret() : null,
'standard' => $prospect ? $prospect->getStandard() : null,
'email' => $prospect ? $prospect->getEmail() : null,
],
'appelstatut' => [
'id' => $appelstatut ? $appelstatut->getId() : null,
'libelle' => $appelstatut ? $appelstatut->getLibelle() : null,
'horscible' => $appelstatut ? $appelstatut->getHorscible() : null,
'rappel' => $appelstatut ? $appelstatut->getRappel() : null,
'rdv' => $appelstatut ? $appelstatut->getRdv() : null,
],
'utilisateurouverture' => [
'id' => $utilisateur->getId(),
'nom' => $utilisateur->getNom(),
'prenom' => $utilisateur->getPrenom(),
'email' => $utilisateur->getEmail(),
'username' => $utilisateur->getUsername(),
],
'utilisateuraffecte' => [
'id' => $utilisateurAffecte ? $utilisateurAffecte->getId() : null,
'nom' => $utilisateurAffecte ? $utilisateurAffecte->getNom() : null,
'prenom' => $utilisateurAffecte ? $utilisateurAffecte->getPrenom() : null,
'email' => $utilisateurAffecte ? $utilisateurAffecte->getEmail() : null,
],
'traitementpar' => [
'id' => $traitementpar ? $traitementpar->getId() : null,
'nom' => $traitementpar ? $traitementpar->getNom() : null,
'prenom' => $traitementpar ? $traitementpar->getPrenom() : null,
'email' => $traitementpar ? $traitementpar->getEmail() : null,
],
];
}
/**
* @param Campagne $campagne
* @return object|null
*/
public function getCampagneprospect(Campagne $campagne, bool $getToutRappelPrive = false,bool $getToutRappelPartage=false): ?object
{
// Débloquer les fichiers réservé pour un collaborateur +24heure
$yesterday = strtotime('-1 day');
$sqlBloque = "
UPDATE campagneprospect
SET traitementencore = 0
WHERE date_format(traitementdate,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s",$yesterday)."'
and traitementencore > 0
";
//file_put_contents("temp.json",$sqlBloque);
try {
$con = $this->em->getConnection();
$con->executeQuery($sqlBloque);
} catch (\Exception $e) {
return $this->apiKo($e->getMessage());
}
/** @var Utilisateur $utilisateur */
$utilisateur = $this->getUtilisateurConnecte();
$idsCampagneRappelPrive = "(".$campagne->getId(); // Rappel Privés
$idsCampagneRappelPartage = "(".$campagne->getId(); // Rappel Partagé
// Si $getToutRappelPrive ou $getToutRappelPartage ===> alors :
if($getToutRappelPrive == true || $getToutRappelPartage == true) {
$campagnecollaborateurs = $this->em->getRepository(Campagnecollaborateur::class)->findBy(
[
"collaborateur" => $utilisateur,
]
);
/** @var Campagnecollaborateur $campagnecollaborateur */
foreach($campagnecollaborateurs as $campagnecollaborateur){
if($campagnecollaborateur->getCampagne()->getActive() == 1){
if($getToutRappelPrive == true) {
$idsCampagneRappelPrive .=",".$campagnecollaborateur->getCampagne()->getId();
}
if($getToutRappelPartage == true) {
$idsCampagneRappelPartage .=",".$campagnecollaborateur->getCampagne()->getId();
}
}
}
}
$idsCampagneRappelPrive .=")";
$idsCampagneRappelPartage .=")";
//1. Chercher Rappel Privé
$sql = "
SELECT
campagneprospect
FROM " . Campagneprospect::class . " as campagneprospect
LEFT JOIN " . Appelstatut::class . " as appelstatut WITH campagneprospect.appelstatut = appelstatut.id
WHERE date_format(campagneprospect.daterappel,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s")."'
AND appelstatut.rappel=true
AND campagneprospect.rappelprive = 1 AND campagneprospect.utilisateur = ".$utilisateur->getId()."
AND campagneprospect.campagne in ".$idsCampagneRappelPrive."
ORDER BY campagneprospect.rappelprive desc,campagneprospect.daterappel asc
";
//file_put_contents("RappelPriv.txt",$sql);
/** @var Query $query */
$query = $this->em->createQuery($sql);
$query->setFirstResult(0);
$query->setMaxResults(20);
$campagneprsopects = $query->getResult();
/** @var Campagneprospect $campagneprsopect */
foreach ($campagneprsopects as $campagneprsopect) {
if (!$this->hasActiveSignalementBlocage($campagneprsopect)) {
return $campagneprsopect;
}
}
//2. Chercher Rappel Partagé
$sql = "
SELECT
campagneprospect
FROM " . Campagneprospect::class . " as campagneprospect
LEFT JOIN " . Appelstatut::class . " as appelstatut WITH campagneprospect.appelstatut = appelstatut.id
WHERE date_format(campagneprospect.daterappel,'%Y-%m-%d %H:%i') <= '".gmdate("Y-m-d H:i:s")."'
AND appelstatut.rappel=true
AND campagneprospect.campagne in ".$idsCampagneRappelPartage."
AND campagneprospect.rappelprive = 0
AND campagneprospect.traitementencore IN (0,".$utilisateur->getId().")
ORDER BY campagneprospect.rappelprive desc,campagneprospect.daterappel asc
";
//file_put_contents("RappelPartag.txt",$sql);
/** @var Query $query */
$query = $this->em->createQuery($sql);
$query->setFirstResult(0);
$query->setMaxResults(20);
/** @var Campagneprospect[] $campagneprsopectsRappelPartage */
$campagneprsopectsRappelPartage = $query->getResult();
/** @var Campagneprospect $campagneprsopect */
foreach ($campagneprsopectsRappelPartage as $campagneprsopect) {
if ($this->hasActiveSignalementBlocage($campagneprsopect)) {
continue;
}
$campagneprsopect->setUtilisateur($utilisateur);
$campagneprsopect->setTraitementdate(new \DateTime());
$campagneprsopect->setTraitementencore($utilisateur->getId());
$this->em->persist($campagneprsopect);
$this->em->flush();
return $campagneprsopect;
}
//3. Chercher next prospect
$campagneprsopects = $this->em->getRepository(Campagneprospect::class)->findBy(
[
"campagne" => $campagne,
"utilisateur" => $utilisateur,
"rappelprive" => -1
],
[
"id" => "ASC"
]
);
if (!$campagneprsopects || sizeof($campagneprsopects) == 0) {
// affecter campagneprospect au utilisateur
return $this->autoAffectCampagneprospect($campagne, $utilisateur);
}
// Si reste un seul campagneprospect, alors ajouter +5 !
if (sizeof($campagneprsopects) == 1) {
$this->autoAffectCampagneprospect($campagne, $utilisateur);
}
foreach ($campagneprsopects as $campagneprsopect) {
if (!$this->hasActiveSignalementBlocage($campagneprsopect)) {
return $campagneprsopect;
}
}
return $this->autoAffectCampagneprospect($campagne, $utilisateur);
}
/**
* @param Campagne $campagne
* @param Utilisateur $utilisateur
* @return Campagneprospect|null
*/
public function autoAffectCampagneprospect(Campagne $campagne, Utilisateur $utilisateur): ?Campagneprospect
{
$campagneprsopectFirst = null;
$campagneprsopects = $this->em->getRepository(Campagneprospect::class)->findBy(
[
"campagne" => $campagne,
"utilisateur" => null,
"rappelprive" => -1
],
[
"id" => "ASC"
],
5
);
// si pas campagneprospect trouvé alors return null
if (sizeof($campagneprsopects) == 0) {
return null;
}
/** @var Campagneprospect $campagneprsopect */
foreach ($campagneprsopects as $campagneprsopect) {
if ($this->hasActiveSignalementBlocage($campagneprsopect)) {
continue;
}
$campagneprsopect->setUtilisateur($utilisateur);
$this->em->persist($campagneprsopect);
if ($campagneprsopectFirst == null) {
$campagneprsopectFirst = $campagneprsopect;
}
}
$this->em->flush();
return $campagneprsopectFirst;
}
}