Commit 578ca07c authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Système de restriction pour la génération des feuilles de temps

parent 9c980f3c
Loading
Loading
Loading
Loading
Loading
+5 −43
Original line number Diff line number Diff line
@@ -2545,39 +2545,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')
@@ -2728,10 +2695,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);
@@ -2741,14 +2706,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 {
@@ -2759,7 +2720,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";
                        }
+2 −1
Original line number Diff line number Diff line
@@ -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') {
+17 −7
Original line number Diff line number Diff line
@@ -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");
        }

@@ -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();
@@ -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.
     *
+42 −27
Original line number Diff line number Diff line
@@ -4589,10 +4589,11 @@ class TimesheetService implements UseOscarUserContextService, UseOscarConfigurat
    }


    public function getPersonTimesheetsDatas(Person $person, $period, $validatedOnly = false)
    public function getPersonTimesheetsDatas(Person $person, $period, $validatedOnly = false, int $restrictedActivityId = 0)
    {
        $periodBounds = DateTimeUtils::periodBounds($period);
        $periodInfosObj = PeriodInfos::getPeriodInfosObj($period);
        $restrictedActivityAggregate = $this->getOthersWPByCode('research');

        $query = $this->getEntityManager()->getRepository(TimeSheet::class)
            ->createQueryBuilder('t')
@@ -4627,7 +4628,6 @@ class TimesheetService implements UseOscarUserContextService, UseOscarConfigurat

        $validationsDone = [];


        $declarations = [
            'activities' => [],
            'others' => [],
@@ -4650,6 +4650,7 @@ class TimesheetService implements UseOscarUserContextService, UseOscarConfigurat
            }

            if ($timesheet->getActivity()) {
                if( $restrictedActivityId == 0 || $timesheet->getActivity()->getId() == $restrictedActivityId ){
                    if (!in_array($timesheet->getActivity()->getCodeEOTP(), $pfi)) {
                        $pfi[] = $timesheet->getActivity()->getCodeEOTP();
                    }
@@ -4663,6 +4664,7 @@ class TimesheetService implements UseOscarUserContextService, UseOscarConfigurat
                        $activities[] = $timesheet->getActivity();
                    }
                }
            }

            $group = 'Projet inconnue';
            $acronym = '';
@@ -4674,6 +4676,7 @@ class TimesheetService implements UseOscarUserContextService, UseOscarConfigurat
            $day = $timesheet->getDateFrom()->format('d');

            if ($timesheet->getActivity() && $timesheet->getWorkpackage()) {
                if( $restrictedActivityId == 0 || $timesheet->getActivity()->getId() == $restrictedActivityId ){
                    $path = 'activities';
                    $group = $timesheet->getActivity()->getAcronym() . " : " . $timesheet->getActivity()->getLabel();
                    $groupType = 'activity';
@@ -4688,6 +4691,18 @@ class TimesheetService implements UseOscarUserContextService, UseOscarConfigurat
                    $subGroupType = "wp";
                    $label = $subGroup;
                    $acronym = $timesheet->getActivity()->getAcronym();
                } else {
                    $path = 'others';
                    $group = $restrictedActivityAggregate['label'];
                    $groupId = -1;
                    $groupType = 'others';
                    $groupFamily = $restrictedActivityAggregate['group'];
                    $subGroupId = $restrictedActivityAggregate['label'];
                    $subGroupType = $restrictedActivityAggregate['label'];
                    $label = $restrictedActivityAggregate['label'];
                    $subGroup = $restrictedActivityAggregate['group'];
                    $acronym = "ACRONYM";
                }
            }

            if (array_key_exists($timesheet->getLabel(), $others)) {