Search in sources :

Example 16 with MMovementLine

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;
}
Also used : Arrays(java.util.Arrays) MDDOrder(org.eevolution.model.MDDOrder) Timestamp(java.sql.Timestamp) MClient(org.compiere.model.MClient) MDocType(org.compiere.model.MDocType) Env(org.compiere.util.Env) HashMap(java.util.HashMap) MDDOrderLine(org.eevolution.model.MDDOrderLine) MStorage(org.compiere.model.MStorage) ArrayList(java.util.ArrayList) MMovementLine(org.compiere.model.MMovementLine) BigDecimal(java.math.BigDecimal) List(java.util.List) MAttributeSet(org.compiere.model.MAttributeSet) Query(org.compiere.model.Query) DB(org.compiere.util.DB) AdempiereException(org.adempiere.exceptions.AdempiereException) MMovement(org.compiere.model.MMovement) Optional(java.util.Optional) MLocator(org.compiere.model.MLocator) MProduct(org.compiere.model.MProduct) MProductCategory(org.compiere.model.MProductCategory) MProduct(org.compiere.model.MProduct) Timestamp(java.sql.Timestamp) MStorage(org.compiere.model.MStorage) BigDecimal(java.math.BigDecimal) MDDOrderLine(org.eevolution.model.MDDOrderLine) MProductCategory(org.compiere.model.MProductCategory) MLocator(org.compiere.model.MLocator) MMovementLine(org.compiere.model.MMovementLine)

Example 17 with MMovementLine

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;
}
Also used : MMovementLine(org.compiere.model.MMovementLine) MMovement(org.compiere.model.MMovement)

Example 18 with MMovementLine

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;
}
Also used : MInOut(org.compiere.model.MInOut) Query(org.compiere.model.Query) MInOutLine(org.compiere.model.MInOutLine) MWarehouse(org.compiere.model.MWarehouse) MOrder(org.compiere.model.MOrder) MLocator(org.compiere.model.MLocator) MOrderLine(org.compiere.model.MOrderLine) MMovementLine(org.compiere.model.MMovementLine) MMovement(org.compiere.model.MMovement)

Example 19 with MMovementLine

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);
//
}
Also used : MDDOrderLine(org.eevolution.model.MDDOrderLine) AdempiereException(org.adempiere.exceptions.AdempiereException) Trx(org.compiere.util.Trx) MDDOrder(org.eevolution.model.MDDOrder) Properties(java.util.Properties) MMovementLine(org.compiere.model.MMovementLine) Timestamp(java.sql.Timestamp) MMovement(org.compiere.model.MMovement) BigDecimal(java.math.BigDecimal)

Example 20 with MMovementLine

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;
}
Also used : MDocType(org.compiere.model.MDocType) Env(org.compiere.util.Env) MDDOrderLine(org.eevolution.model.MDDOrderLine) Constructor(java.lang.reflect.Constructor) MMovementLine(org.compiere.model.MMovementLine) Ini(org.compiere.util.Ini) BigDecimal(java.math.BigDecimal) List(java.util.List) AdempiereException(org.adempiere.exceptions.AdempiereException) Msg(org.compiere.util.Msg) MMovement(org.compiere.model.MMovement) PO(org.compiere.model.PO) IPrintDocument(org.eevolution.form.IPrintDocument) MDDOrderLine(org.eevolution.model.MDDOrderLine) AdempiereException(org.adempiere.exceptions.AdempiereException) List(java.util.List) MMovementLine(org.compiere.model.MMovementLine) BigDecimal(java.math.BigDecimal)

Aggregations

MMovementLine (org.compiere.model.MMovementLine)21 BigDecimal (java.math.BigDecimal)12 MMovement (org.compiere.model.MMovement)12 MProduct (org.compiere.model.MProduct)8 MStorage (org.compiere.model.MStorage)7 AdempiereException (org.adempiere.exceptions.AdempiereException)6 MInOutLine (org.compiere.model.MInOutLine)6 MInventoryLine (org.compiere.model.MInventoryLine)6 MLocator (org.compiere.model.MLocator)6 Timestamp (java.sql.Timestamp)5 MDDOrderLine (org.eevolution.model.MDDOrderLine)5 ArrayList (java.util.ArrayList)4 Properties (java.util.Properties)4 MClient (org.compiere.model.MClient)4 MDDOrder (org.eevolution.model.MDDOrder)4 MDocType (org.compiere.model.MDocType)3 MMatchInv (org.compiere.model.MMatchInv)3 MMatchPO (org.compiere.model.MMatchPO)3 MOrderLine (org.compiere.model.MOrderLine)3 MWarehouse (org.compiere.model.MWarehouse)3