diff --git a/CHANGELOG.md b/CHANGELOG.md index a185239d785e008b7a135ab428c2da566aa48c34..5f8fbbe5e6101f5d1104581af5224161e7be4ec1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tous les changements de ce projet seront documentés dans ce document. ## [Non livré] - Pouvoir charger et lancer un calcul sur les opérations non IT -> [Issue3](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/3) +- Intégrer la durée d'usage amont et aval des équipements physiques & ajout d'un paramètre pour choisir la méthode de calcul de la durée d'usage d'un équipement physique -> [Issue5](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/5) - Pouvoir inclure dans l'évaluation d'impact des informations sur la qualité des données -> [Issue4](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/4) diff --git a/docs/DonneeEntree.plantuml b/docs/DonneeEntree.plantuml index 31f11aef4a526fb91739c26d0fb74d1c15dd6fb4..64ee36e406478db430b8b912da063022600fb289 100644 --- a/docs/DonneeEntree.plantuml +++ b/docs/DonneeEntree.plantuml @@ -18,6 +18,7 @@ List<en_EqP> equipementsPhysiques List<en_DC> dataCenters List<en_Messagerie> messageries List<en_Entite> entites +String dureeUsage } class en_Entite { @@ -58,6 +59,9 @@ String paysDUtilisation String utilisateur Date dateAchat Data dateRetrait +Double dureeUsageInterne +Double dureeUsageAmont +Double dureeUsageAval Double consoElecAnnuelle Float nbJourUtiliseAn Float goTelecharge diff --git a/docs/MoteurDeCalculG4IT_V1.1.adoc b/docs/MoteurDeCalculG4IT_V1.1.adoc index 95ff08188f2a6e65be01c54e39339170733dd267..d993a1b931b412f85cbf165b4e930a9a5f3adb9b 100644 --- a/docs/MoteurDeCalculG4IT_V1.1.adoc +++ b/docs/MoteurDeCalculG4IT_V1.1.adoc @@ -246,6 +246,11 @@ pour obtenir l'objet ref_Hypothese correspondant == Moteur de calcul Le déclenchement des règles présentes dans le Bloc Calcul se réalise à la soumission des calculs sur un lot donné via le endpoint POST /entrees/calculs/soumission. +Il existe 2 paramètres associés à cette requête : + +* mode : le mode de traitement, SYNC ou ASYNC (ASYNC est la valeur par défaut) +* dureeUsage : la méthode de calcul de la durée de vie des équipements physique utilisée, FIXE : la méthode de calcul de la durée de vie se base sur l'attribut 'dureeUsageInterne' de l'équipement physique ou REEL : la méthode de calcul de la durée de vie se base sur l'âge réel de l'équipement physique (dateRetrait-dateAchat) (FIXE est la valeur par défaut) + NumEcoEval lance alors les calculs des indicateurs et les sauvegarde dans la base correspondante. La cinématique globale est décrite ci-dessous : @@ -419,21 +424,34 @@ Elle est exprimée en années et autorise les décimales. [pseudocode] ---- -Règle RG_DureeVieItem(equipementPhysique,dureeVieItem) { - - 'dans le cas où il est possible de calculer l'age réel de l'item, ce dernier fait foi - SI equipementPhysique.DateAchat est correcte et renseignée ET equipementPhysique.DateRetrait est correcte et renseignée +Règle RG_DureeVieItem(equipementPhysique,dureeVieItem,methodeDureeUsage) { + + SI methodeDureeUsage=="REEL" ALORS - SI (equipementPhysique.DateRetrait - equipementPhysique.DateAchat) < 1 - ALORS RENVOYER 1 - SINON RENVOYER ((equipementPhysique.DateRetrait - equipementPhysique.DateAchat) / 365) - 'dans le cas où seul la date d'achat est disponible, la règle du "Pseudo-amortissement" prévaut (impact de 100% sur l'année d'achat, 50% l'année 2, 33% l'année 3, etc... ) - SINON SI equipementPhysique.DateAchat est correcte et equipementPhysique.DateRetrait non reseignée - ALORS RENVOYER ((equipementPhysique.DateAchat - date du jour) / 365) - - 'dans les autres cas, une durée de vie moyenne de l'équipement est déduite + 'dans le cas où il est possible de calculer l'age réel de l'item, ce dernier fait foi + SI equipementPhysique.DateAchat est correcte et renseignée ET equipementPhysique.DateRetrait est correcte et renseignée + ALORS + SI (equipementPhysique.DateRetrait - equipementPhysique.DateAchat) < 1 + ALORS RENVOYER (1 + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SINON RENVOYER (((equipementPhysique.DateRetrait - equipementPhysique.DateAchat) / 365) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + 'dans le cas où seul la date d'achat est disponible, la règle du "Pseudo-amortissement" prévaut (impact de 100% sur l'année d'achat, 50% l'année 2, 33% l'année 3, etc... ) + SINON SI equipementPhysique.DateAchat est correcte et equipementPhysique.DateRetrait non reseignée + ALORS RENVOYER (((equipementPhysique.DateAchat - date du jour) / 365) + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + + 'dans les autres cas, une durée de vie moyenne de l'équipement est déduite + SINON + RENVOYER (RG_DureeVieEqP_Defaut(equipementPhysique)+ equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + FIN SI SINON - RENVOYER RG_DureeVieEqP_Defaut(equipementPhysique) + 'dans le cas où nous connaissons la durée d'usage interne par défaut, cette dernière fait foi + SI equipementPhysique.DureeUsageInterne est renseignée et supérieure à 0 + ALORS + SI (equipementPhysique.DureeUsageInterne<1) + ALORS RENVOYER (1 + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SINON RENVOYER (equipementPhysique.DureeUsageInterne + equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + SINON + RENVOYER (RG_DureeVieEqP_Defaut(equipementPhysique)+ equipementPhysique.DureeUsageAmont + equipementPhysique.DureeUsageAval) + FIN SI FIN SI } diff --git a/docs/Traces.plantuml b/docs/Traces.plantuml index a85ed6426340c60d839ecf1e7f518ff0c5c97e78..b5242f95d7b3a696ba624b9b080c0470e9fba154 100644 --- a/docs/Traces.plantuml +++ b/docs/Traces.plantuml @@ -70,6 +70,10 @@ class ConsoElecAnMoyenne { class DureeDeVie { Double valeur + private String methodeDureeUsage + private Double dureeUsageInterne + private Double dureeUsageAmont + private Double dureeUsageAval String dateAchat String dateRetrait DureeDeVieParDefaut dureeDeVieParDefaut diff --git a/e2e/3_load_input.sh b/e2e/3_load_input.sh index bcbfa86c53d0c8ad3103893c5adeabafd3206bd6..371bde950c46be8748e8dec71d9cc7e0029f5e4a 100644 --- a/e2e/3_load_input.sh +++ b/e2e/3_load_input.sh @@ -4,6 +4,8 @@ ORGANISATION=${1:-org1} NOM_LOT=$2 SCENARIO=${3:-E2E} MODE=${4:-ASYNC} +DUREE_USAGE=${5:-FIXE} + DATE_LOT=$(date +'%Y-%m-%d') . ./.env @@ -22,7 +24,7 @@ curl -s -XPOST "$ENTREE_URL/entrees/csv?nomLot=${NOM_LOT}&dateLot=${DATE_LOT}&no sleep 2 -log_n "$ORGANISATION - $NOM_LOT - $DATE_LOT - Soumission with mode=${MODE} - " | tee -a progress.log +log_n "$ORGANISATION - $NOM_LOT - $DATE_LOT - Soumission with mode=${MODE} & duree usage=${DUREE_USAGE}" | tee -a progress.log -curl -s -XPOST "$ENTREE_URL/entrees/calculs/soumission?mode=$MODE" -d"{\"nomLot\":\"${NOM_LOT}\"}" -H "Content-Type: application/json" | tee -a progress.log +curl -s -XPOST "$ENTREE_URL/entrees/calculs/soumission?dureeUsage=$DUREE_USAGE&mode=$MODE" -d"{\"nomLot\":\"${NOM_LOT}\"}" -H "Content-Type: application/json" | tee -a progress.log echo "" | tee -a progress.log diff --git a/e2e/e2e.iml b/e2e/e2e.iml deleted file mode 100644 index 8021953ed9f8cc6cd6d71c79462bad4cd2b5394c..0000000000000000000000000000000000000000 --- a/e2e/e2e.iml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="WEB_MODULE" version="4"> - <component name="NewModuleRootManager" inherit-compiler-output="true"> - <exclude-output /> - <content url="file://$MODULE_DIR$" /> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> -</module> \ No newline at end of file diff --git a/e2e/input_template/DataCenter.csv b/e2e/input_template/DataCenter.csv index 4a7e92589e6f8aae41f2a8904d6c6f02954169e6..800d506a24bcd2bc83ba31a2dd4c41935185a70b 100644 --- a/e2e/input_template/DataCenter.csv +++ b/e2e/input_template/DataCenter.csv @@ -1,7 +1,7 @@ nomCourtDatacenter;nomLongDatacenter;pue;localisation;nomEntite;qualite default;Default;1.75;France;;Haute B1;B1;1.32;France;;bAsse -F1;F1;1.43;France;;Moyenne +F1;F1;1.43;France;;Moyenne G1;G1;1.45;Spain;;erreur X1;X1;1.42;Russia;; Y1;Y1;1.41;Germany;; diff --git a/e2e/input_template/EquipementPhysique_hors_serveur.csv b/e2e/input_template/EquipementPhysique_hors_serveur.csv index 557e28ba237b87d2ffcce41538579cf83a3919da..65d3d63ad87cb2c8d5f688e1ce2a8214e2d5de00 100644 --- a/e2e/input_template/EquipementPhysique_hors_serveur.csv +++ b/e2e/input_template/EquipementPhysique_hors_serveur.csv @@ -1,101 +1,101 @@ -nomEquipementPhysique;modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;nomSourceDonnee;nomEntite;nbCoeur;nbJourUtiliseAn;goTelecharge;modeUtilisation;tauxUtilisation;qualite -physical-eq-001;P2719;1;;2021-03-30;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;COPE;;Haute -physical-eq-002;P2719;2;;2021-03-30;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;BYOD;;Basse -physical-eq-003;P2719;4;;2021-03-30;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;COB;;Moyenne -physical-eq-004;HUB USB;10;;2023-04-01;2023-06-16;Consumable;Consumed;France;;;;MY ENTERPRISE;;365;;BYOD;0.1;erreur -physical-eq-005;P2720DC;2;;2022-11-04;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;BYOD;12.1;moyenne -physical-eq-006;PIXEL 6;1;;2022-10-18;2023-06-16;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;test;haute -physical-eq-007;UP2516D;1;;2022-07-31;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;0.9;basse -physical-eq-008;UP2516D;2;;2022-03-10;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;COPE;0.6; -physical-eq-009;Unknown;3;;2021-08-09;2023-06-16;IP Router;In use;France;;;;MY ENTERPRISE;;365;;COPE;0; -physical-eq-010;Unknown;3;;2021-08-09;2023-06-16;IP Router;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-011;HP 8440p;1;;2021-08-05;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-012;HP 8440p;1;;2023-04-27;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-013;HP 8470w;2;;2025-08-23;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-014;OPPO A72;1;;2023-08-07;2023-06-16;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-015;CROSSCALL;1;;2022-08-20;2023-06-16;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-016;CROSSCALL;11;;2022-05-20;2023-06-16;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-017;CROSSCALL;8;;2022-05-28;2023-06-16;Communication Device;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-018;HUAWEI P9;11;;2021-01-28;2023-06-16;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-019;HUAWEI P9;4;;2022-08-18;2023-06-16;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-020;HUAWEI P9;1;;2023-06-18;2023-06-16;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-021;HUAWEI P9;32;;2021-01-28;2023-06-16;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-022;HUAWEI P9;9;;2024-08-18;2023-06-16;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-023;PRO MP242;50;;2022-06-21;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-024;SAC A DOS;534;;2023-02-18;2023-06-16;Consumable;Consumed;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-025;SAC A DOS;1;;2023-02-18;2023-06-16;Consumable;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-026;SPIDER X1;2;;2022-10-17;2023-06-16;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-027;DELL 1909W;5;;2022-11-20;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-028;DELL 1909W;1;;2021-12-20;2023-06-16;Monitor;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-029;DELL 1909W;14;;2025-10-17;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-030;DELL 2412M;1;;2022-12-26;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-031;DELL 2717H;19;;2021-04-08;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-032;DELL 2717H;1;;2024-11-23;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-033;DELL E7440;5;;2023-03-19;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-034;DELL E7440;31;;2025-10-27;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-035;DELL E7440;11;;2022-04-24;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-036;DELL E7450;2;;2022-12-21;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-037;DELL E7450;14;;2025-10-31;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-038;DELL E7450;6;;2022-04-22;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-039;DELL E7470;33;;2023-02-11;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-040;DELL E7470;23;;2022-03-16;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-041;DELL E7470;9;;2022-03-16;2023-06-16;Personal Computer;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-042;DELL E7470;4;;2022-03-16;2023-06-16;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-043;DELL E7470;325;;2024-09-01;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-044;DELL E7470;2;;2025-03-03;2023-06-16;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-045;DELL E7480;349;;2022-12-11;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-046;DELL E7480;49;;2021-10-26;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-047;DELL E7480;18;;2021-09-25;2023-06-16;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-048;DELL E7480;141;;2023-11-04;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-049;DELL E7480;70;;2021-09-30;2023-06-16;Personal Computer;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-050;DELL E7480;1;;2025-06-03;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-051;DELL E7490;248;;2022-03-21;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-052;DELL E7490;52;;2021-06-17;2023-06-16;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-053;DELL E7490;421;;2021-06-01;2023-06-16;Personal Computer;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-054;DELL E7490;51;;2021-06-19;2023-06-16;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-055;DELL E7490;6;;2024-04-20;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-056;DELL P1911;8;;2022-07-25;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-057;DELL P1911;6;;2025-01-04;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-058;DELL P1913;4;;2022-11-02;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-059;DELL P1913;2;;2024-04-12;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-060;HUAWEI P20;1;;2021-12-24;2023-06-16;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-061;LENOVO M73;13;;2024-01-25;2023-06-16;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-062;LENOVO M73;13;;2022-01-25;2023-06-16;Personal Computer;In Use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-063;ANTIVOL MAC;1;;2023-01-14;2023-06-16;Consumable;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-064;ANTIVOL MAC;1;;2023-01-14;2023-06-16;Consumable;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-065;ANTIVOL MAC;10;;2023-01-14;2023-06-16;Consumable;Consumed;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-066;AOC U2879VF;10;;2022-11-27;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-067;DELL P2210T;1;;2022-12-29;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-068;DELL P2217H;286;;2021-03-13;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-069;DELL P2217H;1;;2021-03-13;2023-06-16;Monitor;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-070;DELL P2217H;5;;2022-01-14;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-071;DELL P2217H;6;;2021-03-13;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-072;DELL P2217H;3;;2023-10-15;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-073;DELL P2319H;1;;2022-12-19;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-074;DELL P2319H;49;;2022-12-19;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-075;DELL P2412H;1;;2022-03-25;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-076;DELL P2412H;1;;2025-06-01;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-077;DELL P2415Q;7;;2022-03-13;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-078;DELL P2415Q;1;;2022-03-13;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-079;DELL P2417H;371;;2021-03-18;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-080;DELL P2417H;7;;2022-07-16;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-081;DELL P2417H;4;;2024-07-02;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-082;DELL P2417H;5;;2021-03-18;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-083;DELL P2419H;11;;2021-09-01;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-084;DELL P2419H;11;;2022-10-18;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-085;DELL P2419H;847;;2021-09-01;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-086;DELL P2419H;1;;2021-09-01;2023-06-16;Monitor;Missing;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-087;DELL P2419H;32;;2024-05-15;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-088;DELL P2422H;7;;2023-04-23;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-089;DELL P2422H;2;;2023-09-30;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-090;DELL P2422H;588;;2022-09-25;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-091;DELL P2719H;1;;2022-04-04;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-092;DELL P2719H;43;;2021-07-29;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-093;DELL P2719H;2;;2021-07-29;2023-06-16;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-094;DELL P2721Q;2;;2023-02-24;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-095;DELL S2216H;2;;2024-11-27;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-096;DELL S2216H;17;;2021-05-21;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-097;DELL S2216H;1;;2022-11-22;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-098;DELL S2240L;28;;2021-06-26;2023-06-16;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-099;DELL S2240L;8;;2022-12-04;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; -physical-eq-100;DELL S2240L;4;;2024-12-09;2023-06-16;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +nomEquipementPhysique;modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;dureeUsageInterne;dureeUsageAmont;dureeUsageAval;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;nomSourceDonnee;nomEntite;nbCoeur;nbJourUtiliseAn;goTelecharge;modeUtilisation;tauxUtilisation;qualite +physical-eq-001;P2719;1;;2021-03-30;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;COPE;;Haute +physical-eq-002;P2719;2;;;;;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;BYOD;;Basse +physical-eq-003;P2719;4;;2021-03-30;2023-06-16;0.0;0.0;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;COB;;Moyenne +physical-eq-004;HUB USB;10;;2023-04-01;2023-06-16;0.5;0.5;2;Consumable;Consumed;France;;;;MY ENTERPRISE;;365;;BYOD;0.1;erreur +physical-eq-005;P2720DC;2;;2022-11-04;2023-06-16;-4.5;-1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;BYOD;12.1;moyenne +physical-eq-006;PIXEL 6;1;;2022-10-18;2022-12-18;0.1;0.2;0.2;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;test;haute +physical-eq-007;UP2516D;1;;2022-07-31;2023-06-16;4.5;;;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;0.9;basse +physical-eq-008;UP2516D;2;;2022-03-10;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;COPE;0.6; +physical-eq-009;Unknown;3;;2021-08-09;2023-06-16;4.5;1;2;IP Router;In use;France;;;;MY ENTERPRISE;;365;;COPE;0; +physical-eq-010;Unknown;3;;2021-08-09;2023-06-16;4.5;1;2;IP Router;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-011;HP 8440p;1;;2021-08-05;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-012;HP 8440p;1;;2023-04-27;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-013;HP 8470w;2;;2025-08-23;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-014;OPPO A72;1;;2023-08-07;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-015;CROSSCALL;1;;2022-08-20;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-016;CROSSCALL;11;;2022-05-20;2023-06-16;4.5;1;2;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-017;CROSSCALL;8;;2022-05-28;2023-06-16;4.5;1;2;Communication Device;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-018;HUAWEI P9;11;;2021-01-28;2023-06-16;4.5;1;2;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-019;HUAWEI P9;4;;2022-08-18;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-020;HUAWEI P9;1;;2023-06-18;2023-06-16;4.5;1;2;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-021;HUAWEI P9;32;;2021-01-28;2023-06-16;4.5;1;2;Communication Device;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-022;HUAWEI P9;9;;2024-08-18;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-023;PRO MP242;50;;2022-06-21;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-024;SAC A DOS;534;;2023-02-18;2023-06-16;4.5;1;2;Consumable;Consumed;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-025;SAC A DOS;1;;2023-02-18;2023-06-16;4.5;1;2;Consumable;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-026;SPIDER X1;2;;2022-10-17;2023-06-16;4.5;1;2;Communication Device;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-027;DELL 1909W;5;;2022-11-20;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-028;DELL 1909W;1;;2021-12-20;2023-06-16;4.5;1;2;Monitor;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-029;DELL 1909W;14;;2025-10-17;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-030;DELL 2412M;1;;2022-12-26;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-031;DELL 2717H;19;;2021-04-08;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-032;DELL 2717H;1;;2024-11-23;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-033;DELL E7440;5;;2023-03-19;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-034;DELL E7440;31;;2025-10-27;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-035;DELL E7440;11;;2022-04-24;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-036;DELL E7450;2;;2022-12-21;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-037;DELL E7450;14;;2025-10-31;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-038;DELL E7450;6;;2022-04-22;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-039;DELL E7470;33;;2023-02-11;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-040;DELL E7470;23;;2022-03-16;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-041;DELL E7470;9;;2022-03-16;2023-06-16;4.5;1;2;Personal Computer;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-042;DELL E7470;4;;2022-03-16;2023-06-16;4.5;1;2;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-043;DELL E7470;325;;2024-09-01;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-044;DELL E7470;2;;2025-03-03;2023-06-16;4.5;1;2;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-045;DELL E7480;349;;2022-12-11;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-046;DELL E7480;49;;2021-10-26;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-047;DELL E7480;18;;2021-09-25;2023-06-16;4.5;1;2;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-048;DELL E7480;141;;2023-11-04;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-049;DELL E7480;70;;2021-09-30;2023-06-16;4.5;1;2;Personal Computer;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-050;DELL E7480;1;;2025-06-03;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-051;DELL E7490;248;;2022-03-21;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-052;DELL E7490;52;;2021-06-17;2023-06-16;4.5;1;2;Personal Computer;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-053;DELL E7490;421;;2021-06-01;2023-06-16;4.5;1;2;Personal Computer;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-054;DELL E7490;51;;2021-06-19;2023-06-16;4.5;1;2;Personal Computer;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-055;DELL E7490;6;;2024-04-20;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-056;DELL P1911;8;;2022-07-25;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-057;DELL P1911;6;;2025-01-04;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-058;DELL P1913;4;;2022-11-02;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-059;DELL P1913;2;;2024-04-12;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-060;HUAWEI P20;1;;2021-12-24;2023-06-16;4.5;1;2;Communication Device;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-061;LENOVO M73;13;;2024-01-25;2023-06-16;4.5;1;2;Personal Computer;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-062;LENOVO M73;13;;2022-01-25;2023-06-16;4.5;1;2;Personal Computer;In Use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-063;ANTIVOL MAC;1;;2023-01-14;2023-06-16;4.5;1;2;Consumable;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-064;ANTIVOL MAC;1;;2023-01-14;2023-06-16;4.5;1;2;Consumable;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-065;ANTIVOL MAC;10;;2023-01-14;2023-06-16;4.5;1;2;Consumable;Consumed;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-066;AOC U2879VF;10;;2022-11-27;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-067;DELL P2210T;1;;2022-12-29;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-068;DELL P2217H;286;;2021-03-13;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-069;DELL P2217H;1;;2021-03-13;2023-06-16;4.5;1;2;Monitor;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-070;DELL P2217H;5;;2022-01-14;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-071;DELL P2217H;6;;2021-03-13;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-072;DELL P2217H;3;;2023-10-15;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-073;DELL P2319H;1;;2022-12-19;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-074;DELL P2319H;49;;2022-12-19;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-075;DELL P2412H;1;;2022-03-25;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-076;DELL P2412H;1;;2025-06-01;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-077;DELL P2415Q;7;;2022-03-13;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-078;DELL P2415Q;1;;2022-03-13;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-079;DELL P2417H;371;;2021-03-18;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-080;DELL P2417H;7;;2022-07-16;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-081;DELL P2417H;4;;2024-07-02;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-082;DELL P2417H;5;;2021-03-18;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-083;DELL P2419H;11;;2021-09-01;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-084;DELL P2419H;11;;2022-10-18;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-085;DELL P2419H;847;;2021-09-01;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-086;DELL P2419H;1;;2021-09-01;2023-06-16;4.5;1;2;Monitor;Missing;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-087;DELL P2419H;32;;2024-05-15;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-088;DELL P2422H;7;;2023-04-23;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-089;DELL P2422H;2;;2023-09-30;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-090;DELL P2422H;588;;2022-09-25;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-091;DELL P2719H;1;;2022-04-04;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-092;DELL P2719H;43;;2021-07-29;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-093;DELL P2719H;2;;2021-07-29;2023-06-16;4.5;1;2;Monitor;In stock;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-094;DELL P2721Q;2;;2023-02-24;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-095;DELL S2216H;2;;2024-11-27;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-096;DELL S2216H;17;;2021-05-21;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-097;DELL S2216H;1;;2022-11-22;2023-06-16;4.5;1;2;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-098;DELL S2240L;28;;2021-06-26;2023-06-16;4.5;1;2;Monitor;In use;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-099;DELL S2240L;8;;2022-12-04;2023-06-16;4.5;;;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; +physical-eq-100;DELL S2240L;4;;2024-12-09;2023-06-16;4.5;;;Monitor;Retired;France;;;;MY ENTERPRISE;;365;;;; diff --git a/e2e/input_template/EquipementPhysique_serveur.csv b/e2e/input_template/EquipementPhysique_serveur.csv index 2c2e6f318e80468f2c2884c20ac00e36330c9af4..f444c0b5f7f3f568dc9b6d5101db923e8928bb4b 100644 --- a/e2e/input_template/EquipementPhysique_serveur.csv +++ b/e2e/input_template/EquipementPhysique_serveur.csv @@ -1,101 +1,101 @@ -nomEquipementPhysique;modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;nomSourceDonnee;nomEntite;nbCoeur;nbJourUtiliseAn;goTelecharge;modeUtilisation;tauxUtilisation;qualite -physical-eq-srv-001;blade-server--28;7;default;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;;Haute -physical-eq-srv-002;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;10;;;Basse -physical-eq-srv-003;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;20;;;Moyenne -physical-eq-srv-004;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;30;;;erreur -physical-eq-srv-005;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;40;;; -physical-eq-srv-006;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;50;;; -physical-eq-srv-007;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-008;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-009;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-010;DATACENTER;2;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-011;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-012;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-013;DATACENTER;1;F1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-014;DATACENTER;1;G1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-015;DATACENTER;1;G1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-016;DATACENTER;1;G1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-017;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-018;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-019;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-020;DATACENTER;8;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-021;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-022;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-023;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-024;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-025;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-026;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-027;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-028;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-029;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-030;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-031;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-032;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-033;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-034;DATACENTER;1;X1;2016-06-17;2023-06-16;Server;In use;;;;;;;365;;;; -physical-eq-srv-035;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-036;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-037;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-038;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-039;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-040;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-041;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-042;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-043;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-044;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-045;DATACENTER;26;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-046;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-047;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-048;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-049;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-050;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-051;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-052;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-053;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-054;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-055;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-056;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-057;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-058;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-059;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-060;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-061;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-062;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-063;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-064;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-065;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-066;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-067;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-068;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-069;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-070;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-071;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-072;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-073;DATACENTER;1;Y1;2016-06-17;2023-06-16;Server;In use;Germany;;;;;;365;;;; -physical-eq-srv-074;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-075;DATACENTER;122;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-076;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-077;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-078;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-079;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-080;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-081;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-082;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-083;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-084;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-085;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-086;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-087;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-088;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-089;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-090;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-091;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-092;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-093;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-094;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-095;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-096;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-097;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-098;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-099;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; -physical-eq-srv-100;DATACENTER;1;Z2;2016-06-17;2023-06-16;Server;In use;France;;;;;;365;;;; +nomEquipementPhysique;modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;dureeUsageInterne;dureeUsageAmont;dureeUsageAval;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;nomSourceDonnee;nomEntite;nbCoeur;nbJourUtiliseAn;goTelecharge;modeUtilisation;tauxUtilisation;qualite +physical-eq-srv-001;blade-server--28;7;default;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;;Haute +physical-eq-srv-002;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;10;;;Basse +physical-eq-srv-003;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;20;;;Moyenne +physical-eq-srv-004;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;30;;;erreur +physical-eq-srv-005;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;40;;; +physical-eq-srv-006;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;50;;; +physical-eq-srv-007;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-008;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-009;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-010;DATACENTER;2;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-011;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-012;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-013;DATACENTER;1;F1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-014;DATACENTER;1;G1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-015;DATACENTER;1;G1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-016;DATACENTER;1;G1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-017;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-018;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-019;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-020;DATACENTER;8;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-021;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-022;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-023;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-024;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-025;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-026;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-027;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-028;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-029;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-030;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-031;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-032;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-033;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-034;DATACENTER;1;X1;2016-06-17;2023-06-16;5;1;2;Server;In use;;;;;;;365;;;; +physical-eq-srv-035;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-036;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-037;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-038;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-039;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-040;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-041;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-042;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-043;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-044;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-045;DATACENTER;26;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-046;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-047;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-048;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-049;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-050;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-051;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-052;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-053;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-054;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-055;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-056;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-057;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-058;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-059;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-060;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-061;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-062;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-063;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-064;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-065;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-066;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-067;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-068;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-069;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-070;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-071;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-072;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-073;DATACENTER;1;Y1;2016-06-17;2023-06-16;5;1;2;Server;In use;Germany;;;;;;365;;;; +physical-eq-srv-074;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-075;DATACENTER;122;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-076;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-077;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-078;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-079;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-080;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-081;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-082;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-083;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-084;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-085;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-086;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-087;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-088;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-089;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-090;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-091;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-092;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-093;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-094;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-095;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-096;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-097;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-098;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-099;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; +physical-eq-srv-100;DATACENTER;1;Z2;2016-06-17;2023-06-16;5;1;2;Server;In use;France;;;;;;365;;;; diff --git a/e2e/input_template/OperationNonIT.csv b/e2e/input_template/OperationNonIT.csv index 1cee0eb07142c07c99505b3fae6317475006ec3d..9c9c6c5cb62533703dd1053e31a89e6eedc50e1f 100644 --- a/e2e/input_template/OperationNonIT.csv +++ b/e2e/input_template/OperationNonIT.csv @@ -1,5 +1,5 @@ nomItemNonIT;quantite;type;dureeDeVie;localisation;nomEntite;nomSourceDonnee;nomCourtDatacenter;description;consoElecAnnuelle;qualite -reseau-fixe-1;100.0;Fixed Line FR ;;France;SSG;sourceTest;;description;;moyenne +reseau-fixe-1;100.0;Fixed Line FR;;France;SSG;sourceTest;;description;;moyenne reseau-fixe-2;20.0;Fixed Line EU;;Hungary;Entite;sourceTest2;;description;;haUte reseau-fixe-error;20.0;Fixed Line;;Hungary;Entite;sourceTest2;;description;; reseau-mobile-1;445.0;Mobile Line;;France;EntiteTest;sourceTest3;;description;;erreur diff --git a/e2e/performance-test.sh b/e2e/performance-test.sh index 31a9b4a426a901a2b1026928d344cb732a3d6528..0259dca4dfe0e47f13ad731be2ea62daa80aab66 100644 --- a/e2e/performance-test.sh +++ b/e2e/performance-test.sh @@ -1,12 +1,13 @@ #!/bin/bash # Call: sh performance-test.sh -# Call: sh performance-test.sh E2E auto auto SYNC -# Call: sh performance-test.sh 1 orgX perf ASYNC +# Call: sh performance-test.sh E2E auto auto SYNC REEL +# Call: sh performance-test.sh 1 orgX perf ASYNC FIXE SCENARIO=${1:-E2E} ORGANISATION=${2:-auto} LOT_PREFIX=${3:-auto} MODE=${4:-SYNC} +DUREE_USAGE=${5:-FIXE} . ./.env @@ -42,7 +43,7 @@ for nbIt in ${!cfg_scenario}; do for ((j = 1; j <= $nbIt; j++)); do ### For each iteration load input, submit calculations and check ### echo "*** Organisation: $ORGANISATION, NomLot: ${LOT_PREFIX}_${dataset}_${j} ***" - sh 3_load_input.sh $ORGANISATION ${LOT_PREFIX}_${dataset}_${j} $SCENARIO $MODE + sh 3_load_input.sh $ORGANISATION ${LOT_PREFIX}_${dataset}_${j} $SCENARIO $MODE $DUREE_USAGE start_it=$(date +%s) sh 4_check.sh $ORGANISATION ${LOT_PREFIX}_${dataset}_${j} end_it=$(date +%s) diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java index 16e83d1ad4b0f1dd0fb23068c444a44871a39643..5e182885f8c098c5c3518af9908a90cec1b208c9 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java @@ -31,6 +31,7 @@ public class CacheConfig { "MixElectrique", "ImpactOperationNonIT", "ImpactMessagerie", + "DureeUsage", }, allEntries = true) @Scheduled(fixedRateString = "${numecoeval.cache.ttl}", timeUnit = TimeUnit.MINUTES) public void emptyAllCaches() { diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..d23d6cdd462b80a38913537cc472d92cc74a64ca --- /dev/null +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java @@ -0,0 +1,48 @@ +package org.mte.numecoeval.calculs.infrastructure.repository; + +import lombok.extern.slf4j.Slf4j; +import org.mte.numecoeval.calculs.domain.exception.DatabaseException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@Component +@Slf4j +public class DonneesEntreeRepository { + + @Autowired + private DataSource dataSource; + + @Cacheable("DureeUsage") + public String findDureeUsage(String nomLot, String nomOrganisation) { + List<String> result = new ArrayList<>(); + try (Connection conn = dataSource.getConnection()) { + try (var ps = conn.prepareStatement(""" + SELECT duree_usage + FROM en_donnees_entrees + WHERE nom_lot = ? AND nom_organisation= ? + """)) { + + ps.setString(1, nomLot); + ps.setString(2, nomOrganisation); + var rs = ps.executeQuery(); + while (rs.next()) { + result.add(rs.getString("duree_usage")); + } + } + } catch (SQLException e) { + log.error("Une erreur s'est produite lors de la selection dans PostgreSQL. Exception: ", e); + throw new DatabaseException(e); + } + if (result.isEmpty()) { + return null; + } + return result.getFirst(); + } +} diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/EquipementPhysiqueRepository.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/EquipementPhysiqueRepository.java index d29cb38093de47dce267cbf5a05c69ee7a6d45a7..af9a3e6ea70e99703142601ad741b108d8aa2baa 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/EquipementPhysiqueRepository.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/EquipementPhysiqueRepository.java @@ -56,6 +56,9 @@ public class EquipementPhysiqueRepository { .consoElecAnnuelle(ResultSetUtils.getDouble(rs, "conso_elec_annuelle")) .dateAchat(ResultSetUtils.getLocalDate(rs, "date_achat")) .dateRetrait(ResultSetUtils.getLocalDate(rs, "date_retrait")) + .dureeUsageInterne(ResultSetUtils.getDouble(rs, "duree_usage_interne")) + .dureeUsageAmont(ResultSetUtils.getDouble(rs, "duree_usage_amont")) + .dureeUsageAval(ResultSetUtils.getDouble(rs, "duree_usage_aval")) .goTelecharge(ResultSetUtils.getFloat(rs, "go_telecharge")) .modele(rs.getString("modele")) .nbCoeur(rs.getString("nb_coeur")) diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java index ee3e0b4b7ca536e8de721301eead3d703323a7a1..c1102a25bd9ea128a501996ab3316cf561e5908c 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/service/calcul/CalculEquipementPhysiqueService.java @@ -2,11 +2,13 @@ package org.mte.numecoeval.calculs.infrastructure.service.calcul; import lombok.AllArgsConstructor; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; +import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.model.CalculEquipementPhysique; import org.mte.numecoeval.calculs.domain.port.input.service.CalculImpactEquipementPhysiqueService; import org.mte.numecoeval.calculs.infrastructure.mapper.EntreesMapper; import org.mte.numecoeval.calculs.infrastructure.mapper.ReferentielMapper; +import org.mte.numecoeval.calculs.infrastructure.repository.DonneesEntreeRepository; import org.mte.numecoeval.calculs.referentiels.generated.api.model.CritereDTO; import org.mte.numecoeval.calculs.referentiels.generated.api.model.EtapeDTO; import org.springframework.stereotype.Service; @@ -25,6 +27,8 @@ public class CalculEquipementPhysiqueService { CalculImpactEquipementPhysiqueService calculImpactEquipementPhysiqueService; + DonneesEntreeRepository donneesEntreeRepository; + /** * Calcule les impacts d'un equipement physique * Returne la liste d'impacts en iterant par (etape, critere) @@ -37,6 +41,7 @@ public class CalculEquipementPhysiqueService { LocalDateTime dateCalcul = LocalDateTime.now(); List<ImpactEquipementPhysique> impactEquipementPhysiqueList = new ArrayList<>(); + String dureeUsage = donneesEntreeRepository.findDureeUsage(calculEquipementPhysique.getEquipementPhysique().getNomLot(), calculEquipementPhysique.getEquipementPhysique().getNomOrganisation()); for (EtapeDTO etapeDTO : calculEquipementPhysique.getEtapes()) { for (CritereDTO critereDTO : calculEquipementPhysique.getCriteres()) { @@ -51,6 +56,7 @@ public class CalculEquipementPhysiqueService { .hypotheses(referentielMapper.toListHypothese(calculEquipementPhysique.getHypotheses())) .mixElectriques(referentielMapper.toListMixElectrique(calculEquipementPhysique.getMixElectriques())) .impactEquipements(referentielMapper.toListImpactEquipement(calculEquipementPhysique.getImpactsEquipement())) + .optionsCalcul(new OptionsCalcul(dureeUsage)) .build(); impactEquipementPhysiqueList.add( diff --git a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java index 9c4949fd14d524a72e63c6ba0ef7aba2f6124de7..4310c44079d6a92dd53ad178ec7b3f46bb86bfab 100644 --- a/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java +++ b/services/api-event-calculs/src/test/java/org/mte/numecoeval/calculs/ApiEventCalculsApplicationTests.java @@ -54,6 +54,8 @@ class ApiEventCalculsApplicationTests { @MockBean ApplicationRepository applicationRepository; @MockBean + DonneesEntreeRepository donneesEntreeRepository; + @MockBean MessagerieRepository messagerieRepository; @MockBean DataSource dataSource; diff --git a/services/api-event-donneesentrees/src/main/java/org/mte/numecoeval/donneesentrees/infrastructure/config/EquipementPhysiqueIntegrationConfig.java b/services/api-event-donneesentrees/src/main/java/org/mte/numecoeval/donneesentrees/infrastructure/config/EquipementPhysiqueIntegrationConfig.java index 392f44f6d7dcd24f0f814b2d11e53e07a3881332..b85346829c63b87f4b519f9335e4d289e4931408 100644 --- a/services/api-event-donneesentrees/src/main/java/org/mte/numecoeval/donneesentrees/infrastructure/config/EquipementPhysiqueIntegrationConfig.java +++ b/services/api-event-donneesentrees/src/main/java/org/mte/numecoeval/donneesentrees/infrastructure/config/EquipementPhysiqueIntegrationConfig.java @@ -118,6 +118,9 @@ public class EquipementPhysiqueIntegrationConfig { .consoElecAnnuelle(ResultSetUtils.getDouble(rs, "conso_elec_annuelle")) .dateAchat(ResultSetUtils.getLocalDate(rs, "date_achat")) .dateRetrait(ResultSetUtils.getLocalDate(rs, "date_retrait")) + .dureeUsageInterne(ResultSetUtils.getDouble(rs, "duree_usage_interne")) + .dureeUsageAmont(ResultSetUtils.getDouble(rs, "duree_usage_amont")) + .dureeUsageAval(ResultSetUtils.getDouble(rs, "duree_usage_aval")) .goTelecharge(ResultSetUtils.getFloat(rs, "go_telecharge")) .modele(rs.getString("modele")) .nbCoeur(rs.getString("nb_coeur")) diff --git a/services/api-event-donneesentrees/src/test/resources/sql/equipment_physique.sql b/services/api-event-donneesentrees/src/test/resources/sql/equipment_physique.sql index b100c694c5c9ea1d0d242a329c6f6abb2637412e..8340ef882de7ec7a6990c4dc684e01f1ff63cc75 100644 --- a/services/api-event-donneesentrees/src/test/resources/sql/equipment_physique.sql +++ b/services/api-event-donneesentrees/src/test/resources/sql/equipment_physique.sql @@ -4,11 +4,11 @@ VALUES (6002, '2023-03-08 19:45:39.484539', 'ENTITE|2022-01-01', '2022-01-01', ' 'EN_ATTENTE', NULL, 'SOURCE_A'); INSERT INTO en_equipement_physique (id, date_creation, nom_lot, date_lot, nom_organisation, conso_elec_annuelle, - date_achat, date_retrait, duree_vie_defaut, go_telecharge, modele, nb_coeur, mode_utilisation, taux_utilisation, + date_achat, date_retrait, duree_vie_defaut, duree_usage_interne, duree_usage_amont, duree_usage_aval, go_telecharge, modele, nb_coeur, mode_utilisation, taux_utilisation, nb_jour_utilise_an, nom_court_datacenter, nom_entite, nom_equipement_physique, pays_utilisation, quantite, serveur, statut, "type", utilisateur, statut_traitement, date_update, nom_source_donnee, qualite) -VALUES (376826, '2023-03-23 15:53:51.179031', 'ENTITE|2022-01-01', '2022-01-01', 'ENTITE', NULL, '2022-01-01', NULL, 8.0, 0.0, +VALUES (376826, '2023-03-23 15:53:51.179031', 'ENTITE|2022-01-01', '2022-01-01', 'ENTITE', NULL, '2022-01-01', NULL, 8.0, 5.0, 1.0, 2.0, 0.0, 'computer monitor-01-55', '','BYOD',0.4, 365.0, '', 'ENTITE', '2023-03-09-Ecran-105', 'France', 13.0, false, 'actif', 'Ecran', '', 'EN_ATTENTE', NULL, 'SOURCE_A','HAUTE'); diff --git a/services/api-event-donneesentrees/src/test/resources/sql/schema.sql b/services/api-event-donneesentrees/src/test/resources/sql/schema.sql index 27d5cb5e969c94baafac6f9ad0277622b8a928b7..02c3eb7151d756b3d0a455b48062e37094a961bc 100644 --- a/services/api-event-donneesentrees/src/test/resources/sql/schema.sql +++ b/services/api-event-donneesentrees/src/test/resources/sql/schema.sql @@ -45,6 +45,9 @@ CREATE TABLE IF NOT EXISTS en_equipement_physique date_achat date NULL, date_retrait date NULL, duree_vie_defaut float8 NULL, + duree_usage_interne float8 NULL, + duree_usage_amont float8 NULL, + duree_usage_aval float8 NULL, go_telecharge float4 NULL, modele varchar(255) NULL, nb_coeur varchar(255) NULL, diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DonneesEntree.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DonneesEntree.java index bf79f1b0814cd1de0355fb2252d826f0a91e65e6..ddfeaa4281d4d55dea460ba4d575ae876c5fc2b2 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DonneesEntree.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/DonneesEntree.java @@ -29,4 +29,5 @@ public class DonneesEntree extends AbstractEntree { List<OperationNonIT> operationsNonIT = new ArrayList<>(); + String dureeUsage; } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/EquipementPhysique.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/EquipementPhysique.java index a596d24fcf043399757b782b99fb1077e4be018f..784dcb39abd443f6139449637fd6c9956a511687 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/EquipementPhysique.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/model/EquipementPhysique.java @@ -24,6 +24,9 @@ public class EquipementPhysique extends AbstractEntree { String utilisateur; LocalDate dateAchat; LocalDate dateRetrait; + Double dureeUsageInterne; + Double dureeUsageAmont; + Double dureeUsageAval; String nbCoeur; String nomCourtDatacenter; Double nbJourUtiliseAn; diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java index 62757fb834c7187fb77c6326305d2fde41bfbe31..b53d99b3bc43bd40cbc8d585f767f0d952ea3c41 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/ImportDonneesEntreePort.java @@ -14,7 +14,7 @@ import java.util.List; @SuppressWarnings("java:S107") // Obligatoire à cause de la gestion des fichiers différents au niveau contrat d'interface public interface ImportDonneesEntreePort { - String EQUIPEMENT_PHYSIQUE_CSV_HEADER = "modele;quantite;nomEquipementPhysique;type;statut;paysDUtilisation;utilisateur;dateAchat;dateRetrait;nbCoeur;nomCourtDatacenter;goTelecharge;nbJourUtiliseAn;consoElecAnnuelle"; + String EQUIPEMENT_PHYSIQUE_CSV_HEADER = "modele;quantite;nomEquipementPhysique;type;statut;paysDUtilisation;utilisateur;nbCoeur;nomCourtDatacenter;goTelecharge;nbJourUtiliseAn;consoElecAnnuelle"; String CSV_SEPARATOR = ";"; String DATA_CENTER_CSV_HEADER = "nomCourtDatacenter;nomLongDatacenter;pue;localisation"; String EQUIPEMENT_VIRTUEL_CSV_HEADER = "nomEquipementPhysique;vCPU;cluster"; diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java index ef9066ef7e5877092c62660817f8621919b2ec94..e213130d37706c222710d104c1d204f48a77c577 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/domain/ports/input/impl/ImportDonneesEntreePortImpl.java @@ -219,6 +219,12 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { } else { var goTelechargeStr = CSVHelper.safeString(csvRecord, "goTelecharge"); Float goTelecharge = goTelechargeStr == null ? null : NumberUtils.toFloat(goTelechargeStr); + var dureeUsageInterneStr = CSVHelper.safeString(csvRecord, "dureeUsageInterne"); + Double dureeUsageInterne = NumberUtils.isCreatable(dureeUsageInterneStr) ? NumberUtils.toDouble(dureeUsageInterneStr) : null; + var dureeUsageAmontStr = CSVHelper.safeString(csvRecord, "dureeUsageAmont"); + Double dureeUsageAmont = dureeUsageAmontStr == null ? 0 : NumberUtils.toDouble(dureeUsageAmontStr); + var dureeUsageAvalStr = CSVHelper.safeString(csvRecord, "dureeUsageAval"); + Double dureeUsageAval = dureeUsageAvalStr == null ? 0 : NumberUtils.toDouble(dureeUsageAvalStr); var tauxUtilisationStr = CSVHelper.safeString(csvRecord, "tauxUtilisation"); Double tauxUtilisation = NumberUtils.isCreatable(tauxUtilisationStr) ? NumberUtils.toDouble(tauxUtilisationStr) : null; String nomEquipementPhysique = CSVHelper.safeString(csvRecord, LABEL_NOM_EQUIPEMENT_PHYSIQUE, "equipement"); @@ -246,6 +252,9 @@ public class ImportDonneesEntreePortImpl implements ImportDonneesEntreePort { .utilisateur(CSVHelper.safeString(csvRecord, "utilisateur")) .dateAchat(CSVHelper.safeParseLocalDate(csvRecord, "dateAchat")) .dateRetrait(CSVHelper.safeParseLocalDate(csvRecord, "dateRetrait")) + .dureeUsageInterne(dureeUsageInterne) + .dureeUsageAmont(dureeUsageAmont) + .dureeUsageAval(dureeUsageAval) .nbCoeur(CSVHelper.safeString(csvRecord, "nbCoeur")) .nomCourtDatacenter(CSVHelper.safeString(csvRecord, "nomCourtDatacenter", "refDatacenter")) .goTelecharge(goTelecharge) diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java index 9727613edf8d5d5f6917e951b15272f2b2aa5adc..aea43dca0a4e592315a3650ad316dbcf5c99a91d 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java @@ -1,30 +1,34 @@ package org.mte.numecoeval.expositiondonneesentrees.infrastructure.controller; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.SoumissionCalculPort; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.SoumissionCalculSyncPort; import org.mte.numecoeval.expositiondonneesentrees.domain.ports.input.StatutPourCalculPort; -import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.DemandeCalculRest; -import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.ModeRest; -import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.RapportDemandeCalculRest; -import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.StatutCalculRest; +import org.mte.numecoeval.expositiondonneesentrees.generated.api.model.*; import org.mte.numecoeval.expositiondonneesentrees.generated.api.server.CalculsApi; +import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.repository.DonneesEntreesRepository; import org.mte.numecoeval.expositiondonneesentrees.infrastructure.mapper.CalculRestMapper; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @RestController -@AllArgsConstructor @Slf4j +@RequiredArgsConstructor public class CalculController implements CalculsApi { - CalculRestMapper calculRestMapper; + @Value("${regle-par-defaut-duree-usage}") + private String defaultDureeUsage; - SoumissionCalculPort soumissionCalculPort; + final CalculRestMapper calculRestMapper; - SoumissionCalculSyncPort soumissionCalculSyncPort; - StatutPourCalculPort statutPourCalculPort; + final SoumissionCalculPort soumissionCalculPort; + + final SoumissionCalculSyncPort soumissionCalculSyncPort; + final StatutPourCalculPort statutPourCalculPort; + + final DonneesEntreesRepository donneesEntreesRepository; @Override public ResponseEntity<StatutCalculRest> statutPourCalcul(String nomLot, String nomOrganisation) { @@ -34,9 +38,16 @@ public class CalculController implements CalculsApi { } @Override - public ResponseEntity<RapportDemandeCalculRest> soumissionPourCalcul(DemandeCalculRest demandeCalculRest, ModeRest mode) { - log.info("Soumission de calcul pour nom_lot: {}, mode: {}", demandeCalculRest.getNomLot(), mode); + public ResponseEntity<RapportDemandeCalculRest> soumissionPourCalcul(DemandeCalculRest demandeCalculRest, DureeUsage dureeUsage, ModeRest mode) { + + var modeDureeUsage = dureeUsage == null ? DureeUsage.fromValue(defaultDureeUsage) : dureeUsage; + if (DureeUsage.REEL != modeDureeUsage) { + modeDureeUsage = DureeUsage.FIXE; + } + + log.info("Soumission de calcul pour nom_lot: {}, dureeUsage: {}, mode: {}", demandeCalculRest.getNomLot(), modeDureeUsage, mode); var demandeCalcul = calculRestMapper.toDomain(demandeCalculRest); + donneesEntreesRepository.updateDonneesEntreesDureeUsage(String.valueOf(modeDureeUsage), demandeCalculRest.getNomLot()); var soumission = ModeRest.ASYNC == mode ? soumissionCalculPort.soumissionCalcul(demandeCalcul) : diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java index 277304f7f6a6c0f1059c6b3399745c544b8371d2..bd22d5dcc795f261b2a96884559b1fde25c64c9e 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/DonneesEntreesEntity.java @@ -1,12 +1,6 @@ package org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.entity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.SequenceGenerator; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -55,4 +49,9 @@ public class DonneesEntreesEntity extends AbstractEntreeEntity { */ private Long nbrMessageries; + /** + * Méthode de calcul de la durée d'usage des équipements physique + */ + private String dureeUsage; + } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/EquipementPhysiqueEntity.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/EquipementPhysiqueEntity.java index addeb447fc0906fcc250fa7927ca9048d5338371..fb4a9d7f5fd1ed6b2b5cdfb20d7e68e81a8a87e6 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/EquipementPhysiqueEntity.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/entity/EquipementPhysiqueEntity.java @@ -34,6 +34,9 @@ public class EquipementPhysiqueEntity extends AbstractEntreeEntity { private String utilisateur; private LocalDate dateAchat; private LocalDate dateRetrait; + private Double dureeUsageInterne; + private Double dureeUsageAmont; + private Double dureeUsageAval; private String nbCoeur; private String nomCourtDatacenter; private Double nbJourUtiliseAn; diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java index 1e08aeec5893cd6b4fe86fa8c14f8e18e23060ee..053371f23dee9ad46d4315f7c7b2b8c07488183a 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/jpa/repository/DonneesEntreesRepository.java @@ -2,9 +2,23 @@ package org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.repositor import org.mte.numecoeval.expositiondonneesentrees.infrastructure.jpa.entity.DonneesEntreesEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; @Repository -public interface DonneesEntreesRepository extends JpaRepository<DonneesEntreesEntity,Long> -{ +public interface DonneesEntreesRepository extends JpaRepository<DonneesEntreesEntity, Long> { + @Transactional + @Modifying + @Query(""" + UPDATE DonneesEntreesEntity dee + SET dee.dureeUsage = :dureeUsage + WHERE dee.nomLot = :nomLot + """) + int updateDonneesEntreesDureeUsage( + @Param("dureeUsage") String dureeUsage, + @Param("nomLot") String nomLot + ); } diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java index 7d2a97d670fcd3e25ab03378bd201bf810d1cddd..77b3e69679feabf969710e994beee95fa5d1afaa 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DefaultValueService.java @@ -23,7 +23,6 @@ public class DefaultValueService { if (equipementPhysique.getModeUtilisation() != null && !modeUtilisationList.contains(equipementPhysique.getModeUtilisation())) { equipementPhysique.setModeUtilisation(null); } - Double taux = equipementPhysique.getTauxUtilisation(); if (taux != null && (taux < 0 || taux > 1)) { equipementPhysique.setTauxUtilisation(null); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java index 4d499bb487af8c5ee1e8cb2e6f5dd90e6fdd86c1..fca94b4cfe98243b323644f983dbd2817671eb9f 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementService.java @@ -109,24 +109,34 @@ public class ErrorManagementService { } // CA 3.1 - // L'ajout d'un équipement dont le date de retrait (equipementPhysique.DateRetrait) précède la date d'achat (equipementPhysique.DateAchat) + // L'ajout d'un équipement dont la date de retrait (equipementPhysique.DateRetrait) précède la date d'achat (equipementPhysique.DateAchat) if (equipementPhysique.getDateAchat() != null && equipementPhysique.getDateRetrait() != null && equipementPhysique.getDateAchat().isAfter(equipementPhysique.getDateRetrait())) { erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_DATE_INCOHERENTE").formatted(equipementPhysique.getNomEquipementPhysique())); } // CA 4.1 - // L'ajout d'un équipement dont le mode d'utilisation est autre que COPE, BYOD ou null + // L'ajout d'un équipement dont la duree d'usage interne est négative + if (equipementPhysique.getDureeUsageInterne() != null && equipementPhysique.getDureeUsageInterne() <= 0) { + erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_DUREE_USAGE_INTERNE_INCOHERENTE").formatted(equipementPhysique.getNomEquipementPhysique())); + } + if (equipementPhysique.getDureeUsageAmont() != null && equipementPhysique.getDureeUsageAmont() < 0) { + erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_DUREE_USAGE_INCOHERENTE").formatted("amont", equipementPhysique.getNomEquipementPhysique())); + } + if (equipementPhysique.getDureeUsageAval() != null && equipementPhysique.getDureeUsageAval() < 0) { + erreurs.add(messageProperties.getMessages().get("EQUIPEMENT_DUREE_USAGE_INCOHERENTE").formatted("aval", equipementPhysique.getNomEquipementPhysique())); + } + //CA 5.1 + //L'ajout d'un équipement dont le mode d'utilisation est autre que COPE, BYOD ou null if (equipementPhysique.getModeUtilisation() != null && !modeUtilisationList.contains(equipementPhysique.getModeUtilisation())) { avertissements.add(messageProperties.getMessages().get("EQUIPEMENT_MODE_UTILISATION_INCONNU").formatted(equipementPhysique.getModeUtilisation())); } - // CA 5.1 - // L'ajout d'un équipement dont le taux d'utilisation n'est pas compris entre 0 et 1 + //CA 6.1 + //L'ajout d'un équipement dont le taux d'utilisation n'est pas compris entre 0 et 1 Double taux = equipementPhysique.getTauxUtilisation(); if (taux != null && (taux < 0 || taux > 1)) { avertissements.add(messageProperties.getMessages().get("EQUIPEMENT_TAUX_UTILISATION_INVALIDE").formatted(taux)); } - return Pair.of(erreurs, avertissements); } diff --git a/services/api-expositiondonneesentrees/src/main/resources/application.yaml b/services/api-expositiondonneesentrees/src/main/resources/application.yaml index 5bb0c2c18276f3e23ff25c21cbbca68a827640d1..b4fd32d40de92570ee37616e607a794b57c8a185 100644 --- a/services/api-expositiondonneesentrees/src/main/resources/application.yaml +++ b/services/api-expositiondonneesentrees/src/main/resources/application.yaml @@ -73,6 +73,9 @@ caching: statutDesCalculs: "PT10S" referentiels: "PT10M" +#Variables internes du composant +regle-par-defaut-duree-usage: "FIXE" + messages: LIGNE_INCONSISTENTE: "Fichier %s : La ligne n°%d n'est pas consistente avec les headers du fichier" LIGNE_INCORRECTE: "Fichier %s : La ligne n°%d est incorrecte pour l'objet %s requise" @@ -83,6 +86,8 @@ messages: EQUIPEMENT_CORRESPONDANCE_INCONNUE: "L'équipement %s de type %s ne possède pas de référence d'équipement par défaut dans la table ref_type_item et pas de correspondance dans la table ref_correspondance_ref_eqp" ITEM_IMPACT_INCONNU: "L'impact de l'item de référence %s pour l'étape %s et le critère %s ne pourra pas être calculé en raison de l'absence de facteur d'impact sur cet item" EQUIPEMENT_DATE_INCOHERENTE: "L'âge de l'équipement %s ne peut être calculé car sa date de retrait précède sa date d'achat" + EQUIPEMENT_DUREE_USAGE_INTERNE_INCOHERENTE: "La durée d'usage interne de l'équipement %s est négative ou nulle donc invalide" + EQUIPEMENT_DUREE_USAGE_INCOHERENTE: "La durée d'usage %s de l'équipement %s est négative donc invalide" EQUIPEMENT_MODE_UTILISATION_INCONNU: "Le mode d'utilisation renseigné '%s' est inconnu du référentiel" EQUIPEMENT_TAUX_UTILISATION_INVALIDE: "Le taux d'utilisation renseigné '%s' n'est pas valide, il doit être compris entre 0 et 1, le taux par défaut sera appliqué." EQUIPEMENT_DATACENTER_INCONNU: "L'équipement %s n'est lié à aucun datacenter" diff --git a/services/api-expositiondonneesentrees/src/main/resources/schema.sql b/services/api-expositiondonneesentrees/src/main/resources/schema.sql index 04c34e11beb268195ee1a889d4091aed628d3546..9f3d48f38da7a19d55b0ac172e629ebafd43cec3 100644 --- a/services/api-expositiondonneesentrees/src/main/resources/schema.sql +++ b/services/api-expositiondonneesentrees/src/main/resources/schema.sql @@ -11,6 +11,7 @@ CREATE TABLE IF NOT EXISTS en_donnees_entrees nbr_equipements_physiques int8 NULL, nbr_equipements_virtuels int8 NULL, nbr_messageries int8 NULL, + duree_usage varchar(255) NULL, CONSTRAINT en_donnees_entrees_pkey PRIMARY KEY (id) ); @@ -44,6 +45,9 @@ CREATE TABLE IF NOT EXISTS en_equipement_physique conso_elec_annuelle float8 NULL, date_achat date NULL, date_retrait date NULL, + duree_usage_interne float8 NULL, + duree_usage_amont float8 NULL, + duree_usage_aval float8 NULL, duree_vie_defaut float8 NULL, go_telecharge float4 NULL, modele varchar(255) NULL, @@ -189,6 +193,11 @@ ALTER TABLE IF EXISTS en_equipement_virtuel ADD COLUMN IF NOT EXISTS cle_reparti ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS stockage_total_virtuel float8; ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS mode_utilisation varchar(255); ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS taux_utilisation float8; +ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS duree_usage_interne float8; +ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS duree_usage_amont float8; +ALTER TABLE IF EXISTS en_equipement_physique ADD COLUMN IF NOT EXISTS duree_usage_aval float8; + +ALTER TABLE IF EXISTS en_donnees_entrees ADD COLUMN IF NOT EXISTS duree_usage varchar(255); -- Creation indexes -- Accelere la recuperation des donnees depuis EquipementPhysiqueIntegrationConfig.java diff --git a/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml b/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml index afe64246a55d958f241ed2c981d6d6002ceeb03f..4eb839bcf5867a26c1e30279baa5c0d16fa9741f 100644 --- a/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml +++ b/services/api-expositiondonneesentrees/src/main/resources/static/openapi.yaml @@ -38,19 +38,19 @@ paths: "500": description: Erreur interne du service content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "400": description: Contenu de la soumission incorrecte content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "200": description: Rapport d'import des données d'entrées content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/StatutCalculRest" /entrees/calculs/soumission: @@ -58,10 +58,21 @@ paths: summary: Endpoint de soumission de données d'entrées pour lancer les calculs dans NumEcoEval. description: | Endpoint de soumission de données d'entrées pour lancer les calculs dans NumEcoEval. + Vous pouvez choisir la méthode de calcul de la durée de vie des équipements qui sera utilisée pour le calcul grâce au paramètre dureeUsage qui peut prendre 2 valeurs : + <ul> + <li>FIXE : La méthode de calcul de la durée de vie se base sur l'attribut 'dureeUsageInterne' de l'équipement physique (méthode utilisée par défaut si le paramètre dureeUsage n'est pas renseigné). </li> + <li>REEL : La méthode de calcul de la durée de vie se base sur l'âge réel de l'équipement physique (dateRetrait-dateAchat). </li> + </ul> tags: - Calculs operationId: soumissionPourCalcul parameters: + - in: query + name: dureeUsage + schema: + $ref: "#/components/schemas/DureeUsage" + required: false + description: "Choix de la méthode de calcul de la durée d'usage : FIXE ou REEL" - in: query name: mode schema: @@ -71,26 +82,26 @@ paths: requestBody: required: true content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/DemandeCalculRest" responses: "500": description: Erreur interne du service content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "400": description: Contenu de la soumission incorrecte content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "200": description: Rapport d'import des données d'entrées content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/RapportDemandeCalculRest" /entrees/calculs/rejeu: @@ -104,26 +115,26 @@ paths: requestBody: required: true content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/DemandeCalculRest" responses: "500": description: Erreur interne du service content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "400": description: Contenu de la soumission incorrecte content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "200": description: Rapport d'import des données d'entrées content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/RapportDemandeCalculRest" /entrees/json: @@ -138,26 +149,26 @@ paths: requestBody: required: true content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/DonneesEntreeRest" responses: "500": description: Erreur interne du service content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "400": description: Contenu de la soumission incorrecte content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "200": description: Rapport d'import des données d'entrées content: - 'application/json': + "application/json": schema: type: array items: @@ -169,26 +180,26 @@ paths: summary: Soumission de données d'entrées au format CSV pour calcul d'indicateurs description: | Endpoint de soumission des données d'entrées au format CSV pour le calcul d'indicateurs. - + La taille totale de tous les fichiers ne doit pas dépasser 10 Mo. <br/> - + Le séparateur des fichiers CSV est le point-virgule (;). <br/> - + Les colonnes facultatives sont notées entre parenthèses, toutes les autres sont obligatoires ! <br/> - + Le Header du CSV des data centers est : nomCourtDatacenter;nomLongDatacenter;pue;localisation;(nomEntite);(qualite). <br/> - - Le Header du CSV des équipements physiques est : nomEquipementPhysique,modele;quantite;nomCourtDatacenter;dateAchat;dateRetrait;type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;(nomSourceDonnee);(nomEntite);nbCoeur;nbJourUtiliseAn;goTelecharge;(modeUtilisation);(tauxUtilisation);(qualite). <br/> - + + Le Header du CSV des équipements physiques est : nomEquipementPhysique,modele;quantite;nomCourtDatacenter;(dateAchat);(dateRetrait);(dureeUsageInterne);(dureeUsageAmont);(dureeUsageAval);type;statut;paysDUtilisation;consoElecAnnuelle;utilisateur;(nomSourceDonnee);(nomEntite);nbCoeur;nbJourUtiliseAn;goTelecharge;(modeUtilisation);(tauxUtilisation);(qualite). <br/> + Le Header du CSV des équipements virtuels est : nomEquipementVirtuel;nomEquipementPhysique;(nomSourceDonneeEquipementPhysique);(cleRepartition);vCPU;cluster;(consoElecAnnuelle);(typeEqv);(capaciteStockage);(nomEntite);(qualite). <br/> - + Le Header du CSV des application est : nomApplication;typeEnvironnement;(nomEquipementVirtuel);(nomSourceEquipementVirtuel);domaine;sousDomaine;(nomEntite);nomEquipementPhysique;(nomSourceDonnee);(qualite). <br/> - + Le Header du CSV des opérations non IT est : nomItemNonIT;quantite;type;dureeDeVie;localisation;(nomEntite);(nomSourceDonnee);nomCourtDatacenter;description;consoElecAnnuelle;(qualite). <br/> Le Header du CSV de la messagerie est : nombreMailEmis;nombreMailEmisXDestinataires;volumeTotalMailEmis;MoisAnnee;(nomEntite). <br/> - - Le Header du CSV des entités est : nomEntite;nbCollaborateurs;responsableEntite;responsableNumeriqueResponsable. + + Le Header du CSV des entités est : nomEntite;nbCollaborateurs;responsableEntite;responsableNumeriqueResponsable. operationId: importCSV requestBody: @@ -232,19 +243,19 @@ paths: "500": description: Erreur interne du service content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "400": description: Contenu de la soumission incorrecte content: - 'application/json': + "application/json": schema: $ref: "#/components/schemas/ErreurRest" "200": description: Rapport d'import des données d'entrées content: - 'application/json': + "application/json": schema: type: array items: @@ -275,6 +286,11 @@ components: - ASYNC - SYNC default: ASYNC + DureeUsage: + type: string + enum: + - FIXE + - REEL StatutCalculRest: description: Statut des calculs. properties: @@ -289,13 +305,13 @@ components: type: string equipementPhysique: description: "Bloc equipement physique" - $ref: '#/components/schemas/VolumeRest' + $ref: "#/components/schemas/VolumeRest" operationNonIT: description: "Bloc opération non it" - $ref: '#/components/schemas/VolumeRest' + $ref: "#/components/schemas/VolumeRest" messagerie: description: "Bloc messagerie" - $ref: '#/components/schemas/VolumeRest' + $ref: "#/components/schemas/VolumeRest" VolumeRest: description: Volume type: object @@ -454,6 +470,15 @@ components: description: "" type: string format: date + dureeUsageInterne: + description: "" + type: number + dureeUsageAmont: + description: "" + type: number + dureeUsageAval: + description: "" + type: number nbCoeur: description: "" type: string @@ -648,4 +673,4 @@ components: type: string nomSourceDonnee: description: "Nom de la source de la donnée" - type: string \ No newline at end of file + type: string diff --git a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java index 0a12a87ffabfa2819eef4b8a0cce7cb2f31f87b9..9e8f44e23ed1c29f8f44cdd662e4a726499f96d1 100644 --- a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java +++ b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/ErrorManagementServiceTest.java @@ -31,6 +31,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @ExtendWith({MockitoExtension.class, SpringExtension.class}) @@ -69,7 +71,7 @@ public class ErrorManagementServiceTest { } @Test - void importEqPhysique_with_DateEntreeAfterDateRetrait_shouldNotReturnReportWith1Error() throws IOException { + void importEqPhysique_with_DateEntreeBeforeDateRetrait_shouldNotReturnReportWith1Error() throws IOException { EquipementPhysique eq1 = EquipementPhysique.builder() .nomEquipementPhysique("physical-eq-001") .modele("P2719") @@ -85,6 +87,83 @@ public class ErrorManagementServiceTest { Assertions.assertFalse(actual.getKey().stream().anyMatch("L'âge de l'équipement physical-eq-001 ne peut être calculé car sa date de retrait précède sa date d'achat"::equals)); } + @Test + void importEqPhysique_with_DureeUsageInterneNegative_shouldReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .dureeUsageInterne(-3.6) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertTrue(actual.getKey().stream().anyMatch(ds -> "La durée d'usage interne de l'équipement physical-eq-001 est négative ou nulle donc invalide".equals(ds))); + } + + @Test + void importEqPhysique_with_DureeUsageInterneZero_shouldReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .dureeUsageInterne(0.0) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertTrue(actual.getKey().stream().anyMatch(ds -> "La durée d'usage interne de l'équipement physical-eq-001 est négative ou nulle donc invalide".equals(ds))); + } + + @Test + void importEqPhysique_with_DureeUsageInternePositive_shouldNotReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .dureeUsageInterne(3.6) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertFalse(actual.getKey().stream().anyMatch(ds -> "La durée d'usage interne de l'équipement physical-eq-001 est négative ou nulle donc invalide".equals(ds))); + } + + @Test + void importEqPhysique_with_DureeUsageAvalNegative_shouldReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .dureeUsageInterne(1.0) + .dureeUsageAval(-1.0) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertTrue(actual.getKey().stream().anyMatch(ds -> "La durée d'usage aval de l'équipement physical-eq-001 est négative donc invalide".equals(ds))); + } + + @Test + void importEqPhysique_with_DureeUsageAvalZero_shouldNotReturnReportWith1Error() throws IOException { + EquipementPhysique eq1 = EquipementPhysique.builder() + .nomEquipementPhysique("physical-eq-001") + .quantite(1.0) + .dureeUsageInterne(1.0) + .dureeUsageAval(0.0) + .type("Monitor") + .statut("In use") + .paysDUtilisation("France") + .build(); + + var actual = errorManagementService.checkEquipementPhysique(eq1, ""); + assertFalse(actual.getKey().stream().anyMatch(ds -> "La durée d'usage aval de l'équipement physical-eq-001 est négative donc invalide".equals(ds))); + } + @Test void importOperationNonIT_with_TypeNotInRefType_shouldReturnReportWith1Error() { OperationNonIT eq1 = OperationNonIT.builder() diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java index 4e4247f964a5d4ced269f7defbaa65ab402926e3..6c0da70ed89125cb7e070a24004add2322b0da59 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/DemandeCalculImpactEquipementPhysique.java @@ -36,6 +36,8 @@ public class DemandeCalculImpactEquipementPhysique { List<ReferentielMixElectrique> mixElectriques; + OptionsCalcul optionsCalcul; + public Optional<ReferentielHypothese> getHypotheseFromCode(String code) { if (code == null || hypotheses == null) { return Optional.empty(); diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/OptionsCalcul.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/OptionsCalcul.java new file mode 100644 index 0000000000000000000000000000000000000000..bee2bb2f7aed4277af29ecbb08617ce853100660 --- /dev/null +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/demande/OptionsCalcul.java @@ -0,0 +1,5 @@ +package org.mte.numecoeval.calculs.domain.data.demande; + +public record OptionsCalcul(String dureeUsage) { + +} diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java index d3fa26e68a6fdc6d00b519e905355b45e04570f1..02376c96d42f20d50e6a1e96f9c41008d03c51bc 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/entree/EquipementPhysique.java @@ -18,6 +18,9 @@ public class EquipementPhysique { private String utilisateur; private LocalDate dateAchat; private LocalDate dateRetrait; + private Double dureeUsageInterne; + private Double dureeUsageAmont; + private Double dureeUsageAval; private Double quantite; private Float goTelecharge; private Double nbJourUtiliseAn; diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/DureeDeVie.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/DureeDeVie.java index 1697802d26401dc1ea96a00c489736255873adfa..c4d27f82068a1f22993645827b3ed155ddc6828c 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/DureeDeVie.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/data/trace/DureeDeVie.java @@ -8,7 +8,11 @@ import lombok.Data; @Builder @JsonInclude(JsonInclude.Include.NON_NULL) public class DureeDeVie { - private Double valeur; + private Double valeurRetenue; + private String methodeDureeUsage; + private Double dureeUsageInterne; + private Double dureeUsageAmont; + private Double dureeUsageAval; private String dateAchat; private String dateRetrait; private DureeDeVieParDefaut dureeDeVieParDefaut; diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java index 5c0d96c4f7df6fca946656bd6608bd997847b125..27b32aa92ebd44bd543f855aff8f1cf6d1b528e6 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactEquipementPhysiqueServiceImpl.java @@ -23,7 +23,6 @@ import java.util.stream.Collectors; @Slf4j @AllArgsConstructor public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEquipementPhysiqueService { - private static final String VERSION_CALCUL = "1.0"; public static final String NB_JOUR_UTILISE_PAR_DEFAUT = "NbJourUtiliseParDefaut"; public static final String ERREUR_DE_CALCUL_IMPACT_EQUIPEMENT_MESSAGE = "Erreur de calcul impact équipement: Type: {}, Cause: {}, Etape: {}, Critere: {}, Equipement Physique: {}, RefEquipementRetenu: {}, RefEquipementParDefaut: {}"; @@ -78,8 +77,8 @@ public class CalculImpactEquipementPhysiqueServiceImpl implements CalculImpactEq var valeurReferentiel = referentielImpactEquipement.getValeur(); valeurImpactUnitaire = quantite * valeurReferentiel * tauxUtilisationEqPhysique; DureeDeVie dureeVie = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); - if (dureeVie != null && dureeVie.getValeur() != null && dureeVie.getValeur() > 0) { - var valeurDureeVie = dureeVie.getValeur(); + if (dureeVie != null && dureeVie.getValeurRetenue() != null && dureeVie.getValeurRetenue() > 0) { + var valeurDureeVie = dureeVie.getValeurRetenue(); valeurImpactUnitaire = valeurImpactUnitaire / valeurDureeVie; traceCalculImpactEquipementPhysique = TraceCalculImpactEquipementPhysiqueUtils.buildTraceSecondScenario(quantite, valeurReferentiel, referentielImpactEquipement.getSource(), dureeVie, tauxUtilisationEqPhysique); } else { diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java index c7e4414b4ebf3ad34212cbcba2a1cad41978b2be..3ef4e6bf777a1a5a6248a49845b9666151439939 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/CalculImpactOperationNonITServiceImpl.java @@ -119,7 +119,7 @@ public class CalculImpactOperationNonITServiceImpl implements CalculImpactOperat } MetadataCalcul metadataCalcul = getFormule(demandeCalcul); DureeDeVie dureeDeVie = getDureeVie(demandeCalcul); - Double dureeDeVieValeur = (dureeDeVie.getValeur() == null) ? dureeDeVie.getDureeDeVieParDefaut().getValeur() : dureeDeVie.getValeur(); + Double dureeDeVieValeur = (dureeDeVie.getValeurRetenue() == null) ? dureeDeVie.getDureeDeVieParDefaut().getValeur() : dureeDeVie.getValeurRetenue(); Double valeurImpactUnitaire = metadataCalcul.valeurImpactUnitaire() / dureeDeVieValeur; TraceCalculImpactOperationNonIT traceCalculImpactOperationNonIT = metadataCalcul.traceCalculImpactOperationNonIT(); String traceFormuleBase = traceCalculImpactOperationNonIT.getFormule(); @@ -327,7 +327,7 @@ public class CalculImpactOperationNonITServiceImpl implements CalculImpactOperat var dureeDeVie = DureeDeVie.builder().build(); if (demandeCalcul.getOperationNonIT().getDureeDeVie() != null) { - dureeDeVie.setValeur(demandeCalcul.getOperationNonIT().getDureeDeVie()); + dureeDeVie.setValeurRetenue(demandeCalcul.getOperationNonIT().getDureeDeVie()); } else if (demandeCalcul.getTypeItem() != null && demandeCalcul.getTypeItem().getDureeVieDefaut() != null) { dureeDeVie.setDureeDeVieParDefaut(DureeDeVieParDefaut.builder() diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java index 5b5f19603237534261c4e6f88174ed0865dd03c2..d690e679fb6d9b67e0a694d0b1a0b31dbcbef943 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/port/input/service/impl/DureeDeVieEquipementPhysiqueServiceImpl.java @@ -1,6 +1,7 @@ package org.mte.numecoeval.calculs.domain.port.input.service.impl; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.erreur.TypeErreurCalcul; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielHypothese; @@ -13,24 +14,63 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +@Slf4j @AllArgsConstructor public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipementPhysiqueService { @Override public DureeDeVie calculerDureeVie(DemandeCalculImpactEquipementPhysique demandeCalcul) throws CalculImpactException { + String methodeDureeUsage = demandeCalcul.getOptionsCalcul() != null ? demandeCalcul.getOptionsCalcul().dureeUsage() : "FIXE"; + + if ("REEL".equals(methodeDureeUsage)) { + return calculDureeUsageFromMethodeReel(demandeCalcul); + } + // par défaut, methodeDureeUsage == "FIXE" + return calculDureeUsageFromMethodeFixe(demandeCalcul); + } + + private DureeDeVie calculDureeUsageAmontEtAval(DemandeCalculImpactEquipementPhysique demandeCalcul) throws CalculImpactException { + var result = DureeDeVie.builder() + .valeurRetenue(0.0) + .build(); + + Double dureeUsageAmont = demandeCalcul.getEquipementPhysique().getDureeUsageAmont(); + if (dureeUsageAmont != null) { + if (dureeUsageAmont < 0) { + throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée d'usage amont ne peut pas être négative"); + } + result.setDureeUsageAmont(dureeUsageAmont); + result.setValeurRetenue(dureeUsageAmont); + } else { + result.setDureeUsageAmont(0.0); + } + Double dureeUsageAval = demandeCalcul.getEquipementPhysique().getDureeUsageAval(); + if (dureeUsageAval != null) { + if (dureeUsageAval < 0) { + throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée d'usage aval ne peut pas être négative"); + } + result.setDureeUsageAval(dureeUsageAval); + result.setValeurRetenue(result.getValeurRetenue() + dureeUsageAval); + } else { + result.setDureeUsageAval(0.0); + } + return result; + } + + private DureeDeVie calculDureeUsageFromMethodeReel(DemandeCalculImpactEquipementPhysique demandeCalcul) throws CalculImpactException { + DureeDeVie result = calculDureeUsageAmontEtAval(demandeCalcul); + result.setMethodeDureeUsage("REEL"); var dateAchat = demandeCalcul.getEquipementPhysique().getDateAchat(); var dateRetrait = demandeCalcul.getEquipementPhysique().getDateRetrait(); - var result = DureeDeVie.builder().build(); if (dateAchat != null && dateRetrait != null) { - if (dateAchat.isBefore(dateRetrait)) { Double valeur; - if (ChronoUnit.MONTHS.between(dateAchat, dateRetrait) < 12) { - valeur = 1d; + if ((double) ChronoUnit.MONTHS.between(dateAchat, dateRetrait) / 12 + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + result.setValeurRetenue(1.0); } else { valeur = ChronoUnit.DAYS.between(dateAchat, dateRetrait) / 365d; + result.setValeurRetenue(result.getValeurRetenue() + valeur); } - result.setValeur(valeur); result.setDateAchat(dateAchat.format(DateTimeFormatter.ISO_DATE)); result.setDateRetrait(dateRetrait.format(DateTimeFormatter.ISO_DATE)); } else { @@ -39,7 +79,7 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe } // Taiga#864 - Si la date d'achat est présente et non la date de retrait, on prend la date du jour devient la date de retrait pour le calcul else if (dateAchat != null) { - result.setValeur( + result.setValeurRetenue(result.getValeurRetenue() + ChronoUnit.DAYS.between(dateAchat, LocalDate.now()) / 365d ); result.setDateAchat(dateAchat.format(DateTimeFormatter.ISO_DATE)); @@ -47,7 +87,36 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe } else { var dureeDeVieParDefaut = calculerDureeVieDefaut(demandeCalcul); result.setDureeDeVieParDefaut(dureeDeVieParDefaut); - result.setValeur(dureeDeVieParDefaut.getValeur()); + if (dureeDeVieParDefaut.getValeur() + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + result.setValeurRetenue(1.0); + } + result.setValeurRetenue(result.getValeurRetenue() + dureeDeVieParDefaut.getValeur()); + } + return result; + } + + private DureeDeVie calculDureeUsageFromMethodeFixe(DemandeCalculImpactEquipementPhysique demandeCalcul) throws CalculImpactException { + DureeDeVie result = calculDureeUsageAmontEtAval(demandeCalcul); + result.setMethodeDureeUsage("FIXE"); + Double dureeUsageInterne = demandeCalcul.getEquipementPhysique().getDureeUsageInterne(); + if (dureeUsageInterne != null) { + if (dureeUsageInterne <= 0.0) { + throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée d'usage interne ne peut pas être négative ou nulle"); + } + result.setDureeUsageInterne(dureeUsageInterne); + if (dureeUsageInterne + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + result.setValeurRetenue(1.0); + } else { + result.setValeurRetenue(result.getValeurRetenue() + dureeUsageInterne); + } + } else { + var dureeDeVieParDefaut = calculerDureeVieDefaut(demandeCalcul); + result.setDureeDeVieParDefaut(dureeDeVieParDefaut); + if (dureeDeVieParDefaut.getValeur() + result.getDureeUsageAmont() + result.getDureeUsageAval() < 1) { + result.setValeurRetenue(1.0); + } else { + result.setValeurRetenue(result.getValeurRetenue() + dureeDeVieParDefaut.getValeur()); + } } return result; } @@ -62,6 +131,7 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe .valeur(demandeCalcul.getTypeEquipement().getDureeVieDefaut()) .build(); } + var refHypotheseOpt = demandeCalcul.getHypotheseFromCode("dureeVieParDefaut"); if (refHypotheseOpt.isPresent() && refHypotheseOpt.get().getValeur() != null) { ReferentielHypothese hypothese = refHypotheseOpt.get(); @@ -73,5 +143,4 @@ public class DureeDeVieEquipementPhysiqueServiceImpl implements DureeDeVieEquipe } throw new CalculImpactException(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), "La durée de vie par défaut de l'équipement n'a pas pu être déterminée"); } - } diff --git a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java index 152029304044a0c7755521d5f2112bb4c055c89c..42560d275d9e9d154b6a87c670de2c94975b6b51 100644 --- a/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java +++ b/services/calculs/src/main/java/org/mte/numecoeval/calculs/domain/traceur/TraceCalculImpactEquipementPhysiqueUtils.java @@ -31,7 +31,7 @@ public class TraceCalculImpactEquipementPhysiqueUtils { public static TraceCalculImpactEquipementPhysique buildTraceSecondScenario(Double quantite, Double valeurRefrentiel, String sourceReferentiel, DureeDeVie dureeDeVie, Double taux_utilisation) { return TraceCalculImpactEquipementPhysique.builder() - .formule(getFormuleSecondScenario(quantite, valeurRefrentiel, dureeDeVie.getValeur(), taux_utilisation)) + .formule(getFormuleSecondScenario(quantite, valeurRefrentiel, dureeDeVie.getValeurRetenue(), taux_utilisation)) .valeurReferentielImpactEquipement(valeurRefrentiel) .sourceReferentielImpactEquipement(sourceReferentiel) .dureeDeVie(dureeDeVie) diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java index 23b3477d7372073a877baf1132e26cbf5d8dc9f7..38135838120be3bfdbcadfd63a9ebbd9b4fc2e32 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactEquipementPhysiqueServiceTest.java @@ -9,6 +9,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.junit.jupiter.MockitoExtension; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; +import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.entree.DataCenter; import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; @@ -856,9 +857,10 @@ class CalculImpactEquipementPhysiqueServiceTest { .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeur(5.0d).build()); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(5.0d).build()); //When var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( @@ -926,8 +928,9 @@ class CalculImpactEquipementPhysiqueServiceTest { .equipementPhysique(equipementPhysique) .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeur(6.0).build()); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(6.0).build()); //When var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( @@ -995,8 +998,9 @@ class CalculImpactEquipementPhysiqueServiceTest { .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeur(7.0).build()); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(7.0).build()); //When var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( @@ -1278,6 +1282,7 @@ class CalculImpactEquipementPhysiqueServiceTest { .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); @@ -1285,7 +1290,10 @@ class CalculImpactEquipementPhysiqueServiceTest { var valeurDureeVie = ChronoUnit.DAYS.between(dateAchat, dateRetrait) / 365d; DureeDeVie dureeDeVie = DureeDeVie.builder() - .valeur(valeurDureeVie) + .valeurRetenue(valeurDureeVie) + .methodeDureeUsage("REEL") + .dureeUsageAmont(0.0) + .dureeUsageAval(0.0) .dateAchat(dateAchat.format(DateTimeFormatter.ISO_DATE)) .dateRetrait(dateRetrait.format(DateTimeFormatter.ISO_DATE)) .build(); @@ -1353,9 +1361,10 @@ class CalculImpactEquipementPhysiqueServiceTest { .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeur(7.0).build()); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(7.0).build()); //When var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( @@ -1424,9 +1433,10 @@ class CalculImpactEquipementPhysiqueServiceTest { .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeur(7.0).build()); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(7.0).build()); //When var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( @@ -1504,6 +1514,7 @@ class CalculImpactEquipementPhysiqueServiceTest { .correspondanceRefEquipement(refEquipement) .typeEquipement(typeEquipement) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When @@ -2218,8 +2229,9 @@ class CalculImpactEquipementPhysiqueServiceTest { .typeEquipement(typeEquipement) .hypotheses(Collections.singletonList(referentielHypothese)) .impactEquipements(Collections.singletonList(referentielImpactEquipement)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); - when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeur(5.0d).build()); + when(dureeDeVieEquipementPhysiqueService.calculerDureeVie(any(DemandeCalculImpactEquipementPhysique.class))).thenReturn(DureeDeVie.builder().valeurRetenue(5.0d).build()); //When var actual = calculImpactEquipementPhysiqueService.calculerImpactEquipementPhysique( demandeCalcul diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java index 2fb5ad3ff3e133d2e588f80ca9a30ae780125120..c6fd52c3fa46095808606ac342a0083eed1a5cb9 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/CalculImpactOperationNonITServiceTest.java @@ -627,7 +627,7 @@ class CalculImpactOperationNonITServiceTest { assertEquals(TestJsonUtils.format(""" { "dureeDeVie" : { - "valeur" : 10.0 + "valeurRetenue" : 10.0 }, "formule" : "ImpactOperationNonIT = (Quantité(1.0) * ReferentielFacteurCaracterisation(0.1)) / DureeDeVie(10.0)", "valeurReferentielFacteurCaracterisation" : 0.1 diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java index 044d18d58d88bde970c91d3a03baf860b2ba6ca7..e92e8cc7843d68ce3de9c2e98450d5bfb5806764 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/domain/service/DureeDeVieEquipementPhysiqueServiceTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; +import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.erreur.TypeErreurCalcul; import org.mte.numecoeval.calculs.domain.data.referentiel.ReferentielHypothese; @@ -27,7 +28,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy"); @Test - void whenTypeEquipementDoesntHaveDureeDeVie_shouldUseHypotheseForDureeDeVie()throws Exception{ + void whenTypeEquipementDoesntHaveDureeDeVie_shouldUseHypotheseForDureeDeVie() throws Exception { //Given EquipementPhysique equipementPhysique = EquipementPhysique.builder() @@ -46,21 +47,22 @@ class DureeDeVieEquipementPhysiqueServiceTest { .equipementPhysique(equipementPhysique) .hypotheses(Collections.singletonList(hypothese)) .typeEquipement(typeEquipement) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); //Then - assertEquals(1.17d,actual.getValeur()); + assertEquals(1.17d, actual.getValeurRetenue()); } @Test - void shouldCalculerDureeVie1d_whenEquipementPhyisqueWithValidDates() throws Exception{ + void shouldCalculerDureeVie1d_whenEquipementPhyisqueWithValidDates() throws Exception { //Given - LocalDate dateAchat = LocalDate.parse("15/08/2020",formatter); - LocalDate dateRetrait = LocalDate.parse("15/06/2021",formatter); + LocalDate dateAchat = LocalDate.parse("15/08/2020", formatter); + LocalDate dateRetrait = LocalDate.parse("15/06/2021", formatter); var equipement = EquipementPhysique.builder() .dateAchat(dateAchat) .dateRetrait(dateRetrait) @@ -69,19 +71,20 @@ class DureeDeVieEquipementPhysiqueServiceTest { .builder() .equipementPhysique(equipement) .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); //Then - assertEquals(1d,actual.getValeur()); + assertEquals(1d, actual.getValeurRetenue()); } @Test - void shouldCalculerDureeVie365_whenEquipementPhyisqueWithValidDates()throws Exception{ + void shouldCalculerDureeVie365_whenEquipementPhyisqueWithValidDates() throws Exception { //Given - LocalDate dateAchat = LocalDate.parse("15/08/2020",formatter); - LocalDate dateRetrait = LocalDate.parse("15/10/2021",formatter); + LocalDate dateAchat = LocalDate.parse("15/08/2020", formatter); + LocalDate dateRetrait = LocalDate.parse("15/10/2021", formatter); var equipement = EquipementPhysique.builder() .dateAchat(dateAchat) .dateRetrait(dateRetrait) @@ -90,16 +93,17 @@ class DureeDeVieEquipementPhysiqueServiceTest { .builder() .equipementPhysique(equipement) .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); - var expected = 426d/365d; + var expected = 426d / 365d; //Then - assertEquals(expected,actual.getValeur()); + assertEquals(expected, actual.getValeurRetenue()); } @Test - void taiga864_whenEquipementPhysiqueDateRetraitIsNullShouldUseCurrentDayAsDateRetrait()throws Exception{ + void taiga864_whenEquipementPhysiqueDateRetraitIsNullShouldUseCurrentDayAsDateRetrait() throws Exception { //Given LocalDate dateAchat = LocalDate.now().minusDays(30); var equipement = EquipementPhysique.builder() @@ -110,21 +114,22 @@ class DureeDeVieEquipementPhysiqueServiceTest { .builder() .equipementPhysique(equipement) .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); - var expected = 30/365d; + var expected = 30 / 365d; //Then - assertEquals(expected,actual.getValeur()); - assertEquals(dateAchat.format(DateTimeFormatter.ISO_DATE),actual.getDateAchat()); - assertEquals(LocalDate.now().format(DateTimeFormatter.ISO_DATE),actual.getDateRetrait()); + assertEquals(expected, actual.getValeurRetenue()); + assertEquals(dateAchat.format(DateTimeFormatter.ISO_DATE), actual.getDateAchat()); + assertEquals(LocalDate.now().format(DateTimeFormatter.ISO_DATE), actual.getDateRetrait()); } @Test - void shouldThrowException_whenInvalideDatesOrder()throws Exception{ + void shouldThrowException_whenInvalideDatesOrder() throws Exception { //Given - LocalDate dateRetrait= LocalDate.parse("15/08/2020",formatter); - LocalDate dateAchat = LocalDate.parse("15/10/2021",formatter); + LocalDate dateRetrait = LocalDate.parse("15/08/2020", formatter); + LocalDate dateAchat = LocalDate.parse("15/10/2021", formatter); var equipement = EquipementPhysique.builder() .dateAchat(dateAchat) .dateRetrait(dateRetrait) @@ -133,12 +138,13 @@ class DureeDeVieEquipementPhysiqueServiceTest { .builder() .equipementPhysique(equipement) .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When CalculImpactException exception = - //Then + //Then assertThrows(CalculImpactException.class, - ()-> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); + () -> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); assertEquals(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), exception.getErrorType()); String expectedMessage = "La durée de vie de l'équipement n'a pas pu être déterminée"; @@ -147,7 +153,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { } @Test - void shouldReturnDureeVieDefaut_whenMissingDate()throws Exception{ + void shouldReturnDureeVieDefaut_whenMissingDate() throws Exception { //Given var equipement = EquipementPhysique.builder() .type("laptop") @@ -161,16 +167,17 @@ class DureeDeVieEquipementPhysiqueServiceTest { .equipementPhysique(equipement) .hypotheses(Collections.singletonList(hypothese)) .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When DureeDeVie actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); //Then - assertEquals(1.17d,actual.getValeur()); + assertEquals(1.17d, actual.getValeurRetenue()); } @Test - void whenMissingDate_ShouldUseDureeDeVieTypeEquipementInPriority()throws Exception{ + void whenMissingDate_ShouldUseDureeDeVieTypeEquipementInPriority() throws Exception { //Given var equipement = EquipementPhysique.builder() .type("laptop") @@ -188,16 +195,17 @@ class DureeDeVieEquipementPhysiqueServiceTest { .equipementPhysique(equipement) .typeEquipement(typeEquipement) .hypotheses(Collections.singletonList(hypothese)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When DureeDeVie actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); //Then - assertEquals(3.5d,actual.getValeur()); + assertEquals(3.5d, actual.getValeurRetenue()); } @Test - void whenMissingDureeForTypeAndHypothese_ShouldThrowException()throws Exception{ + void whenMissingDureeForTypeAndHypothese_ShouldThrowException() throws Exception { //Given var equipement = EquipementPhysique.builder() .type("laptop") @@ -215,6 +223,7 @@ class DureeDeVieEquipementPhysiqueServiceTest { .equipementPhysique(equipement) .typeEquipement(typeEquipement) .hypotheses(Collections.singletonList(hypothese)) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); //When CalculImpactException exception = assertThrows(CalculImpactException.class, () -> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); @@ -225,4 +234,199 @@ class DureeDeVieEquipementPhysiqueServiceTest { assertEquals("La durée de vie par défaut de l'équipement n'a pas pu être déterminée", exception.getMessage()); } + //Tests pour CalculerDuree avec methodeDureeUsage = FIXE + @Test + void shouldCalculerDureeVie1an_whenEquipementPhyisqueWithDureeUsageInterneInf1() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(0.8) + .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + //When + var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); + + //Then + assertEquals(1d, actual.getValeurRetenue()); + } + + @Test + void shouldCalculerDureeVie1an_whenEquipementPhyisqueWithDureeUsageInterneEtAvalEtAmontInf1() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(0.1) + .dureeUsageAmont(0.2) + .dureeUsageAval(0.2) + .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + //When + var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); + + //Then + assertEquals(0.1, actual.getDureeUsageInterne()); + assertEquals(0.2, actual.getDureeUsageAmont()); + assertEquals(1d, actual.getValeurRetenue()); + } + + @Test + void shouldCalculerDureeVie_whenEquipementPhysiqueWithDureeUsageInterneSup1() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(3.0) + .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); + + //Then + assertEquals(3.0, actual.getValeurRetenue()); + } + + @Test + void shouldCalculerDureeVie_whenEquipementPhysiqueWithDureeUsageInterne_dureeUsageAmontAndAval() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(3.0) + .dureeUsageAmont(2.0) + .dureeUsageAval(1.0) + .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); + + //Then + assertEquals(6.0, actual.getValeurRetenue()); + } + + @Test + void shouldReturnError_whenEquipementPhysiqueWithDureeUsageInterneNegative() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(-1.5) + .build(); + + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + CalculImpactException exception = assertThrows(CalculImpactException.class, () -> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); + + //Then + assertNotNull(exception, "Une exception doit être levée"); + assertEquals(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), exception.getErrorType()); + assertEquals("La durée d'usage interne ne peut pas être négative ou nulle", exception.getMessage()); + } + + @Test + void shouldCalculerDureeVie1d_whenEquipementPhyisqueWithDureeUsageZero() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(0.0) + .build(); + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .typeEquipement(null) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + CalculImpactException exception = assertThrows(CalculImpactException.class, () -> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); + + //Then + assertNotNull(exception, "Une exception doit être levée"); + assertEquals(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), exception.getErrorType()); + assertEquals("La durée d'usage interne ne peut pas être négative ou nulle", exception.getMessage()); + } + + @Test + void shouldReturnError_whenEquipementPhysiqueWithDureeUsageInterne_dureeUsageAmontNegative() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(3.0) + .dureeUsageAmont(-1.0) + .dureeUsageAval(-2.0) + .build(); + + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + CalculImpactException exception = assertThrows(CalculImpactException.class, () -> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); + + //Then + assertNotNull(exception, "Une exception doit être levée"); + assertEquals(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), exception.getErrorType()); + assertEquals("La durée d'usage amont ne peut pas être négative", exception.getMessage()); + } + + @Test + void shouldReturnError_whenEquipementPhysiqueWithDureeUsageInterne_dureeUsageAmontZero() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(3.0) + .dureeUsageAmont(0.0) + .dureeUsageAval(1.0) + .build(); + + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + var actual = dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul); + + //Then + assertEquals(4.0, actual.getValeurRetenue()); + } + + @Test + void shouldReturnError_whenEquipementPhysiqueWithDureeUsageAvalNegative() throws Exception { + //Given + var equipement = EquipementPhysique.builder() + .dureeUsageInterne(1.0) + .dureeUsageAval(-3.4) + .build(); + + DemandeCalculImpactEquipementPhysique demandeCalcul = DemandeCalculImpactEquipementPhysique + .builder() + .equipementPhysique(equipement) + .optionsCalcul(new OptionsCalcul("FIXE")) + .build(); + + //When + CalculImpactException exception = assertThrows(CalculImpactException.class, () -> dureeDeVieEquipementPhysiqueService.calculerDureeVie(demandeCalcul)); + + //Then + assertNotNull(exception, "Une exception doit être levée"); + assertEquals(TypeErreurCalcul.ERREUR_FONCTIONNELLE.getCode(), exception.getErrorType()); + assertEquals("La durée d'usage aval ne peut pas être négative", exception.getMessage()); + } } \ No newline at end of file diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java index cf75dd9badb31f3241a4b3c62ada24a128a47cbf..f69aaf98ece7e8df602681e8947e377c41dbaba9 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DataTableTypeDefinitions.java @@ -6,6 +6,7 @@ import org.apache.commons.lang3.StringUtils; import org.mte.numecoeval.calculs.CucumberIntegrationTest; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementVirtuel; +import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.entree.EquipementVirtuel; import org.mte.numecoeval.calculs.domain.data.indicateurs.ImpactEquipementPhysique; @@ -27,29 +28,31 @@ public class DataTableTypeDefinitions { public static void assertDateIfAvailable(LocalDate valueToTest, Map<String, String> entry, String key) { assertEquals(getDateOrNull(entry, key), valueToTest); } + public static void assertDoubleIfAvailable(Double valueToTest, Map<String, String> entry, String key) { assertEquals(getDoubleOrNull(entry, key), valueToTest); } + public static void assertIntegerIfAvailable(Integer valueToTest, Map<String, String> entry, String key) { assertEquals(getIntegerOrNull(entry, key), valueToTest); } + public static void assertStringIfAvailable(String valueToTest, Map<String, String> entry, String key) { assertEquals(entry.getOrDefault(key, null), valueToTest); } private static LocalDate getDateOrNull(Map<String, String> entry, String key) { - if( StringUtils.isNotBlank(entry.get(key)) ) { + if (StringUtils.isNotBlank(entry.get(key))) { return LocalDate.parse(entry.get(key), CucumberIntegrationTest.FORMATTER_FRENCH_FORMAT); } return null; } private static Double getDoubleOrNull(Map<String, String> entry, String key) { - if( StringUtils.isNotBlank(entry.get(key)) ) { + if (StringUtils.isNotBlank(entry.get(key))) { try { return NUMBER_FRENCH_FORMAT.parse(entry.get(key)).doubleValue(); - } - catch (ParseException e) { + } catch (ParseException e) { log.error("Erreur au parsing de la valeur {} : {}", entry.get(key), e.getMessage()); return null; } @@ -58,11 +61,10 @@ public class DataTableTypeDefinitions { } private static Integer getIntegerOrNull(Map<String, String> entry, String key) { - if( StringUtils.isNotBlank(entry.get(key)) ) { + if (StringUtils.isNotBlank(entry.get(key))) { try { return NUMBER_FRENCH_FORMAT.parse(entry.get(key)).intValue(); - } - catch (ParseException e) { + } catch (ParseException e) { log.error("Erreur au parsing de la valeur {} : {}", entry.get(key), e.getMessage()); return null; } @@ -74,6 +76,7 @@ public class DataTableTypeDefinitions { public DemandeCalculImpactEquipementPhysique demandeCalculImpactEquipementPhysique(Map<String, String> entry) { var builder = DemandeCalculImpactEquipementPhysique.builder() .dateCalcul(LocalDateTime.now()) + .optionsCalcul(new OptionsCalcul("REEL")) .equipementPhysique( EquipementPhysique.builder() .nomEquipementPhysique(entry.getOrDefault("nomEquipementPhysique", null)) @@ -83,7 +86,7 @@ public class DataTableTypeDefinitions { ); var hypotheses = new ArrayList<ReferentielHypothese>(); - if(StringUtils.isNotBlank(entry.get("refTypeEquipement.dureeVieDefaut"))) { + if (StringUtils.isNotBlank(entry.get("refTypeEquipement.dureeVieDefaut"))) { builder.typeEquipement( ReferentielTypeEquipement.builder() .dureeVieDefaut(getDoubleOrNull(entry, "refTypeEquipement.dureeVieDefaut")) @@ -91,7 +94,7 @@ public class DataTableTypeDefinitions { ); } - if(StringUtils.isNotBlank(entry.get("hypothese.dureeVieParDefaut"))) { + if (StringUtils.isNotBlank(entry.get("hypothese.dureeVieParDefaut"))) { hypotheses.add( ReferentielHypothese.builder() .code("dureeVieParDefaut") @@ -139,10 +142,10 @@ public class DataTableTypeDefinitions { impactEquipement.setNomOrganisation(entry.getOrDefault("impactEquipementPhysique.nomOrganisation", null)); impactEquipement.setDateLot(getDateOrNull(entry, "impactEquipementPhysique.dateLot")); impactEquipement.setNomEntite(entry.getOrDefault("impactEquipementPhysique.nomEntite", null)); - if(StringUtils.isNotBlank(entry.get("impactEquipementPhysique.impactUnitaire"))) { + if (StringUtils.isNotBlank(entry.get("impactEquipementPhysique.impactUnitaire"))) { impactEquipement.setImpactUnitaire(getDoubleOrNull(entry, "impactEquipementPhysique.impactUnitaire")); } - if(StringUtils.isNotBlank(entry.get("impactEquipementPhysique.consoElecMoyenne"))) { + if (StringUtils.isNotBlank(entry.get("impactEquipementPhysique.consoElecMoyenne"))) { impactEquipement.setConsoElecMoyenne(getDoubleOrNull(entry, "impactEquipementPhysique.consoElecMoyenne")); } builder.impactEquipement(impactEquipement); diff --git a/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DureeDeVieStepDefinitions.java b/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DureeDeVieStepDefinitions.java index abeee6a6a1e7d17f3515c1235449c8fc3e936929..6fa5c36838d58114378fdf8ec71a2062889b0ea6 100644 --- a/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DureeDeVieStepDefinitions.java +++ b/services/calculs/src/test/java/org/mte/numecoeval/calculs/steps/DureeDeVieStepDefinitions.java @@ -3,6 +3,7 @@ package org.mte.numecoeval.calculs.steps; import io.cucumber.java.fr.Alors; import io.cucumber.java.fr.Soit; import org.mte.numecoeval.calculs.domain.data.demande.DemandeCalculImpactEquipementPhysique; +import org.mte.numecoeval.calculs.domain.data.demande.OptionsCalcul; import org.mte.numecoeval.calculs.domain.data.entree.EquipementPhysique; import org.mte.numecoeval.calculs.domain.data.trace.DureeDeVie; import org.mte.numecoeval.calculs.domain.exception.CalculImpactException; @@ -31,6 +32,7 @@ public class DureeDeVieStepDefinitions { .dateRetrait(LocalDate.parse(dateRetrait, FORMATTER_FRENCH_FORMAT)) .build() ) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); } @@ -45,6 +47,7 @@ public class DureeDeVieStepDefinitions { .dateRetrait(null) .build() ) + .optionsCalcul(new OptionsCalcul("REEL")) .build(); } @@ -55,7 +58,7 @@ public class DureeDeVieStepDefinitions { DureeDeVie result = assertDoesNotThrow(() -> service.calculerDureeVie(demandeCalculCourante)); assertNotNull(result); - assertEquals(dureeDeVieAttendue, result.getValeur()); + assertEquals(dureeDeVieAttendue, result.getValeurRetenue()); } @Alors("la durée de vie correspond à la différence entre la date d'achat et la date du jour") @@ -66,7 +69,7 @@ public class DureeDeVieStepDefinitions { assertNotNull(result); double differenceAvecDateDuJour = ChronoUnit.DAYS.between(demandeCalculCourante.getEquipementPhysique().getDateAchat(), LocalDate.now()) / 365d; - assertEquals(differenceAvecDateDuJour, result.getValeur()); + assertEquals(differenceAvecDateDuJour, result.getValeurRetenue()); } @Soit("Une demande de calcule de durée de vie tel que") diff --git a/services/common/src/main/resources/static/api-event-calculs-async-openapi.yaml b/services/common/src/main/resources/static/api-event-calculs-async-openapi.yaml index 80d49ce7a0db6dbb5af899b5d28d8b5f7079dabd..a010005d45e6ff2ecc240b65cdc726aa1e1d132f 100644 --- a/services/common/src/main/resources/static/api-event-calculs-async-openapi.yaml +++ b/services/common/src/main/resources/static/api-event-calculs-async-openapi.yaml @@ -270,6 +270,18 @@ components: description: "" type: string format: date + dureeUsageInterne: + description: "" + type: number + format: double + dureeUsageAmont: + description: "" + type: number + format: double + dureeUsageAval: + description: "" + type: number + format: double nbCoeur: description: "" type: string diff --git a/services/common/src/main/resources/static/asyncapi_equipement_physique.yaml b/services/common/src/main/resources/static/asyncapi_equipement_physique.yaml index ce45ab1f78d73b61ff79462667c9365a05afc788..bb8585f9453907814c04fc1cfef4f2aa44ed1df8 100644 --- a/services/common/src/main/resources/static/asyncapi_equipement_physique.yaml +++ b/services/common/src/main/resources/static/asyncapi_equipement_physique.yaml @@ -116,6 +116,18 @@ components: description: "" type: string format: date + dureeUsageInterne: + description: "" + type: number + format: double + dureeUsageAmont: + description: "" + type: number + format: double + dureeUsageAval: + description: "" + type: number + format: double nbCoeur: description: "" type: string