From dea68b690388b8bee40f3647b54762c5f7c4e68c Mon Sep 17 00:00:00 2001
From: Xiaowu Zhang <xiaowu.zhang@nexedi.com>
Date: Wed, 15 Sep 2021 07:48:25 +0000
Subject: [PATCH] erp5_travel_expense: improve query

1.use query factory instead of manually query
2.don't get all related object, use modification date to filter
3.synchronize only related service
---
 .../gadget_hr_add_expense_sheet_view_js.js    |   2 +-
 .../gadget_hr_add_expense_sheet_view_js.xml   |   4 +-
 .../gadget_hr_expense_record_view_js.js       |   2 +-
 .../gadget_hr_expense_record_view_js.xml      |   4 +-
 .../gadget_hr_gadget_html.html                |  20 -
 .../web_page_module/gadget_hr_gadget_html.xml | 342 ----------------
 .../gadget_hr_geoLocalisation_js.js           |   2 +-
 .../gadget_hr_geoLocalisation_js.xml          |   4 +-
 .../web_page_module/gadget_hr_jio_js.js       | 386 ------------------
 .../web_page_module/gadget_hr_jio_js.xml      | 341 ----------------
 .../gadget_hr_leave_request_view_js.js        |   2 +-
 .../gadget_hr_leave_request_view_js.xml       |   4 +-
 ...adget_hr_mission_request_record_view_js.js |   2 +-
 ...dget_hr_mission_request_record_view_js.xml |   4 +-
 ...et_hr_page_jio_erp5_configurator_html.html |   1 +
 ...get_hr_page_jio_erp5_configurator_html.xml |   6 +-
 ...gadget_hr_page_jio_erp5_configurator_js.js |  15 +-
 ...adget_hr_page_jio_erp5_configurator_js.xml |   4 +-
 .../gadget_hr_page_jio_html.html              |   2 +
 .../gadget_hr_page_jio_html.xml               |   6 +-
 .../web_page_module/gadget_hr_page_jio_js.js  | 105 +++--
 .../web_page_module/gadget_hr_page_jio_js.xml |   6 +-
 .../web_page_module/gadget_hr_tool_js.js      | 269 +++++++++++-
 .../web_page_module/gadget_hr_tool_js.xml     |   4 +-
 .../property_sheet_list.xml                   |   1 +
 .../your_modification_date.xml                |   2 +-
 .../your_modification_date.xml                |   2 +-
 .../your_modification_date.xml                |   2 +-
 28 files changed, 389 insertions(+), 1155 deletions(-)
 delete mode 100644 bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.html
 delete mode 100644 bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.xml
 delete mode 100644 bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.js
 delete mode 100644 bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.xml

diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.js
index 297de3f431..157c302b54 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.js
@@ -109,7 +109,7 @@
                 doc = {
                   parent_relative_url: "expense_sheet_module",
                   portal_type: "Expense Sheet",
-                  modification_date: new Date().toISOString()
+                  modification_date: new Date().toISOString().slice(0, 10).replace(/-/g, "/")
               };
               for (i = 0; i < submit_event.target.length; i += 1) {
                  if ((form[i].type == "radio") && !form[i].checked){
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.xml
index a456285763..ed0f45f231 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_add_expense_sheet_view_js.xml
@@ -250,7 +250,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>989.27549.43950.31078</string> </value>
+                      <value> <string>994.55194.7094.63129</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -268,7 +268,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1613394000.22</float>
+                              <float>1631870322.62</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.js
index edbb00060d..f3421ca6a7 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.js
@@ -37,7 +37,7 @@
             visible_in_html5_app_flag: 1,
             record_revision: (gadget.options.doc.record_revision || 1),
             photo_data: gadget.options.doc.photo_data || "",
-            modification_date: new Date().toISOString()
+            modification_date: new Date().toISOString().slice(0, 10).replace(/-/g, "/")
           };
         for (i = 0; i < form.length; i += 1) {
             // XXX Should check input type instead
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.xml
index f04bdb92ee..4681e2ea9a 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_expense_record_view_js.xml
@@ -249,7 +249,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>989.27549.43950.31078</string> </value>
+                      <value> <string>994.55211.54129.37256</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -267,7 +267,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1613394030.76</float>
+                              <float>1631870156.36</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.html b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.html
deleted file mode 100644
index 9f683835e2..0000000000
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-    <meta name="viewport" content="width=device-width" />
-    <title>Jio Gadget</title>
-    <link rel="stylesheet" type="text/css" href="alertify.css" />
-    <!-- renderjs -->
-    <script src="rsvp.js" type="text/javascript"></script>
-    <script src="renderjs.js" type="text/javascript"></script>
-
-    <script src="jiodev.js" type="text/javascript"></script>
-    <script src="alertify.js" type="text/javascript"></script>
-    <!-- custom script -->
-    <script src="gadget_hr_jio.js" type="text/javascript"></script>
-
-  </head>
-  <body>
-  </body>
-</html>
\ No newline at end of file
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.xml
deleted file mode 100644
index fd320d56ac..0000000000
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_gadget_html.xml
+++ /dev/null
@@ -1,342 +0,0 @@
-<?xml version="1.0"?>
-<ZopeData>
-  <record id="1" aka="AAAAAAAAAAE=">
-    <pickle>
-      <global name="Web Page" module="erp5.portal_type"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_Access_contents_information_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Anonymous</string>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Associate</string>
-                <string>Auditor</string>
-                <string>Manager</string>
-                <string>Owner</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_Add_portal_content_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Manager</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_Change_local_roles_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Assignor</string>
-                <string>Manager</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_Modify_portal_content_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Manager</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_View_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Anonymous</string>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Associate</string>
-                <string>Auditor</string>
-                <string>Manager</string>
-                <string>Owner</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>categories</string> </key>
-            <value>
-              <tuple>
-                <string>contributor/person_module/2</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>content_md5</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>content_type</string> </key>
-            <value> <string>text/html</string> </value>
-        </item>
-        <item>
-            <key> <string>default_reference</string> </key>
-            <value> <string>gadget_hr_jio.html</string> </value>
-        </item>
-        <item>
-            <key> <string>description</string> </key>
-            <value> <string>Jio access</string> </value>
-        </item>
-        <item>
-            <key> <string>id</string> </key>
-            <value> <string>gadget_hr_gadget_html</string> </value>
-        </item>
-        <item>
-            <key> <string>language</string> </key>
-            <value> <string>en</string> </value>
-        </item>
-        <item>
-            <key> <string>portal_type</string> </key>
-            <value> <string>Web Page</string> </value>
-        </item>
-        <item>
-            <key> <string>short_title</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>title</string> </key>
-            <value> <string>Jio Gadget for HR</string> </value>
-        </item>
-        <item>
-            <key> <string>version</string> </key>
-            <value> <string>001</string> </value>
-        </item>
-        <item>
-            <key> <string>workflow_history</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="2" aka="AAAAAAAAAAI=">
-    <pickle>
-      <global name="PersistentMapping" module="Persistence.mapping"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value>
-              <dictionary>
-                <item>
-                    <key> <string>document_publication_workflow</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
-                    </value>
-                </item>
-                <item>
-                    <key> <string>edit_workflow</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
-                    </value>
-                </item>
-                <item>
-                    <key> <string>processing_status_workflow</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
-                    </value>
-                </item>
-              </dictionary>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="3" aka="AAAAAAAAAAM=">
-    <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_log</string> </key>
-            <value>
-              <list>
-                <dictionary>
-                  <item>
-                      <key> <string>action</string> </key>
-                      <value> <string>publish_alive</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>actor</string> </key>
-                      <value> <string>zope</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>comment</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>error_message</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>time</string> </key>
-                      <value>
-                        <object>
-                          <klass>
-                            <global name="DateTime" module="DateTime.DateTime"/>
-                          </klass>
-                          <tuple>
-                            <none/>
-                          </tuple>
-                          <state>
-                            <tuple>
-                              <float>1479221737.93</float>
-                              <string>UTC</string>
-                            </tuple>
-                          </state>
-                        </object>
-                      </value>
-                  </item>
-                  <item>
-                      <key> <string>validation_state</string> </key>
-                      <value> <string>published_alive</string> </value>
-                  </item>
-                </dictionary>
-              </list>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="4" aka="AAAAAAAAAAQ=">
-    <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_log</string> </key>
-            <value>
-              <list>
-                <dictionary>
-                  <item>
-                      <key> <string>action</string> </key>
-                      <value> <string>edit</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>actor</string> </key>
-                      <value> <string>supercedriclen</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>comment</string> </key>
-                      <value>
-                        <none/>
-                      </value>
-                  </item>
-                  <item>
-                      <key> <string>error_message</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>serial</string> </key>
-                      <value> <string>955.64152.22474.31095</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>state</string> </key>
-                      <value> <string>current</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>time</string> </key>
-                      <value>
-                        <object>
-                          <klass>
-                            <global name="DateTime" module="DateTime.DateTime"/>
-                          </klass>
-                          <tuple>
-                            <none/>
-                          </tuple>
-                          <state>
-                            <tuple>
-                              <float>1481817158.93</float>
-                              <string>UTC</string>
-                            </tuple>
-                          </state>
-                        </object>
-                      </value>
-                  </item>
-                </dictionary>
-              </list>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="5" aka="AAAAAAAAAAU=">
-    <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_log</string> </key>
-            <value>
-              <list>
-                <dictionary>
-                  <item>
-                      <key> <string>action</string> </key>
-                      <value> <string>detect_converted_file</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>actor</string> </key>
-                      <value> <string>zope</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>comment</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>error_message</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>external_processing_state</string> </key>
-                      <value> <string>converted</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>serial</string> </key>
-                      <value> <string>0.0.0.0</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>time</string> </key>
-                      <value>
-                        <object>
-                          <klass>
-                            <global name="DateTime" module="DateTime.DateTime"/>
-                          </klass>
-                          <tuple>
-                            <none/>
-                          </tuple>
-                          <state>
-                            <tuple>
-                              <float>1479221700.82</float>
-                              <string>UTC</string>
-                            </tuple>
-                          </state>
-                        </object>
-                      </value>
-                  </item>
-                </dictionary>
-              </list>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-</ZopeData>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.js
index 05b91ce2fe..d9fdd8af3d 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.js
@@ -59,7 +59,7 @@
             latitude: gadget.geoLocation.coords.latitude,
             source_title: gadget.author,
             simulation_state: 'draft',
-            creation_date:new Date().toISOString().slice(0, 10)
+            modification_date:new Date().toISOString().slice(0, 10).replace(/-/g, "/")
           });
         });
     });
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.xml
index fcb8fa0010..b48dccc4cf 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_geoLocalisation_js.xml
@@ -236,7 +236,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>956.50385.17297.63180</string> </value>
+                      <value> <string>994.55194.7094.63129</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -254,7 +254,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1485167188.03</float>
+                              <float>1631882043.11</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.js
deleted file mode 100644
index 21d46e3619..0000000000
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.js
+++ /dev/null
@@ -1,386 +0,0 @@
-/*global window, rJS, RSVP, jIO, alertify, UriTemplate, indexedDB*/
-/*jslint indent: 2, nomen: true */
-(function (window, rJS, RSVP, jIO, UriTemplate, alertify, indexedDB) {
-  "use strict";
-  // xxxxxxxxxxxxxxxxx overwrite 
-  /*
-  function openIndexedDB(jio_storage) {
-    var db_name = jio_storage._database_name;
-    function resolver(resolve, reject) {
-      // Open DB //
-      var request = indexedDB.open(db_name);
-      request.onerror = function (error) {
-        if (request.result) {
-          request.result.close();
-        }
-        reject(error);
-      };
-
-      request.onabort = function () {
-        request.result.close();
-        reject("Aborting connection to: " + db_name);
-      };
-
-      request.ontimeout = function () {
-        request.result.close();
-        reject("Connection to: " + db_name + " timeout");
-      };
-
-      request.onblocked = function () {
-        request.result.close();
-        reject("Connection to: " + db_name + " was blocked");
-      };
-
-      // Create DB if necessary //
-      request.onupgradeneeded = function () {
-        return;
-      };
-
-      request.onversionchange = function () {
-        request.result.close();
-        reject(db_name + " was upgraded");
-      };
-
-      request.onsuccess = function () {
-        resolve(request.result);
-      };
-    }
-    // XXX Canceller???
-    return new RSVP.Queue()
-      .push(function () {
-        return new RSVP.Promise(resolver);
-      });
-  }
-  function openTransaction(db, stores, flag, autoclosedb) {
-    var tx = db.transaction(stores, flag);
-    if (autoclosedb !== false) {
-      tx.oncomplete = function () {
-        db.close();
-      };
-    }
-    tx.onabort = function () {
-      db.close();
-    };
-    return tx;
-  }
-  function handleRequest(request) {
-    function resolver(resolve, reject) {
-      request.onerror = reject;
-      request.onsuccess = function () {
-        resolve(request.result);
-      };
-    }
-    return new RSVP.Promise(resolver);
-  }
-
-  jIO.__storage_types.indexeddb.prototype.remove = function (id) {
-    return openIndexedDB(this)
-      .push(function (db) {
-        var transaction = openTransaction(db, ["metadata"], "readwrite");
-        return handleRequest(transaction
-                        .objectStore("metadata")["delete"](id));
-      });
-  };*/
-
-  function endsWith(str, suffix) {
-    return str.indexOf(suffix, str.length - suffix.length) !== -1;
-  }
-  function hashParams() {
-    var hash = window.location.toString().split('#')[1],
-      split,
-      query = "",
-      subhashes,
-      subhash,
-      keyvalue,
-      index,
-      key,
-      tmp,
-      args = {};
-    if (hash !== undefined) {
-      split = hash.split('?');
-      query = split[0] || "";
-    }
-    subhashes = query.split('&');
-    for (index in subhashes) {
-      if (subhashes.hasOwnProperty(index)) {
-        subhash = subhashes[index];
-        if (subhash !== '') {
-          keyvalue = subhash.split('=');
-          if (keyvalue.length === 2) {
-            key = decodeURIComponent(keyvalue[0]);
-            tmp = decodeURIComponent(keyvalue[1]);
-            if (tmp && (endsWith(key, ":json"))) {
-              tmp = JSON.parse(tmp);
-            }
-            args[key] = tmp;
-          }
-        }
-      }
-    }
-    return args;
-  }
-
-
-  function handleHTTPError(gadget, error, method_name) {
-    var regexp = /^X-Delegate uri="(http[s]*:\/\/[\/\-\[\]{}()*+:?.,\\\^$|#\s\w%]+)"$/,
-      login_page;
-
-    if ((error.target !== undefined) && (error.target.status === 401)) {
-      login_page = error.target.getResponseHeader('WWW-Authenticate');
-      // Only connect to https to login
-            var regexp = /^X-Delegate uri="(http[s]*:\/\/[\/\-\[\]{}()*+:?.,\\\^$|#\s\w%]+)"$/
-            var auth_page = error.target.getResponseHeader('WWW-Authenticate'),
-              site;
-            
-            if (regexp.test(auth_page)) {
-              site = UriTemplate.parse(
-                regexp.exec(auth_page)[1]
-              ).expand({
-                came_from: window.location.href + "#{&n.me}",
-                cors_origin: window.location.origin,
-                });
-            }
-
-          if (site) {
-            return gadget.redirect({ toExternal: true, url: site});
-          }
-        }
-       
-    if ((error.target !== undefined) && (error.target.status === 0)) {
-      alertify.error("you are offline");
-      window.setTimeout(function () {
-        if (method_name === 'repair') {
-          alertify.error("synchronisation failed");
-        }
-        if (method_name === 'getAttachment') {
-          alertify.error("please try again when online");
-        }
-      }, 2000);
-      return;
-    }
-    throw error;
-  }
-
-  function wrapJioCall(gadget, method_name, argument_list, default_storage) {
-    var storage = default_storage || gadget.state_parameter_dict.jio_storage;
-
-    /*if (!gadget.state_parameter_dict.authenticated) {
-      // Access ERP5 to get information about the login page
-      return gadget.state_parameter_dict.jio_storage.__storage._remote_sub_storage.getAttachment(
-        'acl_users',
-        'links',
-        {format: 'json'}
-      )
-        .push(function () {
-          gadget.state_parameter_dict.authenticated = true;
-          return wrapJioCall(gadget, method_name, argument_list);
-        }, function (error) {
-          return handleHTTPError(gadget, error);
-        });
-    }*/
-
-    return storage[method_name].apply(storage, argument_list)
-      .push(undefined, function (error) {
-        return handleHTTPError(gadget, error, method_name);
-      });
-  }
-
-
-  function setUserTitle(gadget, no_auto_resync) {
-    // Get user information
-    return;
-    return gadget.getSetting('user_title')
-      .push(function (user_title) {
-        if (!user_title) {
-          // Force synchro when user login
-          return wrapJioCall(gadget, 'repair');
-        }
-      })
-      .push(function () {
-        return wrapJioCall(gadget, 'get', [gadget.state_parameter_dict.me]);
-      })
-      .push(function (person) {
-        if (person) {
-          return gadget.setSetting('user_title', person.first_name + " " + person.last_name);
-        } else {
-          return gadget.setSetting('user_title', '');
-        }
-      }, function (error) {
-        if ((error instanceof jIO.util.jIOError) && (error.status_code === 404)) {
-          if (no_auto_resync !== true) {
-            // Prevent repair infinite loop if person document is not synchronized
-            // This is the first automatic synchro to init DB
-            return wrapJioCall(gadget, 'repair')
-              .push(function () {
-                return setUserTitle(gadget, true);
-              });
-          }
-          return gadget.setSetting('user_title', '');
-        }
-        return gadget.setSetting('user_title', '')
-          .push(function () {
-            throw error;
-          });
-      });
-  }
-
-  rJS(window)
-
-    .ready(function (gadget) {
-      alertify.set({ delay: 1500 });
-      gadget.state_parameter_dict = {
-        authenticated: false
-      };
-    })
-
-    .declareAcquiredMethod('setSetting', 'setSetting')
-    .declareAcquiredMethod('getSetting', 'getSetting')
-    .declareAcquiredMethod('getUrlFor', 'getUrlFor')
-    .declareAcquiredMethod('redirect', 'redirect')
-    .declareAcquiredMethod("getUrlParameter", "getUrlParameter")
-
-    .declareMethod('createJio', function () {
-      var gadget = this,
-        tmp = hashParams(),
-        hateoas_url,
-        default_view,
-        me;
-      me = tmp['n.me'] || '';
-      return new RSVP.Queue()
-        .push(function () {
-          if (me) {
-            return gadget.setSetting('me', me);
-          }
-        })
-        .push(function () {
-          return RSVP.all([
-            gadget.getSetting('hateoas_url'),
-            gadget.getSetting('default_view_reference'),
-            gadget.getSetting('me')
-          ]);
-        })
-        .push(function (setting_list) {
-          var jio_storage;
-          hateoas_url = setting_list[0];
-          default_view = setting_list[1];
-          me = setting_list[2];
-          if (!me) {
-            jio_storage = jIO.createJIO({
-              type: "erp5",
-              url: setting_list[0],
-              default_view_reference: setting_list[1]
-            });
-            return wrapJioCall(gadget, 'getAttachment', ['acl_users', hateoas_url, {format: "json"}], jio_storage)
-              .push(function (result) {
-                me = result._links.me.href;
-                return gadget.setSetting('me', me);
-              });
-          }
-        })
-        .push(function () {
-          var current_date = new Date(),
-            new_date = new Date(
-              current_date.getFullYear(),
-              current_date.getMonth(),
-              current_date.getDate() - 60
-            );
-          gadget.state_parameter_dict.me = me;
-          //gadget.state_parameter_dict.authenticated = true;
-          gadget.state_parameter_dict.jio_storage = jIO.createJIO({
-            type: "replicate",
-            // XXX This drop the signature lists...
-            query: {
-              query: '(portal_type: "Expense Record" AND (simulation_state:"draft" OR simulation_state:"sent" OR simulation_state:"stopped")) ' +
-                'OR (portal_type: "Travel Request Record" AND (simulation_state:"draft" OR simulation_state:"sent" OR simulation_state:"stopped")) ' +
-                'OR (portal_type: "Leave Report Record" AND simulation_state:"stopped") ' +
-                'OR (portal_type: "Leave Request Record" AND (simulation_state:"draft" OR simulation_state:"sent" OR simulation_state:"stopped")) ' +
-                'OR (portal_type: "Localisation Record" AND (simulation_state:"draft" OR simulation_state:"stopped")) ' +
-                'OR (portal_type: "Expense Sheet" AND (reference: "expense_sheet")) ' +
-                'OR (portal_type: "Currency" AND validation_state:"validated") ' +
-                'OR (portal_type: "Service" AND validation_state:"validated") ' +
-                'OR (portal_type: "Person" AND id: "' + me.split("/")[1] + '")',
-              limit: [0, 1234567890]
-            },
-            use_remote_post: true,
-            conflict_handling: 2,
-            check_local_modification: false,
-            check_local_creation: true,
-            check_local_deletion: false,
-            check_remote_modification: false,
-            check_remote_creation: true,
-            check_remote_deletion: true,
-            local_sub_storage: {
-              type: "query",
-              sub_storage: {
-                type: "uuid",
-                sub_storage: {
-                  type: "indexeddb",
-                  database: "mmr-erp5-tmp"
-                }
-              }
-            },
-            remote_sub_storage: {
-              type: "erp5",
-              url: hateoas_url,
-              default_view_reference: default_view
-            },
-            signature_sub_storage: {
-              type: "query",
-              sub_storage: {
-                type: "indexeddb",
-                database: "expense-hash-list"
-              }
-            }
-          });
-        });
-
-    })
-    .declareMethod('get', function () {
-      return wrapJioCall(this, 'get', arguments);
-    })
-    .declareMethod('getAttachment', function () {
-      if (this.state_parameter_dict.online) {
-        return wrapJioCall(this, 'getAttachment', [arguments[0], arguments[1], {format: "json"}]);
-      }
-      return wrapJioCall(this, 'getAttachment', [arguments[0], arguments[1], {format: "json"}], this.state_parameter_dict.jio_storage.__storage._remote_sub_storage);
-    })
-    .declareMethod('post', function () {
-      return wrapJioCall(this, 'post', arguments);
-    })
-    .declareMethod('put', function () {
-      return wrapJioCall(this, 'put', arguments);
-    })
-    .declareMethod('remove', function () {
-      return wrapJioCall(this, 'remove', arguments);
-    })
-    .declareMethod('repair', function () {
-      var gadget = this;
-      return wrapJioCall(this, 'repair', arguments)
-        .push(function () {
-          return setUserTitle(gadget);
-        })
-        .push(function () {
-          return gadget.setSetting('last_sync_date', new Date().toLocaleString());
-        });
-    })
-    .declareMethod('allDocs', function () {
-      if (arguments[0].query) {
-        if (arguments[0].query.indexOf('relative_url') !== -1) {
-          return this.getSetting('user_title')
-            .push(function (result) {
-              return {
-                'data': {
-                  'rows': [{
-                    'value': {
-                      'title': result
-                    }
-                  }]
-                }
-              };
-            });
-        }
-      }
-      return wrapJioCall(this, 'allDocs', arguments);
-    });
-
-}(window, rJS, RSVP, jIO, UriTemplate, alertify, indexedDB));
\ No newline at end of file
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.xml
deleted file mode 100644
index 38786707f3..0000000000
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_jio_js.xml
+++ /dev/null
@@ -1,341 +0,0 @@
-<?xml version="1.0"?>
-<ZopeData>
-  <record id="1" aka="AAAAAAAAAAE=">
-    <pickle>
-      <global name="Web Script" module="erp5.portal_type"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_Access_contents_information_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Anonymous</string>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Associate</string>
-                <string>Auditor</string>
-                <string>Manager</string>
-                <string>Owner</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_Add_portal_content_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Manager</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_Change_local_roles_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Assignor</string>
-                <string>Manager</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_Modify_portal_content_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Manager</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>_View_Permission</string> </key>
-            <value>
-              <tuple>
-                <string>Anonymous</string>
-                <string>Assignee</string>
-                <string>Assignor</string>
-                <string>Associate</string>
-                <string>Auditor</string>
-                <string>Manager</string>
-                <string>Owner</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>categories</string> </key>
-            <value>
-              <tuple>
-                <string>contributor/person_module/2</string>
-                <string>contributor/person_module/5</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>content_md5</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>default_reference</string> </key>
-            <value> <string>gadget_hr_jio.js</string> </value>
-        </item>
-        <item>
-            <key> <string>description</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>id</string> </key>
-            <value> <string>gadget_hr_jio_js</string> </value>
-        </item>
-        <item>
-            <key> <string>language</string> </key>
-            <value> <string>en</string> </value>
-        </item>
-        <item>
-            <key> <string>portal_type</string> </key>
-            <value> <string>Web Script</string> </value>
-        </item>
-        <item>
-            <key> <string>short_title</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>title</string> </key>
-            <value> <string>HR Gadget JS</string> </value>
-        </item>
-        <item>
-            <key> <string>version</string> </key>
-            <value> <string>001</string> </value>
-        </item>
-        <item>
-            <key> <string>workflow_history</string> </key>
-            <value>
-              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="2" aka="AAAAAAAAAAI=">
-    <pickle>
-      <global name="PersistentMapping" module="Persistence.mapping"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>data</string> </key>
-            <value>
-              <dictionary>
-                <item>
-                    <key> <string>document_publication_workflow</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
-                    </value>
-                </item>
-                <item>
-                    <key> <string>edit_workflow</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
-                    </value>
-                </item>
-                <item>
-                    <key> <string>processing_status_workflow</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
-                    </value>
-                </item>
-              </dictionary>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="3" aka="AAAAAAAAAAM=">
-    <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_log</string> </key>
-            <value>
-              <list>
-                <dictionary>
-                  <item>
-                      <key> <string>action</string> </key>
-                      <value> <string>publish_alive</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>actor</string> </key>
-                      <value> <string>zope</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>comment</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>error_message</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>time</string> </key>
-                      <value>
-                        <object>
-                          <klass>
-                            <global name="DateTime" module="DateTime.DateTime"/>
-                          </klass>
-                          <tuple>
-                            <none/>
-                          </tuple>
-                          <state>
-                            <tuple>
-                              <float>1479221739.78</float>
-                              <string>UTC</string>
-                            </tuple>
-                          </state>
-                        </object>
-                      </value>
-                  </item>
-                  <item>
-                      <key> <string>validation_state</string> </key>
-                      <value> <string>published_alive</string> </value>
-                  </item>
-                </dictionary>
-              </list>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="4" aka="AAAAAAAAAAQ=">
-    <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_log</string> </key>
-            <value>
-              <list>
-                <dictionary>
-                  <item>
-                      <key> <string>action</string> </key>
-                      <value> <string>edit</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>actor</string> </key>
-                      <value> <string>zope</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>comment</string> </key>
-                      <value>
-                        <none/>
-                      </value>
-                  </item>
-                  <item>
-                      <key> <string>error_message</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>serial</string> </key>
-                      <value> <string>966.50115.49905.16025</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>state</string> </key>
-                      <value> <string>current</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>time</string> </key>
-                      <value>
-                        <object>
-                          <klass>
-                            <global name="DateTime" module="DateTime.DateTime"/>
-                          </klass>
-                          <tuple>
-                            <none/>
-                          </tuple>
-                          <state>
-                            <tuple>
-                              <float>1523364927.08</float>
-                              <string>GMT+2</string>
-                            </tuple>
-                          </state>
-                        </object>
-                      </value>
-                  </item>
-                </dictionary>
-              </list>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="5" aka="AAAAAAAAAAU=">
-    <pickle>
-      <global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_log</string> </key>
-            <value>
-              <list>
-                <dictionary>
-                  <item>
-                      <key> <string>action</string> </key>
-                      <value> <string>detect_converted_file</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>actor</string> </key>
-                      <value> <string>zope</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>comment</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>error_message</string> </key>
-                      <value> <string></string> </value>
-                  </item>
-                  <item>
-                      <key> <string>external_processing_state</string> </key>
-                      <value> <string>converted</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>serial</string> </key>
-                      <value> <string>0.0.0.0</string> </value>
-                  </item>
-                  <item>
-                      <key> <string>time</string> </key>
-                      <value>
-                        <object>
-                          <klass>
-                            <global name="DateTime" module="DateTime.DateTime"/>
-                          </klass>
-                          <tuple>
-                            <none/>
-                          </tuple>
-                          <state>
-                            <tuple>
-                              <float>1479221698.05</float>
-                              <string>UTC</string>
-                            </tuple>
-                          </state>
-                        </object>
-                      </value>
-                  </item>
-                </dictionary>
-              </list>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-</ZopeData>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.js
index 348fc88242..49e72888d5 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.js
@@ -241,7 +241,7 @@
                       parent_relative_url: "record_module",
                       portal_type: "Leave Request Record",
                       source_reference: source_reference,
-                      modification_date: new Date().toISOString()
+                      modification_date: new Date().toISOString().slice(0, 10).replace(/-/g, "/")
                     };
                   for (i = 0; i < submit_event.target.length; i += 1) {
                     // XXX Should check input type instead
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.xml
index 5e054ad518..efc909eba4 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_leave_request_view_js.xml
@@ -250,7 +250,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>989.27549.43950.31078</string> </value>
+                      <value> <string>994.55194.7094.63129</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -268,7 +268,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1613394086.14</float>
+                              <float>1631870226.12</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.js
index 4ade8bf3fb..05e0ab901f 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.js
@@ -250,7 +250,7 @@
                       source_reference: source_reference,
                       visible_in_html5_app_flag: 1,
                       record_revision: (gadget.options.doc.record_revision || 1),
-                      modification_date: new Date().toISOString()
+                      modification_date: new Date().toISOString().slice(0, 10).replace(/-/g, "/")
                     };
                   for (i = 0; i < submit_event.target.length; i += 1) {
                     // XXX Should check input type instead
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.xml
index 3299c73d23..de15e8439b 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_mission_request_record_view_js.xml
@@ -250,7 +250,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>989.27549.43950.31078</string> </value>
+                      <value> <string>994.55194.7094.63129</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -268,7 +268,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1613394114.93</float>
+                              <float>1631870363.32</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.html b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.html
index ebf00282de..ec052da689 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.html
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.html
@@ -9,6 +9,7 @@
     <script src="rsvp.js"></script>
     <script src="renderjs.js"></script>
     <script src="jiodev.js" type="text/javascript"></script>
+    <script src="gadget_officejs_hr_tool.js" type="text/javascript"></script>
 
     <script src="gadget_officejs_page_jio_erp5_configurator.js"></script>
 
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.xml
index fbe47cf17a..03bb7501e9 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_html.xml
@@ -246,7 +246,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>966.52991.40280.18790</string> </value>
+                      <value> <string>994.52542.52680.32887</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -264,8 +264,8 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1523626101.75</float>
-                              <string>GMT+2</string>
+                              <float>1631713807.8</float>
+                              <string>UTC</string>
                             </tuple>
                           </state>
                         </object>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.js
index d0d5033b71..45d48c4421 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.js
@@ -1,24 +1,19 @@
-/*global window, rJS, RSVP, URI, location,
+/*global window, rJS, RSVP, URI, location, getSynchronizeQuery,
          btoa */
 /*jslint nomen: true, indent: 2, maxerr: 3*/
 (function (window, rJS, RSVP, loopEventListener) {
   "use strict";
 
   function setjIOERP5Configuration(gadget) {
-    var erp5_url = gadget.props.element.querySelector("input[name='erp5_url']").value;
+    var erp5_url = gadget.props.element.querySelector("input[name='erp5_url']").value,
+      original_query = getSynchronizeQuery(null);
+
     return gadget.setSetting("me", '')
       .push(function () {
         var configuration = {
           type: "replicate",
           query: {
-            query: '(portal_type: "Expense Record" AND (simulation_state:"draft" OR simulation_state:"sent" OR simulation_state:"stopped")) ' +
-                   'OR (portal_type: "Travel Request Record" AND (simulation_state:"draft" OR simulation_state:"sent" OR simulation_state:"stopped")) ' +
-                   'OR (portal_type: "Leave Report Record" AND simulation_state:"stopped") ' +
-                   'OR (portal_type: "Leave Request Record" AND (simulation_state:"draft" OR simulation_state:"sent" OR simulation_state:"stopped")) ' +
-                   'OR (portal_type: "Localisation Record" AND (simulation_state:"draft" OR simulation_state:"stopped")) ' +
-                   'OR (portal_type: "Expense Sheet" AND (reference: "expense_sheet")) ' +
-                   'OR (portal_type: "Currency" AND validation_state:"validated") ' +
-                   'OR (portal_type: "Service" AND validation_state:"validated") ',
+            query: original_query,
             limit: [0, 1234567890]
           },
           use_remote_post: true,
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.xml
index 450b157b09..ab759f6c49 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_erp5_configurator_js.xml
@@ -245,7 +245,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>989.27549.43950.31078</string> </value>
+                      <value> <string>994.52549.19733.34850</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -263,7 +263,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1613394309.96</float>
+                              <float>1631711329.34</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.html b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.html
index f747c6cc59..b7c52a2c6e 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.html
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.html
@@ -10,6 +10,8 @@
     <script src="renderjs.js" type="text/javascript"></script>
 
     <script src="jiodev.js" type="text/javascript"></script>
+    <script src="gadget_officejs_hr_tool.js" type="text/javascript"></script>
+
 
     <!-- custom script -->
     <script src="gadget_officejs_hr_jio.js" type="text/javascript"></script>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.xml
index 8843d412f0..6ab1c40f8b 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_html.xml
@@ -246,7 +246,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>966.52672.52784.27187</string> </value>
+                      <value> <string>994.52543.36230.12339</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -264,8 +264,8 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1523518145.13</float>
-                              <string>GMT+2</string>
+                              <float>1631713769.69</float>
+                              <string>UTC</string>
                             </tuple>
                           </state>
                         </object>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.js
index e16ff84ba6..78e4fa68da 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.js
@@ -56,6 +56,7 @@
 
     .declareAcquiredMethod("redirect", "redirect")
     .declareAcquiredMethod("getSetting", "getSetting")
+    .declareAcquiredMethod("getSettingList", "getSettingList")
     .declareAcquiredMethod("setSetting", "setSetting")
 
     .declareMethod('createJio', function (jio_options) {
@@ -99,31 +100,87 @@
     .declareMethod('repair', function () {
       var gadget = this;
       return this.getSetting("jio_storage_name")
-        .push(function (jio_storage_name) {
-          //try to specify me
-          if (jio_storage_name === 'ERP5') {
-            return gadget.getSetting('me')
-              .push(function (me) {
-                if (!me) {
-                  return gadget.getSetting('jio_storage_description')
-                    .push(function (configuration) {
-                      gadget.state_parameter_dict.jio_storage = jIO.createJIO(configuration.remote_sub_storage);
-                      return wrapJioCall(gadget, 'getAttachment', ['acl_users', configuration.remote_sub_storage.url, {format: "json"}])
-                       .push(function (result) {
-                         //recreate erp5 storage with indexeddb
-                         me = result._links.me ? result._links.me.href : 'manager';
-                         configuration.query.query += 'OR (portal_type: "Person" AND id: "' + me.split("/")[1] + '")',
-                         gadget.state_parameter_dict.jio_storage = jIO.createJIO(configuration);
-                         return gadget.setSetting('me', me);
-                       })
-                       .push(function () {
-                         return gadget.setSetting('jio_storage_description', configuration);
-                       });
-                    });
-               }
-          });
+       .push(function (jio_storage_name) {
+         if (jio_storage_name === 'ERP5') {
+           return gadget.getSettingList(['jio_storage_description', 'me'])
+             .push(function (result_list) {
+               var additional_query_list = [],
+                 service_query =  new ComplexQuery({
+                   operator: 'OR',
+                   query_list: [],
+                   type: "complex"
+                 }),
+                 me;
+               gadget.state_parameter_dict.jio_storage = jIO.createJIO(result_list[0].remote_sub_storage);
+               return wrapJioCall(gadget, 'allDocs', [
+                   {
+                     "query": '(selection_domain_use:"hr" AND translated_validation_state_title: "validated")',
+                     "limit": [0, 1000]
+                   }
+                 ])
+                 .push(function (result) {
+                   var i;
+                   if (result.data.rows.length) {
+                     for (i = 0; i < result.data.rows.length; i += 1) {
+                       service_query.query_list.push(new SimpleQuery({
+                         key: 'id',
+                         operator: '',
+                         type: "simple",
+                         value: result.data.rows[i].id.split('/')[1]
+                       }));
+                     }
+                     additional_query_list.push(new ComplexQuery({
+                       operator: 'AND',
+                       query_list: [
+                         new SimpleQuery({
+                           key: 'portal_type',
+                           operator: '',
+                           type: "simple",
+                           value: 'Service'
+                         }),
+                         service_query
+                       ],
+                       type: "complex"
+                     }));
+                   }
+
+                  if (! result_list[1]) {
+                    return wrapJioCall(gadget, 'getAttachment', ['acl_users', result_list[0].remote_sub_storage.url, {format: "json"}])
+                      .push(function (result) {
+                        me = result._links.me ? result._links.me.href : 'manager';
+                        return gadget.setSetting('me', me);
+                      })
+                  } else {
+                    me = result_list[1];
+                  }
+                })
+                .push(function () {
+                  additional_query_list.push(new ComplexQuery({
+                    operator: 'AND',
+                    query_list: [
+                      new SimpleQuery({
+                        key: 'portal_type',
+                        operator: '',
+                        type: "simple",
+                        value: 'Person'
+                      }),
+                      new SimpleQuery({
+                        key: 'id',
+                        operator: '',
+                        type: "simple",
+                        value: me.split("/")[1]
+                      })
+                    ],
+                    type: "complex"
+                   }));
+
+                   result_list[0].query.query = getSynchronizeQuery(additional_query_list);
+                   gadget.state_parameter_dict.jio_storage = jIO.createJIO(result_list[0]);
+                   return gadget.setSetting('jio_storage_description', result_list[0]);
+                });
+             });
          }
-      })
+       })
       .push(function () {
         return wrapJioCall(gadget, 'repair', arguments);
       })
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.xml
index 54459aa9f3..29f3923583 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_page_jio_js.xml
@@ -245,7 +245,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>966.59878.54409.55825</string> </value>
+                      <value> <string>994.52646.4747.8277</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -263,8 +263,8 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1523950559.17</float>
-                              <string>GMT+2</string>
+                              <float>1631780404.96</float>
+                              <string>UTC</string>
                             </tuple>
                           </state>
                         </object>
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.js b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.js
index 7cee0c4363..cc1478eb20 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.js
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.js
@@ -1,4 +1,4 @@
-/*global window, RSVP, FileReader */
+/*global window, RSVP, FileReader, QueryFactory, SimpleQuery, ComplexQuery, Query */
 /*jslint indent: 2, maxerr: 3, unparam: true */
 (function (window, RSVP) {
   "use strict";
@@ -96,4 +96,271 @@
     }
     return String.fromCharCode(random())+String.fromCharCode(random())+String.fromCharCode(random());
   };
+  
+  window.getSynchronizeQuery = function (additional_query_list) {
+    var basic_query,
+      expense_record_query,
+      travel_request_record_query,
+      leave_report_record_query,
+      leave_request_record_query,
+      localisation_record_query,
+      expense_sheet_query,
+      currency_query,
+      six_month_ago,
+      one_year_ago;
+    six_month_ago =  new Date();
+    six_month_ago.setMonth(six_month_ago.getMonth() - 6);
+    six_month_ago = six_month_ago.toISOString().slice(0, 10).replace(/-/g, "/");
+    one_year_ago = new Date();
+    one_year_ago.setFullYear(one_year_ago.getFullYear() - 1);
+    one_year_ago = one_year_ago.toISOString().slice(0, 10).replace(/-/g, "/");
+    expense_record_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Expense Record'
+        }),
+        new SimpleQuery({
+          key: 'modification_date',
+          operator: '>',
+          type: "simple",
+          value: six_month_ago
+        }),
+        new ComplexQuery({
+          operator: 'OR',
+          query_list: [
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "draft"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "sent"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "stopped"
+            })
+          ],
+          type: "complex"
+        })
+      ],
+      type: "complex"
+    });
+
+    travel_request_record_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Travel Request Record'
+        }),
+        new SimpleQuery({
+          key: 'modification_date',
+          operator: '>',
+          type: "simple",
+          value: six_month_ago
+        }),
+        new ComplexQuery({
+          operator: 'OR',
+          query_list: [
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "draft"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "sent"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "stopped"
+            })
+          ],
+          type: "complex"
+        })
+      ],
+      type: "complex"
+    });
+
+    leave_report_record_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Leave Report Record'
+        }),
+        new SimpleQuery({
+          key: 'modification_date',
+          operator: '>',
+          type: "simple",
+          value: six_month_ago
+        }),
+        new SimpleQuery({
+          key: 'simulation_state',
+          operator: '',
+          type: "simple",
+          value: "stopped"
+        })
+      ],
+      type: "complex"
+    });
+
+    leave_request_record_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Leave Request Record'
+        }),
+        new SimpleQuery({
+          key: 'modification_date',
+          operator: '>',
+          type: "simple",
+          value: one_year_ago
+        }),
+        new ComplexQuery({
+          operator: 'OR',
+          query_list: [
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "draft"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "sent"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "stopped"
+            })
+          ],
+          type: "complex"
+        })
+
+      ],
+      type: "complex"
+    });
+
+    localisation_record_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Localisation Record'
+        }),
+        new SimpleQuery({
+          key: 'modification_date',
+          operator: '>',
+          type: "simple",
+          value: six_month_ago
+        }),
+        new ComplexQuery({
+          operator: 'OR',
+          query_list: [
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "draft"
+            }),
+            new SimpleQuery({
+              key: 'simulation_state',
+              operator: '',
+              type: "simple",
+              value: "stopped"
+            })
+          ],
+          type: "complex"
+        })
+      ],
+      type: "complex"
+    });
+
+    expense_sheet_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Expense Sheet'
+        }),
+        new SimpleQuery({
+          key: 'reference',
+          operator: '',
+          type: "simple",
+          value: "expense_sheet"
+        })
+      ],
+      type: "complex"
+    });
+
+    currency_query = new ComplexQuery({
+      operator: 'AND',
+      query_list: [
+        new SimpleQuery({
+          key: 'portal_type',
+          operator: '',
+          type: "simple",
+          value: 'Currency'
+        }),
+        new SimpleQuery({
+          key: 'validation_state',
+          operator: '',
+          type: "simple",
+          value: "validated"
+        })
+      ],
+      type: "complex"
+    });
+
+    basic_query = new ComplexQuery({
+      operator: 'OR',
+      type: 'complex',
+      query_list: [
+        expense_record_query,
+        travel_request_record_query,
+        leave_report_record_query,
+        leave_request_record_query,
+        localisation_record_query,
+        expense_sheet_query,
+        currency_query
+      ]
+    });
+    if (additional_query_list) {
+      basic_query.query_list = basic_query.query_list.concat(additional_query_list);
+    }
+    return Query.objectToSearchText(basic_query);
+  };
+
 }(window, RSVP));
\ No newline at end of file
diff --git a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.xml b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.xml
index 40a125c3fc..cb9b9b9d63 100644
--- a/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.xml
+++ b/bt5/erp5_travel_expense/PathTemplateItem/web_page_module/gadget_hr_tool_js.xml
@@ -240,7 +240,7 @@
                   </item>
                   <item>
                       <key> <string>serial</string> </key>
-                      <value> <string>956.57355.19823.14643</string> </value>
+                      <value> <string>994.42603.26741.38963</string> </value>
                   </item>
                   <item>
                       <key> <string>state</string> </key>
@@ -258,7 +258,7 @@
                           </tuple>
                           <state>
                             <tuple>
-                              <float>1485347131.83</float>
+                              <float>1631713737.85</float>
                               <string>UTC</string>
                             </tuple>
                           </state>
diff --git a/bt5/erp5_travel_expense/PortalTypePropertySheetTemplateItem/property_sheet_list.xml b/bt5/erp5_travel_expense/PortalTypePropertySheetTemplateItem/property_sheet_list.xml
index 21e3e3ade6..ce7557eeb4 100644
--- a/bt5/erp5_travel_expense/PortalTypePropertySheetTemplateItem/property_sheet_list.xml
+++ b/bt5/erp5_travel_expense/PortalTypePropertySheetTemplateItem/property_sheet_list.xml
@@ -4,6 +4,7 @@
  </portal_type>
  <portal_type id="Expense Validation Request">
   <item>ExpenseValidationRequest</item>
+  <item>ExpenseValidationRequestConstraint</item>
  </portal_type>
  <portal_type id="Leave Request Record">
   <item>LeaveRequestRecord</item>
diff --git a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_viewAsJio/your_modification_date.xml b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_viewAsJio/your_modification_date.xml
index b66f341fff..6b095c67fe 100644
--- a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_viewAsJio/your_modification_date.xml
+++ b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/ExpenseRecord_viewAsJio/your_modification_date.xml
@@ -279,7 +279,7 @@
       <dictionary>
         <item>
             <key> <string>_text</string> </key>
-            <value> <string>python: here.getModificationDate().HTML4()</string> </value>
+            <value> <string>python: here.getModificationDate().Date()</string> </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/LeaveRequestRecord_viewAsJio/your_modification_date.xml b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/LeaveRequestRecord_viewAsJio/your_modification_date.xml
index b66f341fff..6b095c67fe 100644
--- a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/LeaveRequestRecord_viewAsJio/your_modification_date.xml
+++ b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/LeaveRequestRecord_viewAsJio/your_modification_date.xml
@@ -279,7 +279,7 @@
       <dictionary>
         <item>
             <key> <string>_text</string> </key>
-            <value> <string>python: here.getModificationDate().HTML4()</string> </value>
+            <value> <string>python: here.getModificationDate().Date()</string> </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/TravelRequestRecord_viewAsJio/your_modification_date.xml b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/TravelRequestRecord_viewAsJio/your_modification_date.xml
index b66f341fff..6b095c67fe 100644
--- a/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/TravelRequestRecord_viewAsJio/your_modification_date.xml
+++ b/bt5/erp5_travel_expense/SkinTemplateItem/portal_skins/erp5_hr_record/TravelRequestRecord_viewAsJio/your_modification_date.xml
@@ -279,7 +279,7 @@
       <dictionary>
         <item>
             <key> <string>_text</string> </key>
-            <value> <string>python: here.getModificationDate().HTML4()</string> </value>
+            <value> <string>python: here.getModificationDate().Date()</string> </value>
         </item>
       </dictionary>
     </pickle>
-- 
2.30.9