<?php
namespace App\Controller;
use App\Entity\Contrat;
use App\Entity\Document;
use App\Entity\InfoSalarie;
use App\Entity\LdvStatutProjet;
use App\Entity\Projet;
use App\Entity\Societe;
use App\Entity\Tiers;
use App\Model\LCSWS\LiveConsent;
use App\Model\NoteDeFrais\NDF;
use App\Repository\LdvStatutProjetRepository;
use App\Tools\Fnc;
use phpDocumentor\Reflection\Types\Collection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Tools\JsonRes;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Persistence\ObjectManager;
class ProjetController extends AbstractController
{
private ?ObjectManager $em = null;
private ?string $prefixSociete = null;
private ?LdvStatutProjetRepository $_statutProjetRepository = null;
/**
* Stockage des informations de la société pour affichage sur entête document
* @var object|mixed|null
*/
private ?object $dataSociete = null;
public function __construct(RequestStack $requestStack, ManagerRegistry $doctrine)
{
$request = $requestStack->getCurrentRequest();
//TODO: page erreur subdomain
if(null===$request->getSession()->get('societe')) return $this->render('misc/404.html.twig');
// on récupère le sous-domaine stocké en session pour pointer vers le bon entity manager
$subdomain = $request->getSession()->get('societe')->getBase();
$this->em = $doctrine->getManager($subdomain);
$this->prefixSociete = $request->getSession()->get('societe')->getPrefix();
if(null!==$this->prefixSociete) $this->prefixSociete = strtoupper($this->prefixSociete);
$jsonString = $request->getSession()->get('societe')->getData();
if(null!==$jsonString) {
$this->dataSociete = json_decode($jsonString);
$this->dataSociete->lib_societe = $request->getSession()->get('societe')->getLibSociete();
}
// $this->_statutProjetRepository = $statutProjetRepository;
}
/**
* @Route("/projet/select2/{r}", methods={"GET"}, name="select2-projet")
*/
public function select2($r)
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
$projetRepository = $this->em->getRepository(Projet::class);
$result = $projetRepository->select2($r);
die(json_encode($result));
}
private function getStatutProjetSelectOptions($optionTous=true, $id=0)
{
return $this->_statutProjetRepository->getSelectOptions($optionTous, $id);
}
/**
* @Route("/projet/creation", methods={"GET"}, name="creation_projet")
*/
public function createProjet(): Response
{
return $this->render('projet/creation_projet.html.twig', [
'id_menu' => 'creation_projet',
]);
}
/**
* @Route("/projet/insert", methods={"POST"}, name="insert_projet")
*/
public function insert(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['statut_projet'])) $res->addErrMsg('champs statut_projet inconnu');
if(!isset($data['nom_projet'])) $res->addErrMsg('champs nom_projet inconnu');
if(!isset($data['id_client_projet'])) $res->addErrMsg('champs id_client_projet inconnu');
if(!isset($data['id_chef_projet'])) $res->addErrMsg('champs id_chef_projet inconnu');
if(!isset($data['id_tiers_projet'])) $res->addErrMsg('champs id_tiers_projet inconnu');
if(!isset($data['date_deb'])) $res->addErrMsg('champs date_deb inconnu');
if(!isset($data['date_fin'])) $res->addErrMsg('champs date_fin inconnu');
if($res->isSuccess()) {
if(''===$data['statut_projet']) $res->addErrMsg('champs statut_projet obligatoire');
if(''===$data['nom_projet']) $res->addErrMsg('champs nom_projet obligatoire');
if(''===$data['id_client_projet']) $res->addErrMsg('champs id_client_projet obligatoire');
if(''===$data['id_chef_projet']) $res->addErrMsg('champs id_chef_projet obligatoire');
if(''===$data['date_deb']) $res->addErrMsg('champs date_deb obligatoire');
if(''===$data['date_fin']) $res->addErrMsg('champs date_fin obligatoire');
if($res->isSuccess()) {
/** @var Societe $societe */
$societe = null;
/** @var Tiers $producteur */
$producteur = null;
/** @var Tiers $tiers */
$tiers = null;
$societeRepository = $this->em->getRepository(Societe::class);
$societe = $societeRepository->find($data['id_client_projet']);
if (null === $societe) {
$res->addErrMsg('Société introuvable');
} else {
if(0===$societe->getAdresses()->count()) $res->addErrMsg('Enregistrer une adresse pour cette société avant de créer un projet');
}
$tiersRepository = $this->em->getRepository(Tiers::class);
$producteur = $tiersRepository->find($data['id_chef_projet']);
if(null===$societe) $res->addErrMsg('Chef de projet introuvable');
if(''!==$data['id_tiers_projet']) $tiers = $tiersRepository->find($data['id_tiers_projet']);
if($res->isSuccess()) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$projet = new Projet();
// Projet en appel d'offre (id=1) ou directement en cours (id=3)
$statutProjetRepository = $this->em->getRepository(LdvStatutProjet::class);
if($data['statut_projet'] ? $idStatut = 1 : $idStatut = 3);
$projet->setIsAppelOffre(false);
if(1===$idStatut) $projet->setIsAppelOffre(true);
$statutProjet = $statutProjetRepository->find($idStatut);
$projet->setStatut($statutProjet);
$projet->setLibProjet($data['nom_projet']);
// Tiers : société + producteur + autre tiers
$projet->setSociete($societe);
$projet->setProducteur($producteur);
if(null!==$tiers) $projet->setTiers($tiers);
$dateDeb = date_create_from_format('Y-m-d', $data['date_deb']);
$projet->setDateDeb($dateDeb);
$dateFin = date_create_from_format('Y-m-d', $data['date_fin']);
$projet->setDateFin($dateFin);
$projet->setUserCrea($currentUser);
$projet->setDateCrea(new \DateTime());
if(1===$idStatut) $numProd = $societe->createNumAO($this->prefixSociete);
if(3===$idStatut) $numProd = $societe->createNumProd($this->prefixSociete);
$projet->setNumProd($numProd);
$projet->setIsActive(true);
$this->em->persist($projet);
$this->em->flush();
$data['id_projet'] = $projet->getId();
$data['num_prod'] = $numProd;
$res->setData($data);
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/projet/{id}", methods={"GET"}, name="show_projet")
*/
public function show($id)
{
/* Mise à jour des statuts de signature LiveConsent */
// $contratRepository = $this->em->getRepository(Contrat::class);
// $LiveConsent = new LiveConsent();
// $statutList = array(
// 'ACCEPTED',
// 'CANCELED',
// 'REJECTED',
// 'EXPIRED',);
// foreach ($statutList as $statut){
// $res = $LiveConsent->getRequestList($statut);
// if(is_object($res)){
// if(isset($res->response)){
// foreach ($res->response as $demande){
// $idStatut = LiveConsent::REQUEST_STATUT['REQUEST_' . $statut];
// $contratRepository->udpateStatutSignatureElec($demande->request_id, $idStatut);
// }
// }
// }
// }
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($id);
if(null===$projet) return $this->render('misc/404.html.twig');
$projet->setWorkflow();
/**
* Fiche du projet
*/
$societeRepository = $this->em->getRepository(Societe::class);
/** @var Societe $client */
$client = $societeRepository->findOneBy([
'id' => $projet->getSociete()->getId(),
]);
$tiersRepository = $this->em->getRepository(Tiers::class);
/** @var Tiers $producteur */
$producteur = $tiersRepository->findOneBy([
'id' => $projet->getProducteur()->getId(),
]);
/** @var Tiers $tiers */
$tiers = $projet->getTiers();
if(!null===$tiers) {
$tiers = $tiersRepository->findOneBy([
'id' => $projet->getTiers()->getId(),
]);
}
/**
* Documents
*/
$devisList = $projet->getDocuments()->filter(function (Document $document){
return $document->getTypeDocument() === 'FACTURE PROFORMA';
});
$factureList = $projet->getDocuments()->filter(function (Document $document){
return in_array($document->getTypeDocument(), ['FACTURE', 'AVOIR']);
});
$documentVierge = new Document();
$documentVierge->initDocVierge($projet, 'FACTURE PROFORMA');
/**
* Salariés
*/
$salarieList = array();
$salarieProjet = $projet->getSalaries();
foreach ($salarieProjet as $salarie){
$contratList = $salarie->getContratByIdProjet($projet->getId());
foreach ($contratList as $contrat){
$id = $salarie->getId();
if(!isset($salarieList[$id])){
$contrat->total_jour_pointage = 0;
$contrat->total_salaire = 0;
$contrat->contrat_list = array();
$salarieList[$id] = $contrat;
}
$tel = '+33'. substr($salarie->getTelPortableTiers(), 1);
$mois = ['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre'];
$mois = $mois[intval($contrat->getMois())-1];
$nomDemande = 'CONTRAT TRAVAIL '. $salarie->getNomTiers() .' '. $salarie->getPrenomTiers() .' - '. $mois .' '. $contrat->getAnnee();
$coordonnee = array(
'nom_salarie' => $salarie->getNomTiers(),
'prenom_salarie' => $salarie->getPrenomTiers(),
'email_salarie' => $salarie->getEmailTiers(),
'portable_salarie' => $tel,
'nom_demande' => mb_strtoupper($nomDemande),
'id_projet' => $projet->getId(),
'id_salarie' => $salarie->getId(),
'id_contrat' => $contrat->getId(),
);
$coordonnee = json_encode($coordonnee);
$contrat->coordonnee = htmlentities($coordonnee);
$salarieList[$id]->total_jour_pointage+= $contrat->getNbJourPointage();
$salarieList[$id]->total_salaire+= $contrat->getTarifJour() * $contrat->getNbJourPointage();
$salarieList[$id]->contrat_list[] = $contrat;
}
}
$salarieList = Fnc::array_orderby($salarieList, 'getSalarie()->getInfoSalarie()->getFonction()', SORT_ASC);
$webPath = $this->getParameter('kernel.project_dir');
$contratVierge = new Contrat();
$salarieVierge = new Tiers();
$infosSalarieVierge = new InfoSalarie($webPath);
$infosSalarieVierge->initInfosVierge();
$salarieVierge->setInfoSalarie($infosSalarieVierge);
$contratVierge->setIdProjet($projet->getId())
->setSalarie($salarieVierge)
;
/**
* Prestataires
*/
$commandeList = $projet->getDocuments()->filter(function (Document $document){
return $document->getTypeDocument() === 'COMMANDE PRESTATAIRE';
});
$commandeVierge = new Document();
$commandeVierge->initDocVierge($projet, 'COMMANDE PRESTATAIRE');
/**
* Notes de frais
*/
$ndfList = $projet->getDocuments()->filter(function (Document $document){
return $document->getTypeDocument() === 'NDF';
});
$ndfVierge = new Document();
$ndfVierge->initDocVierge($projet, 'NDF');
$ndfList = $ndfVierge->groupNdfBySalarie($ndfList);
$ndf = new NDF($projet, new Societe(), new Tiers(), 0);
return $this->render('projet/gestion_projet.html.twig', [
'id_menu' => 'gestion_projet',
'societe' => $this->dataSociete,
'projet' => $projet,
'client' => $client,
'producteur' => $producteur,
'tiers' => $tiers,
'document_vierge' => $documentVierge,
'label_btn_cancel' => 'Annuler',
'devisList' => $devisList->toArray(),
'factureList' => $factureList->toArray(),
'contrat_vierge' => $contratVierge,
'salarieList' => $salarieList,
'commandeList' => $commandeList->toArray(),
'commande_vierge' => $commandeVierge,
'ndfList' => $ndfList,
'ndf_vierge' => $ndfVierge,
'type_charge_ndf' => 'NDF',
'select_option_type_ndf' => $ndf->getSelectOptionTypeNdf(),
// 'select_statut_projet' => $this->getStatutProjetSelectOptions(false, $projet->getStatut()->getId()),
]);
}
/**
* @Route("/projet/update", methods={"POST"}, name="update_projet")
*/
public function update(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
if($res->isSuccess()) {
$data = $res->getData();
if(!isset($data['id_projet'])) $res->addErrMsg('champs id_projet inconnu');
if(!isset($data['statut_projet'])) $res->addErrMsg('champs statut_projet inconnu');
if(!isset($data['nom_projet'])) $res->addErrMsg('champs nom_projet inconnu');
if(!isset($data['id_client_projet'])) $res->addErrMsg('champs id_client_projet inconnu');
if(!isset($data['id_chef_projet'])) $res->addErrMsg('champs id_chef_projet inconnu');
if(!isset($data['id_tiers_projet'])) $res->addErrMsg('champs id_tiers_projet inconnu');
if(!isset($data['date_deb'])) $res->addErrMsg('champs date_deb inconnu');
if(!isset($data['date_fin'])) $res->addErrMsg('champs date_fin inconnu');
if(!isset($data['num_administratif_projet'])) $res->addErrMsg('champs num_administratif_projet inconnu');
if(!isset($data['commentaire_projet'])) $res->addErrMsg('champs commentaire_projet inconnu');
if($res->isSuccess()) {
if(''===$data['id_projet']) $res->addErrMsg('champs id_projet obligatoire');
if(''===$data['statut_projet']) $res->addErrMsg('champs statut_projet obligatoire');
if(''===$data['nom_projet']) $res->addErrMsg('champs nom_projet obligatoire');
if(''===$data['id_client_projet']) $res->addErrMsg('champs id_client_projet obligatoire');
if(''===$data['id_chef_projet']) $res->addErrMsg('champs id_chef_projet obligatoire');
if(''===$data['date_deb']) $res->addErrMsg('champs date_deb obligatoire');
if(''===$data['date_fin']) $res->addErrMsg('champs date_fin obligatoire');
if($res->isSuccess()) {
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($data['id_projet']);
if(null===$projet) $res->addErrMsg('Projet inconnu dans la bdd');
if($res->isSuccess()) {
/** @var Societe $societe */
$societe = null;
/** @var Tiers $producteur */
$producteur = null;
/** @var Tiers $tiers */
$tiers = null;
$societeRepository = $this->em->getRepository(Societe::class);
$societe = $societeRepository->find($data['id_client_projet']);
if(null===$societe) $res->addErrMsg('Société introuvable');
$tiersRepository = $this->em->getRepository(Tiers::class);
$producteur = $tiersRepository->find($data['id_chef_projet']);
if(null===$societe) $res->addErrMsg('Chef de projet introuvable');
if(''!==$data['id_tiers_projet']) $tiers = $tiersRepository->find($data['id_tiers_projet']);
if($res->isSuccess()) {
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$statutProjetRepository = $this->em->getRepository(LdvStatutProjet::class);
$statutProjet = $statutProjetRepository->find($data['statut_projet']);
$numProd = $this->replaceNumProdAppelOffre($projet->getNumProd(), $projet->getStatut()->getId(), $data['statut_projet']);
$projet->setStatut($statutProjet)
->setNumProd($numProd)
;
$projet->setLibProjet($data['nom_projet']);
// Tiers : client + producteur + autre tiers
$projet->setSociete($societe);
$projet->setProducteur($producteur);
if(null!==$tiers) $projet->setTiers($tiers);
$dateDeb = date_create_from_format('Y-m-d', $data['date_deb']);
$projet->setDateDeb($dateDeb);
$dateFin = date_create_from_format('Y-m-d', $data['date_fin']);
$projet->setDateFin($dateFin);
$projet->setNumAdministratif($data['num_administratif_projet']);
$projet->setCommentaire($data['commentaire_projet']);
$projet->setUserModif($currentUser);
$projet->setDateModif(new \DateTime());
$this->em->persist($projet);
$this->em->flush();
$res->setData($data);
}
}
}
}
}
die($res->returnJson());
}
/**
* @Route("/projet/update-statut", methods={"POST"}, name="update_statut_projet")
*/
public function updateStatut(Request $request): Response
{
//TODO: page erreur entity manager
if(null===$this->em) return $this->render('misc/404.html.twig');
// Initialisation du retour Json
$res = new JsonRes($request->request->all());
$data = $res->getData();
if(empty($data['id_projet'])) $res->addErrMsg('erreur champs id_projet');
if(empty($data['id_statut'])) $res->addErrMsg('erreur champs id_statut');
if(!$res->isSuccess()) die($res->returnJson());
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($data['id_projet']);
if(null===$projet) $res->addErrMsg('Projet inconnu dans la bdd');
if(!$res->isSuccess()) die($res->returnJson());
/** @var \App\Entity\User $currentUser */
$currentUser = $this->getUser()->getId();
$statutProjetRepository = $this->em->getRepository(LdvStatutProjet::class);
$statutProjet = $statutProjetRepository->find($data['id_statut']);
$numProd = $this->replaceNumProdAppelOffre($projet->getNumProd(), $projet->getStatut()->getId(), $data['id_statut']);
$projet->setStatut($statutProjet)
->setNumProd($numProd)
->setUserModif($currentUser)
->setDateModif(new \DateTime())
;
$this->em->persist($projet);
$this->em->flush();
$res->setData($data);
die($res->returnJson());
}
/**
* @Route("/projet/reload-dashboard/{id}", methods={"GET"}, name="reload_dashboard_projet")
*/
public function reloadDashboard($id): Response
{
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($id);
if(null===$projet) return $this->render('misc/404.html.twig');
$tiersRepository = $this->em->getRepository(Tiers::class);
/** @var Tiers $producteur */
$producteur = $tiersRepository->findOneBy([
'id' => $projet->getProducteur()->getId(),
]);
return $this->render('projet/tab/card-dashboard-projet.html.twig', [
'projet' => $projet,
'producteur' => $producteur,
]);
}
/**
* @Route("/projet/reload-workflow/{id}", methods={"GET"}, name="reload_workflow_projet")
*/
public function reloadWorkflow($id): Response
{
$projetRepository = $this->em->getRepository(Projet::class);
/** @var Projet $projet */
$projet = $projetRepository->find($id);
$projet->setWorkflow();
return $this->render('projet/workflow-ligne.html.twig', [
'projet' => $projet,
]);
}
/**
* @param string $numProd
* @param int $currentId
* @param int $newId
* @return string
*/
private function replaceNumProdAppelOffre(string $numProd, int $currentId, int $newId): string
{
if (2 >= $currentId && 2 < $newId) {
$numProd = preg_replace('/-AO-(?!.*-AO-)/', '-', $numProd);
}
return $numProd;
}
}