Restrict the Reservation setting to zero on sales changes

GopPdsShelfLifeMovUpdConfirmDialogFactory_Extension


gopSalesLine_Table_Extension


GopSalesTable_Form_Extension


gopSalesTable2LineUpdate_Extension


gopSalesTable2LineUpdatePrompt_Extension


SalesOrderBatchReservationController


[ExtensionOf(classStr(PdsShelfLifeMovUpdConfirmDialogFactory ))]


final class gopPdsShelfLifeMovUpdConfirmDialogFactory_Extension


{


    public PdsShelfLifeIMovUpdConfirmDialog createConfirmDialogFromLineAndField(


        Common  _orderLineBuffer,


        FieldId _fieldNumberChanged,


        boolean _isContextServerBound)


    {


        PdsShelfLifeIMovUpdConfirmDialog instance = next createConfirmDialogFromLineAndField(_orderLineBuffer, _fieldNumberChanged, _isContextServerBound);


        PdsShelfLifeIMovUpdConfirmDialog createdInstance;


        SalesLine salesLine;


        boolean hasAutoReservation;


        boolean canGeneratePrompt;


 


        switch (_orderLineBuffer.TableId)


        {


            case tableNum(SalesLine):


                salesLine = _orderLineBuffer as SalesLine;


                hasAutoReservation = salesLine.Reservation == ItemReservation::Automatic;


                if(!this.canGeneratePrompt(_isContextServerBound, _orderLineBuffer))


                {


                    if(salesLine.gopHasValidBatchReservation())


                    {


                        instance.parmIsRecordMarked(true);


                    }


                    else


                    {


                        instance.parmIsRecordMarked(false);


                    }


                }


                break;


        }


        return instance;


    }




}




public boolean gopHasValidBatchReservation()


{


    boolean ret;


    gopSalesOrderBatchReservationView gopSalesOrderBatchReservationView;


    SalesOrderBatchReservationController soBatchReservationController;


   




    SalesReceiptDateRequested salesReceiptDateRequested = SalesTable::find(this.SalesId).ReceiptDateRequested;


    boolean checkMultiplePartialReservation = this.checkMultiplePartialReservation();


    if (!checkMultiplePartialReservation)


    {


        select inventBatchId from gopSalesOrderBatchReservationView


            where gopSalesOrderBatchReservationView.inventTransId == this.InventTransId


                && gopSalesOrderBatchReservationView.ReferenceId == this.SalesId


                && gopSalesOrderBatchReservationView.itemId == this.ItemId;


        {


            if(InventBatch::pdsCheckExpiryDate(gopSalesOrderBatchReservationView.inventBatchId, this.ItemId, SalesReceiptDateRequested))


            {


                ret = true;


            }


            else


            {


                ret = false;


            }


        }


    }


    else


    {


        try


        {


            soBatchReservationController = new SalesOrderBatchReservationController();


            soBatchReservationController.processRemoveLineReservation(this, SalesReceiptDateRequested);


            ret = true;


        }


        catch (Exception::Error)


        {


            ttsabort;


            error(strFmt('@gopFCCLabel:LossReservationFail', this.salesId));


        }


        catch (Exception::Deadlock)


        {


            ttsabort;


            error(strFmt('@gopFCCLabel:LossReservationFailDeadLock',this.salesId));


            retry;


        }


        catch (Exception::UpdateConflict)


        {


            ttsabort;


            if (appl.ttsLevel() == 0)


            {


                error(strFmt('@gopFCCLabel:LossReservationFailUpdateConflict', this.salesId));


                retry;


            }


            else


            {


                throw Exception::UpdateConflictNotRecovered;


            }


        }


    }


    return ret;


}




public boolean checkMultiplePartialReservation()


{


    gopSalesOrderBatchReservationView gopSalesOrderBatchReservationView;


    SalesOrderBatchReservationController soBatchReservationController;




    boolean ret = false;


    select count(RecId) from gopSalesOrderBatchReservationView


        where gopSalesOrderBatchReservationView.inventTransId == this.InventTransId


            && gopSalesOrderBatchReservationView.ReferenceId == this.SalesId


            && gopSalesOrderBatchReservationView.itemId == this.ItemId;


    if (gopSalesOrderBatchReservationView.RecId > 1)


    {


        ret = true;


    }


    return ret;


}




/// <summary>


/// Updates sales order lines if prompt was confirmed by user and any


/// of the header fields with impact on the


/// order lines have changed.


/// </summary>


/// <returns>


/// A Boolean value indicating whether the update occurred.


/// </returns>


protected boolean updateSalesLinesWithPrompt()


{


    boolean ret ;


    /*FormDataSource salesTable_ds = this.dataSource(formDataSourceStr(SalesTable, SalesTable));


    SalesTable salesTable = salesTable_ds.cursor();


    SalesReceiptDateRequested ReceiptDateRequeste = salesTable.ReceiptDateRequested;


    salesTable2LineUpdatePrompt.parmgopreceiptDateRequested(salesTable.ReceiptDateRequested);*/


    ret = next updateSalesLinesWithPrompt();




    return ret;


}




[ExtensionOf(classStr(SalesTable2LineUpdate))]


final class gopSalesTable2LineUpdate_Extension


{


    public SalesReceiptDateRequested receiptDateRequested;


    public SalesReceiptDateRequested parmgopreceiptDateRequestedUpdate(SalesReceiptDateRequested _receiptDateRequested = receiptDateRequested)


    {


        receiptDateRequested = _receiptDateRequested;


        return receiptDateRequested;


    }




    protected void reReserveShelfInventory(SalesLine  _salesLine, AxSalesTable _axSalesTable)


    {


        //_salesLine.ReceiptDateRequested = this.parmgopreceiptDateRequestedUpdate();


        next reReserveShelfInventory(_salesLine, _axSalesTable);


        


    }




    protected void initFromSalesTable2LineUpdatePrompt(SalesTable2LineUpdatePrompt _salesTable2LineUpdatePrompt)


    {


        this.parmgopreceiptDateRequestedUpdate(_salesTable2LineUpdatePrompt.parmgopreceiptDateRequested());


        next initFromSalesTable2LineUpdatePrompt(_salesTable2LineUpdatePrompt);


        


    }




}




[ExtensionOf(classStr(SalesTable2LineUpdatePrompt))]


final class gopSalesTable2LineUpdatePrompt_Extension


{


    public SalesReceiptDateRequested receiptDateRequested;




    public SalesReceiptDateRequested parmgopreceiptDateRequested(SalesReceiptDateRequested _receiptDateRequested = receiptDateRequested)


    {


        receiptDateRequested = _receiptDateRequested;


        return receiptDateRequested;


    }




}




/// <summary>


/// Sales Order Reservation Controller - Validates and manages inventory reservations


/// based on batch expiration date vs requested receipt date


/// </summary>


class SalesOrderBatchReservationController


{


    /// <summary>


    /// Process reservation for a single sales line


    /// </summary>


    /// <param name="_salesLine">Sales line record</param>


    /// <param name="_requestedReceiptDate">Requested receipt date from sales order header</param>


    public void processRemoveLineReservation(SalesLine _salesLine, TransDate _requestedReceiptDate)


    {


        InventDim       inventDim;


        gopSalesOrderBatchReservationView gopSalesOrderBatchReservationView;




        // Loop through all reservations (StatusIssue = ReservPhysical) for the line


        


        ttsbegin;


        while select sum(qty), maxof(inventDimId) from gopSalesOrderBatchReservationView


                group by inventBatchId


            where gopSalesOrderBatchReservationView.inventTransId == _salesLine.inventTransId


                && gopSalesOrderBatchReservationView.ReferenceId == _salesLine.SalesId


                && gopSalesOrderBatchReservationView.itemId == _salesLine.ItemId


                && gopSalesOrderBatchReservationView.expDate <= _requestedReceiptDate


        {


            inventDim = inventDim::find(gopSalesOrderBatchReservationView.inventDimId);


            this.removeReservation(_salesLine, inventDim, gopSalesOrderBatchReservationView.Qty);


        }


        ttscommit;


    }




    /// <summary>


    /// Remove the physical reservation for a sales line and inventory dimension


    /// </summary>


    /// <param name="_salesLine">Sales line</param>


    /// <param name="_inventDim">Inventory dimension containing the batch</param>


    public void removeReservation(SalesLine _salesLine, InventDim _inventDim,InventQty _inventTransQty)


    {


        InventUpd_Reservation   inventUpdReservation;


        InventQty               reservedQty;


        InventDimParm           inventDimParm;




        inventDimParm.setAllInventDim();




        if (_inventTransQty != 0)


        {


            // Use InventUpd_Reservation to unreserve


            inventUpdReservation = InventUpd_Reservation::newParameters(InventMovement::construct(_salesLine),// Movement


                                                                        _inventDim,// Inventory dimension (with batch)


                                                                        inventDimParm,


                                                                        0,


                                                                        -_inventTransQty,// Negative qty to unreserve


                                                                        false );// Not a forced reservation




            inventUpdReservation.updateNow();




            info(strFmt('@gopFCCLabel:LossReservationReferenceDetails',_salesLine.SalesId, _salesLine.ItemId, _salesLine.InventTransId, abs(_inventTransQty)));


        }


    }




}




Select inventTransId,linenum ItemId from SalesLine


    where salesid = 'SO000007948'




select inventDim.inventbatchId, InventTransOrigin.INVENTTRANSID, inventTrans.qty, inventTrans.StatusIssue from inventDim


            join inventTrans


                on InventDim.inventDimId = inventTrans.inventDimId


            join InventTransOrigin


                on inventTrans.inventTransOrigin = InventTransOrigin.recId


            join SalesLine


                on SalesLine.inventTransId = InventTransOrigin.inventTransId


                    where SalesLine.inventTransId = 'LOT0219710'










select inventDim.inventbatchId, inventDim.inventDimId,InventTransOrigin.inventTransId,WHSInventReserve.itemid,inventTrans.qty,inventTrans.StatusIssue, InventTransOrigin .ReferenceCategory  from inventDim


    join inventTrans


        on InventDim.inventDimId = inventTrans.inventDimId


    join Inventbatch 


        on inventbatch.inventBatchId = inventDim.inventBatchId


    join WHSInventReserve 


        on WHSInventReserve.inventDimID = inventDim.inventDimId


    join InventTransOrigin


        on inventTrans.inventTransOrigin = InventTransOrigin.recId


    join salesLine


        on salesLine.inventTransId = InventTransOrigin.inventTransId


            where salesid = 'SO000007948'


                and WHSInventReserve.itemId = salesLine.itemId


                and inventbatch.itemId = salesLine.itemId


                and SalesLine.inventTransId = 'LOT0219710'




select inventDim.recid, inventDim.inventbatchId, inventDim.inventDimId,InventTransOrigin.inventTransId,WHSInventReserve.itemid,inventTrans.qty,inventTrans.StatusIssue, InventTransOrigin .ReferenceCategory from inventDim


    join inventTrans


            on inventTrans.inventDimId = InventDim.inventDimId


        join whsInventReserve


            on whsInventReserve.inventDimID = inventDim.inventDimId


        join Inventbatch


            on inventbatch.inventBatchId = inventDim.inventBatchId


    join inventTransOrigin


        on inventTransOrigin.recId = inventTrans.inventTransOrigin


        


            where inventTransOrigin.inventTransId = 'LOT0219710'


            And inventTransOrigin.ReferenceCategory  = 0


            And inventTransOrigin.ReferenceId = 'SO000007948'


            --And inventTransOrigin.InventRefId = 1


            And inventTrans.StatusIssue = 4


            And whsInventReserve.itemId = '10232'


            And inventbatch.itemId = '10232'




select inventTransOrigin.ReferenceId,inventDim.recId, inventDim.inventbatchId, inventDim.inventDimId,InventTransOrigin.inventTransId,WHSInventReserve.itemid,inventTrans.qty,inventTrans.StatusIssue, InventTransOrigin.ReferenceCategory,inventbatch.EXPDATE from inventDim


    join inventTrans


            on inventTrans.inventDimId = InventDim.inventDimId


        join whsInventReserve


            on whsInventReserve.inventDimID = inventDim.inventDimId


        join Inventbatch


            on inventbatch.inventBatchId = inventDim.inventBatchId


    join inventTransOrigin


        on inventTransOrigin.recId = inventTrans.inventTransOrigin


        join SalesTable 


            on  salesTable.salesId = inventTransOrigin.ReferenceId


            where inventTransOrigin.ReferenceCategory  = 0


            --And inventTransOrigin.ReferenceId = 'SO000007948'


            --And inventTransOrigin.InventRefId = 1


            And inventTrans.StatusIssue = 4


            And whsInventReserve.itemId = inventTrans.itemId


            And inventbatch.itemId = inventTrans.itemId


            and salesTable.releaseStatus = 0


            and salesTable.inventSiteId = '02'


            and SalesTable.inventLocationId = '02'


            --and inventTransOrigin.inventTransId = 'LOT0219710'


            order by inventbatch.EXPDATE desc






 select sum(qty), max(InventDimRecId), max(gopSalesOrderBatchReservationView.itemId), max(gopSalesOrderBatchReservationView.DATAAREAID) from gopSalesOrderBatchReservationView


     where gopSalesOrderBatchReservationView.ReferenceId = 'SO000007948'


                --And gopSalesOrderBatchReservationView.inventTransId = 'LOT0219710'


                --And gopSalesOrderBatchReservationView.itemId = '10232'


                group by inventBatchId


select sum(qty), max(InventDimRecId), max(gopSalesOrderBatchReservationView.itemId), max(gopSalesOrderBatchReservationView.DATAAREAID) from gopSalesOrderBatchReservationView


     where gopSalesOrderBatchReservationView.ReferenceId = 'SO000007948'


                And gopSalesOrderBatchReservationView.inventTransId = 'LOT0219713'


                --And gopSalesOrderBatchReservationView.itemId = '10232'


                group by inventBatchId




Select * from whsInventReserve


    where 




            

Comments

Popular posts from this blog

Price disc agreement

Sample integration

Create ledger journals in D365FO using X++ + LedgerDimensionACType