Commit 0163e260 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Merge branch 'master' into alc-agrement-duree-vie

parents 3f48d5f3 1b4c6643
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
# OSE 13.0 ALPHA
# OSE 13.0

## Nouveautés

* Gestion de la durée de vie des pièces justificatives :
  * La notion de "premier recrutement" disparait au profit de la durée de vie de la pièce
  * Vous pouvez maintenant préciser combien d'années est valable une pièce justificative par statut d'intervenant
  * Une pièce obligatoire mais jamais fournie sera maintenant systématiquement demandée
  * Une pièce ancienne mais toujours valable sera affichée dans la fiche actuelle de l'intervenant : inutile de se positionner dans l'année de fourniture de la pièce
  * Une pièce fournie anciennement mais toujours valide pourra être archivée si l'on souhaite en fournir une nouvelle version
  
* Vous pouvez maintenant envoyer par mail le contrat de travail généré (privilège "Envoyer le contrat par mail") à donner aux rôles ad hoc pour donner accès à la fonctionnalité)
 
* Vous pouvez maintenant éditer les centres de coûts et les modulateurs directement sur un élément pédagogique particulier.
 
* Reconduction des centres de coûts et des modulateurs de l'offre de formation
  * une nouvelle interface d'administration vous permet de reporter les modulateurs d'une formation qui ont été positionnés de l'année en cours à l'année suivante
  * une nouvelle interface d'administration vous permet de reporter les centres de coûts d'une formation qui ont été positionnés de l'année en cours à l'année suivante

## Correction de bugs

* La page de saisie des services était accessible en écrivant la bonne URL, même si le workflow ne permettait pas d'arriver à cette étape.

## Notes de mise à jour

L'ensemble des tableaux de bord doivent être recalculés.
Pensez à recalculer les tableaux de bord au moyen de la commande ./bin/ose calcul-tableaux-bord

En ce qui concerne les pièces justificatives, les données demandées uniquement s'il s'agit d'un premier recrutement ont été migrées en données valables 99 ans. A vous de revoir ensuite cette durée de vie si nécessaire.

# OSE 12.2

## Correction de bug
+81 −2
Original line number Diff line number Diff line
@@ -23,6 +23,85 @@ $r = $mm->testUtile('FormuleMigrationVolumeHoraireStructuresTestVersCode');
var_dump($r);
*/

$t = $oa->getTags();
$bdd = $oa->getBdd();

var_dump($t);
 No newline at end of file

$c->println("Calcul du tableau de bord piece_jointe_demande");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_demande\'); END;');

$c->println("Calcul du tableau de bord piece_jointe_fournie");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_fournie\'); END;');

$c->println("Calcul du tableau de bord piece_jointe");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe\'); END;');

$c->println("");

/* On fournie et on valide de force les PJ qui n'étaient pas tout le temps demandées avant */
$sql   = '
        SELECT
          TPJ.INTERVENANT_ID, TPJ.TYPE_PIECE_JOINTE_ID, I.STRUCTURE_ID, TV.ID TYPE_VALIDATION_ID, P.VALEUR UTILISATEUR_ID
        FROM 
          TBL_PIECE_JOINTE TPJ
          JOIN INTERVENANT I ON I.ID = TPJ.INTERVENANT_ID AND I.HISTO_DESTRUCTION IS NULL
          JOIN TYPE_PIECE_JOINTE_STATUT TPJS ON TPJS.HISTO_DESTRUCTION IS NULL AND TPJS.TYPE_PIECE_JOINTE_ID = TPJ.TYPE_PIECE_JOINTE_ID AND TPJS.STATUT_INTERVENANT_ID = I.STATUT_ID AND TPJS.DUREE_VIE = 99
          JOIN PARAMETRE P ON P.NOM = \'oseuser\'
          JOIN TYPE_VALIDATION TV ON TV.CODE = \'PIECE_JOINTE\'
          LEFT JOIN PIECE_JOINTE PJ ON PJ.TYPE_PIECE_JOINTE_ID = TPJ.TYPE_PIECE_JOINTE_ID AND PJ.INTERVENANT_ID = I.ID AND PJ.HISTO_DESTRUCTION IS NULL
        WHERE 
          TPJ.DEMANDEE = 1 AND TPJ.FOURNIE = 0 AND TPJ.OBLIGATOIRE = 1
          AND I.PREMIER_RECRUTEMENT = 0
          AND PJ.ID IS NULL
        ';
$r     = $bdd->select($sql);
$count = 0;
foreach ($r as $i) {
    $count++;
    $o = ['histo-user-id' => $i['UTILISATEUR_ID']];

    $fichier = [
        'ID'          => $bdd->sequenceNextVal('FICHIER_ID_SEQ'),
        'NOM'         => 'Fichier non fourni',
        'TYPE'        => 'text/plain',
        'TAILLE'      => 0,
        'DESCRIPTION' => 'Fichier non fourni',
    ];
    $bdd->getTable('FICHIER')->insert($fichier, $o);

    $validation = [
        'ID'                 => $bdd->sequenceNextVal('VALIDATION_ID_SEQ'),
        'TYPE_VALIDATION_ID' => $i['TYPE_VALIDATION_ID'],
        'INTERVENANT_ID'     => $i['INTERVENANT_ID'],
        'STRUCTURE_ID'       => $i['STRUCTURE_ID'],
    ];
    $bdd->getTable('VALIDATION')->insert($validation, $o);

    $pieceJointe = [
        'ID'                   => $bdd->sequenceNextVal('PIECE_JOINTE_ID_SEQ'),
        'TYPE_PIECE_JOINTE_ID' => $i['TYPE_PIECE_JOINTE_ID'],
        'INTERVENANT_ID'       => $i['INTERVENANT_ID'],
        'VALIDATION_ID'        => $validation['ID'],
    ];
    $bdd->getTable('PIECE_JOINTE')->insert($pieceJointe, $o);

    $pjf = [
        'PIECE_JOINTE_ID' => $pieceJointe['ID'],
        'FICHIER_ID'      => $fichier['ID'],
    ];
    $bdd->getTable('PIECE_JOINTE_FICHIER')->insert($pjf, $o);
    $c->print("Insertion des pièces jointes manquantes : $count / " . count($r) . "\r");
}

$c->println("Calcul du tableau de bord piece_jointe_demande");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_demande\'); END;');

$c->println("Calcul du tableau de bord piece_jointe_fournie");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_fournie\'); END;');

$c->println("Calcul du tableau de bord piece_jointe");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe\'); END;');

$c->println("Calcul du tableau de bord workflow");
$bdd->exec('BEGIN unicaen_tbl.calculer(\'workflow\'); END;');

$c->println("Terminé");
 No newline at end of file
+83 −1
Original line number Diff line number Diff line
@@ -46,13 +46,95 @@ class PJPassageDureeVie extends AbstractMigration

    protected function after()
    {
        $bdd = $this->manager->getSchema()->getBdd();

        $sql = '
        UPDATE TYPE_PIECE_JOINTE_STATUT SET DUREE_VIE = (
          SELECT CASE WHEN PREMIER_RECRUTEMENT = 1 THEN 99 ELSE 1 END FROM TPJS_AJOUT_DUREE_VIE O WHERE O.ID = TYPE_PIECE_JOINTE_STATUT.ID
        )';

        $this->manager->getSchema()->getBdd()->exec($sql);
        $bdd->exec($sql);
        $this->manager->supprimerSauvegarde('TPJS_AJOUT_DUREE_VIE');

        $this->manager->getOseAdmin()->getConsole()->println("Calcul du tableau de bord piece_jointe_demande");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_demande\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("Calcul du tableau de bord piece_jointe_fournie");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_fournie\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("Calcul du tableau de bord piece_jointe");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("");

        /* On fournie et on valide de force les PJ qui n'étaient pas tout le temps demandées avant */
        $sql   = '
        SELECT
          TPJ.INTERVENANT_ID, TPJ.TYPE_PIECE_JOINTE_ID, I.STRUCTURE_ID, TV.ID TYPE_VALIDATION_ID, P.VALEUR UTILISATEUR_ID
        FROM 
          TBL_PIECE_JOINTE TPJ
          JOIN INTERVENANT I ON I.ID = TPJ.INTERVENANT_ID AND I.HISTO_DESTRUCTION IS NULL
          JOIN TYPE_PIECE_JOINTE_STATUT TPJS ON TPJS.HISTO_DESTRUCTION IS NULL AND TPJS.TYPE_PIECE_JOINTE_ID = TPJ.TYPE_PIECE_JOINTE_ID AND TPJS.STATUT_INTERVENANT_ID = I.STATUT_ID AND TPJS.DUREE_VIE = 99
          JOIN PARAMETRE P ON P.NOM = \'oseuser\'
          JOIN TYPE_VALIDATION TV ON TV.CODE = \'PIECE_JOINTE\'
          LEFT JOIN PIECE_JOINTE PJ ON PJ.TYPE_PIECE_JOINTE_ID = TPJ.TYPE_PIECE_JOINTE_ID AND PJ.INTERVENANT_ID = I.ID AND PJ.HISTO_DESTRUCTION IS NULL
        WHERE 
          TPJ.DEMANDEE = 1 AND TPJ.FOURNIE = 0 AND TPJ.OBLIGATOIRE = 1
          AND I.PREMIER_RECRUTEMENT = 0
          AND PJ.ID IS NULL
        ';
        $r     = $bdd->select($sql);
        $count = 0;
        foreach ($r as $i) {
            $count++;
            $o = ['histo-user-id' => $i['UTILISATEUR_ID']];

            $fichier = [
                'ID'          => $bdd->sequenceNextVal('FICHIER_ID_SEQ'),
                'NOM'         => 'Fichier non fourni',
                'TYPE'        => 'text/plain',
                'TAILLE'      => 0,
                'DESCRIPTION' => 'Fichier non fourni',
            ];
            $bdd->getTable('FICHIER')->insert($fichier, $o);

            $validation = [
                'ID'                 => $bdd->sequenceNextVal('VALIDATION_ID_SEQ'),
                'TYPE_VALIDATION_ID' => $i['TYPE_VALIDATION_ID'],
                'INTERVENANT_ID'     => $i['INTERVENANT_ID'],
                'STRUCTURE_ID'       => $i['STRUCTURE_ID'],
            ];
            $bdd->getTable('VALIDATION')->insert($validation, $o);

            $pieceJointe = [
                'ID'                   => $bdd->sequenceNextVal('PIECE_JOINTE_ID_SEQ'),
                'TYPE_PIECE_JOINTE_ID' => $i['TYPE_PIECE_JOINTE_ID'],
                'INTERVENANT_ID'       => $i['INTERVENANT_ID'],
                'VALIDATION_ID'        => $validation['ID'],
            ];
            $bdd->getTable('PIECE_JOINTE')->insert($pieceJointe, $o);

            $pjf = [
                'PIECE_JOINTE_ID' => $pieceJointe['ID'],
                'FICHIER_ID'      => $fichier['ID'],
            ];
            $bdd->getTable('PIECE_JOINTE_FICHIER')->insert($pjf, $o);
            $this->manager->getOseAdmin()->getConsole()->print("Insertion des pièces jointes manquantes : $count / " . count($r) . "\r");
        }

        $this->manager->getOseAdmin()->getConsole()->println("Nouveau calcul du tableau de bord piece_jointe_demande");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_demande\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("Nouveau calcul du tableau de bord piece_jointe_fournie");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe_fournie\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("Nouveau calcul du tableau de bord piece_jointe");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'piece_jointe\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("Nouveau calcul du tableau de bord workflow");
        $bdd->exec('BEGIN unicaen_tbl.calculer(\'workflow\'); END;');

        $this->manager->getOseAdmin()->getConsole()->println("Terminé");
    }

}
 No newline at end of file
+116 −94
Original line number Diff line number Diff line
@@ -14930,7 +14930,7 @@
          'scale' => NULL,
          'precision' => NULL,
          'nullable' => false,
          'default' => NULL,
          'default' => '1',
          'commentaire' => NULL,
        ),
        'CODE_INTERVENANT' => 
@@ -30725,8 +30725,32 @@ END UNICAEN_TBL;',
      SELECT
        tv.*
      FROM
        (WITH pjf AS (
          SELECT DISTINCT
        (SELECT
            annee_id,
            type_piece_jointe_id,
            intervenant_id,
            demandee,
            fournie,
            validee,
            heures_pour_seuil,
            obligatoire,
            date_archive
        FROM (
          SELECT
            COALESCE( pjd.annee_id, pjf.annee_id )                              annee_id,
            COALESCE( pjd.type_piece_jointe_id, pjf.type_piece_jointe_id )      type_piece_jointe_id,
            COALESCE( pjd.intervenant_id, pjf.intervenant_id )                  intervenant_id,
            CASE WHEN pjd.intervenant_id IS NULL THEN 0 ELSE 1 END              demandee,
            CASE WHEN pjf.fichier = pjf.count THEN 1 ELSE 0 END                 fournie,
            CASE WHEN pjf.validation = pjf.count THEN 1 ELSE 0 END              validee,
            COALESCE(pjd.heures_pour_seuil,0)                                   heures_pour_seuil,
            COALESCE(pjd.obligatoire,1)                                         obligatoire,
            pjf.date_archive                                                    date_archive,
            rank() over (partition by pjd.annee_id, pjd.code_intervenant, pjd.type_piece_jointe_id order by pjf.annee_id DESC)  rank1
          FROM
            tbl_piece_jointe_demande pjd
            FULL JOIN (
              SELECT
                pjf.annee_id,
                pjf.type_piece_jointe_id,
                pjf.intervenant_id,
@@ -30747,27 +30771,14 @@ END UNICAEN_TBL;',
                pjf.date_validite,
                pjf.duree_vie,
                pjf.date_archive
            ORDER BY pjf.annee_id ASC
        )
        SELECT DISTINCT
          COALESCE( pjd.annee_id, pjf.annee_id ) annee_id,
          COALESCE( pjd.type_piece_jointe_id, pjf.type_piece_jointe_id ) type_piece_jointe_id,
          COALESCE( pjd.intervenant_id, pjf.intervenant_id ) intervenant_id,
          CASE WHEN pjd.intervenant_id IS NULL THEN 0 ELSE 1 END demandee,
          CASE WHEN pjf.fichier = pjf.count THEN 1 ELSE 0 END fournie,
          CASE WHEN pjf.validation = pjf.count THEN 1 ELSE 0 END validee,
          COALESCE(pjd.heures_pour_seuil,0) heures_pour_seuil,
          COALESCE(pjd.obligatoire,1) obligatoire,
          pjf.date_archive
        FROM
          tbl_piece_jointe_demande pjd
          FULL JOIN pjf
            ) pjf
            ON pjf.type_piece_jointe_id = pjd.type_piece_jointe_id
            AND pjd.code_intervenant = pjf.code_intervenant
            AND pjd.annee_id BETWEEN pjf.annee_id AND (pjf.annee_id + pjf.duree_vie - 1)
            AND pjd.annee_id BETWEEN pjf.annee_id AND NVL(pjf.date_archive - 1,(pjf.annee_id + pjf.duree_vie - 1))
        ORDER By annee_id) tv
          ) t
          WHERE
            t.rank1 = 1) tv
      WHERE
        \' || conds || \'
@@ -30960,7 +30971,7 @@ END UNICAEN_TBL;',
      SELECT
        tv.*
      FROM
        (SELECT DISTINCT
        (SELECT
          i.annee_id,
          i.code code_intervenant,
          pj.type_piece_jointe_id,
@@ -30968,8 +30979,8 @@ END UNICAEN_TBL;',
          pj.id piece_jointe_id,
          v.id validation_id,
          f.id fichier_id,
          MAX(tpjs.duree_vie) duree_vie,
          MAX(i.annee_id+duree_vie) date_validite,
          MIN(tpjs.duree_vie) duree_vie,
          MIN(i.annee_id+tpjs.duree_vie) date_validite,
          pj.date_archive date_archive
        FROM
                    piece_jointe          pj
@@ -31010,8 +31021,8 @@ END UNICAEN_TBL;',
      PIECE_JOINTE_ID      = v.PIECE_JOINTE_ID,
      DATE_ARCHIVE         = v.DATE_ARCHIVE,
      DATE_VALIDITE        = v.DATE_VALIDITE,
      CODE_INTERVENANT     = v.CODE_INTERVENANT,
      DUREE_VIE            = v.DUREE_VIE,
      CODE_INTERVENANT     = v.CODE_INTERVENANT,
      to_delete = 0
    WHEN NOT MATCHED THEN INSERT (
@@ -31025,8 +31036,8 @@ END UNICAEN_TBL;',
      PIECE_JOINTE_ID,
      DATE_ARCHIVE,
      DATE_VALIDITE,
      CODE_INTERVENANT,
      DUREE_VIE,
      CODE_INTERVENANT,
      TO_DELETE
    ) VALUES (
@@ -31040,8 +31051,8 @@ END UNICAEN_TBL;',
      v.PIECE_JOINTE_ID,
      v.DATE_ARCHIVE,
      v.DATE_VALIDITE,
      v.CODE_INTERVENANT,
      v.DUREE_VIE,
      v.CODE_INTERVENANT,
      0
    );
@@ -36558,8 +36569,32 @@ FROM
    array (
      'name' => 'V_TBL_PIECE_JOINTE',
      'definition' => 'CREATE OR REPLACE FORCE VIEW V_TBL_PIECE_JOINTE AS
WITH pjf AS (
  SELECT DISTINCT
SELECT
    annee_id,
    type_piece_jointe_id,
    intervenant_id,
    demandee,
    fournie,
    validee,
    heures_pour_seuil,
    obligatoire,
    date_archive
FROM (
  SELECT
    COALESCE( pjd.annee_id, pjf.annee_id )                              annee_id,
    COALESCE( pjd.type_piece_jointe_id, pjf.type_piece_jointe_id )      type_piece_jointe_id,
    COALESCE( pjd.intervenant_id, pjf.intervenant_id )                  intervenant_id,
    CASE WHEN pjd.intervenant_id IS NULL THEN 0 ELSE 1 END              demandee,
    CASE WHEN pjf.fichier = pjf.count THEN 1 ELSE 0 END                 fournie,
    CASE WHEN pjf.validation = pjf.count THEN 1 ELSE 0 END              validee,
    COALESCE(pjd.heures_pour_seuil,0)                                   heures_pour_seuil,
    COALESCE(pjd.obligatoire,1)                                         obligatoire,
    pjf.date_archive                                                    date_archive,
    rank() over (partition by pjd.annee_id, pjd.code_intervenant, pjd.type_piece_jointe_id order by pjf.annee_id DESC)  rank1
  FROM
    tbl_piece_jointe_demande pjd
    FULL JOIN (
      SELECT
        pjf.annee_id,
        pjf.type_piece_jointe_id,
        pjf.intervenant_id,
@@ -36580,27 +36615,14 @@ WITH pjf AS (
        pjf.date_validite,
        pjf.duree_vie,
        pjf.date_archive
    ORDER BY pjf.annee_id ASC
)
SELECT DISTINCT
  COALESCE( pjd.annee_id, pjf.annee_id ) annee_id,
  COALESCE( pjd.type_piece_jointe_id, pjf.type_piece_jointe_id ) type_piece_jointe_id,
  COALESCE( pjd.intervenant_id, pjf.intervenant_id ) intervenant_id,
  CASE WHEN pjd.intervenant_id IS NULL THEN 0 ELSE 1 END demandee,
  CASE WHEN pjf.fichier = pjf.count THEN 1 ELSE 0 END fournie,
  CASE WHEN pjf.validation = pjf.count THEN 1 ELSE 0 END validee,
  COALESCE(pjd.heures_pour_seuil,0) heures_pour_seuil,
  COALESCE(pjd.obligatoire,1) obligatoire,
  pjf.date_archive
FROM
  tbl_piece_jointe_demande pjd
  FULL JOIN pjf
    ) pjf
    ON pjf.type_piece_jointe_id = pjd.type_piece_jointe_id
    AND pjd.code_intervenant = pjf.code_intervenant
    AND pjd.annee_id BETWEEN pjf.annee_id AND (pjf.annee_id + pjf.duree_vie - 1)
    AND pjd.annee_id BETWEEN pjf.annee_id AND NVL(pjf.date_archive - 1,(pjf.annee_id + pjf.duree_vie - 1))
ORDER By annee_id',
  ) t
  WHERE
    t.rank1 = 1',
    ),
    'V_TBL_PIECE_JOINTE_DEMANDE' => 
    array (
@@ -36671,7 +36693,7 @@ i.code,
    array (
      'name' => 'V_TBL_PIECE_JOINTE_FOURNIE',
      'definition' => 'CREATE OR REPLACE FORCE VIEW V_TBL_PIECE_JOINTE_FOURNIE AS
SELECT DISTINCT
SELECT
  i.annee_id,
  i.code code_intervenant,
  pj.type_piece_jointe_id,
@@ -36679,8 +36701,8 @@ SELECT DISTINCT
  pj.id piece_jointe_id,
  v.id validation_id,
  f.id fichier_id,
  MAX(tpjs.duree_vie) duree_vie,
  MAX(i.annee_id+duree_vie) date_validite,
  MIN(tpjs.duree_vie) duree_vie,
  MIN(i.annee_id+tpjs.duree_vie) date_validite,
  pj.date_archive date_archive
FROM
            piece_jointe          pj
+1 −0
Original line number Diff line number Diff line
@@ -148,6 +148,7 @@ return [
            'modeles-edition'          => 'Édition des modèles',
            'projet-generation'        => 'Génération de projet de contrat',
            'contrat-generation'       => 'Génération de contrat',
            'envoi-email'              => 'Envoyer le contrat par email',
        ],
    ],

Loading