details: https://code.openbravo.com/erp/devel/pi/rev/2aebd20a2cf7 changeset: 18517:2aebd20a2cf7 user: Ioritz Cia <ioritz.cia <at> openbravo.com> date: Mon Nov 05 13:13:27 2012 +0100 summary: Fixes issue 21795: Product selector on asset, should not restrict to products that belong to a sales price list.
details: https://code.openbravo.com/erp/devel/pi/rev/531ae77d6e5d changeset: 18518:531ae77d6e5d user: Ioritz Cia <ioritz.cia <at> openbravo.com> date: Tue Nov 06 17:54:19 2012 +0100 summary: Fixes issue 21895: Create Invoice From PO should show a warning message. details: https://code.openbravo.com/erp/devel/pi/rev/76d2cbdf6d39 changeset: 18519:76d2cbdf6d39 user: Ioritz Cia <ioritz.cia <at> openbravo.com> date: Thu Nov 08 13:36:24 2012 +0100 summary: Fixes issue 21722: Is impossible to create 2 invoices from one shipment. details: https://code.openbravo.com/erp/devel/pi/rev/acd485beec84 changeset: 18520:acd485beec84 user: Ioritz Cia <ioritz.cia <at> openbravo.com> date: Fri Oct 26 13:01:57 2012 +0200 summary: Fixes issue 21820: Wrong calculation of a journal entry under some circumstancies diffstat: src-db/database/sourcedata/AD_COLUMN.xml | 2 +- src-db/database/sourcedata/AD_MESSAGE.xml | 11 + src-db/database/sourcedata/OBUISEL_SELECTOR_FIELD.xml | 2 +- src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java | 5 + src/org/openbravo/erpCommon/ad_actionButton/CreateFrom_Invoice_data.xsql | 70 ++++++++- src/org/openbravo/erpCommon/ad_forms/Fact.java | 3 + src/org/openbravo/erpCommon/ad_forms/FactLine.java | 33 ++-- 7 files changed, 97 insertions(+), 29 deletions(-) diffs (275 lines): diff -r 2d71f02d8f3b -r acd485beec84 src-db/database/sourcedata/AD_COLUMN.xml --- a/src-db/database/sourcedata/AD_COLUMN.xml Mon Nov 12 10:38:27 2012 +0100 +++ b/src-db/database/sourcedata/AD_COLUMN.xml Fri Oct 26 13:01:57 2012 +0200 @@ -101100,7 +101100,7 @@ <!--8047--> <COLUMNNAME><![CDATA[M_Product_ID]]></COLUMNNAME> <!--8047--> <AD_TABLE_ID><![CDATA[539]]></AD_TABLE_ID> <!--8047--> <AD_REFERENCE_ID><![CDATA[30]]></AD_REFERENCE_ID> -<!--8047--> <AD_REFERENCE_VALUE_ID><![CDATA[800060]]></AD_REFERENCE_VALUE_ID> +<!--8047--> <AD_REFERENCE_VALUE_ID><![CDATA[800011]]></AD_REFERENCE_VALUE_ID> <!--8047--> <FIELDLENGTH><![CDATA[60]]></FIELDLENGTH> <!--8047--> <ISKEY><![CDATA[N]]></ISKEY> <!--8047--> <ISPARENT><![CDATA[N]]></ISPARENT> diff -r 2d71f02d8f3b -r acd485beec84 src-db/database/sourcedata/AD_MESSAGE.xml --- a/src-db/database/sourcedata/AD_MESSAGE.xml Mon Nov 12 10:38:27 2012 +0100 +++ b/src-db/database/sourcedata/AD_MESSAGE.xml Fri Oct 26 13:01:57 2012 +0200 @@ -21036,6 +21036,17 @@ <!--ECB4FC6A311C4CCA984087945E10FC6E--> <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID> <!--ECB4FC6A311C4CCA984087945E10FC6E--></AD_MESSAGE> +<!--ED29E885BB414C1FB92222716A4C12FC--><AD_MESSAGE> +<!--ED29E885BB414C1FB92222716A4C12FC--> <AD_MESSAGE_ID><![CDATA[ED29E885BB414C1FB92222716A4C12FC]]></AD_MESSAGE_ID> +<!--ED29E885BB414C1FB92222716A4C12FC--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> +<!--ED29E885BB414C1FB92222716A4C12FC--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID> +<!--ED29E885BB414C1FB92222716A4C12FC--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> +<!--ED29E885BB414C1FB92222716A4C12FC--> <VALUE><![CDATA[CreateFromMatchPOQtys]]></VALUE> +<!--ED29E885BB414C1FB92222716A4C12FC--> <MSGTEXT><![CDATA[The quantities that are going to be copied to the lines may not be the ones shown here. If the invoice has a related order and goods receipt, the copied quantity will be the shipped quantity minus the related invoiced. If there is no related shipment, the copied quantity will be the ordered quantity minus the related invoiced quantities.]]></MSGTEXT> +<!--ED29E885BB414C1FB92222716A4C12FC--> <MSGTYPE><![CDATA[I]]></MSGTYPE> +<!--ED29E885BB414C1FB92222716A4C12FC--> <AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID> +<!--ED29E885BB414C1FB92222716A4C12FC--></AD_MESSAGE> + <!--ED94DA7D967E401B93DDFFE86C9715A9--><AD_MESSAGE> <!--ED94DA7D967E401B93DDFFE86C9715A9--> <AD_MESSAGE_ID><![CDATA[ED94DA7D967E401B93DDFFE86C9715A9]]></AD_MESSAGE_ID> <!--ED94DA7D967E401B93DDFFE86C9715A9--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID> diff -r 2d71f02d8f3b -r acd485beec84 src-db/database/sourcedata/OBUISEL_SELECTOR_FIELD.xml --- a/src-db/database/sourcedata/OBUISEL_SELECTOR_FIELD.xml Mon Nov 12 10:38:27 2012 +0100 +++ b/src-db/database/sourcedata/OBUISEL_SELECTOR_FIELD.xml Fri Oct 26 13:01:57 2012 +0200 @@ -1762,7 +1762,7 @@ <!--FF8080812E77708D012E7796A94B0017--> <SORTNO><![CDATA[110]]></SORTNO> <!--FF8080812E77708D012E7796A94B0017--> <ISACTIVE><![CDATA[Y]]></ISACTIVE> <!--FF8080812E77708D012E7796A94B0017--> <ISOUTFIELD><![CDATA[N]]></ISOUTFIELD> -<!--FF8080812E77708D012E7796A94B0017--> <DEFAULT_EXPRESSION><![CDATA[if (OB.getWindowId() == '800051' || OB.getWindowId() == '800052' || OB.getWindowId() == '800096') {false} else {if (OB.isSalesTransaction() == true) { true } else {false}}]]></DEFAULT_EXPRESSION> +<!--FF8080812E77708D012E7796A94B0017--> <DEFAULT_EXPRESSION><![CDATA[if (OB.getWindowId() == '800051' || OB.getWindowId() == '800052' || OB.getWindowId() == '800096' || OB.getWindowId() == '800027') {false} else {if (OB.isSalesTransaction() == true) { true } else {false}}]]></DEFAULT_EXPRESSION> <!--FF8080812E77708D012E7796A94B0017--> <SHOWINPICKLIST><![CDATA[N]]></SHOWINPICKLIST> <!--FF8080812E77708D012E7796A94B0017--></OBUISEL_SELECTOR_FIELD> diff -r 2d71f02d8f3b -r acd485beec84 src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java --- a/src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java Mon Nov 12 10:38:27 2012 +0100 +++ b/src/org/openbravo/erpCommon/ad_actionButton/CreateFrom.java Fri Oct 26 13:01:57 2012 +0200 @@ -583,6 +583,11 @@ xmlDocument.setParameter("messageType", myMessage.getType()); xmlDocument.setParameter("messageTitle", myMessage.getTitle()); xmlDocument.setParameter("messageMessage", myMessage.getMessage()); + } else { + xmlDocument.setParameter("messageType", "Info"); + xmlDocument.setParameter("messageTitle", "Information"); + xmlDocument.setParameter("messageMessage", + Utility.messageBD(this, "CreateFromMatchPOQtys", vars.getLanguage())); } } diff -r 2d71f02d8f3b -r acd485beec84 src/org/openbravo/erpCommon/ad_actionButton/CreateFrom_Invoice_data.xsql --- a/src/org/openbravo/erpCommon/ad_actionButton/CreateFrom_Invoice_data.xsql Mon Nov 12 10:38:27 2012 +0100 +++ b/src/org/openbravo/erpCommon/ad_actionButton/CreateFrom_Invoice_data.xsql Fri Oct 26 13:01:57 2012 +0200 @@ -379,7 +379,14 @@ <![CDATA[ SELECT s.M_InOut_ID AS ID, Ad_Column_Identifier(to_char('M_InOut'), to_char(s.M_InOut_ID), to_char(?)) AS NAME, s.DocumentNo AS NAMESHIPMENT, - l.MovementQty AS QTY, l.C_UOM_ID,uom.UOMSymbol, l.M_Product_ID,Ad_Column_Identifier(to_char('M_Product'), to_char(l.m_product_id), to_char(?))||' '||(CASE WHEN ma.serno IS NOT NULL THEN TO_CHAR('('||' '||ma.serno||' '||')') ELSE TO_CHAR('') END) AS RELATION_NAME, l.M_InOutLine_ID,l.Line, + (l.MovementQty - COALESCE((select sum(COALESCE(il.qtyinvoiced, 0)) + from m_inoutline iol + left join c_invoiceline il on iol.m_inoutline_id = il.m_inoutline_id + left join c_invoice i on il.c_invoice_id = i.c_invoice_id + where iol.m_inoutline_id = l.m_inoutline_id + and i.docstatus = 'CO' + group by iol.m_inoutline_id, iol.movementqty + having iol.movementqty > sum(COALESCE(il.qtyinvoiced, 0))), 0)) AS QTY, l.C_UOM_ID,uom.UOMSymbol, l.M_Product_ID,Ad_Column_Identifier(to_char('M_Product'), to_char(l.m_product_id), to_char(?))||' '||(CASE WHEN ma.serno IS NOT NULL THEN TO_CHAR('('||' '||ma.serno||' '||')') ELSE TO_CHAR('') END) AS RELATION_NAME, l.M_InOutLine_ID,l.Line, l.M_InOutLine_ID as C_OrderLine_ID FROM M_INOUTLINE l left join M_ATTRIBUTESETINSTANCE ma on l.M_ATTRIBUTESETINSTANCE_ID = ma.M_ATTRIBUTESETINSTANCE_ID @@ -394,7 +401,13 @@ AND s.AD_Org_ID IN ('1') AND l.C_UOM_ID=uom.C_UOM_ID AND l.M_Product_ID=p.M_Product_ID - AND l.isinvoiced = 'N' + AND EXISTS (select 1 + from m_inoutline iol + left join c_invoiceline il on iol.m_inoutline_id = il.m_inoutline_id + left join c_invoice i on il.c_invoice_id = i.c_invoice_id + where iol.m_inoutline_id = l.m_inoutline_id + group by iol.m_inoutline_id, iol.movementqty + having iol.movementqty > sum(COALESCE(CASE WHEN i.docstatus = 'CO' THEN il.qtyinvoiced ELSE 0 END, 0))) AND l.M_InOut_ID=? AND (l.c_orderline_id is null OR pl.istaxincluded = ?) GROUP BY s.M_InOut_ID, s.DocumentNo, s.MovementDate, l.MovementQty,l.C_UOM_ID,uom.UOMSymbol, @@ -409,7 +422,7 @@ <Parameter name="adOrgClient" type="replace" optional="true" after="s.AD_Org_ID IN (" text="'1'"/> <Parameter name="mInoutId"/> <Parameter name="isTaxIncluded"/> - </SqlMethod> + </SqlMethod> <SqlMethod name="selectFromShipmentSOTrxCombo" type="preparedStatement" return="multiple"> <SqlMethodComment></SqlMethodComment> <Sql> @@ -428,7 +441,14 @@ left join m_pricelist pl on pl.m_pricelist_id = o.m_pricelist_id WHERE l.M_INOUT_ID = s.M_INOUT_ID AND (l.c_orderline_id is null OR pl.istaxincluded = ?) - AND l.isinvoiced = 'N') + AND EXISTS (SELECT 1 + FROM m_inoutline iol + left join c_invoiceline il ON iol.m_inoutline_id = il.m_inoutline_id + left join c_invoice i ON il.c_invoice_id = i.c_invoice_id + WHERE iol.m_inoutline_id = l.m_inoutline_id + GROUP BY iol.m_inoutline_id, iol.movementqty + HAVING iol.movementqty > SUM(COALESCE(CASE WHEN i.docstatus = 'CO' THEN il.qtyinvoiced ELSE 0 END, 0))) + ) AND NOT EXISTS (SELECT 1 FROM C_INVOICE_CANDIDATE_V ic, C_ORDER o WHERE o.C_ORDER_ID = s.C_ORDER_ID AND o.C_ORDER_ID = ic.C_ORDER_ID @@ -448,6 +468,7 @@ <Parameter name="cBpartnerId"/> <Parameter name="isTaxIncluded"/> </SqlMethod> + <SqlMethod name="selectFromShipmentTrl" type="preparedStatement" return="multiple"> <SqlMethodComment></SqlMethodComment> <Sql> @@ -488,14 +509,21 @@ <Parameter name="adOrgClient" type="replace" optional="true" after="s.AD_Org_ID IN (" text="'1'"/> <Parameter name="mInoutId"/> <Parameter name="isTaxIncluded"/> - </SqlMethod> + </SqlMethod> <SqlMethod name="selectFromShipmentTrlSOTrx" type="preparedStatement" return="multiple"> <SqlMethodComment></SqlMethodComment> <Sql> <![CDATA[ SELECT s.M_InOut_ID AS ID, Ad_Column_Identifier(to_char('M_InOut'), to_char(s.M_InOut_ID), to_char(?)) AS NAME, s.DocumentNo AS NAMESHIPMENT, - l.MovementQty AS QTY, l.C_UOM_ID,COALESCE(uomt.UOMSymbol, uom.UOMSymbol) AS UOMSymbol, + (l.MovementQty - COALESCE((SELECT SUM(COALESCE(il.qtyinvoiced, 0)) + FROM m_inoutline iol + LEFT JOIN c_invoiceline il ON iol.m_inoutline_id = il.m_inoutline_id + LEFT JOIN c_invoice i ON il.c_invoice_id = i.c_invoice_id + WHERE iol.m_inoutline_id = l.m_inoutline_id + AND i.docstatus = 'CO' + GROUP BY iol.m_inoutline_id, iol.movementqty + HAVING iol.movementqty > sum(COALESCE(il.qtyinvoiced, 0))), 0)) AS QTY, l.C_UOM_ID,COALESCE(uomt.UOMSymbol, uom.UOMSymbol) AS UOMSymbol, l.M_Product_ID,Ad_Column_Identifier(to_char('M_Product'), to_char(l.m_product_id), to_char(?))||' '|| (CASE WHEN ma.serno IS NOT NULL THEN TO_CHAR('('||' '||ma.serno||' '||')') ELSE TO_CHAR('') END) AS RELATION_NAME, l.M_InOutLine_ID,l.Line, l.M_InOutLine_ID as C_OrderLine_ID FROM M_INOUTLINE l left join M_ATTRIBUTESETINSTANCE ma on l.M_ATTRIBUTESETINSTANCE_ID = ma.M_ATTRIBUTESETINSTANCE_ID @@ -512,7 +540,13 @@ AND s.AD_Org_ID IN ('1') AND l.C_UOM_ID=uom.C_UOM_ID AND l.M_Product_ID=p.M_Product_ID - AND l.isinvoiced = 'N' + AND EXISTS (SELECT 1 + FROM m_inoutline iol + LEFT JOIN c_invoiceline il ON iol.m_inoutline_id = il.m_inoutline_id + LEFT JOIN c_invoice i ON il.c_invoice_id = i.c_invoice_id + WHERE iol.m_inoutline_id = l.m_inoutline_id + GROUP BY iol.m_inoutline_id, iol.movementqty + HAVING iol.movementqty > SUM(COALESCE(CASE WHEN i.docstatus = 'CO' THEN il.qtyinvoiced ELSE 0 END, 0))) AND l.M_InOut_ID=? AND (l.c_orderline_id is null OR pl.istaxincluded = ?) GROUP BY s.M_InOut_ID, s.DocumentNo, s.MovementDate, l.MovementQty,l.C_UOM_ID,uom.UOMSymbol, uomt.UOMSymbol, @@ -529,6 +563,7 @@ <Parameter name="mInoutId"/> <Parameter name="isTaxIncluded"/> </SqlMethod> + <SqlMethod name="selectFromShipmentUpdate" type="preparedStatement" connection="true" return="multiple"> <SqlMethodComment></SqlMethodComment> <Sql> @@ -552,20 +587,33 @@ <SqlMethodComment></SqlMethodComment> <Sql> <![CDATA[ - SELECT l.MovementQty AS ID, l.C_UOM_ID,uom.UOMSymbol, l.M_Product_ID,Ad_Column_Identifier(to_char('M_Product'), to_char(l.m_product_id), to_char(?)) AS NAME, l.M_InOutLine_ID,l.Line, + SELECT (l.MovementQty - COALESCE((select sum(COALESCE(il.qtyinvoiced, 0)) + from m_inoutline iol + left join c_invoiceline il on iol.m_inoutline_id = il.m_inoutline_id + left join c_invoice i on il.c_invoice_id = i.c_invoice_id + where iol.m_inoutline_id = l.m_inoutline_id + and i.docstatus = 'CO' + group by iol.m_inoutline_id, iol.movementqty + having iol.movementqty > sum(COALESCE(il.qtyinvoiced, 0))), 0)) AS ID, l.C_UOM_ID,uom.UOMSymbol, l.M_Product_ID,Ad_Column_Identifier(to_char('M_Product'), to_char(l.m_product_id), to_char(?)) AS NAME, l.M_InOutLine_ID,l.Line, l.C_OrderLine_ID, max(uom.STDPRECISION) as stdprecision, l.Description,l.quantityOrder, l.M_Product_UOM_ID, l.M_ATTRIBUTESETINSTANCE_ID, l.ad_org_id FROM C_UOM uom, M_INOUTLINE l, M_PRODUCT p WHERE l.C_UOM_ID=uom.C_UOM_ID AND l.M_Product_ID=p.M_Product_ID - AND l.isinvoiced = 'N' - GROUP BY l.MovementQty,l.C_UOM_ID,uom.UOMSymbol,l.M_Product_ID,p.NAME, l.M_InOutLine_ID,l.Line,l.C_OrderLine_ID, l.Description, l.quantityOrder, l.M_Product_UOM_ID, l.M_ATTRIBUTESETINSTANCE_ID, l.ad_org_id + AND EXISTS (select 1 + from m_inoutline iol + left join c_invoiceline il on iol.m_inoutline_id = il.m_inoutline_id + left join c_invoice i on il.c_invoice_id = i.c_invoice_id + where iol.m_inoutline_id = l.m_inoutline_id + group by iol.m_inoutline_id, iol.movementqty + having iol.movementqty > sum(COALESCE(CASE WHEN i.docstatus = 'CO' THEN il.qtyinvoiced ELSE 0 END, 0))) + GROUP BY l.MovementQty,l.C_UOM_ID,uom.UOMSymbol,l.M_Product_ID,p.NAME, l.M_InOutLine_ID,l.Line,l.C_OrderLine_ID, l.Description, l.quantityOrder, l.M_Product_UOM_ID, l.M_ATTRIBUTESETINSTANCE_ID, l.ad_org_id, l.m_inout_id ORDER BY l.Line ]]> </Sql> <Field name="rownum" value="count"/> <Parameter name="adLanguage"/> - <Parameter name="cOrderlineId" optional="true" type="argument" after="AND l.isinvoiced = 'N' " text=" AND l.M_InOutLine_ID IN "/> + <Parameter name="cOrderlineId" optional="true" type="argument" after="AND l.M_Product_ID=p.M_Product_ID " text=" AND l.M_InOutLine_ID IN "/> </SqlMethod> <SqlMethod name="set" type="constant" return="multiple"> <SqlMethodComment></SqlMethodComment> diff -r 2d71f02d8f3b -r acd485beec84 src/org/openbravo/erpCommon/ad_forms/Fact.java --- a/src/org/openbravo/erpCommon/ad_forms/Fact.java Mon Nov 12 10:38:27 2012 +0100 +++ b/src/org/openbravo/erpCommon/ad_forms/Fact.java Fri Oct 26 13:01:57 2012 +0200 @@ -264,6 +264,9 @@ log4jFact.debug("createLine - " + m_doc.DocumentNo); log4jFact.debug("********************* Fact - createLine - DocumentNo - " + m_doc.DocumentNo + " - m_lines.size() - " + m_lines.size()); + + line.roundToCurrencyPrecision(); + m_lines.add(line); return line; } // createLine diff -r 2d71f02d8f3b -r acd485beec84 src/org/openbravo/erpCommon/ad_forms/FactLine.java --- a/src/org/openbravo/erpCommon/ad_forms/FactLine.java Mon Nov 12 10:38:27 2012 +0100 +++ b/src/org/openbravo/erpCommon/ad_forms/FactLine.java Fri Oct 26 13:01:57 2012 +0200 @@ -799,22 +799,6 @@ log4jFactLine.debug("FactLine - m_C_WithHolding_ID " + ((m_docLine != null) ? m_docLine.m_C_WithHolding_ID : "")); - // Applies currency precision - Currency currency = OBDal.getInstance().get(Currency.class, m_C_Currency_ID); - org.openbravo.model.financialmgmt.accounting.coa.AcctSchema schema = OBDal.getInstance() - .get(org.openbravo.model.financialmgmt.accounting.coa.AcctSchema.class, - m_C_AcctSchema_ID); - m_AmtSourceCr = new BigDecimal(m_AmtSourceCr).setScale( - currency.getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN).toString(); - m_AmtSourceDr = new BigDecimal(m_AmtSourceDr).setScale( - currency.getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN).toString(); - m_AmtAcctCr = new BigDecimal(m_AmtAcctCr).setScale( - schema.getCurrency().getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN) - .toString(); - m_AmtAcctDr = new BigDecimal(m_AmtAcctDr).setScale( - schema.getCurrency().getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN) - .toString(); - no = FactLineData.insertFactAct(con, conn, m_Fact_Acct_ID, AD_Client_ID, AD_Org_ID, vars .getUser(), m_C_AcctSchema_ID, Account_ID, cuenta[0].value, cuenta[0].description, DateDoc, DateAcct, C_Period_ID, m_AD_Table_ID, m_Record_ID, m_Line_ID, @@ -835,6 +819,23 @@ return no == 1; } // save + void roundToCurrencyPrecision() { + // Applies currency precision + Currency currency = OBDal.getInstance().get(Currency.class, m_C_Currency_ID); + org.openbravo.model.financialmgmt.accounting.coa.AcctSchema schema = OBDal.getInstance().get( + org.openbravo.model.financialmgmt.accounting.coa.AcctSchema.class, m_C_AcctSchema_ID); + m_AmtSourceCr = new BigDecimal(m_AmtSourceCr).setScale( + currency.getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN).toString(); + m_AmtSourceDr = new BigDecimal(m_AmtSourceDr).setScale( + currency.getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN).toString(); + m_AmtAcctCr = new BigDecimal(m_AmtAcctCr).setScale( + schema.getCurrency().getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN) + .toString(); + m_AmtAcctDr = new BigDecimal(m_AmtAcctDr).setScale( + schema.getCurrency().getStandardPrecision().intValue(), BigDecimal.ROUND_HALF_EVEN) + .toString(); + } + /** * Get AD_Client * ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_nov _______________________________________________ Openbravo-commits mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openbravo-commits
