Commit 7c94007c authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

UP : Réécriture de la procédure d'affectation des organisations aux activités de recherche

parent 702984a5
Loading
Loading
Loading
Loading
Loading
+63 −68
Changes for module/Oscar/src/Oscar/Controller/EnrollController.php: 63 added lines, 68 removed lines.
Original line number Diff line number Diff line
@@ -919,6 +919,8 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
    // Person <> Activity
    ////////////////////////////////////////////////////////////////////////////
    /**
     * Ajout d'une nouvelle personne dans une activité.
     *
     * @return \Zend\Http\Response
     * @throws OscarException
     */
@@ -946,6 +948,11 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        }
    }

    /**
     * Suppression d'une personne dans une activité.
     *
     * @return \Zend\Http\Response
     */
    public function personActivityDeleteAction()
    {
        try {
@@ -965,6 +972,11 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        }
    }

    /**
     * Modification d'une personne dans une activité.
     *
     * @return \Zend\Http\Response
     */
    public function personActivityEditAction()
    {
        try {
@@ -996,49 +1008,57 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
    ////////////////////////////////////////////////////////////////////////////
    // Organization <> Activity
    ////////////////////////////////////////////////////////////////////////////

    /**
     * @return \Zend\Http\Response
     */
    public function organizationActivityNewAction()
    {
        try {
            /** @var Organization $organization */
            $organization = $this->getOrganizationService()->getOrganization($this->params()->fromPost('enroled'));

            /** @var  $activity */
        $activity = $this->getActivityEntity();

            /** @var RoleOrganization\ $role */
            $role = $this->getOrganizationRoleEntity();

        $this->getOscarUserContextService()->check(Privileges::ACTIVITY_ORGANIZATION_MANAGE, $activity);

            $this->getActivityService()->organizationActivityAdd(
        try {
            $organization = $this->getOrganizationService()->getOrganization(
                $this->getPostedInteger('enroled')
            );
            $role = $this->getOrganizationService()->getRoleOrganizationById($this->getPostedInteger('role'));
            $dateStart = $this->getPostedDateTime('dateStart');
            $dateEnd = $this->getPostedDateTime('dateEnd');

            $this->getProjectGrantService()->organizationActivityAdd(
                $organization,
                $activity,
                $role,
                $this->getDateStartPosted(),
                $this->getDateEndPosted(),
                true
                $dateStart,
                $dateEnd
            );

            return $this->redirect()->toRoute('contract/show', ['id' => $activity->getId()]);
            return $this->getResponseOk("La personne a bien été ajouté");
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible d'ajouter l'organisation dans l'activité : " . $e->getMessage()
            );
            $msg = "Impossible d'ajouter l'organisation à l'activité";
            $this->getLoggerService()->error("$msg : " . $e->getMessage());
            return $this->getResponseInternalError($msg);
        }
    }

    /**
     * @return \Zend\Http\Response
     */
    public function activityOrganizationDeleteAction()
    {
        try {
            $organizationActivity = $this->getPostedActivityOrganization();
            $activity = $organizationActivity->getActivity();
            $this->getOscarUserContextService()->check(Privileges::ACTIVITY_ORGANIZATION_MANAGE, $activity);
            $this->getActivityService()->activityOrganizationRemove($organizationActivity);
            return $this->redirect()->toRoute('contract/show', ['id' => $activity->getId()]);
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible de supprimer l'affectation de cette organisation dans l'activité : " . $e->getMessage()
            /** @var ActivityPerson $personActivity */
            $activityOrganization = $this->getOrganizationService()->getActivityOrganization($this->getRoutedInteger('idenroll'));

            $this->getOscarUserContextService()->check(
                Privileges::ACTIVITY_PERSON_MANAGE,
                $activityOrganization->getActivity()
            );
            $this->getProjectGrantService()->activityOrganizationRemove($activityOrganization);
            return $this->getResponseOk("L'organisation a bien été supprimée de l'activité");
        } catch (\Exception $e) {
            $msg = "Impossible de supprimer l'affectation de cette organisation dans l'activité";
            $this->getLoggerService()->error("$msg : " . $e->getMessage());
            return $this->getResponseInternalError($msg);
        }
    }

@@ -1046,33 +1066,27 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
    {
        try {
            /** @var ActivityOrganization $activityOrganization */
            $organizationActivity = $this->getEntityManager()->getRepository(ActivityOrganization::class)->find(
                $this->params()->fromRoute('idenroll')
            );

            if (!$organizationActivity) {
                throw new OscarException("Affectation introuvable");
            }

            if (!$this->getOscarUserContextService()->hasPrivileges(
                Privileges::ACTIVITY_ORGANIZATION_MANAGE,
                $organizationActivity->getActivity()
            )) {
                throw new OscarException("Droits insufisants");
            }
            $activityOrganization = $this->getOrganizationService()->getActivityOrganization($this->getRoutedInteger('idenroll'));

            $this->getOscarUserContextService()->check(
                Privileges::ACTIVITY_PERSON_MANAGE,
                $activityOrganization->getActivity()
            );
            $role = $this->getOrganizationService()->getRoleOrganizationById(
                $this->getPostedInteger('role'),
                true
            );
            $this->getProjectGrantService()->organizationActivityEdit(
                $organizationActivity,
                $this->getPostedOrganizationRole(),
                $this->getDateStartPosted(),
                $this->getDateEndPosted()
                $activityOrganization,
                $role,
                $this->getPostedDateTime('dateStart'),
                $this->getPostedDateTime('dateEnd')
            );

            return $this->redirect()->toRoute('contract/show', ['id' => $organizationActivity->getActivity()->getId()]);
            return $this->getResponseOk("L'organisation a bien été modifiée dans l'activité");
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible de modifier l'affectation de cette organisation dans l'activité : " . $e->getMessage()
            );
            $msg = "Impossible de modifier l'affectation de cette organisation dans l'activité";
            $this->getLoggerService()->error("$msg : " . $e->getMessage());
            return $this->getResponseInternalError($msg);
        }
    }

@@ -1101,7 +1115,6 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        }
    }


    /**
     * @return Role
     * @throws OscarException
@@ -1136,24 +1149,6 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        }
    }



//    public function getPosted($type){
//        $idEnroll = $this->params()->fromRoute('idenroll');
//        try {
//            return $this->getEntityManager()->getRepository($type)->find($idEnroll);
//        } catch (\Exception $e) {
//            throw new OscarException(sprintf(_("Impossible de charger l'affectation [%s]%s : %s", $idEnroll, $type, $e->getMessage())));
//        }
//    }


//    public function organizationActivityEditAction()
//    {
//        $this->getOscarUserContextService()->check(Privileges::ACTIVITY_ORGANIZATION_MANAGE, $this->getActivityEntity());
//        return $this->editEnroll(ActivityOrganization::class);
//    }

    ////////////////////////////////////////////////////////////////////////////
    // Fin des rôles
    public function organizationPersonCloseAction()
+52 −0
Changes for module/Oscar/src/Oscar/Service/OrganizationService.php: 52 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ use Oscar\Entity\Activity;
use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\Organization;
use Oscar\Entity\OrganizationRole;
use Oscar\Entity\OrganizationRoleRepository;
use Oscar\Entity\OrganizationType;
use Oscar\Entity\OrganizationTypeRepository;
use Oscar\Entity\ProjectPartner;
@@ -93,6 +94,56 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana
        return $this->getEntityManager()->getRepository(OrganizationRole::class)->findAll();
    }

    /**
     * Retourne le OrganizationRole via l'ID
     *
     * @param int $organizationRoleId
     * @param bool $throw
     * @return OrganizationRole
     * @throws OscarException
     */
    public function getRoleOrganizationById(int $organizationRoleId, $throw = true): OrganizationRole
    {
        /** @var OrganizationRoleRepository $repo */
        $repo = $this->getEntityManager()->getRepository(OrganizationRole::class);

        $role = $repo->find($organizationRoleId);

        if ($role === null && $throw === true) {
            throw new OscarException("Impossible de charger le rôle d'organisation '$organizationRoleId'");
        }

        return $role;
    }

    /**
     * Retourne l'ActivityOrganization via l'ID.
     *
     * @param int $activityOrganizationId
     * @param bool $throw
     * @return ActivityOrganization
     * @throws OscarException
     */
    public function getActivityOrganization(int $activityOrganizationId, $throw = true): ActivityOrganization
    {
        $repo = $this->getEntityManager()->getRepository(ActivityOrganization::class);

        $activityOrganization = $repo->find($activityOrganizationId);

        if ($activityOrganization === null && $throw === true) {
            throw new OscarException("Impossible de charger le rôle d'organisation '$activityOrganizationId'");
        }

        return $activityOrganization;
    }

    /**
     * @param $id
     * @throws OscarException
     * @throws \Doctrine\ORM\ORMException
     * @throws \Doctrine\ORM\OptimisticLockException
     * @deprecated
     */
    public function deleteOrganization($id)
    {
        $o = $this->getOrganization($id);
@@ -102,6 +153,7 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana

    /**
     * Retourne la liste des Organizations pour la personne
     *
     * @param Person $person
     * @param null $specifiqueRoleIds
     * @param bool $rolePrincipaux
+15 −18
Changes for module/Oscar/src/Oscar/Service/ProjectGrantService.php: 15 added lines, 18 removed lines.
Original line number Diff line number Diff line
@@ -1833,17 +1833,21 @@ class ProjectGrantService implements UseOscarConfigurationService, UseEntityMana
        $buildIndex = true
    ) {
        try {
            $updateNotification = $activityorganization->getRoleObj()->isPrincipal() !== $roleOrganization->isPrincipal();
            $activityorganization->setRoleObj($roleOrganization)
                ->setDateStart($dateStart)
                ->setDateEnd($dateEnd);

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

            $activity = $activityorganization->getActivity();
            $organization = $activityorganization->getOrganization();

            $this->jobSearchUpdate($activity);
            $this->getOrganizationService()->updateIndex($organization);
            $this->getNotificationService()->jobUpdateNotificationsActivity($activity);
            $this->getGearmanJobLauncherService()->triggerUpdateSearchIndexActivity($activity);
            $this->getGearmanJobLauncherService()->triggerUpdateSearchIndexOrganization($organization);
            if( $updateNotification ){
                $this->getGearmanJobLauncherService()->triggerUpdateNotificationActivity($activity);
            }

            $this->getActivityLogService()->addUserInfo(
                sprintf(
@@ -1856,17 +1860,7 @@ class ProjectGrantService implements UseOscarConfigurationService, UseEntityMana
                $activity->getId()
            );
        } catch (\Exception $e) {
            throw new OscarException(
                sprintf(
                    _(
                        "Impossible de mettre à jour le rôle de l'organisation %s comme %s dans %s : %s",
                        $activityorganization->getOrganization(),
                        $roleOrganization,
                        $activityorganization->getActivity(),
                        $e->getMessage()
                    )
                )
            );
            throw $e;
        }
    }

@@ -1922,12 +1916,15 @@ class ProjectGrantService implements UseOscarConfigurationService, UseEntityMana
        try {
            $activity = $activityOrganization->getActivity();
            $organization = $activityOrganization->getOrganization();
            $updateNotification = $activityOrganization->getRoleObj()->isPrincipal();
            $this->getEntityManager()->remove($activityOrganization);
            $this->getEntityManager()->flush($activityOrganization);
            $this->getEntityManager()->flush();

            $this->jobSearchUpdate($activity);
            $this->getOrganizationService()->updateIndex($organization);
            $this->getNotificationService()->jobUpdateNotificationsActivity($activity);
            $this->getGearmanJobLauncherService()->triggerUpdateSearchIndexActivity($activity);
            $this->getGearmanJobLauncherService()->triggerUpdateSearchIndexOrganization($organization);
            if ($updateNotification) {
                $this->getGearmanJobLauncherService()->triggerUpdateNotificationActivity($activity);
            }

            $this->getActivityLogService()->addUserInfo(
                sprintf(" a supprimé l'organisation %s de l'activité %s", $organization->log(), $activity->log()),