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