📄 minout.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.io.*;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.print.*;
import org.compiere.process.*;
import org.compiere.util.*;
/**
* Shipment Model
*
* @author Jorg Janke
* @version $Id: MInOut.java,v 1.80 2006/01/28 01:28:28 jjanke Exp $
*/
public class MInOut extends X_M_InOut implements DocAction
{
/**
* Create Shipment From Order
* @param order order
* @param movementDate optional movement date
* @param forceDelivery ignore order delivery rule
* @param allAttributeInstances if true, all attribute set instances
* @param minGuaranteeDate optional minimum guarantee date if all attribute instances
* @param complete complete document (Process if false, Complete if true)
* @return Shipment or null
*/
public static MInOut createFrom (MOrder order, Timestamp movementDate,
boolean forceDelivery, boolean allAttributeInstances, Timestamp minGuaranteeDate,
boolean complete, String trxName)
{
if (order == null)
throw new IllegalArgumentException("No Order");
//
if (!forceDelivery && DELIVERYRULE_CompleteLine.equals(order.getDeliveryRule()))
{
return null;
}
// Create Meader
MInOut retValue = new MInOut (order, 0, movementDate);
retValue.setDocAction(complete ? DOCACTION_Complete : DOCACTION_Prepare);
// Check if we can create the lines
MOrderLine[] oLines = order.getLines(true, "M_Product_ID");
for (int i = 0; i < oLines.length; i++)
{
BigDecimal qty = oLines[i].getQtyOrdered().subtract(oLines[i].getQtyDelivered());
// Nothing to deliver
if (qty.signum() == 0)
continue;
// Stock Info
MStorage[] storages = null;
MProduct product = oLines[i].getProduct();
if (product != null && product.get_ID() != 0 && product.isStocked())
{
MProductCategory pc = MProductCategory.get(order.getCtx(), product.getM_Product_Category_ID());
String MMPolicy = pc.getMMPolicy();
if (MMPolicy == null || MMPolicy.length() == 0)
{
MClient client = MClient.get(order.getCtx());
MMPolicy = client.getMMPolicy();
}
storages = MStorage.getWarehouse (order.getCtx(), order.getM_Warehouse_ID(),
oLines[i].getM_Product_ID(), oLines[i].getM_AttributeSetInstance_ID(),
product.getM_AttributeSet_ID(),
allAttributeInstances, minGuaranteeDate,
MClient.MMPOLICY_FiFo.equals(MMPolicy), trxName);
}
if (!forceDelivery)
{
BigDecimal maxQty = Env.ZERO;
for (int ll = 0; ll < storages.length; ll++)
maxQty = maxQty.add(storages[ll].getQtyOnHand());
if (DELIVERYRULE_Availability.equals(order.getDeliveryRule()))
{
if (maxQty.compareTo(qty) < 0)
qty = maxQty;
}
else if (DELIVERYRULE_CompleteLine.equals(order.getDeliveryRule()))
{
if (maxQty.compareTo(qty) < 0)
continue;
}
}
// Create Line
if (retValue.get_ID() == 0) // not saved yet
retValue.save(trxName);
// Create a line until qty is reached
for (int ll = 0; ll < storages.length; ll++)
{
BigDecimal lineQty = storages[ll].getQtyOnHand();
if (lineQty.compareTo(qty) > 0)
lineQty = qty;
MInOutLine line = new MInOutLine (retValue);
line.setOrderLine(oLines[i], storages[ll].getM_Locator_ID(),
order.isSOTrx() ? lineQty : Env.ZERO);
line.setQty(lineQty); // Correct UOM for QtyEntered
if (oLines[i].getQtyEntered().compareTo(oLines[i].getQtyOrdered()) != 0)
line.setQtyEntered(lineQty
.multiply(oLines[i].getQtyEntered())
.divide(oLines[i].getQtyOrdered(), 12, BigDecimal.ROUND_HALF_UP));
line.save(trxName);
// Delivered everything ?
qty = qty.subtract(lineQty);
// storage[ll].changeQtyOnHand(lineQty, !order.isSOTrx()); // Credit Memo not considered
// storage[ll].save(get_TrxName());
if (qty.signum() == 0)
break;
}
} // for all order lines
// No Lines saved
if (retValue.get_ID() == 0)
return null;
return retValue;
} // createFrom
/**
* Create new Shipment by copying
* @param from shipment
* @param dateDoc date of the document date
* @param C_DocType_ID doc type
* @param isSOTrx sales order
* @param counter create counter links
* @param trxName trx
* @param setOrder set the order link
* @return Shipment
*/
public static MInOut copyFrom (MInOut from, Timestamp dateDoc,
int C_DocType_ID, boolean isSOTrx, boolean counter, String trxName, boolean setOrder)
{
MInOut to = new MInOut (from.getCtx(), 0, null);
to.set_TrxName(trxName);
copyValues(from, to, from.getAD_Client_ID(), from.getAD_Org_ID());
to.set_ValueNoCheck ("M_InOut_ID", I_ZERO);
to.set_ValueNoCheck ("DocumentNo", null);
//
to.setDocStatus (DOCSTATUS_Drafted); // Draft
to.setDocAction(DOCACTION_Complete);
//
to.setC_DocType_ID (C_DocType_ID);
to.setIsSOTrx(isSOTrx);
if (counter)
to.setMovementType (isSOTrx ? MOVEMENTTYPE_CustomerShipment : MOVEMENTTYPE_VendorReceipts);
//
to.setDateOrdered (dateDoc);
to.setDateAcct (dateDoc);
to.setMovementDate(dateDoc);
to.setDatePrinted(null);
to.setIsPrinted (false);
to.setDateReceived(null);
to.setNoPackages(0);
to.setShipDate(null);
to.setPickDate(null);
to.setIsInTransit(false);
//
to.setIsApproved (false);
to.setC_Invoice_ID(0);
to.setTrackingNo(null);
to.setIsInDispute(false);
//
to.setPosted (false);
to.setProcessed (false);
to.setC_Order_ID(0); // Overwritten by setOrder
if (counter)
{
to.setC_Order_ID(0);
to.setRef_InOut_ID(from.getM_InOut_ID());
// Try to find Order/Invoice link
if (from.getC_Order_ID() != 0)
{
MOrder peer = new MOrder (from.getCtx(), from.getC_Order_ID(), from.get_TrxName());
if (peer.getRef_Order_ID() != 0)
to.setC_Order_ID(peer.getRef_Order_ID());
}
if (from.getC_Invoice_ID() != 0)
{
MInvoice peer = new MInvoice (from.getCtx(), from.getC_Invoice_ID(), from.get_TrxName());
if (peer.getRef_Invoice_ID() != 0)
to.setC_Invoice_ID(peer.getRef_Invoice_ID());
}
}
else
{
to.setRef_InOut_ID(0);
if (setOrder)
to.setC_Order_ID(from.getC_Order_ID());
}
//
if (!to.save(trxName))
throw new IllegalStateException("Could not create Shipment");
if (counter)
from.setRef_InOut_ID(to.getM_InOut_ID());
if (to.copyLinesFrom(from, counter, setOrder) == 0)
throw new IllegalStateException("Could not create Shipment Lines");
return to;
} // copyFrom
/**************************************************************************
* Standard Constructor
* @param ctx context
* @param M_InOut_ID
* @param trxName rx name
*/
public MInOut (Properties ctx, int M_InOut_ID, String trxName)
{
super (ctx, M_InOut_ID, trxName);
if (M_InOut_ID == 0)
{
// setDocumentNo (null);
// setC_BPartner_ID (0);
// setC_BPartner_Location_ID (0);
// setM_Warehouse_ID (0);
// setC_DocType_ID (0);
setIsSOTrx (false);
setMovementDate (new Timestamp (System.currentTimeMillis ()));
setDateAcct (getMovementDate());
// setMovementType (MOVEMENTTYPE_CustomerShipment);
setDeliveryRule (DELIVERYRULE_Availability);
setDeliveryViaRule (DELIVERYVIARULE_Pickup);
setFreightCostRule (FREIGHTCOSTRULE_FreightIncluded);
setDocStatus (DOCSTATUS_Drafted);
setDocAction (DOCACTION_Complete);
setPriorityRule (PRIORITYRULE_Medium);
setNoPackages(0);
setIsInTransit(false);
setIsPrinted (false);
setSendEMail (false);
setIsInDispute(false);
//
setIsApproved(false);
super.setProcessed (false);
setProcessing(false);
setPosted(false);
}
} // MInOut
/**
* Load Constructor
* @param ctx context
* @param rs result set record
*/
public MInOut (Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
} // MInOut
/**
* Order Constructor - create header only
* @param order order
* @param movementDate optional movement date (default today)
* @param C_DocTypeShipment_ID document type or 0
*/
public MInOut (MOrder order, int C_DocTypeShipment_ID, Timestamp movementDate)
{
this (order.getCtx(), 0, order.get_TrxName());
setClientOrg(order);
setC_BPartner_ID (order.getC_BPartner_ID());
setC_BPartner_Location_ID (order.getC_BPartner_Location_ID()); // shipment address
setAD_User_ID(order.getAD_User_ID());
//
setM_Warehouse_ID (order.getM_Warehouse_ID());
setIsSOTrx (order.isSOTrx());
setMovementType (order.isSOTrx() ? MOVEMENTTYPE_CustomerShipment : MOVEMENTTYPE_VendorReceipts);
if (C_DocTypeShipment_ID == 0)
C_DocTypeShipment_ID = DB.getSQLValue(null,
"SELECT C_DocTypeShipment_ID FROM C_DocType WHERE C_DocType_ID=?",
order.getC_DocType_ID());
setC_DocType_ID (C_DocTypeShipment_ID);
// Default - Today
if (movementDate != null)
setMovementDate (movementDate);
setDateAcct (getMovementDate());
// Copy from Order
setC_Order_ID(order.getC_Order_ID());
setDeliveryRule (order.getDeliveryRule());
setDeliveryViaRule (order.getDeliveryViaRule());
setM_Shipper_ID(order.getM_Shipper_ID());
setFreightCostRule (order.getFreightCostRule());
setFreightAmt(order.getFreightAmt());
setSalesRep_ID(order.getSalesRep_ID());
//
setC_Activity_ID(order.getC_Activity_ID());
setC_Campaign_ID(order.getC_Campaign_ID());
setC_Charge_ID(order.getC_Charge_ID());
setChargeAmt(order.getChargeAmt());
//
setC_Project_ID(order.getC_Project_ID());
setDateOrdered(order.getDateOrdered());
setDescription(order.getDescription());
setPOReference(order.getPOReference());
setSalesRep_ID(order.getSalesRep_ID());
setAD_OrgTrx_ID(order.getAD_OrgTrx_ID());
setUser1_ID(order.getUser1_ID());
setUser2_ID(order.getUser2_ID());
} // MInOut
/**
* Invoice Constructor - create header only
* @param invoice invoice
* @param movementDate optional movement date (default today)
* @param C_DocTypeShipment_ID document type or 0
*/
public MInOut (MInvoice invoice, int C_DocTypeShipment_ID, Timestamp movementDate, int M_Warehouse_ID)
{
this (invoice.getCtx(), 0, invoice.get_TrxName());
setClientOrg(invoice);
setC_BPartner_ID (invoice.getC_BPartner_ID());
setC_BPartner_Location_ID (invoice.getC_BPartner_Location_ID()); // shipment address
setAD_User_ID(invoice.getAD_User_ID());
//
setM_Warehouse_ID (M_Warehouse_ID);
setIsSOTrx (invoice.isSOTrx());
setMovementType (invoice.isSOTrx() ? MOVEMENTTYPE_CustomerShipment : MOVEMENTTYPE_VendorReceipts);
MOrder order = null;
if (invoice.getC_Order_ID() != 0)
order = new MOrder (invoice.getCtx(), invoice.getC_Order_ID(), invoice.get_TrxName());
if (C_DocTypeShipment_ID == 0 && order != null)
C_DocTypeShipment_ID = DB.getSQLValue(null,
"SELECT C_DocTypeShipment_ID FROM C_DocType WHERE C_DocType_ID=?",
order.getC_DocType_ID());
if (C_DocTypeShipment_ID != 0)
setC_DocType_ID (C_DocTypeShipment_ID);
else
setC_DocType_ID();
// Default - Today
if (movementDate != null)
setMovementDate (movementDate);
setDateAcct (getMovementDate());
// Copy from Invoice
setC_Order_ID(invoice.getC_Order_ID());
setSalesRep_ID(invoice.getSalesRep_ID());
//
setC_Activity_ID(invoice.getC_Activity_ID());
setC_Campaign_ID(invoice.getC_Campaign_ID());
setC_Charge_ID(invoice.getC_Charge_ID());
setChargeAmt(invoice.getChargeAmt());
//
setC_Project_ID(invoice.getC_Project_ID());
setDateOrdered(invoice.getDateOrdered());
setDescription(invoice.getDescription());
setPOReference(invoice.getPOReference());
setAD_OrgTrx_ID(invoice.getAD_OrgTrx_ID());
setUser1_ID(invoice.getUser1_ID());
setUser2_ID(invoice.getUser2_ID());
if (order != null)
{
setDeliveryRule (order.getDeliveryRule());
setDeliveryViaRule (order.getDeliveryViaRule());
setM_Shipper_ID(order.getM_Shipper_ID());
setFreightCostRule (order.getFreightCostRule());
setFreightAmt(order.getFreightAmt());
}
} // MInOut
/**
* Copy Constructor - create header only
* @param original original
* @param movementDate optional movement date (default today)
* @param C_DocTypeShipment_ID document type or 0
*/
public MInOut (MInOut original, int C_DocTypeShipment_ID, Timestamp movementDate)
{
this (original.getCtx(), 0, original.get_TrxName());
setClientOrg(original);
setC_BPartner_ID (original.getC_BPartner_ID());
setC_BPartner_Location_ID (original.getC_BPartner_Location_ID()); // shipment address
setAD_User_ID(original.getAD_User_ID());
//
setM_Warehouse_ID (original.getM_Warehouse_ID());
setIsSOTrx (original.isSOTrx());
setMovementType (original.getMovementType());
if (C_DocTypeShipment_ID == 0)
setC_DocType_ID(original.getC_DocType_ID());
else
setC_DocType_ID (C_DocTypeShipment_ID);
// Default - Today
if (movementDate != null)
setMovementDate (movementDate);
setDateAcct (getMovementDate());
// Copy from Order
setC_Order_ID(original.getC_Order_ID());
setDeliveryRule (original.getDeliveryRule());
setDeliveryViaRule (original.getDeliveryViaRule());
setM_Shipper_ID(original.getM_Shipper_ID());
setFreightCostRule (original.getFreightCostRule());
setFreightAmt(original.getFreightAmt());
setSalesRep_ID(original.getSalesRep_ID());
//
setC_Activity_ID(original.getC_Activity_ID());
setC_Campaign_ID(original.getC_Campaign_ID());
setC_Charge_ID(original.getC_Charge_ID());
setChargeAmt(original.getChargeAmt());
//
setC_Project_ID(original.getC_Project_ID());
setDateOrdered(original.getDateOrdered());
setDescription(original.getDescription());
setPOReference(original.getPOReference());
setSalesRep_ID(original.getSalesRep_ID());
setAD_OrgTrx_ID(original.getAD_OrgTrx_ID());
setUser1_ID(original.getUser1_ID());
setUser2_ID(original.getUser2_ID());
} // MInOut
/** Lines */
private MInOutLine[] m_lines = null;
/** Confirmations */
private MInOutConfirm[] m_confirms = null;
/** BPartner */
private MBPartner m_partner = null;
/**
* Get Document Status
* @return Document Status Clear Text
*/
public String getDocStatusName()
{
return MRefList.getListName(getCtx(), 131, getDocStatus());
} // getDocStatusName
/**
* Add to Description
* @param description text
*/
public void addDescription (String description)
{
String desc = getDescription();
if (desc == null)
setDescription(description);
else
setDescription(desc + " | " + description);
} // addDescription
/**
* String representation
* @return info
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -