<?php
namespace App\Controller;
use App\Entity\Analyse;
use App\Entity\Ordonnance;
use App\Form\AnalyseType;
use App\Form\OrdonnanceType;
use App\Repository\AnalyseRepository;
use App\Repository\AppareilRepository;
use App\Repository\EchantillonRepository;
use App\Repository\ExamenRepository;
use App\Repository\MethodeRepository;
use App\Repository\OrdonnanceRepository;
use App\Repository\PatientRepository;
use App\Repository\PayementRepository;
use App\Repository\ProformaRepository;
use App\Repository\SousCategorieExamenRepository;
use App\Service\Utils;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/admin/ordonnance')]
class OrdonnanceController extends AbstractController
{
private $ordonnanceRepository;
private $analyseRepository;
private $patientRepository;
private $examenRepository;
private $echantillonRepository;
private $methodeRepository;
private $sousCategorieExamenRepository;
private $appareilRepository;
private $utils;
private $ordonnancesAll;
private $analysesAll;
public function __construct(
OrdonnanceRepository $ordonnanceRepository,
AnalyseRepository $analyseRepository,
PatientRepository $patientRepository,
SousCategorieExamenRepository $sousCategorieExamenRepository,
ExamenRepository $examenRepository,
EchantillonRepository $echantillonRepository,
MethodeRepository $methodeRepository,
AppareilRepository $appareilRepository,
Utils $utils
) {
$this->ordonnanceRepository = $ordonnanceRepository;
$this->analyseRepository = $analyseRepository;
$this->patientRepository = $patientRepository;
$this->examenRepository = $examenRepository;
$this->sousCategorieExamenRepository = $sousCategorieExamenRepository;
$this->echantillonRepository = $echantillonRepository;
$this->methodeRepository = $methodeRepository;
$this->appareilRepository = $appareilRepository;
$this->utils = $utils;
$this->ordonnancesAll = $this->ordonnanceRepository->findAll();
$this->analysesAll = $this->analyseRepository->findAll();
}
#[Route('/', name: 'bioclin_ordonnance_index', methods: ['GET', 'POST'])]
public function index(Request $request): Response
{
// FormType du ordonnance
$ordonnance = new Ordonnance();
$form = $this->createForm(OrdonnanceType::class, $ordonnance);
$form->handleRequest($request);
// FormType de ordonnance
$analyse = new Analyse();
$form2 = $this->createForm(AnalyseType::class, $analyse);
$form2->handleRequest($request);
// Vérifie si l'id du ordonnance est définit sinon prend le dernier type
$patient_id = $request->get('patient_id');
if ($request->get('ord_id')) {
$ordonnanceCurrent = $this->ordonnanceRepository->findOneBy(['patient' => $patient_id, 'id' => $request->get('ord_id')]);
} else {
$ordonnanceCurrent = $this->ordonnanceRepository->findOneBy(['patient' => $patient_id]);
}
$patient = $this->patientRepository->findOneBy(['id' => $patient_id]);
// Soumettre analyse
if ($form2->isSubmitted() && $form2->isValid()) {
$analyse->setOrdonnance($ordonnanceCurrent);
$analyse->setCode($this->utils->code($this->ordonnancesAll, "AN"));
$ordonnanceCurrent->setMontant($ordonnanceCurrent->getMontant() + $analyse->getExamen()->getPrix());
$analyse->setUtilisateur($this->getUser());
$this->analyseRepository->add($analyse, true);
$this->ordonnanceRepository->add($ordonnanceCurrent, true);
return $this->redirectToRoute('bioclin_ordonnance_index', ['patient_id' => $analyse->getOrdonnance()->getPatient()->getId(), 'ord_id' => $analyse->getOrdonnance()->getId()], Response::HTTP_SEE_OTHER);
}
// Soumettre ordonnance
if ($form->isSubmitted() && $form->isValid()) {
$ordonnance->setPatient($patient);
$ordonnance->setUtilisateur($this->getUser());
$this->ordonnanceRepository->add($ordonnance, true);
return $this->redirectToRoute('bioclin_ordonnance_index', ['patient_id' => $ordonnance->getPatient()->getId(), 'ord_id' => $ordonnance->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('ordonnance/index.html.twig', [
'ordonnance' => $ordonnanceCurrent,
'ordonnancesAll' => $this->ordonnanceRepository->findBy(['patient' => $patient_id]),
'patient' => $patient,
'ordonnances' => !empty($ordonnanceCurrent) ? $this->ordonnanceRepository->findByNotCurrentAll($ordonnanceCurrent->getId(), $patient_id) : null,
'ordonnancesP' => !empty($ordonnanceCurrent) ? $this->ordonnanceRepository->findByPayementStatus("Payé", $patient_id)["total"] : 0,
'ordonnancesA' => !empty($ordonnanceCurrent) ? $this->ordonnanceRepository->findByPayementStatus("Avancé", $patient_id)["total"] : 0,
'ordonnancesI' => !empty($ordonnanceCurrent) ? $this->ordonnanceRepository->findBy(['statut' => null, 'patient' => $patient_id]) : null,
'form' => $form,
'form2' => $form2,
]);
}
#[Route('/new', name: 'bioclin_ordonnance_new', methods: ['GET', 'POST'])]
public function new(Request $request): Response
{
$ordonnance = new Ordonnance();
$form = $this->createForm(OrdonnanceType::class, $ordonnance);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$arrayExamen = [];
$arrayOrdAll = [];
for ($m = 0; $m < sizeof($request->get('examen')); $m++) {
$examen = $this->examenRepository->findOneBy(['id' => $request->get('examen')[$m]]);
if ($examen) {
array_push($arrayExamen, $examen);
array_push($arrayOrdAll, $examen->getSousDomaine()->getDomaine()->getNom());
}
}
usort($arrayExamen, function ($a, $b) {
return strcmp($a->getSousDomaine()->getDomaine()->getId(), $b->getSousDomaine()->getDomaine()->getId());
});
$arrayOrdAll = array_unique($arrayOrdAll);
for ($cp = 0; $cp < sizeof($arrayOrdAll); $cp++) {
$ordo = new Ordonnance();
// Soumettre le bulletin d'examen
$ordo->setCode($this->utils->code($this->ordonnancesAll, "BU"));
$ordo->setDateEcheance($ordonnance->getDateEcheance());
$ordo->setPourcent($ordonnance->getPourcent());
$ordo->setPreleveur($ordonnance->getPreleveur());
$ordo->setDatePrelevement($ordonnance->getDatePrelevement());
$ordo->setPrescripteur($ordonnance->getPrescripteur());
$ordo->setObservations($ordonnance->getObservations());
$ordo->setType($arrayOrdAll[$cp]);
$ordo->setPatient($this->patientRepository->findOneBy(['id' => $request->get('patient_id')]));
$this->ordonnanceRepository->add($ordo, true);
for ($i = 0; $i < sizeof($arrayExamen); $i++) {
$examen = $arrayExamen[$i];
$analyse = new Analyse();
if ($examen && $examen->getSousDomaine()->getDomaine()->getNom() == $ordo->getType()) {
$analyse->setExamen($examen);
$analyse->setEchantillon($this->echantillonRepository->findOneBy(['id' => $request->get('echantillon')[$i]]));
if ($request->get('methode')[$i]) $analyse->setMethode($this->methodeRepository->findOneBy(['id' => $request->get('methode')[$i]]));
if ($request->get('appareil')[$i]) $analyse->setAppareil($this->appareilRepository->findOneBy(['id' => $request->get('appareil')[$i]]));
$analyse->setRapport($request->get('rapport')[$i]);
$analyse->setUtilisateur($this->getUser());
$analyse->setOrdonnance($ordo);
$this->analyseRepository->add($analyse, true);
$analyse->setCode($this->utils->code2($analyse->getId(), "AN"));
$this->analyseRepository->add($analyse, true);
$ordo->setMontant($examen->getPrix() + $ordo->getMontant());
}
}
}
return $this->redirectToRoute('bioclin_ordonnance_index', ['ord_id' => $ordo->getId(), 'patient_id' => $ordo->getPatient()->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('ordonnance/new.html.twig', [
'form' => $form,
'code' => $this->utils->code($this->ordonnancesAll, "BU"),
'examens' => $this->examenRepository->findBy([], ["nom" => "ASC"]),
'methodes' => $this->methodeRepository->findBy([], ["intitule" => "ASC"]),
'echantillons' => $this->echantillonRepository->findBy([], ["intitule" => "ASC"]),
'appareils' => $this->appareilRepository->findBy([], ["intitule" => "ASC"]),
]);
}
#[Route('/{id}/edit', name: 'bioclin_ordonnance_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Ordonnance $ordonnance): Response
{
$form = $this->createForm(OrdonnanceType::class, $ordonnance);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->ordonnanceRepository->add($ordonnance, true);
return $this->redirectToRoute('bioclin_ordonnance_index', ['ord_id' => $ordonnance->getId(), 'patient_id' => $ordonnance->getPatient()->getId()], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('modal/edit_form.html.twig', [
'entity' => $ordonnance,
'form' => $form,
'title' => 'l\'ordonnance',
'path_url' => 'bioclin_ordonnance_edit'
]);
}
#[Route('/{id}', name: 'bioclin_ordonnance_delete', methods: ['POST'])]
public function delete(
Request $request,
Ordonnance $ordonnance,
AnalyseRepository $analyseRepository,
ProformaRepository $proformaRepository,
PayementRepository $payementRepository
): Response {
if ($this->isCsrfTokenValid('delete' . $ordonnance->getId(), $request->request->get('_token'))) {
foreach ($ordonnance->getAnalyses() as $value) {
$analyseRepository->remove($value, true);
}
foreach ($ordonnance->getPayements() as $value) {
$payementRepository->remove($value, true);
}
foreach ($ordonnance->getProformas() as $value) {
$proformaRepository->remove($value, true);
}
$this->ordonnanceRepository->remove($ordonnance, true);
}
return $this->redirectToRoute('bioclin_ordonnance_index', [], Response::HTTP_SEE_OTHER);
}
}