Commit 25a4dd36 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Up : Les types de jalons sont actualisé selon la facet (Mes...

Up : Les types de jalons sont actualisé selon la facet (Mes jalons/Structures/Tous) - le compte est actualisé aussi
parent aa2ec1ce
Loading
Loading
Loading
Loading
+29 −6
Changes for module/Oscar/src/Oscar/Controller/ActivityDateController.php: 29 added lines, 6 removed lines.
Original line number Diff line number Diff line
@@ -285,10 +285,6 @@ class ActivityDateController extends AbstractOscarController implements UseServi
            $availableModes[self::LIST_MODE_APPLICATION] = "Tous les jalons";
        }

        if( !$authorized ) {
            throw new UnauthorizedException();
        }

        // Donnèes du GET
        $search = $this->params()->fromQuery('q', '');
        $periodStart = $this->params()->fromQuery('periodStart', "");
@@ -298,13 +294,40 @@ class ActivityDateController extends AbstractOscarController implements UseServi
        $filterOrg = $this->params()->fromQuery('filterOrg', '');
        $format = $this->params()->fromQuery('f', '');
        $modeUsed = $this->params()->fromQuery('modeUsed', self::LIST_MODE_MINE);
        $page = $this->params()->fromQuery('page', 1);

        if (!is_array($filterTypeStates)) {
            $filterTypeStates = $filterTypeStates === '' ? [] : [$filterTypeStates];
        }
        $page = $this->params()->fromQuery('page', 1);
        $milestones = null;
        $typesDate = $this->getMilestoneService()->getMilestoneTypeForSelect(true);

        $searchParams = [];

        switch($modeUsed){
            case self::LIST_MODE_MINE:
                $searchParams['id_activities'] = $perimeterActivities;
                break;
            case self::LIST_MODE_ORGANIZATION:
                if( $perimeterDetails ) {
                    $id_organisations = array_keys($perimeterDetails);
                    if( $filterOrg ){
                        if(in_array($filterOrg, $id_organisations)){
                            $id_organisations = [$filterOrg];
                        } else {
                            throw new OscarException("Filtre d'organisation inconnu");
                        }
                    }
                    $searchParams['id_organisations'] = $id_organisations;
                }
                break;
            case self::LIST_MODE_APPLICATION:
                if(!$fullList){
                    throw new \Exception("Vous n'avez pas accès à la liste complète des jalons");
                }
                break;
        }

        $typesDate = $this->getMilestoneService()->getMilestoneTypeForSelect(true, $searchParams);

        // Quand $url_activity est renseigné, des liens vers la fiche
        // activité sont disponible.
+28 −3
Changes for module/Oscar/src/Oscar/Service/MilestoneService.php: 28 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -126,30 +126,55 @@ class MilestoneService implements UseLoggerService, UseEntityManager, UseOscarUs
        return $result;
    }

    public function getMilestoneTypeForSelect(bool $count = false)
    public function getMilestoneTypeForSelect(bool $count = false, array $params = [])
    {
        $output = [];
        $sqlParams = [];


        $rsm = new ResultSetMapping();
        $rsm->addScalarResult('id', 'id');
        $rsm->addScalarResult('label', 'label');
        $rsm->addScalarResult('facet', 'facet');
        $rsm->addScalarResult('finishable', 'finishable');
        $rsm->addScalarResult('usage_count', 'usage_count');

        $sql = <<<'SQL'
            SELECT dt.id,
                   dt.label,
                   dt.facet,
                   dt.finishable,
                   COUNT(ad.id) AS usage_count
                   COUNT(DISTINCT ad.id) AS usage_count
            FROM datetype dt
            LEFT JOIN activitydate ad ON ad.type_id = dt.id
        SQL;

        if( array_key_exists('id_activities', $params) ){
            $sqlParams['id_activities'] = $params['id_activities'];
            $sql .= <<<'SQL'
                WHERE ad.activity_id IN(:id_activities)
            SQL;
        }

        if( array_key_exists('id_organisations', $params) ){
            $sqlParams['id_organisations'] = $params['id_organisations'];
            $sql .= <<<'SQL'
                INNER JOIN activity a ON ad.activity_id = a.id
                LEFT JOIN project p ON a.project_id = p.id 
                LEFT JOIN activityorganization ao ON a.id = ao.activity_id 
                LEFT JOIN projectpartner pp ON p.id = pp.project_id  
                WHERE pp.organization_id IN(:id_organisations) 
                    OR ao.organization_id IN(:id_organisations) 
            SQL;
        }

        $sql .= <<<'SQL'
            GROUP BY dt.id, dt.label, dt.facet, dt.finishable
            ORDER BY dt.facet, dt.label
        SQL;

        $types = $this->getEntityManager()
            ->createNativeQuery($sql, $rsm)
            ->setParameters($sqlParams)
            ->getArrayResult();

        foreach ($types as $milestoneType) {
+8 −7
Changes for ui/src/views/ActivityMilestones.vue: 8 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -165,11 +165,13 @@ export default {
      });
      return out;
    },

    statesDate() {
      return this.params.statesDate;
    },
    milestonesTypes() {
      let types = [];
      Object.keys(this.params.typesDate).forEach((category) => {
        let itemsCategory = this.params.typesDate[category];
      Object.keys(this.typesDate).forEach((category) => {
        let itemsCategory = this.typesDate[category];
        let categoryCreate = {
          category: category,
          items: []
@@ -186,9 +188,6 @@ export default {
        types.push(categoryCreate);
      })
      return types;
    },
    statesDate() {
      return this.params.statesDate;
    }
  },

@@ -208,7 +207,8 @@ export default {
      filterTypeStates: this.params.filterTypeStates ? this.params.filterTypeStates.map(Number) : [],
      filterOrg: this.params.filterOrg ? Number(this.params.filterOrg) : '',
      periodStart: this.params.periodStart ? new Date(this.params.periodStart) : null,
      periodEnd: this.params.periodEnd ? new Date(this.params.periodEnd) : null
      periodEnd: this.params.periodEnd ? new Date(this.params.periodEnd) : null,
      typesDate: this.params.typesDate || {}
    }
  },

@@ -245,6 +245,7 @@ export default {

      const response = await axiosOscar.get(url.toString());
      this.milestones = response.data.milestones;
      this.typesDate = response.data.typesDate;
      this.total = response.data.total;
      this.pages = Math.ceil(this.total / 50);
      this.page = page;