namespace JRO.PurchaseCustomizations; using Microsoft.Inventory.Item; using Microsoft.Purchases.Document; codeunit 60301 "JRO Purch. Line Date Fix" { var SuppressManualOverrideMarkingDepth: Integer; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'No.', false, false)] local procedure PurchaseLineOnBeforeValidateNo(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin BeginSystemDateUpdate(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'No.', false, false)] local procedure PurchaseLineOnAfterValidateNo(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin EndSystemDateUpdate(); if not IsOrderItemLine(Rec) then exit; if Rec."No." = '' then exit; Rec."Auto Manage Receipt Dates" := true; ApplyItemLeadTimeDates(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'Location Code', false, false)] local procedure PurchaseLineOnBeforeValidateLocationCode(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin BeginSystemDateUpdate(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'Location Code', false, false)] local procedure PurchaseLineOnAfterValidateLocationCode(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin EndSystemDateUpdate(); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'Variant Code', false, false)] local procedure PurchaseLineOnBeforeValidateVariantCode(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin BeginSystemDateUpdate(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'Variant Code', false, false)] local procedure PurchaseLineOnAfterValidateVariantCode(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin EndSystemDateUpdate(); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'Quantity', false, false)] local procedure PurchaseLineOnBeforeValidateQuantity(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin BeginSystemDateUpdate(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'Quantity', false, false)] local procedure PurchaseLineOnAfterValidateQuantity(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin EndSystemDateUpdate(); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'Planned Receipt Date', false, false)] local procedure PurchaseLineOnBeforeValidatePlannedReceiptDate(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin MarkManualReceiptDateOverride(Rec, Rec."Planned Receipt Date" <> xRec."Planned Receipt Date"); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'Planned Receipt Date', false, false)] local procedure PurchaseLineOnAfterValidatePlannedReceiptDate(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin if IsManualOverrideMarkingSuppressed() then exit; if not IsOrderItemLine(Rec) then exit; MarkManualReceiptDateOverride(Rec, Rec."Planned Receipt Date" <> xRec."Planned Receipt Date"); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'Order Date', false, false)] local procedure PurchaseLineOnBeforeValidateOrderDate(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin BeginSystemDateUpdate(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'Order Date', false, false)] local procedure PurchaseLineOnAfterValidateOrderDate(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin EndSystemDateUpdate(); if not IsOrderItemLine(Rec) then exit; if Rec."Order Date" = xRec."Order Date" then exit; if not Rec."Auto Manage Receipt Dates" then exit; ApplyItemLeadTimeDates(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnBeforeValidateEvent', 'Lead Time Calculation', false, false)] local procedure PurchaseLineOnBeforeValidateLeadTimeCalculation(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin BeginSystemDateUpdate(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterValidateEvent', 'Lead Time Calculation', false, false)] local procedure PurchaseLineOnAfterValidateLeadTimeCalculation(var Rec: Record "Purchase Line"; var xRec: Record "Purchase Line"; CurrFieldNo: Integer) begin EndSystemDateUpdate(); if not IsOrderItemLine(Rec) then exit; if Rec."No." = '' then exit; if Rec."Lead Time Calculation" = xRec."Lead Time Calculation" then exit; if not Rec."Auto Manage Receipt Dates" then exit; ApplyItemLeadTimeDates(Rec); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterUpdateDates', '', false, false)] local procedure PurchaseLineOnAfterUpdateDates(var PurchaseLine: Record "Purchase Line") begin if not PurchaseLine."Auto Manage Receipt Dates" then exit; ApplyItemLeadTimeDates(PurchaseLine); end; [EventSubscriber(ObjectType::Table, Database::"Purchase Line", 'OnAfterInsertEvent', '', false, false)] local procedure PurchaseLineOnAfterInsert(var Rec: Record "Purchase Line"; RunTrigger: Boolean) begin if not IsOrderItemLine(Rec) then exit; if Rec."No." = '' then exit; Rec."Auto Manage Receipt Dates" := true; if ApplyItemLeadTimeDates(Rec) or Rec."Auto Manage Receipt Dates" then Rec.Modify(false); end; local procedure IsOrderItemLine(PurchLine: Record "Purchase Line"): Boolean begin exit( (PurchLine."Document Type" = PurchLine."Document Type"::Order) and (PurchLine.Type = PurchLine.Type::Item)); end; local procedure MarkManualReceiptDateOverride(var PurchLine: Record "Purchase Line"; DateChanged: Boolean) begin if IsManualOverrideMarkingSuppressed() then exit; if not DateChanged then exit; if not IsOrderItemLine(PurchLine) then exit; PurchLine."Auto Manage Receipt Dates" := false; end; local procedure BeginSystemDateUpdate(PurchLine: Record "Purchase Line") begin if not IsOrderLine(PurchLine) then exit; BeginSuppressManualOverrideMarking(); end; local procedure EndSystemDateUpdate() begin EndSuppressManualOverrideMarking(); end; local procedure BeginSuppressManualOverrideMarking() begin SuppressManualOverrideMarkingDepth += 1; end; local procedure EndSuppressManualOverrideMarking() begin if SuppressManualOverrideMarkingDepth <= 0 then begin SuppressManualOverrideMarkingDepth := 0; exit; end; SuppressManualOverrideMarkingDepth -= 1; end; local procedure IsManualOverrideMarkingSuppressed(): Boolean begin exit(SuppressManualOverrideMarkingDepth > 0); end; local procedure IsOrderLine(PurchLine: Record "Purchase Line"): Boolean begin exit(PurchLine."Document Type" = PurchLine."Document Type"::Order); end; local procedure ApplyItemLeadTimeDates(var PurchLine: Record "Purchase Line"): Boolean var Item: Record Item; LeadTimeCalculation: DateFormula; PlannedReceiptDate: Date; OrderDate: Date; HasChanges: Boolean; begin if not IsOrderItemLine(PurchLine) then exit(false); if PurchLine."No." = '' then exit(false); if not Item.Get(PurchLine."No.") then exit(false); LeadTimeCalculation := Item."Lead Time Calculation"; if Format(LeadTimeCalculation) = '' then exit(false); OrderDate := PurchLine."Order Date"; if OrderDate = 0D then exit(false); PlannedReceiptDate := CalcDate(LeadTimeCalculation, OrderDate); if PurchLine."Planned Receipt Date" <> PlannedReceiptDate then begin BeginSuppressManualOverrideMarking(); PurchLine.Validate("Planned Receipt Date", PlannedReceiptDate); EndSuppressManualOverrideMarking(); HasChanges := true; end; exit(HasChanges); end; }