use of org.compiere.model.MMovementLine in project adempiere by adempiere.
the class MovementGenerate method createLine.
// generate
/**************************************************************************
* Create Line
* @param Distribution order order
* @param orderLine line
* @param qty qty
* @param storages storage info
* @param force force delivery
*/
private void createLine(MDDOrder order, MDDOrderLine orderLine, BigDecimal qty, MStorage[] storages, boolean force) {
// Complete last Shipment - can have multiple shipments
if (m_lastC_BPartner_Location_ID != order.getC_BPartner_Location_ID())
completeMovement();
m_lastC_BPartner_Location_ID = order.getC_BPartner_Location_ID();
// Create New Shipment
if (m_movement == null) {
MLocator locator = MLocator.get(getCtx(), orderLine.getM_Locator_ID());
m_movement = createMovement(order, m_movementDate);
m_movement.setAD_Org_ID(locator.getAD_Org_ID());
//m_movement.setM_Warehouse_ID(orderLine.getM_Warehouse_ID()); // sets Org too
m_movement.setIsInTransit(true);
m_movement.setDD_Order_ID(order.getDD_Order_ID());
if (order.getC_BPartner_ID() != order.getC_BPartner_ID())
m_movement.setC_BPartner_ID(order.getC_BPartner_ID());
if (order.getC_BPartner_Location_ID() != order.getC_BPartner_Location_ID())
m_movement.setC_BPartner_Location_ID(order.getC_BPartner_Location_ID());
//Look the document type based on organization
int docTypeDO_ID = getDocType(MDocType.DOCBASETYPE_MaterialMovement, m_movement.getAD_Org_ID());
if (docTypeDO_ID > 0)
m_movement.setC_DocType_ID(docTypeDO_ID);
if (!m_movement.save())
throw new IllegalStateException("Could not create Movement");
}
// Non Inventory Lines
if (storages == null) {
MMovementLine line = new MMovementLine(m_movement);
line.setOrderLine(orderLine, Env.ZERO, false);
// Correct UOM
line.setMovementQty(qty);
if (orderLine.getQtyEntered().compareTo(orderLine.getQtyOrdered()) != 0)
line.setMovementQty(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<MMovementLine> list = new ArrayList<MMovementLine>();
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 && // positive storage
storage.getQtyOnHand().signum() >= 0) {
if (// Adjust to OnHand Qty
!force || // if force not on last location
(force && i + 1 != storages.length))
deliver = storage.getQtyOnHand();
}
if (// zero deliver
deliver.signum() == 0)
continue;
int M_Locator_ID = storage.getM_Locator_ID();
//
MMovementLine line = null;
if (// find line with Locator
!linePerASI) {
for (int ll = 0; ll < list.size(); ll++) {
MMovementLine test = (MMovementLine) list.get(ll);
if (test.getM_Locator_ID() == M_Locator_ID) {
line = test;
break;
}
}
}
if (// new line
line == null) {
line = new MMovementLine(m_movement);
line.setOrderLine(orderLine, deliver, false);
line.setMovementQty(deliver);
list.add(line);
} else
// existing line
line.setMovementQty(line.getMovementQty().add(deliver));
if (orderLine.getQtyEntered().compareTo(orderLine.getQtyOrdered()) != 0)
line.setMovementQty(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);
}
Aggregations