# HG changeset patch
# User Ranjith S R <ranjith@qualiantech.com>
# Date 1451482656 -19800
# Node ID e7b4021aa9b837b3a07c7baa5dbb3956da21c081
# Parent  494c265c879769563a40bf9349854ae4c6bf617d
Realted to issue 31757 : Create Cash Mgmt Transaction Date based on WEBPOS Date

diff --git a/src/org/openbravo/retail/posterminal/ProcessCashMgmt.java b/src/org/openbravo/retail/posterminal/ProcessCashMgmt.java
--- a/src/org/openbravo/retail/posterminal/ProcessCashMgmt.java
+++ b/src/org/openbravo/retail/posterminal/ProcessCashMgmt.java
@@ -9,8 +9,10 @@
 package org.openbravo.retail.posterminal;
 
 import java.math.BigDecimal;
+import java.util.Calendar;
 import java.util.Date;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.codehaus.jettison.json.JSONObject;
 import org.openbravo.advpaymentmngt.dao.TransactionsDao;
@@ -19,6 +21,7 @@
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.mobile.core.process.DataSynchronizationImportProcess;
 import org.openbravo.mobile.core.process.DataSynchronizationProcess.DataSynchronization;
+import org.openbravo.mobile.core.utils.OBMOBCUtils;
 import org.openbravo.model.financialmgmt.gl.GLItem;
 import org.openbravo.model.financialmgmt.payment.FIN_FinaccTransaction;
 import org.openbravo.model.financialmgmt.payment.FIN_FinancialAccount;
@@ -64,6 +67,32 @@
     if (jsonsent.has("glItem")) {
       glItemMain = OBDal.getInstance().get(GLItem.class, jsonsent.getString("glItem"));
     }
+
+    // get and prepare the cashMgmtTrxDate
+    Date cashMgmtTrxDate = new Date();
+    if (jsonsent.has("dateTime") && jsonsent.get("dateTime") != null
+        && StringUtils.isNotEmpty(jsonsent.getString("dateTime"))) {
+      final String strCashMgmtTrxDate = jsonsent.getString("dateTime");
+      if (!strCashMgmtTrxDate.substring(strCashMgmtTrxDate.length() - 1).equals("Z")) {
+        log.error(String.format(
+            "The cashup date must be provided in ISO 8601 format and be an UTC date (value: '%s')",
+            strCashMgmtTrxDate));
+      }
+      // get the timezoneOffset
+      final long timezoneOffset;
+      if (jsonsent.has("timezoneOffset") && jsonsent.get("timezoneOffset") != null
+          && StringUtils.isNotEmpty(jsonsent.getString("timezoneOffset"))) {
+        timezoneOffset = Long.parseLong(jsonsent.getString("timezoneOffset"));
+      } else {
+        timezoneOffset = -((Calendar.getInstance().get(Calendar.ZONE_OFFSET) + Calendar
+            .getInstance().get(Calendar.DST_OFFSET)) / (60 * 1000));
+        log.error("Error processing cash close (1): error retrieving the timezoneOffset. Using the current timezoneOffset");
+      }
+      cashMgmtTrxDate = OBMOBCUtils.calculateClientDatetime(strCashMgmtTrxDate, timezoneOffset);
+    } else {
+      log.debug("Error processing cash close (2): error retrieving cashUp date. Using current server date");
+    }
+
     FIN_FinancialAccount account = paymentMethod.getFinancialAccount();
 
     FIN_FinaccTransaction transaction = OBProvider.getInstance().get(FIN_FinaccTransaction.class);
@@ -84,8 +113,8 @@
     transaction.setProcessed(true);
     transaction.setTransactionType("BPW");
     transaction.setDescription(description);
-    transaction.setDateAcct(new Date());
-    transaction.setTransactionDate(new Date());
+    transaction.setDateAcct(cashMgmtTrxDate);
+    transaction.setTransactionDate(cashMgmtTrxDate);
     transaction.setStatus("RDNC");
 
     OBDal.getInstance().save(transaction);
@@ -116,8 +145,8 @@
       secondTransaction.setProcessed(true);
       secondTransaction.setTransactionType("BPW");
       secondTransaction.setDescription(description);
-      secondTransaction.setDateAcct(new Date());
-      secondTransaction.setTransactionDate(new Date());
+      secondTransaction.setDateAcct(cashMgmtTrxDate);
+      secondTransaction.setTransactionDate(cashMgmtTrxDate);
       secondTransaction.setStatus("RDNC");
       OBDal.getInstance().save(secondTransaction);
     }
diff --git a/src/org/openbravo/retail/posterminal/master/Cashup.java b/src/org/openbravo/retail/posterminal/master/Cashup.java
--- a/src/org/openbravo/retail/posterminal/master/Cashup.java
+++ b/src/org/openbravo/retail/posterminal/master/Cashup.java
@@ -11,12 +11,10 @@
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.List;
 import java.util.TimeZone;
 
 import javax.servlet.ServletException;
-import javax.xml.bind.DatatypeConverter;
 
 import org.apache.log4j.Logger;
 import org.codehaus.jettison.json.JSONArray;
@@ -227,10 +225,6 @@
       JSONObject result = new JSONObject();
       Float totalamt = Float.parseFloat(cashMgmtJSON.get("paymentAmount").toString())
           + Float.parseFloat(cashMgmtJSON.get("depositAmount").toString());
-      Calendar c = DatatypeConverter.parseDateTime(cashMgmtJSON.get("creationDate").toString());
-      int hour = c.get(Calendar.HOUR_OF_DAY);
-      int minute = c.get(Calendar.MINUTE);
-      String creationDate = hour + ":" + minute;
 
       // Get Payment Method ID and Reason ID
       String financialacct = cashMgmtJSON.get("account").toString();
@@ -257,7 +251,8 @@
           : "drop");
       result.put("reasonId", reasonId);
       result.put("paymentMethodId", paymentmethodId);
-      result.put("time", creationDate);
+      result.put("creationDate", cashMgmtJSON.get("creationDate").toString());
+      result.put("timezoneOffset", "0");
       result.put("userId", cashMgmtJSON.get("createdBy"));
       result.put("user", cashMgmtJSON.get("createdBy$_identifier"));
       result.put("isocode", cashMgmtJSON.get("currency$_identifier"));
diff --git a/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js b/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js
--- a/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js
+++ b/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js
@@ -48,6 +48,7 @@
       OB.Dal.find(OB.Model.CashUp, {
         'isprocessed': 'N'
       }, function (cashUp) {
+        var now = new Date();
         var addedCashMgmt = new OB.Model.CashManagement({
           id: OB.UTIL.get_UUID(),
           description: p.identifier + ' - ' + model.get('name'),
@@ -58,7 +59,8 @@
           paymentMethodId: p.id,
           user: OB.MobileApp.model.get('context').user._identifier,
           userId: OB.MobileApp.model.get('context').user.id,
-          time: new Date().toString().substring(16, 21),
+          creationDate: OB.I18N.normalizeDate(now),
+          timezoneOffset: now.getTimezoneOffset(),
           isocode: p.isocode,
           glItem: p.glItem,
           cashup_id: cashUp.at(0).get('id'),
diff --git a/web/org.openbravo.retail.posterminal/js/cashmgmt/view/listdepositsdrops.js b/web/org.openbravo.retail.posterminal/js/cashmgmt/view/listdepositsdrops.js
--- a/web/org.openbravo.retail.posterminal/js/cashmgmt/view/listdepositsdrops.js
+++ b/web/org.openbravo.retail.posterminal/js/cashmgmt/view/listdepositsdrops.js
@@ -57,10 +57,10 @@
         amnt = OB.I18N.formatCurrency(OB.DEC.add(0, this.model.get('amount')));
       }
     }
-
+    var creationDate = new Date(this.model.get('creationDate'));
     this.$.description.setContent(lbl + this.model.get('description'));
     this.$.user.setContent(this.model.get('user'));
-    this.$.time.setContent(this.model.get('time'));
+    this.$.time.setContent(OB.UTIL.padNumber(creationDate.getHours(), 2) + ':' + OB.UTIL.padNumber(creationDate.getMinutes(), 2));
     if (foreignAmt && ((this.model.get('rate') && this.model.get('rate') !== '1') || amnt !== foreignAmt)) {
       this.$.foreignAmt.setContent('(' + foreignAmt + ' ' + this.model.get('isocode') + ')');
     }
diff --git a/web/org.openbravo.retail.posterminal/js/model/cashmanagement.js b/web/org.openbravo.retail.posterminal/js/model/cashmanagement.js
--- a/web/org.openbravo.retail.posterminal/js/model/cashmanagement.js
+++ b/web/org.openbravo.retail.posterminal/js/model/cashmanagement.js
@@ -58,8 +58,12 @@
     column: 'userId',
     type: 'TEXT'
   }, {
-    name: 'time',
-    column: 'time',
+    name: 'creationDate',
+    column: 'creationDate',
+    type: 'TEXT'
+  }, {
+    name: 'timezoneOffset',
+    column: 'timezoneOffset',
     type: 'TEXT'
   }, {
     name: 'isocode',
