<?php
namespace App\Controller;
use App\Entity\CategorieQuestion;
use App\Entity\CommentaireCategorie;
use App\Entity\CommentaireGlobal;
use App\Entity\CommentaireQuestionEconomique;
use App\Entity\ConditionCommentaireGlobal;
use App\Entity\Departement;
use App\Entity\Exploitation;
use App\Entity\LibelleReponse;
use App\Entity\MentionsLegales;
use App\Entity\NoteCategorie;
use App\Entity\Parametres;
use App\Entity\Question;
use App\Entity\Questionnaire;
use App\Entity\Reponse;
use App\Entity\SystemeProduction;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
class QuestionnaireController extends AbstractController
{
public function afficher(EntityManagerInterface $em, MailerInterface $mailer)
{
// Valeurs renseignées par l'utilisateur
$produit = "";
$EBE = "";
$annuites = 0;
$pac = 0;
// variable permettant d'afficher ou non l'onglet des resultats
$resultat = false;
// Resultat des calculs des questions fixes Economiques
$ebe_produit = '';
$annuites_ebe = '';
$aides_ebe = '';
$dettes = '';
// Point attribué en fonction des résultats des questions fixes ( ex : une note de 10 à la question 'Dettes fournisseurs' vaut 100 points )
$note_ebe_produit = '';
$note_annuites_ebe = '';
$note_aides_ebe = '';
$note_dettes = '';
// Note totale
$noteTotal = 0;
// Tableau indéxé par categorie avec la note et les commentaires
$resultatCategorie = [];
// Commentaires
$commentaire_ebe_produit = "";
$commentaire_annuites_ebe = "";
$commentaire_aide_ebe = "";
$commentaire_dettes = "";
$commentaireGlobal = "";
$questionnaire = $em->getRepository(Questionnaire::class)->find(1);
$categories = $em->getRepository(CategorieQuestion::class)->findBy([],['ordre'=>'asc']);
$departements = $em->getRepository(Departement::class)->findAll();
$systemes = $em->getRepository(SystemeProduction::class)->findAll();
$questionsFixes = $em->getRepository(Question::class)->findBy(['questionnaire' => $questionnaire , 'type' => 'fix', 'active' => true]);
$questions = $em->getRepository(Question::class)->findBy(['questionnaire' => $questionnaire , 'type' => 'jauge', 'active' => true]);
$listeQuestions = [];
$libelleReponse = $em->getRepository(LibelleReponse::class)->findBy(['question' => $questions],['min' => 'asc']);
foreach ($libelleReponse as $libelle) {
$question = $libelle->getQuestion();
$listeQuestions[$question->getCategorie()->getId()][$question->getId()]['question'] = $question;
$listeQuestions[$question->getCategorie()->getId()][$question->getId()]['reponse'] = [
'valeur' => '',
'texte' => ''
];
$listeQuestions[$question->getCategorie()->getId()][$question->getId()]['libelleReponse'][] = $libelle;
}
$exploitation = null;
$mentionsLegales = $em->getRepository(MentionsLegales::class)->find(1);
if (isset($_POST['valider'])) {
//Création de l'entité Exploitation temporaire
$exploitation = (new Exploitation())->setDateReponse(new \DateTime('now'));
$systeme = $em->getRepository(SystemeProduction::class)->find($_POST['exp_systeme']);
$exploitation->setSystemeProduction($systeme);
$em->persist($exploitation);
// Permettant de calculer la note totale pour chaque catégorie
$valeurEco = 0;
$nbEco = 0;
$valeurStrat = 0;
$nbStrat = 0;
$valeurTech = 0;
$nbTech = 0;
$poidsDettes = 0;
$sujetsPreoccupants = '';
$listeQuestions = [];
// On récupère le résultat de chaques questions
foreach ($questions as $q) {
$reponse = $_POST['reponse_'.$q->getId()];
$textLibelle = "";
$libelle = $em->getRepository(LibelleReponse::class)->findBy(['question' => $q],['min' => 'asc']);
foreach ($libelle as $lib) {
if ($lib->getMin() <= $reponse && $lib->getMax() >= $reponse) {
$textLibelle = $lib->getLibelle();
}
}
$listeQuestions[$q->getCategorie()->getId()][] = ['question' => $q,'libelleReponse' => $libelle,'reponse' => ['valeur' => $reponse,'texte' => $textLibelle]];
$coef = $q->getCoef();
if ($q->getCategorie()->getId() === 1) {
if ($q->getLibelleFix() === "dettes") {
$dettes = $reponse;
} else {
$nbEco += $coef;
$valeurEco += ($reponse*10)*$coef;
}
} elseif ($q->getCategorie()->getId() === 2) {
$nbStrat += $coef;
$valeurStrat += ($reponse*10)*$coef;
} elseif ($q->getCategorie()->getId() === 3) {
$nbTech += $coef;
$valeurTech += ($reponse*10)*$coef;
}
$reponseQuestion = (new Reponse())
->setQuestion($q)
->setExploitation($exploitation)
->setValeur($reponse)
;
$em->persist($reponseQuestion);
if ($reponse <= 5 && $q->getCategorie()->getSujetsPreoccupants() && $q->getCommentaireSujetsPreoccupants() != null) {
$sujetsPreoccupants .= '- ' . $q->getCommentaireSujetsPreoccupants() . "\n";
}
}
// On récupère les resultats pour les questions fixes
foreach ($questionsFixes as $qFix) {
$nomFix = $qFix->getLibelleFix();
if ($nomFix === 'produit') {
$produit = $_POST['produit'];
$reponse = $produit;
} elseif ($nomFix === 'annuites') {
$annuites = $_POST['annuites'];
$reponse = $annuites;
} elseif ($nomFix === 'EBE') {
$EBE = $_POST['EBE'];
$reponse = $EBE;
} elseif ($nomFix === 'pac') {
$pac = $_POST['pac'];
$reponse = $pac;
}
$reponseQuestion = (new Reponse())
->setQuestion($qFix)
->setExploitation($exploitation)
->setValeur($reponse)
;
$em->persist($reponseQuestion);
}
// On fait les calculs nécéssaires
$ebe_produit = round($EBE / $produit * 100,0);
$annuites_ebe = round($annuites / $EBE * 100,0);
$aides_ebe = round($pac / $EBE * 100,0);
// On fait l'attribution des points
if ($ebe_produit >= 45) {
$note_ebe_produit = 100;
} elseif($ebe_produit >= 35) {
$note_ebe_produit = 85;
} elseif($ebe_produit >= 30) {
$note_ebe_produit = 70;
} elseif($ebe_produit >= 25) {
$note_ebe_produit = 50;
} else {
$note_ebe_produit = 10;
}
if ($annuites_ebe >= 80) {
$note_annuites_ebe = 10;
} elseif($annuites_ebe >= 60) {
$note_annuites_ebe = 30;
} elseif($annuites_ebe >= 45) {
$note_annuites_ebe = 50;
} elseif($annuites_ebe >= 40) {
$note_annuites_ebe = 70;
} elseif($annuites_ebe >= 35) {
$note_annuites_ebe = 85;
} else {
$note_annuites_ebe = 100;
}
if ($aides_ebe >= 60) {
$note_aides_ebe = 20;
} elseif($aides_ebe >= 40) {
$note_aides_ebe = 50;
} elseif($aides_ebe >= 20) {
$note_aides_ebe = 85;
} else {
$note_aides_ebe = 100;
}
if($dettes !== "") {
$poidsDettes = 1;
if ($dettes > 9) {
$note_dettes = 100;
} elseif ($dettes > 7) {
$note_dettes = 80;
} elseif ($dettes > 5) {
$note_dettes = 60;
} elseif ($dettes > 3) {
$note_dettes = 30;
} else {
$note_dettes = 10;
}
}
else{
$note_dettes = 0;
}
// Commentaires pour les questions fixes/montants
$getCommentaire1 = $em->getRepository(CommentaireQuestionEconomique::class)->getCommentaireByImpactNote($questionnaire,'EBE/produit',$ebe_produit);
foreach ($getCommentaire1 as $comm) {
$commentaire_ebe_produit .= $comm->getLibelle() . "\n";
}
$getCommentaire2 = $em->getRepository(CommentaireQuestionEconomique::class)->getCommentaireByImpactNote($questionnaire,'annuites/EBE',$annuites_ebe);
foreach ($getCommentaire2 as $comm) {
$commentaire_annuites_ebe .= $comm->getLibelle() . "\n";
}
$getCommentaire3 = $em->getRepository(CommentaireQuestionEconomique::class)->getCommentaireByImpactNote($questionnaire,'pac/EBE',$aides_ebe);
foreach ($getCommentaire3 as $comm) {
$commentaire_aide_ebe .= $comm->getLibelle() . "\n";
}
if($dettes !== ""){
$getCommentaire4 = $em->getRepository(CommentaireQuestionEconomique::class)->getCommentaireByImpactNote($questionnaire,'dettes',$dettes*10);
foreach ($getCommentaire4 as $comm) {
$commentaire_dettes .= $comm->getLibelle() . "\n";
}
}
// Calcul du total par catégorie
foreach ($categories as $cat) {
$commentaire = "";
$noteCat = 0;
if ($cat->getId() === 1) {
$noteCat = round(($note_ebe_produit + $note_annuites_ebe + $note_aides_ebe + $note_dettes + $valeurEco) / ($nbEco + 3 + $poidsDettes),0);
} elseif ($cat->getId() === 2) {
$noteCat = round($valeurStrat / $nbStrat ,0);
}
elseif ($cat->getId() === 3) {
$noteCat = round($valeurTech / $nbTech,0);
}
$commentaireCat = $em->getRepository(CommentaireCategorie::class)->getCommentaireByNote($questionnaire,$cat->getId(),$noteCat);
foreach ($commentaireCat as $comm) {
$commentaire .= $comm->getLibelle() . "\n";
if ($cat->getSujetsPreoccupants() && $comm->getSujetsPreoccupants()) {
$commentaire .= $sujetsPreoccupants;
}
}
$resultatCategorie[$cat->getId()] = ['libelle'=> $cat->getLibelle() ,'note' => $noteCat, 'commentaire' => $commentaire];
$noteTotal += $noteCat;
$noteCategorie = (new NoteCategorie())
->setExploitation($exploitation)
->setCategorie($cat)
->setNote($noteCat)
;
$em->persist($noteCategorie);
}
// Commentaire Globaux
$commentaireGlobaux = $em->getRepository(CommentaireGlobal::class)->findByQuestionnaire($questionnaire);
foreach ($commentaireGlobaux as $cg) {
$isConditionOK = true;
$condition = $em->getRepository(ConditionCommentaireGlobal::class)->findBy(['commentaireGlobal' => $cg],['categorie'=>'ASC']);
foreach ($condition as $cond) {
$noteCat = $resultatCategorie[$cond->getCategorie()->getId()]['note'];
if($cond->getCategorie()->getId() === 1 && ($noteCat < $cond->getMin() || $noteCat > $cond->getMax())) {
$isConditionOK = false;
} elseif($cond->getCategorie()->getId() === 2 && ($noteCat < $cond->getMin() || $noteCat > $cond->getMax())) {
$isConditionOK = false;
} elseif($cond->getCategorie()->getId() === 3 && ($noteCat < $cond->getMin() || $noteCat > $cond->getMax() )) {
$isConditionOK = false;
}
}
if ($isConditionOK) {
$commentaireGlobal .= $cg->getLibelle() . "\n";
}
}
$noteTotal = round( ($noteTotal) / count($categories));
$exploitation->setNoteGlobale($noteTotal);
// On ajoute le departement selectionné
$departement = $em->getRepository(Departement::class)->find($_POST['departement']);
$exploitation->setDepartement($departement);
$resultat = true;
if ($resultat) {
$em->flush();
$this->addFlash('success',"Votre diagnostic a été réalisé ");
$parametre = $em->getRepository(Parametres::class)->find(1);
if($this->getParameter('alerte_nouveau_questionnaire') === 1 && $parametre->getEmailReception()) {
$texte = "Bonjour,
Un nouveau diagnostic vient d'être réalisé depuis l'application ProAgri.
Cordialement.";
$email = (new Email())
->from($parametre->getEmailExpedition())
->to(...explode(',', $parametre->getEmailReception()))
->subject('ProAgri - Nouveau diagnostic')
->text($texte);
$mailer->send($email);
}
}
} elseif (isset($_POST['validerExploitation'])) {
$exploitation = $em->getRepository(Exploitation::class)->find($_POST['exploitationId']);
if ($exploitation) {
$exploitation->setNomExploitation($_POST['exp_nomExp'])
->setNomResponsable($_POST['exp_nomResp'])
->setAdresse($_POST['exp_adresse'])
->setCodePostal($_POST['exp_cp'])
->setCommune($_POST['exp_ville'])
->setEmail($_POST['exp_mail'])
->setTelephone($_POST['exp_tel'])
->setMessage($_POST['exp_message'] ?? null);
$em->flush();
$this->addFlash('success',"Vos informations ont bien été enregistrées. Vous serez contacté prochainement.");
return $this->redirectToRoute('home');
}
$this->addFlash('danger',"Un problème a été détécté, veuillez réessayer.");
}
return $this->render('questionnaire/afficher.html.twig', [
'questionnaire' => $questionnaire,
'listeQuestions' => $listeQuestions,
'questionsFixes' => $questionsFixes,
'produit' => $produit,
'EBE' => $EBE,
'annuites' => $annuites,
'pac' => $pac,
'resultat' => $resultat,
'ebe_produit' => $ebe_produit,
'annuites_ebe' => $annuites_ebe,
'aides_ebe' => $aides_ebe,
'dettes' => $dettes,
'noteTotale' => $noteTotal,
'commentaire_ebe_produit' => $commentaire_ebe_produit,
'commentaire_annuites_ebe' => $commentaire_annuites_ebe,
'commentaire_aides_ebe' => $commentaire_aide_ebe,
'commentaire_dettes' => $commentaire_dettes,
'commentaireGlobal' => $commentaireGlobal,
'resultatCategorie' => $resultatCategorie,
'categories' => $categories,
'departements' => $departements,
'systemes' => $systemes,
'exploitation' => $exploitation,
'mentionsLegales' => $mentionsLegales,
]);
}
}