diff --git a/conf/Gruntfile.js b/conf/Gruntfile.js
index 2968b96a4e1ed39f07063a1bd8e043b7fd920b41..d30c6c9d3432013d2b8587084f901e7aa35560de 100755
--- a/conf/Gruntfile.js
+++ b/conf/Gruntfile.js
@@ -42,7 +42,8 @@ module.exports = function (grunt) {
                         // Fichiers vMap4MapServer
                         sHome + 'modules/vm4ms/javascript/**/*.js',
                         // Fichiers ANC
-                        sHome + 'modules/anc/javascript/**/*.js'
+                        sHome + 'modules/anc/javascript/**/*.js',
+                        sHome + 'modules/suivi_prod_immo/javascript/**/*.js'
                     ]
                 },
                 options: {
@@ -125,6 +126,7 @@ module.exports = function (grunt) {
                     '"' + sHome + 'modules/vm4ms/javascript ' + sClosureDepsHome + 'modules/vm4ms/javascript"',
                     // Fichiers vMap4MapServer
                     '"' + sHome + 'modules/anc/javascript ' + sClosureDepsHome + 'modules/anc/javascript"',
+                    '"' + sHome + 'modules/suivi_prod_immo/javascript ' + sClosureDepsHome + 'modules/suivi_prod_immo/javascript"',
                     // Closure library
                     '"' + sHome + 'conf/node_modules/google-closure-library/closure/goog ' + sClosureDepsHome + 'conf/node_modules/google-closure-library/closure/goog"'
                 ]
diff --git a/conf/requires/requiresApp.js b/conf/requires/requiresApp.js
index 616d38dad7241cdb3244ecd921ad501b04792ec2..f78b803e439e35e4abda4e23283515ad59e53a99 100755
--- a/conf/requires/requiresApp.js
+++ b/conf/requires/requiresApp.js
@@ -9,4 +9,5 @@
 goog.provide('vitis.application.requires');
 goog.require('vmap.script_module');
 goog.require('vmap.vm4ms.script_module');
-goog.require('vmap.anc.script_module');
\ No newline at end of file
+goog.require('vmap.anc.script_module');
+goog.require('vmap.suivi_prod_immo.script_module');
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/module/javascript/script_module.js b/src/module_suivi_prod_immo/module/javascript/script_module.js
new file mode 100644
index 0000000000000000000000000000000000000000..c11531c33a0b54e30abf954b5b08566daecadde9
--- /dev/null
+++ b/src/module_suivi_prod_immo/module/javascript/script_module.js
@@ -0,0 +1,63 @@
+/* global vitisApp, goog, angular, bootbox, oVFB */
+
+'use strict';
+goog.provide('vmap.suivi_prod_immo.script_module');
+vitisApp.on('appMainDrtvLoaded', function () {
+
+    /**
+     * loadSuiviProdImmoRepartitionLogControl function.
+     * Chargement de la section "Prétraitement" de l'onglet "Contrôle".
+     */
+    angular.element(vitisApp.appMainDrtv).scope()["loadSuiviProdImmoRepartitionLogControl"] = function () {
+        // Injection des services.
+        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"]);
+        //
+        $log.info("loadSuiviProdImmoRepartitionLogControl");
+        // Sauve certaines données de la liste.
+        var sSortedBy = envSrvc["oSelectedObject"]["sorted_by"];
+        var sSortedDir = envSrvc["oSelectedObject"]["sorted_dir"];
+        var sEditColumn = envSrvc["oSelectedObject"]["edit_column"];
+        var sShowColumn = envSrvc["oSelectedObject"]["show_column"];
+        // Colonne et sens de tri.
+        envSrvc["oSelectedObject"]["sorted_by"] = "id_traitement";
+        envSrvc["oSelectedObject"]["sorted_dir"] = "ASC";
+        envSrvc["oSelectedObject"]["edit_column"] = "editModalSectionForm";
+        envSrvc["oSelectedObject"]["show_column"] = "showModalSectionForm";
+        // "sIdField" pour les boutons du mode "update" et "display".
+        envSrvc["oSelectedObject"]["sIdField"] = "id_controle";
+        // Affiche la liste des prétraitements du contrôle.
+        $translate(["GRID_TITLE_ANC_SAISIE_ANC_CONTROLE_CONTROLE_TRAITEMENT"]).then(function (oTranslations) {
+            // Paramètres de la liste + boutons.
+            var oGridOptions = {
+                "appHeader": true,
+                "appHeaderSearchForm": false,
+                "appGridTitle": oTranslations["GRID_TITLE_ANC_SAISIE_ANC_CONTROLE_CONTROLE_TRAITEMENT"],
+                "appShowActions": true,
+                "appIdField": "id_traitement"
+            };
+            //
+            $rootScope["loadSectionList"](oGridOptions);
+        });
+        // Attends que les boutons du "header" soient ajoutés.
+        var clearListener = $rootScope.$on('workspaceListHeaderActionsAdded', function (event, oGridOptions) {
+            // Supprime le "listener".
+            clearListener();
+            // Restaure les données originales de la liste.
+            envSrvc["oSelectedObject"]["sorted_by"] = sSortedBy;
+            envSrvc["oSelectedObject"]["sorted_dir"] = sSortedDir;
+            envSrvc["oSelectedObject"]["edit_column"] = sEditColumn;
+            envSrvc["oSelectedObject"]["show_column"] = sShowColumn;
+            // Boutons d'ajout et de suppression d'un traitement.
+            for (var i = 0; i < oGridOptions["appActions"].length; i++) {
+                if (oGridOptions["appActions"][i]["name"].indexOf("_add") != -1)
+                    oGridOptions["appActions"][i]["event"] = "addModalSectionForm()";
+                else if (oGridOptions["appActions"][i]["name"].indexOf("_delete") != -1)
+                    oGridOptions["appActions"][i]["event"] = "DeleteSelection({'sIdField':'id_traitement'})";
+            }
+        });
+    };
+
+});
\ 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
new file mode 100644
index 0000000000000000000000000000000000000000..721f6370fb36e0ecb24256fe47f48f88524f7225
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Commune.class.inc
@@ -0,0 +1,45 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Suivi_prod_immo.class.inc
+ * \class Suivi_prod_immo
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Suivi_prod_immo php class
+ *
+ * This class defines commune for one Suivi_prod_immo
+ * 
+ */
+
+class Commune extends Suivi_prod_immo {
+	
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * get informations about commune
+     */
+    function GET() {
+        $this->aFields = $this->getFields('prod_immo', "commune", "id_commune");
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Communes.class.inc b/src/module_suivi_prod_immo/web_service/ws/Communes.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..65af9cd08baad0be69428b36edc54af245fff619
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Communes.class.inc
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * \file Communes.class.inc
+ * \class Communes
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Communes php class
+ *
+ * This class defines Rest Api to Vitis Communes
+ * 
+ */
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once 'Commune.class.inc';
+
+
+class Communes extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/communes",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/communes")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Communes",
+     *   description="Communes about Communes"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $properties);
+    }
+
+    /**
+     * @SWG\Get(path="/communes",
+     *   tags={"Communes"},
+     *   summary="Get Communes",
+     *   description="Request to get Communes",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort_order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/communes")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Communes
+     * @return  Communes
+     */
+    function GET() {
+        $aReturn = $this->genericGet('prod_immo', "commune", "id_commune");
+        $sMessage = $aReturn['sMessage'];
+        return $sMessage;
+    }
+
+    
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Ctm.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ctm.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..64d183c9df8415512b7c229849efe9b984e85c9b
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Ctm.class.inc
@@ -0,0 +1,45 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Suivi_prod_immo.class.inc
+ * \class Suivi_prod_immo
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Suivi_prod_immo php class
+ *
+ * This class defines conference_territoriale_maire for one Suivi_prod_immo
+ * 
+ */
+
+class Ctm extends Suivi_prod_immo {
+	
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * get informations about conference_territoriale_maire
+     */
+    function GET() {
+        $this->aFields = $this->getFields('prod_immo', "conference_territoriale_maire", "id_ctm");
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Ctms.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ctms.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..e71c2675b1fba3147e41f87c71320f346a921a68
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Ctms.class.inc
@@ -0,0 +1,130 @@
+<?php
+
+/**
+ * \file Ctms.class.inc
+ * \class Ctms
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the conference_territoriale_maire php class
+ *
+ * This class defines Rest Api to Vitis Ctms
+ * 
+ */
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once 'Ctm.class.inc';
+
+
+class Ctms extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/ctms",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/ctms")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Ctms",
+     *   description="Ctms about Ctms"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $properties);
+    }
+
+    /**
+     * @SWG\Get(path="/ctms",
+     *   tags={"Ctms"},
+     *   summary="Get Ctms",
+     *   description="Request to get Ctms",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort_order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/ctms")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Ctms
+     * @return  Ctms
+     */
+    function GET() {
+        $aReturn = $this->genericGet('prod_immo', "conference_territoriale_maire", "id_ctm");
+        return $aReturn['sMessage'];
+    }
+
+    
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Ilot.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ilot.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..9dbc5fd663ce8a040065f35220bb2b4397753721
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Ilot.class.inc
@@ -0,0 +1,57 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Suivi_prod_immo.class.inc
+ * \class Suivi_prod_immo
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Suivi_prod_immo php class
+ *
+ * This class defines ilot for one Suivi_prod_immo
+ * 
+ */
+
+class Ilot extends Suivi_prod_immo {
+	
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * get informations about ilot
+     */
+    function GET() {
+        $this->aFields = $this->getFields('prod_immo', "ilot", "id_ilot");
+    }
+
+    /**
+     * delete a ilot
+     */
+    function DELETE() {
+        $this->oConnection->oBd->delete('prod_immo', 'ilot', 'id_ilot', $this->aValues["my_vitis_id"], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields["id_ilot"] = $this->aValues["my_vitis_id"];
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Ilots.class.inc b/src/module_suivi_prod_immo/web_service/ws/Ilots.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..113033e12353b3ce2c2a70a3a376b487f37c4e2d
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Ilots.class.inc
@@ -0,0 +1,274 @@
+<?php
+
+/**
+ * \file Ilots.class.inc
+ * \class Ilots
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Ilots php class
+ *
+ * This class defines Rest Api to Vitis Ilots
+ * 
+ */
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once 'Ilot.class.inc';
+
+
+class Ilots extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/ilots",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/ilots")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Ilots",
+     *   description="Ilots about Ilots"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $properties);
+    }
+
+    /**
+     * @SWG\Get(path="/ilots",
+     *   tags={"Ilots"},
+     *   summary="Get Ilots",
+     *   description="Request to get Ilots",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort_order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/ilots")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Ilots
+     * @return  Ilots
+     */
+    function GET() {
+        $aReturn = $this->genericGet('prod_immo', "ilot", "id_ilot");
+        $sMessage = $aReturn['sMessage'];
+        return $sMessage;
+    }
+
+    /**
+     * @SWG\Post(path="/ilots",
+     *   tags={"Ilots"},
+     *   summary="Add traitement",
+     *   description="Request to add Ilots",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/ilots")
+     *     )
+     *  )
+     */
+
+    /**
+     * insert traitement
+     * @return id of the traitement created
+     */
+    function POST() {
+        //$this->aValues['create'] = $_SESSION["ses_Login"];
+        //$this->aValues['create_date'] = date('Y-m-d');
+        $aReturn = $this->genericPost('prod_immo', 'ilot', 'prod_immo.ilot_id_ilot_seq', 'id_ilot');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/ilots/{id_ilot}",
+     *   tags={"Ilots"},
+     *   summary="update Ilots",
+     *   description="Request to update Ilots",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="Traitement token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="id_ilot",
+     *     in="path",
+     *     description="id of the Ilots",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/ilots")
+     *     )
+     *  )
+     */
+
+    /**
+     * update ilots
+     * @return id of ilots updated or error object if a ilots is not updated
+     */
+    function PUT() {
+        /*if (empty($this->aValues['maj']))
+            $this->aValues['maj'] = $_SESSION["ses_Login"];
+        if (empty($this->aValues['maj_date']))
+            $this->aValues['maj_date'] = date('Y-m-d');*/
+        $aReturn = $this->genericPut('prod_immo', 'ilot', 'id_ilot');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/ilots",
+     *   tags={"Ilots"},
+     *   summary="delete Ilots",
+     *   description="Request to delete Ilots",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the traitement",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/ilots")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/ilots/{id_ilot}",
+     *   tags={"Ilots"},
+     *   summary="delete Ilots",
+     *   description="Request to delete Ilots",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="Traitement token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="id_ilot",
+     *     in="path",
+     *     description="id of the Ilots",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/ilots")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete ilots
+     * @return id of ilots deleted or error object if a ilots is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete('prod_immo', 'ilot', 'id_ilot');
+        return $aReturn['sMessage'];
+    }
+
+    
+}
+
+?>
\ No newline at end of file
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
new file mode 100644
index 0000000000000000000000000000000000000000..2ca2732d4078f9e7f81ca961dd0028dce4c431e5
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Mode_financement.class.inc
@@ -0,0 +1,45 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Suivi_prod_immo.class.inc
+ * \class Suivi_prod_immo
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Suivi_prod_immo php class
+ *
+ * This class defines mode financement for one Suivi_prod_immo
+ * 
+ */
+
+class Mode_financement extends Suivi_prod_immo {
+	
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * get informations about mode financement
+     */
+    function GET() {
+        $this->aFields = $this->getFields('prod_immo', "tr_financement_equ_public", "code_financement_equ_public");
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Mode_financements.class.inc b/src/module_suivi_prod_immo/web_service/ws/Mode_financements.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..e80fcc653883bf83f37433f407262937409ec8a5
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Mode_financements.class.inc
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * \file Mode_financements.class.inc
+ * \class Mode_financements
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Mode_financements php class
+ *
+ * This class defines Rest Api to Vitis Mode_financements
+ * 
+ */
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once 'Mode_financement.class.inc';
+
+
+class Mode_financements extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/mode_financements",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/mode_financements")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Mode_financements",
+     *   description="Mode_financements about Mode_financements"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $properties);
+    }
+
+    /**
+     * @SWG\Get(path="/mode_financements",
+     *   tags={"Mode_financements"},
+     *   summary="Get Mode_financements",
+     *   description="Request to get Mode_financements",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort_order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/mode_financements")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Mode_financements
+     * @return  Mode_financements
+     */
+    function GET() {
+        $aReturn = $this->genericGet('prod_immo', "tr_financement_equ_public", "code_financement_equ_public");
+        $sMessage = $aReturn['sMessage'];
+        return $sMessage;
+    }
+
+    
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Operation.class.inc b/src/module_suivi_prod_immo/web_service/ws/Operation.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..916a05595e936a6cd0899b2e23f6d21f96ef1f3c
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Operation.class.inc
@@ -0,0 +1,247 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Suivi_prod_immo.class.inc
+ * \class Suivi_prod_immo
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Suivi_prod_immo php class
+ *
+ * This class defines operation for one Suivi_prod_immo
+ * 
+ */
+
+class Operation extends Suivi_prod_immo {
+	
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * get informations about operation
+     */
+    function GET() {
+        $this->aFields = $this->getFields('prod_immo', "operation", "id_operation");
+		$this->getCommunes();
+		$this->getPerimetre();
+		$this->getCTM();
+		$this->getModeFinancement();
+		$this->getAvancement();
+		$this->getContexteUrbain();
+		$this->getSuivi();
+		$this->getProcedureAmenagement();
+		$this->getVocation();
+		//$this->getRepartitionTypeLogement();
+		// Date de mise à jour
+		$date_mise_a_jour = new DateTime($this->aFields['date_mise_a_jour']);
+		$this->aFields['date_mise_a_jour'] = $date_mise_a_jour->format('d/m/Y');
+		$this->aFields['recette_part_publique_ttc_label'] = $this->aFields['recette_part_publique_ttc'] == 'true' ? 'TTC' : 'HT';
+    }
+	
+    /**
+     *  get communes of operation
+     */
+    function getCommunes() {
+        require $this->sRessourcesFile;
+		$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+		$aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+		$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationCommunes'], $aParams);
+		$sListCommuneId = "";
+		$aListCommuneNom = array();
+		while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+			if ($sListCommuneId == "") {
+				$sListCommuneId = $aLigne["id_commune"];
+			} else {
+				$sListCommuneId .= "|" . $aLigne["id_commune"];
+			}
+			$aListCommuneNom[] = $aLigne["nom_commune"];
+		}
+		$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		$this->aFields['communes'] = $sListCommuneId;
+		$this->aFields['communes_label'] = implode(',', $aListCommuneNom);
+		
+    }
+
+    /**
+	 *  get CTM of operation
+	 */
+    function getCTM() {
+        require $this->sRessourcesFile;
+		$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+		$aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+		$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationCTM'], $aParams);
+		$sListCTMId = "";
+		$aListCTMNom = array();
+		while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+			if ($sListCTMId == "") {
+				$sListCTMId = $aLigne["id_ctm"];
+			} else {
+				$sListCTMId .= "|" . $aLigne["id_ctm"];
+			}
+			$aListCTMNom[] = $aLigne["nom_ctm"];
+		}
+		$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		$this->aFields['ctms'] = $sListCTMId;
+		$this->aFields['ctms_label'] = implode(',', $aListCTMNom);
+    }
+
+    /**
+	 *  get Modes financement of operation
+	 */
+    function getModeFinancement() {
+        require $this->sRessourcesFile;
+		$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+		$aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+		$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationModesFinancement'], $aParams);
+		$sListCodeFinancement = "";
+		$sListFinancement = array();
+		while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+			if ($sListCodeFinancement == "") {
+				$sListCodeFinancement = $aLigne["code_financement_equ_public"];
+			} else {
+				$sListCodeFinancement .= "|" . $aLigne["code_financement_equ_public"];
+			}
+			$sListFinancement[] = $aLigne["financement_equ_public"];
+		}
+		$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		$this->aFields['mode_financements'] = $sListCodeFinancement;
+		$this->aFields['mode_financements_label'] = implode(',', $sListFinancement);
+    }
+	
+    /**
+     *  get perimetre projet urbain of programme
+     */
+    function getPerimetre() {
+        if(isset($this->aFields['id_perimetre']) and !is_null($this->aFields['id_perimetre'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['id_perimetre'] = array('value' => $this->aFields['id_perimetre'], 'type' => 'number');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getPerimetre'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['nom_perimetre'] = $aLigne["nom_perimetre"]." (".$aLigne["type_perimetre"].")";
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+
+    /**
+     *  get avancement of programme
+     */
+    function getAvancement() {
+        if(isset($this->aFields['code_avancement']) and !is_null($this->aFields['code_avancement'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_avancement'] = array('value' => $this->aFields['code_avancement'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getAvancement'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['avancement'] = $aLigne["avancement"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+    /**
+     *  get contexte urbain of programme
+     */
+    function getContexteUrbain() {
+        if(isset($this->aFields['code_contexte_urbain']) and !is_null($this->aFields['code_contexte_urbain'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_contexte_urbain'] = array('value' => $this->aFields['code_contexte_urbain'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getContexteUrbain'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['contexte_urbain'] = $aLigne["contexte_urbain"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+    /**
+     *  get suivi of programme
+     */
+    function getSuivi() {
+        if(isset($this->aFields['code_suivi']) and !is_null($this->aFields['code_suivi'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_suivi'] = array('value' => $this->aFields['code_suivi'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getSuivi'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['suivi'] = $aLigne["suivi"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+    /**
+     *  get procedure d'amenagement of programme
+     */
+    function getProcedureAmenagement() {
+        if(isset($this->aFields['code_procedure_amenagement']) and !is_null($this->aFields['code_procedure_amenagement'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_procedure_amenagement'] = array('value' => $this->aFields['code_procedure_amenagement'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getProcedureAmenagement'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['procedure_amenagement'] = $aLigne["procedure_amenagement"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+    /**
+     *  get vocation of programme
+     */
+    function getVocation() {
+        if(isset($this->aFields['code_vocation']) and !is_null($this->aFields['code_vocation'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_vocation'] = array('value' => $this->aFields['code_vocation'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getVocation'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['vocation'] = $aLigne["vocation"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+
+    /**
+     *  get répartition type logement of programme DEPRECATED
+     */
+	/*function getRepartitionTypeLogement(){
+        require $this->sRessourcesFile;
+		$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+		$aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+		$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getRepartitionTypeLogement'], $aParams);
+		$aRepartition = array();
+		while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+			$aRepartition[] = $aLigne["type_logement"].' : '.$aLigne["repartition"];
+		}
+		$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		$this->aFields['repartition_type_logement'] = implode('<br>', $aRepartition);
+	}*/
+
+    /**
+     * delete a operation
+     */
+    function DELETE() {
+        $this->oConnection->oBd->delete('prod_immo', 'operation', 'id_operation', $this->aValues["my_vitis_id"], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields["id_operation"] = $this->aValues["my_vitis_id"];
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Operations.class.inc b/src/module_suivi_prod_immo/web_service/ws/Operations.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..2a6a16d3b8a382badb8b57cbcd7f5ae6784ac17f
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Operations.class.inc
@@ -0,0 +1,362 @@
+<?php
+
+/**
+ * \file Operations.class.inc
+ * \class Operations
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Operations php class
+ *
+ * This class defines Rest Api to Vitis Operations
+ * 
+ */
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once 'Operation.class.inc';
+
+
+class Operations extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/operations",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/operations")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Operations",
+     *   description="Operations about Operations"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        /*$properties2 = $properties;
+		$properties2['database']='suivi_prod_immo';*/
+        $this->oConnection = new Connection($this->aValues, $properties);
+    }
+
+    /**
+     * @SWG\Get(path="/operations",
+     *   tags={"Operations"},
+     *   summary="Get Operations",
+     *   description="Request to get Operations",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort_order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/operations")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Operations
+     * @return  Operations
+     */
+    function GET() {
+        $aReturn = $this->genericGet('prod_immo', "v_operation", "id_operation");
+        $sMessage = $aReturn['sMessage'];
+		$aOperations=json_decode($aReturn['sMessage'],true);
+		$aOperations2=array();
+		foreach ($aOperations['operations'] as $aOperation){
+			unset($aOperation['geom']);
+			$aOperation['nom_commune']= $this->getCommunes($aOperation['id_operation']);
+			$aOperations2[count($aOperations2)]=$aOperation;
+		}
+		$sOperations=json_encode(array("operations"=>$aOperations2,"list_count"=>$aOperations['list_count'],"total_row_number"=>$aOperations['total_row_number'],"status"=>$aOperations['status']));
+        return $sOperations;
+    }
+	
+    /**
+     *  get communes of operation
+     */
+    function getCommunes($iId) {
+        require $this->sRessourcesFile;
+		$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+		$aParams['id_operation'] = array('value' => $iId, 'type' => 'number');
+		$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationCommunes'], $aParams);
+		$aListCommuneNom = array();
+		while ($aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult)) {
+			$aListCommuneNom[] = $aLigne["nom_commune"];
+		}
+		$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		return implode(',', $aListCommuneNom);
+		
+    }
+
+    /**
+     * @SWG\Post(path="/operations",
+     *   tags={"Operations"},
+     *   summary="Add traitement",
+     *   description="Request to add Operations",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/operations")
+     *     )
+     *  )
+     */
+
+    /**
+     * insert traitement
+     * @return id of the traitement created
+     */
+    function POST() {
+        $aReturn = $this->genericPost('prod_immo', 'operation', 'prod_immo.traitement_id_operation_seq', 'id_operation');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/operations/{id_operation}",
+     *   tags={"Operations"},
+     *   summary="update Operations",
+     *   description="Request to update Operations",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="Traitement token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="id_operation",
+     *     in="path",
+     *     description="id of the Operations",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/operations")
+     *     )
+     *  )
+     */
+
+    /**
+     * update operations
+     * @return id of operations updated or error object if a operations is not updated
+     */
+    function PUT() {
+		$aValues=$this->aValues;
+		if (isset($aValues["code_avancement"]) and $aValues["code_avancement"]=='') $aValues["code_avancement"]=null;
+		if (isset($aValues["code_contexte_urbain"]) and $aValues["code_contexte_urbain"]=='') $aValues["code_contexte_urbain"]=null;
+		if (isset($aValues["code_suivi"]) and $aValues["code_suivi"]=='') $aValues["code_suivi"]=null;
+		if (isset($aValues["code_procedure_amenagement"]) and $aValues["code_procedure_amenagement"]=='') $aValues["code_procedure_amenagement"]=null;
+		if (isset($aValues["code_vocation"]) and $aValues["code_vocation"]=='') $aValues["code_vocation"]=null;
+		$this->aValues=$aValues;
+        $aReturn = $this->genericPut('prod_immo', 'operation', 'id_operation');
+		if ($aReturn['sStatus'] == 1) {
+            $aXmlRacineAttribute['status'] = 1;
+            $sMessage = $this->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
+            $oOperation = new Operation($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
+            $oOperation->GET();
+            //***** communes *****//
+            // Le paramètre "communes" est passé dans la requête ?
+            if ($this->aValues['communes'] !== NULL) {
+				$this->oConnection->oBd->delete('prod_immo', 'operation_commune', 'id_operation', $this->aValues["my_vitis_id"]);
+                // Commune(s) à rattacher au groupe ?
+                if (!empty($this->aValues['communes'])) {
+                    require $this->sRessourcesFile;
+                    $aCommunes = explode('|', $this->aValues['communes']);
+                    foreach ($aCommunes as $iCommuneId) {
+                        $aParams = array();
+                        $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+                        $aParams['id_commune'] = array('value' => $iCommuneId, 'type' => 'number');
+                        $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+                        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['insertOperationCommunes'], $aParams);
+                    }
+                }
+            }
+            //***** CTMs *****//
+            // Le paramètre "ctms" est passé dans la requête ?
+            if ($this->aValues['ctms'] !== NULL) {
+				$this->oConnection->oBd->delete('prod_immo', 'operation_ctm', 'id_operation', $this->aValues["my_vitis_id"]);
+                if (!empty($this->aValues['ctms'])) {
+                    require $this->sRessourcesFile;
+                    $aCTMs = explode('|', $this->aValues['ctms']);
+                    foreach ($aCTMs as $iCTMId) {
+                        $aParams = array();
+                        $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+                        $aParams['id_ctm'] = array('value' => $iCTMId, 'type' => 'number');
+                        $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+                        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['insertOperationCTM'], $aParams);
+                    }
+                }
+            }
+            //***** Modes financement *****//
+            // Le paramètre "mode_financements" est passé dans la requête ?
+			//error_log($this->aValues['mode_financements']);
+            if ($this->aValues['mode_financements'] !== NULL) {
+				$this->oConnection->oBd->delete('prod_immo', 'operation_tr_financement_equ_public', 'id_operation', $this->aValues["my_vitis_id"]);
+                if (!empty($this->aValues['mode_financements'])) {
+                    require $this->sRessourcesFile;
+                    $aModesFinancement = explode('|', $this->aValues['mode_financements']);
+                    foreach ($aModesFinancement as $cModeFinancementId) {
+						$aParams = array();
+                        $aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+                        $aParams['code_financement_equ_public'] = array('value' => $cModeFinancementId, 'type' => 'string');
+                        $aParams['id_operation'] = array('value' => $this->aValues["my_vitis_id"], 'type' => 'number');
+                        $oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['insertOperationModesFinancement'], $aParams);
+                    }
+                }
+            }
+        } else {
+            $sMessage = $aReturn['sMessage'];
+        }
+        return $sMessage;
+		
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/operations",
+     *   tags={"Operations"},
+     *   summary="delete Operations",
+     *   description="Request to delete Operations",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the traitement",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/operations")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/operations/{id_operation}",
+     *   tags={"Operations"},
+     *   summary="delete Operations",
+     *   description="Request to delete Operations",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="Traitement token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="id_operation",
+     *     in="path",
+     *     description="id of the Operations",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/operations")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete operations
+     * @return id of operations deleted or error object if a operations is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete('prod_immo', 'operation', 'id_operation');
+        return $aReturn['sMessage'];
+    }
+
+    
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Programme.class.inc b/src/module_suivi_prod_immo/web_service/ws/Programme.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..595fa6dafd33d12512186e77767c66f47b54315d
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Programme.class.inc
@@ -0,0 +1,149 @@
+<?php
+
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once __DIR__ . '/../../class/vitis_lib/Connection.class.inc';
+
+/**
+ * \file Suivi_prod_immo.class.inc
+ * \class Suivi_prod_immo
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Suivi_prod_immo php class
+ *
+ * This class defines programme for one Suivi_prod_immo
+ * 
+ */
+
+class Programme extends Suivi_prod_immo {
+	
+    public $oError;
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     * @param type $oConnection connection object
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $this->aProperties);
+    }
+
+    /**
+     * get informations about programme
+     */
+    function GET() {
+        $this->aFields = $this->getFields('prod_immo', "programme_immobilier", "id_programme");
+		$this->getOperationIlot();
+		$this->getCommune();
+		$this->getTypeOperateur();
+		$this->getModeConsultation();
+		// Date de mise à jour
+		$date_mise_a_jour = new DateTime($this->aFields['date_mise_a_jour']);
+		$this->aFields['date_mise_a_jour'] = $date_mise_a_jour->format('d/m/Y');
+		// Booléen
+		$this->aFields['aire_influence_tc'] = $this->aFields['aire_influence_tc'] ? 'Oui' : $this->aFields['aire_influence_tc'];
+		$this->aFields['aire_influence_tc'] = !$this->aFields['aire_influence_tc'] ? 'Non' : $this->aFields['aire_influence_tc'];
+		//
+		$this->aFields['cahier_prescription_archi_urb_paysagere_label']=$this->replaceOuiNonLes2($this->aFields['cahier_prescription_archi_urb_paysagere']);
+		$this->aFields['charge_fonciere_imposee_fixee_label']=$this->replaceOuiNonLes2($this->aFields['charge_fonciere_imposee_fixee']);
+		$this->aFields['prix_sortie_encadree_label']=$this->replaceOuiNonLes2($this->aFields['prix_sortie_encadree']);
+    }
+
+
+    /**
+     *  get operation / ilot of programme
+     */
+    function getOperationIlot() {
+        if(isset($this->aFields['id_ilot']) and !is_null($this->aFields['id_ilot'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['id_ilot'] = array('value' => $this->aFields['id_ilot'], 'type' => 'number');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationIlot'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['nom_ilot'] = $aLigne["nom_ilot"];
+			$this->aFields['nom_operation'] = $aLigne["nom_operation"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+
+    /**
+     *  get commune of programme
+     */
+    function getCommune() {
+        if(isset($this->aFields['id_commune']) and !is_null($this->aFields['id_commune'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['id_commune'] = array('value' => $this->aFields['id_commune'], 'type' => 'number');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getCommune'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['nom_commune'] = $aLigne["nom_commune"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+    /**
+     *  get type opérateur of programme
+     */
+    function getTypeOperateur() {
+        if(isset($this->aFields['code_type_operateur']) and !is_null($this->aFields['code_type_operateur'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_type_operateur'] = array('value' => $this->aFields['code_type_operateur'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getTypeOperateur'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['type_operateur'] = $aLigne["type_operateur"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+    /**
+     *  get mode consultation of programme
+     */
+    function getModeConsultation() {
+        if(isset($this->aFields['code_consultation']) and !is_null($this->aFields['code_consultation'])){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['code_consultation'] = array('value' => $this->aFields['code_consultation'], 'type' => 'string');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getModeConsultation'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$this->aFields['consultation'] = $aLigne["consultation"];
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+		}
+    }
+	
+	function replaceOuiNonLes2($sValue){
+		switch ($sValue) {
+			case 'O':
+				return 'Oui';
+				break;
+			case 'N':
+				return 'Non';
+				break;
+			case 'les 2':
+				return 'Les 2';
+				break;
+			default:
+			   return $sValue;
+		}
+	}
+	
+    /**
+     * delete a programme
+     */
+    function DELETE() {
+        $this->oConnection->oBd->delete('prod_immo', 'programme_immobilier', 'id_programme', $this->aValues["my_vitis_id"], 'integer');
+        if ($this->oConnection->oBd->enErreur()) {
+            $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
+        } else {
+            $this->aFields["id_programme"] = $this->aValues["my_vitis_id"];
+        }
+    }
+
+}
+
+?>
\ No newline at end of file
diff --git a/src/module_suivi_prod_immo/web_service/ws/Programmes.class.inc b/src/module_suivi_prod_immo/web_service/ws/Programmes.class.inc
new file mode 100644
index 0000000000000000000000000000000000000000..1a70c95d76369f621d4932a0978cd3bad670972e
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Programmes.class.inc
@@ -0,0 +1,336 @@
+<?php
+
+/**
+ * \file Programmes.class.inc
+ * \class Programmes
+ *
+ * \author Fabien Marty <f.marty@urbalyon.org>.
+ *
+ * 	\brief This file contains the Programmes php class
+ *
+ * This class defines Rest Api to Vitis Programmes
+ * 
+ */
+require_once __DIR__ . '/Suivi_prod_immo.class.inc';
+require_once 'Programme.class.inc';
+
+
+class Programmes extends Suivi_prod_immo {
+    /**
+     * @SWG\Definition(
+     *   definition="/programmes",
+     *   allOf={
+     *     @SWG\Schema(ref="#/definitions/programmes")
+     *   }
+     * )
+     * * @SWG\Tag(
+     *   name="Programmes",
+     *   description="Programmes about Programmes"
+     * )
+     */
+
+    /**
+     * construct
+     * @param type $aPath url of the request
+     * @param type $aValues parameters of the request
+     * @param type $properties properties
+     */
+    function __construct($aPath, $aValues, $properties) {
+        $this->aValues = $aValues;
+        $this->aPath = $aPath;
+        $this->aProperties = $properties;
+        $this->oConnection = new Connection($this->aValues, $properties);
+    }
+
+    /**
+     * @SWG\Get(path="/programmes",
+     *   tags={"Programmes"},
+     *   summary="Get Programmes",
+     *   description="Request to get Programmes",
+     *   operationId="GET",
+     *   produces={"application/xml", "application/json", "application/x-vm-json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="order_by",
+     *     in="query",
+     *     description="list of ordering fields",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="sort_order",
+     *     in="query",
+     *     description="sort_order",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="limit",
+     *     in="query",
+     *     description="number of element",
+     *     required=false,
+     *     type="integer",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="offset",
+     *     in="query",
+     *     description="index of first element",
+     *     required=false,
+     *     type="string",
+     *     format="int32"
+     *   ),
+     * @SWG\Parameter(
+     *     name="attributs",
+     *     in="query",
+     *     description="list of attributs",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="filter",
+     *     in="query",
+     *     description="filter results",
+     *     required=false,
+     *     type="string"
+     *   ),
+     * @SWG\Parameter(
+     *     name="distinct",
+     *     in="query",
+     *     description="delete duplicates",
+     *     required=false,
+     *     type="boolean"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/programmes")
+     *     )
+     *  )
+     */
+
+    /**
+     * get Programmes
+     * @return  Programmes
+     */
+    function GET() {
+        $aReturn = $this->genericGet('prod_immo', "programme_immobilier", "id_programme");
+        $sMessage = $aReturn['sMessage'];
+		$aProgrammes=json_decode($aReturn['sMessage'],true);
+		$aProgrammes2=array();
+		foreach ($aProgrammes['programmes'] as $aProgramme){
+			unset($aProgramme['geom']);
+			$aProgramme['nom_commune']= $this->getCommune($aProgramme['id_commune']);
+			$aProgramme['nom_ilot']= $this->getIlot($aProgramme['id_ilot']);
+			$aProgramme['nom_operation']= $this->getOperation($aProgramme['id_ilot']);
+			$aProgrammes2[count($aProgrammes2)]=$aProgramme;
+		}
+		$sProgrammes=json_encode(array("programmes"=>$aProgrammes2,"list_count"=>$aProgrammes['list_count'],"total_row_number"=>$aProgrammes['total_row_number'],"status"=>$aProgrammes['status']));
+		//error_log($sProgrammes);
+        return $sProgrammes;
+    }
+	
+    /**
+     *  get commune of programme
+     */
+    function getCommune($iId) {
+        if(isset($iId) and !is_null($iId)){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['id_commune'] = array('value' => $iId, 'type' => 'number');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getCommune'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+			return $aLigne["nom_commune"];
+		}else{
+			return null;
+		}
+    }
+	
+    /**
+     *  get ilot of programme
+     */
+    function getIlot($iId) {
+        if(isset($iId) and !is_null($iId)){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['id_ilot'] = array('value' => $iId, 'type' => 'number');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getIlot'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+			return $aLigne["nom_ilot"];
+		}else{
+			return null;
+		}
+    }
+
+    /**
+     *  get operation of programme
+     */
+    function getOperation($iId) {
+        if(isset($iId) and !is_null($iId)){
+			require $this->sRessourcesFile;
+			$aParams['sSchemaFramework'] = array('value' => 'prod_immo', 'type' => 'schema_name');
+			$aParams['id_ilot'] = array('value' => $iId, 'type' => 'number');
+			$oPDOresult = $this->oConnection->oBd->executeWithParams($aSql['getOperationIlot'], $aParams);
+			$aLigne = $this->oConnection->oBd->ligneSuivante($oPDOresult);
+			$oPDOresult = $this->oConnection->oBd->fermeResultat();
+			return $aLigne["nom_operation"];
+		}else{
+			return null;
+		}
+    }
+
+    /**
+     * @SWG\Post(path="/programmes",
+     *   tags={"Programmes"},
+     *   summary="Add traitement",
+     *   description="Request to add Programmes",
+     *   operationId="POST",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="user token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     *   @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/programmes")
+     *     )
+     *  )
+     */
+
+    /**
+     * insert traitement
+     * @return id of the traitement created
+     */
+    function POST() {
+        //$this->aValues['create'] = $_SESSION["ses_Login"];
+        //$this->aValues['create_date'] = date('Y-m-d');
+        $aReturn = $this->genericPost('prod_immo', 'programme_immobilier', 'prod_immo.programme_immobilier_id_programme_seq', 'id_programme');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Put(path="/programmes/{id_programme}",
+     *   tags={"Programmes"},
+     *   summary="update Programmes",
+     *   description="Request to update Programmes",
+     *   operationId="PUT",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="Traitement token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="id_programme",
+     *     in="path",
+     *     description="id of the Programmes",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/programmes")
+     *     )
+     *  )
+     */
+
+    /**
+     * update programmes
+     * @return id of programmes updated or error object if a programmes is not updated
+     */
+    function PUT() {
+        /*if (empty($this->aValues['maj']))
+            $this->aValues['maj'] = $_SESSION["ses_Login"];
+        if (empty($this->aValues['maj_date']))
+            $this->aValues['maj_date'] = date('Y-m-d');*/
+        $aReturn = $this->genericPut('prod_immo', 'programme_immobilier', 'id_programme');
+        return $aReturn['sMessage'];
+    }
+
+    /**
+     * @SWG\Delete(path="/programmes",
+     *   tags={"Programmes"},
+     *   summary="delete Programmes",
+     *   description="Request to delete Programmes",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="idList",
+     *     in="query",
+     *     description="id of the traitement",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="traitement Response",
+     *         @SWG\Schema(ref="#/definitions/programmes")
+     *     )
+     *  )
+     */
+    /**
+     * @SWG\Delete(path="/programmes/{id_programme}",
+     *   tags={"Programmes"},
+     *   summary="delete Programmes",
+     *   description="Request to delete Programmes",
+     *   operationId="DELETE",
+     *   produces={"application/xml", "application/json"},
+     *   @SWG\Parameter(
+     *     name="token",
+     *     in="query",
+     *     description="Traitement token",
+     *     required=true,
+     *     type="string"
+     *   ),
+     * * @SWG\Parameter(
+     *     name="id_programme",
+     *     in="path",
+     *     description="id of the Programmes",
+     *     required=true,
+     *     type="integer",
+     *     format = "int32"
+     *   ),
+     * @SWG\Response(
+     *         response=200,
+     *         description="Poprerties Response",
+     *         @SWG\Schema(ref="#/definitions/programmes")
+     *     )
+     *  )
+     */
+
+    /**
+     * delete programmes
+     * @return id of programmes deleted or error object if a programmes is not deleted
+     */
+    function DELETE() {
+        $aReturn = $this->genericDelete('prod_immo', 'programme_immobilier', 'id_programme');
+        return $aReturn['sMessage'];
+    }
+
+    
+}
+
+?>
\ No newline at end of file
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
new file mode 100644
index 0000000000000000000000000000000000000000..ebb0186930029837b32f9dd91967c6f274d6d761
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.inc
@@ -0,0 +1,13 @@
+<?php
+
+require_once __DIR__ . "/../../class/vitis_lib/DbClass.class.inc";
+require_once __DIR__ . '/../vitis/Vitis.class.inc';
+require_once 'vmlib/logUtil.inc';
+
+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';
+
+}
+?>
\ 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
new file mode 100644
index 0000000000000000000000000000000000000000..c7e40aae2e7aed3cb647eb3df1a9766548b5cf4c
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/Suivi_prod_immo.class.sql.inc
@@ -0,0 +1,45 @@
+<?php
+//Définition des requêtes de l'api Vitis
+$aSql['checkIP'] = "SELECT user_id, ip_constraint FROM [sSchemaFramework].user WHERE login ='[sLogin]'";
+$aSql['getGroups'] = "SELECT group_id FROM [sSchemaFramework].user_group WHERE user_id = [user_id]";
+$aSql['loginUnique'] = 'SELECT UPPER("login") FROM [sSchemaFramework]."user" WHERE UPPER("login")=UPPER(\'sLoginUser\')';
+$aSql['getLoginbyId'] = 'SELECT "login" FROM [sSchemaFramework]."user" WHERE user_id=[user_id]';
+$aSql['getTableColumn'] = 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = \'[sSchemaFramework]\' and table_name= \'[sTable]\'';
+$aSql['getUserPrivileges'] = 'SELECT groname FROM pg_user s LEFT OUTER JOIN pg_group g on (s.usesysid = any(g.grolist) )inner join [sSchemaFramework].user on "user".login = usename WHERE user_id = [user_id]';
+$aSql['listDomain'] = 'SELECT distinct domain, alias FROM [sSchemaFramework].domain WHERE "type" = \'AD\'';
+$aSql['createRolname'] = 'CREATE ROLE "vitis_[sDomain]" NOSUPERUSER INHERIT NOCREATEDB CREATEROLE;';
+$aSql['getInfoRolname'] = 'SELECT * FROM pg_catalog.pg_roles WHERE rolname = \'vitis_[sDomain]\'';
+// Communes
+$aSql['getOperationCommunes'] = "SELECT operation_commune.id_commune, \"commune\".nom_commune FROM [sSchemaFramework].operation_commune LEFT JOIN [sSchemaFramework].commune ON operation_commune.id_commune = \"commune\".id_commune WHERE operation_commune.id_operation = [id_operation]";
+$aSql['insertOperationCommunes'] = "INSERT INTO [sSchemaFramework].operation_commune(id_commune, id_operation) VALUES([id_commune], [id_operation])";
+// CTM
+$aSql['getOperationCTM'] = "SELECT operation_ctm.id_ctm, \"conference_territoriale_maire\".nom_ctm FROM [sSchemaFramework].operation_ctm LEFT JOIN [sSchemaFramework].conference_territoriale_maire ON operation_ctm.id_ctm = \"conference_territoriale_maire\".id_ctm WHERE operation_ctm.id_operation = [id_operation]";
+$aSql['insertOperationCTM'] = "INSERT INTO [sSchemaFramework].operation_ctm(id_ctm, id_operation) VALUES([id_ctm], [id_operation])";
+// Modes financement
+$aSql['getOperationModesFinancement'] = "SELECT operation_tr_financement_equ_public.code_financement_equ_public, \"tr_financement_equ_public\".financement_equ_public FROM [sSchemaFramework].operation_tr_financement_equ_public LEFT JOIN [sSchemaFramework].tr_financement_equ_public ON operation_tr_financement_equ_public.code_financement_equ_public = \"tr_financement_equ_public\".code_financement_equ_public WHERE operation_tr_financement_equ_public.id_operation = [id_operation]";
+$aSql['insertOperationModesFinancement'] = "INSERT INTO [sSchemaFramework].operation_tr_financement_equ_public(code_financement_equ_public, id_operation) VALUES([code_financement_equ_public], [id_operation])";
+// Commune
+$aSql['getCommune'] = "SELECT \"commune\".id_commune, \"commune\".nom_commune FROM [sSchemaFramework].commune WHERE id_commune = [id_commune]";
+// Type opérateur
+$aSql['getTypeOperateur'] = "SELECT \"tr_type_operateur\".code_type_operateur, \"tr_type_operateur\".type_operateur FROM [sSchemaFramework].tr_type_operateur WHERE code_type_operateur = [code_type_operateur]";
+// Mode consultation
+$aSql['getModeConsultation'] = "SELECT \"tr_consultation\".code_consultation, \"tr_consultation\".consultation FROM [sSchemaFramework].tr_consultation WHERE code_consultation = [code_consultation]";
+// Opération / Ilot
+$aSql['getOperationIlot'] = "SELECT nom_ilot, nom_operation FROM [sSchemaFramework].ilot INNER JOIN [sSchemaFramework].operation ON ilot.id_operation=operation.id_operation WHERE id_ilot=[id_ilot]";
+// Ilot
+$aSql['getIlot'] = "SELECT nom_ilot FROM [sSchemaFramework].ilot WHERE id_ilot=[id_ilot]";
+// Perimetre projet urbain
+$aSql['getPerimetre'] = "SELECT \"perimetre\".id_perimetre, \"perimetre\".nom_perimetre, \"perimetre\".type_perimetre FROM [sSchemaFramework].perimetre WHERE id_perimetre = [id_perimetre]";
+// Avancement
+$aSql['getAvancement'] = "SELECT \"tr_avancement\".code_avancement, \"tr_avancement\".avancement FROM [sSchemaFramework].tr_avancement WHERE code_avancement = [code_avancement]";
+// Contexte urbain
+$aSql['getContexteUrbain'] = "SELECT \"tr_contexte_urbain\".code_contexte_urbain, \"tr_contexte_urbain\".contexte_urbain FROM [sSchemaFramework].tr_contexte_urbain WHERE code_contexte_urbain = [code_contexte_urbain]";
+// Suivi de l'opération
+$aSql['getSuivi'] = "SELECT \"tr_suivi\".code_suivi, \"tr_suivi\".suivi FROM [sSchemaFramework].tr_suivi WHERE code_suivi = [code_suivi]";
+// Procédure d'aménagement
+$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]";
+// 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/module_suivi_prod_immo/web_service/ws/overview.phtml b/src/module_suivi_prod_immo/web_service/ws/overview.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..040892fd61361e36e14a610a7db8e0b98e2536bb
--- /dev/null
+++ b/src/module_suivi_prod_immo/web_service/ws/overview.phtml
@@ -0,0 +1,24 @@
+<?php
+/**
+ * @SWG\Swagger(
+ *      basePath="/[service_alias]/suivi_prod_immo",
+ *     	host="[server]",
+ *    	schemes={"[protocol]"},
+ *     	produces={  
+ *          "application/json",
+            "application/xml",
+            "text/html"
+ * 		},
+ *     @SWG\Info(
+ *         version="1.0.0",
+ *         title="Suivi prod immo Test Rest",
+ *         description="All fetaures to access server operation for suivi_prod_immo",
+ *     )
+ * )
+ */
+?>
+
+<h1 class="titleOverview">Service Suivi prod immo</h1>
+<p>
+	<a class="linkOverview" href="javascript:sService='suivi_prod_immo';LoadApi()">Suivi prod immo</a>: this is the most comprehensive service which should be used as a preference when developing applications communicating with Suivi prod immo. Those services allow you to administrate Suivi prod immo applications.
+</p>
\ No newline at end of file