diff --git a/extend/.classpath b/extend/.classpath new file mode 100644 index 0000000000..d9ff3607d8 --- /dev/null +++ b/extend/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/extend/.project b/extend/.project new file mode 100644 index 0000000000..3c215760cb --- /dev/null +++ b/extend/.project @@ -0,0 +1,22 @@ + + + extend + + + base + dbPort + looks + print + tools + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/extend/Extend.html b/extend/Extend.html new file mode 100644 index 0000000000..f45d5f8d81 --- /dev/null +++ b/extend/Extend.html @@ -0,0 +1,26 @@ + + + +Project Extend.jpx + + +

Project Notes

+
+ +Project: Product Extensions
+Author: Jorg Janke
+Version: $Id: Extend.html,v 1.1 2006/04/21 17:55:19 jjanke Exp $
+
+Description:
+Create Jar Extend.jar to be included in Base => Client. +Example of extensions +
+Things to do...
+
+ + + diff --git a/extend/RUN_build.bat b/extend/RUN_build.bat new file mode 100644 index 0000000000..e229894a29 --- /dev/null +++ b/extend/RUN_build.bat @@ -0,0 +1,19 @@ +@Title Build Extend +@Rem $Header: /cvsroot/adempiere/extend/RUN_build.bat,v 1.9 2005/09/16 00:49:02 jjanke Exp $ + +@CALL ..\utils_dev\myDevEnv.bat +@IF NOT %ADEMPIERE_ENV%==Y GOTO NOBUILD + +@echo Cleanup ... +@"%JAVA_HOME%\bin\java" -Dant.home="." %ANT_PROPERTIES% org.apache.tools.ant.Main clean + +@echo Building ... +@"%JAVA_HOME%\bin\java" -Dant.home="." %ANT_PROPERTIES% org.apache.tools.ant.Main dist + +@Echo Done ... +@sleep 60 +@exit + +:NOBUILD +@Echo Check myDevEnv.bat (copy from myDevEnvTemplate.bat) +@Pause diff --git a/extend/RUN_build.sh b/extend/RUN_build.sh new file mode 100644 index 0000000000..5f80633c60 --- /dev/null +++ b/extend/RUN_build.sh @@ -0,0 +1,18 @@ +# Module compiling script +# Ported from Windows script Marek Mosiewicz + + +SAVED_DIR=`pwd` #save current dir +cd `dirname $0`/../utils_dev #change dir to place where script resides - doesn not work with sym links +UTILS_DEV=`pwd` #this is adempiere source +cd $SAVED_DIR #back to the saved directory + +. $UTILS_DEV/myDevEnv.sh #call environment +echo done +if [ ! $ADEMPIERE_ENV==Y ] ; then + echo "Can't set developemeent environemnt - check myDevEnv.sh" + exit 1 +fi + +echo running Ant +$JAVA_HOME/bin/java -Dant.home="." $ANT_PROPERTIES org.apache.tools.ant.Main diff --git a/extend/build.xml b/extend/build.xml new file mode 100644 index 0000000000..b6edcef164 --- /dev/null +++ b/extend/build.xml @@ -0,0 +1,80 @@ + + + + + + + + + This buildfile is used to build the extend subproject within + the Adempiere project. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extend/database/XX_View.sql b/extend/database/XX_View.sql new file mode 100644 index 0000000000..b62563f71a --- /dev/null +++ b/extend/database/XX_View.sql @@ -0,0 +1,34 @@ +/** + * Example View DDL SQL + * + * @author Jorg Janke + * @version $Id: XX_View.sql,v 1.1 2006/04/21 17:55:19 jjanke Exp $ + */ + +-- Inspect data +SELECT C_Invoice_ID, + AD_Client_ID,AD_Org_ID, IsActive, Created,CreatedBy, Updated,UpdatedBy, + IsSOTrx, DocumentNo, DocStatus, DocAction, Processed, + SalesRep_ID, DateInvoiced, DatePrinted, DateAcct, + C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID, + C_Currency_ID, + TotalLines, GrandTotal, + Multiplier, MultiplierAP, DocBaseType +FROM C_Invoice_V +/ + +-- The view +CREATE OR REPLACE VIEW XX_BPartner_Total +AS +SELECT AD_Client_ID,AD_Org_ID, + 'Y' AS IsActive, SysDate AS Created, 0 AS CreatedBy, SysDate AS Updated, 0 AS UpdatedBy, + C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID, + C_Currency_ID, + SUM(InvoiceOpen (C_Invoice_ID, 0) * MultiplierAP) AS OpenAmount +FROM C_Invoice_V +WHERE Processed='Y' + AND IsPaid='N' +GROUP BY AD_Client_ID,AD_Org_ID, + C_BPartner_ID, C_BPartner_Location_ID, AD_User_ID, + C_Currency_ID +/ diff --git a/extend/database/XX_Visit.sql b/extend/database/XX_Visit.sql new file mode 100644 index 0000000000..50473f3e7e --- /dev/null +++ b/extend/database/XX_Visit.sql @@ -0,0 +1,43 @@ +/** + * Example Table DDL SQL + * + * @author Jorg Janke + * @version $Id: XX_Visit.sql,v 1.1 2006/04/21 17:55:19 jjanke Exp $ + */ +CREATE TABLE XX_Visit( + XX_Visit_ID NUMBER(10, 0) NOT NULL, + AD_Client_ID NUMBER(10, 0) NOT NULL, + AD_Org_ID NUMBER(10, 0) NOT NULL, + IsActive CHAR(1) DEFAULT 'Y' NOT NULL + CHECK (IsActive in ('Y','N')), + Created DATE DEFAULT SYSDATE NOT NULL, + CreatedBy NUMBER(10, 0) NOT NULL, + Updated DATE DEFAULT SYSDATE NOT NULL, + UpdatedBy NUMBER(10, 0) NOT NULL, + Name NVARCHAR2(60) NOT NULL, + Description NVARCHAR2(255), + VisitTime DATE NOT NULL, + Minutes NUMBER(10, 0) NOT NULL, + C_BPartner_ID NUMBER(10, 0) NOT NULL, + C_BPartner_Location_ID NUMBER(10, 0) NOT NULL, + AD_User_ID NUMBER(10, 0) NOT NULL, + SalesRep_ID NUMBER(10, 0) NOT NULL, + R_InterestArea_ID NUMBER(10, 0) NOT NULL, + Processed CHAR(1), + Processing CHAR(1), + CONSTRAINT XX_Visit_Key PRIMARY KEY (XX_Visit_ID), + CONSTRAINT CBPLoction_XXVisit FOREIGN KEY (C_BPartner_Location_ID) + REFERENCES C_BPartner_Location(C_BPartner_Location_ID), + CONSTRAINT ADUser_XXVisit FOREIGN KEY (AD_User_ID) + REFERENCES AD_User(AD_User_ID), + CONSTRAINT RInterestArea_XXVisit FOREIGN KEY (R_InterestArea_ID) + REFERENCES R_InterestArea(R_InterestArea_ID), + CONSTRAINT ADUserSalesRep_XXVisit FOREIGN KEY (SalesRep_ID) + REFERENCES AD_User(AD_User_ID), + CONSTRAINT CBPartner_XXVisit FOREIGN KEY (C_BPartner_ID) + REFERENCES C_BPartner(C_BPartner_ID) +) +/ + + + diff --git a/extend/documentation.bat b/extend/documentation.bat new file mode 100644 index 0000000000..659c934f80 --- /dev/null +++ b/extend/documentation.bat @@ -0,0 +1,5 @@ +@Rem API Documentation for Base + +call ..\doc\documentation.bat src doc -private + +@pause \ No newline at end of file diff --git a/extend/packages.txt b/extend/packages.txt new file mode 100644 index 0000000000..1079f34961 --- /dev/null +++ b/extend/packages.txt @@ -0,0 +1 @@ +com.adempiere.custom diff --git a/extend/src/compiere/model/CalloutUser.java b/extend/src/compiere/model/CalloutUser.java new file mode 100644 index 0000000000..fea436c456 --- /dev/null +++ b/extend/src/compiere/model/CalloutUser.java @@ -0,0 +1,220 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package compiere.model; + +import java.sql.*; +import java.util.*; +import org.compiere.model.*; +import java.util.logging.*; +import org.compiere.util.*; + +/** + * User Callout Example. + * + * @author Jorg Janke + * @version $Id: CalloutUser.java,v 1.2 2006/07/30 00:51:57 jjanke Exp $ + */ +public class CalloutUser extends CalloutEngine +{ + /** + * JustAnExample. + * The string in the Callout field is: + * com.adempiere.custom.CalloutEngine.justAnExample + * + * @param ctx Context + * @param WindowNo current Window No + * @param mTab Model Tab + * @param mField Model Field + * @param value The new value + * @param oldValue The old value + * @return error message or "" if OK + */ + public String justAnExample (Properties ctx, int WindowNo, + GridTab mTab, GridField mField, Object value, Object oldValue) + { + log.info("JustAnExample"); + return ""; + } // justAnExample + + + + /** + * Invoice Header- BPartner. + * - C_BPartner_Location_ID + * - AD_User_ID + * @param ctx Context + * @param WindowNo current Window No + * @param mTab Model Tab + * @param mField Model Field + * @param value The new value + * @param oldValue The old value + * @return error message + */ + public String bPartner (Properties ctx, int WindowNo, + GridTab mTab, GridField mField, Object value, Object oldValue) + { + Integer C_BPartner_ID = (Integer)value; + if (C_BPartner_ID == null || C_BPartner_ID.intValue() == 0) + return ""; + + String sql = "SELECT p.AD_Language,p.C_PaymentTerm_ID," + + " COALESCE(p.M_PriceList_ID,g.M_PriceList_ID) AS M_PriceList_ID, p.PaymentRule,p.POReference," + + " p.SO_Description,p.IsDiscountPrinted," + + " p.SO_CreditLimit, p.SO_CreditLimit-p.SO_CreditUsed AS CreditAvailable," + + " l.C_BPartner_Location_ID,c.AD_User_ID," + + " COALESCE(p.PO_PriceList_ID,g.PO_PriceList_ID) AS PO_PriceList_ID, p.PaymentRulePO,p.PO_PaymentTerm_ID " + + "FROM C_BPartner p" + + " INNER JOIN C_BP_Group g ON (p.C_BP_Group_ID=g.C_BP_Group_ID)" + + " LEFT OUTER JOIN C_BPartner_Location l ON (p.C_BPartner_ID=l.C_BPartner_ID AND l.IsBillTo='Y' AND l.IsActive='Y')" + + " LEFT OUTER JOIN AD_User c ON (p.C_BPartner_ID=c.C_BPartner_ID) " + + "WHERE p.C_BPartner_ID=? AND p.IsActive='Y'"; // #1 + + try + { + PreparedStatement pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, C_BPartner_ID.intValue()); + ResultSet rs = pstmt.executeQuery(); + // + if (rs.next()) + { + // Location + int locID = rs.getInt("C_BPartner_Location_ID"); + // overwritten by InfoBP selection - works only if InfoWindow + // was used otherwise creates error (uses last value, may belong to differnt BP) + if (C_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) + { + String loc = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_Location_ID"); + if (loc.length() > 0) + locID = Integer.parseInt(loc); + } + if (locID == 0) + mTab.setValue("C_BPartner_Location_ID", null); + else + mTab.setValue("C_BPartner_Location_ID", new Integer(locID)); + + // Contact - overwritten by InfoBP selection + int contID = rs.getInt("AD_User_ID"); + if (C_BPartner_ID.toString().equals(Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "C_BPartner_ID"))) + { + String cont = Env.getContext(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "AD_User_ID"); + if (cont.length() > 0) + contID = Integer.parseInt(cont); + } + if (contID == 0) + mTab.setValue("AD_User_ID", null); + else + mTab.setValue("AD_User_ID", new Integer(contID)); + } + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, sql, e); + return e.getLocalizedMessage(); + } + + return ""; + } // bPartner + + + + + + + + + + + + /************************************************************************** + * Frie Value - convert to standardized Name + * + * @param value Name + * @return Name + */ + public String Frie_Name (String value) + { + if (value == null || value.length() == 0) + return ""; + // + String retValue = value; + String SQL = "SELECT FRIE_Name(?) FROM DUAL"; + try + { + PreparedStatement pstmt = DB.prepareStatement(SQL, null); + pstmt.setString(1, value); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + retValue = rs.getString(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, SQL, e); + } + return retValue; + } // Frie_Name + + + /** + * Frie Value - convert Name to Value + * + * @param value Name + * @return Value of Name + */ + public String Frie_Value (String value) + { + if (value == null || value.length() == 0) + return ""; + // + String retValue = value; + String SQL = "SELECT FRIE_Value(FRIE_Name(?)) FROM DUAL"; + try + { + PreparedStatement pstmt = DB.prepareStatement(SQL, null); + pstmt.setString(1, value); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + retValue = rs.getString(1); + rs.close(); + pstmt.close(); + } + catch (SQLException e) + { + log.log(Level.SEVERE, SQL, e); + } + return retValue; + } // Frie_Value + + + /** + * Frie Status - convert to Status. + * + * @param value value + * @return Status + */ + public String Frie_Status (String value) + { + String retValue = "N"; // default + if (value != null && value.equals("A")) // Auslaufartikel + retValue = "Y"; // + return retValue; + } // Frie_Status + +} // CalloutUser diff --git a/extend/src/compiere/model/MVisit.java.txt b/extend/src/compiere/model/MVisit.java.txt new file mode 100644 index 0000000000..e1e7824052 --- /dev/null +++ b/extend/src/compiere/model/MVisit.java.txt @@ -0,0 +1,63 @@ +/****************************************************************************** + * The contents of this file are subject to the Adempiere License Version 1.1 + * ("License"); You may not use this file except in compliance with the License + * You may obtain a copy of the License at http://www.adempiere.org/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 Adempiere ERP & CRM Smart Business Solution. The Initial + * Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke + * are Copyright (C) 1999-2006 Jorg Janke. + * All parts are Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. + * Contributor(s): ______________________________________. + *****************************************************************************/ +package adempiere.model; + +import java.sql.ResultSet; +import java.util.Properties; + +/** + * Visit Business Model + * + * @author Jorg Janke + * @version $Id: MVisit.java.txt,v 1.1 2006/04/21 17:55:19 jjanke Exp $ + */ +public class MVisit extends X_XX_Visit +{ + /** + * Standard Constructor + * @param ctx context + * @param XX_Visit_ID id + * @param trxName transaction + */ + public MVisit(Properties ctx, int XX_Visit_ID, String trxName) + { + super(ctx, XX_Visit_ID, trxName); + } // MVisit + + /** + * Load Constructor + * @param ctx context + * @param rs result set + * @param trxName transaction + */ + public MVisit(Properties ctx, ResultSet rs, String trxName) + { + super(ctx, rs, trxName); + } // MVisit + + /** + * Before Save "Trigger" + * @param newRecord new + * @return true if can be saved + */ + protected boolean beforeSave(boolean newRecord) + { + // Invoice at least 5 minutes + if (newRecord && getMinutes() < 5) + setMinutes(5); + + return true; + } // beforeSave + +} // MVisit diff --git a/extend/src/compiere/model/MyModelExample.java b/extend/src/compiere/model/MyModelExample.java new file mode 100644 index 0000000000..4ffc67cd89 --- /dev/null +++ b/extend/src/compiere/model/MyModelExample.java @@ -0,0 +1,84 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package compiere.model; + +import java.sql.*; +import java.util.*; + +import org.compiere.model.*; + + +/** + * This is a non-working example of a Persistent Business Object. + * You would extend the class generated by GenerateModel.java + * + * @author Jorg Janke + * @version $Id: MyModelExample.java,v 1.2 2006/07/30 00:51:57 jjanke Exp $ + */ +public class MyModelExample extends PO +{ + /** + * Standard constructor. + * You must implement this constructor for Adempiere Persistency + * @param ctx context + * @param ID the primary key ID + * @param trxName transaction + */ + public MyModelExample (Properties ctx, int ID, String trxName) + { + super (ctx, ID, trxName); + } // MyModelExample + + /** + * Optional Load Constructor. + * You would use this constructor to load several business objects. + * + * SELECT * FROM MyModelExample WHERE ... + * + * @param ctx context + * @param rs result set + * @param trxName transaction + */ + public MyModelExample (Properties ctx, ResultSet rs, String trxName) + { + super (ctx, rs, trxName); + } // MyModelExample + + + + /** + * Init Persistent Object. + * You would NOT create this method as it is created by the persistency + * class generated by GenerateModel.java + * @param ctx context + * @return PO information + */ + protected POInfo initPO (Properties ctx) + { + return null; + } // initPO + + /** + * Get Access Level + * @return access level + */ + protected int get_AccessLevel() + { + return 0; + } // get_AccessLevel + +} // MyModelExample diff --git a/extend/src/compiere/model/MyValidator.java b/extend/src/compiere/model/MyValidator.java new file mode 100644 index 0000000000..c96fc819bc --- /dev/null +++ b/extend/src/compiere/model/MyValidator.java @@ -0,0 +1,200 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package compiere.model; + +import java.math.*; +import org.compiere.model.*; +import org.compiere.util.*; + + +/** + * Validator Example Implementation + * + * @author Jorg Janke + * @version $Id: MyValidator.java,v 1.2 2006/07/30 00:51:57 jjanke Exp $ + */ +public class MyValidator implements ModelValidator +{ + /** + * Constructor. + * The class is instanciated when logging in and client is selected/known + */ + public MyValidator () + { + super (); + } // MyValidator + + /** Logger */ + private static CLogger log = CLogger.getCLogger(MyValidator.class); + /** Client */ + private int m_AD_Client_ID = -1; + + + /** + * Initialize Validation + * @param engine validation engine + * @param client client + */ + public void initialize (ModelValidationEngine engine, MClient client) + { + m_AD_Client_ID = client.getAD_Client_ID(); + if (m_AD_Client_ID != 11) // GardenWorld Example + return; + log.info(client.toString()); + + // We want to be informed when C_Order is created/changed + engine.addModelChange("C_Order", this); + // We want to validate Order before preparing + engine.addDocValidate("C_Order", this); + } // initialize + + /** + * Model Change of a monitored Table. + * Called after PO.beforeSave/PO.beforeDelete + * when you called addModelChange for the table + * @param po persistent object + * @param type TYPE_ + * @return error message or null + * @exception Exception if the recipient wishes the change to be not accept. + */ + public String modelChange (PO po, int type) throws Exception + { + if (po.get_TableName().equals("C_Order") && type == TYPE_CHANGE) + { + MOrder order = (MOrder)po; + log.info(po.toString()); + } + return null; + } // modelChange + + /** + * Validate Document. + * Called as first step of DocAction.prepareIt + * when you called addDocValidate for the table. + * Note that totals, etc. may not be correct. + * @param po persistent object + * @param timing see TIMING_ constants + * @return error message or null + */ + public String docValidate (PO po, int timing) + { + // Ignore all after Complete events + if (timing == TIMING_AFTER_COMPLETE) + return null; + // TIMING_BEFORE_PREPARE + if (po.get_TableName().equals(MOrder.Table_Name)) + { + /** Order Discount Example * + MOrder order = (MOrder)po; + String error = orderDiscount(order); + if (error != null) + return error; + /** Order Discount Example */ + log.info(po.toString()); + } + return null; + } // docValidate + + /** + * Order Discount. + * Make sure that last line is discount and check correctness + * @param order order + * @return error message or null + */ + private String orderDiscount (MOrder order) + { + String DISCOUNT = "Discount"; + int C_Tax_ID = 0; + BigDecimal totalLines = Env.ZERO; + MOrderLine discountLine = null; + // + MOrderLine[] lines = order.getLines(); + for (int i = 0; i < lines.length; i++) + { + MOrderLine oLine = lines[i]; + String description = oLine.getDescription(); + if (description != null && description.equals(DISCOUNT)) + discountLine = oLine; + else + { + totalLines = totalLines.add(oLine.getLineNetAmt()); + if (C_Tax_ID == 0) + C_Tax_ID = oLine.getC_Tax_ID(); + else if (C_Tax_ID != oLine.getC_Tax_ID()) + return "Order has more then one Tax, cannot add discount"; + } + } + if (discountLine == null) + { + discountLine = new MOrderLine(order); + discountLine.setDescription(DISCOUNT); + discountLine.setQty(Env.ONE); + discountLine.setC_Tax_ID(C_Tax_ID); + discountLine.setLine(9999); + } + // Calculate Discount + BigDecimal discountPercent = new BigDecimal(3); // 3% example + BigDecimal discountAmt = totalLines.multiply(discountPercent); + discountAmt = discountAmt.divide(Env.ONEHUNDRED, order.getPrecision(), BigDecimal.ROUND_HALF_UP); + discountLine.setPrice(discountAmt.negate()); + if (!discountLine.save()) + return "Could not save discount line"; + + log.info(discountLine.toString()); + order.getLines(true, null); + return null; + } // orderDiscount + + + + /** + * User Login. + * Called when preferences are set + * @param AD_Org_ID org + * @param AD_Role_ID role + * @param AD_User_ID user + * @return error message or null + */ + public String login (int AD_Org_ID, int AD_Role_ID, int AD_User_ID) + { + log.info("AD_User_ID=" + AD_User_ID); + return null; + } // login + + + /** + * Get Client to be monitored + * @return AD_Client_ID client + */ + public int getAD_Client_ID() + { + return m_AD_Client_ID; + } // getAD_Client_ID + + + /** + * String Representation + * @return info + */ + public String toString () + { + StringBuffer sb = new StringBuffer ("MyValidator[Order@Gardenworld"); + sb.append ("]"); + return sb.toString (); + } // toString + +} // MyValidator diff --git a/extend/src/compiere/model/XXVisitInvoice.java.txt b/extend/src/compiere/model/XXVisitInvoice.java.txt new file mode 100644 index 0000000000..158b92672d --- /dev/null +++ b/extend/src/compiere/model/XXVisitInvoice.java.txt @@ -0,0 +1,96 @@ +/****************************************************************************** + * The contents of this file are subject to the Adempiere License Version 1.1 + * ("License"); You may not use this file except in compliance with the License + * You may obtain a copy of the License at http://www.adempiere.org/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 Adempiere ERP & CRM Smart Business Solution. The Initial + * Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke + * are Copyright (C) 1999-2006 Jorg Janke. + * All parts are Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. + * Contributor(s): ______________________________________. + *****************************************************************************/ +package adempiere.model; + +import java.math.BigDecimal; + +import org.compiere.model.*; +import org.compiere.process.SvrProcess; +import org.compiere.util.AdempiereSystemError; +import org.compiere.util.AdempiereUserError; + +/** + * Generate Invoice for Visit Process + * + * @author Jorg Janke + * @version $Id: XXVisitInvoice.java.txt,v 1.1 2006/04/21 17:55:19 jjanke Exp $ + */ +public class XXVisitInvoice extends SvrProcess +{ + /** Parameter */ + private int p_XX_Visit_ID = 0; + + /** + * Prepare + * @see org.compiere.process.SvrProcess#prepare() + */ + protected void prepare() + { + p_XX_Visit_ID = getRecord_ID(); + } // prepare + + /** + * Process + * @see org.compiere.process.SvrProcess#doIt() + * @return summary + * @throws Exception + */ + protected String doIt() throws Exception + { + log.info("XX_Visit_ID=" + p_XX_Visit_ID); + MVisit visit = new MVisit (getCtx(), p_XX_Visit_ID, get_TrxName()); + if (visit.get_ID() == 0 || visit.get_ID() != p_XX_Visit_ID) + throw new AdempiereSystemError("@NotFound@ @XX_Visit_ID@ " + p_XX_Visit_ID); + // Nothing to do + if (visit.isProcessed()) + throw new AdempiereUserError("@XX_Visit_ID@ @Processed@"); + // Create Invoice Header + MInvoice invoice = new MInvoice (getCtx(), 0, get_TrxName()); + invoice.setIsSOTrx(true); + invoice.setC_DocTypeTarget_ID(); + // Set Business Partner + MBPartner bp = new MBPartner (getCtx(), visit.getC_BPartner_ID(), null); + invoice.setBPartner(bp); + invoice.setC_BPartner_Location_ID(visit.getC_BPartner_Location_ID()); + invoice.setAD_User_ID(visit.getAD_User_ID()); + // Other Invoice Details + invoice.setSalesRep_ID(visit.getSalesRep_ID()); + invoice.setDescription(visit.getName()); + if (!invoice.save()) + throw new AdempiereSystemError("Could not save Invoice"); + + // Create Invoice Line + MInvoiceLine line = new MInvoiceLine(invoice); + line.setQty(visit.getMinutes()); + line.setPrice(new BigDecimal(5)); + line.setDescription(visit.getDescription()); + if (line.getDescription() == null) + line.setDescription(visit.getName()); + line.setTax(); + if (!line.save()) + throw new AdempiereSystemError("Could not save invoice line"); + + // Update Visit + visit.setProcessed(true); + visit.save(); + + // Process Invoice + invoice.setDocAction(MInvoice.DOCACTION_Complete); + invoice.processIt(MInvoice.DOCACTION_Complete); + invoice.save(); + + return "@C_Invoice_ID@ " + invoice.getDocumentNo(); + } // doIt + +} // XXVisitInvoice diff --git a/extend/src/compiere/model/X_XX_Visit.java.txt b/extend/src/compiere/model/X_XX_Visit.java.txt new file mode 100644 index 0000000000..11e22aa121 --- /dev/null +++ b/extend/src/compiere/model/X_XX_Visit.java.txt @@ -0,0 +1,285 @@ +/** Generated Model - DO NOT CHANGE - Copyright (C) 1999-2005 Jorg Janke */ +package adempiere.model; + +import org.compiere.model.*; +import java.util.*; +import java.sql.*; +import java.math.*; +import org.compiere.util.*; + +/** + * Generated Model for XX_Visit + * + * @author Jorg Janke (generated) + * @version Release 2.5.3c - 2006-03-08 11:13:42.216 + */ +public class X_XX_Visit extends PO { + /** Standard Constructor */ + public X_XX_Visit(Properties ctx, int XX_Visit_ID, String trxName) { + super(ctx, XX_Visit_ID, trxName); + /** + * if (XX_Visit_ID == 0) { setAD_User_ID (0); setC_BPartner_ID (0); + * setC_BPartner_Location_ID (0); setMinutes (0); setName (null); + * setR_InterestArea_ID (0); setSalesRep_ID (0); setVISITTIME (new + * Timestamp(System.currentTimeMillis())); setXX_Visit_ID (0); } + */ + } + + /** Load Constructor */ + public X_XX_Visit(Properties ctx, ResultSet rs, String trxName) { + super(ctx, rs, trxName); + } + + /** AD_Table_ID=1000001 */ + public static final int Table_ID = 1000001; + + /** TableName=XX_Visit */ + public static final String Table_Name = "XX_Visit"; + + protected static KeyNamePair Model = new KeyNamePair(1000001, "XX_Visit"); + + protected BigDecimal accessLevel = new BigDecimal(1); + + /** AccessLevel 1 - Org */ + protected int get_AccessLevel() { + return accessLevel.intValue(); + } + + /** Load Meta Data */ + protected POInfo initPO(Properties ctx) { + POInfo poi = POInfo.getPOInfo(ctx, Table_ID); + return poi; + } + + public String toString() { + StringBuffer sb = new StringBuffer("X_XX_Visit[").append(get_ID()) + .append("]"); + return sb.toString(); + } + + /** + * Set User/Contact. User within the system - Internal or Business Partner + * Contact + */ + public void setAD_User_ID(int AD_User_ID) { + if (AD_User_ID < 1) + throw new IllegalArgumentException("AD_User_ID is mandatory."); + set_Value("AD_User_ID", new Integer(AD_User_ID)); + } + + /** + * Get User/Contact. User within the system - Internal or Business Partner + * Contact + */ + public int getAD_User_ID() { + Integer ii = (Integer) get_Value("AD_User_ID"); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** + * Set Business Partner . Identifies a Business Partner + */ + public void setC_BPartner_ID(int C_BPartner_ID) { + if (C_BPartner_ID < 1) + throw new IllegalArgumentException("C_BPartner_ID is mandatory."); + set_Value("C_BPartner_ID", new Integer(C_BPartner_ID)); + } + + /** + * Get Business Partner . Identifies a Business Partner + */ + public int getC_BPartner_ID() { + Integer ii = (Integer) get_Value("C_BPartner_ID"); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** + * Set Partner Location. Identifies the (ship to) address for this Business + * Partner + */ + public void setC_BPartner_Location_ID(int C_BPartner_Location_ID) { + if (C_BPartner_Location_ID < 1) + throw new IllegalArgumentException( + "C_BPartner_Location_ID is mandatory."); + set_Value("C_BPartner_Location_ID", new Integer(C_BPartner_Location_ID)); + } + + /** + * Get Partner Location. Identifies the (ship to) address for this Business + * Partner + */ + public int getC_BPartner_Location_ID() { + Integer ii = (Integer) get_Value("C_BPartner_Location_ID"); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** + * Set Description. Optional short description of the record + */ + public void setDescription(String Description) { + if (Description != null && Description.length() > 255) { + log.warning("Length > 255 - truncated"); + Description = Description.substring(0, 254); + } + set_Value("Description", Description); + } + + /** + * Get Description. Optional short description of the record + */ + public String getDescription() { + return (String) get_Value("Description"); + } + + /** + * Set Minutes. Minutes spent with the BPatyner + */ + public void setMinutes(int Minutes) { + set_Value("Minutes", new Integer(Minutes)); + } + + /** + * Get Minutes. Minutes spent with the BPatyner + */ + public int getMinutes() { + Integer ii = (Integer) get_Value("Minutes"); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** + * Set Name. Alphanumeric identifier of the entity + */ + public void setName(String Name) { + if (Name == null) + throw new IllegalArgumentException("Name is mandatory."); + if (Name.length() > 120) { + log.warning("Length > 120 - truncated"); + Name = Name.substring(0, 119); + } + set_Value("Name", Name); + } + + /** + * Get Name. Alphanumeric identifier of the entity + */ + public String getName() { + return (String) get_Value("Name"); + } + + public KeyNamePair getKeyNamePair() { + return new KeyNamePair(get_ID(), getName()); + } + + /** + * Set Processed. The document has been processed + */ + public void setProcessed(boolean Processed) { + set_Value("Processed", new Boolean(Processed)); + } + + /** + * Get Processed. The document has been processed + */ + public boolean isProcessed() { + Object oo = get_Value("Processed"); + if (oo != null) { + if (oo instanceof Boolean) + return ((Boolean) oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + + /** Set Process Now */ + public void setProcessing(boolean Processing) { + set_Value("Processing", new Boolean(Processing)); + } + + /** Get Process Now */ + public boolean isProcessing() { + Object oo = get_Value("Processing"); + if (oo != null) { + if (oo instanceof Boolean) + return ((Boolean) oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + + /** + * Set Interest Area. Interest Area or Topic + */ + public void setR_InterestArea_ID(int R_InterestArea_ID) { + if (R_InterestArea_ID < 1) + throw new IllegalArgumentException( + "R_InterestArea_ID is mandatory."); + set_Value("R_InterestArea_ID", new Integer(R_InterestArea_ID)); + } + + /** + * Get Interest Area. Interest Area or Topic + */ + public int getR_InterestArea_ID() { + Integer ii = (Integer) get_Value("R_InterestArea_ID"); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** SalesRep_ID AD_Reference_ID=190 */ + public static final int SALESREP_ID_AD_Reference_ID = 190; + + /** + * Set Sales Representative. Sales Representative or Company Agent + */ + public void setSalesRep_ID(int SalesRep_ID) { + if (SalesRep_ID < 1) + throw new IllegalArgumentException("SalesRep_ID is mandatory."); + set_Value("SalesRep_ID", new Integer(SalesRep_ID)); + } + + /** + * Get Sales Representative. Sales Representative or Company Agent + */ + public int getSalesRep_ID() { + Integer ii = (Integer) get_Value("SalesRep_ID"); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** Set VISITTIME */ + public void setVISITTIME(Timestamp VISITTIME) { + if (VISITTIME == null) + throw new IllegalArgumentException("VISITTIME is mandatory."); + set_Value("VISITTIME", VISITTIME); + } + + /** Get VISITTIME */ + public Timestamp getVISITTIME() { + return (Timestamp) get_Value("VISITTIME"); + } + + /** Set Visit */ + public void setXX_Visit_ID(int XX_Visit_ID) { + if (XX_Visit_ID < 1) + throw new IllegalArgumentException("XX_Visit_ID is mandatory."); + set_ValueNoCheck("XX_Visit_ID", new Integer(XX_Visit_ID)); + } + + /** Get Visit */ + public int getXX_Visit_ID() { + Integer ii = (Integer) get_Value("XX_Visit_ID"); + if (ii == null) + return 0; + return ii.intValue(); + } +} diff --git a/extend/src/org/compiere/test/OrderTest.java b/extend/src/org/compiere/test/OrderTest.java new file mode 100644 index 0000000000..9543fe0f0f --- /dev/null +++ b/extend/src/org/compiere/test/OrderTest.java @@ -0,0 +1,180 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.compiere.test; + +import java.math.*; +import java.util.*; +import java.util.logging.*; +import org.compiere.*; +import org.compiere.model.*; +import org.compiere.process.*; +import org.compiere.util.*; + + +/** + * Order Test Example + * + * @author Jorg Janke + * @version $Id: OrderTest.java,v 1.2 2006/07/30 00:51:57 jjanke Exp $ + */ +public class OrderTest implements Runnable +{ + /** + * OrderTest + * @param no thread number + * @param numberOrders number of orders to create + */ + public OrderTest (int no, int numberOrders, int avgLines) + { + super (); + m_no = no; + m_numberOrders = numberOrders; + m_maxLines = avgLines * 2; + } // OrderTest + + int m_no = 0; + int m_numberOrders = 0; + int m_maxLines = 20; + + int m_errors = 0; + /** Logger */ + private static CLogger log = CLogger.getCLogger (OrderTest.class); + + /** + * Run + */ + public void run() + { + long time = System.currentTimeMillis(); + int count = 0; + MBPartner bp = new MBPartner(Env.getCtx(), 117, null); + bp.setSOCreditStatus(MBPartner.SOCREDITSTATUS_NoCreditCheck); + bp.save(); + + // + for (int i = 0; i < m_numberOrders; i++) + { + Trx trx = Trx.get(Trx.createTrxName("Test" + m_no + "_" + i),true); + trx.start(); + // + MOrder order = new MOrder(Env.getCtx(),0,trx.getTrxName()); + order.setDescription("#" + m_no + "_" + i); + order.setC_DocTypeTarget_ID(135); // POS + order.setC_BPartner_ID(117); // C&W + order.setSalesRep_ID(101); // GardenAdmin + order.setDeliveryRule(MOrder.DELIVERYRULE_Force); + if (!order.save()) + { + log.warning("#" + m_no + "_" + i + ": Not saved(1)"); + m_errors++; + continue; + } + Random r = new Random(); + int linesNumber = r.nextInt(m_maxLines) + 1; + for (int j = 0; j < linesNumber; j++) + { + MOrderLine line = new MOrderLine(order); + line.setM_Product_ID(123); // Oak Tree + line.setQty(new BigDecimal(5)); + if (!line.save()) + { + log.warning("#" + m_no + "_" + i + ": Line not saved"); + m_errors++; + } + } + // Process + order.setDocAction(DocAction.ACTION_Complete); + if (!order.processIt(DocAction.ACTION_Complete)) + { + log.warning("#" + m_no + "_" + i + ": Not processed"); + m_errors++; + trx.rollback(); + trx.close(); + continue; + } + if (!order.save()) + { + log.warning("#" + m_no + "_" + i + ": Not saved(2)"); + m_errors++; + } + else + count++; + trx.commit(); + trx.close(); + // + log.info(order.toString()); + } + time = System.currentTimeMillis() - time; + log.warning("#" + m_no + ", Errors=" + m_errors + + ", Count=" + count + + " " + ((float)count*100/m_numberOrders) + + "% - " + time + "ms - ea " + ((float)time/count) + "ms"); + } // run + + /** + * Test + * @param args ignored + */ + public static void main (String[] args) + { + Adempiere.startup(true); + CLogMgt.setLoggerLevel(Level.INFO, null); + CLogMgt.setLevel(Level.INFO); + // + Ini.setProperty(Ini.P_UID,"SuperUser"); + Ini.setProperty(Ini.P_PWD,"System"); + Ini.setProperty(Ini.P_ROLE,"GardenWorld Admin"); + Ini.setProperty(Ini.P_CLIENT, "GardenWorld"); + Ini.setProperty(Ini.P_ORG,"HQ"); + Ini.setProperty(Ini.P_WAREHOUSE,"HQ Warehouse"); + Ini.setProperty(Ini.P_LANGUAGE,"English"); + Login login = new Login(Env.getCtx()); + if (!login.batchLogin(null)) + System.exit(1); + // + CLogMgt.setLoggerLevel(Level.WARNING, null); + CLogMgt.setLevel(Level.WARNING); + + int NO_TESTS = 2; + int NO_ORDERS = 200; + int NO_LINES = 20; + + long time = System.currentTimeMillis(); + Thread[] tests = new Thread[NO_TESTS]; + for (int i = 0; i < tests.length; i++) + { + tests[i] = new Thread(new OrderTest(i, NO_ORDERS, NO_LINES)); + tests[i].start(); + } + // Wait + for (int i = 0; i < tests.length; i++) + { + try + { + tests[i].join(); + } + catch (InterruptedException e) + { + } + } + time = System.currentTimeMillis() - time; + + System.out.println("Time (ms)=" + time); + + } // main + +} // OrderTest