SalesLine Reservation in D365fo x++

SalesLine Reservation in D365fo x++

SQL:


    /// <summary>
    /// reserve sales line
    /// </summary>
    /// <param name = "_salesline">SalesLine</param>
    public static void reserveSalesLine(SalesLine _salesline)
    {
        InventBatch inventBatch;
        InventSum   inventSum;
        SalesLine   salesLine;
        InventDim   inventDim;
        InventTable inventTable;
        int         daysLeftforExpiry = 0;
        int         shelflife;
        int         rule = 0;
        int         acceptedPR = 0;
        Qty         qtyReserve = 0;
        Qty         saleLineQty = 0;
        DSAPickingRulePerId pickingrule;
        boolean     qtyReservedCheck = false;

        salesLine   = _salesline;
        pickingrule = _salesline.salesTable().DSAPickingRule;

        if(pickingrule == '')
        {
            warning("Picking rule is not available on sales order for reservation.");
        }
        else
        {
            if(salesLine.SalesQty > 0)
            {
                rule        = str2Int(pickingrule);
                inventTable = InventTable::find(salesLine.ItemId);
                shelflife   = inventTable.PdsShelfLife;
                inventDim   = salesLine.inventDim();
                acceptedPR  = (rule / 100) * shelflife;
                saleLineQty = salesLine.SalesQty;
                qtyReserve  = saleLineQty;

                inventBatch.clear();
                while select inventBatch
                    order by expDate asc
                    where inventBatch.itemId == inventTable.ItemId
                {
                    daysLeftforExpiry = inventBatch.expDate - today();

                    if(daysLeftforExpiry >= acceptedPR) //acceptable for reservation
                    {
                        inventSum.clear();
                        select firstonly1 inventSum
                            where inventSum.ItemId == inventTable.ItemId
                            && inventSum.InventSiteId == inventDim.InventSiteId
                            && inventSum.InventLocationId == inventDim.InventLocationId
                            && inventSum.InventBatchId == inventBatch.InventBatchId;

                        if(inventSum)
                        {
                            if(qtyReserve <= inventSum.availReservation())
                            {
                                DSASalesLineReservation::reservesalesLineByBatchId(salesLine,qtyReserve,inventBatch.inventBatchId);
                                //DSASalesLineReservation::updateReserve(salesLine,inventBatch.inventBatchId,qtyReserve);
                                qtyReservedCheck = true;
                                break;
                            }
                            else
                            {
                                DSASalesLineReservation::reservesalesLineByBatchId(salesLine,inventSum.availReservation(),inventBatch.inventBatchId);
                                //DSASalesLineReservation::updateReserve(salesLine,inventBatch.inventBatchId,inventSum.availReservation());
                                qtyReserve = qtyReserve - inventSum.availReservation();
                                qtyReservedCheck = true;
                            }
                        }
                    }
                }
            }
        }

        if(qtyReservedCheck == true)
        {
            Info("Quantity is reserved.");
        }
        
    }

    /// <summary>
    /// This method unreserves SalesLine record.
    /// </summary>
    /// <param name = "_salesLine">SalesLine</param>
    public static void unReserveSalesLine(SalesLine _salesLine)
    {
        InventTrans           inventTrans;
        InventTransOrigin     inventTransOrigin;
        InventMovement        inventMovement;
        InventUpd_Reservation inventUpd_Reservation;
        SalesLine             salesLine;

        try
        {
            // Remove reservations and markings on a reserved salesorder
            while select inventTrans
                where inventTrans.StatusReceipt     == StatusReceipt::None
                        && (inventTrans.StatusIssue == StatusIssue::ReservPhysical
                        ||  inventTrans.StatusIssue == StatusIssue::ReservOrdered)
            exists join inventTransOrigin
                where   inventTransOrigin.RecId == inventTrans.InventTransOrigin
            exists join salesLine
                where   salesLine.InventTransId == inventTransOrigin.InventTransId
                        &&  SalesLine.RecId     == _salesLine.RecId
            {
                if (inventTrans.MarkingRefInventTransOrigin)
                {
                    InventTransOrigin::deleteMarking(inventTrans.MarkingRefInventTransOrigin,
                                     inventTrans.InventTransOrigin,
                                     -inventTrans.Qty,
                                     true);

                    InventTransOrigin::deleteMarking(inventTrans.InventTransOrigin,
                                     inventTrans.MarkingRefInventTransOrigin,
                                     inventTrans.Qty,
                                     true);
                }

                if (inventTrans.StatusIssue == StatusIssue::ReservPhysical ||
                    inventTrans.StatusIssue == StatusIssue::ReservOrdered)
                {
                    inventMovement = inventTrans.inventmovement(true);
                    inventUpd_Reservation =
                    InventUpd_Reservation::newInventDim(inventmovement,
                                                        inventTrans.inventDim(),
                                                        -1 * inventTrans.Qty,
                                                        false);
                    inventUpd_Reservation.updatenow();
                }

            }
        }
        catch
        {
            warning("Batch reservation is failed.");
        }
    }

    /// <summary>
    /// This method reserves SalesLine record with specific InventBatchId.
    /// </summary>
    /// <param name = "_salesLine">SalesLine</param>
    /// <param name = "_reserveQuantity">InventQty</param>
    /// <param name = "_inventBatchId">InventBatchId</param>
    public static void reservesalesLineByBatchId(SalesLine _salesLine,
                                          InventQty _reserveQuantity,
                                          InventBatchId _inventBatchId)
    {
        InventUpd_Reservation reservation;
        InventMovement        movement;
        InventDim             inventDimSalesLine, inventDim;
      
        try
        {
            movement = InventMovement::construct(_salesLine);
        
            if (_reserveQuantity > 0)
            {
                inventDimSalesLine = InventDim::find(_salesLine.InventDimId);

                inventDim.clear();
                inventDim.data(inventDimSalesLine);
                inventDim.InventBatchId = _inventBatchId;

                inventDim = InventDim::findOrCreate(inventDim);

                reservation = InventUpd_Reservation::newInventDim(movement,
                                                             inventDim,
                                                           -_reserveQuantity,
                                                             false);
                reservation.updateNow();
            }
        }
        catch
        {
            warning("Batch reservation is failed.");
        }
    }

Comments

Popular posts from this blog

D365FO – AX – X++ –Refresh, Reread, Research, and ExecuteQuery

Create Inventory Journal through Code in D365FO X++