Loading doc/index.md +10 −10 Original line number Diff line number Diff line Loading @@ -16,16 +16,16 @@ S'adresse aux gestionnaires d'application souhaitant installer et configurer une ### Configuration de base - [Authentification](configuration/config-auth.md) - [Gestion des documents](config-documents.md) : Configuration de la gestion des documents. - [Configuration des documents](config-documents.md) - [Configuration du moteur de recherche](config-elasticsearch.md) - [Configuration du serveur de tâche](config-gearman.md) - [Configuration du PFI](config-pfi.md) - [Configuration de la distribution des courriels](config-mailer.md) - [Configuration des notifications](config-notifications.md) - [Configuration de la numérotation automatique OSCAR](config-numerotation.md) - [Gestion des documents](configuration/config-documents.md) : Configuration de la gestion des documents. - [Configuration des documents](configuration/config-documents.md) - [Configuration du moteur de recherche](configuration/config-elasticsearch.md) - [Configuration du serveur de tâche](configuration/config-gearman.md) - [Configuration du PFI](configuration/config-pfi.md) - [Configuration de la distribution des courriels](configuration/config-mailer.md) - [Configuration des notifications](configuration/config-notifications.md) - [Configuration de la numérotation automatique OSCAR](configuration/config-numerotation.md) - [Configuration des feuilles de temps](timesheet.md) - [Configuration des dépenses (SIFAC)](config-sifac.md) - [Configuration des dépenses (SIFAC)](configuration/config-sifac.md) ### Synchronisation au Système d'Information - [Connectors Oscar](connectors.md) : Connecter Oscar au système d'information Loading @@ -34,7 +34,7 @@ S'adresse aux gestionnaires d'application souhaitant installer et configurer une ### Utilitaires et utilisation avancée - [Administrer Oscar en ligne de commande](oscar-commands.md) - [Oscar API](config-api.md) Configurer Oscar pour permettre son accès via une API Rest - [Modifier la méthode de génération des PDF](../config-docpdf.md) Permet un gain de performance pour la génération des *certains* documents - [Modifier la méthode de génération des PDF](configuration/config-docpdf.md) Permet un gain de performance pour la génération des *certains* documents ## Fonctionnalités optionnelles Loading module/Oscar/src/Oscar/Controller/ProjectGrantController.php +15 −43 Original line number Diff line number Diff line Loading @@ -1030,6 +1030,13 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Récupération des informations annexes foreach ($activity->getPersons() as $activityPerson){ $this->getPersonService()->personActivityRemove($activityPerson); } foreach ($activity->getOrganizations() as $activityOrganization){ $this->getActivityService()->activityOrganizationRemove($activityOrganization); } // On supprime les créneaux try { Loading @@ -1040,6 +1047,9 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif ); } // Suppression des notifications $this->getNotificationService()->deleteNotificationActivityById($activity->getId()); // Suppression des documents $documents = $activity->getDocuments(); if (count($documents)) { Loading Loading @@ -2545,39 +2555,6 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif ->leftJoin('a.persons', 'm2') ->where('m1.person in(:ids) OR m2.person in (:ids)'); $queryOrganisationNoRole = $this->getEntityManager()->createQueryBuilder() ->select('a.id') ->from(Activity::class, 'a', 'a.id') ->leftJoin('a.project', 'p') ->leftJoin('p.partners', 'o1') ->leftJoin('a.organizations', 'o2') ->leftJoin('p.members', 'm1') ->leftJoin('a.persons', 'm2') ->where('(o1.organization = :id OR o2.organization = :id)'); $queryOrganisationRole = $this->getEntityManager()->createQueryBuilder() ->select('a.id') ->from(Activity::class, 'a', 'a.id') ->leftJoin('a.project', 'p') ->leftJoin('p.partners', 'o1') ->leftJoin('a.organizations', 'o2') ->leftJoin('p.members', 'm1') ->leftJoin('a.persons', 'm2') ->where( '((o1.organization = :id AND o1.roleObj = :roleObj) OR (o2.organization = :id AND o2.roleObj = :roleObj))' ); $queryOrganisationRoleNorOrg = $this->getEntityManager()->createQueryBuilder() ->select('a.id') ->from(Activity::class, 'a', 'a.id') ->leftJoin('a.project', 'p') ->leftJoin('p.partners', 'o1') ->leftJoin('a.organizations', 'o2') ->leftJoin('p.members', 'm1') ->leftJoin('a.persons', 'm2') ->where( '(o1.roleObj = :roleObj OR o2.roleObj = :roleObj)' ); $queryOrganisations = $this->getEntityManager()->createQueryBuilder() ->select('a.id') Loading Loading @@ -2728,10 +2705,8 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif )->getQuery()->getArrayResult() ); break; // Organisations (plusieurs) case 'om' : case 'om' : $value1 = explode(',', $params[1]); $crit['val1'] = $value1; $organisationsRequire = $this->getOrganizationService()->getOrganizationsByIds($value1); Loading @@ -2741,14 +2716,10 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif $filterOrganizations[$organisation->getId()] = (string)$organisation; } $ids = array_keys( $queryOrganisations->setParameter( 'ids', $value1 )->getQuery()->getArrayResult() ); $ids = $this->getActivityService()->getActivityRepository()->getIdsWithOneOfOrganizationsRoled($value1); break; case 'ap' : case 'sp' : try { Loading @@ -2759,7 +2730,8 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif $crit['val1Label'] = $person->getDisplayName(); $crit['val2Label'] = $value2 > 0 ? $this->getOscarUserContextService()->getAllRoleIdPerson( )[$value2] : ''; $ids = $this->getActivityService()->getActivityRepository()->getIdsForPersonWithRole($person->getId(), $value2 ? $value2 : 0); $ids = $this->getActivityService()->getActivityRepository() ->getIdsForPersonWithRole($person->getId(), $value2 ? $value2 : 0); } catch (\Exception $e) { $crit['error'] = "Impossible de filtrer sur la personne"; } Loading module/Oscar/src/Oscar/Controller/TimesheetController.php +2 −1 Original line number Diff line number Diff line Loading @@ -1361,7 +1361,8 @@ class TimesheetController extends AbstractOscarController if ($action == "export2") { $out = $this->params()->fromQuery('out', 'pdf'); $datas = $timesheetService->getPersonTimesheetsDatas($person, $period); $restrictedActivity = $this->params()->fromQuery('activityid', 0); $datas = $timesheetService->getPersonTimesheetsDatas($person, $period, false, $restrictedActivity); $datas['format'] = $out; if ($out == 'pdf') { Loading module/Oscar/src/Oscar/Entity/ActivityRepository.php +16 −6 Original line number Diff line number Diff line Loading @@ -106,9 +106,14 @@ class ActivityRepository extends EntityRepository return array_map('current', $queryBuilder->getQuery()->getArrayResult()); } public function getIdsWithOrganizationAndRole(int $organizationId = 0, int $roleObjId = 0) :array /** * Retourne les IDs des activités impliquant une des organizations donnée avec le rôle spécifié * @param array $organizationsIds IDS des organisations * @param int $roleObjId ID rôle */ public function getIdsWithOneOfOrganizationsRoled( array $organizationsIds, int $roleObjId = 0 ) :array { if( $organizationId <= 0 && $roleObjId <= 0 ){ if( count($organizationsIds) == 0 && $roleObjId <= 0 ){ throw new OscarException("Vous devez préciser une organisation et/ou un rôle"); } Loading @@ -121,10 +126,10 @@ class ActivityRepository extends EntityRepository $params['roleId'] = $roleObjId; } if( $organizationId > 0 ) { $clauseA[] = 'orga1.id = :orgId'; $clauseB[] = 'orga2.id = :orgId'; $params['orgId'] = $organizationId; if( count($organizationsIds) > 0 ) { $clauseA[] = 'orga1.id IN(:orgIds)'; $clauseB[] = 'orga2.id IN(:orgIds)'; $params['orgIds'] = $organizationsIds; } $queryBuilder = $this->baseQueryWithOrganizationOf(); Loading @@ -141,6 +146,11 @@ class ActivityRepository extends EntityRepository return array_map('current', $queryBuilder->getQuery()->getArrayResult()); } public function getIdsWithOrganizationAndRole(int $organizationId = 0, int $roleObjId = 0) :array { return $this->getIdsWithOneOfOrganizationsRoled([$organizationId], $roleObjId); } /** * Retourne les IDS des activités qui impliquent un des types de documents donnés. * Loading module/Oscar/src/Oscar/Service/GearmanJobLauncherService.php +6 −2 Original line number Diff line number Diff line Loading @@ -50,8 +50,12 @@ class GearmanJobLauncherService implements UseOscarConfigurationService, UseLogg */ protected function sendBackgroundTask(string $task, array $params, string $key): void { try { $this->getLoggerService()->debug(" > gearman : $task($key) " . json_encode($params)); $this->getGearmanClient()->doBackground($task, json_encode($params), $key); } catch (\Exception $e){ throw new \Exception(sprintf("Impossible de programmer une task gearman (%s)", $e->getMessage())); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Loading Loading
doc/index.md +10 −10 Original line number Diff line number Diff line Loading @@ -16,16 +16,16 @@ S'adresse aux gestionnaires d'application souhaitant installer et configurer une ### Configuration de base - [Authentification](configuration/config-auth.md) - [Gestion des documents](config-documents.md) : Configuration de la gestion des documents. - [Configuration des documents](config-documents.md) - [Configuration du moteur de recherche](config-elasticsearch.md) - [Configuration du serveur de tâche](config-gearman.md) - [Configuration du PFI](config-pfi.md) - [Configuration de la distribution des courriels](config-mailer.md) - [Configuration des notifications](config-notifications.md) - [Configuration de la numérotation automatique OSCAR](config-numerotation.md) - [Gestion des documents](configuration/config-documents.md) : Configuration de la gestion des documents. - [Configuration des documents](configuration/config-documents.md) - [Configuration du moteur de recherche](configuration/config-elasticsearch.md) - [Configuration du serveur de tâche](configuration/config-gearman.md) - [Configuration du PFI](configuration/config-pfi.md) - [Configuration de la distribution des courriels](configuration/config-mailer.md) - [Configuration des notifications](configuration/config-notifications.md) - [Configuration de la numérotation automatique OSCAR](configuration/config-numerotation.md) - [Configuration des feuilles de temps](timesheet.md) - [Configuration des dépenses (SIFAC)](config-sifac.md) - [Configuration des dépenses (SIFAC)](configuration/config-sifac.md) ### Synchronisation au Système d'Information - [Connectors Oscar](connectors.md) : Connecter Oscar au système d'information Loading @@ -34,7 +34,7 @@ S'adresse aux gestionnaires d'application souhaitant installer et configurer une ### Utilitaires et utilisation avancée - [Administrer Oscar en ligne de commande](oscar-commands.md) - [Oscar API](config-api.md) Configurer Oscar pour permettre son accès via une API Rest - [Modifier la méthode de génération des PDF](../config-docpdf.md) Permet un gain de performance pour la génération des *certains* documents - [Modifier la méthode de génération des PDF](configuration/config-docpdf.md) Permet un gain de performance pour la génération des *certains* documents ## Fonctionnalités optionnelles Loading
module/Oscar/src/Oscar/Controller/ProjectGrantController.php +15 −43 Original line number Diff line number Diff line Loading @@ -1030,6 +1030,13 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Récupération des informations annexes foreach ($activity->getPersons() as $activityPerson){ $this->getPersonService()->personActivityRemove($activityPerson); } foreach ($activity->getOrganizations() as $activityOrganization){ $this->getActivityService()->activityOrganizationRemove($activityOrganization); } // On supprime les créneaux try { Loading @@ -1040,6 +1047,9 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif ); } // Suppression des notifications $this->getNotificationService()->deleteNotificationActivityById($activity->getId()); // Suppression des documents $documents = $activity->getDocuments(); if (count($documents)) { Loading Loading @@ -2545,39 +2555,6 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif ->leftJoin('a.persons', 'm2') ->where('m1.person in(:ids) OR m2.person in (:ids)'); $queryOrganisationNoRole = $this->getEntityManager()->createQueryBuilder() ->select('a.id') ->from(Activity::class, 'a', 'a.id') ->leftJoin('a.project', 'p') ->leftJoin('p.partners', 'o1') ->leftJoin('a.organizations', 'o2') ->leftJoin('p.members', 'm1') ->leftJoin('a.persons', 'm2') ->where('(o1.organization = :id OR o2.organization = :id)'); $queryOrganisationRole = $this->getEntityManager()->createQueryBuilder() ->select('a.id') ->from(Activity::class, 'a', 'a.id') ->leftJoin('a.project', 'p') ->leftJoin('p.partners', 'o1') ->leftJoin('a.organizations', 'o2') ->leftJoin('p.members', 'm1') ->leftJoin('a.persons', 'm2') ->where( '((o1.organization = :id AND o1.roleObj = :roleObj) OR (o2.organization = :id AND o2.roleObj = :roleObj))' ); $queryOrganisationRoleNorOrg = $this->getEntityManager()->createQueryBuilder() ->select('a.id') ->from(Activity::class, 'a', 'a.id') ->leftJoin('a.project', 'p') ->leftJoin('p.partners', 'o1') ->leftJoin('a.organizations', 'o2') ->leftJoin('p.members', 'm1') ->leftJoin('a.persons', 'm2') ->where( '(o1.roleObj = :roleObj OR o2.roleObj = :roleObj)' ); $queryOrganisations = $this->getEntityManager()->createQueryBuilder() ->select('a.id') Loading Loading @@ -2728,10 +2705,8 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif )->getQuery()->getArrayResult() ); break; // Organisations (plusieurs) case 'om' : case 'om' : $value1 = explode(',', $params[1]); $crit['val1'] = $value1; $organisationsRequire = $this->getOrganizationService()->getOrganizationsByIds($value1); Loading @@ -2741,14 +2716,10 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif $filterOrganizations[$organisation->getId()] = (string)$organisation; } $ids = array_keys( $queryOrganisations->setParameter( 'ids', $value1 )->getQuery()->getArrayResult() ); $ids = $this->getActivityService()->getActivityRepository()->getIdsWithOneOfOrganizationsRoled($value1); break; case 'ap' : case 'sp' : try { Loading @@ -2759,7 +2730,8 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif $crit['val1Label'] = $person->getDisplayName(); $crit['val2Label'] = $value2 > 0 ? $this->getOscarUserContextService()->getAllRoleIdPerson( )[$value2] : ''; $ids = $this->getActivityService()->getActivityRepository()->getIdsForPersonWithRole($person->getId(), $value2 ? $value2 : 0); $ids = $this->getActivityService()->getActivityRepository() ->getIdsForPersonWithRole($person->getId(), $value2 ? $value2 : 0); } catch (\Exception $e) { $crit['error'] = "Impossible de filtrer sur la personne"; } Loading
module/Oscar/src/Oscar/Controller/TimesheetController.php +2 −1 Original line number Diff line number Diff line Loading @@ -1361,7 +1361,8 @@ class TimesheetController extends AbstractOscarController if ($action == "export2") { $out = $this->params()->fromQuery('out', 'pdf'); $datas = $timesheetService->getPersonTimesheetsDatas($person, $period); $restrictedActivity = $this->params()->fromQuery('activityid', 0); $datas = $timesheetService->getPersonTimesheetsDatas($person, $period, false, $restrictedActivity); $datas['format'] = $out; if ($out == 'pdf') { Loading
module/Oscar/src/Oscar/Entity/ActivityRepository.php +16 −6 Original line number Diff line number Diff line Loading @@ -106,9 +106,14 @@ class ActivityRepository extends EntityRepository return array_map('current', $queryBuilder->getQuery()->getArrayResult()); } public function getIdsWithOrganizationAndRole(int $organizationId = 0, int $roleObjId = 0) :array /** * Retourne les IDs des activités impliquant une des organizations donnée avec le rôle spécifié * @param array $organizationsIds IDS des organisations * @param int $roleObjId ID rôle */ public function getIdsWithOneOfOrganizationsRoled( array $organizationsIds, int $roleObjId = 0 ) :array { if( $organizationId <= 0 && $roleObjId <= 0 ){ if( count($organizationsIds) == 0 && $roleObjId <= 0 ){ throw new OscarException("Vous devez préciser une organisation et/ou un rôle"); } Loading @@ -121,10 +126,10 @@ class ActivityRepository extends EntityRepository $params['roleId'] = $roleObjId; } if( $organizationId > 0 ) { $clauseA[] = 'orga1.id = :orgId'; $clauseB[] = 'orga2.id = :orgId'; $params['orgId'] = $organizationId; if( count($organizationsIds) > 0 ) { $clauseA[] = 'orga1.id IN(:orgIds)'; $clauseB[] = 'orga2.id IN(:orgIds)'; $params['orgIds'] = $organizationsIds; } $queryBuilder = $this->baseQueryWithOrganizationOf(); Loading @@ -141,6 +146,11 @@ class ActivityRepository extends EntityRepository return array_map('current', $queryBuilder->getQuery()->getArrayResult()); } public function getIdsWithOrganizationAndRole(int $organizationId = 0, int $roleObjId = 0) :array { return $this->getIdsWithOneOfOrganizationsRoled([$organizationId], $roleObjId); } /** * Retourne les IDS des activités qui impliquent un des types de documents donnés. * Loading
module/Oscar/src/Oscar/Service/GearmanJobLauncherService.php +6 −2 Original line number Diff line number Diff line Loading @@ -50,8 +50,12 @@ class GearmanJobLauncherService implements UseOscarConfigurationService, UseLogg */ protected function sendBackgroundTask(string $task, array $params, string $key): void { try { $this->getLoggerService()->debug(" > gearman : $task($key) " . json_encode($params)); $this->getGearmanClient()->doBackground($task, json_encode($params), $key); } catch (\Exception $e){ throw new \Exception(sprintf("Impossible de programmer une task gearman (%s)", $e->getMessage())); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Loading