Skip to content
Snippets Groups Projects
Commit 241c43ee authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Refactoring + doc

parent 5bb92ffe
No related branches found
No related tags found
No related merge requests found
Pipeline #33878 failed
Version 6.2.0 17/01/2025
* Intégration d'une première version des périmétres
/!\ nouvelle colonne `perimetre` dans la table `unicaen_indicateur_indicateur` /!\
```sql
alter table unicaen_indicateur_indicateur add perimetre varchar(256) default 'aucun' not null;
```
......@@ -31,4 +31,8 @@ return [
],
],
],
'unicaen-indicateur' => [
'perimetreService' => 'Chemin vers le service retournant les périmètres',
],
];
\ No newline at end of file
Module Unicaen Indiciateur
=======================
------------------------
Module Unicaen Indicateur : `unicaen/indicateur`
==========================
----
Description
-----------
Le module **unicaen/indicateur** est en charge
# Périmètres
Description du fonctionnement
============================
## Principe des périmètres
Tables pour les données du modules
==================================
La notion de périmètres permet de filtrer les résultats d'un indicateur en fonction de ceux-ci.
Ce qui permet de ne présenter des résultats que dans le périmètre d'action d'un User/Role.
Dépendances extérieurs
======================
Exemple :
```markdown
Pour un indicateur présentant des inscriptions à des formations pour lequel on précise le périmètre de structure des inscrit·es.
Alors, on pourra filtrer les données en fonction des structures associées aux responsables.
Si on expose un périmètre de domaine des formations sur ce même indicateur.
Alors, on pourra filtrer les données pour les référents selon les domaines dont ils sont référents
```
## Périmètres implementés/hardcodés
Seulement un périmètre est aujourd'hui implemnté dans la bibliothèque :
* Structure :
Filtrage selon les structures associés aux rôles.
Ce périmètre suppose d'ajouter la colonne `perimetre_structure_id` dans les colonnes déclarées de l'indicateur.
**N.B.** : Les colonnes de travail seront masqué des affichages et exportations.
## Récupération des périmètres depuis l'application maîtresse
Dans la configuration de la biliothèque, il est nécessaire de déclarer le chemin vers un service en charge de renvoyer les périmètres.
peut être déclarer dans le fichier [unicaen-indicateur.global.php](config/unicaen-indicateur.global.php.dist)
```php
return [
'unicaen-indicateur' => [
'perimetreService' => PerimetreService::class,
],
];
```
Cette classe devra implentée l'interface [PerimetreServiceInterface](src/UnicaenIndicateur/Service/Perimetre/PerimetreServiceInterface.php).
La fonction getPerimetres dans le contrat de l'interface prend en paramètres un utilisateur `AbstractUser` et un rôle `AbstractRole` et retour un tabeau de chaine de caractères contenant les périmètres.
Par exemple pour les périmètres de structure 5 et 12 et de domaine 1 cette méthode retourne :
```php
['STRUCTURE_5','STRUCTURE_12', 'DOMAINE_1']
```
Améliorations
-------------
1. **PERIMÈTRE** Exposer plusieurs périmètres
1. **PERIMÈTRE** Déclarer des périmètres hors de l'application
\ No newline at end of file
......@@ -67,29 +67,11 @@ class IndicateurController extends AbstractActionController {
$user = $this->getUserService()->getConnectedUser();
$role = $this->getUserService()->getConnectedRole();
$perimetres = $this->getPerimetreService()->getPerimetres($user, $role);
$indicateurPerimetre = $indicateur->getPerimetre();
$perimetreValides = array_filter($perimetres, function(string $p) use ($indicateurPerimetre) {
return (strtolower(explode('_', $p)[0]) === strtolower($indicateurPerimetre));
});
$userPerimetre = array_map(function ($p) { return explode('_', $p)[1];}, $perimetreValides);
// $userPerimetre = null;
// switch ($indicateur->getPerimetre()) {
// case Indicateur::PERIMETRE_STRUCTURE:
//// $userPerimetre = $user->getPerimetreStructure();
// $userPerimetre = $userStructurePerimetre;
// break;
// case Indicateur::PERIMETRE_ROLE:
//// $userPerimetre = $user->getPerimetreRole();
// $userPerimetre = $userRolePerimetre;
// break;
// }
$exists = $this->getIndicateurService()->verifierExistanceMaterializedView($indicateur->getViewId());
if ($exists === true) $result = $this->getIndicateurService()->getIndicateurData($indicateur, $userPerimetre);
if ($exists === true) $result = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
return new ViewModel([
'indicateur' => $indicateur,
......@@ -227,7 +209,11 @@ class IndicateurController extends AbstractActionController {
$date = new DateTime();
$filename = "preecog_".$indicateur->getViewId()."_".$date->format('Ymd-Hms').".csv";
$result = $this->getIndicateurService()->getIndicateurData($indicateur);
$user = $this->getUserService()->getConnectedUser();
$role = $this->getUserService()->getConnectedRole();
$perimetres = $this->getPerimetreService()->getPerimetres($user, $role);
$result = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
$CSV = new CsvModel();
$CSV->setDelimiter(';');
......
......@@ -15,7 +15,6 @@ class Indicateur {
const PERIMETRE_AUCUN = 'aucun';
const PERIMETRE_STRUCTURE = 'structure';
const PERIMETRE_ROLE = 'role';
private ?int $id = null;
private ?string $code = null;
......
......@@ -129,7 +129,6 @@ class IndicateurForm extends Form {
'empty_option' => "Sélection d'un périmtre",
'value_options' => [
Indicateur::PERIMETRE_AUCUN => "Non soumis à un périmètre",
Indicateur::PERIMETRE_ROLE => "Liés aux rôles (requiert une colonne perimetre_role_id)",
Indicateur::PERIMETRE_STRUCTURE => "Liés aux structures (requiert une colonne perimetre_structure_id)",
],
],
......
......@@ -84,7 +84,7 @@ class IndicateurService
* @param ?array $userPerimetre (un tableau des ids associé aux élements dans le périmetre de l'utilisateur connecté)
* @return array|null
*/
public function fetch(Indicateur $indicateur, ?array $userPerimetre): ?array
public function fetch(Indicateur $indicateur, ?array $userPerimetre = null): ?array
{
$exist = $this->verifierExistanceMaterializedView($indicateur->getViewId());
......@@ -97,9 +97,6 @@ class IndicateurService
case Indicateur::PERIMETRE_STRUCTURE:
if ($userPerimetre !== null) $sql .= " WHERE perimetre_structure_id IN (" .implode(",", $userPerimetre).")";
break;
case Indicateur::PERIMETRE_ROLE:
if ($userPerimetre !== null) $sql .= " WHERE perimetre_role_id IN (" .implode(",", $userPerimetre).")";
break;
case Indicateur::PERIMETRE_AUCUN:
default:
break;
......@@ -269,24 +266,29 @@ class IndicateurService
/** FACADE **************************************************************/
/** RECUPERATION DONNEES *****************************************************************************************
/** RECUPERATION DONNEES ******************************************************************************************/
/**
* @param Indicateur $indicateur
* @param ?array $userPerimetre (un tableau des ids associé aux élements dans le périmetre de l'utilisateur connecté)
* @param ?string[] $perimetres (un tableau présentant les périmètres )
* @return array|null
*/
public function getIndicateurData(Indicateur $indicateur, ?array $userPerimetre = null): ?array
public function getIndicateurData(Indicateur $indicateur, ?array $perimetres = null): ?array
{
$exist = $this->verifierExistanceMaterializedView($indicateur->getViewId());
if (!$exist) return null;
$userPerimetre = $this->extractPerimetresValides($indicateur, $perimetres);
$rawdata = $this->fetch($indicateur, $userPerimetre);
if ($rawdata === null) return null;
$rubriques = [];
if ($indicateur->getEntity() === Indicateur::ENTITY_LIBRE) {
if (!empty($rawdata)) {
foreach ($rawdata[0] as $key => $value) $rubriques[] = $key;
foreach ($rawdata[0] as $key => $value) {
$rubriques[] = $key;
}
}
}
if ($indicateur->getEntity() === Indicateur::ENTITY_ADAPTATIF) {
......@@ -312,6 +314,12 @@ class IndicateurService
];
}
/** RETRAIT DES RUBRIQUES ASSOCIEES AUX PERIMETRES */
switch($indicateur->getPerimetre()) {
case Indicateur::PERIMETRE_STRUCTURE: $rubriques = array_diff($rubriques, ['perimetre_structure_id']);
break;
}
$data = [];
foreach ($rawdata as $rawitem) {
$item = [];
......@@ -324,14 +332,29 @@ class IndicateurService
return [$rubriques, $data];
}
public function getCount(Indicateur $indicateur): ?int
public function getCount(Indicateur $indicateur, ?array $perimetres = null): ?int
{
$exist = $this->verifierExistanceMaterializedView($indicateur->getViewId());
if (!$exist) return null;
$rawdata = $this->fetch($indicateur);
$userPerimetre = $this->extractPerimetresValides($indicateur, $perimetres);
$rawdata = $this->fetch($indicateur, $userPerimetre);
return count($rawdata);
}
/**
* @param Indicateur $indicateur
* @param string[]|null $perimetres
* @return string[]
*/
public function extractPerimetresValides(Indicateur $indicateur, ?array $perimetres = null): array
{
$indicateurPerimetre = $indicateur->getPerimetre();
$perimetreValides = array_filter($perimetres, function(string $p) use ($indicateurPerimetre) {
return (strtolower(explode('_', $p)[0]) === strtolower($indicateurPerimetre));
});
$perimetresValides = array_map(function ($p) { return explode('_', $p)[1];}, $perimetreValides);
return $perimetresValides;
}
}
\ No newline at end of file
......@@ -10,27 +10,6 @@
use UnicaenIndicateur\Entity\Db\Indicateur;
$colonneMasquee = null;
switch ($indicateur->getPerimetre()) {
case Indicateur::PERIMETRE_ROLE:
$colonneMasquee = 'perimetre_role_id';
break;
case Indicateur::PERIMETRE_STRUCTURE:
$colonneMasquee = 'perimetre_structure_id';
break;
}
$position = 0; $positionMasquee = null;
foreach ($header as $h) {
if ($h === $colonneMasquee) {
$positionMasquee = $position;
break;
}
$position++;
}
?>
<h1 class="page-header">
......@@ -46,7 +25,8 @@ foreach ($header as $h) {
</div>
<div class="col-md-3">
<?php /** @see \UnicaenIndicateur\Controller\IndicateurController::regenererAction() */ ?>
<a href="<?php echo $this->url('indicateur/regenerer', ['indicateur' => $indicateur->getId()], [], true); ?>" class="btn btn-primary">
<a href="<?php echo $this->url('indicateur/regenerer', ['indicateur' => $indicateur->getId()], [], true); ?>"
class="btn btn-primary">
<span class="icon icon-synchroniser"></span>
Regénérer la vue associée
</a>
......@@ -70,7 +50,8 @@ foreach ($header as $h) {
Rafraichir l'indicateur
</a>
<small>dernier rafraichissement le <?php echo ($indicateur->getDernierRafraichissement()?$indicateur->getDernierRafraichissement()->format('d/m/Y à H:i:s'):"---"); ?></small>
<small>dernier rafraichissement
le <?php echo($indicateur->getDernierRafraichissement() ? $indicateur->getDernierRafraichissement()->format('d/m/Y à H:i:s') : "---"); ?></small>
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<button class="nav-link active" id="indicateur-tab"
......@@ -95,22 +76,16 @@ foreach ($header as $h) {
<table id="datatable" class="table table-extra-condensed">
<thead>
<tr>
<?php $position = 0; foreach ($header as $item) : ?>
<?php if ($position !== $positionMasquee) : ?>
<?php foreach ($header as $item) : ?>
<th> <?php echo $item; ?> </th>
<?php endif; ?>
<?php $position++; ?>
<?php endforeach; ?>
</tr>
</thead>
<tbody>
<?php foreach ($data as $item) : ?>
<tr>
<?php $position = 0; foreach ($item as $value) : ?>
<?php if ($position !== $positionMasquee) : ?>
<?php foreach ($item as $value) : ?>
<td> <?php echo $value; ?> </td>
<?php endif; ?>
<?php $position++; ?>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment