move branch adempire311 to trunk

This commit is contained in:
vpj-cd 2006-11-17 03:08:46 +00:00
parent ecf759dc1f
commit ecad54b7cf
17 changed files with 1387 additions and 0 deletions

11
extend/.classpath Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="src" path="/base"/>
<classpathentry kind="src" path="/dbPort"/>
<classpathentry kind="src" path="/tools"/>
<classpathentry kind="src" path="/looks"/>
<classpathentry kind="src" path="/print"/>
<classpathentry kind="output" path="build"/>
</classpath>

22
extend/.project Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>extend</name>
<comment></comment>
<projects>
<project>base</project>
<project>dbPort</project>
<project>looks</project>
<project>print</project>
<project>tools</project>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

26
extend/Extend.html Normal file
View File

@ -0,0 +1,26 @@
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
<TITLE>Project Extend.jpx</TITLE>
</HEAD>
<BODY>
<H1>Project Notes</H1>
<HR>
<FONT SIZE=+1>
<STRONG>Project: </STRONG>Product Extensions<BR>
<STRONG>Author: </STRONG>Jorg Janke<BR>
<STRONG>Version: </STRONG>$Id: Extend.html,v 1.1 2006/04/21 17:55:19 jjanke Exp $<BR>
<hr>
<STRONG>Description: </STRONG><BR>
Create Jar Extend.jar to be included in Base => Client.
Example of extensions
<HR>
<STRONG>Things to do... </STRONG><BR>
</FONT>
<UL>
<!-- Edit this section to keep track of your to do items -->
<LI>Item 1
<LI>Item 2
</UL>
</BODY>
</HTML>

19
extend/RUN_build.bat Normal file
View File

@ -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

18
extend/RUN_build.sh Normal file
View File

@ -0,0 +1,18 @@
# Module compiling script
# Ported from Windows script Marek Mosiewicz<marek.mosiewicz@jotel.com.pl>
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

80
extend/build.xml Normal file
View File

@ -0,0 +1,80 @@
<!-- ============================================= -->
<!-- Extend -->
<!-- ============================================= -->
<!-- $Header: /cvs/adempiere/extend/build.xml,v 1.1 2006/04/21 17:55:19 jjanke Exp $ -->
<project name="extend" default="dist" basedir=".">
<description>
This buildfile is used to build the extend subproject within
the Adempiere project.
</description>
<!-- set global properties for this build -->
<property name="src" value="src"/>
<property name="build.dir" value="build"/>
<property name="dist.dir" value="."/>
<property name="jar.path" value="../lib"/>
<property name="jar.name" value="Extend"/>
<!-- set path to include the necessary jar files for javac -->
<path id="project.class.path">
<pathelement path="${classpath}"/>
<pathelement path="${jar.path}/CCTools.jar"/>
<pathelement path="../dbPort/dbPort.jar"/>
<pathelement path="../base/Base.jar"/>
<pathelement path="../looks/CLooks.jar"/>
</path>
<target name="init" description="initialization target">
<echo message="=========== Build Extend"/>
<!-- create the time stamp -->
<tstamp/>
<!-- create the build directory structure used by compile -->
<mkdir dir="${build.dir}"/>
<!-- check for the distribution directory -->
<available file="${dist.dir}" type="dir" property="dist.dir.exists"/>
</target>
<target name="makedir" depends="init" unless="dist.dir.exists">
<!-- create the distribution directory if not available -->
<mkdir dir="${dist}/${dist.dir}"/>
</target>
<target name="compile" depends="makedir">
<!-- compile the java code from ${src} into ${build.dir} -->
<javac srcdir="${src}" destdir="${build.dir}" deprecation="on" debug="on">
<classpath refid="project.class.path"/>
</javac>
<!-- copy all image & sound files from src to the build directory -->
<copy todir="${build.dir}">
<fileset dir="${src}">
<include name="**/images/*"/>
<include name="**/*.gif"/>
<include name="**/*.jpg"/>
<include name="**/*.wav"/>
<include name="**/*.htm"/>
<include name="**/*.html"/>
<include name="**/*.properties"/>
<exclude name="**/package.html"/>
</fileset>
</copy>
</target>
<!-- =========================================== -->
<!-- Distribution -->
<!-- =========================================== -->
<target name="dist" depends="compile">
<!-- put everything from ${build.dir} into the ${jar.name}.jar file -->
<jar jarfile="${dist.dir}/${jar.name}.jar" basedir="${build.dir}"/>
</target>
<target name="clean">
<!-- Delete the ${build.dir} directory trees -->
<delete dir="${build.dir}"/>
<delete file="${dist.dir}/${jar.name}.jar" failonerror="false"/>
</target>
</project>

View File

@ -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
/

View File

@ -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)
)
/

5
extend/documentation.bat Normal file
View File

@ -0,0 +1,5 @@
@Rem API Documentation for Base
call ..\doc\documentation.bat src doc -private
@pause

1
extend/packages.txt Normal file
View File

@ -0,0 +1 @@
com.adempiere.custom

View File

@ -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:
* <code>com.adempiere.custom.CalloutEngine.justAnExample</code>
*
* @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

View File

@ -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

View File

@ -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.
* <code>
* SELECT * FROM MyModelExample WHERE ...
* </code>
* @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

View File

@ -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

View File

@ -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

View File

@ -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();
}
}

View File

@ -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