Commit b2004c87 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Correction assertion pour bonne gestion des règles de validation des services (Ticket #43190)

parent 13056c8c
Loading
Loading
Loading
Loading
+53 −36
Changes for module/Application/src/Assertion/ServiceAssertion.php: 53 added lines, 36 removed lines.
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ use Application\Entity\Db\WfEtape;
use Application\Provider\Privilege\Privileges;
use Application\Service\Traits\CampagneSaisieServiceAwareTrait;
use Application\Service\Traits\ContextServiceAwareTrait;
use Application\Service\Traits\RegleStructureValidationServiceAwareTrait;
use Application\Service\Traits\TypeVolumeHoraireServiceAwareTrait;
use Application\Service\Traits\ValidationServiceAwareTrait;
use Application\Service\Traits\WorkflowServiceAwareTrait;
@@ -34,6 +35,7 @@ class ServiceAssertion extends AbstractAssertion
    use CampagneSaisieServiceAwareTrait;
    use ValidationServiceAwareTrait;
    use TypeVolumeHoraireServiceAwareTrait;
    use RegleStructureValidationServiceAwareTrait;


    /* ---- Routage général ---- */
@@ -43,7 +45,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertPage(array $page)
    {
        $role = $this->getRole();
@@ -61,7 +62,7 @@ class ServiceAssertion extends AbstractAssertion
                && (WfEtape::CODE_SERVICE_VALIDATION == $etape || WfEtape::CODE_SERVICE_VALIDATION_REALISE == $etape)
            ) { // dans ce cas ce n'est pas le WF qui agit mais on voit la validation dès qu'on a des services directement...
                // car on peut très bien avoir à visualiser cette page sans pour autant avoir de services à soi à valider!!
                return $this->assertHasServices($intervenant, $role->getStructure());
                return $this->assertHasServices($intervenant, $role->getStructure(), $etape, $role);
            } else {
                if (!$this->assertEtapeAtteignable($etape, $intervenant)) {
                    return false;
@@ -94,7 +95,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    /**
     * @param ResourceInterface $entity
     * @param string $privilege
@@ -206,7 +206,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    /**
     * @param string $controller
     * @param string $action
@@ -250,7 +249,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertPageServices(Role $role, Intervenant $intervenant = null, string $typeVolumeHoraireCode)
    {
        if (!$intervenant) return true;
@@ -276,7 +274,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertEnseignements(Role $role)
    {
        return $this->asserts([
@@ -291,7 +288,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertImportAgenda(Role $role)
    {
        return true;
@@ -299,7 +295,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceVisualisation(Role $role, Service $service)
    {
        $typeVolumeHoraire = $service->getTypeVolumeHoraire();
@@ -323,7 +318,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceReferentielVisualisation(Role $role, ServiceReferentiel $serviceReferentiel)
    {
        $typeVolumeHoraire = $serviceReferentiel->getTypeVolumeHoraire();
@@ -347,7 +341,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceEdition(Role $role, Service $service)
    {
        $structure = $role->getStructure();
@@ -380,7 +373,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceReferentielEdition(Role $role, ServiceReferentiel $serviceReferentiel)
    {
        $asserts = [];
@@ -411,18 +403,61 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertHasServices(Intervenant $intervenant, Structure $structure)
    protected function assertHasServices(Intervenant $intervenant, Structure $structure, string $etape, Role $role)
    {
        $services = $intervenant->getService()->filter(function (Service $service) use ($structure) {
            if (!$service->getElementPedagogique()) return false;
        $services = $intervenant->getService();
        $serviceEnComposanteAffectation = [];
        $serviceHorsComposanteAffectation = [];

        foreach ($services as $service) {

            if ($service->getHistoDestruction()) continue;
            if (!$service->getElementPedagogique()) continue;

            $typeIntervenant = $service->getIntervenant()->getStatut()->getTypeIntervenant();
            $intervenantStructure = $service->getIntervenant()->getStructure();
            $serviceStructure = $service->getElementPedagogique()->getStructure();
            if ($intervenantStructure == $serviceStructure) {
                $serviceEnComposanteAffectation[] = $service;
            } else {
                $serviceHorsComposanteAffectation[] = $service;
            }

        }

        $reglesValidation = $this->getServiceRegleStructureValidation()->getList();

        foreach ($reglesValidation as $regle) {

            if ($etape == WfEtape::CODE_SERVICE_VALIDATION && $regle->getTypeVolumeHoraire()->getCode() == 'PREVU') {
                if ($regle->getTypeIntervenant()->getCode() == $typeIntervenant->getCode()) {
                    //Cas 1 : Si la priorité est sur l'enseignement et qu'il y a du service sur la composante du gestionnaire alors on peut valider ces services
                    //Cas 2 : Si la priorité est sur l'affectation et que la composante d'affectation de l'intervenant égale à la composante du gestionnaire alors on peut valider tout le service
                    if (($regle->getPriorite() == 'enseignement' && count($serviceEnComposanteAffectation) > 0) ||
                        ($regle->getPriorite() == 'affectation' && $intervenant->getStructure() == $role->getStructure())) {
                        return true;
                    }
                }

            }

            return $service->getElementPedagogique()->getStructure() == $structure;
        });
            if ($etape == WfEtape::CODE_SERVICE_VALIDATION_REALISE && $regle->getTypeVolumeHoraire()->getCode() == 'REALISE') {
                if ($regle->getTypeIntervenant()->getCode() == $typeIntervenant->getCode()) {
                    //Cas 1 : Si la priorité est sur l'enseignement et qu'il y a du service sur la composante du gestionnaire alors on peut valider ces services
                    //Cas 2 : Si la priorité est sur l'affectation et que la composante d'affectation de l'intervenant égale à la composante du gestionnaire alors on peut valider tout le service
                    if (($regle->getPriorite() == 'enseignement' && count($serviceEnComposanteAffectation) > 0) ||
                        ($regle->getPriorite() == 'affectation' && $intervenant->getStructure() == $role->getStructure())) {
                        return true;
                    }
                }

        return $services->count() > 0;
            }

        }


        return false;
    }


    protected function assertCampagneSaisie(Role $role, TypeVolumeHoraire $typeVolumeHoraire)
@@ -439,7 +474,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertCloture(Role $role, Intervenant $intervenant)
    {
        if ($intervenant->getStatut()->getCloture()) {
@@ -460,7 +494,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceVisualisationValidation(Role $role, Service $service)
    {
        $wfEtape = $this->getWorkflowEtape($service->getTypeVolumeHoraire(), 'validation-enseignement');
@@ -472,7 +505,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertVolumeHoraireValidation(Role $role, VolumeHoraire $volumeHoraire)
    {
        $service = $volumeHoraire->getService();
@@ -481,14 +513,12 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceValidation(Role $role, Service $service)
    {
        return $this->assertValidation($role, $service->getIntervenant(), $service->getStructure());
    }



    protected function assertVolumeHoraireReferentielValidation(Role $role, VolumeHoraireReferentiel $volumeHoraireReferentiel)
    {
        $serviceReferentiel = $volumeHoraireReferentiel->getServiceReferentiel();
@@ -497,14 +527,12 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceReferentielValidation(Role $role, ServiceReferentiel $serviceReferentiel)
    {
        return $this->assert($role, $serviceReferentiel->getIntervenant(), $serviceReferentiel->getStructure());
    }



    protected function assertValidationValidation(Role $role, Validation $validation)
    {
        return $this->asserts([
@@ -514,7 +542,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertValidation(Role $role, Intervenant $intervenant, ?Structure $structure)
    {
        return $this->asserts([
@@ -524,7 +551,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertValidationDevalidation(Role $role, Validation $validation)
    {
        return $this->asserts([
@@ -535,7 +561,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertServiceExterieur(Role $role, Service $service)
    {
        return $this->asserts([
@@ -544,7 +569,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertIntervenantServiceExterieur(Role $role, Intervenant $intervenant)
    {
        return $this->asserts([
@@ -554,7 +578,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertMotifNonPaiement(Role $role, Intervenant $intervenant)
    {
        // filtrer pour la structure ? ?
@@ -565,7 +588,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertIntervenant(Role $role, Intervenant $intervenant = null)
    {
        if ($intervenant) {
@@ -580,7 +602,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertIntervenantService(
        Role        $role,
        Intervenant $intervenant,
@@ -602,7 +623,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertIntervenantReferentiel(
        Role        $role,
        Intervenant $intervenant,
@@ -624,7 +644,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertStructure(Role $role, ?Structure $structure = null)
    {
        if ($structure) {
@@ -639,7 +658,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    protected function assertEtapeAtteignable($etape, Intervenant $intervenant = null)
    {
        if ($intervenant) {
@@ -653,7 +671,6 @@ class ServiceAssertion extends AbstractAssertion
    }



    private function getWorkflowEtape(TypeVolumeHoraire $typeVolumeHoraire, $action)
    {
        $key = $action . '-' . strtolower($typeVolumeHoraire->getCode());