Attached Files | taxescascade.diff [^] (17,157 bytes) 2012-11-27 10:46 [Show Content] [Hide Content]diff --git a/src/org/openbravo/retail/posterminal/master/TaxRate.java b/src/org/openbravo/retail/posterminal/master/TaxRate.java
--- a/src/org/openbravo/retail/posterminal/master/TaxRate.java
+++ b/src/org/openbravo/retail/posterminal/master/TaxRate.java
@@ -45,7 +45,7 @@
String hql = "from FinancialMgmtTaxRate as financialMgmtTaxRate where "
+ "(financialMgmtTaxRate.$incrementalUpdateCriteria) AND active = true "
- + "and parentTaxRate is null and salesPurchaseType in ('S', 'B') ";
+ + "and salesPurchaseType in ('S', 'B') ";
if (fromCountry != null) {
hql = hql + "and (country.id = '" + fromCountry.getId() + "' or country is null) ";
diff --git a/web/org.openbravo.retail.posterminal/js/data/dataordertaxes.js b/web/org.openbravo.retail.posterminal/js/data/dataordertaxes.js
--- a/web/org.openbravo.retail.posterminal/js/data/dataordertaxes.js
+++ b/web/org.openbravo.retail.posterminal/js/data/dataordertaxes.js
@@ -14,6 +14,11 @@
OB = window.OB || {};
OB.DATA = window.OB.DATA || {};
+ // Order taxes in descent order by lineNo
+ OB.Collection.TaxRateList.prototype.comparator = function (tax) {
+ return tax.get('lineNo');
+ };
+
OB.DATA.OrderTaxes = function (modelOrder) {
this._id = 'logicOrderTaxes';
@@ -38,57 +43,86 @@
taxCategory: product.get('taxCategory'),
businessPartnerTaxCategory: bpTaxCategory
}, function (coll, args) { // success
- var taxRate, rate, taxAmt, net, pricenet, amount, taxId;
- if (coll) {
- if (coll.length > 0) {
- taxRate = coll.at(0);
- taxId = taxRate.get('id');
+ var rate, taxAmt, net, pricenet, pricenetcascade, amount, taxId;
+ if (coll && coll.length > 0) {
- rate = new BigDecimal(String(taxRate.get('rate')));
- rate = rate.divide(new BigDecimal('100'), 20, BigDecimal.prototype.ROUND_UNNECESSARY);
+ var linerate = BigDecimal.prototype.ONE;
+ var linetaxid = coll.at(0).get('id');
+ var validFromDate = coll.at(0).get('validFromDate');
+ coll = _.filter(coll.models, function (taxRate) {
+ return taxRate.get('validFromDate') === validFromDate;
+ });
- pricenet = OB.DEC.div(element.get('grossUnitPrice') || element.get('price'), rate.add(new BigDecimal('1')));
+ // First calculate the line rate.
+ _.each(coll, function (taxRate, taxIndex) {
- net = OB.DEC.mul(pricenet, element.get('qty'));
- gross = element.get('lineGrossAmount') || element.get('gross');
- amount = OB.DEC.sub(gross, net);
+ if (!taxRate.get('summaryLevel')) {
+ rate = new BigDecimal(String(taxRate.get('rate'))); // 10
+ rate = rate.divide(new BigDecimal('100'), 20, BigDecimal.prototype.ROUND_UNNECESSARY); // 0.10
+ if (taxRate.get('cascade')) {
+ linerate = linerate.multiply(rate.add(BigDecimal.prototype.ONE));
+ } else {
+ linerate = linerate.add(rate);
+ }
+ } else {
+ linetaxid = taxRate.get('id');
+ }
+ }, this);
- element.set('tax', taxId);
- element.set('taxAmount', amount);
- element.set('net', net);
- element.set('pricenet', pricenet);
+ var linepricenet = OB.DEC.div(element.get('grossUnitPrice') || element.get('price'), linerate);
+ var linenet = OB.DEC.mul(linepricenet, element.get('qty'));
+ var linegross = element.get('lineGrossAmount') || element.get('gross');
- totalnet = OB.DEC.add(totalnet, net);
+ element.set('tax', linetaxid);
+ element.set('taxAmount', OB.DEC.sub(linegross, linenet));
+ element.set('net', linenet);
+ element.set('pricenet', linepricenet);
- if (taxes[taxId]) {
- taxes[taxId].net = OB.DEC.add(taxes[taxId].net, net);
- taxes[taxId].amount = OB.DEC.add(taxes[taxId].amount, amount);
- taxes[taxId].gross = OB.DEC.add(taxes[taxId].gross, gross);
- } else {
- taxes[taxId] = {};
- taxes[taxId].name = taxRate.get('name');
- taxes[taxId].rate = taxRate.get('rate');
- taxes[taxId].net = net;
- taxes[taxId].amount = amount;
- taxes[taxId].gross = gross;
- }
+ totalnet = OB.DEC.add(totalnet, linenet);
- // processed = yes
- queue[element.cid] = true;
+ pricenet = new BigDecimal(String(linepricenet)); // 2 decimals properly rounded.
+ pricenetcascade = pricenet;
+ // second calculate tax lines.
+ _.each(coll, function (taxRate, taxIndex) {
+ if (!taxRate.get('summaryLevel')) {
+ taxId = taxRate.get('id');
- // checking queue status
- triggerNext = OB.UTIL.queueStatus(queue);
+ rate = new BigDecimal(String(taxRate.get('rate')));
+ rate = rate.divide(new BigDecimal('100'), 20, BigDecimal.prototype.ROUND_UNNECESSARY);
- // triggering next steps
- if (triggerNext) {
- me.set('taxes', taxes);
- me.set('net', totalnet);
- if (callback) {
- callback();
+ if (taxRate.get('cascade')) {
+ pricenet = pricenetcascade;
+ }
+ net = OB.DEC.mul(pricenet, element.get('qty'));
+ amount = OB.DEC.mul(net, rate);
+ pricenetcascade = pricenet.multiply(rate.add(BigDecimal.prototype.ONE));
+
+ if (taxes[taxId]) {
+ taxes[taxId].net = OB.DEC.add(taxes[taxId].net, net);
+ taxes[taxId].amount = OB.DEC.add(taxes[taxId].amount, amount);
+ } else {
+ taxes[taxId] = {};
+ taxes[taxId].name = taxRate.get('name');
+ taxes[taxId].rate = taxRate.get('rate');
+ taxes[taxId].net = net;
+ taxes[taxId].amount = amount;
}
}
- } else {
- OB.UTIL.showError("OBDAL error: Not tax found for " + args.get('_identifier'));
+ }, this);
+
+ // processed = yes
+ queue[element.cid] = true;
+
+ // checking queue status
+ triggerNext = OB.UTIL.queueStatus(queue);
+
+ // triggering next steps
+ if (triggerNext) {
+ me.set('taxes', taxes);
+ me.set('net', totalnet);
+ if (callback) {
+ callback();
+ }
}
} else {
OB.UTIL.showError("OBDAL error: Not tax found for " + args.get('_identifier'));
diff --git a/web/org.openbravo.retail.posterminal/res/printclosedreceipt.xml b/web/org.openbravo.retail.posterminal/res/printclosedreceipt.xml
--- a/web/org.openbravo.retail.posterminal/res/printclosedreceipt.xml
+++ b/web/org.openbravo.retail.posterminal/res/printclosedreceipt.xml
@@ -137,24 +137,20 @@
<text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_breakdown'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_base'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_TAX'))%></text>
- <text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_LineTotal'))%></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
<%
- var totNet = 0;
var totAmount = 0;
var taxes = order.get('taxes');
for (var t in taxes) {
- totNet += taxes[t].net;
totAmount += taxes[t].amount;
%>
<line>
<text align ="left" length="12"><%= OB.I18N.formatRate(taxes[t].rate) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].net) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].amount) %></text>
- <text align ="left" length="12"><%= OB.I18N.formatCurrency(taxes[t].gross) %></text>
</line>
<%
}
@@ -163,10 +159,9 @@
<text>------------------------------------------</text>
</line>
<line>
- <text align ="left" length="12">Totals</text>
- <text align ="left" length="9"><%= OB.I18N.formatCurrency(totNet) %></text>
+ <text align ="left" length="21"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_display_total'))%></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(totAmount) %></text>
- <text align ="left" length="12"><%= order.printGross() %></text>
+ </line>
</line>
<line>
diff --git a/web/org.openbravo.retail.posterminal/res/printinvoice.xml b/web/org.openbravo.retail.posterminal/res/printinvoice.xml
--- a/web/org.openbravo.retail.posterminal/res/printinvoice.xml
+++ b/web/org.openbravo.retail.posterminal/res/printinvoice.xml
@@ -153,24 +153,20 @@
<text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_breakdown'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_base'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_TAX'))%></text>
- <text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_LineTotal'))%></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
<%
- var totNet = 0;
var totAmount = 0;
var taxes = order.get('taxes');
for (var t in taxes) {
- totNet += taxes[t].net;
totAmount += taxes[t].amount;
%>
<line>
<text align ="left" length="12"><%= OB.I18N.formatRate(taxes[t].rate) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].net) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].amount) %></text>
- <text align ="left" length="12"><%= OB.I18N.formatCurrency(taxes[t].gross) %></text>
</line>
<%
}
@@ -179,10 +175,8 @@
<text>------------------------------------------</text>
</line>
<line>
- <text align ="left" length="12">Totals</text>
- <text align ="left" length="9"><%= OB.I18N.formatCurrency(totNet) %></text>
+ <text align ="left" length="21"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_display_total'))%></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(totAmount) %></text>
- <text align ="left" length="12"><%= order.printGross() %></text>
</line>
<line>
diff --git a/web/org.openbravo.retail.posterminal/res/printreceipt.xml b/web/org.openbravo.retail.posterminal/res/printreceipt.xml
--- a/web/org.openbravo.retail.posterminal/res/printreceipt.xml
+++ b/web/org.openbravo.retail.posterminal/res/printreceipt.xml
@@ -147,24 +147,20 @@
<text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_breakdown'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_base'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_TAX'))%></text>
- <text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_LineTotal'))%></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
<%
- var totNet = 0;
var totAmount = 0;
var taxes = order.get('taxes');
for (var t in taxes) {
- totNet += taxes[t].net;
totAmount += taxes[t].amount;
%>
<line>
<text align ="left" length="12"><%= OB.I18N.formatRate(taxes[t].rate) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].net) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].amount) %></text>
- <text align ="left" length="12"><%= OB.I18N.formatCurrency(taxes[t].gross) %></text>
</line>
<%
}
@@ -173,10 +169,8 @@
<text>------------------------------------------</text>
</line>
<line>
- <text align ="left" length="12">Totals</text>
- <text align ="left" length="9"><%= OB.I18N.formatCurrency(totNet) %></text>
+ <text align ="left" length="21"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_display_total'))%></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(totAmount) %></text>
- <text align ="left" length="12"><%= order.printGross() %></text>
</line>
<line>
diff --git a/web/org.openbravo.retail.posterminal/res/printreturn.xml b/web/org.openbravo.retail.posterminal/res/printreturn.xml
--- a/web/org.openbravo.retail.posterminal/res/printreturn.xml
+++ b/web/org.openbravo.retail.posterminal/res/printreturn.xml
@@ -138,24 +138,20 @@
<text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_breakdown'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_base'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_TAX'))%></text>
- <text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_LineTotal'))%></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
<%
- var totNet = 0;
var totAmount = 0;
var taxes = order.get('taxes');
for (var t in taxes) {
- totNet += taxes[t].net;
totAmount += taxes[t].amount;
%>
<line>
<text align ="left" length="12"><%= OB.I18N.formatRate(taxes[t].rate) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].net) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].amount) %></text>
- <text align ="left" length="12"><%= OB.I18N.formatCurrency(taxes[t].gross) %></text>
</line>
<%
}
@@ -164,10 +160,8 @@
<text>------------------------------------------</text>
</line>
<line>
- <text align ="left" length="12">Totals</text>
- <text align ="left" length="9"><%= OB.I18N.formatCurrency(totNet) %></text>
+ <text align ="left" length="21"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_display_total'))%></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(totAmount) %></text>
- <text align ="left" length="12"><%= order.printGross() %></text>
</line>
<line>
diff --git a/web/org.openbravo.retail.posterminal/res/printreturninvoice.xml b/web/org.openbravo.retail.posterminal/res/printreturninvoice.xml
--- a/web/org.openbravo.retail.posterminal/res/printreturninvoice.xml
+++ b/web/org.openbravo.retail.posterminal/res/printreturninvoice.xml
@@ -141,24 +141,20 @@
<text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_breakdown'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_base'))%></text>
<text align ="left" length="9"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_tck_TAX'))%></text>
- <text align ="left" length="12"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_LineTotal'))%></text>
</line>
<line>
<text>------------------------------------------</text>
</line>
<%
- var totNet = 0;
var totAmount = 0;
var taxes = order.get('taxes');
for (var t in taxes) {
- totNet += taxes[t].net;
totAmount += taxes[t].amount;
%>
<line>
<text align ="left" length="12"><%= OB.I18N.formatRate(taxes[t].rate) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].net) %></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(taxes[t].amount) %></text>
- <text align ="left" length="12"><%= OB.I18N.formatCurrency(taxes[t].gross) %></text>
</line>
<%
}
@@ -167,10 +163,8 @@
<text>------------------------------------------</text>
</line>
<line>
- <text align ="left" length="12">Totals</text>
- <text align ="left" length="9"><%= OB.I18N.formatCurrency(totNet) %></text>
+ <text align ="left" length="21"><%= OB.UTIL.encodeXMLComponent(OB.I18N.getLabel('OBPOS_display_total'))%></text>
<text align ="left" length="9"><%= OB.I18N.formatCurrency(totAmount) %></text>
- <text align ="left" length="12"><%= order.printGross() %></text>
</line>
<line>
|