/****************************************************************************** * 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(MOrder.Table_Name, this); // We want to validate Order before preparing engine.addDocValidate(MOrder.Table_Name, this); engine.addDocValidate(MInOut.Table_Name, this); engine.addDocValidate(MPayment.Table_Name, this); engine.addDocValidate(MCash.Table_Name, 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) { log.info(po.get_TableName() + " Timing: "+timing); // Ignore all after Complete events if (timing == TIMING_AFTER_COMPLETE) return null; if (timing == 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