📄 inoutgenerate.java
字号:
+ " (Unconfirmed=" + unconfirmedShippedQty
+ "), ToDeliver=" + toDeliver + " - " + line);
} // for all order lines
// Complete Order successful
if (completeOrder && MOrder.DELIVERYRULE_CompleteOrder.equals(order.getDeliveryRule()))
{
for (int i = 0; i < lines.length; i++)
{
MOrderLine line = lines[i];
if (line.getM_Warehouse_ID() != p_M_Warehouse_ID)
continue;
MProduct product = line.getProduct();
BigDecimal toDeliver = line.getQtyOrdered().subtract(line.getQtyDelivered());
//
MStorage[] storages = null;
if (product != null && product.isStocked())
{
MProductCategory pc = MProductCategory.get(order.getCtx(), product.getM_Product_Category_ID());
String MMPolicy = pc.getMMPolicy();
if (MMPolicy == null || MMPolicy.length() == 0)
MMPolicy = client.getMMPolicy();
//
storages = getStorages(line.getM_Warehouse_ID(),
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),
product.getM_AttributeSet_ID(),
line.getM_AttributeSetInstance_ID()==0, minGuaranteeDate,
MClient.MMPOLICY_FiFo.equals(MMPolicy));
}
//
createLine (order, line, toDeliver, storages, false);
}
}
m_line += 1000;
} // while order
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, m_sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
completeShipment();
return "@Created@ = " + m_created;
} // generate
/**************************************************************************
* Create Line
* @param order order
* @param orderLine line
* @param qty qty
* @param force force delivery
*/
private void createLine (MOrder order, MOrderLine orderLine, BigDecimal qty,
MStorage[] storages, boolean force)
{
// Complete last Shipment - can have multiple shipments
if (m_lastC_BPartner_Location_ID != orderLine.getC_BPartner_Location_ID() )
completeShipment();
m_lastC_BPartner_Location_ID = orderLine.getC_BPartner_Location_ID();
// Create New Shipment
if (m_shipment == null)
{
m_shipment = new MInOut (order, 0, m_movementDate);
m_shipment.setM_Warehouse_ID(orderLine.getM_Warehouse_ID()); // sets Org too
if (order.getC_BPartner_ID() != orderLine.getC_BPartner_ID())
m_shipment.setC_BPartner_ID(orderLine.getC_BPartner_ID());
if (order.getC_BPartner_Location_ID() != orderLine.getC_BPartner_Location_ID())
m_shipment.setC_BPartner_Location_ID(orderLine.getC_BPartner_Location_ID());
if (!m_shipment.save())
throw new IllegalStateException("Could not create Shipment");
}
// Non Inventory Lines
if (storages == null)
{
MInOutLine line = new MInOutLine (m_shipment);
line.setOrderLine(orderLine, 0, Env.ZERO);
line.setQty(qty); // Correct UOM
if (orderLine.getQtyEntered().compareTo(orderLine.getQtyOrdered()) != 0)
line.setQtyEntered(qty
.multiply(orderLine.getQtyEntered())
.divide(orderLine.getQtyOrdered(), 12, BigDecimal.ROUND_HALF_UP));
line.setLine(m_line + orderLine.getLine());
if (!line.save())
throw new IllegalStateException("Could not create Shipment Line");
log.fine(line.toString());
return;
}
// Product
MProduct product = orderLine.getProduct();
boolean linePerASI = false;
if (product.getM_AttributeSet_ID() != 0)
{
MAttributeSet mas = MAttributeSet.get(getCtx(), product.getM_AttributeSet_ID());
linePerASI = mas.isInstanceAttribute();
}
// Inventory Lines
ArrayList<MInOutLine> list = new ArrayList<MInOutLine>();
BigDecimal toDeliver = qty;
for (int i = 0; i < storages.length; i++)
{
MStorage storage = storages[i];
BigDecimal deliver = toDeliver;
// Not enough On Hand
if (deliver.compareTo(storage.getQtyOnHand()) > 0
&& storage.getQtyOnHand().signum() >= 0) // positive storage
{
if (!force // Adjust to OnHand Qty
|| (force && i+1 != storages.length)) // if force not on last location
deliver = storage.getQtyOnHand();
}
if (deliver.signum() == 0) // zero deliver
continue;
int M_Locator_ID = storage.getM_Locator_ID();
//
MInOutLine line = null;
if (!linePerASI) // find line with Locator
{
for (int ll = 0; ll < list.size(); ll++)
{
MInOutLine test = (MInOutLine)list.get(ll);
if (test.getM_Locator_ID() == M_Locator_ID)
{
line = test;
break;
}
}
}
if (line == null) // new line
{
line = new MInOutLine (m_shipment);
line.setOrderLine(orderLine, M_Locator_ID, order.isSOTrx() ? deliver : Env.ZERO);
line.setQty(deliver);
list.add(line);
}
else // existing line
line.setQty(line.getMovementQty().add(deliver));
if (orderLine.getQtyEntered().compareTo(orderLine.getQtyOrdered()) != 0)
line.setQtyEntered(line.getMovementQty().multiply(orderLine.getQtyEntered())
.divide(orderLine.getQtyOrdered(), 12, BigDecimal.ROUND_HALF_UP));
line.setLine(m_line + orderLine.getLine());
if (linePerASI)
line.setM_AttributeSetInstance_ID(storage.getM_AttributeSetInstance_ID());
if (!line.save())
throw new IllegalStateException("Could not create Shipment Line");
log.fine("ToDeliver=" + qty + "/" + deliver + " - " + line);
toDeliver = toDeliver.subtract(deliver);
// Temp adjustment
storage.setQtyOnHand(storage.getQtyOnHand().subtract(deliver));
//
if (toDeliver.signum() == 0)
break;
}
if (toDeliver.signum() != 0)
throw new IllegalStateException("Not All Delivered - Remainder=" + toDeliver);
} // createLine
/**
* Get Storages
* @param M_Warehouse_ID
* @param M_Product_ID
* @param M_AttributeSetInstance_ID
* @param M_AttributeSet_ID
* @param allAttributeInstances
* @param minGuaranteeDate
* @param FiFo
* @return storages
*/
private MStorage[] getStorages(int M_Warehouse_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, int M_AttributeSet_ID,
boolean allAttributeInstances, Timestamp minGuaranteeDate,
boolean FiFo)
{
m_lastPP = new SParameter(M_Warehouse_ID,
M_Product_ID, M_AttributeSetInstance_ID, M_AttributeSet_ID,
allAttributeInstances, minGuaranteeDate, FiFo);
//
m_lastStorages = m_map.get(m_lastPP);
if (m_lastStorages == null)
{
m_lastStorages = MStorage.getWarehouse(getCtx(),
M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID,
M_AttributeSet_ID, allAttributeInstances, minGuaranteeDate,
FiFo, get_TrxName());
m_map.put(m_lastPP, m_lastStorages);
}
return m_lastStorages;
} // getStorages
/**
* Complete Shipment
*/
private void completeShipment()
{
if (m_shipment != null)
{
// Fails if there is a confirmation
if (!m_shipment.processIt(p_docAction))
log.warning("Failed: " + m_shipment);
m_shipment.save();
//
addLog(m_shipment.getM_InOut_ID(), m_shipment.getMovementDate(), null, m_shipment.getDocumentNo());
m_created++;
m_map = new HashMap<SParameter,MStorage[]>();
if (m_lastPP != null && m_lastStorages != null)
m_map.put(m_lastPP, m_lastStorages);
}
m_shipment = null;
m_line = 0;
} // completeOrder
/**
* InOutGenerate Parameter
*/
class SParameter
{
/**
* Parameter
* @param M_Warehouse_ID
* @param M_Product_ID
* @param M_AttributeSetInstance_ID
* @param M_AttributeSet_ID
* @param allAttributeInstances
* @param minGuaranteeDate
* @param FiFo
*/
protected SParameter (int M_Warehouse_ID,
int M_Product_ID, int M_AttributeSetInstance_ID, int M_AttributeSet_ID,
boolean allAttributeInstances, Timestamp minGuaranteeDate,
boolean FiFo)
{
this.M_Warehouse_ID = M_Warehouse_ID;
this.M_Product_ID = M_Product_ID;
this.M_AttributeSetInstance_ID = M_AttributeSetInstance_ID;
this.M_AttributeSet_ID = M_AttributeSet_ID;
this.allAttributeInstances = allAttributeInstances;
this.minGuaranteeDate = minGuaranteeDate;
this.FiFo = FiFo;
}
public int M_Warehouse_ID;
public int M_Product_ID;
public int M_AttributeSetInstance_ID;
public int M_AttributeSet_ID;
public boolean allAttributeInstances;
public Timestamp minGuaranteeDate;
public boolean FiFo;
/**
* Equals
* @param obj
* @return true if equal
*/
public boolean equals (Object obj)
{
if (obj != null && obj instanceof SParameter)
{
SParameter cmp = (SParameter)obj;
boolean eq = cmp.M_Warehouse_ID == M_Warehouse_ID
&& cmp.M_Product_ID == M_Product_ID
&& cmp.M_AttributeSetInstance_ID == M_AttributeSetInstance_ID
&& cmp.M_AttributeSet_ID == M_AttributeSet_ID
&& cmp.allAttributeInstances == allAttributeInstances
&& cmp.FiFo == FiFo;
if (eq)
{
if (cmp.minGuaranteeDate == null && minGuaranteeDate == null)
;
else if (cmp.minGuaranteeDate != null && minGuaranteeDate != null
&& cmp.minGuaranteeDate.equals(minGuaranteeDate))
;
else
eq = false;
}
return eq;
}
return false;
} // equals
/**
* hashCode
* @return hash code
*/
public int hashCode ()
{
long hash = M_Warehouse_ID
+ (M_Product_ID * 2)
+ (M_AttributeSetInstance_ID * 3)
+ (M_AttributeSet_ID * 4);
if (allAttributeInstances)
hash *= -1;
if (FiFo);
hash *= -2;
if (hash < 0)
hash = -hash + 7;
while (hash > Integer.MAX_VALUE)
hash -= Integer.MAX_VALUE;
//
if (minGuaranteeDate != null)
{
hash += minGuaranteeDate.hashCode();
while (hash > Integer.MAX_VALUE)
hash -= Integer.MAX_VALUE;
}
return (int)hash;
} // hashCode
} // Parameter
} // InOutGenerate
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -