<?php
namespace App\Service;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\AppRouteRepository;
use App\Repository\FavoriRepository;
use App\Repository\EntiteRepository;
use App\Repository\EntiteRelationRepository;
use App\Entity\Client;
use App\Entity\Form;
use App\Entity\Tableau;
use App\Entity\User;
use App\Entity\EntiteRelation;
use App\Service\FormulaireService;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class AppService {
private $repo_route;
private $repo_fav;
private $repo_entite_relation;
private $conn;
private $entityManager;
private $serv_form;
private $param_bag;
public function __construct(Connection $conn,ParameterBagInterface $param_bag, FormulaireService $serv_form, EntiteRepository $repo_entite, AppRouteRepository $repo_route, FavoriRepository $repo_fav, EntiteRelationRepository $repo_entite_relation, EntityManagerInterface $entityManager) {
$this->repo_route = $repo_route;
$this->repo_fav = $repo_fav;
$this->repo_entite_relation = $repo_entite_relation;
$this->repo_entite = $repo_entite;
$this->conn = $conn;
$this->entityManager = $entityManager;
$this->serv_form = $serv_form;
$this->param_bag = $param_bag;
}
/**
* Routes dynamiques : récupérer les options possibles
* @param integer $route_id
* @param string $class
* @return array
*/
public function getRoutePathVariablesOptions($route_id, $class = null) {
$result = null;
$route = $this->repo_route->find($route_id);
if(preg_match_all('/{+(.*?)}/', $route->getPath(), $matches)) {
$result = [];
$tabMatches = $matches[1];
foreach ($tabMatches as $variable) {
$sp = explode("_", $variable);
unset($sp[count($sp) - 1]);
$objectClass = is_null($class) ? implode($sp, "_") : $class;
$className = "App\\Entity\\".$objectClass;
$repo = $this->entityManager->getRepository($className);
$result[$variable] = [];
foreach($repo->findAll() as $obj) {
$lib = $this->serv_form->getEntiteAsString($obj);
$result[$variable][] = [ "id" => $obj->getId(), "lib" => $lib ];
}// foreach
}// foreach
}// if
return $result;
}// function
/**
* Récupérer le libellé d'une entité en fonction d'une config (JSON)
* @param string $json
* @return string
*/
public function getAsStringByConfig($json) {
$tabConfig = json_decode($json, true);
$string = "";
if(is_array($tabConfig)) {
foreach ($tabConfig as $key => $data) {
$sp = explode("_", $key);
unset($sp[count($sp) - 1]);
$class = implode($sp, "_");
$className = "App\\Entity\\".$class;
$repo = $this->entityManager->getRepository($className);
$obj = $repo->find($data);
$string .= $this->serv_form->getEntiteAsString($obj);
}
}
return $string;
}
/**
* Savoir si un utilisateur possède une page spécifique en tant que favori
* @param string $path_name
* @param string $path_config
* @param integer $user_id
* @return boolean
*/
public function isFavori($path_name, $path_config, $user_id) {
$route = $this->repo_route->findOneByName($path_name);
if(!is_null($route)) {
$favori = $this->repo_fav->findByUserAndRouteAndConfig($user_id, $route->getId(), $path_config);
return !is_null($favori);
}
else {
return false;
}
}
/**
* Décoder une config (pour utilisation dans twig)
* @param string $json
* @return array
*/
public function jsonDecodeConfig($json) {
return json_decode($json, true);
}
/**
* Ajouter relation père/fille entre entités
* @param App\Entity\Entite $entite_parent
* @param integer $parent_id
* @param App\Entity\Entite $entite_enfant
* @param integer $enfant_id
* @param App\Entity\FormVersion $version
* @return boolean
*/
public function addEnfantToEntite($entite_parent, $parent_id, $entite_enfant, $enfant_id, $version = null){
$relation = new EntiteRelation();
$relation->setEntiteParent($entite_parent);
$relation->setParentId($parent_id);
$relation->setEntiteEnfant($entite_enfant);
$relation->setEnfantId($enfant_id);
$relation->setVersion($version);
$this->entityManager->persist($relation);
$this->entityManager->flush();
return true;
}
/**
* Récupérer les enfants d'une entité quelconque
* @param App\Entity\... $objParent
* @param string $strEntityEnfants
* @param App\Entity\FormVersion $version
* @return App\Entity\...[]
*/
public function getEntiteEnfants($objParent, $strEntityEnfants = "", $version = null) {
$className = "App\\Entity\\".$strEntityEnfants;
if(class_exists($className)) {
$repoEnfant = $this->entityManager->getRepository($className);
}
$fullClassName = get_class($objParent);
$sp = explode("\\", $fullClassName);
$entityName = $sp[count($sp) - 1];
if(is_null($version)) {
$tabRelations = $this->repo_entite_relation->findByParentEnfants($entityName, $objParent->getId(), $strEntityEnfants);
}
else {
$tabRelations = $this->repo_entite_relation->findByVersionEnfants($version->getId(), $strEntityEnfants);
}
$enfants = [];
if(!is_null($repoEnfant)) {
foreach($tabRelations as $relation) {
$objEnfant = $repoEnfant->find($relation->getEnfantId());
if($objEnfant->isEnabled()) { // seulement les enfants non-archivés
$enfants[] = $objEnfant;
}
}
}
return $enfants;
}
/**
* Récupérer la liste de selection suivant le nom du param
* @param string $param
* @return App\Entity\...[]
*/
public function getListeFromParam($param) {
switch($param) {
default:
return [];
break;
case "{Client_id}":
return $this->entityManager->getRepository(Client::class)->findAll();
break;
case "{Form_id}":
return $this->entityManager->getRepository(Form::class)->findAll();
break;
case "{Tableau_id}":
return $this->entityManager->getRepository(Tableau::class)->findAll();
break;
case "{User_id}":
return $this->entityManager->getRepository(User::class)->findAll();
break;
// TODO à compléter au fur et à mesure
}
}
/**
* Récupérer la liste de selection suivant le nom du param
* 20220228 - Modification du format du code : {3 premieres lettre ENTITE}{DATE}-{ID 4 chiffres} vers {1 lettre ENTITE}{ID 6 chiffres}
* 20220302 - Passage par un numero de reference temporaire avant validation de la création
* @param mixed $objEntity
* @return string
*/
public function getReferenceAuto($objEntity) {
$entiteName = (new \ReflectionClass($objEntity))->getShortName();
// On définit la lettre d'identifiant référence en fonction du type d'Entité
// 20220314 - LGA - Code par défaut 'U' si l'entité n'est pas renseignée
$codeEntite = strtoupper(substr($entiteName, 0, 3)); // On recupére les 3 premières lettres de l'entité
// Correspondances entités - codage sur 1 lettre
$codes = [
"PRO" => 'C',
"CLI" => 'C',
"PRE" => 'P'
];
// On définit la lettre d'identifiant référence en fonction du type d'Entité
// 20220314 - LGA - Code par défaut 'U' si l'entité n'est pas renseignée
if (isset($codes[$codeEntite])) {
$code = $codes[$codeEntite];
} else {
$code = "U";
}// if
$className = get_class($objEntity);
$tableName = $this->entityManager->getClassMetadata($className)->getTableName();
$sql = 'SELECT MAX(ID)+1 AS AUTO_INCREMENT
FROM '.$tableName;
$results = $this->conn->fetchAllAssociative($sql);
if ($results[0]["AUTO_INCREMENT"] != null) {
$nextId = count($results) > 0 ? $results[0]["AUTO_INCREMENT"] : 1;
} else {
$nextId = 1;
}// if
$code .= str_pad($nextId, 6, "0", STR_PAD_LEFT);
return $code;
}// function
/**
* Recherche dans tout le CRM
* @param string $strRecherche
* @return array
*/
public function globalSearch($strRecherche, $mine_id = null) {
// Init résultats
$results = [
"prospects" => []
,"clients" => []
,"prescripteurs" => []
,"evenements" => []
];
// Recherche des prospects
$tabProspects = [];
foreach ($tabProspects as $objProspect) {
$item = [];
$item["id"] = $objProspect->getId();
$item["reference"] = $objProspect->getReference();
$item["name"] = $this->serv_form->getValeurLibelleByCode("nom1", $objProspect->getId())." ".$this->serv_form->getValeurLibelleByCode("prenom1", $objProspect->getId());
/*$entite = $this->repo_entite->findByName("Prospect");
$data = $this->serv_form->getAllData($entite, $objProspect->getId(), "label");
foreach ($data as $label => $value) {
if(strpos(strtolower($value), strtolower($strRecherche)) > -1) {
$item["context"] = $label." : ".str_ireplace($strRecherche, "<strong>".$strRecherche."</strong>", $value);
}
}*/
$results["prospects"][] = $item;
}// foreach
// Recherche par nom de client
$tabClients = $this->repo_prospect->findBySearch($strRecherche, $mine_id, true);
foreach ($tabClients as $objProspect) {
$item = [];
$item["id"] = $objProspect->getId();
$item["reference"] = $objProspect->getReference();
$item["name"] = $this->serv_form->getValeurLibelleByCode("nom1", $objProspect->getId())." ".$this->serv_form->getValeurLibelleByCode("prenom1", $objProspect->getId());
/*$entite = $this->repo_entite->findByName("Prospect");
$data = $this->serv_form->getAllData($entite, $objProspect->getId(), "label");
foreach ($data as $label => $value) {
if(strpos(strtolower($value), strtolower($strRecherche)) > -1) {
$item["context"] = $label." : ".str_ireplace($strRecherche, "<strong>".$strRecherche."</strong>", $value);
}
}// foreach
*/
$results["clients"][] = $item;
}// foreach
// Recherche par nom de prescripteur - 18/01/2024 DESACTIVE CAR TROP LONG
// $tabPrescripteurs = $this->repo_prescripteur->findBySearch($strRecherche, $mine_id, true);
//
// foreach ($tabPrescripteurs as $objPrescripteur) {
// $item = [];
// $item["id"] = $objPrescripteur->getId();
// $item["reference"] = $objPrescripteur->getReference();
// $item["name"] = $this->serv_form->getValeurLibelleByCode("nom_prescripteur", $objPrescripteur->getId());
//
// /*$entite = $this->repo_entite->findByName("Prescripteur");
//
// $data = $this->serv_form->getAllData($entite, $objPrescripteur->getId(), "label");
// foreach ($data as $label => $value) {
// if(strpos(strtolower($value), strtolower($strRecherche)) > -1) {
// $item["context"] = $label." : ".str_ireplace($strRecherche, "<strong>".$strRecherche."</strong>", $value);
// }// if
// }// foreach
//
// $results["prescripteurs"][] = $item;
// }// foreach
// Recherche d'événements
/*$tabEvents = $this->repo_event->findBySearch($strRecherche, $mine_id);
foreach ($tabEvents as $objEvent) {
$item = [];
$nomTiers = !is_null($objEvent->getProspect()) ? $this->serv_form->getEntiteAsString($objEvent->getProspect()) : $this->serv_form->getEntiteAsString($objEvent->getPrescripteur());
$item["id"] = $objEvent->getId();
$item["date"] = $objEvent->getDate()->format("d/m/Y H:i");
$item["title"] = $objEvent->getEvenementType()->getLibelle();
$context = "";
if(strpos(strtolower($nomTiers), strtolower($strRecherche)) > -1) {
$context .= "Tiers : ".str_ireplace($strRecherche, "<strong>".$strRecherche."</strong>", $nomTiers);
}
if(!is_null($objEvent->getEvenementType()) && strpos(strtolower($objEvent->getEvenementType()->getLibelle()), strtolower($strRecherche)) > -1) {
if(strlen($context) > 0) $context .= "<br />";
$context .= "Type : ".str_ireplace($strRecherche, "<strong>".$strRecherche."</strong>", $objEvent->getEvenementType()->getLibelle());
}
if(!is_null($objEvent->getMethode()) && strpos(strtolower($objEvent->getMethode()->getLibelle()), strtolower($strRecherche)) > -1) {
if(strlen($context) > 0) $context .= "<br />";
$context .= "Méthode comm. : ".str_ireplace($strRecherche, "<strong>".$strRecherche."</strong>", $objEvent->getMethode()->getLibelle());
}
$item["context"] = $context;
$results["evenements"][] = $item;
}// foreach*/
return $results;
}// function
public function getImagesFilemanager() {
$dir = $this->param_bag->get('filemanager_base_dir');
$files = scandir($dir);
$images = [];
$baseUrl = $this->param_bag->get('filemanager_base_url');
$basePath = $this->param_bag->get('app_host');
$url_part = explode($basePath,$baseUrl);
$baseUrl2 = $this->param_bag->get('app_host');
//dd($baseUrl,$basePath,$url_part);
foreach ($files as $file) {
if($file != "." && $file != "..") {
$images[] = ['identifier' => $url_part[1]."/".$file,'web' => $baseUrl2."/api-mobile/v1/mobile/get-blob?file_path=".$url_part[1]."/".$file ];
}
}
return $images;
}
}// class