📄 calloutorder.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere 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.compiere.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 Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.model;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.util.*;
/**
* Order Callouts.
*
* @author Jorg Janke
* @version $Id: CalloutOrder.java,v 1.36 2006/01/28 01:28:28 jjanke Exp $
*/
public class CalloutOrder extends CalloutEngine
{
/** Debug Steps */
private boolean steps = false;
/**
* Order Header Change - DocType.
* - InvoiceRuld/DeliveryRule/PaymentRule
* - temporary Document
* Context:
* - DocSubTypeSO
* - HasCharges
* - (re-sets Business Partner info of required)
*
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
* @return Error message or ""
*/
public String docType (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
Integer C_DocType_ID = (Integer)value; // Actually C_DocTypeTarget_ID
if (C_DocType_ID == null || C_DocType_ID.intValue() == 0)
return "";
// Re-Create new DocNo, if there is a doc number already
// and the existing source used a different Sequence number
String oldDocNo = (String)mTab.getValue("DocumentNo");
boolean newDocNo = (oldDocNo == null);
if (!newDocNo && oldDocNo.startsWith("<") && oldDocNo.endsWith(">"))
newDocNo = true;
Integer oldC_DocType_ID = (Integer)mTab.getValue("C_DocType_ID");
String sql = "SELECT d.DocSubTypeSO,d.HasCharges,'N'," // 1..3
+ "d.IsDocNoControlled,s.CurrentNext,s.CurrentNextSys," // 4..6
+ "s.AD_Sequence_ID,d.IsSOTrx " // 7..8
+ "FROM C_DocType d, AD_Sequence s "
+ "WHERE C_DocType_ID=?" // #1
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
try
{
int AD_Sequence_ID = 0;
// Get old AD_SeqNo for comparison
if (!newDocNo && oldC_DocType_ID.intValue() != 0)
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, oldC_DocType_ID.intValue());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
AD_Sequence_ID = rs.getInt(6);
rs.close();
pstmt.close();
}
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_DocType_ID.intValue());
ResultSet rs = pstmt.executeQuery();
String DocSubTypeSO = "";
boolean IsSOTrx = true;
if (rs.next()) // we found document type
{
// Set Context: Document Sub Type for Sales Orders
DocSubTypeSO = rs.getString(1);
if (DocSubTypeSO == null)
DocSubTypeSO = "--";
Env.setContext(ctx, WindowNo, "OrderType", DocSubTypeSO);
// No Drop Ship other than Standard
if (!DocSubTypeSO.equals(MOrder.DocSubTypeSO_Standard))
mTab.setValue ("IsDropShip", "N");
// Delivery Rule
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS))
mTab.setValue ("DeliveryRule", MOrder.DELIVERYRULE_Force);
else if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay))
mTab.setValue ("DeliveryRule", MOrder.DELIVERYRULE_AfterReceipt);
else
mTab.setValue ("DeliveryRule", MOrder.DELIVERYRULE_Availability);
// Invoice Rule
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS)
|| DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay)
|| DocSubTypeSO.equals(MOrder.DocSubTypeSO_OnCredit) )
mTab.setValue ("InvoiceRule", MOrder.INVOICERULE_Immediate);
else
mTab.setValue ("InvoiceRule", MOrder.INVOICERULE_AfterDelivery);
// Payment Rule - POS Order
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS))
mTab.setValue("PaymentRule", MOrder.PAYMENTRULE_Cash);
else
mTab.setValue("PaymentRule", MOrder.PAYMENTRULE_OnCredit);
// IsSOTrx
if ("N".equals(rs.getString(8)))
IsSOTrx = false;
// Set Context:
Env.setContext(ctx, WindowNo, "HasCharges", rs.getString(2));
// DocumentNo
if (rs.getString(4).equals("Y")) // IsDocNoControlled
{
if (!newDocNo && AD_Sequence_ID != rs.getInt(7))
newDocNo = true;
if (newDocNo)
if (Ini.isPropertyBool(Ini.P_COMPIERESYS) && Env.getAD_Client_ID(Env.getCtx()) < 1000000)
mTab.setValue("DocumentNo", "<" + rs.getString(6) + ">");
else
mTab.setValue("DocumentNo", "<" + rs.getString(5) + ">");
}
}
rs.close();
pstmt.close();
// When BPartner is changed, the Rules are not set if
// it is a POS or Credit Order (i.e. defaults from Standard BPartner)
// This re-reads the Rules and applies them.
if (DocSubTypeSO.equals(MOrder.DocSubTypeSO_POS)
|| DocSubTypeSO.equals(MOrder.DocSubTypeSO_Prepay)) // not for POS/PrePay
;
else
{
sql = "SELECT PaymentRule,C_PaymentTerm_ID," // 1..2
+ "InvoiceRule,DeliveryRule," // 3..4
+ "FreightCostRule,DeliveryViaRule, " // 5..6
+ "PaymentRulePO,PO_PaymentTerm_ID "
+ "FROM C_BPartner "
+ "WHERE C_BPartner_ID=?"; // #1
pstmt = DB.prepareStatement(sql, null);
int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID");
pstmt.setInt(1, C_BPartner_ID);
//
rs = pstmt.executeQuery();
if (rs.next())
{
// PaymentRule
String s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO");
if (s != null && s.length() != 0)
{
if (IsSOTrx && (s.equals("B") || s.equals("S") || s.equals("U"))) // No Cash/Check/Transfer for SO_Trx
s = "P"; // Payment Term
if (!IsSOTrx && (s.equals("B"))) // No Cash for PO_Trx
s = "P"; // Payment Term
mTab.setValue("PaymentRule", s);
}
// Payment Term
Integer ii =new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID"));
if (!rs.wasNull())
mTab.setValue("C_PaymentTerm_ID", ii);
// InvoiceRule
s = rs.getString(3);
if (s != null && s.length() != 0)
mTab.setValue("InvoiceRule", s);
// DeliveryRule
s = rs.getString(4);
if (s != null && s.length() != 0)
mTab.setValue("DeliveryRule", s);
// FreightCostRule
s = rs.getString(5);
if (s != null && s.length() != 0)
mTab.setValue("FreightCostRule", s);
// DeliveryViaRule
s = rs.getString(6);
if (s != null && s.length() != 0)
mTab.setValue("DeliveryViaRule", s);
}
rs.close();
pstmt.close();
} // re-read customer rules
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
return e.getLocalizedMessage();
}
return "";
} // docType
/**
* Order Header - BPartner.
* - M_PriceList_ID (+ Context)
* - C_BPartner_Location_ID
* - Bill_BPartner_ID/Bill_Location_ID
* - AD_User_ID
* - POReference
* - SO_Description
* - IsDiscountPrinted
* - InvoiceRule/DeliveryRule/PaymentRule/FreightCost/DeliveryViaRule
* - C_PaymentTerm_ID
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
* @return Error message or ""
*/
public String bPartner (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
Integer C_BPartner_ID = (Integer)value;
if (C_BPartner_ID == null || C_BPartner_ID.intValue() == 0)
return "";
setCalloutActive(true);
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.InvoiceRule,p.DeliveryRule,p.FreightCostRule,DeliveryViaRule,"
+ " p.SO_CreditLimit, p.SO_CreditLimit-p.SO_CreditUsed AS CreditAvailable,"
+ " lship.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,"
+ " lbill.C_BPartner_Location_ID AS Bill_Location_ID, p.SOCreditStatus "
+ "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 lbill ON (p.C_BPartner_ID=lbill.C_BPartner_ID AND lbill.IsBillTo='Y' AND lbill.IsActive='Y')"
+ " LEFT OUTER JOIN C_BPartner_Location lship ON (p.C_BPartner_ID=lship.C_BPartner_ID AND lship.IsShipTo='Y' AND lship.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
boolean IsSOTrx = "Y".equals(Env.getContext(ctx, WindowNo, "IsSOTrx"));
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_BPartner_ID.intValue());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
// PriceList (indirect: IsTaxIncluded & Currency)
Integer ii = new Integer(rs.getInt(IsSOTrx ? "M_PriceList_ID" : "PO_PriceList_ID"));
if (!rs.wasNull())
mTab.setValue("M_PriceList_ID", ii);
else
{ // get default PriceList
int i = Env.getContextAsInt(ctx, "#M_PriceList_ID");
if (i != 0)
mTab.setValue("M_PriceList_ID", new Integer(i));
}
// Bill-To
mTab.setValue("Bill_BPartner_ID", C_BPartner_ID);
int bill_Location_ID = rs.getInt("Bill_Location_ID");
if (bill_Location_ID == 0)
mTab.setValue("Bill_Location_ID", null);
else
mTab.setValue("Bill_Location_ID", new Integer(bill_Location_ID));
// Ship-To Location
int shipTo_ID = 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)
shipTo_ID = Integer.parseInt(loc);
}
if (shipTo_ID == 0)
mTab.setValue("C_BPartner_Location_ID", null);
else
mTab.setValue("C_BPartner_Location_ID", new Integer(shipTo_ID));
// 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));
mTab.setValue("Bill_User_ID", new Integer(contID));
}
// CreditAvailable
if (IsSOTrx)
{
double CreditLimit = rs.getDouble("SO_CreditLimit");
String SOCreditStatus = rs.getString("SOCreditStatus");
if (CreditLimit != 0)
{
double CreditAvailable = rs.getDouble("CreditAvailable");
if (!rs.wasNull() && CreditAvailable < 0)
mTab.fireDataStatusEEvent("CreditLimitOver",
DisplayType.getNumberFormat(DisplayType.Amount).format(CreditAvailable),
false);
}
}
// PO Reference
String s = rs.getString("POReference");
if (s != null && s.length() != 0)
mTab.setValue("POReference", s);
else
mTab.setValue("POReference", null);
// SO Description
s = rs.getString("SO_Description");
if (s != null && s.trim().length() != 0)
mTab.setValue("Description", s);
// IsDiscountPrinted
s = rs.getString("IsDiscountPrinted");
if (s != null && s.length() != 0)
mTab.setValue("IsDiscountPrinted", s);
else
mTab.setValue("IsDiscountPrinted", "N");
// Defaults, if not Walkin Receipt or Walkin Invoice
String OrderType = Env.getContext(ctx, WindowNo, "OrderType");
mTab.setValue("InvoiceRule", MOrder.INVOICERULE_AfterDelivery);
mTab.setValue("DeliveryRule", MOrder.DELIVERYRULE_Availability);
mTab.setValue("PaymentRule", MOrder.PAYMENTRULE_OnCredit);
if (OrderType.equals(MOrder.DocSubTypeSO_Prepay))
{
mTab.setValue("InvoiceRule", MOrder.INVOICERULE_Immediate);
mTab.setValue("DeliveryRule", MOrder.DELIVERYRULE_AfterReceipt);
}
else if (OrderType.equals(MOrder.DocSubTypeSO_POS)) // for POS
mTab.setValue("PaymentRule", MOrder.PAYMENTRULE_Cash);
else
{
// PaymentRule
s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO");
if (s != null && s.length() != 0)
{
if (s.equals("B")) // No Cache in Non POS
s = "P";
if (IsSOTrx && (s.equals("S") || s.equals("U"))) // No Check/Transfer for SO_Trx
s = "P"; // Payment Term
mTab.setValue("PaymentRule", s);
}
// Payment Term
ii = new Integer(rs.getInt(IsSOTrx ? "C_PaymentTerm_ID" : "PO_PaymentTerm_ID"));
if (!rs.wasNull())
mTab.setValue("C_PaymentTerm_ID", ii);
// InvoiceRule
s = rs.getString("InvoiceRule");
if (s != null && s.length() != 0)
mTab.setValue("InvoiceRule", s);
// DeliveryRule
s = rs.getString("DeliveryRule");
if (s != null && s.length() != 0)
mTab.setValue("DeliveryRule", s);
// FreightCostRule
s = rs.getString("FreightCostRule");
if (s != null && s.length() != 0)
mTab.setValue("FreightCostRule", s);
// DeliveryViaRule
s = rs.getString("DeliveryViaRule");
if (s != null && s.length() != 0)
mTab.setValue("DeliveryViaRule", s);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -