details: https://code.openbravo.com/erp/devel/pi/rev/7b78a07d02b6
changeset: 18182:7b78a07d02b6
user: Eduardo Argal <eduardo.argal <at> openbravo.com>
date: Wed Oct 10 10:32:32 2012 +0200
summary: Fixed issue 21873, fixed issue 21874, fixed issue 21661
diffstat:
modules/org.openbravo.client.application/src/org/openbravo/client/application/event/ElementValueEventHandler.java
| 189 +
src-db/database/model/triggers/C_ELEMENTVALUE_TRG.xml
| 126 +-
src-db/database/model/triggers/C_VALIDCOMBINATION_TRG.xml
| 246 --
src-db/database/sourcedata/AD_CALLOUT.xml
| 10 +
src-db/database/sourcedata/AD_COLUMN.xml
| 1022 +++++----
src-db/database/sourcedata/AD_FIELD.xml
| 162 +-
src-db/database/sourcedata/AD_FIELDGROUP.xml
| 9 +
src-db/database/sourcedata/AD_MODEL_OBJECT.xml
| 24 +
src-db/database/sourcedata/AD_MODEL_OBJECT_MAPPING.xml
| 20 +
src-db/database/sourcedata/AD_REFERENCE.xml
| 12 +
src-db/database/sourcedata/OBUISEL_SELECTOR.xml
| 17 +
src-util/modulescript/build/classes/org/openbravo/modulescript/DeleteDuplicateMatchInvoiceData.class
| 0
src-util/modulescript/build/classes/org/openbravo/modulescript/PaymentZeroAmountData.class
| 0
src-util/modulescript/build/classes/org/openbravo/modulescript/UniqueValidCombination.class
| 0
src-util/modulescript/build/classes/org/openbravo/modulescript/UniqueValidCombinationData.class
| 0
src-util/modulescript/src/org/openbravo/modulescript/DeleteDuplicateMatchInvoice_data.xsql
| 2 +-
src-util/modulescript/src/org/openbravo/modulescript/PaymentZeroAmount_data.xsql
| 2 +-
src-util/modulescript/src/org/openbravo/modulescript/UniqueValidCombination.java
| 43 +
src-util/modulescript/src/org/openbravo/modulescript/UniqueValidCombination_data.xsql
| 149 +
src/org/openbravo/erpCommon/ad_callouts/SE_ElementValue_AccountSign.java
| 38 +
20 files changed, 1213 insertions(+), 858 deletions(-)
diffs (truncated from 3850 to 300 lines):
diff -r fbfe1fab2cff -r 7b78a07d02b6
modules/org.openbravo.client.application/src/org/openbravo/client/application/event/ElementValueEventHandler.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++
b/modules/org.openbravo.client.application/src/org/openbravo/client/application/event/ElementValueEventHandler.java
Wed Oct 10 10:32:32 2012 +0200
@@ -0,0 +1,189 @@
+/*
+ *************************************************************************
+ * The contents of this file are subject to the Openbravo Public License
+ * Version 1.1 (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 SLU
+ * All portions are Copyright (C) 2012 Openbravo SLU
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________.
+ ************************************************************************
+ */
+
+package org.openbravo.client.application.event;
+
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.enterprise.event.Observes;
+
+import org.apache.log4j.Logger;
+import org.hibernate.criterion.Order;
+import org.hibernate.criterion.Restrictions;
+import org.openbravo.base.model.Entity;
+import org.openbravo.base.model.ModelProvider;
+import org.openbravo.base.provider.OBProvider;
+import org.openbravo.client.kernel.event.EntityNewEvent;
+import org.openbravo.client.kernel.event.EntityPersistenceEventObserver;
+import org.openbravo.client.kernel.event.EntityUpdateEvent;
+import org.openbravo.dal.service.OBCriteria;
+import org.openbravo.dal.service.OBDal;
+import org.openbravo.model.ad.utility.Tree;
+import org.openbravo.model.ad.utility.TreeNode;
+import org.openbravo.model.financialmgmt.accounting.coa.Element;
+import org.openbravo.model.financialmgmt.accounting.coa.ElementValue;
+
+public class ElementValueEventHandler extends EntityPersistenceEventObserver {
+
+ private static Entity[] entities = { ModelProvider.getInstance().getEntity(
+ ElementValue.ENTITY_NAME) };
+ protected Logger logger = Logger.getLogger(this.getClass());
+
+ @Override
+ protected Entity[] getObservedEntities() {
+ return entities;
+ }
+
+ public void onSave(@Observes EntityNewEvent event) {
+ if (!isValidEvent(event)) {
+ return;
+ }
+ final ElementValue account = (ElementValue) event.getTargetInstance();
+ // If value is not a number account will be folded in the root directory
of the tree. So do
+ // nothing, DB trigger will manage
+ try {
+ new BigInteger(account.getSearchKey());
+ } catch (NumberFormatException e) {
+ return;
+ }
+ doIt(account);
+ }
+
+ public void onUpdate(@Observes EntityUpdateEvent event) {
+ if (!isValidEvent(event)) {
+ return;
+ }
+ final ElementValue account = (ElementValue) event.getTargetInstance();
+ doIt(account);
+ }
+
+ private void doIt(ElementValue account) {
+ boolean isNumber = true;
+ try {
+ new BigInteger(account.getSearchKey());
+ } catch (NumberFormatException e) {
+ isNumber = false;
+ }
+ String rootNode = "0";
+ OBCriteria<TreeNode> obc =
OBDal.getInstance().createCriteria(TreeNode.class);
+ obc.add(Restrictions.eq(TreeNode.PROPERTY_NODE, account.getId()));
+ obc.setMaxResults(1);
+ List<TreeNode> nodes = obc.list();
+ HashMap<String, String> result = getParentAndSeqNo(account);
+ String parent_ID = result.get("ParentID");
+ String seqNo = result.get("SeqNo");
+ if (nodes.size() > 0) {
+ TreeNode node = nodes.get(0);
+ node.setReportSet(!isNumber ? rootNode : parent_ID);
+ node.setSequenceNumber(new Long(seqNo));
+ OBDal.getInstance().save(node);
+ } else {
+ TreeNode treeElement = OBProvider.getInstance().get(TreeNode.class);
+ treeElement.setNode(account.getId());
+ treeElement.setTree(account.getAccountingElement().getTree());
+ treeElement.setReportSet(!isNumber ? rootNode : parent_ID);
+ // System.out.println("ElementValueEventHandler - node_id=" +
account.getId() +
+ // " - parent_id="
+ // + treeElement.getReportSet() + " - Tree_id=" +
treeElement.getTree().getId());
+ treeElement.setSequenceNumber(new Long(seqNo));
+ OBDal.getInstance().save(treeElement);
+ }
+
+ }
+
+ HashMap<String, String> getParentAndSeqNo(ElementValue account) {
+ HashMap<String, String> result = new HashMap<String, String>();
+ // Default values for result
+ result.put("ParentID", "0");
+ result
+ .put("SeqNo",
String.valueOf(getNextSeqNo(account.getAccountingElement().getTree(), "0")));
+ List<ElementValue> accounts =
getAccountList(account.getAccountingElement());
+ ElementValue previousElement = null;
+ if (!accounts.contains(account)) {
+ accounts.remove(account);
+ }
+ for (int i = 0; i < accounts.size(); i++) {
+ if (accounts.get(i).getSearchKey().replace('(', ' ').trim().replace(')',
' ').trim()
+ .compareTo(account.getSearchKey()) < 0) {
+ if (i > 0) {
+ previousElement = accounts.get(i);
+ }
+ }
+ }
+ if (previousElement != null && previousElement.isSummaryLevel() &&
!account.isSummaryLevel()) {
+ result.put("ParentID", previousElement.getId());
+ result.put("SeqNo", "0");
+ } else if (previousElement == null) {
+ return result;
+ } else {
+ OBCriteria<TreeNode> obc =
OBDal.getInstance().createCriteria(TreeNode.class);
+ obc.add(Restrictions.eq(TreeNode.PROPERTY_NODE,
previousElement.getId()));
+ obc.setMaxResults(1);
+ List<TreeNode> nodes = obc.list();
+ result.put("ParentID", nodes.get(0).getReportSet());
+ result.put("SeqNo", String.valueOf(nodes.get(0).getSequenceNumber() +
10));
+ }
+ updateSeqNo(result.get("ParentID"),
account.getAccountingElement().getTree(),
+ result.get("SeqNo"));
+ return result;
+
+ }
+
+ List<ElementValue> getAccountList(Element accountElement) {
+ OBCriteria<ElementValue> obc =
OBDal.getInstance().createCriteria(ElementValue.class);
+ obc.add(Restrictions.eq(ElementValue.PROPERTY_ACCOUNTINGELEMENT,
accountElement));
+ obc.add(Restrictions.eq(ElementValue.PROPERTY_ACTIVE, true));
+ obc.addOrder(Order.asc(ElementValue.PROPERTY_SEARCHKEY));
+ obc.setFilterOnReadableClients(false);
+ obc.setFilterOnReadableOrganization(false);
+ return obc.list();
+ }
+
+ void updateSeqNo(String parentID, Tree tree, String seqNo) {
+ OBCriteria<TreeNode> obc =
OBDal.getInstance().createCriteria(TreeNode.class);
+ obc.add(Restrictions.eq(TreeNode.PROPERTY_TREE, tree));
+ obc.add(Restrictions.eq(TreeNode.PROPERTY_REPORTSET, parentID));
+ obc.add(Restrictions.ge(TreeNode.PROPERTY_SEQUENCENUMBER, new
Long(seqNo)));
+ obc.setFilterOnReadableClients(false);
+ obc.setFilterOnReadableOrganization(false);
+ for (TreeNode node : obc.list()) {
+ node.setSequenceNumber(node.getSequenceNumber() + 10l);
+ OBDal.getInstance().save(node);
+ }
+ return;
+ }
+
+ long getNextSeqNo(Tree tree, String parent_ID) {
+ OBCriteria<TreeNode> obc =
OBDal.getInstance().createCriteria(TreeNode.class);
+ obc.add(Restrictions.eq(TreeNode.PROPERTY_REPORTSET, parent_ID));
+ obc.add(Restrictions.eq(TreeNode.PROPERTY_TREE, tree));
+ obc.addOrder(Order.desc(TreeNode.PROPERTY_SEQUENCENUMBER));
+ obc.setFilterOnReadableClients(false);
+ obc.setFilterOnReadableOrganization(false);
+ List<TreeNode> nodes = obc.list();
+ if (nodes.size() > 0) {
+ return obc.list().get(0).getSequenceNumber() + 10l;
+ } else {
+ return 10l;
+ }
+ }
+
+}
diff -r fbfe1fab2cff -r 7b78a07d02b6
src-db/database/model/triggers/C_ELEMENTVALUE_TRG.xml
--- a/src-db/database/model/triggers/C_ELEMENTVALUE_TRG.xml Wed Oct 10
09:47:15 2012 +0200
+++ b/src-db/database/model/triggers/C_ELEMENTVALUE_TRG.xml Wed Oct 10
10:32:32 2012 +0200
@@ -26,6 +26,8 @@
v_xParent_ID VARCHAR2(32);
v_NextNo VARCHAR2(32);
v_count NUMBER;
+ TYPE RECORD IS REF CURSOR;
+ cur_AcctSchema RECORD;
BEGIN
@@ -52,6 +54,28 @@
FROM AD_Language
WHERE IsActive='Y'
AND IsSystemLanguage='Y';
+ -- Create Valid Combination
+ IF(:new.elementlevel = 'S') THEN
+ FOR cur_AcctSchema IN
+ (SELECT C_AcctSchema_ID
+ FROM C_AcctSchema_Element
+ WHERE C_AcctSchema_Element.C_Element_ID = :new.C_Element_ID
+ )
+ LOOP
+ INSERT INTO C_VALIDCOMBINATION
+ (C_VALIDCOMBINATION_ID, AD_CLIENT_ID,
AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY,
+ UPDATED, UPDATEDBY, ALIAS, COMBINATION,
DESCRIPTION, ISFULLYQUALIFIED,
+ C_ACCTSCHEMA_ID, ACCOUNT_ID, M_PRODUCT_ID,
C_BPARTNER_ID, AD_ORGTRX_ID, C_LOCFROM_ID,
+ C_LOCTO_ID, C_SALESREGION_ID, C_PROJECT_ID,
C_CAMPAIGN_ID, C_ACTIVITY_ID, USER1_ID,
+ USER2_ID)
+ VALUES (
+ GET_UUID(), :new.AD_Client_ID,
:new.AD_Org_ID, :new.IsActive, :new.Created, :new.CreatedBy,
+ :new.Updated, :new.UpdatedBy, :new.value,
:new.value, '', 'Y',
+ cur_AcctSchema.C_AcctSchema_ID,
:new.C_ElementValue_ID, null, null, null, null,
+ null, null, null, null, null, null,
+ null);
+ END LOOP;
+ END IF;
-- Create TreeNode --
-- get AD_Tree_ID + ParentID
SELECT e.AD_Tree_ID,
@@ -64,30 +88,38 @@
AND n.Parent_ID IS NULL
AND e.C_Element_ID=:new.C_Element_ID;
-- DBMS_OUTPUT.PUT_LINE('Tree='||v_xTree_ID||'
Node='||:new.C_ElementValue_ID||' Parent='||v_xParent_ID);
- -- Insert into TreeNode
- INSERT
- INTO AD_TreeNode
- (
- AD_TreeNode_ID, AD_Client_ID, AD_Org_ID, IsActive,
- Created, CreatedBy, Updated,
- UpdatedBy, AD_Tree_ID, Node_ID,
- Parent_ID, SeqNo
- )
- VALUES
- (
- get_uuid(), :new.AD_Client_ID, :new.AD_Org_ID, :new.IsActive,
- :new.Created, :new.CreatedBy, :new.Updated,
- :new.UpdatedBy, v_xTree_ID, :new.C_ElementValue_ID,
- v_xParent_ID,(
- CASE :new.IsSummary
- WHEN 'Y'
- THEN 100
- ELSE 999
- END
- )
- )
- ;
- -- Summary Nodes first
+ SELECT count(*)
+ INTo v_Count
+ FROM AD_TreeNode
+ WHERE node_ID = :new.C_ElementValue_ID
+
+ AND AD_Tree_ID = v_xTree_ID;
+ IF(v_Count = 0) THEN
+ -- Insert into TreeNode
+ INSERT
+ INTO AD_TreeNode
+ (
+ AD_TreeNode_ID, AD_Client_ID, AD_Org_ID, IsActive,
+ Created, CreatedBy, Updated,
+ UpdatedBy, AD_Tree_ID, Node_ID,
+ Parent_ID, SeqNo
+ )
+ VALUES
+ (
+ get_uuid(), :new.AD_Client_ID, :new.AD_Org_ID, :new.IsActive,
+ :new.Created, :new.CreatedBy, :new.Updated,
+ :new.UpdatedBy, v_xTree_ID, :new.C_ElementValue_ID,
+ v_xParent_ID,(
+ CASE :new.IsSummary
+ WHEN 'Y'
+ THEN 100
+ ELSE 999
+ END
+ )
+ )
+ ;
+ -- Summary Nodes first
+ END IF;
END IF;
-- Inserting
-- C_ElementValue update trigger
@@ -95,9 +127,15 @@
IF UPDATING THEN
IF COALESCE(:old.Name, '.') <> COALESCE(:NEW.Name, '.') THEN
------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits