Project:
View Issue Details[ Jump to Notes ] | [ Issue History ] [ Print ] | |||||||
ID | ||||||||
0032577 | ||||||||
Type | Category | Severity | Reproducibility | Date Submitted | Last Update | |||
feature request | [Retail Modules] Web POS | minor | have not tried | 2016-04-04 12:05 | 2018-12-19 17:30 | |||
Reporter | aaroncalero | View Status | public | |||||
Assigned To | ebecerra | |||||||
Priority | normal | Resolution | fixed | Fixed in Version | RR19Q1 | |||
Status | closed | Fix in branch | Fixed in SCM revision | |||||
Projection | none | ETA | none | Target Version | ||||
OS | Any | Database | Any | Java version | ||||
OS Version | Database version | Ant version | ||||||
Product Version | SCM revision | |||||||
Review Assigned To | marvintm | |||||||
Regression level | ||||||||
Regression date | ||||||||
Regression introduced in release | ||||||||
Regression introduced by commit | ||||||||
Triggers an Emergency Pack | No | |||||||
Summary | 0032577: It would be nice to have a menu entry to print the real invoices related to a ticket | |||||||
Description | Currently in Web POS there is no way to print the real invoice(s) related to a ticket. The existing Print this Receipt button just assumes that the invoice is an exact copy of the ticket and prints an invoice which has exactly the same lines as the receipt. This new functionalty will load in web pos the real invoices related to a ticket and will allow the user to print these invoices. | |||||||
Steps To Reproduce | - | |||||||
Tags | No tags attached. | |||||||
Attached Files | ReprintInvoices_Core.diff [^] (5,803 bytes) 2018-10-01 18:08 [Show Content] [Hide Content]diff --git a/src-db/database/model/views/C_INVOICE_CANDIDATE_V.xml b/src-db/database/model/views/C_INVOICE_CANDIDATE_V.xml --- a/src-db/database/model/views/C_INVOICE_CANDIDATE_V.xml +++ b/src-db/database/model/views/C_INVOICE_CANDIDATE_V.xml @@ -1,4 +1,4 @@ <?xml version="1.0"?> <database name="VIEW C_INVOICE_CANDIDATE_V"> - <view name="C_INVOICE_CANDIDATE_V"><![CDATA[SELECT o.c_order_id AS c_invoice_candidate_v_id, o.isactive, o.created, o.createdby, o.updated, o.updatedby, o.ad_client_id, o.ad_org_id, o.c_bpartner_id, o.c_order_id, o.documentno, o.dateordered, o.c_doctype_id, o.totallines AS amountlines, o.grandtotal AS amountlinesgross, sum(round((l.qtyordered - l.qtyinvoiced) * l.priceactual, c.stdprecision)) AS notinvoicedlines, round(sum(round((l.qtyordered - l.qtyinvoiced) * l.priceactual, c.stdprecision) * (1 + t.rate / 100)), c.stdprecision) AS notinvoicedlinesgross, o.invoicerule AS term, sum(round((l.qtydelivered - l.qtyinvoiced) * l.priceactual, c.stdprecision)) AS pendinglines, round(sum(round((l.qtydelivered - l.qtyinvoiced) * l.priceactual, c.stdprecision) * (1 + t.rate / 100)), c.stdprecision) AS pendinglinesgross, sum(abs(l.qtyordered)) AS qtyordered, sum(abs(l.qtydelivered)) AS qtydelivered, o.issotrx, o.istaxincluded, o.c_currency_id, o.datepromised, o.a_asset_id, o.c_project_id, o.c_costcenter_id, o.user1_id, o.user2_id, o.m_warehouse_id, o.grandtotal FROM c_order o JOIN c_doctype dt ON o.c_doctype_id = dt.c_doctype_id JOIN c_bpartner bp ON o.c_bpartner_id = bp.c_bpartner_id JOIN c_currency c ON o.c_currency_id = c.c_currency_id JOIN c_orderline l ON o.c_order_id = l.c_order_id JOIN c_tax t ON t.c_tax_id = l.c_tax_id LEFT JOIN c_invoiceschedule si ON bp.c_invoiceschedule_id = si.c_invoiceschedule_id WHERE (o.docstatus IN ('CO', 'CL', 'IP')) AND dt.docbasetype = 'SOO' AND (dt.docsubtypeso NOT IN ('ON', 'OB', 'WR')) AND (o.invoicerule = 'I' OR o.invoicerule = 'O' OR o.invoicerule = 'D' OR o.invoicerule = 'S' AND (si.invoicefrequency IS NULL OR si.invoicefrequency = 'D' OR si.invoicefrequency = 'W' OR si.invoicefrequency = 'T' AND trunc(o.dateordered) <= (trunc(now(), 'MM') + si.invoicedaycutoff - 1) AND trunc(now()) >= (trunc(o.dateordered, 'MM') + si.invoiceday - 1) OR trunc(o.dateordered) <= (trunc(now(), 'MM') + si.invoicedaycutoff + 14) AND trunc(now()) >= (trunc(o.dateordered, 'MM') + si.invoiceday + 14) OR si.invoicefrequency = 'M' AND trunc(o.dateordered) <= (trunc(now(), 'MM') + si.invoicedaycutoff - 1) AND trunc(now()) >= (trunc(o.dateordered, 'MM') + si.invoiceday - 1))) AND (obequals(l.qtyordered, l.qtyinvoiced) = 'N' OR obequals(l.qtydelivered, l.qtyinvoiced) = 'N') GROUP BY o.ad_client_id, o.ad_org_id, o.c_bpartner_id, o.c_order_id, o.documentno, o.dateordered, o.c_doctype_id, o.totallines, o.grandtotal, o.invoicerule, c.c_currency_id, c.stdprecision, o.isactive, o.created, o.createdby, o.updated, o.updatedby, o.issotrx, o.istaxincluded, o.c_currency_id, o.datepromised, o.a_asset_id, o.c_project_id, o.c_costcenter_id, o.user1_id, o.user2_id, o.m_warehouse_id]]></view> + <view name="C_INVOICE_CANDIDATE_V"><![CDATA[SELECT o.c_order_id AS c_invoice_candidate_v_id, o.isactive, o.created, o.createdby, o.updated, o.updatedby, o.ad_client_id, o.ad_org_id, o.c_bpartner_id, o.c_order_id, o.documentno, o.dateordered, o.c_doctype_id, o.totallines AS amountlines, o.grandtotal AS amountlinesgross, sum(round((l.qtyordered - l.qtyinvoiced) * l.priceactual, c.stdprecision)) AS notinvoicedlines, round(sum(round((l.qtyordered - l.qtyinvoiced) * l.priceactual, c.stdprecision) * (1 + t.rate / 100)), c.stdprecision) AS notinvoicedlinesgross, o.invoicerule AS term, sum(round((l.qtydelivered - l.qtyinvoiced) * l.priceactual, c.stdprecision)) AS pendinglines, round(sum(round((l.qtydelivered - l.qtyinvoiced) * l.priceactual, c.stdprecision) * (1 + t.rate / 100)), c.stdprecision) AS pendinglinesgross, sum(abs(l.qtyordered)) AS qtyordered, sum(abs(l.qtydelivered)) AS qtydelivered, o.issotrx, o.istaxincluded, o.c_currency_id, o.datepromised, o.a_asset_id, o.c_project_id, o.c_costcenter_id, o.user1_id, o.user2_id, o.m_warehouse_id, o.grandtotal FROM c_order o JOIN c_doctype dt ON o.c_doctype_id = dt.c_doctype_id JOIN c_bpartner bp ON o.c_bpartner_id = bp.c_bpartner_id JOIN c_currency c ON o.c_currency_id = c.c_currency_id JOIN c_orderline l ON o.c_order_id = l.c_order_id JOIN c_tax t ON t.c_tax_id = l.c_tax_id LEFT JOIN c_invoiceschedule si ON bp.c_invoiceschedule_id = si.c_invoiceschedule_id WHERE (o.docstatus IN ('CO', 'CL', 'IP')) AND dt.docbasetype = 'SOO' AND (dt.docsubtypeso NOT IN ('ON', 'OB')) AND (o.invoicerule = 'I' OR o.invoicerule = 'O' OR o.invoicerule = 'D' OR o.invoicerule = 'S' AND (si.invoicefrequency IS NULL OR si.invoicefrequency = 'D' OR si.invoicefrequency = 'W' OR si.invoicefrequency = 'T' AND trunc(o.dateordered) <= (trunc(now(), 'MM') + si.invoicedaycutoff - 1) AND trunc(now()) >= (trunc(o.dateordered, 'MM') + si.invoiceday - 1) OR trunc(o.dateordered) <= (trunc(now(), 'MM') + si.invoicedaycutoff + 14) AND trunc(now()) >= (trunc(o.dateordered, 'MM') + si.invoiceday + 14) OR si.invoicefrequency = 'M' AND trunc(o.dateordered) <= (trunc(now(), 'MM') + si.invoicedaycutoff - 1) AND trunc(now()) >= (trunc(o.dateordered, 'MM') + si.invoiceday - 1))) AND (obequals(l.qtyordered, l.qtyinvoiced) = 'N' OR obequals(l.qtydelivered, l.qtyinvoiced) = 'N') GROUP BY o.ad_client_id, o.ad_org_id, o.c_bpartner_id, o.c_order_id, o.documentno, o.dateordered, o.c_doctype_id, o.totallines, o.grandtotal, o.invoicerule, c.c_currency_id, c.stdprecision, o.isactive, o.created, o.createdby, o.updated, o.updatedby, o.issotrx, o.istaxincluded, o.c_currency_id, o.datepromised, o.a_asset_id, o.c_project_id, o.c_costcenter_id, o.user1_id, o.user2_id, o.m_warehouse_id]]></view> </database> ReprintInvoices_Sampledata.export [^] (64,159 bytes) 2018-10-16 16:55 ReprintInvoices_Posterminal.diff [^] (56,498 bytes) 2018-10-16 16:55 [Show Content] [Hide Content] diff --git a/src-db/database/sourcedata/AD_MESSAGE.xml b/src-db/database/sourcedata/AD_MESSAGE.xml --- a/src-db/database/sourcedata/AD_MESSAGE.xml +++ b/src-db/database/sourcedata/AD_MESSAGE.xml @@ -1477,6 +1477,18 @@ <!--29364100E85341C0959A2AC3A6F61776--> <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N> <!--29364100E85341C0959A2AC3A6F61776--></AD_MESSAGE> +<!--29443F66A7014913BF38DD74C01BEAB7--><AD_MESSAGE> +<!--29443F66A7014913BF38DD74C01BEAB7--> <AD_MESSAGE_ID><![CDATA[29443F66A7014913BF38DD74C01BEAB7]]></AD_MESSAGE_ID> +<!--29443F66A7014913BF38DD74C01BEAB7--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--29443F66A7014913BF38DD74C01BEAB7--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--29443F66A7014913BF38DD74C01BEAB7--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--29443F66A7014913BF38DD74C01BEAB7--> <VALUE><![CDATA[OBPOS_LblInvoices]]></VALUE> +<!--29443F66A7014913BF38DD74C01BEAB7--> <MSGTEXT><![CDATA[Select Invoices to Print]]></MSGTEXT> +<!--29443F66A7014913BF38DD74C01BEAB7--> <MSGTYPE><![CDATA[I]]></MSGTYPE> +<!--29443F66A7014913BF38DD74C01BEAB7--> <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID> +<!--29443F66A7014913BF38DD74C01BEAB7--> <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N> +<!--29443F66A7014913BF38DD74C01BEAB7--></AD_MESSAGE> + <!--295AEB3ADEFF4089A71D580CD14F2280--><AD_MESSAGE> <!--295AEB3ADEFF4089A71D580CD14F2280--> <AD_MESSAGE_ID><![CDATA[295AEB3ADEFF4089A71D580CD14F2280]]></AD_MESSAGE_ID> <!--295AEB3ADEFF4089A71D580CD14F2280--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> @@ -8813,6 +8825,18 @@ <!--D83C6C0E02E74118861E541A78C18DDC--> <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N> <!--D83C6C0E02E74118861E541A78C18DDC--></AD_MESSAGE> +<!--D8582764504C4B5BAF4051F90863F839--><AD_MESSAGE> +<!--D8582764504C4B5BAF4051F90863F839--> <AD_MESSAGE_ID><![CDATA[D8582764504C4B5BAF4051F90863F839]]></AD_MESSAGE_ID> +<!--D8582764504C4B5BAF4051F90863F839--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--D8582764504C4B5BAF4051F90863F839--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--D8582764504C4B5BAF4051F90863F839--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--D8582764504C4B5BAF4051F90863F839--> <VALUE><![CDATA[OBPOS_LblPrintOneReceipt]]></VALUE> +<!--D8582764504C4B5BAF4051F90863F839--> <MSGTEXT><![CDATA[Print receipt]]></MSGTEXT> +<!--D8582764504C4B5BAF4051F90863F839--> <MSGTYPE><![CDATA[I]]></MSGTYPE> +<!--D8582764504C4B5BAF4051F90863F839--> <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID> +<!--D8582764504C4B5BAF4051F90863F839--> <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N> +<!--D8582764504C4B5BAF4051F90863F839--></AD_MESSAGE> + <!--D892537B73F34E73A69BFE56FBAF0206--><AD_MESSAGE> <!--D892537B73F34E73A69BFE56FBAF0206--> <AD_MESSAGE_ID><![CDATA[D892537B73F34E73A69BFE56FBAF0206]]></AD_MESSAGE_ID> <!--D892537B73F34E73A69BFE56FBAF0206--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> @@ -9474,6 +9498,18 @@ <!--E6DDCCC81561495BA422C7EFCFC605C0--> <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N> <!--E6DDCCC81561495BA422C7EFCFC605C0--></AD_MESSAGE> +<!--E6F55EA486734323820A70CB41EB1943--><AD_MESSAGE> +<!--E6F55EA486734323820A70CB41EB1943--> <AD_MESSAGE_ID><![CDATA[E6F55EA486734323820A70CB41EB1943]]></AD_MESSAGE_ID> +<!--E6F55EA486734323820A70CB41EB1943--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--E6F55EA486734323820A70CB41EB1943--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--E6F55EA486734323820A70CB41EB1943--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--E6F55EA486734323820A70CB41EB1943--> <VALUE><![CDATA[OBPOS_LblPrintInvoices]]></VALUE> +<!--E6F55EA486734323820A70CB41EB1943--> <MSGTEXT><![CDATA[Print Invoices]]></MSGTEXT> +<!--E6F55EA486734323820A70CB41EB1943--> <MSGTYPE><![CDATA[I]]></MSGTYPE> +<!--E6F55EA486734323820A70CB41EB1943--> <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID> +<!--E6F55EA486734323820A70CB41EB1943--> <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N> +<!--E6F55EA486734323820A70CB41EB1943--></AD_MESSAGE> + <!--E6F5F9B8D1244F41BC6B7DAE90BB953B--><AD_MESSAGE> <!--E6F5F9B8D1244F41BC6B7DAE90BB953B--> <AD_MESSAGE_ID><![CDATA[E6F5F9B8D1244F41BC6B7DAE90BB953B]]></AD_MESSAGE_ID> <!--E6F5F9B8D1244F41BC6B7DAE90BB953B--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> diff --git a/src-db/database/sourcedata/OBMOBC_SERVICES.xml b/src-db/database/sourcedata/OBMOBC_SERVICES.xml --- a/src-db/database/sourcedata/OBMOBC_SERVICES.xml +++ b/src-db/database/sourcedata/OBMOBC_SERVICES.xml @@ -804,6 +804,18 @@ <!--CFCEE5A18D134F948F47913802A19E91--> <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME> <!--CFCEE5A18D134F948F47913802A19E91--></OBMOBC_SERVICES> +<!--D57F08655E2A422C8CD4C1471445BD78--><OBMOBC_SERVICES> +<!--D57F08655E2A422C8CD4C1471445BD78--> <OBMOBC_SERVICES_ID><![CDATA[D57F08655E2A422C8CD4C1471445BD78]]></OBMOBC_SERVICES_ID> +<!--D57F08655E2A422C8CD4C1471445BD78--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--D57F08655E2A422C8CD4C1471445BD78--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--D57F08655E2A422C8CD4C1471445BD78--> <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID> +<!--D57F08655E2A422C8CD4C1471445BD78--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--D57F08655E2A422C8CD4C1471445BD78--> <SERVICE><![CDATA[org.openbravo.retail.posterminal.Invoices]]></SERVICE> +<!--D57F08655E2A422C8CD4C1471445BD78--> <DESCRIPTION><![CDATA[Query service for invoices]]></DESCRIPTION> +<!--D57F08655E2A422C8CD4C1471445BD78--> <ROUTINGTYPE><![CDATA[Failover]]></ROUTINGTYPE> +<!--D57F08655E2A422C8CD4C1471445BD78--> <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME> +<!--D57F08655E2A422C8CD4C1471445BD78--></OBMOBC_SERVICES> + <!--D6D8CD959B1542FAAE2091BA21478C3A--><OBMOBC_SERVICES> <!--D6D8CD959B1542FAAE2091BA21478C3A--> <OBMOBC_SERVICES_ID><![CDATA[D6D8CD959B1542FAAE2091BA21478C3A]]></OBMOBC_SERVICES_ID> <!--D6D8CD959B1542FAAE2091BA21478C3A--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> @@ -830,6 +842,18 @@ <!--D9F7C3DD3E4A43C0AD184CC45ABC2E95--> <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME> <!--D9F7C3DD3E4A43C0AD184CC45ABC2E95--></OBMOBC_SERVICES> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--><OBMOBC_SERVICES> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <OBMOBC_SERVICES_ID><![CDATA[E26EF898FEF1475E8DDEEF04E91E8E0B]]></OBMOBC_SERVICES_ID> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <SERVICE><![CDATA[org.openbravo.retail.posterminal.InvoicesHeader]]></SERVICE> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <DESCRIPTION><![CDATA[Query service for invoices]]></DESCRIPTION> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <ROUTINGTYPE><![CDATA[Failover]]></ROUTINGTYPE> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--> <SERVER_RUNTIME><![CDATA[OBSTSYN_ON_CENTRAL]]></SERVER_RUNTIME> +<!--E26EF898FEF1475E8DDEEF04E91E8E0B--></OBMOBC_SERVICES> + <!--E6E9E2B067954E1BBAB178B4783C55D3--><OBMOBC_SERVICES> <!--E6E9E2B067954E1BBAB178B4783C55D3--> <OBMOBC_SERVICES_ID><![CDATA[E6E9E2B067954E1BBAB178B4783C55D3]]></OBMOBC_SERVICES_ID> <!--E6E9E2B067954E1BBAB178B4783C55D3--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> diff --git a/src/org/openbravo/retail/posterminal/InvoiceLinesProperties.java b/src/org/openbravo/retail/posterminal/InvoiceLinesProperties.java new file mode 100644 --- /dev/null +++ b/src/org/openbravo/retail/posterminal/InvoiceLinesProperties.java @@ -0,0 +1,59 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ + +package org.openbravo.retail.posterminal; + +import java.util.ArrayList; +import java.util.List; + +import org.openbravo.client.kernel.ComponentProvider.Qualifier; +import org.openbravo.mobile.core.model.HQLProperty; +import org.openbravo.mobile.core.model.ModelExtension; + +@Qualifier(Invoices.invoicesLinesPropertyExtension) +public class InvoiceLinesProperties extends ModelExtension { + + @Override + public List<HQLProperty> getHQLProperties(Object params) { + ArrayList<HQLProperty> list = new ArrayList<HQLProperty>() { + private static final long serialVersionUID = 1L; + { + add(new HQLProperty("invLine.salesOrderLine.product.id", "id")); + add(new HQLProperty("invLine.salesOrderLine.product.name", "name")); + add(new HQLProperty("invLine.salesOrderLine.product.uOM.id", "uOM")); + add(new HQLProperty("invLine.invoicedQuantity", "quantity")); + add(new HQLProperty("invLine.salesOrderLine.baseGrossUnitPrice", "unitPrice")); + add(new HQLProperty("invLine.grossUnitPrice", "grossUnitPrice")); + add(new HQLProperty("invLine.grossListPrice", "grossListPrice")); + add(new HQLProperty("invLine.grossAmount", "linegrossamount")); + add(new HQLProperty("invLine.lineNetAmount", "linenetamount")); + add(new HQLProperty("invLine.id", "lineId")); + add(new HQLProperty("invLine.salesOrderLine.id", "orderlineId")); + add(new HQLProperty("invLine.salesOrderLine.standardPrice", "baseNetUnitPrice")); + add(new HQLProperty("invLine.salesOrderLine.salesOrder.currency.pricePrecision", + "pricePrecision")); + add(new HQLProperty("invLine.salesOrderLine.warehouse.id", "warehouse")); + add(new HQLProperty("invLine.salesOrderLine.warehouse.name", "warehousename")); + add(new HQLProperty("invLine.salesOrderLine.description", "description")); + add(new HQLProperty( + "(invLine.salesOrderLine.deliveredQuantity - (select coalesce(abs(sum(deliveredQuantity)),0) from OrderLine where goodsShipmentLine.salesOrderLine.id =invLine.salesOrderLine.id))", + "remainingQuantity")); + add(new HQLProperty( + "coalesce(invLine.salesOrderLine.product.overdueReturnDays, 999999999999)", + "overdueReturnDays")); + add(new HQLProperty("invLine.salesOrderLine.product.productType", "productType")); + add(new HQLProperty("invLine.salesOrderLine.product.returnable", "returnable")); + add(new HQLProperty("invLine.tax.taxCategory.id", "taxCategory")); + + } + }; + + return list; + } +} diff --git a/src/org/openbravo/retail/posterminal/InvoicePaymentsProperties.java b/src/org/openbravo/retail/posterminal/InvoicePaymentsProperties.java new file mode 100644 --- /dev/null +++ b/src/org/openbravo/retail/posterminal/InvoicePaymentsProperties.java @@ -0,0 +1,40 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ + +package org.openbravo.retail.posterminal; + +import java.util.ArrayList; +import java.util.List; + +import org.openbravo.client.kernel.ComponentProvider.Qualifier; +import org.openbravo.mobile.core.model.HQLProperty; +import org.openbravo.mobile.core.model.ModelExtension; + +@Qualifier(Invoices.invoicesPaymentsPropertyExtension) +public class InvoicePaymentsProperties extends ModelExtension { + + @Override + public List<HQLProperty> getHQLProperties(Object params) { + ArrayList<HQLProperty> list = new ArrayList<HQLProperty>() { + private static final long serialVersionUID = 1L; + { + add(new HQLProperty("scheduleDetail.amount", "amount", false)); + add(new HQLProperty("finPayment.account.id", "account")); + add(new HQLProperty("finPayment.paymentDate", "paymentDate")); + add(new HQLProperty("finPayment.id", "paymentId")); + add(new HQLProperty("finPayment.amount", "paymentAmount")); + add(new HQLProperty("finPayment.financialTransactionAmount", "financialTransactionAmount")); + add(new HQLProperty("to_char(finPayment.obposPaymentdata)", "paymentData")); + add(new HQLProperty("finPayment.documentNo", "documentNo")); + } + }; + + return list; + } +} diff --git a/src/org/openbravo/retail/posterminal/InvoiceProperties.java b/src/org/openbravo/retail/posterminal/InvoiceProperties.java new file mode 100644 --- /dev/null +++ b/src/org/openbravo/retail/posterminal/InvoiceProperties.java @@ -0,0 +1,56 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ + +package org.openbravo.retail.posterminal; + +import java.util.ArrayList; +import java.util.List; + +import org.openbravo.client.kernel.ComponentProvider.Qualifier; +import org.openbravo.mobile.core.model.HQLProperty; +import org.openbravo.mobile.core.model.ModelExtension; + +@Qualifier(Invoices.invoicesPropertyExtension) +public class InvoiceProperties extends ModelExtension { + + @Override + public List<HQLProperty> getHQLProperties(Object params) { + ArrayList<HQLProperty> list = new ArrayList<HQLProperty>() { + private static final long serialVersionUID = 1L; + { + add(new HQLProperty("inv.documentNo", "documentNo")); + add(new HQLProperty("inv.invoiceDate", "orderDate")); + add(new HQLProperty("inv.creationDate", "creationDate")); + add(new HQLProperty("inv.businessPartner.id", "bp")); + add(new HQLProperty("inv.partnerAddress.id", "bpLocId")); + add(new HQLProperty("inv.grandTotalAmount", "totalamount")); + add(new HQLProperty("inv.description", "description")); + add(new HQLProperty("inv.currency.iSOCode", "currency$_identifier")); + add(new HQLProperty("inv.businessPartner.name", "businessPartner$_identifier")); + add(new HQLProperty("inv.currency.id", "currency")); + add(new HQLProperty("inv.priceList.id", "priceList")); + add(new HQLProperty("inv.organization.id", "organization")); + add(new HQLProperty("inv.client.id", "client")); + add(new HQLProperty("inv.summedLineAmount", "totalNetAmount")); + add(new HQLProperty("inv.priceList.priceIncludesTax", "priceIncludesTax")); + + add(new HQLProperty("salesRepresentative.id", "salesRepresentative")); + add(new HQLProperty("salesRepresentative.name", "salesRepresentative$_identifier")); + + add(new HQLProperty("coalesce(ord.documentType.id,inv.documentType.id)", "documentType")); + add(new HQLProperty("ord.warehouse.id", "warehouse")); + + add(new HQLProperty("pos.id", "posTerminal")); + add(new HQLProperty("pos.name", "posTerminal$_identifier")); + } + }; + + return list; + } +} diff --git a/src/org/openbravo/retail/posterminal/Invoices.java b/src/org/openbravo/retail/posterminal/Invoices.java new file mode 100644 --- /dev/null +++ b/src/org/openbravo/retail/posterminal/Invoices.java @@ -0,0 +1,338 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ +package org.openbravo.retail.posterminal; + +import java.math.BigDecimal; + +import javax.enterprise.inject.Any; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; +import javax.servlet.ServletException; + +import org.codehaus.jettison.json.JSONArray; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; +import org.hibernate.query.Query; +import org.openbravo.client.kernel.ComponentProvider.Qualifier; +import org.openbravo.dal.core.OBContext; +import org.openbravo.dal.service.OBCriteria; +import org.openbravo.dal.service.OBDal; +import org.openbravo.mobile.core.model.HQLPropertyList; +import org.openbravo.mobile.core.model.ModelExtension; +import org.openbravo.mobile.core.model.ModelExtensionUtils; +import org.openbravo.model.ad.access.InvoiceLineTax; +import org.openbravo.model.common.order.OrderLineOffer; +import org.openbravo.service.json.JsonConstants; + +public class Invoices extends JSONProcessSimple { + public static final String invoicesPropertyExtension = "InvoiceExtension"; + public static final String invoicesLinesPropertyExtension = "InvoiceExtensionLines"; + public static final String invoicesShipLinesPropertyExtension = "InvoiceExtensionShipLines"; + public static final String invoicesRelatedLinesPropertyExtension = "InvoiceExtensionRelatedLines"; + public static final String invoicesPaymentsPropertyExtension = "InvoiceExtensionPayments"; + + @Inject + @Any + @Qualifier(invoicesPropertyExtension) + private Instance<ModelExtension> extensions; + @Inject + @Any + @Qualifier(invoicesLinesPropertyExtension) + private Instance<ModelExtension> extensionsLines; + @Inject + @Any + @Qualifier(invoicesShipLinesPropertyExtension) + private Instance<ModelExtension> extensionsShipLines; + @Inject + @Any + @Qualifier(invoicesRelatedLinesPropertyExtension) + private Instance<ModelExtension> extensionsRelatedLines; + @Inject + @Any + @Qualifier(invoicesPaymentsPropertyExtension) + private Instance<ModelExtension> extensionsPayments; + + @Override + public JSONObject exec(JSONObject jsonsent) throws JSONException, ServletException { + JSONObject result = new JSONObject(); + OBContext.setAdminMode(true); + try { + JSONArray respArray = new JSONArray(); + + String invoiceid = jsonsent.getString("invoiceid"); + + // get the invoice + HQLPropertyList hqlPropertiesReceipts = ModelExtensionUtils.getPropertyExtensions(extensions); + String hqlInvoices = "select " + hqlPropertiesReceipts.getHqlSelect() + + " from Invoice as inv LEFT JOIN inv.salesRepresentative as salesRepresentative " + + " LEFT JOIN inv.salesOrder ord LEFT JOIN ord.obposApplications pos" + + " where inv.id = :invoiceId"; + @SuppressWarnings("rawtypes") + Query invoicesQuery = OBDal.getInstance().getSession().createQuery(hqlInvoices); + invoicesQuery.setParameter("invoiceId", invoiceid); + + JSONArray invoices = hqlPropertiesReceipts.getJSONArray(invoicesQuery); + + for (int receipt = 0; receipt < invoices.length(); receipt++) { + JSONObject invoice = invoices.getJSONObject(receipt); + + invoice.put("orderid", invoiceid); + invoice.put("generateInvoice", true); + + JSONArray listinvoicesLines = new JSONArray(); + + // get the details of each line + HQLPropertyList hqlPropertiesLines = ModelExtensionUtils + .getPropertyExtensions(extensionsLines); + String hqlInvoicesLines = "select " + hqlPropertiesLines.getHqlSelect() // + + " from InvoiceLine as invLine" // + + " where invLine.invoice.id=:invoiceId" // + + " order by invLine.lineNo"; + @SuppressWarnings("rawtypes") + Query invoicesLinesQuery = OBDal.getInstance().getSession().createQuery(hqlInvoicesLines); + invoicesLinesQuery.setParameter("invoiceId", invoiceid); + + JSONArray invoicesLines = hqlPropertiesLines.getJSONArray(invoicesLinesQuery); + + for (int receiptLine = 0; receiptLine < invoicesLines.length(); receiptLine++) { + JSONObject invoiceLine = invoicesLines.getJSONObject(receiptLine); + + invoiceLine.put("priceIncludesTax", invoice.getBoolean("priceIncludesTax")); + + // promotions per line + OBCriteria<OrderLineOffer> qPromotions = OBDal.getInstance().createCriteria( + OrderLineOffer.class); + qPromotions.add(Restrictions.eq(OrderLineOffer.PROPERTY_SALESORDERLINE + ".id", + (String) invoiceLine.getString("orderlineId"))); + qPromotions.addOrder(Order.asc(OrderLineOffer.PROPERTY_LINENO)); + JSONArray promotions = new JSONArray(); + boolean hasPromotions = false; + for (OrderLineOffer promotion : qPromotions.list()) { + BigDecimal displayedAmount = promotion.getDisplayedTotalAmount(); + if (displayedAmount == null) { + displayedAmount = promotion.getTotalAmount(); + } + + JSONObject jsonPromo = new JSONObject(); + String name = promotion.getPriceAdjustment().getPrintName() != null ? promotion + .getPriceAdjustment().getPrintName() : promotion.getPriceAdjustment().getName(); + jsonPromo.put("ruleId", promotion.getPriceAdjustment().getId()); + jsonPromo.put("name", name); + jsonPromo.put("amt", displayedAmount); + jsonPromo.put("actualAmt", promotion.getTotalAmount()); + jsonPromo.put("hidden", BigDecimal.ZERO.equals(displayedAmount)); + if (promotion.getObdiscIdentifier() != null) { + jsonPromo.put("identifier", promotion.getObdiscIdentifier()); + } + promotions.put(jsonPromo); + hasPromotions = true; + } + + BigDecimal lineAmount; + if (hasPromotions) { + // When it has promotions, show line amount without them as they are shown after it + lineAmount = (new BigDecimal(invoiceLine.optString("quantity")) + .multiply(new BigDecimal(invoiceLine.optString("unitPrice")))); + } else { + lineAmount = new BigDecimal(invoiceLine.optString("linegrossamount")); + } + invoiceLine.put("linegrossamount", lineAmount); + + invoiceLine.put("promotions", promotions); + + // taxes per line + OBCriteria<InvoiceLineTax> qTaxes = OBDal.getInstance().createCriteria( + InvoiceLineTax.class); + qTaxes.add(Restrictions.eq(InvoiceLineTax.PROPERTY_INVOICELINE + ".id", + (String) invoiceLine.getString("lineId"))); + qTaxes.addOrder(Order.asc(InvoiceLineTax.PROPERTY_LINENO)); + JSONArray taxes = new JSONArray(); + for (InvoiceLineTax tax : qTaxes.list()) { + JSONObject jsonTax = new JSONObject(); + jsonTax.put("taxId", tax.getTax().getId()); + jsonTax.put("identifier", tax.getTax().getName()); + jsonTax.put("taxAmount", tax.getTaxAmount()); + jsonTax.put("taxableAmount", tax.getTaxableAmount()); + jsonTax.put("taxRate", tax.getTax().getRate()); + jsonTax.put("docTaxAmount", tax.getTax().getDocTaxAmount()); + jsonTax.put("lineNo", tax.getTax().getLineNo()); + jsonTax.put("cascade", tax.getTax().isCascade()); + taxes.put(jsonTax); + } + + invoiceLine.put("taxes", taxes); + + listinvoicesLines.put(invoiceLine); + } + invoice.put("receiptLines", listinvoicesLines); + + HQLPropertyList hqlPropertiesPayments = ModelExtensionUtils + .getPropertyExtensions(extensionsPayments); + String hqlPaymentsIn = "select " + hqlPropertiesPayments.getHqlSelect() + + "from FIN_Payment_ScheduleDetail as scheduleDetail " + + "join scheduleDetail.paymentDetails as paymentDetail " + + "join paymentDetail.finPayment as finPayment " + + "join scheduleDetail.invoicePaymentSchedule.invoice as invoice " + + "where invoice.id=:invoiceId " // + + "order by finPayment.documentNo"; + + @SuppressWarnings("rawtypes") + Query paymentsInQuery = OBDal.getInstance().getSession().createQuery(hqlPaymentsIn); + paymentsInQuery.setParameter("invoiceId", invoiceid); + JSONArray listPaymentsIn = hqlPropertiesPayments.getJSONArray(paymentsInQuery); + + JSONArray listinvoicesPayments = new JSONArray(); + JSONArray listPaymentsType = new JSONArray(); + + String hqlPaymentsType = "select p.commercialName as name, p.financialAccount.id as account, p.searchKey as searchKey, " + + "c_currency_rate(p.financialAccount.currency, p.obposApplications.organization.currency, null, null, p.obposApplications.client.id, p.obposApplications.organization.id) as rate, " + + "c_currency_rate(p.obposApplications.organization.currency, p.financialAccount.currency, null, null, p.obposApplications.client.id, p.obposApplications.organization.id) as mulrate, " + + "p.financialAccount.currency.iSOCode as isocode, " + + "p.paymentMethod.openDrawer as openDrawer " + + " from OBPOS_App_Payment as p where p.financialAccount.id in (select scheduleDetail.paymentDetails.finPayment.account.id from FIN_Payment_ScheduleDetail as scheduleDetail where scheduleDetail.invoicePaymentSchedule.invoice.id=:invoiceId)" + + "group by p.financialAccount.id, p.commercialName ,p.searchKey," + + "c_currency_rate(p.financialAccount.currency, p.obposApplications.organization.currency, null, null, p.obposApplications.client.id, p.obposApplications.organization.id)," + + "c_currency_rate(p.obposApplications.organization.currency, p.financialAccount.currency, null, null, p.obposApplications.client.id, p.obposApplications.organization.id)," + + "p.financialAccount.currency.iSOCode ,p.paymentMethod.openDrawer"; + @SuppressWarnings("rawtypes") + Query paymentsTypeQuery = OBDal.getInstance().getSession().createQuery(hqlPaymentsType); + paymentsTypeQuery.setParameter("invoiceId", invoiceid); + for (Object objPaymentType : paymentsTypeQuery.list()) { + Object[] objPaymentsType = (Object[]) objPaymentType; + JSONObject paymentsType = new JSONObject(); + paymentsType.put("name", objPaymentsType[0]); + paymentsType.put("account", objPaymentsType[1]); + paymentsType.put("kind", objPaymentsType[2]); + paymentsType.put("rate", objPaymentsType[3]); + paymentsType.put("mulrate", objPaymentsType[4]); + paymentsType.put("isocode", objPaymentsType[5]); + paymentsType.put("openDrawer", objPaymentsType[6]); + listPaymentsType.put(paymentsType); + } + for (int i = 0; i < listPaymentsIn.length(); i++) { + JSONObject objectIn = (JSONObject) listPaymentsIn.get(i); + boolean added = false; + for (int j = 0; j < listPaymentsType.length(); j++) { + JSONObject objectType = (JSONObject) listPaymentsType.get(j); + if (objectIn.get("account").equals(objectType.get("account"))) { + JSONObject invoicePayment = new JSONObject(); + invoicePayment.put("amount", new BigDecimal((String) objectIn.get("amount") + .toString()).multiply(new BigDecimal((String) objectType.get("mulrate") + .toString()))); + invoicePayment.put("paymentDate", objectIn.get("paymentDate")); + if (objectIn.has("paymentData")) { + invoicePayment.put("paymentData", objectIn.get("paymentData")); + } + invoicePayment.put("name", objectType.get("name")); + invoicePayment.put("kind", objectType.get("kind")); + invoicePayment.put("rate", objectType.get("rate")); + invoicePayment.put("mulrate", objectType.get("mulrate")); + invoicePayment.put("isocode", objectType.get("isocode")); + invoicePayment.put("openDrawer", objectType.get("openDrawer")); + invoicePayment.put("isPrePayment", true); + added = true; + listinvoicesPayments.put(invoicePayment); + } + } + if (!added) { + // The payment type of the current payment is not configured for the webpos + + String hqlPaymentType = "select p.paymentMethod.name as name, p.account.id as account, " + + "c_currency_rate(p.account.currency, p.organization.currency, null, null, p.client.id, p.organization.id) as rate, " + + "c_currency_rate(p.organization.currency, p.account.currency, null, null, p.client.id, p.organization.id) as mulrate, " + + "p.account.currency.iSOCode as isocode " + + " from FIN_Payment as p where p.id=:paymentId)"; + @SuppressWarnings("rawtypes") + Query paymentTypeQuery = OBDal.getInstance().getSession().createQuery(hqlPaymentType); + paymentTypeQuery.setParameter("paymentId", objectIn.getString("paymentId")); + + if (paymentTypeQuery.list().size() > 0) { + + Object objPaymentType = paymentTypeQuery.list().get(0); + Object[] objPaymentsType = (Object[]) objPaymentType; + JSONObject paymentsType = new JSONObject(); + paymentsType.put("name", objPaymentsType[0]); + paymentsType.put("account", objPaymentsType[1]); + paymentsType.put("kind", ""); + paymentsType.put("rate", objPaymentsType[2]); + paymentsType.put("mulrate", objPaymentsType[3]); + paymentsType.put("isocode", objPaymentsType[4]); + paymentsType.put("openDrawer", "N"); + + JSONObject invoicePayment = new JSONObject(); + invoicePayment.put("amount", new BigDecimal((String) objectIn.get("amount") + .toString()).multiply(new BigDecimal((String) paymentsType.get("mulrate") + .toString()))); + invoicePayment.put("paymentDate", objectIn.get("paymentDate")); + if (objectIn.has("paymentData")) { + invoicePayment.put("paymentData", objectIn.get("paymentData")); + } + invoicePayment.put("name", paymentsType.get("name")); + invoicePayment.put("kind", paymentsType.get("kind")); + invoicePayment.put("rate", paymentsType.get("rate")); + invoicePayment.put("mulrate", paymentsType.get("mulrate")); + invoicePayment.put("isocode", paymentsType.get("isocode")); + invoicePayment.put("openDrawer", paymentsType.get("openDrawer")); + invoicePayment.put("isPrePayment", true); + added = true; + listinvoicesPayments.put(invoicePayment); + } + } + } + + invoice.put("receiptPayments", listinvoicesPayments); + + // TODO: make this extensible + String hqlReceiptTaxes = "select invoiceTax.tax.id as taxId, invoiceTax.tax.rate as rate, " + + "invoiceTax.taxableAmount as taxableamount, invoiceTax.taxAmount as taxamount, invoiceTax.tax.name as name, " + + "invoiceTax.tax.cascade as cascade, invoiceTax.tax.docTaxAmount as docTaxAmount, invoiceTax.tax.lineNo as lineNo, invoiceTax.tax.taxBase.id as taxBase " + + "from InvoiceTax as invoiceTax where invoiceTax.invoice.id=:invoiceId"; + @SuppressWarnings("rawtypes") + Query ReceiptTaxesQuery = OBDal.getInstance().getSession().createQuery(hqlReceiptTaxes); + ReceiptTaxesQuery.setParameter("invoiceId", invoiceid); + JSONArray jsonListTaxes = new JSONArray(); + for (Object objTax : ReceiptTaxesQuery.list()) { + Object[] objTaxInfo = (Object[]) objTax; + JSONObject jsonObjTaxes = new JSONObject(); + jsonObjTaxes.put("taxid", objTaxInfo[0]); + jsonObjTaxes.put("rate", objTaxInfo[1]); + jsonObjTaxes.put("net", objTaxInfo[2]); + jsonObjTaxes.put("amount", objTaxInfo[3]); + jsonObjTaxes.put("name", objTaxInfo[4]); + jsonObjTaxes.put("gross", new BigDecimal((String) objTaxInfo[2].toString()) + .add(new BigDecimal((String) objTaxInfo[3].toString()))); + jsonObjTaxes.put("cascade", objTaxInfo[5]); + jsonObjTaxes.put("docTaxAmount", objTaxInfo[6]); + jsonObjTaxes.put("lineNo", objTaxInfo[7]); + jsonObjTaxes.put("taxBase", objTaxInfo[8]); + jsonListTaxes.put(jsonObjTaxes); + } + + invoice.put("receiptTaxes", jsonListTaxes); + + respArray.put(invoice); + + result.put(JsonConstants.RESPONSE_DATA, respArray); + result.put(JsonConstants.RESPONSE_STATUS, JsonConstants.RPCREQUEST_STATUS_SUCCESS); + } + } finally { + + OBContext.restorePreviousMode(); + } + return result; + } + + @Override + protected boolean bypassPreferenceCheck() { + return true; + } + +} \ No newline at end of file diff --git a/src/org/openbravo/retail/posterminal/InvoicesHeader.java b/src/org/openbravo/retail/posterminal/InvoicesHeader.java new file mode 100644 --- /dev/null +++ b/src/org/openbravo/retail/posterminal/InvoicesHeader.java @@ -0,0 +1,53 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ +package org.openbravo.retail.posterminal; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; + +public class InvoicesHeader extends ProcessHQLQuery { + + @Override + protected boolean isAdminMode() { + return true; + } + + @Override + protected Map<String, Object> getParameterValues(JSONObject jsonsent) throws JSONException { + JSONObject filters = jsonsent.getJSONObject("filters"); + Map<String, Object> paramValues = new HashMap<String, Object>(); + paramValues.put("client", filters.getString("client")); + paramValues.put("client", filters.getString("organization")); + paramValues.put("orderId", filters.getString("orderId")); + return paramValues; + } + + @Override + protected List<String> getQuery(JSONObject jsonsent) throws JSONException { + + String hqlInvoices = "select i.id as id, i.documentNo as documentNo, i.invoiceDate as orderDate, " + + " i.businessPartner.name as businessPartner, i.grandTotalAmount as totalamount " + + " from InvoiceLine il join il.salesOrderLine ol join ol.salesOrder ord join il.invoice i " + + " where ord.client.id=:client and ord.organization.id=:organization and ord.id =:orderId " + + " group by i.id, i.documentNo, i.invoiceDate, i.businessPartner.name, i.grandTotalAmount " + + " order by i.documentNo asc"; + + return Arrays.asList(new String[] { hqlInvoices }); + } + + @Override + protected boolean bypassPreferenceCheck() { + return true; + } +} \ No newline at end of file diff --git a/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java b/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java --- a/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java +++ b/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java @@ -74,6 +74,7 @@ "model/changedbusinesspartners", "model/changedbplocation", "model/order", + "model/invoice", "model/cashup", "model/cashmanagement", "model/cancelLayaway", @@ -170,6 +171,7 @@ // Old Tickets "components/modalpaidreceipts", "components/modalmultiorders", + "components/modalinvoices", // Quotations "components/modalcreateorderfromquotation", "components/modalreactivatequotation", diff --git a/web/org.openbravo.retail.posterminal/js/components/menu.js b/web/org.openbravo.retail.posterminal/js/components/menu.js --- a/web/org.openbravo.retail.posterminal/js/components/menu.js +++ b/web/org.openbravo.retail.posterminal/js/components/menu.js @@ -1,6 +1,6 @@ /* ************************************************************************************ - * Copyright (C) 2012-2017 Openbravo S.L.U. + * Copyright (C) 2012-2018 Openbravo S.L.U. * Licensed under the Openbravo Commercial License version 1.0 * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html * or in the legal folder of this module distribution. @@ -630,6 +630,57 @@ if (OB.MobileApp.model.hasPermission(this.permission)) { this.doPrintReceipt(); } + }, + updateVisibility: function (model) { + if (model.get('isPaid') && !model.get('isQuotation')) { + this.hide(); + } else { + this.show(); + } + this.adjustVisibilityBasedOnPermissions(); + }, + init: function (model) { + var receipt = model.get('order'); + + receipt.on('change:isPaid change:isQuotation', function (model) { + this.updateVisibility(model); + }, this); + this.updateVisibility(model); + } +}); + +enyo.kind({ + name: 'OB.UI.MenuPrintInvoices', + kind: 'OB.UI.MenuAction', + permission: 'OBPOS_print.receipt', + events: { + onShowPopup: '' + }, + i18nLabel: 'OBPOS_LblPrintReceipt', + tap: function () { + if (this.disabled) { + return true; + } + this.inherited(arguments); // Manual dropdown menu closure + this.doShowPopup({ + popup: 'modalInvoices' + }); + }, + updateVisibility: function (model) { + if (model.get('isPaid') && !model.get('isQuotation')) { + this.show(); + } else { + this.hide(); + } + this.adjustVisibilityBasedOnPermissions(); + }, + init: function (model) { + var receipt = model.get('order'); + + receipt.on('change:isPaid change:isQuotation', function (model) { + this.updateVisibility(model); + }, this); + this.updateVisibility(receipt); } }); diff --git a/web/org.openbravo.retail.posterminal/js/components/modalinvoices.js b/web/org.openbravo.retail.posterminal/js/components/modalinvoices.js new file mode 100644 --- /dev/null +++ b/web/org.openbravo.retail.posterminal/js/components/modalinvoices.js @@ -0,0 +1,295 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ + +/*global enyo, Backbone, _ */ + +/*header of scrollable table*/ +enyo.kind({ + name: 'OB.UI.ModalInvoicesHeader', + kind: 'OB.UI.ScrollableTableHeader', + events: { + onSearchAction: '', + onClearAction: '' + }, + searchAction: function () { + this.filters = { + pos: OB.MobileApp.model.get('terminal').id, + client: OB.MobileApp.model.get('terminal').client, + organization: OB.MobileApp.model.get('terminal').organization, + orderId: OB.MobileApp.model.receipt.get('id') + }; + + this.doSearchAction({ + filters: this.filters + }); + return true; + }, + clearAction: function () { + this.doClearAction(); + } +}); + +/*items of collection*/ +enyo.kind({ + name: 'OB.UI.ListInvoicesLine', + kind: 'OB.UI.CheckboxButton', + classes: 'modal-dialog-btn-check', + style: 'border-bottom: 1px solid #cccccc;text-align: left; padding-left: 70px; height: 58px;', + tap: function () { + this.inherited(arguments); + this.model.set('checked', !this.model.get('checked')); + this.model.trigger('verifyDoneButton', this.model); + }, + components: [{ + name: 'line', + style: 'line-height: 23px; display: inline', + components: [{ + style: 'display: inline', + name: 'topLine' + }, { + style: 'color: #888888', + name: 'bottonLine' + }, { + style: 'clear: both;' + }] + }], + create: function () { + this.inherited(arguments); + this.$.topLine.setContent(this.model.get('documentNo') + ' - ' + (this.model.get('bp') ? this.model.get('bp').get('_identifier') : this.model.get('businessPartner'))); + this.$.bottonLine.setContent(this.model.get('totalamount') + ' (' + OB.I18N.formatDate(new Date(this.model.get('orderDate'))) + ') '); + if (this.model.get('checked')) { + this.addClass('active'); + } else { + this.removeClass('active'); + } + this.render(); + } +}); + +/*scrollable table (body of modal)*/ +enyo.kind({ + name: 'OB.UI.ListInvoices', + classes: 'row-fluid', + handlers: { + onSearchAction: 'searchAction', + onClearAction: 'clearAction' + }, + components: [{ + classes: 'span12', + components: [{ + classes: 'row-fluid', + components: [{ + classes: 'span12', + components: [{ + name: 'invoiceslistitemprinter', + kind: 'OB.UI.ScrollableTable', + scrollAreaMaxHeight: '300px', + renderHeader: 'OB.UI.ModalInvoicesHeader', + renderLine: 'OB.UI.ListInvoicesLine', + renderEmpty: 'OB.UI.RenderEmpty' + }] + }] + }, { + kind: 'OB.UI.ModalInvoicesFooter', + name: 'footer' + }] + }], + clearAction: function (inSender, inEvent) { + this.invoicesList.reset(); + return true; + }, + searchAction: function (inSender, inEvent) { + var me = this, + toMatch = 0, + re, actualDate, i, processHeader = new OB.DS.Process('org.openbravo.retail.posterminal.InvoicesHeader'), + negativeLines; + me.filters = inEvent.filters; + var limit = OB.Model.Order.prototype.dataLimit; + this.clearAction(); + processHeader.exec({ + filters: me.filters, + _limit: limit + }, function (data) { + if (data && data.exception) { + OB.error('Error getting invoices: ' + data.exception.message); + } else if (data) { + _.each(data, function (iter) { + me.invoicesList.add(iter); + }); + } else { + //error or offline + OB.error('Error getting invoices'); + } + }); + return true; + }, + invoicesList: null, + init: function (model) { + var me = this; + this.model = model; + this.invoicesList = new Backbone.Collection(); + this.$.invoiceslistitemprinter.setCollection(this.invoicesList); + this.invoicesList.on('verifyDoneButton', function (item) { + if (item.get('checked')) { + me.parent.parent.$.body.$.listInvoices.$.footer.disablePrintInvoicesButton(false); + } else { + me.parent.parent.$.body.$.listInvoices.$.footer.disablePrintInvoicesButton(true); + _.each(me.invoicesList.models, function (e) { + if (e.get('checked')) { + me.parent.parent.$.body.$.listInvoices.$.footer.disablePrintInvoicesButton(false); + return; + } + }); + } + }); + } +}); + +enyo.kind({ + name: 'OB.UI.ModalInvoicesFooter', + events: { + onHideThisPopup: '', + onShowPopup: '', + onPrintReceipt: '' + }, + components: [{ + style: 'display: table; border-top: 1px solid #cccccc; width: 100%;', + components: [{ + style: 'display: table-cell; width: 30%; ', + components: [{ + style: 'width: 140px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;', + name: 'printReceipt', + kind: 'OB.UI.SmallButton', + ontap: 'printReceiptAction' + }] + }, { + style: 'display: table-cell; width: 40%; text-align: center; ', + components: [{ + style: 'width: 140px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;', + name: 'printInvoices', + kind: 'OB.UI.SmallButton', + ontap: 'printInvoiceAction' + }] + }, { + style: 'display: table-cell; width: 30%; text-align: right; ', + components: [{ + style: 'width: 140px', + name: 'cancelButton', + kind: 'OB.UI.SmallButton', + ontap: 'cancelAction' + }] + }] + }], + initComponents: function () { + this.inherited(arguments); + this.$.printReceipt.setContent(OB.I18N.getLabel('OBPOS_LblPrintOneReceipt')); + this.$.printInvoices.setContent(OB.I18N.getLabel('OBPOS_LblPrintInvoices')); + this.$.cancelButton.setContent(OB.I18N.getLabel('OBMOBC_LblCancel')); + }, + printReceiptAction: function () { + var me = this; + this.doHideThisPopup(); + this.doPrintReceipt({ + callback: function () { + me.doShowPopup({ + popup: 'modalInvoices' + }); + } + }); + }, + disablePrintInvoicesButton: function (value) { + this.$.printInvoices.setDisabled(value); + }, + printInvoiceAction: function () { + var selectedInvoices = [], + me = this, + process = new OB.DS.Process('org.openbravo.retail.posterminal.Invoices'), + checkedInvoices = _.compact(this.parent.parent.parent.parent.$.body.$.listInvoices.invoicesList.map(function (e) { + if (e.get('checked')) { + return e; + } + })); + if (checkedInvoices.length === 0) { + return true; + } + this.doHideThisPopup(); + _.each(checkedInvoices, function (iter) { + + process.exec({ + invoiceid: iter.id + }, function (data) { + if (data && data.exception) { + OB.error('Error getting invoices: ' + data.exception.message); + } else if (data) { + me.owner.model.get('orderList').newPaidReceipt(data[0], function (invoice) { + invoice = new OB.Model.Invoice(invoice.attributes); + invoice.set('loadedFromServer', true); + invoice.set('checked', iter.get('checked')); + invoice.set('hasbeenpaid', 'Y'); + invoice.calculateReceipt(function () { + try { + OB.UTIL.HookManager.executeHooks('OBPOS_PrePrintPaidReceipt', { + context: this.model, + receipt: invoice + }, function (args) { + if (args && args.cancelOperation && args.cancelOperation === true) { + return; + } + me.model.printReceipt.print(invoice, { + callback: function () { + me.doShowPopup({ + popup: 'modalInvoices' + }); + } + }); + }); + } catch (e) { + OB.error('Error printing the receipt:' + e); + } + }); + }, true); + } else { + //error or offline + OB.error('Error getting invoices'); + } + }); + }); + }, + cancelAction: function () { + this.doHideThisPopup(); + }, + init: function (model) { + this.model = model; + } +}); + +/*Modal definiton*/ +enyo.kind({ + name: 'OB.UI.ModalInvoices', + topPosition: '125px', + kind: 'OB.UI.Modal', + executeOnHide: function () { + this.$.body.$.listInvoices.$.invoiceslistitemprinter.$.theader.$.modalInvoicesHeader.clearAction(); + }, + executeOnShow: function () { + this.$.body.$.listInvoices.$.invoiceslistitemprinter.$.theader.$.modalInvoicesHeader.searchAction(); + this.$.body.$.listInvoices.$.footer.disablePrintInvoicesButton(true); + }, + i18nHeader: 'OBPOS_LblInvoices', + body: { + kind: 'OB.UI.ListInvoices' + }, + initComponents: function () { + this.inherited(arguments); + this.$.closebutton.hide(); + }, + init: function (model) { + this.model = model; + } +}); \ No newline at end of file diff --git a/web/org.openbravo.retail.posterminal/js/model/invoice.js b/web/org.openbravo.retail.posterminal/js/model/invoice.js new file mode 100644 --- /dev/null +++ b/web/org.openbravo.retail.posterminal/js/model/invoice.js @@ -0,0 +1,42 @@ +/* + ************************************************************************************ + * Copyright (C) 2018 Openbravo S.L.U. + * Licensed under the Openbravo Commercial License version 1.0 + * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html + * or in the legal folder of this module distribution. + ************************************************************************************ + */ + +/*global window, OB */ + +(function () { + + // Sales Invoice Model. + var Invoice = OB.Model.Order.extend({ + modelName: 'Invoice', + tableName: 'c_invoice', + entityName: 'Invoice', + source: '', + dataLimit: OB.Dal.DATALIMIT, + properties: ['id', 'json', 'session', 'isbeingprocessed'], + propertyMap: { + 'id': 'c_invoice_id', + 'json': 'json', + 'session': 'ad_session_id', + 'isbeingprocessed': 'isbeingprocessed' + }, + + defaults: { + isbeingprocessed: 'N', + isInvoice: true + }, + + createStatement: 'CREATE TABLE IF NOT EXISTS c_invoice (c_invoice_id TEXT PRIMARY KEY, json CLOB, ad_session_id TEXT, isbeingprocessed TEXT)', + dropStatement: 'DROP TABLE IF EXISTS c_invoice', + insertStatement: 'INSERT INTO c_invoice(c_invoice_id, json, ad_session_id, isbeingprocessed) VALUES (?,?,?,?)', + local: true + }); + + window.OB.Model.Invoice = Invoice; + +}()); \ No newline at end of file diff --git a/web/org.openbravo.retail.posterminal/js/model/order.js b/web/org.openbravo.retail.posterminal/js/model/order.js --- a/web/org.openbravo.retail.posterminal/js/model/order.js +++ b/web/org.openbravo.retail.posterminal/js/model/order.js @@ -599,7 +599,7 @@ if (this.isCalculateGrossLocked === true) { OB.error("calculateGross execution is forbidden right now"); return; - } else if (this.isCalculateGrossLocked !== false && !this.get('belongsToMultiOrder')) { + } else if (this.isCalculateGrossLocked !== false && !this.get('belongsToMultiOrder') && !this.get('isInvoice')) { OB.error("setting the isCalculateGrossLocked state is mandatory before executing it the first time"); } @@ -610,7 +610,7 @@ } // verify that the ui receipt is the only one in which calculateGross is executed - var isTheUIReceipt = this === OB.MobileApp.model.receipt || this.get('belongsToMultiOrder') || this.get('ignoreCheckIfIsActiveOrder'); + var isTheUIReceipt = this === OB.MobileApp.model.receipt || this.get('belongsToMultiOrder') || this.get('ignoreCheckIfIsActiveOrder') || this.get('isInvoice'); if (!isTheUIReceipt) { OB.error("calculateGross should only be called by the UI receipt"); } @@ -754,11 +754,11 @@ if (this.isCalculateReceiptLocked === true) { OB.error("calculateReceipt execution is forbidden right now"); return; - } else if (this.isCalculateReceiptLocked !== false && !this.get('belongsToMultiOrder')) { + } else if (this.isCalculateReceiptLocked !== false && !this.get('belongsToMultiOrder') && !this.get('isInvoice')) { OB.error("setting the isCalculateReceiptLocked state is mandatory before executing it the first time"); } // verify that the ui receipt is the only one in which calculateReceipt is executed - var isTheUIReceipt = this === OB.MobileApp.model.receipt || this.get('belongsToMultiOrder') || this.get('ignoreCheckIfIsActiveOrder'); + var isTheUIReceipt = this === OB.MobileApp.model.receipt || this.get('belongsToMultiOrder') || this.get('ignoreCheckIfIsActiveOrder') || this.get('isInvoice'); if (!isTheUIReceipt) { OB.error("calculateReceipt should only be called by the UI receipt"); } @@ -5936,7 +5936,7 @@ return OB.Collection.OrderList.newOrder(bp, propertiesToReset); }, - newPaidReceipt: function (model, callback) { + newPaidReceipt: function (model, callback, keepScrim) { enyo.$.scrim.show(); var order = new Order(), lines, newline, payments, curPayment, taxes, bpId, bpLocId, bpLoc, bpBillLocId, bpBillLoc, numberOfLines = model.receiptLines.length, @@ -6132,7 +6132,7 @@ order.set('qty', orderQty); order.set('json', JSON.stringify(order.toJSON())); callback(order); - if (OB.MobileApp.view.openedPopup === null) { + if (OB.MobileApp.view.openedPopup === null && !keepScrim) { enyo.$.scrim.hide(); } } diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-print.js b/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-print.js --- a/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-print.js +++ b/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-print.js @@ -304,7 +304,7 @@ args.template = me.templatecanceledreceipt; } else if (receipt.get('cancelLayaway')) { args.template = me.templatecanceledlayaway; - } else if (receipt.get('generateInvoice') && receipt.get('orderType') !== 2 && receipt.get('orderType') !== 3 && !receipt.get('isLayaway')) { + } else if (receipt.get('isInvoice')) { if (receipt.get('orderType') === 1 || hasNegativeLines) { args.template = me.templatereturninvoice; } else if (receipt.get('isQuotation')) { diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js --- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js +++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js @@ -177,6 +177,9 @@ kind: 'OB.UI.ModalMultiOrders', name: 'modalMultiOrders' }, { + kind: 'OB.UI.ModalInvoices', + name: 'modalInvoices' + }, { kind: 'OB.UI.ModalCreateOrderFromQuotation', name: 'modalCreateOrderFromQuotation' }, { @@ -360,7 +363,7 @@ }] }], classModel: new Backbone.Model(), - printReceipt: function () { + printReceipt: function (inSender, inEvent) { if (OB.MobileApp.model.hasPermission('OBPOS_print.receipt')) { if (this.model.get('leftColumnViewManager').isOrder()) { var receipt = this.model.get('order'); @@ -373,21 +376,24 @@ return; } receipt.trigger('print', receipt, { - forcePrint: true + forcePrint: true, + callback: inEvent.callback }); }); return; } receipt.trigger('print', receipt, { - forcePrint: true + forcePrint: true, + callback: inEvent.callback }); return; } if (this.model.get('leftColumnViewManager').isMultiOrder()) { _.each(this.model.get('multiOrders').get('multiOrdersList').models, function (order) { this.model.get('multiOrders').trigger('print', order, { - forcePrint: true + forcePrint: true, + callback: inEvent.callback }); }, this); } diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js --- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js +++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js @@ -632,6 +632,9 @@ kind: 'OB.UI.MenuPrint' }); this.menuEntries.push({ + kind: 'OB.UI.MenuPrintInvoices' + }); + this.menuEntries.push({ kind: 'OB.UI.MenuLayaway' }); this.menuEntries.push({ ReprintInvoices_AutomatedTests.diff [^] (19,514 bytes) 2018-11-09 10:15 [Show Content] [Hide Content] diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java --- a/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java @@ -43,6 +43,8 @@ "table_verifiedReturnsReceiptsListItemPrinter", EnyoKind.SCROLLABLETABLE, "documentNo"); // // table_verifiedReturnsReceiptsListItemPrinter table_prslistitemprinter // verifiedReturnsReceiptsListItemPrinter_scrollArea verifiedReturnsReceiptsListItemPrinter_tbody + public static TestIdConstructor TABLE_INVOICESTOPRINT = new TestIdConstructor( + "table_invoiceslistitemprinter", EnyoKind.SCROLLABLETABLE, "topLine"); public static TestIdConstructor TABLE_CUSTOMER = new TestIdConstructor( "table_stBPAssignToReceipt", EnyoKind.SCROLLABLETABLE, "identifier"); // @@ -3101,4 +3103,17 @@ "openedreceiptslistitemprinter_row1"); public static TestIdConstructor PENDING_RECEIPTSLIST_EMPTY = new TestIdConstructor( "pendingReceiptList_renderEmpty"); + + public static TestIdConstructor LABEL_PRINTINVOICES_TITLE = new TestIdConstructor( + "modalInvoices_header"); + public static TestIdConstructor BUTTON_PRINTINVOICES_PRINTRECEIPT = new TestIdConstructor( + "footer_printReceipt"); + public static TestIdConstructor BUTTON_PRINTINVOICES_PRINTINVOICES = new TestIdConstructor( + "footer_printInvoices"); + public static TestIdConstructor BUTTON_PRINTINVOICES_CANCEL = new TestIdConstructor( + "footer_cancelButton"); + public static TestIdConstructor BUTTON_PRINTINVOICES_ROW1 = new TestIdConstructor( + "invoiceslistitemprinter_row1"); + public static TestIdConstructor BUTTON_PRINTINVOICES_ROW2 = new TestIdConstructor( + "invoiceslistitemprinter_row2"); } diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuite.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuite.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuite.java @@ -0,0 +1,45 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * @author EBE + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.suites.concurrent.job014; + +import org.junit.AfterClass; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.openbravo.test.mobile.core.utils.SuiteHelper; +import org.openbravo.test.mobile.retail.pack.selenium.tests.loginout.LogoutAndCloseBrowser; +import org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices.AllReprintInvoicesSuite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + // + AllReprintInvoicesSuite.class, // + + LogoutAndCloseBrowser.class, // this have to be the last test in the suite +}) +public class ReprintInvoicesSuite extends SuiteHelper { + @AfterClass + public static void afterclass() { + nameChild(ReprintInvoicesSuite.class.getSimpleName()); + SuiteHelper.afterclass(); + } +} diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuiteHV.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuiteHV.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuiteHV.java @@ -0,0 +1,45 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * @author EBE + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.suites.concurrent.job014; + +import org.junit.AfterClass; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.openbravo.test.mobile.core.utils.SuiteHelper; +import org.openbravo.test.mobile.retail.pack.selenium.tests.loginout.LogoutAndCloseBrowser; +import org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices.AllReprintInvoicesSuiteHV; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + // + AllReprintInvoicesSuiteHV.class, // + + LogoutAndCloseBrowser.class, // this have to be the last test in the suite +}) +public class ReprintInvoicesSuiteHV extends SuiteHelper { + @AfterClass + public static void afterclass() { + nameChild(ReprintInvoicesSuiteHV.class.getSimpleName()); + SuiteHelper.afterclass(); + } +} diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuite.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuite.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuite.java @@ -0,0 +1,33 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * @author ACA + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices; + +import org.junit.runner.RunWith; +import org.openbravo.test.mobile.core.junit.toolbox.SuiteClassesToolbox; +import org.openbravo.test.mobile.retail.mobilecore.junit.OBWildcardPatternSuite; + +@RunWith(OBWildcardPatternSuite.class) +@SuiteClassesToolbox() +public class AllReprintInvoicesSuite { + +} diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuiteHV.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuiteHV.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuiteHV.java @@ -0,0 +1,35 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * @author ACA + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices; + +import org.junit.runner.RunWith; +import org.openbravo.test.mobile.core.junit.toolbox.SuiteClassesToolbox; +import org.openbravo.test.mobile.retail.mobilecore.annotations.SuiteAnnotations; +import org.openbravo.test.mobile.retail.mobilecore.junit.OBWildcardPatternSuite; + +@RunWith(OBWildcardPatternSuite.class) +@SuiteClassesToolbox() +@SuiteAnnotations(activateHighVolumeMode = true) +public class AllReprintInvoicesSuiteHV { + +} diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedInvoice.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedInvoice.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedInvoice.java @@ -0,0 +1,74 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices; + +import org.junit.Test; +import org.openbravo.test.mobile.retail.mobilecore.annotations.TestClassAnnotations; +import org.openbravo.test.mobile.retail.mobilecore.javascript.BackboneHelper; +import org.openbravo.test.mobile.retail.pack.selenium.TestIdPack; +import org.openbravo.test.mobile.retail.pack.selenium.terminals.WebPOSTerminalHelper; + +@TestClassAnnotations(isHighVolumeCompatible = true) +public class PrintLoadedInvoice extends WebPOSTerminalHelper { + + @Test + public void test() { + + // Create and pay a ticket + tap(TestIdPack.BUTTON_SEARCH); + write(TestIdPack.FIELD_SEARCH_TEXT, + TestIdPack.BUTTON_SEARCHPRODUCT_AVALANCHETRANSCEIVER.getRowName()); + tap(TestIdPack.BUTTON_SEARCH_EXECUTE); + tap(TestIdPack.BUTTON_SEARCHPRODUCT_AVALANCHETRANSCEIVER); + String documentno = BackboneHelper.getDocumentNo(); + + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.BUTTON_MENU_INVOICETHISRECEIPT); + + verify(TestIdPack.LABEL_TOTALTOPAY, "150.50"); + tap(TestIdPack.BUTTON_PAY); + tap(TestIdPack.BUTTON_PAY_EXACT); + tap(TestIdPack.BUTTON_PAY_DONE); + verify(TestIdPack.LABEL_TOTALTOPAY, "0.00"); + + // Load the ticket + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.BUTTON_MENU_OPENRECEIPT); + write(TestIdPack.FIELD_OPEN_RECEIPT_FILTER_TXT, documentno); + tap(TestIdPack.BUTTON_OPEN_RECEIPT_SEARCH); + tap(TestIdPack.TABLE_OPEN_RECEIPT, documentno); + verify(TestIdPack.LABEL_TOTALTOPAY, "150.50"); + + // Print the ticket + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.LABEL_MENU_PRINT_RECEIPT); + waitUntilIsVisible(TestIdPack.LABEL_PRINTINVOICES_TITLE, true); + tap(TestIdPack.BUTTON_PRINTINVOICES_PRINTRECEIPT); + tap(TestIdPack.BUTTON_PRINTINVOICES_ROW1); + tap(TestIdPack.BUTTON_PRINTINVOICES_PRINTINVOICES); + TestIdPack.TABLE_INVOICESTOPRINT.enyoNode().waitUntilIsReady(); + tap(TestIdPack.BUTTON_PRINTINVOICES_CANCEL); + tap(TestIdPack.BUTTON_DELETERECEIPT); + + } + +} diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedReceipt.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedReceipt.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedReceipt.java @@ -0,0 +1,68 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices; + +import org.junit.Test; +import org.openbravo.test.mobile.retail.mobilecore.annotations.TestClassAnnotations; +import org.openbravo.test.mobile.retail.mobilecore.javascript.BackboneHelper; +import org.openbravo.test.mobile.retail.pack.selenium.TestIdPack; +import org.openbravo.test.mobile.retail.pack.selenium.terminals.WebPOSTerminalHelper; + +@TestClassAnnotations(isHighVolumeCompatible = true) +public class PrintLoadedReceipt extends WebPOSTerminalHelper { + + @Test + public void test() { + + // Create and pay a ticket + tap(TestIdPack.BUTTON_SEARCH); + write(TestIdPack.FIELD_SEARCH_TEXT, + TestIdPack.BUTTON_SEARCHPRODUCT_AVALANCHETRANSCEIVER.getRowName()); + tap(TestIdPack.BUTTON_SEARCH_EXECUTE); + tap(TestIdPack.BUTTON_SEARCHPRODUCT_AVALANCHETRANSCEIVER); + String documentno = BackboneHelper.getDocumentNo(); + + verify(TestIdPack.LABEL_TOTALTOPAY, "150.50"); + tap(TestIdPack.BUTTON_PAY); + tap(TestIdPack.BUTTON_PAY_EXACT); + tap(TestIdPack.BUTTON_PAY_DONE); + verify(TestIdPack.LABEL_TOTALTOPAY, "0.00"); + + // Load the ticket + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.BUTTON_MENU_OPENRECEIPT); + write(TestIdPack.FIELD_OPEN_RECEIPT_FILTER_TXT, documentno); + tap(TestIdPack.BUTTON_OPEN_RECEIPT_SEARCH); + tap(TestIdPack.TABLE_OPEN_RECEIPT, documentno); + verify(TestIdPack.LABEL_TOTALTOPAY, "150.50"); + + // Print the ticket + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.LABEL_MENU_PRINT_RECEIPT); + waitUntilIsVisible(TestIdPack.LABEL_PRINTINVOICES_TITLE, true); + tap(TestIdPack.BUTTON_PRINTINVOICES_PRINTRECEIPT); + tap(TestIdPack.BUTTON_PRINTINVOICES_CANCEL); + tap(TestIdPack.BUTTON_DELETERECEIPT); + + } + +} diff --git a/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintMultipleInvoices.java b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintMultipleInvoices.java new file mode 100644 --- /dev/null +++ b/src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintMultipleInvoices.java @@ -0,0 +1,58 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.0 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo S.L.U. + * All portions are Copyright (C) 2018 Openbravo S.L.U. + * All Rights Reserved. + * Contributor(s): + ************************************************************************ + * + * + */ + +package org.openbravo.test.mobile.retail.pack.selenium.tests.reprintinvoices; + +import org.junit.Test; +import org.openbravo.test.mobile.retail.mobilecore.annotations.TestClassAnnotations; +import org.openbravo.test.mobile.retail.pack.selenium.TestIdPack; +import org.openbravo.test.mobile.retail.pack.selenium.terminals.WebPOSTerminalHelper; + +@TestClassAnnotations(isHighVolumeCompatible = true) +public class PrintMultipleInvoices extends WebPOSTerminalHelper { + + private String MULTIINVOICED_DOCUMENTNO = "VBS1/0000107"; + + @Test + public void test() { + + // Load the ticket + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.BUTTON_MENU_OPENRECEIPT); + write(TestIdPack.FIELD_OPEN_RECEIPT_FILTER_TXT, MULTIINVOICED_DOCUMENTNO); + tap(TestIdPack.BUTTON_OPEN_RECEIPT_SEARCH); + tap(TestIdPack.TABLE_OPEN_RECEIPT, MULTIINVOICED_DOCUMENTNO); + verify(TestIdPack.LABEL_TOTALTOPAY, "154.10"); + + // Print the ticket + tap(TestIdPack.BUTTON_MENU); + tap(TestIdPack.LABEL_MENU_PRINT_RECEIPT); + waitUntilIsVisible(TestIdPack.LABEL_PRINTINVOICES_TITLE, true); + tap(TestIdPack.BUTTON_PRINTINVOICES_PRINTRECEIPT); + tap(TestIdPack.BUTTON_PRINTINVOICES_ROW1); + tap(TestIdPack.BUTTON_PRINTINVOICES_PRINTINVOICES); + TestIdPack.TABLE_INVOICESTOPRINT.enyoNode().waitUntilIsReady(); + tap(TestIdPack.BUTTON_PRINTINVOICES_CANCEL); + tap(TestIdPack.BUTTON_DELETERECEIPT); + + } + +} | |||||||
Relationships [ Relation Graph ] [ Dependency Graph ] | |
Notes | |
(0108068) hgbot (developer) 2018-11-23 09:39 |
Repository: tools/automation/pi-mobile Changeset: d02b36139e218308f656a0b1c5862ab2094cab8a Author: Eduardo Becerra <ebec70 <at> yahoo.com> Date: Fri Nov 23 09:39:04 2018 +0100 URL: http://code.openbravo.com/tools/automation/pi-mobile/rev/d02b36139e218308f656a0b1c5862ab2094cab8a [^] Related issue 32577: Reprint Invoices Test Suite --- M src-test/org/openbravo/test/mobile/retail/extmodules/selenium/tests/certification_france/OBCFRTestBase.java M src-test/org/openbravo/test/mobile/retail/pack/selenium/TestIdPack.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuite.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/suites/concurrent/job014/ReprintInvoicesSuiteHV.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuite.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/AllReprintInvoicesSuiteHV.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedInvoice.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintLoadedReceipt.java A src-test/org/openbravo/test/mobile/retail/pack/selenium/tests/reprintinvoices/PrintMultipleInvoices.java --- |
(0108069) hgbot (developer) 2018-11-23 09:39 |
Repository: erp/pmods/org.openbravo.retail.sampledata Changeset: fb741abf1e53d0836f8f3342394f32413d62dd8a Author: Eduardo Becerra <ebec70 <at> yahoo.com> Date: Fri Nov 23 09:30:57 2018 +0100 URL: http://code.openbravo.com/erp/pmods/org.openbravo.retail.sampledata/rev/fb741abf1e53d0836f8f3342394f32413d62dd8a [^] Related issue 32577: Retail test sample data --- M referencedata/sampledata/The_White_Valley_Group/AD_SEQUENCE.xml M referencedata/sampledata/The_White_Valley_Group/C_INVOICE.xml M referencedata/sampledata/The_White_Valley_Group/C_INVOICELINE.xml M referencedata/sampledata/The_White_Valley_Group/C_INVOICELINETAX.xml M referencedata/sampledata/The_White_Valley_Group/C_INVOICETAX.xml M referencedata/sampledata/The_White_Valley_Group/C_ORDER.xml M referencedata/sampledata/The_White_Valley_Group/C_ORDERLINE.xml M referencedata/sampledata/The_White_Valley_Group/C_ORDERLINETAX.xml M referencedata/sampledata/The_White_Valley_Group/C_ORDERTAX.xml M referencedata/sampledata/The_White_Valley_Group/FIN_FINACC_TRANSACTION.xml M referencedata/sampledata/The_White_Valley_Group/FIN_FINANCIAL_ACCOUNT.xml M referencedata/sampledata/The_White_Valley_Group/FIN_PAYMENT.xml M referencedata/sampledata/The_White_Valley_Group/FIN_PAYMENT_DETAIL.xml M referencedata/sampledata/The_White_Valley_Group/FIN_PAYMENT_SCHEDULE.xml M referencedata/sampledata/The_White_Valley_Group/FIN_PAYMENT_SCHEDULEDETAIL.xml M referencedata/sampledata/The_White_Valley_Group/M_INOUT.xml M referencedata/sampledata/The_White_Valley_Group/M_INOUTLINE.xml M referencedata/sampledata/The_White_Valley_Group/M_STOCK_PROPOSED.xml M referencedata/sampledata/The_White_Valley_Group/M_STORAGE_DETAIL.xml M referencedata/sampledata/The_White_Valley_Group/M_TRANSACTION.xml M referencedata/sampledata/The_White_Valley_Group/OBPOS_APPLICATIONS.xml --- |
(0108070) hgbot (developer) 2018-11-23 09:40 |
Repository: erp/devel/pi Changeset: c6de12285e533c906b0d73b6f7d336d0b2120dd7 Author: Eduardo Becerra <ebec70 <at> yahoo.com> Date: Fri Nov 23 09:07:17 2018 +0100 URL: http://code.openbravo.com/erp/devel/pi/rev/c6de12285e533c906b0d73b6f7d336d0b2120dd7 [^] Related issue 32577: Change the view "VIEW C_INVOICE_CANDIDATE_V" --- M src-db/database/model/views/C_INVOICE_CANDIDATE_V.xml --- |
(0108071) hgbot (developer) 2018-11-23 09:41 |
Repository: erp/pmods/org.openbravo.retail.posterminal Changeset: 2f487344e529fa335b077f2bc64f622cc32646b8 Author: Eduardo Becerra <ebec70 <at> yahoo.com> Date: Fri Nov 23 09:03:13 2018 +0100 URL: http://code.openbravo.com/erp/pmods/org.openbravo.retail.posterminal/rev/2f487344e529fa335b077f2bc64f622cc32646b8 [^] Fix issue 32577: It would be nice to have a menu entry to print the real invoices related to a ticket --- M src-db/database/sourcedata/AD_MESSAGE.xml M src-db/database/sourcedata/OBMOBC_PROCESS_DEFINITION.xml M src-db/database/sourcedata/OBMOBC_SERVICES.xml M src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java M web/org.openbravo.retail.posterminal/css/obpos-main.css M web/org.openbravo.retail.posterminal/js/components/menu.js M web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-print.js M web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js A src/org/openbravo/retail/posterminal/InvoiceLinesProperties.java A src/org/openbravo/retail/posterminal/InvoicePaymentsProperties.java A src/org/openbravo/retail/posterminal/InvoiceProperties.java A src/org/openbravo/retail/posterminal/Invoices.java A src/org/openbravo/retail/posterminal/InvoicesHeader.java A src/org/openbravo/retail/posterminal/OpenInvoices.java A web/org.openbravo.retail.posterminal/js/components/modalinvoices.js --- |
(0108184) hgbot (developer) 2018-11-30 12:37 |
Repository: erp/devel/pi Changeset: b0ab5f6cbd2095e698c5f21b670c78112172a557 Author: Sandra Huguet <sandra.huguet <at> openbravo.com> Date: Fri Nov 30 12:37:14 2018 +0100 URL: http://code.openbravo.com/erp/devel/pi/rev/b0ab5f6cbd2095e698c5f21b670c78112172a557 [^] related to issue 32577 Backed out changeset c6de12285e53 Backed out changeset because is not necessary for the project. Besides, in the product we should not allow to do the automatic invoice process from webpos orders. --- M src-db/database/model/views/C_INVOICE_CANDIDATE_V.xml --- |
(0108494) hudsonbot (developer) 2018-12-11 20:22 |
A changeset related to this issue has been promoted main and to the Central Repository, after passing a series of tests. Promotion changeset: https://code.openbravo.com/erp/devel/main/rev/470e3cd384c5 [^] Maturity status: Test |
(0108506) hudsonbot (developer) 2018-12-11 20:22 |
A changeset related to this issue has been promoted main and to the Central Repository, after passing a series of tests. Promotion changeset: https://code.openbravo.com/erp/devel/main/rev/470e3cd384c5 [^] Maturity status: Test |
Issue History | |||
Date Modified | Username | Field | Change |
2016-04-04 12:05 | aaroncalero | New Issue | |
2016-04-04 12:05 | aaroncalero | Assigned To | => aaroncalero |
2016-04-04 12:05 | aaroncalero | Triggers an Emergency Pack | => No |
2018-10-01 18:07 | aaroncalero | File Added: ReprintInvoices_Sampledata.export | |
2018-10-01 18:08 | aaroncalero | File Added: ReprintInvoices_Posterminal.diff | |
2018-10-01 18:08 | aaroncalero | File Added: ReprintInvoices_Core.diff | |
2018-10-01 18:08 | aaroncalero | File Added: ReprintInvoices_AutomatedTests.export | |
2018-10-16 16:55 | aaroncalero | File Deleted: ReprintInvoices_Sampledata.export | |
2018-10-16 16:55 | aaroncalero | File Added: ReprintInvoices_Sampledata.export | |
2018-10-16 16:55 | aaroncalero | File Deleted: ReprintInvoices_Posterminal.diff | |
2018-10-16 16:55 | aaroncalero | File Added: ReprintInvoices_Posterminal.diff | |
2018-10-31 10:30 | ebecerra | File Added: ReprintInvoices_AutomatedTests.diff | |
2018-11-09 10:14 | ebecerra | File Deleted: ReprintInvoices_AutomatedTests.diff | |
2018-11-09 10:15 | ebecerra | File Deleted: ReprintInvoices_AutomatedTests.export | |
2018-11-09 10:15 | ebecerra | File Added: ReprintInvoices_AutomatedTests.diff | |
2018-11-23 09:39 | hgbot | Checkin | |
2018-11-23 09:39 | hgbot | Note Added: 0108068 | |
2018-11-23 09:39 | hgbot | Checkin | |
2018-11-23 09:39 | hgbot | Note Added: 0108069 | |
2018-11-23 09:40 | hgbot | Checkin | |
2018-11-23 09:40 | hgbot | Note Added: 0108070 | |
2018-11-23 09:41 | hgbot | Checkin | |
2018-11-23 09:41 | hgbot | Note Added: 0108071 | |
2018-11-30 12:37 | hgbot | Checkin | |
2018-11-30 12:37 | hgbot | Note Added: 0108184 | |
2018-12-11 20:22 | hudsonbot | Checkin | |
2018-12-11 20:22 | hudsonbot | Note Added: 0108494 | |
2018-12-11 20:22 | hudsonbot | Checkin | |
2018-12-11 20:22 | hudsonbot | Note Added: 0108506 | |
2018-12-19 14:30 | guillermogil | Review Assigned To | => marvintm |
2018-12-19 14:30 | guillermogil | Assigned To | aaroncalero => ebecerra |
2018-12-19 14:30 | guillermogil | Status | new => scheduled |
2018-12-19 14:30 | guillermogil | Status | scheduled => resolved |
2018-12-19 14:30 | guillermogil | Resolution | open => fixed |
2018-12-19 17:30 | marvintm | Status | resolved => closed |
2018-12-19 17:30 | marvintm | Fixed in Version | => RR19Q1 |
Copyright © 2000 - 2009 MantisBT Group |