Loading module/Mission/src/Controller/MissionTypeController.php +19 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -29,6 +30,7 @@ class MissionTypeController extends AbstractController use ContextServiceAwareTrait; use MissionTypeFormAwareTrait; use MissionCentreCoutsTypeFormAwareTrait; use ParametresServiceAwareTrait; public function indexAction() { Loading Loading @@ -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); } } Loading Loading @@ -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()]); } } module/Mission/src/Service/MissionTypeService.php +153 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading @@ -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; } } } } Loading
module/Mission/src/Controller/MissionTypeController.php +19 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -29,6 +30,7 @@ class MissionTypeController extends AbstractController use ContextServiceAwareTrait; use MissionTypeFormAwareTrait; use MissionCentreCoutsTypeFormAwareTrait; use ParametresServiceAwareTrait; public function indexAction() { Loading Loading @@ -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); } } Loading Loading @@ -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()]); } }
module/Mission/src/Service/MissionTypeService.php +153 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"; Loading @@ -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; } } } }