use of org.compiere.model.MMovementLine in project adempiere by adempiere.
the class MovementGenerate method generate.
/**
* Generate Shipments
* @param distributionOrders Orders
* @return info
*/
private String generate(List<MDDOrder> distributionOrders) {
distributionOrders.stream().filter(order -> order != null).forEach(order -> {
getCurrentMovement().filter(movement -> movement != null || !isConsolidatetooneDocument()).filter(movement -> movement.getC_BPartner_Location_ID() != order.getC_BPartner_Location_ID() || movement.getM_Shipper_ID() != order.getM_Shipper_ID()).ifPresent(movement -> completeMovement());
log.fine("check: " + order + " - DeliveryRule=" + order.getDeliveryRule());
Timestamp minGuaranteeDate = getMovementDate();
StringBuilder where = new StringBuilder(" 1=1 ");
if (getWarehouseId() > 0)
where.append(" AND ").append(getWarehouseId()).append(" IN (SELECT l.M_Warehouse_ID FROM M_Locator l WHERE l.M_Locator_ID=M_Locator_ID) ");
if (getDatePromised() != null)
where.append(" AND (TRUNC(DatePromised)<=").append(DB.TO_DATE(getDatePromised(), true)).append(" OR DatePromised IS NULL)");
if (!MDDOrder.DELIVERYRULE_Force.equals(order.getDeliveryRule()))
where.append(" AND (DD_OrderLine.M_Product_ID IS NULL").append(" OR EXISTS (SELECT * FROM M_Product p ").append("WHERE DD_OrderLine.M_Product_ID=p.M_Product_ID").append(" AND IsExcludeAutoDelivery='N'))");
if (!isOrderswithunconfirmedShipments())
where.append(" AND NOT EXISTS (SELECT * FROM M_MovementLine iol").append(" INNER JOIN M_Movement io ON (iol.M_Movement_ID=io.M_Movement_ID) ").append("WHERE iol.DD_OrderLine_ID=DD_OrderLine.DD_OrderLine_ID AND io.DocStatus IN ('IP','WC'))");
List<MDDOrderLine> orderLines = order.getLines(where.toString(), "M_Product_ID");
orderLines.stream().filter(orderLine -> orderLine.getM_Product_ID() > 0 || orderLine.getC_Charge_ID() > 0).filter(orderLine -> orderLine.getConfirmedQty().signum() != 0).forEach(orderLine -> {
MLocator locator = new MLocator(getCtx(), orderLine.getM_Locator_ID(), get_TrxName());
if (getWarehouseId() > 0 && locator.getM_Warehouse_ID() != getWarehouseId())
return;
log.fine("check: " + orderLine);
BigDecimal onHand = Env.ZERO;
BigDecimal toDeliver = orderLine.getConfirmedQty();
MProduct product = orderLine.getProduct();
BigDecimal unconfirmedShippedQty = Env.ZERO;
if (isOrderswithunconfirmedShipments() && product != null && toDeliver.signum() != 0) {
String whereLine = "EXISTS (SELECT * FROM M_Movement io WHERE io.M_Movement_ID=M_MovementLine.M_Movement_ID AND io.DocStatus IN ('IP','WC'))";
MMovementLine[] movementLines = MMovementLine.getOfOrderLine(getCtx(), orderLine.getDD_OrderLine_ID(), whereLine, null);
unconfirmedShippedQty = Arrays.asList(movementLines).stream().map(MMovementLine::getMovementQty).reduce(BigDecimal.ZERO, BigDecimal::add);
String logInfo = "Unconfirmed Qty=" + unconfirmedShippedQty + " - ToDeliver=" + orderLine.getConfirmedQty() + "->";
toDeliver = orderLine.getConfirmedQty().subtract(unconfirmedShippedQty);
logInfo += toDeliver;
if (toDeliver.signum() < 0) {
toDeliver = Env.ZERO;
logInfo += " (set to 0)";
}
onHand = onHand.subtract(unconfirmedShippedQty);
log.fine(logInfo);
}
if ((product == null || !product.isStocked()) && (orderLine.getQtyOrdered().signum() == 0 || toDeliver.signum() != 0)) {
if (!MDDOrder.DELIVERYRULE_CompleteOrder.equals(order.getDeliveryRule()))
createLine(order, orderLine, toDeliver, null, false);
return;
}
String policyMaterialIssue = getPolicyIssue(product);
MStorage[] storages = getStorages(locator.getM_Warehouse_ID(), orderLine.getM_Product_ID(), orderLine.getM_AttributeSetInstance_ID(), product.getM_AttributeSet_ID(), orderLine.getM_AttributeSetInstance_ID() == 0, minGuaranteeDate, MClient.MMPOLICY_FiFo.equals(policyMaterialIssue));
onHand = Arrays.asList(storages).stream().map(MStorage::getQtyOnHand).reduce(BigDecimal.ZERO, BigDecimal::add);
boolean fullLine = onHand.compareTo(toDeliver) >= 0 || toDeliver.signum() < 0;
boolean completeOrder = MDDOrder.DELIVERYRULE_CompleteOrder.equals(order.getDeliveryRule());
if (completeOrder && !fullLine) {
log.fine("Failed CompleteOrder - OnHand=" + onHand + " (Unconfirmed=" + unconfirmedShippedQty + "), ToDeliver=" + toDeliver + " - " + orderLine);
return;
} else if (fullLine && MDDOrder.DELIVERYRULE_CompleteLine.equals(order.getDeliveryRule())) {
log.fine("CompleteLine - OnHand=" + onHand + " (Unconfirmed=" + unconfirmedShippedQty + ", ToDeliver=" + toDeliver + " - " + orderLine);
createLine(order, orderLine, toDeliver, storages, false);
} else if (MDDOrder.DELIVERYRULE_Availability.equals(order.getDeliveryRule()) && (onHand.signum() > 0 || orderLine.getConfirmedQty().signum() < 0)) {
BigDecimal deliver = orderLine.getConfirmedQty();
log.fine("Available - OnHand=" + onHand + " (Unconfirmed=" + unconfirmedShippedQty + "), ToDeliver=" + toDeliver + ", Delivering=" + deliver + " - " + orderLine);
if (deliver.compareTo(onHand) > 0)
deliver = onHand;
createLine(order, orderLine, deliver, storages, false);
} else if (MDDOrder.DELIVERYRULE_Force.equals(order.getDeliveryRule())) {
BigDecimal deliver = toDeliver;
log.fine("Force - OnHand=" + onHand + " (Unconfirmed=" + unconfirmedShippedQty + "), ToDeliver=" + toDeliver + ", Delivering=" + deliver + " - " + orderLine);
createLine(order, orderLine, deliver, storages, true);
} else if (MDDOrder.DELIVERYRULE_Manual.equals(order.getDeliveryRule()))
log.fine("Manual - OnHand=" + onHand + " (Unconfirmed=" + unconfirmedShippedQty + ") - " + orderLine);
else
log.fine("Failed: " + order.getDeliveryRule() + " - OnHand=" + onHand + " (Unconfirmed=" + unconfirmedShippedQty + "), ToDeliver=" + toDeliver + " - " + orderLine);
});
boolean completeOrder = MDDOrder.DELIVERYRULE_CompleteOrder.equals(order.getDeliveryRule());
if (completeOrder && MDDOrder.DELIVERYRULE_CompleteOrder.equals(order.getDeliveryRule())) {
for (MDDOrderLine orderLine : orderLines) {
MLocator l = new MLocator(getCtx(), orderLine.getM_Locator_ID(), get_TrxName());
if (getWarehouseId() > 0 && l.getM_Warehouse_ID() != getWarehouseId())
continue;
MProduct product = orderLine.getProduct();
BigDecimal toDeliver = orderLine.getQtyOrdered().subtract(orderLine.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 = getClient().getMMPolicy();
storages = getStorages(l.getM_Warehouse_ID(), orderLine.getM_Product_ID(), orderLine.getM_AttributeSetInstance_ID(), product.getM_AttributeSet_ID(), orderLine.getM_AttributeSetInstance_ID() == 0, minGuaranteeDate, MClient.MMPOLICY_FiFo.equals(MMPolicy));
}
createLine(order, orderLine, toDeliver, storages, false);
}
}
lineNo += 1000;
completeMovement();
});
return "@Created@ = " + createdCount;
}
use of org.compiere.model.MMovementLine in project adempiere by adempiere.
the class CostResult method createMovement.
public MMovement createMovement(Timestamp documentDate, BigDecimal qty) {
MMovement move = new MMovement(getCtx(), 0, trxName);
move.setAD_Org_ID(Env.getAD_Org_ID(getCtx()));
move.setC_DocType_ID((MDocType.getDocType(MDocType.DOCBASETYPE_MaterialMovement)));
move.setMovementDate(documentDate);
move.saveEx();
MMovementLine moveLine = new MMovementLine(getCtx(), 0, trxName);
moveLine.setAD_Org_ID(Env.getAD_Org_ID(getCtx()));
moveLine.setM_Movement_ID(move.getM_Movement_ID());
moveLine.setM_Product_ID(product.getM_Product_ID());
moveLine.setMovementQty(qty);
// Default HQ Locator
moveLine.setM_Locator_ID(101);
// Default Store Locator
moveLine.setM_LocatorTo_ID(102);
moveLine.saveEx();
move.processIt(DocAction.ACTION_Complete);
move.saveEx();
return move;
}
use of org.compiere.model.MMovementLine in project adempiere by adempiere.
the class LiberoValidator method docValidate.
// modelChange
public String docValidate(PO po, int timing) {
log.info(po.get_TableName() + " Timing: " + timing);
if (po instanceof MOrder && timing == TIMING_BEFORE_COMPLETE) {
MOrder order = (MOrder) po;
MPPMRP.C_Order(order);
}
if (po instanceof MInOut && timing == TIMING_AFTER_COMPLETE) {
MInOut inout = (MInOut) po;
if (inout.isSOTrx()) {
for (MInOutLine outline : inout.getLines()) {
updateMPPOrder(outline);
}
} else //Purchase Receipt
{
for (MInOutLine line : inout.getLines()) {
final String whereClause = "C_OrderLine_ID=? AND PP_Cost_Collector_ID IS NOT NULL";
Collection<MOrderLine> olines = new Query(po.getCtx(), MOrderLine.Table_Name, whereClause, po.get_TrxName()).setParameters(new Object[] { line.getC_OrderLine_ID() }).list();
for (MOrderLine oline : olines) {
if (oline.getQtyOrdered().compareTo(oline.getQtyDelivered()) >= 0) {
MPPCostCollector cc = new MPPCostCollector(po.getCtx(), oline.getPP_Cost_Collector_ID(), po.get_TrxName());
String docStatus = cc.completeIt();
cc.setDocStatus(docStatus);
cc.setDocAction(MPPCostCollector.DOCACTION_Close);
cc.saveEx();
return null;
}
}
}
}
} else // Update Distribution Order Line
if (po instanceof MMovement && timing == TIMING_AFTER_COMPLETE) {
MMovement move = (MMovement) po;
for (MMovementLine line : move.getLines(false)) {
if (line.getDD_OrderLine_ID() > 0) {
MDDOrderLine oline = new MDDOrderLine(line.getCtx(), line.getDD_OrderLine_ID(), po.get_TrxName());
MLocator locator_to = MLocator.get(line.getCtx(), line.getM_LocatorTo_ID());
MWarehouse warehouse = MWarehouse.get(line.getCtx(), locator_to.getM_Warehouse_ID());
if (warehouse.isInTransit()) {
oline.setQtyInTransit(oline.getQtyInTransit().add(line.getMovementQty()));
oline.setConfirmedQty(Env.ZERO);
} else {
oline.setQtyInTransit(oline.getQtyInTransit().subtract(line.getMovementQty()));
oline.setQtyDelivered(oline.getQtyDelivered().add(line.getMovementQty()));
}
oline.saveEx();
}
}
if (move.getDD_Order_ID() > 0) {
MDDOrder order = new MDDOrder(move.getCtx(), move.getDD_Order_ID(), move.get_TrxName());
order.setIsInTransit(isInTransting(order));
order.reserveStock(order.getLines(true, null));
order.saveEx();
}
}
return null;
}
use of org.compiere.model.MMovementLine in project adempiere by adempiere.
the class VOrderDistributionReceipt method generateMovements.
// saveSelection
/**************************************************************************
* Generate Shipments
*/
private void generateMovements() {
log.info("DD_Order_ID=" + m_DD_Order_ID);
log.info("MovementDate" + m_MovementDate);
String trxName = Trx.createTrxName("IOG");
//trx needs to be committed too
Trx trx = Trx.get(trxName, true);
// prevents from being called twice
m_selectionActive = false;
statusBar.setStatusLine(Msg.translate(Env.getCtx(), "M_Movement_ID"));
statusBar.setStatusDB(String.valueOf(selection.size()));
if (selection.size() <= 0)
return;
Properties m_ctx = Env.getCtx();
Timestamp MovementDate = (Timestamp) m_MovementDate;
MDDOrder order = new MDDOrder(m_ctx, Integer.parseInt(m_DD_Order_ID.toString()), trxName);
MMovement movement = new MMovement(m_ctx, 0, trxName);
movement.setDD_Order_ID(order.getDD_Order_ID());
movement.setAD_User_ID(order.getAD_User_ID());
movement.setPOReference(order.getPOReference());
movement.setReversal_ID(0);
movement.setM_Shipper_ID(order.getM_Shipper_ID());
movement.setDescription(order.getDescription());
movement.setC_BPartner_ID(order.getC_BPartner_ID());
movement.setC_BPartner_Location_ID(order.getC_BPartner_Location_ID());
movement.setAD_Org_ID(order.getAD_Org_ID());
movement.setAD_OrgTrx_ID(order.getAD_OrgTrx_ID());
movement.setAD_User_ID(order.getAD_User_ID());
movement.setC_Activity_ID(order.getC_Activity_ID());
movement.setC_Campaign_ID(order.getC_Campaign_ID());
movement.setC_Project_ID(order.getC_Project_ID());
movement.setMovementDate(MovementDate);
movement.setDeliveryRule(order.getDeliveryRule());
movement.setDeliveryViaRule(order.getDeliveryViaRule());
movement.setDocAction(MMovement.ACTION_Prepare);
movement.setDocStatus(MMovement.DOCSTATUS_Drafted);
//Look the document type for the organization
int docTypeDO_ID = getDocType(MDocType.DOCBASETYPE_MaterialMovement, order.getAD_Org_ID());
if (docTypeDO_ID > 0)
movement.setC_DocType_ID(docTypeDO_ID);
movement.saveEx();
for (int i = 0; i < selection.size(); i++) {
int DD_OrderLine_ID = selection.get(i);
MDDOrderLine oline = new MDDOrderLine(m_ctx, DD_OrderLine_ID, trxName);
MMovementLine line = new MMovementLine(movement);
line.setM_Product_ID(oline.getM_Product_ID());
BigDecimal QtyDeliver = (BigDecimal) miniTable.getValueAt(i, 1);
if (QtyDeliver == null | QtyDeliver.compareTo(oline.getQtyInTransit()) > 0)
throw new AdempiereException("Error in Qty");
line.setOrderLine(oline, QtyDeliver, true);
line.saveEx();
}
movement.setDocAction(MMovement.DOCACTION_Close);
movement.setDocStatus(movement.completeIt());
movement.saveEx();
trx.commit();
generateMovements_complete(movement);
//
}
use of org.compiere.model.MMovementLine in project adempiere by adempiere.
the class GenerateMovementMaterial method doIt.
/**
* Execute of logic for this process
*
* @return
* @throws Exception
*/
protected String doIt() throws Exception {
List<MDDOrderLine> orderLines = (List<MDDOrderLine>) getInstancesForSelection(get_TrxName());
orderLines.stream().filter(orderLine -> orderLine != null).forEach(orderLine -> {
createMovement(orderLine);
MMovementLine line = new MMovementLine(movement);
BigDecimal qtyDeliver = getSelectionAsBigDecimal(orderLine.get_ID(), "LINE_" + MDDOrderLine.COLUMNNAME_QtyInTransit);
if (qtyDeliver == null | qtyDeliver.compareTo(orderLine.getQtyInTransit()) > 0)
throw new AdempiereException("Error @QtyInTransit@");
line.setOrderLine(orderLine, qtyDeliver, true);
line.saveEx();
});
movement.processIt(MMovement.DOCACTION_Complete);
movement.saveEx();
printDocument(movement, "Inventory Move Hdr (Example)");
return result;
}
Aggregations