diff --git a/config/autoload/global.php b/config/autoload/global.php
index c115568b2e86cbe745072b1191938453df62a491..6f0304443cc732a32109a67582dc21bc8e79926a 100755
--- a/config/autoload/global.php
+++ b/config/autoload/global.php
@@ -99,25 +99,23 @@ return array(
],
],
-
'pcru' => [
// Référenciel PCRU (Fichiers contenant les données officielles)
'polecompetitivite' => __DIR__ .'/../../install/pcru-pole-competitivite.json',
'sourcefinancement' => __DIR__ .'/../../install/pcru-sources-financement.json',
'contracttype' => __DIR__ .'/../../install/pcru-contracts-types.json',
+ 'typesetablissement' => __DIR__ .'/../../install/pcru-types-etablissement.json',
// Paramètres de la POOL d'envoi PCRU
- 'files_path' => __DIR__.'/../../tmp', // Dossier où seront gérés les fichiers à envoyer
- 'filename_contrats' => 'SitePMA_UniCaen.csv', // Nom du fichier CSV (contrats)
- 'filename_partenaires' => 'SitePMA_UniCaen.PARTENAIRES.csv', // Nom du fichier (Partenaires)
+ 'repertoire_sftp' => '/Echanges', // Chemin absolu du dossier du serveur SFTP PCRU distant dans lequel les fichiers seront déposés
+ 'filename_contrats' => 'SitePMA_UniCaen.iso.csv', // Nom du fichier CSV (contrats)
+ 'filename_partenaires' => 'SitePMA_UniCaen-PARTENAIRE.iso.csv', // Nom du fichier (Partenaires)
'filename_csv_ok' => 'DEPOT-CSV.OK', // Nom du fichier (Marqueur de dépot CSV)
+ 'filename_csv_partenaire_ok' => 'DEPOT-CSV-PARTENAIRE.OK', // Nom du fichier (Marqueur de dépot CSV partenaire)
'filename_pdf_ok' => 'DEPOT-PDF.OK', // Nom du fichier (Marqueur de dépot PDF)
- 'pool_current' => 'waiting', // Nom du dossier où sont stoqués les fichiers avant envoi
- 'pool_effective' => 'uploaded', // Nom du dossier où sont stoqués les fichiers avant envoi
- 'pool_history' => 'send-%s', // Nom des dossiers archivés
- 'pool_log' => 'pcru.log', // Nom du fichier de log
- 'pool_lock' => 'PCRU.LOCK', // Nom du fichier de verrouillage
'filename_errors' => 'DEPOT-CSV.ERRORS.json', // Nom du fichier d'erreur PCRU
+ 'filename_retour_pcru_ok' => 'RETOUR-PCRU.OK', // Nom du fichier (Marqueur de retour OK de la part de PCRU)
+ 'filename_retour_pcru_ok_csv' => 'RETOUR-PCRU.csv', // Nom du fichier (Marqueur de retour PCRU contenant la liste les contrats dont il manque le fichier pdf)
],
'htmltopdfrenderer' => [
diff --git a/config/autoload/oscar.yml.dist b/config/autoload/oscar.yml.dist
index 069b591f0ae151707395bafba3ed5fdabb55b01d..dafbb321798dbee817c06ab16f0e2d1ffc175171 100644
--- a/config/autoload/oscar.yml.dist
+++ b/config/autoload/oscar.yml.dist
@@ -46,9 +46,6 @@ oscar:
document_admin_oscar: "/var/documents/public"
document_request: "/var/documents/request"
- pcru:
- files_path: '/var/documents/pcru'
-
# Modèle pour la génération des documents
timesheet_person_month_template: '/var/application/data/templates/timesheet_person_month.default.html.php'
timesheet_period_template: '/var/application/data/templates/timesheet_period.default.html.php'
diff --git a/doc/images/pcru-config2.png b/doc/images/pcru-config2.png
new file mode 100644
index 0000000000000000000000000000000000000000..39243dfee05cf7dd89e7499201455608a618a708
Binary files /dev/null and b/doc/images/pcru-config2.png differ
diff --git a/doc/images/pcru-correspondance-contrats.png b/doc/images/pcru-correspondance-contrats.png
new file mode 100644
index 0000000000000000000000000000000000000000..b64594822b671ece0a6eada53a3a6683eb2dd8d0
Binary files /dev/null and b/doc/images/pcru-correspondance-contrats.png differ
diff --git a/doc/images/pcru-droits.png b/doc/images/pcru-droits.png
new file mode 100644
index 0000000000000000000000000000000000000000..93bc2ab34b5d463442319a02c5ebafe6db25c4ef
Binary files /dev/null and b/doc/images/pcru-droits.png differ
diff --git a/doc/images/pcru-erreurs.png b/doc/images/pcru-erreurs.png
new file mode 100644
index 0000000000000000000000000000000000000000..4de689963fbc3c50d8fd3d45392fcded8ebd49c4
Binary files /dev/null and b/doc/images/pcru-erreurs.png differ
diff --git a/doc/images/pcru-erreurs2.png b/doc/images/pcru-erreurs2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a70b00048b3c2c558100855c1fc69d15cbe931ea
Binary files /dev/null and b/doc/images/pcru-erreurs2.png differ
diff --git a/doc/images/pcru-fiche-activite.png b/doc/images/pcru-fiche-activite.png
new file mode 100644
index 0000000000000000000000000000000000000000..24dbf7801508158b438806ed6d4ec13dbd12b832
Binary files /dev/null and b/doc/images/pcru-fiche-activite.png differ
diff --git a/doc/images/pcru-formulaire.png b/doc/images/pcru-formulaire.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cdb0363f15f8343774155f465a120fb097e2afb
Binary files /dev/null and b/doc/images/pcru-formulaire.png differ
diff --git a/doc/images/pcru-historique.png b/doc/images/pcru-historique.png
new file mode 100644
index 0000000000000000000000000000000000000000..67779be1dfb599ddc0b6f7a02b9960863f4a1956
Binary files /dev/null and b/doc/images/pcru-historique.png differ
diff --git a/doc/images/pcru-liste-types-contrats.png b/doc/images/pcru-liste-types-contrats.png
new file mode 100644
index 0000000000000000000000000000000000000000..50d828af70775c81f3d8214244c82e3fc7e4a5b4
Binary files /dev/null and b/doc/images/pcru-liste-types-contrats.png differ
diff --git a/doc/images/pcru-liste-types-etablissement.png b/doc/images/pcru-liste-types-etablissement.png
new file mode 100644
index 0000000000000000000000000000000000000000..69541f4f8ef0347f26d2345ad705a99046df96cf
Binary files /dev/null and b/doc/images/pcru-liste-types-etablissement.png differ
diff --git a/doc/images/pcru-options.png b/doc/images/pcru-options.png
new file mode 100644
index 0000000000000000000000000000000000000000..072aa1201f669219d0fc88d9c484220b11c74d52
Binary files /dev/null and b/doc/images/pcru-options.png differ
diff --git a/doc/images/pcru-sftp.png b/doc/images/pcru-sftp.png
new file mode 100644
index 0000000000000000000000000000000000000000..120049d1ed243f584f0301a586e5fe1848ee95e0
Binary files /dev/null and b/doc/images/pcru-sftp.png differ
diff --git a/doc/images/pcru-suivi.png b/doc/images/pcru-suivi.png
new file mode 100644
index 0000000000000000000000000000000000000000..f61cbd6940b984af34115e5f1a34f31361ca3617
Binary files /dev/null and b/doc/images/pcru-suivi.png differ
diff --git a/doc/images/pcru-types-etablissements.png b/doc/images/pcru-types-etablissements.png
new file mode 100644
index 0000000000000000000000000000000000000000..815f59ef35ee96255f19668b75d7814ad9a7cace
Binary files /dev/null and b/doc/images/pcru-types-etablissements.png differ
diff --git a/doc/pcru.md b/doc/pcru.md
new file mode 100644
index 0000000000000000000000000000000000000000..fd99d99c07fa9b5be7ddd502cd87daa8e4133263
--- /dev/null
+++ b/doc/pcru.md
@@ -0,0 +1,246 @@
+# Module PCRU
+
+Le module PCRU d'OSCAR permet d'automatiser la soumission des contrats de recherche depuis OSCAR vers les systèmes PCRU, afin d'éviter aux gestionnaires d'avoir à réaliser une double saisie.
+
+Le fonctionnement nominal est le suivant :
+ - l'établissement contacte PCRU pour demander un accès au serveur SFTP permettant le dépôt automatique de fichiers CSV par OSCAR,
+ - l'administrateur OSCAR renseigne les informations de connexion au serveur SFTP dans la configuration (login, mot de passe...),
+ - l'administrateur OSCAR configure un CRON qui chaque jour va déclencher le dépôt automatique d'un fichier CSV contenant les nouvelles activités sur le serveur SFTP de PCRU,
+ - les gestionnaires activent le transfert vers PCRU pour les activités concernées.
+
+Au cas où la solution SFTP n'est pas fonctionnelle, un processus manuel de contournement est possible en téléversant manuellement les fichiers CSV sur le site web PCRU :
+ - les gestionnaires activent le transfert vers PCRU pour les activités concernées,
+ - l'administrateur OSCAR télécharge les fichiers CSV et PDFs à envoyer à PCRU puis téléverse les fichiers sur le site web PCRU (https://pcru.dr14.cnrs.fr),
+ - l'administrateur vérifie la bonne intégration des activités sur le site web PCRU puis met à jour par des requêtes SQL le statut des activités ainsi déposées.
+
+
+## Configuration du module PCRU
+
+### Gestion des privilèges
+
+
+
+De nouveaux droits sont à configurer dans la page *Gestion des privilèges*.
+
+Pour les administrateurs, il faut ajouter les droits suivants :
+ - Maintenance > Peut visualiser la liste des données PCRU
+ - Maintenance > Peut déclencher manuellement le transfert des donnèes vers PCRU
+
+Pour les gestionnaires, il faut ajouter les droits suivants :
+ - Activité de recherche > Permet d'afficher les informations PCRU de l'activité de recherche
+ - Activité de recherche > Permet d'activer les données PCRU pour une activité
+
+### Configuration des référentiels
+
+
+
+Quand on soumet des informations à PCRU, certains champs attendent une valeur parmi une liste bien précise définie par PCRU. Toutefois il n'existe pas aujourd'hui d'API permettant de récupérer automatiquement ces valeurs. Si ces valeurs venaient à évoluer, l'administrateur OSCAR devra donc les intégrer à la main. Par exemple, si un gestionnaire indique ne pas pouvoir soumettre une activité à PCRU car le pôle de compétitivité concerné n'apparaît pas dans la liste affichée par OSCAR alors qu'il est bien disponible sur le site de PCRU, cela indique que l'administrateur devra mettre à jour ce référentiel.
+
+Les quatres référentiels sont les suivants :
+ - types de contrats,
+ - pôles de compétitivité,
+ - sources de financement,
+ - et types d'établissement (pour le fichier des partenaires).
+
+Pour mettre à jour les référentiels, cliquer sur le bouton ne suffit pas (pas de solution automatique à ce jour). L'administrateur doit d'abord :
+ - aller sur le site de PCRU pour récupérer (manuellement) les listes des référentiels à jour. Sur la page https://pcru.dr14.cnrs.fr/Contrats/Importation.aspx on peut déplier des listes déroulantes pour voir les types de contrats, les pôles de compétitivité et les sources de financement.
+
+
+ - Sur la page https://pcru.dr14.cnrs.fr/Partenaires/Importation.aspx on peut voir la liste des types d'établissement.
+ 
+
+ - L'administrateur doit ensuite comparer ces listes avec les valeurs actuellement disponibles dans OSCAR pour voir s'il est nécessaire de les mettre à jour, s'il en manque. L'interface d'administration permet de visualiser ces valeurs. Elles sont enregistrées dans les tables de la base de données appelées *pcrutypecontract*, *pcrupolecompetitivite*, *pcrusourcefinancement* et *pcrutypeetablissement*.
+
+ - Si des valeurs doivent être mises à jour ou ajoutées, l'administrateur peut directement modifier les valeurs dans les tables en base de données ou bien passer par l'import de fichiers JSON.
+ - L'import de fichiers JSON permet uniquement d'ajouter de nouvelles valeurs, et non de modifier des intitulés existants. Pour passer par l'import de fichiers JSON, l'administrateur doit modifier les fichiers (*pcru-contracts-types.json*, *pcru-pole-competitivite.json*, *pcru-sources-financement.json* et *pcru-types-etablissement.json*) dans le répertoire *oscar/install/* avec les nouvelles valeurs. Il doit ensuite demander à OSCAR de mettre à jour la base de données en créant les nouvelles valeurs présentes dans ces fichiers JSON. En cliquant sur le bouton *"Mettre à jour les référentiels"* sur la page d'administration dans la partie consacrée au module PCRU, tous les référentiels seront mis à jour. Pour ne mettre à jour qu'un seul référentiel, il faut d'abord aller sur la page de visualisation des valeurs de ce référentiel en cliquant sur le bouton *"Voir"*, puis cliquer sur le bouton bleu au pied de la page *"Actualiser depuis le fichier JSON dans oscar/install"*.
+ 
+
+#### Configuration des correspondances des types de contrat
+Le référentiel des types de contrats a un fonctionnement particulier par rapport aux autres.
+
+Tout contrat envoyé à PCRU doit avoir un type de contrat parmi la liste définie par PCRU. Pour faire gagner du temps aux gestionnaires, il est possible de configurer une correspondance entre un type OSCAR et un type PCRU. Cela va permettre au système de pré-remplir automatiquement le champ *type de contrat* à envoyer à PCRU à partir du type OSCAR et ainsi éviter au gestionnaire d'avoir à le remplir à la main.
+
+
+
+
+### Configuration des autres correspondances
+
+
+
+En cliquant sur le bouton *Configurer* en haut à droite de la fiche Module PCRU, on arrive sur une page permettant de configurer d'autres correspondances entre OSCAR et PCRU. À nouveau, ces correspondances ont pour objectif de permettre la sélection automatique de valeurs afin de faire gagner du temps aux gestionnaires lors de la saisie des informations à envoyer à PCRU. Les options sont les suivantes :
+
+ - **Type pour le contrat signé** : on choisit ici le type de document OSCAR (par exemple *Contrat Version Définitive Signée*) qui sera utilisé pour déterminer automatiquement, parmi les documents de l'activité, lequel représente le contrat signé. Ce fichier PDF sera envoyé à PCRU.
+ - **Responsable scientifique** : on choisit ici le rôle OSCAR (le plus souvent *Responsable scientifique*) qui sera utilisé pour déterminer automatiquement, parmi les personnes liées à l'activité, laquelle est la responsable scientifique. Son nom sera envoyé à PCRU.
+ - **Partenaires** : on choisit ici le ou les rôles OSCAR (par exemple *Partenaire*) qui seront utilisés pour déterminer automatiquement, parmi les organisations liées à l'activité, lesquelles sont des partenaires. Leurs noms (libellé court) seront envoyés à PCRU.
+ - **Partenaire principal** : on choisit ici le ou les rôles OSCAR (par exemple *Co-contractant*) qui seront utilisés pour déterminer automatiquement, parmi les organisations liées à l'activité, laquelle est la partenaire principale. Cette organisation devra avoir ses informations correctement renseignées pour pouvoir être envoyée (numéro SIREN ou SIRET ou TVA intra ou DUNS, type d'établissement, adresse...)
+ - **Unité(s)** : on choisit ici le ou les rôles OSCAR (le plus souvent *Laboratoire*) qui seront utilisés pour déterminer automatiquement, parmi les organisations liées à l'activité, laquelle est le laboratoire du CNRS. Cette organisation devra avoir au moins son code UMR (labintel) de renseigné, et dans l'idéal son code RNSR.
+
+### Activation du module PCRU
+Pour activer le module PCRU, il faut activer la checkbox (*Module Actif*) tout en haut de la page de configuration du module.
+
+### Configuration de la connexion au serveur SFTP
+
+
+
+Sur cette page on peut renseigner les différentes valeurs, obtenues de la part de PCRU, et permettant à OSCAR de se connecter au serveur SFTP de PCRU.
+
+Une fois la configuration réalisée, on peut vérifier que la connexion fonctionne en lançant la commande `php bin/oscar.php check:config` ou en allant sur la page d'administration de vérification de la configuration.
+
+### Configuration du CRON pour l'envoi automatique des activités à PCRU
+
+La commande oscar `php bin/oscar.php pcru:process-ftp` permet de déclencher un échange avec le serveur SFTP de PCRU et peut donc être configurée via un CRON pour s'exécuter une fois par jour. Toutefois il est recommandé de gérer les échanges manuellement au moins au début pour vérifier que tout fonctionne correctement.
+
+## Activation de la transmission vers PCRU pour une activité
+
+Maintenant que nous avons vu comment configurer le module PCRU, nous allons voir comment l'utiliser au quotidien.
+
+Pour activer la transmission vers PCRU pour une activité, le gestionnaire (ayant les droits) devra cliquer sur le bouton *Accès aux informations PCRU* à partir de la fiche Activité.
+
+
+Les gestionnaires accèderont alors à une page *Informations PCRU* contenant un grand fomulaire avec toutes les informations demandées par PCRU (33 champs). On peut choisir d'utiliser les valeurs par défaut déterminées automatiquement par OSCAR ou bien remplacer manuellement certaines valeurs en décochant les cases à cocher correspondantes.
+
+
+
+Une fois toutes les erreurs corrigées, le gestionnaire devra cocher tout en bas du formulaire la case *"Activer l'envoi vers PCRU"* pour que cette activité soit envoyée à PCRU. L'activité sera alors envoyée à PCRU la prochaine fois que le CRON s'exécutera ou que l'administrateur déclenchera manuellement l'échange avec PCRU.
+
+## Page d'administration de suivi des échanges PCRU
+Via le menu Administration > Maintenance des données > Processus PCRU, on peut accéder à la page de suivi des échanges PCRU.
+
+
+
+Cette page contient de nombreuses informations.
+
+### Récapitulatif des états/statuts des activités
+Un tableau liste les activités pour lequel un gestionnaire a coché la case *"Activer l'envoi à PCRU"* et indique leur statut.
+
+Lorsqu'un gestionnaire enregistre pour la première fois le formulaire PCRU, cela créé une nouvelle ligne dans la table *activitypcruinformations* en base de données, liée à cette activité. La colonne *status* de cette table contient le statut de l'envoi PCRU pour cette activité. Tant que la case *"Activer l'envoi à PCRU"* n'est pas cochée, l'activité n'apparaît pas dans la liste.
+
+Une activité peut passer par les statuts suivants :
+ - **jamais-envoyee** (pastille jaune) : indique que l'activité n'a pas encore été envoyée à PCRU.
+ - si la case *"Activer l'envoi à PCRU"* n'est pas cochée, l'activité n'apparaît pas dans la liste
+ - si l'activité contient des erreurs, une pastille rouge l'indique et l'activité ne sera pas envoyée tant qu'elles ne seront pas corrigées
+ - **envoyee-attente-retour-pcru** (pastille verte) : indique que les informations de l'activité ont été déposées dans le fichier CSV sur le serveur SFTP PCRU et que nous sommes en attente d'un retour de PCRU concernant l'intégration de cette activité. Cela survient lorsque l'envoi était activé pour l'activité, qu'elle n'avait pas d'erreur, et que l'administrateur a déclenché un envoi (manuel ou en CRON).
+ - **retour-pcru-ok** (pastille verte) : PCRU a confirmé la bonne intégration de cette activité en déposant sur le serveur SFTP le fichier marqueur RETOUR-PCRU.OK. Il n'y a plus rien à faire concernant cette activité. Elle disparaîtra de la liste au bout de 6 mois (Les activités de plus de 6 mois dont la bonne intégration a été confirmée par PCRU n'apparaissent pas dans la liste).
+ - **retour-pcru-erreurs** (pastille rouge) : PCRU a indiqué l'échec de l'intégration de cette activité en déposant sur le serveur SFTP le fichier DEPOT-CSV.ERRORS.json et en indiquant dans son contenu que cette activité précisément est en erreur. Les erreurs particulières remontées seront affichées sur la page *Informations PCRU* de l'activité. Résoudre la situation demande une intervention manuelle. Cette partie est détaillée plus loin dans cette documentation.
+
+
+
+
+
+```mermaid
+flowchart TD
+ jamais-envoyee(Encore jamais envoyée) -->|Si sans erreurs et qu'un échange est déclenché| envoyee-attente-retour-pcru{Envoyée, attente retour PCRU}
+ envoyee-attente-retour-pcru -->|Si PCRU déposé le fichier RETOUR-PCRU.OK| retour-pcru-ok(Retour PCRU OK)
+ envoyee-attente-retour-pcru -->|Si PCRU déposé le fichier DEPOT-CSV.ERRORS.json| retour-pcru-erreurs(Retour PCRU erreurs)
+```
+
+### Bouton de déclenchement d'un échange
+
+Cliquer sur le bouton "🔁 Déclencher un échange avec le serveur SFTP PCRU (envoi des activités en attente et relève des réponses de PCRU)" ou bien exécuter la commande `php bin/oscar.php pcru:process-ftp` va délencher le processus suivant :
+
+ - tentative de connexion au serveur SFTP de PCRU
+ - liste des fichiers présents et en fonction :
+ - si aucun fichier n'est présent, et que des activité avaient été envoyées, cela signifie qu'elles ont été correctement intégrées par PCRU. Les activité encore au statut `envoyee-attente-retour-pcru` passent alors au statut `retour-pcru-ok`
+ - si les fichiers présents sont ceux qui avaient été déposés lors du dernier échange, c'est que nous sommes toujours en attente d'un retour de PCRU. Alors le processus s'arrête là.
+ - si un fichier d'erreur (`DEPOT-CSV.ERRORS.json`) a été déposé par PCRU, alors ce fichier est analysé. Les activité en erreurs passent au statut `retour-pcru-erreurs` tandis que celles qui ne sont pas mentionnées dans le fichier passent au statut `retour-pcru-ok`. Le processus s'arrête alors, et la résolution des erreurs va nécessiter une intervention manuelle de l'administrateur OSCAR.
+ - tant tous les autres cas, le processus s'arrête en erreur car ils ne sont pas sensés se produire et nécessitent une intervention ou un contrôle manuel (fichier inconnu qui apparaît par exemple)
+ - Si le répertoire du serveur SFTP est vide, alors OSCAR va tenter d'envoyer des activités en attente d'envoi. Pour chacune d'entre elle, il va d'abord vérifier si elles sont en erreur ou non, et seules celles qui ne sont pas en erreurs seront déposées sur le serveur. Les fichiers suivants sont déposés :
+ - un fichier CSV avec les informations des contrats
+ - un fichier CSV avec les partenaires principaux (ceux dont toutes les informations ont bien été renseignées)
+ - les documents PDFs des contrats signés
+ - les fichiers vides "marqueurs" OK
+
+La zone "Historique des échanges" contient les informations détaillant les échanges ayant eu lieu au cours des 6 derniers mois. Il est possible de cliquer sur la description pour obtenir davantage de détail en dépliant la zone.
+
+
+
+### Procédure à suivre en cas de retour d'erreur PCRU
+
+Lorsque PCRU indique par le dépôt du fichier `DEPOT-CSV.ERRORS.json` avoir échoué à intégrer automatiquement certaines activité car elle contiennent des erreurs, il faut procéder ainsi :
+ - Récupérer le fichier `DEPOT-CSV.ERRORS.json`, en faire une copie et analyser son contenu
+ - Les activité dont le statut est `envoyee-attente-retour-pcru` et qui n'apparaissent pas dans ce fichier ont normalement été correctement intégrées. Il faut vérifier sur le site de PCRU que c'est bien le cas, puis les passer au statut `retour-pcru-ok` par une requête SQL modifiant le champ `status` de la table `activitypcruinformations`.
+ - Pour les autres, il faut analyser l'origine de l'erreur et la corriger :
+ - si l'activité a été partiellement intégrée sur le site de PCRU, il est possible de la corriger directement sur le site de PCRU puis la passer au statut `retour-pcru-ok` dans OSCAR
+ - si elle n'a pas été intégrée du tout par PCRU, il est possible de la repasser au statut `jamais-envoyee` par deux possibilités. Toutefois pensez bien à noter l'origine des erreurs car ces requêtes suppriment cette information de la BDD :
+ - recommencer toute la saisie PCRU à zéro pour cette activité en supprimant toutes les informations PCRU :
+
+```sql
+delete from activitypcruinformations where activity_id = ?;
+```
+
+- - conserver les informations saisies par le gestionnaire via la requête suivante :
+
+```sql
+
+update
+ activitypcruinformations
+set
+ status = 'jamais-envoyee',
+ datepremierdepot = null,
+ dateenvoifichiercontrat = null,
+ envoiobjet = NULL,
+ envoilabintel = NULL,
+ envoirnsr = NULL,
+ envoisigle = NULL,
+ envoinumcontrat = NULL,
+ envoiequipe = NULL,
+ envoitypecontrat = NULL,
+ envoiacronyme = NULL,
+ envoicontratsassocies = NULL,
+ envoiresponsablescientifique = NULL,
+ envoiemployeurresponsablescientifique = NULL,
+ envoicoordinateurconsortium = NULL,
+ envoipartenaires = NULL,
+ envoipartenaireprincipal = NULL,
+ envoiidpartenaireprincipal = NULL,
+ envoisourcefinancement = NULL,
+ envoilieuexecution = NULL,
+ envoidatedernieresignature = NULL,
+ envoiduree = NULL,
+ envoidatedebut = NULL,
+ envoidatefin = NULL,
+ envoimontantpercuunite = NULL,
+ envoicontributionfinanceur = NULL,
+ envoimontanttotal = NULL,
+ envoivalidepolecompetitivite = NULL,
+ envoipolecompetitivite = NULL,
+ envoicommentaires = NULL,
+ envoipia = NULL,
+ envoireference = NULL,
+ envoiaccordcadre = NULL,
+ envoicifre = NULL,
+ envoichaireindustrielle = NULL,
+ envoipresencepartenaireindustriel = NULL,
+ erreurs = NULL
+where
+ activity_id = ?;
+```
+
+ - il faut alors modifier l'information qui causait l'erreur puis ré-envoyer l'activité.
+
+
+### Procédure d'intégration manuelle (sans passer par le serveur SFTP)
+
+Il est possible de télécharger les données au format attendu par PCRU pour pouvoir ensuite les intégrer manuellement sur le site web de PCRU.
+Il faut pour cela cliquer sur le bouton
+ - Télécharger les documents pour ensuite les téléverser manuellement sur le site web PCRU :
+ - 📥 Uniquement les activités en attente d'envoi
+
+Un zip est alors téléchargé, avec les activité en attente d'envoi, contenant les fichiers qui sont normalement déposés sur le serveur SFTP (sans les fichiers vides marqueurs OK) :
+ - un fichier CSV avec les informations des contrats
+ - un fichier CSV avec les partenaires principaux (ceux dont toutes les informations ont bien été renseignées)
+ - les documents PDFs des contrats signés
+
+Le fichier des partenaires page "Importer de nouveaux Partenaires :" https://pcru.dr14.cnrs.fr/Partenaires/Importation.aspx
+
+Le fichier des contrats peut alors être importé sur le site de PCRU, page "Importer des données de contrats à partir d'un tableau CSV :" https://pcru.dr14.cnrs.fr/Contrats/Importation.aspx
+
+Et ensuite les PDFs peuvent être téléversé sur la page "Importation multiple de fichiers PDF :" https://pcru.dr14.cnrs.fr/Documents/Importation.aspx dans la limite de 20 Mo par fichier et 200 Mo au total.
+
+Attention à bien vérifier les erreurs à chaque étape :
+ - Si l'import d'un des partenaire échoue, l'import de son contrat risque ensuite d'échouer.
+ - Si l'import d'un contrat échoue, l'import de son fichier PDF risque ensuite d'échouer.
+
+Il faut ensuite manuellement mettre à jour le statut des activité ainsi importées via une requête SQL. Pour chaque activité dont l'import a réussi, il faut passer la ligne de la table `activitypcruinformations` correspondante du `status` "`jamais-envoyee`" vers le `status` "`retour-pcru-ok`". Attention à ne pas modifier à l'aveugle toutes les lignes ayant le statut "`jamais-envoyee`" car celles qui contiennent des erreurs n'ont pas été téléchargées dans le zip.
+
+Si nécessaire, il est possible d'extraire les informations PCRU pour toutes les activités ayant déjà eu des informations PCRU et pas seulement celles étant dans le statut "`jamais-envoyee`" (en attente d'envoi) en cliquant sur le bouton "🗃 L'intégralité des activités".
diff --git a/front/src/AdministrationPcru.vue b/front/src/AdministrationPcru.vue
index eb08911fa6f9efb32ea34a138e9e3c8d6320aac6..262f1e28ecad2b1ebd870d619516c7f3a95cc8a5 100644
--- a/front/src/AdministrationPcru.vue
+++ b/front/src/AdministrationPcru.vue
@@ -31,11 +31,6 @@
Accès FTP
-
-
- Le transfert FTP n'est pas encore activé dans cette version
-
-
@@ -87,20 +82,55 @@
+
+
+ Les fichiers de la clé privée et de la clé publique doivent être déposés dans le répertoire oscar/config/autoload/ et être accessible en lecture à l'utilisateur du serveur web.
+
+
-
+
-
+
- Clef SSH
+ Nom du fichier contenant la clé privée SSH
-
+
+
+
+
+
+
+
+ Nom du fichier contenant la clé publique SSH
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mot de passe de la clé privée SSH
+
+
+
+
+
+
@@ -173,7 +203,29 @@
- Oscar utilisera le(s) rôle(s) {{ configuration.pcru_partner_roles.join(", ") }} des oragnisations de la fiche activité pour extraire le(s) partenaire(s) (les codes SIRET/EN doivent être renseignés).
+ Oscar utilisera le(s) rôle(s) {{ configuration.pcru_partner_roles.join(", ") }} des organisations de la fiche activité pour extraire le(s) partenaire(s) (les codes SIRET/EN doivent être renseignés).
+
+
+
+
+
+
+
+ Partenaire principal
+
+
+
+
+
+
+
+
+
+ Oscar utilisera le(s) rôle(s) {{ configuration.pcru_partenaire_principal_roles.join(", ") }} des organisations de la fiche activité pour extraire le partenaire principal.
@@ -198,7 +250,7 @@
- Oscar utilisera le(s) rôle(s) {{ configuration.pcru_unit_roles.join(", ") }} des oragnisations de la fiche activité pour extraire le code URM.
+ Oscar utilisera le(s) rôle(s) {{ configuration.pcru_unit_roles.join(", ") }} des organisations de la fiche activité pour extraire les codes UMR (labintel) et RNSR.
@@ -267,8 +319,11 @@ export default {
formData.append('port', this.configuration.pcru_port);
formData.append('user', this.configuration.pcru_user);
formData.append('pass', this.configuration.pcru_pass);
- formData.append('ssh', this.configuration.pcru_ssh);
+ formData.append('ssh_private', this.configuration.pcru_ssh_private);
+ formData.append('ssh_public', this.configuration.pcru_ssh_public);
+ formData.append('ssh_private_pass', this.configuration.pcru_ssh_private_pass);
formData.append('pcru_partner_roles', this.configuration.pcru_partner_roles);
+ formData.append('pcru_partenaire_principal_roles', this.configuration.pcru_partenaire_principal_roles);
formData.append('pcru_unit_roles', this.configuration.pcru_unit_roles);
formData.append('pcru_incharge_role', this.configuration.pcru_incharge_role);
formData.append('pcru_contract_type', this.configuration.pcru_contract_type);
diff --git a/install/pcru-contracts-types.json b/install/pcru-contracts-types.json
index 6662e5905085c9d6abb8fd9b6175d48b744654b9..3218c1ee64e910d3f7aa83e28fb51540af036858 100644
--- a/install/pcru-contracts-types.json
+++ b/install/pcru-contracts-types.json
@@ -5,16 +5,16 @@
"Autre",
"Avenant",
"Contrat de collaboration de recherche",
- "Contrat de coproduction d'œuvre audiovisuelle",
+ "Contrat de coprod d'oeuvre audiovisuelle",
"Contrat de mise à disposition de personnel",
+ "Contrat de prestations de service",
"Contrat équipe-conseil",
"Contrat plan état région",
- "Convention de GIS",
+ "Convention-cadre",
"Convention de maturation",
- "Convention de prestations de service",
"Convention de mise à dispo. de matériel",
"Convention de reversement",
- "Convention générale de partenariat",
+ "Convention GIS",
"Laboratoires communs",
"MOU",
"Subvention / Aide"
diff --git a/install/pcru-pole-competitivite.json b/install/pcru-pole-competitivite.json
index c5f0d805dea3fa8a6e593db7c42bb861fde98e3b..b40a343935521b53bd8183cbf782966e0c1e61dc 100644
--- a/install/pcru-pole-competitivite.json
+++ b/install/pcru-pole-competitivite.json
@@ -18,7 +18,7 @@
"Cosmetic Valley",
"Derbi",
"DREAM Eau & Milieu",
- "Eau",
+ "EAU",
"Elastopôle",
"Elopsys",
"EMC2",
@@ -43,6 +43,7 @@
"MicroTechniques",
"Minalogic",
"Mov'eo",
+ "Non-précisé",
"Nov@log",
"Nucléaire Bourgogne",
"Nutrition Santé Longévité",
diff --git a/install/pcru-sources-financement.json b/install/pcru-sources-financement.json
index 566799eba9b4cbdce9e5e0b6251d523f2b9b5451..b48ea6f0953b1ba8d9305ad2fbd48d96cc7d47d6 100644
--- a/install/pcru-sources-financement.json
+++ b/install/pcru-sources-financement.json
@@ -7,7 +7,7 @@
"Contrats de recherche industriels",
"Contrats sans financement",
"CPER",
- "Financements de l’innovation",
+ "Financements de l'innovation",
"Financements internationaux",
"Fondations, associations, mécénats",
"Fonds structurels européens",
diff --git a/install/pcru-types-etablissement.json b/install/pcru-types-etablissement.json
new file mode 100644
index 0000000000000000000000000000000000000000..6dca3ce9a8fd04e9ff20393f82a3d700ba35c622
--- /dev/null
+++ b/install/pcru-types-etablissement.json
@@ -0,0 +1,9 @@
+[
+ "Autre",
+ "CNRS",
+ "Enseignement supérieur",
+ "Privé étranger",
+ "Privé français",
+ "Public étranger",
+ "Public français"
+]
\ No newline at end of file
diff --git a/module/Oscar/config/module.config.php b/module/Oscar/config/module.config.php
index fd6074a022a75831ff29b85c7f3a4f4eb4b0a363..aab55b03223793f624dfdd5672693f2f0d5ad91b 100755
--- a/module/Oscar/config/module.config.php
+++ b/module/Oscar/config/module.config.php
@@ -80,6 +80,7 @@ return array(
'typeDocumentApi',
'numerotation',
'parameters',
+ 'pcruTypesEtablissement',
'polesCompetitivite',
'privileges2',
'planComptableLoaded',
@@ -175,8 +176,6 @@ return array(
'spentSynthesisActivity',
'personsAccessDeep',
'pcru',
- 'pcruInfos',
- "pcruList",
"traces",
"apiUi",
"timesheet",
@@ -371,6 +370,12 @@ return array(
'roles' => ['user'],
],
+ [
+ 'controller' => 'Pcru',
+ 'action' => ['api', 'pcruInformations', 'pcruTransmissions', 'download'],
+ 'roles' => ['user'],
+ ],
+
////////////////////////////////////////////////////////////////
// PERSON
///////////////////////////////////////////////////////////////
@@ -596,6 +601,8 @@ return array(
\Oscar\Service\OrganizationService::class => \Oscar\Service\OrganizationServiceFactory::class,
\Oscar\Service\OscarConfigurationService::class => \Oscar\Service\OscarConfigurationServiceFactory::class,
\Oscar\Service\OscarUserContext::class => \Oscar\Service\OscarUserContextFactory::class,
+ \Oscar\Service\PcruFtpService::class => \Oscar\Service\PcruFtpServiceFactory::class,
+ \Oscar\Service\PcruInformationsService::class => \Oscar\Service\PcruInformationsServiceFactory::class,
\Oscar\Service\PCRUService::class => \Oscar\Service\PCRUServiceFactory::class,
\Oscar\Service\PersonService::class => \Oscar\Service\PersonServiceFactory::class,
\Oscar\Service\ProjectService::class => \Oscar\Service\ProjectServiceFactory::class,
@@ -644,6 +651,7 @@ return array(
'TabDocument' => \Oscar\Controller\TabDocumentControllerFactory::class,
'Notification' => \Oscar\Controller\NotificationControllerFactory::class,
'Organization' => \Oscar\Controller\OrganizationControllerFactory::class,
+ 'Pcru' => \Oscar\Controller\PcruControllerFactory::class,
'Project' => \Oscar\Controller\ProjectControllerFactory::class,
'Public' => \Oscar\Controller\PublicControllerFactory::class,
'Timesheet' => \Oscar\Controller\TimesheetControllerFactory::class,
diff --git a/module/Oscar/config/routes.yml b/module/Oscar/config/routes.yml
index 95b396c264e2d46ed76b0730f87da502e96c65f8..3b0bc1b00c162bdc71c0808c1955a4892583b9ae 100644
--- a/module/Oscar/config/routes.yml
+++ b/module/Oscar/config/routes.yml
@@ -999,12 +999,13 @@ contract:
defaults:
action: api
- pcru-list:
+ pcru-transmissions:
type: segment
options:
- route: /transmission-pcru
+ route: /transmissions-pcru
defaults:
- action: pcruList
+ controller: Pcru
+ action: pcruTransmissions
gant:
type: segment
@@ -1035,12 +1036,13 @@ contract:
defaults:
action: show
- pcru-infos:
+ pcru-informations:
type: segment
options:
- route: /pcru-infos/:id
+ route: /pcru-informations/:id
defaults:
- action: pcruInfos
+ controller: Pcru
+ action: pcruInformations
estimated-spent:
type: segment
@@ -2184,6 +2186,14 @@ administration:
action: sourcesFinancement
may_terminate: true
+ # PCRU / CNRS - Types d'établissement
+ pcru-types-etablissement:
+ type: segment
+ options:
+ route: /pcru-types-etablissement
+ defaults:
+ action: pcruTypesEtablissement
+ may_terminate: true
activity-notes:
type: literal
@@ -2214,3 +2224,24 @@ activity-mots-cles:
route: /api
defaults:
action: api
+
+pcru:
+ type: literal
+ options:
+ route: /pcru
+ defaults:
+ controller: Pcru
+ may_terminate: false
+ child_routes:
+ api:
+ type: segment
+ options:
+ route: /api
+ defaults:
+ action: api
+ download:
+ type: segment
+ options:
+ route: /telecharger
+ defaults:
+ action: download
diff --git a/module/Oscar/src/Oscar/Command/OscarCheckConfigCommand.php b/module/Oscar/src/Oscar/Command/OscarCheckConfigCommand.php
index 383080c56c6b6c160e6abfb6275c06ddb6e19446..2defce82e798183e6214e120a435921a1dd4e19a 100644
--- a/module/Oscar/src/Oscar/Command/OscarCheckConfigCommand.php
+++ b/module/Oscar/src/Oscar/Command/OscarCheckConfigCommand.php
@@ -326,9 +326,6 @@ class OscarCheckConfigCommand extends OscarCommandAbstract
$pathDocuments = $config->getConfiguration('oscar.mailer.template');
$this->checkPath($io, $pathDocuments, "Modèle de mail > TEMPLATE");
-
- $pathDocuments = $config->getConfiguration('oscar.pcru.files_path');
- $this->checkPath($io, $pathDocuments, "Documents temporaires PCRU");
} catch (OscarException $e) {
$io->error(sprintf("Configuration manquante : %s", $e->getMessage()));
return self::FAILURE;
@@ -498,6 +495,130 @@ class OscarCheckConfigCommand extends OscarCommandAbstract
return self::FAILURE;
}
+ $io->section(" ### PCRU : ");
+
+ $pcru_enabled = $oscarConfig->getEditableConfKey('pcru_enabled', false);
+ if (!$pcru_enabled) {
+ $io->writeln("Le module PCRU n'est pas activé\n");
+ } else {
+
+ try {
+
+ $repertoireDistant = $oscarConfig->getConfiguration('pcru.repertoire_sftp');
+ $oscarConfig->getConfiguration('pcru.filename_contrats');
+ $oscarConfig->getConfiguration('pcru.filename_csv_ok');
+ $oscarConfig->getConfiguration('pcru.filename_retour_pcru_ok');
+ $oscarConfig->getConfiguration('pcru.filename_retour_pcru_ok_csv');
+ $oscarConfig->getConfiguration('pcru.filename_pdf_ok');
+
+ $pcru_host = $oscarConfig->getEditableConfKey('pcru_host');
+ if (mb_strlen(trim($pcru_host)) == 0) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Hôte (clé pcru_host)');
+ }
+ $pcru_port = $oscarConfig->getEditableConfKey('pcru_port');
+ if (mb_strlen(trim($pcru_port)) == 0) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Port (clé pcru_port)');
+ }
+ $pcru_user = $oscarConfig->getEditableConfKey('pcru_user');
+ if (mb_strlen(trim($pcru_user)) == 0) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Identifiant (clé pcru_user)');
+ }
+ $pcru_pass = $oscarConfig->getEditableConfKey('pcru_pass');
+ $has_pcru_pass = mb_strlen(trim($pcru_pass)) > 0;
+
+ $pcru_ssh_private = $oscarConfig->getEditableConfKey('pcru_ssh_private');
+ $has_pcru_ssh_private = mb_strlen(trim($pcru_ssh_private)) > 0;
+
+ $pcru_ssh_public = $oscarConfig->getEditableConfKey('pcru_ssh_public');
+ $has_pcru_ssh_public = mb_strlen(trim($pcru_ssh_public)) > 0;
+
+ if ($has_pcru_ssh_private && !$has_pcru_ssh_public) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé publique SSH (clé pcru_ssh_public). Si le nom de la clé privée est renseigné alors le nom de la clé publique doit l\'être aussi.');
+ }
+ if (!$has_pcru_ssh_private && $has_pcru_ssh_public) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé privée SSH (clé pcru_ssh_private). Si le nom de la clé publique est renseigné alors le nom de la clé privée doit l\'être aussi.');
+ }
+ if (!$has_pcru_ssh_private && !$has_pcru_pass) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Mot de passe (clé pcru_pass). Un mode d\'authentification doit être configuré : mot de passe utilisateur et/ou clé public/privée.');
+ }
+
+ $pcru_ssh_private_pass = trim($oscarConfig->getEditableConfKey('pcru_ssh_private_pass'));
+
+ $autoload_dir = realpath(__DIR__.'/../../../../../config/autoload/');
+ $ssh_private_key_file_path = $autoload_dir.'/' . $pcru_ssh_private;
+ if ($has_pcru_ssh_private){
+ if (!file_exists($ssh_private_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_private sensé contenir la clé privée SSH n'existe pas.");
+ } else if (!is_readable($ssh_private_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_private contenant la clé privée SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ }
+ }
+
+ $ssh_public_key_file_path = $autoload_dir.'/' . $pcru_ssh_public;
+ if ($has_pcru_ssh_public){
+ if (!file_exists($ssh_public_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_public sensé contenir la clé publique SSH n'existe pas.");
+ } else if (!is_readable($ssh_public_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_public contenant la clé publique SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ }
+ }
+
+ // Après avoir vérifié les clés de configuration, on regarde si le serveur SFTP est joignable.
+ $conn = ssh2_connect($pcru_host, $pcru_port);
+ if (!$conn) {
+ throw new OscarException("Impossible de se connecter au serveur SFTP PCRU : hôte non joignable. Hôte : $pcru_host, Port : $pcru_port");
+ }
+
+ // Connexion en utilisant une clé SSH
+ if ($has_pcru_ssh_private) {
+ if (!@ssh2_auth_pubkey_file($conn, $pcru_user,
+ $ssh_public_key_file_path,
+ $ssh_private_key_file_path, $pcru_ssh_private_pass)) {
+
+ if (!$has_pcru_pass) {
+ // Si la connexion échoue, et qu'on n'a pas de mot de passe utilisateur, on arrête là
+ ssh2_disconnect($conn);
+ throw new OscarException("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvaise clé SSH (privée, publique, ou mauvais mot de passe de la clé) ? Mot de passe utilisateur manquant ?");
+ }
+ // Car sinon, même si la connexion avec clé a échoué c'est peut-être simplement parcequ'il s'agit d'une connexion clé + mot de passe utilisateur, auquel cas la connexion devrait réussir lors de la prochaine étape, ssh2_auth_password
+ // Voir ce commentaire : https://www.php.net/manual/en/function.ssh2-auth-pubkey-file.php#126939
+ }
+ }
+
+ if ($has_pcru_pass) {
+ if (!ssh2_auth_password($conn, $pcru_user, $pcru_pass)) {
+ ssh2_disconnect($conn);
+ throw new OscarException("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvais utilisateur ou mot de passe ?");
+ }
+ }
+
+ $sftp = ssh2_sftp($conn);
+ if (!$sftp) {
+ ssh2_disconnect($conn);
+ throw new OscarException("Échec de l'initialisation du sous-système SFTP");
+ }
+
+ $dir = 'ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/';
+ $handle = opendir($dir);
+ if (!$handle) {
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw new OscarException("Impossible d'ouvrir le répertoire $repertoireDistant sur le serveur SFTP.");
+ }
+ closedir($handle);
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+
+ $io->writeln("Connexion au serveur SFTP PCRU OK\n");
+
+ } catch (\Exception $e) {
+ $io->error(
+ "PCRU FAIL, Impossible de se connecter au serveur SFTP PCRU : \n Erreur : " . $e
+ );
+ return self::FAILURE;
+ }
+ }
+
return self::SUCCESS;
}
diff --git a/module/Oscar/src/Oscar/Command/OscarPcruCreateFileActivityCommand.php b/module/Oscar/src/Oscar/Command/OscarPcruCreateFileActivityCommand.php
deleted file mode 100644
index 67cb4fd43a4b6bd7efa8d1545c40a1ea32276203..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Command/OscarPcruCreateFileActivityCommand.php
+++ /dev/null
@@ -1,67 +0,0 @@
-setDescription("Envoi des données PCRU.")
- ->addArgument('oscarid', InputOption::VALUE_REQUIRED, 'N° Oscar')
- ;
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $this->addOutputStyle($output);
-
- /** @var OscarConfigurationService $configuration */
- $configuration = $this->getServicemanager()->get(OscarConfigurationService::class);
-
- /** @var PCRUService $pcruService */
- $pcruService = $this->getServicemanager()->get(PCRUService::class);
-
- /** @var SymfonyStyle $io */
- $io = new SymfonyStyle($input, $output);
-
- // Récupération des données
- $numeroOscar = $input->getArgument('oscarid');
-
- if( !$numeroOscar ){
- $io->error("Vous devez renseigner un IDOSCAR");
-
- $activities = $pcruService->getActivitiesAvailable();
-
- $io->title("Informations PCRU disponibles");
- if( count($activities) == 0 ){
- $io->warning("Aucune activité n'a de données PCRU prête");
- }
- $out = [];
-
- }
-
- /** @var PCRUService $pcruService */
- $pcruService = $this->getServicemanager()->get(PCRUService::class);
-
- $fileContent = $pcruService->generateFileContentForActivity($numeroOscar, true);
-
- echo $fileContent;
-
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Command/OscarPcruGenerateDataActivityCommand.php b/module/Oscar/src/Oscar/Command/OscarPcruGenerateDataActivityCommand.php
deleted file mode 100644
index b519696a9008218fc637ae0af59e97cb3f06cf74..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Command/OscarPcruGenerateDataActivityCommand.php
+++ /dev/null
@@ -1,63 +0,0 @@
-setDescription("Génération des données PCRU pour l'envoi.")
- ->addOption('path', 'd', InputOption::VALUE_OPTIONAL, 'Dossier où créer les fichiers à transmettre (Utilise la dossier en configuration par défaut)')
- ->addOption('purge', 'p', InputOption::VALUE_OPTIONAL, "Une fois le transfert terminé, les fichiers sont supprimés localement", false);
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $this->addOutputStyle($output);
-// /** @var OscarConfigurationService $configuration */
-// $configuration = $this->getServicemanager()->get(OscarConfigurationService::class);
- /** @var ProjectGrantService $activityService */
- $activityService = $this->getServicemanager()->get(ProjectGrantService::class);
-
- /** @var PCRUService $pcruService */
- $pcruService = $activityService->getPCRUService();
-
- /** @var SymfonyStyle $io */
- $io = new SymfonyStyle($input, $output);
-
- $path = $input->getOption('path');
- if( !$path )
- $path = $pcruService->getOscarConfigurationService()->getPcruDirectoryForUpload();
-
-
- try {
- $io->title("Build files fr PCRU into $path");
- $pcruCsv = $pcruService->generatePcruFiles(null, $io);
- echo $pcruCsv->makeZip();
- } catch (\Exception $e) {
- $io->error($e->getMessage());
- }
-
- return 0;
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Command/OscarPcruSendCommand.php b/module/Oscar/src/Oscar/Command/OscarPcruProcessFtpCommand.php
similarity index 55%
rename from module/Oscar/src/Oscar/Command/OscarPcruSendCommand.php
rename to module/Oscar/src/Oscar/Command/OscarPcruProcessFtpCommand.php
index 0d7474eae0afc51feab61d8315b401f6f647446a..a92cba18bad4ca25c39c932316016c8fd92dae3e 100644
--- a/module/Oscar/src/Oscar/Command/OscarPcruSendCommand.php
+++ b/module/Oscar/src/Oscar/Command/OscarPcruProcessFtpCommand.php
@@ -3,27 +3,23 @@
namespace Oscar\Command;
-
+use Oscar\Exception\OscarPCRUException;
use Oscar\Service\OscarConfigurationService;
use Oscar\Service\OscarUserContext;
-use Oscar\Service\PCRUService;
-use Oscar\Service\PersonService;
+use Oscar\Service\PcruFtpService;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
-class OscarPcruSendCommand extends OscarCommandAbstract
+class OscarPcruProcessFtpCommand extends OscarCommandAbstract
{
- protected static $defaultName = 'pcru:send';
+ protected static $defaultName = 'pcru:process-ftp';
protected function configure()
{
- $this
- ->setDescription("Envoi des données PCRU.")
- ->addOption('oscarid', 'u', InputOption::VALUE_OPTIONAL, 'N° Oscar', '')
- ;
+ $this->setDescription("Délencher un échange FTP avec PCRU.");
}
protected function execute(InputInterface $input, OutputInterface $output)
@@ -33,16 +29,27 @@ class OscarPcruSendCommand extends OscarCommandAbstract
/** @var OscarConfigurationService $configuration */
$configuration = $this->getServicemanager()->get(OscarConfigurationService::class);
- /** @var PCRUService $pcruService */
- $pcruService = $this->getServicemanager()->get(PCRUService::class);
+ /** @var PcruFtpService $pcruFtpService */
+ $pcruFtpService = $this->getServicemanager()->get(PcruFtpService::class);
/** @var SymfonyStyle $io */
$io = new SymfonyStyle($input, $output);
if( !$configuration->getPcruEnabled() ){
$io->error("Le module PCRU n'est pas actif");
+ return self::FAILURE;
} else {
- var_dump($pcruService->upload());
+ $logs = [];
+ try {
+ $logs = $pcruFtpService->processPcruFtp();
+ } catch (OscarPCRUException $e) {
+ $logs = $e->details;
+ }
+ foreach ($logs as $log) {
+ $io->writeln($log);
+ }
}
+
+ return self::SUCCESS;
}
}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Command/OscarPcruUploadCommand.php b/module/Oscar/src/Oscar/Command/OscarPcruUploadCommand.php
deleted file mode 100644
index da9e4a2648cb48ea4b79b703ab622a2d2a7bb6bd..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Command/OscarPcruUploadCommand.php
+++ /dev/null
@@ -1,81 +0,0 @@
-setDescription("Envoi desdonnées PCRU.")
- ->addArgument('path', InputArgument::REQUIRED, 'Emplacement où créer les fichiers à transmettre')
- ->addOption('purge', 'p', InputOption::VALUE_OPTIONAL, "Une fois le transfert terminé, les fichiers sont supprimés localement", false);
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $this->addOutputStyle($output);
-// /** @var OscarConfigurationService $configuration */
-// $configuration = $this->getServicemanager()->get(OscarConfigurationService::class);
- /** @var ProjectGrantService $activityService */
- $activityService = $this->getServicemanager()->get(ProjectGrantService::class);
-
- /** @var PCRUService $pcruService */
- $pcruService = $activityService->getPCRUService();
-
- /** @var SymfonyStyle $io */
- $io = new SymfonyStyle($input, $output);
-
- $path = realpath($input->getArgument('path'));
-
- if (!$path) {
- $io->error("Cet emplacement n'est pas accessible");
- exit(1);
- }
-
- try {
- $pcruService->upload($path, $io);
-
-// $contactCsv = $path.DIRECTORY_SEPARATOR.'contrat.csv';
-// $io->title($contactCsv);
-// if (($handle = fopen($contactCsv, "r")) !== FALSE) {
-// $row = 0;
-// while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
-// if( $row == 0 ) {
-// $row++; continue;
-// }
-// // N° Oscar
-// $numOscar = $data[3];
-// $info = $pcruService->getInfosByNumOscar($numOscar);
-//
-//
-// }
-// fclose($handle);
-// }
-
- } catch (\Exception $e) {
- $io->error($e->getMessage());
- }
-
- return 0;
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Controller/AdministrationCheckConfigController.php b/module/Oscar/src/Oscar/Controller/AdministrationCheckConfigController.php
index bfc8b31600a3e00a3983c571b713bc06412c50ef..dfb02d63ac988c8bfd78d33084d6b423f6abb3cb 100644
--- a/module/Oscar/src/Oscar/Controller/AdministrationCheckConfigController.php
+++ b/module/Oscar/src/Oscar/Controller/AdministrationCheckConfigController.php
@@ -3,6 +3,7 @@
namespace Oscar\Controller;
use Doctrine\ORM\Tools\SchemaValidator;
+use Oscar\Exception\OscarException;
use Oscar\Provider\Privileges;
use Oscar\Service\administration\CheckConfigService;
use Oscar\Strategy\Search\ActivityElasticSearch;
@@ -150,8 +151,7 @@ class AdministrationCheckConfigController extends AbstractOscarController
$files = [['file' => 'oscar.paths.document_oscar'],
['file' => 'oscar.paths.document_admin_oscar'],
['file' => 'oscar.paths.timesheet_modele'],
- ['file' => 'oscar.mailer.template'],
- ['file' => 'oscar.pcru.files_path']];
+ ['file' => 'oscar.mailer.template']];
foreach ($files as & $file) {
$file_error = NULL;
@@ -223,7 +223,7 @@ class AdministrationCheckConfigController extends AbstractOscarController
$searchClass = $config->getConfiguration('oscar.strategy.activity.search_engine.class');
// ELASTIC SEARCH
- if ($searchClass == ActivityElasticSearch::class) {
+ if ($searchClass == 'Oscar\Strategy\Search\ElasticActivitySearch') {
$nodesUrl = $config->getConfiguration('oscar.strategy.activity.search_engine.params');
@@ -338,6 +338,120 @@ class AdministrationCheckConfigController extends AbstractOscarController
$ldap_error = "LDAP FAIL, Impossible de se connecter au serveur LDAP : \n Erreur : " . $e;
}
+ $pcru_error = NULL;
+ $pcru_enabled = $this->getOscarConfigurationService()->getEditableConfKey('pcru_enabled', false);
+ if ($pcru_enabled) {
+ try {
+ $repertoireDistant = $this->getOscarConfigurationService()->getConfiguration('pcru.repertoire_sftp');
+ $this->getOscarConfigurationService()->getConfiguration('pcru.filename_contrats');
+ $this->getOscarConfigurationService()->getConfiguration('pcru.filename_csv_ok');
+ $this->getOscarConfigurationService()->getConfiguration('pcru.filename_retour_pcru_ok');
+ $this->getOscarConfigurationService()->getConfiguration('pcru.filename_retour_pcru_ok_csv');
+ $this->getOscarConfigurationService()->getConfiguration('pcru.filename_pdf_ok');
+
+ $pcru_host = $this->getEditableConfKey('pcru_host');
+ if (mb_strlen(trim($pcru_host)) == 0) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Hôte (clé pcru_host)');
+ }
+ $pcru_port = $this->getEditableConfKey('pcru_port');
+ if (mb_strlen(trim($pcru_port)) == 0) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Port (clé pcru_port)');
+ }
+ $pcru_user = $this->getEditableConfKey('pcru_user');
+ if (mb_strlen(trim($pcru_user)) == 0) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Identifiant (clé pcru_user)');
+ }
+ $pcru_pass = $this->getEditableConfKey('pcru_pass');
+ $has_pcru_pass = mb_strlen(trim($pcru_pass)) > 0;
+
+ $pcru_ssh_private = $this->getEditableConfKey('pcru_ssh_private');
+ $has_pcru_ssh_private = mb_strlen(trim($pcru_ssh_private)) > 0;
+
+ $pcru_ssh_public = $this->getEditableConfKey('pcru_ssh_public');
+ $has_pcru_ssh_public = mb_strlen(trim($pcru_ssh_public)) > 0;
+
+ if ($has_pcru_ssh_private && !$has_pcru_ssh_public) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé publique SSH (clé pcru_ssh_public). Si le nom de la clé privée est renseigné alors le nom de la clé publique doit l\'être aussi.');
+ }
+ if (!$has_pcru_ssh_private && $has_pcru_ssh_public) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé privée SSH (clé pcru_ssh_private). Si le nom de la clé publique est renseigné alors le nom de la clé privée doit l\'être aussi.');
+ }
+ if (!$has_pcru_ssh_private && !$has_pcru_pass) {
+ throw new OscarException('Configuration manquante : PCRU > Accès FTP > Mot de passe (clé pcru_pass). Un mode d\'authentification doit être configuré : mot de passe utilisateur et/ou clé public/privée.');
+ }
+
+ $pcru_ssh_private_pass = trim($this->getEditableConfKey('pcru_ssh_private_pass'));
+
+ $autoload_dir = realpath(__DIR__.'/../../../../../config/autoload/');
+ $ssh_private_key_file_path = $autoload_dir.'/' . $pcru_ssh_private;
+ if ($has_pcru_ssh_private){
+ if (!file_exists($ssh_private_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_private sensé contenir la clé privée SSH n'existe pas.");
+ } else if (!is_readable($ssh_private_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_private contenant la clé privée SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ }
+ }
+
+ $ssh_public_key_file_path = $autoload_dir.'/' . $pcru_ssh_public;
+ if ($has_pcru_ssh_public){
+ if (!file_exists($ssh_public_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_public sensé contenir la clé publique SSH n'existe pas.");
+ } else if (!is_readable($ssh_public_key_file_path)) {
+ throw new OscarException("Le fichier config/autoload/$pcru_ssh_public contenant la clé publique SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ }
+ }
+
+ // Après avoir vérifié les clés de configuration, on regarde si le serveur SFTP est joignable.
+ $conn = ssh2_connect($pcru_host, $pcru_port);
+ if (!$conn) {
+ throw new OscarException("Impossible de se connecter au serveur SFTP PCRU : hôte non joignable. Hôte : $pcru_host, Port : $pcru_port");
+ }
+
+ // Connexion en utilisant une clé SSH
+ if ($has_pcru_ssh_private) {
+ if (!@ssh2_auth_pubkey_file($conn, $pcru_user,
+ $ssh_public_key_file_path,
+ $ssh_private_key_file_path, $pcru_ssh_private_pass)) {
+
+ if (!$has_pcru_pass) {
+ // Si la connexion échoue, et qu'on n'a pas de mot de passe utilisateur, on arrête là
+ ssh2_disconnect($conn);
+ throw new OscarException("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvaise clé SSH (privée, publique, ou mauvais mot de passe de la clé) ? Mot de passe utilisateur manquant ?");
+ }
+ // Car sinon, même si la connexion avec clé a échoué c'est peut-être simplement parcequ'il s'agit d'une connexion clé + mot de passe utilisateur, auquel cas la connexion devrait réussir lors de la prochaine étape, ssh2_auth_password
+ // Voir ce commentaire : https://www.php.net/manual/en/function.ssh2-auth-pubkey-file.php#126939
+ }
+ }
+
+ if ($has_pcru_pass) {
+ if (!ssh2_auth_password($conn, $pcru_user, $pcru_pass)) {
+ ssh2_disconnect($conn);
+ throw new OscarException("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvais utilisateur ou mot de passe ?");
+ }
+ }
+
+ $sftp = ssh2_sftp($conn);
+ if (!$sftp) {
+ ssh2_disconnect($conn);
+ throw new OscarException("Échec de l'initialisation du sous-système SFTP");
+ }
+
+ $dir = 'ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/';
+ $handle = opendir($dir);
+ if (!$handle) {
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw new OscarException("Impossible d'ouvrir le répertoire $repertoireDistant sur le serveur SFTP.");
+ }
+ closedir($handle);
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+
+ } catch (OscarException $e) {
+ $pcru_error = "PCRU FAIL: " . $e->getMessage();
+ }
+ }
+
return [
'build' => \Oscar\OscarVersion::getBuild(),
'config_path_real' => $configPathReal,
@@ -373,7 +487,9 @@ class AdministrationCheckConfigController extends AbstractOscarController
'worker_error' => $worker_error,
'worker_gearman_host' => $worker_gearman_host,
'worker_response' => $worker_response,
- 'ldap_error' => $ldap_error
+ 'ldap_error' => $ldap_error,
+ 'pcru_error' => $pcru_error,
+ 'pcru_enabled' => $pcru_enabled
];
}
diff --git a/module/Oscar/src/Oscar/Controller/AdministrationController.php b/module/Oscar/src/Oscar/Controller/AdministrationController.php
index 2e967aceb62127f6c0c388a9a557c3b9be512b62..75d89e9f618a8bf6dc3b0fbd45562d2acf0ec5f6 100644
--- a/module/Oscar/src/Oscar/Controller/AdministrationController.php
+++ b/module/Oscar/src/Oscar/Controller/AdministrationController.php
@@ -678,6 +678,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
$this->getPCRUService()->updateTypeContrat();
$this->getPCRUService()->updatePoleCompetitivite();
$this->getPCRUService()->updateSourcesFinancement();
+ $this->getPCRUService()->updatePcruTypesEtablissement();
$this->flashMessenger()->addSuccessMessage('Les référentiels PCRU ont été mis à jour');
$this->redirect()->toRoute('administration/accueil');
return [];
@@ -1874,7 +1875,9 @@ class AdministrationController extends AbstractOscarController implements UsePro
),
'pcru_user' => $this->getOscarConfigurationService()->getEditableConfKey('pcru_user', ''),
'pcru_pass' => $this->getOscarConfigurationService()->getEditableConfKey('pcru_pass', ''),
- 'pcru_ssh' => $this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh', ''),
+ 'pcru_ssh_private' => $this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh_private', ''),
+ 'pcru_ssh_public' => $this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh_public', ''),
+ 'pcru_ssh_private_pass' => $this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh_private_pass', ''),
'pcru_port' => $this->getOscarConfigurationService()->getEditableConfKey(
'pcru_port',
31000
@@ -1883,6 +1886,7 @@ class AdministrationController extends AbstractOscarController implements UsePro
// Conf
'pcru_incharge_role' => $this->getOscarConfigurationService()->getPcruInChargeRole(),
'pcru_partner_roles' => $this->getOscarConfigurationService()->getPcruPartnerRoles(),
+ 'pcru_partenaire_principal_roles' => $this->getOscarConfigurationService()->getPcruPartenairePrincipalRoles(),
'pcru_unit_roles' => $this->getOscarConfigurationService()->getPcruUnitRoles(),
'pcru_contract_type' => $this->getOscarConfigurationService()->getPcruContractType(),
@@ -1900,21 +1904,34 @@ class AdministrationController extends AbstractOscarController implements UsePro
if ($this->getRequest()->isPost()) {
$this->getLoggerService()->info("Modification de la configuration PCRU");
$data = [
- 'pcru_enabled' => $this->params()->fromPost('pcru_enabled') == 'true' ? true : false,
- 'pcru_host' => $this->params()->fromPost('host'),
- 'pcru_port' => $this->params()->fromPost('port'),
- 'pcru_user' => $this->params()->fromPost('user'),
- 'pcru_pass' => $this->params()->fromPost('pass'),
- 'pcru_ssh' => $this->params()->fromPost('ssh'),
+ 'pcru_enabled' => $this->params()->fromPost('pcru_enabled') == 'true' ? true : false,
+ 'pcru_host' => $this->params()->fromPost('host'),
+ 'pcru_port' => $this->params()->fromPost('port'),
+ 'pcru_user' => $this->params()->fromPost('user'),
+ 'pcru_pass' => $this->params()->fromPost('pass'),
+ 'pcru_ssh_private' => $this->params()->fromPost('ssh_private'),
+ 'pcru_ssh_public' => $this->params()->fromPost('ssh_public'),
+ 'pcru_ssh_private_pass' => $this->params()->fromPost('ssh_private_pass'),
];
$partnerRolesPosted = $this->params()->fromPost('pcru_partner_roles', []);
+ $partenairePrincipalRolesPosted = $this->params()->fromPost('pcru_partenaire_principal_roles', []);
$unitRolesPosted = $this->params()->fromPost('pcru_unit_roles', []);
$inchargeRolePosted = $this->params()->fromPost('pcru_incharge_role', '');
$contractType = $this->params()->fromPost('pcru_contract_type', '');
- $data['pcru_partner_roles'] = explode(',', $partnerRolesPosted);
- $data['pcru_unit_roles'] = explode(',', $unitRolesPosted);
+ $data['pcru_partner_roles'] = [];
+ if (mb_strlen(trim($partnerRolesPosted)) > 0) {
+ $data['pcru_partner_roles'] = explode(',', $partnerRolesPosted);
+ }
+ $data['pcru_partenaire_principal_roles'] = [];
+ if (mb_strlen(trim($partenairePrincipalRolesPosted)) > 0) {
+ $data['pcru_partenaire_principal_roles'] = explode(',', $partenairePrincipalRolesPosted);
+ }
+ $data['pcru_unit_roles'] = [];
+ if (mb_strlen(trim($unitRolesPosted)) > 0) {
+ $data['pcru_unit_roles'] = explode(',', $unitRolesPosted);
+ }
$data['pcru_incharge_role'] = $inchargeRolePosted;
$data['pcru_incharge_role'] = $inchargeRolePosted;
$data['pcru_contract_type'] = $contractType;
@@ -1963,4 +1980,20 @@ class AdministrationController extends AbstractOscarController implements UsePro
'datas' => $this->getProjectGrantService()->getPcruSourceFinancement()
];
}
+
+ /**
+ * Administration des types d'établissement PCRU
+ *
+ * @return array
+ */
+ public function pcruTypesEtablissementAction()
+ {
+ if ($this->params()->fromQuery('action') == 'update') {
+ $this->getPcruService()->updatePcruTypesEtablissement();
+ return $this->redirect()->toRoute('administration/pcru-types-etablissement');
+ }
+ return [
+ 'datas' => $this->getProjectGrantService()->getPcruTypesEtablissement()
+ ];
+ }
}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Controller/OrganizationController.php b/module/Oscar/src/Oscar/Controller/OrganizationController.php
index 2f6b265347b1ebc69198c0622fb73c8eaee979a2..44b1f36a0d6d708f2ac15189865b8b5f5e01a734 100644
--- a/module/Oscar/src/Oscar/Controller/OrganizationController.php
+++ b/module/Oscar/src/Oscar/Controller/OrganizationController.php
@@ -496,7 +496,8 @@ class OrganizationController extends AbstractOscarController implements UseOrgan
{
$form = new OrganizationIdentificationForm(
$this->getOrganizationService(),
- $this->getOrganizationService()->getOrganizationTypesObject()
+ $this->getOrganizationService()->getOrganizationTypesObject(),
+ $this->getOrganizationService()->getOrganizationTypesEtablissementPcruObject()
);
$form->configureRequired($this->getOscarConfigurationService()->getRequiredOrganization());
$entity = new Organization();
@@ -882,7 +883,8 @@ class OrganizationController extends AbstractOscarController implements UseOrgan
$form = new OrganizationIdentificationForm(
$this->getOrganizationService(),
- $this->getOrganizationService()->getOrganizationTypesObject()
+ $this->getOrganizationService()->getOrganizationTypesObject(),
+ $this->getOrganizationService()->getOrganizationTypesEtablissementPcruObject()
);
$form->configureRequired($this->getOscarConfigurationService()->getRequiredOrganization());
$form->init();
diff --git a/module/Oscar/src/Oscar/Controller/PcruController.php b/module/Oscar/src/Oscar/Controller/PcruController.php
new file mode 100644
index 0000000000000000000000000000000000000000..bde00fa6d34961d2885d422b7709ca472e1b49e9
--- /dev/null
+++ b/module/Oscar/src/Oscar/Controller/PcruController.php
@@ -0,0 +1,657 @@
+pcruFtpService;
+ }
+
+ /**
+ * @param PcruFtpService $pcruFtpService
+ */
+ public function setPcruFtpService(PcruFtpService $pcruFtpService): void
+ {
+ $this->pcruFtpService = $pcruFtpService;
+ }
+
+ /** @var PcruInformationsService */
+ private $pcruInformationsService;
+
+ /**
+ * @return PcruInformationsService
+ */
+ public function getPcruInformationsService(): PcruInformationsService
+ {
+ return $this->pcruInformationsService;
+ }
+
+ /**
+ * @param PcruInformationsService $pcruInformationsService
+ */
+ public function setPcruInformationsService(PcruInformationsService $pcruInformationsService): void
+ {
+ $this->pcruInformationsService = $pcruInformationsService;
+ }
+
+ /**
+ * @return OscarConfigurationService
+ */
+ public function getOscarConfigurationService(): OscarConfigurationService
+ {
+ return $this->oscarConfigurationService;
+ }
+
+ /**
+ * @param OscarConfigurationService $oscarConfigurationService
+ */
+ public function setOscarConfigurationService(OscarConfigurationService $oscarConfigurationService): void
+ {
+ $this->oscarConfigurationService = $oscarConfigurationService;
+ }
+
+ public function apiAction()
+ {
+ try {
+
+ if ($this->getRequest()->getMethod() == "GET") {
+ $action = $this->getRequest()->getQuery('action');
+
+ if ($action == "transmissions-pcru") {
+ $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PCRU_LIST);
+
+ $infos = [];
+
+ $sql = "
+ select
+ a.id as activityId,
+ a.label,
+ a.description,
+ pcru.id as activitypcruinformationsid,
+ pcru.status,
+ pcru.dateupdated,
+ pcru.datepremierdepot,
+ pcru.dateenvoifichiercontrat
+ from
+ activitypcruinformations pcru
+ left join
+ activity a on a.id = pcru.activity_id
+ where
+ pcru.envoiactif is true
+ and (pcru.dateupdated > now() - interval '6' month
+ or pcru.status not in ('retour-pcru-ok', 'retour-pcru-ok-mais-fichier-manquant')
+ or dateenvoifichiercontrat is null)
+ order by
+ pcru.dateupdated desc;
+ ";
+
+ $infos = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql)->fetchAllAssociative();
+
+
+ foreach ($infos as &$info) {
+ $info['activityUrl'] = $this->url()->fromRoute('contract/show', ['id' => $info['activityid']]);
+ $info['activityPcruUrl'] = $this->url()->fromRoute('contract/pcru-informations', ['id' => $info['activityid']]);
+
+
+ $info['enErreur'] = false;
+ if ($info['status'] === ActivityPcruInformations::STATUS_JAMAIS_ENVOYEE) {
+
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $info['activityid']));
+
+ $pcruInformationComplete = $this->pcruInformationsService->getPcruInformationsForActivity($activity, $this->url());
+ $info['enErreur'] = $pcruInformationComplete->enErreur;
+ $info['fichierContratManquant'] = $pcruInformationComplete->avertissementFichierContratManquant != NULL;
+ }
+
+ $dateupdated = new \DateTime($info['dateupdated']);
+ $dateupdated->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $info['dateupdated'] = $dateupdated->format(\DateTime::ATOM);
+
+ if ($info['datepremierdepot'] != NULL) {
+ $datepremierdepot = new \DateTime($info['datepremierdepot']);
+ $datepremierdepot->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $info['datepremierdepot'] = $datepremierdepot->format(\DateTime::ATOM);
+ }
+
+ if ($info['dateenvoifichiercontrat'] != NULL) {
+ $dateenvoifichiercontrat = new \DateTime($info['dateenvoifichiercontrat']);
+ $dateenvoifichiercontrat->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $info['dateenvoifichiercontrat'] = $dateenvoifichiercontrat->format(\DateTime::ATOM);
+ }
+ }
+
+ $sql = "
+ select
+ id,
+ createdat,
+ titre,
+ status,
+ details
+ from
+ pcruftplog
+ where
+ createdat > now() - interval '6' month
+ order by
+ createdat DESC;
+ ";
+ $stm = $this->getEntityManager()->getConnection()->prepare($sql);
+ $logs = $stm->executeQuery()->fetchAllAssociative();
+
+ foreach ($logs as &$log) {
+ $createdat = new \DateTime($log['createdat']);
+ $createdat->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $info['createdat'] = $createdat->format(\DateTime::ATOM);
+ }
+
+ $response = new JsonModel();
+ $response->setVariables(['transmissionsPcru' => $infos, 'logs' => $logs]);
+ return $response;
+ }
+
+ } else if ($this->getRequest()->getMethod() == "POST") {
+ $action_json = json_decode($this->getRequest()->getContent());
+
+ if ($action_json->action == "enregistrer") {
+ $this->getOscarUserContextService()->check(Privileges::ACTIVITY_PCRU);
+
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $action_json->activityId));
+ if (!$activity) {
+ throw new \Exception("L'activité demandée n'existe pas. Veuillez actualiser la page.");
+ }
+
+ $pcruInformations = $activity->getPcruInformations();
+ if ($pcruInformations === NULL) {
+ $pcruInformations = new ActivityPcruInformations();
+ $pcruInformations->setActivity($activity);
+ } else if ($pcruInformations->getStatus() !== ActivityPcruInformations::STATUS_JAMAIS_ENVOYEE) {
+ throw new \Exception("L'activité a déjà été envoyée à PCRU, il n'est plus possible de modifier ces informations.");
+ }
+
+ $a = $action_json->activityPcruInformations;
+ $pcruInformations->setUtiliserObjetParDefaut($a->utiliserObjetParDefaut);
+ $pcruInformations->setObjet($a->objet);
+ $pcruInformations->setUtiliserLabintelParDefaut($a->utiliserLabintelParDefaut);
+ $pcruInformations->setLabintel($a->labintel);
+ $pcruInformations->setUtiliserRnsrParDefaut($a->utiliserRnsrParDefaut);
+ $pcruInformations->setRnsr($a->rnsr);
+ $pcruInformations->setUtiliserSigleParDefaut($a->utiliserSigleParDefaut);
+ $pcruInformations->setSigle($a->sigle);
+ $pcruInformations->setUtiliserNumContratParDefaut($a->utiliserNumContratParDefaut);
+ $pcruInformations->setNumContrat($a->numContrat);
+ $pcruInformations->setEquipe($a->equipe);
+ if ($a->envoiActif && !$pcruInformations->isEnvoiActif()) {
+ $this->getOscarUserContextService()->check(Privileges::ACTIVITY_PCRU_ACTIVATE);
+ $pcruInformations->dateActivationEnvoi = new \DateTime();
+ }
+ $pcruInformations->setEnvoiActif($a->envoiActif);
+ $pcruInformations->setUtiliserTypeContratParDefaut($a->utiliserTypeContratParDefaut);
+ if ($a->pcruTypeContractId) {
+ $pcruTypeContract = $this->getEntityManager()
+ ->getRepository(PcruTypeContract::class)
+ ->findOneBy(array('id' => $a->pcruTypeContractId));
+ if (!$pcruTypeContract) {
+ throw new \Exception("Le type de contrat PCRU demandé n'existe pas. Veuillez actualiser la page.");
+ }
+ $pcruInformations->setPcruTypeContract($pcruTypeContract);
+ } else {
+ $pcruInformations->setPcruTypeContract(NULL);
+ }
+ $pcruInformations->setUtiliserAcronymeParDefaut($a->utiliserAcronymeParDefaut);
+ $pcruInformations->setAcronyme($a->acronyme);
+ $pcruInformations->setContratsAssocies($a->contratsAssocies);
+ $pcruInformations->setUtiliserResponsableScientifiqueParDefaut($a->utiliserResponsableScientifiqueParDefaut);
+ $pcruInformations->setResponsableScientifique($a->responsableScientifique);
+ $pcruInformations->setEmployeurResponsableScientifique($a->employeurResponsableScientifique);
+ $pcruInformations->setCoordinateurConsortium(NULL);
+ if ($a->coordinateurConsortium) {
+ if ($a->coordinateurConsortium == "true") {
+ $pcruInformations->setCoordinateurConsortium(true);
+ } else if ($a->coordinateurConsortium == "false") {
+ $pcruInformations->setCoordinateurConsortium(false);
+ }
+ }
+ $pcruInformations->setUtiliserPartenairesParDefaut($a->utiliserPartenairesParDefaut);
+ $pcruInformations->setPartenaires($a->partenaires);
+ $pcruInformations->setUtiliserPartenairePrincipalParDefaut($a->utiliserPartenairePrincipalParDefaut);
+ $pcruInformations->setPartenairePrincipal($a->partenairePrincipal);
+ $pcruInformations->setUtiliserIdPartenairePrincipalParDefaut($a->utiliserIdPartenairePrincipalParDefaut);
+ $pcruInformations->setIdPartenairePrincipal($a->idPartenairePrincipal);
+ $pcruInformations->setLieuExecution($a->lieuExecution);
+ $pcruInformations->setUtiliserDateDerniereSignatureParDefaut($a->utiliserDateDerniereSignatureParDefaut);
+ $pcruInformations->setDateDerniereSignature($a->dateDerniereSignature);
+ $pcruInformations->setDuree(NULL);
+ if ($a->duree) {
+ $pcruInformations->setDuree($a->duree);
+ }
+ $pcruInformations->setUtiliserDateDebutParDefaut($a->utiliserDateDebutParDefaut);
+ $pcruInformations->setDateDebut($a->dateDebut);
+ $pcruInformations->setUtiliserDateFinParDefaut($a->utiliserDateFinParDefaut);
+ $pcruInformations->setDateFin($a->dateFin);
+ $pcruInformations->setMontantPercuUnite(NULL);
+ if ($a->montantPercuUnite || $a->montantPercuUnite === 0) {
+ $pcruInformations->setMontantPercuUnite($a->montantPercuUnite);
+ }
+ $pcruInformations->setContributionFinanceur(NULL);
+ if ($a->contributionFinanceur || $a->contributionFinanceur === 0) {
+ $pcruInformations->setContributionFinanceur($a->contributionFinanceur);
+ }
+ $pcruInformations->setUtiliserMontantTotalParDefaut($a->utiliserMontantTotalParDefaut);
+ $pcruInformations->setMontantTotal(NULL);
+ if ($a->montantTotal || $a->montantTotal === 0) {
+ $pcruInformations->setMontantTotal($a->montantTotal);
+ }
+ $pcruInformations->setCommentaires($a->commentaires);
+ $pcruInformations->setPia(NULL);
+ if ($a->pia) {
+ if ($a->pia == "true") {
+ $pcruInformations->setPia(true);
+ } else if ($a->pia == "false") {
+ $pcruInformations->setPia(false);
+ }
+ }
+ $pcruInformations->setUtiliserReferenceParDefaut($a->utiliserReferenceParDefaut);
+ $pcruInformations->setReference($a->reference);
+ $pcruInformations->setAccordCadre(NULL);
+ if ($a->accordCadre) {
+ if ($a->accordCadre == "true") {
+ $pcruInformations->setAccordCadre(true);
+ } else if ($a->accordCadre == "false") {
+ $pcruInformations->setAccordCadre(false);
+ }
+ }
+ $pcruInformations->setCifre(false);
+ if ($a->cifre == "true") {
+ $pcruInformations->setCifre(true);
+ }
+ $pcruInformations->setChaireIndustrielle(NULL);
+ if ($a->chaireIndustrielle) {
+ if ($a->chaireIndustrielle == "true") {
+ $pcruInformations->setChaireIndustrielle(true);
+ } else if ($a->chaireIndustrielle == "false") {
+ $pcruInformations->setChaireIndustrielle(false);
+ }
+ }
+ $pcruInformations->setPresencePartenaireIndustriel(NULL);
+ if ($a->presencePartenaireIndustriel) {
+ if ($a->presencePartenaireIndustriel == "true") {
+ $pcruInformations->setPresencePartenaireIndustriel(true);
+ } else if ($a->presencePartenaireIndustriel == "false") {
+ $pcruInformations->setPresencePartenaireIndustriel(false);
+ }
+ }
+
+ $pcruInformations->setDateUpdated(new \DateTime());
+ $this->getEntityManager()->persist($pcruInformations);
+ $this->getEntityManager()->flush();
+ $this->getEntityManager()->refresh($activity);
+
+ $response = new JsonModel();
+ $response->setVariables(
+ [
+ 'pcru' => $this->pcruInformationsService->getPcruInformationsForActivity($activity, $this->url())
+ ]);
+ return $response;
+
+ } else if ($action_json->action == "transferer") {
+
+ $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PCRU_UPLOAD);
+
+ $logs = $this->getPcruFtpService()->processPcruFtp();
+
+ $response = new JsonModel();
+ $response->setVariables(['logs' => $logs]);
+ return $response;
+ }
+ }
+
+ $response = new Response();
+ $response->setStatusCode(Response::STATUS_CODE_405);
+ $response->setContent("Method Not Allowed.");
+ return $response;
+
+ } catch (OscarPCRUException $e) {
+ $response = new Response();
+ $response->setStatusCode(Response::STATUS_CODE_500);
+ header('Content-type: application/json; charset=utf-8');
+ $responseJson = new JsonModel();
+ $responseJson->setVariables(['logs' => $e->details]);
+ $response->setContent($responseJson->serialize());
+ return $response;
+ } catch (Throwable $e) {
+ $response = new Response();
+ $response->setStatusCode(Response::STATUS_CODE_500);
+ $response->setContent($e->getMessage());
+ return $response;
+ }
+ }
+
+ public function pcruInformationsAction() {
+ $this->getOscarUserContextService()->check(Privileges::ACTIVITY_PCRU);
+ if (!$this->getOscarConfigurationService()->getPcruEnabled()) {
+ throw new OscarException("Le module PCRU n'est pas activé");
+ }
+ return [
+ 'urlActivity' => $this->url()->fromRoute('contract/show', ['id' => $this->params()->fromRoute('id')]),
+ 'urlPcruApi' => $this->url()->fromRoute('pcru/api')
+ ];
+ }
+
+ public function pcruTransmissionsAction() {
+ $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PCRU_LIST);
+ if (!$this->getOscarConfigurationService()->getPcruEnabled()) {
+ throw new OscarException("Le module PCRU n'est pas activé");
+ }
+ return [
+ 'urlPcruApi' => $this->url()->fromRoute('pcru/api')
+ ];
+ }
+
+ public function downloadAction()
+ {
+ $status = $this->getRequest()->getQuery('status');
+
+ $nomFichierContrats = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_contrats');
+ $nomFichierPartenaires = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_partenaires');
+
+ $tmpNum = uniqid();
+
+ $activitesAEnvoyer = [];
+ if ($status === ActivityPcruInformations::STATUS_JAMAIS_ENVOYEE) {
+ $sql = "
+ select
+ a.id as activityid,
+ pcru.id AS activitypcruinformationsId
+ from
+ activitypcruinformations pcru
+ left join
+ activity a on a.id = pcru.activity_id
+ where
+ pcru.envoiactif is TRUE
+ AND pcru.status = ?
+ order by
+ pcru.dateupdated DESC;
+ ";
+ $activitesAEnvoyer = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql,
+ [ActivityPcruInformations::STATUS_JAMAIS_ENVOYEE],
+ ["string"])->fetchAllAssociative();
+ } else {
+ $sql = "
+ select
+ a.id as activityid,
+ pcru.id AS activitypcruinformationsId
+ from
+ activitypcruinformations pcru
+ left join
+ activity a on a.id = pcru.activity_id
+ where
+ pcru.envoiactif is TRUE
+ order by
+ pcru.dateupdated DESC;
+ ";
+ $activitesAEnvoyer = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql)->fetchAllAssociative();
+ }
+
+ if (count($activitesAEnvoyer) === 0) {
+ throw new OscarPCRUException("Aucune activité à envoyer");
+ }
+
+ $activitesAEnvoyerValides = [];
+ foreach ($activitesAEnvoyer as $a) {
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $a['activityid']));
+
+ $pcruInformationComplete = $this->pcruInformationsService->getPcruInformationsForActivity($activity);
+ if (!$pcruInformationComplete->enErreur) {
+ $a['pcruInformation'] = $pcruInformationComplete->pcruInformation;
+ $a['cheminFichierContrat'] = $pcruInformationComplete->cheminFichierContrat;
+ $activitesAEnvoyerValides[] = $a;
+ }
+ }
+
+ if (count($activitesAEnvoyerValides) === 0) {
+ throw new OscarPCRUException("Aucune activité valide à envoyer");
+ }
+
+ $contratsFilePath = '/tmp/' . $tmpNum . '-' . $nomFichierContrats;
+ $stream = fopen($contratsFilePath, 'w');
+ if (!$stream) {
+ throw new OscarPCRUException("Impossible d'ouvrir le fichier " . $contratsFilePath . " en écriture.");
+ }
+
+ // Écriture du BOM pour que PCRU comprenne que c'est un fichier encodé en UTF-8
+ $r = fwrite($stream, pack("CCC",0xef,0xbb,0xbf));
+ if (!$r) {
+ throw new OscarPCRUException("Impossible d'écrire le BOM dans le fichier " . $contratsFilePath);
+ }
+
+ $r = fputcsv($stream, ['Objet', 'CodeLabintelUnite', 'CodeRNSRUnite', 'SigleUnite', 'ReferenceGestionnaire', 'Equipe', 'TypeContrat', 'Acronyme', 'ContratsAssocies', 'NomRespScientifique', 'EmployeurRespScientifique', 'RespScientifiqueEstCoordonnateur', 'Partenaires', 'PartenairePrincipal', 'IdPartenairePrincipal', 'SourceFinancement', 'LieuExecution', 'DateDerniereSignature', 'Duree', 'DateDebut', 'DateFin', 'MontantPercuUnite', 'ContributionFinanceur', 'MontantTotal', 'ValideParPoleCompetitivite', 'PoleCompetitivite', 'Commentaires', 'PIA', 'ReferenceNonGestionnaire', 'AccordCadre', 'Cifre', 'ChaireIndustrielle', 'PresencePartenaireIndustriel'], ';');
+ if (!$r) {
+ throw new OscarPCRUException("Impossible d'écrire dans le fichier " . $contratsFilePath);
+ }
+
+ foreach ($activitesAEnvoyerValides as $a) {
+ $line = [];
+ $line[] = $a['pcruInformation']->objet;
+ $line[] = $a['pcruInformation']->labintel;
+ $line[] = $a['pcruInformation']->rnsr;
+ $line[] = $a['pcruInformation']->sigle;
+ $line[] = $a['pcruInformation']->numContrat;
+ $line[] = $a['pcruInformation']->equipe;
+ $line[] = $a['pcruInformation']->typeContrat;
+ $line[] = $a['pcruInformation']->acronyme;
+ $line[] = $a['pcruInformation']->contratsAssocies;
+ $line[] = $a['pcruInformation']->responsableScientifique;
+ $line[] = $a['pcruInformation']->employeurResponsableScientifique;
+ $line[] = $a['pcruInformation']->coordinateurConsortium === NULL ? NULL : ($a['pcruInformation']->coordinateurConsortium ? "True" : "False");
+ $line[] = $a['pcruInformation']->partenaires;
+ $line[] = $a['pcruInformation']->partenairePrincipal;
+ $line[] = preg_replace('/\s+/', '', $a['pcruInformation']->idPartenairePrincipal);
+ $line[] = $a['pcruInformation']->sourceFinancement;
+ $line[] = $a['pcruInformation']->lieuExecution;
+ $line[] = $a['pcruInformation']->dateDerniereSignature;
+ $line[] = $a['pcruInformation']->duree;
+ $line[] = $a['pcruInformation']->dateDebut;
+ $line[] = $a['pcruInformation']->dateFin;
+ $line[] = $a['pcruInformation']->montantPercuUnite;
+ $line[] = $a['pcruInformation']->contributionFinanceur;
+ $line[] = $a['pcruInformation']->montantTotal;
+ $line[] = $a['pcruInformation']->validePoleCompetitivite ? 'True' : 'False';
+ $line[] = $a['pcruInformation']->poleCompetitivite;
+ $line[] = $a['pcruInformation']->commentaires;
+ $line[] = $a['pcruInformation']->pia === NULL ? NULL : ($a['pcruInformation']->pia ? "True" : "False");
+ $line[] = $a['pcruInformation']->reference;
+ $line[] = $a['pcruInformation']->accordCadre === NULL ? NULL : ($a['pcruInformation']->accordCadre ? "True" : "False");
+ $line[] = $a['pcruInformation']->cifre ? 'True' : 'False';
+ $line[] = $a['pcruInformation']->chaireIndustrielle === NULL ? NULL : ($a['pcruInformation']->chaireIndustrielle ? "True" : "False");
+ $line[] = $a['pcruInformation']->presencePartenaireIndustriel === NULL ? NULL : ($a['pcruInformation']->presencePartenaireIndustriel ? "True" : "False");
+ $r = fputcsv($stream, $line, ';');
+ if (!$r) {
+ throw new OscarPCRUException("Impossible d'écrire dans le fichier " . $contratsFilePath);
+ }
+ }
+
+ $r = fclose($stream);
+ if (!$r) {
+ throw new OscarPCRUException("Impossible de fermer le fichier " . $contratsFilePath);
+ }
+
+ $partenairesAEnvoyer = [];
+ foreach ($activitesAEnvoyerValides as $a) {
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $a['activityid']));
+
+ $pcruPartenairePrincipalRoles = $this->getOscarConfigurationService()->getPcruPartenairePrincipalRoles();
+ if ($pcruPartenairePrincipalRoles != NULL && count($pcruPartenairePrincipalRoles) > 0) {
+ $partenaires = $activity->getOrganizationsWithOneRoleIn($pcruPartenairePrincipalRoles);
+ if (count($partenaires) == 1) {
+
+ $partenaire = $partenaires[0];
+ $avertissements = [];
+ if (mb_strlen(trim($partenaire->getShortName())) == 0) {
+ $avertissements[] = "Le nom court doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getFullName())) == 0) {
+ $avertissements[] = "Le nom complet doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getCodePcru())) == 0) {
+ $avertissements[] = "Le numéro SIRET, la TVA Intracommunautaire ou le DUNS doit être renseigné";
+ }
+ if ($partenaire->getTypeEtablissementPcruObj() == NULL) {
+ $avertissements[] = "Le type d'établissement PCRU doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getStreet1())) == 0) {
+ $avertissements[] = "L'adresse (rue 1) doit être renseignée";
+ }
+ if (mb_strlen(trim($partenaire->getZipCode())) == 0) {
+ $avertissements[] = "Le code postal doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getCity())) == 0) {
+ $avertissements[] = "La ville doit être renseignée";
+ }
+ if (mb_strlen(trim($partenaire->getCountry())) == 0) {
+ $avertissements[] = "Le pays doit être renseigné";
+ }
+ if (count($avertissements) == 0) {
+ $dejaDansLaListe = false;
+ foreach ($partenairesAEnvoyer as $p) {
+ if ($p->getId() == $partenaire->getId()) {
+ $dejaDansLaListe = true;
+ break;
+ }
+ }
+ if (!$dejaDansLaListe) {
+ $partenairesAEnvoyer[] = $partenaire;
+ }
+ }
+ }
+ }
+ }
+
+ $partenairesFilePath = '/tmp/' . $tmpNum . '-' . $nomFichierPartenaires;
+ if (count($partenairesAEnvoyer) > 0) {
+ $stream = fopen($partenairesFilePath, 'w');
+ if (!$stream) {
+ throw new OscarPCRUException("Impossible d'ouvrir le fichier " . $partenairesFilePath);
+ }
+
+ // Écriture du BOM pour que PCRU comprenne que c'est un fichier encodé en UTF-8
+ $r = fwrite($stream, pack("CCC",0xef,0xbb,0xbf));
+ if (!$r) {
+ throw new OscarPCRUException("Impossible d'écrire le BOM dans le fichier " . $partenairesFilePath);
+ }
+
+ $r = fputcsv($stream, ['LibelleCourt', 'LibelleLong', 'Siren', 'Siret', 'TvaIntra', 'Duns', 'TypeEtablissement', 'Adresse', 'CodePostal', 'Ville', 'Pays'], ';');
+ if (!$r) {
+ throw new OscarPCRUException("Impossible d'écrire dans le fichier " . $partenairesFilePath);
+ }
+
+ foreach ($partenairesAEnvoyer as $p) {
+ $line = [];
+ $line[] = $p->getShortName();
+ $line[] = $p->getFullName();
+ $line[] = "";
+ $line[] = preg_replace('/\s+/', '', $p->getSiret());
+ $line[] = preg_replace('/\s+/', '', $p->getTvaintra());
+ $line[] = preg_replace('/\s+/', '', $p->getDuns());
+ $line[] = $p->getTypeEtablissementPcruObj()->getLabel();
+ $line[] = $p->getStreet1();
+ $line[] = $p->getZipCode();
+ $line[] = $p->getCity();
+ $line[] = $p->getCountry();
+
+ $r = fputcsv($stream, $line, ';');
+ if (!$r) {
+ throw new OscarPCRUException("Impossible d'écrire dans le fichier " . $partenairesFilePath);
+ }
+ }
+
+ $r = fclose($stream);
+ if (!$r) {
+ throw new OscarPCRUException("Impossible de fermer le fichier " . $partenairesFilePath);
+ }
+ }
+
+
+ $ziptmp = "/tmp/" . $tmpNum . "-oscar-pcru-export.zip";
+ $zip = new \ZipArchive();
+ if ($zip->open($ziptmp, \ZipArchive::CREATE) !== true) {
+ throw new OscarPCRUException("Impossible de créer l'archive");
+ }
+ $zip->addFile($contratsFilePath, $nomFichierContrats);
+ if (count($partenairesAEnvoyer) > 0) {
+ $zip->addFile($partenairesFilePath, $nomFichierPartenaires);
+ }
+
+ foreach ($activitesAEnvoyerValides as $a) {
+ if (!$a['cheminFichierContrat']) {
+ continue;
+ }
+ $docpath = $this->getOscarConfigurationService()->getDocumentDropLocation()
+ . DIRECTORY_SEPARATOR
+ . $a['cheminFichierContrat'];
+ $pdfFileName = $a['pcruInformation']->numContrat . '.pdf';
+ $zip->addFile($docpath, $pdfFileName);
+ }
+
+ $zip->close();
+
+ header('Content-Description: File Transfer');
+ header('Content-Type: application/octet-stream');
+ header('Content-Disposition: attachment; filename="oscar-pcru-export-' . $tmpNum . '.zip"');
+ header('Expires: 0');
+ header('Cache-Control: must-revalidate');
+ header('Pragma: public');
+ readfile($ziptmp);
+
+ if (count($partenairesAEnvoyer) > 0) {
+ unlink($partenairesFilePath);
+ }
+ unlink($contratsFilePath);
+ unlink($ziptmp);
+
+ exit;
+ }
+
+}
diff --git a/module/Oscar/src/Oscar/Controller/PcruControllerFactory.php b/module/Oscar/src/Oscar/Controller/PcruControllerFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9144ce2645f9b188f7fa84554fed23c60b254d6
--- /dev/null
+++ b/module/Oscar/src/Oscar/Controller/PcruControllerFactory.php
@@ -0,0 +1,26 @@
+setEntityManager($container->get(EntityManager::class));
+ $c->setOscarUserContextService($container->get(OscarUserContext::class));
+ $c->setLoggerService($container->get('Logger'));
+ $c->setPcruFtpService($container->get(PcruFtpService::class));
+ $c->setPcruInformationsService($container->get(PcruInformationsService::class));
+ $c->setOscarConfigurationService($container->get(OscarConfigurationService::class));
+ return $c;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Controller/ProjectGrantController.php b/module/Oscar/src/Oscar/Controller/ProjectGrantController.php
index af41d47e5e31e47ea413359be49d4aeb7c036f9d..f89e1cd8bfc1c1872748483782f4763f95e500e0 100644
--- a/module/Oscar/src/Oscar/Controller/ProjectGrantController.php
+++ b/module/Oscar/src/Oscar/Controller/ProjectGrantController.php
@@ -17,7 +17,6 @@ use Laminas\Http\Response;
use Oscar\Entity\Activity;
use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\ActivityPayment;
-use Oscar\Entity\ActivityPcruInfos;
use Oscar\Entity\ActivityPerson;
use Oscar\Entity\ActivityRequest;
use Oscar\Entity\ActivityRequestRepository;
@@ -41,7 +40,6 @@ use Oscar\Entity\ValidationPeriod;
use Oscar\Entity\ValidationPeriodRepository;
use Oscar\Exception\OscarException;
use Oscar\Factory\ActivityGantJson;
-use Oscar\Form\ActivityInfosPcruForm;
use Oscar\Form\ProjectGrantForm;
use Oscar\Form\SignedDocumentForm;
use Oscar\Formatter\ActivityPaymentFormatter;
@@ -49,7 +47,6 @@ use Oscar\Formatter\ActivityToJsonFormatter;
use Oscar\Formatter\CSVDownloader;
use Oscar\Formatter\JSONFormatter;
use Oscar\Formatter\OscarFormatterConst;
-use Oscar\Hydrator\PcruInfosFormHydrator;
use Oscar\OscarVersion;
use Oscar\Provider\Privileges;
use Oscar\Service\ActivityAvenantsService;
@@ -2797,65 +2794,6 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif
return $view;
}
- /**
- * Affiche la liste des activités soumises à un processus PCRU.
- *
- * @return array
- */
- public function pcruListAction()
- {
- $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PCRU_LIST);
- $accessUpload = $this->getOscarUserContextService()->hasPrivileges(Privileges::MAINTENANCE_PCRU_UPLOAD);
- $pcruInfos = $this->getProjectGrantService()->getPCRUService()->getPcruInfos();
- $methods = $this->getHttpXMethod();
-
- if ($methods == 'GET') {
- $action = $this->params()->fromQuery('a');
-
- // Recherche des activités
- if ($action == 'search') {
- $search = $this->params()->fromQuery('search');
- $idsActivities = $this->getProjectGrantService()->search($search);
- $activities = [];
- /** @var Activity $activity */
- foreach ($this->getProjectGrantService()->getActivitiesByIds($idsActivities) as $activity) {
- $a = $activity->toArray();
- $a['pcru'] = [];
- $a['pcruenable'] = false;
- $activities[] = $a;
- }
- return $this->jsonOutput(["activities" => $activities]);
- }
-
- // Aperçu PCRU
- if ($action == 'preview') {
- $activity_id = $this->params()->fromQuery('activity_id');
- $activity = $this->getProjectGrantService()->getActivityById($activity_id);
- $preview = $this->getProjectGrantService()->getPCRUService()->getPreview($activity);
- return $this->jsonOutput(["preview" => $preview]);
- }
-
- if ($action == 'download') {
- $pcru = $this->getProjectGrantService()->getPCRUService()->downloadPCRUSendableFile();
- }
- }
- elseif ($methods == "POST") {
- $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PCRU_UPLOAD);
- $action = $this->params()->fromPost('action');
- if ($action == 'upload') {
- $this->getProjectGrantService()->getPCRUService()->upload();
- $this->redirect()->toRoute('contract/pcru-list');
- }
- }
-
- return [
- 'downloadable' => $this->getProjectGrantService()->getPCRUService()->hasDownload(),
- 'uploadable' => !$this->getProjectGrantService()->getPCRUService()->hasUploadInProgress(
- ) && $accessUpload,
- 'pcruInfos' => $pcruInfos
- ];
- }
-
public function timesheetAction()
{
/** @var Activity $activity */
@@ -2922,122 +2860,6 @@ class ProjectGrantController extends AbstractOscarController implements UseNotif
];
}
- /**
- * Gestion/récapitulatif des informations PCRU
- *
- * @return array|Response
- * @throws OscarException
- * @throws \Doctrine\ORM\ORMException
- * @throws \Doctrine\ORM\OptimisticLockException
- */
- public function pcruInfosAction()
- {
- /** @var Activity $activity */
- $activity = $this->getActivityFromRoute();
-
- // Accès
- $this->getOscarUserContextService()->check(Privileges::ACTIVITY_PCRU, $activity);
-
- if ($this->params()->fromQuery("a") == "reset") {
- $this->getProjectGrantService()->getPCRUService()->resetTmpPcruInfos($activity);
- $this->redirect()->toRoute('contract/pcru-infos', ['id' => $activity->getId()]);
- }
-
- if ($this->params()->fromQuery("a") == "activate") {
- // Formulaire
- $form = new ActivityInfosPcruForm($this->getProjectGrantService(), $activity);
- $preview = $this->getProjectGrantService()->getPCRUService()->getPreview($activity);
- $pcruInfos = $preview['infos'];
- $form->init();
- $form->bind($pcruInfos);
-
- if ($this->getRequest()->getMethod() == "POST") {
- $posted = $this->getRequest()->getPost();
- $form->setData($posted);
- if ($form->isValid()) {
- $this->getProjectGrantService()->getPCRUService()->activateActivity($activity, $pcruInfos);
- return $this->redirect()->toRoute('contract/pcru-infos', ['id' => $activity->getId()]);
- }
- else {
- }
- }
-
- $preview['form'] = $form;
- $preview['activity'] = $activity;
- $view = new ViewModel($preview);
- $view->setTemplate('oscar/activity/pcruinfos-form.phtml');
-
- return $view;
- }
-
- if ($this->params()->fromQuery("a") == "edit") {
- // Formulaire
- $form = new ActivityInfosPcruForm($this->getProjectGrantService(), $activity);
- $preview = $this->getProjectGrantService()->getPCRUService()->getPreview($activity);
- $pcruInfos = $preview['infos'];
- $form->init();
- $form->bind($pcruInfos);
-
- if ($this->getRequest()->getMethod() == "POST") {
- $posted = $this->getRequest()->getPost();
- $form->setData($posted);
- if ($form->isValid()) {
- $this->getProjectGrantService()->getPCRUService()->updatePcruInfos($activity, $pcruInfos);
- return $this->redirect()->toRoute('contract/pcru-infos', ['id' => $activity->getId()]);
- }
- else {
- }
- }
-
- $preview['form'] = $form;
- $preview['mode'] = "edit";
- $preview['activity'] = $activity;
- $view = new ViewModel($preview);
- $view->setTemplate('oscar/activity/pcruinfos-form.phtml');
-
- return $view;
- }
-
- $method = $this->getHttpXMethod();
-
- if ($method == 'POST') {
- $action = $this->params()->fromPost('action');
- $this->getOscarUserContextService()->check(Privileges::ACTIVITY_PCRU_ACTIVATE, $activity);
- switch ($action) {
- case 'remove-waiting';
- $idActivityPcruInfo = intval($this->params()->fromPost('activitypcruinfo_id'));
- $this->getProjectGrantService()->getPCRUService()->removeWaiting($idActivityPcruInfo);
- $this->redirect()->toRoute('contract/show', ['id' => $activity->getId()]);
-
- case 'add-pool':
- $this->getProjectGrantService()->getPCRUService()->addToPool($activity);
- break;
-
- case 'download-pcru':
- $this->getProjectGrantService()->getPCRUService()->downloadOne($activity);
- break;
- }
- return $this->redirect()->toRoute('contract/pcru-infos', ['id' => $activity->getId()]);
- }
-
- $return = $this->getProjectGrantService()->getPCRUService()->getPreview($activity);
-
- $return['contratSignedType'] = $this->getOscarConfigurationService()
- ->getOptionalConfiguration('pcru_contrat_type', "Contrat Version Définitive Signée");
-
- /** @var ActivityPcruInfos $pcruInfos */
- $pcruInfos = $return['infos'];
-
- if ($pcruInfos->isWaiting()) {
- $return['deletable'] = true;
- $return['activitypcruinfo_id'] = $pcruInfos->getId();
- }
-
- $return['poolopen'] = $this->getProjectGrantService()->getPCRUService()->isPoolOpen();
-
- return $return;
- }
-
public function mergeAction()
{
return $this->getResponseNotImplemented();
diff --git a/module/Oscar/src/Oscar/Entity/Activity.php b/module/Oscar/src/Oscar/Entity/Activity.php
index 9b876f769416939878209a6ffb4385a1c293dc89..f17f85bf1469cdf54980e05ef169a69833a08aa2 100644
--- a/module/Oscar/src/Oscar/Entity/Activity.php
+++ b/module/Oscar/src/Oscar/Entity/Activity.php
@@ -527,12 +527,11 @@ class Activity implements ResourceInterface
*/
private $estimatedSpentLines;
-
/**
* Informations complémentaires PCRU
- * @OneToOne(targetEntity="ActivityPcruInfos", mappedBy="activity", orphanRemoval=true, cascade={"remove"})
+ * @OneToOne(targetEntity="ActivityPcruInformations", mappedBy="activity", orphanRemoval=true, cascade={"remove"})
*/
- private $pcruInfo;
+ private $pcruInformations;
/**
* @var String
@@ -984,17 +983,17 @@ class Activity implements ResourceInterface
/**
* @return mixed
*/
- public function getPcruInfo()
+ public function getPcruInformations()
{
- return $this->pcruInfo;
+ return $this->pcruInformations;
}
/**
- * @param mixed $pcruInfo
+ * @param mixed $pcruInformations
*/
- public function setPcruInfo($pcruInfo): self
+ public function setPcruInformations($pcruInformations): self
{
- $this->pcruInfo = $pcruInfo;
+ $this->pcruInformations = $pcruInformations;
return $this;
}
diff --git a/module/Oscar/src/Oscar/Entity/ActivityPcruInformations.php b/module/Oscar/src/Oscar/Entity/ActivityPcruInformations.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1ff4427f9e7737d2703d5d491ca61111367b395
--- /dev/null
+++ b/module/Oscar/src/Oscar/Entity/ActivityPcruInformations.php
@@ -0,0 +1,1686 @@
+dateUpdated = new \DateTime();
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return Activity
+ */
+ public function getActivity(): Activity
+ {
+ return $this->activity;
+ }
+
+ /**
+ * @param Activity $activity
+ */
+ public function setActivity(Activity $activity): self
+ {
+ $this->activity = $activity;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserObjetParDefaut()
+ {
+ return $this->utiliserObjetParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserObjetParDefaut
+ */
+ public function setUtiliserObjetParDefaut(bool $utiliserObjetParDefaut): self
+ {
+ $this->utiliserObjetParDefaut = $utiliserObjetParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getObjet(): ?string
+ {
+ return $this->objet;
+ }
+
+ /**
+ * @param ?string $objet
+ */
+ public function setObjet(?string $objet): self
+ {
+ $objet = self::trimToNull($objet);
+ if ($objet == NULL) {
+ $this->objet = NULL;
+ } else {
+ $this->objet = mb_substr($objet, 0, 1000);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserLabintelParDefaut()
+ {
+ return $this->utiliserLabintelParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserLabintelParDefaut
+ */
+ public function setUtiliserLabintelParDefaut(bool $utiliserLabintelParDefaut): self
+ {
+ $this->utiliserLabintelParDefaut = $utiliserLabintelParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getLabintel(): ?string
+ {
+ return $this->labintel;
+ }
+
+ /**
+ * @param ?string $labintel
+ */
+ public function setLabintel(?string $labintel): self
+ {
+ $labintel = self::trimToNull($labintel);
+ if ($labintel == NULL) {
+ $this->labintel = NULL;
+ } else {
+ $this->labintel = mb_substr($labintel, 0, 10);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserRnsrParDefaut()
+ {
+ return $this->utiliserRnsrParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserRnsrParDefaut
+ */
+ public function setUtiliserRnsrParDefaut(bool $utiliserRnsrParDefaut): self
+ {
+ $this->utiliserRnsrParDefaut = $utiliserRnsrParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getRnsr(): ?string
+ {
+ return $this->rnsr;
+ }
+
+ /**
+ * @param ?string $rnsr
+ */
+ public function setRnsr(?string $rnsr): self
+ {
+ $rnsr = self::trimToNull($rnsr);
+ if ($rnsr == NULL) {
+ $this->rnsr = NULL;
+ } else {
+ $this->rnsr = mb_substr($rnsr, 0, self::RNSR_MAX_LENGTH);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserSigleParDefaut()
+ {
+ return $this->utiliserSigleParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserSigleParDefaut
+ */
+ public function setUtiliserSigleParDefaut(bool $utiliserSigleParDefaut): self
+ {
+ $this->utiliserSigleParDefaut = $utiliserSigleParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getSigle(): ?string
+ {
+ return $this->sigle;
+ }
+
+ /**
+ * @param ?string $sigle
+ */
+ public function setSigle(?string $sigle): self
+ {
+ $sigle = self::trimToNull($sigle);
+ if ($sigle == NULL) {
+ $this->sigle = NULL;
+ } else {
+ $this->sigle = mb_substr($sigle, 0, 20);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserNumContratParDefaut()
+ {
+ return $this->utiliserNumContratParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserNumContratParDefaut
+ */
+ public function setUtiliserNumContratParDefaut(bool $utiliserNumContratParDefaut): self
+ {
+ $this->utiliserNumContratParDefaut = $utiliserNumContratParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getNumContrat(): ?string
+ {
+ return $this->numContrat;
+ }
+
+ /**
+ * @param ?string $numContrat
+ */
+ public function setNumContrat(?string $numContrat): self
+ {
+ $numContrat = self::trimToNull($numContrat);
+ if ($numContrat == NULL) {
+ $this->numContrat = NULL;
+ } else {
+ $this->numContrat = mb_substr($numContrat, 0, 30);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getEquipe(): ?string
+ {
+ return $this->equipe;
+ }
+
+ /**
+ * @param ?string $equipe
+ */
+ public function setEquipe(?string $equipe): self
+ {
+ $equipe = self::trimToNull($equipe);
+ if ($equipe == NULL) {
+ $this->equipe = NULL;
+ } else {
+ $this->equipe = mb_substr($equipe, 0, 150);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserTypeContratParDefaut()
+ {
+ return $this->utiliserTypeContratParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserTypeContratParDefaut
+ */
+ public function setUtiliserTypeContratParDefaut(bool $utiliserTypeContratParDefaut): self
+ {
+ $this->utiliserTypeContratParDefaut = $utiliserTypeContratParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return PcruTypeContract
+ */
+ public function getPcruTypeContract(): ?PcruTypeContract
+ {
+ return $this->pcruTypeContract;
+ }
+
+ /**
+ * @param PcruTypeContract $pcruTypeContract
+ */
+ public function setPcruTypeContract(?PcruTypeContract $pcruTypeContract): self
+ {
+ $this->pcruTypeContract = $pcruTypeContract;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserAcronymeParDefaut()
+ {
+ return $this->utiliserAcronymeParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserAcronymeParDefaut
+ */
+ public function setUtiliserAcronymeParDefaut(bool $utiliserAcronymeParDefaut): self
+ {
+ $this->utiliserAcronymeParDefaut = $utiliserAcronymeParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getAcronyme(): ?string
+ {
+ return $this->acronyme;
+ }
+
+ /**
+ * @param ?string $acronyme
+ */
+ public function setAcronyme(?string $acronyme): self
+ {
+ $acronyme = self::trimToNull($acronyme);
+ if ($acronyme == NULL) {
+ $this->acronyme = NULL;
+ } else {
+ $this->acronyme = mb_substr($acronyme, 0, 50);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getContratsAssocies(): ?string
+ {
+ return $this->contratsAssocies;
+ }
+
+ /**
+ * @param ?string $contratsAssocies
+ */
+ public function setContratsAssocies(?string $contratsAssocies): self
+ {
+ $contratsAssocies = self::trimToNull($contratsAssocies);
+ if ($contratsAssocies == NULL) {
+ $this->contratsAssocies = NULL;
+ } else {
+ $this->contratsAssocies = mb_substr($contratsAssocies, 0, 300);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserResponsableScientifiqueParDefaut()
+ {
+ return $this->utiliserResponsableScientifiqueParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserResponsableScientifiqueParDefaut
+ */
+ public function setUtiliserResponsableScientifiqueParDefaut(bool $utiliserResponsableScientifiqueParDefaut): self
+ {
+ $this->utiliserResponsableScientifiqueParDefaut = $utiliserResponsableScientifiqueParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getResponsableScientifique(): ?string
+ {
+ return $this->responsableScientifique;
+ }
+
+ /**
+ * @param ?string $responsableScientifique
+ */
+ public function setResponsableScientifique(?string $responsableScientifique): self
+ {
+ $responsableScientifique = self::trimToNull($responsableScientifique);
+ if ($responsableScientifique == NULL) {
+ $this->responsableScientifique = NULL;
+ } else {
+ $this->responsableScientifique = mb_substr($responsableScientifique, 0, 50);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getEmployeurResponsableScientifique(): ?string
+ {
+ return $this->employeurResponsableScientifique;
+ }
+
+ /**
+ * @param ?string $employeurResponsableScientifique
+ */
+ public function setEmployeurResponsableScientifique(?string $employeurResponsableScientifique): self
+ {
+ $employeurResponsableScientifique = self::trimToNull($employeurResponsableScientifique);
+ if ($employeurResponsableScientifique == NULL) {
+ $this->employeurResponsableScientifique = NULL;
+ } else {
+ $this->employeurResponsableScientifique = mb_substr($employeurResponsableScientifique, 0, 50);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?bool
+ */
+ public function isCoordinateurConsortium()
+ {
+ return $this->coordinateurConsortium;
+ }
+
+ /**
+ * @param ?bool $coordinateurConsortium
+ */
+ public function setCoordinateurConsortium(?bool $coordinateurConsortium): self
+ {
+ $this->coordinateurConsortium = $coordinateurConsortium;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserPartenairesParDefaut()
+ {
+ return $this->utiliserPartenairesParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserPartenairesParDefaut
+ */
+ public function setUtiliserPartenairesParDefaut(bool $utiliserPartenairesParDefaut): self
+ {
+ $this->utiliserPartenairesParDefaut = $utiliserPartenairesParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getPartenaires(): ?string
+ {
+ return $this->partenaires;
+ }
+
+ /**
+ * @param ?string $partenaires
+ */
+ public function setPartenaires(?string $partenaires): self
+ {
+ $partenaires = self::trimToNull($partenaires);
+ if ($partenaires == NULL) {
+ $this->partenaires = NULL;
+ } else {
+ $this->partenaires = mb_substr($partenaires, 0, 200);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserPartenairePrincipalParDefaut()
+ {
+ return $this->utiliserPartenairePrincipalParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserPartenairePrincipalParDefaut
+ */
+ public function setUtiliserPartenairePrincipalParDefaut(bool $utiliserPartenairePrincipalParDefaut): self
+ {
+ $this->utiliserPartenairePrincipalParDefaut = $utiliserPartenairePrincipalParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getPartenairePrincipal(): ?string
+ {
+ return $this->partenairePrincipal;
+ }
+
+ /**
+ * @param ?string $partenairePrincipal
+ */
+ public function setPartenairePrincipal(?string $partenairePrincipal): self
+ {
+ $partenairePrincipal = self::trimToNull($partenairePrincipal);
+ if ($partenairePrincipal == NULL) {
+ $this->partenairePrincipal = NULL;
+ } else {
+ $this->partenairePrincipal = mb_substr($partenairePrincipal, 0, self::PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserIdPartenairePrincipalParDefaut()
+ {
+ return $this->utiliserIdPartenairePrincipalParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserIdPartenairePrincipalParDefaut
+ */
+ public function setUtiliserIdPartenairePrincipalParDefaut(bool $utiliserIdPartenairePrincipalParDefaut): self
+ {
+ $this->utiliserIdPartenairePrincipalParDefaut = $utiliserIdPartenairePrincipalParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getIdPartenairePrincipal(): ?string
+ {
+ return $this->idPartenairePrincipal;
+ }
+
+ /**
+ * @param ?string $idPartenairePrincipal
+ */
+ public function setIdPartenairePrincipal(?string $idPartenairePrincipal): self
+ {
+ $idPartenairePrincipal = self::trimToNull($idPartenairePrincipal);
+ if ($idPartenairePrincipal == NULL) {
+ $this->idPartenairePrincipal = NULL;
+ } else {
+ $this->idPartenairePrincipal = mb_substr($idPartenairePrincipal, 0, self::ID_PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getLieuExecution(): ?string
+ {
+ return $this->lieuExecution;
+ }
+
+ /**
+ * @param ?string $lieuExecution
+ */
+ public function setLieuExecution(?string $lieuExecution): self
+ {
+ $lieuExecution = self::trimToNull($lieuExecution);
+ if ($lieuExecution == NULL) {
+ $this->lieuExecution = NULL;
+ } else {
+ $this->lieuExecution = mb_substr($lieuExecution, 0, self::LIEU_EXECUTION_MAX_LENGTH);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserDateDerniereSignatureParDefaut()
+ {
+ return $this->utiliserDateDerniereSignatureParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserDateDerniereSignatureParDefaut
+ */
+ public function setUtiliserDateDerniereSignatureParDefaut(bool $utiliserDateDerniereSignatureParDefaut): self
+ {
+ $this->utiliserDateDerniereSignatureParDefaut = $utiliserDateDerniereSignatureParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getDateDerniereSignature(): ?string
+ {
+ return $this->dateDerniereSignature;
+ }
+
+ /**
+ * @param ?string $dateDerniereSignature
+ */
+ public function setDateDerniereSignature(?string $dateDerniereSignature): self
+ {
+ $dateDerniereSignature = self::trimToNull($dateDerniereSignature);
+ if ($dateDerniereSignature == NULL) {
+ $this->dateDerniereSignature = NULL;
+ } else {
+ $this->dateDerniereSignature = mb_substr($dateDerniereSignature, 0, 10);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?float
+ */
+ public function getDuree(): ?float
+ {
+ return $this->duree;
+ }
+
+ /**
+ * @param ?float $duree
+ */
+ public function setDuree(?float $duree): self
+ {
+ $this->duree = $duree;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserDateDebutParDefaut()
+ {
+ return $this->utiliserDateDebutParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserDateDebutParDefaut
+ */
+ public function setUtiliserDateDebutParDefaut(bool $utiliserDateDebutParDefaut): self
+ {
+ $this->utiliserDateDebutParDefaut = $utiliserDateDebutParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getDateDebut(): ?string
+ {
+ return $this->dateDebut;
+ }
+
+ /**
+ * @param ?string $dateDebut
+ */
+ public function setDateDebut(?string $dateDebut): self
+ {
+ $dateDebut = self::trimToNull($dateDebut);
+ if ($dateDebut == NULL) {
+ $this->dateDebut = NULL;
+ } else {
+ $this->dateDebut = mb_substr($dateDebut, 0, 10);
+ }
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserDateFinParDefaut()
+ {
+ return $this->utiliserDateFinParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserDateFinParDefaut
+ */
+ public function setUtiliserDateFinParDefaut(bool $utiliserDateFinParDefaut): self
+ {
+ $this->utiliserDateFinParDefaut = $utiliserDateFinParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getDateFin(): ?string
+ {
+ return $this->dateFin;
+ }
+
+ /**
+ * @param ?string $dateFin
+ */
+ public function setDateFin(?string $dateFin): self
+ {
+ $dateFin = self::trimToNull($dateFin);
+ if ($dateFin == NULL) {
+ $this->dateFin = NULL;
+ } else {
+ $this->dateFin = mb_substr($dateFin, 0, 10);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?float
+ */
+ public function getMontantPercuUnite(): ?float
+ {
+ return $this->montantPercuUnite;
+ }
+
+ /**
+ * @param ?float $montantPercuUnite
+ */
+ public function setMontantPercuUnite(?float $montantPercuUnite): self
+ {
+ $this->montantPercuUnite = $montantPercuUnite;
+ return $this;
+ }
+
+ /**
+ * @return ?float
+ */
+ public function getContributionFinanceur(): ?float
+ {
+ return $this->contributionFinanceur;
+ }
+
+ /**
+ * @param ?float $contributionFinanceur
+ */
+ public function setContributionFinanceur(?float $contributionFinanceur): self
+ {
+ $this->contributionFinanceur = $contributionFinanceur;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserMontantTotalParDefaut()
+ {
+ return $this->utiliserMontantTotalParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserMontantTotalParDefaut
+ */
+ public function setUtiliserMontantTotalParDefaut(bool $utiliserMontantTotalParDefaut): self
+ {
+ $this->utiliserMontantTotalParDefaut = $utiliserMontantTotalParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?float
+ */
+ public function getMontantTotal(): ?float
+ {
+ return $this->montantTotal;
+ }
+
+ /**
+ * @param ?float $montantTotal
+ */
+ public function setMontantTotal(?float $montantTotal): self
+ {
+ $this->montantTotal = $montantTotal;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getCommentaires(): ?string
+ {
+ return $this->commentaires;
+ }
+
+ /**
+ * @param ?string $commentaires
+ */
+ public function setCommentaires(?string $commentaires): self
+ {
+ $commentaires = self::trimToNull($commentaires);
+ if ($commentaires == NULL) {
+ $this->commentaires = NULL;
+ } else {
+ $this->commentaires = mb_substr($commentaires, 0, self::COMMENTAIRES_MAX_LENGTH);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?bool
+ */
+ public function isPia()
+ {
+ return $this->pia;
+ }
+
+ /**
+ * @param ?bool $pia
+ */
+ public function setPia(?bool $pia): self
+ {
+ $this->pia = $pia;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isUtiliserReferenceParDefaut()
+ {
+ return $this->utiliserReferenceParDefaut;
+ }
+
+ /**
+ * @param bool $utiliserReferenceParDefaut
+ */
+ public function setUtiliserReferenceParDefaut(bool $utiliserReferenceParDefaut): self
+ {
+ $this->utiliserReferenceParDefaut = $utiliserReferenceParDefaut;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getReference(): ?string
+ {
+ return $this->reference;
+ }
+
+ /**
+ * @param ?string $reference
+ */
+ public function setReference(?string $reference): self
+ {
+ $reference = self::trimToNull($reference);
+ if ($reference == NULL) {
+ $this->reference = NULL;
+ } else {
+ $this->reference = mb_substr($reference, 0, self::REFERENCE_MAX_LENGTH);
+ }
+ return $this;
+ }
+
+ /**
+ * @return ?bool
+ */
+ public function isAccordCadre()
+ {
+ return $this->accordCadre;
+ }
+
+ /**
+ * @param ?bool $accordCadre
+ */
+ public function setAccordCadre(?bool $accordCadre): self
+ {
+ $this->accordCadre = $accordCadre;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isCifre()
+ {
+ return $this->cifre;
+ }
+
+ /**
+ * @param bool $cifre
+ */
+ public function setCifre(bool $cifre): self
+ {
+ $this->cifre = $cifre;
+ return $this;
+ }
+
+ /**
+ * @return ?bool
+ */
+ public function isChaireIndustrielle()
+ {
+ return $this->chaireIndustrielle;
+ }
+
+ /**
+ * @param ?bool $chaireIndustrielle
+ */
+ public function setChaireIndustrielle(?bool $chaireIndustrielle): self
+ {
+ $this->chaireIndustrielle = $chaireIndustrielle;
+ return $this;
+ }
+
+ /**
+ * @return ?bool
+ */
+ public function isPresencePartenaireIndustriel()
+ {
+ return $this->presencePartenaireIndustriel;
+ }
+
+ /**
+ * @param ?bool $presencePartenaireIndustriel
+ */
+ public function setPresencePartenaireIndustriel(?bool $presencePartenaireIndustriel): self
+ {
+ $this->presencePartenaireIndustriel = $presencePartenaireIndustriel;
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getStatus(): string
+ {
+ return $this->status;
+ }
+
+ /**
+ * @param string $status
+ */
+ public function setStatus(string $status): self
+ {
+ $this->status = $status;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isEnvoiActif(): bool
+ {
+ return $this->envoiActif;
+ }
+
+ /**
+ * @param bool $envoiActif
+ */
+ public function setEnvoiActif(bool $envoiActif): self
+ {
+ $this->envoiActif = $envoiActif;
+ return $this;
+ }
+
+ /**
+ * @return \DateTime
+ */
+ public function getDateUpdated(): \DateTime
+ {
+ return $this->dateUpdated;
+ }
+
+ /**
+ * @param \DateTime $dateUpdated
+ */
+ public function setDateUpdated(\DateTime $dateUpdated): self
+ {
+ $this->dateUpdated = $dateUpdated;
+ return $this;
+ }
+
+ /**
+ * @return ?\DateTime
+ */
+ public function getDatePremierDepot(): ?\DateTime
+ {
+ return $this->datePremierDepot;
+ }
+
+ /**
+ * @param ?\DateTime $datePremierDepot
+ */
+ public function setDatePremierDepot(?\DateTime $datePremierDepot): self
+ {
+ $this->datePremierDepot = $datePremierDepot;
+ return $this;
+ }
+
+ public function toArray() :array
+ {
+ $out = [];
+ $out['id'] = $this->getId();
+ $out['utiliserObjetParDefaut'] = $this->isUtiliserObjetParDefaut();
+ $out['objet'] = $this->getObjet();
+ $out['utiliserLabintelParDefaut'] = $this->isUtiliserLabintelParDefaut();
+ $out['labintel'] = $this->getLabintel();
+ $out['utiliserRnsrParDefaut'] = $this->isUtiliserRnsrParDefaut();
+ $out['rnsr'] = $this->getRnsr();
+ $out['utiliserSigleParDefaut'] = $this->isUtiliserSigleParDefaut();
+ $out['sigle'] = $this->getSigle();
+ $out['utiliserNumContratParDefaut'] = $this->isUtiliserNumContratParDefaut();
+ $out['numContrat'] = $this->getNumContrat();
+ $out['equipe'] = $this->getEquipe();
+ $out['utiliserTypeContratParDefaut'] = $this->isUtiliserTypeContratParDefaut();
+ if ($this->pcruTypeContract != NULL) {
+ $out['pcruTypeContractId'] = $this->pcruTypeContract->getId();
+ } else {
+ $out['pcruTypeContractId'] = NULL;
+ }
+ $out['utiliserAcronymeParDefaut'] = $this->isUtiliserAcronymeParDefaut();
+ $out['acronyme'] = $this->getAcronyme();
+ $out['contratsAssocies'] = $this->getContratsAssocies();
+ $out['utiliserResponsableScientifiqueParDefaut'] = $this->isUtiliserResponsableScientifiqueParDefaut();
+ $out['responsableScientifique'] = $this->getResponsableScientifique();
+ $out['employeurResponsableScientifique'] = $this->getEmployeurResponsableScientifique();
+ $out['coordinateurConsortium'] = $this->isCoordinateurConsortium() === NULL ? NULL : ($this->isCoordinateurConsortium() ? "true" : "false");
+ $out['utiliserPartenairesParDefaut'] = $this->isUtiliserPartenairesParDefaut();
+ $out['partenaires'] = $this->getPartenaires();
+ $out['utiliserPartenairePrincipalParDefaut'] = $this->isUtiliserPartenairePrincipalParDefaut();
+ $out['partenairePrincipal'] = $this->getPartenairePrincipal();
+ $out['utiliserIdPartenairePrincipalParDefaut'] = $this->isUtiliserIdPartenairePrincipalParDefaut();
+ $out['idPartenairePrincipal'] = $this->getIdPartenairePrincipal();
+ $out['lieuExecution'] = $this->getLieuExecution();
+ $out['utiliserDateDerniereSignatureParDefaut'] = $this->isUtiliserDateDerniereSignatureParDefaut();
+ $out['dateDerniereSignature'] = $this->getDateDerniereSignature();
+ $out['duree'] = $this->getDuree();
+ $out['utiliserDateDebutParDefaut'] = $this->isUtiliserDateDebutParDefaut();
+ $out['dateDebut'] = $this->getDateDebut();
+ $out['utiliserDateFinParDefaut'] = $this->isUtiliserDateFinParDefaut();
+ $out['dateFin'] = $this->getDateFin();
+ $out['montantPercuUnite'] = $this->getMontantPercuUnite();
+ $out['contributionFinanceur'] = $this->getContributionFinanceur();
+ $out['utiliserMontantTotalParDefaut'] = $this->isUtiliserMontantTotalParDefaut();
+ $out['montantTotal'] = $this->getMontantTotal();
+ $out['commentaires'] = $this->getCommentaires();
+ $out['pia'] = $this->isPia() === NULL ? NULL : ($this->isPia() ? "true" : "false");
+ $out['utiliserReferenceParDefaut'] = $this->isUtiliserReferenceParDefaut();
+ $out['reference'] = $this->getReference();
+ $out['accordCadre'] = $this->isAccordCadre() === NULL ? NULL : ($this->isAccordCadre() ? "true" : "false");
+ $out['cifre'] = $this->isCifre() ? "true" : "false";
+ $out['chaireIndustrielle'] = $this->isChaireIndustrielle() === NULL ? NULL : ($this->isChaireIndustrielle() ? "true" : "false");
+ $out['presencePartenaireIndustriel'] = $this->isPresencePartenaireIndustriel() === NULL ? NULL : ($this->isPresencePartenaireIndustriel() ? "true" : "false");
+ $out['status'] = $this->getStatus();
+ $out['envoiActif'] = $this->isEnvoiActif();
+ $dateupdated = $this->getDateUpdated();
+ $dateupdated->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $out['dateUpdated'] = $dateupdated->format(\DateTime::ATOM);
+ $dateActivationEnvoi = $this->dateActivationEnvoi;
+ $out['dateActivationEnvoi'] = NULL;
+ if ($dateActivationEnvoi != NULL) {
+ $dateActivationEnvoi->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $out['dateActivationEnvoi'] = $dateActivationEnvoi->format(\DateTime::ATOM);
+ }
+ $datepremierdepot = $this->getDatePremierDepot();
+ $out['datePremierDepot'] = NULL;
+ if ($datepremierdepot != NULL) {
+ $datepremierdepot->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $out['datePremierDepot'] = $datepremierdepot->format(\DateTime::ATOM);
+ }
+ $dateRetourOK = $this->dateRetourOK;
+ $out['dateRetourOK'] = NULL;
+ if ($dateRetourOK != NULL) {
+ $dateRetourOK->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $out['dateRetourOK'] = $dateRetourOK->format(\DateTime::ATOM);
+ }
+ $dateRetourOKMaisContratManquant = $this->dateRetourOKMaisContratManquant;
+ $out['dateRetourOKMaisContratManquant'] = NULL;
+ if ($dateRetourOKMaisContratManquant != NULL) {
+ $dateRetourOKMaisContratManquant->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $out['dateRetourOKMaisContratManquant'] = $dateRetourOKMaisContratManquant->format(\DateTime::ATOM);
+ }
+ $dateEnvoiFichierContrat = $this->dateEnvoiFichierContrat;
+ $out['dateEnvoiFichierContrat'] = NULL;
+ if ($dateEnvoiFichierContrat != NULL) {
+ $dateEnvoiFichierContrat->setTimezone(new \DateTimeZone( date_default_timezone_get() ));
+ $out['dateEnvoiFichierContrat'] = $dateEnvoiFichierContrat->format(\DateTime::ATOM);
+ }
+ $out['envoiObjet'] = $this->envoiObjet;
+ $out['envoiLabintel'] = $this->envoiLabintel;
+ $out['envoiRnsr'] = $this->envoiRnsr;
+ $out['envoiSigle'] = $this->envoiSigle;
+ $out['envoiNumContrat'] = $this->envoiNumContrat;
+ $out['envoiEquipe'] = $this->envoiEquipe;
+ $out['envoiTypeContrat'] = $this->envoiTypeContrat;
+ $out['envoiAcronyme'] = $this->envoiAcronyme;
+ $out['envoiContratsAssocies'] = $this->envoiContratsAssocies;
+ $out['envoiResponsableScientifique'] = $this->envoiResponsableScientifique;
+ $out['envoiEmployeurResponsableScientifique'] = $this->envoiEmployeurResponsableScientifique;
+ $out['envoiCoordinateurConsortium'] = $this->envoiCoordinateurConsortium;
+ $out['envoiPartenaires'] = $this->envoiPartenaires;
+ $out['envoiPartenairePrincipal'] = $this->envoiPartenairePrincipal;
+ $out['envoiIdPartenairePrincipal'] = $this->envoiIdPartenairePrincipal;
+ $out['envoiSourceFinancement'] = $this->envoiSourceFinancement;
+ $out['envoiLieuExecution'] = $this->envoiLieuExecution;
+ $out['envoiDateDerniereSignature'] = $this->envoiDateDerniereSignature;
+ $out['envoiDuree'] = $this->envoiDuree;
+ $out['envoiDateDebut'] = $this->envoiDateDebut;
+ $out['envoiDateFin'] = $this->envoiDateFin;
+ $out['envoiMontantPercuUnite'] = $this->envoiMontantPercuUnite;
+ $out['envoiContributionFinanceur'] = $this->envoiContributionFinanceur;
+ $out['envoiMontantTotal'] = $this->envoiMontantTotal;
+ $out['envoiValidePoleCompetitivite'] = $this->envoiValidePoleCompetitivite;
+ $out['envoiPoleCompetitivite'] = $this->envoiPoleCompetitivite;
+ $out['envoiCommentaires'] = $this->envoiCommentaires;
+ $out['envoiPia'] = $this->envoiPia;
+ $out['envoiReference'] = $this->envoiReference;
+ $out['envoiAccordCadre'] = $this->envoiAccordCadre;
+ $out['envoiCifre'] = $this->envoiCifre;
+ $out['envoiChaireIndustrielle'] = $this->envoiChaireIndustrielle;
+ $out['envoiPresencePartenaireIndustriel'] = $this->envoiPresencePartenaireIndustriel;
+ $out['erreurs'] = $this->erreurs;
+ return $out;
+ }
+
+ static private function trimToNull(?string $s) : ?string {
+ if ($s === NULL) {
+ return NULL;
+ }
+ $t = trim($s);
+ if ($t === '') {
+ return NULL;
+ }
+ return $t;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Entity/ActivityPcruInformationsRepository.php b/module/Oscar/src/Oscar/Entity/ActivityPcruInformationsRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..47008aa3f0cee28930e5fc3a8592687233410e22
--- /dev/null
+++ b/module/Oscar/src/Oscar/Entity/ActivityPcruInformationsRepository.php
@@ -0,0 +1,9 @@
+ "Aperçu",
- self::STATUS_ERROR_DATA => "ERREUR (Oscar)",
- self::STATUS_SEND_READY => "Prêt pour l'envoi",
- self::STATUS_FILE_READY => "Fichier prêt (Attente du transfert)",
- self::STATUS_SEND_PENDING => "Envoyé",
- self::STATUS_ERROR_REMOTE => "ERREUR (PCRU)",
- self::STATUS_CONTRACT_SEND_PENDING => "En attente d'envoi du contrat",
- self::STATUS_CONTRACT_ERROR_REMOTE => "PCRU en retourné une erreur concernant le contrat",
- self::STATUS_DONE => "OK",
- ];
- }
- return self::$status_str[$status];
- }
-
- /**
- * ActivityPcruInfos constructor.
- * @param string $status
- */
- public function __construct()
- {
- $this->status = self::STATUS_PREVIEW;
- }
-
- public function __toString()
- {
- return sprintf(
- "[%s] %s : %s (%s) - %s:%s",
- $this->getNumContratTutelleGestionnaire(),
- $this->getAcronyme(),
- $this->getObjet(),
- $this->getResponsableScientifique(),
- $this->getStatus(),
- $this->getStatusStr()
- );
- }
-
- public function isWaiting(): bool
- {
- return $this->getStatus() == self::STATUS_FILE_READY;
- }
-
- public function toArray(?EntityManager $entityManager = null): array
- {
- $partenairePrincipal = "";
- if ($this->getIdPartenairePrincipal() && $entityManager) {
- $partenairePrincipal = $entityManager->getRepository(Organization::class)->getOrganizationByCodePCRU($this->getIdPartenairePrincipal());
- }
- $out = [];
- $out['Objet'] = $this->getObjet();
- $out['CodeUniteLabintel'] = $this->getCodeUniteLabintel();
- $out['SigleUnite'] = $this->getSigleUnite();
- $out['NumContratTutelleGestionnaire'] = $this->getNumContratTutelleGestionnaire();
- $out['Equipe'] = $this->getEquipe();
- $out['TypeContrat'] = $this->getTypeContrat() ? $this->getTypeContrat()->getLabel() : "Aucun";
- $out['Acronyme'] = $this->getAcronyme();
- $out['ContratsAssocies'] = $this->getContratsAssocies();
- $out['ResponsableScientifique'] = $this->getResponsableScientifique();
- $out['EmployeurResponsableScientifique'] = $this->getEmployeurResponsableScientifique();
- $out['CoordinateurConsortium'] = $this->isCoordinateurConsortium() ? 'True' : 'False';
- $out['Partenaires'] = $this->getPartenaires();
- $out['PartenairePrincipal'] = "$partenairePrincipal";
- $out['IdPartenairePrincipal'] = $this->getIdPartenairePrincipal();
- $out['SourceFinancement'] = $this->getSourceFinancement() ? $this->getSourceFinancement()->getLabel() : "";
- $out['LieuExecution'] = $this->getLieuExecution();
- $out['DateDerniereSignature'] = DateTimeUtils::toStr($this->getDateDerniereSignature(), 'd-m-Y');
- $out['Duree'] = $this->getDuree();
- $out['DateDebut'] = DateTimeUtils::toStr($this->getDateDebut(), 'd-m-Y');
- $out['DateFin'] = DateTimeUtils::toStr($this->getDateFin(), 'd-m-Y');
- $out['MontantPercuUnite'] = $this->getMontantPercuUnite();
- $out['CoutTotalEtude'] = $this->getCoutTotalEtude();
- $out['MontantTotal'] = $this->getMontantTotal();
- $out['ValidePoleCompetivite'] = $this->isValidePoleCompetivite() ? "True" : "False";
- $out['PoleCompetivite'] = $this->getPoleCompetivite();
- $out['Commentaires'] = $this->getCommentaires();
- $out['Pia'] = $this->isPia() ? "True" : "False";
- $out['Reference'] = $this->getReference();
- $out['AccordCadre'] = $this->isAccordCadre() ? "True" : "False";
- $out['Cifre'] = $this->getCifre();
- $out['ChaireIndustrielle'] = $this->getChaireIndustrielle();
- $out['PresencePartenaireIndustriel'] = $this->isPresencePartenaireIndustriel();
- return $out;
- }
-
- public function validation(OscarConfigurationService $oscarConfigurationService): array
- {
- $this->error = [];
- $this->warnings = [];
- $datas = $this->toArray();
-
- $out = [];
- $out['Objet'] = self::VALIDATION_ERROR; // Requis
- $out['CodeUniteLabintel'] = self::VALIDATION_ERROR; // Requis
- $out['SigleUnite'] = self::VALIDATION_EMPTY;
- $out['NumContratTutelleGestionnaire'] = self::VALIDATION_ERROR; // Requis
- $out['Equipe'] = self::VALIDATION_EMPTY;
- $out['TypeContrat'] = self::VALIDATION_ERROR;
- $out['Acronyme'] = self::VALIDATION_EMPTY;
- $out['ContratsAssocies'] = self::VALIDATION_EMPTY;
- $out['ResponsableScientifique'] = self::VALIDATION_ERROR; // Requis
- $out['EmployeurResponsableScientifique'] = self::VALIDATION_EMPTY;
- $out['CoordinateurConsortium'] = self::VALIDATION_EMPTY;
- $out['Partenaires'] = self::VALIDATION_EMPTY;
- $out['PartenairePrincipal'] = self::VALIDATION_ERROR; // Requis
- $out['IdPartenairePrincipal'] = self::VALIDATION_EMPTY;
- $out['SourceFinancement'] = self::VALIDATION_ERROR; // Requis
- $out['LieuExecution'] = self::VALIDATION_ERROR; // Requis
- $out['DateDerniereSignature'] = self::VALIDATION_ERROR; // Requis
- $out['Duree'] = self::VALIDATION_EMPTY;
- $out['DateDebut'] = self::VALIDATION_ERROR; // Requis
- $out['DateFin'] = self::VALIDATION_ERROR; // Requis
- $out['MontantPercuUnite'] = self::VALIDATION_ERROR; // Requis
- $out['CoutTotalEtude'] = self::VALIDATION_EMPTY;
- $out['MontantTotal'] = self::VALIDATION_EMPTY;
- $out['ValidePoleCompetivite'] = self::VALIDATION_EMPTY;
- $out['PoleCompetivite'] = self::VALIDATION_EMPTY;
- $out['Commentaires'] = self::VALIDATION_EMPTY;
- $out['Pia'] = self::VALIDATION_EMPTY;
- $out['Reference'] = self::VALIDATION_EMPTY;
- $out['AccordCadre'] = self::VALIDATION_EMPTY;
- $out['Cifre'] = self::VALIDATION_EMPTY;
- $out['ChaireIndustrielle'] = self::VALIDATION_EMPTY;
- $out['PresencePartenaireIndustriel'] = self::VALIDATION_EMPTY;
- $out['contract_signed'] = self::VALIDATION_ERROR;
-
-
- $disabledFields = [
- 'Equipe','ContratsAssocies', 'EmployeurResponsableScientifique',
- 'CoordinateurConsortium','Partenaires', 'PartenairePrincipal',
- 'IdPartenairePrincipal','LieuExecution', 'Duree',
- 'MontantPercuUnite','CoutTotalEtude', 'Commentaires',
- 'Pia','AccordCadre', 'Cifre',
- 'ChaireIndustrielle','PresencePartenaireIndustriel'
- ];
-
- foreach ($disabledFields as $unusedField) {
- $out[$unusedField] = self::VALIDATION_DISABLED;
- }
-
- if ($datas['Objet']) {
- $out['Objet'] = self::VALIDATION_VALID;
- }
-
- if ($datas['CodeUniteLabintel']) {
- $out['CodeUniteLabintel'] = self::VALIDATION_VALID;
- }
-
- if ($datas['SigleUnite']) {
- $out['SigleUnite'] = self::VALIDATION_VALID;
- }
-
- if ($datas['NumContratTutelleGestionnaire']) {
- $out['NumContratTutelleGestionnaire'] = self::VALIDATION_VALID;
- }
-
- if ($datas['NumContratTutelleGestionnaire']) {
- $out['NumContratTutelleGestionnaire'] = self::VALIDATION_VALID;
- }
-
- if ($datas['TypeContrat'] != 'Aucun') {
- $out['TypeContrat'] = self::VALIDATION_VALID;
- }
-
- if ($datas['Acronyme']) {
- $out['Acronyme'] = self::VALIDATION_VALID;
- }
-
- if ($datas['ResponsableScientifique']) {
- $out['ResponsableScientifique'] = self::VALIDATION_VALID;
- }
-
- if ($datas['EmployeurResponsableScientifique']) {
- $out['EmployeurResponsableScientifique'] = self::VALIDATION_VALID;
- }
-
- if ($datas['PartenairePrincipal']) {
- $out['PartenairePrincipal'] = self::VALIDATION_VALID;
- }
-
- if ($datas['SourceFinancement']) {
- $out['SourceFinancement'] = self::VALIDATION_VALID;
- }
-
- if ($datas['LieuExecution']) {
- $out['LieuExecution'] = self::VALIDATION_VALID;
- }
-
- if ($datas['DateDerniereSignature']) {
- $out['DateDerniereSignature'] = self::VALIDATION_VALID;
- }
-
- if ($datas['DateDebut']) {
- $out['DateDebut'] = self::VALIDATION_VALID;
- }
-
- if ($datas['DateFin']) {
- $out['DateFin'] = self::VALIDATION_VALID;
- }
-
- if ($datas['MontantTotal']) {
- $out['MontantTotal'] = self::VALIDATION_VALID;
- }
-
-
- if ($datas['ValidePoleCompetivite'] == true) {
- $out['ValidePoleCompetivite'] = self::VALIDATION_VALID;
- $out['PoleCompetivite'] = self::VALIDATION_ERROR;
- if ($out['PoleCompetivite']) {
- $out['PoleCompetivite'] = self::VALIDATION_VALID;
- }
- }
-
- if ($datas['Reference']) {
- $out['Reference'] = self::VALIDATION_VALID;
- }
-
-
- if ($this->getDocumentId()) {
- $out['document_signed'] = self::VALIDATION_VALID;
- $out['contrat_signed'] = self::VALIDATION_VALID;
- } else {
- $this->addError("Le document du contrat est indisponible");
- }
-
- foreach ($out as $champ => $state) {
- if ($champ == 'contract_signed') {
- continue;
- }
- if ($state == self::VALIDATION_ERROR) {
- $this->status = self::STATUS_ERROR_DATA;
- $this->addError($this->getMessage($champ));
- }
- }
-
- return $out;
- }
-
- private static $messages;
-
- protected function getMessage($champ)
- {
- if (self::$messages === null) {
- self::$messages = [];
- self::$messages['SourceFinancement'] = "La source de financement est manquante, vous pouvez la renseigner depuis la fiche activité";
- self::$messages['TypeContrat'] = "Le type de contrat est manquant. Vous pouvez automatiser la correspondance Oscar/PCRU depuis l'interface d'administration et éditer le type manuellement";
- self::$messages['DateDerniereSignature'] = "La date de signature est manquante, vous pouvez la renseigner depuis la fiche activité";
- self::$messages['CodeUniteLabintel'] = "Le code de l'unité de recherche (Labintel) est manquant, il peut être complété depuis la fiche organisation (type UMR XXXX)";
- }
-
- if (array_key_exists($champ, self::$messages)) {
- return self::$messages[$champ];
- } else {
- return sprintf("Le champ %s n'est pas renseigné.", $champ);
- }
- }
-
- /**
- * @return mixed
- */
- public function getId()
- {
- return $this->id;
- }
-
- /**
- * @return Activity
- */
- public function getActivity(): Activity
- {
- return $this->activity;
- }
-
- /**
- * @param Activity $activity
- */
- public function setActivity(Activity $activity): self
- {
- $this->activity = $activity;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getObjet(): string
- {
- return $this->objet;
- }
-
- /**
- * @param string $objet
- */
- public function setObjet(string $objet): self
- {
- $this->objet = mb_substr($objet, 0, 1000);
- return $this;
- }
-
- /**
- * @return string
- */
- public function getCodeUniteLabintel(): string
- {
- return $this->codeUniteLabintel;
- }
-
- /**
- * @param string $codeUniteLabintel
- */
- public function setCodeUniteLabintel(string $codeUniteLabintel): self
- {
- $this->codeUniteLabintel = mb_substr($codeUniteLabintel, 0, 10);
- return $this;
- }
-
- /**
- * @return string
- */
- public function getSigleUnite(): string
- {
- return $this->sigleUnite;
- }
-
- /**
- * @param string $sigleUnite
- */
- public function setSigleUnite(string $sigleUnite): self
- {
- $this->sigleUnite = mb_substr($sigleUnite, 0, 20);
- ;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getNumContratTutelleGestionnaire(): string
- {
- return $this->numContratTutelleGestionnaire;
- }
-
- public function isSendable(): bool
- {
- return $this->getStatus() == self::STATUS_SEND_READY;
- }
-
- /**
- * @param string $numContratTutelleGestionnaire
- */
- public function setNumContratTutelleGestionnaire(string $numContratTutelleGestionnaire): self
- {
- $this->numContratTutelleGestionnaire = $numContratTutelleGestionnaire;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getEquipe(): string
- {
- return $this->equipe;
- }
-
- /**
- * @param string $equipe
- */
- public function setEquipe(string $equipe): self
- {
- $this->equipe = mb_substr($equipe, 0, 150);
- return $this;
- }
-
- /**
- * @return PcruTypeContract
- */
- public function getTypeContrat(): ?PcruTypeContract
- {
- return $this->typeContrat;
- }
-
- /**
- * @param PcruTypeContract $typeContrat
- */
- public function setTypeContrat(?PcruTypeContract $typeContrat): self
- {
- $this->typeContrat = $typeContrat;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getAcronyme(): string
- {
- return $this->acronyme;
- }
-
- /**
- * @param string $acronyme
- */
- public function setAcronyme(string $acronyme): self
- {
- $this->acronyme = mb_substr($acronyme, 0, 10);
- return $this;
- }
-
- /**
- * @return string
- */
- public function getContratsAssocies(): string
- {
- return $this->contratsAssocies;
- }
-
- /**
- * @param string $contratsAssocies
- */
- public function setContratsAssocies(string $contratsAssocies): self
- {
- $this->contratsAssocies = $contratsAssocies;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getResponsableScientifique(): string
- {
- return $this->responsableScientifique;
- }
-
- /**
- * @param string $responsableScientifique
- */
- public function setResponsableScientifique(string $responsableScientifique): self
- {
- $this->responsableScientifique = mb_substr($responsableScientifique, 0, 50);
- return $this;
- }
-
- /**
- * @return string
- */
- public function getEmployeurResponsableScientifique(): string
- {
- return $this->employeurResponsableScientifique;
- }
-
- /**
- * @param string $employeurResponsableScientifique
- */
- public function setEmployeurResponsableScientifique(string $employeurResponsableScientifique): self
- {
- $this->employeurResponsableScientifique = mb_substr($employeurResponsableScientifique, 0, 50);
- return $this;
- }
-
- /**
- * @return bool
- */
- public function isCoordinateurConsortium(): bool
- {
- return $this->coordinateurConsortium;
- }
-
- /**
- * @param bool $coordinateurConsortium
- */
- public function setCoordinateurConsortium(bool $coordinateurConsortium): self
- {
- $this->coordinateurConsortium = $coordinateurConsortium;
- return $this;
- }
-
- /**
- * @return bool
- */
- public function getPartenaires(): string
- {
- return $this->partenaires;
- }
-
- /**
- * @param string $partenaires
- */
- public function setPartenaires($partenaires): self
- {
- $this->partenaires = $partenaires;
- return $this;
- }
-
- /**
- * @return bool
- */
- public function getPartenairePrincipal(): string
- {
- return $this->partenairePrincipal;
- }
-
- /**
- * @param bool $partenairePrincipal
- */
- public function setPartenairePrincipal(string $partenairePrincipal): self
- {
- $this->partenairePrincipal = mb_substr($partenairePrincipal, 0, 50);
- return $this;
- }
-
- /**
- * @return string
- */
- public function getIdPartenairePrincipal(): string
- {
- return $this->idPartenairePrincipal;
- }
-
- /**
- * @param string $idPartenairePrincipal
- */
- public function setIdPartenairePrincipal(string $idPartenairePrincipal): self
- {
- $this->idPartenairePrincipal = mb_substr($idPartenairePrincipal, 0, 50);
- return $this;
- }
-
- /**
- * @return PcruSourceFinancement | null
- */
- public function getSourceFinancement()
- {
- return $this->sourceFinancement;
- }
-
- /**
- * @param PcruSourceFinancement $souceFinancement
- */
- public function setSourceFinancement($souceFinancement): self
- {
- $this->sourceFinancement = $souceFinancement;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getLieuExecution(): string
- {
- return $this->lieuExecution;
- }
-
- /**
- * @param string $lieuExecution
- */
- public function setLieuExecution(string $lieuExecution): self
- {
- $this->lieuExecution = mb_substr($lieuExecution, 0, 50);
- return $this;
- }
-
- /**
- * @return \DateTime
- */
- public function getDateDerniereSignature()
- {
- return $this->dateDerniereSignature;
- }
-
- public function getDateDerniereSignatureStr(): string
- {
- return $this->getDateDerniereSignature() ? $this->getDateDerniereSignature()->format('Y-m-d') : "";
- }
-
- /**
- * @param \DateTime $dateDerniereSignature
- */
- public function setDateDerniereSignature($dateDerniereSignature): self
- {
- $this->dateDerniereSignature = $dateDerniereSignature;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getDuree()
- {
- return $this->duree;
- }
-
- /**
- * @param string $duree
- */
- public function setDuree($duree): self
- {
- $this->duree = $duree;
- return $this;
- }
-
- /**
- * @return \DateTime
- */
- public function getDateDebut()
- {
- return $this->dateDebut;
- }
-
- public function getDateDebutStr(): string
- {
- return $this->getDateDebut() ? $this->getDateDebut()->format('Y-m-d') : "";
- }
-
- /**
- * @param \DateTime $dateDebut
- */
- public function setDateDebut($dateDebut): self
- {
- $this->dateDebut = $dateDebut;
- return $this;
- }
-
- /**
- * @return \DateTime
- */
- public function getDateFin()
- {
- return $this->dateFin;
- }
-
- public function getDateFinStr(): string
- {
- return $this->getDateFin() ? $this->getDateFin()->format('Y-m-d') : "";
- }
-
- /**
- * @param \DateTime $dateFin
- */
- public function setDateFin($dateFin): self
- {
- $this->dateFin = $dateFin;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getMontantPercuUnite(): string
- {
- return $this->montantPercuUnite;
- }
-
- /**
- * @param string $montantPercuUnite
- */
- public function setMontantPercuUnite(string $montantPercuUnite): self
- {
- $this->montantPercuUnite = $montantPercuUnite;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getCoutTotalEtude(): string
- {
- return $this->coutTotalEtude;
- }
-
- /**
- * @param string $coutTotalEtude
- */
- public function setCoutTotalEtude(string $coutTotalEtude): self
- {
- $this->coutTotalEtude = $coutTotalEtude;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getMontantTotal(): string
- {
- return $this->montantTotal;
- }
-
- /**
- * @param string $montantTotal
- */
- public function setMontantTotal(string $montantTotal): self
- {
- $this->montantTotal = $montantTotal;
- return $this;
- }
-
- /**
- * @return bool
- */
- public function isValidePoleCompetivite(): bool
- {
- return $this->validePoleCompetivite;
- }
-
- /**
- * @param bool $validePoleCompetivite
- */
- public function setValidePoleCompetivite(bool $validePoleCompetivite): self
- {
- $this->validePoleCompetivite = $validePoleCompetivite;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getPoleCompetivite(): string
- {
- return $this->poleCompetivite;
- }
-
- /**
- * @param string $poleCompetivite
- */
- public function setPoleCompetivite(string $poleCompetivite): self
- {
- $this->poleCompetivite = $poleCompetivite;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getCommentaires(): string
- {
- return $this->commentaires;
- }
-
- /**
- * @param string $commentaires
- */
- public function setCommentaires(string $commentaires): self
- {
- $this->commentaires = $commentaires;
- return $this;
- }
-
- /**
- * @return bool
- */
- public function isPia(): bool
- {
- return $this->pia;
- }
-
- /**
- * @param bool $pia
- */
- public function setPia(bool $pia): self
- {
- $this->pia = $pia;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getReference(): string
- {
- return $this->reference;
- }
-
- /**
- * @param string $reference
- */
- public function setReference(string $reference): self
- {
- $this->reference = mb_substr($reference, 0, 100);
- return $this;
- }
-
- /**
- * @return bool
- */
- public function isAccordCadre(): bool
- {
- return $this->accordCadre;
- }
-
- /**
- * @param bool $accordCadre
- */
- public function setAccordCadre(bool $accordCadre): self
- {
- $this->accordCadre = $accordCadre;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getCifre(): string
- {
- return $this->cifre;
- }
-
- /**
- * @param string $cifre
- */
- public function setCifre(string $cifre): self
- {
- $this->cifre = mb_substr($cifre, 0, 100);
- return $this;
- }
-
- /**
- * @return string
- */
- public function getChaireIndustrielle(): string
- {
- return $this->chaireIndustrielle;
- }
-
- /**
- * @param string $chaireIndustrielle
- */
- public function setChaireIndustrielle(string $chaireIndustrielle): self
- {
- $this->chaireIndustrielle = mb_substr($chaireIndustrielle, 0, 8);
- return $this;
- }
-
- /**
- * @return string
- */
- public function isPresencePartenaireIndustriel(): bool
- {
- return $this->PresencePartenaireIndustriel;
- }
-
-
-
- /**
- * @return int
- */
- public function getDocumentId(): ?int
- {
- return $this->documentId;
- }
-
- /**
- * @param int $documentId
- */
- public function setDocumentId(?int $documentId): self
- {
- $this->documentId = $documentId;
- return $this;
- }
-
- /**
- * @param bool $PresencePartenaireIndustriel
- */
- public function setPresencePartenaireIndustriel(bool $PresencePartenaireIndustriel): self
- {
- $this->PresencePartenaireIndustriel = $PresencePartenaireIndustriel;
- return $this;
- }
-
- public function getSignedFileName()
- {
- return $this->getNumContratTutelleGestionnaire() . ".pdf";
- }
-
- private $documentPath = null;
-
- public function setDocumentPath($path)
- {
- $this->documentPath = $path;
- return $this;
- }
-
- public function getDocumentPath()
- {
- return $this->documentPath;
- }
-
- /**
- * @return string
- */
- public function getStatus(): string
- {
- return $this->status;
- }
-
- /**
- * @return string
- */
- public function getStatusStr(): string
- {
- return self::statusStr($this->getStatus());
- }
-
- /**
- * @param string $status
- */
- public function setStatus(string $status): self
- {
- $this->status = $status;
- return $this;
- }
-
- /**
- * @return array
- */
- public function getError(): ?array
- {
- return $this->error;
- }
-
- public function addError($errorMessage): self
- {
- $this->error[] = $errorMessage;
- $this->setStatus(self::STATUS_ERROR_DATA);
- return $this;
- }
-
- /**
- * @param array $error
- */
- public function setError(?array $error): self
- {
- $this->error = $error;
- return $this;
- }
-
- public function getWarnings(): ?array
- {
- return $this->warnings;
- }
-
- public function addWarning(string $warningMessage): self
- {
- $this->warnings[] = $warningMessage;
- return $this;
- }
-
- public function setWarnings(?array $warnings): self
- {
- $this->warnings = $warnings;
- return $this;
- }
-
- /**
- * @return string
- */
- public function getErrorsRemote(): ?string
- {
- return $this->errorsRemote;
- }
-
- /**
- * @param string $errorsRemote
- */
- public function setErrorsRemote(?string $errorsRemote): self
- {
- $this->errorsRemote = $errorsRemote;
- return $this;
- }
-
- public function hasErrors(): bool
- {
- return $this->errorsRemote != null;
- }
-
- public function clearErrors(): void
- {
- $this->errorsRemote = null;
- }
-}
diff --git a/module/Oscar/src/Oscar/Entity/ActivityPcruInfosRepository.php b/module/Oscar/src/Oscar/Entity/ActivityPcruInfosRepository.php
deleted file mode 100644
index 7e720367f5930abc4db737515f5730abdcf4b290..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Entity/ActivityPcruInfosRepository.php
+++ /dev/null
@@ -1,58 +0,0 @@
-createQueryBuilder('i')
- ->where('i.status = :status')
- ->setParameter('status', ActivityPcruInfos::STATUS_SEND_READY);
- return $qb->getQuery()->getResult();
- }
-
- /**
- * Retourne la liste des envois en erreur
- * @return void
- */
- public function getPcruInfoActivityInError()
- {
- $qb = $this->createQueryBuilder('i');
- return $qb->getQuery()->getResult();
- }
-
- public function getPcruInfoActivityUnDone()
- {
- $status = [ActivityPcruInfos::STATUS_DRAFT, ActivityPcruInfos::STATUS_DONE];
- $qb = $this->createQueryBuilder('i');
- $qb->where('i.status not in (:status)')
- ->setParameters(["status" => $status]);
- return $qb->getQuery()->getResult();
- }
-
- public function getInfoActivity(int $activity_id): ActivityPcruInfos
- {
- $qb = $this->createQueryBuilder('i')
- ->where('i.activity = :activity_id')
- ->setParameter('activity_id', $activity_id);
-
- return $qb->getQuery()->getSingleResult();
- }
-
- public function getPcruInfoActivityFromOscarId(string $oscarId): ActivityPcruInfos
- {
- $qb = $this->createQueryBuilder('i')
- ->where('i.numContratTutelleGestionnaire = :oscarid')
- ->setParameter('oscarid', $oscarId);
-
- return $qb->getQuery()->getSingleResult();
- }
-}
diff --git a/module/Oscar/src/Oscar/Entity/Organization.php b/module/Oscar/src/Oscar/Entity/Organization.php
index 188cd0673b9010014eca8bdb0e5eebe0124daff6..578adac3a7bf4faf7593753263976a71c2e062a8 100644
--- a/module/Oscar/src/Oscar/Entity/Organization.php
+++ b/module/Oscar/src/Oscar/Entity/Organization.php
@@ -285,6 +285,14 @@ class Organization implements ResourceInterface, IConnectedObject
*/
protected $typeObj;
+ /**
+ * Type d'établissement PCRU (Objet).
+ *
+ * @var PcruTypeEtablissement
+ * @ORM\ManyToOne(targetEntity="PcruTypeEtablissement")
+ */
+ protected $typeEtablissementPcruObj;
+
/**
* Groupe (SIFAC).
*
@@ -560,6 +568,23 @@ class Organization implements ResourceInterface, IConnectedObject
return $this;
}
+ /**
+ * @return PcruTypeEtablissement
+ */
+ public function getTypeEtablissementPcruObj()
+ {
+ return $this->typeEtablissementPcruObj;
+ }
+
+ /**
+ * @param PcruTypeEtablissement $typeEtablissementPcruObj
+ */
+ public function setTypeEtablissementPcruObj($typeEtablissementPcruObj)
+ {
+ $this->typeEtablissementPcruObj = $typeEtablissementPcruObj;
+ return $this;
+ }
+
/**
* @return mixed
*/
diff --git a/module/Oscar/src/Oscar/Entity/PcruFtpLog.php b/module/Oscar/src/Oscar/Entity/PcruFtpLog.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd88591f0f54dfd5dde7580a9f7c19af399ef8b4
--- /dev/null
+++ b/module/Oscar/src/Oscar/Entity/PcruFtpLog.php
@@ -0,0 +1,123 @@
+createdAt = new \DateTime();
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * @return string
+ */
+ public function getStatus(): string
+ {
+ return $this->status;
+ }
+
+ /**
+ * @param string $status
+ */
+ public function setStatus(string $status): self
+ {
+ $this->status = $status;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getTitre(): ?string
+ {
+ return $this->titre;
+ }
+
+ /**
+ * @param ?string $titre
+ */
+ public function setTitre(?string $titre): self
+ {
+ $this->titre = $titre;
+ return $this;
+ }
+
+ /**
+ * @return ?string
+ */
+ public function getDetails(): ?string
+ {
+ return $this->details;
+ }
+
+ /**
+ * @param ?string $details
+ */
+ public function setDetails(?string $details): self
+ {
+ $this->details = $details;
+ return $this;
+ }
+
+ /**
+ * @return \DateTime
+ */
+ public function getCreatedAt(): \DateTime
+ {
+ return $this->createdAt;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Entity/PcruFtpLogRepository.php b/module/Oscar/src/Oscar/Entity/PcruFtpLogRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..f16133c3a2536af72926da0f85c0350b537a1b98
--- /dev/null
+++ b/module/Oscar/src/Oscar/Entity/PcruFtpLogRepository.php
@@ -0,0 +1,9 @@
+createQueryBuilder('ppc');
- $query->select('ppc.label');
+ $query->select('ppc.label')->orderBy('ppc.label', 'ASC');
$entities = $query->getQuery()->getResult();
return array_map('current', $entities);
}
diff --git a/module/Oscar/src/Oscar/Entity/PcruTypeEtablissement.php b/module/Oscar/src/Oscar/Entity/PcruTypeEtablissement.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5792dd158c64af2e9457a133c20cc244eb7c7c5
--- /dev/null
+++ b/module/Oscar/src/Oscar/Entity/PcruTypeEtablissement.php
@@ -0,0 +1,57 @@
+id;
+ }
+
+ /**
+ * @return string
+ */
+ public function getLabel(): string
+ {
+ return $this->label;
+ }
+
+ /**
+ * @param string $label
+ */
+ public function setLabel(string $label): self
+ {
+ $this->label = $label;
+ return $this;
+ }
+
+ function __toString()
+ {
+ return $this->getLabel();
+ }
+}
diff --git a/module/Oscar/src/Oscar/Entity/PcruTypeEtablissementRepository.php b/module/Oscar/src/Oscar/Entity/PcruTypeEtablissementRepository.php
new file mode 100644
index 0000000000000000000000000000000000000000..f56d5f411acd7c25983c224737d8355ceaa13adb
--- /dev/null
+++ b/module/Oscar/src/Oscar/Entity/PcruTypeEtablissementRepository.php
@@ -0,0 +1,26 @@
+createQueryBuilder('pte');
+ $query->select('pte.label');
+ $entities = $query->getQuery()->getResult();
+ return array_map('current', $entities);
+ }
+
+ /**
+ * @param string $label
+ * @return PcruTypeEtablissement|null
+ */
+ public function getByLabel(string $label): ?PcruTypeEtablissement
+ {
+ return $this->findOneByLabel($label);
+ }
+}
diff --git a/module/Oscar/src/Oscar/Exception/OscarPCRUException.php b/module/Oscar/src/Oscar/Exception/OscarPCRUException.php
index 2612814e321f45990faa91c16f596b8922bb2194..8d32d171f9cb8974995648dc0e791f7ded6f5f24 100644
--- a/module/Oscar/src/Oscar/Exception/OscarPCRUException.php
+++ b/module/Oscar/src/Oscar/Exception/OscarPCRUException.php
@@ -6,5 +6,5 @@ namespace Oscar\Exception;
class OscarPCRUException extends OscarException
{
-
+ public $details = array();
}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Factory/ActivityPcruInfoFromActivityFactory.php b/module/Oscar/src/Oscar/Factory/ActivityPcruInfoFromActivityFactory.php
deleted file mode 100644
index 34ab837c96059e963d37fa5bcb0a7bf01e74e7c0..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Factory/ActivityPcruInfoFromActivityFactory.php
+++ /dev/null
@@ -1,216 +0,0 @@
-oscarConfigurationService = $oscarConfigurationService;
- $this->entityManager = $entityManager;
- }
-
-
- /**
- * Création des données PCRU à partir des données de l'activité.
- *
- * @param Activity $activity
- * @return ActivityPcruInfos
- * @throws \Doctrine\ORM\NonUniqueResultException
- */
- public function createNew(Activity $activity): ActivityPcruInfos
- {
- // Données PCRU
- $activityPcruInfos = new ActivityPcruInfos();
-
- // Erreurs métiers
- $errors = [];
-
- // --- Recherche automatique de l'Unité (Laboratoire)
-
- // Intitulé du rôle "Laboratoire" pour PCRU
- $roleStructureToFind = $this->oscarConfigurationService->getPcruUnitRoles();
- $rolePartnerToFind = $this->oscarConfigurationService->getPcruPartnerRoles();
-
- // Donnèes trouvées
- $codeUniteLabintel = "";
- $sigleUnit = "";
- $idPartenairePrincipal = "";
- $labelPartenairePrincipal = "";
-
- // Récupération des laboratoires
-
- $structures = $activity->getOrganizationsWithOneRoleIn($roleStructureToFind);
-
- if (count($structures) == 0) {
- $activityPcruInfos->addError(
- "Aucune structure " . implode("/", $roleStructureToFind) . " pour cette activité ."
- );
- }
-
- $organizationsParsed = [];
-
- /** @var ActivityOrganization $unite */
- foreach ($activity->getOrganizationsWithOneRoleIn($roleStructureToFind) as $unite) {
- $organizationsParsed[] = (string)$unite;
- if ($unite->getLabintel()) {
- $codeUniteLabintel = $unite->getLabintel();
- $sigleUnit = $unite->getShortName();
- }
- }
-
- $partners = [];
- /** @var Organization $partner */
- foreach ($activity->getOrganizationsWithOneRoleIn($rolePartnerToFind) as $partner) {
- if ($partner->getCodePcru()) {
- if ($idPartenairePrincipal == "") {
- $idPartenairePrincipal = $partner->getCodePcru();
- $labelPartenairePrincipal = (string) $partner;
- } else {
- $partners[] = $partner->getCodePcru();
- }
- }
- }
- if ($codeUniteLabintel == "") {
- $activityPcruInfos->addError(
- "Aucune des structures trouvées (" .implode("/", $roleStructureToFind).") n'ont de code LABINTEL valide"
- );
- }
-
- // --- Recherche automatique du responsable scientifique
- $roleRSToFind = $this->oscarConfigurationService->getPcruInChargeRole();
- $responsable = "";
-
- /** @var ActivityPerson $personActivity */
- foreach ($activity->getPersonsWithRole($roleRSToFind) as $personActivity) {
- $responsable = $personActivity->getPerson()->getFirstname() . " " . strtoupper(
- $personActivity->getPerson()->getLastname()
- );
- }
-
- // Document signé
- $typeDocumentSigne = $this->oscarConfigurationService->getPcruContractType();
- $documentSigned = null;
- $documentId = null;
-
- /** @var ContractDocument $document */
- foreach ($activity->getDocuments() as $document) {
- if ($document->getTypeDocument()->getLabel() == $typeDocumentSigne) {
- // Test sur les versions
- if ($documentSigned != null) {
- // On regarde si on est pas entrain de parser une ancienne version du fichier
- if ($documentName == $document->getFileName()) {
- continue;
- }
- $activityPcruInfos->addError("Il y'a plusieurs $typeDocumentSigne sur cette activité");
- } else {
- $documentSigned = $document->getPath();
- $documentName = $document->getFileName();
- $documentId = $document->getId();
- }
- }
- }
-
- if (!$documentSigned) {
- $activityPcruInfos->addError(
- "Oscar n'a pas trouvé de document '$typeDocumentSigne' à utiliser pour la soumission PCRU."
- );
- }
-
- /** @var PcruTypeContractRepository $pcruContractTypeRepository */
- $pcruContractTypeRepository = $this->entityManager->getRepository(PcruTypeContract::class);
-
- $activityPcruInfos->setActivity($activity)
- ->setDocumentPath($documentSigned)
- ->setDocumentId($documentId)
- ->setSigleUnite($sigleUnit)
- ->setPartenaires(implode('|', $partners))
- ->setPoleCompetivite($activity->getPcruPoleCompetitiviteStr())
- ->setNumContratTutelleGestionnaire($activity->getOscarNum())
- ->setValidePoleCompetivite($activity->isPcruPolePoleCompetitiviteStr())
- ->setSourceFinancement($activity->getPcruSourceFinancementStr())
- ->setIdPartenairePrincipal($idPartenairePrincipal)
- ->setResponsableScientifique($responsable)
- ->setCodeUniteLabintel($codeUniteLabintel)
- ->setObjet($activity->getLabel())
- ->setAcronyme($activity->getAcronym())
- ->setMontantTotal($activity->getAmount())
- ->setDateDebut($activity->getDateStart())
- ->setDateFin($activity->getDateEnd())
- ->setDateDerniereSignature($activity->getDateSigned())
- ->setReference($activity->getOscarNum());
-
- // Patch (si le type d'activité est inconnu)
- if ($activity->getActivityType()) {
- $pcruType = $pcruContractTypeRepository->getPcruContractForActivityTypeChained(
- $activity->getActivityType()
- );
- $activityPcruInfos->setTypeContrat($pcruType);
- }
-
- return $activityPcruInfos;
- }
-
- public function getHeaders()
- {
- return [
- 'Objet' => "Intitulé de l'activité",
- 'CodeUniteLabintel' => 'Code LABINTEL (extrait depuis la fiche organisation)',
- 'SigleUnite' => 'Extrait depuis la fiche organisation (nom court)',
- 'NumContratTutelleGestionnaire' => 'N°Oscar',
- 'Equipe' => 'off',
- 'TypeContrat' => '',
- 'Acronyme' => "Acronyme du projet de l'activité",
- 'ContratsAssocies' => 'off',
- 'ResponsableScientifique' => 'Nom de la personne ayant le rôle "'. $this->oscarConfigurationService->getPcruInChargeRole() . '"',
- 'EmployeurResponsableScientifique' => 'off',
- 'CoordinateurConsortium' => 'off',
- 'Partenaires' => 'off',
- 'PartenairePrincipal' => 'off',
- 'IdPartenairePrincipal' => 'off',
- 'SourceFinancement' => 'Extrait de la fiche activité',
- 'LieuExecution' => 'off',
- 'DateDerniereSignature' => 'Extrait de la fiche activité',
- 'Duree' => 'off',
- 'DateDebut' => 'Extrait de la fiche activité',
- 'DateFin' => 'Extrait de la fiche activité',
- 'MontantPercuUnite' => 'off',
- 'CoutTotalEtude' => 'off',
- 'MontantTotal' => 'Extrait de la fiche activité',
- 'ValidePoleCompetivite' => 'Extrait de la fiche activité',
- 'PoleCompetivite' => 'Extrait de la fiche activité',
- 'Commentaires' => 'off',
- 'Pia' => 'off',
- 'Reference' => '',
- 'AccordCadre' => 'off',
- 'Cifre' => 'off',
- 'ChaireIndustrielle' => 'off',
- 'PresencePartenaireIndustriel' => 'off',
- ];
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Form/ActivityInfosPcruForm.php b/module/Oscar/src/Oscar/Form/ActivityInfosPcruForm.php
deleted file mode 100644
index b24f6b51c829a0ffea2bb076ed75acfd23367e9f..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Form/ActivityInfosPcruForm.php
+++ /dev/null
@@ -1,492 +0,0 @@
-
- * @copyright Certic (c) 2021
- */
-class ActivityInfosPcruForm extends \Laminas\Form\Form implements InputFilterProviderInterface
-{
-
- private $projectGrantService;
- private $activity;
-
- function __construct(ProjectGrantService $projectGrantService, Activity $activity)
- {
- parent::__construct('activityinfospcru');
- $this->projectGrantService = $projectGrantService;
- $this->activity = $activity;
- }
-
- public function init(){
- $this->setHydrator(new ActivityInfosPCRUFormHydrator($this->projectGrantService));
-
- $this->add(array(
- 'name' => 'objet',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- 'readonly' => "readonly"
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'codeunitelabintel',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'sigleunite',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'numcontrattutellegestionnaire',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- 'readonly' => "readonly"
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'equipe',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
-
- $this->add(array(
- 'name' => 'typecontrat',
- 'type' => 'Select',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ],
- 'value_options' => $this->projectGrantService->getPcruTypeContractSelect()
- )
- ));
-
- $this->add(array(
- 'name' => 'acronyme',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'contratsassocies',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'responsablescientifique',
- 'type' => 'Select',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ],
- 'value_options' => $this->projectGrantService->getPCRUService()->getResponsableScientifiques($this->activity)
- )
- ));
-
- $this->add(array(
- 'name' => 'employeurresponsablescientifique',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'coordinateurconsortium',
- 'type' => 'Checkbox',
- 'attributes' => [
- 'class' => 'checkbox',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'partenaires',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'partenaireprincipal',
- 'type' => 'Select',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ],
- 'value_options' => $this->projectGrantService->getPCRUService()->getActivityPartenaires($this->activity)
- )
- ));
-
-
- $this->add(array(
- 'name' => 'idpartenaireprincipal',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- 'readonly' => 'readonly'
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'sourcefinancement',
- 'type' => 'Select',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'value_options' => $this->projectGrantService->getPcruSourceFinancementSelect(),
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'lieuexecution',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'datedernieresignature',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'duree',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'datedebut',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'datefin',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'montantpercuunite',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'couttotaletude',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'montanttotal',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'datedebut',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'polecompetivite',
- 'type' => 'Select',
- 'attributes' => [
-
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ],
- 'value_options' => $this->projectGrantService->getPcruPoleCompetitiviteSelect()
- )
- ));
-
- $this->add(array(
- 'name' => 'validepolecompetivite',
- 'type' => 'Checkbox',
- 'attributes' => [
-
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'commentaires',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'pia',
- 'type' => 'Checkbox',
- 'attributes' => [
- 'class' => '',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'reference',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- 'readonly' => "readonly"
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'accordcadre',
- 'type' => 'Checkbox',
- 'attributes' => [
-
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'cifre',
- 'type' => 'Checkbox',
- 'attributes' => [
-
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'chaireindustrielle',
- 'type' => 'Text',
- 'attributes' => [
- 'class' => 'form-control',
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
- $this->add(array(
- 'name' => 'presencepartenaireindustriel',
- 'type' => 'Checkbox',
- 'attributes' => [
- ],
- 'options' => array(
- 'label_attributes' => [
- 'class' => 'form-label required'
- ]
- )
- ));
-
-
- }
-
- public function getInputFilterSpecification()
- {
- return [
- 'dateStart'=> [
- 'required' => false,
- ],
-
- 'dateEnd'=> [
- 'required' => false,
- ],
-
- 'polecompetivite'=> [
- 'required' => false,
- ]
- ];
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Form/OrganizationIdentificationForm.php b/module/Oscar/src/Oscar/Form/OrganizationIdentificationForm.php
index 91aae4f918c03ab7f421120e505489f8b297b6d7..127d3c88f09ecc5b8f30969afca4831eec5c764f 100644
--- a/module/Oscar/src/Oscar/Form/OrganizationIdentificationForm.php
+++ b/module/Oscar/src/Oscar/Form/OrganizationIdentificationForm.php
@@ -20,16 +20,18 @@ class OrganizationIdentificationForm extends \Laminas\Form\Form implements Input
private $connectors = [];
private $types = [];
+ private $typesEtablissementPcru = [];
private $countries = [];
private bool $countryRequired = false;
private bool $typeRequired = false;
- public function __construct(OrganizationService $organizationService, $types = [])
+ public function __construct(OrganizationService $organizationService, $types = [], $typesEtablissementPcru = [])
{
parent::__construct('organization');
$this->connectors = $organizationService->getConnectorsList();
$this->countries = $organizationService->getCountriesIso366Labels();
$this->types = $types;
+ $this->typesEtablissementPcru = $typesEtablissementPcru;
}
public function configureRequired(array $params): void
@@ -40,7 +42,7 @@ class OrganizationIdentificationForm extends \Laminas\Form\Form implements Input
public function init(): void
{
- $this->setHydrator(new OrganizationFormHydrator($this->connectors, $this->types, $this->countries));
+ $this->setHydrator(new OrganizationFormHydrator($this->connectors, $this->types, $this->typesEtablissementPcru, $this->countries));
$typesSelect = [];
$typesSelect[] = "";
@@ -49,6 +51,13 @@ class OrganizationIdentificationForm extends \Laminas\Form\Form implements Input
$typesSelect[$id] = (string)$t;
}
+ $typesEtablissementPcruSelect = [];
+ $typesEtablissementPcruSelect[] = "";
+
+ foreach ($this->typesEtablissementPcru as $id=>$t ){
+ $typesEtablissementPcruSelect[$id] = (string)$t;
+ }
+
$this->add(array(
'name' => 'id',
'type' => 'Hidden',
@@ -82,6 +91,18 @@ class OrganizationIdentificationForm extends \Laminas\Form\Form implements Input
'type' => 'Select'
]);
+ // Type établissement PCRU
+ $this->add([
+ 'name' => 'typeEtablissementPcruObj',
+ 'options' => [
+ 'label' => 'Type d\'établissement PCRU',
+ 'value_options' => $typesEtablissementPcruSelect
+ ],
+ 'attributes' => [
+ 'class' => 'form-control'
+ ],
+ 'type'=>'Select'
+ ]);
$shortName = new Element\Text('shortName');
$shortName->setAttributes([
diff --git a/module/Oscar/src/Oscar/Formatter/PCRU/ActivityPcruInfosToFormArray.php b/module/Oscar/src/Oscar/Formatter/PCRU/ActivityPcruInfosToFormArray.php
deleted file mode 100644
index a7bf37053191ed2acfaae573394265d72613d7aa..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Formatter/PCRU/ActivityPcruInfosToFormArray.php
+++ /dev/null
@@ -1,51 +0,0 @@
- $activityPcruInfos->getId(),
- 'objet' => $activityPcruInfos->getObjet(),
- 'codeUniteLabintel' => $activityPcruInfos->getCodeUniteLabintel(),
- 'sigleUnite' => $activityPcruInfos->getSigleUnite(),
- 'numContratTutelleGestionnaire' => $activityPcruInfos->getNumContratTutelleGestionnaire(),
- 'equipe' => $activityPcruInfos->getEquipe(),
- 'typeContrat' => $activityPcruInfos->getTypeContrat(),
- 'acronyme' => $activityPcruInfos->getAcronyme(),
- 'contratsAssocies' => $activityPcruInfos->getContratsAssocies(),
- 'responsableScientifique' => $activityPcruInfos->getResponsableScientifique(),
- 'employeurResponsableScientifique' => $activityPcruInfos->getEmployeurResponsableScientifique(),
- 'coordinateurConsortium' => $activityPcruInfos->isCoordinateurConsortium(),
- 'partenaires' => $activityPcruInfos->getPartenaires(),
- 'partenairePrincipal' => $activityPcruInfos->isPartenairePrincipal(),
- 'idPartenairePrincipal' => $activityPcruInfos->getIdPartenairePrincipal(),
- 'sourceFinancement' => $activityPcruInfos->getSourceFinancement(),
- 'lieuExecution' => $activityPcruInfos->getLieuExecution(),
- 'dateDerniereSignature' => DateTimeUtils::toStr($activityPcruInfos->getDateDerniereSignature(), 'd-m-Y'),
- 'duree' => $activityPcruInfos->getDuree(),
- 'dateDebut' => DateTimeUtils::toStr($activityPcruInfos->getDateDebut(), 'd-m-Y'),
- 'dateFin' => DateTimeUtils::toStr($activityPcruInfos->getDateFin(), 'd-m-Y'),
- 'montantPercuUnite' => $activityPcruInfos->getMontantPercuUnite(),
- 'coutTotalEtude' => $activityPcruInfos->getCoutTotalEtude(),
- 'montantTotal' => $activityPcruInfos->getMontantTotal(),
- 'validePoleCompetivite' => $activityPcruInfos->isValidePoleCompetivite(),
- 'poleCompetivite' => $activityPcruInfos->getPoleCompetivite(),
- 'commentaires' => $activityPcruInfos->getCommentaires(),
- 'pia' => $activityPcruInfos->isPia(),
- 'reference' => $activityPcruInfos->getReference(),
- 'accordCadre' => $activityPcruInfos->isAccordCadre(),
- 'cifre' => $activityPcruInfos->getCifre(),
- 'chaireIndustrielle' => $activityPcruInfos->getChaireIndustrielle(),
- 'presencepartenaireindustriel' => $activityPcruInfos->isPresencePartenaireIndustriel(),
- ];
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Formatter/PCRU/ActivityToPCRUFormatter.php b/module/Oscar/src/Oscar/Formatter/PCRU/ActivityToPCRUFormatter.php
deleted file mode 100644
index 773be3acf2aaedea77ea9bbc540f4856591577d5..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Formatter/PCRU/ActivityToPCRUFormatter.php
+++ /dev/null
@@ -1,47 +0,0 @@
-getLabel(), 1000);
-
- $output['CodeUniteLabintel'] = '';
- $output['SigleUnite'] = '';
-
- $output['NumContratTutelleGestionnaire'] = $activity->getOscarNum();
- $output['TypeContrat'] = ''; // TODO Type de contrat PCRU
- $output['Acronyme'] = StringUtils::truncate($activity->getAcronym(), 50);
-
- $output['ContratsAssocies'] = ''; // TODO Identifiants des tutelles de gestion
- $output['ResponsableScientifique'] = ''; // TODO Identifiants des tutelles de gestion
- $output['EmployeurResponsableScientifique'] = ''; // TODO
- $output['CoordinateurConsortium'] = ''; // TODO
- $output['Partenaires'] = ''; // TODO
- $output['PartenairePrincipal'] = ''; // TODO
- $output['IdPartenairePrincipal'] = ''; // TODO
- $output['SourceFinancement'] = ''; // TODO
-
- $output['LieuExecution'] = ''; // TODO
-
- $output['DateDerniereSignature'] = ''; // TODO
-
- // Temps
- $output['Duree'] = ''; // TODO
- $output['DateDebut'] = ''; // TODO
- $output['DateFin'] = ''; // TODO
-
- // Tunasse
- $output['MontantPercuUnite'] = ''; // TODO
- $output['CoutTotalEtude'] = ''; // TODO
-
- return $output;
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Hydrator/ActivityInfosPCRUFormHydrator.php b/module/Oscar/src/Oscar/Hydrator/ActivityInfosPCRUFormHydrator.php
deleted file mode 100644
index a16bda370ec2f952af00aafd99619cbd67fad702..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Hydrator/ActivityInfosPCRUFormHydrator.php
+++ /dev/null
@@ -1,127 +0,0 @@
-
- * @copyright Certic (c) 2021
- */
-
-namespace Oscar\Hydrator;
-
-
-use Oscar\Entity\ActivityPcruInfos;
-use Oscar\Service\ProjectGrantService;
-use Laminas\Hydrator\HydratorInterface;
-
-class ActivityInfosPCRUFormHydrator implements HydratorInterface
-{
- private $projectGrantService;
-
- /**
- * OrganizationFormHydrator constructor.
- */
- public function __construct(ProjectGrantService $projectGrantService)
- {
- $this->projectGrantService = $projectGrantService;
- }
-
-
- /**
- * @param array $data
- * @param ActivityPcruInfos $object
- */
- public function hydrate(array $data, $object)
- {
- $object->setObjet($data['objet']);
- $object->setCodeUniteLabintel($data['codeunitelabintel']);
- $object->setSigleUnite($data['sigleunite']);
- //$object->setFullName($data['fullname']);
- $object->setNumContratTutelleGestionnaire($data['numcontrattutellegestionnaire']);
- $object->setReference($data['reference']);
- $object->setEquipe($data['equipe']);
-
- $typeContrat = $this->projectGrantService->getPcruTypeContratRepository()->getPcruTypeContratByLabel(
- $data['typecontrat']
- );
- $object->setTypeContrat($typeContrat);
-
- $object->setAcronyme($data["acronyme"]);
- $object->setContratsAssocies($data["contratsassocies"]);
- $object->setResponsableScientifique($data["responsablescientifique"]);
- $object->setEmployeurResponsableScientifique($data["employeurresponsablescientifique"]);
- $object->setCoordinateurConsortium($data["coordinateurconsortium"]);
- $object->setPartenaires($data["partenaires"]);
- $object->setPartenairePrincipal($data["partenaireprincipal"]);
- $object->setIdPartenairePrincipal($data["idpartenaireprincipal"]);
-
- $sourceFinancement = $this->projectGrantService->getPcruSourceFinancementRepository()->findOneByLabel(
- $data['sourcefinancement']
- );
- $object->setSourceFinancement($sourceFinancement);
-
- $dateSignature = $data["datedernieresignature"] ? new \DateTime($data["datedernieresignature"]) : null;
- $object->setDateDerniereSignature($dateSignature);
-
- $object->setDuree($data["duree"]);
-
- $dateDebut = $data["datedebut"] ? new \DateTime($data["datedebut"]) : null;
- $object->setDateDebut($dateDebut);
-
- $dateFin = $data["datefin"] ? new \DateTime($data["datefin"]) : null;
- $object->setDateDebut($dateFin);
-
- $object->setMontantPercuUnite(floatval($data["montantpercuunite"]));
- $object->setCoutTotalEtude(floatval($data["couttotaletude"]));
- $object->setMontantTotal(floatval($data["montanttotal"]));
- $object->setValidePoleCompetivite($data["validepolecompetivite"]);
- $object->setPoleCompetivite($data["polecompetivite"]);
- $object->setCommentaires($data["commentaires"]);
- $object->setPia($data["pia"]);
- $object->setAccordCadre($data["accordcadre"]);
- $object->setCifre($data["cifre"]);
- $object->setChaireIndustrielle($data["chaireindustrielle"]);
- $object->setPresencePartenaireIndustriel($data["presencepartenaireindustriel"]);
-
- return $object;
- }
-
- /**
- * @param ActivityPcruInfos $object
- * @return array
- */
- public function extract(object $object): array
- {
- $datas = [
- 'objet' => $object->getObjet(),
- 'codeunitelabintel' => $object->getCodeUniteLabintel(),
- 'sigleunite' => $object->getSigleUnite(),
- 'numcontrattutellegestionnaire' => $object->getNumContratTutelleGestionnaire(),
- 'reference' => $object->getReference(),
- 'equipe' => $object->getEquipe(),
- "typecontrat" => $object->getTypeContrat() ? $object->getTypeContrat()->getLabel() : "",
- "acronyme" => $object->getAcronyme(),
- "contratsassocies" => $object->getContratsAssocies(),
- "responsablescientifique" => $object->getResponsableScientifique(),
- "employeurresponsablescientifique" => $object->getEmployeurResponsableScientifique(),
- "coordinateurconsortium" => $object->isCoordinateurConsortium(),
- "partenaires" => $object->getPartenaires(),
- "partenaireprincipal" => $object->getIdPartenairePrincipal(),
- "idpartenaireprincipal" => $object->getIdPartenairePrincipal(),
- "sourcefinancement" => $object->getSourceFinancement(),
- "datedernieresignature" => $object->getDateDerniereSignatureStr(),
- "duree" => $object->getDuree(),
- "datedebut" => $object->getDateDebutStr(),
- "datefin" => $object->getDateFinStr(),
- "montantpercuunite" => $object->getMontantPercuUnite(),
- "montanttotal" => $object->getMontantTotal(),
- "validepolecompetivite" => $object->isValidePoleCompetivite(),
- "polecompetivite" => $object->getPoleCompetivite(),
- "commentaires" => $object->getCommentaires(),
- "pia" => $object->isPia(),
- "accordcadre" => $object->isAccordCadre(),
- "cifre" => $object->getCifre(),
- "chaireindustrielle" => $object->getChaireIndustrielle(),
- "presencepartenaireindustriel" => $object->isPresencePartenaireIndustriel(),
- ];
-
- return $datas;
- }
-}
diff --git a/module/Oscar/src/Oscar/Hydrator/OrganizationFormHydrator.php b/module/Oscar/src/Oscar/Hydrator/OrganizationFormHydrator.php
index 88ec03db0de50e71c0d7c252d3fc9065a5771137..5517602487c6026241383b694ba46aed9f4c9e15 100644
--- a/module/Oscar/src/Oscar/Hydrator/OrganizationFormHydrator.php
+++ b/module/Oscar/src/Oscar/Hydrator/OrganizationFormHydrator.php
@@ -15,6 +15,7 @@ class OrganizationFormHydrator implements HydratorInterface
{
private $connectors;
private $types;
+ private $typesEtablissementPcru;
private $countries;
/**
@@ -22,10 +23,11 @@ class OrganizationFormHydrator implements HydratorInterface
* @param $connectors
* @param $types
*/
- public function __construct($connectors, $types, $countries)
+ public function __construct($connectors, $types, $typesEtablissementPcru, $countries)
{
$this->connectors = $connectors;
$this->types = $types;
+ $this->typesEtablissementPcru = $typesEtablissementPcru;
$this->countries = $countries;
}
@@ -37,8 +39,10 @@ class OrganizationFormHydrator implements HydratorInterface
public function hydrate(array $data, $object)
{
$type = array_key_exists($data['typeObj'], $this->types) ? $this->types[$data['typeObj']] : null;
+ $typeEtablissementPcru = array_key_exists($data['typeEtablissementPcruObj'], $this->typesEtablissementPcru) ? $this->typesEtablissementPcru[$data['typeEtablissementPcruObj']] : null;
$object->setTypeObj($type);
+ $object->setTypeEtablissementPcruObj($typeEtablissementPcru);
$object->setShortName($data['shortName']);
$object->setCode($data['code']);
$object->setSiret($data['siret']);
@@ -92,6 +96,7 @@ class OrganizationFormHydrator implements HydratorInterface
'tvaintra' => $object->getTvaintra(),
'typeObj' => $object->getTypeObj() ? $object->getTypeObj()->getId() : null,
+ 'typeEtablissementPcruObj' => $object->getTypeEtablissementPcruObj() ? $object->getTypeEtablissementPcruObj()->getId() : null,
'siret' => $object->getSiret(),
'fullname' => $object->getFullName(),
'dateStart' => $object->getDateStart() ? $object->getDateStart()->format('Y-m-d') : '',
diff --git a/module/Oscar/src/Oscar/Service/OrganizationService.php b/module/Oscar/src/Oscar/Service/OrganizationService.php
index a1b2c02c0239642a4855fe2e71a4eed59db29d7f..29320a7957fcac0878fd1b371586ece1b7014b00 100644
--- a/module/Oscar/src/Oscar/Service/OrganizationService.php
+++ b/module/Oscar/src/Oscar/Service/OrganizationService.php
@@ -23,6 +23,7 @@ use Oscar\Entity\OrganizationRole;
use Oscar\Entity\OrganizationRoleRepository;
use Oscar\Entity\OrganizationType;
use Oscar\Entity\OrganizationTypeRepository;
+use Oscar\Entity\PcruTypeEtablissement;
use Oscar\Entity\Person;
use Oscar\Entity\ProjectPartner;
use Oscar\Entity\Role;
@@ -647,6 +648,18 @@ class OrganizationService implements UseOscarConfigurationService, UseEntityMana
return $options;
}
+
+ public function getOrganizationTypesEtablissementPcruObject()
+ {
+ $options = [];
+
+ $types = $this->getEntityManager()->getRepository(PcruTypeEtablissement::class)->findBy([], ['label' => 'ASC']);
+ foreach ($types as $type) {
+ $options[$type->getId()] = $type;
+ }
+ return $options;
+ }
+
public function getOrganizationTypesSelect()
{
$options = [];
diff --git a/module/Oscar/src/Oscar/Service/OscarConfigurationService.php b/module/Oscar/src/Oscar/Service/OscarConfigurationService.php
index 71bdb2f08cdd87b275853f1a5063bf89f5efd630..84688fd3b9a3a08bada47662c6f79818770c4a08 100644
--- a/module/Oscar/src/Oscar/Service/OscarConfigurationService.php
+++ b/module/Oscar/src/Oscar/Service/OscarConfigurationService.php
@@ -653,6 +653,7 @@ class OscarConfigurationService implements ServiceLocatorAwareInterface
const PCRU_UNITE_ROLE_DEFAULT = 'Laboratoire';
const PCRU_PARTNER_ROLE_DEFAULT = 'Partenaire';
+ const PCRU_PARTENAIRE_PRINCIPAL_ROLE_DEFAULT = 'Partenaire';
const PCRU_INCHARGE_ROLE_DEFAULT = 'Responsable scientifique';
/**
@@ -677,6 +678,14 @@ class OscarConfigurationService implements ServiceLocatorAwareInterface
return $this->getEditableConfKey('pcru_partner_roles', [self::PCRU_PARTNER_ROLE_DEFAULT]);
}
+ /**
+ * @return string
+ */
+ public function getPcruPartenairePrincipalRoles(): array
+ {
+ return $this->getEditableConfKey('pcru_partenaire_principal_roles', [self::PCRU_PARTENAIRE_PRINCIPAL_ROLE_DEFAULT]);
+ }
+
/**
* @return string
*/
@@ -746,133 +755,6 @@ class OscarConfigurationService implements ServiceLocatorAwareInterface
return $this->saveEditableConfKey(self::financial_description, $description);
}
- /**
- * Retourne le dossier racine PCRU.
- *
- * @return string
- * @throws OscarException
- */
- public function getPcruRootDirectory(): string
- {
- static $pcru_root = null;
- if ($pcru_root === null) {
- // Test de la racine PCRU
- $path = realpath($this->getConfiguration('pcru.files_path'));
- if (!file_exists($path)) {
- throw new OscarException(
- "Erreur de configuration PCRU : Le dossier de traitement temporaire n'existe pas"
- );
- }
- if (!is_dir($path)) {
- throw new OscarException(
- "Erreur de configuration PCRU : Le dossier de traitement temporaire doit être un dossier"
- );
- }
- if (!is_writable($path)) {
- throw new OscarException(
- "Erreur de configuration PCRU : Le dossier de traitement doit être accessible en écriture"
- );
- }
- $pcru_root = $path;
- }
- return $pcru_root;
- }
-
- /**
- * Retourne le dossier où sont archivés les fichiers avant l'envoi PCRU.
- *
- * @return string
- * @throws OscarException
- */
- public function getPcruDirectoryForUpload(): string
- {
- static $pcru_pool = null;
- if ($pcru_pool === null) {
- // Test de la racine PCRU
- $path = $this->getPcruRootDirectory() . DIRECTORY_SEPARATOR . $this->getConfiguration('pcru.pool_current');
-
- if (!file_exists($path)) {
- if (!@mkdir($path)) {
- throw new OscarException("Erreur de configuration PCRU : Impossible de créer le dossier d'envoi");
- }
- }
-
- if (!is_dir($path)) {
- throw new OscarException("Erreur de configuration PCRU : Le dossier d'envoi doit être un dossier");
- }
-
- if (!is_writable($path)) {
- throw new OscarException(
- "Erreur de configuration PCRU : Le dossier d'envoi doit être accessible en écriture"
- );
- }
-
- $pcru_pool = $path;
- }
- return $pcru_pool;
- }
-
- public function getPcruDirectoryForUploadEffective(): string
- {
- return $this->getPcruRootDirectory()
- . DIRECTORY_SEPARATOR
- . $this->getConfiguration('pcru.pool_effective');
- }
-
- public function getPcruPoolLockFile(): string
- {
- return $this->getPcruDirectoryForUpload()
- . DIRECTORY_SEPARATOR
- . $this->getConfiguration('pcru.pool_lock');
- }
-
- public function getPcruLogPoolFile(): string
- {
- return $this->getPcruDirectoryForUpload()
- . DIRECTORY_SEPARATOR
- . $this->getConfiguration('pcru.pool_log');
- }
-
- /**
- * @param bool $withPath
- * @return string
- * @throws OscarException
- */
- public function getPcruContratFile($withPath = true): string
- {
- return $withPath ?
- $this->getPcruDirectoryForUpload()
- . DIRECTORY_SEPARATOR
- . $this->getConfiguration('pcru.filename_contrats')
- :
- $this->getConfiguration('pcru.filename_contrats');
- }
-
- public function getPcruSendCsvOkFile(): string
- {
- return $this->getConfiguration('pcru.filename_csv_ok');
- }
-
- public function getPcruSendPdfOkFile(): string
- {
- return $this->getConfiguration('pcru.filename_pdf_ok');
- }
-
- /**
- * @param bool $withPath
- * @return string
- * @throws OscarException
- */
- public function getPcruPartenaireFile($withPath = true): string
- {
- return $withPath ?
- $this->getPcruDirectoryForUpload()
- . DIRECTORY_SEPARATOR
- . $this->getConfiguration('pcru.filename_partenaires')
- :
- $this->getConfiguration('pcru.filename_partenaires');
- }
-
/**
* Retourne le chemin absolue du stockage des documents sans catégorie/non-privé (Activités de recherche).
*
diff --git a/module/Oscar/src/Oscar/Service/PCRUService.php b/module/Oscar/src/Oscar/Service/PCRUService.php
index 20b81af1a5fc01b3ad798bb4650197e43bad2565..91bc2d46646128bc4350edebfb68a658be234763 100644
--- a/module/Oscar/src/Oscar/Service/PCRUService.php
+++ b/module/Oscar/src/Oscar/Service/PCRUService.php
@@ -3,22 +3,11 @@
namespace Oscar\Service;
-
-use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
-use Doctrine\ORM\NoResultException;
-use Oscar\Entity\Activity;
-use Oscar\Entity\ActivityOrganization;
-use Oscar\Entity\ActivityPcruInfos;
-use Oscar\Entity\ActivityPcruInfosRepository;
-use Oscar\Entity\ActivityRepository;
-use Oscar\Entity\ContractDocument;
-use Oscar\Entity\Organization;
use Oscar\Entity\PcruPoleCompetitivite;
use Oscar\Entity\PcruSourceFinancement;
use Oscar\Entity\PcruTypeContract;
+use Oscar\Entity\PcruTypeEtablissement;
use Oscar\Exception\OscarException;
-use Oscar\Exception\OscarPCRUException;
-use Oscar\Factory\ActivityPcruInfoFromActivityFactory;
use Oscar\Traits\UseEntityManager;
use Oscar\Traits\UseEntityManagerTrait;
use Oscar\Traits\UseLoggerService;
@@ -27,1066 +16,12 @@ use Oscar\Traits\UseOscarConfigurationService;
use Oscar\Traits\UseOscarConfigurationServiceTrait;
use Oscar\Traits\UseServiceContainer;
use Oscar\Traits\UseServiceContainerTrait;
-use Oscar\Utils\PCRUCvsFile;
-use Oscar\Validator\PCRUPartnerValidator;
-use Oscar\Validator\PCRUUnitValidator;
-use Oscar\Validator\PCRUValidator;
use PHPUnit\Exception;
-use Symfony\Component\Console\Style\SymfonyStyle;
class PCRUService implements UseLoggerService, UseOscarConfigurationService, UseEntityManager, UseServiceContainer
{
use UseEntityManagerTrait, UseOscarConfigurationServiceTrait, UseLoggerServiceTrait, UseServiceContainerTrait;
- /// 0. Services et Paramètres
-
- /**
- * @return ProjectGrantService
- */
- public function getProjectGrantService()
- {
- return $this->getServiceContainer()->get(ProjectGrantService::class);
- }
-
- /**
- * @return ActivityPcruInfosRepository
- */
- public function getActivityPCRUInfoRepository()
- {
- return $this->getEntityManager()->getRepository(ActivityPcruInfos::class);
- }
-
-
- /**
- * / Paramètres
- * 'files_path' => __DIR__.'/../../tmp',
- * 'filename_contrats' => 'contrat.csv',
- * 'filename_partenaires' => 'partenaire.csv',
- */
- public function getDirectoryForUpload(): string
- {
- return $this->getOscarConfigurationService()->getPcruDirectoryForUpload();
- }
-
- /**
- * @param bool $withPath
- * @return string
- * @throws OscarException
- */
- public function getContratFile($withPath = true): string
- {
- return $this->getOscarConfigurationService()->getPcruContratFile($withPath);
- }
-
- /**
- * @param bool $withPath
- * @return string
- * @throws OscarException
- */
- public function getPartenaireFile($withPath = true): string
- {
- return $this->getOscarConfigurationService()->getPcruPartenaireFile($withPath);
- }
-
- public function getParenairesHeaders(): array
- {
- return [
- "LibelleCourt",
- "LibelleLong",
- "Siren",
- "Siret",
- "TvaIntra",
- "Duns",
- "TypeEtablissement",
- "Adresse",
- "CodePostal",
- "Ville",
- "Pays",
- ];
- }
-
- public function getPartenaireData(Organization $organization): array
- {
- return [
- $organization->getShortName(),
- $organization->getFullName(),
- "",
- $organization->getSiret(),
- $organization->getTvaintra(),
- $organization->getDuns(),
- "1",
- $organization->getStreet1(),
- $organization->getZipCode(),
- $organization->getCity(),
- $organization->getCountry()
- ];
- }
-
- public function getOrganizationByCodePCRU($codePcru): ?Organization
- {
- return $this->getEntityManager()->getRepository(Organization::class)->getOrganizationByCodePCRU($codePcru);
- }
-
- /////////////////////////// Gestion des étapes
- ///
- const STEP_0_NOTHING_TO_DO = 'STEP_0_NOTHING_TO_DO';
- const STEP_1_CONTRACT_CSV_READY_TO_SEND = 'STEP_1_CONTRACT_CSV_READY_TO_SEND';
- const STEP_2_CONTRACT_CSV_WAIT_PCRU_RESPONSE = 'STEP_2_CONTRACT_CSV_WAIT_PCRU_RESPONSE';
- const STEP_3_CONTRACT_CSV_ERROR_PCRU_RESPONSE = 'STEP_3_CONTRACT_CSV_ERROR_PCRU_RESPONSE';
- const STEP_4_CONTRACT_CSV_OK_PCRU_RESPONSE = 'STEP_4_CONTRACT_CSV_OK_PCRU_RESPONSE';
- const STEP_5_CONTRACT_PDF_READY_TO_SEND = 'STEP_5_CONTRACT_PDF_READY_TO_SEND';
- const STEP_6_CONTRACT_PDF_WAIT_PCRU_RESPONSE = 'STEP_6_CONTRACT_PDF_WAIT_PCRU_RESPONSE';
-
- public function getCurrentStep() :string
- {
- var_dump($this->getDirectoryForUpload());
- die();
- }
-
- public function process() :void
- {
-
- }
-
- ///
-
- /// 1. Récupération des donnèes PCRU
-
- /**
- * @param null $settings
- * @return ActivityPcruInfos[]
- */
- public function getPcruInfos($settings = null): array
- {
- return $this->getActivityPCRUInfoRepository()->findAll();
- }
-
- /**
- * Activation de PCRU pour une activité de recherche.
- *
- * @param Activity $activity
- * @param false $json
- * @throws OscarException
- * @throws \Doctrine\ORM\ORMException
- * @throws \Doctrine\ORM\OptimisticLockException
- */
- public function activateActivity(Activity $activity, ?ActivityPcruInfos $pcruInfos = null, $json = false): void
- {
- if (!$this->getOscarConfigurationService()->getPcruEnabled()) {
- throw new OscarException("Le module PCR n'est pas activé");
- }
-
- if ($pcruInfos == null) {
- $factory = new ActivityPcruInfoFromActivityFactory(
- $this->getOscarConfigurationService(),
- $this->getEntityManager()
- );
- $pcruInfos = $factory->createNew($activity);
- }
-
- // Contrôle des informations
- $pcruValidation = new PCRUValidator($this->getOscarConfigurationService(), $this->getEntityManager());
- $validation = $pcruValidation->validate($pcruInfos);
- if (count($pcruValidation->getErrors()) > 0) {
- throw new OscarException(
- "Impossible d'activer PCRU pour cette activité, des données sont manquantes/erronées"
- );
- }
-
- try {
- $pcruInfos->setStatus(ActivityPcruInfos::STATUS_SEND_READY);
- $this->getEntityManager()->persist($pcruInfos);
- $this->getEntityManager()->flush($pcruInfos);
- } catch (UniqueConstraintViolationException $e) {
- throw new OscarException("Les donnèes PCRU de cette activité existent déjà");
- }
-
- if ($this->isPoolOpen()) {
- $this->addToPool($pcruInfos);
- }
- }
-
-
- public function updatePcruInfos(Activity $activity, ?ActivityPcruInfos $pcruInfos = null, $json = false): void
- {
- if (!$this->getOscarConfigurationService()->getPcruEnabled()) {
- throw new OscarException("Le module PCR n'est pas activé");
- }
-
- if ($pcruInfos == null) {
- $factory = new ActivityPcruInfoFromActivityFactory(
- $this->getOscarConfigurationService(),
- $this->getEntityManager()
- );
- $pcruInfos = $factory->createNew($activity);
- }
-
- try {
- $pcruInfos->setStatus(ActivityPcruInfos::STATUS_DRAFT);
- $pcruValidation = new PCRUValidator($this->getOscarConfigurationService(), $this->getEntityManager());
- $validation = $pcruValidation->validate($pcruInfos);
-
- $this->getEntityManager()->persist($pcruInfos);
- $this->getEntityManager()->flush($pcruInfos);
- } catch (UniqueConstraintViolationException $e) {
- throw new OscarException("Les donnèes PCRU de cette activité existent déjà");
- } catch (\Exception $e) {
- throw new OscarException(sprintf("Une erreur est survenue lors de l'enregistrement des données PCRU : %s", $e->getMessage()));
- }
- }
-
- /**
- * @return bool
- */
- public function isPoolOpen(): bool
- {
- $lockfile = $this->getOscarConfigurationService()->getPcruPoolLockFile();
- return !file_exists($lockfile);
- }
-
- /**
- * Télécharge un aperçu des documents PCRU pour l'activité donnée.
- *
- * @param Activity $activity
- */
- public function downloadOne(Activity $activity): void
- {
- $num = $activity->getOscarNum();
-
- $ziptmp = "/tmp/pcru-preview-zip-$num-" . uniqid() . ".zip";
- $csvtmp = "/tmp/pcru-preview-csv-$num-" . uniqid() . ".csv";
- $pdftmp = "/tmp/pcru-preview-pdf-$num-" . uniqid() . ".pdf";
- $orgtmp = "/tmp/pcru-preview-org-$num-" . uniqid() . ".csv";
-
- // Récupération des données
- $pcruInfos = $this->getPcruInfosActivity($activity);
-
-
- if (!$pcruInfos) {
- $factory = new ActivityPcruInfoFromActivityFactory(
- $this->getOscarConfigurationService(),
- $this->getEntityManager()
- );
- $pcruInfos = $factory->createNew($activity);
- }
-
- $csvFile = new PCRUCvsFile($this);
- $csvFile->addEntry($pcruInfos);
- $csvFile->writeContratsCsv($csvtmp, $this->getEntityManager());
- $csvFile->writePartenairesCSV($orgtmp);
-
- file_put_contents($pdftmp, $csvFile->getDocumentSignedFromPcruInfo($pcruInfos));
-
- // Création de l'archive
- $zip = new \ZipArchive();
- if ($zip->open($ziptmp, \ZipArchive::CREATE) !== true) {
- throw new OscarPCRUException("Impossible de créer l'archive");
- }
- $zip->addFile($csvtmp, $this->getOscarConfigurationService()->getPcruContratFile(false));
- if (file_exists($orgtmp)) {
- $zip->addFile($orgtmp, $this->getOscarConfigurationService()->getPcruPartenaireFile(false));
- }
- $zip->addFile($pdftmp, $num . '.pdf');
- $zip->close();
-
- header('Content-Description: File Transfer');
- header('Content-Type: application/octet-stream');
- header('Content-Disposition: attachment; filename="oscar-pcru-preview-' . $num . '.zip"');
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- readfile($ziptmp);
-
- unlink($csvtmp);
- unlink($pdftmp);
- unlink($ziptmp);
- exit;
- }
-
- /**
- * Suppression d'un contrat en attente.
- *
- * @param int $idActivityPcruInfo
- * @throws OscarException
- * @throws \Doctrine\ORM\ORMException
- * @throws \Doctrine\ORM\OptimisticLockException
- */
- public function removeWaiting(int $idActivityPcruInfo): void
- {
- // Récupération du PCRUInfo et vérifier l'état
- /** @var ActivityPcruInfos $pcruInfo */
- $pcruInfo = $this->getActivityPCRUInfoRepository()->find($idActivityPcruInfo);
-
- $this->getLoggerService()->debug("Suppression PCRU (en attente)");
-
- if ($pcruInfo == null) {
- throw new OscarException("Informations PCRU introuvable (id = $idActivityPcruInfo)");
- }
-
- if (!$pcruInfo->isWaiting()) {
- throw new OscarException(
- "Impossible de réinitialiser des informations PCRU qui ne sont pas en attente d'envoi"
- );
- }
-
- // Retirer du CSV
- $csvFile = new PCRUCvsFile($this);
- $csvFile->readCSV();
- $csvFile->purgeFiles();
- $csvFile->remove($pcruInfo);
- $this->getEntityManager()->remove($pcruInfo);
- $this->getEntityManager()->flush();
- $csvFile->generateFiles();
- }
-
- /**
- * Ajoute une activité à la file d'attente du prochain envoi PCRU.
- *
- * @param $activityOrPcruInfos
- * @throws OscarException
- * @throws \Doctrine\ORM\ORMException
- * @throws \Doctrine\ORM\OptimisticLockException
- */
- public function addToPool($activityOrPcruInfos): void
- {
- if ($this->isPoolOpen()) {
- $this->logPool("Ajout $activityOrPcruInfos à la pile d'envoi");
- // Récupération des données PCRU
- $pcruInfos = null;
- if (get_class($activityOrPcruInfos) == ActivityPcruInfos::class) {
- $pcruInfos = $activityOrPcruInfos;
- } elseif (get_class($activityOrPcruInfos) == Activity::class) {
- $pcruInfos = $this->getPcruInfosActivity($activityOrPcruInfos);
- } else {
- $this->logPool("ERROR : type de données");
- throw new OscarPCRUException(
- "Impossible d'ajouter ces donnèes au prochain envoi : Type de données incorrect."
- );
- }
-
- try {
- } catch (\Exception $e) {
- $this->logPool("ERROR : " . $e->getMessage());
- throw new OscarPCRUException(
- sprintf("Impossible de préparer %s pour l'envoi : %s", $pcruInfos, $e->getMessage())
- );
- }
- } else {
- throw new OscarPCRUException("Un envoi PCRU est déjà en cours");
- }
-
- if (!$pcruInfos->isSendable()) {
- $err = "Les données PCRU pour " . $pcruInfos->getNumContratTutelleGestionnaire(
- ) . " ne peuvent pas être envoyées : sont statut est " . $pcruInfos->getStatusStr();
- $this->logPool("ERROR : " . $err);
- throw new OscarPCRUException($err);
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /// Génération des documents
- $csvFile = new PCRUCvsFile($this);
- $csvFile->readCSV();
- if (!$csvFile->entryExist($pcruInfos)) {
- $csvFile->addEntry($pcruInfos);
- }
- $csvFile->writeContratsCsv();
- $csvFile->writePartenairesCSV();
- $csvFile->writeContratsPDF();
- $pcruInfos->setStatus(ActivityPcruInfos::STATUS_FILE_READY);
- $this->getEntityManager()->flush($pcruInfos);
- }
-
- private $_logpool;
-
- public function logPool(string $message): void
- {
- if ($this->_logpool == null) {
- $this->_logpool = fopen($this->getOscarConfigurationService()->getPcruLogPoolFile(), 'w');
- }
- $msg = sprintf("%s \t%s\n", date('Y-m-d h:i:s'), $message);
- fwrite($this->_logpool, $msg);
- }
-
- public function __destruct()
- {
- if ($this->_logpool) {
- fclose($this->_logpool);
- }
- }
-
- /**
- * Retourne les informations PCRU de l'activité.
- *
- * @param Activity $activity
- * @return ActivityPcruInfos|null
- */
- public function getPcruInfosActivity(Activity $activity): ?ActivityPcruInfos
- {
- try {
- return $this->getActivityPCRUInfoRepository()->getInfoActivity($activity->getId());
- } catch (NoResultException $e) {
- return null;
- }
- }
-
- /**
- * Retourne les informations PCRU à partir du numéro Oscar.
- *
- * @param $numOscar
- * @return ActivityPcruInfos
- */
- public function getInfosByNumOscar($numOscar): ?ActivityPcruInfos
- {
- return $this->getActivityPCRUInfoRepository()->findOneBy(['numContratTutelleGestionnaire' => $numOscar]);
- }
-
- public function resetTmpPcruInfos(Activity $activity): void
- {
- $pcruInfos = $this->getPcruInfosActivity($activity);
- if ($pcruInfos) {
- $this->getEntityManager()->remove($pcruInfos);
- $this->getEntityManager()->flush();
- }
- }
-
- public function getContratPath(Activity $activity): string
- {
- }
-
- /**
- * Retourne le type de document utilisé pour désigner les contrat définitif signé.
- *
- * @return string
- */
- public function getContractSignedType(): string
- {
- }
-
-
- /**
- * Affichage des donnèes PCRU :
- * - Si elles existent déjà, les donnèes affichées sont celle enregistrées en base de données.
- * - Sinon, des donnèes temporaires sont créées pour l'affichage uniquement.
- *
- * @param Activity $activity
- * @param false $json
- * @return array
- * @throws OscarException
- */
- public function getPreview(Activity $activity, $json = false): array
- {
- if (!$this->getOscarConfigurationService()->getPcruEnabled()) {
- throw new OscarException("Le module PCR n'est pas activé");
- }
-
-
- // Récupération des données
- $pcruInfos = $this->getPcruInfosActivity($activity);
- $preview = false;
- $factory = new ActivityPcruInfoFromActivityFactory(
- $this->getOscarConfigurationService(),
- $this->getEntityManager()
- );
-
- if (!$pcruInfos) {
- $preview = true;
-
- $pcruInfos = $factory->createNew($activity);
- }
-
- $headers = $factory->getHeaders();
- $datas = $pcruInfos->toArray($this->getEntityManager());
-
- $pcruValidation = new PCRUValidator($this->getOscarConfigurationService(), $this->getEntityManager());
- $validation = $pcruValidation->validate($pcruInfos);
- $documentPath = "";
- if( $pcruInfos->getDocumentId() ){
- $documentPath = $this->getDocumentPath($pcruInfos->getDocumentId());
- }
-
- // Contrôle des organisations
- $validatorPartner = new PCRUPartnerValidator();
- foreach ($activity->getOrganizationsWithOneRoleIn($this->getOscarConfigurationService()->getPcruPartnerRoles()) as $partner) {
- if( !$validatorPartner->isValid($partner) ){
- $msg = implode(',', $validatorPartner->getMessages());
- $pcruInfos->addError(sprintf($msg, $partner));
- }
- }
-
- $validatorUnit = new PCRUUnitValidator();
- $unitValid = false;
-
- foreach ($activity->getOrganizationsWithOneRoleIn($this->getOscarConfigurationService()->getPcruUnitRoles()) as $partner) {
- if( !$validatorUnit->isValid($partner) ){
- $msg = implode(',', $validatorUnit->getMessages());
- $pcruInfos->addWarning(sprintf($msg, $partner));
- } else {
- echo "OK";
- $unitValid = true;
- }
- }
- if( $unitValid === false ){
- $pcruInfos->addError("Aucune unité valide");
- }
-
- return [
- 'validations' => $validation,
- 'headers' => $headers,
- 'datas' => $datas,
- 'activity' => $json ? $activity->toArray() : $activity,
- 'documentPath' => $documentPath,
- 'infos' => $pcruInfos,
- 'errors' => $pcruInfos->getError(),
- 'warnings' => $pcruInfos->getWarnings(),
- 'status' => $pcruInfos->getStatus(),
- 'preview' => $preview
- ];
- }
-
- public function getDocumentPath($documentId): string
- {
- $baseLocation = $this->getOscarConfigurationService()->getDocumentDropLocation();
- /** @var ContractDocument $document */
- $document = $this->getEntityManager()->getRepository(ContractDocument::class)->find($documentId);
- return $baseLocation . $document->getPath();
- }
-
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- private $pcruDepotStrategy;
-
- public function generateFileContentForActivity($numOscar, $withHeader = false)
- {
- // Récupération de l'activité
- /** @var ActivityRepository $activityRepository */
- $activityRepository = $this->getEntityManager()->getRepository(Activity::class);
-
- $activity = $activityRepository->getActivityByNumOscar($numOscar, true);
-
- $infos = $this->getDataFactory()->createNew($activity);
-
- $buffer = tmpfile();
- $tmpfile_path = stream_get_meta_data($buffer)['uri'];
-
- if ($withHeader == true) {
- fputcsv($buffer, array_keys($this->getDataFactory()->getHeaders()), ';');
- }
-
- fputcsv($buffer, $infos->toArray($this->getEntityManager()), ";");
-
- $content = file_get_contents($tmpfile_path);
-
- fclose($buffer);
-
- return $content;
- }
-
- /**
- * Récupération des partenaires éligibles PCRU.
- *
- * @param Activity $activity
- * @return array
- */
- public function getActivityPartenaires(Activity $activity): array
- {
- $out = [];
- $out[""] = "Aucun";
- /** @var ActivityOrganization $org */
- foreach ($activity->getOrganizationsDeep() as $org) {
- if ($org->getOrganization()->getCodePcru()) {
- $out[$org->getOrganization()->getCodePcru()] = $org->getOrganization()->__toString();
- }
- }
-
- return $out;
- }
-
- /**
- * Récupération des partenaires éligibles PCRU.
- *
- * @param Activity $activity
- * @return array
- */
- public function getResponsableScientifiques(Activity $activity): array
- {
- $roleStr = $this->getOscarConfigurationService()->getPcruInChargeRole();
- $out = [];
- /** @var ActivityPerson $per */
- foreach ($activity->getPersonsDeep() as $per) {
- if ($per->getRoleObj()->getRoleId() == $roleStr) {
- $out[$per->getPerson()->getFullname()] = $per->getPerson()->getFullname();
- }
- }
-
- return $out;
- }
-
- /**
- * @return ActivityPcruInfoFromActivityFactory
- */
- protected function getDataFactory()
- {
- static $factory;
- if ($factory === null) {
- $factory = new ActivityPcruInfoFromActivityFactory(
- $this->getOscarConfigurationService(),
- $this->getEntityManager()
- );
- }
- return $factory;
- }
-
- public function getHeaders(){
- return $this->getDataFactory()->getHeaders();
- }
-
- protected function getPCRUDepotStrategy()
- {
- if ($this->pcruDepotStrategy === null) {
- // Récupération de la configuration PCRU dans la configuration Oscar
- }
- }
-
- protected function getConfiguration()
- {
- return $this->getOscarConfigurationService()->getPcruFtpInfos();
- }
-
- /**
- * Connexion au serveur FTP PCRU.
- *
- * @return false|resource
- * @throws OscarPCRUException
- */
- public function getFtpAccess()
- {
- static $conn;
- if ($conn == null) {
- // Configuration FTP
- $config = $this->getConfiguration();
- $this->log("FTP access to '" . $config['host'].":".$config['port']."'");
- $this->logPool("Connexion '".$config['host'].":".$config['port']."'");
- $conn = ssh2_connect($config['host'], $config['port']);
- if ($conn == null) {
- $err = error_get_last()['message'];
- $this->logPool("Erreur : '". $err . "'");
- $this->error("Can't connect to '".$config['host']."') : $err");
- throw new \Exception("Impossible de se connecter au serveur FTP");
- } else {
- $this->log("FTP access OK");
- $this->logPool("Success");
- }
- }
-
- return $conn;
- }
-
- /**
- * Authentification au serveur FTP PCRU.
- *
- * @return false|resource
- * @throws OscarPCRUException
- */
- public function ftpConnect()
- {
- $config = $this->getConfiguration();
- $conn = $this->getFtpAccess();
- $this->log("FTP Authentification with '".$config['user']."'");
- $this->logPool("FTP Authentification '".$config['user']."' / '".$config['pass']."'");
- if (!ssh2_auth_password($conn, $config['user'], $config['pass'])) {
- $err = error_get_last();
- $this->logPool("Error : '$err'");
- $this->error("Authentification fail : '$err'" );
- throw new OscarException("Echec de l'authentification");
- } else {
- $this->log("FTP Authentification OK");
- $this->logPool("Authentification OK");
- }
- return $conn;
- }
-
- /**
- * Retourne la liste des fichiers "en attente".
- *
- * @param bool $ignoreLogFile
- * @return array
- * @throws OscarException
- */
- public function getUploadableFiles($ignoreLogFile = true)
- {
- $files = [];
- $path = $this->getOscarConfigurationService()->getPcruDirectoryForUpload();
-
- if ($handle = opendir($path)) {
- while (false !== ($entry = readdir($handle))) {
- if ($entry == '.' || $entry == '..') {
- continue;
- }
- if ($entry == basename($this->getOscarConfigurationService()->getPcruLogPoolFile())) {
- continue;
- }
- $filepath = $path . DIRECTORY_SEPARATOR . $entry;
- if (!is_dir($filepath)) {
- $files[] = [
- 'path' => $filepath,
- 'name' => $entry
- ];
- }
- }
- closedir($handle);
- }
- return $files;
- }
-
- /**
- * Retourne TRUE si des données en attente sont disponibles.
- *
- * @return bool
- * @throws OscarException
- */
- public function hasDownload()
- {
- return file_exists($this->getOscarConfigurationService()->getPcruContratFile());
- }
-
- /**
- * Retourne TRUE si des données envoyées sont en attente d'un retour.
- *
- * @return bool
- */
- public function hasUploadInProgress()
- {
- $path = $this->getOscarConfigurationService()->getPcruDirectoryForUploadEffective();
- return file_exists($path);
- }
-
- protected function sftp_put_file($sftp_ressource, $file) :void
- {
- var_dump(is_readable($file));
- $filename = basename($file);
- $data = file_get_contents($file);
- $this->sftp_put_file_data($sftp_ressource, $filename, $data);
- }
-
- protected function sftp_put_file_data($sftp_ressource, string $filename, string $data ) :void
- {
- $writer = fopen('ssh2.sftp://' . intval($sftp_ressource) . '/Echanges/' . $filename, 'w');
- if( fwrite($writer, $data) ){
- $this->logPool(" - OK write '$filename'");
- } else {
- $errors = error_get_last();
- $err = 'Erreur inconnue';
- if( is_array($errors) ){
- $err = $errors['message'];
- }
- $this->logPool(" - ERROR write '$filename' : $err with '$data'");
- throw new \Exception($err);
- }
- fclose($writer);
- }
-
- /**
- * Chargement du fichier distant.
- *
- * @param $sftp_ressource
- * @param $filename
- * @return string
- * @throws \Exception
- */
- protected function sftp_get_file($sftp_ressource, $filename) :string
- {
- $fileURI = 'ssh2.sftp://' . intval($sftp_ressource) . '/Echanges/' . $filename;
- $this->log("GET FILE '$filename' ($fileURI)");
- $reader = @fopen($fileURI, 'r');
- if( !$reader ){
- $this->log("File not found");
- throw new \Exception("Can't open '$filename'");
- }
- if( ($content = fread($reader, filesize($fileURI))) ){
- return $content;
- } else {
- $errors = error_get_last();
- $err = 'Erreur inconnue';
- if( is_array($errors) ){
- $err = $errors['message'];
- }
- $this->error("ERROR FILE READ : '$err'");
- throw new \Exception($err);
- }
- fclose($reader);
- return "";
- }
-
- protected function sftp_remove_file($sftp_ressource, $filename) :string
- {
- $fileURI = 'ssh2.sftp://' . intval($sftp_ressource) . '/Echanges/' . $filename;
- $this->log("REMOVE FILE '$filename' ($fileURI)");
- if( unlink($fileURI) ){
- $this->log("REMOVE OK");
- return "";
- } else {
- $this->error("REMOVE FAIL");
- }
- return "";
- }
-
- const PCRU_ERRORS_JSON_FILE = 'DEPOT-CSV.ERRORS.json';
-
-
- public function checkLocalErrors() :void
- {
- $localErrors = $this->getActivityPCRUInfoRepository()->getPcruInfoActivityInError();
- /** @var ActivityPcruInfos $info */
- foreach ($localErrors as $info){
- echo " - " . $info->getStatus() . "\n";
- }
- die();
- }
-
- /**
- * Contrôle la présence d'un fichier d'erreur, le traite avant de le supprimer.
- *
- * @param $ftp_ressource
- * @return void
- * @throws \Doctrine\ORM\ORMException
- * @throws \Doctrine\ORM\OptimisticLockException
- */
- public function checkRemoteErrors($ftp_ressource) :void
- {
- $this->log("Check for remote errors...");
- try {
- $content_get = $this->sftp_get_file($ftp_ressource, self::PCRU_ERRORS_JSON_FILE);
- } catch (\Exception $e) {
- throw new \Exception("NO_ERROR");
- }
-
- $this->log("Remote error result found...");
- // Patch caractère vide
- $pos = strpos($content_get, '');
- if( $pos === 0 ){
- $this->log("ZWNBSP patch apply");
- $content_get = substr($content_get, 3);
- }
-
- $json_errors = json_decode($content_get);
- if( $json_errors === null ){
- $err = json_last_error_msg();
- $this->error("PARSE JSON FAIL : $err");
- throw new \Exception("JSON ERROR '$err' dans '$content_get'");
- } else {
- foreach($json_errors->contratsWithErrors as $error){
- $activityOscarId = $error->id;
- $errors = implode(', ', $error->errors );
- $this->log("Activity mark as error '$activityOscarId' : '$errors'");
- $pcruinfos = $this->getActivityPCRUInfoRepository()->getPcruInfoActivityFromOscarId($activityOscarId);
- $pcruinfos->setErrorsRemote($errors)
- ->setStatus(ActivityPcruInfos::STATUS_ERROR_DATA);
- $this->getEntityManager()->flush();
- }
- }
- $this->sftp_remove_file($ftp_ressource,self::PCRU_ERRORS_JSON_FILE);
- $this->sftp_remove_file($ftp_ressource,$this->getOscarConfigurationService()->getPcruContratFile());
- $this->sftp_remove_file($ftp_ressource,$this->getOscarConfigurationService()->getPcruPartenaireFile());
-
- throw new \Exception("JSON ERROR");
- }
-
- public function upload(): array
- {
- $output = [
- "message" => "",
- "errors" => [],
- "logs" => [],
- ];
-
- $pcruActivities = $this->getActivityPCRUInfoRepository()->getPcruInfoActivityUnDone();
-
- if( count($pcruActivities) == 0 ){
- $output['message'] = "Rien à faire";
- return $output;
- }
-
- $status_global = null;
- /** @var ActivityPcruInfos $pcruInfoActivity */
- foreach ($pcruActivities as $pcruInfoActivity) {
- if( $status_global != null ) continue;
- if( $pcruInfoActivity->getStatus() === ActivityPcruInfos::STATUS_ERROR_DATA ){
- $output['message'] = "Il y'a des erreurs dans le dernier envoi, merci de les corriger";
- return $output;
- }
- if( $pcruInfoActivity->getStatus() === ActivityPcruInfos::STATUS_SEND_PENDING ){
- $status_global = ActivityPcruInfos::STATUS_SEND_PENDING;
- }
- }
-
- $co = $this->ftpConnect();
- $sftp = ssh2_sftp($co);
-
- switch($status_global){
- case ActivityPcruInfos::STATUS_SEND_PENDING;
- // TRAITEMENT du RETOUR
- try {
- $this->checkRemoteErrors($sftp);
- } catch (\Exception $e) {
- if( $e->getMessage() != 'NO_ERROR' ){
- die("Il y'a des erreurs");
- }
- else {
-
- }
- }
-
- }
-
- return $output;
-
-
- die();
-
- if ($this->hasUploadInProgress()) {
- throw new OscarPCRUException("Une soumission PCRU est déjà en attente de traitement.");
- }
-
- $files = $this->getUploadableFiles(true);
-
- if (count($files) <= 1) {
- throw new OscarPCRUException("Aucune donnèes PCRU en attente.");
- }
-
- $remotePath = 'Echanges';
-
- // Lecture du fichier CSV pour tagguer les Informations PCRU à traiter
- $infos = [];
- $contractFile = $this->getOscarConfigurationService()->getPcruContratFile();
- if (!file_exists($contractFile)) {
- throw new OscarPCRUException("Erreur PCRU : Les fichiers des contrats sont absents.");
- }
-
- $first = true;
- if (($handle = fopen($contractFile, "r")) !== false) {
- while (($data = fgetcsv($handle, 1000, ";")) !== false) {
- if ($first) {
- $first = false;
- continue;
- }
- $num = $data[3];
- $info = $this->getInfosByNumOscar($data[3]);
- if ($info->getStatus() == ActivityPcruInfos::STATUS_FILE_READY) {
- $info->setStatus(ActivityPcruInfos::STATUS_SEND_PENDING);
- $this->getEntityManager()->flush($info);
- $pdf = "$num.pdf";
- $infos[$pdf] = $info;
- } else {
- $err = "Erreur PCRU : Le contrat " . $data[3] . " n'a pas le bon statut...";
- $this->logPool($err);
- $this->getLoggerService()->throwAdvancedLoggedError($err, "");
- throw new OscarException($err);
- }
- }
- fclose($handle);
- }
-
- $local_file = '/tmp/PCRU_MARKER.tmp';
- $remote_file = $remotePath . DIRECTORY_SEPARATOR . 'RETOUR-PCRU.OK';
- $pcruResponseFile = $remotePath . DIRECTORY_SEPARATOR . 'CONTRACT-PCRU.csv';
-
- ////////////////////////////////////////// ETAPE 1
- $this->logPool("Envoi ETAPE 1 (Fichiers de base)");
-
- $fileContractLocal = $this->getOscarConfigurationService()->getPcruContratFile(true);
- //$filePartners = $this->getOscarConfigurationService()->getPcruPartenaireFile(true);
-
- $this->sftp_put_file($sftp, $fileContractLocal);
- //$this->sftp_put_file($sftp, $filePartners);
-
- // création du marqueur
- $this->sftp_put_file_data($sftp, $this->getOscarConfigurationService()->getPcruSendCsvOkFile(), "done");
-
-
- }
-
- /**
- * Génère les donnèes PCRU à partir de l'activité
- */
- public function generatePcruInfo(Activity $activity, $auto = false)
- {
- return ActivityPcruInfoFromActivityFactory::createNew($activity);
- }
-
- /**
- * Lecture du fichier PCRU
- * @param $path
- * @return PCRUCvsFile
- * @throws OscarException
- */
- public function readPcruCSV($path)
- {
- $pcruCsv = PCRUCvsFile::create($this)->setPath($path)->read();
- return $pcruCsv;
- }
-
- /**
- * Génération d'un fichier PCRU friendly pour l'envois des informations contractuel
- * via FTP.
- */
- public function generatePcruFiles($path = null, ?SymfonyStyle $io = null): PCRUCvsFile
- {
- // TODO Tester si des fichiers sont déjà en cours d'envoi 'CONTRAT.OK'
-
- $path == null ? $this->getOscarConfigurationService()->getPcruDirectoryForUpload() : $path;
- $pcruFiles = PCRUCvsFile::create($this);
- $pcruFiles->generateFiles();
-
- return $pcruFiles;
- }
-
- public function allReadyToGo()
- {
- }
-
- /**
- * Téléchargement d'une archive ZIP avec les fichiers en attente d'envoi.
- *
- * @throws OscarException
- */
- public function downloadPCRUSendableFile()
- {
- $files = $this->getUploadableFiles(false);
-
- $filename = "oscar-pcru-" . date('Ymd_His') . '.zip';
- $tmpfile = '/tmp/' . uniqid() . $filename;
- $zip = new \ZipArchive();
- if ($zip->open($tmpfile, \ZipArchive::CREATE) !== true) {
- throw new OscarException("Impossible de créer l'archive");
- }
-
- foreach ($files as $info) {
- $zip->addFile($info['path'], $info['name']);
- }
-
- $zip->close();
-
- header('Content-Description: File Transfer');
- header('Content-Type: application/octet-stream');
- header('Content-Disposition: attachment; filename="' . $filename . '"');
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- readfile($tmpfile);
- exit;
- }
-
- /**
- * Retourne la liste des activités dont les données PCRU sont éligibles
- * @return ActivityPcruInfos[]
- */
- public function getActivitiesAvailable()
- {
- $pcruInfos = $this->getEntityManager()->getRepository(ActivityPcruInfos::class)->findAll();
- return $pcruInfos;
- }
-
///////////////////////////////////////////////////////////////////////////////
///
/// MISE à JOUR des REFERENCIELS
@@ -1192,6 +127,40 @@ class PCRUService implements UseLoggerService, UseOscarConfigurationService, Use
return true;
}
+
+ public function updatePcruTypesEtablissement()
+ {
+ // Récupération du référenciel
+ $fichier = $this->getOscarConfigurationService()->getConfiguration('pcru.typesetablissement');
+ if (!file_exists($fichier)) {
+ throw new OscarException(
+ "Le référenciel des types d'établissement n'est pas disponible (fichier '$fichier' inaccessible )."
+ );
+ }
+ $types = json_decode(file_get_contents($fichier));
+
+ // Récupération des types d'établissement présents en BDD
+ $typesEtablissement = $this->getEntityManager()->getRepository(PcruTypeEtablissement::class)->findAll();
+ $exist = [];
+ /** @var PcruTypeEtablissement $t */
+ foreach ($typesEtablissement as $t) {
+ $exist[] = $t->getLabel();
+ }
+
+ // Comparaison
+ foreach ($types as $type) {
+ if (!in_array($type, $exist)) {
+ // Création du type manquant
+ $nouveauTypeEtablissement = new PcruTypeEtablissement();
+ $this->getEntityManager()->persist($nouveauTypeEtablissement);
+ $nouveauTypeEtablissement->setLabel($type);
+ $this->getEntityManager()->flush($nouveauTypeEtablissement);
+ }
+ }
+
+ return true;
+ }
+
protected function log( string $msg ): void
{
$this->getLoggerService()->info(sprintf('[process pcru - info] %s', $msg), []);
diff --git a/module/Oscar/src/Oscar/Service/PcruFtpService.php b/module/Oscar/src/Oscar/Service/PcruFtpService.php
new file mode 100644
index 0000000000000000000000000000000000000000..128f4c48a8b3678a48f8ac6bdc52b1e676afc502
--- /dev/null
+++ b/module/Oscar/src/Oscar/Service/PcruFtpService.php
@@ -0,0 +1,1256 @@
+pcruInformationsService;
+ }
+
+ /**
+ * @param PcruInformationsService $pcruInformationsService
+ */
+ public function setPcruInformationsService(PcruInformationsService $pcruInformationsService): void
+ {
+ $this->pcruInformationsService = $pcruInformationsService;
+ }
+
+ public function processPcruFtp()
+ {
+ $logs = array();
+
+ try {
+
+ $repertoireDistant = $this->getOscarConfigurationService()->getConfiguration('pcru.repertoire_sftp');
+ $nomFichierContrats = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_contrats');
+ $nomFichierContratsDeposesOK = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_csv_ok');
+ $nomFichierRetourPcruOK = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_retour_pcru_ok');
+ $nomFichierRetourPcruOKCsv = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_retour_pcru_ok_csv');
+ $nomFichierDocumentsContratsPDFDeposesOK = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_pdf_ok');
+ $nomFichierPartenaires = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_partenaires');
+ $nomFichierPartenairesDeposesOK = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_csv_partenaire_ok');
+ $nomFichierRetourPcruErreurs = $this->getOscarConfigurationService()->getConfiguration('pcru.filename_errors');
+
+ $pcru_host = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_host'));
+ if (mb_strlen($pcru_host) == 0) {
+ $logs[] = $this->error('Configuration manquante : PCRU > Accès FTP > Hôte (clé pcru_host)');
+ $e = new OscarPCRUException('Configuration manquante : PCRU > Accès FTP > Hôte (clé pcru_host)');
+ $e->details = $logs;
+ throw $e;
+ }
+ $pcru_port = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_port'));
+ if (mb_strlen($pcru_port) == 0) {
+ $logs[] = $this->error('Configuration manquante : PCRU > Accès FTP > Port (clé pcru_port)');
+ $e = new OscarPCRUException('Configuration manquante : PCRU > Accès FTP > Port (clé pcru_port)');
+ $e->details = $logs;
+ throw $e;
+ }
+ $pcru_user = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_user'));
+ if (mb_strlen($pcru_user) == 0) {
+ $logs[] = $this->error('Configuration manquante : PCRU > Accès FTP > Identifiant (clé pcru_user)');
+ $e = new OscarPCRUException('Configuration manquante : PCRU > Accès FTP > Identifiant (clé pcru_user)');
+ $e->details = $logs;
+ throw $e;
+ }
+ $pcru_pass = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_pass'));
+ $has_pcru_pass = mb_strlen($pcru_pass) > 0;
+
+ $pcru_ssh_private = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh_private'));
+ $has_pcru_ssh_private = mb_strlen($pcru_ssh_private) > 0;
+
+ $pcru_ssh_public = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh_public'));
+ $has_pcru_ssh_public = mb_strlen($pcru_ssh_public) > 0;
+
+ if ($has_pcru_ssh_private && !$has_pcru_ssh_public) {
+ $logs[] = $this->error('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé publique SSH (clé pcru_ssh_public). Si le nom de la clé privée est renseigné alors le nom de la clé publique doit l\'être aussi.');
+ $e = new OscarPCRUException('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé publique SSH (clé pcru_ssh_public). Si le nom de la clé privée est renseigné alors le nom de la clé publique doit l\'être aussi.');
+ $e->details = $logs;
+ throw $e;
+ }
+ if (!$has_pcru_ssh_private && $has_pcru_ssh_public) {
+ $logs[] = $this->error('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé privée SSH (clé pcru_ssh_private). Si le nom de la clé publique est renseigné alors le nom de la clé privée doit l\'être aussi.');
+ $e = new OscarPCRUException('Configuration manquante : PCRU > Accès FTP > Nom du fichier contenant la clé privée SSH (clé pcru_ssh_private). Si le nom de la clé publique est renseigné alors le nom de la clé privée doit l\'être aussi.');
+ $e->details = $logs;
+ throw $e;
+ }
+ if (!$has_pcru_ssh_private && !$has_pcru_pass) {
+ $logs[] = $this->error('Configuration manquante : PCRU > Accès FTP > Mot de passe (clé pcru_pass). Un mode d\'authentification doit être configuré : mot de passe utilisateur et/ou clé public/privée.');
+ $e = new OscarPCRUException('Configuration manquante : PCRU > Accès FTP > Mot de passe (clé pcru_pass). Un mode d\'authentification doit être configuré : mot de passe utilisateur et/ou clé public/privée.');
+ $e->details = $logs;
+ throw $e;
+ }
+
+ $pcru_ssh_private_pass = trim($this->getOscarConfigurationService()->getEditableConfKey('pcru_ssh_private_pass'));
+
+ $autoload_dir = realpath(__DIR__.'/../../../../../config/autoload/');
+ $ssh_private_key_file_path = $autoload_dir.'/' . $pcru_ssh_private;
+ if ($has_pcru_ssh_private){
+ if (!file_exists($ssh_private_key_file_path)) {
+ $logs[] = $this->error("Le fichier config/autoload/$pcru_ssh_private sensé contenir la clé privée SSH n'existe pas.");
+ $e = new OscarPCRUException("Le fichier config/autoload/$pcru_ssh_private sensé contenir la clé privée SSH n'existe pas.");
+ $e->details = $logs;
+ throw $e;
+ } else if (!is_readable($ssh_private_key_file_path)) {
+ $logs[] = $this->error("Le fichier config/autoload/$pcru_ssh_private contenant la clé privée SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ $e = new OscarPCRUException("Le fichier config/autoload/$pcru_ssh_private contenant la clé privée SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ $e->details = $logs;
+ throw $e;
+ }
+ }
+
+ $ssh_public_key_file_path = $autoload_dir.'/' . $pcru_ssh_public;
+ if ($has_pcru_ssh_public){
+ if (!file_exists($ssh_public_key_file_path)) {
+ $logs[] = $this->error("Le fichier config/autoload/$pcru_ssh_public sensé contenir la clé publique SSH n'existe pas.");
+ $e = new OscarPCRUException("Le fichier config/autoload/$pcru_ssh_public sensé contenir la clé publique SSH n'existe pas.");
+ $e->details = $logs;
+ throw $e;
+ } else if (!is_readable($ssh_public_key_file_path)) {
+ $logs[] = $this->error("Le fichier config/autoload/$pcru_ssh_public contenant la clé publique SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ $e = new OscarPCRUException("Le fichier config/autoload/$pcru_ssh_public contenant la clé publique SSH n'est pas accessible en lecture à l'utilisateur exécutant la commande de check:config.");
+ $e->details = $logs;
+ throw $e;
+ }
+ }
+
+ // Après avoir vérifié les clés de configuration, on regarde si le serveur SFTP est joignable.
+ $conn = ssh2_connect($pcru_host, $pcru_port);
+ if (!$conn) {
+ $logs[] = $this->error("Impossible de se connecter au serveur SFTP PCRU : hôte non joignable. Hôte : $pcru_host, Port : $pcru_port");
+ $e = new OscarPCRUException("Impossible de se connecter au serveur SFTP PCRU : hôte non joignable. Hôte : $pcru_host, Port : $pcru_port");
+ $e->details = $logs;
+ throw $e;
+ }
+ $logs[] = $this->log("Le serveur est joignable");
+
+ // Connexion en utilisant une clé SSH
+ if ($has_pcru_ssh_private) {
+ $logs[] = $this->log("Tentative d'identification par clé SSH, utilisateur : '$pcru_user'");
+ if (!@ssh2_auth_pubkey_file($conn, $pcru_user,
+ $ssh_public_key_file_path,
+ $ssh_private_key_file_path, $pcru_ssh_private_pass)) {
+
+ if (!$has_pcru_pass) {
+ // Si la connexion échoue, et qu'on n'a pas de mot de passe utilisateur, on arrête là
+ $logs[] = $this->error("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvaise clé SSH (privée, publique, ou mauvais mot de passe de la clé) ? Mot de passe utilisateur manquant ?");
+ $e = new OscarPCRUException("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvaise clé SSH (privée, publique, ou mauvais mot de passe de la clé) ? Mot de passe utilisateur manquant ?");
+ $e->details = $logs;
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ // Car sinon, même si la connexion avec clé a échoué c'est peut-être simplement parcequ'il s'agit d'une connexion clé + mot de passe utilisateur, auquel cas la connexion devrait réussir lors de la prochaine étape, ssh2_auth_password
+ // Voir ce commentaire : https://www.php.net/manual/en/function.ssh2-auth-pubkey-file.php#126939
+ }
+ }
+
+ if ($has_pcru_pass) {
+ $logs[] = $this->log("Tentative d'identification par mot de passe, utilisateur : '$pcru_user'");
+ if (!ssh2_auth_password($conn, $pcru_user, $pcru_pass)) {
+ $logs[] = $this->error("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvais utilisateur ou mot de passe ?");
+ $e = new OscarPCRUException("Échec de l'identification au serveur SFTP PCRU : User : $pcru_user. Mauvais utilisateur ou mot de passe ?");
+ $e->details = $logs;
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ }
+
+ $logs[] = $this->log("Identification SFTP réussie");
+
+ $logs[] = $this->log("Initialisation du sous-système SFTP");
+ $sftp = ssh2_sftp($conn);
+ if (!$sftp) {
+ $logs[] = $this->error("Échec de l'initialisation du sous-système SFTP");
+ $e = new OscarPCRUException("Échec de l'initialisation du sous-système SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $logs[] = $this->log("Initialisation du sous-système SFTP réussie");
+
+
+
+
+ $logs[] = $this->log("Ouverture du répertoire " . $repertoireDistant . " sur le serveur SFTP");
+
+ $dir = 'ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/';
+ $files = array();
+ $handle = opendir($dir);
+ if (!$handle) {
+ $logs[] = $this->error("Impossible d'ouvrir le répertoire " . $repertoireDistant . " sur le serveur SFTP.");
+ $e = new OscarPCRUException("Impossible d'ouvrir le répertoire " . $repertoireDistant . " sur le serveur SFTP.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $logs[] = $this->log("Ouverture du répertoire " . $repertoireDistant . " réussie");
+
+ $logs[] = $this->log("Parcours des fichiers du répertoire");
+ while (false !== ($file = readdir($handle))) {
+ if(!is_dir($file)){
+ $files[] = $file;
+ }
+ }
+ closedir($handle);
+
+ if (count($files) === 0) {
+
+ $sql = "
+ select
+ pcru.id AS activitypcruinformationsId
+ from
+ activitypcruinformations pcru
+ where
+ pcru.status = ?
+ ";
+ $activitesEnAttenteRetourPCRU = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql,
+ [ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU],
+ ["string"])->fetchAllAssociative();
+
+ if (count($activitesEnAttenteRetourPCRU) !== 0) {
+ $logs[] = $this->log("Le serveur SFTP PCRU ne contient plus aucun fichier alors que certaines activité sont toujours en attente d'un retour de PCRU. Cela signifie qu'elles ont bien été intégrées.");
+
+ $logs[] = $this->log("Mise à jour du statut des activités envoyées qui étaient en attente de retour PCRU. Elles vont passer du statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU . " au statut " .ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+
+ $now = new \DateTime();
+ $nb = $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ status = ?,
+ dateretourok = ?,
+ dateupdated = ?
+ WHERE status = ?;
+ ", [ActivityPcruInformations::STATUS_RETOUR_PCRU_OK, $now, $now, ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU], ["string", "datetime", "datetime", "string"]);
+ if ($nb == 0) {
+ $logs[] = $this->log("Aucune activitée n'est passée au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+ } else if ($nb == 1) {
+ $logs[] = $this->log("Une activité est passée au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+ } else {
+ $logs[] = $this->log($nb . " activités sont passées au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+ }
+ }
+
+ } else {
+
+ // Il y a des fichier sur le serveur SFTP, voyons ce que c'est
+
+ // On récupère les fichiers que l'on a déposé pour la dernière fois
+ $sql = "
+ select
+ p.fichiersdeposes
+ from
+ pcruftplog p
+ where
+ p.fichiersdeposes IS NOT NULL
+ order by id desc limit 1
+ ";
+ $fichiersDeposesLines = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql)->fetchAllAssociative();
+
+ $fichiersDeposes = [];
+ if (count($fichiersDeposesLines) === 1) {
+ $fichiersDeposes = explode(",", $fichiersDeposesLines[0]['fichiersdeposes']);
+ }
+
+ foreach ($fichiersDeposes as $fichierDeposé) {
+ if ($fichierDeposé != $nomFichierContratsDeposesOK && !in_array($fichierDeposé, $files)) {
+ $logs[] = $this->error("Le serveur SFTP PCRU contient des fichiers, mais il manque l'un de ceux qu'Oscar avait déposé la dernière fois. Vérifiez manuellement le contenu du serveur SFTP.");
+ $e = new OscarPCRUException("Le serveur SFTP PCRU contient des fichiers, mais il manque l'un de ceux qu'Oscar avait déposé la dernière fois. Vérifiez manuellement le contenu du serveur SFTP.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ }
+
+ if (count($fichiersDeposes) == count($files) && in_array($nomFichierContratsDeposesOK, $files)) {
+ $logs[] = $this->log("Seuls les fichiers que nous avons déposés la dernière fois sont présents sur le serveur FTP. Nous attendons donc toujours un retour de PCRU.");
+ $logs[] = $this->log("Fin du traitement et fermeture des connexions SFTP");
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+
+ $pcruFtpLog = new PcruFtpLog();
+ $pcruFtpLog->setStatus("succès");
+ $pcruFtpLog->setTitre("Aucun envoi car nous sommes en attente d'un retour PCRU concernant le précédent envoi.");
+ $pcruFtpLog->setDetails(implode("\r\n", $logs));
+ $this->getEntityManager()->persist($pcruFtpLog);
+ $this->getEntityManager()->flush();
+
+ return $logs;
+ }
+
+ if ((count($files) == count($fichiersDeposes) + 1 && in_array($nomFichierRetourPcruOK, $files))
+ || (count($files) == count($fichiersDeposes) + 2 && in_array($nomFichierRetourPcruOK, $files) && in_array($nomFichierRetourPcruOKCsv, $files))) {
+
+ $logs[] = $this->log("Le fichier " . $nomFichierRetourPcruOK . " est présent sur le serveur SFTP, ce qui indique un retour OK de la part de PCRU.");
+
+ // Intégration du fichier qui contient la liste les contrats dont il manque le fichier pdf
+ if (in_array($nomFichierRetourPcruOKCsv, $files)) {
+ $logs[] = $this->log("Cependant, le fichier " . $nomFichierRetourPcruOKCsv . " est présent sur le serveur SFTP, ce qui indique que certains contrats n'ont pas déposé de fichier PDF.");
+
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierRetourPcruOKCsv, 'r');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $nomFichierRetourPcruOKCsv . " dans le répertoire " . $repertoireDistant . " en lecture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $nomFichierRetourPcruOKCsv . " dans le répertoire " . $repertoireDistant . " en lecture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $first_line = true;
+ while (($data = fgetcsv($stream, NULL, ";")) !== FALSE) {
+ $reference = $data[0];
+ if ($first_line) {
+ // Remove BOM https://stackoverflow.com/questions/39026992/how-do-i-read-a-utf-csv-file-in-php-with-a-bom
+ $first_line = false;
+ $reference = preg_replace(sprintf('/^%s/', pack('H*','EFBBBF')), "", $data[0]);
+ }
+ $reference = trim($reference);
+
+ if ($reference == "Reference" || mb_strlen($reference) === 0) {
+ continue;
+ }
+
+ $logs[] = $this->log("Mise à jour du statut de l'activité dont la référence est " . $reference . " qui était en attente de retour PCRU. Elle va passer du statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU . " au statut " .ActivityPcruInformations::STATUS_RETOUR_PCRU_OK_MAIS_FICHIER_MANQUANT);
+
+
+ // On cherche l'id correspondant à la référence
+ $sql = "
+ select
+ id,
+ dateenvoifichiercontrat,
+ status
+ from
+ activitypcruinformations
+ where
+ envoinumcontrat = ?
+ ";
+ $activitesParReference = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql, [$reference])->fetchAllAssociative();
+
+ $id = NULL;
+ if (count($activitesParReference) === 0) {
+ $logs[] = $this->error("Aucune activitée (activitypcruinformations) trouvée pour la référence " . $reference);
+ continue;
+ } else if (count($activitesParReference) > 1) {
+ $logs[] = $this->error("Plusieur activités (activitypcruinformations) trouvées pour la référence " . $reference);
+ continue;
+ } else {
+ $id = $activitesParReference[0]['id'];
+ if ($activitesParReference[0]['dateenvoifichiercontrat'] != NULL) {
+ $logs[] = $this->error("PCRU indique que le fichier contrat est manquant pour l'activité " . $reference . " alors que nous l'avons bien envoyé. Étrange.");
+ }
+ if ($activitesParReference[0]['status'] != ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU) {
+ $logs[] = $this->error("PCRU indique que le fichier contrat est manquant pour l'activité " . $reference . " alors que nous n'étions pas en attente d'un retour PCRU pour cette activité. Son statut était : " . $activitesParReference[0]['status'] . ". Étrange.");
+ }
+ }
+
+ $now = new \DateTime();
+ $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ status = ?,
+ dateretourokmaiscontratmanquant = ?,
+ dateupdated = ?
+ WHERE id = ?;
+ ", [ActivityPcruInformations::STATUS_RETOUR_PCRU_OK_MAIS_FICHIER_MANQUANT, $now, $now, $id], ["string", "datetime", "datetime", "integer"]);
+ }
+
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $nomFichierRetourPcruOKCsv . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $nomFichierRetourPcruOKCsv . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ }
+
+ $logs[] = $this->log("Mise à jour du statut des activités envoyées qui étaient en attente de retour PCRU. Elles vont passer du statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU . " au statut " .ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+
+ $now = new \DateTime();
+ $nb = $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ status = ?,
+ dateretourok = ?,
+ dateupdated = ?
+ WHERE status = ?;
+ ", [ActivityPcruInformations::STATUS_RETOUR_PCRU_OK, $now, $now, ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU], ["string", "datetime", "datetime", "string"]);
+ if ($nb == 0) {
+ $logs[] = $this->log("Aucune activitée n'est passée au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+ } else if ($nb == 1) {
+ $logs[] = $this->log("Une activité est passée au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+ } else {
+ $logs[] = $this->log($nb . " activités sont passées au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_OK);
+ }
+
+ $logs[] = $this->log("Suppression des fichiers présents sur le serveur sftp.");
+
+ foreach ($fichiersDeposes as $fichierDeposé) {
+ $this->supprimerFichier($sftp, $conn, $repertoireDistant, $fichierDeposé, $logs);
+ }
+ $this->supprimerFichier($sftp, $conn, $repertoireDistant, $nomFichierRetourPcruOK, $logs);
+ if (in_array($nomFichierRetourPcruOKCsv, $files)) {
+ $this->supprimerFichier($sftp, $conn, $repertoireDistant, $nomFichierRetourPcruOKCsv, $logs);
+ }
+
+ } else if (((count($files) == count($fichiersDeposes) + 1 || count($files) == count($fichiersDeposes)) && in_array($nomFichierRetourPcruErreurs, $files))) {
+
+ $logs[] = $this->log("Le fichier " . $nomFichierRetourPcruErreurs . " est présent sur le serveur SFTP, ce qui indique un retour en erreur de la part de PCRU.");
+
+ $contenuFichierErreursBrutAvecBOM = file_get_contents('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierRetourPcruErreurs);
+ // On enlève le BOM pour pouvoir parser le JSON (sinon json_decode retourne NULL)
+ $contenuFichierErreursBrut = preg_replace(sprintf('/^%s/', pack('H*','EFBBBF')), "", $contenuFichierErreursBrutAvecBOM);
+ $contenuFichierErreurs = json_decode($contenuFichierErreursBrut);
+ if (!$contenuFichierErreurs) {
+ $logs[] = $this->error("Le fichier de retour d'erreurs PCRU " . $nomFichierRetourPcruErreurs . " ne semble pas être un fichier JSON valide. Pour débloquer la situation, vous pouvez ouvrir le fichier sur le serveur SFTP PCRU et voir ce qu'il contient.");
+ $e = new OscarPCRUException("Le fichier de retour d'erreurs PCRU " . $nomFichierRetourPcruErreurs . " ne semble pas être un fichier JSON valide.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ if (!property_exists($contenuFichierErreurs, "fileErrors")
+ || !is_array($contenuFichierErreurs->fileErrors)
+ || !property_exists($contenuFichierErreurs, "contratsWithErrors")
+ || !is_array($contenuFichierErreurs->contratsWithErrors)) {
+ $logs[] = $this->error("La structure du fichier JSON de retour d'erreurs PCRU " . $nomFichierRetourPcruErreurs . " ne correspond pas au format attendu. Pour débloquer la situation, vous pouvez ouvrir le fichier sur le serveur SFTP PCRU et voir ce qu'il contient.");
+ $e = new OscarPCRUException("La structure du fichier JSON de retour d'erreurs PCRU " . $nomFichierRetourPcruErreurs . " ne correspond pas au format attendu. Pour débloquer la situation, vous pouvez ouvrir le fichier sur le serveur SFTP PCRU et voir ce qu'il contient.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ if (count($contenuFichierErreurs->fileErrors) > 0) {
+ $logs[] = $this->error("PCRU indique dans le fichier d'erreur que le format du fichier CSV déposé par OSCAR est invalide. Ceci ne devrait pas arriver. Vous pouvez contacter l'équipe d'Oscar en fournissant le contenu du répertoire SFTP (entre autres le(s) fichier(s) CSV déposé(s) ainsi que le fichier JSON d'erreur PCRU).");
+ $e = new OscarPCRUException("PCRU indique dans le fichier d'erreur que le format du fichier CSV déposé par OSCAR est invalide. Ceci ne devrait pas arriver. Vous pouvez contacter l'équipe d'Oscar en fournissant le contenu du répertoire SFTP (entre autres le(s) fichier(s) CSV déposé(s) ainsi que le fichier JSON d'erreur PCRU).");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ if (count($contenuFichierErreurs->contratsWithErrors) == 0) {
+ $logs[] = $this->error("Le fichier JSON de retour d'erreurs PCRU n'indique aucune erreur (ni fileErrors ni contratsWithErrors). Ceci ne devrait pas arriver. Vous pouvez contacter l'équipe d'Oscar en fournissant le contenu du répertoire SFTP (entre autres le(s) fichier(s) CSV déposé(s) ainsi que le fichier JSON d'erreur PCRU).");
+ $e = new OscarPCRUException("Le fichier JSON de retour d'erreurs PCRU n'indique aucune erreur (ni fileErrors ni contratsWithErrors). Ceci ne devrait pas arriver. Vous pouvez contacter l'équipe d'Oscar en fournissant le contenu du répertoire SFTP (entre autres le(s) fichier(s) CSV déposé(s) ainsi que le fichier JSON d'erreur PCRU).");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ if (count($contenuFichierErreurs->contratsWithErrors) == 1) {
+ $logs[] = $this->log("Le fichier indique qu'une activité est en erreur.");
+ } else {
+ $logs[] = $this->log("Le fichier indique que " . count($contenuFichierErreurs->contratsWithErrors) . " activités sont en erreur.");
+ }
+
+ $totalMisAJour = 0;
+ foreach ($contenuFichierErreurs->contratsWithErrors as $contratEnErreur) {
+ if (!property_exists($contratEnErreur, "id")
+ || mb_strlen(trim($contratEnErreur->id)) == 0
+ || !property_exists($contratEnErreur, "errors")
+ || !is_array($contratEnErreur->errors)) {
+ $logs[] = $this->error("La structure contratsWithErrors du fichier JSON de retour d'erreurs PCRU " . $nomFichierRetourPcruErreurs . " ne correspond pas au format attendu. Pour débloquer la situation, vous pouvez ouvrir le fichier sur le serveur SFTP PCRU et voir ce qu'il contient.");
+ $e = new OscarPCRUException("La structure contratsWithErrors du fichier JSON de retour d'erreurs PCRU " . $nomFichierRetourPcruErreurs . " ne correspond pas au format attendu. Pour débloquer la situation, vous pouvez ouvrir le fichier sur le serveur SFTP PCRU et voir ce qu'il contient.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("L'activité " . $contratEnErreur->id . " va passer du statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU . " au statut " . ActivityPcruInformations::STATUS_RETOUR_PCRU_ERREURS);
+ $now = new \DateTime();
+ $nb = $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ status = ?,
+ erreurs = ?,
+ dateupdated = ?
+ WHERE envoinumcontrat = ?
+ AND status = ?;
+ ", [ActivityPcruInformations::STATUS_RETOUR_PCRU_ERREURS, implode("\r\n", $contratEnErreur->errors), $now, $contratEnErreur->id, ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU], ["string", "string", "datetime", "string", "string"]);
+ if ($nb == 1) {
+ $logs[] = $this->log("Statut mis à jour pour une activité.");
+ } else if ($nb > 1) {
+ $logs[] = $this->log($nb . " activités ont eu leur statut mis à jour. Étrange.");
+ }
+ $totalMisAJour += $nb;
+ }
+
+ if ($totalMisAJour == 0) {
+ $logs[] = $this->log("Aucune activité n'a été mise à jour. Cela signifie sans doute que le fichier d'erreur avait déjà été intégré.");
+ }
+
+ $logs[] = $this->error("PCRU indique avoir échoué à intégrer automatiquement certaines activité car elle contiennent des erreurs. Pour débloquer la situation, il faut analyser puis corriger chaque activité en erreur (table activitypcruinformations, status = 'retour-pcru-erreurs'). Pour les autres activités déposées lors du dernier dépot (status = 'envoyee-attente-retour-pcru') il faut vérifier sur le site de PCRU qu'elles ont bien été intégrées puis les passer au statut 'retour-pcru-ok'. Consultez la documentation ou le support en cas de doute.");
+ $e = new OscarPCRUException("PCRU indique avoir échoué à intégrer automatiquement certaines activité car elle contiennent des erreurs. Pour débloquer la situation, il faut analyser puis corriger chaque activité en erreur (table activitypcruinformations, status = 'retour-pcru-erreurs'). Pour les autres activités déposées lors du dernier dépot (status = 'envoyee-attente-retour-pcru') il faut vérifier sur le site de PCRU qu'elles ont bien été intégrées puis les passer au statut 'retour-pcru-ok'. Consultez la documentation ou le support en cas de doute.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+
+
+ } else {
+ $logs[] = $this->error("Le serveur SFTP PCRU contient des fichiers inconnus. Vérifiez manuellement le contenu du serveur SFTP.");
+ $e = new OscarPCRUException("Le serveur SFTP PCRU contient des fichiers inconnus. Vérifiez manuellement le contenu du serveur SFTP.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ }
+
+
+ $logs[] = $this->log("Le répertoire distant ne contient aucun fichier, Oscar peut déposer les activités en attente");
+
+ $logs[] = $this->log("Chargement des activités à envoyer : activités ayant activé l'envoi PCRU et n'ayant encore jamais été envoyées");
+
+ $sql = "
+ select
+ a.id as activityid,
+ pcru.id AS activitypcruinformationsId
+ from
+ activitypcruinformations pcru
+ left join
+ activity a on a.id = pcru.activity_id
+ where
+ pcru.envoiactif is TRUE
+ AND pcru.status = ?
+ order by
+ pcru.dateupdated DESC;
+ ";
+ $activitesAEnvoyer = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql,
+ [ActivityPcruInformations::STATUS_JAMAIS_ENVOYEE],
+ ["string"])->fetchAllAssociative();
+
+ $auMoinsUnFichierPDFAÉtéEnvoyé = false;
+ $fichiersDeposes = [];
+ $activitesAEnvoyerValidesNb = 0;
+
+ $creerFichierMarqueurContrats = false;
+ $partenairesAEnvoyer = [];
+ $activitesAEnvoyerNb = count($activitesAEnvoyer);
+ if ($activitesAEnvoyerNb == 0) {
+ $logs[] = $this->log("Aucune activité en attente d'envoi.");
+ } else {
+
+ if ($activitesAEnvoyerNb == 1) {
+ $logs[] = $this->log("Une activité à envoyer");
+ } else {
+ $logs[] = $this->log($activitesAEnvoyerNb . " activités à envoyer");
+ }
+
+ $activitesAEnvoyerValides = [];
+
+ foreach ($activitesAEnvoyer as $a) {
+
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $a['activityid']));
+
+ $pcruInformationComplete = $this->pcruInformationsService->getPcruInformationsForActivity($activity);
+ if (!$pcruInformationComplete->enErreur) {
+ $a['pcruInformation'] = $pcruInformationComplete->pcruInformation;
+ $a['cheminFichierContrat'] = $pcruInformationComplete->cheminFichierContrat;
+ $activitesAEnvoyerValides[] = $a;
+ }
+ }
+
+ $activitesAEnvoyerValidesNb = count($activitesAEnvoyerValides);
+ $activitesEnErreurNb = $activitesAEnvoyerNb - $activitesAEnvoyerValidesNb;
+ if ($activitesEnErreurNb == 0) {
+ $logs[] = $this->log("Aucune activité n'est en erreur, toutes celles en attente seront envoyées");
+ } else if ($activitesEnErreurNb == 1) {
+ $logs[] = $this->log("Une activité est en erreur et ne sera pas envoyée");
+ } else {
+ $logs[] = $this->log($activitesEnErreurNb . " activités sont en erreur et ne seront pas envoyées");
+ }
+
+ if ($activitesAEnvoyerValidesNb == 0) {
+ $logs[] = $this->log("Aucune activité valide à envoyer");
+ } else {
+
+ if ($activitesAEnvoyerValidesNb == 1) {
+ $logs[] = $this->log("Une activité valide sera envoyée");
+ } else {
+ $logs[] = $this->log($activitesAEnvoyerValidesNb . " activités valides seront envoyées");
+ }
+
+ $logs[] = $this->log("Ouverture du fichier " . $nomFichierContrats . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierContrats, 'w');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $nomFichierContrats . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $nomFichierContrats . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Écriture des en-têtes du fichier CSV");
+
+
+ // Écriture du BOM pour que PCRU comprenne que c'est un fichier encodé en UTF-8
+ $r = fwrite($stream, pack("CCC",0xef,0xbb,0xbf));
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire le BOM dans le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire le BOM dans le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $r = fputcsv($stream, ['Objet', 'CodeLabintelUnite', 'CodeRNSRUnite', 'SigleUnite', 'ReferenceGestionnaire', 'Equipe', 'TypeContrat', 'Acronyme', 'ContratsAssocies', 'NomRespScientifique', 'EmployeurRespScientifique', 'RespScientifiqueEstCoordonnateur', 'Partenaires', 'PartenairePrincipal', 'IdPartenairePrincipal', 'SourceFinancement', 'LieuExecution', 'DateDerniereSignature', 'Duree', 'DateDebut', 'DateFin', 'MontantPercuUnite', 'ContributionFinanceur', 'MontantTotal', 'ValideParPoleCompetitivite', 'PoleCompetitivite', 'Commentaires', 'PIA', 'ReferenceNonGestionnaire', 'AccordCadre', 'Cifre', 'ChaireIndustrielle', 'PresencePartenaireIndustriel'], ';');
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire dans le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire dans le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Écriture des activités");
+ foreach ($activitesAEnvoyerValides as $a) {
+ $line = [];
+ $line[] = $a['pcruInformation']->objet;
+ $line[] = $a['pcruInformation']->labintel;
+ $line[] = $a['pcruInformation']->rnsr;
+ $line[] = $a['pcruInformation']->sigle;
+ $line[] = $a['pcruInformation']->numContrat;
+ $line[] = $a['pcruInformation']->equipe;
+ $line[] = $a['pcruInformation']->typeContrat;
+ $line[] = $a['pcruInformation']->acronyme;
+ $line[] = $a['pcruInformation']->contratsAssocies;
+ $line[] = $a['pcruInformation']->responsableScientifique;
+ $line[] = $a['pcruInformation']->employeurResponsableScientifique;
+ $line[] = $a['pcruInformation']->coordinateurConsortium === NULL ? NULL : ($a['pcruInformation']->coordinateurConsortium ? "True" : "False");
+ $line[] = $a['pcruInformation']->partenaires;
+ $line[] = $a['pcruInformation']->partenairePrincipal;
+ $line[] = preg_replace('/\s+/', '', $a['pcruInformation']->idPartenairePrincipal);
+ $line[] = $a['pcruInformation']->sourceFinancement;
+ $line[] = $a['pcruInformation']->lieuExecution;
+ $line[] = $a['pcruInformation']->dateDerniereSignature;
+ $line[] = $a['pcruInformation']->duree;
+ $line[] = $a['pcruInformation']->dateDebut;
+ $line[] = $a['pcruInformation']->dateFin;
+ $line[] = $a['pcruInformation']->montantPercuUnite;
+ $line[] = $a['pcruInformation']->contributionFinanceur;
+ $line[] = $a['pcruInformation']->montantTotal;
+ $line[] = $a['pcruInformation']->validePoleCompetitivite ? 'True' : 'False';
+ $line[] = $a['pcruInformation']->poleCompetitivite;
+ $line[] = $a['pcruInformation']->commentaires;
+ $line[] = $a['pcruInformation']->pia === NULL ? NULL : ($a['pcruInformation']->pia ? "True" : "False");
+ $line[] = $a['pcruInformation']->reference;
+ $line[] = $a['pcruInformation']->accordCadre === NULL ? NULL : ($a['pcruInformation']->accordCadre ? "True" : "False");
+ $line[] = $a['pcruInformation']->cifre ? 'True' : 'False';
+ $line[] = $a['pcruInformation']->chaireIndustrielle === NULL ? NULL : ($a['pcruInformation']->chaireIndustrielle ? "True" : "False");
+ $line[] = $a['pcruInformation']->presencePartenaireIndustriel === NULL ? NULL : ($a['pcruInformation']->presencePartenaireIndustriel ? "True" : "False");
+ $r = fputcsv($stream, $line, ';');
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire dans le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire dans le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $nb = $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ envoiobjet = ?,
+ envoilabintel = ?,
+ envoirnsr = ?,
+ envoisigle = ?,
+ envoinumcontrat = ?,
+ envoiequipe = ?,
+ envoitypecontrat = ?,
+ envoiacronyme = ?,
+ envoicontratsassocies = ?,
+ envoiresponsablescientifique = ?,
+ envoiemployeurresponsablescientifique = ?,
+ envoicoordinateurconsortium = ?,
+ envoipartenaires = ?,
+ envoipartenaireprincipal = ?,
+ envoiidpartenaireprincipal = ?,
+ envoisourcefinancement = ?,
+ envoilieuexecution = ?,
+ envoidatedernieresignature = ?,
+ envoiduree = ?,
+ envoidatedebut = ?,
+ envoidatefin = ?,
+ envoimontantpercuunite = ?,
+ envoicontributionfinanceur = ?,
+ envoimontanttotal = ?,
+ envoivalidepolecompetitivite = ?,
+ envoipolecompetitivite = ?,
+ envoicommentaires = ?,
+ envoipia = ?,
+ envoireference = ?,
+ envoiaccordcadre = ?,
+ envoicifre = ?,
+ envoichaireindustrielle = ?,
+ envoipresencepartenaireindustriel = ?
+ WHERE id = ?;
+ ", [$a['pcruInformation']->objet,
+ $a['pcruInformation']->labintel,
+ $a['pcruInformation']->rnsr,
+ $a['pcruInformation']->sigle,
+ $a['pcruInformation']->numContrat,
+ $a['pcruInformation']->equipe,
+ $a['pcruInformation']->typeContrat,
+ $a['pcruInformation']->acronyme,
+ $a['pcruInformation']->contratsAssocies,
+ $a['pcruInformation']->responsableScientifique,
+ $a['pcruInformation']->employeurResponsableScientifique,
+ $a['pcruInformation']->coordinateurConsortium === NULL ? NULL : ($a['pcruInformation']->coordinateurConsortium ? "True" : "False"),
+ $a['pcruInformation']->partenaires,
+ $a['pcruInformation']->partenairePrincipal,
+ $a['pcruInformation']->idPartenairePrincipal,
+ $a['pcruInformation']->sourceFinancement,
+ $a['pcruInformation']->lieuExecution,
+ $a['pcruInformation']->dateDerniereSignature,
+ $a['pcruInformation']->duree,
+ $a['pcruInformation']->dateDebut,
+ $a['pcruInformation']->dateFin,
+ $a['pcruInformation']->montantPercuUnite,
+ $a['pcruInformation']->contributionFinanceur,
+ $a['pcruInformation']->montantTotal,
+ $a['pcruInformation']->validePoleCompetitivite ? 'True' : 'False',
+ $a['pcruInformation']->poleCompetitivite,
+ $a['pcruInformation']->commentaires,
+ $a['pcruInformation']->pia === NULL ? NULL : ($a['pcruInformation']->pia ? "True" : "False"),
+ $a['pcruInformation']->reference,
+ $a['pcruInformation']->accordCadre === NULL ? NULL : ($a['pcruInformation']->accordCadre ? "True" : "False"),
+ $a['pcruInformation']->cifre ? 'True' : 'False',
+ $a['pcruInformation']->chaireIndustrielle === NULL ? NULL : ($a['pcruInformation']->chaireIndustrielle ? "True" : "False"),
+ $a['pcruInformation']->presencePartenaireIndustriel === NULL ? NULL : ($a['pcruInformation']->presencePartenaireIndustriel ? "True" : "False"),
+ $a['activitypcruinformationsid']]);
+ }
+
+ $logs[] = $this->log("Fermeture du fichier");
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $nomFichierContrats . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $fichiersDeposes[] = $nomFichierContrats;
+
+
+
+ if ($activitesAEnvoyerValidesNb == 1) {
+ $logs[] = $this->log("Une activité a été envoyée");
+ } else {
+ $logs[] = $this->log($activitesAEnvoyerValidesNb . " activités ont été envoyées");
+ }
+
+ $creerFichierMarqueurContrats = true;
+
+ $logs[] = $this->log("Mise à jour du statut des activités envoyées");
+
+ $ids = [];
+ foreach ($activitesAEnvoyerValides as $a) {
+ $ids[] = $a['activitypcruinformationsid'];
+ }
+ $now = new \DateTime();
+ $nb = $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ status = ?,
+ dateupdated = ?,
+ datepremierdepot = ?
+ WHERE id IN (?);
+ ", [ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU, $now, $now, $ids], ["string", "datetime", "datetime", \Doctrine\DBAL\ArrayParameterType::INTEGER]);
+ if ($nb == 0) {
+ $logs[] = $this->log("Aucune activité n'est passée au statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU . ". Très étrange.");
+ } else if ($nb == 1) {
+ $logs[] = $this->log("Une activité est passée au statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU);
+ } else {
+ $logs[] = $this->log($nb . " activités sont passées au statut " . ActivityPcruInformations::STATUS_ENVOYEE_ATTENTE_RETOUR_PCRU);
+ }
+
+ /* Contrats signés PDF documents */
+ $logs[] = $this->log("Envoi des documents PDF de contrats signés");
+ foreach ($activitesAEnvoyerValides as $a) {
+ if (!$a['cheminFichierContrat']) {
+ $logs[] = $this->log("Envoi du PDF impossible pour l'activité " . $a['pcruInformation']->numContrat . " car elle n'a pas de PDF de contrat signé");
+ continue;
+ }
+
+ $pdfFileName = $this->envoyerUnDocumentPDFContrat($sftp, $conn, $a['cheminFichierContrat'], $repertoireDistant, $a['activitypcruinformationsid'], $a['pcruInformation']->numContrat, $logs);
+
+ $fichiersDeposes[] = $pdfFileName;
+ $auMoinsUnFichierPDFAÉtéEnvoyé = true;
+ }
+
+ foreach ($activitesAEnvoyerValides as $a) {
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $a['activityid']));
+
+ $pcruPartenairePrincipalRoles = $this->getOscarConfigurationService()->getPcruPartenairePrincipalRoles();
+ if ($pcruPartenairePrincipalRoles != NULL && count($pcruPartenairePrincipalRoles) > 0) {
+ $partenaires = $activity->getOrganizationsWithOneRoleIn($pcruPartenairePrincipalRoles);
+ if (count($partenaires) == 1) {
+
+ $partenaire = $partenaires[0];
+ $avertissements = [];
+ if (mb_strlen(trim($partenaire->getShortName())) == 0) {
+ $avertissements[] = "Le nom court doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getFullName())) == 0) {
+ $avertissements[] = "Le nom complet doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getCodePcru())) == 0) {
+ $avertissements[] = "Le numéro SIRET, la TVA Intracommunautaire ou le DUNS doit être renseigné";
+ }
+ if ($partenaire->getTypeEtablissementPcruObj() == NULL) {
+ $avertissements[] = "Le type d'établissement PCRU doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getStreet1())) == 0) {
+ $avertissements[] = "L'adresse (rue 1) doit être renseignée";
+ }
+ if (mb_strlen(trim($partenaire->getZipCode())) == 0) {
+ $avertissements[] = "Le code postal doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getCity())) == 0) {
+ $avertissements[] = "La ville doit être renseignée";
+ }
+ if (mb_strlen(trim($partenaire->getCountry())) == 0) {
+ $avertissements[] = "Le pays doit être renseigné";
+ }
+ if (count($avertissements) > 0) {
+ $logs[] = $this->log("Le partenaire " . mb_strlen(trim($partenaire->getShortName())) == 0 ? $partenaire->getFullName() : $partenaire->getShortName() . " ne sera pas transmis à PCRU car il manque des informations sur sa fiche.");
+ } else {
+ $dejaDansLaListe = false;
+ foreach ($partenairesAEnvoyer as $p) {
+ if ($p->getId() == $partenaire->getId()) {
+ $dejaDansLaListe = true;
+ break;
+ }
+ }
+ if (!$dejaDansLaListe) {
+ $partenairesAEnvoyer[] = $partenaire;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ $logs[] = $this->log("Envoi des documents PDF qui étaient manquant lors de précédents envois et indiqués par PCRU comme manquants");
+ $sql = "
+ select
+ id as activitypcruinformationsid,
+ activity_id,
+ envoinumcontrat
+ from
+ activitypcruinformations
+ where
+ dateenvoifichiercontrat IS NULL
+ AND status = ?
+ ";
+ $activitesAvecContratARenvoyer = $this->getEntityManager()->getConnection()
+ ->executeQuery($sql, [ActivityPcruInformations::STATUS_RETOUR_PCRU_OK_MAIS_FICHIER_MANQUANT])->fetchAllAssociative();
+
+ if (count($activitesAvecContratARenvoyer) == 0) {
+ $logs[] = $this->log("Aucun document manquant à envoyer.");
+ } else {
+ $logs[] = $this->log(count($activitesAvecContratARenvoyer) . " activités marquées comme ayant un document manquant. Pour chacune, on vérifie si le document est maintenant présent et si oui on l'envoi à PCRU.");
+ }
+
+ foreach ($activitesAvecContratARenvoyer as $a) {
+
+ $activity = $this->getEntityManager()
+ ->getRepository(Activity::class)
+ ->findOneBy(array('id' => $a['activity_id']));
+
+ // Document signé
+ $typeDocumentSigne = $this->getOscarConfigurationService()->getPcruContractType();
+ $logs[] = $this->log("Recherche du document de type " . $typeDocumentSigne . " pour l'activité ayant pour référence " . $activity->getOscarNum());
+
+ $documentsSigne = [];
+ /** @var ContractDocument $document */
+ foreach ($activity->getDocuments() as $document) {
+ if ($document->getTypeDocument()->getLabel() == $typeDocumentSigne) {
+ // Test sur les versions
+ if (count($documentsSigne) > 0) {
+ // On regarde si on est pas entrain de parser une ancienne version du fichier
+ if ($documentsSigne[0]->getFileName() == $document->getFileName()) {
+ continue;
+ }
+ }
+ $documentsSigne[] = $document;
+ }
+ }
+ if (count($documentsSigne) > 1) {
+ $logs[] = $this->error("Impossible de déterminer automatiquement le fichier PDF de contrat signé à envoyer car il y a plusieurs documents de type '$typeDocumentSigne' sur cette activité");
+ continue;
+ } else if (count($documentsSigne) == 0) {
+ $logs[] = $this->log("Impossible d'envoyer le fichier PDF de contrat signé car l'activité n'a aucun document de type '$typeDocumentSigne'");
+ continue;
+ } else {
+ $fichiersDeposes[] = $this->envoyerUnDocumentPDFContrat($sftp, $conn, $documentsSigne[0]->getPath(), $repertoireDistant, $a['activitypcruinformationsid'], $a['envoinumcontrat'], $logs);
+ $auMoinsUnFichierPDFAÉtéEnvoyé = true;
+ }
+ }
+
+ $creerFichierMarqueurPartenaires = false;
+ if (count($partenairesAEnvoyer) == 0) {
+ $logs[] = $this->log("Aucun partenaire à envoyer.");
+ } else {
+ if (count($partenairesAEnvoyer) == 1) {
+ $logs[] = $this->log("Un partenaire à envoyer.");
+ } else {
+ $logs[] = $this->log(count($partenairesAEnvoyer) . " partenaires à envoyer.");
+ }
+
+
+ $logs[] = $this->log("Ouverture du fichier " . $nomFichierPartenaires . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierPartenaires, 'w');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $nomFichierPartenaires . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $nomFichierPartenaires . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Écriture des en-têtes du fichier CSV Partenaires");
+
+ // Écriture du BOM pour que PCRU comprenne que c'est un fichier encodé en UTF-8
+ $r = fwrite($stream, pack("CCC",0xef,0xbb,0xbf));
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire le BOM dans le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire le BOM dans le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $r = fputcsv($stream, ['LibelleCourt', 'LibelleLong', 'Siren', 'Siret', 'TvaIntra', 'Duns', 'TypeEtablissement', 'Adresse', 'CodePostal', 'Ville', 'Pays'], ';');
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire dans le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire dans le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Écriture des partenaires");
+ foreach ($partenairesAEnvoyer as $p) {
+ $line = [];
+ $line[] = $p->getShortName();
+ $line[] = $p->getFullName();
+ $line[] = "";
+ $line[] = preg_replace('/\s+/', '', $p->getSiret());
+ $line[] = preg_replace('/\s+/', '', $p->getTvaintra());
+ $line[] = preg_replace('/\s+/', '', $p->getDuns());
+ $line[] = $p->getTypeEtablissementPcruObj()->getLabel();
+ $line[] = $p->getStreet1();
+ $line[] = $p->getZipCode();
+ $line[] = $p->getCity();
+ $line[] = $p->getCountry();
+
+ $r = fputcsv($stream, $line, ';');
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire dans le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire dans le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ }
+
+ $logs[] = $this->log("Fermeture du fichier");
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $nomFichierPartenaires . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $fichiersDeposes[] = $nomFichierPartenaires;
+
+
+ if (count($partenairesAEnvoyer) == 1) {
+ $logs[] = $this->log("Un partenaire a été envoyé.");
+ } else {
+ $logs[] = $this->log(count($partenairesAEnvoyer) . " partenaires ont été envoyés.");
+ }
+
+ $creerFichierMarqueurPartenaires = true;
+ }
+
+ if ($creerFichierMarqueurPartenaires) {
+ $logs[] = $this->log("Création du fichier marqueur partenaires OK : " . $nomFichierPartenairesDeposesOK);
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierPartenairesDeposesOK, 'w');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $nomFichierPartenairesDeposesOK . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $nomFichierPartenairesDeposesOK . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Fermeture du fichier marqueur partenaires OK");
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $nomFichierPartenairesDeposesOK . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $nomFichierPartenairesDeposesOK . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $fichiersDeposes[] = $nomFichierPartenairesDeposesOK;
+ }
+
+ if ($creerFichierMarqueurContrats) {
+ $logs[] = $this->log("Création du fichier marqueur contrats OK : " . $nomFichierContratsDeposesOK);
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierContratsDeposesOK, 'w');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $nomFichierContratsDeposesOK . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $nomFichierContratsDeposesOK . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Fermeture du fichier marqueur contrats OK");
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $nomFichierContratsDeposesOK . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $nomFichierContratsDeposesOK . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $fichiersDeposes[] = $nomFichierContratsDeposesOK;
+ }
+
+ if ($auMoinsUnFichierPDFAÉtéEnvoyé) {
+ $logs[] = $this->log("Création du fichier marqueur fichiers PDF contrats OK : " . $nomFichierDocumentsContratsPDFDeposesOK);
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $nomFichierDocumentsContratsPDFDeposesOK, 'w');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $nomFichierDocumentsContratsPDFDeposesOK . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $nomFichierDocumentsContratsPDFDeposesOK . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $logs[] = $this->log("Fermeture du fichier marqueur fichiers PDF contrats OK");
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $nomFichierDocumentsContratsPDFDeposesOK . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $nomFichierDocumentsContratsPDFDeposesOK . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $fichiersDeposes[] = $nomFichierDocumentsContratsPDFDeposesOK;
+ }
+
+ $logs[] = $this->log("Fin du traitement, fermeture des connexions SFTP");
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+
+ $pcruFtpLog = new PcruFtpLog();
+ $pcruFtpLog->setStatus("succès");
+ if ($activitesAEnvoyerValidesNb == 1) {
+ $pcruFtpLog->setTitre("Une activité a été envoyée");
+ } else {
+ $pcruFtpLog->setTitre($activitesAEnvoyerValidesNb . " activités ont été envoyées");
+ }
+ $pcruFtpLog->setDetails(implode("\r\n", $logs));
+ $pcruFtpLog->fichiersDeposes = implode(",", $fichiersDeposes);
+ $this->getEntityManager()->persist($pcruFtpLog);
+ $this->getEntityManager()->flush();
+
+ return $logs;
+
+ } catch (OscarPCRUException $e) {
+
+ $pcruFtpLog = new PcruFtpLog();
+ $pcruFtpLog->setStatus("erreur");
+ $pcruFtpLog->setTitre($e->getMessage());
+ if (count($e->details) > 0) {
+ $pcruFtpLog->setTitre($e->details[count($e->details) - 1]);
+ }
+ $pcruFtpLog->setDetails(implode("\r\n", $e->details));
+ $this->getEntityManager()->persist($pcruFtpLog);
+ $this->getEntityManager()->flush();
+ throw $e;
+
+ } catch (\Exception $e) {
+
+ $pcruFtpLog = new PcruFtpLog();
+ $pcruFtpLog->setStatus("erreur");
+ $pcruFtpLog->setTitre($e->getMessage());
+ $pcruFtpLog->setDetails(implode("\r\n", $logs));
+ $this->getEntityManager()->persist($pcruFtpLog);
+ $this->getEntityManager()->flush();
+
+ throw $e;
+ } catch (Throwable $e) {
+
+ $pcruFtpLog = new PcruFtpLog();
+ $pcruFtpLog->setStatus("erreur");
+ $pcruFtpLog->setTitre($e->getMessage());
+ $pcruFtpLog->setDetails(implode("\r\n", $logs));
+ $this->getEntityManager()->persist($pcruFtpLog);
+ $this->getEntityManager()->flush();
+
+ throw $e;
+ }
+ }
+
+ private function envoyerUnDocumentPDFContrat($sftp, $conn, $cheminFichierLocalDansDocumentDropLocation, $repertoireDistant, $activityPcruInformationsId, $reference, &$logs) {
+ $docpath = $this->getOscarConfigurationService()->getDocumentDropLocation()
+ . DIRECTORY_SEPARATOR
+ . $cheminFichierLocalDansDocumentDropLocation;
+
+ $pdfFileName = $reference . '.pdf';
+
+ $logs[] = $this->log("Envoi du fichier " . $cheminFichierLocalDansDocumentDropLocation . ", renommé en " . $pdfFileName );
+
+ $stream = fopen('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $pdfFileName, 'w');
+ if (!$stream) {
+ $logs[] = $this->error("Impossible d'ouvrir le fichier " . $pdfFileName . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'ouvrir le fichier " . $pdfFileName . " dans le répertoire " . $repertoireDistant . " en écriture sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $r = fwrite($stream, file_get_contents($docpath));
+ if (!$r) {
+ $logs[] = $this->error("Impossible d'écrire dans le fichier " . $pdfFileName . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible d'écrire dans le fichier " . $pdfFileName . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+
+ $r = fclose($stream);
+ if (!$r) {
+ $logs[] = $this->error("Impossible de fermer le fichier " . $pdfFileName . " sur le serveur SFTP");
+ $e = new OscarPCRUException("Impossible de fermer le fichier " . $pdfFileName . " sur le serveur SFTP");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ $fichiersDeposes[] = $pdfFileName;
+ $logs[] = $this->log("Envoi du fichier " . $cheminFichierLocalDansDocumentDropLocation . ", renommé en " . $pdfFileName . " réussi");
+
+
+ $now = new \DateTime();
+ $nb = $this->getEntityManager()->getConnection()->executeStatement("
+ UPDATE
+ activitypcruinformations
+ SET
+ dateenvoifichiercontrat = ?,
+ dateupdated = ?
+ WHERE id = ?;
+ ", [$now, $now, $activityPcruInformationsId], ["datetime", "datetime", "integer"]);
+ if ($nb == 0) {
+ $logs[] = $this->log("dateEnvoiFichierContrat mise à jour pour aucune activitée. Étrange.");
+ } else if ($nb == 1) {
+ $logs[] = $this->log("dateEnvoiFichierContrat mise à jour pour une activité.");
+ } else {
+ $logs[] = $this->log($nb . " activités ont eu leur dateEnvoiFichierContrat mise à jour. Étrange.");
+ }
+
+ return $pdfFileName;
+ }
+
+ private function supprimerFichier($sftp, $conn, $repertoireDistant, $fichier, &$logs) {
+ $logs[] = $this->log("Suppression du fichier " . $fichier);
+ $result = unlink('ssh2.sftp://' . intval($sftp) . $repertoireDistant . '/' . $fichier);
+ if (!$result) {
+ $logs[] = $this->error("Impossible de supprimer le fichier " . $fichier . " sur le serveur SFTP.");
+ $e = new OscarPCRUException("Impossible de supprimer le fichier " . $fichier . " sur le serveur SFTP.");
+ $e->details = $logs;
+ ssh2_disconnect($sftp);
+ ssh2_disconnect($conn);
+ throw $e;
+ }
+ }
+
+ protected function getConfiguration()
+ {
+ return $this->getOscarConfigurationService()->getPcruFtpInfos();
+ }
+
+ protected function log( string $msg ): string
+ {
+ $this->getLoggerService()->info(sprintf('[process pcru - info] %s', $msg), []);
+ return '[INFO] ' . $msg;
+ }
+
+ protected function error( string $msg ): string
+ {
+ $this->getLoggerService()->error(sprintf('[process pcru - erro] %s', $msg), []);
+ return '[ERREUR] ' . $msg;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Service/PcruFtpServiceFactory.php b/module/Oscar/src/Oscar/Service/PcruFtpServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..f26da5073c2e55f627b15c31d176075b1b7feb86
--- /dev/null
+++ b/module/Oscar/src/Oscar/Service/PcruFtpServiceFactory.php
@@ -0,0 +1,20 @@
+setOscarConfigurationService($container->get(OscarConfigurationService::class));
+ $s->setEntityManager($container->get(EntityManager::class));
+ $s->setLoggerService($container->get('Logger'));
+ $s->setPcruInformationsService($container->get(PcruInformationsService::class));
+ return $s;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Service/PcruInformation.php b/module/Oscar/src/Oscar/Service/PcruInformation.php
new file mode 100644
index 0000000000000000000000000000000000000000..1fb62743998317cf93f3ee51f3223d7a8be4ae4f
--- /dev/null
+++ b/module/Oscar/src/Oscar/Service/PcruInformation.php
@@ -0,0 +1,182 @@
+oscarConfigurationService;
+ }
+
+ /**
+ * @param OscarConfigurationService $oscarConfigurationService
+ */
+ public function setOscarConfigurationService(OscarConfigurationService $oscarConfigurationService): void
+ {
+ $this->oscarConfigurationService = $oscarConfigurationService;
+ }
+
+ /**
+ *
+ * @param Activity $activity
+ */
+ public function getPcruInformationsForActivity(Activity $activity, ?Url $urlHelper = NULL): PcruInformationComplete
+ {
+ if (!$activity) {
+ throw new \Exception("L'activité demandée n'existe pas. Veuillez actualiser la page.");
+ }
+
+ $typesContrat = $this->entityManager->getRepository(PcruTypeContract::class)
+ ->createQueryBuilder('t')
+ ->orderBy('t.label', 'ASC')
+ ->getQuery()->getResult();
+
+ $pcruInformationParDefaut = $this->getPcruInformationParDefaut($activity, $typesContrat, $urlHelper);
+
+ $activityPcruInformations = $activity->getPcruInformations();
+ if ($activityPcruInformations == null) {
+ $activityPcruInformations = new ActivityPcruInformations();
+ }
+ $pasParDefautErreurs = $this->validatePasParDefaut($activityPcruInformations);
+
+ $pcruInformation = new PcruInformation();
+ $pcruInformation->objet = $activityPcruInformations->isUtiliserObjetParDefaut() ? $pcruInformationParDefaut->objet : $activityPcruInformations->getObjet();
+ $pcruInformation->labintel = $activityPcruInformations->isUtiliserLabintelParDefaut() ? $pcruInformationParDefaut->labintel : $activityPcruInformations->getLabintel();
+ $pcruInformation->rnsr = $activityPcruInformations->isUtiliserRnsrParDefaut() ? $pcruInformationParDefaut->rnsr : $activityPcruInformations->getRnsr();
+ $pcruInformation->sigle = $activityPcruInformations->isUtiliserSigleParDefaut() ? $pcruInformationParDefaut->sigle : $activityPcruInformations->getSigle();
+ $pcruInformation->numContrat = $activityPcruInformations->isUtiliserNumContratParDefaut() ? $pcruInformationParDefaut->numContrat : $activityPcruInformations->getNumContrat();
+ $pcruInformation->equipe = $activityPcruInformations->getEquipe();
+ $pcruInformation->typeContrat = $activityPcruInformations->isUtiliserTypeContratParDefaut() ? $pcruInformationParDefaut->typeContratLabel : ($activityPcruInformations->getPcruTypeContract() == NULL ? NULL : $activityPcruInformations->getPcruTypeContract()->getLabel());
+ $pcruInformation->acronyme = $activityPcruInformations->isUtiliserAcronymeParDefaut() ? $pcruInformationParDefaut->acronyme : $activityPcruInformations->getAcronyme();
+ $pcruInformation->contratsAssocies = $activityPcruInformations->getContratsAssocies();
+ $pcruInformation->responsableScientifique = $activityPcruInformations->isUtiliserResponsableScientifiqueParDefaut() ? $pcruInformationParDefaut->responsableScientifique : $activityPcruInformations->getResponsableScientifique();
+ $pcruInformation->employeurResponsableScientifique = $activityPcruInformations->getEmployeurResponsableScientifique();
+ $pcruInformation->coordinateurConsortium = $activityPcruInformations->isCoordinateurConsortium();
+ $pcruInformation->partenaires = $activityPcruInformations->isUtiliserPartenairesParDefaut() ? $pcruInformationParDefaut->partenaires : $activityPcruInformations->getPartenaires();
+ $pcruInformation->partenairePrincipal = $activityPcruInformations->isUtiliserPartenairePrincipalParDefaut() ? $pcruInformationParDefaut->partenairePrincipal : $activityPcruInformations->getPartenairePrincipal();
+ $pcruInformation->idPartenairePrincipal = $activityPcruInformations->isUtiliserIdPartenairePrincipalParDefaut() ? $pcruInformationParDefaut->idPartenairePrincipal : $activityPcruInformations->getIdPartenairePrincipal();
+ $pcruInformation->sourceFinancement = $pcruInformationParDefaut->sourceFinancement;
+ $pcruInformation->lieuExecution = $activityPcruInformations->getLieuExecution();
+ $pcruInformation->dateDerniereSignature = $activityPcruInformations->isUtiliserDateDerniereSignatureParDefaut() ? $pcruInformationParDefaut->dateDerniereSignature : $activityPcruInformations->getDateDerniereSignature();
+ $pcruInformation->duree = $activityPcruInformations->getDuree();
+ $pcruInformation->dateDebut = $activityPcruInformations->isUtiliserDateDebutParDefaut() ? $pcruInformationParDefaut->dateDebut : $activityPcruInformations->getDateDebut();
+ $pcruInformation->dateFin = $activityPcruInformations->isUtiliserDateFinParDefaut() ? $pcruInformationParDefaut->dateFin : $activityPcruInformations->getDateFin();
+ $pcruInformation->montantPercuUnite = $activityPcruInformations->getMontantPercuUnite();
+ $pcruInformation->contributionFinanceur = $activityPcruInformations->getContributionFinanceur();
+ $pcruInformation->montantTotal = $activityPcruInformations->isUtiliserMontantTotalParDefaut() ? $pcruInformationParDefaut->montantTotal : $activityPcruInformations->getMontantTotal();
+ $pcruInformation->montantTotalDevise = $activityPcruInformations->isUtiliserMontantTotalParDefaut() ? $pcruInformationParDefaut->montantTotalDevise : 'Euro';
+ $pcruInformation->validePoleCompetitivite = $pcruInformationParDefaut->validePoleCompetitivite;
+ $pcruInformation->poleCompetitivite = $pcruInformationParDefaut->poleCompetitivite;
+ $pcruInformation->commentaires = $activityPcruInformations->getCommentaires();
+ $pcruInformation->pia = $activityPcruInformations->isPia();
+ $pcruInformation->reference = $activityPcruInformations->isUtiliserReferenceParDefaut() ? $pcruInformationParDefaut->reference : $activityPcruInformations->getReference();
+ $pcruInformation->accordCadre = $activityPcruInformations->isAccordCadre();
+ $pcruInformation->cifre = $activityPcruInformations->isCifre();
+ $pcruInformation->chaireIndustrielle = $activityPcruInformations->isChaireIndustrielle();
+ $pcruInformation->presencePartenaireIndustriel = $activityPcruInformations->isPresencePartenaireIndustriel();
+
+ $erreurs = $this->validate($pcruInformation);
+
+ // Erreurs concernant deux champs, un par défaut et un pas par défaut
+ if ($pcruInformation->duree === NULL && $activityPcruInformations->isUtiliserDateFinParDefaut() && mb_strlen(trim($pcruInformationParDefaut->dateFin)) == 0) {
+ $pcruInformationParDefaut->dateFinErreurs[] = "Si la durée du contrat n'est pas renseignée, alors le champ DateFin doit l'être.";
+ $pasParDefautErreurs['dureeErreurs'][] = "Si la date de fin du contrat n'est pas renseignée, alors le champ Duree doit l'être.";
+ }
+
+ if ($activityPcruInformations->isUtiliserDateDebutParDefaut() && count($pcruInformationParDefaut->dateDebutErreurs) == 0 && !$activityPcruInformations->isUtiliserDateFinParDefaut() && mb_strlen(trim($activityPcruInformations->getDateFin())) != 0 && count($pasParDefautErreurs['dateFinErreurs']) == 0) {
+ $debut = \DateTime::createFromFormat('d-m-Y', $pcruInformationParDefaut->dateDebut);
+ $fin = \DateTime::createFromFormat('d-m-Y', $activityPcruInformations->getDateFin());
+ if ($fin < $debut) {
+ $pasParDefautErreurs['dateFinErreurs'][] = "La date de fin doit être postérieure à la date de début";
+ }
+ }
+ if (!$activityPcruInformations->isUtiliserDateDebutParDefaut() && count($pasParDefautErreurs['dateDebutErreurs']) == 0 && $activityPcruInformations->isUtiliserDateFinParDefaut() && mb_strlen(trim($pcruInformationParDefaut->dateFin)) != 0 && count($pcruInformationParDefaut->dateFinErreurs) == 0) {
+ $debut = \DateTime::createFromFormat('d-m-Y', $activityPcruInformations->getDateDebut());
+ $fin = \DateTime::createFromFormat('d-m-Y', $pcruInformationParDefaut->dateFin);
+ if ($fin < $debut) {
+ $pcruInformationParDefaut->dateFinErreurs[] = "La date de fin doit être postérieure à la date de début";
+ }
+ }
+
+ $pcruInformationComplete = new PcruInformationComplete();
+ $pcruInformationComplete->pcruInformationParDefaut = $pcruInformationParDefaut;
+ $pcruInformationComplete->activityPcruInformations = array_merge($activityPcruInformations->toArray(), $pasParDefautErreurs);
+ $pcruInformationComplete->pcruInformation = $pcruInformation;
+ $pcruInformationComplete->erreurs = $erreurs;
+ $pcruInformationComplete->enErreur = count($erreurs) > 0;
+
+ $pcruInformationComplete->unitRoles = $this->getOscarConfigurationService()->getPcruUnitRoles();
+
+ $pcruInformationComplete->typesContrat = [];
+ foreach ($typesContrat as $typeContrat) {
+ $pcruInformationComplete->typesContrat[] = ['id' => $typeContrat->getId(), 'label' => $typeContrat->getLabel()];
+ }
+
+ $pcruInformationComplete->roleResponsableScientifique = $this->getOscarConfigurationService()->getPcruInChargeRole();
+
+ $pcruInformationComplete->rolesPartenaires = $this->getOscarConfigurationService()->getPcruPartnerRoles();
+ $pcruInformationComplete->rolesPartenairePrincipal = $this->getOscarConfigurationService()->getPcruPartenairePrincipalRoles();
+
+ // Document signé
+ $typeDocumentSigne = $this->getOscarConfigurationService()->getPcruContractType();
+ $documentSigne = NULL;
+ /** @var ContractDocument $document */
+ foreach ($activity->getDocuments() as $document) {
+ if ($document->getTypeDocument()->getLabel() == $typeDocumentSigne) {
+ // Test sur les versions
+ if ($documentSigne != null) {
+ // On regarde si on est pas entrain de parser une ancienne version du fichier
+ if ($documentSigne->getFileName() == $document->getFileName()) {
+ continue;
+ }
+ $pcruInformationComplete->avertissementFichierContratManquant = "Impossible de déterminer automatiquement le fichier PDF de contrat signé à envoyer car il y a plusieurs documents de type '$typeDocumentSigne' sur cette activité";
+ break;
+ } else {
+ $documentSigne = $document;
+ }
+ }
+ }
+ if (!$documentSigne) {
+ $pcruInformationComplete->avertissementFichierContratManquant = "Impossible de déterminer automatiquement le fichier PDF de contrat signé à envoyer car l'activité n'a aucun document de type '$typeDocumentSigne'";
+ $pcruInformationComplete->enErreur = true;
+ } else {
+ $pcruInformationComplete->cheminFichierContrat = $documentSigne->getPath();
+ }
+
+ return $pcruInformationComplete;
+ }
+
+ private function getPcruInformationParDefaut(Activity $activity, $typesContrat, ?Url $urlHelper): PcruInformationParDefaut {
+ $pcruInformationParDefaut = new PcruInformationParDefaut();
+
+ $pcruInformationParDefaut->objet = $activity->getLabel();
+
+ $pcruUnitRoles = $this->getOscarConfigurationService()->getPcruUnitRoles();
+ if (count($pcruUnitRoles) === 0) {
+ throw new \Exception("Veuillez renseigner dans la configuration la clé pcru_unit_roles. Cette clé décrit une liste de rôles (le plus souvent 'Laboratoire') que peuvent avoir les unité PCRU lorsque ces organisations sont liées à des activités. C'est ce qui nous permet de récupérer automatiquement les valeurs par défaut à envoyer à PCRU. Sinon les valeurs doivent être saisies à la main.");
+ }
+
+ $pcruUnits = $activity->getOrganizationsWithOneRoleIn($pcruUnitRoles);
+
+ if (count($pcruUnits) == 0) {
+ $pcruInformationParDefaut->unitePcruParDefautErreur = "Impossible de déterminer automatiquement une organisation (unité) PCRU par défaut car l'activité n'a aucun partenaire de type (" . implode(', ', $pcruUnitRoles) . ")";
+ } else if (count($pcruUnits) == 1) {
+ if ($pcruUnits[0]->getLabintel() != null && trim($pcruUnits[0]->getLabintel()) !== '') {
+ $pcruInformationParDefaut->labintel = $pcruUnits[0]->getLabintel();
+ } else {
+ $pcruInformationParDefaut->labintelParDefautErreur = "Impossible de déterminer automatiquement un code labintel par défaut car l'organisation " . $pcruUnits[0]->fullOrShortName() . " n'en a pas de renseigné.";
+ }
+ $pcruInformationParDefaut->sigle = $pcruUnits[0]->getShortName();
+ if ($pcruUnits[0]->getRnsr() != null && trim($pcruUnits[0]->getRnsr()) !== '') {
+ $pcruInformationParDefaut->rnsr = $pcruUnits[0]->getRnsr();
+ } else {
+ $pcruInformationParDefaut->rnsrParDefautErreur = "Impossible de déterminer automatiquement un RNSR par défaut car l'organisation " . $pcruUnits[0]->fullOrShortName() . " n'en a pas de renseigné.";
+ }
+ } else {
+ $organisationAvecUnCodeLabintel = [];
+ foreach ($pcruUnits as $pcruUnit) {
+ if ($pcruUnit->getLabintel() != null && trim($pcruUnit->getLabintel()) !== '') {
+ $organisationAvecUnCodeLabintel[] = $pcruUnit;
+ }
+ }
+ if (count($organisationAvecUnCodeLabintel) === 0) {
+ $pcruInformationParDefaut->unitePcruParDefautErreur = "Impossible de déterminer automatiquement une organisation (unité) PCRU par défaut car aucun des partenaires de type (" . implode(', ', $pcruUnitRoles) . ") de l'activité n'a de code labintel de renseigné";
+ } else if (count($organisationAvecUnCodeLabintel) === 1) {
+ $pcruInformationParDefaut->labintel = $organisationAvecUnCodeLabintel[0]->getLabintel();
+ $pcruInformationParDefaut->sigle = $organisationAvecUnCodeLabintel[0]->getShortName();
+ if ($organisationAvecUnCodeLabintel[0]->getRnsr() != null && trim($organisationAvecUnCodeLabintel[0]->getRnsr()) !== '') {
+ $pcruInformationParDefaut->rnsr = $organisationAvecUnCodeLabintel[0]->getRnsr();
+ } else {
+ $pcruInformationParDefaut->rnsrParDefautErreur = "Impossible de déterminer automatiquement un RNSR par défaut car l'organisation " . $organisationAvecUnCodeLabintel[0]->fullOrShortName() . " n'en a pas de renseigné.";
+ }
+ } else {
+ $pcruInformationParDefaut->unitePcruParDefautErreur = "Impossible de déterminer automatiquement une organisation (unité) PCRU par défaut car plusieurs partenaires de type (" . implode(', ', $pcruUnitRoles) . ") de l'activité ont un code labintel de renseigné.";
+ }
+ }
+
+ $pcruInformationParDefaut->numContrat = $activity->getOscarNum();
+
+ $activityType = $activity->getActivityType();
+ if ($activityType == NULL) {
+ $pcruInformationParDefaut->typeContratParDefautErreur = "Impossible de déterminer automatiquement le type de contrat car l'activité n'a pas de type";
+ } else {
+ $typeContratParDefaut = [];
+ $typeContratParDefautToString = "";
+ foreach ($typesContrat as $typeContrat) {
+ if ($typeContrat->getActivityType() && $typeContrat->getActivityType()->getId() === $activityType->getId()) {
+ $typeContratParDefaut[] = $typeContrat;
+ if ($typeContratParDefautToString != "") {
+ $typeContratParDefautToString .= ", ";
+ }
+ $typeContratParDefautToString .= "[" . $typeContrat->getId() . "] " . $typeContrat->getLabel();
+ }
+ }
+ if (count($typeContratParDefaut) == 0) {
+ $pcruInformationParDefaut->typeContratParDefautErreur = "Impossible de déterminer automatiquement le type de contrat PCRU car aucune correspondance n'a été configurée pour le type de l'activité (" . $activityType->getLabel() . ")";
+ } else if (count($typeContratParDefaut) == 1) {
+ $pcruInformationParDefaut->typeContratId = $typeContratParDefaut[0]->getId();
+ $pcruInformationParDefaut->typeContratLabel = $typeContratParDefaut[0]->getLabel();
+ } else {
+ $pcruInformationParDefaut->typeContratParDefautErreur = "Impossible de déterminer automatiquement le type de contrat PCRU car plusieurs correspondances PCRU (" . $typeContratParDefautToString . ") ont été configurées pour le type de l'activité dans Oscar (" . $activityType->getLabel() . ")";
+ }
+ }
+
+ $pcruInformationParDefaut->acronyme = $activity->getAcronym();
+
+
+ $pcruInChargeRole = $this->getOscarConfigurationService()->getPcruInChargeRole();
+ if ($pcruInChargeRole === NULL || mb_strlen(trim($pcruInChargeRole)) === 0) {
+ throw new \Exception("Veuillez renseigner dans la configuration la clé pcru_incharge_role. Cette clé décrit le nom du rôle correspondant au responsable scientifique dans l'application (le plus souvent c'est tout simplement 'Responsable scientifique'). C'est ce qui nous permet de récupérer automatiquement la valeur par défaut à envoyer à PCRU. Sinon la valeur doit être saisie à la main.");
+ }
+ $personsWithRole = $activity->getPersonsWithRole($pcruInChargeRole);
+ if (count($personsWithRole) == 0) {
+ $pcruInformationParDefaut->responsableScientifiqueParDefautErreur = "Impossible de déterminer automatiquement un reponsable scientifique par défaut car l'activité n'a aucun membre ayant le rôle (" . $pcruInChargeRole . ")";
+ } else if (count($personsWithRole) == 1) {
+ $pcruInformationParDefaut->responsableScientifique = mb_strtoupper($personsWithRole[0]->getPerson()->getLastName()) . " " . $personsWithRole[0]->getPerson()->getFirstName();
+ } else {
+ $pcruInformationParDefaut->responsableScientifiqueParDefautErreur = "Impossible de déterminer automatiquement un reponsable scientifique par défaut car l'activité a plusieurs membres ayant le rôle (" . $pcruInChargeRole . ")";
+ }
+
+ $pcruPartnerRoles = $this->getOscarConfigurationService()->getPcruPartnerRoles();
+ if ($pcruPartnerRoles === NULL || count($pcruPartnerRoles) === 0) {
+ $pcruInformationParDefaut->partenairesParDefautErreur = "Impossible de déterminer automatiquement les partenaires par défaut car la clé pcru_partner_roles n'est pas renseignée dans la configuration. Cette clé décrit une liste de rôles (par exemple ['Partenaires']) que doivent avoir les organisations liées à l'activité pour être considérées comme des partenaires du point de vue de PCRU.";
+ } else {
+ $partenaires = $activity->getOrganizationsWithOneRoleIn($pcruPartnerRoles);
+ if (count($partenaires) == 0) {
+ $pcruInformationParDefaut->partenairesParDefautInfo = "Impossible de déterminer automatiquement les partenaires par défaut car l'activité n'a aucun partenaire de type (" . implode(', ', $pcruPartnerRoles) . ")";
+ } else {
+ $pcruInformationParDefaut->partenaires = "";
+ foreach ($partenaires as $partenaire) {
+ if ($pcruInformationParDefaut->partenaires != '') {
+ $pcruInformationParDefaut->partenaires .= ' | ';
+ }
+ $pcruInformationParDefaut->partenaires .= $partenaire->getShortName();
+ }
+ }
+ }
+
+ $pcruPartenairePrincipalRoles = $this->getOscarConfigurationService()->getPcruPartenairePrincipalRoles();
+ if ($pcruPartenairePrincipalRoles === NULL || count($pcruPartenairePrincipalRoles) === 0) {
+ $pcruInformationParDefaut->partenairePrincipalParDefautErreur = "Impossible de déterminer automatiquement le partenaire principal par défaut car la clé pcru_partenaire_principal_roles n'est pas renseignée dans la configuration. Cette clé décrit une liste de rôles (par exemple ['Partenaires']) que doit avoir une organisation liée à l'activité pour être considérée comme le partenaire principal du point de vue de PCRU.";
+ } else {
+ $partenaires = $activity->getOrganizationsWithOneRoleIn($pcruPartenairePrincipalRoles);
+ if (count($partenaires) == 0) {
+ $pcruInformationParDefaut->partenairePrincipalParDefautErreur = "Impossible de déterminer automatiquement le partenaire principal par défaut car l'activité n'a aucun partenaire de type (" . implode(', ', $pcruPartenairePrincipalRoles) . ")";
+ } else if (count($partenaires) == 1) {
+
+ $pcruInformationParDefaut->partenairePrincipal = $partenaires[0]->getShortName();
+
+ if ($partenaires[0]->getCodePcru() == NULL || mb_strlen(trim($partenaires[0]->getCodePcru())) == 0) {
+ $pcruInformationParDefaut->idPartenairePrincipalParDefautErreur = "Impossible de déterminer automatiquement l'identifiant du partenaire principal par défaut car l'organization ([" . $partenaires[0]->getId() . "] " . $partenaires[0]->getShortName() . ") n'a ni SIRET, ni TVA intracommunautaire ni DUNS.";
+ } else {
+ $pcruInformationParDefaut->idPartenairePrincipal = $partenaires[0]->getCodePcru();
+ }
+
+ $partenaire = $partenaires[0];
+ $avertissements = [];
+ if (mb_strlen(trim($partenaire->getShortName())) == 0) {
+ $avertissements[] = "Le nom court doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getFullName())) == 0) {
+ $avertissements[] = "Le nom complet doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getCodePcru())) == 0) {
+ $avertissements[] = "Le numéro SIRET, la TVA Intracommunautaire ou le DUNS doit être renseigné";
+ }
+ if ($partenaire->getTypeEtablissementPcruObj() == NULL) {
+ $avertissements[] = "Le type d'établissement PCRU doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getStreet1())) == 0) {
+ $avertissements[] = "L'adresse (rue 1) doit être renseignée";
+ }
+ if (mb_strlen(trim($partenaire->getZipCode())) == 0) {
+ $avertissements[] = "Le code postal doit être renseigné";
+ }
+ if (mb_strlen(trim($partenaire->getCity())) == 0) {
+ $avertissements[] = "La ville doit être renseignée";
+ }
+ if (mb_strlen(trim($partenaire->getCountry())) == 0) {
+ $avertissements[] = "Le pays doit être renseigné";
+ }
+ if (count($avertissements) > 0) {
+ $pcruInformationParDefaut->avertissementsPartenaires[] = [
+ "nom" => mb_strlen(trim($partenaire->getShortName())) == 0 ? $partenaire->getFullName() : $partenaire->getShortName(),
+ "id" => $partenaire->getId(),
+ "url" => $urlHelper == NULL ? "" : $urlHelper->fromRoute('organization/edit', ['id' => $partenaire->getId()]),
+ "erreurs" => $avertissements
+ ];
+ }
+ } else {
+ $pcruInformationParDefaut->partenairePrincipalParDefautErreur = "Impossible de déterminer automatiquement le partenaire principal par défaut car l'activité a plusieurs partenaires de type (" . implode(', ', $pcruPartenairePrincipalRoles) . ")";
+ }
+ }
+
+ $pcruInformationParDefaut->sourceFinancement = $activity->getPcruSourceFinancement() ? $activity->getPcruSourceFinancement()->getLabel() : NULL;
+
+ if ($activity->getDateSigned() != NULL) {
+ $pcruInformationParDefaut->dateDerniereSignature = $activity->getDateSigned()->format('d-m-Y');
+ } else {
+ $pcruInformationParDefaut->dateDerniereSignatureParDefautErreur = "Impossible de déterminer automatiquement la date de dernière signature car la date de signature n'est pas renseignée dans la fiche de l'activité.";
+ }
+
+ if ($activity->getDateStart() != NULL) {
+ $pcruInformationParDefaut->dateDebut = $activity->getDateStart()->format('d-m-Y');
+ } else {
+ $pcruInformationParDefaut->dateDebutParDefautErreur = "Impossible de déterminer automatiquement la date de début car la date de début du contrat n'est pas renseignée dans la fiche de l'activité.";
+ }
+
+ if ($activity->getDateEnd() != NULL) {
+ $pcruInformationParDefaut->dateFin = $activity->getDateEnd()->format('d-m-Y');
+ } else {
+ $pcruInformationParDefaut->dateFinParDefautErreur = "Impossible de déterminer automatiquement la date de fin car la date de fin du contrat n'est pas renseignée dans la fiche de l'activité.";
+ }
+
+ $pcruInformationParDefaut->montantTotal = $activity->getAmount();
+ $pcruInformationParDefaut->montantTotalDevise = $activity->getCurrency()->getLabel();
+
+ $pcruInformationParDefaut->validePoleCompetitivite = $activity->isPcruValidPoleCompetitivite() ? true : false;
+
+ if ($activity->getPcruPoleCompetitivite()) {
+ $pcruInformationParDefaut->poleCompetitivite = $activity->getPcruPoleCompetitivite()->getLabel();
+ }
+
+ $pcruInformationParDefaut->reference = $activity->getOscarNum();
+
+ $this->validateParDefaut($pcruInformationParDefaut);
+
+ return $pcruInformationParDefaut;
+ }
+
+ /**
+ * Validation des informations PCRU d'une activité
+ *
+ * @param PcruInformationParDefaut $info
+ */
+ public function validateParDefaut(PcruInformationParDefaut $info)
+ {
+ if ($info->objet == NULL || mb_strlen(trim($info->objet)) == 0) {
+ $info->objetErreurs[] = 'Le champ Objet est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->objet)) > 1000) {
+ $info->objetErreurs[] = 'Le champ Objet doit faire moins de 1000 caractères';
+ }
+
+ if ($info->labintel == NULL || mb_strlen(trim($info->labintel)) == 0) {
+ $info->labintelErreurs[] = 'Le champ CodeLabintelUnite est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->labintel)) > 10) {
+ $info->labintelErreurs[] = 'Le champ CodeLabintelUnite doit faire moins de 10 caractères';
+ }
+
+ $info->rnsrErreurs = $this->validateField($info->rnsr, 'CodeRNSRUnite', ActivityPcruInformations::RNSR_MAX_LENGTH, true);
+
+ if ($info->sigle != NULL && mb_strlen(trim($info->sigle)) > 20) {
+ $info->sigleErreurs[] = 'Le champ SigleUnite doit faire moins de 20 caractères';
+ }
+
+ if ($info->numContrat == NULL || mb_strlen(trim($info->numContrat)) == 0) {
+ $info->numContratErreurs[] = 'Le champ ReferenceGestionnaire est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->numContrat)) > 30) {
+ $info->numContratErreurs[] = 'Le champ ReferenceGestionnaire doit faire moins de 30 caractères';
+ }
+
+ if ($info->typeContratId == NULL) {
+ $info->typeContratErreurs[] = 'Le champ TypeContrat est obligatoire et doit être défini';
+ }
+
+ if ($info->acronyme != NULL && mb_strlen(trim($info->acronyme)) > 50) {
+ $info->acronymeErreurs[] = 'Le champ Acronyme doit faire moins de 50 caractères';
+ }
+
+ if ($info->responsableScientifique == NULL || mb_strlen(trim($info->responsableScientifique)) == 0) {
+ $info->responsableScientifiqueErreurs[] = 'Le champ NomRespScientifique est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->responsableScientifique)) > 50) {
+ $info->responsableScientifiqueErreurs[] = 'Le champ NomRespScientifique doit faire moins de 50 caractères';
+ }
+
+ if ($info->partenaires != NULL && mb_strlen(trim($info->partenaires)) > 200) {
+ $info->partenairesErreurs[] = 'Le champ Partenaires doit faire moins de 200 caractères';
+ }
+
+ $info->partenairePrincipalErreurs = $this->validateField($info->partenairePrincipal, 'PartenairePrincipal', ActivityPcruInformations::PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+
+ $info->idPartenairePrincipalErreurs = $this->validateField($info->idPartenairePrincipal, 'IdPrincipal', ActivityPcruInformations::ID_PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+
+ $info->sourceFinancementErreurs = $this->validateField($info->sourceFinancement, 'SourceFinancement', null);
+
+ $info->dateDerniereSignatureErreurs = $this->validateDateField($info->dateDerniereSignature, 'DateDerniereSignature');
+
+ $info->dateDebutErreurs = $this->validateDateField($info->dateDebut, 'DateDebut');
+
+ $info->dateFinErreurs = $this->validateDateField($info->dateFin, 'DateFin', true);
+
+ if (count($info->dateDebutErreurs) == 0 && count($info->dateFinErreurs) == 0 && mb_strlen(trim($info->dateFin)) != 0) {
+ $debut = \DateTime::createFromFormat('d-m-Y', $info->dateDebut);
+ $fin = \DateTime::createFromFormat('d-m-Y', $info->dateFin);
+ if ($fin < $debut) {
+ $info->dateFinErreurs[] = "La date de fin doit être postérieure à la date de début";
+ }
+ }
+
+ if ($this->aPlusDeDeuxDecimales($info->montantTotal)) {
+ $info->montantTotalErreurs[] = 'Le champ MontantTotal ne doit pas avoir plus de deux chiffres après la virgule';
+ }
+ if ($info->montantTotalDevise != "Euro") {
+ $info->montantTotalErreurs[] = 'Le champ MontantTotal doit être en euros';
+ }
+
+ if ($info->validePoleCompetitivite && mb_strlen(trim($info->poleCompetitivite)) == 0) {
+ $info->poleCompetitiviteErreurs[] = 'Si le contrat est validé par un pôle de compétitivité alors le champ PoleCompetitivite est obligatoire';
+ }
+
+ $info->referenceErreurs = $this->validateField($info->reference, 'ReferenceNonGestionnaire', ActivityPcruInformations::REFERENCE_MAX_LENGTH, true);
+ }
+
+ private function validateField(?string $fieldValue, string $fieldName, ?int $fieldMaxLength, bool $nullAllowed = false): array {
+ $erreurs = [];
+ if (!$nullAllowed && mb_strlen(trim($fieldValue)) == 0) {
+ $erreurs[] = 'Le champ ' . $fieldName . ' est obligatoire et doit être défini';
+ } else if ($fieldValue != NULL && $fieldMaxLength != NULL && mb_strlen(trim($fieldValue)) > $fieldMaxLength) {
+ $erreurs[] = 'Le champ ' . $fieldName . ' doit faire moins de ' . $fieldMaxLength . ' caractères';
+ }
+ return $erreurs;
+ }
+
+ private function validateDateField(?string $date, string $fieldName, bool $nullAllowed = false): array {
+ $erreurs = [];
+ $format = 'd-m-Y';
+ if (!$nullAllowed && mb_strlen(trim($date)) == 0) {
+ $erreurs[] = 'Le champ ' . $fieldName . ' est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($date)) != 0) {
+ $d = \DateTime::createFromFormat($format, $date);
+ // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
+ if (!$d || strtolower($d->format($format)) !== strtolower($date)) {
+ $erreurs[] = 'Le champ ' . $fieldName . ' doit être une date valide au format jj-mm-aaaa';
+ }
+ }
+ return $erreurs;
+ }
+
+ public function validatePasParDefaut(ActivityPcruInformations $activityPcruInformations): array
+ {
+ $erreurs = [];
+ $erreurs['objetErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserObjetParDefaut()) {
+ if ($activityPcruInformations->getObjet() == NULL || mb_strlen(trim($activityPcruInformations->getObjet())) == 0) {
+ $erreurs['objetErreurs'][] = 'Le champ Objet est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($activityPcruInformations->getObjet())) > 1000) {
+ $erreurs['objetErreurs'][] = 'Le champ Objet doit faire moins de 1000 caractères';
+ }
+ }
+ $erreurs['labintelErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserLabintelParDefaut()) {
+ if ($activityPcruInformations->getLabintel() == NULL || mb_strlen(trim($activityPcruInformations->getLabintel())) == 0) {
+ $erreurs['labintelErreurs'][] = 'Le champ CodeLabintelUnite est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($activityPcruInformations->getLabintel())) > 10) {
+ $erreurs['labintelErreurs'][] = 'Le champ CodeLabintelUnite doit faire moins de 10 caractères';
+ }
+ }
+ $erreurs['rnsrErreurs'] = $this->validateField($activityPcruInformations->getRnsr(), 'CodeRNSRUnite', ActivityPcruInformations::RNSR_MAX_LENGTH, true);
+ $erreurs['sigleErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserSigleParDefaut()) {
+ if ($activityPcruInformations->getSigle() == NULL && mb_strlen(trim($activityPcruInformations->getSigle())) > 20) {
+ $erreurs['sigleErreurs'][] = 'Le champ SigleUnite doit faire moins de 20 caractères';
+ }
+ }
+ $erreurs['numContratErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserNumContratParDefaut()) {
+ if ($activityPcruInformations->getNumContrat() == NULL || mb_strlen(trim($activityPcruInformations->getNumContrat())) == 0) {
+ $erreurs['numContratErreurs'][] = 'Le champ ReferenceGestionnaire est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($activityPcruInformations->getNumContrat())) > 30) {
+ $erreurs['numContratErreurs'][] = 'Le champ ReferenceGestionnaire doit faire moins de 30 caractères';
+ }
+ }
+ $erreurs['equipeErreurs'] = [];
+ if ($activityPcruInformations->getEquipe() != NULL && mb_strlen(trim($activityPcruInformations->getEquipe())) > 150) {
+ $erreurs['equipeErreurs'][] = 'Le champ Equipe doit faire moins de 150 caractères';
+ }
+ $erreurs['typeContratErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserTypeContratParDefaut() && $activityPcruInformations->getPcruTypeContract() == NULL) {
+ $erreurs['typeContratErreurs'][] = 'Le champ TypeContrat est obligatoire et doit être défini';
+ }
+ $erreurs['acronymeErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserAcronymeParDefaut() && $activityPcruInformations->getAcronyme() != NULL && mb_strlen(trim($activityPcruInformations->getAcronyme())) > 50) {
+ $erreurs['acronymeErreurs'][] = 'Le champ Acronyme doit faire moins de 50 caractères';
+ }
+ $erreurs['contratsAssociesErreurs'] = [];
+ if ($activityPcruInformations->getContratsAssocies() != NULL && mb_strlen(trim($activityPcruInformations->getContratsAssocies())) > 300) {
+ $erreurs['contratsAssociesErreurs'][] = 'Le champ ContratsAssocies doit faire moins de 300 caractères';
+ }
+ $erreurs['responsableScientifiqueErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserResponsableScientifiqueParDefaut()) {
+ if ($activityPcruInformations->getResponsableScientifique() == NULL || mb_strlen(trim($activityPcruInformations->getResponsableScientifique())) == 0) {
+ $erreurs['responsableScientifiqueErreurs'][] = 'Le champ NomRespScientifique est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($activityPcruInformations->getResponsableScientifique())) > 50) {
+ $erreurs['responsableScientifiqueErreurs'][] = 'Le champ NomRespScientifique doit faire moins de 50 caractères';
+ }
+ }
+ $erreurs['employeurResponsableScientifiqueErreurs'] = [];
+ if ($activityPcruInformations->getEmployeurResponsableScientifique() != NULL && mb_strlen(trim($activityPcruInformations->getEmployeurResponsableScientifique())) > 50) {
+ $erreurs['employeurResponsableScientifiqueErreurs'][] = 'Le champ EmployeurRespScientifique doit faire moins de 50 caractères';
+ }
+ $erreurs['partenairesErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserPartenairesParDefaut() && $activityPcruInformations->getPartenaires() != NULL && mb_strlen(trim($activityPcruInformations->getPartenaires())) > 200) {
+ $erreurs['partenairesErreurs'][] = 'Le champ Partenaires doit faire moins de 200 caractères';
+ }
+
+ $erreurs['partenairePrincipalErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserPartenairePrincipalParDefaut()) {
+ $erreurs['partenairePrincipalErreurs'] = $this->validateField($activityPcruInformations->getPartenairePrincipal(), 'PartenairePrincipal', ActivityPcruInformations::PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+ }
+
+ $erreurs['idPartenairePrincipalErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserIdPartenairePrincipalParDefaut()) {
+ $erreurs['idPartenairePrincipalErreurs'] = $this->validateField($activityPcruInformations->getIdPartenairePrincipal(), 'IdPrincipal', ActivityPcruInformations::ID_PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+ }
+
+ $erreurs['lieuExecutionErreurs'] = $this->validateField($activityPcruInformations->getLieuExecution(), 'LieuExecution', ActivityPcruInformations::LIEU_EXECUTION_MAX_LENGTH, true);
+
+ $erreurs['dateDerniereSignatureErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserDateDerniereSignatureParDefaut()) {
+ $erreurs['dateDerniereSignatureErreurs'] = $this->validateDateField($activityPcruInformations->getDateDerniereSignature(), 'DateDerniereSignature');
+ }
+
+ $erreurs['dureeErreurs'] = [];
+ if ($activityPcruInformations->getDuree() !== NULL) {
+ if ($activityPcruInformations->getDuree() > 999.5) {
+ $erreurs['dureeErreurs'][] = "Le champ Duree contient une valeur trop grande.";
+ } else if ($activityPcruInformations->getDuree() < 0.5) {
+ $erreurs['dureeErreurs'][] = "Le champ Duree ne peut pas être plus petit que 0,5 mois.";
+ }
+ $decimales = abs($activityPcruInformations->getDuree()) - floor(abs($activityPcruInformations->getDuree()));
+ if ($decimales != 0 && $decimales != 0.5) {
+ $erreurs['dureeErreurs'][] = "Si le champ Duree doit avoir une valeur après la virgule, ça ne peut être que 0,5";
+ }
+ }
+
+ $erreurs['dateDebutErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserDateDebutParDefaut()) {
+ $erreurs['dateDebutErreurs'] = $this->validateDateField($activityPcruInformations->getDateDebut(), 'DateDebut');
+ }
+
+ $erreurs['dateFinErreurs'] = [];
+ if (!$activityPcruInformations->isUtiliserDateFinParDefaut()) {
+ $erreurs['dateFinErreurs'] = $this->validateDateField($activityPcruInformations->getDateFin(), 'DateFin', true);
+ }
+
+ if ($activityPcruInformations->getDuree() === NULL && !$activityPcruInformations->isUtiliserDateFinParDefaut() && mb_strlen(trim($activityPcruInformations->getDateFin())) == 0) {
+ $erreurs['dateFinErreurs'][] = "Si la durée du contrat n'est pas renseignée, alors le champ DateFin doit l'être.";
+ $erreurs['dureeErreurs'][] = "Si la date de fin du contrat n'est pas renseignée, alors le champ Duree doit l'être.";
+ }
+
+ if (!$activityPcruInformations->isUtiliserDateDebutParDefaut() && count($erreurs['dateDebutErreurs']) == 0 && !$activityPcruInformations->isUtiliserDateFinParDefaut() && mb_strlen(trim($activityPcruInformations->getDateFin())) != 0 && count($erreurs['dateFinErreurs']) == 0) {
+ $debut = \DateTime::createFromFormat('d-m-Y', $activityPcruInformations->getDateDebut());
+ $fin = \DateTime::createFromFormat('d-m-Y', $activityPcruInformations->getDateFin());
+ if ($fin < $debut) {
+ $erreurs['dateFinErreurs'][] = "La date de fin doit être postérieure à la date de début";
+ }
+ }
+
+ $erreurs['montantPercuUniteErreurs'] = [];
+ if ($activityPcruInformations->getMontantPercuUnite() === NULL) {
+ $erreurs['montantPercuUniteErreurs'][] = 'Le champ MontantPercuUnite est obligatoire et doit être défini';
+ } else {
+ if ($activityPcruInformations->getMontantPercuUnite() > 9999999999.99) {
+ $erreurs['montantPercuUniteErreurs'][] = "Le champ MontantPercuUnite contient une valeur trop grande.";
+ } else if ($activityPcruInformations->getMontantPercuUnite() < -9999999999.99) {
+ $erreurs['montantPercuUniteErreurs'][] = "Le champ MontantPercuUnite contient une valeur trop petite.";
+ }
+ }
+
+ $erreurs['contributionFinanceurErreurs'] = [];
+ if ($activityPcruInformations->getContributionFinanceur() !== NULL) {
+ if ($activityPcruInformations->getContributionFinanceur() > 9999999999.99) {
+ $erreurs['contributionFinanceurErreurs'][] = "Le champ ContributionFinanceur contient une valeur trop grande.";
+ } else if ($activityPcruInformations->getContributionFinanceur() < -9999999999.99) {
+ $erreurs['contributionFinanceurErreurs'][] = "Le champ ContributionFinanceur contient une valeur trop petite.";
+ }
+ }
+
+ $erreurs['montantTotalErreurs'] = [];
+ if ($activityPcruInformations->getMontantTotal() !== NULL) {
+ if ($activityPcruInformations->getMontantTotal() > 9999999999.99) {
+ $erreurs['montantTotalErreurs'][] = "Le champ MontantTotal contient une valeur trop grande.";
+ } else if ($activityPcruInformations->getMontantTotal() < -9999999999.99) {
+ $erreurs['montantTotalErreurs'][] = "Le champ MontantTotal contient une valeur trop petite.";
+ }
+ }
+
+ $erreurs['commentairesErreurs'] = $this->validateField($activityPcruInformations->getCommentaires(), 'Commentaire', ActivityPcruInformations::COMMENTAIRES_MAX_LENGTH, true);
+
+ $erreurs['referenceErreurs'] = [];
+
+ if (!$activityPcruInformations->isUtiliserReferenceParDefaut()) {
+ $this->validateField($activityPcruInformations->getReference(), 'ReferenceNonGestionnaire', ActivityPcruInformations::REFERENCE_MAX_LENGTH, true);
+ }
+
+ return $erreurs;
+ }
+
+ /**
+ * Validation des informations PCRU d'une activité
+ *
+ * @param PcruInformation $info
+ */
+ public function validate(PcruInformation $info): array
+ {
+ $errors = [];
+ $errorsObjet = [];
+ if ($info->objet == NULL || mb_strlen(trim($info->objet)) == 0) {
+ $errorsObjet[] = 'Le champ Objet est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->objet)) > 1000) {
+ $errorsObjet[] = 'Le champ Objet doit faire moins de 1000 caractères';
+ }
+ if (count($errorsObjet) > 0) {
+ $errors['objet'] = $errorsObjet;
+ }
+
+ $errorsLabintel = [];
+ if ($info->labintel == NULL || mb_strlen(trim($info->labintel)) == 0) {
+ $errorsLabintel[] = 'Le champ CodeLabintelUnite est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->labintel)) > 10) {
+ $errorsLabintel[] = 'Le champ CodeLabintelUnite doit faire moins de 10 caractères';
+ }
+ if (count($errorsLabintel) > 0) {
+ $errors['labintel'] = $errorsLabintel;
+ }
+
+ $errorsRnsr = $this->validateField($info->rnsr, 'CodeRNSRUnite', ActivityPcruInformations::RNSR_MAX_LENGTH, true);
+ if (count($errorsRnsr) > 0) {
+ $errors['rnsr'] = $errorsRnsr;
+ }
+
+ $errorsSigle = [];
+ if ($info->sigle != NULL && mb_strlen(trim($info->sigle)) > 20) {
+ $errorsSigle[] = 'Le champ SigleUnite doit faire moins de 20 caractères';
+ }
+ if (count($errorsSigle) > 0) {
+ $errors['sigle'] = $errorsSigle;
+ }
+
+ $errorsNumContrat = [];
+ if ($info->numContrat == NULL || mb_strlen(trim($info->numContrat)) == 0) {
+ $errorsNumContrat[] = 'Le champ ReferenceGestionnaire est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->numContrat)) > 30) {
+ $errorsNumContrat[] = 'Le champ ReferenceGestionnaire doit faire moins de 30 caractères';
+ }
+ if (count($errorsNumContrat) > 0) {
+ $errors['numContrat'] = $errorsNumContrat;
+ }
+
+ $errorsEquipe = [];
+ if ($info->equipe != NULL && mb_strlen(trim($info->equipe)) > 150) {
+ $errorsEquipe[] = 'Le champ Equipe doit faire moins de 150 caractères';
+ }
+ if (count($errorsEquipe) > 0) {
+ $errors['equipe'] = $errorsEquipe;
+ }
+
+ $errorsTypeContrat = [];
+ if ($info->typeContrat == NULL) {
+ $errorsTypeContrat[] = 'Le champ TypeContrat est obligatoire et doit être défini';
+ }
+ if (count($errorsTypeContrat) > 0) {
+ $errors['typeContrat'] = $errorsTypeContrat;
+ }
+
+ $errorsAcronyme = [];
+ if ($info->acronyme != NULL && mb_strlen(trim($info->acronyme)) > 50) {
+ $errorsAcronyme[] = 'Le champ Acronyme doit faire moins de 50 caractères';
+ }
+ if (count($errorsAcronyme) > 0) {
+ $errors['acronyme'] = $errorsAcronyme;
+ }
+
+ $errorsContratsAssocies = [];
+ if ($info->contratsAssocies != NULL && mb_strlen(trim($info->contratsAssocies)) > 300) {
+ $errorsContratsAssocies[] = 'Le champ ContratsAssocies doit faire moins de 300 caractères';
+ }
+ if (count($errorsContratsAssocies) > 0) {
+ $errors['contratsAssocies'] = $errorsContratsAssocies;
+ }
+
+ $errorsResponsableScientifique = [];
+ if ($info->responsableScientifique == NULL || mb_strlen(trim($info->responsableScientifique)) == 0) {
+ $errorsResponsableScientifique[] = 'Le champ NomRespScientifique est obligatoire et doit être défini';
+ } else if (mb_strlen(trim($info->responsableScientifique)) > 50) {
+ $errorsResponsableScientifique[] = 'Le champ NomRespScientifique doit faire moins de 50 caractères';
+ }
+ if (count($errorsResponsableScientifique) > 0) {
+ $errors['responsableScientifique'] = $errorsResponsableScientifique;
+ }
+
+ $errorsEmployeurResponsableScientifique = [];
+ if ($info->employeurResponsableScientifique != NULL && mb_strlen(trim($info->employeurResponsableScientifique)) > 50) {
+ $errorsEmployeurResponsableScientifique[] = 'Le champ EmployeurRespScientifique doit faire moins de 50 caractères';
+ }
+ if (count($errorsEmployeurResponsableScientifique) > 0) {
+ $errors['employeurResponsableScientifique'] = $errorsEmployeurResponsableScientifique;
+ }
+
+ $errorsPartenaires = [];
+ if ($info->partenaires != NULL && mb_strlen(trim($info->partenaires)) > 200) {
+ $errorsPartenaires[] = 'Le champ Partenaires doit faire moins de 200 caractères';
+ }
+ if (count($errorsPartenaires) > 0) {
+ $errors['partenaires'] = $errorsPartenaires;
+ }
+
+ $errorsPartenairePrincipal = $this->validateField($info->partenairePrincipal, 'PartenairePrincipal', ActivityPcruInformations::PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+ if (count($errorsPartenairePrincipal) > 0) {
+ $errors['partenairePrincipal'] = $errorsPartenairePrincipal;
+ }
+
+ $errorsIdPartenairePrincipal = $this->validateField($info->idPartenairePrincipal, 'IdPrincipal', ActivityPcruInformations::ID_PARTENAIRE_PRINCIPAL_MAX_LENGTH);
+ if (count($errorsIdPartenairePrincipal) > 0) {
+ $errors['idPartenairePrincipal'] = $errorsIdPartenairePrincipal;
+ }
+
+ $errorsSourceFinancement = $this->validateField($info->sourceFinancement, 'SourceFinancement', null);
+ if (count($errorsSourceFinancement) > 0) {
+ $errors['sourceFinancement'] = $errorsSourceFinancement;
+ }
+
+ // La spec dit que le champ est obligatoire, mais le formulaire de saisie de contrat sur le site web PCRU et les export CSV montrent qu'en fait non.
+ $errorsLieuExecution = $this->validateField($info->lieuExecution, 'LieuExecution', ActivityPcruInformations::LIEU_EXECUTION_MAX_LENGTH, true);
+ if (count($errorsLieuExecution) > 0) {
+ $errors['lieuExecution'] = $errorsLieuExecution;
+ }
+
+ $errorsDateDerniereSignature = $this->validateDateField($info->dateDerniereSignature, 'DateDerniereSignature');
+ if (count($errorsDateDerniereSignature) > 0) {
+ $errors['dateDerniereSignature'] = $errorsDateDerniereSignature;
+ }
+
+ $errorsDuree = [];
+ if ($info->duree !== NULL) {
+ if ($info->duree > 999.5) {
+ $errorsDuree[] = "Le champ Duree contient une valeur trop grande.";
+ } else if ($info->duree < 0.5) {
+ $errorsDuree[] = "Le champ Duree ne peut pas être plus petit que 0,5 mois.";
+ }
+ $decimales = abs($info->duree) - floor(abs($info->duree));
+ if ($decimales != 0 && $decimales != 0.5) {
+ $errorsDuree[] = "Si le champ Duree doit avoir une valeur après la virgule, ça ne peut être que 0,5";
+ }
+ } else if (mb_strlen(trim($info->dateFin)) == 0) {
+ $errorsDuree[] = "Si la date de fin du contrat n'est pas renseignée, alors le champ Duree doit l'être.";
+ }
+ if (count($errorsDuree) > 0) {
+ $errors['duree'] = $errorsDuree;
+ }
+
+ $errorsDateDebut = $this->validateDateField($info->dateDebut, 'DateDebut');
+ if (count($errorsDateDebut) > 0) {
+ $errors['dateDebut'] = $errorsDateDebut;
+ }
+
+ $errorsDateFin = $this->validateDateField($info->dateFin, 'DateFin', true);
+ if (mb_strlen(trim($info->dateFin)) == 0 && $info->duree === NULL) {
+ $errorsDateFin[] = "Si la durée du contrat n'est pas renseignée, alors le champ DateFin doit l'être.";
+ }
+ if (count($errorsDateDebut) == 0 && mb_strlen(trim($info->dateFin)) != 0 && count($errorsDateFin) == 0) {
+ $debut = \DateTime::createFromFormat('d-m-Y', $info->dateDebut);
+ $fin = \DateTime::createFromFormat('d-m-Y', $info->dateFin);
+ if ($fin < $debut) {
+ $errorsDateFin[] = "La date de fin doit être postérieure à la date de début";
+ }
+ }
+ if (count($errorsDateFin) > 0) {
+ $errors['dateFin'] = $errorsDateFin;
+ }
+
+ $errorsMontantPercuUnite = [];
+ if ($info->montantPercuUnite === NULL) {
+ $errorsMontantPercuUnite[] = "Le champ MontantPercuUnite est obligatoire et doit être défini";
+ } else {
+ if ($info->montantPercuUnite > 9999999999.99) {
+ $errorsMontantPercuUnite[] = "Le champ MontantPercuUnite contient une valeur trop grande.";
+ } else if ($info->montantPercuUnite < -9999999999.99) {
+ $errorsMontantPercuUnite[] = "Le champ MontantPercuUnite contient une valeur trop petite.";
+ }
+ }
+ if (count($errorsMontantPercuUnite) > 0) {
+ $errors['montantPercuUnite'] = $errorsMontantPercuUnite;
+ }
+
+ $errorsContributionFinanceur = [];
+ if ($info->contributionFinanceur !== NULL) {
+ if ($info->contributionFinanceur > 9999999999.99) {
+ $errorsContributionFinanceur[] = "Le champ ContributionFinanceur contient une valeur trop grande.";
+ } else if ($info->contributionFinanceur < -9999999999.99) {
+ $errorsContributionFinanceur[] = "Le champ ContributionFinanceur contient une valeur trop petite.";
+ }
+ }
+ if (count($errorsContributionFinanceur) > 0) {
+ $errors['contributionFinanceur'] = $errorsContributionFinanceur;
+ }
+
+ $errorsMontantTotal = [];
+ if ($info->montantTotal !== NULL) {
+ if ($info->montantTotal > 9999999999.99) {
+ $errorsMontantTotal[] = "Le champ MontantTotal contient une valeur trop grande.";
+ } else if ($info->montantTotal < -9999999999.99) {
+ $errorsMontantTotal[] = "Le champ MontantTotal contient une valeur trop petite.";
+ }
+ if ($info->montantTotalDevise != "Euro") {
+ $errorsMontantTotal[] = 'Le champ MontantTotal doit être en euros';
+ }
+ if ($this->aPlusDeDeuxDecimales($info->montantTotal)) {
+ $errorsMontantTotal[] = 'Le champ MontantTotal ne doit pas avoir plus de deux chiffres après la virgule';
+ }
+ }
+ if (count($errorsMontantTotal) > 0) {
+ $errors['montantTotal'] = $errorsMontantTotal;
+ }
+
+ $errorsPoleCompetitivite = [];
+ if ($info->validePoleCompetitivite && mb_strlen(trim($info->poleCompetitivite)) == 0) {
+ $errorsPoleCompetitivite[] = 'Si le contrat est validé par un pôle de compétitivité alors le champ PoleCompetitivite est obligatoire';
+ }
+ if (count($errorsPoleCompetitivite) > 0) {
+ $errors['poleCompetitivite'] = $errorsPoleCompetitivite;
+ }
+
+ $errorsCommentaires = $this->validateField($info->commentaires, 'Commentaire', ActivityPcruInformations::COMMENTAIRES_MAX_LENGTH, true);
+ if (count($errorsCommentaires) > 0) {
+ $errors['commentaires'] = $errorsCommentaires;
+ }
+
+ $errorsReference = $this->validateField($info->reference, 'ReferenceNonGestionnaire', ActivityPcruInformations::REFERENCE_MAX_LENGTH, true);
+ if (count($errorsReference) > 0) {
+ $errors['reference'] = $errorsReference;
+ }
+
+ return $errors;
+ }
+
+ private function aPlusDeDeuxDecimales(float $f): bool {
+ return (abs($f) - floor(abs($f) * 100) / 100) !== 0.0;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Service/PcruInformationsServiceFactory.php b/module/Oscar/src/Oscar/Service/PcruInformationsServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c4b5b85d897fd2e607034d1e31911a992c6db82
--- /dev/null
+++ b/module/Oscar/src/Oscar/Service/PcruInformationsServiceFactory.php
@@ -0,0 +1,18 @@
+setOscarConfigurationService($container->get(OscarConfigurationService::class));
+ $s->setEntityManager($container->get(EntityManager::class));
+ return $s;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Service/ProjectGrantApiService.php b/module/Oscar/src/Oscar/Service/ProjectGrantApiService.php
index e50ae36fe0162cac80adf47b595fc74811bac8e3..bd93203ca4233d7507c5f87e55703240ba05f81f 100644
--- a/module/Oscar/src/Oscar/Service/ProjectGrantApiService.php
+++ b/module/Oscar/src/Oscar/Service/ProjectGrantApiService.php
@@ -14,6 +14,7 @@ use Oscar\Entity\ActivityNote;
use Oscar\Entity\ActivityNoteRepository;
use Oscar\Entity\ActivityOrganization;
use Oscar\Entity\ActivityPayment;
+use Oscar\Entity\ActivityPcruInformations;
use Oscar\Entity\ActivityPerson;
use Oscar\Entity\ActivityRepository;
use Oscar\Entity\ActivityType;
@@ -85,6 +86,7 @@ class ProjectGrantApiService implements UseEntityManager,
const PERIMETER_SPENTS = 'spents';
const PERIMETER_TIMESHEETS = 'timesheets';
const PERIMETER_WORKPACKAGES = 'workpackages';
+ const PERIMETER_PCRU = 'pcru';
/**
* @return string[]
@@ -106,6 +108,7 @@ class ProjectGrantApiService implements UseEntityManager,
self::PERIMETER_SPENTS,
self::PERIMETER_TIMESHEETS,
self::PERIMETER_WORKPACKAGES,
+ self::PERIMETER_PCRU,
];
}
@@ -399,6 +402,12 @@ class ProjectGrantApiService implements UseEntityManager,
)
];
break;
+ case 'pcru':
+ $credentials['pcru'] = [
+ 'read' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PCRU, $activity),
+ 'edit' => $oscarUserContext->hasPrivileges(Privileges::ACTIVITY_PCRU_ACTIVATE, $activity)
+ ];
+ break;
}
}
@@ -483,6 +492,10 @@ class ProjectGrantApiService implements UseEntityManager,
$urlPlugin
);
break;
+
+ case self::PERIMETER_PCRU:
+ $datas[self::PERIMETER_PCRU] = $this->getPcruActivity($activity, $urlPlugin);
+ break;
}
}
@@ -553,7 +566,7 @@ class ProjectGrantApiService implements UseEntityManager,
'edit' => $urlPlugin->fromRoute('contract/edit', ['id' => $activity->getId()]),
'change_project' => $urlPlugin->fromRoute('contract/moveToProject', ['id' => $activity->getId()]),
'new_project' => $urlPlugin->fromRoute('project/new') . '?ids=' . $activity->getId(),
- 'pcru' => $urlPlugin->fromRoute('contract/pcru-infos', ['id' => $activity->getId()])
+ 'pcru' => $urlPlugin->fromRoute('contract/pcru-informations', ['id' => $activity->getId()])
]
];
}
@@ -976,7 +989,9 @@ class ProjectGrantApiService implements UseEntityManager,
'enrolledLabel' => $activityOrganization->getOrganization()->getFullName(),
'past' => !$activityOrganization->isActive(),
'start' => $this->formatDateTime($activityOrganization->getDateStart()),
- 'end' => $this->formatDateTime($activityOrganization->getDateEnd())
+ 'end' => $this->formatDateTime($activityOrganization->getDateEnd()),
+ 'labintel' => $activityOrganization->getOrganization()->getLabintel(),
+ 'shortname' => $activityOrganization->getOrganization()->getShortName()
];
}
return [
@@ -1094,6 +1109,18 @@ class ProjectGrantApiService implements UseEntityManager,
return $out;
}
+ /**
+ * @param Activity $activity
+ * @param Url|null $urlPlugin
+ * @return \Oscar\Service\PcruInformationComplete
+ */
+ public function getPcruActivity(Activity $activity, ?Url $urlPlugin = null): \Oscar\Service\PcruInformationComplete
+ {
+ /** @var PcruInformationsService $pcruInformationsService */
+ $pcruInformationsService = $this->getServiceContainer()->get(PcruInformationsService::class);
+ return $pcruInformationsService->getPcruInformationsForActivity($activity, $urlPlugin);
+ }
+
/**
* @param Activity $activity
* @param Url|null $urlPlugin
diff --git a/module/Oscar/src/Oscar/Service/ProjectGrantService.php b/module/Oscar/src/Oscar/Service/ProjectGrantService.php
index e67ceb508b6ca8b540b522e64aad089730b298dc..57809b612535e476af8864e244acd960663afc43 100644
--- a/module/Oscar/src/Oscar/Service/ProjectGrantService.php
+++ b/module/Oscar/src/Oscar/Service/ProjectGrantService.php
@@ -36,6 +36,8 @@ use Oscar\Entity\PcruSourceFinancement;
use Oscar\Entity\PcruSourceFinancementRepository;
use Oscar\Entity\PcruTypeContract;
use Oscar\Entity\PcruTypeContractRepository;
+use Oscar\Entity\PcruTypeEtablissement;
+use Oscar\Entity\PcruTypeEtablissementRepository;
use Oscar\Entity\Person;
use Oscar\Entity\Project;
use Oscar\Entity\Role;
@@ -3450,12 +3452,16 @@ class ProjectGrantService implements UseGearmanJobLauncherService, UseOscarConfi
/** @var PcruSourceFinancement $poleRepository */
$sourceFinancementRepository = $this->getEntityManager()->getRepository(PcruSourceFinancement::class);
+ $sourcesFinancement = $sourceFinancementRepository->createQueryBuilder('s')
+ ->orderBy('s.label', 'ASC')
+ ->getQuery()->getResult();
+
$out = [
'' => 'Aucune'
];
/** @var PcruSourceFinancement $sourceFinancement */
- foreach ($sourceFinancementRepository->findAll() as $sourceFinancement) {
+ foreach ($sourcesFinancement as $sourceFinancement) {
$out[$sourceFinancement->getLabel()] = $sourceFinancement->getLabel();
}
@@ -3653,6 +3659,23 @@ class ProjectGrantService implements UseGearmanJobLauncherService, UseOscarConfi
}
}
+ /**
+ * @param string $format
+ * @return mixed
+ * @throws OscarException
+ */
+ public function getPcruTypesEtablissement($format = AsArrayFormatter::ARRAY_FLAT)
+ {
+ /** @var PcruTypeEtablissementRepository $repository */
+ $repository = $this->getEntityManager()->getRepository(PcruTypeEtablissement::class);
+ if ($format == AsArrayFormatter::ARRAY_FLAT) {
+ return $repository->getFlatArrayLabel();
+ }
+ else {
+ throw new OscarException("Format pour la liste des types d'établissement PCRU non-disponible");
+ }
+ }
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
/// REPOSITORY ACCESS
diff --git a/module/Oscar/src/Oscar/Traits/UsePcruFtpService.php b/module/Oscar/src/Oscar/Traits/UsePcruFtpService.php
new file mode 100644
index 0000000000000000000000000000000000000000..e72696653be5bf5e9a983865eb376b3ed95110c1
--- /dev/null
+++ b/module/Oscar/src/Oscar/Traits/UsePcruFtpService.php
@@ -0,0 +1,17 @@
+pcruFtpService;
+ }
+
+ /**
+ * @param PcruFtpService $pcruFtpService
+ */
+ public function setPcruFtpService(PcruFtpService $pcruFtpService): void
+ {
+ $this->pcruFtpService = $pcruFtpService;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Traits/UsePcruInformationsService.php b/module/Oscar/src/Oscar/Traits/UsePcruInformationsService.php
new file mode 100644
index 0000000000000000000000000000000000000000..94b9ab0823ba7bdaa87eb0e926254fbf978610a0
--- /dev/null
+++ b/module/Oscar/src/Oscar/Traits/UsePcruInformationsService.php
@@ -0,0 +1,17 @@
+pcruInformationsService;
+ }
+
+ /**
+ * @param PcruInformationsService $pcruInformationsService
+ */
+ public function setPcruInformationsService(PcruInformationsService $pcruInformationsService): void
+ {
+ $this->pcruInformationsService = $pcruInformationsService;
+ }
+}
diff --git a/module/Oscar/src/Oscar/Utils/PCRUCvsFile.php b/module/Oscar/src/Oscar/Utils/PCRUCvsFile.php
deleted file mode 100644
index 2f976a4718bfbe1b6458069ee0f6fc43dfe60642..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Utils/PCRUCvsFile.php
+++ /dev/null
@@ -1,405 +0,0 @@
-pcruService = $pcruService;
- $this->path = $directory == null ? $pcruService->getOscarConfigurationService()->getPcruDirectoryForUpload() : $directory;
- $this->datas = [];
- $this->logs = [];
- $this->headers = $pcruService->getHeaders();
- }
-
- /**
- * Ajoute l'entrée PCRU au cache.
- *
- * @param ActivityPcruInfos $info
- * @return $this
- */
- public function addEntry(ActivityPcruInfos $info): self
- {
- $this->datas[$info->getNumContratTutelleGestionnaire()] = $info;
- return $this;
- }
-
- /**
- * @return ActivityPcruInfos[]
- */
- public function getEntries(): array
- {
- return $this->datas;
- }
-
- /**
- * Retourne TRUE si la données PCRU est déjà référencée.
- *
- * @param ActivityPcruInfos $info
- * @return bool
- */
- public function entryExist(ActivityPcruInfos $info): bool
- {
- return array_key_exists($info->getNumContratTutelleGestionnaire(), $this->datas);
- }
-
- public function read(): self
- {
- return $this->readCSV()->readBDD();
- }
-
- /**
- * Extraction de la base de données des donnèes PCRU à envoyée.
- */
- public function readBDD(): self
- {
- $this->log("Lecture depuis la base de données");
- $infos = $this->pcruService->getActivityPCRUInfoRepository()->getInfosSendable();
- $added = 0;
-
- /** @var ActivityPcruInfos $info */
- foreach ($infos as $info) {
- if ($this->entryExist($info)) {
- $this->log("PASSED $info est déjà prête.");
- } else {
- $this->addEntry($info);
- $added++;
- }
- }
-
- $this->log(sprintf('%s nouvelle(s) entrée(s) ajoutée(s) depuis la BDD.', $added));
-
- return $this;
- }
-
- /**
- * Extraction des données à partir du fichier CSV existant.
- */
- public function readCSV(): self
- {
- $path = $this->pcruService->getOscarConfigurationService()->getPcruContratFile();
-
- $this->log("Lecture à partir du fichier $path");
-
- if (file_exists($path)) {
- if (($handle = fopen($path, "r")) !== FALSE) {
- $row = 0;
- while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
- // On saute le première ligne
- if ($row == 0) {
- $row++;
- continue;
- }
- // Récupération de la donnée côté Oscar à partir du numéro Oscar
- $numOscar = $data[3];
- $info = $this->pcruService->getInfosByNumOscar($numOscar);
-
- if ($info == null) {
- $this->log("WARNING : L'activité $numOscar n'est pas dans les données PCRU");
- } else {
- $this->addEntry($info);
- $row++;
- }
- }
- fclose($handle);
- $this->log(sprintf('%s nouvelle(s) entrée(s) ajoutée(s) depuis le CSV.', ($row - 1)));
- }
- } else {
- $this->log("Le fichier n'existe pas, il sera créé.");
- }
- return $this;
- }
-
- /**
- * @param $numOscar
- * @return $this
- */
- public function remove(ActivityPcruInfos $activityPcruInfo): self
- {
- if( array_key_exists($activityPcruInfo->getNumContratTutelleGestionnaire(), $this->datas) ){
- unset($this->datas[$activityPcruInfo->getNumContratTutelleGestionnaire()]);
- $filedest = $this->path . DIRECTORY_SEPARATOR . $activityPcruInfo->getSignedFileName();
- unlink($filedest);
- }
- return $this;
- }
-
- public function getLogs(): string
- {
- return implode("\n", $this->logs);
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ///
- /// GENERATION des FICHIERS
- ///
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- public function purgeFiles()
- {
- $files = glob($this->pcruService->getOscarConfigurationService()->getPcruDirectoryForUpload() . DIRECTORY_SEPARATOR . '*');
- foreach($files as $file){ // iterate files
- if(is_file($file)) {
- unlink($file); // delete file
- }
- }
- }
-
- public function generateFiles(): self
- {
- $this->readCSV()
- ->readBDD()
- ->writeContratsCsv()
- ->writeContratsPDF();
-
- return $this;
- }
-
- /**
- * écriture des données CSV.
- *
- * @return $this
- * @throws \Oscar\Exception\OscarException
- */
- public function writeContratsCsv($dest = null, EntityManager $em = null)
- {
- $headers = $this->getHeaders();
- if ($dest == null) {
- $dest = $this->pcruService->getOscarConfigurationService()->getPcruContratFile();
- }
- $handler = fopen($dest, 'w');
- fputcsv($handler, array_keys($this->getHeaders()), ';');
- foreach ($this->getData($em) as $data) {
- fputcsv($handler, $data, ';');
- }
- return $this;
- }
-
- /**
- * Retourne le contenu du document (Contrat Signé) référencé dans les informations PCRU.
- *
- * @param ActivityPcruInfos $pcruInfos
- * @return string
- * @throws OscarException
- */
- public function getDocumentSignedFromPcruInfo(ActivityPcruInfos $pcruInfos): string
- {
- /** @var ContractDocument $document */
- $document = $this->pcruService->getEntityManager()
- ->getRepository(ContractDocument::class)
- ->find($pcruInfos->getDocumentId());
-
- $docpath = $this->pcruService->getOscarConfigurationService()->getDocumentDropLocation()
- . DIRECTORY_SEPARATOR
- . $document->getPath();
-
- return file_get_contents($docpath);
- }
-
- /**
- * @return $this
- */
- public function writeContratsPDF()
- {
- $this->log("# Copie des contrats PDF dans " . $this->path);
- $returnedInfos = [];
-
- /** @var ActivityPcruInfos $info */
- foreach ($this->getEntries() as $info) {
-
- // traitement du document
- $filedest = $this->path . DIRECTORY_SEPARATOR . $info->getSignedFileName();
-
- $doccontent = $this->getDocumentSignedFromPcruInfo($info);
-
- $this->log("Ajout du document");
- file_put_contents($filedest, $doccontent);
-
- $returnedInfos[] = $info;
- }
-
- return $this;
- }
-
- /**
- * écriture du fichier des partenaires.
- *
- * @param null $dest
- * @return $this
- * @throws OscarException
- */
- public function writePartenairesCSV($dest = null)
- {
- if ($dest == null) {
- $dest = $this->pcruService->getOscarConfigurationService()->getPcruPartenaireFile();
- }
- $this->log("# Création du fichier partenaires " . $dest);
- $handler = fopen($dest, 'w');
-
- $partenairesCodes = [];
- /** @var ActivityPcruInfos $pcruInfo */
- foreach ($this->getEntries() as $pcruInfo) {
- $codes = explode('|', $pcruInfo->getPartenaires());
-
- foreach ($codes as $code) {
- // TODO code PCRU
- if ($code != '') {
- if (!array_key_exists($code, $partenairesCodes)) {
- try {
- $partenairesCodes[$code] = $this->pcruService->getOrganizationByCodePCRU($code);
- } catch (NoResultException $e) {
- throw new OscarException("Impossible de trouver les données pour le partenaire $code");
- } catch (NonUniqueResultException $e) {
- throw new OscarException("Plusieurs organisations partagent un même code: $code");
- } catch (\Exception $e) {
- throw new OscarException("Un erreur est survenue la du chargement de l'organisations $code : " . $e->getMessage());
- }
- }
- }
- }
- }
-
- if (count($partenairesCodes) > 0) {
- fputcsv($handler, $this->pcruService->getParenairesHeaders(), ';');
- foreach ($partenairesCodes as $organization) {
- fputcsv($handler, $this->pcruService->getPartenaireData($organization), ';');
- }
- }
-
- return $this;
- }
-
-
- public function makeZip(): ?string
- {
- $this->log("# Création d'un ZIP");
- $filename = "oscar-pcru-" . date('Ymd_His') . '.zip';
- $tmpfile = '/tmp/' . uniqid() . $filename;
-
- $this->log(" - Fichier temporaire : $tmpfile");
-
- $zip = new \ZipArchive();
- if ($zip->open($tmpfile, \ZipArchive::CREATE) !== TRUE) {
- throw new OscarException("Impossible de créer l'archive");
- }
-
- foreach ($this->pcruService->getUploadableFiles($this->path) as $info) {
- $this->log(" - Ajout de : " . $info['name']);
- $zip->addFile($info['path'], $info['name']);
- }
-
- $zip->close();
-
- echo file_get_contents($tmpfile);
-
- unlink($tmpfile);
-
- return null;
- }
-
- public function downloadZip(): void
- {
- $filename = "oscar-pcru-" . date('Ymd_His') . '.zip';
- header('Content-Description: File Transfer');
- header('Content-Type: application/octet-stream');
- header('Content-Disposition: attachment; filename="' . $filename . '"');
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- $this->makeZip();
- exit;
- }
-
- /**
- * Retourne les données sous le forme d'un tableau associatif.
- *
- * @return array
- */
- public function getData(EntityManager $em = null): array
- {
- $datas = [];
-
- // Ajout des donnèes
- /** @var ActivityPcruInfos $info */
- foreach ($this->datas as $info) {
- $datas[] = $info->toArray($em);
- }
-
- return $datas;
- }
-
-
- /**
- * Retourne les en-têtes
- * @return array
- */
- public function getHeaders(): array
- {
- return $this->headers;
- }
-
- public function printInSymfonyConsole(SymfonyStyle $symfonyStyle): void
- {
- $symfonyStyle->table($this->getHeaders(), $this->getData());
- }
-
- public function debug(string $str): void
- {
- echo $str;
- }
-
- /**
- * Ajoute en entrée aux logs
- * @param string $str
- */
- public function log(string $str): void
- {
- $this->pcruService->logPool($str);
- }
-
-
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /**
- * Création et initalisation depuis un fichier CSV.
- *
- * @param string $path
- * @return self
- */
- public static function createFromPath(string $path, PCRUService $pcruService): PCRUCvsFile
- {
- throw new \Exception("DEPRECATED");
- }
-
- /**
- * @param PCRUService $PCRUService
- * @return static
- */
- public static function create(PCRUService $PCRUService): PCRUCvsFile
- {
- return new self($PCRUService);
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/src/Oscar/Validator/PCRUValidator.php b/module/Oscar/src/Oscar/Validator/PCRUValidator.php
deleted file mode 100644
index a7335c20e9d48da6b8331c87561b2936b1503a42..0000000000000000000000000000000000000000
--- a/module/Oscar/src/Oscar/Validator/PCRUValidator.php
+++ /dev/null
@@ -1,231 +0,0 @@
-oscarConfigurationService = $oscarConfigurationService;
- $this->entityManager = $entityManager;
- $this->errors = [];
- $this->warnings = [];
- $this->status = ActivityPcruInfos::STATUS_DRAFT;
- }
-
- protected function addError( $message ) :self
- {
- $this->errors[] = $message;
- $this->status = self::VALIDATION_ERROR;
- return $this;
- }
-
- protected function addWarning( $message ) :self
- {
- $this->errors[] = $message;
- return $this;
- }
-
- public function getErrors() :array
- {
- return $this->errors;
- }
-
- public function getWarnings() :array
- {
- return $this->warnings;
- }
-
- public function hasErrors() :bool
- {
- return count($this->errors) > 0;
- }
-
- public function hasWarnings() :bool
- {
- return count($this->warnings) > 0;
- }
-
- public function validate( ActivityPcruInfos $activityPcruInfos ) :array
- {
- $this->error = [];
- $datas = $activityPcruInfos->toArray();
-
- $out = [];
- $out['Objet'] = self::VALIDATION_ERROR; // Requis
- $out['CodeUniteLabintel'] = self::VALIDATION_ERROR; // Requis
- $out['SigleUnite'] = self::VALIDATION_EMPTY;
- $out['NumContratTutelleGestionnaire'] = self::VALIDATION_ERROR; // Requis
- $out['Equipe'] = self::VALIDATION_EMPTY;
- $out['TypeContrat'] = self::VALIDATION_ERROR;
- $out['Acronyme'] = self::VALIDATION_EMPTY;
- $out['ContratsAssocies'] = self::VALIDATION_EMPTY;
- $out['ResponsableScientifique'] = self::VALIDATION_ERROR; // Requis
- $out['EmployeurResponsableScientifique'] = self::VALIDATION_EMPTY;
- $out['CoordinateurConsortium'] = self::VALIDATION_EMPTY;
- $out['Partenaires'] = self::VALIDATION_EMPTY;
- $out['PartenairePrincipal'] = self::VALIDATION_ERROR; // Requis
- $out['IdPartenairePrincipal'] = self::VALIDATION_EMPTY;
- $out['SourceFinancement'] = self::VALIDATION_ERROR; // Requis
- $out['LieuExecution'] = self::VALIDATION_ERROR; // Requis
- $out['DateDerniereSignature'] = self::VALIDATION_ERROR; // Requis
- $out['Duree'] = self::VALIDATION_EMPTY;
- $out['DateDebut'] = self::VALIDATION_ERROR; // Requis
- $out['DateFin'] = self::VALIDATION_ERROR; // Requis
- $out['MontantPercuUnite'] = self::VALIDATION_ERROR; // Requis
- $out['CoutTotalEtude'] = self::VALIDATION_EMPTY;
- $out['MontantTotal'] = self::VALIDATION_EMPTY;
- $out['ValidePoleCompetivite'] = self::VALIDATION_EMPTY;
- $out['PoleCompetivite'] = self::VALIDATION_EMPTY;
- $out['Commentaires'] = self::VALIDATION_EMPTY;
- $out['Pia'] = self::VALIDATION_EMPTY;
- $out['Reference'] = self::VALIDATION_EMPTY;
- $out['AccordCadre'] = self::VALIDATION_EMPTY;
- $out['Cifre'] = self::VALIDATION_EMPTY;
- $out['ChaireIndustrielle'] = self::VALIDATION_EMPTY;
- $out['PresencePartenaireIndustriel'] = self::VALIDATION_EMPTY;
- $out['contract_signed'] = self::VALIDATION_ERROR;
-
-
- $disabledFields = [
- 'Equipe','ContratsAssocies', 'EmployeurResponsableScientifique',
- 'CoordinateurConsortium','Partenaires', 'PartenairePrincipal',
- 'IdPartenairePrincipal','LieuExecution', 'Duree',
- 'MontantPercuUnite','CoutTotalEtude', 'Commentaires',
- 'Pia','AccordCadre', 'Cifre',
- 'ChaireIndustrielle','PresencePartenaireIndustriel'
- ];
-
- foreach ($disabledFields as $unusedField) {
- $out[$unusedField] = self::VALIDATION_DISABLED;
- }
-
- if( $datas['Objet'] )
- $out['Objet'] = self::VALIDATION_VALID;
-
- if( $datas['CodeUniteLabintel'] )
- $out['CodeUniteLabintel'] = self::VALIDATION_VALID;
-
- if( $datas['SigleUnite'] )
- $out['SigleUnite'] = self::VALIDATION_VALID;
-
- if( $datas['NumContratTutelleGestionnaire'] )
- $out['NumContratTutelleGestionnaire'] = self::VALIDATION_VALID;
-
- if( $datas['NumContratTutelleGestionnaire'] )
- $out['NumContratTutelleGestionnaire'] = self::VALIDATION_VALID;
-
- if( $datas['TypeContrat'] != 'Aucun' )
- $out['TypeContrat'] = self::VALIDATION_VALID;
-
- if( $datas['Acronyme'] )
- $out['Acronyme'] = self::VALIDATION_VALID;
-
- if( $datas['ResponsableScientifique'] )
- $out['ResponsableScientifique'] = self::VALIDATION_VALID;
-
- if( $datas['EmployeurResponsableScientifique'] )
- $out['EmployeurResponsableScientifique'] = self::VALIDATION_VALID;
-
- if( $datas['PartenairePrincipal'] )
- $out['PartenairePrincipal'] = self::VALIDATION_VALID;
-
- if( $datas['SourceFinancement'] )
- $out['SourceFinancement'] = self::VALIDATION_VALID;
-
- if( $datas['LieuExecution'] )
- $out['LieuExecution'] = self::VALIDATION_VALID;
-
- if( $datas['DateDerniereSignature'] )
- $out['DateDerniereSignature'] = self::VALIDATION_VALID;
-
- if( $datas['DateDebut'] )
- $out['DateDebut'] = self::VALIDATION_VALID;
-
- if( $datas['DateFin'] )
- $out['DateFin'] = self::VALIDATION_VALID;
-
- if( $datas['MontantTotal'] )
- $out['MontantTotal'] = self::VALIDATION_VALID;
-
-
- if( $datas['ValidePoleCompetivite'] == true ){
- $out['ValidePoleCompetivite'] = self::VALIDATION_VALID;
- $out['PoleCompetivite'] = self::VALIDATION_ERROR;
- if( $out['PoleCompetivite'] ){
- $out['PoleCompetivite'] = self::VALIDATION_VALID;
- }
- }
-
- if( $datas['Reference'] )
- $out['Reference'] = self::VALIDATION_VALID;
-
-
- if( $activityPcruInfos->getDocumentId() ){
- $out['document_signed'] = self::VALIDATION_VALID;
- $out['contrat_signed'] = self::VALIDATION_VALID;
- } else {
- $this->addError("Le document du contrat est indisponible");
- }
-
- foreach ($out as $champ=>$state) {
- if( $champ == 'contract_signed') continue;
- if( $state == self::VALIDATION_ERROR ){
- $this->status = self::VALIDATION_ERROR;
- $this->addError($this->getMessage($champ));
- }
- }
-
- return $out;
- }
-
-
- protected function getMessage( $champ ) :string
- {
- static $messages;
- if( $messages === null ) {
- $messages = [];
- $messages['SourceFinancement'] = "La source de financement est manquante, vous pouvez la renseigner depuis la fiche activité";
- $messages['TypeContrat'] = "Le type de contrat est manquant. Vous pouvez automatiser la correspondance Oscar/PCRU depuis l'interface d'administration et éditer le type manuellement";
- $messages['DateDerniereSignature'] = "La date de signature est manquante, vous pouvez la renseigner depuis la fiche activité";
- $messages['CodeUniteLabintel'] = "Le code de l'unité de recherche (Labintel) est manquant, il peut être complété depuis la fiche organisation (type UMR XXXX)";
- }
-
- if( array_key_exists($champ, $messages) ){
- return $messages[$champ];
- } else {
- return sprintf("Le champ %s n'est pas renseigné.", $champ);
- }
- }
-}
\ No newline at end of file
diff --git a/module/Oscar/view/oscar/activity/pcruinfos-form.phtml b/module/Oscar/view/oscar/activity/pcruinfos-form.phtml
deleted file mode 100644
index c001bc7b1161747faf86ec26281e4d435e4fef41..0000000000000000000000000000000000000000
--- a/module/Oscar/view/oscar/activity/pcruinfos-form.phtml
+++ /dev/null
@@ -1,366 +0,0 @@
-
- * @date: 16/10/15 13:41
- * @copyright Certic (c) 2015
- */
-?>
-
-
- = $headers['CoordinateurConsortium'] == 'off' ? 'Saisie manuelle' : $headers['CoordinateurConsortium'] ?>
- Le Responsable scientifique est également le coordinateur du consortium
-
Le modules PCRU permet de configurer l'envois automatique des contrats signés au système PCRU du
+
Le module PCRU permet de configurer l'envoi automatique des contrats signés au système PCRU du
CNRS
Référentiels PCRU
@@ -635,7 +635,7 @@
- Référenciel des pôles de compétitivité :
+ Référentiel des pôles de compétitivité :
grant()->privilege(\Oscar\Provider\Privileges::MAINTENANCE_SPENDTYPEGROUP_MANAGE)): ?>
@@ -647,14 +647,14 @@
- La liste des pôles de compétitivité est utilisée dans la fiche activité, elle est fournit par
+ La liste des pôles de compétitivité est utilisée dans la fiche activité, elle est fournie par
le CNRS.
- Référenciel des sources de financement
+ Référentiel des sources de financement
grant()->privilege(\Oscar\Provider\Privileges::MAINTENANCE_SPENDTYPEGROUP_MANAGE)): ?>
@@ -666,7 +666,26 @@
- La liste des sources de financement est utilisée dans la fiche activité, elle est fournit par
+ La liste des sources de financement est utilisée dans la fiche activité, elle est fournie par
+ le CNRS.
+
+
+
+
+
+ Référentiel des types d'établissement
+
+ grant()->privilege(\Oscar\Provider\Privileges::MAINTENANCE_SPENDTYPEGROUP_MANAGE)): ?>
+ = _("Voir") ?>
+
+ Privilège insuffisant
+
+
+ La liste des types d'établissement est utilisée dans la fiche organisation, elle est fournie par
le CNRS.
diff --git a/module/Oscar/view/oscar/administration/contrat-type-pcru.phtml b/module/Oscar/view/oscar/administration/contrat-type-pcru.phtml
index 07bfdfb9ee26c47113df7b0368040fb022e95084..bbf6d785da4866b33e5ec7ffe170b7fb010f6b4c 100644
--- a/module/Oscar/view/oscar/administration/contrat-type-pcru.phtml
+++ b/module/Oscar/view/oscar/administration/contrat-type-pcru.phtml
@@ -3,7 +3,7 @@
- *
- *
- *
- *
- ***/ ?>
\ No newline at end of file
diff --git a/module/Oscar/view/oscar/project-grant/pcru-list.phtml b/module/Oscar/view/oscar/project-grant/pcru-list.phtml
deleted file mode 100644
index 781a6090e8ce9af86987c429cd9c7c3b19e572da..0000000000000000000000000000000000000000
--- a/module/Oscar/view/oscar/project-grant/pcru-list.phtml
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
- Activités PCRU
-
-
-
- Les activités présentes dans cet écran sont soumises à un processus PCRU.
- Pour activer le processus PCRU d'une activité, rendez-vous sur la fiche activité, puis dans l'encart PCRU, cliquez sur informations PCRU, une fois dans le récapitulatif des informations, cliquez sur Activer PCRU
-
-
-
- Aucun processus PCRU en cours
-
-
-
-
-
-
- = $pcruInfo->getAcronyme() ?>
- = $pcruInfo->getObjet() ?>
- getStatus()):
- case 'file_wait': ?>
-
-
- En attente de transfert
-
-
-
-
-
- Transférée (en attente d'un retour)
-
-
-
-
-
- Brouillon
-
-
-
-
-
- Erreur
-
-
-
-
-
-
-
-
- Voir la fiche activité
-
\ No newline at end of file
diff --git a/module/Oscar/view/partials/menu-administration.phtml b/module/Oscar/view/partials/menu-administration.phtml
index 4331591c29051e7c49a63d9c391cb0608711b844..2f3ccf437ee7d43d4510dce1e39a74a8973c1ca6 100644
--- a/module/Oscar/view/partials/menu-administration.phtml
+++ b/module/Oscar/view/partials/menu-administration.phtml
@@ -44,7 +44,7 @@ if(
grant()->privilege(\Oscar\Provider\Privileges::MAINTENANCE_PCRU_LIST) ):?>
diff --git a/public/js/oscar/dist/AdministrationPcru.umd.js b/public/js/oscar/dist/AdministrationPcru.umd.js
index 643ee8b0f7eb33596cfd5af3d9f8496ed79ba783..fcd70e90594f2c0ed66fdbc36073cc0ec237700d 100644
--- a/public/js/oscar/dist/AdministrationPcru.umd.js
+++ b/public/js/oscar/dist/AdministrationPcru.umd.js
@@ -96,91 +96,6 @@ return /******/ (function(modules) { // webpackBootstrap
/************************************************************************/
/******/ ({
-/***/ "8875":
-/***/ (function(module, exports, __webpack_require__) {
-
-var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// addapted from the document.currentScript polyfill by Adam Miller
-// MIT license
-// source: https://github.com/amiller-gh/currentScript-polyfill
-
-// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505
-
-(function (root, factory) {
- if (true) {
- !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
- __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
- (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
- } else {}
-}(typeof self !== 'undefined' ? self : this, function () {
- function getCurrentScript () {
- var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')
- // for chrome
- if (!descriptor && 'currentScript' in document && document.currentScript) {
- return document.currentScript
- }
-
- // for other browsers with native support for currentScript
- if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {
- return document.currentScript
- }
-
- // IE 8-10 support script readyState
- // IE 11+ & Firefox support stack trace
- try {
- throw new Error();
- }
- catch (err) {
- // Find the second match for the "at" string to get file src url from stack.
- var ieStackRegExp = /.*at [^(]*\((.*):(.+):(.+)\)$/ig,
- ffStackRegExp = /@([^@]*):(\d+):(\d+)\s*$/ig,
- stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),
- scriptLocation = (stackDetails && stackDetails[1]) || false,
- line = (stackDetails && stackDetails[2]) || false,
- currentLocation = document.location.href.replace(document.location.hash, ''),
- pageSource,
- inlineScriptSourceRegExp,
- inlineScriptSource,
- scripts = document.getElementsByTagName('script'); // Live NodeList collection
-
- if (scriptLocation === currentLocation) {
- pageSource = document.documentElement.outerHTML;
- inlineScriptSourceRegExp = new RegExp('(?:[^\\n]+?\\n){0,' + (line - 2) + '}[^<]*","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js&\"","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./PasswordField.vue?vue&type=template&id=2be9a996&\"\nimport script from \"./PasswordField.vue?vue&type=script&lang=js&\"\nexport * from \"./PasswordField.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n
\n\n
\n
\n \n {{ loading }}\n
\n
\n\n\n \n
\n \n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AdministrationPcru.vue?vue&type=template&id=417a28ea&\"\nimport script from \"./AdministrationPcru.vue?vue&type=script&lang=js&\"\nexport * from \"./AdministrationPcru.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack://AdministrationPcru/webpack/universalModuleDefinition","webpack://AdministrationPcru/webpack/bootstrap","webpack://AdministrationPcru/./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js","webpack://AdministrationPcru/./src/AdministrationPcru.vue?4780","webpack://AdministrationPcru/./src/components/PasswordField.vue?8819","webpack://AdministrationPcru/src/components/PasswordField.vue","webpack://AdministrationPcru/./src/components/PasswordField.vue?c578","webpack://AdministrationPcru/./node_modules/vue-loader/lib/runtime/componentNormalizer.js","webpack://AdministrationPcru/./src/components/PasswordField.vue","webpack://AdministrationPcru/src/AdministrationPcru.vue","webpack://AdministrationPcru/./src/AdministrationPcru.vue?55fb","webpack://AdministrationPcru/./src/AdministrationPcru.vue","webpack://AdministrationPcru/./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;QCVA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFA;;AAEA;AACA;AACA,MAAM,KAAuC,EAAE,yBAQ5C;;AAEH;AACA;AACA,IAAI,qBAAuB;AAC3B;AACA;;AAEA;AACe,sDAAI;;;ACrBnB,+BAA+B,6BAA6B,qBAAqB,aAAa,4CAA4C,gCAAgC,wBAAwB,0BAA0B,sBAAsB,YAAY,qCAAqC,mCAAmC,UAAU,wCAAwC,8DAA8D,OAAO,6BAA6B,YAAY,kBAAkB,YAAY,uBAAuB,qHAAqH,uBAAuB,YAAY,8BAA8B,cAAc,aAAa,8GAA8G,SAAS,4DAA4D,WAAW,wIAAwI,KAAK,0BAA0B,0FAA0F,uBAAuB,iCAAiC,iBAAiB,wEAAwE,KAAK,kGAAkG,KAAK,oDAAoD,cAAc,mCAAmC,sBAAsB,sBAAsB,8DAA8D,YAAY,kBAAkB,YAAY,uBAAuB,sBAAsB,kBAAkB,YAAY,qCAAqC,YAAY,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,wBAAwB,aAAa,wGAAwG,oCAAoC,wCAAwC,WAAW,sCAAsC,KAAK,yBAAyB,kCAAkC,gEAAgE,oBAAoB,kBAAkB,YAAY,qCAAqC,YAAY,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,wBAAwB,aAAa,wGAAwG,oCAAoC,wCAAwC,WAAW,sCAAsC,KAAK,yBAAyB,kCAAkC,gEAAgE,oBAAoB,kBAAkB,YAAY,qCAAqC,YAAY,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,wBAAwB,aAAa,wGAAwG,oCAAoC,wCAAwC,WAAW,sCAAsC,KAAK,yBAAyB,kCAAkC,gEAAgE,oBAAoB,kBAAkB,YAAY,qCAAqC,uBAAuB,OAAO,wEAAwE,KAAK,0BAA0B,uCAAuC,4BAA4B,kBAAkB,sBAAsB,yBAAyB,cAAc,6BAA6B,qBAAqB,YAAY,mCAAmC,wBAAwB,aAAa,sHAAsH,oCAAoC,sDAAsD,WAAW,6CAA6C,KAAK,yBAAyB,kCAAkC,uEAAuE,oBAAoB,kBAAkB,sBAAsB,yBAAyB,cAAc,6BAA6B,oBAAoB,YAAY,mCAAmC,wBAAwB,aAAa,oHAAoH,oCAAoC,oDAAoD,WAAW,4CAA4C,KAAK,yBAAyB,kCAAkC,sEAAsE,oBAAoB,kBAAkB,sBAAsB,yBAAyB,cAAc,6BAA6B,0BAA0B,YAAY,mCAAmC,iCAAiC,OAAO,qHAAqH,KAAK,0BAA0B,mDAAmD,wBAAwB,uBAAuB,sBAAsB,kBAAkB,YAAY,sCAAsC,YAAY,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,yBAAyB,aAAa,0HAA0H,oCAAoC,kBAAkB,KAAK,0BAA0B,kFAAkF,kBAAkB,kBAAkB,6CAA6C,WAAW,EAAE,gHAAgH,0DAA0D,oBAAoB,mBAAmB,cAAc,6BAA6B,eAAe,+BAA+B,UAAU,gCAAgC,6NAA6N,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,0BAA0B,aAAa,0HAA0H,oCAAoC,kBAAkB,KAAK,0BAA0B,kFAAkF,kBAAkB,kBAAkB,6CAA6C,WAAW,EAAE,gHAAgH,0DAA0D,oBAAoB,mBAAmB,cAAc,6BAA6B,eAAe,+BAA+B,UAAU,gCAAgC,8QAA8Q,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,2EAA2E,iBAAiB,yBAAyB,cAAc,aAAa,0HAA0H,SAAS,sDAAsD,WAAW,uKAAuK,KAAK,0BAA0B,gGAAgG,uBAAuB,iCAAiC,iBAAiB,8EAA8E,KAAK,wGAAwG,KAAK,0DAA0D,cAAc,sCAAsC,sCAAsC,2BAA2B,cAAc,+BAA+B,UAAU,gCAAgC,oRAAoR,yBAAyB,YAAY,mCAAmC,2EAA2E,iBAAiB,yBAAyB,cAAc,aAAa,oJAAoJ,SAAS,mEAAmE,WAAW,8MAA8M,KAAK,0BAA0B,6GAA6G,uBAAuB,iCAAiC,iBAAiB,2FAA2F,KAAK,qHAAqH,KAAK,uEAAuE,cAAc,sCAAsC,mDAAmD,2BAA2B,cAAc,+BAA+B,UAAU,gCAAgC,wPAAwP,yBAAyB,cAAc,6BAA6B,cAAc,YAAY,mCAAmC,wEAAwE,iBAAiB,yBAAyB,cAAc,aAAa,oHAAoH,SAAS,mDAAmD,WAAW,8JAA8J,KAAK,0BAA0B,6FAA6F,uBAAuB,iCAAiC,iBAAiB,2EAA2E,KAAK,qGAAqG,KAAK,uDAAuD,cAAc,sCAAsC,mCAAmC,2BAA2B,gBAAgB,+BAA+B,UAAU,gCAAgC,gPAAgP,kCAAkC,eAAe,qCAAqC,gBAAgB,KAAK,yBAAyB,UAAU,0BAA0B;AAC3hZ;AACA,mCAAmC,6BAA6B,wBAAwB,0BAA0B;AAClH,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,sCAAsC;AAC5I,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,oCAAoC;AAC1I,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,+BAA+B,UAAU,gCAAgC;AACrI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,wBAAwB,uBAAuB;AAC1F,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC,aAAa,6BAA6B,iBAAiB,gCAAgC,UAAU,kCAAkC;AACxI,CAAC;;;;;;AChBD,IAAI,iDAAM,qBAAqB,6BAA6B,iBAAiB,yBAAyB,cAAc,6BAA6B,gBAAgB,+EAA+E,kDAAkD,YAAY,gCAAgC,UAAU,kCAAkC,0FAA0F,aAAa,oEAAoE,0CAA0C,0BAA0B,QAAQ,yEAAyE,WAAW,oBAAoB,KAAK,yBAAyB,kCAAkC,gCAAgC,cAAc,aAAa,oEAAoE,0CAA0C,0BAA0B,QAAQ,6EAA6E,WAAW,oBAAoB,KAAK,yBAAyB,kCAAkC,gCAAgC,YAAY,uCAAuC,yCAAyC,cAAc,wCAAwC,QAAQ,sDAAsD,KAAK,iCAAiC,+BAA+B,iCAAiC,UAAU,qCAAqC;AACrhD;AACA,IAAI,0DAAe;;;;;;;ACgBnB;AACA;AACA;;AAEA,IAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA,KAAK;;;AC5DgL,CAAgB,wHAAG,EAAC,C;;ACAzM;;AAEA;AACA;AACA;;AAEe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AC/F2F;AAC3B;AACL;;;AAG3D;AAC0F;AAC1F,gBAAgB,kBAAU;AAC1B,EAAE,+CAAM;AACR,EAAE,iDAAM;AACR,EAAE,0DAAe;AACjB;AACA;AACA;AACA;;AAEA;;AAEe,mE;;;AC4Pf;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEuD;;AAEvD;AACA;;AAEe;;AAEf;AACA,sBAAsB,aAAa;AACnC;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,CAAC;;;ACzWmL,CAAgB,2HAAG,EAAC,C;;ACAxG;AAC3B;AACL;;;AAGhE;AACuF;AACvF,IAAI,4BAAS,GAAG,kBAAU;AAC1B,EAAE,6CAAM;AACR,EAAE,MAAM;AACR,EAAE,eAAe;AACjB;AACA;AACA;AACA;;AAEA;;AAEe,mFAAS,Q;;AClBA;AACA;AACT,iGAAG;AACI","file":"AdministrationPcru.umd.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AdministrationPcru\"] = factory();\n\telse\n\t\troot[\"AdministrationPcru\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n","// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var currentScript = window.document.currentScript\n if (process.env.NEED_CURRENTSCRIPT_POLYFILL) {\n var getCurrentScript = require('@soda/get-current-script')\n currentScript = getCurrentScript()\n\n // for backward compatibility, because previously we directly included the polyfill\n if (!('currentScript' in document)) {\n Object.defineProperty(document, 'currentScript', { get: getCurrentScript })\n }\n }\n\n var src = currentScript && currentScript.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/)\n if (src) {\n __webpack_public_path__ = src[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\nexport default null\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticStyle:{\"position\":\"relative\",\"min-height\":\"100px\"}},[(_vm.configuration)?_c('div',{staticClass:\"container\"},[(_vm.loading)?_c('div',{staticClass:\"overlay\"},[_c('div',{staticClass:\"overlay-content\",class:{ 'text-success bold': _vm.success}},[_c('i',{staticClass:\"animate-spin icon-spinner\"}),_vm._v(\" \"+_vm._s(_vm.loading)+\" \")])]):_vm._e(),_c('form',{attrs:{\"action\":\"\",\"method\":\"post\"}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-3\"},[_vm._v(\" Module \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_enabled ? 'Actif' : 'Inactif'))])]),_c('div',{staticClass:\"col-md-9\"},[_c('div',{staticClass:\"material-switch\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_enabled),expression:\"configuration.pcru_enabled\"}],attrs:{\"id\":\"pcru_enabled\",\"name\":\"pcru_enabled\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.configuration.pcru_enabled)?_vm._i(_vm.configuration.pcru_enabled,null)>-1:(_vm.configuration.pcru_enabled)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_enabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_enabled\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_enabled\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_enabled\", $$c)}}}}),_c('label',{staticClass:\"label-primary\",attrs:{\"for\":\"pcru_enabled\"}})])])]),_c('section',{class:_vm.configuration.pcru_enabled ? 'enabled' : 'disabled'},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-6\"},[_vm._m(0),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"host\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(1),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_host),expression:\"configuration.pcru_host\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"host\",\"name\":\"host\"},domProps:{\"value\":(_vm.configuration.pcru_host)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_host\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"port\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(2),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_port),expression:\"configuration.pcru_port\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"port\",\"name\":\"port\"},domProps:{\"value\":(_vm.configuration.pcru_port)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_port\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(3),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_user),expression:\"configuration.pcru_user\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"user\",\"name\":\"user\"},domProps:{\"value\":(_vm.configuration.pcru_user)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_user\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('password-field',{attrs:{\"value\":_vm.configuration.pcru_pass,\"name\":'pass',\"text\":'Mot de passe'},on:{\"change\":function($event){_vm.configuration.pcru_pass = $event}}})],1)]),_vm._m(4),_c('div',{staticClass:\"row\"},[_c('div',[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"ssh_private\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(5),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_ssh_private),expression:\"configuration.pcru_ssh_private\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"ssh_private\",\"name\":\"ssh_private\"},domProps:{\"value\":(_vm.configuration.pcru_ssh_private)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_ssh_private\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"ssh_public\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(6),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_ssh_public),expression:\"configuration.pcru_ssh_public\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"ssh_public\",\"name\":\"ssh_public\"},domProps:{\"value\":(_vm.configuration.pcru_ssh_public)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_ssh_public\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"ssh_private_pass\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(7),_c('password-field',{attrs:{\"value\":_vm.configuration.pcru_ssh_private_pass,\"name\":'ssh_private_pass',\"text\":'Mot de passe de la clé privée SSH'},on:{\"change\":function($event){_vm.configuration.pcru_ssh_private_pass = $event}}})],1)])])])]),_c('div',{staticClass:\"col-md-6\"},[_vm._m(8),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-10 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(9),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_contract_type),expression:\"configuration.pcru_contract_type\"}],staticClass:\"form-control\",attrs:{\"name\":\"\",\"id\":\"\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.configuration, \"pcru_contract_type\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.configuration.contract_types),function(type){return _c('option',{key:type,domProps:{\"value\":type}},[_vm._v(_vm._s(type)+\" \")])}),0)]),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Le type de contrat \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_contract_type))]),_vm._v(\" sera utilisé par oscar pour selectionner le document à utiliser pour les données PCRU\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(10),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_incharge_role),expression:\"configuration.pcru_incharge_role\"}],staticClass:\"form-control\",attrs:{\"name\":\"\",\"id\":\"\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.configuration, \"pcru_incharge_role\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.configuration.incharge_roles),function(role){return _c('option',{key:role,domProps:{\"value\":role}},[_vm._v(_vm._s(role)+\" \")])}),0)]),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar selectionnera les personnes avec le rôle \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_incharge_role))]),_vm._v(\" de la fiche activité pour extraire le \"),_c('em',[_vm._v(\"Responsable scientifique côté PCRU\")]),_vm._v(\".\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(11),_vm._l((_vm.configuration.partner_roles),function(role,index){return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_partner_roles),expression:\"configuration.pcru_partner_roles\"}],attrs:{\"type\":\"checkbox\",\"id\":'partner_role_option_' + index},domProps:{\"value\":role,\"checked\":Array.isArray(_vm.configuration.pcru_partner_roles)?_vm._i(_vm.configuration.pcru_partner_roles,role)>-1:(_vm.configuration.pcru_partner_roles)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_partner_roles,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=role,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_partner_roles\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_partner_roles\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_partner_roles\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":'partner_role_option_' + index}},[_vm._v(_vm._s(role))])])})],2),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar utilisera le(s) rôle(s) \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_partner_roles.join(\", \")))]),_vm._v(\" des organisations de la fiche activité pour extraire le(s) partenaire(s) (les codes SIRET/EN doivent être renseignés).\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(12),_vm._l((_vm.configuration.partner_roles),function(role,index){return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_partenaire_principal_roles),expression:\"configuration.pcru_partenaire_principal_roles\"}],attrs:{\"type\":\"checkbox\",\"id\":'partenaire_principal_role_option_' + index},domProps:{\"value\":role,\"checked\":Array.isArray(_vm.configuration.pcru_partenaire_principal_roles)?_vm._i(_vm.configuration.pcru_partenaire_principal_roles,role)>-1:(_vm.configuration.pcru_partenaire_principal_roles)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_partenaire_principal_roles,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=role,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_partenaire_principal_roles\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_partenaire_principal_roles\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_partenaire_principal_roles\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":'partenaire_principal_role_option_' + index}},[_vm._v(_vm._s(role))])])})],2),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar utilisera le(s) rôle(s) \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_partenaire_principal_roles.join(\", \")))]),_vm._v(\" des organisations de la fiche activité pour extraire le partenaire principal.\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(13),_vm._l((_vm.configuration.unit_roles),function(role,index){return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_unit_roles),expression:\"configuration.pcru_unit_roles\"}],attrs:{\"type\":\"checkbox\",\"id\":'unit_role_option_' + index},domProps:{\"value\":role,\"checked\":Array.isArray(_vm.configuration.pcru_unit_roles)?_vm._i(_vm.configuration.pcru_unit_roles,role)>-1:(_vm.configuration.pcru_unit_roles)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_unit_roles,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=role,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_unit_roles\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_unit_roles\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_unit_roles\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":'unit_role_option_' + index}},[_vm._v(_vm._s(role))])])})],2)]),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar utilisera le(s) rôle(s) \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_unit_roles.join(\", \")))]),_vm._v(\" des organisations de la fiche activité pour extraire les codes UMR (labintel) et RNSR.\")])])])])])]),_c('nav',{staticClass:\"buttons text-center\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.performEdit}},[_c('i',{staticClass:\"icon-floppy\"}),_vm._v(\" Enregistrer \")])])])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('h2',[_c('i',{staticClass:\"icon-upload\"}),_vm._v(\" Accès FTP\")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-building\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Hôte\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-logout\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Port\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Identifiant\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Les fichiers de la clé privée et de la clé publique doivent être déposés dans le répertoire oscar/config/autoload/ et être accessible en lecture à l'utilisateur du serveur web. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-plug\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Nom du fichier contenant la clé privée SSH\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-plug\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Nom du fichier contenant la clé publique SSH\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-plug\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Mot de passe de la clé privée SSH\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('h2',[_c('i',{staticClass:\"icon-cog\"}),_vm._v(\" Options\")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Type pour le contrat signé\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Responsable scientifique\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Partenaire(s)\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Partenaire principal\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Unité(s)\")])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":_vm.name}},[_vm._v(\"Mot de passe \"+_vm._s(_vm.type)+\" / \"+_vm._s(_vm.value))]),_c('div',{staticClass:\"input-group input-lg password-field\"},[_c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-lock\"}),_vm._v(\" \"),_c('strong',[_vm._v(_vm._s(_vm.label))])]),(_vm.type == 'text')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],staticClass:\"form-control\",staticStyle:{\"font-family\":\"monospace\"},attrs:{\"name\":_vm.name,\"type\":\"text\",\"placeholder\":\"Mot de passe\",\"id\":_vm.name},domProps:{\"value\":(_vm.value)},on:{\"input\":function($event){if($event.target.composing)return;_vm.value=$event.target.value}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],staticClass:\"form-control\",staticStyle:{\"font-family\":\"monospace\"},attrs:{\"name\":_vm.name,\"type\":\"password\",\"placeholder\":\"Mot de passe\",\"id\":_vm.name},domProps:{\"value\":(_vm.value)},on:{\"input\":function($event){if($event.target.composing)return;_vm.value=$event.target.value}}}),_c('div',{staticClass:\"input-group-addon\",class:{'password-displayed': _vm.type == 'text'},staticStyle:{\"cursor\":\"pointer\",\"background\":\"white\"},attrs:{\"title\":\"Afficher le mot de passe pendant 5 secondes\"},on:{\"click\":_vm.handlerShowPassword}},[(_vm.type == 'text')?_c('i',{staticClass:\"glyphicon icon-eye\"}):_c('i',{staticClass:\"glyphicon icon-eye-off\"})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n
\n\n \n
\n
\n {{ label }}\n
\n \n \n
\n \n \n
\n
\n
\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js\"","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent(\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier /* server only */,\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options =\n typeof scriptExports === 'function' ? scriptExports.options : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) {\n // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection(h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./PasswordField.vue?vue&type=template&id=2be9a996\"\nimport script from \"./PasswordField.vue?vue&type=script&lang=js\"\nexport * from \"./PasswordField.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n
\n\n
\n
\n \n {{ loading }}\n
\n
\n\n\n \n
\n \n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./AdministrationPcru.vue?vue&type=template&id=309df7bb\"\nimport script from \"./AdministrationPcru.vue?vue&type=script&lang=js\"\nexport * from \"./AdministrationPcru.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/js/oscar/dist/AdministrationPcru.umd.min.js b/public/js/oscar/dist/AdministrationPcru.umd.min.js
index 1f2b71e83ee481ac99054c1f3d18500992fe458e..2255c183421b0b672fb1915ca6539e5000e3b861 100644
--- a/public/js/oscar/dist/AdministrationPcru.umd.min.js
+++ b/public/js/oscar/dist/AdministrationPcru.umd.min.js
@@ -1,2 +1,2 @@
-(function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e():"function"===typeof define&&define.amd?define([],e):"object"===typeof exports?exports["AdministrationPcru"]=e():t["AdministrationPcru"]=e()})("undefined"!==typeof self?self:this,(function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(n,i,function(e){return t[e]}.bind(null,i));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s="fb15")}({8875:function(t,e,r){var n,i,s;(function(r,o){i=[],n=o,s="function"===typeof n?n.apply(e,i):n,void 0===s||(t.exports=s)})("undefined"!==typeof self&&self,(function(){function t(){var e=Object.getOwnPropertyDescriptor(document,"currentScript");if(!e&&"currentScript"in document&&document.currentScript)return document.currentScript;if(e&&e.get!==t&&document.currentScript)return document.currentScript;try{throw new Error}catch(f){var r,n,i,s=/.*at [^(]*\((.*):(.+):(.+)\)$/gi,o=/@([^@]*):(\d+):(\d+)\s*$/gi,a=s.exec(f.stack)||o.exec(f.stack),c=a&&a[1]||!1,l=a&&a[2]||!1,u=document.location.href.replace(document.location.hash,""),p=document.getElementsByTagName("script");c===u&&(r=document.documentElement.outerHTML,n=new RegExp("(?:[^\\n]+?\\n){0,"+(l-2)+"}[^<]*","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js&\"","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./PasswordField.vue?vue&type=template&id=2be9a996&\"\nimport script from \"./PasswordField.vue?vue&type=script&lang=js&\"\nexport * from \"./PasswordField.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n
\n\n
\n
\n \n {{ loading }}\n
\n
\n\n\n \n
\n \n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AdministrationPcru.vue?vue&type=template&id=417a28ea&\"\nimport script from \"./AdministrationPcru.vue?vue&type=script&lang=js&\"\nexport * from \"./AdministrationPcru.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack://AdministrationPcru/webpack/universalModuleDefinition","webpack://AdministrationPcru/webpack/bootstrap","webpack://AdministrationPcru/./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js","webpack://AdministrationPcru/./src/AdministrationPcru.vue?4780","webpack://AdministrationPcru/./src/components/PasswordField.vue?8819","webpack://AdministrationPcru/src/components/PasswordField.vue","webpack://AdministrationPcru/./src/components/PasswordField.vue?c578","webpack://AdministrationPcru/./node_modules/vue-loader/lib/runtime/componentNormalizer.js","webpack://AdministrationPcru/./src/components/PasswordField.vue","webpack://AdministrationPcru/src/AdministrationPcru.vue","webpack://AdministrationPcru/./src/AdministrationPcru.vue?55fb","webpack://AdministrationPcru/./src/AdministrationPcru.vue","webpack://AdministrationPcru/./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","currentScript","document","src","match","render","_vm","_c","_self","staticStyle","staticClass","class","success","_v","_s","loading","_e","attrs","configuration","pcru_enabled","directives","rawName","expression","domProps","Array","isArray","_i","on","$event","$$a","$$el","target","$$c","checked","$$v","$$i","$set","concat","slice","_m","composing","pcru_pass","pcru_ssh_private_pass","$$selectedVal","filter","options","selected","map","val","_value","multiple","_l","type","pcru_contract_type","role","pcru_incharge_role","index","pcru_partner_roles","join","pcru_partenaire_principal_roles","pcru_unit_roles","performEdit","staticRenderFns","label","handlerShowPassword","tempo","TYPE_PASSWORD","TYPE_TEXT","props","required","default","displayPassword","watch","$emit","methods","Promise","resolve","setTimeout","normalizeComponent","scriptExports","functionalTemplate","injectStyles","scopeId","moduleIdentifier","shadowMode","hook","_compiled","functional","_scopeId","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","$root","$options","shadowRoot","_injectStyles","originalRender","h","existing","beforeCreate","component","components","PasswordField","url","formData","FormData","append","pcru_host","pcru_port","pcru_user","pcru_ssh_private","pcru_ssh_public","$http","post","then","ok","fetch","data","configuration_pcru","handlerSuccess","foo","setInterval"],"mappings":"CAAA,SAA2CA,EAAMC,GAC1B,kBAAZC,SAA0C,kBAAXC,OACxCA,OAAOD,QAAUD,IACQ,oBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,kBAAZC,QACdA,QAAQ,sBAAwBD,IAEhCD,EAAK,sBAAwBC,KAR/B,CASoB,qBAATK,KAAuBA,KAAOC,MAAO,WAChD,O,YCTE,IAAIC,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUR,QAGnC,IAAIC,EAASK,EAAiBE,GAAY,CACzCC,EAAGD,EACHE,GAAG,EACHV,QAAS,IAUV,OANAW,EAAQH,GAAUI,KAAKX,EAAOD,QAASC,EAAQA,EAAOD,QAASO,GAG/DN,EAAOS,GAAI,EAGJT,EAAOD,QA0Df,OArDAO,EAAoBM,EAAIF,EAGxBJ,EAAoBO,EAAIR,EAGxBC,EAAoBQ,EAAI,SAASf,EAASgB,EAAMC,GAC3CV,EAAoBW,EAAElB,EAASgB,IAClCG,OAAOC,eAAepB,EAASgB,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEV,EAAoBgB,EAAI,SAASvB,GACX,qBAAXwB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAepB,EAASwB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAepB,EAAS,aAAc,CAAE0B,OAAO,KAQvDnB,EAAoBoB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQnB,EAAoBmB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFAxB,EAAoBgB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOnB,EAAoBQ,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRvB,EAAoB2B,EAAI,SAASjC,GAChC,IAAIgB,EAAShB,GAAUA,EAAO4B,WAC7B,WAAwB,OAAO5B,EAAO,YACtC,WAA8B,OAAOA,GAEtC,OADAM,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG7B,EAAoBgC,EAAI,GAIjBhC,EAAoBA,EAAoBiC,EAAI,Q,oCChFrD,G,OAAsB,qBAAXC,OAAwB,CACjC,IAAIC,EAAgBD,OAAOE,SAASD,cAWhCE,EAAMF,GAAiBA,EAAcE,IAAIC,MAAM,2BAC/CD,IACF,IAA0BA,EAAI,IAKnB,ICrBXE,EAAS,WAAkB,IAAIC,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,UAAU,CAACE,YAAY,CAAC,SAAW,WAAW,aAAa,UAAU,CAAEH,EAAiB,cAAEC,EAAG,MAAM,CAACG,YAAY,aAAa,CAAEJ,EAAW,QAAEC,EAAG,MAAM,CAACG,YAAY,WAAW,CAACH,EAAG,MAAM,CAACG,YAAY,kBAAkBC,MAAM,CAAE,oBAAqBL,EAAIM,UAAU,CAACL,EAAG,IAAI,CAACG,YAAY,8BAA8BJ,EAAIO,GAAG,IAAIP,EAAIQ,GAAGR,EAAIS,SAAS,SAAST,EAAIU,KAAKT,EAAG,OAAO,CAACU,MAAM,CAAC,OAAS,GAAG,OAAS,SAAS,CAACV,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,YAAY,CAACJ,EAAIO,GAAG,YAAYN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIY,cAAcC,aAAe,QAAU,gBAAgBZ,EAAG,MAAM,CAACG,YAAY,YAAY,CAACH,EAAG,MAAM,CAACG,YAAY,mBAAmB,CAACH,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAA0B,aAAEI,WAAW,+BAA+BL,MAAM,CAAC,GAAK,eAAe,KAAO,eAAe,KAAO,YAAYM,SAAS,CAAC,QAAUC,MAAMC,QAAQnB,EAAIY,cAAcC,cAAcb,EAAIoB,GAAGpB,EAAIY,cAAcC,aAAa,OAAO,EAAGb,EAAIY,cAA0B,cAAGS,GAAG,CAAC,OAAS,SAASC,GAAQ,IAAIC,EAAIvB,EAAIY,cAAcC,aAAaW,EAAKF,EAAOG,OAAOC,IAAIF,EAAKG,QAAuB,GAAGT,MAAMC,QAAQI,GAAK,CAAC,IAAIK,EAAI,KAAKC,EAAI7B,EAAIoB,GAAGG,EAAIK,GAAQJ,EAAKG,QAASE,EAAI,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,eAAgBW,EAAIQ,OAAO,CAACH,KAAaC,GAAK,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,eAAgBW,EAAIS,MAAM,EAAEH,GAAKE,OAAOR,EAAIS,MAAMH,EAAI,UAAY7B,EAAI8B,KAAK9B,EAAIY,cAAe,eAAgBc,OAAUzB,EAAG,QAAQ,CAACG,YAAY,gBAAgBO,MAAM,CAAC,IAAM,wBAAwBV,EAAG,UAAU,CAACI,MAAML,EAAIY,cAAcC,aAAe,UAAY,YAAY,CAACZ,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,YAAY,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,0BAA0B,CAACH,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAAuB,UAAEI,WAAW,4BAA4BZ,YAAY,eAAeO,MAAM,CAAC,KAAO,OAAO,GAAK,OAAO,KAAO,QAAQM,SAAS,CAAC,MAASjB,EAAIY,cAAuB,WAAGS,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,WAAiBlC,EAAI8B,KAAK9B,EAAIY,cAAe,YAAaU,EAAOG,OAAO9C,mBAAmBsB,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,0BAA0B,CAACH,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAAuB,UAAEI,WAAW,4BAA4BZ,YAAY,eAAeO,MAAM,CAAC,KAAO,OAAO,GAAK,OAAO,KAAO,QAAQM,SAAS,CAAC,MAASjB,EAAIY,cAAuB,WAAGS,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,WAAiBlC,EAAI8B,KAAK9B,EAAIY,cAAe,YAAaU,EAAOG,OAAO9C,mBAAmBsB,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,0BAA0B,CAACH,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAAuB,UAAEI,WAAW,4BAA4BZ,YAAY,eAAeO,MAAM,CAAC,KAAO,OAAO,GAAK,OAAO,KAAO,QAAQM,SAAS,CAAC,MAASjB,EAAIY,cAAuB,WAAGS,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,WAAiBlC,EAAI8B,KAAK9B,EAAIY,cAAe,YAAaU,EAAOG,OAAO9C,mBAAmBsB,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,0BAA0B,CAACH,EAAG,iBAAiB,CAACU,MAAM,CAAC,MAAQX,EAAIY,cAAcuB,UAAU,KAAO,OAAO,KAAO,gBAAgBd,GAAG,CAAC,OAAS,SAASC,GAAQtB,EAAIY,cAAcuB,UAAYb,OAAY,KAAKtB,EAAIiC,GAAG,GAAGhC,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,iBAAiBV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAA8B,iBAAEI,WAAW,mCAAmCZ,YAAY,eAAeO,MAAM,CAAC,KAAO,OAAO,GAAK,cAAc,KAAO,eAAeM,SAAS,CAAC,MAASjB,EAAIY,cAA8B,kBAAGS,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,WAAiBlC,EAAI8B,KAAK9B,EAAIY,cAAe,mBAAoBU,EAAOG,OAAO9C,mBAAmBsB,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,gBAAgBV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAA6B,gBAAEI,WAAW,kCAAkCZ,YAAY,eAAeO,MAAM,CAAC,KAAO,OAAO,GAAK,aAAa,KAAO,cAAcM,SAAS,CAAC,MAASjB,EAAIY,cAA6B,iBAAGS,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,WAAiBlC,EAAI8B,KAAK9B,EAAIY,cAAe,kBAAmBU,EAAOG,OAAO9C,mBAAmBsB,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,sBAAsBV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,iBAAiB,CAACU,MAAM,CAAC,MAAQX,EAAIY,cAAcwB,sBAAsB,KAAO,mBAAmB,KAAO,qCAAqCf,GAAG,CAAC,OAAS,SAASC,GAAQtB,EAAIY,cAAcwB,sBAAwBd,OAAY,WAAWrB,EAAG,MAAM,CAACG,YAAY,YAAY,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,MAAM,CAACG,YAAY,OAAO,CAACH,EAAG,MAAM,CAACG,YAAY,2BAA2B,CAACH,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,GAAGhC,EAAG,SAAS,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAAgC,mBAAEI,WAAW,qCAAqCZ,YAAY,eAAeO,MAAM,CAAC,KAAO,GAAG,GAAK,IAAIU,GAAG,CAAC,OAAS,SAASC,GAAQ,IAAIe,EAAgBnB,MAAM5B,UAAUgD,OAAOzE,KAAKyD,EAAOG,OAAOc,SAAQ,SAASpE,GAAG,OAAOA,EAAEqE,YAAWC,KAAI,SAAStE,GAAG,IAAIuE,EAAM,WAAYvE,EAAIA,EAAEwE,OAASxE,EAAEQ,MAAM,OAAO+D,KAAO1C,EAAI8B,KAAK9B,EAAIY,cAAe,qBAAsBU,EAAOG,OAAOmB,SAAWP,EAAgBA,EAAc,OAAOrC,EAAI6C,GAAI7C,EAAIY,cAA4B,gBAAE,SAASkC,GAAM,OAAO7C,EAAG,SAAS,CAAChB,IAAI6D,EAAK7B,SAAS,CAAC,MAAQ6B,IAAO,CAAC9C,EAAIO,GAAGP,EAAIQ,GAAGsC,GAAM,UAAS,KAAK7C,EAAG,IAAI,CAACG,YAAY,oBAAoB,CAACH,EAAG,IAAI,CAACG,YAAY,sBAAsBJ,EAAIO,GAAG,wBAAwBN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIY,cAAcmC,uBAAuB/C,EAAIO,GAAG,8FAA8FN,EAAG,MAAMA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,IAAIhC,EAAG,SAAS,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAAgC,mBAAEI,WAAW,qCAAqCZ,YAAY,eAAeO,MAAM,CAAC,KAAO,GAAG,GAAK,IAAIU,GAAG,CAAC,OAAS,SAASC,GAAQ,IAAIe,EAAgBnB,MAAM5B,UAAUgD,OAAOzE,KAAKyD,EAAOG,OAAOc,SAAQ,SAASpE,GAAG,OAAOA,EAAEqE,YAAWC,KAAI,SAAStE,GAAG,IAAIuE,EAAM,WAAYvE,EAAIA,EAAEwE,OAASxE,EAAEQ,MAAM,OAAO+D,KAAO1C,EAAI8B,KAAK9B,EAAIY,cAAe,qBAAsBU,EAAOG,OAAOmB,SAAWP,EAAgBA,EAAc,OAAOrC,EAAI6C,GAAI7C,EAAIY,cAA4B,gBAAE,SAASoC,GAAM,OAAO/C,EAAG,SAAS,CAAChB,IAAI+D,EAAK/B,SAAS,CAAC,MAAQ+B,IAAO,CAAChD,EAAIO,GAAGP,EAAIQ,GAAGwC,GAAM,UAAS,KAAK/C,EAAG,IAAI,CAACG,YAAY,oBAAoB,CAACH,EAAG,IAAI,CAACG,YAAY,sBAAsBJ,EAAIO,GAAG,oDAAoDN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIY,cAAcqC,uBAAuBjD,EAAIO,GAAG,2CAA2CN,EAAG,KAAK,CAACD,EAAIO,GAAG,wCAAwCP,EAAIO,GAAG,SAASN,EAAG,MAAMA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,IAAIjC,EAAI6C,GAAI7C,EAAIY,cAA2B,eAAE,SAASoC,EAAKE,GAAO,OAAOjD,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAAgC,mBAAEI,WAAW,qCAAqCL,MAAM,CAAC,KAAO,WAAW,GAAK,uBAAyBuC,GAAOjC,SAAS,CAAC,MAAQ+B,EAAK,QAAU9B,MAAMC,QAAQnB,EAAIY,cAAcuC,oBAAoBnD,EAAIoB,GAAGpB,EAAIY,cAAcuC,mBAAmBH,IAAO,EAAGhD,EAAIY,cAAgC,oBAAGS,GAAG,CAAC,OAAS,SAASC,GAAQ,IAAIC,EAAIvB,EAAIY,cAAcuC,mBAAmB3B,EAAKF,EAAOG,OAAOC,IAAIF,EAAKG,QAAuB,GAAGT,MAAMC,QAAQI,GAAK,CAAC,IAAIK,EAAIoB,EAAKnB,EAAI7B,EAAIoB,GAAGG,EAAIK,GAAQJ,EAAKG,QAASE,EAAI,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,qBAAsBW,EAAIQ,OAAO,CAACH,KAAaC,GAAK,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,qBAAsBW,EAAIS,MAAM,EAAEH,GAAKE,OAAOR,EAAIS,MAAMH,EAAI,UAAY7B,EAAI8B,KAAK9B,EAAIY,cAAe,qBAAsBc,OAAUzB,EAAG,QAAQ,CAACG,YAAY,mBAAmBO,MAAM,CAAC,IAAM,uBAAyBuC,IAAQ,CAAClD,EAAIO,GAAGP,EAAIQ,GAAGwC,YAAc,GAAG/C,EAAG,IAAI,CAACG,YAAY,oBAAoB,CAACH,EAAG,IAAI,CAACG,YAAY,sBAAsBJ,EAAIO,GAAG,mCAAmCN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIY,cAAcuC,mBAAmBC,KAAK,UAAUpD,EAAIO,GAAG,+HAA+HN,EAAG,MAAMA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,IAAIjC,EAAI6C,GAAI7C,EAAIY,cAA2B,eAAE,SAASoC,EAAKE,GAAO,OAAOjD,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAA6C,gCAAEI,WAAW,kDAAkDL,MAAM,CAAC,KAAO,WAAW,GAAK,oCAAsCuC,GAAOjC,SAAS,CAAC,MAAQ+B,EAAK,QAAU9B,MAAMC,QAAQnB,EAAIY,cAAcyC,iCAAiCrD,EAAIoB,GAAGpB,EAAIY,cAAcyC,gCAAgCL,IAAO,EAAGhD,EAAIY,cAA6C,iCAAGS,GAAG,CAAC,OAAS,SAASC,GAAQ,IAAIC,EAAIvB,EAAIY,cAAcyC,gCAAgC7B,EAAKF,EAAOG,OAAOC,IAAIF,EAAKG,QAAuB,GAAGT,MAAMC,QAAQI,GAAK,CAAC,IAAIK,EAAIoB,EAAKnB,EAAI7B,EAAIoB,GAAGG,EAAIK,GAAQJ,EAAKG,QAASE,EAAI,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,kCAAmCW,EAAIQ,OAAO,CAACH,KAAaC,GAAK,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,kCAAmCW,EAAIS,MAAM,EAAEH,GAAKE,OAAOR,EAAIS,MAAMH,EAAI,UAAY7B,EAAI8B,KAAK9B,EAAIY,cAAe,kCAAmCc,OAAUzB,EAAG,QAAQ,CAACG,YAAY,mBAAmBO,MAAM,CAAC,IAAM,oCAAsCuC,IAAQ,CAAClD,EAAIO,GAAGP,EAAIQ,GAAGwC,YAAc,GAAG/C,EAAG,IAAI,CAACG,YAAY,oBAAoB,CAACH,EAAG,IAAI,CAACG,YAAY,sBAAsBJ,EAAIO,GAAG,mCAAmCN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIY,cAAcyC,gCAAgCD,KAAK,UAAUpD,EAAIO,GAAG,sFAAsFN,EAAG,MAAMA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAM,UAAUV,EAAG,MAAM,CAACG,YAAY,wBAAwB,CAACJ,EAAIiC,GAAG,IAAIjC,EAAI6C,GAAI7C,EAAIY,cAAwB,YAAE,SAASoC,EAAKE,GAAO,OAAOjD,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAIY,cAA6B,gBAAEI,WAAW,kCAAkCL,MAAM,CAAC,KAAO,WAAW,GAAK,oBAAsBuC,GAAOjC,SAAS,CAAC,MAAQ+B,EAAK,QAAU9B,MAAMC,QAAQnB,EAAIY,cAAc0C,iBAAiBtD,EAAIoB,GAAGpB,EAAIY,cAAc0C,gBAAgBN,IAAO,EAAGhD,EAAIY,cAA6B,iBAAGS,GAAG,CAAC,OAAS,SAASC,GAAQ,IAAIC,EAAIvB,EAAIY,cAAc0C,gBAAgB9B,EAAKF,EAAOG,OAAOC,IAAIF,EAAKG,QAAuB,GAAGT,MAAMC,QAAQI,GAAK,CAAC,IAAIK,EAAIoB,EAAKnB,EAAI7B,EAAIoB,GAAGG,EAAIK,GAAQJ,EAAKG,QAASE,EAAI,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,kBAAmBW,EAAIQ,OAAO,CAACH,KAAaC,GAAK,GAAI7B,EAAI8B,KAAK9B,EAAIY,cAAe,kBAAmBW,EAAIS,MAAM,EAAEH,GAAKE,OAAOR,EAAIS,MAAMH,EAAI,UAAY7B,EAAI8B,KAAK9B,EAAIY,cAAe,kBAAmBc,OAAUzB,EAAG,QAAQ,CAACG,YAAY,mBAAmBO,MAAM,CAAC,IAAM,oBAAsBuC,IAAQ,CAAClD,EAAIO,GAAGP,EAAIQ,GAAGwC,YAAc,KAAK/C,EAAG,IAAI,CAACG,YAAY,oBAAoB,CAACH,EAAG,IAAI,CAACG,YAAY,sBAAsBJ,EAAIO,GAAG,mCAAmCN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIY,cAAc0C,gBAAgBF,KAAK,UAAUpD,EAAIO,GAAG,uGAAuGN,EAAG,MAAM,CAACG,YAAY,uBAAuB,CAACH,EAAG,SAAS,CAACG,YAAY,kBAAkBO,MAAM,CAAC,KAAO,UAAUU,GAAG,CAAC,MAAQrB,EAAIuD,cAAc,CAACtD,EAAG,IAAI,CAACG,YAAY,gBAAgBJ,EAAIO,GAAG,yBAAyBP,EAAIU,QAE7jZ8C,EAAkB,CAAC,WAAY,IAAIxD,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,KAAK,CAACA,EAAG,IAAI,CAACG,YAAY,gBAAgBJ,EAAIO,GAAG,iBACzH,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,4BAA4BJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAG,aAC5K,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,0BAA0BJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAG,aAC1K,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAG,oBACxK,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,oBAAoB,CAACH,EAAG,IAAI,CAACG,YAAY,sBAAsBJ,EAAIO,GAAG,yLAC5I,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAG,mDACxK,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAG,qDACxK,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAG,0CACxK,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,KAAK,CAACA,EAAG,IAAI,CAACG,YAAY,aAAaJ,EAAIO,GAAG,eACjG,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBH,EAAG,SAAS,CAACD,EAAIO,GAAG,mCAC5J,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBH,EAAG,SAAS,CAACD,EAAIO,GAAG,iCAC5J,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBH,EAAG,SAAS,CAACD,EAAIO,GAAG,sBAC5J,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBH,EAAG,SAAS,CAACD,EAAIO,GAAG,6BAC5J,WAAY,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBH,EAAG,SAAS,CAACD,EAAIO,GAAG,kBCf1J,EAAS,WAAkB,IAAIP,EAAI1C,KAAK2C,EAAGD,EAAIE,MAAMD,GAAG,OAAOA,EAAG,MAAM,CAACG,YAAY,cAAc,CAACH,EAAG,QAAQ,CAACG,YAAY,UAAUO,MAAM,CAAC,IAAMX,EAAI/B,OAAO,CAAC+B,EAAIO,GAAG,gBAAgBP,EAAIQ,GAAGR,EAAI8C,MAAM,MAAM9C,EAAIQ,GAAGR,EAAIrB,UAAUsB,EAAG,MAAM,CAACG,YAAY,uCAAuC,CAACH,EAAG,MAAM,CAACG,YAAY,qBAAqB,CAACH,EAAG,IAAI,CAACG,YAAY,wBAAwBJ,EAAIO,GAAG,KAAKN,EAAG,SAAS,CAACD,EAAIO,GAAGP,EAAIQ,GAAGR,EAAIyD,YAAyB,QAAZzD,EAAI8C,KAAgB7C,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAS,MAAEgB,WAAW,UAAUZ,YAAY,eAAeD,YAAY,CAAC,cAAc,aAAaQ,MAAM,CAAC,KAAOX,EAAI/B,KAAK,KAAO,OAAO,YAAc,eAAe,GAAK+B,EAAI/B,MAAMgD,SAAS,CAAC,MAASjB,EAAS,OAAGqB,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,YAAiBlC,EAAIrB,MAAM2C,EAAOG,OAAO9C,WAAUsB,EAAG,QAAQ,CAACa,WAAW,CAAC,CAAC7C,KAAK,QAAQ8C,QAAQ,UAAUpC,MAAOqB,EAAS,MAAEgB,WAAW,UAAUZ,YAAY,eAAeD,YAAY,CAAC,cAAc,aAAaQ,MAAM,CAAC,KAAOX,EAAI/B,KAAK,KAAO,WAAW,YAAc,eAAe,GAAK+B,EAAI/B,MAAMgD,SAAS,CAAC,MAASjB,EAAS,OAAGqB,GAAG,CAAC,MAAQ,SAASC,GAAWA,EAAOG,OAAOS,YAAiBlC,EAAIrB,MAAM2C,EAAOG,OAAO9C,WAAUsB,EAAG,MAAM,CAACG,YAAY,oBAAoBC,MAAM,CAAC,qBAAkC,QAAZL,EAAI8C,MAAgB3C,YAAY,CAAC,OAAS,UAAU,WAAa,SAASQ,MAAM,CAAC,MAAQ,+CAA+CU,GAAG,CAAC,MAAQrB,EAAI0D,sBAAsB,CAAc,QAAZ1D,EAAI8C,KAAgB7C,EAAG,IAAI,CAACG,YAAY,uBAAuBH,EAAG,IAAI,CAACG,YAAY,kCAEx/C,EAAkB,GCgBlB,IAAIuD,EAAQ,KACZ,MAAMC,EAAgB,WAChBC,EAAY,OAEH,OACXC,MAAO,CACH7F,KAAM,CAAE8F,UAAU,GAClBpF,MAAO,CAAEqF,QAAS,IAClBP,MAAO,CAAEO,QAAS,KAEtB,OACI,MAAO,CACHC,iBAAiB,EACjBnB,KAAMc,IAGdM,MAAO,CACH,MAAMxB,GACFpF,KAAK6G,MAAM,SAAUzB,GACrBpF,KAAK6G,MAAM,QAASzB,KAG5B0B,QAAS,CACL,sBAEkB,OAAVT,GACArG,KAAKwF,KAAOe,EACZF,EAAQ,IAAIU,QAASC,IACjBC,WAAY,KACRjH,KAAKwF,KAAOc,EACZD,EAAQ,MACT,SAGPA,EAAQ,KACRrG,KAAKwF,KAAOc,MCrDqK,ICMtL,SAASY,EACtBC,EACA1E,EACAyD,EACAkB,EACAC,EACAC,EACAC,EACAC,GAGA,IAoBIC,EApBAxC,EACuB,oBAAlBkC,EAA+BA,EAAclC,QAAUkC,EAuDhE,GApDI1E,IACFwC,EAAQxC,OAASA,EACjBwC,EAAQiB,gBAAkBA,EAC1BjB,EAAQyC,WAAY,GAIlBN,IACFnC,EAAQ0C,YAAa,GAInBL,IACFrC,EAAQ2C,SAAW,UAAYN,GAI7BC,GAEFE,EAAO,SAAUI,GAEfA,EACEA,GACC7H,KAAK8H,QAAU9H,KAAK8H,OAAOC,YAC3B/H,KAAKgI,QAAUhI,KAAKgI,OAAOF,QAAU9H,KAAKgI,OAAOF,OAAOC,WAEtDF,GAA0C,qBAAxBI,sBACrBJ,EAAUI,qBAGRZ,GACFA,EAAa9G,KAAKP,KAAM6H,GAGtBA,GAAWA,EAAQK,uBACrBL,EAAQK,sBAAsBC,IAAIZ,IAKtCtC,EAAQmD,aAAeX,GACdJ,IACTI,EAAOD,EACH,WACEH,EAAa9G,KACXP,MACCiF,EAAQ0C,WAAa3H,KAAKgI,OAAShI,MAAMqI,MAAMC,SAASC,aAG7DlB,GAGFI,EACF,GAAIxC,EAAQ0C,WAAY,CAGtB1C,EAAQuD,cAAgBf,EAExB,IAAIgB,EAAiBxD,EAAQxC,OAC7BwC,EAAQxC,OAAS,SAAkCiG,EAAGb,GAEpD,OADAJ,EAAKlH,KAAKsH,GACHY,EAAeC,EAAGb,QAEtB,CAEL,IAAIc,EAAW1D,EAAQ2D,aACvB3D,EAAQ2D,aAAeD,EAAW,GAAGlE,OAAOkE,EAAUlB,GAAQ,CAACA,GAInE,MAAO,CACL9H,QAASwH,EACTlC,QAASA,GCtFb,IAAI4D,EAAY,EACd,EACA,EACA,GACA,EACA,KACA,KACA,MAIa,EAAAA,E,QC+QA,OAEbC,WAAY,CACV,iBAAkBC,GAGpBvC,MAAO,CACLwC,IAAK,CAACvC,UAAU,IAGlB,OACE,MAAO,CACLwC,SAAU,KACV3F,cAAe,KACfH,QAAS,KACTH,SAAS,IAIb8D,QAAS,CAGP,cAEE9G,KAAKmD,QAAU,qCAEf,IAAI8F,EAAW,IAAIC,SACnBD,EAASE,OAAO,eAAgBnJ,KAAKsD,cAAcC,cACnD0F,EAASE,OAAO,OAAQnJ,KAAKsD,cAAc8F,WAC3CH,EAASE,OAAO,OAAQnJ,KAAKsD,cAAc+F,WAC3CJ,EAASE,OAAO,OAAQnJ,KAAKsD,cAAcgG,WAC3CL,EAASE,OAAO,OAAQnJ,KAAKsD,cAAcuB,WAC3CoE,EAASE,OAAO,cAAenJ,KAAKsD,cAAciG,kBAClDN,EAASE,OAAO,aAAcnJ,KAAKsD,cAAckG,iBACjDP,EAASE,OAAO,mBAAoBnJ,KAAKsD,cAAcwB,uBACvDmE,EAASE,OAAO,qBAAsBnJ,KAAKsD,cAAcuC,oBACzDoD,EAASE,OAAO,kCAAmCnJ,KAAKsD,cAAcyC,iCACtEkD,EAASE,OAAO,kBAAmBnJ,KAAKsD,cAAc0C,iBACtDiD,EAASE,OAAO,qBAAsBnJ,KAAKsD,cAAcqC,oBACzDsD,EAASE,OAAO,qBAAsBnJ,KAAKsD,cAAcmC,oBAEzDzF,KAAKyJ,MAAMC,KAAK1J,KAAKgJ,IAAKC,GAAUU,KAAKC,IACvC5J,KAAK6J,WAIT,eAAe7G,GACb,IAAI8G,EAAO9G,EAAQ8G,KACnB9J,KAAKsD,cAAgBwG,EAAKC,oBAG5B,QACE/J,KAAKgD,QAAU,GACfhD,KAAKmD,QAAU,iCACfnD,KAAKyJ,MAAMxI,IAAIjB,KAAKgJ,KAAKW,KACrBC,IACE5J,KAAKgK,eAAeJ,KAExBD,KAAKM,IACLjK,KAAKgD,SAAU,EACfhD,KAAKmD,QAAU,qBACf+G,YAAY,WACVlK,KAAKmD,QAAU,IACfvB,KAAK5B,MAAO,SAKpB,UACEA,KAAK6J,UCtW2L,ICOhM,EAAY,EACd,EACApH,EACAyD,GACA,EACA,KACA,KACA,MAIa,I,QChBA,kB","file":"AdministrationPcru.umd.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AdministrationPcru\"] = factory();\n\telse\n\t\troot[\"AdministrationPcru\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n","// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var currentScript = window.document.currentScript\n if (process.env.NEED_CURRENTSCRIPT_POLYFILL) {\n var getCurrentScript = require('@soda/get-current-script')\n currentScript = getCurrentScript()\n\n // for backward compatibility, because previously we directly included the polyfill\n if (!('currentScript' in document)) {\n Object.defineProperty(document, 'currentScript', { get: getCurrentScript })\n }\n }\n\n var src = currentScript && currentScript.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/)\n if (src) {\n __webpack_public_path__ = src[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\nexport default null\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticStyle:{\"position\":\"relative\",\"min-height\":\"100px\"}},[(_vm.configuration)?_c('div',{staticClass:\"container\"},[(_vm.loading)?_c('div',{staticClass:\"overlay\"},[_c('div',{staticClass:\"overlay-content\",class:{ 'text-success bold': _vm.success}},[_c('i',{staticClass:\"animate-spin icon-spinner\"}),_vm._v(\" \"+_vm._s(_vm.loading)+\" \")])]):_vm._e(),_c('form',{attrs:{\"action\":\"\",\"method\":\"post\"}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-3\"},[_vm._v(\" Module \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_enabled ? 'Actif' : 'Inactif'))])]),_c('div',{staticClass:\"col-md-9\"},[_c('div',{staticClass:\"material-switch\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_enabled),expression:\"configuration.pcru_enabled\"}],attrs:{\"id\":\"pcru_enabled\",\"name\":\"pcru_enabled\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.configuration.pcru_enabled)?_vm._i(_vm.configuration.pcru_enabled,null)>-1:(_vm.configuration.pcru_enabled)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_enabled,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_enabled\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_enabled\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_enabled\", $$c)}}}}),_c('label',{staticClass:\"label-primary\",attrs:{\"for\":\"pcru_enabled\"}})])])]),_c('section',{class:_vm.configuration.pcru_enabled ? 'enabled' : 'disabled'},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-6\"},[_vm._m(0),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"host\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(1),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_host),expression:\"configuration.pcru_host\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"host\",\"name\":\"host\"},domProps:{\"value\":(_vm.configuration.pcru_host)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_host\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"port\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(2),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_port),expression:\"configuration.pcru_port\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"port\",\"name\":\"port\"},domProps:{\"value\":(_vm.configuration.pcru_port)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_port\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(3),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_user),expression:\"configuration.pcru_user\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"user\",\"name\":\"user\"},domProps:{\"value\":(_vm.configuration.pcru_user)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_user\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-8 col-md-push-1\"},[_c('password-field',{attrs:{\"value\":_vm.configuration.pcru_pass,\"name\":'pass',\"text\":'Mot de passe'},on:{\"change\":function($event){_vm.configuration.pcru_pass = $event}}})],1)]),_vm._m(4),_c('div',{staticClass:\"row\"},[_c('div',[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"ssh_private\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(5),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_ssh_private),expression:\"configuration.pcru_ssh_private\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"ssh_private\",\"name\":\"ssh_private\"},domProps:{\"value\":(_vm.configuration.pcru_ssh_private)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_ssh_private\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"ssh_public\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(6),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_ssh_public),expression:\"configuration.pcru_ssh_public\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"ssh_public\",\"name\":\"ssh_public\"},domProps:{\"value\":(_vm.configuration.pcru_ssh_public)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.configuration, \"pcru_ssh_public\", $event.target.value)}}})])])])]),_c('div',{staticClass:\"row\"},[_c('div',[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"ssh_private_pass\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(7),_c('password-field',{attrs:{\"value\":_vm.configuration.pcru_ssh_private_pass,\"name\":'ssh_private_pass',\"text\":'Mot de passe de la clé privée SSH'},on:{\"change\":function($event){_vm.configuration.pcru_ssh_private_pass = $event}}})],1)])])])]),_c('div',{staticClass:\"col-md-6\"},[_vm._m(8),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-md-10 col-md-push-1\"},[_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(9),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_contract_type),expression:\"configuration.pcru_contract_type\"}],staticClass:\"form-control\",attrs:{\"name\":\"\",\"id\":\"\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.configuration, \"pcru_contract_type\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.configuration.contract_types),function(type){return _c('option',{key:type,domProps:{\"value\":type}},[_vm._v(_vm._s(type)+\" \")])}),0)]),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Le type de contrat \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_contract_type))]),_vm._v(\" sera utilisé par oscar pour selectionner le document à utiliser pour les données PCRU\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(10),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_incharge_role),expression:\"configuration.pcru_incharge_role\"}],staticClass:\"form-control\",attrs:{\"name\":\"\",\"id\":\"\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.configuration, \"pcru_incharge_role\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.configuration.incharge_roles),function(role){return _c('option',{key:role,domProps:{\"value\":role}},[_vm._v(_vm._s(role)+\" \")])}),0)]),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar selectionnera les personnes avec le rôle \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_incharge_role))]),_vm._v(\" de la fiche activité pour extraire le \"),_c('em',[_vm._v(\"Responsable scientifique côté PCRU\")]),_vm._v(\".\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(11),_vm._l((_vm.configuration.partner_roles),function(role,index){return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_partner_roles),expression:\"configuration.pcru_partner_roles\"}],attrs:{\"type\":\"checkbox\",\"id\":'partner_role_option_' + index},domProps:{\"value\":role,\"checked\":Array.isArray(_vm.configuration.pcru_partner_roles)?_vm._i(_vm.configuration.pcru_partner_roles,role)>-1:(_vm.configuration.pcru_partner_roles)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_partner_roles,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=role,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_partner_roles\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_partner_roles\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_partner_roles\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":'partner_role_option_' + index}},[_vm._v(_vm._s(role))])])})],2),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar utilisera le(s) rôle(s) \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_partner_roles.join(\", \")))]),_vm._v(\" des organisations de la fiche activité pour extraire le(s) partenaire(s) (les codes SIRET/EN doivent être renseignés).\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(12),_vm._l((_vm.configuration.partner_roles),function(role,index){return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_partenaire_principal_roles),expression:\"configuration.pcru_partenaire_principal_roles\"}],attrs:{\"type\":\"checkbox\",\"id\":'partenaire_principal_role_option_' + index},domProps:{\"value\":role,\"checked\":Array.isArray(_vm.configuration.pcru_partenaire_principal_roles)?_vm._i(_vm.configuration.pcru_partenaire_principal_roles,role)>-1:(_vm.configuration.pcru_partenaire_principal_roles)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_partenaire_principal_roles,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=role,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_partenaire_principal_roles\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_partenaire_principal_roles\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_partenaire_principal_roles\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":'partenaire_principal_role_option_' + index}},[_vm._v(_vm._s(role))])])})],2),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar utilisera le(s) rôle(s) \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_partenaire_principal_roles.join(\", \")))]),_vm._v(\" des organisations de la fiche activité pour extraire le partenaire principal.\")])]),_c('hr'),_c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user\"}}),_c('div',{staticClass:\"input-group input-lg\"},[_vm._m(13),_vm._l((_vm.configuration.unit_roles),function(role,index){return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.configuration.pcru_unit_roles),expression:\"configuration.pcru_unit_roles\"}],attrs:{\"type\":\"checkbox\",\"id\":'unit_role_option_' + index},domProps:{\"value\":role,\"checked\":Array.isArray(_vm.configuration.pcru_unit_roles)?_vm._i(_vm.configuration.pcru_unit_roles,role)>-1:(_vm.configuration.pcru_unit_roles)},on:{\"change\":function($event){var $$a=_vm.configuration.pcru_unit_roles,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=role,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.configuration, \"pcru_unit_roles\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.configuration, \"pcru_unit_roles\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.configuration, \"pcru_unit_roles\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":'unit_role_option_' + index}},[_vm._v(_vm._s(role))])])})],2)]),_c('p',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Oscar utilisera le(s) rôle(s) \"),_c('strong',[_vm._v(_vm._s(_vm.configuration.pcru_unit_roles.join(\", \")))]),_vm._v(\" des organisations de la fiche activité pour extraire les codes UMR (labintel) et RNSR.\")])])])])])]),_c('nav',{staticClass:\"buttons text-center\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.performEdit}},[_c('i',{staticClass:\"icon-floppy\"}),_vm._v(\" Enregistrer \")])])])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('h2',[_c('i',{staticClass:\"icon-upload\"}),_vm._v(\" Accès FTP\")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-building\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Hôte\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-logout\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Port\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Identifiant\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert alert-info\"},[_c('i',{staticClass:\"icon-info-circled\"}),_vm._v(\" Les fichiers de la clé privée et de la clé publique doivent être déposés dans le répertoire oscar/config/autoload/ et être accessible en lecture à l'utilisateur du serveur web. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-plug\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Nom du fichier contenant la clé privée SSH\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-plug\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Nom du fichier contenant la clé publique SSH\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-plug\"}),_vm._v(\" \"),_c('strong',[_vm._v(\"Mot de passe de la clé privée SSH\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('h2',[_c('i',{staticClass:\"icon-cog\"}),_vm._v(\" Options\")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Type pour le contrat signé\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Responsable scientifique\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Partenaire(s)\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Partenaire principal\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-user\"}),_c('strong',[_vm._v(\"Unité(s)\")])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"form-group\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":_vm.name}},[_vm._v(\"Mot de passe \"+_vm._s(_vm.type)+\" / \"+_vm._s(_vm.value))]),_c('div',{staticClass:\"input-group input-lg password-field\"},[_c('div',{staticClass:\"input-group-addon\"},[_c('i',{staticClass:\"glyphicon icon-lock\"}),_vm._v(\" \"),_c('strong',[_vm._v(_vm._s(_vm.label))])]),(_vm.type == 'text')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],staticClass:\"form-control\",staticStyle:{\"font-family\":\"monospace\"},attrs:{\"name\":_vm.name,\"type\":\"text\",\"placeholder\":\"Mot de passe\",\"id\":_vm.name},domProps:{\"value\":(_vm.value)},on:{\"input\":function($event){if($event.target.composing)return;_vm.value=$event.target.value}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],staticClass:\"form-control\",staticStyle:{\"font-family\":\"monospace\"},attrs:{\"name\":_vm.name,\"type\":\"password\",\"placeholder\":\"Mot de passe\",\"id\":_vm.name},domProps:{\"value\":(_vm.value)},on:{\"input\":function($event){if($event.target.composing)return;_vm.value=$event.target.value}}}),_c('div',{staticClass:\"input-group-addon\",class:{'password-displayed': _vm.type == 'text'},staticStyle:{\"cursor\":\"pointer\",\"background\":\"white\"},attrs:{\"title\":\"Afficher le mot de passe pendant 5 secondes\"},on:{\"click\":_vm.handlerShowPassword}},[(_vm.type == 'text')?_c('i',{staticClass:\"glyphicon icon-eye\"}):_c('i',{staticClass:\"glyphicon icon-eye-off\"})])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n
\n\n \n
\n
\n {{ label }}\n
\n \n \n
\n \n \n
\n
\n
\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PasswordField.vue?vue&type=script&lang=js\"","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent(\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier /* server only */,\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options =\n typeof scriptExports === 'function' ? scriptExports.options : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) {\n // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection(h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./PasswordField.vue?vue&type=template&id=2be9a996\"\nimport script from \"./PasswordField.vue?vue&type=script&lang=js\"\nexport * from \"./PasswordField.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n
\n\n
\n
\n \n {{ loading }}\n
\n
\n\n\n \n
\n \n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdministrationPcru.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./AdministrationPcru.vue?vue&type=template&id=309df7bb\"\nimport script from \"./AdministrationPcru.vue?vue&type=script&lang=js\"\nexport * from \"./AdministrationPcru.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/js/oscar/vite/dist/assets/Activity-cc6ccf89.css b/public/js/oscar/vite/dist/assets/Activity-cc6ccf89.css
new file mode 100644
index 0000000000000000000000000000000000000000..85554c544a4c2e49856af06fcf035b7413960196
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/Activity-cc6ccf89.css
@@ -0,0 +1 @@
+.confirm-dialog[data-v-efd4eea6]{z-index:10000;.overlay-content[data-v-efd4eea6] {flex-basis: 30% !important; h3[data-v-efd4eea6] {border-bottom: thin solid #eee; margin: .25em .5em; padding: .25em .5em;} .overlay-message[data-v-efd4eea6] {font-size: 1.4em;} nav[data-v-efd4eea6] {height: 50px; width: 100%; padding: .25em .5em; margin: .25em .5em; border-top: thin solid #eee; display: flex; flex-wrap: wrap; justify-content: space-between; align-content: space-between; a.btn[data-v-efd4eea6] {}}}}.disabled[data-v-833d8759]{cursor:not-allowed;color:#aaa;text-decoration:line-through}.change[data-v-833d8759]{border:1px solid #CCC;padding:.3em;margin:.5em 0;border-left:solid #CCC 4px;display:flex;> div[data-v-833d8759] {flex: 1; display: flex; span.text[data-v-833d8759] {flex: 0; font-weight: bold; white-space: nowrap;} select[data-v-833d8759],div[data-v-833d8759]{flex: 1;}} > i[data-v-833d8759] {flex: 0;} > nav[data-v-833d8759] {flex: 0; border-top: solid #CCC 4px; text-align: center;} > div[data-v-833d8759] {flex: 1; display: flex;}}.avenant[data-v-833d8759]{border-left:#CCC 4px solid;&.status-100[data-v-833d8759]{border-color:#ccc}&.status-200[data-v-833d8759]{border-color:#2d7800}p[data-v-833d8759] {border-top: solid #CCC 1px; padding: .5em 2em;} nav[data-v-833d8759] {padding: .3em 0; border-top: solid #CCC 1px; text-align: center;} .modification[data-v-833d8759] {padding: 0 1em;}}.jalon[data-v-42de1793]{background:white;padding:.25em 1em;margin-bottom:.2em}.jalon .main[data-v-42de1793]{display:inline-block;font-size:1.2em;text-align:left;border-bottom:solid thin #ddd;padding:.1em .5em}.jalon.payment[data-v-42de1793]{background:rgba(255,255,255,.7)}.time-value[data-v-42de1793]{font-weight:600}.time-value .ago[data-v-42de1793]{font-weight:100}.list{margin:1em 0}.person-text[data-v-dfc2c1c6]{display:inline-block;position:relative;.info-bulle[data-v-dfc2c1c6] {display: none;} &[data-v-dfc2c1c6]:hover {.info-bulle[data-v-dfc2c1c6] {display: block;}}}.info-bulle[data-v-dfc2c1c6]{position:absolute;text-shadow:none;background-color:#000000b3;box-shadow:-4px 4px 8px #0000004d;header[data-v-dfc2c1c6] {background: #222; display: flex; .infos[data-v-dfc2c1c6] {font-size: 1.25em; padding: 4px .5em 4px .5em; font-weight: 700; .firstname[data-v-dfc2c1c6] {line-height: 16px; font-size: 16px; color: rgba(255,255,255,.8); font-style: italic;} .lastname[data-v-dfc2c1c6] {color: #fff; line-height: 36px; font-size: 30px;}}} .content[data-v-dfc2c1c6] {i[data-v-dfc2c1c6] {color: #999;} font-size: .9em; background: #fff; color: #111; padding: .3em 1em; > div[data-v-dfc2c1c6] {border-bottom: dotted 1px #777; &[data-v-dfc2c1c6]:last-child {border-bottom: none;}}} footer[data-v-dfc2c1c6] {font-size: .7em; padding: 0 .25em; border-top: 1px solid #DDD; background-color: #EEE; color: #555; text-align: right;}}.workpackage[data-v-7f36a26b]{max-width:31%;margin:1%}.vjs-tree-brackets{cursor:pointer}.vjs-tree-brackets:hover{color:#1890ff}.vjs-check-controller{position:absolute;left:0}.vjs-check-controller.is-checked .vjs-check-controller-inner{background-color:#1890ff;border-color:#0076e4}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-checkbox:after{transform:rotate(45deg) scaleY(1)}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-radio:after{transform:translate(-50%,-50%) scale(1)}.vjs-check-controller .vjs-check-controller-inner{display:inline-block;position:relative;border:1px solid #bfcbd9;border-radius:2px;vertical-align:middle;box-sizing:border-box;width:16px;height:16px;background-color:#fff;z-index:1;cursor:pointer;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.vjs-check-controller .vjs-check-controller-inner:after{box-sizing:content-box;content:"";border:2px solid #fff;border-left:0;border-top:0;height:8px;left:4px;position:absolute;top:1px;transform:rotate(45deg) scaleY(0);width:4px;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transform-origin:center}.vjs-check-controller .vjs-check-controller-inner.is-radio{border-radius:100%}.vjs-check-controller .vjs-check-controller-inner.is-radio:after{border-radius:100%;height:4px;background-color:#fff;left:50%;top:50%}.vjs-check-controller .vjs-check-controller-original{opacity:0;outline:none;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.vjs-carets{position:absolute;right:0;cursor:pointer}.vjs-carets svg{transition:transform .3s}.vjs-carets:hover{color:#1890ff}.vjs-carets-close{transform:rotate(-90deg)}.vjs-tree-node{display:flex;position:relative;line-height:20px}.vjs-tree-node.has-carets{padding-left:15px}.vjs-tree-node.has-carets.has-selector,.vjs-tree-node.has-selector{padding-left:30px}.vjs-tree-node.is-highlight,.vjs-tree-node:hover{background-color:#e6f7ff}.vjs-tree-node .vjs-indent{display:flex;position:relative}.vjs-tree-node .vjs-indent-unit{width:1em}.vjs-tree-node .vjs-indent-unit.has-line{border-left:1px dashed #bfcbd9}.vjs-tree-node.dark.is-highlight,.vjs-tree-node.dark:hover{background-color:#2e4558}.vjs-node-index{position:absolute;right:100%;margin-right:4px;user-select:none}.vjs-colon{white-space:pre}.vjs-comment{color:#bfcbd9}.vjs-value{word-break:break-word}.vjs-value-null,.vjs-value-undefined{color:#d55fde}.vjs-value-boolean,.vjs-value-number{color:#1d8ce0}.vjs-value-string{color:#13ce66}.vjs-tree{font-family:Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace;font-size:14px;text-align:left}.vjs-tree.is-virtual{overflow:auto}.vjs-tree.is-virtual .vjs-tree-node{white-space:nowrap}.activity-fiche[data-v-8de60033]{position:relative;padding-bottom:4em}.section-infos[data-v-8de60033]{margin-top:1em;scroll-margin-top:120px}.section-infos:target h2[data-v-8de60033]{-webkit-animation-name:animation-8de60033;-webkit-animation-duration:2s;-webkit-animation-timing-function:ease-in-out;-webkit-animation-iteration-count:1;-webkit-animation-play-state:running;animation-name:animation-8de60033;animation-duration:2s;animation-timing-function:ease-in-out;animation-iteration-count:1;animation-play-state:running}.section-infos>h2[data-v-8de60033]{border-bottom:1px solid #a2a7af;margin:0;padding:.2em 0;display:flex;justify-content:left;justify-content:space-between}@-webkit-keyframes animation-8de60033{0%{color:#333}15.0%{color:#0a53be}30.0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}@keyframes animation-8de60033{0%{color:#333}15.0%{color:#0a53be}30.0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}.activity-project[data-v-8de60033]{padding:.25em 1em .25em .25em;border-bottom:#eee solid thin}.activity-type[data-v-8de60033]{background:#EEE;padding:.25em 1em .25em .25em}.activity-type .icon-tag[data-v-8de60033]{color:#999}.type-chain span[data-v-8de60033]{font-weight:400}.type-chain span[data-v-8de60033]:last-child{font-weight:700}.type-chain span[data-v-8de60033]:last-child:after{content:""}.type-chain span[data-v-8de60033]{margin:auto}.type-chain span[data-v-8de60033]:after{content:" > ";color:#ccc}.buttons[data-v-8de60033]{padding:1em;text-align:right}header .line-bottom[data-v-8de60033]{border-bottom:#dee2ea thin solid;padding-bottom:1em}header h3[data-v-8de60033]{font-size:1em}header h4[data-v-8de60033]{color:#95afe3}header .texthighlight[data-v-8de60033]{color:#111}header .texthighlight strong[data-v-8de60033],header .texthighlight time[data-v-8de60033]{color:#000}.descriptionPacked[data-v-8de60033]{cursor:pointer;max-height:4em;overflow:hidden}.budget[data-v-8de60033]{border-left:#dee2ea thin solid}.budget .amount[data-v-8de60033]{font-size:1.4em;border-top:solid thin #EEE;border-bottom:solid thin #EEE}.budget .details[data-v-8de60033]{font-size:.8em}.budget .details small[data-v-8de60033]{display:block}
diff --git a/public/js/oscar/vite/dist/assets/Activity-ed5cb27b.css b/public/js/oscar/vite/dist/assets/Activity-ed5cb27b.css
deleted file mode 100644
index aedf910b084e5fa1ffce4da6641e6690113f222d..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/Activity-ed5cb27b.css
+++ /dev/null
@@ -1 +0,0 @@
-.confirm-dialog[data-v-efd4eea6]{z-index:10000}.confirm-dialog .overlay-content{h3[data-v-efd4eea6] {border-bottom: thin solid #eee; margin: .25em .5em; padding: .25em .5em;} .overlay-message[data-v-efd4eea6] {font-size: 1.4em;} nav {&[data-v-efd4eea6] {height: 50px; width: 100%; padding: .25em .5em; margin: .25em .5em; border-top: thin solid #eee; display: flex; flex-wrap: wrap; justify-content: space-between; align-content: space-between;} a.btn[data-v-efd4eea6] {}}}.confirm-dialog .overlay-content[data-v-efd4eea6]{flex-basis:30%!important}.disabled[data-v-833d8759]{cursor:not-allowed;color:#aaa;text-decoration:line-through}.change[data-v-833d8759]{border:1px solid #CCC;padding:.3em;margin:.5em 0;border-left:solid #CCC 4px;display:flex}.change>div{span.text[data-v-833d8759] {flex: 0; font-weight: bold; white-space: nowrap;} select[data-v-833d8759],div[data-v-833d8759]{flex: 1;}}.change>i[data-v-833d8759]{flex:0}.change>nav[data-v-833d8759]{flex:0;border-top:solid #CCC 4px;text-align:center}.change>div[data-v-833d8759]{flex:1;display:flex}.avenant{p[data-v-833d8759] {border-top: solid #CCC 1px; padding: .5em 2em;} nav[data-v-833d8759] {padding: .3em 0; border-top: solid #CCC 1px; text-align: center;} .modification[data-v-833d8759] {padding: 0 1em;}}.avenant[data-v-833d8759]{border-left:#CCC 4px solid}.avenant.status-100[data-v-833d8759]{border-color:#ccc}.avenant.status-200[data-v-833d8759]{border-color:#2d7800}.jalon[data-v-42de1793]{background:white;padding:.25em 1em;margin-bottom:.2em}.jalon .main[data-v-42de1793]{display:inline-block;font-size:1.2em;text-align:left;border-bottom:solid thin #ddd;padding:.1em .5em}.jalon.payment[data-v-42de1793]{background:rgba(255,255,255,.7)}.time-value[data-v-42de1793]{font-weight:600}.time-value .ago[data-v-42de1793]{font-weight:100}.list{margin:1em 0}.person-text[data-v-dfc2c1c6]{display:inline-block;position:relative}.person-text .info-bulle[data-v-dfc2c1c6]{display:none}.person-text:hover .info-bulle[data-v-dfc2c1c6]{display:block}.info-bulle{header {&[data-v-dfc2c1c6] {background: #222; display: flex;} .infos {&[data-v-dfc2c1c6] {font-size: 1.25em; padding: 4px .5em 4px .5em; font-weight: 700;} .firstname[data-v-dfc2c1c6] {line-height: 16px; font-size: 16px; color: rgba(255,255,255,.8); font-style: italic;} .lastname[data-v-dfc2c1c6] {color: #fff; line-height: 36px; font-size: 30px;}}} .content {&[data-v-dfc2c1c6] {font-size: .9em; background: #fff; color: #111; padding: .3em 1em;} i[data-v-dfc2c1c6] {color: #999;} > div {&[data-v-dfc2c1c6] {border-bottom: dotted 1px #777;} &[data-v-dfc2c1c6]:last-child {border-bottom: none;}}} footer[data-v-dfc2c1c6] {font-size: .7em; padding: 0 .25em; border-top: 1px solid #DDD; background-color: #EEE; color: #555; text-align: right;}}.info-bulle[data-v-dfc2c1c6]{position:absolute;text-shadow:none;background-color:#000000b3;box-shadow:-4px 4px 8px #0000004d}.workpackage[data-v-7f36a26b]{max-width:31%;margin:1%}.vjs-tree-brackets{cursor:pointer}.vjs-tree-brackets:hover{color:#1890ff}.vjs-check-controller{position:absolute;left:0}.vjs-check-controller.is-checked .vjs-check-controller-inner{background-color:#1890ff;border-color:#0076e4}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-checkbox:after{transform:rotate(45deg) scaleY(1)}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-radio:after{transform:translate(-50%,-50%) scale(1)}.vjs-check-controller .vjs-check-controller-inner{display:inline-block;position:relative;border:1px solid #bfcbd9;border-radius:2px;vertical-align:middle;box-sizing:border-box;width:16px;height:16px;background-color:#fff;z-index:1;cursor:pointer;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.vjs-check-controller .vjs-check-controller-inner:after{box-sizing:content-box;content:"";border:2px solid #fff;border-left:0;border-top:0;height:8px;left:4px;position:absolute;top:1px;transform:rotate(45deg) scaleY(0);width:4px;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transform-origin:center}.vjs-check-controller .vjs-check-controller-inner.is-radio{border-radius:100%}.vjs-check-controller .vjs-check-controller-inner.is-radio:after{border-radius:100%;height:4px;background-color:#fff;left:50%;top:50%}.vjs-check-controller .vjs-check-controller-original{opacity:0;outline:none;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.vjs-carets{position:absolute;right:0;cursor:pointer}.vjs-carets svg{transition:transform .3s}.vjs-carets:hover{color:#1890ff}.vjs-carets-close{transform:rotate(-90deg)}.vjs-tree-node{display:flex;position:relative;line-height:20px}.vjs-tree-node.has-carets{padding-left:15px}.vjs-tree-node.has-carets.has-selector,.vjs-tree-node.has-selector{padding-left:30px}.vjs-tree-node.is-highlight,.vjs-tree-node:hover{background-color:#e6f7ff}.vjs-tree-node .vjs-indent{display:flex;position:relative}.vjs-tree-node .vjs-indent-unit{width:1em}.vjs-tree-node .vjs-indent-unit.has-line{border-left:1px dashed #bfcbd9}.vjs-tree-node.dark.is-highlight,.vjs-tree-node.dark:hover{background-color:#2e4558}.vjs-node-index{position:absolute;right:100%;margin-right:4px;-webkit-user-select:none;user-select:none}.vjs-colon{white-space:pre}.vjs-comment{color:#bfcbd9}.vjs-value{word-break:break-word}.vjs-value-null,.vjs-value-undefined{color:#d55fde}.vjs-value-boolean,.vjs-value-number{color:#1d8ce0}.vjs-value-string{color:#13ce66}.vjs-tree{font-family:Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace;font-size:14px;text-align:left}.vjs-tree.is-virtual{overflow:auto}.vjs-tree.is-virtual .vjs-tree-node{white-space:nowrap}.activity-fiche[data-v-8de60033]{position:relative;padding-bottom:4em}.section-infos[data-v-8de60033]{margin-top:1em;scroll-margin-top:120px}.section-infos:target h2[data-v-8de60033]{-webkit-animation-name:animation-8de60033;-webkit-animation-duration:2s;-webkit-animation-timing-function:ease-in-out;-webkit-animation-iteration-count:1;-webkit-animation-play-state:running;animation-name:animation-8de60033;animation-duration:2s;animation-timing-function:ease-in-out;animation-iteration-count:1;animation-play-state:running}.section-infos>h2[data-v-8de60033]{border-bottom:1px solid #a2a7af;margin:0;padding:.2em 0;display:flex;justify-content:left;justify-content:space-between}@-webkit-keyframes animation-8de60033{0%{color:#333}15.0%{color:#0a53be}30.0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}@keyframes animation-8de60033{0%{color:#333}15.0%{color:#0a53be}30.0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}.activity-project[data-v-8de60033]{padding:.25em 1em .25em .25em;border-bottom:#eee solid thin}.activity-type[data-v-8de60033]{background:#EEE;padding:.25em 1em .25em .25em}.activity-type .icon-tag[data-v-8de60033]{color:#999}.type-chain span[data-v-8de60033]{font-weight:400}.type-chain span[data-v-8de60033]:last-child{font-weight:700}.type-chain span[data-v-8de60033]:last-child:after{content:""}.type-chain span[data-v-8de60033]{margin:auto}.type-chain span[data-v-8de60033]:after{content:" > ";color:#ccc}.buttons[data-v-8de60033]{padding:1em;text-align:right}header .line-bottom[data-v-8de60033]{border-bottom:#dee2ea thin solid;padding-bottom:1em}header h3[data-v-8de60033]{font-size:1em}header h4[data-v-8de60033]{color:#95afe3}header .texthighlight[data-v-8de60033]{color:#111}header .texthighlight strong[data-v-8de60033],header .texthighlight time[data-v-8de60033]{color:#000}.descriptionPacked[data-v-8de60033]{cursor:pointer;max-height:4em;overflow:hidden}.budget[data-v-8de60033]{border-left:#dee2ea thin solid}.budget .amount[data-v-8de60033]{font-size:1.4em;border-top:solid thin #EEE;border-bottom:solid thin #EEE}.budget .details[data-v-8de60033]{font-size:.8em}.budget .details small[data-v-8de60033]{display:block}
diff --git a/public/js/oscar/vite/dist/assets/ActivityDocument-be06c000.css b/public/js/oscar/vite/dist/assets/ActivityDocument-2deed9d1.css
similarity index 86%
rename from public/js/oscar/vite/dist/assets/ActivityDocument-be06c000.css
rename to public/js/oscar/vite/dist/assets/ActivityDocument-2deed9d1.css
index 08628604053cdf383a766dff9649c4f6591a1941..cd5c87292698b3b13126b3b2a0cc10ae570471d6 100644
--- a/public/js/oscar/vite/dist/assets/ActivityDocument-be06c000.css
+++ b/public/js/oscar/vite/dist/assets/ActivityDocument-2deed9d1.css
@@ -1 +1 @@
-.step-content[data-v-fc17618a]{border:thin solid #aaa;border-top:none;padding:1em}.card .alert[data-v-fc17618a]{padding:0 .5em;margin:.1em}.step[data-v-fc17618a]{flex:1;padding:.25em 1em 1em;text-align:left;border:1px solid #aaa;border-left:4px solid #aaa;margin:.5em}.step.error[data-v-fc17618a]{border-color:#900}.step .alert[data-v-fc17618a]{margin:0;padding:.25em 1em}.current[data-v-fc17618a]{color:#333;background:white;border-bottom-color:#fff}.private[data-v-fc17618a]{color:#777;text-shadow:1px -1px 1px rgba(255,255,255,.3);font-weight:100}.stepHandler[data-v-fc17618a]{border-radius:18px;outline:0;padding:8px 12px;text-align:center;transition:all .3s ease-out;display:inline-block;margin-left:100px}.stepHandler[data-v-fc17618a]:before{font-family:fontello;content:""}.stepHandler[data-v-fc17618a]:hover,.stepHandler[data-v-fc17618a]:focus{color:#333;background:#8E969F}
+.step-content[data-v-fc17618a]{border:thin solid #aaa;border-top:none;padding:1em}.card .alert[data-v-fc17618a]{padding:0 .5em;margin:.1em}.step[data-v-fc17618a]{flex:1;padding:.25em 1em 1em;text-align:left;border:1px solid #aaa;border-left:4px solid #aaa;margin:.5em}.step.error[data-v-fc17618a]{border-color:#900}.step .alert[data-v-fc17618a]{margin:0;padding:.25em 1em}.current[data-v-fc17618a]{color:#333;background:white;border-bottom-color:#fff}.private[data-v-fc17618a]{color:#777;text-shadow:1px -1px 1px rgba(255,255,255,.3);font-weight:100}.stepHandler[data-v-fc17618a]{border-radius:18px;outline:0;padding:8px 12px;text-align:center;transition:all .3s ease-out;display:inline-block;margin-left:100px}.stepHandler[data-v-fc17618a]:before{font-family:fontello;content:"\e8a4"}.stepHandler[data-v-fc17618a]:hover,.stepHandler[data-v-fc17618a]:focus{color:#333;background:#8E969F}
diff --git a/public/js/oscar/vite/dist/assets/ActivityNotes-57bb9039.css b/public/js/oscar/vite/dist/assets/ActivityNotes-57bb9039.css
deleted file mode 100644
index a990cc4862568b30588a535e4f777c9c91b4701b..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/ActivityNotes-57bb9039.css
+++ /dev/null
@@ -1 +0,0 @@
-.note[data-v-543bfc57]{background-color:#fff;margin:0 0 .5em;padding:0}.note .note-header[data-v-543bfc57]{padding:.2em 1em;border-bottom:solid thin #DDD;display:flex;justify-content:space-between}.note .note-content[data-v-543bfc57]{padding:.2em 1em;white-space:pre-wrap;font-family:monospace}
diff --git a/public/js/oscar/vite/dist/assets/ActivityNotes-b71891b4.css b/public/js/oscar/vite/dist/assets/ActivityNotes-b71891b4.css
new file mode 100644
index 0000000000000000000000000000000000000000..c77a55c212f3bbed30ba1aaacba030c88ceff0b1
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/ActivityNotes-b71891b4.css
@@ -0,0 +1 @@
+.note[data-v-543bfc57]{background-color:#fff;margin:0 0 .5em;padding:0;.note-header[data-v-543bfc57] {padding: .2em 1em; border-bottom: solid thin #DDD; display: flex; justify-content: space-between;} .note-content[data-v-543bfc57] {padding: .2em 1em; white-space: pre-wrap; font-family: monospace;}}
diff --git a/public/js/oscar/vite/dist/assets/ActivityPcruInformations-cccdc180.css b/public/js/oscar/vite/dist/assets/ActivityPcruInformations-cccdc180.css
new file mode 100644
index 0000000000000000000000000000000000000000..597d30db067be44e88e44f55e9cbad22dab8b1c9
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/ActivityPcruInformations-cccdc180.css
@@ -0,0 +1 @@
+#form-table{background:white;padding:.5em;display:grid;grid-template-columns:.1fr .8fr .9fr 1fr 1fr .3fr 1fr;text-align:center}.header{font-weight:700}#form-table>*{border:1px solid #ddd;align-content:center}#form-table>label{margin-bottom:0}#donnees-envoyees-table{background:white;padding:.5em;display:grid;grid-template-columns:.1fr .9fr 1.4fr 1.4fr 1.3fr;text-align:center}#donnees-envoyees-table>*{border:1px solid #ddd;align-content:center}#donnees-envoyees-table>label{margin-bottom:0}.invalid{background-color:#f2dede;border:2px solid red}.invalidSpan{color:#a94442;font-weight:700}ul{margin-bottom:0}label{font-weight:400}form input[disabled],form select[disabled]{cursor:not-allowed}.info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.error{background-color:#f2dede;border-color:#ebccd1;color:#a94442;padding:15px;border:1px solid transparent}.success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}input.bold:not(.invalid){border:2px solid black}select.bold:not(.invalid){border:2px solid black}
diff --git a/public/js/oscar/vite/dist/assets/DocumentsList-4af197b4.css b/public/js/oscar/vite/dist/assets/DocumentsList-4af197b4.css
deleted file mode 100644
index bf115ea53f20f547321a896bde24bfc4f182a8e9..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/DocumentsList-4af197b4.css
+++ /dev/null
@@ -1 +0,0 @@
-.step-content[data-v-65e61e4a]{border:thin solid #aaa;border-top:none;padding:1em}.document-metas[data-v-65e61e4a]{display:flex;justify-content:space-between}.document-metas>*[data-v-65e61e4a]{flex:auto}.card .alert[data-v-65e61e4a]{padding:0 .5em;margin:.1em}.step[data-v-65e61e4a]{flex:1;padding:.25em 1em 1em;text-align:left;border:1px solid #aaa;border-left:4px solid #aaa;margin:.5em}.step.error[data-v-65e61e4a]{border-color:#900}.step .alert[data-v-65e61e4a]{margin:0;padding:.25em 1em}.current[data-v-65e61e4a]{color:#333;background:white;border-bottom-color:#fff}.private[data-v-65e61e4a]{color:#777;text-shadow:1px -1px 1px rgba(255,255,255,.3);font-weight:100}.stepHandler[data-v-65e61e4a]{border-radius:18px;outline:0;padding:8px 12px;text-align:center;transition:all .3s ease-out;display:inline-block;margin-left:100px}.stepHandler[data-v-65e61e4a]:before{font-family:fontello;content:""}.stepHandler[data-v-65e61e4a]:hover,.stepHandler[data-v-65e61e4a]:focus{color:#333;background:#8E969F}.process[data-v-65e61e4a],.signature[data-v-65e61e4a]{background:white;padding:.5em 1em;margin:1em;border:thin solid #92b2ae;border-left-width:8px}.signature h2[data-v-65e61e4a]{font-size:1.5em;margin:0;border-bottom:solid thin #c5c5c5;padding:.1em 0;display:flex}.signature h2 span[data-v-65e61e4a]{flex:1 1 auto}.signature h2 .status-flag[data-v-65e61e4a]{flex:0 0 6em;text-align:right}.buttons-bar[data-v-65e61e4a]{padding:.5em}.signature .recipient[data-v-65e61e4a]{display:block}.signature .recipient .title[data-v-65e61e4a]{display:flex}.recipient[data-v-65e61e4a]{border:solid thin #92b2ae;border-left-width:8px;text-shadow:4px -1px 0 rgb(255,255,255,.3);padding:.2em 0 .2em .5em;margin-right:.5em}.recipient label[data-v-65e61e4a]{display:flex;justify-content:space-between}.recipient .fullname[data-v-65e61e4a]{flex:1}.recipient .email[data-v-65e61e4a]{flex:0;margin-right:auto;text-align:right}.recipient label[data-v-65e61e4a]{display:flex;padding:0 1em 0 0;width:100%;color:#777}.recipient.selected[data-v-65e61e4a]{border-color:#12b368;background:#adfad8}.recipient.selected label[data-v-65e61e4a]{color:#000}.recipient .email[data-v-65e61e4a],.recipient .fullname[data-v-65e61e4a]{flex:1}.recipient .status-flag[data-v-65e61e4a]{flex:0 0 6em}.metas[data-v-65e61e4a]{display:inline-block;margin:0;padding:.5em 0}.metas .meta[data-v-65e61e4a]{display:inline-block;background:#d4dedd;padding:0 .5em;border-radius:8px}.recipient-signature[data-v-65e61e4a]{background:white;margin:.5em 0;padding:.7em 1em .1em;border-left:solid 4px #666666}.observer-inline[data-v-65e61e4a]{background:#e1ece6;display:inline-block;border-radius:4px;padding:0 .5em;margin:0 .3em}.recipient-signature h3[data-v-65e61e4a]{margin:0}.status:hover .status-text[data-v-65e61e4a]{opacity:1}.status .status-text[data-v-65e61e4a]{transition:opacity .3s;font-weight:700;color:#fff;text-shadow:-1px 1px 0 rgba(0,0,0,.5);margin:0;padding:0 .25em;font-size:.75em}.status-flag[data-v-65e61e4a]{display:none}.signature-status-501[data-v-65e61e4a]{border-color:#83243a}.signature-status-501 .status-text[data-v-65e61e4a],.signature-status-501 .status-flag[data-v-65e61e4a]{background-color:#83243a}.signature-status-501 .status-flag[data-v-65e61e4a]:before{content:""}.signature-status-401[data-v-65e61e4a]{border-left-color:#8d7260}.signature-status-401 .status-text[data-v-65e61e4a],.signature-status-401 .status-flag[data-v-65e61e4a]{background-color:#8d7260}.signature-status-401 .status-flag[data-v-65e61e4a]:before{content:""}.signature-status-105[data-v-65e61e4a]{border-left-color:#8eb4c9}.signature-status-105 .status-text[data-v-65e61e4a],.signature-status-105 .status-flag[data-v-65e61e4a]{background-color:#8eb4c9}.signature-status-105 .status-flag[data-v-65e61e4a]:before{content:""}.signature-status-101[data-v-65e61e4a]{border-left-color:#92b2ae}.signature-status-101 .status-text[data-v-65e61e4a],.signature-status-101 .status-flag[data-v-65e61e4a]{background-color:#92b2ae}.signature-status-101 .status-flag[data-v-65e61e4a]:before{content:""}.signature-status-201[data-v-65e61e4a]{border-left-color:#447c44}.signature-status-201 .status-text[data-v-65e61e4a],.signature-status-201 .status-flag[data-v-65e61e4a]{background-color:#447c44}.signature-status-201 .status-flag[data-v-65e61e4a]:before{content:""}
diff --git a/public/js/oscar/vite/dist/assets/DocumentsList-4e009bf5.css b/public/js/oscar/vite/dist/assets/DocumentsList-4e009bf5.css
new file mode 100644
index 0000000000000000000000000000000000000000..cdb9b712a688f9c141ab5eb4eee6248d40ba5875
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/DocumentsList-4e009bf5.css
@@ -0,0 +1 @@
+.step-content[data-v-65e61e4a]{border:thin solid #aaa;border-top:none;padding:1em}.document-metas[data-v-65e61e4a]{display:flex;justify-content:space-between;>*[data-v-65e61e4a] {flex: auto;}}.card .alert[data-v-65e61e4a]{padding:0 .5em;margin:.1em}.step[data-v-65e61e4a]{flex:1;padding:.25em 1em 1em;text-align:left;border:1px solid #aaa;border-left:4px solid #aaa;margin:.5em}.step.error[data-v-65e61e4a]{border-color:#900}.step .alert[data-v-65e61e4a]{margin:0;padding:.25em 1em}.current[data-v-65e61e4a]{color:#333;background:white;border-bottom-color:#fff}.private[data-v-65e61e4a]{color:#777;text-shadow:1px -1px 1px rgba(255,255,255,.3);font-weight:100}.stepHandler[data-v-65e61e4a]{border-radius:18px;outline:0;padding:8px 12px;text-align:center;transition:all .3s ease-out;display:inline-block;margin-left:100px}.stepHandler[data-v-65e61e4a]:before{font-family:fontello;content:"\e8a4"}.stepHandler[data-v-65e61e4a]:hover,.stepHandler[data-v-65e61e4a]:focus{color:#333;background:#8E969F}.process[data-v-65e61e4a],.signature[data-v-65e61e4a]{background:white;padding:.5em 1em;margin:1em;border:thin solid #92b2ae;border-left-width:8px}.signature h2[data-v-65e61e4a]{font-size:1.5em;margin:0;border-bottom:solid thin #c5c5c5;padding:.1em 0;display:flex}.signature h2 span[data-v-65e61e4a]{flex:1 1 auto}.signature h2 .status-flag[data-v-65e61e4a]{flex:0 0 6em;text-align:right}.buttons-bar[data-v-65e61e4a]{padding:.5em}.signature .recipient[data-v-65e61e4a]{display:block}.signature .recipient .title[data-v-65e61e4a]{display:flex}.recipient[data-v-65e61e4a]{border:solid thin #92b2ae;border-left-width:8px;text-shadow:4px -1px 0 rgb(255,255,255,.3);padding:.2em 0 .2em .5em;margin-right:.5em}.recipient label[data-v-65e61e4a]{display:flex;justify-content:space-between}.recipient .fullname[data-v-65e61e4a]{flex:1}.recipient .email[data-v-65e61e4a]{flex:0;margin-right:auto;text-align:right}.recipient label[data-v-65e61e4a]{display:flex;padding:0 1em 0 0;width:100%;color:#777}.recipient.selected[data-v-65e61e4a]{border-color:#12b368;background:#adfad8}.recipient.selected label[data-v-65e61e4a]{color:#000}.recipient .email[data-v-65e61e4a],.recipient .fullname[data-v-65e61e4a]{flex:1}.recipient .status-flag[data-v-65e61e4a]{flex:0 0 6em}.metas[data-v-65e61e4a]{display:inline-block;margin:0;padding:.5em 0}.metas .meta[data-v-65e61e4a]{display:inline-block;background:#d4dedd;padding:0 .5em;border-radius:8px}.recipient-signature[data-v-65e61e4a]{background:white;margin:.5em 0;padding:.7em 1em .1em;border-left:solid 4px #666666}.observer-inline[data-v-65e61e4a]{background:#e1ece6;display:inline-block;border-radius:4px;padding:0 .5em;margin:0 .3em}.recipient-signature h3[data-v-65e61e4a]{margin:0}.status:hover .status-text[data-v-65e61e4a]{opacity:1}.status .status-text[data-v-65e61e4a]{transition:opacity .3s;font-weight:700;color:#fff;text-shadow:-1px 1px 0 rgba(0,0,0,.5);margin:0;padding:0 .25em;font-size:.75em}.status-flag[data-v-65e61e4a]{display:none}.signature-status-501[data-v-65e61e4a]{border-color:#83243a}.signature-status-501 .status-text[data-v-65e61e4a],.signature-status-501 .status-flag[data-v-65e61e4a]{background-color:#83243a}.signature-status-501 .status-flag[data-v-65e61e4a]:before{content:"\e85d"}.signature-status-401[data-v-65e61e4a]{border-left-color:#8d7260}.signature-status-401 .status-text[data-v-65e61e4a],.signature-status-401 .status-flag[data-v-65e61e4a]{background-color:#8d7260}.signature-status-401 .status-flag[data-v-65e61e4a]:before{content:"\e803"}.signature-status-105[data-v-65e61e4a]{border-left-color:#8eb4c9}.signature-status-105 .status-text[data-v-65e61e4a],.signature-status-105 .status-flag[data-v-65e61e4a]{background-color:#8eb4c9}.signature-status-105 .status-flag[data-v-65e61e4a]:before{content:"\e88d"}.signature-status-101[data-v-65e61e4a]{border-left-color:#92b2ae}.signature-status-101 .status-text[data-v-65e61e4a],.signature-status-101 .status-flag[data-v-65e61e4a]{background-color:#92b2ae}.signature-status-101 .status-flag[data-v-65e61e4a]:before{content:"\f252"}.signature-status-201[data-v-65e61e4a]{border-left-color:#447c44}.signature-status-201 .status-text[data-v-65e61e4a],.signature-status-201 .status-flag[data-v-65e61e4a]{background-color:#447c44}.signature-status-201 .status-flag[data-v-65e61e4a]:before{content:"\e87f"}
diff --git a/public/js/oscar/vite/dist/assets/Loader-ee83f9da.css b/public/js/oscar/vite/dist/assets/Loader-ee83f9da.css
new file mode 100644
index 0000000000000000000000000000000000000000..476bc1c2fcb2684264d0d10a47c81e0fe0783593
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/Loader-ee83f9da.css
@@ -0,0 +1 @@
+.loader[data-v-573ae632]{background-color:#fffc;display:flex;align-items:center;justify-content:center;.message[data-v-573ae632] {text-align: center; font-size: 1em; font-weight: 600; -webkit-animation-name: animation-573ae632; -webkit-animation-duration: .5s; -webkit-animation-timing-function: ease-in-out; -webkit-animation-iteration-count: infinite; -webkit-animation-play-state: running; animation-name: animation-573ae632; animation-duration: .5s; animation-timing-function: ease-in-out; animation-iteration-count: infinite; animation-play-state: running; .from[data-v-573ae632] {font-size: .7em; font-weight: 300;}}}@-webkit-keyframes animation-573ae632{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}@keyframes animation-573ae632{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}
diff --git a/public/js/oscar/vite/dist/assets/Loader-f7bf6891.css b/public/js/oscar/vite/dist/assets/Loader-f7bf6891.css
deleted file mode 100644
index 3cfa8cc30e40fd04c04c0a9fa42544803663f810..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/Loader-f7bf6891.css
+++ /dev/null
@@ -1 +0,0 @@
-.loader[data-v-573ae632]{background-color:#fffc;display:flex;align-items:center;justify-content:center}.loader .message[data-v-573ae632]{text-align:center;font-size:1em;font-weight:600;-webkit-animation-name:animation-573ae632;-webkit-animation-duration:.5s;-webkit-animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;-webkit-animation-play-state:running;animation-name:animation-573ae632;animation-duration:.5s;animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-play-state:running}.loader .message .from[data-v-573ae632]{font-size:.7em;font-weight:300}@-webkit-keyframes animation-573ae632{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}@keyframes animation-573ae632{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}
diff --git a/public/js/oscar/vite/dist/assets/Modal-2266e1e2.css b/public/js/oscar/vite/dist/assets/Modal-2266e1e2.css
new file mode 100644
index 0000000000000000000000000000000000000000..1ae316c5b0af9978695acb4620bb2791113d1713
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/Modal-2266e1e2.css
@@ -0,0 +1 @@
+.overlay[data-v-8e477e4f]{z-index:5000;.overlay-content[data-v-8e477e4f] {height: 90vh; position: relative; .overlay-pending[data-v-8e477e4f] {font-weight: 600; min-height: 10em; line-height: 10em; text-align: center; -webkit-animation-name: animation-8e477e4f; -webkit-animation-duration: 1s; -webkit-animation-timing-function: ease-in-out; -webkit-animation-iteration-count: infinite; -webkit-animation-play-state: running; animation-name: animation-8e477e4f; animation-duration: 1s; animation-timing-function: ease-in-out; animation-iteration-count: infinite; animation-play-state: running;} .overlay-title[data-v-8e477e4f] {color: #333; padding: .25em; position: relative; height: 2em; .overlay-closer[data-v-8e477e4f] {position: absolute; right: 0em; top: 0;}} .overlay-buttons[data-v-8e477e4f] {text-align: center; padding: .5em 0 .3em 0; position: absolute; bottom: 0; left: 0; right: 0;} .overlay-body[data-v-8e477e4f] {border: thin solid #eee; background: #FEFEFE; margin: 1em; position: absolute; top: 2.5em; left: 0; right: 0; bottom: 2.5em; overflow: scroll;}}}@-webkit-keyframes animation-8e477e4f{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}@keyframes animation-8e477e4f{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}
diff --git a/public/js/oscar/vite/dist/assets/Modal-700b8a23.css b/public/js/oscar/vite/dist/assets/Modal-700b8a23.css
deleted file mode 100644
index 435b0ec6d11c357688f6ba8df6b885adf8b3874d..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/Modal-700b8a23.css
+++ /dev/null
@@ -1 +0,0 @@
-.overlay[data-v-8e477e4f]{z-index:5000}.overlay .overlay-content[data-v-8e477e4f]{height:90vh;position:relative}.overlay .overlay-content .overlay-pending[data-v-8e477e4f]{font-weight:600;min-height:10em;line-height:10em;text-align:center;-webkit-animation-name:animation-8e477e4f;-webkit-animation-duration:1s;-webkit-animation-timing-function:ease-in-out;-webkit-animation-iteration-count:infinite;-webkit-animation-play-state:running;animation-name:animation-8e477e4f;animation-duration:1s;animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-play-state:running}.overlay .overlay-content .overlay-title[data-v-8e477e4f]{color:#333;padding:.25em;position:relative;height:2em}.overlay .overlay-content .overlay-title .overlay-closer[data-v-8e477e4f]{position:absolute;right:0;top:0}.overlay .overlay-content .overlay-buttons[data-v-8e477e4f]{text-align:center;padding:.5em 0 .3em;position:absolute;bottom:0;left:0;right:0}.overlay .overlay-content .overlay-body[data-v-8e477e4f]{border:thin solid #eee;background:#FEFEFE;margin:1em;position:absolute;top:2.5em;left:0;right:0;bottom:2.5em;overflow:scroll}@-webkit-keyframes animation-8e477e4f{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}@keyframes animation-8e477e4f{0%{color:#333}50.0%{color:#0a53be}100.0%{color:#333}}
diff --git a/public/js/oscar/vite/dist/assets/PcruTransmissions-d5165e09.css b/public/js/oscar/vite/dist/assets/PcruTransmissions-d5165e09.css
new file mode 100644
index 0000000000000000000000000000000000000000..301515bec5bd59e04b8a988f975756b216d1afb0
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/PcruTransmissions-d5165e09.css
@@ -0,0 +1 @@
+.info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.warning{background-color:#fcf8e3;color:#8a6d3b}.error{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}td,th{padding:.5em}.button{border:1px solid;border-radius:4px;padding-left:.4em;padding-right:.4em}td span:not(:first-child){margin-left:.5em}
diff --git a/public/js/oscar/vite/dist/assets/ProjectActivityLogs-934299c2.js b/public/js/oscar/vite/dist/assets/ProjectActivityLogs-a43a204c.js
similarity index 88%
rename from public/js/oscar/vite/dist/assets/ProjectActivityLogs-934299c2.js
rename to public/js/oscar/vite/dist/assets/ProjectActivityLogs-a43a204c.js
index 7f2e2f2722b2c4f2839839dfb6ce6a1897290a02..e9d4b85fd333dafa32bc028d0669580efc10d6b4 100644
--- a/public/js/oscar/vite/dist/assets/ProjectActivityLogs-934299c2.js
+++ b/public/js/oscar/vite/dist/assets/ProjectActivityLogs-a43a204c.js
@@ -1 +1 @@
-import{y as o}from"../vendor.js";import{m as e}from"../vendor2.js";import{A as i}from"../vendor11.js";import{t as m}from"../vendor19.js";import"../vendor5.js";import"../vendor7.js";import"../vendor14.js";import"../vendor16.js";let l=document.querySelector("#activity-logs");const r=o(i,{url:l.dataset.url});r.config.globalProperties.$filters={timeAgo(t){return e.timeAgo(t)},date(t){return e.date(t)},dateFull(t){return e.dateFull(t)},filesize(t){return filesize.filesize(t)},money(t){return money.money(t)},log(t){return m.log(t)}};r.mount("#activity-logs");
+import{A as o}from"../vendor.js";import{m as e}from"../vendor2.js";import{A as i}from"../vendor11.js";import{t as m}from"../vendor19.js";import"../vendor5.js";import"../vendor7.js";import"../vendor14.js";import"../vendor16.js";let l=document.querySelector("#activity-logs");const r=o(i,{url:l.dataset.url});r.config.globalProperties.$filters={timeAgo(t){return e.timeAgo(t)},date(t){return e.date(t)},dateFull(t){return e.dateFull(t)},filesize(t){return filesize.filesize(t)},money(t){return money.money(t)},log(t){return m.log(t)}};r.mount("#activity-logs");
diff --git a/public/js/oscar/vite/dist/assets/ProjectActivitySpentSynthesis-283b86d9.js b/public/js/oscar/vite/dist/assets/ProjectActivitySpentSynthesis-72e95239.js
similarity index 83%
rename from public/js/oscar/vite/dist/assets/ProjectActivitySpentSynthesis-283b86d9.js
rename to public/js/oscar/vite/dist/assets/ProjectActivitySpentSynthesis-72e95239.js
index 52742a8e5f1a8ddea9834dcfc5df37b3ad8c191b..87c09797a66499768e7b86bfced3ed0455cf12e4 100644
--- a/public/js/oscar/vite/dist/assets/ProjectActivitySpentSynthesis-283b86d9.js
+++ b/public/js/oscar/vite/dist/assets/ProjectActivitySpentSynthesis-72e95239.js
@@ -1 +1 @@
-import{y as n}from"../vendor.js";import{A as r}from"../vendor13.js";import{m as s}from"../vendor4.js";import"../vendor7.js";let e=document.querySelector("#depenses2");const o=n(r,{url:e.dataset.url,standalone:!0,datas:{},syncurl:e.dataset.syncurl});o.config.globalProperties.$filters={money:function(t){return s.money(t)}};console.log("DEPENSE2");console.log(e.dataset);o.mount("#depenses2");
+import{A as n}from"../vendor.js";import{A as r}from"../vendor13.js";import{m as s}from"../vendor4.js";import"../vendor7.js";let e=document.querySelector("#depenses2");const o=n(r,{url:e.dataset.url,standalone:!0,datas:{},syncurl:e.dataset.syncurl});o.config.globalProperties.$filters={money:function(t){return s.money(t)}};console.log("DEPENSE2");console.log(e.dataset);o.mount("#depenses2");
diff --git a/public/js/oscar/vite/dist/assets/TimesheetDeclaration-d2772701.css b/public/js/oscar/vite/dist/assets/TimesheetDeclaration-d2772701.css
deleted file mode 100644
index 8d010070bbf84b7dab0250cd09651514ff250b1a..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/TimesheetDeclaration-d2772701.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.cartouche[data-v-45fb2e96]{white-space:nowrap;margin:0;border-radius:2px;box-shadow:none;font-size:.75em}.cartouche.training[data-v-45fb2e96]{background-color:#0b58a2}.cartouche.sickleave[data-v-45fb2e96]{background-color:olive}.cartouche.wp[data-v-45fb2e96]{background-color:#6a5999}.cartouche.conflict[data-v-45fb2e96]{background:#AA0000}.timesheet-item[data-v-c5ac47ec]{background:rgb(226.95,230.35,232.05);cursor:pointer;border:thin rgb(91.8,105.4,112.2) solid;margin:.3em 0;font-size:1em;display:flex;position:relative;transition:all .3s}.timesheet-item[data-v-c5ac47ec]>*{padding:.3em .5em}.timesheet-item .project-acronym[data-v-c5ac47ec]{transition:all .3s;position:relative;display:inline-block;padding-right:.8em;padding-left:.8em;color:#abb5ba;background:rgb(91.8,105.4,112.2);text-shadow:-1px 1px 0 rgba(0,0,0,.3);font-weight:700}.timesheet-item .project-acronym[data-v-c5ac47ec]:before{transition:all .3s;content:" ";width:1em;height:1em;background:rgba(255,255,255,0);transform:rotate(45deg);position:absolute;left:-.6em;top:.6em;z-index:10000}.timesheet-item .activity-label[data-v-c5ac47ec]{transition:all .3s;position:relative;display:inline-block;padding-left:1em;padding-right:1em;background:rgb(170.85,181.05,186.15);color:#171a1c;font-size:.8em;line-height:2em}.timesheet-item .activity-label[data-v-c5ac47ec]:before{transition:all .3s;content:" ";width:1.2em;height:1.2em;background:rgb(91.8,105.4,112.2);transform:rotate(45deg);position:absolute;left:-.6em;top:.6em;z-index:10000}.timesheet-item .workpackage-infos[data-v-c5ac47ec]{transition:all .3s;position:relative;padding-left:1em}.timesheet-item .workpackage-infos[data-v-c5ac47ec]:before{transition:all .3s;content:" ";width:1em;height:1em;background:rgb(170.85,181.05,186.15);transform:rotate(45deg);position:absolute;left:-.6em;top:.5em;z-index:10000}.timesheet-item.selected[data-v-c5ac47ec],.timesheet-item[data-v-c5ac47ec]:hover{background:white;border:thin #0088cc solid;color:#08c}.timesheet-item.selected .project-acronym[data-v-c5ac47ec],.timesheet-item:hover .project-acronym[data-v-c5ac47ec]{color:#9df;background:#0088cc}.timesheet-item.selected .activity-label[data-v-c5ac47ec],.timesheet-item:hover .activity-label[data-v-c5ac47ec]{background:#66ccff;color:#023}.timesheet-item.selected .activity-label[data-v-c5ac47ec]:before,.timesheet-item:hover .activity-label[data-v-c5ac47ec]:before{background:#0088cc}.timesheet-item.selected .workpackage-infos[data-v-c5ac47ec]:before,.timesheet-item:hover .workpackage-infos[data-v-c5ac47ec]:before{background:#66ccff}.timesheet-item.horslots-item .workpackage-infos[data-v-c5ac47ec]{flex:1}.timesheet-item.horslots-item .activity-label[data-v-c5ac47ec]:before{content:none}.timesheet-item.horslots-item .workpackage-infos[data-v-c5ac47ec]:before{background:rgb(91.8,105.4,112.2);top:.8em}.timesheet-item.horslots-item.selected .workpackage-infos[data-v-c5ac47ec]:before,.timesheet-item.horslots-item:hover .workpackage-infos[data-v-c5ac47ec]:before{background:#0088cc}.timesheet-item.selected[data-v-c5ac47ec]{box-shadow:.25em 0 .5em #08cc}.timesheet-item.selected .project-acronym[data-v-c5ac47ec]:before{background:white}.wp-duration{display:flex;border-bottom:thin solid white;align-items:center}.wp-duration strong small{font-weight:100}.wp-duration[class*=status-]{border-left:solid 4px #ddd}.wp-duration.status-5{border-left-color:#0b58a2}.wp-duration .icon-comment{color:#ccc}.wp-duration .icon-comment.with-comment{color:#000}.left{flex:0 0 35px;overflow:hidden;display:flex;flex-direction:column;padding-left:8px;border-left:solid #fff thin}.total{margin-left:auto;font-size:1.4em;font-weight:700;padding-right:.5em}.total em{font-size:.5em;font-weight:100;line-height:2em}[class*=icon-]{text-align:center}.icon-trash,.icon-edit{cursor:pointer;text-align:center}.icon-trash:hover,.icon-edit:hover{background:#0b58a2;color:#fff}.ui-timechooser[data-v-755f0c71]{background:white;border:solid 1px #ddd;max-width:450px;margin:0 auto}.ui-timechooser .percents[data-v-755f0c71]{border-bottom:1px solid #ddd;display:flex}.ui-timechooser .percents span[data-v-755f0c71]{flex:1 1 auto;padding:2px 4px;text-align:center;font-size:2em;cursor:pointer}.ui-timechooser .percents span[data-v-755f0c71]:hover,.ui-timechooser .percents span.selected[data-v-755f0c71]{background-color:#0b58a2;color:#fff}.ui-timechooser .hours[data-v-755f0c71]{font-size:48px;text-align:center;font-weight:700;display:flex;justify-items:center;justify-content:center;font-size:2em}.ui-timechooser .hours .sel[data-v-755f0c71]{border:thin solid #ddd;padding:0;display:flex;flex-direction:column}.ui-timechooser .hours .sel i[data-v-755f0c71]{font-size:1em;cursor:pointer;text-shadow:0 0 4px rgba(0,0,0,.1)}.ui-timechooser .hours .sel i[data-v-755f0c71]:hover{background:#5c9ccc;color:#fff}.ui-timechooser .hours .separator[data-v-755f0c71]{color:red}.repport-item .icon-attention-circled{display:none}.repport-item.excess{color:#900;border-left:4px solid red}.repport-item.excess .icon-attention-circled{display:inline-block}.interaction-off{cursor:default;pointer-events:none}.interactive-icon-big{font-size:32px;cursor:pointer}.card.locked,.card.closed{opacity:.7}.card.locked .week-header,.card.closed .week-header{cursor:default}.card.closed{opacity:.4}.card.closed .week-header{cursor:default}article.wp{font-size:1.2em}article.wp h3{font-size:1.2em;margin:0;padding:0}.has-titled-error{color:#8b0000;cursor:help}.menu-wps{box-shadow:0 0 1em #0000004d;font-size:12px;margin:0;padding:0}.menu-wps>li{cursor:pointer;display:flex;transition:background-color .5s ease-out;border-bottom:thin solid rgba(0,0,0,.4);padding:2px 4px;text-shadow:-1px 1px 0 rgba(0,0,0,.1)}.menu-wps>li .icon-angle-right{color:#fff;position:relative;left:-25px;opacity:0;transition:left .3s ease-out,opacity .5s ease-out;margin-left:auto}.menu-wps>li .acronym{font-weight:700}.menu-wps>li .acronym:after{content:":"}.menu-wps>li:hover,.menu-wps>li.selected{background:#0b58a2;color:#fff}.menu-wps>li:hover .icon-angle-right,.menu-wps>li.selected .icon-angle-right{left:0;opacity:1}.daymenu{position:fixed;background:white;z-index:100}.daymenu .selector{display:flex}.month-header{display:flex;line-height:30px;justify-content:center;justify-items:center}.month-header strong{font-weight:100;display:block;text-align:center;flex:0 0 14.285714286%;background:#efefef;color:#5c9ccc;border-left:solid thin #fff}.periode{display:flex;justify-content:flex-start}.periode strong{display:inline-block;width:10em;text-align:center}.week{border:solid 2px #fff;margin:2px 0}.week .days{background-image:url(/images/bg-lock.gif)}.week .days .day{background:#efefef}.week.selected{background:rgba(128,183,236,.25);border-color:#80b7ec;box-shadow:0 -4px 4px #0003}.week.selected .week-header{background-color:#80b7ec;color:#fff}.week.selected .week-header span{text-shadow:-1px 1px 0 rgba(0,0,0,.2)}.week.selected .day{border-color:#80b7ec}.week .day.error{background:#dd1144!important}.heure-total{display:inline-block;width:5em}.week-header,.month-header .week-header{background-color:#ffffff80;align-items:center;cursor:pointer;display:flex;text-align:left;font-size:1em;padding:0 .8em;justify-content:space-between}.week-header span,.month-header .week-header span{font-weight:700;flex:1}.week-header small.subtotal,.month-header .week-header small.subtotal{flex:0}.week-header small,.month-header .week-header small{justify-self:flex-end;flex:1;text-align:right;margin-left:auto}.week-header small em,.month-header .week-header small em{color:#5c646c}.table-recap.table-bordered{font-size:.7em}.table-recap.table-bordered h2,.table-recap.table-bordered h3{font-size:1.25em;margin:0}.table-recap.table-bordered th{font-weight:400}.table-recap.table-bordered th.total{text-align:right;font-weight:700;font-size:1.1em}.table-recap.table-bordered thead th:nth-child(odd){background-color:#efefef}.table-recap.table-bordered td:nth-child(odd){background-color:#efefef}.table-recap.table-bordered thead th{text-align:center}.table-recap.table-bordered tr td{text-align:right}.table-recap.table-bordered tr th,.table-recap.table-bordered tr td{padding:2px}.days{display:flex}.days .day{position:relative;background:rgba(255,255,255,.25);transition:background-color linear .3s;border:thin solid white;flex:0 0 14.285714286%;overflow:hidden;cursor:pointer;min-height:50px}.days .day .label{position:absolute;bottom:0;right:0;display:block;font-size:12px;text-align:right;text-shadow:-1px 1px 1px rgba(255,255,255,.3);color:#787171}.days .day .cartouche em{max-width:3em;overflow:hidden;display:inline-block;white-space:nowrap}.days .day:hover{background:white}.days .day.selected{background:#5c9ccc}.days .day.locked{cursor:not-allowed;background:rgba(204,204,204,.8)}.week:first-child .days{justify-content:flex-end}.week:last-child .days{justify-content:flex-start}
diff --git a/public/js/oscar/vite/dist/assets/TimesheetDeclaration-da0c6213.css b/public/js/oscar/vite/dist/assets/TimesheetDeclaration-da0c6213.css
new file mode 100644
index 0000000000000000000000000000000000000000..2180ed8bb6b9e8b3b0575f572a2ff76f5d7573b0
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/TimesheetDeclaration-da0c6213.css
@@ -0,0 +1 @@
+@charset "UTF-8";.cartouche[data-v-45fb2e96]{white-space:nowrap;margin:0;border-radius:2px;box-shadow:none;font-size:.75em}.cartouche.training[data-v-45fb2e96]{background-color:#0b58a2}.cartouche.sickleave[data-v-45fb2e96]{background-color:olive}.cartouche.wp[data-v-45fb2e96]{background-color:#6a5999}.cartouche.conflict[data-v-45fb2e96]{background:#AA0000}.timesheet-item[data-v-c5ac47ec]{background:#e3e6e8;cursor:pointer;border:thin #5c6970 solid;margin:.3em 0;font-size:1em;display:flex;position:relative;transition:all .3s}.timesheet-item>*[data-v-c5ac47ec]{padding:.3em .5em}.timesheet-item .project-acronym[data-v-c5ac47ec]{transition:all .3s;position:relative;display:inline-block;padding-right:.8em;padding-left:.8em;color:#abb5ba;background:#5c6970;text-shadow:-1px 1px 0 rgba(0,0,0,.3);font-weight:700}.timesheet-item .project-acronym[data-v-c5ac47ec]:before{transition:all .3s;content:" ";width:1em;height:1em;background:rgba(255,255,255,0);transform:rotate(45deg);position:absolute;left:-.6em;top:.6em;z-index:10000}.timesheet-item .activity-label[data-v-c5ac47ec]{transition:all .3s;position:relative;display:inline-block;padding-left:1em;padding-right:1em;background:#abb5ba;color:#171a1c;font-size:.8em;line-height:2em}.timesheet-item .activity-label[data-v-c5ac47ec]:before{transition:all .3s;content:" ";width:1.2em;height:1.2em;background:#5c6970;transform:rotate(45deg);position:absolute;left:-.6em;top:.6em;z-index:10000}.timesheet-item .workpackage-infos[data-v-c5ac47ec]{transition:all .3s;position:relative;padding-left:1em}.timesheet-item .workpackage-infos[data-v-c5ac47ec]:before{transition:all .3s;content:" ";width:1em;height:1em;background:#abb5ba;transform:rotate(45deg);position:absolute;left:-.6em;top:.5em;z-index:10000}.timesheet-item.selected[data-v-c5ac47ec],.timesheet-item[data-v-c5ac47ec]:hover{background:white;border:thin #0088cc solid;color:#08c}.timesheet-item.selected .project-acronym[data-v-c5ac47ec],.timesheet-item:hover .project-acronym[data-v-c5ac47ec]{color:#9df;background:#0088cc}.timesheet-item.selected .activity-label[data-v-c5ac47ec],.timesheet-item:hover .activity-label[data-v-c5ac47ec]{background:#66ccff;color:#023}.timesheet-item.selected .activity-label[data-v-c5ac47ec]:before,.timesheet-item:hover .activity-label[data-v-c5ac47ec]:before{background:#0088cc}.timesheet-item.selected .workpackage-infos[data-v-c5ac47ec]:before,.timesheet-item:hover .workpackage-infos[data-v-c5ac47ec]:before{background:#66ccff}.timesheet-item.horslots-item .workpackage-infos[data-v-c5ac47ec]{flex:1}.timesheet-item.horslots-item .activity-label[data-v-c5ac47ec]:before{content:none}.timesheet-item.horslots-item .workpackage-infos[data-v-c5ac47ec]:before{background:#5c6970;top:.8em}.timesheet-item.horslots-item.selected .workpackage-infos[data-v-c5ac47ec]:before,.timesheet-item.horslots-item:hover .workpackage-infos[data-v-c5ac47ec]:before{background:#0088cc}.timesheet-item.selected[data-v-c5ac47ec]{box-shadow:.25em 0 .5em #08cc}.timesheet-item.selected .project-acronym[data-v-c5ac47ec]:before{background:white}.wp-duration{display:flex;border-bottom:thin solid white;align-items:center}.wp-duration strong small{font-weight:100}.wp-duration[class*=status-]{border-left:solid 4px #ddd}.wp-duration.status-5{border-left-color:#0b58a2}.wp-duration .icon-comment{color:#ccc}.wp-duration .icon-comment.with-comment{color:#000}.left{flex:0 0 35px;overflow:hidden;display:flex;flex-direction:column;padding-left:8px;border-left:solid #fff thin}.total{margin-left:auto;font-size:1.4em;font-weight:700;padding-right:.5em}.total em{font-size:.5em;font-weight:100;line-height:2em}[class*=icon-]{text-align:center}.icon-trash,.icon-edit{cursor:pointer;text-align:center}.icon-trash:hover,.icon-edit:hover{background:#0b58a2;color:#fff}.ui-timechooser[data-v-755f0c71]{background:white;border:solid 1px #ddd;max-width:450px;margin:0 auto}.ui-timechooser .percents[data-v-755f0c71]{border-bottom:1px solid #ddd;display:flex}.ui-timechooser .percents span[data-v-755f0c71]{flex:1 1 auto;padding:2px 4px;text-align:center;font-size:2em;cursor:pointer}.ui-timechooser .percents span[data-v-755f0c71]:hover,.ui-timechooser .percents span.selected[data-v-755f0c71]{background-color:#0b58a2;color:#fff}.ui-timechooser .hours[data-v-755f0c71]{font-size:48px;text-align:center;font-weight:700;display:flex;justify-items:center;justify-content:center;font-size:2em}.ui-timechooser .hours .sel[data-v-755f0c71]{border:thin solid #ddd;padding:0;display:flex;flex-direction:column}.ui-timechooser .hours .sel i[data-v-755f0c71]{font-size:1em;cursor:pointer;text-shadow:0 0 4px rgba(0,0,0,.1)}.ui-timechooser .hours .sel i[data-v-755f0c71]:hover{background:#5c9ccc;color:#fff}.ui-timechooser .hours .separator[data-v-755f0c71]{color:red}.repport-item .icon-attention-circled{display:none}.repport-item.excess{color:#900;border-left:4px solid red}.repport-item.excess .icon-attention-circled{display:inline-block}.interaction-off{cursor:default;pointer-events:none}.interactive-icon-big{font-size:32px;cursor:pointer}.card.locked,.card.closed{opacity:.7}.card.locked .week-header,.card.closed .week-header{cursor:default}.card.closed{opacity:.4}.card.closed .week-header{cursor:default}article.wp{font-size:1.2em}article.wp h3{font-size:1.2em;margin:0;padding:0}.has-titled-error{color:#8b0000;cursor:help}.menu-wps{box-shadow:0 0 1em #0000004d;font-size:12px;margin:0;padding:0}.menu-wps>li{cursor:pointer;display:flex;transition:background-color .5s ease-out;border-bottom:thin solid rgba(0,0,0,.4);padding:2px 4px;text-shadow:-1px 1px 0 rgba(0,0,0,.1)}.menu-wps>li .icon-angle-right{color:#fff;position:relative;left:-25px;opacity:0;transition:left .3s ease-out,opacity .5s ease-out;margin-left:auto}.menu-wps>li .acronym{font-weight:700}.menu-wps>li .acronym:after{content:":"}.menu-wps>li:hover,.menu-wps>li.selected{background:#0b58a2;color:#fff}.menu-wps>li:hover .icon-angle-right,.menu-wps>li.selected .icon-angle-right{left:0px;opacity:1}.daymenu{position:fixed;background:white;z-index:100}.daymenu .selector{display:flex}.month-header{display:flex;line-height:30px;justify-content:center;justify-items:center}.month-header strong{font-weight:100;display:block;text-align:center;flex:0 0 14.285714286%;background:#efefef;color:#5c9ccc;border-left:solid thin #fff}.periode{display:flex;justify-content:flex-start}.periode strong{display:inline-block;width:10em;text-align:center}.week{border:solid 2px #fff;margin:2px 0}.week .days{background-image:url(/images/bg-lock.gif)}.week .days .day{background:#efefef}.week.selected{background:rgba(128,183,236,.25);border-color:#80b7ec;box-shadow:0 -4px 4px #0003}.week.selected .week-header{background-color:#80b7ec;color:#fff}.week.selected .week-header span{text-shadow:-1px 1px 0 rgba(0,0,0,.2)}.week.selected .day{border-color:#80b7ec}.week .day.error{background:#dd1144!important}.heure-total{display:inline-block;width:5em}.week-header,.month-header .week-header{background-color:#ffffff80;align-items:center;cursor:pointer;display:flex;text-align:left;font-size:1em;padding:0 .8em;justify-content:space-between}.week-header span,.month-header .week-header span{font-weight:700;flex:1}.week-header small.subtotal,.month-header .week-header small.subtotal{flex:0}.week-header small,.month-header .week-header small{justify-self:flex-end;flex:1;text-align:right;margin-left:auto}.week-header small em,.month-header .week-header small em{color:#5c646c}.table-recap.table-bordered{font-size:.7em}.table-recap.table-bordered h2,.table-recap.table-bordered h3{font-size:1.25em;margin:0}.table-recap.table-bordered th{font-weight:400}.table-recap.table-bordered th.total{text-align:right;font-weight:700;font-size:1.1em}.table-recap.table-bordered thead th:nth-child(odd){background-color:#efefef}.table-recap.table-bordered td:nth-child(odd){background-color:#efefef}.table-recap.table-bordered thead th{text-align:center}.table-recap.table-bordered tr td{text-align:right}.table-recap.table-bordered tr th,.table-recap.table-bordered tr td{padding:2px}.days{display:flex}.days .day{position:relative;background:rgba(255,255,255,.25);transition:background-color linear .3s;border:thin solid white;flex:0 0 14.285714286%;overflow:hidden;cursor:pointer;min-height:50px}.days .day .label{position:absolute;bottom:0;right:0;display:block;font-size:12px;text-align:right;text-shadow:-1px 1px 1px rgba(255,255,255,.3);color:#787171}.days .day .cartouche em{max-width:3em;overflow:hidden;display:inline-block;white-space:nowrap}.days .day:hover{background:white}.days .day.selected{background:#5c9ccc}.days .day.locked{cursor:not-allowed;background:rgba(204,204,204,.8)}.week:first-child .days{justify-content:flex-end}.week:last-child .days{justify-content:flex-start}
diff --git a/public/js/oscar/vite/dist/assets/TimesheetPersonResume-9b0a7e87.css b/public/js/oscar/vite/dist/assets/TimesheetPersonResume-9b0a7e87.css
deleted file mode 100644
index 09d8d801c41eeeb1d69d0299254798fa1baed6d8..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/TimesheetPersonResume-9b0a7e87.css
+++ /dev/null
@@ -1 +0,0 @@
-.table{font-size:.9em;td {border: 0;}}.table td .table,.table th .table{background:rgba(255,255,255,.5)!important;border-left:none}.table .table tr:nth-child(2n){background-color:#ffffff80!important}.table tfoot{background-color:#738ccc33!important}.table tr .soustotal{display:table-cell;vertical-align:bottom!important}.table tbody th{white-space:nowrap;font-weight:400}tr.line-total{background:rgba(31,68,192,.1);border-top:1px solid #333333;border-left:none;font-size:1.1em}.table .table{border-width:thin;tr {border-left-width: thin;} th,td {border-left: none; border-right: solid thin #eee; padding: 2px;}}tr.line-total th{font-weight:400}.commentaires .commentaire{display:block;font-size:.9em}.declarations-resume{thead th {text-align: center; background: #0b93d5;} .yearrow {background: rgba(255,255,255,.8);} .icon-time {display: none;} .valid-95 {.icon-time {display: inline-block; color: #00cc66; &:before {content: "";}}} tbody tr {border-left: solid 4px #eee;} .valid-105 {.icon-time {display: inline-block; color: #3fd53f; &:before {content: "";}}} .error-95 {.icon-time {display: inline-block; color: #970000; &:before {content: "";}}} .error-105 {.icon-time {display: inline-block; color: #9e0505; &:before {content: "";}}} .valid-100 {.icon-time {display: inline-block; color: #00AA00;}} tr.optionnal {border-left-color: #5a5a5a;} tr.conflict {border-left-color: #CC0000; background: rgba(#990000,.1);} tr.validated {border-left-color: #00AA00; background: rgba(#00AA00,.1);} tr.validating {border-left-color: #0b93d5; background: rgba(#0b93d5,.1);}}.declarations-resume .heading-year th{font-size:2em;text-align:right}
diff --git a/public/js/oscar/vite/dist/assets/TimesheetPersonResume-b4a958be.css b/public/js/oscar/vite/dist/assets/TimesheetPersonResume-b4a958be.css
new file mode 100644
index 0000000000000000000000000000000000000000..41af3d5a65132d6a869e5cea25e6785268489723
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/TimesheetPersonResume-b4a958be.css
@@ -0,0 +1 @@
+.table{font-size:.9em;td {border: 0;}}.table td .table,.table th .table{background:rgba(255,255,255,.5)!important;border-left:none}.table .table tr:nth-child(even){background-color:#ffffff80!important}.table tfoot{background-color:#738ccc33!important}.table tr .soustotal{display:table-cell;vertical-align:bottom!important}.table tbody th{white-space:nowrap;font-weight:400}tr.line-total{background:rgba(31,68,192,.1);border-top:1px solid #333333;border-left:none;font-size:1.1em}.table .table{border-width:thin;tr {border-left-width: thin;} th,td {border-left: none; border-right: solid thin #eee; padding: 2px;}}tr.line-total th{font-weight:400}.commentaires .commentaire{display:block;font-size:.9em}.declarations-resume{.heading-year th {font-size: 2em; text-align: right;} thead th {text-align: center; background: #0b93d5;} .yearrow {background: rgba(255,255,255,.8);} .icon-time {display: none;} .valid-95 {.icon-time {display: inline-block; color: #00cc66; &:before {content: "\e840";}}} tbody tr {border-left: solid 4px #eee;} .valid-105 {.icon-time {display: inline-block; color: #3fd53f; &:before {content: "\e843";}}} .error-95 {.icon-time {display: inline-block; color: #970000; &:before {content: "\e840";}}} .error-105 {.icon-time {display: inline-block; color: #9e0505; &:before {content: "\e843";}}} .valid-100 {.icon-time {display: inline-block; color: #00AA00;}} tr.optionnal {border-left-color: #5a5a5a;} tr.conflict {border-left-color: #CC0000; background: rgba(#990000,.1);} tr.validated {border-left-color: #00AA00; background: rgba(#00AA00,.1);} tr.validating {border-left-color: #0b93d5; background: rgba(#0b93d5,.1);}}
diff --git a/public/js/oscar/vite/dist/assets/activity-60e009f3.js b/public/js/oscar/vite/dist/assets/activity-60e009f3.js
deleted file mode 100644
index d7cc8ef73b8342fc9f2a97d83b2fd658db30bd39..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/activity-60e009f3.js
+++ /dev/null
@@ -1 +0,0 @@
-import{r as D,o as l,c as i,a as r,t as u,b as g,w,v as E,d as t,e as J,f as R,g as d,h,n as C,F as b,i as P,j as _,k as x,l as z,m as V,p as A,T as U,q as ee,s as te,S as se,u as ne,x as le,y as ie}from"../vendor.js";import{m as H}from"../vendor2.js";import{f as oe}from"../vendor3.js";import{m as re}from"../vendor4.js";import{M as G}from"../vendor5.js";import{D as T,P as ae}from"../vendor6.js";import{_ as S}from"../vendor7.js";import{A as W}from"../vendor8.js";import{O as de}from"../vendor9.js";import{A as ue}from"../vendor10.js";import{A as me}from"../vendor11.js";import{A as ce}from"../vendor12.js";import{A as pe}from"../vendor13.js";import{A as j}from"../vendor14.js";import{E as fe}from"../vendor15.js";import{g as O}from"../vendor16.js";import{L as ve}from"../vendor17.js";import{P as K}from"../vendor18.js";import{t as he}from"../vendor19.js";import"../vendor20.js";const ge={name:"AvenantDate",emits:["update:change"],props:["change"],computed:{date:{get(){return this.change.value},set(s){this.change.value=s,this.$emit("update:change",change)}}},components:{Datepicker:T}};function ye(s,e,a,k,n,o){const y=D("Datepicker");return l(),i("div",null,[r(u(a.change.label)+" : ",1),g(y,{modelValue:o.date,"onUpdate:modelValue":e[0]||(e[0]=v=>o.date=v)},null,8,["modelValue"])])}const ke=S(ge,[["render",ye]]),be={props:{modelValue:Number},data(){return{isEditing:!1,rawValue:"",formattedValue:""}},computed:{displayValue:{get(){return this.isEditing?this.rawValue:this.formattedValue},set(s){this.rawValue=s}}},watch:{modelValue:{immediate:!0,handler(s){this.isEditing||(this.formattedValue=this.formatCurrency(s),this.rawValue=(s??"").toString().replace(".",","))}}},methods:{formatCurrency(s){return new Intl.NumberFormat("fr-FR",{style:"currency",currency:"EUR",minimumFractionDigits:2}).format(s)},startEditing(){this.isEditing=!0,this.rawValue=(this.modelValue??"").toString().replace(".",",")},finishEditing(){this.isEditing=!1;let s=parseFloat(this.rawValue.replace(",","."))||0;this.$emit("update:modelValue",s)},updateRawValue(s){this.rawValue=s.target.value}}};function De(s,e,a,k,n,o){return w((l(),i("input",{type:"text","onUpdate:modelValue":e[0]||(e[0]=y=>o.displayValue=y),onFocus:e[1]||(e[1]=(...y)=>o.startEditing&&o.startEditing(...y)),onBlur:e[2]||(e[2]=(...y)=>o.finishEditing&&o.finishEditing(...y)),onInput:e[3]||(e[3]=(...y)=>o.updateRawValue&&o.updateRawValue(...y)),class:"form-control text-right"},null,544)),[[E,o.displayValue]])}const _e=S(be,[["render",De]]);const we={name:"ButtonConfirm",props:{class:{type:String,default:"btn btn-default"},checkbox:{type:Boolean,default:!1}},data(){return{modal:!1,checked:!1}},computed:{confirmEnabled(){return this.checkbox&&this.checked||this.checkbox===!1}},watch:{modal(s){this.checked=!1}},methods:{handlerClick(){this.$emit("click")},handlerCancel(){this.modal=!1,this.$emit("cancel")},handlerConfirm(){this.confirmEnabled&&(this.modal=!1,this.$emit("confirm"))}},activated(){console.log("ButtonConfirm activated")}},Ce={key:0,class:"overlay confirm-dialog"},Pe={class:"overlay-content"},Ae={class:"overlay-message"},Ue={key:0},Se={for:"confirm_ok",class:"checkbox"};function Me(s,e,a,k,n,o){return l(),i(b,null,[n.modal?(l(),i("div",Ce,[t("div",Pe,[t("h3",null,[e[5]||(e[5]=t("i",{class:"icon-attention-1"},null,-1)),J(s.$slots,"title",{},()=>[e[4]||(e[4]=r(" Confirmer ? "))],!0)]),t("div",Ae,[J(s.$slots,"message",{},()=>[e[6]||(e[6]=r(" Voulez-vous continuer ? "))],!0)]),a.checkbox?(l(),i("div",Ue,[t("label",Se,[w(t("input",{type:"checkbox",id:"confirm_ok","onUpdate:modelValue":e[0]||(e[0]=y=>n.checked=y)},null,512),[[R,n.checked]]),e[7]||(e[7]=r(" J'ai bien compris "))])])):d("",!0),t("nav",null,[t("a",{href:"#",onClick:e[1]||(e[1]=h((...y)=>o.handlerCancel&&o.handlerCancel(...y),["prevent"])),class:"btn btn-danger"},e[8]||(e[8]=[t("i",{class:"icon-block"},null,-1),r(" Annuler ")])),t("a",{href:"#",onClick:e[2]||(e[2]=h((...y)=>o.handlerConfirm&&o.handlerConfirm(...y),["prevent"])),class:C(["btn btn-success",{disabled:!o.confirmEnabled}])},e[9]||(e[9]=[t("i",{class:"icon-ok-circled"},null,-1),r(" Confirmer")]),2)])])])):d("",!0),t("a",{href:"#",class:C(a.class),onClick:e[3]||(e[3]=h(y=>n.modal=!0,["prevent"]))},[J(s.$slots,"default",{},()=>[e[10]||(e[10]=r("Texte par défaut"))],!0)],2)],64)}const Ee=S(we,[["render",Me],["__scopeId","data-v-efd4eea6"]]);const Ve={name:"ActivityAvenants",components:{ButtonConfirm:Ee,Amount:_e,AvenantDate:ke,Datepicker:T,Modal:G,OrganizationAutoComplete:de,PersonAutoCompleter:ae},props:["roles-person","roles-organization","currentPersons","currentOrganizations","avenants","manage"],data(){return{edit:null,selectedPerson:null}},computed:{modificationsEnabled(){return{personAdd:!0,personDel:!0,organizationAdd:!0,organizationDel:!0,changeAmount:!this.edit.modifications.find(s=>s.type=="changeAmount"),dateEnd:!this.edit.modifications.find(s=>s.type=="dateEnd")}},persons(){let s={};return this.currentPersons&&this.currentPersons.forEach(e=>{s.hasOwnProperty(e.enrolled)||(s[e.enrolled]={id:e.enrolled,firstName:e.firstName,lastName:e.lastName,roles:{}}),s[e.enrolled].hasOwnProperty(e.roleId)||(s[e.enrolled].roles[e.roleId]=e.roleLabel)}),s},organizations(){let s={};return this.currentOrganizations&&this.currentOrganizations.forEach(e=>{s.hasOwnProperty(e.enrolled)||(console.log(e),s[e.enrolled]={id:e.enrolled,label:e.enrolledLabel,roles:{}}),s[e.enrolled].hasOwnProperty(e.roleId)||(s[e.enrolled].roles[e.roleId]=e.roleLabel)}),s}},methods:{handlerConfirm(s,e,a){console.log("confirm",s),e.call(this,a)},handlerOk(s){console.log(JSON.stringify(s)),console.log(this.avenants.url_api)},handlerNew(){this.edit={id:null,dateAvenant:null,comment:"",previousFile:null,file:null,modifications:[]}},handlerEdit(s){this.edit={id:s.id,dateAvenant:s.date,comment:s.comment,previousFile:s.filename,file:null,modifications:JSON.parse(JSON.stringify(s.modifications))}},handlerCancel(){console.log("CANCEL"),this.edit=null},handlerSave(){let s=new FormData;s.append("id",this.edit.id??""),s.append("dateAvenant",this.edit.dateAvenant??""),s.append("comment",this.edit.comment??""),s.append("file",this.edit.file??""),s.append("modifications",this.edit.modifications?JSON.stringify(this.edit.modifications):"");let e="Mise à jour de l'avenant";this.edit.id?s.append("action","update"):(s.append("action","create"),e="Création de l'avenant"),W.post(this.avenants.url_api,s,{pendingMsg:e}).then(a=>{this.edit=null,this.fetch()})},handlerDelete(s){W.delete(s.url_api,{pendingMsg:"Suppression de l'avenant"}).then(e=>{this.fetch()})},handlerApplyAvenant(s){console.log("Application de l'avenant");let e=new FormData;e.append("id",s.id),e.append("action","apply");let a="Application de l'avenant";W.post(this.avenants.url_api,e,{pendingMsg:a,pendingBack:!1}).then(k=>{document.location.reload()})},handlerAddChange(s){if(this.edit)switch(s){case"dateEnd":this.edit.modifications.push({type:s,mode:"new",label:"Date de fin",value1:new Date().toISOString()});break;default:this.edit.modifications.push({type:s,mode:"new",label:"A définir",value1:null,valueObj:null,value2:null})}},handlerRemoveChange(s){let e=this.edit.modifications.indexOf(s);e>=0&&this.edit.modifications.splice(e,1)},handlerUpdatePersonChange(s,e){s.valueObj={id:e.id,firstName:e.firstName,lastName:e.lastName},s.value1=e.id},handlerUpdateOrganizationChange(s,e){console.log(JSON.stringify(s)),s.valueObj={id:e.id,label:e.label},s.value1=e.id},handlerSelectToDel(s,e){console.log("Changement de la personne à supprimer",s,e),s.value1=s.valueObj.id,s.value2=null},async handlerSelectFile(s){if(s.target.files.length===0){this.edit.file=null;return}this.edit.file=s.target.files[0]},fetch(){W.get(this.avenants.url_api,{pendingMsg:"Chargement des avenants"}).then(s=>{this.$emit("update",s.data.datas.avenants)})}},mounted(){console.log("mounted")}},xe={action:""},Ne={class:"form-group"},je={class:"form-group"},Oe={class:"btn-group"},ze={class:"dropdown-menu"},Re={class:"modifications unsaved"},Fe={class:"change"},Ie={key:0},We={key:1},Te={key:2},qe=["onUpdate:modelValue","onChange"],Le=["value"],Je=["onUpdate:modelValue"],He=["value"],Be={key:3},Ye={key:0,class:"cartouche"},Ge=["onClick"],Ke=["onUpdate:modelValue"],Xe=["value"],Qe={key:4},Ze=["onUpdate:modelValue","onChange"],$e=["value"],et=["onUpdate:modelValue"],tt=["value"],st={key:5},nt=["onUpdate:modelValue"],lt=["value"],it={key:6},ot=["onClick"],rt={class:"modifications saved"},at={class:"change"},dt={key:0,class:"icon-calendar"},ut={key:1,class:"icon-user"},mt={key:2,class:"icon-bank"},ct={key:3,class:"icon-user text-danger"},pt={key:4,class:"icon-building-filled"},ft={key:5,class:"icon-building-filled text-danger"},vt=["onClick"],ht={class:"form-group"},gt={key:0},yt={class:"form-group"},kt={class:"avenants"},bt={class:"admin-bar text-right"},Dt={key:0,class:"icon-ok-circled text-success"},_t={key:1,class:"icon-pencil"},wt={class:"modification small"},Ct={class:"change"},Pt={key:0,class:"icon-calendar"},At={key:1,class:"icon-user"},Ut={key:2,class:"icon-user text-danger"},St={key:3,class:"icon-bank"},Mt={key:4,class:"icon-building-filled"},Et={key:5,class:"icon-building-filled text-danger"},Vt={key:0},xt=["href"],Nt=["onClick"];function jt(s,e,a,k,n,o){const y=D("datepicker"),v=D("Datepicker"),c=D("Amount"),M=D("person-auto-completer"),q=D("organization-auto-complete"),L=D("modal"),I=D("ButtonConfirm");return l(),i(b,null,[g(L,{title:"Détails de l'avenant",visible:n.edit,onModalValid:o.handlerSave,onModalCancel:o.handlerCancel},{default:P(()=>[t("form",xe,[e[32]||(e[32]=t("div",{class:"alert alert-info"},[r(" Vous pourrez revenir modifier cet avenant plus tard tant qu'il est en mode "),t("strong",null,"brouillon"),r(". ")],-1)),t("div",Ne,[e[16]||(e[16]=t("label",{for:"dateAvenant"},"Date : ",-1)),e[17]||(e[17]=t("div",{class:"help"},[r(" Date de "),t("strong",null,"signature"),r(" de l'avenant ")],-1)),g(y,{modelValue:n.edit.dateAvenant,"onUpdate:modelValue":e[0]||(e[0]=m=>n.edit.dateAvenant=m),id:"dateAvenant"},null,8,["modelValue"])]),t("div",je,[e[27]||(e[27]=t("label",{for:"name",class:""},"Modifications : ",-1)),e[28]||(e[28]=t("br",null,null,-1)),t("div",Oe,[e[18]||(e[18]=t("button",{type:"button",class:"btn btn-default dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},[r(" Ajouter une modification "),t("span",{class:"caret"})],-1)),t("ul",ze,[t("li",null,[t("a",{href:"#",onClick:e[1]||(e[1]=h(m=>o.handlerAddChange("personAdd"),["prevent"])),class:C(o.modificationsEnabled.personAdd?"":"disabled")},"Ajout d'une personne",2)]),t("li",null,[t("a",{href:"#",onClick:e[2]||(e[2]=h(m=>o.handlerAddChange("personDel"),["prevent"])),class:C(o.modificationsEnabled.personDel?"":"disabled")},"Suppression d'une personne",2)]),t("li",null,[t("a",{href:"#",onClick:e[3]||(e[3]=h(m=>o.handlerAddChange("organizationAdd"),["prevent"])),class:C(o.modificationsEnabled.organizationAdd?"":"disabled")},"Ajout d'une organisation",2)]),t("li",null,[t("a",{href:"#",onClick:e[4]||(e[4]=h(m=>o.handlerAddChange("organizationDel"),["prevent"])),class:C(o.modificationsEnabled.organizationDel?"":"disabled")},"Suppression d'une organisation",2)]),t("li",null,[t("a",{href:"#",onClick:e[5]||(e[5]=h(m=>o.handlerAddChange("changeAmount"),["prevent"])),class:C(o.modificationsEnabled.changeAmount?"":"disabled")},"Modification du montant",2)]),t("li",null,[t("a",{href:"#",onClick:e[6]||(e[6]=h(m=>o.handlerAddChange("dateEnd"),["prevent"])),class:C(o.modificationsEnabled.dateEnd?"":"disabled")},"Modification de la date de fin",2)])])]),t("section",Re,[(l(!0),i(b,null,_(n.edit.modifications.filter(m=>m.mode==="new"),m=>(l(),i("article",Fe,[m.type==="dateEnd"?(l(),i("div",Ie,[e[19]||(e[19]=t("span",{class:"text"}," Date de fin : ",-1)),t("span",null,[g(v,{modelValue:m.value1,"onUpdate:modelValue":f=>m.value1=f},null,8,["modelValue","onUpdate:modelValue"])])])):m.type==="changeAmount"?(l(),i("div",We,[e[20]||(e[20]=t("span",{class:"text"},"Nouveau montant : ",-1)),g(c,{modelValue:m.value1,"onUpdate:modelValue":f=>m.value1=f},null,8,["modelValue","onUpdate:modelValue"])])):m.type==="personDel"?(l(),i("div",Te,[e[21]||(e[21]=t("span",{class:"text"},"Suppression d'un membre",-1)),w(t("select",{name:"",id:"",onClick:e[7]||(e[7]=h(()=>{},["stop"])),"onUpdate:modelValue":f=>m.valueObj=f,onChange:f=>o.handlerSelectToDel(m,f)},[(l(!0),i(b,null,_(o.persons,(f,N)=>(l(),i("option",{value:f},u(f.firstName)+" "+u(f.lastName),9,Le))),256))],40,qe),[[x,m.valueObj]]),m.valueObj?w((l(),i("select",{key:0,name:"",id:"",onClick:e[8]||(e[8]=h(()=>{},["stop"])),"onUpdate:modelValue":f=>m.value2=f},[(l(!0),i(b,null,_(m.valueObj.roles,(f,N)=>(l(),i("option",{value:N},u(f),9,He))),256))],8,Je)),[[x,m.value2]]):d("",!0)])):m.type==="personAdd"?(l(),i("div",Be,[e[22]||(e[22]=t("span",{class:"text"}," Ajout d'une personne : ",-1)),m.valueObj?(l(),i("span",Ye,[r(u(m.valueObj.firstName)+" "+u(m.valueObj.lastName)+" ",1),t("i",{class:"icon-cancel-alt",onClick:f=>m.valueObj=null},null,8,Ge)])):(l(),z(M,{key:1,onPersonSelected:f=>o.handlerUpdatePersonChange(m,f)},null,8,["onPersonSelected"])),w(t("select",{name:"rolesPerson","onUpdate:modelValue":f=>m.value2=f,class:"form-control",onClick:e[9]||(e[9]=h(()=>{},["stop"]))},[(l(!0),i(b,null,_(s.rolesPerson,f=>(l(),i("option",{value:f.id},u(f.label),9,Xe))),256))],8,Ke),[[x,m.value2]])])):m.type==="organizationDel"?(l(),i("div",Qe,[e[23]||(e[23]=t("span",{class:"text"}," Suppression d'une organisation : ",-1)),w(t("select",{name:"",id:"",onClick:e[10]||(e[10]=h(()=>{},["stop"])),"onUpdate:modelValue":f=>m.valueObj=f,class:"form-control",onChange:f=>o.handlerSelectToDel(m,f)},[(l(!0),i(b,null,_(o.organizations,(f,N)=>(l(),i("option",{value:f},u(f.label),9,$e))),256))],40,Ze),[[x,m.valueObj]]),m.valueObj?w((l(),i("select",{key:0,name:"",id:"",onClick:e[11]||(e[11]=h(()=>{},["stop"])),"onUpdate:modelValue":f=>m.value2=f,class:"form-control"},[(l(!0),i(b,null,_(m.valueObj.roles,(f,N)=>(l(),i("option",{value:N},u(f),9,tt))),256))],8,et)),[[x,m.value2]]):d("",!0)])):m.type==="organizationAdd"?(l(),i("div",st,[e[24]||(e[24]=t("span",{class:"text"}," Ajout d'une organization : ",-1)),g(q,{onChange:f=>o.handlerUpdateOrganizationChange(m,f)},null,8,["onChange"]),w(t("select",{name:"rolesOrganization","onUpdate:modelValue":f=>m.value2=f,class:"form-control",onClick:e[12]||(e[12]=h(()=>{},["stop"]))},[(l(!0),i(b,null,_(s.rolesOrganization,f=>(l(),i("option",{value:f.id},u(f.label),9,lt))),256))],8,nt),[[x,m.value2]])])):(l(),i("div",it,u(m),1)),t("nav",null,[t("button",{class:"btn btn-xs btn-danger",onClick:h(f=>o.handlerRemoveChange(m),["prevent"])},e[25]||(e[25]=[t("i",{class:"icon-trash"},null,-1)]),8,ot)])]))),256))]),e[29]||(e[29]=t("hr",null,null,-1)),t("section",rt,[(l(!0),i(b,null,_(n.edit.modifications.filter(m=>m.mode!=="new"),m=>(l(),i("article",at,[t("div",null,[m.type==="dateEnd"?(l(),i("i",dt)):d("",!0),m.type==="personAdd"?(l(),i("i",ut)):d("",!0),m.type==="changeAmount"?(l(),i("i",mt)):d("",!0),m.type==="personDel"?(l(),i("i",ct)):d("",!0),m.type==="organizationAdd"?(l(),i("i",pt)):d("",!0),m.type==="organizationDel"?(l(),i("i",ft)):d("",!0),t("strong",null,u(m.info),1),t("small",null,[t("code",null," ("+u(m.type)+")",1)])]),t("nav",null,[t("button",{class:"btn btn-xs btn-danger",onClick:h(f=>o.handlerRemoveChange(m),["prevent"])},e[26]||(e[26]=[t("i",{class:"icon-trash"},null,-1)]),8,vt)])]))),256))])]),t("div",ht,[e[30]||(e[30]=t("label",{for:"name"},"Fichier",-1)),n.edit.previousFile?(l(),i("section",gt," Fichier précédent ")):d("",!0),t("input",{class:"form-control",type:"file",onChange:e[13]||(e[13]=(...m)=>o.handlerSelectFile&&o.handlerSelectFile(...m))},null,32)]),t("div",yt,[e[31]||(e[31]=t("label",{for:"name"},"Commentaire",-1)),w(t("textarea",{"onUpdate:modelValue":e[14]||(e[14]=m=>n.edit.comment=m),class:"form-control"},null,512),[[E,n.edit.comment]])])])]),_:1},8,["visible","onModalValid","onModalCancel"]),t("section",kt,[t("nav",bt,[a.manage?(l(),i("button",{key:0,class:"btn btn-xs btn-default",onClick:e[15]||(e[15]=(...m)=>o.handlerNew&&o.handlerNew(...m))}," Nouvel avenant ")):d("",!0)]),(l(!0),i(b,null,_(a.avenants.avenants,m=>(l(),i("article",{class:C(["avenant card","status-"+m.status])},[t("h4",null,[m.status==200?(l(),i("i",Dt)):d("",!0),m.status==100?(l(),i("i",_t)):d("",!0),t("strong",null,u(s.$filters.dateFull(m.date)),1),t("small",null," - "+u(m.status_text),1)]),t("section",wt,[(l(!0),i(b,null,_(m.modifications,f=>(l(),i("article",Ct,[f.type==="dateEnd"?(l(),i("i",Pt)):d("",!0),f.type==="personAdd"?(l(),i("i",At)):d("",!0),f.type==="personDel"?(l(),i("i",Ut)):d("",!0),f.type==="changeAmount"?(l(),i("i",St)):d("",!0),f.type==="organizationAdd"?(l(),i("i",Mt)):d("",!0),f.type==="organizationDel"?(l(),i("i",Et)):d("",!0),t("span",null,u(f.info),1)]))),256))]),m.comment?(l(),i("p",Vt,u(m.comment),1)):d("",!0),t("nav",null,[t("a",{href:m.url_download,class:"btn btn-xs btn-primary"},e[33]||(e[33]=[t("i",{class:"icon-file-pdf"},null,-1),r(" Télécharger")]),8,xt),a.manage?(l(),z(I,{key:0,onConfirm:f=>o.handlerDelete(m),class:C("btn btn-xs btn-danger"),checkbox:!0},{message:P(()=>e[34]||(e[34]=[r(" Supprimer "),t("strong",null,"définitivement",-1),r(" cet avenant ? ")])),default:P(()=>[e[35]||(e[35]=t("i",{class:"icon-trash"},null,-1)),e[36]||(e[36]=r(" Supprimer "))]),_:2},1032,["onConfirm"])):d("",!0),a.manage&&m.editable?(l(),i("a",{key:1,href:"#",class:"btn btn-xs btn-default",onClick:h(f=>o.handlerEdit(m),["prevent"])},e[37]||(e[37]=[t("i",{class:"icon-pencil"},null,-1),r(" Editer ")]),8,Nt)):d("",!0),m.status===100&&a.manage?(l(),z(I,{key:2,onConfirm:f=>o.handlerApplyAvenant(m),class:C("btn btn-xs btn-success")},{message:P(()=>e[38]||(e[38]=[r(" Confirmer l'application de l'avenant pour cette activité ? "),t("strong",null,"L'activité sera verrouillée",-1)])),default:P(()=>[e[39]||(e[39]=t("i",{class:"icon-trash"},null,-1)),e[40]||(e[40]=r(" Appliquer "))]),_:2},1032,["onConfirm"])):d("",!0)])],2))),256))])],64)}const Ot=S(Ve,[["render",jt],["__scopeId","data-v-833d8759"]]);const zt={props:{milestone:{required:!0},manage:{default:!1},progression:{default:!1}},computed:{finishedPerson(){let e=/\[Person:([0-9]*):(.*)\]/gm.exec(this.milestone.finishedBy);return e!==null?e[2]:""},statutText(){if(!this.milestone.type.finishable)return"";switch(this.milestone.finished){case 0:case null:return this.milestone.past?"EN RETARD":"A FAIRE";case 50:return"EN COURS";case 100:return"Validé";case 200:return"Sans suite";case 400:return"Refusé";default:return""}},owner(){return this.finishedPerson?finishedPerson[2]:"Unreadable data"},ownerId(){return this.finishedPerson?finishedPerson[1]:"Unreadble data"},finishable(){return this.progression&&this.milestone.validable&&this.milestone.type.finishable==!0&&this.milestone.finished<100},cancelFinish(){return this.progression&&this.milestone.validable&&this.milestone.type.finishable==!0&&this.milestone.finished>0},progressable(){return this.progression&&this.milestone.validable&&this.milestone.type.finishable==!0&&(this.milestone.finished==null||this.milestone.finished==0||this.milestone.finished==100)},inProgress(){return this.milestone.validable&&this.milestone.type.finishable==!0&&this.milestone.finished>0&&this.milestone.finished<100},finished(){return this.milestone.type.finishable==!0&&this.milestone.finished>=100},late(){return this.finishable==!0&&this.milestone.past&&!this.finished},past(){return this.milestone.past},cssClass(){let s={finishable:this.finishable,finished:this.finished||this.milestone.done,late:this.late||this.milestone.late,payment:this.milestone.isPayment,inprogress:this.inProgress,canceled:this.milestone.finished==200,refused:this.milestone.finished==400,valided:this.milestone.finished==100,past:this.past};return s[this.milestone.type.facet]=!0,s}}},Rt={class:"main"},Ft={key:0},It=["datetime"],Wt={class:"ago"},Tt={key:0},qt={key:0},Lt={key:1,class:"details"},Jt={key:2};function Ht(s,e,a,k,n,o){return l(),i("article",{class:C(["jalon",o.cssClass])},[t("span",Rt,[o.statutText?(l(),i("strong",Ft," "+u(o.statutText),1)):d("",!0),t("time",{datetime:a.milestone.dateStart,class:"time-value"},[r(u(s.$filters.date(a.milestone.dateStart))+" ",1),t("span",Wt," ("+u(s.$filters.timeAgo(a.milestone.dateStart))+") ",1)],8,It)]),t("strong",{class:C(["card-title",{"text-private":a.milestone.isPayment}])},[r(u(a.milestone.type.label)+" ",1),o.inProgress?(l(),i("small",Tt,[e[7]||(e[7]=r(" (En cours par ")),t("strong",null,u(o.finishedPerson),1),e[8]||(e[8]=r(")"))])):d("",!0)],2),o.finished?(l(),i("p",qt,[t("strong",null,u(o.finishedPerson),1),e[9]||(e[9]=r(" a complété ce jalon"))])):d("",!0),a.milestone.comment?(l(),i("p",Lt,u(a.milestone.comment),1)):d("",!0),a.milestone.isPayment?d("",!0):(l(),i("nav",Jt,[o.cancelFinish?(l(),i("a",{key:0,href:"#",title:"Réinitialiser la progression",onClick:e[0]||(e[0]=h(y=>s.$emit("unvalid",a.milestone),["prevent"]))},e[10]||(e[10]=[t("i",{class:"icon-rewind-outline"},null,-1)]))):d("",!0),o.progressable?(l(),i("a",{key:1,href:"#",title:"Marquer comme en cours",onClick:e[1]||(e[1]=h(y=>s.$emit("inprogress",a.milestone),["prevent"]))},e[11]||(e[11]=[t("i",{class:"icon-cw-outline"},null,-1)]))):d("",!0),o.finishable?(l(),i("a",{key:2,href:"#",title:"Marquer comme terminé",onClick:e[2]||(e[2]=h(y=>s.$emit("valid",a.milestone),["prevent"]))},e[12]||(e[12]=[t("i",{class:"icon-ok-circled"},null,-1)]))):d("",!0),o.finishable?(l(),i("a",{key:3,href:"#",title:"Marquer comme sans suite",onClick:e[3]||(e[3]=h(y=>s.$emit("cancel",a.milestone),["prevent"]))},e[13]||(e[13]=[t("i",{class:"icon-archive"},null,-1)]))):d("",!0),o.finishable?(l(),i("a",{key:4,href:"#",title:"Marquer comme refusé",onClick:e[4]||(e[4]=h(y=>s.$emit("refused",a.milestone),["prevent"]))},e[14]||(e[14]=[t("i",{class:"icon-block"},null,-1)]))):d("",!0),a.manage?(l(),i("a",{key:5,href:"#",title:"Supprimer ce jalon",onClick:e[5]||(e[5]=h(y=>s.$emit("remove",a.milestone),["prevent"]))},e[15]||(e[15]=[t("i",{class:"icon-trash"},null,-1)]))):d("",!0),a.manage?(l(),i("a",{key:6,href:"#",title:"Modifier ce jalon",onClick:e[6]||(e[6]=h(y=>s.$emit("edit",a.milestone),["prevent"]))},e[16]||(e[16]=[t("i",{class:"icon-edit"},null,-1)]))):d("",!0)]))],2)}const Bt=S(zt,[["render",Ht],["__scopeId","data-v-42de1793"]]);const Yt={props:{url:{required:!0},manage:{required:!0},progression:{default:!1},items:{default:[],type:Array},types:{default:[],type:Array},payments:{required:!1,default:[],type:Array}},components:{milestone:Bt,datepicker:T},data(){return{error:null,formData:null,pendingMsg:"",creatable:!1,deleteMilestone:null,editMilestone:null,validMilestone:null,cancelMilestone:null,refusedMilestone:null,unvalidMilestone:null,inProgressMilestone:null,action:null,actionMessage:"",actionMilestone:null,model:{}}},computed:{types(){return this.types},milestones(){let s=[];return this.payments.forEach(e=>{let a=new Date,k=!1,n=!1,o;switch(e.status){case 1:a=e.datePredicted,a?(o="PRÉVU",k=V(e.datePredicted.date).unix(){s.push(e)}),s.sort((e,a)=>{let k=V(e.dateStart).unix(),n=V(a.dateStart).unix();return k-n}),s},payments(){return this.payments},formTypeFinishable(){return this.formData?this.types.find(s=>s.id==this.formData.type.id&&s.finishable):!1},groupedTypes(){let s={};return this.types.forEach(e=>{let a=e.facet;s.hasOwnProperty(a)||(s[a]={label:a,types:[]}),s[e.facet].types.push(e)}),s}},methods:{handlerValid(s){this.validMilestone=s},handlerInProgress(s){this.inProgressMilestone=s},handlerUnvalid(s){this.unvalidMilestone=s},handlerActionConfirm(s,e,a){this.actionMilestone=s,this.action=e,this.actionMessage=a},handlerActionCancel(){this.actionMilestone=null,this.action=null,this.actionMessage=""},handlerCancel(s){this.unvalidMilestone=s},handlerRemove(s){this.deleteMilestone=s},handlerEdit(s){this.editMilestone=s,this.formData={type:s.type,id:s.id,comment:s.comment,dateStart:V(s.dateStart).format("YYYY-MM-DD")}},handlerNew(){this.formData={id:0,type:JSON.parse(JSON.stringify(this.types[0])),dateStart:V().format("Y-M-D HH:mm:ss"),comment:""}},preformDelete(){this.pendingMsg="Suppression du jalon",A.delete(this.url+"?id="+this.deleteMilestone.id).then(s=>{this.fetch()},s=>{O.commit("addErrorAxios",s)}).then(s=>{this.pendingMsg=null,this.deleteMilestone=null})},performValid(s){var e={},a;switch(s){case"valid":this.pendingMsg="Validation du jalon",a=this.validMilestone;break;case"unvalid":this.pendingMsg="Réinitialisation du jalon",a=this.unvalidMilestone;break;case"inprogress":this.pendingMsg="Marquage du jalon comme en cours",a=this.inProgressMilestone;break;case"cancel":case"refused":a=this.actionMilestone;break;default:this.error="Action incorrecte";return}e.id=a.id,e.action=s,this.action=null,this.actionMessage="",this.actionMilestone=null,A.put(this.url,e).then(k=>{this.fetch()},k=>{O.commit("addErrorAxios",k)}).then(k=>{this.pendingMsg=null,this.validMilestone=null,this.unvalidMilestone=null,this.inProgressMilestone=null})},performSave(){this.pendingMsg=this.formData.id?"Enregistrement des modifications":"Création du nouveau jalon",this.formData.id?A.put(this.url,this.formData).then(s=>{this.fetch()},s=>{O.commit("addErrorAxios",s)}).then(s=>{this.pendingMsg=null,this.formData=null}):A.post(this.url,this.formData).then(s=>{this.fetch()},s=>{O.commit("addErrorAxios",s)}).then(s=>{this.pendingMsg=null,this.formData=null})},fetch(){this.pendingMsg="Chargement des jalons : "+this.url,A.get(this.url).then(s=>{this.$emit("update",s.data.datas.milestones.entities)},s=>{console.log(s),this.error="Impossible de charger les jalons de cette activités : "+s}).then(s=>{this.pendingMsg=""})}},mounted(){}},Gt={class:"milestones"},Kt={key:0,class:"error overlay"},Xt={class:"overlay-content"},Qt={key:0,class:"overlay"},Zt={class:"overlay-content"},$t={key:0},es={key:1},ts={class:"form-group"},ss=["label"],ns=["value"],ls={class:"help"},is={class:"form-group"},os={class:"form-group"},rs={key:0,class:"deleteconfirm overlay"},as={class:"overlay-content"},ds={key:0,class:"validconfirm overlay"},us={class:"overlay-content"},ms={key:0,class:"inprogressconfirm overlay"},cs={class:"overlay-content"},ps={key:0,class:"inprogressconfirm overlay"},fs={class:"overlay-content"},vs={key:0,class:"validconfirm overlay"},hs={class:"overlay-content"},gs={key:0,class:"alert alert-info"},ys={key:0,class:"admin-bar"},ks={key:1,class:"list"},bs={key:2,class:"alert"};function Ds(s,e,a,k,n,o){const y=D("datepicker"),v=D("milestone");return l(),i("section",Gt,[g(U,{name:"fade"},{default:P(()=>[n.error?(l(),i("div",Kt,[t("div",Xt,[e[22]||(e[22]=t("i",{class:"icon-warning-empty"},null,-1)),r(" "+u(n.error)+" ",1),e[23]||(e[23]=t("br",null,null,-1)),t("a",{href:"#",onClick:e[0]||(e[0]=c=>n.error=null),class:"btn btn-sm btn-default btn-xs"},e[21]||(e[21]=[t("i",{class:"icon-cancel-circled"},null,-1),r(" Fermer")]))])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.formData?(l(),i("div",Qt,[t("div",Zt,[t("h2",null,[e[25]||(e[25]=t("i",{class:"icon-calendar"},null,-1)),n.formData.id?(l(),i("span",$t,[e[24]||(e[24]=r("Modification du jalon ")),t("strong",null,u(n.formData.type.label),1)])):(l(),i("span",es,"Nouveau jalon"))]),t("div",ts,[e[27]||(e[27]=t("label",{for:""},"Type de jalon",-1)),w(t("select",{name:"",id:"","onUpdate:modelValue":e[1]||(e[1]=c=>n.formData.type.id=c),class:"form-control"},[(l(!0),i(b,null,_(o.groupedTypes,c=>(l(),i("optgroup",{label:c.label},[(l(!0),i(b,null,_(c.types,M=>(l(),i("option",{value:M.id},u(M.label),9,ns))),256))],8,ss))),256))],512),[[x,n.formData.type.id]]),w(t("p",ls,e[26]||(e[26]=[t("i",{class:"icon-info-circled"},null,-1),r(" Ce type de jalon inclut des méchanismes de validation pour marquer le jalon comme terminé ")]),512),[[ee,o.formTypeFinishable]])]),t("div",is,[e[28]||(e[28]=t("label",{for:""},"Date prévue pour le jalon",-1)),g(y,{modelValue:n.formData.dateStart,"onUpdate:modelValue":e[2]||(e[2]=c=>n.formData.dateStart=c),onInput:e[3]||(e[3]=c=>{n.formData.dateStart=c})},null,8,["modelValue"])]),t("div",os,[e[29]||(e[29]=t("label",{for:""},"Description",-1)),w(t("textarea",{"onUpdate:modelValue":e[4]||(e[4]=c=>n.formData.comment=c),class:"form-control"},null,512),[[E,n.formData.comment]])]),t("nav",null,[t("button",{class:"btn btn-default",onClick:e[5]||(e[5]=(...c)=>o.performSave&&o.performSave(...c))},e[30]||(e[30]=[t("i",{class:"icon-floppy"},null,-1),r(" Enregistrer ")])),t("button",{class:"btn btn-default",onClick:e[6]||(e[6]=c=>n.formData=null)},e[31]||(e[31]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.deleteMilestone?(l(),i("div",rs,[t("div",as,[e[40]||(e[40]=t("h2",null,[t("i",{class:"icon-help-circled"}),r(" Supprimer ce jalon ?")],-1)),t("p",null,[e[32]||(e[32]=r("Cette suppression sera ")),e[33]||(e[33]=t("strong",null,"définitive",-1)),e[34]||(e[34]=r(", si vous souhaitez signifier que ce jalon est réalisé, utilisez plutôt l'option ")),e[35]||(e[35]=t("em",null,"Marquer comme terminé",-1)),e[36]||(e[36]=r(". Si cette option n'est pas disponible, demandez à l'administrateur Oscar si vous avez les privilèges pour réaliser cette action ou si le type de jalon ")),t("strong",null,u(n.deleteMilestone.type.label),1),e[37]||(e[37]=r(" est correctement configuré."))]),t("nav",null,[t("button",{class:"btn btn-default",onClick:e[7]||(e[7]=(...c)=>o.preformDelete&&o.preformDelete(...c))},e[38]||(e[38]=[t("i",{class:"icon-trash"},null,-1),r(" Supprimer ")])),t("button",{class:"btn btn-default",onClick:e[8]||(e[8]=c=>n.deleteMilestone=null)},e[39]||(e[39]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.validMilestone?(l(),i("div",ds,[t("div",us,[e[43]||(e[43]=t("h2",null,[t("i",{class:"icon-help-circled"}),r(" Valider ce jalon ? ")],-1)),e[44]||(e[44]=t("p",null,"Les jalons marqués comme terminés ne feront pas l'objet de notifications ou d'alertes.",-1)),t("nav",null,[t("button",{class:"btn btn-default",onClick:e[9]||(e[9]=c=>o.performValid("valid"))},e[41]||(e[41]=[t("i",{class:"icon-ok-circled"},null,-1),r(" Marquer ce jalon comme terminé ")])),t("button",{class:"btn btn-default",onClick:e[10]||(e[10]=c=>n.validMilestone=null)},e[42]||(e[42]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.inProgressMilestone?(l(),i("div",ms,[t("div",cs,[e[47]||(e[47]=t("h2",null,[t("i",{class:"icon-help-circled"}),r(' Marquer ce jalon "en cours" ? ')],-1)),e[48]||(e[48]=t("p",null,null,-1)),t("nav",null,[t("button",{class:"btn btn-default",onClick:e[11]||(e[11]=c=>o.performValid("inprogress"))},e[45]||(e[45]=[t("i",{class:"icon-cw-outline"},null,-1),r(" Marquer ce jalon comme en cours ")])),t("button",{class:"btn btn-default",onClick:e[12]||(e[12]=c=>n.inProgressMilestone=null)},e[46]||(e[46]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.actionMessage?(l(),i("div",ps,[t("div",fs,[t("h2",null,[e[49]||(e[49]=t("i",{class:"icon-help-circled"},null,-1)),r(" "+u(n.actionMessage)+" ? ",1)]),e[52]||(e[52]=t("p",null,"Les jalons marqués comme terminés (Validé, refusé ou sans suite) ne feront pas l'objet de notifications ou d'alertes",-1)),t("nav",null,[t("button",{class:"btn btn-default",onClick:e[13]||(e[13]=c=>o.performValid(n.action))},[e[50]||(e[50]=t("i",{class:"icon-cw-outline"},null,-1)),r(" "+u(n.actionMessage),1)]),t("button",{class:"btn btn-default",onClick:e[14]||(e[14]=(...c)=>o.handlerActionCancel&&o.handlerActionCancel(...c))},e[51]||(e[51]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.unvalidMilestone?(l(),i("div",vs,[t("div",hs,[e[55]||(e[55]=t("h2",null,[t("i",{class:"icon-help-circled"}),r(" Invalider ce jalon ? ")],-1)),e[56]||(e[56]=t("p",null,"L'état d'avancement du jalon sera réinitialisé.",-1)),t("nav",null,[t("button",{class:"btn btn-success",onClick:e[15]||(e[15]=c=>o.performValid("unvalid"))},e[53]||(e[53]=[t("i",{class:"icon-ok-circled"},null,-1),r(" Réinitialiser la progression de ce jalon ")])),t("button",{class:"btn btn-danger",onClick:e[16]||(e[16]=c=>n.unvalidMilestone=null)},e[54]||(e[54]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.pendingMsg?(l(),i("div",gs,[e[57]||(e[57]=t("i",{class:"icon-spinner animate-spin"},null,-1)),r(" "+u(n.pendingMsg),1)])):d("",!0)]),_:1}),a.manage?(l(),i("nav",ys,[t("a",{href:"#",onClick:e[17]||(e[17]=h((...c)=>o.handlerNew&&o.handlerNew(...c),["prevent"])),class:"btn btn-xs btn-default"},e[58]||(e[58]=[t("i",{class:"icon-calendar-plus-o"},null,-1),r(" Nouveau Jalon ")])),t("a",{href:"#",onClick:e[18]||(e[18]=h((...c)=>o.fetch&&o.fetch(...c),["prevent"])),class:"btn btn-xs btn-warning"},e[59]||(e[59]=[t("i",{class:"icon-bug"},null,-1),r(" fetch ")]))])):d("",!0),o.milestones!=null?(l(),i("section",ks,[(l(!0),i(b,null,_(o.milestones,c=>(l(),z(v,{milestone:c,key:c.id,manage:a.manage,progression:a.progression,onValid:o.handlerValid,onUnvalid:o.handlerUnvalid,onInprogress:o.handlerInProgress,onCancel:e[19]||(e[19]=M=>o.handlerActionConfirm(M,"cancel","Marquer ce jalon comme sans suite")),onRefused:e[20]||(e[20]=M=>o.handlerActionConfirm(M,"refused","Marquer ce jalon comme refusé")),onRemove:o.handlerRemove,onEdit:o.handlerEdit},null,8,["milestone","manage","progression","onValid","onUnvalid","onInprogress","onRemove","onEdit"]))),128))])):(l(),i("div",bs," Aucun jalon "))])}const _s=S(Yt,[["render",Ds]]),ws={props:["payment","manage"],data(){return{}},computed:{late(){if(this.payment.status===1){if(!this.payment.datePredicted)return!0;let s=V().unix();return V(this.payment.datePredicted).unix()s.$emit("delete",a.payment),["prevent"])),title:"Supprimer ce versement"},e[7]||(e[7]=[t("i",{class:"icon-trash"},null,-1)])),t("a",{href:"#",class:"btn-edit",onClick:e[1]||(e[1]=h(y=>s.$emit("edit",a.payment),["prevent"])),title:"Modifier ce versement"},e[8]||(e[8]=[t("i",{class:"icon-pencil"},null,-1)]))])):d("",!0)]),t("p",js,u(a.payment.comment),1)],2)}const zs=S(ws,[["render",Os]]),Rs={props:["url","amount","currency","currencies","manage","payments"],data(){return{formData:null,deletePayment:null,error:"",pendingMsg:""}},components:{payment:zs,datepicker:T},computed:{total(){let s=0;return this.payments&&this.payments.forEach(e=>{let a=1;e.currency&&(a=e.rate),s+=e.amount/a}),Math.round(s*100)/100},currencySymbol(){return this.currency?this.currency.symbol:"€"},formHasError(){return!this.formData.amount||this.formData.status==2&&!this.formData.datePayment||this.formData.status==1&&!this.formData.datePredicted}},methods:{getPaymentDateValue(s){return s.status==2?s.datePayment?s.datePayment.date:null:s.status==1&&s.datePredicted?s.datePredicted.date:null},handlerNewPayment(){this.formData={id:null,amount:0,currencyId:1,rate:1,datePredicted:"",status:1,datePayment:"",codeTransaction:"",comment:""}},handlerDelete(s){this.deletePayment=s},handlerEdit(s){this.formData=JSON.parse(JSON.stringify(s)),this.formData.currencyId=s.currency.id,this.formData.datePayment=s.datePayment?V(s.datePayment.date).format("YYYY-MM-DD"):"",this.formData.datePredicted=s.datePredicted?V(s.datePredicted.date).format("YYYY-MM-DD"):"",this.formData.currencyId=s.currency.id},handlerFormUpdateRate(){let s=this.currencies.find(e=>e.id==this.formData.currencyId);s&&(this.formData.rate=s.rate)},performSave(){this.loading="Enregistrement du paiement",!this.formHasError&&(this.formData.id?A.post(this.url,this.formData).then(s=>{this.formData=null,this.fetch()},s=>{this.error=j.manageErrorResponse(s)}):A.put(this.url,this.formData).then(s=>{this.formData=null,this.fetch()},s=>{this.error=j.manageErrorResponse(s)}))},performDelete(){A.delete(this.url+"?id="+this.deletePayment.id).then(s=>{this.fetch()},s=>{this.error="Impossible de supprimer le versement : "+j.manageErrorResponse(s).message}).then(()=>{this.deletePayment=null})},fetch(){this.loading="Chargement des versements",A.get(this.url).then(s=>{this.$emit("update",s.data.datas.payments)},s=>{this.error=j.manageErrorResponse(s)}).finally(s=>this.loading=null)}},mounted(){}},Fs={class:"payments"},Is={key:0,class:"error overlay"},Ws={class:"overlay-content"},Ts={key:0,class:"pending overlay"},qs={class:"overlay-content"},Ls={key:0,class:"deleteconfirm overlay"},Js={class:"overlay-content"},Hs={key:0,class:"overlay"},Bs={class:"overlay-content"},Ys={key:0},Gs={key:1},Ks={class:"container"},Xs={class:"row"},Qs={class:"col-xs-6"},Zs={class:"form-group"},$s={key:0,class:"oscar-form-message error"},en={class:"col-xs-3"},tn={class:"form-group"},sn=["value"],nn={class:"col-xs-3"},ln={class:"form-group"},on={class:"row"},rn={class:"col-xs-6"},an={class:"form-group"},dn={key:0,class:"oscar-form-message error"},un={class:"col-xs-6"},mn={class:"form-group"},cn={class:"done"},pn={class:"row"},fn={class:"col-xs-6"},vn={class:"form-group"},hn={key:0,class:"oscar-form-message error"},gn={class:"col-xs-6"},yn={class:"form-group"},kn={class:"form-group"},bn={class:"text-center"},Dn={class:"btn-group"},_n={key:0,class:"admin-bar"},wn={class:"payment total"},Cn={class:"heading"},Pn={class:"amount text-private"},An={class:"date"},Un={class:"text-private"},Sn={key:1,class:"alert alert-danger alertAmount"},Mn={class:"amountPrevu text-private"},En={title:"Valeur exacte : = $entity->getAmount() ?>",class:"text-private"};function Vn(s,e,a,k,n,o){const y=D("datepicker"),v=D("payment");return l(),i("section",Fs,[g(U,{name:"fade"},{default:P(()=>[n.error?(l(),i("div",Is,[t("div",Ws,[e[19]||(e[19]=t("i",{class:"icon-warning-empty"},null,-1)),r(" "+u(n.error)+" ",1),e[20]||(e[20]=t("br",null,null,-1)),t("a",{href:"#",onClick:e[0]||(e[0]=c=>n.error=null),class:"btn btn-default"},e[18]||(e[18]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Fermer")]))])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.pendingMsg?(l(),i("div",Ts,[t("div",qs,[e[21]||(e[21]=t("i",{class:"icon-spinner animate-spin"},null,-1)),r(" "+u(n.pendingMsg),1)])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.deletePayment?(l(),i("div",Ls,[t("div",Js,[e[24]||(e[24]=t("h3",null,[t("i",{class:"icon-help-circled"}),r(" Supprimer ce versement ?")],-1)),t("nav",null,[t("button",{class:"btn btn-default",onClick:e[1]||(e[1]=(...c)=>o.performDelete&&o.performDelete(...c))},e[22]||(e[22]=[t("i",{class:"icon-trash"},null,-1),r(" Supprimer ")])),t("button",{class:"btn btn-default",onClick:e[2]||(e[2]=c=>n.deletePayment=null)},e[23]||(e[23]=[t("i",{class:"icon-cancel-outline"},null,-1),r(" Annuler ")]))])])])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.formData?(l(),i("div",Hs,[t("div",Bs,[n.formData.id?(l(),i("h3",Ys,"Modification du versement")):(l(),i("h3",Gs,"Nouveau versement")),t("div",Ks,[t("div",Xs,[t("div",Qs,[t("div",Zs,[e[25]||(e[25]=t("label",{class:"control-label",for:"amount"},"Montant",-1)),w(t("input",{name:"amount",class:"form-control input-lg form-control","onUpdate:modelValue":e[3]||(e[3]=c=>n.formData.amount=c),type:"text"},null,512),[[E,n.formData.amount]]),n.formData.amount?d("",!0):(l(),i("div",$s," Vous devez indiquer un montant. "))])]),t("div",en,[t("div",tn,[e[26]||(e[26]=t("label",{class:"control-label"},"Devise pour le versement",-1)),w(t("select",{name:"currency",class:"form-control form-control","onUpdate:modelValue":e[4]||(e[4]=c=>n.formData.currencyId=c),onChange:e[5]||(e[5]=(...c)=>o.handlerFormUpdateRate&&o.handlerFormUpdateRate(...c))},[(l(!0),i(b,null,_(a.currencies,c=>(l(),i("option",{value:c.id},u(c.label),9,sn))),256))],544),[[x,n.formData.currencyId]])])]),t("div",nn,[t("div",ln,[e[27]||(e[27]=t("label",{class:"control-label"},"Taux",-1)),w(t("input",{name:"rate",class:"form-control form-control","onUpdate:modelValue":e[6]||(e[6]=c=>n.formData.rate=c),type:"text"},null,512),[[E,n.formData.rate]])])])]),t("div",on,[t("div",rn,[t("div",an,[e[28]||(e[28]=t("label",{class:"control-label"},"Date prévue",-1)),g(y,{modelValue:n.formData.datePredicted,"onUpdate:modelValue":e[7]||(e[7]=c=>n.formData.datePredicted=c),onInput:e[8]||(e[8]=c=>{n.formData.datePredicted=c})},null,8,["modelValue"]),n.formData.status==1&&!n.formData.datePredicted?(l(),i("div",dn," Les versements prévisionnels necessitent une date. ")):d("",!0)])]),t("div",un,[t("div",mn,[e[30]||(e[30]=t("label",{class:"control-label"},"Statut",-1)),w(t("select",{name:"status",class:"form-control form-control","onUpdate:modelValue":e[9]||(e[9]=c=>n.formData.status=c)},e[29]||(e[29]=[t("option",{value:"1",selected:"selected"},"Prévisionnel",-1),t("option",{value:"2"},"Réalisé",-1),t("option",{value:"3"},"Écart",-1)]),512),[[x,n.formData.status]])])])]),t("div",cn,[e[34]||(e[34]=t("h2",null,"Informations sur le versement effectif",-1)),t("div",pn,[t("div",fn,[t("div",vn,[e[31]||(e[31]=t("label",{class:"control-label"},"Date effective",-1)),g(y,{moment:s.moment,modelValue:n.formData.datePayment,"onUpdate:modelValue":e[10]||(e[10]=c=>n.formData.datePayment=c),onInput:e[11]||(e[11]=c=>{n.formData.datePayment=c})},null,8,["moment","modelValue"]),n.formData.status==2&&!n.formData.datePayment?(l(),i("div",hn," Les versements réalisés necessitent une date effective ")):d("",!0)])]),t("div",gn,[t("div",yn,[e[32]||(e[32]=t("label",{class:"control-label"},"N° de pièce",-1)),w(t("input",{name:"codeTransaction",class:"form-control form-control","onUpdate:modelValue":e[12]||(e[12]=c=>n.formData.codeTransaction=c),type:"text"},null,512),[[E,n.formData.codeTransaction]])]),e[33]||(e[33]=t("p",{class:"help"},"Numéro permettant d'identifier l'opération auprès des services comptables.",-1))])])]),t("div",kn,[e[35]||(e[35]=t("label",{class:"control-label"},"Commentaire",-1)),w(t("textarea",{name:"comment",class:"form-control form-control",placeholder:"Commentaire","onUpdate:modelValue":e[13]||(e[13]=c=>n.formData.comment=c)},null,512),[[E,n.formData.comment]])]),t("nav",bn,[t("nav",Dn,[t("a",{class:"btn btn-default button-back",href:"#",onClick:e[14]||(e[14]=h(c=>n.formData=null,["prevent"]))},"Annuler"),t("button",{class:C(["btn btn-primary",{disabled:o.formHasError}]),onClick:e[15]||(e[15]=h((...c)=>o.performSave&&o.performSave(...c),["prevent"]))}," Enregistrer ",2)])])])])])):d("",!0)]),_:1}),a.manage?(l(),i("nav",_n,[t("a",{href:"#",onClick:e[16]||(e[16]=h((...c)=>o.handlerNewPayment&&o.handlerNewPayment(...c),["prevent"])),class:"btn btn-default btn-xs"},e[36]||(e[36]=[t("i",{class:"icon-bank"},null,-1),r(" Nouveau versement")])),t("button",{class:"btn btn-warning btn-xs",onClick:e[17]||(e[17]=h((...c)=>o.fetch&&o.fetch(...c),["prevent"]))},e[37]||(e[37]=[t("i",{class:"icon-bug"},null,-1),r(" fetch ")]))])):d("",!0),(l(!0),i(b,null,_(a.payments,c=>(l(),z(v,{payment:c,key:c.id,manage:a.manage,onDelete:o.handlerDelete,onEdit:o.handlerEdit},null,8,["payment","manage","onDelete","onEdit"]))),128)),t("article",wn,[t("div",Cn,[t("strong",Pn,u(s.$filters.money(o.total))+" € ",1),t("span",An,[e[38]||(e[38]=r("/ ")),t("strong",Un,u(s.$filters.money(a.amount))+" €",1)])])]),o.total!=a.amount?(l(),i("div",Sn,[e[41]||(e[41]=t("p",null,[t("i",{class:"icon-attention-1"}),r(" Le total des versements prévus et réalisés ne semble pas correspondre avec le montant prévu initialement, Somme des versements :")],-1)),t("ul",null,[t("li",null,[t("strong",Mn,u(s.$filters.money(o.total))+" "+u(o.currencySymbol),1),e[39]||(e[39]=r(" en versement,"))]),t("li",null,[t("strong",En,u(s.$filters.money(a.amount))+" "+u(o.currencySymbol),1),e[40]||(e[40]=r(" prévu "))])])])):d("",!0)])}const xn=S(Rs,[["render",Vn]]);const Nn={name:"PersonCartouche",props:{person:{required:!0,type:Object}}},jn={class:"person-text"},On={class:"info-bulle"},zn=["src"],Rn={class:"infos"},Fn={class:"firstname"},In={class:"lastname"},Wn={class:"content"},Tn={style:{"white-space":"nowrap"}},qn={key:0},Ln={key:1},Jn={key:0},Hn={key:1},Bn={key:0},Yn={key:1},Gn={key:0},Kn=["href"],Xn={key:1};function Qn(s,e,a,k,n,o){return l(),i("span",jn,[r(u(a.person.label)+" ",1),t("div",On,[t("header",null,[t("figure",null,[t("img",{src:"https://www.gravatar.com/avatar/"+a.person.mailMd5+"?s=60",alt:""},null,8,zn)]),t("div",Rn,[t("div",Fn,u(a.person.firstName),1),t("div",In,u(a.person.lastName),1)])]),t("div",Wn,[t("div",Tn,[e[0]||(e[0]=t("i",{class:"icon-mail"},null,-1)),a.person.email?(l(),i("span",qn,u(a.person.email),1)):(l(),i("em",Ln,"Inconnu"))]),t("div",null,[e[1]||(e[1]=t("i",{class:"icon-phone-outline"},null,-1)),a.person.phone?(l(),i("span",Jn,u(a.person.phone),1)):(l(),i("em",Hn,"Inconnu"))]),t("div",null,[e[2]||(e[2]=t("i",{class:"icon-building-filled"},null,-1)),a.person.affectation?(l(),i("span",Bn,u(a.person.affectation),1)):(l(),i("em",Yn,"Inconnu"))]),a.person.ucbnSiteLocalisation?(l(),i("div",Gn,[e[3]||(e[3]=t("i",{class:"icon-direction"},null,-1)),t("span",null,u(a.person.ucbnSiteLocalisation),1)])):d("",!0)]),t("footer",null,[a.person.url?(l(),i("a",{key:0,href:a.person.url,class:"btn btn-primary btn-xs"},e[4]||(e[4]=[t("i",{class:"icon-zoom-in-outline"},null,-1),r(" Fiche")]),8,Kn)):(l(),i("code",Xn,u(a.person.id),1))])])])}const Zn=S(Nn,[["render",Qn],["__scopeId","data-v-dfc2c1c6"]]),$n={components:{PersonDisplay:K},props:{person:{default:function(){return{}}},editable:!1,allowTooltip:{default:!1}},computed:{duration(){return this.person.duration}},data(){return{canSave:!1,mode:"read",durationForm:666}},methods:{handlerKeyUp(){console.log(arguments)},handlerUpdate(){this.$emit("workpackagepersonupdate",this.person,this.durationForm),this.mode="read"},handlerEdit(){this.mode="edit",this.durationForm=this.person.duration},handlerCancel(){this.mode="read",this.durationForm=this.person.duration},handlerRemove(){this.$emit("workpackagepersondelete",this.person)}}},el={class:"workpackage-person"},tl={class:"displayname"},sl={class:"tempsdeclare temps"},nl={key:0},ll={key:1},il={class:"wp-hours"},ol={title:"Heure(s) saisie(s)",class:"wp-hour unsend"},rl={title:"Heure(s) validée(s)",class:"wp-hour validate"},al={key:0,title:"Heure(s) en cours de validation",class:"wp-hour validating"},dl={key:1,title:"Heure(s) en conflit",class:"wp-hour conflicts"},ul={title:"Heure(s) à valider",class:"wp-hour duration"};function ml(s,e,a,k,n,o){const y=D("PersonDisplay");return l(),i("article",el,[t("div",tl,[g(y,{person:a.person.person,"allow-tooltip":a.allowTooltip},null,8,["person","allow-tooltip"]),a.editable&&n.mode=="read"?(l(),i("a",{key:0,href:"#",onClick:e[0]||(e[0]=h(v=>o.handlerRemove(a.person),["prevent"])),class:"link",title:"Supprimer ce déclarant"},e[6]||(e[6]=[t("i",{class:"icon-trash"},null,-1)]))):d("",!0)]),t("div",sl,[a.editable&&n.mode=="edit"?(l(),i("div",nl,[e[9]||(e[9]=r(" Heures prévues : ")),w(t("input",{type:"integer","onUpdate:modelValue":e[1]||(e[1]=v=>n.durationForm=v),style:{width:"5em"},onKeyup:e[2]||(e[2]=te((...v)=>o.handlerUpdate&&o.handlerUpdate(...v),["13"]))},null,544),[[E,n.durationForm]]),t("a",{href:"#",onClick:e[3]||(e[3]=h((...v)=>o.handlerUpdate&&o.handlerUpdate(...v),["prevent"])),title:"Appliquer la modification des heures prévues"},e[7]||(e[7]=[t("i",{class:"icon-floppy"},null,-1)])),t("a",{href:"#",onClick:e[4]||(e[4]=h((...v)=>o.handlerCancel&&o.handlerCancel(...v),["prevent"])),title:"Annuler la modification des heures prévues"},e[8]||(e[8]=[t("i",{class:"icon-cancel-outline"},null,-1)]))])):(l(),i("span",ll,[t("strong",il,[t("span",ol,u(a.person.unsend|s.heures),1),t("span",rl,u(a.person.validate|s.heures),1),a.person.validating>0?(l(),i("span",al,u(a.person.validating|s.heures),1)):d("",!0),a.person.conflicts>0?(l(),i("span",dl,u(a.person.conflicts|s.heures),1)):d("",!0),t("span",ul,[r(" / "+u(a.person.duration|s.heures)+" ",1),a.editable&&n.mode=="read"?(l(),i("a",{key:0,href:"#",onClick:e[5]||(e[5]=h((...v)=>o.handlerEdit&&o.handlerEdit(...v),["prevent"])),title:"Modifier les heures prévues"},e[10]||(e[10]=[t("i",{class:"icon-pencil"},null,-1)]))):d("",!0)])])]))])])}const cl=S($n,[["render",ml]]),pl={components:{workpackageperson:cl},data(){return{mode:"read",canSave:!1,formData:{id:-1,code:"",label:"",description:""}}},created(){this.workpackage.id<0&&(this.mode="edit")},props:{workpackage:null,persons:{default:function(){return[]}},editable:!1,isValidateur:!1,allowTooltip:{default:!1}},watch:{},methods:{isDeclarant(s,e){return e.persons.find(a=>a.person.id===s.id)},handlerEditWorkPackage(){this.formData=JSON.parse(JSON.stringify(this.workpackage)),this.mode="edit"},handlerCancelEdit(){this.workpackage.id<0?this.$emit("workpackagecancelnew",this.workpackage):this.mode="read"},handlerDeleteWorkPackage(){this.$emit("workpackagedelete",this.workpackage)},handlerUpdateWorkPackage(s){if(this.formData.code)this.$emit("workpackageupdate",this.formData),this.mode="read";else return s.stopPropagation(),s.stopImmediatePropagation(),!1},handlerUpdate(s,e){this.$emit("workpackagepersonupdate",s,e)},handlerDelete(s){this.$emit("workpackagepersondelete",s)},roles(s){return s.roles.join(",")},tempsPrevu(s){return 0},tempsDeclare(s){return 0}}},fl={class:"workpackage"},vl={key:0},hl={key:1},gl={class:"form-group"},yl={class:"form-group"},kl={class:"form-group"},bl={class:"buttons"},Dl={key:1},_l={class:"workpackage-persons"},wl={key:0,class:"buttons"},Cl={class:"btn-group"},Pl={class:"dropdown-menu"},Al=["onClick"],Ul={key:1,class:"text-danger"};function Sl(s,e,a,k,n,o){const y=D("workpackageperson");return l(),i("article",fl,[n.mode=="edit"?(l(),i("form",{key:0,action:"",onSubmit:e[4]||(e[4]=h((...v)=>o.handlerUpdateWorkPackage&&o.handlerUpdateWorkPackage(...v),["prevent"]))},[t("h4",null,[a.workpackage.id>0?(l(),i("span",vl,"Modification du lot")):(l(),i("span",hl,"Nouveau lot")),r(" "+u(n.formData.label),1)]),t("div",gl,[e[7]||(e[7]=t("label",{for:""},"Code",-1)),e[8]||(e[8]=t("p",{class:"text-danger"},[r("Le code est "),t("strong",null,"utilisé pour l'affichage des créneaux"),r(" simplifiés, utilisez un code de préférence entre 3 et 5 caractères.")],-1)),w(t("input",{type:"text",placeholder:"CODE","onUpdate:modelValue":e[0]||(e[0]=v=>n.formData.code=v),class:"form-control"},null,512),[[E,n.formData.code]])]),t("div",yl,[e[9]||(e[9]=t("label",{for:""},"Intitulé",-1)),w(t("input",{type:"text",placeholder:"Intitulé","onUpdate:modelValue":e[1]||(e[1]=v=>n.formData.label=v),class:"form-control"},null,512),[[E,n.formData.label]])]),t("div",kl,[e[10]||(e[10]=t("label",{for:""},"Description",-1)),w(t("textarea",{type:"text",placeholder:"Description","onUpdate:modelValue":e[2]||(e[2]=v=>n.formData.description=v),class:"form-control"},null,512),[[E,n.formData.description]])]),t("div",bl,[t("button",{type:"submit",class:C(["btn btn-default btn-save",{disabled:!n.formData.code}])},"Enregistrer ",2),t("button",{type:"button",class:"btn btn-default",onClick:e[3]||(e[3]=(...v)=>o.handlerCancelEdit&&o.handlerCancelEdit(...v))},"Annuler")])],32)):d("",!0),n.mode=="read"?(l(),i("div",Dl,[t("h3",null,"["+u(a.workpackage.code)+"] "+u(a.workpackage.label),1),t("p",null,u(a.workpackage.description),1),t("section",_l,[e[11]||(e[11]=t("h4",null,[t("i",{class:"icon-calendar"}),r("Déclarants ")],-1)),(l(!0),i(b,null,_(a.workpackage.persons,v=>(l(),z(y,{key:v.id,"allow-tooltip":a.allowTooltip,person:v,editable:a.editable,onWorkpackagepersondelete:o.handlerDelete,onWorkpackagepersonupdate:o.handlerUpdate},null,8,["allow-tooltip","person","editable","onWorkpackagepersondelete","onWorkpackagepersonupdate"]))),128))]),a.editable&&a.persons.length?(l(),i("div",wl,[t("div",Cl,[e[12]||(e[12]=t("button",{type:"button",class:"btn btn-default btn-xs dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},[r(" Ajouter un déclarant "),t("span",{class:"caret"})],-1)),t("ul",Pl,[(l(!0),i(b,null,_(a.persons,v=>(l(),i("li",{class:C({disabled:o.isDeclarant(v,a.workpackage)})},[t("a",{href:"#",onClick:h(c=>s.$emit("addperson",v.id,a.workpackage.id),["prevent"])},u(v.displayname),9,Al)],2))),256))])]),t("a",{href:"#",class:"btn btn-default btn-xs",onClick:e[5]||(e[5]=h((...v)=>o.handlerEditWorkPackage&&o.handlerEditWorkPackage(...v),["prevent"]))},e[13]||(e[13]=[t("i",{class:"icon-pencil"},null,-1),r("Modifier")])),t("a",{href:"#",class:"btn btn-default btn-xs",onClick:e[6]||(e[6]=h((...v)=>o.handlerDeleteWorkPackage&&o.handlerDeleteWorkPackage(...v),["prevent"]))},e[14]||(e[14]=[t("i",{class:"icon-trash"},null,-1),r("Supprimer")]))])):d("",!0),a.persons.length<=0?(l(),i("div",Ul,e[15]||(e[15]=[r(" Vous n'avez pas encore ajouté de membre à cette activité. "),t("strong",null,"Seul les membres d'une activité peuvent être identifiés comme déclarant",-1),r(". ")]))):d("",!0)])):d("",!0)])}const Ml=S(pl,[["render",Sl]]);const El={components:{Workpackage:Ml},data(){return{loading:!1,errors:[],isDeclarant:!1,isValidateur:!1,confirm:null,confirmData:null,confirmHandler:null,editedWorlpackage:null}},props:{url:{required:!0},editable:{required:!1,default:!1},allowTooltip:{default:!1},isValidateur:{required:!0},outsidePerson:{required:!0},persons:{required:!0},workpackages:{required:!0},debugEnabled:{default:!1}},methods:{handlerWorkPackageCancelNew(s){this.workpackages.splice(this.workpackages.indexOf(s),1)},handlerWorkPackageNew(){this.workpackages.push({id:-1,code:"Nouveau Lot",label:"",persons:[],description:""})},handlerConfirm(){console.log("handlerConfirm"),this.confirmHandler(this.confirmData),this.confirm=null},handlerWorkPackagePersonDelete(s){this.confirm="Supprimer le déclarant ?",this.confirmData=s,this.confirmHandler=this.handlerWorkPackagePersonDeleteDo},handlerWorkPackagePersonDeleteDo(s){A.delete(this.url+"?workpackagepersonid="+s.id).then(e=>{this.fetch()},e=>{this.errors.push("Impossible de supprimer le déclarant : "+e.body)})},handlerWorkPackageDelete(s){this.confirm="Supprimer le lot de travail ?",this.confirmData=s,this.confirmHandler=this.handlerWorkPackageDeleteDo},handlerWorkPackageDeleteDo(s){A.delete(this.url+"?workpackageid="+s.id).then(e=>{this.fetch()},e=>{this.errors.push("Impossible de supprimer le lot : "+e.body)})},handlerWorkPackageUpdate(s){var e=new FormData;for(var a in s)e.append(a,s[a]);if(s.id>0)console.log("MAJ du LOT"),e.append("workpackageid",s.id),A.post(this.url,e).then(k=>{this.fetch()},k=>{this.errors.push("Impossible de mettre à jour le lot de travail : "+k.body)});else{console.log("NOUVEAU du LOT ",this.url);let k=JSON.parse(JSON.stringify(s));k.workpackageid=-1,A.put(this.url,k).then(n=>{this.fetch()},n=>{this.errors.push("Impossible de créer le lot de travail : "+n.body)}).then(n=>this.fetch())}},handlerUpdateWorkPackagePerson(s,e){var a=new FormData;a.append("workpackagepersonid",s.id),a.append("duration",e),A.post(this.url,a).then(k=>{s.duration=e},k=>{this.errors.push("Impossible de mettre à jour les heures prévues : "+k.body)})},addperson(s,e){console.log(arguments);var a={idworkpackage:e,idperson:s};A.put(this.url,a).then(k=>{this.fetch()},k=>{this.errors.push("Impossible d'ajouter le déclarant : "+k.body)}).then(()=>this.loading=!1)},fetch(){this.loading="Chargement des lots de travails",console.log(this.url),A.get(this.url+"?v=2").then(s=>{console.log("Chargement des lots de travail : ",s);try{let e=s.data.datas.workpackages;this.$emit("update",e)}catch(e){this.errors.push("UI ERROR "+e)}},s=>{this.errors.push(j.manageErrorResponse(s).message)}).then(()=>this.loading=!1)},fetchPersons(){this.fetch()}}},Vl={key:0,class:"vue-loader"},xl={class:"alert alert-danger"},Nl=["onClick"],jl={key:0,class:"overlay"},Ol={class:"overlay-content"},zl={class:"overlay-title"},Rl={class:"buttons"},Fl={class:"admin-bar"},Il={class:"workpackages"};function Wl(s,e,a,k,n,o){const y=D("workpackage");return l(),i("section",null,[g(U,{name:"fade"},{default:P(()=>[n.errors.length?(l(),i("div",Vl,[(l(!0),i(b,null,_(n.errors,(v,c)=>(l(),i("div",xl,[r(u(v)+" ",1),t("a",{href:"",onClick:h(M=>n.errors.splice(c,1),["prevent"])},e[5]||(e[5]=[t("i",{class:"icon-cancel-outline"},null,-1)]),8,Nl)]))),256))])):d("",!0)]),_:1}),g(U,{name:"fade"},{default:P(()=>[n.confirm?(l(),i("div",jl,[t("div",Ol,[t("div",zl,[r(u(n.confirm)+" ",1),t("a",{href:"#",class:"overlay-closer",onClick:e[0]||(e[0]=h(v=>n.confirm=null,["prevent"]))},"x")]),t("nav",Rl,[t("a",{href:"#",class:"btn btn-danger",onClick:e[1]||(e[1]=h(v=>n.confirm=null,["prevent"]))},"Annuler"),t("a",{href:"#",class:"btn btn-danger",onClick:e[2]||(e[2]=h(v=>o.handlerConfirm(),["prevent"]))},"Confirmer")])])])):d("",!0)]),_:1}),t("nav",Fl,[t("a",{href:"",class:"btn btn-primary btn-xs",onClick:e[3]||(e[3]=h((...v)=>o.handlerWorkPackageNew&&o.handlerWorkPackageNew(...v),["prevent"]))},e[6]||(e[6]=[t("i",{class:"icon-book"},null,-1),r(" Nouveau lot")])),a.debugEnabled?(l(),i("a",{key:0,href:"",class:"btn btn-warning btn-xs",onClick:e[4]||(e[4]=h((...v)=>o.fetch&&o.fetch(...v),["prevent"]))},e[7]||(e[7]=[t("i",{class:"icon-bug"},null,-1),r(" fetch")]))):d("",!0)]),t("section",Il,[(l(!0),i(b,null,_(a.workpackages,v=>(l(),z(y,{key:v.id,"allow-tooltip":a.allowTooltip,workpackage:v,persons:a.persons,editable:a.editable,"is-validateur":a.isValidateur,onAddperson:o.addperson,onWorkpackageupdate:o.handlerWorkPackageUpdate,onWorkpackagepersonupdate:o.handlerUpdateWorkPackagePerson,onWorkpackagepersondelete:o.handlerWorkPackagePersonDelete,onWorkpackagedelete:o.handlerWorkPackageDelete,onWorkpackagecancelnew:o.handlerWorkPackageCancelNew},null,8,["allow-tooltip","workpackage","persons","editable","is-validateur","onAddperson","onWorkpackageupdate","onWorkpackagepersonupdate","onWorkpackagepersondelete","onWorkpackagedelete","onWorkpackagecancelnew"]))),128))])])}const Tl=S(El,[["render",Wl],["__scopeId","data-v-7f36a26b"]]);A.defaults.headers.common.Accept="application/json";A.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";const F="activities_sticky",ql={name:"Activity",components:{ActivityAvenants:Ot,ActivityNotes:ce,ActivityLogs:me,ActivityDocument:ue,ActivitySpentSynthesis:pe,EntityWithRole:fe,Loader:ve,Payments:xn,PersonCartouche:Zn,PersonDisplay:K,Milestones:_s,Modal:G,VueJsonPretty:se,WorkpackagesActivity:Tl},props:{url:{required:!0},debugEnabled:{required:!1,type:Boolean,default:!1}},data(){return{administration:null,avenants:null,budget:null,core:null,credentials:null,currencies:[],documents:[],milestones:[],milestonesTypes:[],milestonesUrl:null,milestonesUrlNotifications:null,notes:null,notes_url:null,payments:[],paymentsUrl:null,persons:null,personsUrl:null,personsUrlNew:null,rolesOrganizations:null,rolesPersons:null,timesheets:null,timesheetsDeclarers:null,timesheetsValidators:null,timesheetsUrl:null,timesheetsUrlSynthesis:null,organizations:null,organizationsUrl:null,organizationsUrlNew:null,workpackages:null,workpackagesUrl:null,spents:null,activity:{},duplicateDatas:null,sticky:[],descriptionFull:!1,debug_content:null,debug_displayed:!1,error:null,loading:!0}},computed:{personsWP(){if(this.persons){let s={};return this.persons.forEach(e=>{s.hasOwnProperty(e.enrolled)||(s[e.enrolled]={id:e.enrolled,displayname:e.enrolledLabel,firstname:e.firstname,lastname:e.lastname})}),Object.values(s)}else return[]},storage(){return localStorage.getItem(F)},isSticky(){return this.sticky.find(s=>s.id==this.core.id)},labelReduced(){let s=this.core.label;return s.length>50?s.substr(0,50)+"...":s}},methods:{performLock(s){A.post(this.url,{action:s}).then(e=>{this.fetch()},e=>{let a=j.manageErrorResponse(e).message;O.commit("addError",a)})},handlerUnlock(){this.performLock("lock")},handlerLock(){this.performLock("unlock")},testError(s,e="Une erreur affichée"){O.commit("addError",e)},handlerHelp(s){O.dispatch("displayHelp",s)},handlerDebug(s){this.debug_content=s,this.debug_displayed=!0},handlerDebugHide(){this.debug_displayed=!1},handlerDebugShow(s){this.debug_content=JSON.parse(JSON.stringify(s)),this.debug_displayed=!0},handlerError(s){this.error=s.message},handlerUpdateWorkpackages(s){this.workpackages=s.entities},handlerUpdateNotes(s){this.notes=s.entities},handlerUpdatePayments(s){this.payments=s.entities,this.currencies=s.currencies,this.paymentsUrl=s.url},handlerUpdateMilestones(s){this.milestones=s},handlerUpdatePersons(s){this.persons=s.datas.items},handlerUpdateOrganizations(s){this.organizations=s.datas.items},handlerUpdateDocuments(s){console.log(s),this.documents=s},handlerUpdateAvenants(s){console.log("AVENANTS",s),this.avenants=s},handlerPurgeSticky(){this.sticky=[],localStorage.removeItem(F)},toogleSticky(){this.isSticky?this.handlerUnSticky():this.handlerSticky()},handlerUnSticky(){this.sticky.forEach((s,e)=>{s.id==this.core.id&&this.sticky.splice(e,1)}),localStorage.setItem(F,JSON.stringify(this.sticky))},handlerSticky(){this.sticky.push({id:this.core.id,label:this.core.label,num:this.core.numOscar,location:document.location.href}),localStorage.setItem(F,JSON.stringify(this.sticky))},handlerNavigateSticky(s){s.location&&(document.location=s.location)},test(){console.log(localStorage.getItem())},fetch(){this.loading=!0,A.get(this.url).then(s=>{this.budget=s.data.activity.datas.budget,this.core=s.data.activity.datas.core,s.data.activity.datas.spents&&(this.spents=s.data.activity.datas.spents),s.data.activity.datas.avenants&&this.handlerUpdateAvenants(s.data.activity.datas.avenants),s.data.activity.datas.administration&&(this.administration=s.data.activity.datas.administration),s.data.activity.datas.documents&&this.handlerUpdateDocuments(s.data.activity.datas.documents),s.data.activity.datas.notes&&(this.notes=s.data.activity.datas.notes.entities,this.notes_url=s.data.activity.datas.notes.url),s.data.activity.datas.milestones&&(this.milestones=s.data.activity.datas.milestones.entities,this.milestonesTypes=s.data.activity.datas.milestones.types,this.milestonesUrl=s.data.activity.datas.milestones.url,this.milestonesUrlNotifications=s.data.activity.datas.milestones.urlNotifications),s.data.activity.datas.organizations&&(this.organizations=s.data.activity.datas.organizations.entities,this.organizationsUrl=s.data.activity.datas.organizations.url,this.organizationsUrlNew=s.data.activity.datas.organizations.urlNew,this.rolesOrganizations=s.data.activity.datas.organizations.roles),s.data.activity.datas.payments&&this.handlerUpdatePayments(s.data.activity.datas.payments),s.data.activity.datas.persons&&(this.persons=s.data.activity.datas.persons.entities,this.personsUrlNew=s.data.activity.datas.persons.urlNew,this.personsUrl=s.data.activity.datas.persons.url,this.rolesPersons=s.data.activity.datas.persons.roles),s.data.activity.datas.timesheets?(this.timesheets=s.data.activity.datas.timesheets,this.timesheetsValidators=s.data.activity.datas.timesheets.validators,this.timesheetsDeclarers=s.data.activity.datas.timesheets.declarers,this.timesheetsUrl=s.data.activity.datas.timesheets.url,this.timesheetsUrlSynthesis=s.data.activity.datas.timesheets.urlSynthesis):console.log("pas de donnée FEUILLE DE TEMPS"),s.data.activity.datas.workpackages?(this.workpackages=s.data.activity.datas.workpackages.entities,this.workpackagesUrl=s.data.activity.datas.workpackages.url):console.log("pas de donnée LOTS DE TRAVAIL"),this.credentials=s.data.activity.credentials},s=>{this.handlerError(j.manageErrorResponse(s))}).finally(s=>{this.loading=!1})},handlerDuplicate(){this.duplicateDatas={displayed:!1,keepPersons:!0,keepOrganizations:!0,keepMilestones:!0,keepWorkpackages:!1,keepAdmData:!1}},handlerDuplicateDo(){document.location=this.core.urls.duplicate+"?"+(this.duplicateDatas.keepPersons?"&keeppersons=on":"")+(this.duplicateDatas.keepOrganizations?"&keeporganizations=on":"")+(this.duplicateDatas.keepMilestones?"&keepmilestones=on":"")+(this.duplicateDatas.keepWorkpackages?"&keepworkpackage=on":"")+(this.duplicateDatas.keepAdmData?"&keepadmdata=on":"")},handlerShowProject(){this.activity.project.url_show&&(document.location=this.activity.project.url_show)}},mounted(){this.fetch();let s=localStorage.getItem(F);s?s=JSON.parse(s):s=[],this.sticky=s}},Ll={class:"alert alert-danger"},Jl={key:0,class:"overlay"},Hl={class:"overlay-content"},Bl={class:"row",style:{width:"80%"}},Yl={class:"col-md-6 col-md-offset-3"},Gl={class:"col-md-6 col-md-offset-3"},Kl={class:"list-group-item separator-bottom"},Xl={class:"material-switch pull-right"},Ql={class:"list-group-item separator-bottom"},Zl={class:"material-switch pull-right"},$l={class:"list-group-item separator-bottom"},ei={class:"material-switch pull-right"},ti={class:"list-group-item separator-bottom"},si={class:"material-switch pull-right"},ni={class:"list-group-item separator-bottom"},li={class:"material-switch pull-right"},ii={class:"text-center"},oi={key:1},ri={class:"navbar navbar-default navbar-fixed-top",style:{top:"50px","z-index":"500"}},ai={class:"container"},di={class:"navbar-header"},ui={class:"navbar-brand",href:"#"},mi={class:"collapse navbar-collapse",id:"bs-example-navbar-collapse-1"},ci={class:"nav navbar-nav"},pi={key:0,href:"#members"},fi={key:0,href:"#partners"},vi={key:0,href:"#documents"},hi={key:0,href:"#milestones"},gi={key:0,href:"#notes"},yi={key:0,href:"#payments"},ki={key:0,href:"#spents"},bi={key:0,href:"#timesheets"},Di={class:"nav navbar-nav navbar-right"},_i={class:"dropdown"},wi={class:"dropdown-menu"},Ci={key:0},Pi={key:1},Ai=["onClick"],Ui={key:0,class:"icon-link-ext"},Si={class:"jumbotron activity-header oscar-header",style:{"margin-top":"60px"}},Mi={class:"row line-bottom"},Ei={class:"col-md-9"},Vi={class:"activity-project"},xi={key:0},Ni={key:1},ji=["href"],Oi={key:0},zi={key:1},Ri={class:"activity-type"},Fi={class:"type-chain"},Ii={class:"col-md-3"},Wi={key:0,class:"budget"},Ti={class:"text-private amount"},qi={class:"details"},Li={class:"text-private"},Ji={key:0,class:"text-private"},Hi={class:"text-private"},Bi={class:"text-private"},Yi={class:"text-private"},Gi={class:"row"},Ki={class:"col-md-4"},Xi={class:"texthighlight baseline"},Qi={class:"aggo"},Zi={class:"aggo"},$i={class:"aggo"},eo={class:"aggo"},to={class:"col-md-4"},so={class:"texthighlight baseline"},no={key:0,class:"text-private"},lo={key:1,class:"text-private"},io={class:"texthighlight baseline"},oo={class:"col-md-4"},ro={class:"texthighlight baseline"},ao={class:"row line-bottom"},uo={class:"col-md-4"},mo={class:"texthighlight baseline"},co={class:"cartouche xs"},po={class:"texthighlight baseline"},fo={class:"cartouche complementary",style:{"line-break":"anywhere"}},vo={class:"row"},ho={class:"col-md-12"},go={class:"admin-bar"},yo={key:1},ko={key:0,class:"btn btn-default disabled"},bo=["href"],Do=["href"],_o=["href"],wo={class:"container-fluid"},Co={class:"col-md-8"},Po={key:0,class:"section-infos",id:"members"},Ao={key:1,class:"section-infos",id:"partners"},Uo={key:2,class:"section-infos",id:"avenants"},So={key:3,class:"section-infos",id:"documents"},Mo={key:4,class:"section-infos",id:"notes"},Eo={key:5,id:"timesheets",class:"section-infos"},Vo={key:0,class:"alert alert-info"},xo={key:1},No={class:"oscar-section"},jo={class:"oscar-section-content"},Oo=["href"],zo=["href"],Ro={key:0},Fo={class:"oscar-section"},Io={class:"oscar-section-content"},Wo={key:0},To=["href"],qo={key:0},Lo={key:1,class:"alert-warning alert"},Jo={class:"oscar-section"},Ho={class:"oscar-section-title"},Bo=["href"],Yo={class:"row oscar-section-content"},Go={class:"col-md-4"},Ko={key:0,class:"alert alert-warning"},Xo={class:"cartouche primary person"},Qo={class:"col-md-4"},Zo={key:0,class:"alert alert-warning"},$o={class:"cartouche person primary"},er={class:"col-md-4"},tr={key:0,class:"alert alert-warning"},sr={class:"cartouche person primary"},nr={class:"oscar-section"},lr={class:"oscar-section-content"},ir={class:"col-md-4"},or={key:0,id:"milestones",class:"section-infos"},rr=["href"],ar={key:1,id:"payments",class:"section-infos"},dr={key:2,id:"spents",class:"section-infos"},ur={key:0,class:"alert alert-warning"},mr={key:1},cr={class:"buttons xs"},pr=["href"],fr=["href"],vr={class:"section-infos"},hr=["href"],gr={key:0,class:"container-fluid activity-fiche"},yr={class:"row"},kr={class:"col-md-12"},br={key:2};function Dr(s,e,a,k,n,o){const y=D("loader"),v=D("VueJsonPretty"),c=D("modal"),M=D("EntityWithRole"),q=D("activity-avenants"),L=D("activity-document"),I=D("activity-notes"),m=D("PersonDisplay"),f=D("workpackages-activity"),N=D("Milestones"),Q=D("Payments"),Z=D("ActivitySpentSynthesis"),$=D("ActivityLogs");return l(),i(b,null,[g(y,{text:"Chargement de l'activité",visible:n.loading},null,8,["visible"]),g(c,{title:"Debugger","title-icon":"icon-bug",visible:n.debug_displayed,onModalCancel:e[1]||(e[1]=p=>n.debug_displayed=!1)},{buttons:P(()=>[t("button",{class:"btn btn-default",onClick:e[0]||(e[0]=(...p)=>o.handlerDebugHide&&o.handlerDebugHide(...p))},"FERMER")]),default:P(()=>[g(v,{data:n.debug_content},null,8,["data"])]),_:1},8,["visible"]),g(c,{title:"Une erreur est survenue","title-icon":"icon-bug",visible:n.error!=null},{buttons:P(()=>[t("button",{class:"btn btn-default",onClick:e[2]||(e[2]=p=>n.error=null)},"FERMER")]),default:P(()=>[t("div",Ll,u(n.error),1)]),_:1},8,["visible"]),n.duplicateDatas!=null?(l(),i("div",Jl,[t("div",Hl,[e[36]||(e[36]=t("h1",{class:"overlay-title"},"Dupliquer cette activité",-1)),t("a",{class:"overlay-closer",onClick:e[3]||(e[3]=p=>n.duplicateDatas=null)},"x"),t("div",Bl,[t("h1",Yl,[e[21]||(e[21]=t("small",null,"Options de copie pour",-1)),e[22]||(e[22]=r()),e[23]||(e[23]=t("br",null,null,-1)),t("strong",null,u(n.core.label),1)]),t("div",Gl,[t("div",Kl,[e[25]||(e[25]=t("strong",null,[t("i",{class:"icon-group"}),r(" Reprendre les personnes ")],-1)),t("div",Xl,[w(t("input",{id:"keeppersons",name:"keeppersons",type:"checkbox","onUpdate:modelValue":e[4]||(e[4]=p=>n.duplicateDatas.keepPersons=p)},null,512),[[R,n.duplicateDatas.keepPersons]]),e[24]||(e[24]=t("label",{for:"keeppersons",class:"label-primary"},null,-1))])]),t("div",Ql,[e[27]||(e[27]=t("strong",null,[t("i",{class:"icon-calendar"}),r(" Reprendre les jalons ")],-1)),t("div",Zl,[w(t("input",{id:"keepmilestones",name:"keepmilestones",type:"checkbox","onUpdate:modelValue":e[5]||(e[5]=p=>n.duplicateDatas.keepMilestones=p)},null,512),[[R,n.duplicateDatas.keepMilestones]]),e[26]||(e[26]=t("label",{for:"keepmilestones",class:"label-primary"},null,-1))])]),t("div",$l,[e[29]||(e[29]=t("strong",null,[t("i",{class:"icon-building-filled"}),r(" Reprendre les organisations ")],-1)),t("div",ei,[w(t("input",{id:"keeporganizations",name:"keeporganizations",type:"checkbox","onUpdate:modelValue":e[6]||(e[6]=p=>n.duplicateDatas.keepOrganizations=p)},null,512),[[R,n.duplicateDatas.keepOrganizations]]),e[28]||(e[28]=t("label",{for:"keeporganizations",class:"label-primary"},null,-1))])]),t("div",ti,[e[31]||(e[31]=t("strong",null,[t("i",{class:"icon-archive"}),r(" Reprendre les lots de travail ")],-1)),t("div",si,[w(t("input",{id:"keepworkpackages",name:"keepworkpackages",type:"checkbox","onUpdate:modelValue":e[7]||(e[7]=p=>n.duplicateDatas.keepWorkpackages=p)},null,512),[[R,n.duplicateDatas.keepWorkpackages]]),e[30]||(e[30]=t("label",{for:"keepworkpackages",class:"label-primary"},null,-1))])]),t("div",ni,[e[33]||(e[33]=t("strong",null,[t("i",{class:"icon-archive"}),r(" Reprendre les données de base ")],-1)),e[34]||(e[34]=t("br",null,null,-1)),e[35]||(e[35]=t("small",null,"Données du formulaire de créaton : Dates de début / fin, intitulé, description, type, etc...",-1)),t("div",li,[w(t("input",{id:"keepadmdata",name:"keepadmdata",type:"checkbox","onUpdate:modelValue":e[8]||(e[8]=p=>n.duplicateDatas.keepAdmData=p)},null,512),[[R,n.duplicateDatas.keepAdmData]]),e[32]||(e[32]=t("label",{for:"keepadmdata",class:"label-primary"},null,-1))])]),t("nav",ii,[t("a",{href:"#",class:"btn btn-primary",onClick:e[9]||(e[9]=p=>n.duplicateDatas=null)},"Annuler"),t("a",{href:"#",class:"btn btn-default",onClick:e[10]||(e[10]=(...p)=>o.handlerDuplicateDo&&o.handlerDuplicateDo(...p))},"Dupliquer l'activité")])])])])])):d("",!0),n.core&&n.credentials&&n.credentials.read?(l(),i("div",oi,[t("nav",ri,[t("div",ai,[t("div",di,[e[38]||(e[38]=ne('',1)),t("a",ui,[e[37]||(e[37]=t("i",{class:"icon-cube"},null,-1)),t("strong",null,u(n.core.numOscar),1),t("span",null," / "+u(o.labelReduced),1),t("i",{class:"icon-pin",style:le({opacity:o.isSticky?1:.3}),onClick:e[11]||(e[11]=(...p)=>o.toogleSticky&&o.toogleSticky(...p))},null,4)])]),t("div",mi,[t("ul",ci,[t("li",null,[n.credentials.persons.read?(l(),i("a",pi,"Membres")):d("",!0)]),t("li",null,[n.credentials.organizations.read?(l(),i("a",fi,"Partenaires")):d("",!0)]),t("li",null,[n.credentials.documents.read?(l(),i("a",vi,"Documents")):d("",!0)]),t("li",null,[n.credentials.milestones.read?(l(),i("a",hi,"Jalons")):d("",!0)]),t("li",null,[n.credentials.notes.read?(l(),i("a",gi,"Notes")):d("",!0)]),t("li",null,[n.credentials.budget.read?(l(),i("a",yi,"Versements")):d("",!0)]),t("li",null,[n.credentials.spents.read?(l(),i("a",ki,"Dépenses")):d("",!0)]),t("li",null,[n.credentials.timesheets.read?(l(),i("a",bi,"Feuilles de temps")):d("",!0)])]),t("ul",Di,[t("li",_i,[e[44]||(e[44]=t("a",{href:"#",class:"dropdown-toggle","data-toggle":"dropdown",role:"button","aria-haspopup":"true","aria-expanded":"false"},[t("i",{class:"icon-pin text-primary"}),t("span",{class:"caret"})],-1)),t("ul",wi,[o.isSticky?(l(),i("li",Ci,[t("a",{href:"#",onClick:e[12]||(e[12]=(...p)=>o.handlerUnSticky&&o.handlerUnSticky(...p))},"Désépingler")])):(l(),i("li",Pi,[t("a",{href:"#",onClick:e[13]||(e[13]=h((...p)=>o.handlerSticky&&o.handlerSticky(...p),["prevent"]))},e[39]||(e[39]=[t("i",{class:"icon-pin-outline"},null,-1),r(" Epingler")]))])),e[42]||(e[42]=t("li",{role:"separator",class:"divider"},null,-1)),(l(!0),i(b,null,_(n.sticky,p=>(l(),i("li",{class:C(p.id==n.core.id?"disabled":"")},[t("a",{href:"#",onClick:Y=>o.handlerNavigateSticky(p)},[e[40]||(e[40]=t("i",{class:"icon-cube"},null,-1)),t("strong",null,u(p.num),1),t("em",null,u(p.label),1),p.id!=n.core.id?(l(),i("i",Ui)):d("",!0)],8,Ai)],2))),256)),e[43]||(e[43]=t("li",{role:"separator",class:"divider"},null,-1)),t("li",null,[t("a",{href:"#",onClick:e[14]||(e[14]=h((...p)=>o.handlerPurgeSticky&&o.handlerPurgeSticky(...p),["prevent"]))},e[41]||(e[41]=[t("i",{class:"icon-trash"},null,-1),r(" Supprimer les épingles ")]))])])])])])])]),t("header",Si,[t("div",Mi,[t("div",Ei,[t("h4",Vi,[e[45]||(e[45]=t("i",{class:"icon-cubes"},null,-1)),e[46]||(e[46]=r(" ")),n.core.project===null?(l(),i("em",xi,"Aucun Projet")):(l(),i("span",Ni,[n.credentials.project.read?(l(),i("a",{key:0,href:n.core.project.url_show},[n.core.project.acronym?(l(),i("strong",Oi,u(n.core.project.acronym)+" ",1)):d("",!0),t("em",null,u(n.core.project.label),1)],8,ji)):(l(),i("span",zi,[t("strong",null,u(n.core.project.acronym),1),t("em",null,u(n.core.project.label),1)]))]))]),t("h3",null,[t("span",{class:C(["picto status-","status-"+n.core.status])},[t("i",{class:C(["icon","icon-"+n.core.status])},null,2),r(" "+u(n.core.status_label),1)],2),t("span",Ri,[e[47]||(e[47]=t("i",{class:"icon-tag"},null,-1)),t("span",Fi,[t("i",{class:C(n.core.type_slug)},null,2),(l(!0),i(b,null,_(n.core.type_chain,p=>(l(),i("span",null,u(p.label),1))),256))])])]),t("h1",null,[t("span",null,[e[48]||(e[48]=t("i",{class:"icon-cube"},null,-1)),r(" "+u(n.core.label),1)])])]),t("div",Ii,[n.budget&&n.credentials.budget.read?(l(),i("div",Wi,[e[54]||(e[54]=t("em",null,"Montant",-1)),t("strong",Ti,u(s.$filters.money(n.budget.montant))+" "+u(n.budget.currency.symbol),1),t("div",qi,[t("small",null,[e[49]||(e[49]=r(" Frais de gestion : ")),t("b",Li,u(n.budget.fraisDeGestion),1)]),t("small",null,[e[50]||(e[50]=r(" Part unité : ")),n.budget.fraisDeGestionPartUnite?(l(),i("b",Ji,u(n.budget.fraisDeGestionPartUnite),1)):d("",!0)]),t("small",null,[e[51]||(e[51]=r(" Part hébergeur : ")),t("b",Hi,u(n.budget.fraisDeGestionPartHebergeur),1)]),t("small",null,[e[52]||(e[52]=r(" Part Gestionnaire : ")),t("b",Bi,u(n.budget.fraisDeGestionPartGestionnaire),1)]),t("small",null,[e[53]||(e[53]=r(" TVA : ")),t("b",Yi,u(n.budget.tva),1)])])])):d("",!0)])]),n.core.description?(l(),i("p",{key:0,class:C(["baseline",{descriptionPacked:!n.descriptionFull}]),onClick:e[15]||(e[15]=p=>n.descriptionFull=!n.descriptionFull)},[t("small",null,u(n.core.description),1)],2)):d("",!0),t("div",Gi,[t("div",Ki,[e[62]||(e[62]=t("h4",null,[t("i",{class:"icon-calendar"}),r("Dates")],-1)),t("p",Xi,[e[55]||(e[55]=r(" Début : ")),t("time",null,u(s.$filters.date(n.core.dateStart)),1),t("small",Qi," ("+u(s.$filters.timeAgo(n.core.dateStart))+")",1),e[56]||(e[56]=t("br",null,null,-1)),e[57]||(e[57]=r(" Fin : ")),t("time",null,u(s.$filters.dateFull(n.core.dateEnd)),1),t("small",Zi," ("+u(s.$filters.timeAgo(n.core.dateEnd))+")",1),e[58]||(e[58]=t("br",null,null,-1)),e[59]||(e[59]=r(" Signé le : ")),t("time",null,u(s.$filters.dateFull(n.core.dateSigned)),1),t("small",$i," ("+u(s.$filters.timeAgo(n.core.dateSigned))+")",1),e[60]||(e[60]=t("br",null,null,-1)),e[61]||(e[61]=r(" Date de début des négociations : ")),t("time",null,u(s.$filters.dateFull(n.core.dateNegociation)),1),t("small",eo," ("+u(s.$filters.timeAgo(n.core.dateNegociation))+")",1)])]),t("div",to,[e[68]||(e[68]=t("h4",null,[t("i",{class:"icon-briefcase"}),r("Numérotations")],-1)),t("p",so,[e[63]||(e[63]=r(' N° Oscar" : ')),t("strong",null,u(n.core.numOscar),1),e[64]||(e[64]=t("br",null,null,-1)),e[65]||(e[65]=r(" Numéro financier : ")),n.core.pfi?(l(),i("strong",no,u(n.core.pfi),1)):(l(),i("strong",lo,"AUCUN")),e[66]||(e[66]=r(" - Ouverture du PFI le ")),t("time",null,u(s.$filters.dateFull(n.core.dateOpened)),1),e[67]||(e[67]=t("br",null,null,-1))]),(l(!0),i(b,null,_(n.core.numeros,(p,Y)=>(l(),i("p",io,[r(u(Y)+" : ",1),t("strong",null,u(p),1)]))),256))]),t("div",oo,[e[72]||(e[72]=t("h4",null,[t("i",{class:"icon-database-1"}),r("Divers")],-1)),t("p",ro,[e[69]||(e[69]=r(" Création ")),t("time",null,u(s.$filters.dateFull(n.core.dateCreated)),1),e[70]||(e[70]=t("br",null,null,-1)),e[71]||(e[71]=r(" Dernière MAJ ")),t("time",null,u(s.$filters.dateFull(n.core.dateUpdated)),1)])])]),t("div",ao,[t("div",uo,[e[76]||(e[76]=t("h4",null,[t("i",{class:"icon-tags"}),r("Métas-données")],-1)),t("p",mo,[e[73]||(e[73]=r(" Disciplines : ")),(l(!0),i(b,null,_(n.core.disciplines,p=>(l(),i("span",co,u(p),1))),256))]),t("p",po,[e[75]||(e[75]=r(" Mots clés : ")),(l(!0),i(b,null,_(n.core.motscles,p=>(l(),i("span",fo,[e[74]||(e[74]=t("i",{class:"icon-tag"},null,-1)),r(" "+u(p),1)]))),256))])])]),t("div",vo,[t("div",ho,[t("nav",go,[n.credentials.lock_edit?(l(),i(b,{key:0},[n.credentials.lock?(l(),i("a",{key:0,class:"btn btn-info",onClick:e[16]||(e[16]=p=>o.handlerLock())},e[77]||(e[77]=[t("i",{class:"icon-lock-open"},null,-1),r(" Déverrouiller")]))):(l(),i("a",{key:1,class:"btn btn-info",onClick:e[17]||(e[17]=p=>o.handlerUnlock())},e[78]||(e[78]=[t("i",{class:"icon-lock"},null,-1),r(" Vérrouiller")])))],64)):n.credentials.lock?(l(),i("span",yo,[n.credentials.lock?(l(),i("strong",ko,e[79]||(e[79]=[t("i",{class:"icon-lock"},null,-1),r(" VERROUILLEE ")]))):d("",!0)])):d("",!0),n.credentials.core.edit?(l(),i("a",{key:2,class:"btn btn-primary",href:n.core.urls.edit},e[80]||(e[80]=[t("i",{class:"icon-pencil"},null,-1),r(" Modifier les informations")]),8,bo)):d("",!0),n.credentials.core.change_project?(l(),i("a",{key:3,class:"btn btn-default",href:n.core.urls.change_project},e[81]||(e[81]=[t("i",{class:"icon-cubes"},null,-1),r(" Modifier le projet")]),8,Do)):d("",!0),n.credentials.core.new_project?(l(),i("a",{key:4,class:"btn btn-default",href:n.core.urls.new_project},e[82]||(e[82]=[t("i",{class:"icon-cubes"},null,-1),r(" Créer un nouveau projet")]),8,_o)):d("",!0),n.core.urls.duplicate?(l(),i("a",{key:5,class:"btn btn-default",onClick:e[18]||(e[18]=(...p)=>o.handlerDuplicate&&o.handlerDuplicate(...p))},e[83]||(e[83]=[t("i",{class:"icon-paste"},null,-1),r(" Dupliquer")]))):d("",!0),a.debugEnabled?(l(),i("a",{key:6,class:"btn btn-warning",onClick:e[19]||(e[19]=p=>o.handlerDebugShow(s.$data))},e[84]||(e[84]=[t("i",{class:"icon-bug"},null,-1),r(" Afficher le modèle")]))):d("",!0),a.debugEnabled?(l(),i("a",{key:7,class:"btn btn-warning",onClick:e[20]||(e[20]=(...p)=>o.fetch&&o.fetch(...p))},e[85]||(e[85]=[t("i",{class:"icon-bug"},null,-1),r(" Recharger le modèle")]))):d("",!0)])])])]),t("div",wo,[t("div",Co,[n.credentials.persons.read?(l(),i("section",Po,[e[86]||(e[86]=t("h2",null,[t("span",null,[t("i",{class:"icon-group"}),r("Membres")])],-1)),g(M,{title:"Personne",standalone:!1,"entity-link-show":n.credentials.persons.show,manage:n.credentials.persons.edit,roles:n.rolesPersons,items:n.persons,"url-new":n.personsUrlNew,url:n.personsUrl,"debug-enabled":a.debugEnabled,onUpdate:o.handlerUpdatePersons},null,8,["entity-link-show","manage","roles","items","url-new","url","debug-enabled","onUpdate"])])):d("",!0),n.credentials.organizations.read?(l(),i("section",Ao,[e[87]||(e[87]=t("h2",null,[t("span",null,[t("i",{class:"icon-building-filled"}),r("Partenaires")])],-1)),g(M,{title:"Organisation",standalone:!1,"debug-enabled":a.debugEnabled,"entity-link-show":n.credentials.organizations.show,manage:n.credentials.organizations.edit,roles:n.rolesOrganizations,items:n.organizations,url:n.organizationsUrl,"url-new":n.organizationsUrlNew,onUpdate:o.handlerUpdateOrganizations},null,8,["debug-enabled","entity-link-show","manage","roles","items","url","url-new","onUpdate"])])):d("",!0),n.credentials.avenants.read?(l(),i("section",Uo,[e[88]||(e[88]=t("h2",null,[t("span",null,[t("i",{class:"icon-hammer"}),r(" Avenants ")])],-1)),g(q,{avenants:n.avenants,"roles-person":n.rolesPersons,"roles-organization":n.rolesOrganizations,"current-persons":n.persons,"current-organizations":n.organizations,manage:n.credentials.avenants.edit,onUpdate:o.handlerUpdateAvenants},null,8,["avenants","roles-person","roles-organization","current-persons","current-organizations","manage","onUpdate"])])):d("",!0),n.credentials.documents.read?(l(),i("section",So,[e[89]||(e[89]=t("h2",null,[t("span",null,[t("i",{class:"icon-book"}),r("Documents")])],-1)),g(L,{onDebug:o.handlerDebug,onUpdated:o.handlerUpdateDocuments,"debug-enabled":a.debugEnabled,standalone:!0,"sa-tabs":n.documents.tabs,"sa-types":n.documents.typesDocuments,"sa-generated-documents":n.documents.generatedDocuments,"sa-computed-documents":n.documents.computedDocuments,"sa-process-datas":n.documents.processDatas,"sa-credentials":n.credentials.documents,url:n.documents.url,"url-upload-new-doc":n.documents.url_upload_new_doc,"url-sign-document":n.documents.url_sign_document},null,8,["onDebug","onUpdated","debug-enabled","sa-tabs","sa-types","sa-generated-documents","sa-computed-documents","sa-process-datas","sa-credentials","url","url-upload-new-doc","url-sign-document"])])):d("",!0),n.credentials.notes.read?(l(),i("section",Mo,[e[90]||(e[90]=t("h2",null,[t("span",null,[t("i",{class:"icon-comment"}),r("Notes")])],-1)),g(I,{url:n.notes_url,showallowed:n.credentials.notes.read,manageuserallowed:n.credentials.notes.edit,manageadminallowed:n.credentials.notes.manage,items:n.notes,onUpdate:o.handlerUpdateNotes},null,8,["url","showallowed","manageuserallowed","manageadminallowed","items","onUpdate"])])):d("",!0),n.credentials.timesheets.read?(l(),i("section",Eo,[e[103]||(e[103]=t("h2",{class:"section-title"},[t("span",null,[t("i",{class:"icon-book"}),r("Feuille de temps")])],-1)),n.timesheets.enabled?(l(),i("div",xo,[t("section",No,[e[94]||(e[94]=t("h3",{class:"oscar-section-title"},[t("span",null,[t("i",{class:"icon-calendar"}),r("Général")])],-1)),t("div",jo,[t("a",{href:n.timesheets.url,class:"btn btn-primary"},e[92]||(e[92]=[t("i",{class:"icon-calendar"},null,-1),r(" Informations générales et lots de travails ")]),8,Oo),t("a",{href:n.timesheets.urlSynthesis,class:"btn btn-default"},e[93]||(e[93]=[t("i",{class:"icon-book"},null,-1),r(" Résumé et documents ")]),8,zo)])]),n.workpackages?(l(),i("section",Ro,[t("div",Fo,[e[96]||(e[96]=t("h3",{class:"oscar-section-title"},[t("span",null,[t("i",{class:"icon-group"}),r("Déclarants")])],-1)),t("div",Io,[n.timesheets.declarers.length?(l(),i("div",Wo,[(l(!0),i(b,null,_(n.timesheetsDeclarers,p=>(l(),i("a",{href:p.url_details,class:C(["btn",p.hasDeclaration?"btn-primary":"btn-default"])},[g(m,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"]),p.hasDeclaration==!1?(l(),i("small",qo," (Aucune déclaration) ")):d("",!0)],10,To))),256))])):(l(),i("div",Lo,e[95]||(e[95]=[r(" Pour ajouter des déclarants, créez des "),t("strong",null,"Lots de travail",-1),r(" puis identifier les déclarants parmis les membres ")])))])]),t("div",Jo,[t("h3",Ho,[e[98]||(e[98]=t("span",{class:"text"},[t("i",{class:"icon-user-md"}),r(" Valideurs ")],-1)),t("nav",null,[t("a",{href:n.timesheets.url+"#validators",class:"btn btn-primary btn-xs"},e[97]||(e[97]=[t("i",{class:"icon-user-md"},null,-1),r(" Désigner des validateurs ")]),8,Bo)])]),t("div",Yo,[t("div",Go,[e[99]||(e[99]=t("h4",null,[t("i",{class:"icon-cube"}),r("Validation projet")],-1)),n.timesheets.validators.prj.length===0?(l(),i("div",Ko," Aucun validateur pour cette étape ")):d("",!0),t("div",null,[(l(!0),i(b,null,_(n.timesheetsValidators.prj,p=>(l(),i("span",Xo,[g(m,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"])]))),256))])]),t("div",Qo,[e[100]||(e[100]=t("h4",null,[t("i",{class:"icon-beaker"}),r("Validation scientifique")],-1)),n.timesheets.validators.sci.length===0?(l(),i("div",Zo," Aucun validateur pour cette étape ")):d("",!0),(l(!0),i(b,null,_(n.timesheetsValidators.sci,p=>(l(),i("span",$o,[g(m,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"])]))),256))]),t("div",er,[e[101]||(e[101]=t("h4",null,[t("i",{class:"icon-book"}),r("Validation administrative")],-1)),n.timesheets.validators.adm.length===0?(l(),i("div",tr," Aucun validateur pour cette étape ")):d("",!0),(l(!0),i(b,null,_(n.timesheetsValidators.adm,p=>(l(),i("span",sr,[g(m,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"])]))),256))])])]),t("div",nr,[e[102]||(e[102]=t("h3",{class:"oscar-section-title"},[t("span",null,[t("i",{class:"icon-archive"}),r("Lots de travail")])],-1)),r(" "+u(s.personWP)+" ",1),t("div",lr,[g(f,{"debug-enabled":a.debugEnabled,"allow-tooltip":n.credentials.persons.show,editable:n.credentials.workpackages.edit,workpackages:n.workpackages,url:n.workpackagesUrl,persons:o.personsWP,onUpdate:o.handlerUpdateWorkpackages},null,8,["debug-enabled","allow-tooltip","editable","workpackages","url","persons","onUpdate"])])])])):d("",!0)])):(l(),i("div",Vo,[e[91]||(e[91]=r(" Feuilles de temps non-disponible pour cette activité : ")),t("strong",null,u(n.timesheets.informations),1)]))])):d("",!0)]),t("aside",ir,[n.credentials.milestones.read?(l(),i("section",or,[e[105]||(e[105]=t("span",null,[t("h2",null,[t("i",{class:"icon-calendar"}),r("Jalons")])],-1)),g(N,{url:n.milestonesUrl,manage:n.credentials.milestones.edit,progression:n.credentials.milestones.progression,payments:n.payments,items:n.milestones,types:n.milestonesTypes,onUpdate:o.handlerUpdateMilestones},null,8,["url","manage","progression","payments","items","types","onUpdate"]),n.milestonesUrlNotifications?(l(),i("a",{key:0,href:n.milestonesUrlNotifications,class:"btn btn-primary"},e[104]||(e[104]=[t("i",{class:"icon-bell"},null,-1),r(" Voir les notifications planifiées ")]),8,rr)):d("",!0)])):d("",!0),n.credentials.payments.read?(l(),i("section",ar,[e[106]||(e[106]=t("h2",null,[t("span",null,[t("i",{class:"icon-bank"}),r("Versements")])],-1)),g(Q,{url:n.paymentsUrl,manage:n.credentials.payments.edit,amount:n.budget.amount,payments:n.payments,currencies:n.currencies,onDebug:o.handlerDebugShow,onUpdate:o.handlerUpdatePayments},null,8,["url","manage","amount","payments","currencies","onDebug","onUpdate"])])):d("",!0),n.credentials.spents.read?(l(),i("section",dr,[e[109]||(e[109]=t("h2",null,[t("span",null,[t("i",{class:"icon-bank"}),r("Dépenses")])],-1)),n.spents.enabled?(l(),i("div",mr,[g(Z,{standalone:!1,datas:n.spents},null,8,["datas"]),t("nav",cr,[n.credentials.spents.details?(l(),i("a",{key:0,href:n.spents.url_details,class:"btn btn-primary btn"},e[107]||(e[107]=[t("i",{class:"icon-file-excel"},null,-1),r(" Détails des dépenses")]),8,pr)):d("",!0),n.credentials.spents.previsionnel?(l(),i("a",{key:1,href:s.spentsUrlPrevisionnel,class:"btn btn-primary btn"},e[108]||(e[108]=[t("i",{class:"icon-file-excel"},null,-1),r(" Dépenses prévisionnelles (beta)")]),8,fr)):d("",!0)])])):(l(),i("div",ur," Dépenses indisponibles : "+u(n.spents.enabled_reason),1))])):d("",!0),t("section",vr,[e[110]||(e[110]=t("h2",null,"PCRU",-1)),t("a",{href:n.core.urls.pcru,class:"btn btn-primary btn-xs"}," Accès aux informations PCRU ",8,hr)])])]),n.credentials.administration.read?(l(),i("div",gr,[t("div",yr,[t("div",kr,[e[111]||(e[111]=t("h2",null,[t("span",null,[t("i",{class:"icon-cog"}),r("Technique")])],-1)),g($,{url:n.administration.url_logs},null,8,["url"])])])])):d("",!0)])):(l(),i("div",br," Données inaccessibles "))],64)}const _r=S(ql,[["render",Dr],["__scopeId","data-v-8de60033"]]);let B=document.querySelector("#activity");const X=ie(_r,{url:B.dataset.url,"debug-enabled":B.dataset.debugEnabled,manage:B.dataset.manage});X.config.globalProperties.$filters={timeAgo(s){return H.timeAgo(s)},date(s){return H.date(s)},dateFull(s){return H.dateFull(s)},filesize(s){return oe.filesize(s)},money(s){return re.money(s)},log(s){return he.log(s)}};X.mount("#activity");
diff --git a/public/js/oscar/vite/dist/assets/activity-d961ddb0.js b/public/js/oscar/vite/dist/assets/activity-d961ddb0.js
new file mode 100644
index 0000000000000000000000000000000000000000..8516a72deb9f95dccfa278ce5f3bd3f8d15c4dd1
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/activity-d961ddb0.js
@@ -0,0 +1 @@
+import{r as D,o as l,c as o,a,t as c,b as g,w as C,v as x,d as e,e as X,f as W,g as d,h as v,n as P,F as b,p as T,i as q,j as A,k as w,l as j,m as I,q as N,s as S,T as M,u as re,x as de,S as ce,y as ue,z as he,A as me}from"../vendor.js";import{m as Q}from"../vendor2.js";import{f as pe}from"../vendor3.js";import{m as _e}from"../vendor4.js";import{M as se}from"../vendor5.js";import{D as Y,P as fe}from"../vendor6.js";import{_ as E}from"../vendor7.js";import{A as B}from"../vendor8.js";import{O as ve}from"../vendor9.js";import{A as ge}from"../vendor10.js";import{A as ye}from"../vendor11.js";import{A as ke}from"../vendor12.js";import{A as be}from"../vendor13.js";import{A as z}from"../vendor14.js";import{E as De}from"../vendor15.js";import{g as R}from"../vendor16.js";import{L as we}from"../vendor17.js";import{P as ne}from"../vendor18.js";import{t as Ce}from"../vendor19.js";import"../vendor20.js";const Pe={name:"AvenantDate",emits:["update:change"],props:["change"],computed:{date:{get(){return this.change.value},set(t){this.change.value=t,this.$emit("update:change",change)}}},components:{Datepicker:Y}};function Ae(t,s,r,k,n,i){const y=D("Datepicker");return l(),o("div",null,[a(c(r.change.label)+" : ",1),g(y,{modelValue:i.date,"onUpdate:modelValue":s[0]||(s[0]=f=>i.date=f)},null,8,["modelValue"])])}const Ue=E(Pe,[["render",Ae]]),Se={props:{modelValue:Number},data(){return{isEditing:!1,rawValue:"",formattedValue:""}},computed:{displayValue:{get(){return this.isEditing?this.rawValue:this.formattedValue},set(t){this.rawValue=t}}},watch:{modelValue:{immediate:!0,handler(t){this.isEditing||(this.formattedValue=this.formatCurrency(t),this.rawValue=(t??"").toString().replace(".",","))}}},methods:{formatCurrency(t){return new Intl.NumberFormat("fr-FR",{style:"currency",currency:"EUR",minimumFractionDigits:2}).format(t)},startEditing(){this.isEditing=!0,this.rawValue=(this.modelValue??"").toString().replace(".",",")},finishEditing(){this.isEditing=!1;let t=parseFloat(this.rawValue.replace(",","."))||0;this.$emit("update:modelValue",t)},updateRawValue(t){this.rawValue=t.target.value}}};function Me(t,s,r,k,n,i){return C((l(),o("input",{type:"text","onUpdate:modelValue":s[0]||(s[0]=y=>i.displayValue=y),onFocus:s[1]||(s[1]=(...y)=>i.startEditing&&i.startEditing(...y)),onBlur:s[2]||(s[2]=(...y)=>i.finishEditing&&i.finishEditing(...y)),onInput:s[3]||(s[3]=(...y)=>i.updateRawValue&&i.updateRawValue(...y)),class:"form-control text-right"},null,544)),[[x,i.displayValue]])}const Ee=E(Se,[["render",Me]]);const Ve={name:"ButtonConfirm",props:{class:{type:String,default:"btn btn-default"},checkbox:{type:Boolean,default:!1}},data(){return{modal:!1,checked:!1}},computed:{confirmEnabled(){return this.checkbox&&this.checked||this.checkbox===!1}},watch:{modal(t){this.checked=!1}},methods:{handlerClick(){this.$emit("click")},handlerCancel(){this.modal=!1,this.$emit("cancel")},handlerConfirm(){this.confirmEnabled&&(this.modal=!1,this.$emit("confirm"))}},activated(){console.log("ButtonConfirm activated")}},$=t=>(T("data-v-efd4eea6"),t=t(),q(),t),xe={key:0,class:"overlay confirm-dialog"},Ne={class:"overlay-content"},je=$(()=>e("i",{class:"icon-attention-1"},null,-1)),Oe={class:"overlay-message"},ze={key:0},Re={for:"confirm_ok",class:"checkbox"},Ie=$(()=>e("i",{class:"icon-block"},null,-1)),Fe=$(()=>e("i",{class:"icon-ok-circled"},null,-1));function We(t,s,r,k,n,i){return l(),o(b,null,[n.modal?(l(),o("div",xe,[e("div",Ne,[e("h3",null,[je,X(t.$slots,"title",{},()=>[a(" Confirmer ? ")],!0)]),e("div",Oe,[X(t.$slots,"message",{},()=>[a(" Voulez-vous continuer ? ")],!0)]),r.checkbox?(l(),o("div",ze,[e("label",Re,[C(e("input",{type:"checkbox",id:"confirm_ok","onUpdate:modelValue":s[0]||(s[0]=y=>n.checked=y)},null,512),[[W,n.checked]]),a(" J'ai bien compris ")])])):d("",!0),e("nav",null,[e("a",{href:"#",onClick:s[1]||(s[1]=v((...y)=>i.handlerCancel&&i.handlerCancel(...y),["prevent"])),class:"btn btn-danger"},[Ie,a(" Annuler ")]),e("a",{href:"#",onClick:s[2]||(s[2]=v((...y)=>i.handlerConfirm&&i.handlerConfirm(...y),["prevent"])),class:P(["btn btn-success",{disabled:!i.confirmEnabled}])},[Fe,a(" Confirmer")],2)])])])):d("",!0),e("a",{href:"#",class:P(r.class),onClick:s[3]||(s[3]=v(y=>n.modal=!0,["prevent"]))},[X(t.$slots,"default",{},()=>[a("Texte par défaut")],!0)],2)],64)}const Te=E(Ve,[["render",We],["__scopeId","data-v-efd4eea6"]]);const qe={name:"ActivityAvenants",components:{ButtonConfirm:Te,Amount:Ee,AvenantDate:Ue,Datepicker:Y,Modal:se,OrganizationAutoComplete:ve,PersonAutoCompleter:fe},props:["roles-person","roles-organization","currentPersons","currentOrganizations","avenants","manage"],data(){return{edit:null,selectedPerson:null}},computed:{modificationsEnabled(){return{personAdd:!0,personDel:!0,organizationAdd:!0,organizationDel:!0,changeAmount:!this.edit.modifications.find(t=>t.type=="changeAmount"),dateEnd:!this.edit.modifications.find(t=>t.type=="dateEnd")}},persons(){let t={};return this.currentPersons&&this.currentPersons.forEach(s=>{t.hasOwnProperty(s.enrolled)||(t[s.enrolled]={id:s.enrolled,firstName:s.firstName,lastName:s.lastName,roles:{}}),t[s.enrolled].hasOwnProperty(s.roleId)||(t[s.enrolled].roles[s.roleId]=s.roleLabel)}),t},organizations(){let t={};return this.currentOrganizations&&this.currentOrganizations.forEach(s=>{t.hasOwnProperty(s.enrolled)||(console.log(s),t[s.enrolled]={id:s.enrolled,label:s.enrolledLabel,roles:{}}),t[s.enrolled].hasOwnProperty(s.roleId)||(t[s.enrolled].roles[s.roleId]=s.roleLabel)}),t}},methods:{handlerConfirm(t,s,r){console.log("confirm",t),s.call(this,r)},handlerOk(t){console.log(JSON.stringify(t)),console.log(this.avenants.url_api)},handlerNew(){this.edit={id:null,dateAvenant:null,comment:"",previousFile:null,file:null,modifications:[]}},handlerEdit(t){this.edit={id:t.id,dateAvenant:t.date,comment:t.comment,previousFile:t.filename,file:null,modifications:JSON.parse(JSON.stringify(t.modifications))}},handlerCancel(){console.log("CANCEL"),this.edit=null},handlerSave(){let t=new FormData;t.append("id",this.edit.id??""),t.append("dateAvenant",this.edit.dateAvenant??""),t.append("comment",this.edit.comment??""),t.append("file",this.edit.file??""),t.append("modifications",this.edit.modifications?JSON.stringify(this.edit.modifications):"");let s="Mise à jour de l'avenant";this.edit.id?t.append("action","update"):(t.append("action","create"),s="Création de l'avenant"),B.post(this.avenants.url_api,t,{pendingMsg:s}).then(r=>{this.edit=null,this.fetch()})},handlerDelete(t){B.delete(t.url_api,{pendingMsg:"Suppression de l'avenant"}).then(s=>{this.fetch()})},handlerApplyAvenant(t){console.log("Application de l'avenant");let s=new FormData;s.append("id",t.id),s.append("action","apply");let r="Application de l'avenant";B.post(this.avenants.url_api,s,{pendingMsg:r,pendingBack:!1}).then(k=>{document.location.reload()})},handlerAddChange(t){if(this.edit)switch(t){case"dateEnd":this.edit.modifications.push({type:t,mode:"new",label:"Date de fin",value1:new Date().toISOString()});break;default:this.edit.modifications.push({type:t,mode:"new",label:"A définir",value1:null,valueObj:null,value2:null})}},handlerRemoveChange(t){let s=this.edit.modifications.indexOf(t);s>=0&&this.edit.modifications.splice(s,1)},handlerUpdatePersonChange(t,s){t.valueObj={id:s.id,firstName:s.firstName,lastName:s.lastName},t.value1=s.id},handlerUpdateOrganizationChange(t,s){console.log(JSON.stringify(t)),t.valueObj={id:s.id,label:s.label},t.value1=s.id},handlerSelectToDel(t,s){console.log("Changement de la personne à supprimer",t,s),t.value1=t.valueObj.id,t.value2=null},async handlerSelectFile(t){if(t.target.files.length===0){this.edit.file=null;return}this.edit.file=t.target.files[0]},fetch(){B.get(this.avenants.url_api,{pendingMsg:"Chargement des avenants"}).then(t=>{this.$emit("update",t.data.datas.avenants)})}},mounted(){console.log("mounted")}},U=t=>(T("data-v-833d8759"),t=t(),q(),t),Le={action:""},Je=U(()=>e("div",{class:"alert alert-info"},[a(" Vous pourrez revenir modifier cet avenant plus tard tant qu'il est en mode "),e("strong",null,"brouillon"),a(". ")],-1)),He={class:"form-group"},Be=U(()=>e("label",{for:"dateAvenant"},"Date : ",-1)),Ye=U(()=>e("div",{class:"help"},[a(" Date de "),e("strong",null,"signature"),a(" de l'avenant ")],-1)),Ge={class:"form-group"},Ke=U(()=>e("label",{for:"name",class:""},"Modifications : ",-1)),Xe=U(()=>e("br",null,null,-1)),Qe={class:"btn-group"},Ze=U(()=>e("button",{type:"button",class:"btn btn-default dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},[a(" Ajouter une modification "),e("span",{class:"caret"})],-1)),$e={class:"dropdown-menu"},et={class:"modifications unsaved"},tt={class:"change"},st={key:0},nt=U(()=>e("span",{class:"text"}," Date de fin : ",-1)),lt={key:1},ot=U(()=>e("span",{class:"text"},"Nouveau montant : ",-1)),it={key:2},at=U(()=>e("span",{class:"text"},"Suppression d'un membre",-1)),rt=["onUpdate:modelValue","onChange"],dt=["value"],ct=["onUpdate:modelValue"],ut=["value"],ht={key:3},mt=U(()=>e("span",{class:"text"}," Ajout d'une personne : ",-1)),pt={key:0,class:"cartouche"},_t=["onClick"],ft=["onUpdate:modelValue"],vt=["value"],gt={key:4},yt=U(()=>e("span",{class:"text"}," Suppression d'une organisation : ",-1)),kt=["onUpdate:modelValue","onChange"],bt=["value"],Dt=["onUpdate:modelValue"],wt=["value"],Ct={key:5},Pt=U(()=>e("span",{class:"text"}," Ajout d'une organization : ",-1)),At=["onUpdate:modelValue"],Ut=["value"],St={key:6},Mt=["onClick"],Et=U(()=>e("i",{class:"icon-trash"},null,-1)),Vt=[Et],xt=U(()=>e("hr",null,null,-1)),Nt={class:"modifications saved"},jt={class:"change"},Ot={key:0,class:"icon-calendar"},zt={key:1,class:"icon-user"},Rt={key:2,class:"icon-bank"},It={key:3,class:"icon-user text-danger"},Ft={key:4,class:"icon-building-filled"},Wt={key:5,class:"icon-building-filled text-danger"},Tt=["onClick"],qt=U(()=>e("i",{class:"icon-trash"},null,-1)),Lt=[qt],Jt={class:"form-group"},Ht=U(()=>e("label",{for:"name"},"Fichier",-1)),Bt={key:0},Yt={class:"form-group"},Gt=U(()=>e("label",{for:"name"},"Commentaire",-1)),Kt={class:"avenants"},Xt={class:"admin-bar text-right"},Qt={key:0,class:"icon-ok-circled text-success"},Zt={key:1,class:"icon-pencil"},$t={class:"modification small"},es={class:"change"},ts={key:0,class:"icon-calendar"},ss={key:1,class:"icon-user"},ns={key:2,class:"icon-user text-danger"},ls={key:3,class:"icon-bank"},os={key:4,class:"icon-building-filled"},is={key:5,class:"icon-building-filled text-danger"},as={key:0},rs=["href"],ds=U(()=>e("i",{class:"icon-file-pdf"},null,-1)),cs=U(()=>e("i",{class:"icon-trash"},null,-1)),us=U(()=>e("strong",null,"définitivement",-1)),hs=["onClick"],ms=U(()=>e("i",{class:"icon-pencil"},null,-1)),ps=U(()=>e("i",{class:"icon-trash"},null,-1)),_s=U(()=>e("strong",null,"L'activité sera verrouillée",-1));function fs(t,s,r,k,n,i){const y=D("datepicker"),f=D("Datepicker"),h=D("Amount"),V=D("person-auto-completer"),G=D("organization-auto-complete"),K=D("modal"),H=D("ButtonConfirm");return l(),o(b,null,[g(K,{title:"Détails de l'avenant",visible:n.edit,onModalValid:i.handlerSave,onModalCancel:i.handlerCancel},{default:A(()=>[e("form",Le,[Je,e("div",He,[Be,Ye,g(y,{modelValue:n.edit.dateAvenant,"onUpdate:modelValue":s[0]||(s[0]=u=>n.edit.dateAvenant=u),id:"dateAvenant"},null,8,["modelValue"])]),e("div",Ge,[Ke,Xe,e("div",Qe,[Ze,e("ul",$e,[e("li",null,[e("a",{href:"#",onClick:s[1]||(s[1]=v(u=>i.handlerAddChange("personAdd"),["prevent"])),class:P(i.modificationsEnabled.personAdd?"":"disabled")},"Ajout d'une personne",2)]),e("li",null,[e("a",{href:"#",onClick:s[2]||(s[2]=v(u=>i.handlerAddChange("personDel"),["prevent"])),class:P(i.modificationsEnabled.personDel?"":"disabled")},"Suppression d'une personne",2)]),e("li",null,[e("a",{href:"#",onClick:s[3]||(s[3]=v(u=>i.handlerAddChange("organizationAdd"),["prevent"])),class:P(i.modificationsEnabled.organizationAdd?"":"disabled")},"Ajout d'une organisation",2)]),e("li",null,[e("a",{href:"#",onClick:s[4]||(s[4]=v(u=>i.handlerAddChange("organizationDel"),["prevent"])),class:P(i.modificationsEnabled.organizationDel?"":"disabled")},"Suppression d'une organisation",2)]),e("li",null,[e("a",{href:"#",onClick:s[5]||(s[5]=v(u=>i.handlerAddChange("changeAmount"),["prevent"])),class:P(i.modificationsEnabled.changeAmount?"":"disabled")},"Modification du montant",2)]),e("li",null,[e("a",{href:"#",onClick:s[6]||(s[6]=v(u=>i.handlerAddChange("dateEnd"),["prevent"])),class:P(i.modificationsEnabled.dateEnd?"":"disabled")},"Modification de la date de fin",2)])])]),e("section",et,[(l(!0),o(b,null,w(n.edit.modifications.filter(u=>u.mode==="new"),u=>(l(),o("article",tt,[u.type==="dateEnd"?(l(),o("div",st,[nt,e("span",null,[g(f,{modelValue:u.value1,"onUpdate:modelValue":_=>u.value1=_},null,8,["modelValue","onUpdate:modelValue"])])])):u.type==="changeAmount"?(l(),o("div",lt,[ot,g(h,{modelValue:u.value1,"onUpdate:modelValue":_=>u.value1=_},null,8,["modelValue","onUpdate:modelValue"])])):u.type==="personDel"?(l(),o("div",it,[at,C(e("select",{name:"",id:"",onClick:s[7]||(s[7]=v(()=>{},["stop"])),"onUpdate:modelValue":_=>u.valueObj=_,onChange:_=>i.handlerSelectToDel(u,_)},[(l(!0),o(b,null,w(i.persons,(_,O)=>(l(),o("option",{value:_},c(_.firstName)+" "+c(_.lastName),9,dt))),256))],40,rt),[[j,u.valueObj]]),u.valueObj?C((l(),o("select",{key:0,name:"",id:"",onClick:s[8]||(s[8]=v(()=>{},["stop"])),"onUpdate:modelValue":_=>u.value2=_},[(l(!0),o(b,null,w(u.valueObj.roles,(_,O)=>(l(),o("option",{value:O},c(_),9,ut))),256))],8,ct)),[[j,u.value2]]):d("",!0)])):u.type==="personAdd"?(l(),o("div",ht,[mt,u.valueObj?(l(),o("span",pt,[a(c(u.valueObj.firstName)+" "+c(u.valueObj.lastName)+" ",1),e("i",{class:"icon-cancel-alt",onClick:_=>u.valueObj=null},null,8,_t)])):(l(),I(V,{key:1,onPersonSelected:_=>i.handlerUpdatePersonChange(u,_)},null,8,["onPersonSelected"])),C(e("select",{name:"rolesPerson","onUpdate:modelValue":_=>u.value2=_,class:"form-control",onClick:s[9]||(s[9]=v(()=>{},["stop"]))},[(l(!0),o(b,null,w(t.rolesPerson,_=>(l(),o("option",{value:_.id},c(_.label),9,vt))),256))],8,ft),[[j,u.value2]])])):u.type==="organizationDel"?(l(),o("div",gt,[yt,C(e("select",{name:"",id:"",onClick:s[10]||(s[10]=v(()=>{},["stop"])),"onUpdate:modelValue":_=>u.valueObj=_,class:"form-control",onChange:_=>i.handlerSelectToDel(u,_)},[(l(!0),o(b,null,w(i.organizations,(_,O)=>(l(),o("option",{value:_},c(_.label),9,bt))),256))],40,kt),[[j,u.valueObj]]),u.valueObj?C((l(),o("select",{key:0,name:"",id:"",onClick:s[11]||(s[11]=v(()=>{},["stop"])),"onUpdate:modelValue":_=>u.value2=_,class:"form-control"},[(l(!0),o(b,null,w(u.valueObj.roles,(_,O)=>(l(),o("option",{value:O},c(_),9,wt))),256))],8,Dt)),[[j,u.value2]]):d("",!0)])):u.type==="organizationAdd"?(l(),o("div",Ct,[Pt,g(G,{onChange:_=>i.handlerUpdateOrganizationChange(u,_)},null,8,["onChange"]),C(e("select",{name:"rolesOrganization","onUpdate:modelValue":_=>u.value2=_,class:"form-control",onClick:s[12]||(s[12]=v(()=>{},["stop"]))},[(l(!0),o(b,null,w(t.rolesOrganization,_=>(l(),o("option",{value:_.id},c(_.label),9,Ut))),256))],8,At),[[j,u.value2]])])):(l(),o("div",St,c(u),1)),e("nav",null,[e("button",{class:"btn btn-xs btn-danger",onClick:v(_=>i.handlerRemoveChange(u),["prevent"])},Vt,8,Mt)])]))),256))]),xt,e("section",Nt,[(l(!0),o(b,null,w(n.edit.modifications.filter(u=>u.mode!=="new"),u=>(l(),o("article",jt,[e("div",null,[u.type==="dateEnd"?(l(),o("i",Ot)):d("",!0),u.type==="personAdd"?(l(),o("i",zt)):d("",!0),u.type==="changeAmount"?(l(),o("i",Rt)):d("",!0),u.type==="personDel"?(l(),o("i",It)):d("",!0),u.type==="organizationAdd"?(l(),o("i",Ft)):d("",!0),u.type==="organizationDel"?(l(),o("i",Wt)):d("",!0),e("strong",null,c(u.info),1),e("small",null,[e("code",null," ("+c(u.type)+")",1)])]),e("nav",null,[e("button",{class:"btn btn-xs btn-danger",onClick:v(_=>i.handlerRemoveChange(u),["prevent"])},Lt,8,Tt)])]))),256))])]),e("div",Jt,[Ht,n.edit.previousFile?(l(),o("section",Bt," Fichier précédent ")):d("",!0),e("input",{class:"form-control",type:"file",onChange:s[13]||(s[13]=(...u)=>i.handlerSelectFile&&i.handlerSelectFile(...u))},null,32)]),e("div",Yt,[Gt,C(e("textarea",{"onUpdate:modelValue":s[14]||(s[14]=u=>n.edit.comment=u),class:"form-control"},null,512),[[x,n.edit.comment]])])])]),_:1},8,["visible","onModalValid","onModalCancel"]),e("section",Kt,[e("nav",Xt,[r.manage?(l(),o("button",{key:0,class:"btn btn-xs btn-default",onClick:s[15]||(s[15]=(...u)=>i.handlerNew&&i.handlerNew(...u))}," Nouvel avenant ")):d("",!0)]),(l(!0),o(b,null,w(r.avenants.avenants,u=>(l(),o("article",{class:P(["avenant card","status-"+u.status])},[e("h4",null,[u.status==200?(l(),o("i",Qt)):d("",!0),u.status==100?(l(),o("i",Zt)):d("",!0),e("strong",null,c(t.$filters.dateFull(u.date)),1),e("small",null," - "+c(u.status_text),1)]),e("section",$t,[(l(!0),o(b,null,w(u.modifications,_=>(l(),o("article",es,[_.type==="dateEnd"?(l(),o("i",ts)):d("",!0),_.type==="personAdd"?(l(),o("i",ss)):d("",!0),_.type==="personDel"?(l(),o("i",ns)):d("",!0),_.type==="changeAmount"?(l(),o("i",ls)):d("",!0),_.type==="organizationAdd"?(l(),o("i",os)):d("",!0),_.type==="organizationDel"?(l(),o("i",is)):d("",!0),e("span",null,c(_.info),1)]))),256))]),u.comment?(l(),o("p",as,c(u.comment),1)):d("",!0),e("nav",null,[e("a",{href:u.url_download,class:"btn btn-xs btn-primary"},[ds,a(" Télécharger")],8,rs),r.manage?(l(),I(H,{key:0,onConfirm:_=>i.handlerDelete(u),class:P("btn btn-xs btn-danger"),checkbox:!0},{message:A(()=>[a(" Supprimer "),us,a(" cet avenant ? ")]),default:A(()=>[cs,a(" Supprimer ")]),_:2},1032,["onConfirm"])):d("",!0),r.manage&&u.editable?(l(),o("a",{key:1,href:"#",class:"btn btn-xs btn-default",onClick:v(_=>i.handlerEdit(u),["prevent"])},[ms,a(" Editer ")],8,hs)):d("",!0),u.status===100&&r.manage?(l(),I(H,{key:2,onConfirm:_=>i.handlerApplyAvenant(u),class:P("btn btn-xs btn-success")},{message:A(()=>[a(" Confirmer l'application de l'avenant pour cette activité ? "),_s]),default:A(()=>[ps,a(" Appliquer ")]),_:2},1032,["onConfirm"])):d("",!0)])],2))),256))])],64)}const vs=E(qe,[["render",fs],["__scopeId","data-v-833d8759"]]);const gs={props:{milestone:{required:!0},manage:{default:!1},progression:{default:!1}},computed:{finishedPerson(){let s=/\[Person:([0-9]*):(.*)\]/gm.exec(this.milestone.finishedBy);return s!==null?s[2]:""},statutText(){if(!this.milestone.type.finishable)return"";switch(this.milestone.finished){case 0:case null:return this.milestone.past?"EN RETARD":"A FAIRE";case 50:return"EN COURS";case 100:return"Validé";case 200:return"Sans suite";case 400:return"Refusé";default:return""}},owner(){return this.finishedPerson?finishedPerson[2]:"Unreadable data"},ownerId(){return this.finishedPerson?finishedPerson[1]:"Unreadble data"},finishable(){return this.progression&&this.milestone.validable&&this.milestone.type.finishable==!0&&this.milestone.finished<100},cancelFinish(){return this.progression&&this.milestone.validable&&this.milestone.type.finishable==!0&&this.milestone.finished>0},progressable(){return this.progression&&this.milestone.validable&&this.milestone.type.finishable==!0&&(this.milestone.finished==null||this.milestone.finished==0||this.milestone.finished==100)},inProgress(){return this.milestone.validable&&this.milestone.type.finishable==!0&&this.milestone.finished>0&&this.milestone.finished<100},finished(){return this.milestone.type.finishable==!0&&this.milestone.finished>=100},late(){return this.finishable==!0&&this.milestone.past&&!this.finished},past(){return this.milestone.past},cssClass(){let t={finishable:this.finishable,finished:this.finished||this.milestone.done,late:this.late||this.milestone.late,payment:this.milestone.isPayment,inprogress:this.inProgress,canceled:this.milestone.finished==200,refused:this.milestone.finished==400,valided:this.milestone.finished==100,past:this.past};return t[this.milestone.type.facet]=!0,t}}},F=t=>(T("data-v-42de1793"),t=t(),q(),t),ys={class:"main"},ks={key:0},bs=["datetime"],Ds={class:"ago"},ws={key:0},Cs={key:0},Ps={key:1,class:"details"},As={key:2},Us=F(()=>e("i",{class:"icon-rewind-outline"},null,-1)),Ss=[Us],Ms=F(()=>e("i",{class:"icon-cw-outline"},null,-1)),Es=[Ms],Vs=F(()=>e("i",{class:"icon-ok-circled"},null,-1)),xs=[Vs],Ns=F(()=>e("i",{class:"icon-archive"},null,-1)),js=[Ns],Os=F(()=>e("i",{class:"icon-block"},null,-1)),zs=[Os],Rs=F(()=>e("i",{class:"icon-trash"},null,-1)),Is=[Rs],Fs=F(()=>e("i",{class:"icon-edit"},null,-1)),Ws=[Fs];function Ts(t,s,r,k,n,i){return l(),o("article",{class:P(["jalon",i.cssClass])},[e("span",ys,[i.statutText?(l(),o("strong",ks," "+c(i.statutText),1)):d("",!0),e("time",{datetime:r.milestone.dateStart,class:"time-value"},[a(c(t.$filters.date(r.milestone.dateStart))+" ",1),e("span",Ds," ("+c(t.$filters.timeAgo(r.milestone.dateStart))+") ",1)],8,bs)]),e("strong",{class:P(["card-title",{"text-private":r.milestone.isPayment}])},[a(c(r.milestone.type.label)+" ",1),i.inProgress?(l(),o("small",ws,[a(" (En cours par "),e("strong",null,c(i.finishedPerson),1),a(")")])):d("",!0)],2),i.finished?(l(),o("p",Cs,[e("strong",null,c(i.finishedPerson),1),a(" a complété ce jalon")])):d("",!0),r.milestone.comment?(l(),o("p",Ps,c(r.milestone.comment),1)):d("",!0),r.milestone.isPayment?d("",!0):(l(),o("nav",As,[i.cancelFinish?(l(),o("a",{key:0,href:"#",title:"Réinitialiser la progression",onClick:s[0]||(s[0]=v(y=>t.$emit("unvalid",r.milestone),["prevent"]))},Ss)):d("",!0),i.progressable?(l(),o("a",{key:1,href:"#",title:"Marquer comme en cours",onClick:s[1]||(s[1]=v(y=>t.$emit("inprogress",r.milestone),["prevent"]))},Es)):d("",!0),i.finishable?(l(),o("a",{key:2,href:"#",title:"Marquer comme terminé",onClick:s[2]||(s[2]=v(y=>t.$emit("valid",r.milestone),["prevent"]))},xs)):d("",!0),i.finishable?(l(),o("a",{key:3,href:"#",title:"Marquer comme sans suite",onClick:s[3]||(s[3]=v(y=>t.$emit("cancel",r.milestone),["prevent"]))},js)):d("",!0),i.finishable?(l(),o("a",{key:4,href:"#",title:"Marquer comme refusé",onClick:s[4]||(s[4]=v(y=>t.$emit("refused",r.milestone),["prevent"]))},zs)):d("",!0),r.manage?(l(),o("a",{key:5,href:"#",title:"Supprimer ce jalon",onClick:s[5]||(s[5]=v(y=>t.$emit("remove",r.milestone),["prevent"]))},Is)):d("",!0),r.manage?(l(),o("a",{key:6,href:"#",title:"Modifier ce jalon",onClick:s[6]||(s[6]=v(y=>t.$emit("edit",r.milestone),["prevent"]))},Ws)):d("",!0)]))],2)}const qs=E(gs,[["render",Ts],["__scopeId","data-v-42de1793"]]);const Ls={props:{url:{required:!0},manage:{required:!0},progression:{default:!1},items:{default:[],type:Array},types:{default:[],type:Array},payments:{required:!1,default:[],type:Array}},components:{milestone:qs,datepicker:Y},data(){return{error:null,formData:null,pendingMsg:"",creatable:!1,deleteMilestone:null,editMilestone:null,validMilestone:null,cancelMilestone:null,refusedMilestone:null,unvalidMilestone:null,inProgressMilestone:null,action:null,actionMessage:"",actionMilestone:null,model:{}}},computed:{types(){return this.types},milestones(){let t=[];return this.payments.forEach(s=>{let r=new Date,k=!1,n=!1,i;switch(s.status){case 1:r=s.datePredicted,r?(i="PRÉVU",k=N(s.datePredicted.date).unix(){t.push(s)}),t.sort((s,r)=>{let k=N(s.dateStart).unix(),n=N(r.dateStart).unix();return k-n}),t},payments(){return this.payments},formTypeFinishable(){return this.formData?this.types.find(t=>t.id==this.formData.type.id&&t.finishable):!1},groupedTypes(){let t={};return this.types.forEach(s=>{let r=s.facet;t.hasOwnProperty(r)||(t[r]={label:r,types:[]}),t[s.facet].types.push(s)}),t}},methods:{handlerValid(t){this.validMilestone=t},handlerInProgress(t){this.inProgressMilestone=t},handlerUnvalid(t){this.unvalidMilestone=t},handlerActionConfirm(t,s,r){this.actionMilestone=t,this.action=s,this.actionMessage=r},handlerActionCancel(){this.actionMilestone=null,this.action=null,this.actionMessage=""},handlerCancel(t){this.unvalidMilestone=t},handlerRemove(t){this.deleteMilestone=t},handlerEdit(t){this.editMilestone=t,this.formData={type:t.type,id:t.id,comment:t.comment,dateStart:N(t.dateStart).format("YYYY-MM-DD")}},handlerNew(){this.formData={id:0,type:JSON.parse(JSON.stringify(this.types[0])),dateStart:N().format("Y-M-D HH:mm:ss"),comment:""}},preformDelete(){this.pendingMsg="Suppression du jalon",S.delete(this.url+"?id="+this.deleteMilestone.id).then(t=>{this.fetch()},t=>{R.commit("addErrorAxios",t)}).then(t=>{this.pendingMsg=null,this.deleteMilestone=null})},performValid(t){var s={},r;switch(t){case"valid":this.pendingMsg="Validation du jalon",r=this.validMilestone;break;case"unvalid":this.pendingMsg="Réinitialisation du jalon",r=this.unvalidMilestone;break;case"inprogress":this.pendingMsg="Marquage du jalon comme en cours",r=this.inProgressMilestone;break;case"cancel":case"refused":r=this.actionMilestone;break;default:this.error="Action incorrecte";return}s.id=r.id,s.action=t,this.action=null,this.actionMessage="",this.actionMilestone=null,S.put(this.url,s).then(k=>{this.fetch()},k=>{R.commit("addErrorAxios",k)}).then(k=>{this.pendingMsg=null,this.validMilestone=null,this.unvalidMilestone=null,this.inProgressMilestone=null})},performSave(){this.pendingMsg=this.formData.id?"Enregistrement des modifications":"Création du nouveau jalon",this.formData.id?S.put(this.url,this.formData).then(t=>{this.fetch()},t=>{R.commit("addErrorAxios",t)}).then(t=>{this.pendingMsg=null,this.formData=null}):S.post(this.url,this.formData).then(t=>{this.fetch()},t=>{R.commit("addErrorAxios",t)}).then(t=>{this.pendingMsg=null,this.formData=null})},fetch(){this.pendingMsg="Chargement des jalons : "+this.url,S.get(this.url).then(t=>{this.$emit("update",t.data.datas.milestones.entities)},t=>{console.log(t),this.error="Impossible de charger les jalons de cette activités : "+t}).then(t=>{this.pendingMsg=""})}},mounted(){}},Js={class:"milestones"},Hs={key:0,class:"error overlay"},Bs={class:"overlay-content"},Ys=e("i",{class:"icon-warning-empty"},null,-1),Gs=e("br",null,null,-1),Ks=e("i",{class:"icon-cancel-circled"},null,-1),Xs={key:0,class:"overlay"},Qs={class:"overlay-content"},Zs=e("i",{class:"icon-calendar"},null,-1),$s={key:0},en={key:1},tn={class:"form-group"},sn=e("label",{for:""},"Type de jalon",-1),nn=["label"],ln=["value"],on={class:"help"},an=e("i",{class:"icon-info-circled"},null,-1),rn={class:"form-group"},dn=e("label",{for:""},"Date prévue pour le jalon",-1),cn={class:"form-group"},un=e("label",{for:""},"Description",-1),hn=e("i",{class:"icon-floppy"},null,-1),mn=e("i",{class:"icon-cancel-outline"},null,-1),pn={key:0,class:"deleteconfirm overlay"},_n={class:"overlay-content"},fn=e("h2",null,[e("i",{class:"icon-help-circled"}),a(" Supprimer ce jalon ?")],-1),vn=e("strong",null,"définitive",-1),gn=e("em",null,"Marquer comme terminé",-1),yn=e("i",{class:"icon-trash"},null,-1),kn=e("i",{class:"icon-cancel-outline"},null,-1),bn={key:0,class:"validconfirm overlay"},Dn={class:"overlay-content"},wn=e("h2",null,[e("i",{class:"icon-help-circled"}),a(" Valider ce jalon ? ")],-1),Cn=e("p",null,"Les jalons marqués comme terminés ne feront pas l'objet de notifications ou d'alertes.",-1),Pn=e("i",{class:"icon-ok-circled"},null,-1),An=e("i",{class:"icon-cancel-outline"},null,-1),Un={key:0,class:"inprogressconfirm overlay"},Sn={class:"overlay-content"},Mn=e("h2",null,[e("i",{class:"icon-help-circled"}),a(' Marquer ce jalon "en cours" ? ')],-1),En=e("p",null,null,-1),Vn=e("i",{class:"icon-cw-outline"},null,-1),xn=e("i",{class:"icon-cancel-outline"},null,-1),Nn={key:0,class:"inprogressconfirm overlay"},jn={class:"overlay-content"},On=e("i",{class:"icon-help-circled"},null,-1),zn=e("p",null,"Les jalons marqués comme terminés (Validé, refusé ou sans suite) ne feront pas l'objet de notifications ou d'alertes",-1),Rn=e("i",{class:"icon-cw-outline"},null,-1),In=e("i",{class:"icon-cancel-outline"},null,-1),Fn={key:0,class:"validconfirm overlay"},Wn={class:"overlay-content"},Tn=e("h2",null,[e("i",{class:"icon-help-circled"}),a(" Invalider ce jalon ? ")],-1),qn=e("p",null,"L'état d'avancement du jalon sera réinitialisé.",-1),Ln=e("i",{class:"icon-ok-circled"},null,-1),Jn=e("i",{class:"icon-cancel-outline"},null,-1),Hn={key:0,class:"alert alert-info"},Bn=e("i",{class:"icon-spinner animate-spin"},null,-1),Yn={key:0,class:"admin-bar"},Gn=e("i",{class:"icon-calendar-plus-o"},null,-1),Kn=e("i",{class:"icon-bug"},null,-1),Xn={key:1,class:"list"},Qn={key:2,class:"alert"};function Zn(t,s,r,k,n,i){const y=D("datepicker"),f=D("milestone");return l(),o("section",Js,[g(M,{name:"fade"},{default:A(()=>[n.error?(l(),o("div",Hs,[e("div",Bs,[Ys,a(" "+c(n.error)+" ",1),Gs,e("a",{href:"#",onClick:s[0]||(s[0]=h=>n.error=null),class:"btn btn-sm btn-default btn-xs"},[Ks,a(" Fermer")])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.formData?(l(),o("div",Xs,[e("div",Qs,[e("h2",null,[Zs,n.formData.id?(l(),o("span",$s,[a("Modification du jalon "),e("strong",null,c(n.formData.type.label),1)])):(l(),o("span",en,"Nouveau jalon"))]),e("div",tn,[sn,C(e("select",{name:"",id:"","onUpdate:modelValue":s[1]||(s[1]=h=>n.formData.type.id=h),class:"form-control"},[(l(!0),o(b,null,w(i.groupedTypes,h=>(l(),o("optgroup",{label:h.label},[(l(!0),o(b,null,w(h.types,V=>(l(),o("option",{value:V.id},c(V.label),9,ln))),256))],8,nn))),256))],512),[[j,n.formData.type.id]]),C(e("p",on,[an,a(" Ce type de jalon inclut des méchanismes de validation pour marquer le jalon comme terminé ")],512),[[re,i.formTypeFinishable]])]),e("div",rn,[dn,g(y,{modelValue:n.formData.dateStart,"onUpdate:modelValue":s[2]||(s[2]=h=>n.formData.dateStart=h),onInput:s[3]||(s[3]=h=>{n.formData.dateStart=h})},null,8,["modelValue"])]),e("div",cn,[un,C(e("textarea",{"onUpdate:modelValue":s[4]||(s[4]=h=>n.formData.comment=h),class:"form-control"},null,512),[[x,n.formData.comment]])]),e("nav",null,[e("button",{class:"btn btn-default",onClick:s[5]||(s[5]=(...h)=>i.performSave&&i.performSave(...h))},[hn,a(" Enregistrer ")]),e("button",{class:"btn btn-default",onClick:s[6]||(s[6]=h=>n.formData=null)},[mn,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.deleteMilestone?(l(),o("div",pn,[e("div",_n,[fn,e("p",null,[a("Cette suppression sera "),vn,a(", si vous souhaitez signifier que ce jalon est réalisé, utilisez plutôt l'option "),gn,a(". Si cette option n'est pas disponible, demandez à l'administrateur Oscar si vous avez les privilèges pour réaliser cette action ou si le type de jalon "),e("strong",null,c(n.deleteMilestone.type.label),1),a(" est correctement configuré.")]),e("nav",null,[e("button",{class:"btn btn-default",onClick:s[7]||(s[7]=(...h)=>i.preformDelete&&i.preformDelete(...h))},[yn,a(" Supprimer ")]),e("button",{class:"btn btn-default",onClick:s[8]||(s[8]=h=>n.deleteMilestone=null)},[kn,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.validMilestone?(l(),o("div",bn,[e("div",Dn,[wn,Cn,e("nav",null,[e("button",{class:"btn btn-default",onClick:s[9]||(s[9]=h=>i.performValid("valid"))},[Pn,a(" Marquer ce jalon comme terminé ")]),e("button",{class:"btn btn-default",onClick:s[10]||(s[10]=h=>n.validMilestone=null)},[An,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.inProgressMilestone?(l(),o("div",Un,[e("div",Sn,[Mn,En,e("nav",null,[e("button",{class:"btn btn-default",onClick:s[11]||(s[11]=h=>i.performValid("inprogress"))},[Vn,a(" Marquer ce jalon comme en cours ")]),e("button",{class:"btn btn-default",onClick:s[12]||(s[12]=h=>n.inProgressMilestone=null)},[xn,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.actionMessage?(l(),o("div",Nn,[e("div",jn,[e("h2",null,[On,a(" "+c(n.actionMessage)+" ? ",1)]),zn,e("nav",null,[e("button",{class:"btn btn-default",onClick:s[13]||(s[13]=h=>i.performValid(n.action))},[Rn,a(" "+c(n.actionMessage),1)]),e("button",{class:"btn btn-default",onClick:s[14]||(s[14]=(...h)=>i.handlerActionCancel&&i.handlerActionCancel(...h))},[In,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.unvalidMilestone?(l(),o("div",Fn,[e("div",Wn,[Tn,qn,e("nav",null,[e("button",{class:"btn btn-success",onClick:s[15]||(s[15]=h=>i.performValid("unvalid"))},[Ln,a(" Réinitialiser la progression de ce jalon ")]),e("button",{class:"btn btn-danger",onClick:s[16]||(s[16]=h=>n.unvalidMilestone=null)},[Jn,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.pendingMsg?(l(),o("div",Hn,[Bn,a(" "+c(n.pendingMsg),1)])):d("",!0)]),_:1}),r.manage?(l(),o("nav",Yn,[e("a",{href:"#",onClick:s[17]||(s[17]=v((...h)=>i.handlerNew&&i.handlerNew(...h),["prevent"])),class:"btn btn-xs btn-default"},[Gn,a(" Nouveau Jalon ")]),e("a",{href:"#",onClick:s[18]||(s[18]=v((...h)=>i.fetch&&i.fetch(...h),["prevent"])),class:"btn btn-xs btn-warning"},[Kn,a(" fetch ")])])):d("",!0),i.milestones!=null?(l(),o("section",Xn,[(l(!0),o(b,null,w(i.milestones,h=>(l(),I(f,{milestone:h,key:h.id,manage:r.manage,progression:r.progression,onValid:i.handlerValid,onUnvalid:i.handlerUnvalid,onInprogress:i.handlerInProgress,onCancel:s[19]||(s[19]=V=>i.handlerActionConfirm(V,"cancel","Marquer ce jalon comme sans suite")),onRefused:s[20]||(s[20]=V=>i.handlerActionConfirm(V,"refused","Marquer ce jalon comme refusé")),onRemove:i.handlerRemove,onEdit:i.handlerEdit},null,8,["milestone","manage","progression","onValid","onUnvalid","onInprogress","onRemove","onEdit"]))),128))])):(l(),o("div",Qn," Aucun jalon "))])}const $n=E(Ls,[["render",Zn]]),el={props:["payment","manage"],data(){return{}},computed:{late(){if(this.payment.status===1){if(!this.payment.datePredicted)return!0;let t=N().unix();return N(this.payment.datePredicted).unix()t.$emit("delete",r.payment),["prevent"])),title:"Supprimer ce versement"},pl),e("a",{href:"#",class:"btn-edit",onClick:s[1]||(s[1]=v(y=>t.$emit("edit",r.payment),["prevent"])),title:"Modifier ce versement"},fl)])):d("",!0)]),e("p",vl,c(r.payment.comment),1)],2)}const yl=E(el,[["render",gl]]),kl={props:["url","amount","currency","currencies","manage","payments"],data(){return{formData:null,deletePayment:null,error:"",pendingMsg:""}},components:{payment:yl,datepicker:Y},computed:{total(){let t=0;return this.payments&&this.payments.forEach(s=>{let r=1;s.currency&&(r=s.rate),t+=s.amount/r}),Math.round(t*100)/100},currencySymbol(){return this.currency?this.currency.symbol:"€"},formHasError(){return!this.formData.amount||this.formData.status==2&&!this.formData.datePayment||this.formData.status==1&&!this.formData.datePredicted}},methods:{getPaymentDateValue(t){return t.status==2?t.datePayment?t.datePayment.date:null:t.status==1&&t.datePredicted?t.datePredicted.date:null},handlerNewPayment(){this.formData={id:null,amount:0,currencyId:1,rate:1,datePredicted:"",status:1,datePayment:"",codeTransaction:"",comment:""}},handlerDelete(t){this.deletePayment=t},handlerEdit(t){this.formData=JSON.parse(JSON.stringify(t)),this.formData.currencyId=t.currency.id,this.formData.datePayment=t.datePayment?N(t.datePayment.date).format("YYYY-MM-DD"):"",this.formData.datePredicted=t.datePredicted?N(t.datePredicted.date).format("YYYY-MM-DD"):"",this.formData.currencyId=t.currency.id},handlerFormUpdateRate(){let t=this.currencies.find(s=>s.id==this.formData.currencyId);t&&(this.formData.rate=t.rate)},performSave(){this.loading="Enregistrement du paiement",!this.formHasError&&(this.formData.id?S.post(this.url,this.formData).then(t=>{this.formData=null,this.fetch()},t=>{this.error=z.manageErrorResponse(t)}):S.put(this.url,this.formData).then(t=>{this.formData=null,this.fetch()},t=>{this.error=z.manageErrorResponse(t)}))},performDelete(){S.delete(this.url+"?id="+this.deletePayment.id).then(t=>{this.fetch()},t=>{this.error="Impossible de supprimer le versement : "+z.manageErrorResponse(t).message}).then(()=>{this.deletePayment=null})},fetch(){this.loading="Chargement des versements",S.get(this.url).then(t=>{this.$emit("update",t.data.datas.payments)},t=>{this.error=z.manageErrorResponse(t)}).finally(t=>this.loading=null)}},mounted(){}},bl={class:"payments"},Dl={key:0,class:"error overlay"},wl={class:"overlay-content"},Cl=e("i",{class:"icon-warning-empty"},null,-1),Pl=e("br",null,null,-1),Al=e("i",{class:"icon-cancel-outline"},null,-1),Ul={key:0,class:"pending overlay"},Sl={class:"overlay-content"},Ml=e("i",{class:"icon-spinner animate-spin"},null,-1),El={key:0,class:"deleteconfirm overlay"},Vl={class:"overlay-content"},xl=e("h3",null,[e("i",{class:"icon-help-circled"}),a(" Supprimer ce versement ?")],-1),Nl=e("i",{class:"icon-trash"},null,-1),jl=e("i",{class:"icon-cancel-outline"},null,-1),Ol={key:0,class:"overlay"},zl={class:"overlay-content"},Rl={key:0},Il={key:1},Fl={class:"container"},Wl={class:"row"},Tl={class:"col-xs-6"},ql={class:"form-group"},Ll=e("label",{class:"control-label",for:"amount"},"Montant",-1),Jl={key:0,class:"oscar-form-message error"},Hl={class:"col-xs-3"},Bl={class:"form-group"},Yl=e("label",{class:"control-label"},"Devise pour le versement",-1),Gl=["value"],Kl={class:"col-xs-3"},Xl={class:"form-group"},Ql=e("label",{class:"control-label"},"Taux",-1),Zl={class:"row"},$l={class:"col-xs-6"},eo={class:"form-group"},to=e("label",{class:"control-label"},"Date prévue",-1),so={key:0,class:"oscar-form-message error"},no={class:"col-xs-6"},lo={class:"form-group"},oo=e("label",{class:"control-label"},"Statut",-1),io=e("option",{value:"1",selected:"selected"},"Prévisionnel",-1),ao=e("option",{value:"2"},"Réalisé",-1),ro=e("option",{value:"3"},"Écart",-1),co=[io,ao,ro],uo={class:"done"},ho=e("h2",null,"Informations sur le versement effectif",-1),mo={class:"row"},po={class:"col-xs-6"},_o={class:"form-group"},fo=e("label",{class:"control-label"},"Date effective",-1),vo={key:0,class:"oscar-form-message error"},go={class:"col-xs-6"},yo={class:"form-group"},ko=e("label",{class:"control-label"},"N° de pièce",-1),bo=e("p",{class:"help"},"Numéro permettant d'identifier l'opération auprès des services comptables.",-1),Do={class:"form-group"},wo=e("label",{class:"control-label"},"Commentaire",-1),Co={class:"text-center"},Po={class:"btn-group"},Ao={key:0,class:"admin-bar"},Uo=e("i",{class:"icon-bank"},null,-1),So=e("i",{class:"icon-bug"},null,-1),Mo={class:"payment total"},Eo={class:"heading"},Vo={class:"amount text-private"},xo={class:"date"},No={class:"text-private"},jo={key:1,class:"alert alert-danger alertAmount"},Oo=e("p",null,[e("i",{class:"icon-attention-1"}),a(" Le total des versements prévus et réalisés ne semble pas correspondre avec le montant prévu initialement, Somme des versements :")],-1),zo={class:"amountPrevu text-private"},Ro={title:"Valeur exacte : = $entity->getAmount() ?>",class:"text-private"};function Io(t,s,r,k,n,i){const y=D("datepicker"),f=D("payment");return l(),o("section",bl,[g(M,{name:"fade"},{default:A(()=>[n.error?(l(),o("div",Dl,[e("div",wl,[Cl,a(" "+c(n.error)+" ",1),Pl,e("a",{href:"#",onClick:s[0]||(s[0]=h=>n.error=null),class:"btn btn-default"},[Al,a(" Fermer")])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.pendingMsg?(l(),o("div",Ul,[e("div",Sl,[Ml,a(" "+c(n.pendingMsg),1)])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.deletePayment?(l(),o("div",El,[e("div",Vl,[xl,e("nav",null,[e("button",{class:"btn btn-default",onClick:s[1]||(s[1]=(...h)=>i.performDelete&&i.performDelete(...h))},[Nl,a(" Supprimer ")]),e("button",{class:"btn btn-default",onClick:s[2]||(s[2]=h=>n.deletePayment=null)},[jl,a(" Annuler ")])])])])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.formData?(l(),o("div",Ol,[e("div",zl,[n.formData.id?(l(),o("h3",Rl,"Modification du versement")):(l(),o("h3",Il,"Nouveau versement")),e("div",Fl,[e("div",Wl,[e("div",Tl,[e("div",ql,[Ll,C(e("input",{name:"amount",class:"form-control input-lg form-control","onUpdate:modelValue":s[3]||(s[3]=h=>n.formData.amount=h),type:"text"},null,512),[[x,n.formData.amount]]),n.formData.amount?d("",!0):(l(),o("div",Jl," Vous devez indiquer un montant. "))])]),e("div",Hl,[e("div",Bl,[Yl,C(e("select",{name:"currency",class:"form-control form-control","onUpdate:modelValue":s[4]||(s[4]=h=>n.formData.currencyId=h),onChange:s[5]||(s[5]=(...h)=>i.handlerFormUpdateRate&&i.handlerFormUpdateRate(...h))},[(l(!0),o(b,null,w(r.currencies,h=>(l(),o("option",{value:h.id},c(h.label),9,Gl))),256))],544),[[j,n.formData.currencyId]])])]),e("div",Kl,[e("div",Xl,[Ql,C(e("input",{name:"rate",class:"form-control form-control","onUpdate:modelValue":s[6]||(s[6]=h=>n.formData.rate=h),type:"text"},null,512),[[x,n.formData.rate]])])])]),e("div",Zl,[e("div",$l,[e("div",eo,[to,g(y,{modelValue:n.formData.datePredicted,"onUpdate:modelValue":s[7]||(s[7]=h=>n.formData.datePredicted=h),onInput:s[8]||(s[8]=h=>{n.formData.datePredicted=h})},null,8,["modelValue"]),n.formData.status==1&&!n.formData.datePredicted?(l(),o("div",so," Les versements prévisionnels necessitent une date. ")):d("",!0)])]),e("div",no,[e("div",lo,[oo,C(e("select",{name:"status",class:"form-control form-control","onUpdate:modelValue":s[9]||(s[9]=h=>n.formData.status=h)},co,512),[[j,n.formData.status]])])])]),e("div",uo,[ho,e("div",mo,[e("div",po,[e("div",_o,[fo,g(y,{moment:t.moment,modelValue:n.formData.datePayment,"onUpdate:modelValue":s[10]||(s[10]=h=>n.formData.datePayment=h),onInput:s[11]||(s[11]=h=>{n.formData.datePayment=h})},null,8,["moment","modelValue"]),n.formData.status==2&&!n.formData.datePayment?(l(),o("div",vo," Les versements réalisés necessitent une date effective ")):d("",!0)])]),e("div",go,[e("div",yo,[ko,C(e("input",{name:"codeTransaction",class:"form-control form-control","onUpdate:modelValue":s[12]||(s[12]=h=>n.formData.codeTransaction=h),type:"text"},null,512),[[x,n.formData.codeTransaction]])]),bo])])]),e("div",Do,[wo,C(e("textarea",{name:"comment",class:"form-control form-control",placeholder:"Commentaire","onUpdate:modelValue":s[13]||(s[13]=h=>n.formData.comment=h)},null,512),[[x,n.formData.comment]])]),e("nav",Co,[e("nav",Po,[e("a",{class:"btn btn-default button-back",href:"#",onClick:s[14]||(s[14]=v(h=>n.formData=null,["prevent"]))},"Annuler"),e("button",{class:P(["btn btn-primary",{disabled:i.formHasError}]),onClick:s[15]||(s[15]=v((...h)=>i.performSave&&i.performSave(...h),["prevent"]))}," Enregistrer ",2)])])])])])):d("",!0)]),_:1}),r.manage?(l(),o("nav",Ao,[e("a",{href:"#",onClick:s[16]||(s[16]=v((...h)=>i.handlerNewPayment&&i.handlerNewPayment(...h),["prevent"])),class:"btn btn-default btn-xs"},[Uo,a(" Nouveau versement")]),e("button",{class:"btn btn-warning btn-xs",onClick:s[17]||(s[17]=v((...h)=>i.fetch&&i.fetch(...h),["prevent"]))},[So,a(" fetch ")])])):d("",!0),(l(!0),o(b,null,w(r.payments,h=>(l(),I(f,{payment:h,key:h.id,manage:r.manage,onDelete:i.handlerDelete,onEdit:i.handlerEdit},null,8,["payment","manage","onDelete","onEdit"]))),128)),e("article",Mo,[e("div",Eo,[e("strong",Vo,c(t.$filters.money(i.total))+" € ",1),e("span",xo,[a("/ "),e("strong",No,c(t.$filters.money(r.amount))+" €",1)])])]),i.total!=r.amount?(l(),o("div",jo,[Oo,e("ul",null,[e("li",null,[e("strong",zo,c(t.$filters.money(i.total))+" "+c(i.currencySymbol),1),a(" en versement,")]),e("li",null,[e("strong",Ro,c(t.$filters.money(r.amount))+" "+c(i.currencySymbol),1),a(" prévu ")])])])):d("",!0)])}const Fo=E(kl,[["render",Io]]);const Wo={name:"PersonCartouche",props:{person:{required:!0,type:Object}}},J=t=>(T("data-v-dfc2c1c6"),t=t(),q(),t),To={class:"person-text"},qo={class:"info-bulle"},Lo=["src"],Jo={class:"infos"},Ho={class:"firstname"},Bo={class:"lastname"},Yo={class:"content"},Go={style:{"white-space":"nowrap"}},Ko=J(()=>e("i",{class:"icon-mail"},null,-1)),Xo={key:0},Qo={key:1},Zo=J(()=>e("i",{class:"icon-phone-outline"},null,-1)),$o={key:0},ei={key:1},ti=J(()=>e("i",{class:"icon-building-filled"},null,-1)),si={key:0},ni={key:1},li={key:0},oi=J(()=>e("i",{class:"icon-direction"},null,-1)),ii=["href"],ai=J(()=>e("i",{class:"icon-zoom-in-outline"},null,-1)),ri={key:1};function di(t,s,r,k,n,i){return l(),o("span",To,[a(c(r.person.label)+" ",1),e("div",qo,[e("header",null,[e("figure",null,[e("img",{src:"https://www.gravatar.com/avatar/"+r.person.mailMd5+"?s=60",alt:""},null,8,Lo)]),e("div",Jo,[e("div",Ho,c(r.person.firstName),1),e("div",Bo,c(r.person.lastName),1)])]),e("div",Yo,[e("div",Go,[Ko,r.person.email?(l(),o("span",Xo,c(r.person.email),1)):(l(),o("em",Qo,"Inconnu"))]),e("div",null,[Zo,r.person.phone?(l(),o("span",$o,c(r.person.phone),1)):(l(),o("em",ei,"Inconnu"))]),e("div",null,[ti,r.person.affectation?(l(),o("span",si,c(r.person.affectation),1)):(l(),o("em",ni,"Inconnu"))]),r.person.ucbnSiteLocalisation?(l(),o("div",li,[oi,e("span",null,c(r.person.ucbnSiteLocalisation),1)])):d("",!0)]),e("footer",null,[r.person.url?(l(),o("a",{key:0,href:r.person.url,class:"btn btn-primary btn-xs"},[ai,a(" Fiche")],8,ii)):(l(),o("code",ri,c(r.person.id),1))])])])}const ci=E(Wo,[["render",di],["__scopeId","data-v-dfc2c1c6"]]),ui={components:{PersonDisplay:ne},props:{person:{default:function(){return{}}},editable:!1,allowTooltip:{default:!1}},computed:{duration(){return this.person.duration}},data(){return{canSave:!1,mode:"read",durationForm:666}},methods:{handlerKeyUp(){console.log(arguments)},handlerUpdate(){this.$emit("workpackagepersonupdate",this.person,this.durationForm),this.mode="read"},handlerEdit(){this.mode="edit",this.durationForm=this.person.duration},handlerCancel(){this.mode="read",this.durationForm=this.person.duration},handlerRemove(){this.$emit("workpackagepersondelete",this.person)}}},hi={class:"workpackage-person"},mi={class:"displayname"},pi=e("i",{class:"icon-trash"},null,-1),_i=[pi],fi={class:"tempsdeclare temps"},vi={key:0},gi=e("i",{class:"icon-floppy"},null,-1),yi=[gi],ki=e("i",{class:"icon-cancel-outline"},null,-1),bi=[ki],Di={key:1},wi={class:"wp-hours"},Ci={title:"Heure(s) saisie(s)",class:"wp-hour unsend"},Pi={title:"Heure(s) validée(s)",class:"wp-hour validate"},Ai={key:0,title:"Heure(s) en cours de validation",class:"wp-hour validating"},Ui={key:1,title:"Heure(s) en conflit",class:"wp-hour conflicts"},Si={title:"Heure(s) à valider",class:"wp-hour duration"},Mi=e("i",{class:"icon-pencil"},null,-1),Ei=[Mi];function Vi(t,s,r,k,n,i){const y=D("PersonDisplay");return l(),o("article",hi,[e("div",mi,[g(y,{person:r.person.person,"allow-tooltip":r.allowTooltip},null,8,["person","allow-tooltip"]),r.editable&&n.mode=="read"?(l(),o("a",{key:0,href:"#",onClick:s[0]||(s[0]=v(f=>i.handlerRemove(r.person),["prevent"])),class:"link",title:"Supprimer ce déclarant"},_i)):d("",!0)]),e("div",fi,[r.editable&&n.mode=="edit"?(l(),o("div",vi,[a(" Heures prévues : "),C(e("input",{type:"integer","onUpdate:modelValue":s[1]||(s[1]=f=>n.durationForm=f),style:{width:"5em"},onKeyup:s[2]||(s[2]=de((...f)=>i.handlerUpdate&&i.handlerUpdate(...f),["13"]))},null,544),[[x,n.durationForm]]),e("a",{href:"#",onClick:s[3]||(s[3]=v((...f)=>i.handlerUpdate&&i.handlerUpdate(...f),["prevent"])),title:"Appliquer la modification des heures prévues"},yi),e("a",{href:"#",onClick:s[4]||(s[4]=v((...f)=>i.handlerCancel&&i.handlerCancel(...f),["prevent"])),title:"Annuler la modification des heures prévues"},bi)])):(l(),o("span",Di,[e("strong",wi,[e("span",Ci,c(r.person.unsend|t.heures),1),e("span",Pi,c(r.person.validate|t.heures),1),r.person.validating>0?(l(),o("span",Ai,c(r.person.validating|t.heures),1)):d("",!0),r.person.conflicts>0?(l(),o("span",Ui,c(r.person.conflicts|t.heures),1)):d("",!0),e("span",Si,[a(" / "+c(r.person.duration|t.heures)+" ",1),r.editable&&n.mode=="read"?(l(),o("a",{key:0,href:"#",onClick:s[5]||(s[5]=v((...f)=>i.handlerEdit&&i.handlerEdit(...f),["prevent"])),title:"Modifier les heures prévues"},Ei)):d("",!0)])])]))])])}const xi=E(ui,[["render",Vi]]),Ni={components:{workpackageperson:xi},data(){return{mode:"read",canSave:!1,formData:{id:-1,code:"",label:"",description:""}}},created(){this.workpackage.id<0&&(this.mode="edit")},props:{workpackage:null,persons:{default:function(){return[]}},editable:!1,isValidateur:!1,allowTooltip:{default:!1}},watch:{},methods:{isDeclarant(t,s){return s.persons.find(r=>r.person.id===t.id)},handlerEditWorkPackage(){this.formData=JSON.parse(JSON.stringify(this.workpackage)),this.mode="edit"},handlerCancelEdit(){this.workpackage.id<0?this.$emit("workpackagecancelnew",this.workpackage):this.mode="read"},handlerDeleteWorkPackage(){this.$emit("workpackagedelete",this.workpackage)},handlerUpdateWorkPackage(t){if(this.formData.code)this.$emit("workpackageupdate",this.formData),this.mode="read";else return t.stopPropagation(),t.stopImmediatePropagation(),!1},handlerUpdate(t,s){this.$emit("workpackagepersonupdate",t,s)},handlerDelete(t){this.$emit("workpackagepersondelete",t)},roles(t){return t.roles.join(",")},tempsPrevu(t){return 0},tempsDeclare(t){return 0}}},ji={class:"workpackage"},Oi={key:0},zi={key:1},Ri={class:"form-group"},Ii=e("label",{for:""},"Code",-1),Fi=e("p",{class:"text-danger"},[a("Le code est "),e("strong",null,"utilisé pour l'affichage des créneaux"),a(" simplifiés, utilisez un code de préférence entre 3 et 5 caractères.")],-1),Wi={class:"form-group"},Ti=e("label",{for:""},"Intitulé",-1),qi={class:"form-group"},Li=e("label",{for:""},"Description",-1),Ji={class:"buttons"},Hi={key:1},Bi={class:"workpackage-persons"},Yi=e("h4",null,[e("i",{class:"icon-calendar"}),a("Déclarants ")],-1),Gi={key:0,class:"buttons"},Ki={class:"btn-group"},Xi=e("button",{type:"button",class:"btn btn-default btn-xs dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},[a(" Ajouter un déclarant "),e("span",{class:"caret"})],-1),Qi={class:"dropdown-menu"},Zi=["onClick"],$i=e("i",{class:"icon-pencil"},null,-1),ea=e("i",{class:"icon-trash"},null,-1),ta={key:1,class:"text-danger"},sa=e("strong",null,"Seul les membres d'une activité peuvent être identifiés comme déclarant",-1);function na(t,s,r,k,n,i){const y=D("workpackageperson");return l(),o("article",ji,[n.mode=="edit"?(l(),o("form",{key:0,action:"",onSubmit:s[4]||(s[4]=v((...f)=>i.handlerUpdateWorkPackage&&i.handlerUpdateWorkPackage(...f),["prevent"]))},[e("h4",null,[r.workpackage.id>0?(l(),o("span",Oi,"Modification du lot")):(l(),o("span",zi,"Nouveau lot")),a(" "+c(n.formData.label),1)]),e("div",Ri,[Ii,Fi,C(e("input",{type:"text",placeholder:"CODE","onUpdate:modelValue":s[0]||(s[0]=f=>n.formData.code=f),class:"form-control"},null,512),[[x,n.formData.code]])]),e("div",Wi,[Ti,C(e("input",{type:"text",placeholder:"Intitulé","onUpdate:modelValue":s[1]||(s[1]=f=>n.formData.label=f),class:"form-control"},null,512),[[x,n.formData.label]])]),e("div",qi,[Li,C(e("textarea",{type:"text",placeholder:"Description","onUpdate:modelValue":s[2]||(s[2]=f=>n.formData.description=f),class:"form-control"},null,512),[[x,n.formData.description]])]),e("div",Ji,[e("button",{type:"submit",class:P(["btn btn-default btn-save",{disabled:!n.formData.code}])},"Enregistrer ",2),e("button",{type:"button",class:"btn btn-default",onClick:s[3]||(s[3]=(...f)=>i.handlerCancelEdit&&i.handlerCancelEdit(...f))},"Annuler")])],32)):d("",!0),n.mode=="read"?(l(),o("div",Hi,[e("h3",null,"["+c(r.workpackage.code)+"] "+c(r.workpackage.label),1),e("p",null,c(r.workpackage.description),1),e("section",Bi,[Yi,(l(!0),o(b,null,w(r.workpackage.persons,f=>(l(),I(y,{key:f.id,"allow-tooltip":r.allowTooltip,person:f,editable:r.editable,onWorkpackagepersondelete:i.handlerDelete,onWorkpackagepersonupdate:i.handlerUpdate},null,8,["allow-tooltip","person","editable","onWorkpackagepersondelete","onWorkpackagepersonupdate"]))),128))]),r.editable&&r.persons.length?(l(),o("div",Gi,[e("div",Ki,[Xi,e("ul",Qi,[(l(!0),o(b,null,w(r.persons,f=>(l(),o("li",{class:P({disabled:i.isDeclarant(f,r.workpackage)})},[e("a",{href:"#",onClick:v(h=>t.$emit("addperson",f.id,r.workpackage.id),["prevent"])},c(f.displayname),9,Zi)],2))),256))])]),e("a",{href:"#",class:"btn btn-default btn-xs",onClick:s[5]||(s[5]=v((...f)=>i.handlerEditWorkPackage&&i.handlerEditWorkPackage(...f),["prevent"]))},[$i,a("Modifier")]),e("a",{href:"#",class:"btn btn-default btn-xs",onClick:s[6]||(s[6]=v((...f)=>i.handlerDeleteWorkPackage&&i.handlerDeleteWorkPackage(...f),["prevent"]))},[ea,a("Supprimer")])])):d("",!0),r.persons.length<=0?(l(),o("div",ta,[a(" Vous n'avez pas encore ajouté de membre à cette activité. "),sa,a(". ")])):d("",!0)])):d("",!0)])}const la=E(Ni,[["render",na]]);const oa={components:{Workpackage:la},data(){return{loading:!1,errors:[],isDeclarant:!1,isValidateur:!1,confirm:null,confirmData:null,confirmHandler:null,editedWorlpackage:null}},props:{url:{required:!0},editable:{required:!1,default:!1},allowTooltip:{default:!1},isValidateur:{required:!0},outsidePerson:{required:!0},persons:{required:!0},workpackages:{required:!0},debugEnabled:{default:!1}},methods:{handlerWorkPackageCancelNew(t){this.workpackages.splice(this.workpackages.indexOf(t),1)},handlerWorkPackageNew(){this.workpackages.push({id:-1,code:"Nouveau Lot",label:"",persons:[],description:""})},handlerConfirm(){console.log("handlerConfirm"),this.confirmHandler(this.confirmData),this.confirm=null},handlerWorkPackagePersonDelete(t){this.confirm="Supprimer le déclarant ?",this.confirmData=t,this.confirmHandler=this.handlerWorkPackagePersonDeleteDo},handlerWorkPackagePersonDeleteDo(t){S.delete(this.url+"?workpackagepersonid="+t.id).then(s=>{this.fetch()},s=>{this.errors.push("Impossible de supprimer le déclarant : "+s.body)})},handlerWorkPackageDelete(t){this.confirm="Supprimer le lot de travail ?",this.confirmData=t,this.confirmHandler=this.handlerWorkPackageDeleteDo},handlerWorkPackageDeleteDo(t){S.delete(this.url+"?workpackageid="+t.id).then(s=>{this.fetch()},s=>{this.errors.push("Impossible de supprimer le lot : "+s.body)})},handlerWorkPackageUpdate(t){var s=new FormData;for(var r in t)s.append(r,t[r]);if(t.id>0)console.log("MAJ du LOT"),s.append("workpackageid",t.id),S.post(this.url,s).then(k=>{this.fetch()},k=>{this.errors.push("Impossible de mettre à jour le lot de travail : "+k.body)});else{console.log("NOUVEAU du LOT ",this.url);let k=JSON.parse(JSON.stringify(t));k.workpackageid=-1,S.put(this.url,k).then(n=>{this.fetch()},n=>{this.errors.push("Impossible de créer le lot de travail : "+n.body)}).then(n=>this.fetch())}},handlerUpdateWorkPackagePerson(t,s){var r=new FormData;r.append("workpackagepersonid",t.id),r.append("duration",s),S.post(this.url,r).then(k=>{t.duration=s},k=>{this.errors.push("Impossible de mettre à jour les heures prévues : "+k.body)})},addperson(t,s){console.log(arguments);var r={idworkpackage:s,idperson:t};S.put(this.url,r).then(k=>{this.fetch()},k=>{this.errors.push("Impossible d'ajouter le déclarant : "+k.body)}).then(()=>this.loading=!1)},fetch(){this.loading="Chargement des lots de travails",console.log(this.url),S.get(this.url+"?v=2").then(t=>{console.log("Chargement des lots de travail : ",t);try{let s=t.data.datas.workpackages;this.$emit("update",s)}catch(s){this.errors.push("UI ERROR "+s)}},t=>{this.errors.push(z.manageErrorResponse(t).message)}).then(()=>this.loading=!1)},fetchPersons(){this.fetch()}}},ee=t=>(T("data-v-7f36a26b"),t=t(),q(),t),ia={key:0,class:"vue-loader"},aa={class:"alert alert-danger"},ra=["onClick"],da=ee(()=>e("i",{class:"icon-cancel-outline"},null,-1)),ca=[da],ua={key:0,class:"overlay"},ha={class:"overlay-content"},ma={class:"overlay-title"},pa={class:"buttons"},_a={class:"admin-bar"},fa=ee(()=>e("i",{class:"icon-book"},null,-1)),va=ee(()=>e("i",{class:"icon-bug"},null,-1)),ga={class:"workpackages"};function ya(t,s,r,k,n,i){const y=D("workpackage");return l(),o("section",null,[g(M,{name:"fade"},{default:A(()=>[n.errors.length?(l(),o("div",ia,[(l(!0),o(b,null,w(n.errors,(f,h)=>(l(),o("div",aa,[a(c(f)+" ",1),e("a",{href:"",onClick:v(V=>n.errors.splice(h,1),["prevent"])},ca,8,ra)]))),256))])):d("",!0)]),_:1}),g(M,{name:"fade"},{default:A(()=>[n.confirm?(l(),o("div",ua,[e("div",ha,[e("div",ma,[a(c(n.confirm)+" ",1),e("a",{href:"#",class:"overlay-closer",onClick:s[0]||(s[0]=v(f=>n.confirm=null,["prevent"]))},"x")]),e("nav",pa,[e("a",{href:"#",class:"btn btn-danger",onClick:s[1]||(s[1]=v(f=>n.confirm=null,["prevent"]))},"Annuler"),e("a",{href:"#",class:"btn btn-danger",onClick:s[2]||(s[2]=v(f=>i.handlerConfirm(),["prevent"]))},"Confirmer")])])])):d("",!0)]),_:1}),e("nav",_a,[e("a",{href:"",class:"btn btn-primary btn-xs",onClick:s[3]||(s[3]=v((...f)=>i.handlerWorkPackageNew&&i.handlerWorkPackageNew(...f),["prevent"]))},[fa,a(" Nouveau lot")]),r.debugEnabled?(l(),o("a",{key:0,href:"",class:"btn btn-warning btn-xs",onClick:s[4]||(s[4]=v((...f)=>i.fetch&&i.fetch(...f),["prevent"]))},[va,a(" fetch")])):d("",!0)]),e("section",ga,[(l(!0),o(b,null,w(r.workpackages,f=>(l(),I(y,{key:f.id,"allow-tooltip":r.allowTooltip,workpackage:f,persons:r.persons,editable:r.editable,"is-validateur":r.isValidateur,onAddperson:i.addperson,onWorkpackageupdate:i.handlerWorkPackageUpdate,onWorkpackagepersonupdate:i.handlerUpdateWorkPackagePerson,onWorkpackagepersondelete:i.handlerWorkPackagePersonDelete,onWorkpackagedelete:i.handlerWorkPackageDelete,onWorkpackagecancelnew:i.handlerWorkPackageCancelNew},null,8,["allow-tooltip","workpackage","persons","editable","is-validateur","onAddperson","onWorkpackageupdate","onWorkpackagepersonupdate","onWorkpackagepersondelete","onWorkpackagedelete","onWorkpackagecancelnew"]))),128))])])}const ka=E(oa,[["render",ya],["__scopeId","data-v-7f36a26b"]]);S.defaults.headers.common.Accept="application/json";S.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";const L="activities_sticky",ba={name:"Activity",components:{ActivityAvenants:vs,ActivityNotes:ke,ActivityLogs:ye,ActivityDocument:ge,ActivitySpentSynthesis:be,EntityWithRole:De,Loader:we,Payments:Fo,PersonCartouche:ci,PersonDisplay:ne,Milestones:$n,Modal:se,VueJsonPretty:ce,WorkpackagesActivity:ka},props:{url:{required:!0},debugEnabled:{required:!1,type:Boolean,default:!1}},data(){return{administration:null,avenants:null,budget:null,core:null,credentials:null,currencies:[],documents:[],milestones:[],milestonesTypes:[],milestonesUrl:null,milestonesUrlNotifications:null,notes:null,notes_url:null,payments:[],paymentsUrl:null,persons:null,personsUrl:null,personsUrlNew:null,rolesOrganizations:null,rolesPersons:null,timesheets:null,timesheetsDeclarers:null,timesheetsValidators:null,timesheetsUrl:null,timesheetsUrlSynthesis:null,organizations:null,organizationsUrl:null,organizationsUrlNew:null,workpackages:null,workpackagesUrl:null,spents:null,activity:{},duplicateDatas:null,sticky:[],descriptionFull:!1,debug_content:null,debug_displayed:!1,error:null,loading:!0}},computed:{personsWP(){if(this.persons){let t={};return this.persons.forEach(s=>{t.hasOwnProperty(s.enrolled)||(t[s.enrolled]={id:s.enrolled,displayname:s.enrolledLabel,firstname:s.firstname,lastname:s.lastname})}),Object.values(t)}else return[]},storage(){return localStorage.getItem(L)},isSticky(){return this.sticky.find(t=>t.id==this.core.id)},labelReduced(){let t=this.core.label;return t.length>50?t.substr(0,50)+"...":t}},methods:{performLock(t){S.post(this.url,{action:t}).then(s=>{this.fetch()},s=>{let r=z.manageErrorResponse(s).message;R.commit("addError",r)})},handlerUnlock(){this.performLock("lock")},handlerLock(){this.performLock("unlock")},testError(t,s="Une erreur affichée"){R.commit("addError",s)},handlerHelp(t){R.dispatch("displayHelp",t)},handlerDebug(t){this.debug_content=t,this.debug_displayed=!0},handlerDebugHide(){this.debug_displayed=!1},handlerDebugShow(t){this.debug_content=JSON.parse(JSON.stringify(t)),this.debug_displayed=!0},handlerError(t){this.error=t.message},handlerUpdateWorkpackages(t){this.workpackages=t.entities},handlerUpdateNotes(t){this.notes=t.entities},handlerUpdatePayments(t){this.payments=t.entities,this.currencies=t.currencies,this.paymentsUrl=t.url},handlerUpdateMilestones(t){this.milestones=t},handlerUpdatePersons(t){this.persons=t.datas.items},handlerUpdateOrganizations(t){this.organizations=t.datas.items},handlerUpdateDocuments(t){console.log(t),this.documents=t},handlerUpdateAvenants(t){console.log("AVENANTS",t),this.avenants=t},handlerPurgeSticky(){this.sticky=[],localStorage.removeItem(L)},toogleSticky(){this.isSticky?this.handlerUnSticky():this.handlerSticky()},handlerUnSticky(){this.sticky.forEach((t,s)=>{t.id==this.core.id&&this.sticky.splice(s,1)}),localStorage.setItem(L,JSON.stringify(this.sticky))},handlerSticky(){this.sticky.push({id:this.core.id,label:this.core.label,num:this.core.numOscar,location:document.location.href}),localStorage.setItem(L,JSON.stringify(this.sticky))},handlerNavigateSticky(t){t.location&&(document.location=t.location)},test(){console.log(localStorage.getItem())},fetch(){this.loading=!0,S.get(this.url).then(t=>{this.budget=t.data.activity.datas.budget,this.core=t.data.activity.datas.core,t.data.activity.datas.spents&&(this.spents=t.data.activity.datas.spents),t.data.activity.datas.avenants&&this.handlerUpdateAvenants(t.data.activity.datas.avenants),t.data.activity.datas.administration&&(this.administration=t.data.activity.datas.administration),t.data.activity.datas.documents&&this.handlerUpdateDocuments(t.data.activity.datas.documents),t.data.activity.datas.notes&&(this.notes=t.data.activity.datas.notes.entities,this.notes_url=t.data.activity.datas.notes.url),t.data.activity.datas.milestones&&(this.milestones=t.data.activity.datas.milestones.entities,this.milestonesTypes=t.data.activity.datas.milestones.types,this.milestonesUrl=t.data.activity.datas.milestones.url,this.milestonesUrlNotifications=t.data.activity.datas.milestones.urlNotifications),t.data.activity.datas.organizations&&(this.organizations=t.data.activity.datas.organizations.entities,this.organizationsUrl=t.data.activity.datas.organizations.url,this.organizationsUrlNew=t.data.activity.datas.organizations.urlNew,this.rolesOrganizations=t.data.activity.datas.organizations.roles),t.data.activity.datas.payments&&this.handlerUpdatePayments(t.data.activity.datas.payments),t.data.activity.datas.persons&&(this.persons=t.data.activity.datas.persons.entities,this.personsUrlNew=t.data.activity.datas.persons.urlNew,this.personsUrl=t.data.activity.datas.persons.url,this.rolesPersons=t.data.activity.datas.persons.roles),t.data.activity.datas.timesheets?(this.timesheets=t.data.activity.datas.timesheets,this.timesheetsValidators=t.data.activity.datas.timesheets.validators,this.timesheetsDeclarers=t.data.activity.datas.timesheets.declarers,this.timesheetsUrl=t.data.activity.datas.timesheets.url,this.timesheetsUrlSynthesis=t.data.activity.datas.timesheets.urlSynthesis):console.log("pas de donnée FEUILLE DE TEMPS"),t.data.activity.datas.workpackages?(this.workpackages=t.data.activity.datas.workpackages.entities,this.workpackagesUrl=t.data.activity.datas.workpackages.url):console.log("pas de donnée LOTS DE TRAVAIL"),this.credentials=t.data.activity.credentials},t=>{this.handlerError(z.manageErrorResponse(t))}).finally(t=>{this.loading=!1})},handlerDuplicate(){this.duplicateDatas={displayed:!1,keepPersons:!0,keepOrganizations:!0,keepMilestones:!0,keepWorkpackages:!1,keepAdmData:!1}},handlerDuplicateDo(){document.location=this.core.urls.duplicate+"?"+(this.duplicateDatas.keepPersons?"&keeppersons=on":"")+(this.duplicateDatas.keepOrganizations?"&keeporganizations=on":"")+(this.duplicateDatas.keepMilestones?"&keepmilestones=on":"")+(this.duplicateDatas.keepWorkpackages?"&keepworkpackage=on":"")+(this.duplicateDatas.keepAdmData?"&keepadmdata=on":"")},handlerShowProject(){this.activity.project.url_show&&(document.location=this.activity.project.url_show)}},mounted(){this.fetch();let t=localStorage.getItem(L);t?t=JSON.parse(t):t=[],this.sticky=t}},m=t=>(T("data-v-8de60033"),t=t(),q(),t),Da={class:"alert alert-danger"},wa={key:0,class:"overlay"},Ca={class:"overlay-content"},Pa=m(()=>e("h1",{class:"overlay-title"},"Dupliquer cette activité",-1)),Aa={class:"row",style:{width:"80%"}},Ua={class:"col-md-6 col-md-offset-3"},Sa=m(()=>e("small",null,"Options de copie pour",-1)),Ma=m(()=>e("br",null,null,-1)),Ea={class:"col-md-6 col-md-offset-3"},Va={class:"list-group-item separator-bottom"},xa=m(()=>e("strong",null,[e("i",{class:"icon-group"}),a(" Reprendre les personnes ")],-1)),Na={class:"material-switch pull-right"},ja=m(()=>e("label",{for:"keeppersons",class:"label-primary"},null,-1)),Oa={class:"list-group-item separator-bottom"},za=m(()=>e("strong",null,[e("i",{class:"icon-calendar"}),a(" Reprendre les jalons ")],-1)),Ra={class:"material-switch pull-right"},Ia=m(()=>e("label",{for:"keepmilestones",class:"label-primary"},null,-1)),Fa={class:"list-group-item separator-bottom"},Wa=m(()=>e("strong",null,[e("i",{class:"icon-building-filled"}),a(" Reprendre les organisations ")],-1)),Ta={class:"material-switch pull-right"},qa=m(()=>e("label",{for:"keeporganizations",class:"label-primary"},null,-1)),La={class:"list-group-item separator-bottom"},Ja=m(()=>e("strong",null,[e("i",{class:"icon-archive"}),a(" Reprendre les lots de travail ")],-1)),Ha={class:"material-switch pull-right"},Ba=m(()=>e("label",{for:"keepworkpackages",class:"label-primary"},null,-1)),Ya={class:"list-group-item separator-bottom"},Ga=m(()=>e("strong",null,[e("i",{class:"icon-archive"}),a(" Reprendre les données de base ")],-1)),Ka=m(()=>e("br",null,null,-1)),Xa=m(()=>e("small",null,"Données du formulaire de créaton : Dates de début / fin, intitulé, description, type, etc...",-1)),Qa={class:"material-switch pull-right"},Za=m(()=>e("label",{for:"keepadmdata",class:"label-primary"},null,-1)),$a={class:"text-center"},er={key:1},tr={class:"navbar navbar-default navbar-fixed-top",style:{top:"50px","z-index":"500"}},sr={class:"container"},nr={class:"navbar-header"},lr=he('',1),or={class:"navbar-brand",href:"#"},ir=m(()=>e("i",{class:"icon-cube"},null,-1)),ar={class:"collapse navbar-collapse",id:"bs-example-navbar-collapse-1"},rr={class:"nav navbar-nav"},dr={key:0,href:"#members"},cr={key:0,href:"#partners"},ur={key:0,href:"#documents"},hr={key:0,href:"#milestones"},mr={key:0,href:"#notes"},pr={key:0,href:"#payments"},_r={key:0,href:"#spents"},fr={key:0,href:"#timesheets"},vr={class:"nav navbar-nav navbar-right"},gr={class:"dropdown"},yr=m(()=>e("a",{href:"#",class:"dropdown-toggle","data-toggle":"dropdown",role:"button","aria-haspopup":"true","aria-expanded":"false"},[e("i",{class:"icon-pin text-primary"}),e("span",{class:"caret"})],-1)),kr={class:"dropdown-menu"},br={key:0},Dr={key:1},wr=m(()=>e("i",{class:"icon-pin-outline"},null,-1)),Cr=m(()=>e("li",{role:"separator",class:"divider"},null,-1)),Pr=["onClick"],Ar=m(()=>e("i",{class:"icon-cube"},null,-1)),Ur={key:0,class:"icon-link-ext"},Sr=m(()=>e("li",{role:"separator",class:"divider"},null,-1)),Mr=m(()=>e("i",{class:"icon-trash"},null,-1)),Er={class:"jumbotron activity-header oscar-header",style:{"margin-top":"60px"}},Vr={class:"row line-bottom"},xr={class:"col-md-9"},Nr={class:"activity-project"},jr=m(()=>e("i",{class:"icon-cubes"},null,-1)),Or={key:0},zr={key:1},Rr=["href"],Ir={key:0},Fr={key:1},Wr={class:"activity-type"},Tr=m(()=>e("i",{class:"icon-tag"},null,-1)),qr={class:"type-chain"},Lr=m(()=>e("i",{class:"icon-cube"},null,-1)),Jr={class:"col-md-3"},Hr={key:0,class:"budget"},Br=m(()=>e("em",null,"Montant",-1)),Yr={class:"text-private amount"},Gr={class:"details"},Kr={class:"text-private"},Xr={key:0,class:"text-private"},Qr={class:"text-private"},Zr={class:"text-private"},$r={class:"text-private"},ed={class:"row"},td={class:"col-md-4"},sd=m(()=>e("h4",null,[e("i",{class:"icon-calendar"}),a("Dates")],-1)),nd={class:"texthighlight baseline"},ld={class:"aggo"},od=m(()=>e("br",null,null,-1)),id={class:"aggo"},ad=m(()=>e("br",null,null,-1)),rd={class:"aggo"},dd=m(()=>e("br",null,null,-1)),cd={class:"aggo"},ud={class:"col-md-4"},hd=m(()=>e("h4",null,[e("i",{class:"icon-briefcase"}),a("Numérotations")],-1)),md={class:"texthighlight baseline"},pd=m(()=>e("br",null,null,-1)),_d={key:0,class:"text-private"},fd={key:1,class:"text-private"},vd=m(()=>e("br",null,null,-1)),gd={class:"texthighlight baseline"},yd={class:"col-md-4"},kd=m(()=>e("h4",null,[e("i",{class:"icon-database-1"}),a("Divers")],-1)),bd={class:"texthighlight baseline"},Dd=m(()=>e("br",null,null,-1)),wd={class:"row line-bottom"},Cd={class:"col-md-4"},Pd=m(()=>e("h4",null,[e("i",{class:"icon-tags"}),a("Métas-données")],-1)),Ad={class:"texthighlight baseline"},Ud={class:"cartouche xs"},Sd={class:"texthighlight baseline"},Md={class:"cartouche complementary",style:{"line-break":"anywhere"}},Ed=m(()=>e("i",{class:"icon-tag"},null,-1)),Vd={class:"row"},xd={class:"col-md-12"},Nd={class:"admin-bar"},jd=m(()=>e("i",{class:"icon-lock-open"},null,-1)),Od=m(()=>e("i",{class:"icon-lock"},null,-1)),zd={key:1},Rd={key:0,class:"btn btn-default disabled"},Id=m(()=>e("i",{class:"icon-lock"},null,-1)),Fd=["href"],Wd=m(()=>e("i",{class:"icon-pencil"},null,-1)),Td=["href"],qd=m(()=>e("i",{class:"icon-cubes"},null,-1)),Ld=["href"],Jd=m(()=>e("i",{class:"icon-cubes"},null,-1)),Hd=m(()=>e("i",{class:"icon-paste"},null,-1)),Bd=m(()=>e("i",{class:"icon-bug"},null,-1)),Yd=m(()=>e("i",{class:"icon-bug"},null,-1)),Gd={class:"container-fluid"},Kd={class:"col-md-8"},Xd={key:0,class:"section-infos",id:"members"},Qd=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-group"}),a("Membres")])],-1)),Zd={key:1,class:"section-infos",id:"partners"},$d=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-building-filled"}),a("Partenaires")])],-1)),ec={key:2,class:"section-infos",id:"avenants"},tc=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-hammer"}),a(" Avenants ")])],-1)),sc={key:3,class:"section-infos",id:"documents"},nc=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-book"}),a("Documents")])],-1)),lc={key:4,class:"section-infos",id:"notes"},oc=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-comment"}),a("Notes")])],-1)),ic={key:5,id:"timesheets",class:"section-infos"},ac=m(()=>e("h2",{class:"section-title"},[e("span",null,[e("i",{class:"icon-book"}),a("Feuille de temps")])],-1)),rc={key:0,class:"alert alert-info"},dc={key:1},cc={class:"oscar-section"},uc=m(()=>e("h3",{class:"oscar-section-title"},[e("span",null,[e("i",{class:"icon-calendar"}),a("Général")])],-1)),hc={class:"oscar-section-content"},mc=["href"],pc=m(()=>e("i",{class:"icon-calendar"},null,-1)),_c=["href"],fc=m(()=>e("i",{class:"icon-book"},null,-1)),vc={key:0},gc={class:"oscar-section"},yc=m(()=>e("h3",{class:"oscar-section-title"},[e("span",null,[e("i",{class:"icon-group"}),a("Déclarants")])],-1)),kc={class:"oscar-section-content"},bc={key:0},Dc=["href"],wc={key:0},Cc={key:1,class:"alert-warning alert"},Pc=m(()=>e("strong",null,"Lots de travail",-1)),Ac={class:"oscar-section"},Uc={class:"oscar-section-title"},Sc=m(()=>e("span",{class:"text"},[e("i",{class:"icon-user-md"}),a(" Valideurs ")],-1)),Mc=["href"],Ec=m(()=>e("i",{class:"icon-user-md"},null,-1)),Vc={class:"row oscar-section-content"},xc={class:"col-md-4"},Nc=m(()=>e("h4",null,[e("i",{class:"icon-cube"}),a("Validation projet")],-1)),jc={key:0,class:"alert alert-warning"},Oc={class:"cartouche primary person"},zc={class:"col-md-4"},Rc=m(()=>e("h4",null,[e("i",{class:"icon-beaker"}),a("Validation scientifique")],-1)),Ic={key:0,class:"alert alert-warning"},Fc={class:"cartouche person primary"},Wc={class:"col-md-4"},Tc=m(()=>e("h4",null,[e("i",{class:"icon-book"}),a("Validation administrative")],-1)),qc={key:0,class:"alert alert-warning"},Lc={class:"cartouche person primary"},Jc={class:"oscar-section"},Hc=m(()=>e("h3",{class:"oscar-section-title"},[e("span",null,[e("i",{class:"icon-archive"}),a("Lots de travail")])],-1)),Bc={class:"oscar-section-content"},Yc={class:"col-md-4"},Gc={key:0,id:"milestones",class:"section-infos"},Kc=m(()=>e("span",null,[e("h2",null,[e("i",{class:"icon-calendar"}),a("Jalons")])],-1)),Xc=["href"],Qc=m(()=>e("i",{class:"icon-bell"},null,-1)),Zc={key:1,id:"payments",class:"section-infos"},$c=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-bank"}),a("Versements")])],-1)),eu={key:2,id:"spents",class:"section-infos"},tu=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-bank"}),a("Dépenses")])],-1)),su={key:0,class:"alert alert-warning"},nu={key:1},lu={class:"buttons xs"},ou=["href"],iu=m(()=>e("i",{class:"icon-file-excel"},null,-1)),au=["href"],ru=m(()=>e("i",{class:"icon-file-excel"},null,-1)),du={class:"section-infos"},cu=m(()=>e("h2",null,"PCRU",-1)),uu=["href"],hu={key:0,class:"container-fluid activity-fiche"},mu={class:"row"},pu={class:"col-md-12"},_u=m(()=>e("h2",null,[e("span",null,[e("i",{class:"icon-cog"}),a("Technique")])],-1)),fu={key:2};function vu(t,s,r,k,n,i){const y=D("loader"),f=D("VueJsonPretty"),h=D("modal"),V=D("EntityWithRole"),G=D("activity-avenants"),K=D("activity-document"),H=D("activity-notes"),u=D("PersonDisplay"),_=D("workpackages-activity"),O=D("Milestones"),oe=D("Payments"),ie=D("ActivitySpentSynthesis"),ae=D("ActivityLogs");return l(),o(b,null,[g(y,{text:"Chargement de l'activité",visible:n.loading},null,8,["visible"]),g(h,{title:"Debugger","title-icon":"icon-bug",visible:n.debug_displayed,onModalCancel:s[1]||(s[1]=p=>n.debug_displayed=!1)},{buttons:A(()=>[e("button",{class:"btn btn-default",onClick:s[0]||(s[0]=(...p)=>i.handlerDebugHide&&i.handlerDebugHide(...p))},"FERMER")]),default:A(()=>[g(f,{data:n.debug_content},null,8,["data"])]),_:1},8,["visible"]),g(h,{title:"Une erreur est survenue","title-icon":"icon-bug",visible:n.error!=null},{buttons:A(()=>[e("button",{class:"btn btn-default",onClick:s[2]||(s[2]=p=>n.error=null)},"FERMER")]),default:A(()=>[e("div",Da,c(n.error),1)]),_:1},8,["visible"]),n.duplicateDatas!=null?(l(),o("div",wa,[e("div",Ca,[Pa,e("a",{class:"overlay-closer",onClick:s[3]||(s[3]=p=>n.duplicateDatas=null)},"x"),e("div",Aa,[e("h1",Ua,[Sa,a(),Ma,e("strong",null,c(n.core.label),1)]),e("div",Ea,[e("div",Va,[xa,e("div",Na,[C(e("input",{id:"keeppersons",name:"keeppersons",type:"checkbox","onUpdate:modelValue":s[4]||(s[4]=p=>n.duplicateDatas.keepPersons=p)},null,512),[[W,n.duplicateDatas.keepPersons]]),ja])]),e("div",Oa,[za,e("div",Ra,[C(e("input",{id:"keepmilestones",name:"keepmilestones",type:"checkbox","onUpdate:modelValue":s[5]||(s[5]=p=>n.duplicateDatas.keepMilestones=p)},null,512),[[W,n.duplicateDatas.keepMilestones]]),Ia])]),e("div",Fa,[Wa,e("div",Ta,[C(e("input",{id:"keeporganizations",name:"keeporganizations",type:"checkbox","onUpdate:modelValue":s[6]||(s[6]=p=>n.duplicateDatas.keepOrganizations=p)},null,512),[[W,n.duplicateDatas.keepOrganizations]]),qa])]),e("div",La,[Ja,e("div",Ha,[C(e("input",{id:"keepworkpackages",name:"keepworkpackages",type:"checkbox","onUpdate:modelValue":s[7]||(s[7]=p=>n.duplicateDatas.keepWorkpackages=p)},null,512),[[W,n.duplicateDatas.keepWorkpackages]]),Ba])]),e("div",Ya,[Ga,Ka,Xa,e("div",Qa,[C(e("input",{id:"keepadmdata",name:"keepadmdata",type:"checkbox","onUpdate:modelValue":s[8]||(s[8]=p=>n.duplicateDatas.keepAdmData=p)},null,512),[[W,n.duplicateDatas.keepAdmData]]),Za])]),e("nav",$a,[e("a",{href:"#",class:"btn btn-primary",onClick:s[9]||(s[9]=p=>n.duplicateDatas=null)},"Annuler"),e("a",{href:"#",class:"btn btn-default",onClick:s[10]||(s[10]=(...p)=>i.handlerDuplicateDo&&i.handlerDuplicateDo(...p))},"Dupliquer l'activité")])])])])])):d("",!0),n.core&&n.credentials&&n.credentials.read?(l(),o("div",er,[e("nav",tr,[e("div",sr,[e("div",nr,[lr,e("a",or,[ir,e("strong",null,c(n.core.numOscar),1),e("span",null," / "+c(i.labelReduced),1),e("i",{class:"icon-pin",style:ue({opacity:i.isSticky?1:.3}),onClick:s[11]||(s[11]=(...p)=>i.toogleSticky&&i.toogleSticky(...p))},null,4)])]),e("div",ar,[e("ul",rr,[e("li",null,[n.credentials.persons.read?(l(),o("a",dr,"Membres")):d("",!0)]),e("li",null,[n.credentials.organizations.read?(l(),o("a",cr,"Partenaires")):d("",!0)]),e("li",null,[n.credentials.documents.read?(l(),o("a",ur,"Documents")):d("",!0)]),e("li",null,[n.credentials.milestones.read?(l(),o("a",hr,"Jalons")):d("",!0)]),e("li",null,[n.credentials.notes.read?(l(),o("a",mr,"Notes")):d("",!0)]),e("li",null,[n.credentials.budget.read?(l(),o("a",pr,"Versements")):d("",!0)]),e("li",null,[n.credentials.spents.read?(l(),o("a",_r,"Dépenses")):d("",!0)]),e("li",null,[n.credentials.timesheets.read?(l(),o("a",fr,"Feuilles de temps")):d("",!0)])]),e("ul",vr,[e("li",gr,[yr,e("ul",kr,[i.isSticky?(l(),o("li",br,[e("a",{href:"#",onClick:s[12]||(s[12]=(...p)=>i.handlerUnSticky&&i.handlerUnSticky(...p))},"Désépingler")])):(l(),o("li",Dr,[e("a",{href:"#",onClick:s[13]||(s[13]=v((...p)=>i.handlerSticky&&i.handlerSticky(...p),["prevent"]))},[wr,a(" Epingler")])])),Cr,(l(!0),o(b,null,w(n.sticky,p=>(l(),o("li",{class:P(p.id==n.core.id?"disabled":"")},[e("a",{href:"#",onClick:te=>i.handlerNavigateSticky(p)},[Ar,e("strong",null,c(p.num),1),e("em",null,c(p.label),1),p.id!=n.core.id?(l(),o("i",Ur)):d("",!0)],8,Pr)],2))),256)),Sr,e("li",null,[e("a",{href:"#",onClick:s[14]||(s[14]=v((...p)=>i.handlerPurgeSticky&&i.handlerPurgeSticky(...p),["prevent"]))},[Mr,a(" Supprimer les épingles ")])])])])])])])]),e("header",Er,[e("div",Vr,[e("div",xr,[e("h4",Nr,[jr,a(" "),n.core.project===null?(l(),o("em",Or,"Aucun Projet")):(l(),o("span",zr,[n.credentials.project.read?(l(),o("a",{key:0,href:n.core.project.url_show},[n.core.project.acronym?(l(),o("strong",Ir,c(n.core.project.acronym)+" ",1)):d("",!0),e("em",null,c(n.core.project.label),1)],8,Rr)):(l(),o("span",Fr,[e("strong",null,c(n.core.project.acronym),1),e("em",null,c(n.core.project.label),1)]))]))]),e("h3",null,[e("span",{class:P(["picto status-","status-"+n.core.status])},[e("i",{class:P(["icon","icon-"+n.core.status])},null,2),a(" "+c(n.core.status_label),1)],2),e("span",Wr,[Tr,e("span",qr,[e("i",{class:P(n.core.type_slug)},null,2),(l(!0),o(b,null,w(n.core.type_chain,p=>(l(),o("span",null,c(p.label),1))),256))])])]),e("h1",null,[e("span",null,[Lr,a(" "+c(n.core.label),1)])])]),e("div",Jr,[n.budget&&n.credentials.budget.read?(l(),o("div",Hr,[Br,e("strong",Yr,c(t.$filters.money(n.budget.montant))+" "+c(n.budget.currency.symbol),1),e("div",Gr,[e("small",null,[a(" Frais de gestion : "),e("b",Kr,c(n.budget.fraisDeGestion),1)]),e("small",null,[a(" Part unité : "),n.budget.fraisDeGestionPartUnite?(l(),o("b",Xr,c(n.budget.fraisDeGestionPartUnite),1)):d("",!0)]),e("small",null,[a(" Part hébergeur : "),e("b",Qr,c(n.budget.fraisDeGestionPartHebergeur),1)]),e("small",null,[a(" Part Gestionnaire : "),e("b",Zr,c(n.budget.fraisDeGestionPartGestionnaire),1)]),e("small",null,[a(" TVA : "),e("b",$r,c(n.budget.tva),1)])])])):d("",!0)])]),n.core.description?(l(),o("p",{key:0,class:P(["baseline",{descriptionPacked:!n.descriptionFull}]),onClick:s[15]||(s[15]=p=>n.descriptionFull=!n.descriptionFull)},[e("small",null,c(n.core.description),1)],2)):d("",!0),e("div",ed,[e("div",td,[sd,e("p",nd,[a(" Début : "),e("time",null,c(t.$filters.date(n.core.dateStart)),1),e("small",ld," ("+c(t.$filters.timeAgo(n.core.dateStart))+")",1),od,a(" Fin : "),e("time",null,c(t.$filters.dateFull(n.core.dateEnd)),1),e("small",id," ("+c(t.$filters.timeAgo(n.core.dateEnd))+")",1),ad,a(" Signé le : "),e("time",null,c(t.$filters.dateFull(n.core.dateSigned)),1),e("small",rd," ("+c(t.$filters.timeAgo(n.core.dateSigned))+")",1),dd,a(" Date de début des négociations : "),e("time",null,c(t.$filters.dateFull(n.core.dateNegociation)),1),e("small",cd," ("+c(t.$filters.timeAgo(n.core.dateNegociation))+")",1)])]),e("div",ud,[hd,e("p",md,[a(' N° Oscar" : '),e("strong",null,c(n.core.numOscar),1),pd,a(" Numéro financier : "),n.core.pfi?(l(),o("strong",_d,c(n.core.pfi),1)):(l(),o("strong",fd,"AUCUN")),a(" - Ouverture du PFI le "),e("time",null,c(t.$filters.dateFull(n.core.dateOpened)),1),vd]),(l(!0),o(b,null,w(n.core.numeros,(p,te)=>(l(),o("p",gd,[a(c(te)+" : ",1),e("strong",null,c(p),1)]))),256))]),e("div",yd,[kd,e("p",bd,[a(" Création "),e("time",null,c(t.$filters.dateFull(n.core.dateCreated)),1),Dd,a(" Dernière MAJ "),e("time",null,c(t.$filters.dateFull(n.core.dateUpdated)),1)])])]),e("div",wd,[e("div",Cd,[Pd,e("p",Ad,[a(" Disciplines : "),(l(!0),o(b,null,w(n.core.disciplines,p=>(l(),o("span",Ud,c(p),1))),256))]),e("p",Sd,[a(" Mots clés : "),(l(!0),o(b,null,w(n.core.motscles,p=>(l(),o("span",Md,[Ed,a(" "+c(p),1)]))),256))])])]),e("div",Vd,[e("div",xd,[e("nav",Nd,[n.credentials.lock_edit?(l(),o(b,{key:0},[n.credentials.lock?(l(),o("a",{key:0,class:"btn btn-info",onClick:s[16]||(s[16]=p=>i.handlerLock())},[jd,a(" Déverrouiller")])):(l(),o("a",{key:1,class:"btn btn-info",onClick:s[17]||(s[17]=p=>i.handlerUnlock())},[Od,a(" Vérrouiller")]))],64)):n.credentials.lock?(l(),o("span",zd,[n.credentials.lock?(l(),o("strong",Rd,[Id,a(" VERROUILLEE ")])):d("",!0)])):d("",!0),n.credentials.core.edit?(l(),o("a",{key:2,class:"btn btn-primary",href:n.core.urls.edit},[Wd,a(" Modifier les informations")],8,Fd)):d("",!0),n.credentials.core.change_project?(l(),o("a",{key:3,class:"btn btn-default",href:n.core.urls.change_project},[qd,a(" Modifier le projet")],8,Td)):d("",!0),n.credentials.core.new_project?(l(),o("a",{key:4,class:"btn btn-default",href:n.core.urls.new_project},[Jd,a(" Créer un nouveau projet")],8,Ld)):d("",!0),n.core.urls.duplicate?(l(),o("a",{key:5,class:"btn btn-default",onClick:s[18]||(s[18]=(...p)=>i.handlerDuplicate&&i.handlerDuplicate(...p))},[Hd,a(" Dupliquer")])):d("",!0),r.debugEnabled?(l(),o("a",{key:6,class:"btn btn-warning",onClick:s[19]||(s[19]=p=>i.handlerDebugShow(t.$data))},[Bd,a(" Afficher le modèle")])):d("",!0),r.debugEnabled?(l(),o("a",{key:7,class:"btn btn-warning",onClick:s[20]||(s[20]=(...p)=>i.fetch&&i.fetch(...p))},[Yd,a(" Recharger le modèle")])):d("",!0)])])])]),e("div",Gd,[e("div",Kd,[n.credentials.persons.read?(l(),o("section",Xd,[Qd,g(V,{title:"Personne",standalone:!1,"entity-link-show":n.credentials.persons.show,manage:n.credentials.persons.edit,roles:n.rolesPersons,items:n.persons,"url-new":n.personsUrlNew,url:n.personsUrl,"debug-enabled":r.debugEnabled,onUpdate:i.handlerUpdatePersons},null,8,["entity-link-show","manage","roles","items","url-new","url","debug-enabled","onUpdate"])])):d("",!0),n.credentials.organizations.read?(l(),o("section",Zd,[$d,g(V,{title:"Organisation",standalone:!1,"debug-enabled":r.debugEnabled,"entity-link-show":n.credentials.organizations.show,manage:n.credentials.organizations.edit,roles:n.rolesOrganizations,items:n.organizations,url:n.organizationsUrl,"url-new":n.organizationsUrlNew,onUpdate:i.handlerUpdateOrganizations},null,8,["debug-enabled","entity-link-show","manage","roles","items","url","url-new","onUpdate"])])):d("",!0),n.credentials.avenants.read?(l(),o("section",ec,[tc,g(G,{avenants:n.avenants,"roles-person":n.rolesPersons,"roles-organization":n.rolesOrganizations,"current-persons":n.persons,"current-organizations":n.organizations,manage:n.credentials.avenants.edit,onUpdate:i.handlerUpdateAvenants},null,8,["avenants","roles-person","roles-organization","current-persons","current-organizations","manage","onUpdate"])])):d("",!0),n.credentials.documents.read?(l(),o("section",sc,[nc,g(K,{onDebug:i.handlerDebug,onUpdated:i.handlerUpdateDocuments,"debug-enabled":r.debugEnabled,standalone:!0,"sa-tabs":n.documents.tabs,"sa-types":n.documents.typesDocuments,"sa-generated-documents":n.documents.generatedDocuments,"sa-computed-documents":n.documents.computedDocuments,"sa-process-datas":n.documents.processDatas,"sa-credentials":n.credentials.documents,url:n.documents.url,"url-upload-new-doc":n.documents.url_upload_new_doc,"url-sign-document":n.documents.url_sign_document},null,8,["onDebug","onUpdated","debug-enabled","sa-tabs","sa-types","sa-generated-documents","sa-computed-documents","sa-process-datas","sa-credentials","url","url-upload-new-doc","url-sign-document"])])):d("",!0),n.credentials.notes.read?(l(),o("section",lc,[oc,g(H,{url:n.notes_url,showallowed:n.credentials.notes.read,manageuserallowed:n.credentials.notes.edit,manageadminallowed:n.credentials.notes.manage,items:n.notes,onUpdate:i.handlerUpdateNotes},null,8,["url","showallowed","manageuserallowed","manageadminallowed","items","onUpdate"])])):d("",!0),n.credentials.timesheets.read?(l(),o("section",ic,[ac,n.timesheets.enabled?(l(),o("div",dc,[e("section",cc,[uc,e("div",hc,[e("a",{href:n.timesheets.url,class:"btn btn-primary"},[pc,a(" Informations générales et lots de travails ")],8,mc),e("a",{href:n.timesheets.urlSynthesis,class:"btn btn-default"},[fc,a(" Résumé et documents ")],8,_c)])]),n.workpackages?(l(),o("section",vc,[e("div",gc,[yc,e("div",kc,[n.timesheets.declarers.length?(l(),o("div",bc,[(l(!0),o(b,null,w(n.timesheetsDeclarers,p=>(l(),o("a",{href:p.url_details,class:P(["btn",p.hasDeclaration?"btn-primary":"btn-default"])},[g(u,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"]),p.hasDeclaration==!1?(l(),o("small",wc," (Aucune déclaration) ")):d("",!0)],10,Dc))),256))])):(l(),o("div",Cc,[a(" Pour ajouter des déclarants, créez des "),Pc,a(" puis identifier les déclarants parmis les membres ")]))])]),e("div",Ac,[e("h3",Uc,[Sc,e("nav",null,[e("a",{href:n.timesheets.url+"#validators",class:"btn btn-primary btn-xs"},[Ec,a(" Désigner des validateurs ")],8,Mc)])]),e("div",Vc,[e("div",xc,[Nc,n.timesheets.validators.prj.length===0?(l(),o("div",jc," Aucun validateur pour cette étape ")):d("",!0),e("div",null,[(l(!0),o(b,null,w(n.timesheetsValidators.prj,p=>(l(),o("span",Oc,[g(u,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"])]))),256))])]),e("div",zc,[Rc,n.timesheets.validators.sci.length===0?(l(),o("div",Ic," Aucun validateur pour cette étape ")):d("",!0),(l(!0),o(b,null,w(n.timesheetsValidators.sci,p=>(l(),o("span",Fc,[g(u,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"])]))),256))]),e("div",Wc,[Tc,n.timesheets.validators.adm.length===0?(l(),o("div",qc," Aucun validateur pour cette étape ")):d("",!0),(l(!0),o(b,null,w(n.timesheetsValidators.adm,p=>(l(),o("span",Lc,[g(u,{person:p,"allow-tooltip":n.credentials.persons.show},null,8,["person","allow-tooltip"])]))),256))])])]),e("div",Jc,[Hc,a(" "+c(t.personWP)+" ",1),e("div",Bc,[g(_,{"debug-enabled":r.debugEnabled,"allow-tooltip":n.credentials.persons.show,editable:n.credentials.workpackages.edit,workpackages:n.workpackages,url:n.workpackagesUrl,persons:i.personsWP,onUpdate:i.handlerUpdateWorkpackages},null,8,["debug-enabled","allow-tooltip","editable","workpackages","url","persons","onUpdate"])])])])):d("",!0)])):(l(),o("div",rc,[a(" Feuilles de temps non-disponible pour cette activité : "),e("strong",null,c(n.timesheets.informations),1)]))])):d("",!0)]),e("aside",Yc,[n.credentials.milestones.read?(l(),o("section",Gc,[Kc,g(O,{url:n.milestonesUrl,manage:n.credentials.milestones.edit,progression:n.credentials.milestones.progression,payments:n.payments,items:n.milestones,types:n.milestonesTypes,onUpdate:i.handlerUpdateMilestones},null,8,["url","manage","progression","payments","items","types","onUpdate"]),n.milestonesUrlNotifications?(l(),o("a",{key:0,href:n.milestonesUrlNotifications,class:"btn btn-primary"},[Qc,a(" Voir les notifications planifiées ")],8,Xc)):d("",!0)])):d("",!0),n.credentials.payments.read?(l(),o("section",Zc,[$c,g(oe,{url:n.paymentsUrl,manage:n.credentials.payments.edit,amount:n.budget.amount,payments:n.payments,currencies:n.currencies,onDebug:i.handlerDebugShow,onUpdate:i.handlerUpdatePayments},null,8,["url","manage","amount","payments","currencies","onDebug","onUpdate"])])):d("",!0),n.credentials.spents.read?(l(),o("section",eu,[tu,n.spents.enabled?(l(),o("div",nu,[g(ie,{standalone:!1,datas:n.spents},null,8,["datas"]),e("nav",lu,[n.credentials.spents.details?(l(),o("a",{key:0,href:n.spents.url_details,class:"btn btn-primary btn"},[iu,a(" Détails des dépenses")],8,ou)):d("",!0),n.credentials.spents.previsionnel?(l(),o("a",{key:1,href:t.spentsUrlPrevisionnel,class:"btn btn-primary btn"},[ru,a(" Dépenses prévisionnelles (beta)")],8,au)):d("",!0)])])):(l(),o("div",su," Dépenses indisponibles : "+c(n.spents.enabled_reason),1))])):d("",!0),e("section",du,[cu,e("a",{href:n.core.urls.pcru,class:"btn btn-primary btn-xs"}," Accès aux informations PCRU ",8,uu)])])]),n.credentials.administration.read?(l(),o("div",hu,[e("div",mu,[e("div",pu,[_u,g(ae,{url:n.administration.url_logs},null,8,["url"])])])])):d("",!0)])):(l(),o("div",fu," Données inaccessibles "))],64)}const gu=E(ba,[["render",vu],["__scopeId","data-v-8de60033"]]);let Z=document.querySelector("#activity");const le=me(gu,{url:Z.dataset.url,"debug-enabled":Z.dataset.debugEnabled,manage:Z.dataset.manage});le.config.globalProperties.$filters={timeAgo(t){return Q.timeAgo(t)},date(t){return Q.date(t)},dateFull(t){return Q.dateFull(t)},filesize(t){return pe.filesize(t)},money(t){return _e.money(t)},log(t){return Ce.log(t)}};le.mount("#activity");
diff --git a/public/js/oscar/vite/dist/assets/activitydocuments-3139e448.js b/public/js/oscar/vite/dist/assets/activitydocuments-596bd3c4.js
similarity index 90%
rename from public/js/oscar/vite/dist/assets/activitydocuments-3139e448.js
rename to public/js/oscar/vite/dist/assets/activitydocuments-596bd3c4.js
index 6d2a3ca6755e2c56833915a0b6229f98c1af7ef7..8b4bec9f41c5508d097704d7b59a73a6db407f43 100644
--- a/public/js/oscar/vite/dist/assets/activitydocuments-3139e448.js
+++ b/public/js/oscar/vite/dist/assets/activitydocuments-596bd3c4.js
@@ -1 +1 @@
-import{y as i}from"../vendor.js";import{m as r}from"../vendor2.js";import{f as m}from"../vendor3.js";import{A as a}from"../vendor10.js";import"../vendor6.js";import"../vendor7.js";import"../vendor20.js";import"../vendor14.js";import"../vendor18.js";import"../vendor16.js";import"../vendor17.js";let e=document.querySelector("#activitydocuments");const o=i(a,{url:e.dataset.url,urlUploadNewDoc:e.dataset.urlUploadNewDoc,urlSignDocument:e.dataset.urlSignDocument,manage:e.dataset.manage});o.config.globalProperties.$filters={timeAgo(t){return r.timeAgo(t)},date(t){return r.date(t)},dateFull(t){return r.dateFull(t)},filesize(t){return m.filesize(t)}};o.mount("#activitydocuments");
+import{A as i}from"../vendor.js";import{m as r}from"../vendor2.js";import{f as m}from"../vendor3.js";import{A as a}from"../vendor10.js";import"../vendor6.js";import"../vendor7.js";import"../vendor20.js";import"../vendor14.js";import"../vendor18.js";import"../vendor16.js";import"../vendor17.js";let e=document.querySelector("#activitydocuments");const o=i(a,{url:e.dataset.url,urlUploadNewDoc:e.dataset.urlUploadNewDoc,urlSignDocument:e.dataset.urlSignDocument,manage:e.dataset.manage});o.config.globalProperties.$filters={timeAgo(t){return r.timeAgo(t)},date(t){return r.date(t)},dateFull(t){return r.dateFull(t)},filesize(t){return m.filesize(t)}};o.mount("#activitydocuments");
diff --git a/public/js/oscar/vite/dist/assets/activitymotscles-2e3e437b.js b/public/js/oscar/vite/dist/assets/activitymotscles-2e3e437b.js
deleted file mode 100644
index 7ae805df84cf65e4d4386de2cfe9b18cf0c1db5a..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/activitymotscles-2e3e437b.js
+++ /dev/null
@@ -1 +0,0 @@
-import{p as y,r as C,o as n,c as i,b,d as l,a as p,g as u,F as c,j as h,w as x,v as w,h as k,t as m,n as L,y as M}from"../vendor.js";import{A as I}from"../vendor14.js";import{L as D}from"../vendor17.js";import{_ as E}from"../vendor7.js";const N={components:{Loader:D},props:{url:{default:null},activityid:{default:null},motsclesselectionnes:{default:[]}},computed:{aucunMotCleNeCorrespond(){return this.userInput&&this.touslesmotscles.filter(t=>t.label.toLocaleLowerCase().includes(this.userInput.trim().toLocaleLowerCase())).length==0}},data(){return{touslesmotscles:[],error:null,loading:null,affichertouslesmotscles:!1,userInput:""}},methods:{motCléExiste(){for(const t of this.touslesmotscles)if(t.label.toLocaleLowerCase()==this.userInput.toLocaleLowerCase())return!0;return!1},créerMotClé(t){t.preventDefault(),this.affichertouslesmotscles=!1,this.loading="Création du mot clé",y.post(this.url+"?activity_id="+this.activityid,{action:"create",label:this.userInput.trim()}).then(e=>{let a=e.data;a.selected=!0,this.touslesmotscles.push(a),this.userInput=""},e=>{this.handleError(e)}).finally(()=>{this.loading=null})},onKeyDown(t){if(t.key==="Enter"){t.preventDefault();return}if(t.key==="Tab"){this.affichertouslesmotscles=!1;return}},clickInput(){this.affichertouslesmotscles=!0},onMouseDown(t){!t.target.classList.contains("undetouslesmotscles")&&!t.target.classList.contains("inputNouveauMotCle")&&!t.target.classList.contains("listeDeTousLesMotsCles")&&(this.affichertouslesmotscles=!1)},fetch(){this.loading="Chargement des mots clés",y.get(this.url+"?activity_id="+this.activityid).then(t=>{this.touslesmotscles=t.data.motscles;const e=JSON.parse(this.motsclesselectionnes);for(let a of this.touslesmotscles)e.includes(a.id)&&(a.selected=!0);this.loading=null},t=>{this.handleError(t),this.loading=null})},handleError(t){if(!t.response.data){this.error=t;return}if(t.response.headers.get("content-type").includes("text/html")){var e=document.createElement("html");e.innerHTML=t.response.data;const a=e.querySelector('[id="contenu-principal"]');if(a){this.error=a.innerHTML;return}const d=t.response.headers.get("content-length");if(d&&typeof d=="string"&&!isNaN(d)&&Number(d)<1e3){this.error=t.response.data;return}}this.error=I.manageErrorResponse(t)}},mounted(){document.addEventListener("mousedown",this.onMouseDown),this.fetch()},unmounted(){document.removeEventListener("mousedown",this.onMouseDown)}},T={style:{position:"relative"}},z={key:0,class:"overlay",style:{"z-index":"101"}},A={class:"overlay-content",style:{"max-width":"50%"}},H={class:"alert-danger alert"},S=["innerHTML"],V={style:{display:"none"},name:"motscles[]",multiple:"",tabindex:"-1","aria-hidden":"true"},F=["value"],K={style:{display:"flex"}},j={style:{width:"50%","min-width":"50%"}},B={style:{display:"flex","background-color":"white",border:"1px solid #aaa","border-radius":"4px","min-height":"34px"}},q={style:{display:"flex","flex-wrap":"wrap",margin:"0","padding-left":"5px","padding-right":"5px","padding-bottom":"5px",width:"100%","align-items":"center"}},J={key:0,class:"selectedmotcle"},O=["onClick"],P={style:{"margin-top":"5px","flex-grow":"1",overflow:"auto"}},R={key:0,style:{"background-color":"white",border:"1px solid #aaa","border-radius":"4px","border-top-left-radius":"0","border-top-right-radius":"0",position:"absolute","z-index":"1051",width:"50%"}},U={class:"listeDeTousLesMotsCles"},X=["onClick"],G={key:0,style:{padding:"6px"}},Q={style:{"max-width":"50%",overflow:"auto","margin-left":"10px"}},W=["disabled"],Y={key:0},Z={key:1,style:{"white-space":"preserve-spaces"}},$={key:0,style:{background:"#efefef",color:"#666666",padding:"0.5em 1em","margin-top":"0.5em","font-size":"0.9em","border-radius":"0.5em","font-weight":"100"}},ee={key:1,style:{background:"#efefef",color:"#666666",padding:"0.5em 1em","margin-top":"0.5em","font-size":"0.9em","border-radius":"0.5em","font-weight":"100"}};function te(t,e,a,d,o,r){const g=C("Loader");return n(),i("section",T,[b(g,{visible:o.loading!=null,text:o.loading},null,8,["visible","text"]),o.error?(n(),i("div",z,[l("div",A,[l("h2",null,[e[7]||(e[7]=p(" Erreur mots clés ")),l("span",{class:"overlay-closer",onClick:e[0]||(e[0]=s=>o.error=null)},"X")]),l("div",H,[e[8]||(e[8]=l("i",{class:"icon-attention-1"},null,-1)),l("div",{innerHTML:o.error},null,8,S)]),l("button",{class:"btn btn-default",onClick:e[1]||(e[1]=s=>o.error=null)},e[9]||(e[9]=[l("i",{class:"icon-cancel-outline"},null,-1),p(" Fermer ")]))])])):u("",!0),e[11]||(e[11]=l("label",null,"Mots clés",-1)),l("select",V,[(n(!0),i(c,null,h(o.touslesmotscles,s=>(n(),i(c,null,[s.selected?(n(),i("option",{key:0,value:s.id,selected:""},m(s.label),9,F)):u("",!0)],64))),256))]),l("div",K,[l("div",j,[l("span",B,[l("ul",q,[(n(!0),i(c,null,h(o.touslesmotscles,s=>(n(),i(c,null,[s.selected?(n(),i("li",J,[l("span",{onClick:_=>s.selected=!1},"×",8,O),p(m(s.label),1)])):u("",!0)],64))),256)),l("li",P,[x(l("input",{onFocusin:e[2]||(e[2]=(...s)=>r.clickInput&&r.clickInput(...s)),onClick:e[3]||(e[3]=(...s)=>r.clickInput&&r.clickInput(...s)),onKeydown:e[4]||(e[4]=(...s)=>r.onKeyDown&&r.onKeyDown(...s)),"onUpdate:modelValue":e[5]||(e[5]=s=>o.userInput=s),size:"1",class:"inputNouveauMotCle"},null,544),[[w,o.userInput]])])])]),o.affichertouslesmotscles?(n(),i("span",R,[l("ul",U,[(n(!0),i(c,null,h(o.touslesmotscles,s=>(n(),i(c,null,[s.label.toLocaleLowerCase().includes(o.userInput.toLocaleLowerCase())?(n(),i("li",{key:0,class:L(["undetouslesmotscles",{selected:s.selected}]),onClick:_=>{s.selected=!s.selected,o.affichertouslesmotscles=!1,o.userInput=""}},m(s.label),11,X)):u("",!0)],64))),256)),r.aucunMotCleNeCorrespond?(n(),i("li",G,"Aucun mot clé existant correspondant")):u("",!0)])])):u("",!0)]),l("div",Q,[l("button",{class:"bouton",onClick:e[6]||(e[6]=k((...s)=>r.créerMotClé&&r.créerMotClé(...s),["stop"])),disabled:!o.userInput.trim()||r.motCléExiste()},[e[10]||(e[10]=p("Créer le nouveau mot clé : ")),o.userInput.trim()?u("",!0):(n(),i("span",Y,"∅")),o.userInput.trim()?(n(),i("span",Z,m(o.userInput.trim()),1)):u("",!0)],8,W),o.userInput.trim()?u("",!0):(n(),i("div",$,`ℹ️ Pour créer un nouveau mot clé, veuillez d'abord saisir son libellé dans le champ "Mots clés"`)),o.userInput.trim()&&r.motCléExiste()?(n(),i("div",ee,"ℹ️ Le mot clé existe déjà")):u("",!0)])])])}const se=E(N,[["render",te],["__scopeId","data-v-926a5c63"]]);let v="#activity-mots-cles",f=document.querySelector(v);const oe=M(se,{url:f.dataset.url,activityid:f.dataset.activityid,motsclesselectionnes:f.dataset.motsclesselectionnes});oe.mount(v);
diff --git a/public/js/oscar/vite/dist/assets/activitymotscles-7b1fc39f.js b/public/js/oscar/vite/dist/assets/activitymotscles-7b1fc39f.js
new file mode 100644
index 0000000000000000000000000000000000000000..61258674f8cb9a0662ed8ce84f42d5c834052211
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/activitymotscles-7b1fc39f.js
@@ -0,0 +1 @@
+import{s as y,r as b,o as n,c as i,b as x,d as l,a as p,g as u,F as a,k as h,w,v as k,h as L,t as m,n as M,p as I,i as D,A as E}from"../vendor.js";import{A as N}from"../vendor14.js";import{L as T}from"../vendor17.js";import{_ as S}from"../vendor7.js";const z={components:{Loader:T},props:{url:{default:null},activityid:{default:null},motsclesselectionnes:{default:[]}},computed:{aucunMotCleNeCorrespond(){return this.userInput&&this.touslesmotscles.filter(e=>e.label.toLocaleLowerCase().includes(this.userInput.trim().toLocaleLowerCase())).length==0}},data(){return{touslesmotscles:[],error:null,loading:null,affichertouslesmotscles:!1,userInput:""}},methods:{motCléExiste(){for(const e of this.touslesmotscles)if(e.label.toLocaleLowerCase()==this.userInput.toLocaleLowerCase())return!0;return!1},créerMotClé(e){e.preventDefault(),this.affichertouslesmotscles=!1,this.loading="Création du mot clé",y.post(this.url+"?activity_id="+this.activityid,{action:"create",label:this.userInput.trim()}).then(s=>{let c=s.data;c.selected=!0,this.touslesmotscles.push(c),this.userInput=""},s=>{this.handleError(s)}).finally(()=>{this.loading=null})},onKeyDown(e){if(e.key==="Enter"){e.preventDefault();return}if(e.key==="Tab"){this.affichertouslesmotscles=!1;return}},clickInput(){this.affichertouslesmotscles=!0},onMouseDown(e){!e.target.classList.contains("undetouslesmotscles")&&!e.target.classList.contains("inputNouveauMotCle")&&!e.target.classList.contains("listeDeTousLesMotsCles")&&(this.affichertouslesmotscles=!1)},fetch(){this.loading="Chargement des mots clés",y.get(this.url+"?activity_id="+this.activityid).then(e=>{this.touslesmotscles=e.data.motscles;const s=JSON.parse(this.motsclesselectionnes);for(let c of this.touslesmotscles)s.includes(c.id)&&(c.selected=!0);this.loading=null},e=>{this.handleError(e),this.loading=null})},handleError(e){if(!e.response.data){this.error=e;return}if(e.response.headers.get("content-type").includes("text/html")){var s=document.createElement("html");s.innerHTML=e.response.data;const c=s.querySelector('[id="contenu-principal"]');if(c){this.error=c.innerHTML;return}const d=e.response.headers.get("content-length");if(d&&typeof d=="string"&&!isNaN(d)&&Number(d)<1e3){this.error=e.response.data;return}}this.error=N.manageErrorResponse(e)}},mounted(){document.addEventListener("mousedown",this.onMouseDown),this.fetch()},unmounted(){document.removeEventListener("mousedown",this.onMouseDown)}},_=e=>(I("data-v-926a5c63"),e=e(),D(),e),A={style:{position:"relative"}},H={key:0,class:"overlay",style:{"z-index":"101"}},V={class:"overlay-content",style:{"max-width":"50%"}},F={class:"alert-danger alert"},K=_(()=>l("i",{class:"icon-attention-1"},null,-1)),B=["innerHTML"],j=_(()=>l("i",{class:"icon-cancel-outline"},null,-1)),q=_(()=>l("label",null,"Mots clés",-1)),J={style:{display:"none"},name:"motscles[]",multiple:"",tabindex:"-1","aria-hidden":"true"},O=["value"],P={style:{display:"flex"}},R={style:{width:"50%","min-width":"50%"}},U={style:{display:"flex","background-color":"white",border:"1px solid #aaa","border-radius":"4px","min-height":"34px"}},X={style:{display:"flex","flex-wrap":"wrap",margin:"0","padding-left":"5px","padding-right":"5px","padding-bottom":"5px",width:"100%","align-items":"center"}},G={key:0,class:"selectedmotcle"},Q=["onClick"],W={style:{"margin-top":"5px","flex-grow":"1",overflow:"auto"}},Y={key:0,style:{"background-color":"white",border:"1px solid #aaa","border-radius":"4px","border-top-left-radius":"0","border-top-right-radius":"0",position:"absolute","z-index":"1051",width:"50%"}},Z={class:"listeDeTousLesMotsCles"},$=["onClick"],ee={key:0,style:{padding:"6px"}},te={style:{"max-width":"50%",overflow:"auto","margin-left":"10px"}},se=["disabled"],oe={key:0},le={key:1,style:{"white-space":"preserve-spaces"}},ne={key:0,style:{background:"#efefef",color:"#666666",padding:"0.5em 1em","margin-top":"0.5em","font-size":"0.9em","border-radius":"0.5em","font-weight":"100"}},ie={key:1,style:{background:"#efefef",color:"#666666",padding:"0.5em 1em","margin-top":"0.5em","font-size":"0.9em","border-radius":"0.5em","font-weight":"100"}};function re(e,s,c,d,o,r){const g=b("Loader");return n(),i("section",A,[x(g,{visible:o.loading!=null,text:o.loading},null,8,["visible","text"]),o.error?(n(),i("div",H,[l("div",V,[l("h2",null,[p(" Erreur mots clés "),l("span",{class:"overlay-closer",onClick:s[0]||(s[0]=t=>o.error=null)},"X")]),l("div",F,[K,l("div",{innerHTML:o.error},null,8,B)]),l("button",{class:"btn btn-default",onClick:s[1]||(s[1]=t=>o.error=null)},[j,p(" Fermer ")])])])):u("",!0),q,l("select",J,[(n(!0),i(a,null,h(o.touslesmotscles,t=>(n(),i(a,null,[t.selected?(n(),i("option",{key:0,value:t.id,selected:""},m(t.label),9,O)):u("",!0)],64))),256))]),l("div",P,[l("div",R,[l("span",U,[l("ul",X,[(n(!0),i(a,null,h(o.touslesmotscles,t=>(n(),i(a,null,[t.selected?(n(),i("li",G,[l("span",{onClick:C=>t.selected=!1},"×",8,Q),p(m(t.label),1)])):u("",!0)],64))),256)),l("li",W,[w(l("input",{onFocusin:s[2]||(s[2]=(...t)=>r.clickInput&&r.clickInput(...t)),onClick:s[3]||(s[3]=(...t)=>r.clickInput&&r.clickInput(...t)),onKeydown:s[4]||(s[4]=(...t)=>r.onKeyDown&&r.onKeyDown(...t)),"onUpdate:modelValue":s[5]||(s[5]=t=>o.userInput=t),size:"1",class:"inputNouveauMotCle"},null,544),[[k,o.userInput]])])])]),o.affichertouslesmotscles?(n(),i("span",Y,[l("ul",Z,[(n(!0),i(a,null,h(o.touslesmotscles,t=>(n(),i(a,null,[t.label.toLocaleLowerCase().includes(o.userInput.toLocaleLowerCase())?(n(),i("li",{key:0,class:M(["undetouslesmotscles",{selected:t.selected}]),onClick:C=>{t.selected=!t.selected,o.affichertouslesmotscles=!1,o.userInput=""}},m(t.label),11,$)):u("",!0)],64))),256)),r.aucunMotCleNeCorrespond?(n(),i("li",ee,"Aucun mot clé existant correspondant")):u("",!0)])])):u("",!0)]),l("div",te,[l("button",{class:"bouton",onClick:s[6]||(s[6]=L((...t)=>r.créerMotClé&&r.créerMotClé(...t),["stop"])),disabled:!o.userInput.trim()||r.motCléExiste()},[p("Créer le nouveau mot clé : "),o.userInput.trim()?u("",!0):(n(),i("span",oe,"∅")),o.userInput.trim()?(n(),i("span",le,m(o.userInput.trim()),1)):u("",!0)],8,se),o.userInput.trim()?u("",!0):(n(),i("div",ne,`ℹ️ Pour créer un nouveau mot clé, veuillez d'abord saisir son libellé dans le champ "Mots clés"`)),o.userInput.trim()&&r.motCléExiste()?(n(),i("div",ie,"ℹ️ Le mot clé existe déjà")):u("",!0)])])])}const ue=S(z,[["render",re],["__scopeId","data-v-926a5c63"]]);let v="#activity-mots-cles",f=document.querySelector(v);const ce=E(ue,{url:f.dataset.url,activityid:f.dataset.activityid,motsclesselectionnes:f.dataset.motsclesselectionnes});ce.mount(v);
diff --git a/public/js/oscar/vite/dist/assets/activitymotsclesadmin-696ec89a.js b/public/js/oscar/vite/dist/assets/activitymotsclesadmin-696ec89a.js
deleted file mode 100644
index 0893608677ba054a1a9e8780bd43cad7324e6ad3..0000000000000000000000000000000000000000
--- a/public/js/oscar/vite/dist/assets/activitymotsclesadmin-696ec89a.js
+++ /dev/null
@@ -1 +0,0 @@
-import{o as n,c as i,d as t,a as d,g as c,F as v,j as C,t as r,w as g,v as M,n as D,k as L,p as y,r as _,z as E,b as h,h as S,y as A}from"../vendor.js";import{A as I}from"../vendor14.js";import{L as z}from"../vendor17.js";import{_ as k}from"../vendor7.js";const F={props:{touslesmotscles:{default:[]}},computed:{aucunMotCleNeCorrespond(){return this.userInput&&this.touslesmotscles.filter(o=>o.label.toLocaleLowerCase().includes(this.userInput.trim().toLocaleLowerCase())).length==0}},data(){return{affichertouslesmotscles:!1,userInput:"",idMotCleCible:null,motsClesSelectionnes:new Set}},methods:{motCleParId(o){for(const e of this.touslesmotscles)if(e.id==o)return e;return null},onKeyDown(o){if(o.key==="Enter"){o.preventDefault();return}if(o.key==="Tab"){this.affichertouslesmotscles=!1;return}},clickInput(){this.affichertouslesmotscles=!0},onMouseDown(o){!o.target.classList.contains("undetouslesmotscles")&&!o.target.classList.contains("inputNouveauMotCle")&&!o.target.classList.contains("listeDeTousLesMotsCles")&&!o.target.classList.contains("labelDuMotCle")&&(this.affichertouslesmotscles=!1)}},mounted(){document.addEventListener("mousedown",this.onMouseDown)},unmounted(){document.removeEventListener("mousedown",this.onMouseDown)}},N={key:0,class:"row"},T={class:"row",style:{"margin-bottom":"2em"}},V={class:"col-md-12",style:{display:"flex","flex-direction":"column"}},j={style:{display:"flex","background-color":"white",border:"1px solid #aaa","border-radius":"4px","min-height":"34px"}},q={style:{display:"flex","flex-wrap":"wrap",margin:"0","padding-left":"5px","padding-right":"5px","padding-bottom":"5px",width:"100%","align-items":"center"}},H={key:0,class:"selectedmotcle"},K=["onClick"],P={style:{"margin-top":"5px","flex-grow":"1",overflow:"auto"}},X={key:0,style:{"background-color":"white",border:"1px solid #aaa","border-radius":"4px","border-top-left-radius":"0","border-top-right-radius":"0","z-index":"1051"}},B={class:"listeDeTousLesMotsCles"},U=["onClick"],R={class:"labelDuMotCle"},G={key:0,style:{padding:"6px"}},J={key:1,class:"row"},O={class:"row"},Q={class:"col-md-12",style:{display:"flex","flex-direction":"column"}},W=["value"],Y={key:2,class:"row"},Z={style:{"background-color":"#dff0d8","border-color":"#d6e9c6",color:"#3c763d",margin:"1em",padding:"1em"}},$={style:{"line-break":"anywhere"}},ee={key:0},te={style:{"line-break":"anywhere"}},se={key:0},le={style:{"line-break":"anywhere"}},oe={class:"row"},ne={class:"col-md-12"},ie={class:"buttons-bar"},re=["disabled"];function de(o,e,m,p,s,a){return n(),i("section",null,[t("h2",null,[e[8]||(e[8]=t("small",null,[t("i",{class:"icon-doc"}),t("span",null,"Fusionner des mots clés")],-1)),t("span",{class:"overlay-closer",onClick:e[0]||(e[0]=l=>o.$emit("close"))},"X")]),s.motsClesSelectionnes.size<2?(n(),i("div",N,e[9]||(e[9]=[t("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[t("span",{style:{"font-size":"xx-large"}},"⚠"),d(" Veuillez sélectionner au moins deux mots clés à fusionner ")],-1)]))):c("",!0),t("div",T,[t("div",V,[e[10]||(e[10]=t("label",{for:"nouveauMotCle"},"Sélectionnez les mots clés à fusionner",-1)),t("div",null,[t("span",j,[t("ul",q,[(n(!0),i(v,null,C(m.touslesmotscles,l=>(n(),i(v,null,[s.motsClesSelectionnes.has(l.id)?(n(),i("li",H,[t("span",{onClick:b=>s.motsClesSelectionnes.delete(l.id)},"×",8,K),t("strong",null,r(l.label),1),d(" (id : "+r(l.id)+", "+r(l.activity_count)+" activité"+r(l.activity_count>1?"s":"")+") ",1)])):c("",!0)],64))),256)),t("li",P,[g(t("input",{id:"nouveauMotCle",onFocusin:e[1]||(e[1]=(...l)=>a.clickInput&&a.clickInput(...l)),onClick:e[2]||(e[2]=(...l)=>a.clickInput&&a.clickInput(...l)),onKeydown:e[3]||(e[3]=(...l)=>a.onKeyDown&&a.onKeyDown(...l)),"onUpdate:modelValue":e[4]||(e[4]=l=>s.userInput=l),size:"1",class:"inputNouveauMotCle"},null,544),[[M,s.userInput]])])])]),s.affichertouslesmotscles?(n(),i("div",X,[t("ul",B,[(n(!0),i(v,null,C(m.touslesmotscles,l=>(n(),i(v,null,[l.label.toLocaleLowerCase().includes(s.userInput.toLocaleLowerCase())?(n(),i("li",{key:0,class:D(["undetouslesmotscles",{selected:s.motsClesSelectionnes.has(l.id)}]),onClick:b=>{s.motsClesSelectionnes.has(l.id)?s.motsClesSelectionnes.delete(l.id):s.motsClesSelectionnes.add(l.id),s.affichertouslesmotscles=!1,s.userInput=""}},[t("strong",R,r(l.label),1),d(" (id : "+r(l.id)+", "+r(l.activity_count)+" activité"+r(l.activity_count>1?"s":"")+")",1)],10,U)):c("",!0)],64))),256)),a.aucunMotCleNeCorrespond?(n(),i("li",G,"Aucun mot clé existant correspondant")):c("",!0)])])):c("",!0)])])]),s.idMotCleCible?c("",!0):(n(),i("div",J,e[11]||(e[11]=[t("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[t("span",{style:{"font-size":"xx-large"}},"⚠"),d(" Veuillez sélectionner le nom du mot clé qui remplacera tous les autres après la fusion ")],-1)]))),t("div",O,[t("div",Q,[e[13]||(e[13]=t("label",{for:"motCleCible"},"Sélectionnez le nom du mot clé qui remplacera tous les autres après la fusion",-1)),g(t("select",{id:"motCleCible","onUpdate:modelValue":e[5]||(e[5]=l=>s.idMotCleCible=l)},[e[12]||(e[12]=t("option",{value:""},null,-1)),(n(!0),i(v,null,C(m.touslesmotscles,l=>(n(),i(v,null,[s.motsClesSelectionnes.has(l.id)?(n(),i("option",{key:0,value:l.id},[t("strong",null,r(l.label),1),d(" (id : "+r(l.id)+", "+r(l.activity_count)+" activité"+r(l.activity_count>1?"s":"")+")",1)],8,W)):c("",!0)],64))),256))],512),[[L,s.idMotCleCible]])])]),s.motsClesSelectionnes.size>=2&&s.idMotCleCible?(n(),i("div",Y,[t("div",Z,[e[14]||(e[14]=d(" En cliquant sur fusionner, le mot clé ")),t("strong",$,r(a.motCleParId(s.idMotCleCible).label),1),d(" (id: "+r(s.idMotCleCible)+", "+r(a.motCleParId(s.idMotCleCible).activity_count)+" activité"+r(a.motCleParId(s.idMotCleCible).activity_count>1?"s":"")+") va être ajouté : ",1),t("ul",null,[(n(!0),i(v,null,C(m.touslesmotscles,l=>(n(),i(v,null,[s.motsClesSelectionnes.has(l.id)&&l.id!=s.idMotCleCible?(n(),i("li",ee,[d("aux "+r(l.activity_count)+" activité"+r(l.activity_count>1?"s":"")+" ayant le mot clé ",1),t("strong",te,r(l.label),1),d(" (id : "+r(l.id)+")",1)])):c("",!0)],64))),256))]),e[15]||(e[15]=d(" Ensuite, ces mots clés seront supprimés : ")),(n(!0),i(v,null,C(m.touslesmotscles,l=>(n(),i(v,null,[s.motsClesSelectionnes.has(l.id)&&l.id!=s.idMotCleCible?(n(),i("span",se,[t("strong",le," "+r(l.label),1),d(" (id : "+r(l.id)+")",1)])):c("",!0)],64))),256))])])):c("",!0),t("div",oe,[t("div",ne,[t("nav",ie,[t("button",{class:"btn btn-danger",style:{"margin-right":"1em"},onClick:e[6]||(e[6]=l=>o.$emit("close"))},e[16]||(e[16]=[t("i",{class:"icon-cancel-alt"},null,-1),d(" Annuler ")])),t("button",{class:"btn btn-success",disabled:s.motsClesSelectionnes.size<2||!s.idMotCleCible,onClick:e[7]||(e[7]=l=>o.$emit("fusion",Array.from(s.motsClesSelectionnes),s.idMotCleCible))},e[17]||(e[17]=[t("i",{class:"icon-valid"},null,-1),d(" Fusionner ")]),8,re)])])])])}const ue=k(F,[["render",de],["__scopeId","data-v-41814f90"]]);const ce={directives:{focus:o=>o.focus()},components:{Loader:z,ActivityMotsClesAdminFusion:ue},props:{url:{default:null}},computed:{motCleExisteDeja(){return this.editedMotCle&&this.editedMotCle.label&&this.touslesmotscles.filter(o=>o.label.toLocaleLowerCase()==this.editedMotCle.label.trim().toLocaleLowerCase()).length>0}},data(){return{touslesmotscles:[],error:null,loading:null,deleteData:null,editedMotCle:null,fusionEnCours:!1}},methods:{fusionner(o,e){this.fusionEnCours=!1,this.loading="Fusion des mots clés",y.post(this.url,{action:"fusion",idsToMerge:o,targetId:e}).then(()=>{this.fetch()},m=>{this.handleError(m)}).finally(()=>{this.loading=null})},applyEdit(){let o="create";this.editedMotCle.id&&(o="update"),this.loading=o=="create"?"Création du mot clé":"Modification du mot clé",y.post(this.url,{action:o,id:this.editedMotCle.id,label:this.editedMotCle.label.trim()}).then(()=>{this.fetch()},e=>{this.handleError(e)}).finally(()=>{this.loading=null,this.editedMotCle=null})},deleteMotCle(){this.loading="Suppression du mot clé",y.post(this.url,{action:"delete",id:this.deleteData.id}).then(()=>{this.touslesmotscles.splice(this.touslesmotscles.findIndex(o=>o.id===this.deleteData.id),1)},o=>{this.handleError(o)}).finally(()=>{this.loading=null,this.deleteData=null})},fetch(){this.loading="Chargement des mots clés",y.get(this.url+"?include_activity_count=true").then(o=>{this.touslesmotscles=o.data.motscles,this.loading=null},o=>{this.handleError(o),this.loading=null})},handleError(o){if(!o.response.data){this.error=o;return}if(o.response.headers.get("content-type").includes("text/html")){var e=document.createElement("html");e.innerHTML=o.response.data;const m=e.querySelector('[id="contenu-principal"]');if(m){this.error=m.innerHTML;return}const p=o.response.headers.get("content-length");if(p&&typeof p=="string"&&!isNaN(p)&&Number(p)<1e3){this.error=o.response.data;return}}this.error=I.manageErrorResponse(o)}},mounted(){this.fetch()}},ae={key:0,class:"overlay",style:{"z-index":"101"}},me={class:"overlay-content",style:{"max-width":"50%"}},ve={class:"alert-danger alert"},pe=["innerHTML"],Ce={style:{display:"flex","flex-direction":"row-reverse"}},ye={class:"title"},be={style:{display:"inline","line-break":"anywhere"}},fe=["onClick"],ge=["onClick"],_e={style:{"padding-left":"1em","padding-bottom":"0.3em"}},he={key:1,class:"overlay"},Me={class:"overlay-content"},ke={style:{"padding-right":"1em"}},xe={style:{"line-break":"anywhere"}},we={class:"alert-danger alert"},De={style:{"line-break":"anywhere"}},Le={key:0},Ee={key:1},Se={class:"row"},Ae={class:"col-md-12"},Ie={class:"buttons-bar"},ze={key:2,class:"overlay"},Fe={class:"overlay-content",style:{display:"flex","flex-direction":"column"}},Ne={key:0},Te={key:1},Ve={key:0,class:"row"},je={key:1,class:"row"},qe={class:"row",style:{"flex-grow":"2"}},He={class:"col-md-12",style:{display:"flex","flex-direction":"column"}},Ke={class:"row"},Pe={class:"col-md-12"},Xe={class:"buttons-bar"},Be=["disabled"],Ue={key:3,class:"overlay"},Re={class:"overlay-content",style:{display:"flex","flex-direction":"column"}};function Ge(o,e,m,p,s,a){const l=_("Loader"),b=_("ActivityMotsClesAdminFusion"),w=E("focus");return n(),i("section",null,[h(l,{visible:s.loading!=null,text:s.loading},null,8,["visible","text"]),s.error?(n(),i("div",ae,[t("div",me,[t("h2",null,[e[13]||(e[13]=d(" Erreur mots clés ")),t("span",{class:"overlay-closer",onClick:e[0]||(e[0]=u=>s.error=null)},"X")]),t("div",ve,[e[14]||(e[14]=t("i",{class:"icon-attention-1"},null,-1)),t("div",{innerHTML:s.error},null,8,pe)]),t("button",{class:"btn btn-default",onClick:e[1]||(e[1]=u=>s.error=null)},e[15]||(e[15]=[t("i",{class:"icon-cancel-outline"},null,-1),d(" Fermer ")]))])])):c("",!0),e[33]||(e[33]=t("h1",null,[t("span",{class:"icon-tags"}),d(" Mots clés")],-1)),t("div",Ce,[t("button",{onClick:e[2]||(e[2]=u=>s.editedMotCle={}),class:"btn btn-primary"},e[16]||(e[16]=[t("span",{class:"icon-plus-circled"},null,-1),d(" Créer un nouveau mot clé")])),t("button",{onClick:e[3]||(e[3]=u=>s.fusionEnCours=!0),class:"btn btn-primary",style:{"margin-right":"1em"}},e[17]||(e[17]=[t("span",{class:"icon-tags"},null,-1),d(" Fusionner des mots clés")]))]),t("ol",null,[(n(!0),i(v,null,C(s.touslesmotscles,u=>(n(),i("li",null,[t("div",ye,[t("div",null,[t("span",null,"[id : "+r(u.id)+"]",1),e[18]||(e[18]=d()),t("h3",be,r(u.label),1)]),t("div",null,[t("button",{onClick:f=>s.editedMotCle={id:u.id,label:u.label},class:"cardbutton"},e[19]||(e[19]=[t("span",{class:"icon-pencil"},null,-1),d(" Éditer")]),8,fe),t("button",{onClick:f=>s.deleteData=u,class:"cardbutton"},e[20]||(e[20]=[t("span",{class:"icon-trash"},null,-1),d(" Supprimer")]),8,ge)])]),t("div",_e,r(u.activity_count)+" activité"+r(u.activity_count>1?"s":"")+" pour ce mot clé",1)]))),256))]),s.deleteData?(n(),i("div",he,[t("div",Me,[t("h2",ke,[d(" Suppression du mot clé : [id : "+r(s.deleteData.id)+'] "',1),t("span",xe,r(s.deleteData.label),1),e[21]||(e[21]=d('" ? ')),t("span",{class:"overlay-closer",onClick:e[4]||(e[4]=u=>s.deleteData=null)},"X")]),t("p",we,[e[22]||(e[22]=t("i",{class:"icon-attention-1"},null,-1)),d(" Souhaitez-vous supprimer le mot clé : [id : "+r(s.deleteData.id)+"] ",1),t("strong",De,r(s.deleteData.label),1),e[23]||(e[23]=d(" ? ")),e[24]||(e[24]=t("br",null,null,-1)),e[25]||(e[25]=d(" Actuellement attaché à ")),s.deleteData.activity_count>0?(n(),i("span",Le,[t("strong",null,r(s.deleteData.activity_count)+" activité"+r(s.deleteData.activity_count>1?"s":""),1)])):c("",!0),s.deleteData.activity_count==0?(n(),i("span",Ee,"aucune activité")):c("",!0)]),t("div",Se,[t("div",Ae,[t("nav",Ie,[t("button",{class:"btn",onClick:e[5]||(e[5]=u=>s.deleteData=null),style:{"margin-right":"1em"}},e[26]||(e[26]=[t("i",{class:"icon-cancel-alt"},null,-1),d(" Annuler ")])),t("button",{class:"btn btn-danger",onClick:e[6]||(e[6]=(...u)=>a.deleteMotCle&&a.deleteMotCle(...u))},e[27]||(e[27]=[t("i",{class:"icon-valid"},null,-1),d(" Confirmer ")]))])])])])])):c("",!0),s.editedMotCle?(n(),i("div",ze,[t("div",Fe,[t("h2",null,[t("small",null,[e[28]||(e[28]=t("i",{class:"icon-doc"},null,-1)),s.editedMotCle.id?c("",!0):(n(),i("span",Ne,"Création d'un nouveau mot clé")),s.editedMotCle.id?(n(),i("span",Te,"Modification d'un mot clé")):c("",!0)]),t("span",{class:"overlay-closer",onClick:e[7]||(e[7]=u=>s.editedMotCle=null)},"X")]),s.editedMotCle.label?c("",!0):(n(),i("div",Ve,e[29]||(e[29]=[t("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[t("span",{style:{"font-size":"xx-large"}},"⚠"),d(" Veuillez saisir un libellé pour le mot clé ")],-1)]))),a.motCleExisteDeja?(n(),i("div",je,e[30]||(e[30]=[t("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[t("span",{style:{"font-size":"xx-large"}},"⚠"),d(" Le mot clé saisi existe déjà ")],-1)]))):c("",!0),t("div",qe,[t("div",He,[g(t("input",{maxlength:"128","onUpdate:modelValue":e[8]||(e[8]=u=>s.editedMotCle.label=u),id:"content",class:"form-control",style:{"flex-grow":"2"}},null,512),[[w],[M,s.editedMotCle.label]])])]),t("div",Ke,[t("div",Pe,[t("nav",Xe,[t("button",{class:"btn btn-danger",style:{"margin-right":"1em"},onClick:e[9]||(e[9]=u=>s.editedMotCle=null)},e[31]||(e[31]=[t("i",{class:"icon-cancel-alt"},null,-1),d(" Annuler ")])),t("button",{class:"btn btn-success",onClick:e[10]||(e[10]=S(u=>a.applyEdit(),["prevent"])),disabled:!s.editedMotCle.label||a.motCleExisteDeja},e[32]||(e[32]=[t("i",{class:"icon-valid"},null,-1),d(" Enregistrer ")]),8,Be)])])])])])):c("",!0),s.fusionEnCours?(n(),i("div",Ue,[t("div",Re,[h(b,{onClose:e[11]||(e[11]=u=>s.fusionEnCours=!1),onFusion:e[12]||(e[12]=(u,f)=>a.fusionner(u,f)),touslesmotscles:s.touslesmotscles},null,8,["touslesmotscles"])])])):c("",!0)])}const Je=k(ce,[["render",Ge],["__scopeId","data-v-837865bb"]]);let x="#activity-mots-cles-admin",Oe=document.querySelector(x);const Qe=A(Je,{url:Oe.dataset.url});Qe.mount(x);
diff --git a/public/js/oscar/vite/dist/assets/activitymotsclesadmin-70f45e39.js b/public/js/oscar/vite/dist/assets/activitymotsclesadmin-70f45e39.js
new file mode 100644
index 0000000000000000000000000000000000000000..c22e31db23616c2f9afc8b107b74954f2da3415a
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/activitymotsclesadmin-70f45e39.js
@@ -0,0 +1 @@
+import{o as n,c as i,d as e,g as u,F as m,k as C,t as c,a as r,w as g,v as x,n as I,l as A,p as w,i as D,s as y,r as M,B as z,b as k,h as F,A as N}from"../vendor.js";import{A as T}from"../vendor14.js";import{L as V}from"../vendor17.js";import{_ as L}from"../vendor7.js";const j={props:{touslesmotscles:{default:[]}},computed:{aucunMotCleNeCorrespond(){return this.userInput&&this.touslesmotscles.filter(l=>l.label.toLocaleLowerCase().includes(this.userInput.trim().toLocaleLowerCase())).length==0}},data(){return{affichertouslesmotscles:!1,userInput:"",idMotCleCible:null,motsClesSelectionnes:new Set}},methods:{motCleParId(l){for(const s of this.touslesmotscles)if(s.id==l)return s;return null},onKeyDown(l){if(l.key==="Enter"){l.preventDefault();return}if(l.key==="Tab"){this.affichertouslesmotscles=!1;return}},clickInput(){this.affichertouslesmotscles=!0},onMouseDown(l){!l.target.classList.contains("undetouslesmotscles")&&!l.target.classList.contains("inputNouveauMotCle")&&!l.target.classList.contains("listeDeTousLesMotsCles")&&!l.target.classList.contains("labelDuMotCle")&&(this.affichertouslesmotscles=!1)}},mounted(){document.addEventListener("mousedown",this.onMouseDown)},unmounted(){document.removeEventListener("mousedown",this.onMouseDown)}},p=l=>(w("data-v-41814f90"),l=l(),D(),l),q=p(()=>e("small",null,[e("i",{class:"icon-doc"}),e("span",null,"Fusionner des mots clés")],-1)),H={key:0,class:"row"},B=p(()=>e("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[e("span",{style:{"font-size":"xx-large"}},"⚠"),r(" Veuillez sélectionner au moins deux mots clés à fusionner ")],-1)),K=[B],P={class:"row",style:{"margin-bottom":"2em"}},X={class:"col-md-12",style:{display:"flex","flex-direction":"column"}},U=p(()=>e("label",{for:"nouveauMotCle"},"Sélectionnez les mots clés à fusionner",-1)),R={style:{display:"flex","background-color":"white",border:"1px solid #aaa","border-radius":"4px","min-height":"34px"}},G={style:{display:"flex","flex-wrap":"wrap",margin:"0","padding-left":"5px","padding-right":"5px","padding-bottom":"5px",width:"100%","align-items":"center"}},J={key:0,class:"selectedmotcle"},O=["onClick"],Q={style:{"margin-top":"5px","flex-grow":"1",overflow:"auto"}},W={key:0,style:{"background-color":"white",border:"1px solid #aaa","border-radius":"4px","border-top-left-radius":"0","border-top-right-radius":"0","z-index":"1051"}},Y={class:"listeDeTousLesMotsCles"},Z=["onClick"],$={class:"labelDuMotCle"},ee={key:0,style:{padding:"6px"}},te={key:1,class:"row"},se=p(()=>e("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[e("span",{style:{"font-size":"xx-large"}},"⚠"),r(" Veuillez sélectionner le nom du mot clé qui remplacera tous les autres après la fusion ")],-1)),le=[se],oe={class:"row"},ne={class:"col-md-12",style:{display:"flex","flex-direction":"column"}},ie=p(()=>e("label",{for:"motCleCible"},"Sélectionnez le nom du mot clé qui remplacera tous les autres après la fusion",-1)),ce=p(()=>e("option",{value:""},null,-1)),re=["value"],de={key:2,class:"row"},ue={style:{"background-color":"#dff0d8","border-color":"#d6e9c6",color:"#3c763d",margin:"1em",padding:"1em"}},ae={style:{"line-break":"anywhere"}},_e={key:0},he={style:{"line-break":"anywhere"}},me={key:0},pe={style:{"line-break":"anywhere"}},ve={class:"row"},Ce={class:"col-md-12"},ye={class:"buttons-bar"},be=p(()=>e("i",{class:"icon-cancel-alt"},null,-1)),fe=["disabled"],ge=p(()=>e("i",{class:"icon-valid"},null,-1));function Me(l,s,h,v,t,a){return n(),i("section",null,[e("h2",null,[q,e("span",{class:"overlay-closer",onClick:s[0]||(s[0]=o=>l.$emit("close"))},"X")]),t.motsClesSelectionnes.size<2?(n(),i("div",H,K)):u("",!0),e("div",P,[e("div",X,[U,e("div",null,[e("span",R,[e("ul",G,[(n(!0),i(m,null,C(h.touslesmotscles,o=>(n(),i(m,null,[t.motsClesSelectionnes.has(o.id)?(n(),i("li",J,[e("span",{onClick:b=>t.motsClesSelectionnes.delete(o.id)},"×",8,O),e("strong",null,c(o.label),1),r(" (id : "+c(o.id)+", "+c(o.activity_count)+" activité"+c(o.activity_count>1?"s":"")+") ",1)])):u("",!0)],64))),256)),e("li",Q,[g(e("input",{id:"nouveauMotCle",onFocusin:s[1]||(s[1]=(...o)=>a.clickInput&&a.clickInput(...o)),onClick:s[2]||(s[2]=(...o)=>a.clickInput&&a.clickInput(...o)),onKeydown:s[3]||(s[3]=(...o)=>a.onKeyDown&&a.onKeyDown(...o)),"onUpdate:modelValue":s[4]||(s[4]=o=>t.userInput=o),size:"1",class:"inputNouveauMotCle"},null,544),[[x,t.userInput]])])])]),t.affichertouslesmotscles?(n(),i("div",W,[e("ul",Y,[(n(!0),i(m,null,C(h.touslesmotscles,o=>(n(),i(m,null,[o.label.toLocaleLowerCase().includes(t.userInput.toLocaleLowerCase())?(n(),i("li",{key:0,class:I(["undetouslesmotscles",{selected:t.motsClesSelectionnes.has(o.id)}]),onClick:b=>{t.motsClesSelectionnes.has(o.id)?t.motsClesSelectionnes.delete(o.id):t.motsClesSelectionnes.add(o.id),t.affichertouslesmotscles=!1,t.userInput=""}},[e("strong",$,c(o.label),1),r(" (id : "+c(o.id)+", "+c(o.activity_count)+" activité"+c(o.activity_count>1?"s":"")+")",1)],10,Z)):u("",!0)],64))),256)),a.aucunMotCleNeCorrespond?(n(),i("li",ee,"Aucun mot clé existant correspondant")):u("",!0)])])):u("",!0)])])]),t.idMotCleCible?u("",!0):(n(),i("div",te,le)),e("div",oe,[e("div",ne,[ie,g(e("select",{id:"motCleCible","onUpdate:modelValue":s[5]||(s[5]=o=>t.idMotCleCible=o)},[ce,(n(!0),i(m,null,C(h.touslesmotscles,o=>(n(),i(m,null,[t.motsClesSelectionnes.has(o.id)?(n(),i("option",{key:0,value:o.id},[e("strong",null,c(o.label),1),r(" (id : "+c(o.id)+", "+c(o.activity_count)+" activité"+c(o.activity_count>1?"s":"")+")",1)],8,re)):u("",!0)],64))),256))],512),[[A,t.idMotCleCible]])])]),t.motsClesSelectionnes.size>=2&&t.idMotCleCible?(n(),i("div",de,[e("div",ue,[r(" En cliquant sur fusionner, le mot clé "),e("strong",ae,c(a.motCleParId(t.idMotCleCible).label),1),r(" (id: "+c(t.idMotCleCible)+", "+c(a.motCleParId(t.idMotCleCible).activity_count)+" activité"+c(a.motCleParId(t.idMotCleCible).activity_count>1?"s":"")+") va être ajouté : ",1),e("ul",null,[(n(!0),i(m,null,C(h.touslesmotscles,o=>(n(),i(m,null,[t.motsClesSelectionnes.has(o.id)&&o.id!=t.idMotCleCible?(n(),i("li",_e,[r("aux "+c(o.activity_count)+" activité"+c(o.activity_count>1?"s":"")+" ayant le mot clé ",1),e("strong",he,c(o.label),1),r(" (id : "+c(o.id)+")",1)])):u("",!0)],64))),256))]),r(" Ensuite, ces mots clés seront supprimés : "),(n(!0),i(m,null,C(h.touslesmotscles,o=>(n(),i(m,null,[t.motsClesSelectionnes.has(o.id)&&o.id!=t.idMotCleCible?(n(),i("span",me,[e("strong",pe," "+c(o.label),1),r(" (id : "+c(o.id)+")",1)])):u("",!0)],64))),256))])])):u("",!0),e("div",ve,[e("div",Ce,[e("nav",ye,[e("button",{class:"btn btn-danger",style:{"margin-right":"1em"},onClick:s[6]||(s[6]=o=>l.$emit("close"))},[be,r(" Annuler ")]),e("button",{class:"btn btn-success",disabled:t.motsClesSelectionnes.size<2||!t.idMotCleCible,onClick:s[7]||(s[7]=o=>l.$emit("fusion",Array.from(t.motsClesSelectionnes),t.idMotCleCible))},[ge,r(" Fusionner ")],8,fe)])])])])}const ke=L(j,[["render",Me],["__scopeId","data-v-41814f90"]]);const xe={directives:{focus:l=>l.focus()},components:{Loader:V,ActivityMotsClesAdminFusion:ke},props:{url:{default:null}},computed:{motCleExisteDeja(){return this.editedMotCle&&this.editedMotCle.label&&this.touslesmotscles.filter(l=>l.label.toLocaleLowerCase()==this.editedMotCle.label.trim().toLocaleLowerCase()).length>0}},data(){return{touslesmotscles:[],error:null,loading:null,deleteData:null,editedMotCle:null,fusionEnCours:!1}},methods:{fusionner(l,s){this.fusionEnCours=!1,this.loading="Fusion des mots clés",y.post(this.url,{action:"fusion",idsToMerge:l,targetId:s}).then(()=>{this.fetch()},h=>{this.handleError(h)}).finally(()=>{this.loading=null})},applyEdit(){let l="create";this.editedMotCle.id&&(l="update"),this.loading=l=="create"?"Création du mot clé":"Modification du mot clé",y.post(this.url,{action:l,id:this.editedMotCle.id,label:this.editedMotCle.label.trim()}).then(()=>{this.fetch()},s=>{this.handleError(s)}).finally(()=>{this.loading=null,this.editedMotCle=null})},deleteMotCle(){this.loading="Suppression du mot clé",y.post(this.url,{action:"delete",id:this.deleteData.id}).then(()=>{this.touslesmotscles.splice(this.touslesmotscles.findIndex(l=>l.id===this.deleteData.id),1)},l=>{this.handleError(l)}).finally(()=>{this.loading=null,this.deleteData=null})},fetch(){this.loading="Chargement des mots clés",y.get(this.url+"?include_activity_count=true").then(l=>{this.touslesmotscles=l.data.motscles,this.loading=null},l=>{this.handleError(l),this.loading=null})},handleError(l){if(!l.response.data){this.error=l;return}if(l.response.headers.get("content-type").includes("text/html")){var s=document.createElement("html");s.innerHTML=l.response.data;const h=s.querySelector('[id="contenu-principal"]');if(h){this.error=h.innerHTML;return}const v=l.response.headers.get("content-length");if(v&&typeof v=="string"&&!isNaN(v)&&Number(v)<1e3){this.error=l.response.data;return}}this.error=T.manageErrorResponse(l)}},mounted(){this.fetch()}},_=l=>(w("data-v-837865bb"),l=l(),D(),l),we={key:0,class:"overlay",style:{"z-index":"101"}},De={class:"overlay-content",style:{"max-width":"50%"}},Le={class:"alert-danger alert"},Se=_(()=>e("i",{class:"icon-attention-1"},null,-1)),Ee=["innerHTML"],Ie=_(()=>e("i",{class:"icon-cancel-outline"},null,-1)),Ae=_(()=>e("h1",null,[e("span",{class:"icon-tags"}),r(" Mots clés")],-1)),ze={style:{display:"flex","flex-direction":"row-reverse"}},Fe=_(()=>e("span",{class:"icon-plus-circled"},null,-1)),Ne=_(()=>e("span",{class:"icon-tags"},null,-1)),Te={class:"title"},Ve={style:{display:"inline","line-break":"anywhere"}},je=["onClick"],qe=_(()=>e("span",{class:"icon-pencil"},null,-1)),He=["onClick"],Be=_(()=>e("span",{class:"icon-trash"},null,-1)),Ke={style:{"padding-left":"1em","padding-bottom":"0.3em"}},Pe={key:1,class:"overlay"},Xe={class:"overlay-content"},Ue={style:{"padding-right":"1em"}},Re={style:{"line-break":"anywhere"}},Ge={class:"alert-danger alert"},Je=_(()=>e("i",{class:"icon-attention-1"},null,-1)),Oe={style:{"line-break":"anywhere"}},Qe=_(()=>e("br",null,null,-1)),We={key:0},Ye={key:1},Ze={class:"row"},$e={class:"col-md-12"},et={class:"buttons-bar"},tt=_(()=>e("i",{class:"icon-cancel-alt"},null,-1)),st=_(()=>e("i",{class:"icon-valid"},null,-1)),lt={key:2,class:"overlay"},ot={class:"overlay-content",style:{display:"flex","flex-direction":"column"}},nt=_(()=>e("i",{class:"icon-doc"},null,-1)),it={key:0},ct={key:1},rt={key:0,class:"row"},dt=_(()=>e("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[e("span",{style:{"font-size":"xx-large"}},"⚠"),r(" Veuillez saisir un libellé pour le mot clé ")],-1)),ut=[dt],at={key:1,class:"row"},_t=_(()=>e("div",{style:{"background-color":"#fcf8e3","border-color":"#faebcc",color:"#8a6d3b",margin:"1em",padding:"1em"}},[e("span",{style:{"font-size":"xx-large"}},"⚠"),r(" Le mot clé saisi existe déjà ")],-1)),ht=[_t],mt={class:"row",style:{"flex-grow":"2"}},pt={class:"col-md-12",style:{display:"flex","flex-direction":"column"}},vt={class:"row"},Ct={class:"col-md-12"},yt={class:"buttons-bar"},bt=_(()=>e("i",{class:"icon-cancel-alt"},null,-1)),ft=["disabled"],gt=_(()=>e("i",{class:"icon-valid"},null,-1)),Mt={key:3,class:"overlay"},kt={class:"overlay-content",style:{display:"flex","flex-direction":"column"}};function xt(l,s,h,v,t,a){const o=M("Loader"),b=M("ActivityMotsClesAdminFusion"),E=z("focus");return n(),i("section",null,[k(o,{visible:t.loading!=null,text:t.loading},null,8,["visible","text"]),t.error?(n(),i("div",we,[e("div",De,[e("h2",null,[r(" Erreur mots clés "),e("span",{class:"overlay-closer",onClick:s[0]||(s[0]=d=>t.error=null)},"X")]),e("div",Le,[Se,e("div",{innerHTML:t.error},null,8,Ee)]),e("button",{class:"btn btn-default",onClick:s[1]||(s[1]=d=>t.error=null)},[Ie,r(" Fermer ")])])])):u("",!0),Ae,e("div",ze,[e("button",{onClick:s[2]||(s[2]=d=>t.editedMotCle={}),class:"btn btn-primary"},[Fe,r(" Créer un nouveau mot clé")]),e("button",{onClick:s[3]||(s[3]=d=>t.fusionEnCours=!0),class:"btn btn-primary",style:{"margin-right":"1em"}},[Ne,r(" Fusionner des mots clés")])]),e("ol",null,[(n(!0),i(m,null,C(t.touslesmotscles,d=>(n(),i("li",null,[e("div",Te,[e("div",null,[e("span",null,"[id : "+c(d.id)+"]",1),r(),e("h3",Ve,c(d.label),1)]),e("div",null,[e("button",{onClick:f=>t.editedMotCle={id:d.id,label:d.label},class:"cardbutton"},[qe,r(" Éditer")],8,je),e("button",{onClick:f=>t.deleteData=d,class:"cardbutton"},[Be,r(" Supprimer")],8,He)])]),e("div",Ke,c(d.activity_count)+" activité"+c(d.activity_count>1?"s":"")+" pour ce mot clé",1)]))),256))]),t.deleteData?(n(),i("div",Pe,[e("div",Xe,[e("h2",Ue,[r(" Suppression du mot clé : [id : "+c(t.deleteData.id)+'] "',1),e("span",Re,c(t.deleteData.label),1),r('" ? '),e("span",{class:"overlay-closer",onClick:s[4]||(s[4]=d=>t.deleteData=null)},"X")]),e("p",Ge,[Je,r(" Souhaitez-vous supprimer le mot clé : [id : "+c(t.deleteData.id)+"] ",1),e("strong",Oe,c(t.deleteData.label),1),r(" ? "),Qe,r(" Actuellement attaché à "),t.deleteData.activity_count>0?(n(),i("span",We,[e("strong",null,c(t.deleteData.activity_count)+" activité"+c(t.deleteData.activity_count>1?"s":""),1)])):u("",!0),t.deleteData.activity_count==0?(n(),i("span",Ye,"aucune activité")):u("",!0)]),e("div",Ze,[e("div",$e,[e("nav",et,[e("button",{class:"btn",onClick:s[5]||(s[5]=d=>t.deleteData=null),style:{"margin-right":"1em"}},[tt,r(" Annuler ")]),e("button",{class:"btn btn-danger",onClick:s[6]||(s[6]=(...d)=>a.deleteMotCle&&a.deleteMotCle(...d))},[st,r(" Confirmer ")])])])])])])):u("",!0),t.editedMotCle?(n(),i("div",lt,[e("div",ot,[e("h2",null,[e("small",null,[nt,t.editedMotCle.id?u("",!0):(n(),i("span",it,"Création d'un nouveau mot clé")),t.editedMotCle.id?(n(),i("span",ct,"Modification d'un mot clé")):u("",!0)]),e("span",{class:"overlay-closer",onClick:s[7]||(s[7]=d=>t.editedMotCle=null)},"X")]),t.editedMotCle.label?u("",!0):(n(),i("div",rt,ut)),a.motCleExisteDeja?(n(),i("div",at,ht)):u("",!0),e("div",mt,[e("div",pt,[g(e("input",{maxlength:"128","onUpdate:modelValue":s[8]||(s[8]=d=>t.editedMotCle.label=d),id:"content",class:"form-control",style:{"flex-grow":"2"}},null,512),[[E],[x,t.editedMotCle.label]])])]),e("div",vt,[e("div",Ct,[e("nav",yt,[e("button",{class:"btn btn-danger",style:{"margin-right":"1em"},onClick:s[9]||(s[9]=d=>t.editedMotCle=null)},[bt,r(" Annuler ")]),e("button",{class:"btn btn-success",onClick:s[10]||(s[10]=F(d=>a.applyEdit(),["prevent"])),disabled:!t.editedMotCle.label||a.motCleExisteDeja},[gt,r(" Enregistrer ")],8,ft)])])])])])):u("",!0),t.fusionEnCours?(n(),i("div",Mt,[e("div",kt,[k(b,{onClose:s[11]||(s[11]=d=>t.fusionEnCours=!1),onFusion:s[12]||(s[12]=(d,f)=>a.fusionner(d,f)),touslesmotscles:t.touslesmotscles},null,8,["touslesmotscles"])])])):u("",!0)])}const wt=L(xe,[["render",xt],["__scopeId","data-v-837865bb"]]);let S="#activity-mots-cles-admin",Dt=document.querySelector(S);const Lt=N(wt,{url:Dt.dataset.url});Lt.mount(S);
diff --git a/public/js/oscar/vite/dist/assets/activitynotes-e551577c.js b/public/js/oscar/vite/dist/assets/activitynotes-fbb89777.js
similarity index 86%
rename from public/js/oscar/vite/dist/assets/activitynotes-e551577c.js
rename to public/js/oscar/vite/dist/assets/activitynotes-fbb89777.js
index ca898409a4d2b5fc2f3488b3c7f2138aac263202..8282a440f1021272b58d90f1204a010e96d73386 100644
--- a/public/js/oscar/vite/dist/assets/activitynotes-e551577c.js
+++ b/public/js/oscar/vite/dist/assets/activitynotes-fbb89777.js
@@ -1 +1 @@
-import{y as t}from"../vendor.js";import{A as o}from"../vendor12.js";import"../vendor17.js";import"../vendor7.js";import"../vendor14.js";import"../vendor18.js";import"../vendor16.js";let e="#activity-notes",a=document.querySelector(e);const l=t(o,{activityid:a.dataset.activityid,url:a.dataset.url,showallowed:a.dataset.showallowed=="1",manageuserallowed:a.dataset.manageuserallowed=="1",manageadminallowed:a.dataset.manageadminallowed=="1",userid:a.dataset.userid});l.mount(e);
+import{A as t}from"../vendor.js";import{A as o}from"../vendor12.js";import"../vendor17.js";import"../vendor7.js";import"../vendor14.js";import"../vendor18.js";import"../vendor16.js";let e="#activity-notes",a=document.querySelector(e);const l=t(o,{activityid:a.dataset.activityid,url:a.dataset.url,showallowed:a.dataset.showallowed=="1",manageuserallowed:a.dataset.manageuserallowed=="1",manageadminallowed:a.dataset.manageadminallowed=="1",userid:a.dataset.userid});l.mount(e);
diff --git a/public/js/oscar/vite/dist/assets/activitypcruinformations-563c4a56.js b/public/js/oscar/vite/dist/assets/activitypcruinformations-563c4a56.js
new file mode 100644
index 0000000000000000000000000000000000000000..066248bc6dea5a74a420b4cfa6ac4af0721b5f86
--- /dev/null
+++ b/public/js/oscar/vite/dist/assets/activitypcruinformations-563c4a56.js
@@ -0,0 +1 @@
+import{s as D,q as v,r as T,o as u,c as a,b as V,j as N,d as e,g as c,a as l,t as s,F as p,k as f,h as K,n as m,w as d,f as h,v as P,l as _,z as I,A as X}from"../vendor.js";import{A as O}from"../vendor14.js";import{L as W}from"../vendor17.js";import{M as J}from"../vendor5.js";import{_ as Q}from"../vendor7.js";D.defaults.headers.common.Accept="application/json";D.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";const Z={name:"ActivityPcruInformations",components:{Loader:W,Modal:J},props:{urlActivity:{required:!0},urlPcruApi:{required:!0}},computed:{objetErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.objet||this.pcru.activityPcruInformations.objet.trim()==""?i.push("Le champ Objet est obligatoire et doit être défini"):this.pcru.activityPcruInformations.objet.trim().length>1e3&&i.push("Le champ Objet doit faire moins de 1000 caractères"),this.objetAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.objetErreurs))]),i},objetErreurs(){return this.pcru.activityPcruInformations.utiliserObjetParDefaut?this.pcru.pcruInformationParDefaut.objetErreurs:this.objetErreursPasParDefaut},labintelErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.labintel||this.pcru.activityPcruInformations.labintel.trim()==""?i.push("Le champ CodeLabintelUnite est obligatoire et doit être défini"):this.pcru.activityPcruInformations.labintel.trim().length>10&&i.push("Le champ CodeLabintelUnite doit faire moins de 10 caractères"),this.labintelAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.labintelErreurs))]),i},labintelErreurs(){return this.pcru.activityPcruInformations.utiliserLabintelParDefaut?this.pcru.pcruInformationParDefaut.labintelErreurs:this.labintelErreursPasParDefaut},rnsrErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.rnsr&&this.pcru.activityPcruInformations.rnsr.trim().length>this.pcru.rnsrMaxLength&&i.push("Le champ CodeRNSRUnite doit faire moins de "+this.pcru.rnsrMaxLength+" caractères"),this.rnsrAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.rnsrErreurs))]),i},rnsrErreurs(){return this.pcru.activityPcruInformations.utiliserRnsrParDefaut?this.pcru.pcruInformationParDefaut.rnsrErreurs:this.rnsrErreursPasParDefaut},sigleErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.sigle&&this.pcru.activityPcruInformations.sigle.trim().length>20&&i.push("Le champ SigleUnite doit faire moins de 20 caractères"),this.sigleAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.sigleErreurs))]),i},sigleErreurs(){return this.pcru.activityPcruInformations.utiliserSigleParDefaut?this.pcru.pcruInformationParDefaut.sigleErreurs:this.sigleErreursPasParDefaut},numContratErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.numContrat||this.pcru.activityPcruInformations.numContrat.trim()==""?i.push("Le champ ReferenceGestionnaire est obligatoire et doit être défini"):this.pcru.activityPcruInformations.numContrat.trim().length>30&&i.push("Le champ ReferenceGestionnaire doit faire moins de 30 caractères"),this.numContratAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.numContratErreurs))]),i},numContratErreurs(){return this.pcru.activityPcruInformations.utiliserNumContratParDefaut?this.pcru.pcruInformationParDefaut.numContratErreurs:this.numContratErreursPasParDefaut},equipeErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.equipe&&this.pcru.activityPcruInformations.equipe.trim().length>150&&i.push("Le champ Equipe doit faire moins de 150 caractères"),this.equipeAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.equipeErreurs))]),i},typeContratErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.pcruTypeContractId||i.push("Le champ TypeContrat est obligatoire et doit être défini"),this.typeContratAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.typeContratErreurs))]),i},typeContratErreurs(){return this.pcru.activityPcruInformations.utiliserTypeContratParDefaut?this.pcru.pcruInformationParDefaut.typeContratErreurs:this.typeContratErreursPasParDefaut},acronymeErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.acronyme&&this.pcru.activityPcruInformations.acronyme.trim().length>50&&i.push("Le champ Acronyme doit faire moins de 50 caractères"),this.acronymeAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.acronymeErreurs))]),i},acronymeErreurs(){return this.pcru.activityPcruInformations.utiliserAcronymeParDefaut?this.pcru.pcruInformationParDefaut.acronymeErreurs:this.acronymeErreursPasParDefaut},contratsAssociesErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.contratsAssocies&&this.pcru.activityPcruInformations.contratsAssocies.trim().length>300&&i.push("Le champ ContratsAssocies doit faire moins de 300 caractères"),this.contratsAssociesAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.contratsAssociesErreurs))]),i},responsableScientifiqueErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.responsableScientifique||this.pcru.activityPcruInformations.responsableScientifique.trim()==""?i.push("Le champ NomRespScientifique est obligatoire et doit être défini"):this.pcru.activityPcruInformations.responsableScientifique.trim().length>50&&i.push("Le champ NomRespScientifique doit faire moins de 50 caractères"),this.responsableScientifiqueAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.responsableScientifiqueErreurs))]),i},responsableScientifiqueErreurs(){return this.pcru.activityPcruInformations.utiliserResponsableScientifiqueParDefaut?this.pcru.pcruInformationParDefaut.responsableScientifiqueErreurs:this.responsableScientifiqueErreursPasParDefaut},employeurResponsableScientifiqueErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.employeurResponsableScientifique&&this.pcru.activityPcruInformations.employeurResponsableScientifique.trim().length>50&&i.push("Le champ EmployeurRespScientifique doit faire moins de 150 caractères"),this.employeurResponsableScientifiqueAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.employeurResponsableScientifiqueErreurs))]),i},partenairesErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.partenaires&&this.pcru.activityPcruInformations.partenaires.trim().length>200&&i.push("Le champ Partenaires doit faire moins de 200 caractères"),this.partenairesAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.partenairesErreurs))]),i},partenairesErreurs(){return this.pcru.activityPcruInformations.utiliserPartenairesParDefaut?this.pcru.pcruInformationParDefaut.partenairesErreurs:this.partenairesErreursPasParDefaut},partenairePrincipalErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.partenairePrincipal||this.pcru.activityPcruInformations.partenairePrincipal.trim()==""?i.push("Le champ PartenairePrincipal est obligatoire et doit être défini"):this.pcru.activityPcruInformations.partenairePrincipal.trim().length>this.pcru.partenairePrincipalMaxLength&&i.push("Le champ PartenairePrincipal doit faire moins de "+this.pcru.partenairePrincipalMaxLength+" caractères"),this.partenairePrincipalAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.partenairePrincipalErreurs))]),i},partenairePrincipalErreurs(){return this.pcru.activityPcruInformations.utiliserPartenairePrincipalParDefaut?this.pcru.pcruInformationParDefaut.partenairePrincipalErreurs:this.partenairePrincipalErreursPasParDefaut},idPartenairePrincipalErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.idPartenairePrincipal||this.pcru.activityPcruInformations.idPartenairePrincipal.trim()==""?i.push("Le champ IdPrincipal est obligatoire et doit être défini"):this.pcru.activityPcruInformations.idPartenairePrincipal&&this.pcru.activityPcruInformations.idPartenairePrincipal.trim().length>this.pcru.idPartenairePrincipalMaxLength&&i.push("Le champ IdPrincipal doit faire moins de "+this.pcru.idPartenairePrincipalMaxLength+" caractères"),this.idPartenairePrincipalAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.idPartenairePrincipalErreurs))]),i},idPartenairePrincipalErreurs(){return this.pcru.activityPcruInformations.utiliserIdPartenairePrincipalParDefaut?this.pcru.pcruInformationParDefaut.idPartenairePrincipalErreurs:this.idPartenairePrincipalErreursPasParDefaut},lieuExecutionErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.lieuExecution&&this.pcru.activityPcruInformations.lieuExecution.trim().length>this.pcru.lieuExecutionMaxLength&&i.push("Le champ LieuExecution doit faire moins de "+this.pcru.lieuExecutionMaxLength+" caractères"),this.lieuExecutionAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.lieuExecutionErreurs))]),i},dateDerniereSignatureErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.dateDerniereSignature||this.pcru.activityPcruInformations.dateDerniereSignature.trim()==""?i.push("Le champ DateDerniereSignature est obligatoire et doit être défini"):v(this.pcru.activityPcruInformations.dateDerniereSignature,"DD-MM-YYYY",!0).isValid()||i.push("Le champ DateDerniereSignature doit être une date valide au format jj-mm-aaaa"),this.dateDerniereSignatureAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.dateDerniereSignatureErreurs))]),i},dateDerniereSignatureErreurs(){return this.pcru.activityPcruInformations.utiliserDateDerniereSignatureParDefaut?this.pcru.pcruInformationParDefaut.dateDerniereSignatureErreurs:this.dateDerniereSignatureErreursPasParDefaut},dureeErreursPasParDefaut(){let i=[];if(this.pcru.activityPcruInformations.duree!=null&&this.pcru.activityPcruInformations.duree!=""){this.pcru.activityPcruInformations.duree>999.5&&i.push("Le champ Duree contient une valeur trop grande."),this.pcru.activityPcruInformations.duree<.5&&i.push("Le champ Duree ne peut pas être plus petit que 0,5 mois.");const n=Math.abs(this.pcru.activityPcruInformations.duree-Math.trunc(this.pcru.activityPcruInformations.duree));n!=0&&n!=.5&&i.push("Si le champ Duree doit avoir une valeur après la virgule, ça ne peut être que 0,5")}else(this.pcru.activityPcruInformations.utiliserDateFinParDefaut&&(!this.pcru.pcruInformationParDefaut.dateFin||this.pcru.pcruInformationParDefaut.dateFin.trim()=="")||!this.pcru.activityPcruInformations.utiliserDateFinParDefaut&&(!this.pcru.activityPcruInformations.dateFin||this.pcru.activityPcruInformations.dateFin.trim()==""))&&i.push("Si la date de fin du contrat n'est pas renseignée, alors le champ Duree doit l'être.");return this.dureeAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.dureeErreurs))]),i},dateDebutErreursPasParDefaut(){let i=[];return!this.pcru.activityPcruInformations.dateDebut||this.pcru.activityPcruInformations.dateDebut.trim()==""?i.push("Le champ DateDebut est obligatoire et doit être défini"):v(this.pcru.activityPcruInformations.dateDebut,"DD-MM-YYYY",!0).isValid()||i.push("Le champ DateDebut doit être une date valide au format jj-mm-aaaa"),this.dateDebutAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.dateDebutErreurs))]),i},dateDebutErreurs(){return this.pcru.activityPcruInformations.utiliserDateDebutParDefaut?this.pcru.pcruInformationParDefaut.dateDebutErreurs:this.dateDebutErreursPasParDefaut},dateFinErreursParDefaut(){let i=this.pcru.pcruInformationParDefaut.dateFinErreurs;if(this.dateDebutErreurs.length==0&&this.pcru.pcruInformationParDefaut.dateFin&&v(this.pcru.pcruInformationParDefaut.dateFin,"DD-MM-YYYY",!0).isValid()){let n=this.pcru.pcruInformationParDefaut.dateDebut;this.pcru.activityPcruInformations.utiliserDateDebutParDefaut||(n=this.pcru.activityPcruInformations.dateDebut);const y=v(n,"DD-MM-YYYY",!0);v(this.pcru.pcruInformationParDefaut.dateFin,"DD-MM-YYYY",!0).isBefore(y)?i=[...new Set(i.concat(["La date de fin doit être postérieure à la date de début"]))]:i=i.filter(t=>t!=="La date de fin doit être postérieure à la date de début")}return this.pcru.activityPcruInformations.duree?i=i.filter(n=>n!=="Si la durée du contrat n'est pas renseignée, alors le champ DateFin doit l'être."):this.pcru.pcruInformationParDefaut.dateFin||(i=[...new Set(i.concat(["Si la durée du contrat n'est pas renseignée, alors le champ DateFin doit l'être."]))]),i},dateFinErreursPasParDefaut(){let i=[];if(!this.pcru.activityPcruInformations.dateFin&&!this.pcru.activityPcruInformations.duree&&i.push("Si la durée du contrat n'est pas renseignée, alors le champ DateFin doit l'être."),this.pcru.activityPcruInformations.dateFin&&this.pcru.activityPcruInformations.dateFin.trim()!=""&&!v(this.pcru.activityPcruInformations.dateFin,"DD-MM-YYYY",!0).isValid()&&i.push("Le champ DateFin doit être une date valide au format jj-mm-aaaa"),i.length==0&&this.dateDebutErreurs.length==0){let n=this.pcru.pcruInformationParDefaut.dateDebut;this.pcru.activityPcruInformations.utiliserDateDebutParDefaut||(n=this.pcru.activityPcruInformations.dateDebut);const y=v(n,"DD-MM-YYYY",!0);v(this.pcru.activityPcruInformations.dateFin,"DD-MM-YYYY",!0).isBefore(y)&&i.push("La date de fin doit être postérieure à la date de début")}return this.dateFinAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.dateFinErreurs))]),i},dateFinErreurs(){return this.pcru.activityPcruInformations.utiliserDateFinParDefaut?this.dateFinErreursParDefaut:this.dateFinErreursPasParDefaut},montantPercuUniteErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.montantPercuUnite==null||typeof this.pcru.activityPcruInformations.montantPercuUnite!="number"?i.push("Le champ MontantPercuUnite est obligatoire et doit être défini"):this.pcru.activityPcruInformations.montantPercuUnite!=null&&this.pcru.activityPcruInformations.montantPercuUnite!=""&&(this.pcru.activityPcruInformations.montantPercuUnite>999999999999e-2&&i.push("Le champ MontantPercuUnite contient une valeur trop grande."),this.pcru.activityPcruInformations.montantPercuUnite<-999999999999e-2&&i.push("Le champ MontantPercuUnite contient une valeur trop petite.")),this.montantPercuUniteAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.montantPercuUniteErreurs))]),i},contributionFinanceurErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.contributionFinanceur!=null&&typeof this.pcru.activityPcruInformations.contributionFinanceur=="number"&&this.pcru.activityPcruInformations.contributionFinanceur!=""&&(this.pcru.activityPcruInformations.contributionFinanceur>999999999999e-2&&i.push("Le champ ContributionFinanceur contient une valeur trop grande."),this.pcru.activityPcruInformations.contributionFinanceur<-999999999999e-2&&i.push("Le champ ContributionFinanceur contient une valeur trop petite.")),this.contributionFinanceurAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.contributionFinanceurErreurs))]),i},montantTotalErreurs(){return this.pcru.activityPcruInformations.utiliserMontantTotalParDefaut?this.pcru.pcruInformationParDefaut.montantTotalErreurs:[]},commentairesErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.commentaires&&this.pcru.activityPcruInformations.commentaires.trim().length>this.pcru.commentairesMaxLength&&i.push("Le champ Commentaire doit faire moins de "+this.pcru.commentairesMaxLength+" caractères"),this.commentairesAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.commentairesErreurs))]),i},referenceErreursPasParDefaut(){let i=[];return this.pcru.activityPcruInformations.reference&&this.pcru.activityPcruInformations.reference.trim().length>this.pcru.referenceMaxLength&&i.push("Le champ ReferenceNonGestionnaire doit faire moins de "+this.pcru.referenceMaxLength+" caractères"),this.referenceAfficherLesErreursServeur&&(i=[...new Set(i.concat(this.pcru.activityPcruInformations.referenceErreurs))]),i},referenceErreurs(){return this.pcru.activityPcruInformations.utiliserReferenceParDefaut?this.pcru.pcruInformationParDefaut.referenceErreurs:this.referenceErreursPasParDefaut},toutesLesErreurs(){return this.objetErreurs.concat(this.labintelErreurs.concat(this.rnsrErreurs.concat(this.sigleErreurs.concat(this.numContratErreurs.concat(this.equipeErreursPasParDefaut.concat(this.typeContratErreurs.concat(this.acronymeErreurs.concat(this.contratsAssociesErreursPasParDefaut.concat(this.responsableScientifiqueErreurs.concat(this.employeurResponsableScientifiqueErreursPasParDefaut.concat(this.partenairesErreurs.concat(this.partenairePrincipalErreurs.concat(this.idPartenairePrincipalErreurs.concat(this.pcru.pcruInformationParDefaut.sourceFinancementErreurs.concat(this.lieuExecutionErreursPasParDefaut.concat(this.dateDerniereSignatureErreurs.concat(this.dureeErreursPasParDefaut.concat(this.dateDebutErreurs.concat(this.dateFinErreurs.concat(this.montantPercuUniteErreursPasParDefaut.concat(this.contributionFinanceurErreursPasParDefaut.concat(this.montantTotalErreurs.concat(this.pcru.pcruInformationParDefaut.poleCompetitiviteErreurs.concat(this.commentairesErreursPasParDefaut.concat(this.referenceErreurs)))))))))))))))))))))))))},erreursCoteServeur(){return this.pcru.enErreur}},data(){return{loading:"",error:null,pcru:null,objetAfficherLesErreursServeur:!0,labintelAfficherLesErreursServeur:!0,rnsrAfficherLesErreursServeur:!0,sigleAfficherLesErreursServeur:!0,numContratAfficherLesErreursServeur:!0,equipeAfficherLesErreursServeur:!0,typeContratAfficherLesErreursServeur:!0,acronymeAfficherLesErreursServeur:!0,contratsAssociesAfficherLesErreursServeur:!0,responsableScientifiqueAfficherLesErreursServeur:!0,employeurResponsableScientifiqueAfficherLesErreursServeur:!0,partenairesAfficherLesErreursServeur:!0,partenairePrincipalAfficherLesErreursServeur:!0,idPartenairePrincipalAfficherLesErreursServeur:!0,lieuExecutionAfficherLesErreursServeur:!0,dateDerniereSignatureAfficherLesErreursServeur:!0,dureeAfficherLesErreursServeur:!0,dateDebutAfficherLesErreursServeur:!0,dateFinAfficherLesErreursServeur:!0,montantPercuUniteAfficherLesErreursServeur:!0,contributionFinanceurAfficherLesErreursServeur:!0,montantTotalAfficherLesErreursServeur:!0,commentairesAfficherLesErreursServeur:!0,referenceAfficherLesErreursServeur:!0,activityId:null,envoiActif:!1,core:null,budget:null}},methods:{formatDate(i){return new Intl.DateTimeFormat(void 0,{dateStyle:"full",timeStyle:"medium"}).format(Date.parse(i))},checkObjetParDefaut(i){this.pcru.activityPcruInformations.utiliserObjetParDefaut?this.pcru.activityPcruInformations.objet=null:(this.pcru.activityPcruInformations.objet=this.pcru.pcruInformationParDefaut.objet.substring(0,1e3),document.getElementById("objet").focus())},checkLabintelParDefaut(i){this.pcru.activityPcruInformations.labintel=null,this.pcru.activityPcruInformations.utiliserLabintelParDefaut||(this.pcru.pcruInformationParDefaut.labintel!=null&&(this.pcru.activityPcruInformations.labintel=this.pcru.pcruInformationParDefaut.labintel.substring(0,10)),document.getElementById("labintel").focus())},checkRnsrParDefaut(i){this.pcru.activityPcruInformations.rnsr=null,this.pcru.activityPcruInformations.utiliserRnsrParDefaut||(this.pcru.pcruInformationParDefaut.rnsr!=null&&(this.pcru.activityPcruInformations.rnsr=this.pcru.pcruInformationParDefaut.rnsr.substring(0,this.pcru.dateRetourOKMaisContratManquantaxLength)),document.getElementById("rnsr").focus())},checkSigleParDefaut(i){this.pcru.activityPcruInformations.sigle=null,this.pcru.activityPcruInformations.utiliserSigleParDefaut||(this.pcru.pcruInformationParDefaut.sigle!=null&&(this.pcru.activityPcruInformations.sigle=this.pcru.pcruInformationParDefaut.sigle.substring(0,20)),document.getElementById("sigleunite").focus())},checkNumContratParDefaut(i){this.pcru.activityPcruInformations.numContrat=null,this.pcru.activityPcruInformations.utiliserNumContratParDefaut||(this.pcru.pcruInformationParDefaut.numContrat!=null&&(this.pcru.activityPcruInformations.numContrat=this.pcru.pcruInformationParDefaut.numContrat.substring(0,30)),document.getElementById("numcontrat").focus())},checkTypeContratParDefaut(i){this.pcru.activityPcruInformations.pcruTypeContractId=null,this.pcru.activityPcruInformations.utiliserTypeContratParDefaut||(this.pcru.pcruInformationParDefaut.typeContratId!=null&&(this.pcru.activityPcruInformations.pcruTypeContractId=this.pcru.pcruInformationParDefaut.typeContratId),document.getElementById("typeContrat").focus())},checkAcronymeParDefaut(i){this.pcru.activityPcruInformations.utiliserAcronymeParDefaut?this.pcru.activityPcruInformations.acronyme=null:(this.pcru.activityPcruInformations.acronyme=this.pcru.pcruInformationParDefaut.acronyme.substring(0,50),document.getElementById("acronyme").focus())},checkResponsableScientifiqueParDefaut(i){this.pcru.activityPcruInformations.responsableScientifique=null,this.pcru.activityPcruInformations.utiliserResponsableScientifiqueParDefaut||(this.pcru.pcruInformationParDefaut.responsableScientifique!=null&&(this.pcru.activityPcruInformations.responsableScientifique=this.pcru.pcruInformationParDefaut.responsableScientifique.substring(0,50)),document.getElementById("responsableScientifique").focus())},checkPartenairesParDefaut(i){this.pcru.activityPcruInformations.partenaires=null,this.pcru.activityPcruInformations.utiliserPartenairesParDefaut||(this.pcru.pcruInformationParDefaut.partenaires!=null&&(this.pcru.activityPcruInformations.partenaires=this.pcru.pcruInformationParDefaut.partenaires.substring(0,200)),document.getElementById("partenaires").focus())},checkPartenairePrincipalParDefaut(i){this.pcru.activityPcruInformations.partenairePrincipal=null,this.pcru.activityPcruInformations.utiliserPartenairePrincipalParDefaut||(this.pcru.pcruInformationParDefaut.partenairePrincipal!=null&&(this.pcru.activityPcruInformations.partenairePrincipal=this.pcru.pcruInformationParDefaut.partenairePrincipal.substring(0,this.pcru.partenairePrincipalMaxLength)),document.getElementById("partenairePrincipal").focus())},checkIdPartenairePrincipalParDefaut(i){this.pcru.activityPcruInformations.idPartenairePrincipal=null,this.pcru.activityPcruInformations.utiliserIdPartenairePrincipalParDefaut||(this.pcru.pcruInformationParDefaut.idPartenairePrincipal!=null&&(this.pcru.activityPcruInformations.idPartenairePrincipal=this.pcru.pcruInformationParDefaut.idPartenairePrincipal.substring(0,this.pcru.idPartenairePrincipalMaxLength)),document.getElementById("idPartenairePrincipal").focus())},checkDateDerniereSignatureParDefaut(i){this.pcru.activityPcruInformations.dateDerniereSignature=null,this.pcru.activityPcruInformations.utiliserDateDerniereSignatureParDefaut||(this.pcru.pcruInformationParDefaut.dateDerniereSignature!=null&&(this.pcru.activityPcruInformations.dateDerniereSignature=this.pcru.pcruInformationParDefaut.dateDerniereSignature.substring(0,10)),document.getElementById("dateDerniereSignature").focus())},checkDateDebutParDefaut(i){this.pcru.activityPcruInformations.dateDebut=null,this.pcru.activityPcruInformations.utiliserDateDebutParDefaut||(this.pcru.pcruInformationParDefaut.dateDebut!=null&&(this.pcru.activityPcruInformations.dateDebut=this.pcru.pcruInformationParDefaut.dateDebut.substring(0,10)),document.getElementById("dateDebut").focus())},checkDateFinParDefaut(i){this.pcru.activityPcruInformations.dateFin=null,this.pcru.activityPcruInformations.utiliserDateFinParDefaut||(this.pcru.pcruInformationParDefaut.dateFin!=null&&(this.pcru.activityPcruInformations.dateFin=this.pcru.pcruInformationParDefaut.dateFin.substring(0,10)),document.getElementById("dateFin").focus())},checkMontantTotalParDefaut(i){this.pcru.activityPcruInformations.montantTotal=null,this.pcru.activityPcruInformations.utiliserMontantTotalParDefaut||(this.pcru.pcruInformationParDefaut.montantTotal!==null&&(this.pcru.activityPcruInformations.montantTotal=this.pcru.pcruInformationParDefaut.montantTotal),document.getElementById("montantTotal").focus())},checkReferenceParDefaut(i){this.pcru.activityPcruInformations.reference=null,this.pcru.activityPcruInformations.utiliserReferenceParDefaut||(this.pcru.pcruInformationParDefaut.reference!=null&&(this.pcru.activityPcruInformations.reference=this.pcru.pcruInformationParDefaut.reference.substring(0,this.pcru.referenceMaxLength)),document.getElementById("reference").focus())},enregistrer(i){this.loading="Enregistrement des informations PCRU",D.post(this.urlPcruApi,{action:"enregistrer",activityId:this.activityId,activityPcruInformations:this.pcru.activityPcruInformations}).then(n=>{this.pcru=n.data.pcru,this.envoiActif=this.pcru.activityPcruInformations.envoiActif},n=>{this.handlerError(O.manageErrorResponse(n)),this.fetch()}).finally(()=>{this.loading=""})},handlerError(i){this.error=i.message},fetch(){this.loading="Chargement des informations de l'activité",D.get(this.urlActivity).then(i=>{this.core=i.data.activity.datas.core,this.budget=i.data.activity.datas.budget,this.activityId=i.data.activity.datas.core.id,this.pcru=i.data.activity.datas.pcru,this.envoiActif=this.pcru.activityPcruInformations.envoiActif},i=>{this.handlerError(O.manageErrorResponse(i))}).finally(i=>{this.loading=""})}},mounted(){this.fetch()}},$={class:"alert alert-danger"},ee={style:{display:"flex","justify-content":"space-between"}},te=e("h1",null,"Informations PCRU",-1),re={style:{"align-content":"center"}},ie=["href"],ne={key:0},ue={key:0,style:{padding:"1em"},class:"warning"},ae={key:1,style:{"margin-top":"1em",padding:"1em"},class:"warning"},se=e("b",null,"pas activé",-1),oe={key:2,class:"info",style:{"margin-top":"1em",padding:"15px",border:"1px solid transparent"}},ce={key:3,class:"error",style:{"margin-top":"1em"}},le={key:4,class:"success",style:{"margin-top":"1em",padding:"15px",border:"1px solid transparent"}},pe={key:5,class:"success",style:{"margin-top":"1em",padding:"15px",border:"1px solid transparent"}},fe={key:6,class:"warning",style:{"margin-top":"1em",padding:"15px",border:"1px solid transparent"}},de={key:7,class:"success",style:{"margin-top":"1em",padding:"15px",border:"1px solid transparent"}},me={key:8,style:{padding:"1em","margin-top":"1em"},class:"error"},Pe={key:9,style:{padding:"1em","margin-top":"1em"},class:"warning"},he=["href"],ve={key:10,style:{padding:"1em","margin-top":"1em"},class:"error"},ye=e("b",null,"PCRU n'a pas réussi à intégrer automatiquement cette activité",-1),_e={style:{"margin-left":"1em","margin-top":"1em"}},De={key:11},Ie=e("div",{style:{display:"flex","justify-content":"space-between"}},[e("h2",null,"Historique")],-1),be={key:0},ge={key:1},Ee={key:2},Se={key:3},Le={key:12},Ce=e("div",{style:{display:"flex","justify-content":"space-between"}},[e("h2",null,"Données envoyées à PCRU")],-1),xe={id:"donnees-envoyees-table"},Re=I('N°Intitulé PCRUDescription PCRUOrigine de la valeur par défaut dans OscarValeur envoyée1Le titre/l’objet du contratL'intitulé de l'activité',9),ke={style:{"font-weight":"bold"}},Ae=e("span",null,"2",-1),qe=e("label",null,"CodeLabintelUnite",-1),Ue=e("span",null,"Le code gestionnaire (ex : codeLabintel) ou le code RNSR de l'unité du contrat",-1),je={style:{"font-weight":"bold"}},we=e("span",null,"3",-1),Fe=e("label",null,"CodeRNSRUnite",-1),Me=e("span",null,"Le répertoire national des structures de recherche",-1),Te={style:{"font-weight":"bold"}},Ve=e("span",null,"4",-1),Ne=e("label",null,"SigleUnite",-1),Oe=e("span",null,"Le sigle de l’unité du contrat",-1),Ye={style:{"font-weight":"bold"}},Be=e("span",null,"5",-1),ze=e("label",null,"ReferenceGestionnaire",-1),Ge=e("span",null,"La référence du contrat pour la tutelle qui en assure la gestion. Ce numéro ne peut être modifié que par les personnes appartenant à l’organisme gestionnaire.",-1),He=e("span",null,"N° Oscar",-1),Ke={style:{"font-weight":"bold"}},Xe=e("span",null,"6",-1),We=e("label",null,"Equipe",-1),Je=e("span",null,"Le nom de l’équipe concernée par le contrat (ou de la sous-unité)",-1),Qe=e("span",null,"Pas de valeur par défaut",-1),Ze={style:{"font-weight":"bold"}},$e=e("span",null,"7",-1),et=e("label",null,"TypeContrat",-1),tt=e("span",null,"Le type du contrat parmi la liste PCRU ",-1),rt=e("span",null,"Configuration des correspondances entre les types d'activités Oscar et les types de contrat PCRU",-1),it={style:{"font-weight":"bold"}},nt=e("span",null,"8",-1),ut=e("label",null,"Acronyme",-1),at=e("span",null,"L’acronyme du contrat",-1),st=e("span",null,"L'acronyme du projet de l'activité",-1),ot={style:{"font-weight":"bold"}},ct=e("span",null,"9",-1),lt=e("label",null,"ContratsAssocies",-1),pt=e("span",null,"Numéros de tutelle Gestionnaire des contrats associés séparés par une barre verticale (« | »)",-1),ft=e("span",null,"Pas de valeur par défaut",-1),dt={style:{"font-weight":"bold"}},mt=e("span",null,"10",-1),Pt=e("label",null,"NomRespScientifique",-1),ht=e("span",null,"Le nom du Responsable Scientifique",-1),vt={style:{"font-weight":"bold"}},yt=e("span",null,"11",-1),_t=e("label",null,"EmployeurRespScientifique",-1),Dt=e("span",null,"L'employeur du Responsable Scientifique",-1),It=e("span",null,"Pas de valeur par défaut",-1),bt={style:{"font-weight":"bold"}},gt=e("span",null,"12",-1),Et=e("label",null,"RespScientifiqueEstCoordonnateur",-1),St=e("span",null,"Indique si le responsable scientifique est aussi coordinateur du consortium",-1),Lt=e("span",null,"Pas de valeur par défaut",-1),Ct={style:{"font-weight":"bold"}},xt=e("span",null,"13",-1),Rt=e("label",null,"Partenaires",-1),kt=e("span",null,"Ensemble de partenaires du contrat séparés par une barre verticale (« | »)",-1),At={style:{"font-weight":"bold"}},qt=e("span",null,"14",-1),Ut=e("label",null,"PartenairePrincipal",-1),jt=e("span",null,"Le nom du Partenaire Principal",-1),wt={style:{"font-weight":"bold"}},Ft=e("span",null,"15",-1),Mt=e("label",null,"IdPrincipal",-1),Tt=e("span",null,"L'identifiant du Partenaire Principal (Référence du référentiel partenaire ou SIRET ou SIREN ou TVA intracommunautaire ou DUN)",-1),Vt=e("span",null,"Le SIRET ou le numéro de TVA intracommunautaire ou le N°DUNS du partenaire principal",-1),Nt={style:{"font-weight":"bold"}},Ot=e("span",null,"16",-1),Yt=e("label",null,"SourceFinancement",-1),Bt=e("span",null,"Le type de source de financement parmi la liste PCRU",-1),zt=e("span",null,"La source de financement (PCRU) définie sur la page de l'activité",-1),Gt={style:{"font-weight":"bold"}},Ht=e("span",null,"17",-1),Kt=e("label",null,"LieuExecution",-1),Xt=e("span",null,"Le lieu d’exécution de l’unité de recherche",-1),Wt=e("span",null,"Pas de valeur par défaut",-1),Jt={style:{"font-weight":"bold"}},Qt=e("span",null,"18",-1),Zt=e("label",null,"DateDerniereSignature",-1),$t=e("span",null,"La date de dernière signature",-1),er=e("span",null,"La date de signature de la fiche activité",-1),tr={style:{"font-weight":"bold"}},rr=e("span",null,"19",-1),ir=e("label",null,"Duree",-1),nr=e("span",null,"La durée du contrat en mois (minimum 0,5)",-1),ur=e("span",null,"Pas de valeur par défaut",-1),ar={style:{"font-weight":"bold"}},sr=e("span",null,"20",-1),or=e("label",null,"DateDebut",-1),cr=e("span",null,"La date de début du contrat",-1),lr=e("span",null,"La date de début du contrat de la fiche activité",-1),pr={style:{"font-weight":"bold"}},fr=e("span",null,"21",-1),dr=e("label",null,"DateFin",-1),mr=e("span",null,"La date de fin du contrat",-1),Pr=e("span",null,"La date de fin du contrat de la fiche activité",-1),hr={style:{"font-weight":"bold"}},vr=e("span",null,"22",-1),yr=e("label",null,"MontantPercuUnite",-1),_r=e("span",null,"Le montant perçu par l'unité",-1),Dr=e("span",null,"Pas de valeur par défaut",-1),Ir={style:{"font-weight":"bold"}},br=e("span",null,"23",-1),gr=e("label",null,"ContributionFinanceur",-1),Er=e("span",null,"La contribution du financeur du contrat",-1),Sr=e("span",null,"Pas de valeur par défaut",-1),Lr={style:{"font-weight":"bold"}},Cr=e("span",null,"24",-1),xr=e("label",null,"MontantTotal",-1),Rr=e("span",null,"Le montant total du contrat",-1),kr=e("span",null,"Le montant de l'activité",-1),Ar={style:{"font-weight":"bold"}},qr=e("span",null,"25",-1),Ur=e("label",null,"ValidePoleCompetitivite",-1),jr=e("span",null,"Indique si le contrat a été validé par un pôle de compétitivité",-1),wr=e("span",null,`La case "validé par le pôle de compétitivité (PCRU)" définie sur la page de l'activité`,-1),Fr={style:{"font-weight":"bold"}},Mr=e("span",null,"26",-1),Tr=e("label",null,"PoleCompetitivite",-1),Vr=e("span",null,"Le nom du pôle de compétitivité qui a validé le projet parmi la liste PCRU",-1),Nr=e("span",null,"Le pôle de compétitivité (PCRU) défini sur la page de l'activité",-1),Or={style:{"font-weight":"bold"}},Yr=e("span",null,"27",-1),Br=e("label",null,"Commentaire",-1),zr=e("span",null,"Commentaire du gestionnaire de contrat (information à destination des autres tutelles)",-1),Gr=e("span",null,"Pas de valeur par défaut",-1),Hr={style:{"font-weight":"bold"}},Kr=e("span",null,"28",-1),Xr=e("label",null,"Pia",-1),Wr=e("span",null,"Programme Investissement Avenir",-1),Jr=e("span",null,"Pas de valeur par défaut",-1),Qr={style:{"font-weight":"bold"}},Zr=e("span",null,"29",-1),$r=e("label",null,"ReferenceNonGestionnaire",-1),ei=e("span",null,"Votre propre référence désignant ce contrat",-1),ti=e("span",null,"N° Oscar",-1),ri={style:{"font-weight":"bold"}},ii=e("span",null,"30",-1),ni=e("label",null,"AccordCadre",-1),ui=e("span",null,"Accord cadre",-1),ai=e("span",null,"Pas de valeur par défaut",-1),si={style:{"font-weight":"bold"}},oi=e("span",null,"31",-1),ci=e("label",null,"Cifre",-1),li=e("span",null,[l("Contrat d'accompagnement d'une bourse "),e("abbr",{title:"Conventions Industrielles de Formation par la REcherche"},"Cifre")],-1),pi=e("span",null,"Pas de valeur par défaut",-1),fi={style:{"font-weight":"bold"}},di=e("span",null,"32",-1),mi=e("label",null,"ChaireIndustrielle",-1),Pi=e("span",null,"Chaire industrielle",-1),hi=e("span",null,"Pas de valeur par défaut",-1),vi={style:{"font-weight":"bold"}},yi=e("span",null,"33",-1),_i=e("label",null,"PresencePartenaireIndustriel",-1),Di=e("span",null,"Présence d’un partenaire industriel",-1),Ii=e("span",null,"Pas de valeur par défaut",-1),bi={style:{"font-weight":"bold"}},gi={key:13},Ei=e("div",{style:{display:"flex","justify-content":"space-between"}},[e("h2",null,"Données à envoyer à PCRU")],-1),Si={key:0,class:"error",style:{"margin-bottom":"1em"}},Li=I('
Les champs marqués d'une étoile rouge * sont obligatoires. Les champs Durée et Date de Fin sont marqués de deux étoiles rouges ** pour indiquer qu'au moins l'un des 2 champs est obligatoire Si le contrat est validé par un pôle de compétitivité alors le champ PoleCompetitivite marqué de trois étoiles rouges *** est obligatoire