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

UP/FIX : Uniformisation des affectations des organisations aux projets/activités

parent 7c94007c
Loading
Loading
Loading
Loading
Loading
+1 −1
Changes for module/Oscar/config/module.config.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ return array(
                // PROJET
                ////////////////////////////////////////////////////////////////
                [   'controller' =>   'Project',
                    'action' => ['show', 'new', 'edit', 'search', 'makeProject'],
                    'action' => ['show', 'new', 'edit', 'search', 'makeProject', 'persons', 'organizations'],
                    'roles' => ['user'],
                ],
                [   'controller' =>   'Project',
+14 −0
Changes for module/Oscar/config/routes.yml: 14 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -518,6 +518,20 @@ project:
                defaults:
                    action: search

        persons:
            type: segment
            options:
                route: /persons/:idproject
                defaults:
                    action: persons

        organizations:
            type: segment
            options:
                route: /organizations/:idproject
                defaults:
                    action: organizations

################################################################################
# GESTION des PERSONNES
person:
+190 −106
Changes for module/Oscar/src/Oscar/Controller/EnrollController.php: 190 added lines, 106 removed lines.
Original line number Diff line number Diff line
@@ -753,68 +753,70 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        return $role;
    }

    ////////////////////////////////////////////////////////////////////////////
    // Person <> Project
    ////////////////////////////////////////////////////////////////////////////
    public function personProjectNewAction()
    {
        $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_MANAGE, $this->getProjectEntity());

        return $this->saveEnroll(ProjectMember::class);
    }

    public function personProjectDeleteAction()
    {
        try {
            $rolledId = $this->params()->fromRoute('idenroll');
            /** @var ProjectMember $rolled */
            $rolled = $this->getEntityManager()->getRepository(ProjectMember::class)->find($rolledId);
            $project = $rolled->getProject();
            $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_MANAGE, $project);
            return $this->deleteEnroll(ProjectMember::class);
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible de supprimer l'affectation de cette personne dans le projet : " . $e->getMessage()
            );
        }
    }

    public function personProjectEditAction()
    {
        /** @var ProjectMember $personProject */
        $personProject = $this->getEntityManager()->getRepository(ProjectMember::class)->find(
            $this->params()->fromRoute('idenroll')
        );

        $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_MANAGE, $personProject->getProject());
        return $this->editEnroll(ProjectMember::class);
    }

    ////////////////////////////////////////////////////////////////////////////
    // Organization <> Project
    ////////////////////////////////////////////////////////////////////////////
    public function organizationProjectNewAction()
    {
        $this->getOscarUserContextService()->check(Privileges::PROJECT_ORGANIZATION_MANAGE, $this->getProjectEntity());
        return $this->saveEnroll(ProjectPartner::class);
        $project = $this->getProjectEntity();
        $this->getOscarUserContextService()->check(Privileges::PROJECT_ORGANIZATION_SHOW, $project);

        try {
            $organization = $this->getOrganizationService()->getOrganization($this->getPostedInteger('enroled'));
            $role = $this->getOrganizationService()->getRoleOrganizationById($this->getPostedInteger('role'), true);
            $this->getProjectService()->addProjectOrganisation(
                $project,
                $organization,
                $role,
                $this->getPostedDateTime('dateStart'),
                $this->getPostedDateTime('dateEnd')
            );
            return $this->getResponseOk("L'organisation a bien été ajouté au projet");
        } catch (\Exception $e) {
            $msg = "Impossible d'ajouter l'organisation au projet";
            $this->getLoggerService()->error("$msg : " . $e->getMessage());
            return $this->getResponseInternalError($msg);
        }
    }

    public function organizationProjectDeleteAction()
    {
        try {
            $enroll = $this->getEntityManager()->getRepository(ProjectPartner::class)->find(
                $this->params()->fromRoute('idenroll')
            );
            $this->getOscarUserContextService()->check(Privileges::PROJECT_ORGANIZATION_MANAGE, $enroll->getProject());
        return $this->deleteEnroll(ProjectPartner::class);

            $this->getProjectService()->removeProjectOrganization($enroll);
            return $this->getResponseOk("L'organisation a lien été supprimée");
        } catch (\Exception $e) {
            return $this->getResponseInternalError("Impossible de supprimer l'organisation : " . $e->getMessage());
        }
    }

    public function organizationProjectEditAction()
    {
        $enroll = $this->getEntityManager()->getRepository(ProjectPartner::class)->find(
            $this->params()->fromRoute('idenroll')
        try {
            $rolledId = $this->params()->fromRoute('idenroll');
            /** @var ProjectPartner $rolled */
            $rolled = $this->getEntityManager()->getRepository(ProjectPartner::class)->find($rolledId);
            $project = $rolled->getProject();
            $this->getOscarUserContextService()->check(Privileges::PROJECT_ORGANIZATION_MANAGE, $project);
            $role = $this->getOrganizationService()->getRoleOrganizationById($this->getPostedInteger('role'),true);
            $this->getProjectService()->editProjectOrganisation(
                $rolled,
                $role,
                $this->getPostedDateTime('dateStart'),
                $this->getPostedDateTime('dateEnd')
            );
            return $this->getResponseOk("L'organisation a bien été modifée dans le projet");
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible de modifier l'affectation de cette orgaisation dans le projet : " . $e->getMessage()
            );
        $this->getOscarUserContextService()->check(Privileges::PROJECT_ORGANIZATION_MANAGE, $enroll->getProject());
        return $this->editEnroll(ProjectPartner::class);
        }
    }


@@ -841,78 +843,74 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        return $this->deleteEnroll(OrganizationPerson::class);
    }

    /**
     * Extraction du champ $name des données postées en tant qu'entier.
     *
     * @param string $name
     * @return int
     * @throws OscarException
     */
    protected function getPostedInteger(string $name): int
    {
        $input = $this->params()->fromPost($name, null);
        return $this->getInteger($input);
    }

    /**
     * Extraction du champ $name des données d'URL en tant qu'entier.
     *
     * @param string $name
     * @return int
     * @throws OscarException
     */
    protected function getRoutedInteger(string $name): int
    ////////////////////////////////////////////////////////////////////////////
    // Person <> Project
    ////////////////////////////////////////////////////////////////////////////
    public function personProjectNewAction()
    {
        $input = $this->params()->fromRoute($name, null);
        return $this->getInteger($input);
    }

        $project = $this->getProjectEntity();
        $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_MANAGE, $project);

    protected function getInteger($value): int
    {
        if ($value == null) {
            throw new OscarException("Aucune valeur donnée");
        } else {
            $input = intval($value);
        }
        if (!is_int($input)) {
            throw new OscarException("La valeur '$input' n'est pas un entier.");
        try {
            $person = $this->getPersonService()->getPersonById($this->getPostedInteger('enroled'), true);
            $role = $this->getPersonService()->getRolePersonById($this->getPostedInteger('role'), true);
            $this->getPersonService()->personProjectAdd(
                $project,
                $person,
                $role,
                $this->getPostedDateTime('dateStart'),
                $this->getPostedDateTime('dateEnd')
            );
            return $this->getResponseOk("La personne a bien été ajouté au projet");
        } catch (\Exception $e) {
            $msg = "Impossible d'ajouter la personne au projet";
            $this->getLoggerService()->error("$msg : " . $e->getMessage());
            return $this->getResponseInternalError($msg);
        }
        return $value;
    }

    /**
     * Extraction du champ $name comme DateTime (ou NULL).
     *
     * @param string $name
     * @return int
     * @throws OscarException
     */
    protected function getPostedDateTime(string $name): ?\DateTime
    public function personProjectDeleteAction()
    {
        $postedDate = $this->params()->fromPost($name, null);
        $date = null;
        if ($postedDate != null && $postedDate != 'null') {
            $date = DateTimeUtils::toDatetime($postedDate);
        try {
            $rolledId = $this->params()->fromRoute('idenroll');
            /** @var ProjectMember $rolled */
            $rolled = $this->getEntityManager()->getRepository(ProjectMember::class)->find($rolledId);
            $project = $rolled->getProject();
            $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_MANAGE, $project);
            $this->getPersonService()->personProjectRemove($rolled);
            $this->deleteEnroll(ProjectMember::class);
            return $this->getResponseOk("La personne a bien été supprimée du projet");
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible de supprimer l'affectation de cette personne dans le projet : " . $e->getMessage()
            );
        }
        return $date;
    }

    /**
     * Récupération des données POST pour une création.
     *
     * @return array
     * @throws OscarException
     */
    protected function getPostedNew(): array
    public function personProjectEditAction()
    {
        $datas = [
            "role" => $this->getPostedInteger('role'),
            "enroled" => $this->getPostedInteger('enroled'),
            "dateStart" => $this->getPostedDateTime('dateStart'),
            "dateEnd" => $this->getPostedDateTime('dateEnd'),
        ];
        return $datas;
        try {
            $rolledId = $this->params()->fromRoute('idenroll');
            /** @var ProjectMember $rolled */
            $rolled = $this->getEntityManager()->getRepository(ProjectMember::class)->find($rolledId);
            $project = $rolled->getProject();
            $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_MANAGE, $project);
            $role = $this->getPersonService()->getRolePersonById(
                $this->getPostedInteger('role'),
                true
            );
            $this->getPersonService()->personProjectChangeRole(
                $rolled,
                $role,
                $this->getPostedDateTime('dateStart'),
                $this->getPostedDateTime('dateEnd')
            );
            return $this->getResponseOk("La personnes a bien été modifée dans le projet");
        } catch (\Exception $e) {
            return $this->getResponseInternalError(
                "Impossible de modifier l'affectation de cette personne dans le projet : " . $e->getMessage()
            );
        }
    }

    ////////////////////////////////////////////////////////////////////////////
@@ -1047,7 +1045,9 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
    {
        try {
            /** @var ActivityPerson $personActivity */
            $activityOrganization = $this->getOrganizationService()->getActivityOrganization($this->getRoutedInteger('idenroll'));
            $activityOrganization = $this->getOrganizationService()->getActivityOrganization(
                $this->getRoutedInteger('idenroll')
            );

            $this->getOscarUserContextService()->check(
                Privileges::ACTIVITY_PERSON_MANAGE,
@@ -1062,11 +1062,16 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
        }
    }

    /**
     * @return \Zend\Http\Response
     */
    public function activityOrganizationEditAction()
    {
        try {
            /** @var ActivityOrganization $activityOrganization */
            $activityOrganization = $this->getOrganizationService()->getActivityOrganization($this->getRoutedInteger('idenroll'));
            $activityOrganization = $this->getOrganizationService()->getActivityOrganization(
                $this->getRoutedInteger('idenroll')
            );

            $this->getOscarUserContextService()->check(
                Privileges::ACTIVITY_PERSON_MANAGE,
@@ -1094,6 +1099,85 @@ class EnrollController extends AbstractOscarController implements UsePersonServi
    /// Récupération des données postées
    ///

    /**
     * Extraction du champ $name des données postées en tant qu'entier.
     *
     * @param string $name
     * @return int
     * @throws OscarException
     */
    protected function getPostedInteger(string $name): int
    {
        $input = $this->params()->fromPost($name, null);
        return $this->getInteger($input);
    }

    /**
     * Extraction du champ $name des données d'URL en tant qu'entier.
     *
     * @param string $name
     * @return int
     * @throws OscarException
     */
    protected function getRoutedInteger(string $name): int
    {
        $input = $this->params()->fromRoute($name, null);
        return $this->getInteger($input);
    }


    /**
     * @param $value
     * @return int
     * @throws OscarException
     */
    protected function getInteger($value): int
    {
        if ($value == null) {
            throw new OscarException("Aucune valeur donnée");
        } else {
            $input = intval($value);
        }
        if (!is_int($input)) {
            throw new OscarException("La valeur '$input' n'est pas un entier.");
        }
        return $value;
    }

    /**
     * Extraction du champ $name comme DateTime (ou NULL).
     *
     * @param string $name
     * @return int
     * @throws OscarException
     */
    protected function getPostedDateTime(string $name): ?\DateTime
    {
        $postedDate = $this->params()->fromPost($name, null);
        $date = null;
        if ($postedDate != null && $postedDate != 'null' && $postedDate != 'undefined') {
            $date = DateTimeUtils::toDatetime($postedDate);
        }
        return $date;
    }

    /**
     * Récupération des données POST pour une création.
     *
     * @return array
     * @throws OscarException
     */
    protected function getPostedNew(): array
    {
        $datas = [
            "role" => $this->getPostedInteger('role'),
            "enroled" => $this->getPostedInteger('enroled'),
            "dateStart" => $this->getPostedDateTime('dateStart'),
            "dateEnd" => $this->getPostedDateTime('dateEnd'),
        ];
        return $datas;
    }

    /**
     * @return ActivityOrganization
     * @throws OscarException
+108 −0
Changes for module/Oscar/src/Oscar/Controller/ProjectController.php: 108 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ namespace Oscar\Controller;
use BjyAuthorize\Exception\UnAuthorizedException;
use Doctrine\ORM\Query;
use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\ActivityPerson;
use Oscar\Entity\ContractDocument;
use Oscar\Entity\LogActivity;
use Oscar\Entity\OrganizationPerson;
@@ -27,6 +28,7 @@ use Oscar\Form\ProjectIdentificationForm;
use Oscar\Provider\Privileges;
use Oscar\Service\ProjectGrantService;
use Oscar\Service\ProjectService;
use Oscar\Utils\DateTimeUtils;
use Oscar\Utils\EntityHydrator;
use Oscar\Utils\UnicaenDoctrinePaginator;
use Oscar\Validator\EOTP;
@@ -113,6 +115,7 @@ class ProjectController extends AbstractOscarController
    public function deleteAction()
    {
        $p = $this->getRouteProject();
        $this->getOscarUserContextService()->check(Privileges::PROJECT_EDIT, $p);
        $this->getProjectService()->deleteProject($p);
        $this->redirect()->toRoute('project/mine');
    }
@@ -346,6 +349,111 @@ class ProjectController extends AbstractOscarController
        ];
    }

    public function organizationsAction()
    {
        try {
            // Récupération de l'activités
            $project = $this->getProjectService()->getProject($this->params()->fromRoute('idproject'), true);

            // Accès
            $this->getOscarUserContextService()->check(Privileges::PROJECT_ORGANIZATION_SHOW, $project);

            $out = $this->baseJsonResponse();

            $this->getProjectService()->getOrganizationsProjectsAPI($project, $out, $this->url());

            return $this->ajaxResponse($out);

            $hasPersonShowAccess = $this->getOscarUserContextService()->hasPrivileges(Privileges::PERSON_SHOW);
        } catch (\Exception $e) {
            return $this->getResponseInternalError($e->getMessage());
        }
    }

    public function personsAction()
    {

        try {
            // Récupération de l'activités
            $project = $this->getProjectService()->getProject($this->params()->fromRoute('idproject'), true);

            // Accès
            $this->getOscarUserContextService()->check(Privileges::PROJECT_PERSON_SHOW, $project);

            $out = $this->baseJsonResponse();

            $this->getProjectService()->getPersonsProjectsAPI($project, $out, $this->url());

            return $this->ajaxResponse($out);

            $hasPersonShowAccess = $this->getOscarUserContextService()->hasPrivileges(Privileges::PERSON_SHOW);
        } catch (\Exception $e) {
            return $this->getResponseInternalError($e->getMessage());
        }

//        /**
//         * @var ActivityPerson $activityPerson
//         */
//        foreach ($activity->getPersonsDeep() as $activityPerson) {
//            if (get_class($activityPerson) == ActivityPerson::class) {
//                $urlDelete = $deletableA ? $this->url()->fromRoute(
//                    'personactivity/delete',
//                    ['idenroll' => $activityPerson->getId()]
//                ) : false;
//                $urlEdit = $editableA ? $this->url()->fromRoute(
//                    'personactivity/edit',
//                    ['idenroll' => $activityPerson->getId()]
//                ) : false;
//                $editable = $editableA;
//                $deletable = $deletableA;
//                $context = "activity";
//                $idEnroller = $activityPerson->getActivity()->getId();
//            } else {
//                $urlDelete = $deletableA ? $this->url()->fromRoute(
//                    'personproject/delete',
//                    ['idenroll' => $activityPerson->getId()]
//                ) : false;
//                $urlEdit = $editableA ? $this->url()->fromRoute(
//                    'personproject/edit',
//                    ['idenroll' => $activityPerson->getId()]
//                ) : false;
//                $editable = $editableP;
//                $deletable = $deletableP;
//                $context = "project";
//                $idEnroller = $activityPerson->getProject()->getId();
//            }
//            $urlShow = false;
//            if ($showable) {
//                $urlShow = $showable ? $this->url()->fromRoute(
//                    'person/show',
//                    ['id' => $activityPerson->getPerson()->getId()]
//                ) : false;
//            }
//
//            $out[] = [
//                'id' => $activityPerson->getId(),
//                'role' => $activityPerson->getRole(),
//                'roleLabel' => $activityPerson->getRole(),
//                'roleId' => $activityPerson->getRoleObj() ? $activityPerson->getRoleObj()->getId() : "",
//                'rolePrincipal' => $activityPerson->isPrincipal(),
//                'urlDelete' => $urlDelete,
//                'context' => $context,
//                'urlEdit' => $urlEdit,
//                'urlShow' => $urlShow,
//                'enroller' => $idEnroller,
//                'enrollerLabel' => $activity->getLabel(),
//                'editable' => $editable,
//                'deletable' => $deletable,
//                'enrolled' => $activityPerson->getPerson()->getId(),
//                'enrolledLabel' => $activityPerson->getPerson()->getDisplayName(),
//                'start' => DateTimeUtils::toStr($activityPerson->getDateStart(), 'Y-m-d'),
//                'end' => DateTimeUtils::toStr($activityPerson->getDateEnd(), 'Y-m-d'),
//            ];
//        }

        return $this->ajaxResponse($out);
    }

    public function currentUserStructureProjectsAction()
    {
        /** @var Person|null $currentPerson */
+5 −0
Changes for module/Oscar/src/Oscar/Entity/OrganizationRole.php: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -116,6 +116,11 @@ class OrganizationRole
        );
    }

    public function getRoleId()
    {
        return $this->getLabel();
    }

    function toJson()
    {
        return $this->toArray();
Loading