📄 calloutinvoice.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.*;
/**
* Invoice Callouts
*
* @author Jorg Janke
* @version $Id: CalloutInvoice.java,v 1.28 2006/01/09 19:38:03 jjanke Exp $
*/
public class CalloutInvoice extends CalloutEngine
{
/**
* Invoice Header - DocType.
* - 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
*/
public String docType (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
Integer C_DocType_ID = (Integer)value;
if (C_DocType_ID == null || C_DocType_ID.intValue() == 0)
return "";
String sql = "SELECT d.HasCharges,'N',d.IsDocNoControlled,"
+ "s.CurrentNext, d.DocBaseType "
+ "FROM C_DocType d, AD_Sequence s "
+ "WHERE C_DocType_ID=?" // 1
+ " AND d.DocNoSequence_ID=s.AD_Sequence_ID(+)";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_DocType_ID.intValue());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
// Charges - Set Context
Env.setContext(ctx, WindowNo, "HasCharges", rs.getString(1));
// DocumentNo
if (rs.getString(3).equals("Y"))
mTab.setValue("DocumentNo", "<" + rs.getString(4) + ">");
// DocBaseType - Set Context
String s = rs.getString(5);
Env.setContext(ctx, WindowNo, "DocBaseType", s);
// AP Check & AR Credit Memo
if (s.startsWith("AP"))
mTab.setValue("PaymentRule", "S"); // Check
else if (s.endsWith("C"))
mTab.setValue("PaymentRule", "P"); // OnCredit
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql, e);
return e.getLocalizedMessage();
}
return "";
} // docType
/**
* Invoice Header- BPartner.
* - M_PriceList_ID (+ Context)
* - C_BPartner_Location_ID
* - AD_User_ID
* - POReference
* - SO_Description
* - IsDiscountPrinted
* - PaymentRule
* - C_PaymentTerm_ID
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
*/
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 "";
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
boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y");
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_BPartner_ID.intValue());
ResultSet rs = pstmt.executeQuery();
//
if (rs.next())
{
// PriceList & 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));
}
// PaymentRule
String s = rs.getString(IsSOTrx ? "PaymentRule" : "PaymentRulePO");
if (s != null && s.length() != 0)
{
if (Env.getContext(ctx, WindowNo, "DocBaseType").endsWith("C")) // Credits are Payment Term
s = "P";
else 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);
// 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));
// CreditAvailable
if (IsSOTrx)
{
double CreditLimit = rs.getDouble("SO_CreditLimit");
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
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");
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, "bPartner", e);
return e.getLocalizedMessage();
}
return "";
} // bPartner
/**
* Set Payment Term.
* Payment Term has changed
*/
public String paymentTerm (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
Integer C_PaymentTerm_ID = (Integer)value;
int C_Invoice_ID = Env.getContextAsInt(ctx, WindowNo, "C_Invoice_ID");
if (C_PaymentTerm_ID == null || C_PaymentTerm_ID.intValue() == 0
|| C_Invoice_ID == 0) // not saved yet
return "";
//
MPaymentTerm pt = new MPaymentTerm (ctx, C_PaymentTerm_ID.intValue(), null);
if (pt.get_ID() == 0)
return "PaymentTerm not found";
boolean valid = pt.apply (C_Invoice_ID);
mTab.setValue("IsPayScheduleValid", valid ? "Y" : "N");
return "";
} // paymentTerm
/**************************************************************************
* Invoice Line - Product.
* - reset C_Charge_ID / M_AttributeSetInstance_ID
* - PriceList, PriceStd, PriceLimit, C_Currency_ID, EnforcePriceLimit
* - UOM
* Calls Tax
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
*/
public String product (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
Integer M_Product_ID = (Integer)value;
if (M_Product_ID == null || M_Product_ID.intValue() == 0)
return "";
setCalloutActive(true);
mTab.setValue("C_Charge_ID", null);
// Set Attribute
if (Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_Product_ID") == M_Product_ID.intValue()
&& Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID") != 0)
mTab.setValue("M_AttributeSetInstance_ID", new Integer(Env.getContextAsInt(ctx, Env.WINDOW_INFO, Env.TAB_INFO, "M_AttributeSetInstance_ID")));
else
mTab.setValue("M_AttributeSetInstance_ID", null);
/***** Price Calculation see also qty ****/
boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y");
int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, WindowNo, "C_BPartner_ID");
BigDecimal Qty = (BigDecimal)mTab.getValue("QtyInvoiced");
MProductPricing pp = new MProductPricing (M_Product_ID.intValue(), C_BPartner_ID, Qty, IsSOTrx);
//
int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID");
pp.setM_PriceList_ID(M_PriceList_ID);
int M_PriceList_Version_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_Version_ID");
pp.setM_PriceList_Version_ID(M_PriceList_Version_ID);
Timestamp date = Env.getContextAsDate(ctx, WindowNo, "DateInvoiced");
pp.setPriceDate(date);
//
mTab.setValue("PriceList", pp.getPriceList());
mTab.setValue("PriceLimit", pp.getPriceLimit());
mTab.setValue("PriceActual", pp.getPriceStd());
mTab.setValue("PriceEntered", pp.getPriceStd());
mTab.setValue("C_Currency_ID", new Integer(pp.getC_Currency_ID()));
// mTab.setValue("Discount", pp.getDiscount());
mTab.setValue("C_UOM_ID", new Integer(pp.getC_UOM_ID()));
Env.setContext(ctx, WindowNo, "EnforcePriceLimit", pp.isEnforcePriceLimit() ? "Y" : "N");
Env.setContext(ctx, WindowNo, "DiscountSchema", pp.isDiscountSchema() ? "Y" : "N");
//
setCalloutActive(false);
return tax (ctx, WindowNo, mTab, mField, value);
} // product
/**
* Invoice Line - Charge.
* - updates PriceActual from Charge
* - sets PriceLimit, PriceList to zero
* Calles tax
* @param ctx Context
* @param WindowNo current Window No
* @param mTab Model Tab
* @param mField Model Field
* @param value The new value
*/
public String charge (Properties ctx, int WindowNo, MTab mTab, MField mField, Object value)
{
Integer C_Charge_ID = (Integer)value;
if (C_Charge_ID == null || C_Charge_ID.intValue() == 0)
return "";
// No Product defined
if (mTab.getValue("M_Product_ID") != null)
{
mTab.setValue("C_Charge_ID", null);
return "ChargeExclusively";
}
mTab.setValue("M_AttributeSetInstance_ID", null);
mTab.setValue("S_ResourceAssignment_ID", null);
mTab.setValue("C_UOM_ID", new Integer(100)); // EA
Env.setContext(ctx, WindowNo, "DiscountSchema", "N");
String sql = "SELECT ChargeAmt FROM C_Charge WHERE C_Charge_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, C_Charge_ID.intValue());
ResultSet rs = pstmt.executeQuery();
if (rs.next())
{
mTab.setValue ("PriceEntered", rs.getBigDecimal (1));
mTab.setValue ("PriceActual", rs.getBigDecimal (1));
mTab.setValue ("PriceLimit", Env.ZERO);
mTab.setValue ("PriceList", Env.ZERO);
mTab.setValue ("Discount", Env.ZERO);
}
rs.close();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql + e);
return e.getLocalizedMessage();
}
//
return tax (ctx, WindowNo, mTab, mField, value);
} // charge
/**
* Invoice Line - Tax.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -