Commit ffdfbd5d authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

UP : Clôture des rôles dans les organisations

parent 5a0cefc4
Loading
Loading
Loading
Loading
+22 −43
Original line number Diff line number Diff line
@@ -56,45 +56,6 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
{
    use UsePersonServiceTrait, UseProjectServiceTrait, UseProjectGrantServiceTrait, UseNotificationServiceTrait, UseActivityServiceTrait, UseOrganizationServiceTrait;

    private function closeEnroll($class)
    {
        $this->getOscarUserContextService()->check(Privileges::PERSON_EDIT);

        /** @var OrganizationPerson $enroll */
        $enroll = $this->getEntityManager()->getRepository($class)->find($this->params()->fromRoute('idenroll'));

        $date = $this->params()->fromPost('at');
        if (!$date || !$enroll) {
            throw new OscarException("Erreur, données manquantes, veuillez reessayer");
        }

        switch ($class) {
            case OrganizationPerson::class :
                $route = 'organization/show';
                $routeOpt = ['id' => $enroll->getOrganization()->getId()];
                break;
            default:
                return $this->getResponseInternalError("Objet $class non pris en charge");
        }

        try {
            $datet = new \DateTime($date);
        } catch (\Exception $e) {
            throw new OscarException("Erreur, données inconhérente");
        }

        try {
            $enroll->setDateEnd($datet);
            $this->getEntityManager()->flush($enroll);

            $this->redirect()->toRoute($route, $routeOpt);
        } catch (\Exception $e) {
            $msg = sprinf("Impossible de mettre le rôle de la person à jour : %s", $e->getMessage());
            $this->getActivityLogService()->addUserInfo($msg, "organizationperson", $enroll->getId());
            throw new OscarException($msg);
        }
    }

    private function getProjectEntity(): Project
    {
        $idProject = $this->params()->fromRoute('idenroller');
@@ -684,12 +645,30 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        }
    }

    ////////////////////////////////////////////////////////////////////////////
    // Fin des rôles
    /**
     * @throws OscarException
     */
    public function organizationPersonCloseAction()
    {
        $this->getOscarUserContextService()->check(Privileges::ORGANIZATION_EDIT, $this->getActivityEntity());
        return $this->closeEnroll(OrganizationPerson::class);
        $this->getOscarUserContextService()->check(Privileges::ORGANIZATION_EDIT);

        /** @var OrganizationPerson $enroll */
        $enroll = $this->getEntityManager()->getRepository(OrganizationPerson::class)->find($this->params()->fromRoute('idenroll'));

        $organization = $enroll->getOrganization();
        $date = $this->getPostedDateTime('at');

        if (!$date || !$enroll) {
            throw new OscarException("Erreur, données manquantes, veuillez reessayer");
        }

        try {
            $this->getOrganizationService()->closeOrganizationPerson($enroll, $date);
            $this->redirect()->toRoute('organization/show', ['id' => $organization->getId()]);
        } catch (\Exception $e) {
            $msg = "Impossible de cloturer le rôle de la personne dans l'organisation";
            throw new OscarException($e->getMessage());
        }
    }
}

+19 −0
Original line number Diff line number Diff line
@@ -4,9 +4,11 @@
namespace Oscar\Service;

use Oscar\Entity\Activity;
use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\Organization;
use Oscar\Entity\Person;
use Oscar\Entity\Project;
use Oscar\Entity\ProjectPartner;
use Oscar\Traits\UseLoggerService;
use Oscar\Traits\UseLoggerServiceTrait;
use Oscar\Traits\UseOscarConfigurationService;
@@ -68,6 +70,23 @@ class GearmanJobLauncherService implements UseOscarConfigurationService, UseLogg
        $this->sendBackgroundTask($task, $params, $key);
    }

    public function triggerUpdateNotificationOrganization(Organization $organization): void
    {
        /** @var ActivityOrganization $activityOrganization */
        foreach ($organization->getActivities() as $activityOrganization) {
            if( $activityOrganization->isPrincipal() ){
                $this->triggerUpdateNotificationActivity($activityOrganization->getActivity());
            }
        }

        /** @var ProjectPartner $projectPartner */
        foreach ($organization->getProjects() as $projectPartner) {
            if( $projectPartner->isPrincipal() ){
                $this->triggerUpdateNotificationProject($projectPartner->getProject());
            }
        }
    }

    /**
     * Mise à jour des notifications des activités d'un projet de recherche.
     *
+34 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\Country3166;
use Oscar\Entity\Country3166Repository;
use Oscar\Entity\Organization;
use Oscar\Entity\OrganizationPerson;
use Oscar\Entity\OrganizationRole;
use Oscar\Entity\OrganizationRoleRepository;
use Oscar\Entity\OrganizationType;
@@ -592,6 +593,39 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana
        }
    }



    public function closeOrganizationPerson(OrganizationPerson $organizationPerson, \DateTime $dateEnd) :void
    {
        $person = $organizationPerson->getPerson();
        $organization = $organizationPerson->getOrganization();
        $role = $organizationPerson->getRoleObj();

        $msg = sprintf(
                "Résiliation du rôle '%s' de '%s' dans l'organisation '%s'",
            $role->getRoleId(),
            $person,
            $organization
        );
        $this->getLoggerService()->notice($msg);

        try {
            $updateNotification = $role->isPrincipal();
            $organizationPerson->setDateEnd($dateEnd);
            $this->getEntityManager()->flush();
            if($updateNotification ){
             $this->getPersonService()->getGearmanJobLauncherService()->triggerUpdateNotificationOrganization($organization);

            }
            $this->getPersonService()->getGearmanJobLauncherService()->triggerUpdateSearchIndexPerson($person);
            $this->getPersonService()->getGearmanJobLauncherService()->triggerUpdateSearchIndexOrganization($organization);

        } catch (\Exception $e){

        }

    }

    ////////////////////////////////////////////////////////////////////////////

    /**