details: https://code.openbravo.com/erp/devel/main/rev/430d18e9b3fd changeset: 22805:430d18e9b3fd user: Augusto Mauch <augusto.mauch <at> openbravo.com> date: Wed Apr 02 10:38:53 2014 +0200 summary: Fixes issue 26139: Adds missing constraint in AD_TABLE_TREE table
The column obserds_datasource_id of the ad_table_tree is a foreign key to the key column of the obserds_datasource. There should be a contraint to explicit this in the database. details: https://code.openbravo.com/erp/devel/main/rev/56638b661719 changeset: 22806:56638b661719 user: David Baz Fayos <david.baz <at> openbravo.com> date: Wed Apr 02 21:28:50 2014 +0200 summary: [scupgrade] Fixed issue 26129: 'Checkboxes' now display focus status again details: https://code.openbravo.com/erp/devel/main/rev/9a05e9c93af7 changeset: 22807:9a05e9c93af7 user: David Baz Fayos <david.baz <at> openbravo.com> date: Thu Apr 03 00:12:07 2014 +0200 summary: [scupgrade] Related to issue 26068: Removed lines that prevented 'tab' key proper behavior details: https://code.openbravo.com/erp/devel/main/rev/7ab5d94d70f0 changeset: 22808:7ab5d94d70f0 user: David Baz Fayos <david.baz <at> openbravo.com> date: Tue Apr 01 21:11:15 2014 +0200 summary: Related to issue 26092: Checkboxes are now always left-aligned in grid view even after column resizing details: https://code.openbravo.com/erp/devel/main/rev/14d1a848d623 changeset: 22809:14d1a848d623 user: David Baz Fayos <david.baz <at> openbravo.com> date: Tue Apr 01 21:13:44 2014 +0200 summary: Related to issue 26092: inputs are now always centered while editing records in the grid details: https://code.openbravo.com/erp/devel/main/rev/f706c3200488 changeset: 22810:f706c3200488 user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Wed Apr 02 17:56:36 2014 +0200 summary: Fixed issue 26144, fixed issue 26145 details: https://code.openbravo.com/erp/devel/main/rev/b51a6856810d changeset: 22811:b51a6856810d user: Guillermo Gil <guillermo.gil <at> openbravo.com> date: Thu Apr 03 12:39:27 2014 +0200 summary: Fixed issue 26162: CSV Text Encoding preference is not working Deleted auto set character encoding details: https://code.openbravo.com/erp/devel/main/rev/ac88c6ab5577 changeset: 22812:ac88c6ab5577 user: Sandra Huguet <sandra.huguet <at> openbravo.com> date: Thu Apr 03 13:30:46 2014 +0200 summary: Related to issue 25696 proper ipsc to the reconciliations diffstat: modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentProcess.java | 48 +--- modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_ReconciliationProcess.java | 51 ----- modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java | 8 +- modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js | 8 +- modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js | 3 - modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java | 2 +- modules/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/isomorphic/ISC_Combined.js | 4 +- src-db/database/model/tables/AD_TABLE_TREE.xml | 3 + src/org/openbravo/event/PaidStatusEventHandler.java | 100 ++++++++++ 9 files changed, 132 insertions(+), 95 deletions(-) diffs (truncated from 391 to 300 lines): diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentProcess.java --- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentProcess.java Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentProcess.java Thu Apr 03 13:30:46 2014 +0200 @@ -687,7 +687,7 @@ } // Do not restore paid amounts if the payment is awaiting execution. - boolean restorePaidAmounts = (FIN_Utility.seqnumberpaymentstatus(payment.getStatus())) <= (FIN_Utility + boolean restorePaidAmounts = (FIN_Utility.seqnumberpaymentstatus(payment.getStatus())) == (FIN_Utility .seqnumberpaymentstatus(FIN_Utility.invoicePaymentStatus(payment))); // Initialize amounts payment.setProcessed(false); @@ -741,7 +741,7 @@ for (FIN_PaymentScheduleDetail paymentScheduleDetail : paymentDetail .getFINPaymentScheduleDetailList()) { Boolean invoicePaidold = paymentScheduleDetail.isInvoicePaid(); - if (invoicePaidold) { + if (invoicePaidold | paymentScheduleDetail.getInvoicePaymentSchedule() == null) { BigDecimal psdWriteoffAmount = paymentScheduleDetail.getWriteoffAmount(); BigDecimal psdAmount = paymentScheduleDetail.getAmount(); BigDecimal amount = psdAmount.add(psdWriteoffAmount); @@ -827,38 +827,22 @@ paymentScheduleDetail.getOrderPaymentSchedule(), psdAmount.negate(), psdWriteoffAmount.negate()); } - - // when generating credit for a BP SO_CreditUsed is also updated - if (paymentScheduleDetail.getInvoicePaymentSchedule() == null - && paymentScheduleDetail.getOrderPaymentSchedule() == null - && paymentScheduleDetail.getPaymentDetails().getGLItem() == null - && restorePaidAmounts && !paymentDetail.isRefund()) { - // BP SO_CreditUsed - if (isReceipt) { - increaseCustomerCredit(businessPartner, amount); - } else { - decreaseCustomerCredit(businessPartner, amount); - } - } - - if (paymentScheduleDetail.getOrderPaymentSchedule() != null && restorePaidAmounts) { - FIN_AddPayment.updatePaymentScheduleAmounts( - paymentScheduleDetail.getOrderPaymentSchedule(), psdAmount.negate(), - psdWriteoffAmount.negate()); - } - // when generating credit for a BP SO_CreditUsed is also updated - if (paymentScheduleDetail.getInvoicePaymentSchedule() == null - && paymentScheduleDetail.getOrderPaymentSchedule() == null - && paymentScheduleDetail.getPaymentDetails().getGLItem() == null - && restorePaidAmounts && !paymentDetail.isRefund()) { - // BP SO_CreditUsed - if (isReceipt) { - increaseCustomerCredit(businessPartner, amount); - } else { - decreaseCustomerCredit(businessPartner, amount); + if (restorePaidAmounts) { + // when generating credit for a BP SO_CreditUsed is also updated + if (paymentScheduleDetail.getInvoicePaymentSchedule() == null + && paymentScheduleDetail.getOrderPaymentSchedule() == null + && paymentScheduleDetail.getPaymentDetails().getGLItem() == null + && restorePaidAmounts && !paymentDetail.isRefund()) { + // BP SO_CreditUsed + if (isReceipt) { + increaseCustomerCredit(businessPartner, amount); + } else { + decreaseCustomerCredit(businessPartner, amount); + } } } } + if (strAction.equals("R") || (strAction.equals("RE") && paymentScheduleDetail.getInvoicePaymentSchedule() == null @@ -1034,7 +1018,7 @@ for (final FIN_PaymentScheduleDetail paymentScheduleDetail : paymentDetail .getFINPaymentScheduleDetailList()) { Boolean invoicePaidold = paymentScheduleDetail.isInvoicePaid(); - if (invoicePaidold) { + if (invoicePaidold | paymentScheduleDetail.getInvoicePaymentSchedule() == null) { paymentScheduleDetail.setInvoicePaid(false); } BigDecimal outStandingAmt = BigDecimal.ZERO; diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_ReconciliationProcess.java --- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_ReconciliationProcess.java Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_ReconciliationProcess.java Thu Apr 03 13:30:46 2014 +0200 @@ -34,10 +34,7 @@ import org.openbravo.erpCommon.utility.OBDateUtils; import org.openbravo.erpCommon.utility.OBError; import org.openbravo.erpCommon.utility.Utility; -import org.openbravo.model.financialmgmt.payment.FIN_FinaccTransaction; import org.openbravo.model.financialmgmt.payment.FIN_FinancialAccount; -import org.openbravo.model.financialmgmt.payment.FIN_PaymentDetail; -import org.openbravo.model.financialmgmt.payment.FIN_PaymentScheduleDetail; import org.openbravo.model.financialmgmt.payment.FIN_Reconciliation; import org.openbravo.model.financialmgmt.payment.FIN_ReconciliationLine_v; import org.openbravo.scheduling.ProcessBundle; @@ -111,28 +108,6 @@ OBDal.getInstance().save(reconciliation); OBDal.getInstance().flush(); - Boolean invoicePaidold = false; - for (FIN_FinaccTransaction finacctransaction : reconciliation.getFINFinaccTransactionList()) { - if (finacctransaction.getFinPayment() != null) { - for (FIN_PaymentDetail pd : finacctransaction.getFinPayment().getFINPaymentDetailList()) { - for (FIN_PaymentScheduleDetail psd : pd.getFINPaymentScheduleDetailList()) { - invoicePaidold = psd.isInvoicePaid(); - if (!invoicePaidold) { - if ((FIN_Utility.invoicePaymentStatus(finacctransaction.getFinPayment() - .getPaymentMethod(), reconciliation.getAccount(), finacctransaction - .getFinPayment().isReceipt()).equals(finacctransaction.getFinPayment() - .getStatus()))) { - psd.setInvoicePaid(true); - } - if (psd.isInvoicePaid()) { - FIN_Utility.updatePaymentAmounts(psd); - } - } - } - } - FIN_Utility.updateBusinessPartnerCredit(finacctransaction.getFinPayment()); - } - } // *********************** // Reactivate Reconciliation // *********************** @@ -194,32 +169,6 @@ OBDal.getInstance().save(reconciliation); OBDal.getInstance().flush(); Boolean invoicePaidold = false; - - for (FIN_FinaccTransaction finacctransaction : reconciliation.getFINFinaccTransactionList()) { - if (finacctransaction.getFinPayment() != null) { - for (FIN_PaymentDetail pd : finacctransaction.getFinPayment().getFINPaymentDetailList()) { - for (FIN_PaymentScheduleDetail psd : pd.getFINPaymentScheduleDetailList()) { - invoicePaidold = psd.isInvoicePaid(); - if (invoicePaidold) { - if (FIN_Utility.invoicePaymentStatus( - finacctransaction.getFinPayment().getPaymentMethod(), - reconciliation.getAccount(), finacctransaction.getFinPayment().isReceipt()) - .equals(finacctransaction.getFinPayment().getStatus())) { - boolean restore = (FIN_Utility.seqnumberpaymentstatus(finacctransaction - .getFinPayment().getStatus())) <= (FIN_Utility - .seqnumberpaymentstatus(FIN_Utility.invoicePaymentStatus(finacctransaction - .getFinPayment().getPaymentMethod(), reconciliation.getAccount(), - finacctransaction.getFinPayment().isReceipt()))); - if (restore) { - FIN_Utility.restorePaidAmounts(psd); - } - } - } - } - } - } - } - } reconciliation.setProcessNow(false); OBDal.getInstance().save(reconciliation); diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java --- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_TransactionProcess.java Thu Apr 03 13:30:46 2014 +0200 @@ -109,12 +109,13 @@ } if (psd.isInvoicePaid()) { FIN_Utility.updatePaymentAmounts(psd); + FIN_Utility.updateBusinessPartnerCredit(payment); } OBDal.getInstance().save(psd); } } } - FIN_Utility.updateBusinessPartnerCredit(payment); + } else { transaction.setStatus(transaction.getDepositAmount().compareTo( transaction.getPaymentAmount()) > 0 ? "RDNC" : "PWNC"); @@ -179,9 +180,8 @@ for (FIN_PaymentScheduleDetail psd : pd.getFINPaymentScheduleDetailList()) { invoicePaidold = psd.isInvoicePaid(); if (invoicePaidold) { - boolean restore = (FIN_Utility.seqnumberpaymentstatus(payment.isReceipt() ? "RPR" - : "PPM")) < (FIN_Utility.seqnumberpaymentstatus(FIN_Utility - .invoicePaymentStatus(payment))); + boolean restore = (FIN_Utility.seqnumberpaymentstatus(payment.getStatus())) == (FIN_Utility + .seqnumberpaymentstatus(FIN_Utility.invoicePaymentStatus(payment))); if (restore) { FIN_Utility.restorePaidAmounts(psd); } diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js --- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js Thu Apr 03 13:30:46 2014 +0200 @@ -886,7 +886,11 @@ func = this.getGridSummaryFunction(fld), isSummary = record && (record[this.groupSummaryRecordProperty] || record[this.gridSummaryRecordProperty]); if (!fld.clientClass && rowNum === this.getEditRow()) { - return 'center'; + if (fld.editorType === 'OBCheckboxItem') { + return isRTL ? isc.Canvas.RIGHT : isc.Canvas.LEFT; + } else { + return isc.Canvas.CENTER; + } } if (isSummary && func === 'count') { @@ -3317,8 +3321,6 @@ this.view.isEditingGrid = true; - record[this.recordBaseStyleProperty] = this.baseStyleEdit; - // also called in case of new var form = this.getEditForm(); diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js --- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/main/ob-standard-view.js Thu Apr 03 13:30:46 2014 +0200 @@ -472,7 +472,6 @@ completeFieldsWithoutImages, fieldsWithoutImages; if (this.tabId && this.tabId.length > 0) { this.formGridLayout = isc.HLayout.create({ - canFocus: true, width: '100%', height: '*', overflow: 'visible', @@ -535,7 +534,6 @@ // in ob-view-form-linked-items is still called on the correct // object this.statusBarFormLayout = isc.VLayout.create({ - canFocus: true, width: '100%', height: '*', visibility: 'hidden', @@ -562,7 +560,6 @@ // and place the active bar to the left of the form/grid/messagebar this.activeGridFormMessageLayout = isc.HLayout.create({ - canFocus: true, height: (this.hasChildTabs ? '50%' : '100%'), width: '100%', overflow: 'hidden' diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java --- a/modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.service.datasource/src/org/openbravo/service/datasource/DataSourceServlet.java Thu Apr 03 13:30:46 2014 +0200 @@ -232,6 +232,7 @@ } finally { OBContext.restorePreviousMode(); } + response.setHeader("Content-Disposition", "attachment; filename=ExportedData.csv"); if (getDataSource(request) instanceof DefaultDataSourceService) { QueryJSONWriterToCSV writer = new QueryJSONWriterToCSV(request, response, parameters, getDataSource(request).getEntity()); @@ -284,7 +285,6 @@ try { OBContext.setAdminMode(); response.setHeader("Content-Disposition", "attachment; filename=ExportedData.csv"); - response.setCharacterEncoding("UTF-8"); writer = response.getWriter(); VariablesSecureApp vars = new VariablesSecureApp(request); Window window = parameters.get("tab") == null || parameters.get("tab").equals("undefined") ? null diff -r 648c4d0c52f8 -r ac88c6ab5577 modules/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/isomorphic/ISC_Combined.js --- a/modules/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/isomorphic/ISC_Combined.js Tue Apr 01 06:51:31 2014 +0000 +++ b/modules/org.openbravo.userinterface.smartclient/web/org.openbravo.userinterface.smartclient/isomorphic/ISC_Combined.js Thu Apr 03 13:30:46 2014 +0200 @@ -8602,7 +8602,9 @@ _1=_9+(_1!=null?_1:isc.emptyString);if(isc.Browser.isIE){if(_1&&_1.startsWith("<nobr>")) _1=_1.substring(6);if(_1&&_1.endsWith("</nobr>")) _1=_1.substring(0,_1.length-7);try{_8.innerHTML=_1}catch(e){var _10=document.createElement("span");_10.innerHTML=_1;_8.innerHTML="";_8.appendChild(_10)}}else{_8.innerHTML=_1} -if(!this.clipValue||this.height==null||this.width==null){this.adjustOverflow("textBox value changed")}}},isc.A.$17j=function isc_FormItem__updateValueIcon(_1){if(this.suppressValueIcon||!this.isDrawn())return;var _2=this.$144(_1),_3=this.$15v();if(_2!=null){if(this.imageURLSuffix!=null)_2+=this.imageURLSuffix;_2=isc.Canvas.getImgURL(_2,this.imageURLPrefix||this.baseURL||this.imgDir);if(_3!=null){_3.src=_2}else{var _4=false;if(this.hasDataElement()){var _5=this.getDataElement();if(_5!=null){isc.Element.insertAdjacentHTML(_5,"beforeBegin",this.$xq(_1));_5.style.width=this.getTextBoxWidth(_1);_4=true}}else{var _6=this.$15h();if(_6!=null){isc.Element.insertAdjacentHTML(_6,"afterBegin",this.$xq(_1));_4=true}} +if(!this.clipValue||this.height==null||this.width==null){this.adjustOverflow("textBox value changed")}}},isc.A.$17j=function isc_FormItem__updateValueIcon(_1){ +if(this.suppressValueIcon||!this.isDrawn())return;if(_1==null)_1=this.getValue();var _2=this.$144(_1),_3=this.$15v();if(_2!=null){if(this.imageURLSuffix!=null)_2+=this.imageURLSuffix;var _7=this.imageURLPrefix||this.baseURL||this.imgDir;if(_3!=null){isc.Canvas.$wg(_3,_2,_7);} +else{_2=isc.Canvas.getImgURL(_2,_7);var _4=false;if(this.hasDataElement()){var _5=this.getDataElement();if(_5!=null){isc.Element.insertAdjacentHTML(_5,"beforeBegin",this.$xq(_1));_5.style.width=this.getTextBoxWidth(_1);_4=true}}else{var _6=this.$15h();if(_6!=null){isc.Element.insertAdjacentHTML(_6,"afterBegin",this.$xq(_1));_4=true}} if(!_4)this.redraw()}}else if(_3!=null&&!(isc.isAn.Array(_1)&&_1.length>1)){isc.Element.clear(_3);if(this.hasDataElement()){var _5=this.getDataElement();_5.style.width=this.getTextBoxWidth(_1)}}},isc.A.setPrompt=function isc_FormItem_setPrompt(_1){this.prompt=_1},isc.A.setHint=function isc_FormItem_setHint(_1){this.hint=_1;if(this.showHint)this.redraw()},isc.A.setHintStyle=function isc_FormItem_setHintStyle(_1){if(!this.$712()&&this.getHint()){var _2=this.$59t();if(_2)_2.className=_1}},isc.A.$66t=function isc_FormItem__showInFieldHint(){if(!this.$66u&&!this.hasFocus){var _1=this.getDataElement();if(_1){_1.className=this.$66v();if(this.isA.TextItem){this.$857=_1.type;_1.type="text"}}else{var _2=this.$15h();if(_2!=null){_2.className=this.$66v()}} var _3=this.getHint();if(_3)_3=_3.unescapeHTML();this.setElementValue(_3);this.$66u=true}},isc.A.$66s=function isc_FormItem__hideInFieldHint(_1){if(this.$66u){var _2=this.getDataElement();if(_2){_2.className=this.getTextBoxStyle();if(this.$857){_2.type=this.$857;delete this.$857}}else{var _3=this.$15h();if(_3!=null){_3.className=this.getTextBoxStyle()}} if(!_1)this.setElementValue(isc.emptyString);this.$66u=false}},isc.A.$66v=function isc_FormItem__getInFieldHintStyle(){if(this.showDisabled&&this.isDisabled())return this.textBoxStyle+"DisabledHint";return this.textBoxStyle+"Hint"},isc.A.$712=function isc_FormItem__getShowHintInField(){return false},isc.A.getDefaultValue=function isc_FormItem_getDefaultValue(){if(this.defaultDynamicValue){this.convertToMethod("defaultDynamicValue");var _1=this,_2=this.form,_3=this.form.getValues();return this.defaultDynamicValue(_1,_2,_3)} diff -r 648c4d0c52f8 -r ac88c6ab5577 src-db/database/model/tables/AD_TABLE_TREE.xml --- a/src-db/database/model/tables/AD_TABLE_TREE.xml Tue Apr 01 06:51:31 2014 +0000 +++ b/src-db/database/model/tables/AD_TABLE_TREE.xml Thu Apr 03 13:30:46 2014 +0200 @@ -100,6 +100,9 @@ <foreign-key foreignTable="AD_TABLE" name="AD_TABLETREE_AD_TABLE" onDelete="cascade"> <reference local="AD_TABLE_ID" foreign="AD_TABLE_ID"/> </foreign-key> + <foreign-key foreignTable="OBSERDS_DATASOURCE" name="AD_TABLETREE_DATASOURCE"> + <reference local="OBSERDS_DATASOURCE_ID" foreign="OBSERDS_DATASOURCE_ID"/> + </foreign-key> <foreign-key foreignTable="AD_MODULE" name="AD_TABLTREE_AD_MODULE"> <reference local="AD_MODULE_ID" foreign="AD_MODULE_ID"/> </foreign-key> diff -r 648c4d0c52f8 -r ac88c6ab5577 src/org/openbravo/event/PaidStatusEventHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/openbravo/event/PaidStatusEventHandler.java Thu Apr 03 13:30:46 2014 +0200 @@ -0,0 +1,100 @@ +/* + ************************************************************************* + * 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 ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/NeoTech _______________________________________________ Openbravo-commits mailing list Openbravo-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openbravo-commits