Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Microsoft.Manufacturing.Subcontracting;

using Microsoft.Foundation.Company;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
Expand Down Expand Up @@ -296,6 +297,10 @@ codeunit 99001505 "Subcontracting Management"
TempForReservationEntry: Record "Reservation Entry" temporary;
TempTrackingSpecification: Record "Tracking Specification" temporary;
ProdOrderCompReserve: Codeunit "Prod. Order Comp.-Reserve";
UnitOfMeasureManagement: Codeunit "Unit of Measure Management";
QtyToReserve: Decimal;
QtyToReserveBase: Decimal;
AvailableToReserveBase: Decimal;
begin
if (TransferReceiptLine."Subc. Prod. Order No." = '') or (TransferReceiptLine."Subc. Operation No." = '') then
exit;
Expand All @@ -308,36 +313,59 @@ codeunit 99001505 "Subcontracting Management"
ItemLedgerEntry.SetRange("Document No.", TransferReceiptLine."Document No.");
ItemLedgerEntry.SetRange("Document Line No.", TransferReceiptLine."Line No.");
ItemLedgerEntry.SetRange("Location Code", TransferReceiptLine."Transfer-to Code");
ItemLedgerEntry.SetLoadFields("Serial No.", "Lot No.", "Package No.", "Variant Code", "Location Code", "Qty. per Unit of Measure", Quantity);
ItemLedgerEntry.SetLoadFields("Serial No.", "Lot No.", "Package No.", "Variant Code", "Location Code", Quantity);
if not ItemLedgerEntry.IsEmpty() then begin
ItemLedgerEntry.FindSet();
repeat
if (ItemLedgerEntry."Lot No." <> '') or (ItemLedgerEntry."Serial No." <> '') or (ItemLedgerEntry."Package No." <> '') then begin
if not TempTrackingSpecification.IsEmpty() then
TempTrackingSpecification.DeleteAll();
TempTrackingSpecification."Source Type" := Database::"Item Ledger Entry";
TempTrackingSpecification."Source Subtype" := 0;
TempTrackingSpecification."Source ID" := '';
TempTrackingSpecification."Source Batch Name" := '';
TempTrackingSpecification."Source Prod. Order Line" := 0;
TempTrackingSpecification."Source Ref. No." := ItemLedgerEntry."Entry No.";
TempTrackingSpecification."Variant Code" := ItemLedgerEntry."Variant Code";
TempTrackingSpecification."Location Code" := ItemLedgerEntry."Location Code";
TempTrackingSpecification."Serial No." := ItemLedgerEntry."Serial No.";
TempTrackingSpecification."Lot No." := ItemLedgerEntry."Lot No.";
TempTrackingSpecification."Package No." := ItemLedgerEntry."Package No.";
TempTrackingSpecification."Qty. per Unit of Measure" := ItemLedgerEntry."Qty. per Unit of Measure";
TempTrackingSpecification.Insert();

ProdOrderCompReserve.CreateReservationSetFrom(TempTrackingSpecification);
TempForReservationEntry.CopyTrackingFromSpec(TempTrackingSpecification);
ProdOrderCompReserve.CreateReservation(
ProdOrderComponent,
ProdOrderComponent.Description,
ProdOrderComponent."Due Date",
ItemLedgerEntry.Quantity,
ItemLedgerEntry.Quantity * ItemLedgerEntry."Qty. per Unit of Measure",
TempForReservationEntry);
// Only reserve up to the component's remaining need. Excess received quantity
// (e.g. when more was transferred to/from the subcontractor than the component requires)
// is left as free inventory instead of failing with "Reserved quantity cannot be greater than 0".
ProdOrderComponent.CalcFields("Reserved Qty. (Base)");
AvailableToReserveBase := Abs(ProdOrderComponent."Remaining Qty. (Base)") - Abs(ProdOrderComponent."Reserved Qty. (Base)");

// Item ledger entry quantities are always stored in the base unit of measure.
QtyToReserveBase := ItemLedgerEntry.Quantity;
if QtyToReserveBase > AvailableToReserveBase then
// Serial-tracked entries are indivisible, so skip the entry entirely when it no longer
// fully fits. Lot- and package-tracked entries can be reserved partially.
if ItemLedgerEntry."Serial No." <> '' then
QtyToReserveBase := 0
else
QtyToReserveBase := AvailableToReserveBase;

if QtyToReserveBase > 0 then begin
if ProdOrderComponent."Qty. per Unit of Measure" <> 0 then
QtyToReserve := UnitOfMeasureManagement.CalcQtyFromBase(QtyToReserveBase, ProdOrderComponent."Qty. per Unit of Measure")
else
QtyToReserve := QtyToReserveBase;

if not TempTrackingSpecification.IsEmpty() then
TempTrackingSpecification.DeleteAll();
TempTrackingSpecification."Source Type" := Database::"Item Ledger Entry";
TempTrackingSpecification."Source Subtype" := 0;
TempTrackingSpecification."Source ID" := '';
TempTrackingSpecification."Source Batch Name" := '';
TempTrackingSpecification."Source Prod. Order Line" := 0;
TempTrackingSpecification."Source Ref. No." := ItemLedgerEntry."Entry No.";
TempTrackingSpecification."Variant Code" := ItemLedgerEntry."Variant Code";
TempTrackingSpecification."Location Code" := ItemLedgerEntry."Location Code";
TempTrackingSpecification."Serial No." := ItemLedgerEntry."Serial No.";
TempTrackingSpecification."Lot No." := ItemLedgerEntry."Lot No.";
TempTrackingSpecification."Package No." := ItemLedgerEntry."Package No.";
TempTrackingSpecification."Qty. per Unit of Measure" := ProdOrderComponent."Qty. per Unit of Measure";
TempTrackingSpecification.Insert();

ProdOrderCompReserve.CreateReservationSetFrom(TempTrackingSpecification);
TempForReservationEntry.CopyTrackingFromSpec(TempTrackingSpecification);
ProdOrderCompReserve.CreateReservation(
ProdOrderComponent,
ProdOrderComponent.Description,
ProdOrderComponent."Due Date",
QtyToReserve,
QtyToReserveBase,
TempForReservationEntry);
end;
end;
until ItemLedgerEntry.Next() = 0;
end;
Expand Down
Loading
Loading