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
Post a Comment