From f88a7554c058ffea57af2da97dcd8e8abd9d5829 Mon Sep 17 00:00:00 2001
From: Marty Fabien <fabien_marty@yahoo.fr>
Date: Fri, 24 Jan 2020 14:25:46 +0000
Subject: [PATCH] tooltip last update

---
 ...immo_saisie_suivi_prod_immo_operation.json |  16 ++-
 ..._prod_immo_operation_operation_acteur.json |  30 +++--
 ...d_immo_operation_operation_avancement.json |  18 ++-
 ...od_immo_operation_operation_financier.json |  66 ++++++++---
 ...o_operation_operation_mode_operatoire.json |   4 +-
 ...mmo_operation_operation_programmation.json |  58 ++++++---
 ...immo_saisie_suivi_prod_immo_programme.json |  20 +++-
 ..._prod_immo_programme_programme_acteur.json |  32 +++--
 ...vi_prod_immo_programme_programme_cout.json |  16 ++-
 ...rod_immo_programme_programme_synthese.json |  16 ++-
 .../module/javascript/script_module.js        |  72 +++++++++++-
 .../web_service/ws/Commune.class.inc          |   2 +-
 .../web_service/ws/Mode_financement.class.inc |   2 +-
 .../ws/OperationLastUpdate.class.inc          | 110 ++++++++++++++++++
 .../ws/ProgrammeLastUpdate.class.inc          | 110 ++++++++++++++++++
 .../web_service/ws/Suivi_prod_immo.class.inc  |   4 +
 .../ws/Suivi_prod_immo.class.sql.inc          |   4 +
 .../class/vmlib/files/Files_manager.class.inc |   2 -
 18 files changed, 505 insertions(+), 77 deletions(-)
 create mode 100644 src/module_suivi_prod_immo/web_service/ws/OperationLastUpdate.class.inc
 create mode 100644 src/module_suivi_prod_immo/web_service/ws/ProgrammeLastUpdate.class.inc

diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json
index 790fb14d..22a8de54 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation.json
@@ -483,7 +483,7 @@
         "rows":[
 		
         ],
-        "initEvent": "initAncTraitementForm()",
+        "initEvent": "",
         "event":"sendSimpleForm()",
         "afterEvent":"editSectionForm()",
         "tabs":{
@@ -514,7 +514,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":8,
-                        "id":"nom_operation"
+                        "id":"nom_operation",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nom_operation')"
                     },
 					{
                         "type":"label",
@@ -534,7 +536,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"surface"
+                        "id":"surface",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('surface')"
                     }
                 ]
             },
@@ -630,7 +634,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":12,
-                        "id":"commentaire_operation"
+                        "id":"commentaire_operation",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('commentaire_operation')"
                     }
                 ]
             },
@@ -661,7 +667,7 @@
                 ]
             }
         ],
-        "initEvent": "initAncTraitementForm()",
+        "initEvent": "",
         "event":"sendSimpleForm()",
         "tabs":{
             "position":"top",
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json
index 8f489a2b..066115a2 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_acteur.json
@@ -150,7 +150,7 @@
         "rows":[
 		
         ],
-        "initEvent": "initAncTraitementForm()",
+        "initEvent": "",
         "event":"sendSimpleForm()",
         "afterEvent":"editSectionForm()",
         "tabs":{
@@ -181,7 +181,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"nom_mo"
+                        "id":"nom_mo",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nom_mo')"
                     }
                 ]
             },
@@ -194,7 +196,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"cdp_mo"
+                        "id":"cdp_mo",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('cdp_mo')"
                     },
 					{
                         "type":"text",
@@ -203,7 +207,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"direction_mo"
+                        "id":"direction_mo",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('direction_mo')"
                     }
                 ]
             },
@@ -216,7 +222,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"nom_amenageur"
+                        "id":"nom_amenageur",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nom_amenageur')"
                     }
                 ]
             },
@@ -229,7 +237,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"cdp_amenageur"
+                        "id":"cdp_amenageur",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('cdp_amenageur')"
                     }
                 ]
             },
@@ -242,7 +252,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"nom_moe"
+                        "id":"nom_moe",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nom_moe')"
                     }
                 ]
             },
@@ -255,7 +267,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"architecte_moe"
+                        "id":"architecte_moe",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('architecte_moe')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json
index 169c1288..ef8acaca 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_avancement.json
@@ -134,7 +134,7 @@
         "rows":[
 		
         ],
-        "initEvent": "initAncTraitementForm()",
+        "initEvent": "",
         "event":"sendSimpleForm()",
         "afterEvent":"editSectionForm()",
         "tabs":{
@@ -198,7 +198,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"annee_init"
+                        "id":"annee_init",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('annee_init')"
                     },
 				    {
                         "type":"number",
@@ -207,7 +209,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"annee_achevement"
+                        "id":"annee_achevement",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('annee_achevement')"
                     }
                 ]
             },
@@ -220,7 +224,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"nb_phase"
+                        "id":"nb_phase",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nb_phase')"
                     },
                     {
                         "type":"text",
@@ -229,7 +235,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":10,
-                        "id":"commentaire_phase"
+                        "id":"commentaire_phase",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('commentaire_phase')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json
index 0c8ba463..d2b3bb91 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_financier.json
@@ -460,7 +460,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"depense_globale"
+                        "id":"depense_globale",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('depense_globale')"
                     },
                     {
                         "type":"label",
@@ -494,7 +496,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"pourc_depense_cout_foncier"
+                        "id":"pourc_depense_cout_foncier",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('pourc_depense_cout_foncier')"
                     },
                     {
                         "type":"text",
@@ -503,7 +507,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"depense_cout_foncier"
+                        "id":"depense_cout_foncier",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('depense_cout_foncier')"
                     }
                 ]
             },
@@ -530,7 +536,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"depense_mise_etat_sol"
+                        "id":"depense_mise_etat_sol",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('depense_mise_etat_sol')"
                     }
                 ]
             },
@@ -543,7 +551,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"recette_globale"
+                        "id":"recette_globale",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_globale')"
                     },
                     {
                         "type":"label",
@@ -577,7 +587,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"pourc_recette_cession"
+                        "id":"pourc_recette_cession",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('pourc_recette_cession')"
                     },
                     {
                         "type":"text",
@@ -586,7 +598,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_cession"
+                        "id":"recette_cession",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_cession')"
                     }
                 ]
             },
@@ -613,7 +627,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"pourc_recette_part_privee"
+                        "id":"pourc_recette_part_privee",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('pourc_recette_part_privee')"
                     },
                     {
                         "type":"text",
@@ -622,7 +638,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_part_privee"
+                        "id":"recette_part_privee",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_privee')"
                     }
                 ]
             },
@@ -649,7 +667,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"pourc_recette_part_publique"
+                        "id":"pourc_recette_part_publique",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('pourc_recette_part_publique')"
                     },
                     {
                         "type":"text",
@@ -658,7 +678,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_part_publique"
+                        "id":"recette_part_publique",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique')"
                     },
                     {
                         "type":"radio",
@@ -705,7 +727,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_part_publique_mdl"
+                        "id":"recette_part_publique_mdl",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique_mdl')"
                     }
                 ]
             },
@@ -732,7 +756,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_part_publique_ville"
+                        "id":"recette_part_publique_ville",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique_ville')"
                     }
                 ]
             },
@@ -759,7 +785,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_part_publique_anru"
+                        "id":"recette_part_publique_anru",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique_anru')"
                     }
                 ]
             },
@@ -786,7 +814,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"recette_part_publique_autre"
+                        "id":"recette_part_publique_autre",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique_autre')"
                     },
                     {
                         "type":"text",
@@ -795,7 +825,11 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":4,
-                        "id":"recette_part_publique_autre_commentaire"
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique_autre_commentaire')",
+                        "id":"recette_part_publique_autre_commentaire",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('recette_part_publique_autre_commentaire')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json
index db38c869..a660fc74 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_mode_operatoire.json
@@ -196,7 +196,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":6,
-                        "id":"commentaire_operation_mixte"
+                        "id":"commentaire_operation_mixte",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('commentaire_operation_mixte')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json
index ff73b9dd..f35a5ca0 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_operation_operation_programmation.json
@@ -381,7 +381,7 @@
         "rows":[
 		
         ],
-        "initEvent": "initAncTraitementForm()",
+        "initEvent": "",
         "event":"sendSimpleForm()",
         "afterEvent":"editSectionForm()",
         "tabs":{
@@ -441,7 +441,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp"
+                        "id":"sdp",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp')"
                     },
                     {
                         "type":"label",
@@ -468,7 +470,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_bureau"
+                        "id":"sdp_bureau",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_bureau')"
                     },
                     {
                         "type":"label",
@@ -491,7 +495,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_equipement"
+                        "id":"sdp_equipement",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_bureau')"
                     }
                 ]
             },
@@ -511,7 +517,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_commerce_service"
+                        "id":"sdp_commerce_service",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_commerce_service')"
                     },
                     {
                         "type":"label",
@@ -527,7 +535,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":3,
-                        "id":"commentaire_sdp_equipement"
+                        "id":"commentaire_sdp_equipement",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('commentaire_sdp_equipement')"
                     }
                 ]
             },
@@ -547,7 +557,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_loisir"
+                        "id":"sdp_loisir",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_loisir')"
                     },
                     {
                         "type":"label",
@@ -570,7 +582,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"emprise_espace_public_vert"
+                        "id":"emprise_espace_public_vert",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('emprise_espace_public_vert')"
                     }
                 ]
             },
@@ -590,7 +604,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_hotel"
+                        "id":"sdp_hotel",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_hotel')"
                     },
                     {
                         "type":"label",
@@ -606,7 +622,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":3,
-                        "id":"commentaire_espace_public_vert"
+                        "id":"commentaire_espace_public_vert",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('commentaire_espace_public_vert')"
                     }
                 ]
             },
@@ -626,7 +644,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_locaux"
+                        "id":"sdp_locaux",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_locaux')"
                     }
                 ]
             },
@@ -646,7 +666,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"sdp_logement"
+                        "id":"sdp_logement",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('sdp_logement')"
                     }
                 ]
             },
@@ -666,7 +688,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"nb_logement"
+                        "id":"nb_logement",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nb_logement')"
                     },
                     {
                         "type":"label",
@@ -682,7 +706,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"nb_lgt_fam"
+                        "id":"nb_lgt_fam",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nb_lgt_fam')"
                     },
                     {
                         "type":"text",
@@ -691,7 +717,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"nb_lgt_spe"
+                        "id":"nb_lgt_spe",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getOperationTooltipLastUpdate('nb_lgt_spe')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json
index e6cbde31..3ce206b5 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme.json
@@ -378,7 +378,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":8,
-                        "id":"nom_programme"
+                        "id":"nom_programme",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('nom_programme')"
                     },
                     {
                         "type":"label",
@@ -416,7 +418,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":8,
-                        "id":"adresse_programme"
+                        "id":"adresse_programme",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('adresse_programme')"
                     },
                     {
                         "type":"select",
@@ -447,7 +451,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"numero_pc"
+                        "id":"numero_pc",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('numero_pc')"
                     }
                 ]
             },	
@@ -460,7 +466,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":1,
-                        "id":"surface"
+                        "id":"surface",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('surface')"
                     }
                 ]
             },
@@ -495,7 +503,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":12,
-                        "id":"commentaire_programme"
+                        "id":"commentaire_programme",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('commentaire_programme')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json
index fd2d6233..b19a898f 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_acteur.json
@@ -231,7 +231,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":5,
-                        "id":"nom_demandeur"
+                        "id":"nom_demandeur",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('nom_demandeur')"
                     }
                 ]
             },
@@ -244,7 +246,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":5,
-                        "id":"nom_moe"
+                        "id":"nom_moe",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('nom_moe')"
                     }
                 ]
             },
@@ -257,7 +261,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"annee_debut"
+                        "id":"annee_debut",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('annee_debut')"
                     }
                 ]
             },
@@ -270,7 +276,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"annee_fin"
+                        "id":"annee_fin",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('annee_fin')"
                     }
                 ]
             },
@@ -283,7 +291,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"annee_achat_terrain_operateur"
+                        "id":"annee_achat_terrain_operateur",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('annee_achat_terrain_operateur')"
                     }
                 ]
             },
@@ -296,7 +306,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"date_debut_commercialisation"
+                        "id":"date_debut_commercialisation",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('date_debut_commercialisation')"
                     }
                 ]
             },
@@ -309,7 +321,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"date_fin_commercialisation"
+                        "id":"date_fin_commercialisation",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('date_fin_commercialisation')"
                     }
                 ]
             },
@@ -322,7 +336,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"tx_ecoulement_commercialisation"
+                        "id":"tx_ecoulement_commercialisation",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('tx_ecoulement_commercialisation')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json
index 615b2034..77bf1bd7 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_cout.json
@@ -183,7 +183,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"cout_total_programme"
+                        "id":"cout_total_programme",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('cout_total_programme')"
                     }
                 ]
             },
@@ -207,7 +209,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"charge_fonciere_nette"
+                        "id":"charge_fonciere_nette",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('charge_fonciere_nette')"
                     }
                 ]
             },
@@ -234,7 +238,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":3,
-                        "id":"cout_foncier_brut"
+                        "id":"cout_foncier_brut",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('cout_foncier_brut')"
                     }
                 ]
             },
@@ -254,7 +260,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":3,
-                        "id":"cout_depol_demol"
+                        "id":"cout_depol_demol",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('cout_depol_demol')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json
index 0b8bc8f2..371392a6 100644
--- a/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json
+++ b/src/module_suivi_prod_immo/module/forms/suivi_prod_immo_saisie/suivi_prod_immo_saisie_suivi_prod_immo_programme_programme_synthese.json
@@ -147,7 +147,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"surface_moy_logement"
+                        "id":"surface_moy_logement",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('surface_moy_logement')"
                     }
                 ]
             },
@@ -160,7 +162,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"cout_construction_moyen"
+                        "id":"cout_construction_moyen",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('cout_construction_moyen')"
                     }
                 ]
             },
@@ -173,7 +177,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"charge_fonciere_moy"
+                        "id":"charge_fonciere_moy",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('charge_fonciere_moy')"
                     }
                 ]
             },
@@ -186,7 +192,9 @@
                         "required":false,
                         "pattern":"",
                         "nb_cols":2,
-                        "id":"prix_commercial_moyen"
+                        "id":"prix_commercial_moyen",
+                        "dynamic_event_type": "focus",
+                        "dynamic_event_function": "getProgrammeTooltipLastUpdate('prix_commercial_moyen')"
                     }
                 ]
             },
diff --git a/src/module_suivi_prod_immo/module/javascript/script_module.js b/src/module_suivi_prod_immo/module/javascript/script_module.js
index 2e67c539..dbabe56d 100644
--- a/src/module_suivi_prod_immo/module/javascript/script_module.js
+++ b/src/module_suivi_prod_immo/module/javascript/script_module.js
@@ -11,7 +11,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
      */
     angular.element(vitisApp.appMainDrtv).scope()["loadSuiviProdImmoRepartitionLogControl"] = function () {
         // Injection des services.
-        var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]);
+        /*var $log = angular.element(vitisApp.appMainDrtv).injector().get(["$log"]);
         var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]);
         var $translate = angular.element(vitisApp.appMainDrtv).injector().get(["$translate"]);
         var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]);
@@ -58,7 +58,75 @@ vitisApp.on('appMainDrtvLoaded', function () {
                 else if (oGridOptions["appActions"][i]["name"].indexOf("_delete") != -1)
                     oGridOptions["appActions"][i]["event"] = "DeleteSelection({'sIdField':'id_traitement'})";
             }
-        });
+        });*/
     };
+	
+	/**
+	 * getOperationTooltipLastUpdate
+	 *
+	 * add a tooltip for operation table field with the last update (user, date, old value)
+	 */
+	angular.element(vitisApp.appMainDrtv).scope()["getOperationTooltipLastUpdate"] = function(sFieldName){
+		var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]);
+		var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]);
+		var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]);
+		var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]);
+		var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope();
+		var oAttribute = formSrvc["getFormElementDefinition"](sFieldName, envSrvc["sFormDefinitionName"], envSrvc["oFormDefinition"]);
+		var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]];
+		
+		// récupération du contenu sur le serveur
+		ajaxRequest({
+			"method": "GET",
+			"url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/suivi_prod_immo/operationlastupdate/"+ oFormValues['id_operation'] +"/" + sFieldName,
+			"scope": $rootScope,
+			"success": function (response) {
+				// si il y a une valeur pour l'attribut, alors on ajout le tooltip
+				if (goog.isDefAndNotNull(response.data)){
+					oAttribute.tooltip={
+						"title": "Dernière mise à jour :",
+						"content": "Le " + moment(response.data.date_update).format('L') + " par l'utilisateur " + response.data.user_update + " (ancienne valeur : " + response.data.old_value + ")",
+						"container": "body",
+						"trigger": "hover"
+					};
+					formScope.ctrl.refreshForm();
+				}
+			}
+		});
+	};
+	
+	/**
+	 * getProgrammeTooltipLastUpdate
+	 *
+	 * add a tooltip for programme table field with the last update (user, date, old value)
+	 */
+	angular.element(vitisApp.appMainDrtv).scope()["getProgrammeTooltipLastUpdate"] = function(sFieldName){
+		var $rootScope = angular.element(vitisApp.appMainDrtv).injector().get(["$rootScope"]);
+		var envSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["envSrvc"]);
+		var formSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["formSrvc"]);
+		var propertiesSrvc = angular.element(vitisApp.appMainDrtv).injector().get(["propertiesSrvc"]);
+		var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope();
+		var oAttribute = formSrvc["getFormElementDefinition"](sFieldName, envSrvc["sFormDefinitionName"], envSrvc["oFormDefinition"]);
+		var oFormValues = envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]];
+		
+		// récupération du contenu sur le serveur
+		ajaxRequest({
+			"method": "GET",
+			"url": propertiesSrvc["web_server_name"] + "/" + propertiesSrvc["services_alias"] + "/suivi_prod_immo/programmelastupdate/"+ oFormValues['id_programme'] +"/" + sFieldName,
+			"scope": $rootScope,
+			"success": function (response) {
+				// si il y a une valeur pour l'attribut, alors on ajout le tooltip
+				if (goog.isDefAndNotNull(response.data)){
+					oAttribute.tooltip={
+						"title": "Dernière mise à jour :",
+						"content": "Le " + moment(response.data.date_update).format('L') + " par l'utilisateur " + response.data.user_update + " (ancienne valeur : " + response.data.old_value + ")",
+						"container": "body",
+						"trigger": "hover"
+					};
+					formScope.ctrl.refreshForm();
+				}
+			}
+		});
+	};
 
 });
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc b/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc
index 721f6370..7eb06666 100644
--- a/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc
+++ b/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc
@@ -1,7 +1,7 @@
 <?php
 
 require_once __DIR__ . '/Suivi_prod_immo.class.inc';
-require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+require_once __DIR__ . '/../../../vitis/vas/rest/class/vitis_lib/Connection.class.inc';
 
 /**
  * \file Suivi_prod_immo.class.inc
diff --git a/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc b/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc
index 2ca2732d..4f7b5657 100644
--- a/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc
+++ b/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc
@@ -1,7 +1,7 @@
 <?php
 
 require_once __DIR__ . '/Suivi_prod_immo.class.inc';
-require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+require_once __DIR__ . '/../../../vitis/vas/rest/class/vitis_lib/Connection.class.inc';
 
 /**
  * \file Suivi_prod_immo.class.inc
diff --git a/src/module_suivi_prod_immo/web_service/ws/OperationLastUpdate.class.inc b/src/module_suivi_prod_immo/web_service/ws/OperationLastUpdate.class.inc
new file mode 100644
index 00000000..bc87f2e1
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/OperationLastUpdate.class.inc
@@ -0,0 +1,110 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+/**
+ * \file OperationLastUpdate.class.inc
+ * \class OperationLastUpdate
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the OperationLastUpdate php class
+ *
+ * This class defines the rest api for operationlastupdate
+ *
+ */
+class OperationLastUpdate extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/operationlastupdate",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/operationlastupdate")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="OperationLastUpdate",
+     *   description="Operations about OperationLastUpdate"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Get(path="/operationlastupdate/{iIdOperation}/{sAttributeName}",
+     *   tags={"Parcelle"},
+     *   summary="Get the tooltip "last update" content",
+     *   description="Request to get tooltip "last update" content",
+     *   operationId="GET",
+     *   produces={"application/json"},
+     * @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="iIdOperation",
+     *     in="path",
+     *     description="iIdOperation",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="sAttributeName",
+     *     in="path",
+     *     description="sAttributeName",
+     *     required=true,
+     *     type="sting"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="OperationLastUpdate Response",
+     *         @SWG\Schema(ref="#/definitions/operationlastupdate")
+     *     )
+     *  )
+     */
+
+    /**
+     * Get function to get tooltip "last update" content
+     * @return the tooltip "last update" content values
+     */
+    function GET() {
+        $iIdOperation = $this->aPath[2];
+        $sAttributeName = $this->aPath[3];
+
+		require $this->sRessourcesFile;
+        $aRecords = Array();
+		$aSQLParams = array('sField' => array('value' => $sAttributeName, 'type' => 'column_name'), 'iIdOperation' => array('value' => $iIdOperation, 'type' => 'string'));
+		$oResult = $this->oConnection->oBd->executeWithParams($aSql['getUpdateTrackingOperation'], $aSQLParams);
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            return $this->oError->aFields;
+        }
+
+        if (gettype($oResult) == 'object') {
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                array_push($aRecords, $aLigne);
+            }
+        }
+		// error_log(json_encode($aRecords[0]));
+        return json_encode($aRecords[0]);
+    }
+
+}
+
+?>
diff --git a/src/module_suivi_prod_immo/web_service/ws/ProgrammeLastUpdate.class.inc b/src/module_suivi_prod_immo/web_service/ws/ProgrammeLastUpdate.class.inc
new file mode 100644
index 00000000..59c0640f
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/ProgrammeLastUpdate.class.inc
@@ -0,0 +1,110 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/ws/vitis/Vitis.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
+
+/**
+ * \file ProgrammeLastUpdate.class.inc
+ * \class ProgrammeLastUpdate
+ *
+ * \author Armand Bahi <armand.bahi@veremes.com>.
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the ProgrammeLastUpdate php class
+ *
+ * This class defines the rest api for programmelastupdate
+ *
+ */
+class ProgrammeLastUpdate extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/programmelastupdate",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/programmelastupdate")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="ProgrammeLastUpdate",
+     *   description="Programmes about ProgrammeLastUpdate"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $bShortcut false to reinit variables
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
+
+    /**
+     * @SWG\Get(path="/programmelastupdate/{iIdProgramme}/{sAttributeName}",
+     *   tags={"Parcelle"},
+     *   summary="Get the tooltip "last update" content",
+     *   description="Request to get tooltip "last update" content",
+     *   programmeId="GET",
+     *   produces={"application/json"},
+     * @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="iIdProgramme",
+     *     in="path",
+     *     description="iIdProgramme",
+     *     required=true,
+     *     type="integer"
+     *   ),
+     *   @SWG\Parameter(
+     *     name="sAttributeName",
+     *     in="path",
+     *     description="sAttributeName",
+     *     required=true,
+     *     type="sting"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="ProgrammeLastUpdate Response",
+     *         @SWG\Schema(ref="#/definitions/programmelastupdate")
+     *     )
+     *  )
+     */
+
+    /**
+     * Get function to get tooltip "last update" content
+     * @return the tooltip "last update" content values
+     */
+    function GET() {
+        $iIdProgramme = $this->aPath[2];
+        $sAttributeName = $this->aPath[3];
+
+		require $this->sRessourcesFile;
+        $aRecords = Array();
+		$aSQLParams = array('sField' => array('value' => $sAttributeName, 'type' => 'column_name'), 'iIdProgramme' => array('value' => $iIdProgramme, 'type' => 'string'));
+		$oResult = $this->oConnection->oBd->executeWithParams($aSql['getUpdateTrackingProgramme'], $aSQLParams);
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+            return $this->oError->aFields;
+        }
+
+        if (gettype($oResult) == 'object') {
+            while ($aLigne = $this->oConnection->oBd->ligneSuivante($oResult)) {
+                array_push($aRecords, $aLigne);
+            }
+        }
+		// error_log(json_encode($aRecords[0]));
+        return json_encode($aRecords[0]);
+    }
+
+}
+
+?>
diff --git a/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc
index ff0707ff..80b1ba06 100644
--- a/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc
+++ b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc
@@ -8,6 +8,10 @@ class Suivi_prod_immo extends Vitis {
 
     //Chemin du fichier de ressources contenant les requêtes SQL
     var $sRessourcesFile = 'ws/suivi_prod_immo/Suivi_prod_immo.class.sql.inc';
+	
+    function __construct($aPath, $aValues, $properties, $bShortcut = false, $oConnection = false) {
+        parent::__construct($aPath, $aValues, $properties, $bShortcut, $oConnection);
+    }
 
 }
 ?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc
index c7e40aae..fa773e4a 100644
--- a/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc
+++ b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc
@@ -40,6 +40,10 @@ $aSql['getSuivi'] = "SELECT \"tr_suivi\".code_suivi, \"tr_suivi\".suivi FROM [sS
 $aSql['getProcedureAmenagement'] = "SELECT \"tr_procedure_amenagement\".code_procedure_amenagement, \"tr_procedure_amenagement\".procedure_amenagement FROM [sSchemaFramework].tr_procedure_amenagement WHERE code_procedure_amenagement = [code_procedure_amenagement]";
 // Vocation
 $aSql['getVocation'] = "SELECT \"tr_vocation\".code_vocation, \"tr_vocation\".vocation FROM [sSchemaFramework].tr_vocation WHERE code_vocation = [code_vocation]";
+// TooltipLastUpdate
+$aSql['getUpdateTrackingOperation'] = "SELECT \"user\" AS user_update, date AS date_update, old_value	FROM prod_immo.update_tracking_operation WHERE id_operation=[iIdOperation] AND field='[sField]' ORDER BY date_update DESC LIMIT 1";
+$aSql['getUpdateTrackingProgramme'] = "SELECT \"user\" AS user_update, date AS date_update, old_value	FROM prod_immo.update_tracking_programme WHERE id_programme=[iIdProgramme] AND field='[sField]' ORDER BY date_update DESC LIMIT 1";
+
 // Répartition type logement DEPRECATED
 // $aSql['getRepartitionTypeLogement'] = "SELECT type_logement, repartition FROM [sSchemaFramework].v_repartion_type_logement WHERE id_operation=[id_operation]";
 ?>
\ No newline at end of file
diff --git a/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc b/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc
index a09f027d..ebc3ce8d 100755
--- a/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc
+++ b/src/vitis/vas/rest/class/vmlib/files/Files_manager.class.inc
@@ -28,8 +28,6 @@ class Files_manager{
         // Dans tous les cas on peut avoir besoin d'accéder au système local
         $this->oLocalInterface = new Local_files ($oProperties);
         // Séléction du mode principal
-	error_log('File System : ');
-	error_log($oProperties["filesystem"]);
         switch ($oProperties["filesystem"]) {
             case 'fs':
                 $this->oFileInterface = $this->oLocalInterface;
-- 
GitLab