Skip to content

[Event Request] codeunit 99000774 "Calculate Routing Line" #30208

Description

@Simon110394

Why do you need this change?

We need two events in FinitelyLoadCapBack procedure in order to be able to calculate AvailTime in a different way before it used in subsequent procedures.
At the moment there are no other alternative events inside the procedure to do it.

Describe the request

In procedure FinitelyLoadCapBack of codeunit 99000774 "Calculate Routing Line" we need two events:

[IntegrationEvent(false, false)]
local procedure OnAfterCalcAvailTime1(var AvailTime: Decimal; EndTime: Time; AvailCap: Decimal; LastProdOrderCapNeed: Record "Prod. Order Capacity Need")
begin
end;

[IntegrationEvent(false, false)]
local procedure OnAfterCalcAvailTime2(var AvailTime: Decimal; EndTime: Time; AvailCap: Decimal; CalendarEntry: Record "Calendar Entry")
begin
end;

Changes between **:

local procedure FinitelyLoadCapBack(TimeType: Enum "Routing Time Type"; ConstrainedCapacity: Record "Capacity Constrained Resource"; ResourceIsConstrained: Boolean; ParentWorkCenter: Record "Capacity Constrained Resource"; ParentIsConstrained: Boolean)
    var
        LastProdOrderCapNeed: Record "Prod. Order Capacity Need";
        AvailTime: Decimal;
        ProdEndingDateTime: DateTime;
        ProdEndingDateTimeAddOneDay: DateTime;
        SetupTime: Decimal;
        TimetoProgram: Decimal;
        AvailCap: Decimal;
        DampTime: Decimal;
        xConCurrCap: Decimal;
        EndTime: Time;
        StartTime: Time;
        ShouldProcessLastProdOrderCapNeed: Boolean;
    begin
        if (RemainNeedQty = 0) and WaitTimeOnly then
            exit;
        EndTime := ProdEndingTime;
        ProdEndingDateTime := CreateDateTime(ProdEndingDate, ProdEndingTime);
        ProdEndingDateTimeAddOneDay := CreateDateTime(ProdEndingDate + 1, ProdEndingTime);
        ConCurrCap := ProdOrderRoutingLine."Concurrent Capacities";
        xConCurrCap := 1;

        LastProdOrderCapNeed.SetCapacityFilters(ProdOrderRoutingLine.Type, ProdOrderRoutingLine."No.");

        CalendarEntry.SetCapacityFilters(ProdOrderRoutingLine.Type, ProdOrderRoutingLine."No.");
        CalendarEntry.SetFilter("Starting Date-Time", '<= %1', ProdEndingDateTime);
        CalendarEntry.SetFilter("Ending Date-Time", '<= %1', ProdEndingDateTimeAddOneDay);
        OnFinitelyLoadCapBackOnAfterSetCalendarEntryFilters(CalendarEntry);
        if CalendarEntry.Find('+') then
            repeat
                if (EndTime > CalendarEntry."Ending Time") or (EndTime < CalendarEntry."Starting Time") or
                   (ProdEndingDate <> CalendarEntry.Date)
                then
                    EndTime := CalendarEntry."Ending Time";
                StartTime := EndTime;

                if (ConCurrCap = 0) or (CalendarEntry.Capacity < ConCurrCap) then
                    ConCurrCap := CalendarEntry.Capacity;
                if TimeType <> TimeType::"Run Time" then
                    RemainNeedQty := RemainNeedQty * ConCurrCap / xConCurrCap;
                xConCurrCap := ConCurrCap;

                CalculateDailyLoad(AvailCap, DampTime, ConstrainedCapacity, ResourceIsConstrained, ParentWorkCenter, ParentIsConstrained);
                SetupTime := 0;
                if TimeType = TimeType::"Run Time" then begin
                    SetupTime :=
                      Round(
                        ProdOrderRoutingLine."Setup Time" *
                        CalendarMgt.TimeFactor(ProdOrderRoutingLine."Setup Time Unit of Meas. Code") /
                        CalendarMgt.TimeFactor(Workcenter."Unit of Measure Code"),
                        Workcenter."Calendar Rounding Precision");
                    SetupTime := SetupTime * ConCurrCap;
                    OnFinitelyLoadCapBackOnAfterCalcSetupTime(ProdOrderRoutingLine, Workcenter, SetupTime);
                end;
                if RemainNeedQty + SetupTime <= AvailCap + DampTime then
                    AvailCap := AvailCap + DampTime;
                AvailCap :=
                  Round(AvailCap *
                    CalendarMgt.TimeFactor(Workcenter."Unit of Measure Code") *
                    100 / CalendarEntry.Efficiency / ConCurrCap, 1, '>');
                if CalendarEntry.Capacity = CalendarEntry."Absence Capacity" then
                    AvailCap := 0;

                ShouldProcessLastProdOrderCapNeed := AvailCap > 0;
                OnFinitelyLoadCapBackOnAfterCalcShouldProcessLastProdOrderCapNeed(
                    ProdOrderRoutingLine, AvailCap, CalendarEntry, ProdEndingTime, ProdEndingDate, TimeType, FirstInBatch, FirstEntry,
                    UpdateDates, RemainNeedQty, ProdOrderCapNeed, ProdOrder, NextCapNeedLineNo, Workcenter, LotSize, ShouldProcessLastProdOrderCapNeed);
                if ShouldProcessLastProdOrderCapNeed then begin
                    ProdEndingDateTime := CreateDateTime(CalendarEntry.Date, EndTime);
                    LastProdOrderCapNeed.SetFilter(
                      "Ending Date-Time", '>= %1 & < %2', CalendarEntry."Starting Date-Time", ProdEndingDateTimeAddOneDay);
                    LastProdOrderCapNeed.SetFilter(
                      "Starting Date-Time", '>= %1 & < %2', CalendarEntry."Starting Date-Time", ProdEndingDateTime);
                    if LastProdOrderCapNeed.Find('+') then
                        repeat
                            if LastProdOrderCapNeed."Ending Time" < EndTime then begin
									AvailTime := Min(CalendarMgt.CalcTimeDelta(EndTime, LastProdOrderCapNeed."Ending Time"), AvailCap);
                                **OnAfterCalcAvailTime1(AvailTime, EndTime, AvailCap, LastProdOrderCapNeed);**
                                if AvailTime > 0 then begin
                                    UpdateTimesBack(AvailTime, AvailCap, TimetoProgram, StartTime, EndTime);
                                    CreateCapNeed(CalendarEntry.Date, StartTime, EndTime, TimetoProgram, TimeType, 1);
                                    if FirstInBatch and FirstEntry then begin
                                        FirstInBatch := false;
                                        FirstEntry := false
                                    end;
                                    if UpdateDates then begin
                                        ProdOrderRoutingLine."Ending Time" := EndTime;
                                        ProdOrderRoutingLine."Ending Date" := CalendarEntry.Date;
                                        UpdateDates := false
                                    end;
                                    EndTime := StartTime;
                                end;
                            end;
                            if LastProdOrderCapNeed."Starting Time" < EndTime then
                                EndTime := LastProdOrderCapNeed."Starting Time";
                        until (LastProdOrderCapNeed.Next(-1) = 0) or (RemainNeedQty = 0) or (AvailCap = 0);

                    if (AvailCap > 0) and (RemainNeedQty > 0) then begin
						OnBeforeCalcAvailTime2(IAvailTime, EndTime, AvailCap, CalendarEntry);
							AvailTime := Min(CalendarMgt.CalcTimeDelta(EndTime, CalendarEntry."Starting Time"), AvailCap);
                        OnAfterCalcAvailTime2(IAvailTime, EndTime, AvailCap, CalendarEntry);
                        if AvailTime > 0 then begin
                            UpdateTimesBack(AvailTime, AvailCap, TimetoProgram, StartTime, EndTime);
                            AdjustStartingTime(CalendarEntry, StartTime);

                            if TimetoProgram <> 0 then
                                CreateCapNeed(CalendarEntry.Date, StartTime, EndTime, TimetoProgram, TimeType, 1);
                            if FirstInBatch and FirstEntry then begin
                                FirstInBatch := false;
                                FirstEntry := false
                            end;
                            if UpdateDates then begin
                                ProdOrderRoutingLine."Ending Time" := EndTime;
                                ProdOrderRoutingLine."Ending Date" := CalendarEntry.Date;
                                UpdateDates := false
                            end;
                            EndTime := StartTime;
                        end;
                    end;
                end;
                if RemainNeedQty > 0 then begin
                    if CalendarEntry.Next(-1) = 0 then begin
                        TestForError(Text001, Text002, CalendarEntry.Date);
                        exit;
                    end;
                    EndTime := CalendarEntry."Ending Time";
                end else begin
                    ProdEndingTime := StartTime;
                    ProdEndingDate := CalendarEntry.Date;
                    ProdOrderRoutingLine."Starting Time" := StartTime;
                    ProdOrderRoutingLine."Starting Date" := CalendarEntry.Date;
                    exit;
                end;
            until false;
    end;

Metadata

Metadata

Assignees

No one assigned

    Labels

    missing-infoThe issue misses information that prevents it from completion.

    Type

    No fields configured for Task.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions