Loading module/Oscar/config/module.config.php +1 −1 Changes for module/Oscar/config/module.config.php: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -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', Loading module/Oscar/config/routes.yml +14 −0 Changes for module/Oscar/config/routes.yml: 14 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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: Loading module/Oscar/src/Oscar/Controller/EnrollController.php +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 Loading @@ -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); } } Loading @@ -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() ); } } //////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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 Loading module/Oscar/src/Oscar/Controller/ProjectController.php +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 Loading @@ -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; Loading @@ -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; Loading Loading @@ -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'); } Loading Loading @@ -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 */ Loading module/Oscar/src/Oscar/Entity/OrganizationRole.php +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 Loading @@ -116,6 +116,11 @@ class OrganizationRole ); } public function getRoleId() { return $this->getLabel(); } function toJson() { return $this->toArray(); Loading Loading
module/Oscar/config/module.config.php +1 −1 Changes for module/Oscar/config/module.config.php: 1 added line, 1 removed line. Original line number Diff line number Diff line Loading @@ -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', Loading
module/Oscar/config/routes.yml +14 −0 Changes for module/Oscar/config/routes.yml: 14 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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: Loading
module/Oscar/src/Oscar/Controller/EnrollController.php +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 Loading @@ -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); } } Loading @@ -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() ); } } //////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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 Loading
module/Oscar/src/Oscar/Controller/ProjectController.php +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 Loading @@ -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; Loading @@ -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; Loading Loading @@ -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'); } Loading Loading @@ -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 */ Loading
module/Oscar/src/Oscar/Entity/OrganizationRole.php +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 Loading @@ -116,6 +116,11 @@ class OrganizationRole ); } public function getRoleId() { return $this->getLabel(); } function toJson() { return $this->toArray(); Loading