Commit d4d95013 authored by Florian Joriot's avatar Florian Joriot
Browse files

Mise en place de la modification annualisé des centre de cout de type de mission

parent bca44e3e
Loading
Loading
Loading
Loading
+19 −21
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace Mission\Controller;

use Administration\Service\ParametresServiceAwareTrait;
use Application\Controller\AbstractController;
use Application\Provider\Privilege\Privileges;
use Application\Service\Traits\ContextServiceAwareTrait;
@@ -29,6 +30,7 @@ class MissionTypeController extends AbstractController
    use ContextServiceAwareTrait;
    use MissionTypeFormAwareTrait;
    use MissionCentreCoutsTypeFormAwareTrait;
    use ParametresServiceAwareTrait;

    public function indexAction()
    {
@@ -105,18 +107,11 @@ class MissionTypeController extends AbstractController
            $centreCoutsId = $this->getRequest()->getPost()->get('centreCouts');
            $structureId   = $this->getRequest()->getPost()->get('structure');
            if ($centreCoutsId != null) {

                $centreCouts   = $this->getServiceCentreCout()->get($centreCoutsId);
                $structureCC   = $this->getServiceStructure()->get($structureId);
                $anneeCourante = (int)$this->getServiceParametres()->get('annee');

                $centreCoutTypeLinker = new CentreCoutTypeMission();
                $centreCoutTypeLinker->setTypeMission($typeMission);
                $centreCoutTypeLinker->setCentreCouts($centreCouts);
                $centreCoutTypeLinker->setStructure($structureCC);
                $this->getServiceMissionType()->saveCentreCoutTypeLinker($centreCoutTypeLinker);

                $typeMission->addCentreCoutTypeMission($centreCoutTypeLinker);
                $this->getServiceMissionType()->save($typeMission);
                $this->getServiceMissionType()->addCentreCoutTypeMission($centreCouts, $structureCC, $typeMission, $anneeCourante);
            }
        }

@@ -157,18 +152,21 @@ class MissionTypeController extends AbstractController



    public
    function CentreCoutsSupprimerAction(): \Laminas\Http\Response
    public function CentreCoutsSupprimerAction(): \Laminas\Http\Response
    {
        /**
         * @var TypeMission $entity
         */
        $entity                = $this->getEvent()->getParam('typeMission');
        $centreCoutTypeMission = $this->getEvent()->getParam('centreCoutTypeMission');
        $this->getServiceMissionType()->removeCentreCoutLinker($centreCoutTypeMission);
        $anneeCourante = (int) $this->getServiceParametres()->get('annee');

        $this->getServiceMissionType()->removeCentreCoutLinker($centreCoutTypeMission, $anneeCourante);


        return $this->redirect()->toRoute('missions-type/centre-couts', ['typeMission' => $entity->getId()]);
    }


}
+153 −10
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@

namespace Mission\Service;


use Application\Service\AbstractEntityService;
use Lieu\Entity\Db\Structure;
use Mission\Entity\Db\CentreCoutTypeMission;
use Mission\Entity\Db\TypeMission;
use Paiement\Entity\Db\CentreCout;
@@ -51,6 +51,8 @@ class MissionTypeService extends AbstractEntityService
        return $query->getResult();
    }



    public function getCentreCouts(): array
    {
        $dql   = "SELECT cm FROM " . CentreCout::class . " cm WHERE cm.histoDestruction IS NULL";
@@ -59,29 +61,170 @@ class MissionTypeService extends AbstractEntityService
        return $query->getResult();
    }

    public function saveCentreCoutTypeLinker($centreCoutTypeLinker){


    public function saveCentreCoutTypeLinker($centreCoutTypeLinker)
    {
        $this->getEntityManager()->persist($centreCoutTypeLinker);
    }



    public function removeCentreCoutLinker(CentreCoutTypeMission $centreCoutTypeMission, $softDelete = true)
    public function removeCentreCoutLinker(CentreCoutTypeMission $centreCoutTypeMission, int $anneeCourante, $softDelete = true): void
    {
        $typeMission      = $centreCoutTypeMission->getTypeMission();
        $structure        = $centreCoutTypeMission->getStructure();
        $lastCentreCoutId = $centreCoutTypeMission->getCentreCouts()->getId();

        // 1. Historiser ou supprimer l'élément courant
        if ($softDelete) {
            $centreCoutTypeMission->historiser($this->getServiceContext()->getUtilisateur());
            $this->getEntityManager()->persist($centreCoutTypeMission);
        } else {
            $this->getEntityManager()->remove($centreCoutTypeMission);
        }

        $this->getEntityManager()->flush();

        // 2. Si l’année est passée, on s’arrête là
        if ($typeMission->getAnnee()->getId() < $anneeCourante) {
            return;
        }
        $this->getEntityManager()->flush($centreCoutTypeMission);

        // 3. Récupérer les TypeMission futurs avec le même code
        $sql = "SELECT id FROM TYPE_MISSION
            WHERE histo_destruction IS NULL
            AND code = :code
            AND annee_id > :annee
            ORDER BY annee_id ASC";

        $params = [
            'code'  => $typeMission->getCode(),
            'annee' => $typeMission->getAnnee()->getId(),
        ];

        $data = $this->getEntityManager()->getConnection()->fetchAllAssociative($sql, $params);

        foreach ($data as $d) {
            $tm = $this->get($d['ID']);

            $filtered = $tm->getCentreCoutsTypeMission()->filter(function ($element) use ($structure) {
                return $element->getStructure()->getId() === $structure->getId() && !$element->estHistorise();
            });

            $shouldProceed = false;

            if (!$filtered->isEmpty() && $lastCentreCoutId !== null) {
                foreach ($filtered as $element) {
                    if ($element->getCentreCouts()->getId() === $lastCentreCoutId) {
                        if ($softDelete) {
                            $element->historiser($this->getServiceContext()->getUtilisateur());
                            $this->getEntityManager()->persist($element);
                        } else {
                            $this->getEntityManager()->remove($element);
                        }
                        $shouldProceed = true;
                    }
                }
                $this->getEntityManager()->flush();
            }

            if (!$shouldProceed) {
                return;
            }
        }
    }



    public function addCentreCoutTypeMission(CentreCout $centreCouts, Structure $structure, TypeMission $typeMission, int $anneeCourante): void
    {


?>
 No newline at end of file
        // 1. Historiser les éléments existants pour l'année courante
        $filtered = $typeMission->getCentreCoutsTypeMission()->filter(function ($element) use ($structure) {
            return $element->getStructure()->getId() === $structure->getId() && !$element->estHistorise();
        });

        $lastCentreCoutId = null;

        foreach ($filtered as $element) {
            $lastCentreCoutId = $element->getCentreCouts()->getId();
            $element->historiser();
            $this->getEntityManager()->persist($element);
        }

        // Si des éléments ont été historisés, on flush une seule fois
        if (!$filtered->isEmpty()) {
            $this->getEntityManager()->flush();
        }

        // 2. Créer le lien pour le typeMission courant
        $link = new CentreCoutTypeMission();
        $link->setTypeMission($typeMission);
        $link->setCentreCouts($centreCouts);
        $link->setStructure($structure);

        $this->saveCentreCoutTypeLinker($link);
        $typeMission->addCentreCoutTypeMission($link);
        $this->save($typeMission);

        // 3. Si l’année est passée, on ne traite pas les autres années
        if ($typeMission->getAnnee()->getId() < $anneeCourante) {
            return;
        }

        // 4. Traitement des autres années pour le même code
        $sql = "SELECT id FROM TYPE_MISSION
        WHERE histo_destruction IS NULL
        AND code = :code
        AND annee_id > :annee
        ORDER BY annee_id ASC";

        $params = [
            'code'  => $typeMission->getCode(),
            'annee' => $typeMission->getAnnee()->getId(),
        ];

        $data = $this->getEntityManager()->getConnection()->fetchAllAssociative($sql, $params);

        foreach ($data as $d) {
            $tm = $this->get($d['ID']);

            $filtered = $tm->getCentreCoutsTypeMission()->filter(function ($element) use ($structure) {
                return $element->getStructure()->getId() === $structure->getId() && !$element->estHistorise();
            });

            $shouldProceed = false;

            if ($filtered->isEmpty() && $lastCentreCoutId === null) {
                $shouldProceed = true;
            } elseif (!$filtered->isEmpty() && $lastCentreCoutId !== null) {
                foreach ($filtered as $element) {
                    if ($element->getCentreCouts()->getId() === $lastCentreCoutId) {
                        $element->historiser();
                        $this->getEntityManager()->persist($element);
                        $shouldProceed = true;
                        break;
                    }
                }
                $this->getEntityManager()->flush();
            }

            if ($shouldProceed) {
                $link = new CentreCoutTypeMission();
                $link->setTypeMission($tm);
                $link->setCentreCouts($centreCouts);
                $link->setStructure($structure);

                $this->saveCentreCoutTypeLinker($link);
                $tm->addCentreCoutTypeMission($link);
                $this->save($tm);
            } else {
                return;
            }
        }
    }


}