Codeunit 5748 Transfer Whse. Post Shipment, source in 29
Source29
src/Layers/W1/BaseApp/Inventory/Transfer/TransferWhsePostShipment.Codeunit.al455 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Warehouse.Posting;
using Microsoft.Foundation.Navigate;
using Microsoft.Inventory.Setup;
using Microsoft.Inventory.Transfer;
using Microsoft.Warehouse.Document;
using Microsoft.Warehouse.Setup;
codeunit 5748 "Transfer Whse. Post Shipment"
{
var
InventorySetup: Record "Inventory Setup";
TransferOrderPostReceipt: Codeunit "TransferOrder-Post Receipt";
TransferOrderPostShipment: Codeunit "TransferOrder-Post Shipment";
TransferOrderPostTransfer: Codeunit "TransferOrder-Post Transfer";
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Post Shipment", 'OnGetSourceDocumentOnElseCase', '', false, false)]
local procedure OnGetSourceDocument(var SourceHeader: Variant; var WhseShptLine: Record "Warehouse Shipment Line")
var
TransferHeader: Record "Transfer Header";
begin
case WhseShptLine."Source Type" of
Database::"Transfer Line":
begin
TransferHeader.Get(WhseShptLine."Source No.");
SourceHeader := TransferHeader;
end;
end;
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Post Shipment", 'OnInitSourceDocumentHeader', '', false, false)]
local procedure OnInitSourceDocumentHeader(var WhseShptHeader: Record "Warehouse Shipment Header"; var WhseShptLine: Record "Warehouse Shipment Line"; var SourceHeader: Variant);
var
TransHeader: Record "Transfer Header";
ModifyHeader: Boolean;
IsHandled: Boolean;
begin
case WhseShptLine."Source Type" of
Database::"Transfer Line":
begin
TransHeader := SourceHeader;
TransHeader.Get(TransHeader."No.");
IsHandled := false;
OnInitSourceDocumentHeaderOnBeforeTransferHeaderUpdatePostingDate(TransHeader, WhseShptHeader, WhseShptLine, ModifyHeader, IsHandled);
if not IsHandled then
if (TransHeader."Posting Date" = 0D) or
(TransHeader."Posting Date" <> WhseShptHeader."Posting Date")
then begin
TransHeader.CalledFromWarehouse(true);
TransHeader.Validate("Posting Date", WhseShptHeader."Posting Date");
ModifyHeader := true;
end;
if (WhseShptHeader."Shipment Date" <> 0D) and
(TransHeader."Shipment Date" <> WhseShptHeader."Shipment Date")
then begin
TransHeader."Shipment Date" := WhseShptHeader."Shipment Date";
ModifyHeader := true;
end;
if WhseShptHeader."External Document No." <> '' then begin
TransHeader."External Document No." := WhseShptHeader."External Document No.";
ModifyHeader := true;
end;
if (WhseShptHeader."Shipping Agent Code" <> '') and
(WhseShptHeader."Shipping Agent Code" <> TransHeader."Shipping Agent Code")
then begin
TransHeader."Shipping Agent Code" := WhseShptHeader."Shipping Agent Code";
TransHeader."Shipping Agent Service Code" := WhseShptHeader."Shipping Agent Service Code";
ModifyHeader := true;
end;
if (WhseShptHeader."Shipping Agent Service Code" <> '') and
(WhseShptHeader."Shipping Agent Service Code" <>
TransHeader."Shipping Agent Service Code")
then begin
TransHeader."Shipping Agent Service Code" :=
WhseShptHeader."Shipping Agent Service Code";
ModifyHeader := true;
end;
if (WhseShptHeader."Shipment Method Code" <> '') and
(WhseShptHeader."Shipment Method Code" <> TransHeader."Shipment Method Code")
then begin
TransHeader."Shipment Method Code" := WhseShptHeader."Shipment Method Code";
ModifyHeader := true;
end;
OnInitSourceDocumentHeaderOnBeforeTransHeaderModify(TransHeader, WhseShptHeader, ModifyHeader);
if ModifyHeader then
TransHeader.Modify();
end;
end;
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Post Shipment", 'OnAfterInitSourceDocumentLines', '', false, false)]
local procedure OnAfterInitSourceDocumentLines(var WhseShptLine2: Record "Warehouse Shipment Line"; WhsePostParameters: Record "Whse. Post Parameters"; var WhseShptHeader: Record "Warehouse Shipment Header")
begin
case WhseShptLine2."Source Type" of
Database::"Transfer Line":
HandleTransferLine(WhseShptLine2, WhseShptHeader);
end;
end;
local procedure HandleTransferLine(var WhseShptLine: Record "Warehouse Shipment Line"; var WhseShptHeader: Record "Warehouse Shipment Header")
var
TransLine: Record "Transfer Line";
ModifyLine: Boolean;
IsHandled: Boolean;
ShouldModifyShipmentDate: Boolean;
begin
IsHandled := false;
OnBeforeHandleTransferLine(WhseShptLine, TransLine, WhseShptHeader, ModifyLine, IsHandled);
if IsHandled then
exit;
TransLine.SetRange("Document No.", WhseShptLine."Source No.");
TransLine.SetRange("Derived From Line No.", 0);
if TransLine.Find('-') then
repeat
WhseShptLine.SetRange(WhseShptLine."Source Line No.", TransLine."Line No.");
if WhseShptLine.Find('-') then begin
IsHandled := false;
OnAfterFindWhseShptLineForTransLine(WhseShptLine, TransLine, IsHandled, ModifyLine);
if not IsHandled then begin
ModifyLine := TransLine."Qty. to Ship" <> WhseShptLine."Qty. to Ship";
if ModifyLine then
ValidateTransferLineQtyToShip(TransLine, WhseShptLine);
end;
ShouldModifyShipmentDate :=
(WhseShptHeader."Shipment Date" <> 0D) and
(TransLine."Shipment Date" <> WhseShptHeader."Shipment Date") and
(WhseShptLine."Qty. to Ship" = WhseShptLine."Qty. Outstanding");
OnHandleTransferLineOnAfterCalcShouldModifyShipmentDate(WhseShptHeader, WhseShptLine, TransLine, ShouldModifyShipmentDate);
if ShouldModifyShipmentDate then begin
TransLine."Shipment Date" := WhseShptHeader."Shipment Date";
ModifyLine := true;
end;
if TransLine."Transfer-from Bin Code" <> WhseShptLine."Bin Code" then begin
TransLine."Transfer-from Bin Code" := WhseShptLine."Bin Code";
ModifyLine := true;
end;
end else begin
ModifyLine := TransLine."Qty. to Ship" <> 0;
if ModifyLine then begin
TransLine.Validate("Qty. to Ship", 0);
TransLine.Validate("Qty. to Receive", 0);
end;
end;
OnBeforeTransLineModify(TransLine, WhseShptLine, ModifyLine);
if ModifyLine then
TransLine.Modify();
until TransLine.Next() = 0;
end;
local procedure ValidateTransferLineQtyToShip(var TransferLine: Record "Transfer Line"; WarehouseShipmentLine: Record "Warehouse Shipment Line")
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeValidateTransferLineQtyToShip(TransferLine, WarehouseShipmentLine, IsHandled);
if IsHandled then
exit;
TransferLine.Validate("Qty. to Ship", WarehouseShipmentLine."Qty. to Ship");
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Post Shipment", 'OnPostSourceDocument', '', false, false)]
local procedure OnPostSourceDocument(var WhseShptHeader: Record "Warehouse Shipment Header"; var WhseShptLine: Record "Warehouse Shipment Line"; var CounterDocOK: Integer; var SourceHeader: Variant; var DocumentEntryToPrint: Record "Document Entry" temporary; WhsePostParameters: Record "Whse. Post Parameters" temporary)
var
TransHeader: Record "Transfer Header";
WarehouseSetup: Record "Warehouse Setup";
IsHandled: Boolean;
begin
case WhseShptLine."Source Type" of
Database::"Transfer Line":
begin
TransHeader := SourceHeader;
TransHeader.Get(TransHeader."No.");
OnPostSourceDocumentOnBeforeCaseTransferLine(TransHeader, WhseShptLine);
if WhsePostParameters."Preview Posting" then
PostSourceTransferDocument(TransHeader, WhseShptHeader, WhsePostParameters, CounterDocOK)
else begin
;
WarehouseSetup.Get();
case WarehouseSetup."Shipment Posting Policy" of
WarehouseSetup."Shipment Posting Policy"::"Posting errors are not processed":
TryPostSourceTransferDocument(TransHeader, WhseShptHeader, WhsePostParameters, CounterDocOK);
WarehouseSetup."Shipment Posting Policy"::"Stop and show the first posting error":
PostSourceTransferDocument(TransHeader, WhseShptHeader, WhsePostParameters, CounterDocOK);
end;
end;
if WhsePostParameters."Print Documents" then begin
IsHandled := false;
OnPostSourceDocumentOnBeforePrintTransferShipment(TransHeader, IsHandled);
if not IsHandled then
if TransHeader."Direct Transfer" and (TransHeader."Direct Transfer Posting" = TransHeader."Direct Transfer Posting"::"Direct Transfer") then
InsertDocumentEntryToPrint(
DocumentEntryToPrint, Database::"Direct Trans. Header", TransHeader."Last Shipment No.")
else
InsertDocumentEntryToPrint(
DocumentEntryToPrint, Database::"Transfer Shipment Header", TransHeader."Last Shipment No.");
end;
OnAfterTransferPostShipment(WhseShptLine, TransHeader, WhsePostParameters);
if TransHeader.Find() then
if TransHeader.ShouldPostReceiptWithShipment() then
TransHeader.PostRelatedInboundTransfer(WhsePostParameters."Preview Posting");
end;
end;
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Post Shipment", 'OnBeforeCheckWhseShptLines', '', false, false)]
local procedure OnBeforeCheckWhseShptLines(var WarehouseShipmentLine: Record "Warehouse Shipment Line"; var WarehouseShipmentHeader: Record "Warehouse Shipment Header"; Invoice: Boolean; var SuppressCommit: Boolean; var IsHandled: Boolean; PreviewPosting: Boolean)
var
TransferHeader: Record "Transfer Header";
begin
if (not SuppressCommit) and (WarehouseShipmentLine."Source Document" = WarehouseShipmentLine."Source Document"::"Outbound Transfer") then
if TransferHeader.Get(WarehouseShipmentLine."Source No.") then
SuppressCommit := TransferHeader.ShouldPostReceiptWithShipment();
end;
local procedure InsertDocumentEntryToPrint(var DocumentEntry: Record "Document Entry"; TableID: Integer; DocumentNo: Code[20])
begin
DocumentEntry.Init();
DocumentEntry."Entry No." := DocumentEntry."Entry No." + 1;
DocumentEntry."Table ID" := TableID;
DocumentEntry."Document No." := DocumentNo;
DocumentEntry.Insert();
end;
local procedure TryPostSourceTransferDocument(var TransHeader: Record "Transfer Header"; var WhseShptHeader: Record "Warehouse Shipment Header"; WhsePostParameters: Record "Whse. Post Parameters"; var CounterSourceDocOK: Integer)
var
Result: Boolean;
IsHandled: Boolean;
begin
Clear(TransferOrderPostShipment);
IsHandled := false;
OnBeforeTryPostSourceTransferDocument(TransferOrderPostShipment, TransHeader, IsHandled);
if not IsHandled then
if TransHeader.ShouldPostReceiptWithShipment() then begin
TransferOrderPostShipment.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostShipment.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
TransferOrderPostShipment.Run(TransHeader);
CounterSourceDocOK := CounterSourceDocOK + 1;
Result := true;
end else begin
Result := false;
InventorySetup.Get();
if TransHeader."Direct Transfer" then
Result := TryPostDirectTransferDocument(TransHeader, WhseShptHeader, WhsePostParameters, CounterSourceDocOK)
else begin
TransferOrderPostShipment.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostShipment.SetSuppressCommit(WhsePostParameters."Suppress Commit");
TransferOrderPostShipment.SetPreviewMode(WhsePostParameters."Preview Posting");
if TransferOrderPostShipment.Run(TransHeader) then begin
CounterSourceDocOK := CounterSourceDocOK + 1;
Result := true;
end;
end;
end;
OnAfterTryPostSourceTransferDocument(CounterSourceDocOK, TransferOrderPostShipment, TransHeader, Result);
end;
local procedure TryPostDirectTransferDocument(var TransHeader: Record "Transfer Header"; var WhseShptHeader: Record "Warehouse Shipment Header"; WhsePostParameters: Record "Whse. Post Parameters"; var CounterSourceDocOK: Integer) Posted: Boolean
begin
Posted := false;
case TransHeader."Direct Transfer Posting" of
TransHeader."Direct Transfer Posting"::"Direct Transfer":
begin
Clear(TransferOrderPostTransfer);
TransferOrderPostTransfer.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostTransfer.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
if TransferOrderPostTransfer.Run(TransHeader) then begin
CounterSourceDocOK := CounterSourceDocOK + 1;
Posted := true;
end;
end;
TransHeader."Direct Transfer Posting"::"Shipment and Receipt":
begin
Clear(TransferOrderPostShipment);
TransferOrderPostShipment.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostShipment.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
if TransferOrderPostShipment.Run(TransHeader) then begin
Clear(TransferOrderPostReceipt);
TransferOrderPostReceipt.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
if TransferOrderPostReceipt.Run(TransHeader) then begin
CounterSourceDocOK := CounterSourceDocOK + 1;
Posted := true;
end;
end;
end;
end;
end;
local procedure PostSourceTransferDocument(var TransHeader: Record "Transfer Header"; var WhseShptHeader: Record "Warehouse Shipment Header"; WhsePostParameters: Record "Whse. Post Parameters"; var CounterSourceDocOK: Integer)
var
IsHandled: Boolean;
begin
Clear(TransferOrderPostShipment);
IsHandled := false;
OnBeforePostSourceTransferDocument(TransferOrderPostShipment, TransHeader, CounterSourceDocOK, IsHandled);
if IsHandled then
exit;
InventorySetup.Get();
if TransHeader."Direct Transfer" then
PostSourceDirectTransferDocument(TransHeader, WhseShptHeader, WhsePostParameters, CounterSourceDocOK)
else begin
TransferOrderPostShipment.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostShipment.SetSuppressCommit(WhsePostParameters."Suppress Commit");
TransferOrderPostShipment.SetPreviewMode(WhsePostParameters."Preview Posting");
TransferOrderPostShipment.RunWithCheck(TransHeader);
CounterSourceDocOK := CounterSourceDocOK + 1;
end;
OnAfterPostSourceTransferDocument(CounterSourceDocOK, TransferOrderPostShipment, TransHeader);
end;
local procedure PostSourceDirectTransferDocument(var TransHeader: Record "Transfer Header"; var WhseShptHeader: Record "Warehouse Shipment Header"; WhsePostParameters: Record "Whse. Post Parameters"; var CounterSourceDocOK: Integer)
begin
case TransHeader."Direct Transfer Posting" of
TransHeader."Direct Transfer Posting"::"Direct Transfer":
begin
Clear(TransferOrderPostTransfer);
TransferOrderPostTransfer.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostTransfer.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
TransferOrderPostTransfer.RunWithCheck(TransHeader);
CounterSourceDocOK := CounterSourceDocOK + 1;
end;
TransHeader."Direct Transfer Posting"::"Shipment and Receipt":
begin
Clear(TransferOrderPostShipment);
TransferOrderPostShipment.SetWhseShptHeader(WhseShptHeader);
TransferOrderPostShipment.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
TransferOrderPostShipment.RunWithCheck(TransHeader);
if not TransHeader.ShouldPostReceiptWithShipment() then begin
Clear(TransferOrderPostReceipt);
TransferOrderPostReceipt.SetSuppressCommit(WhsePostParameters."Suppress Commit" or WhsePostParameters."Preview Posting");
TransferOrderPostReceipt.Run(TransHeader);
end;
CounterSourceDocOK := CounterSourceDocOK + 1;
end;
end;
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Post Shipment", 'OnPrintDocuments', '', false, false)]
local procedure OnPrintDocuments(var DocumentEntryToPrint: Record "Document Entry")
begin
PrintDocuments(DocumentEntryToPrint);
end;
local procedure PrintDocuments(var DocumentEntryToPrint: Record "Document Entry")
var
TransferShipmentHeader: Record "Transfer Shipment Header";
DirectTransHeader: Record "Direct Trans. Header";
begin
DocumentEntryToPrint.SetRange("Table ID", Database::"Transfer Shipment Header");
if not DocumentEntryToPrint.IsEmpty() then begin
if DocumentEntryToPrint.FindSet() then
repeat
TransferShipmentHeader.Get(DocumentEntryToPrint."Document No.");
TransferShipmentHeader.Mark(true);
until DocumentEntryToPrint.Next() = 0;
TransferShipmentHeader.MarkedOnly(true);
TransferShipmentHeader.PrintRecords(false);
end;
DocumentEntryToPrint.SetRange("Table ID", Database::"Direct Trans. Header");
if not DocumentEntryToPrint.IsEmpty() then begin
if DocumentEntryToPrint.FindSet() then
repeat
DirectTransHeader.Get(DocumentEntryToPrint."Document No.");
DirectTransHeader.Mark(true);
until DocumentEntryToPrint.Next() = 0;
DirectTransHeader.MarkedOnly(true);
DirectTransHeader.PrintRecords(false);
end;
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeHandleTransferLine(var WarehouseShipmentLine: Record "Warehouse Shipment Line"; var TransLine: Record Microsoft.Inventory.Transfer."Transfer Line"; WhseShptHeader: Record "Warehouse Shipment Header"; var ModifyLine: Boolean; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFindWhseShptLineForTransLine(var WarehouseShipmentLine: Record "Warehouse Shipment Line"; var TransferLine: Record Microsoft.Inventory.Transfer."Transfer Line"; var IsHandled: Boolean; var ModifyLine: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnHandleTransferLineOnAfterCalcShouldModifyShipmentDate(WarehouseShipmentHeader: Record "Warehouse Shipment Header"; var WarehouseShipmentLine: Record "Warehouse Shipment Line"; var TransferLine: Record Microsoft.Inventory.Transfer."Transfer Line"; var ShouldModifyShipmentDate: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeTransLineModify(var TransferLine: Record Microsoft.Inventory.Transfer."Transfer Line"; WarehouseShipmentLine: Record "Warehouse Shipment Line"; var ModifyLine: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeValidateTransferLineQtyToShip(var TransferLine: Record Microsoft.Inventory.Transfer."Transfer Line"; WarehouseShipmentLine: Record "Warehouse Shipment Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterTransferPostShipment(var WarehouseShipmentLine: Record "Warehouse Shipment Line"; TransferHeader: Record Microsoft.Inventory.Transfer."Transfer Header"; WhsePostParameters: Record "Whse. Post Parameters")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnPostSourceDocumentOnBeforeCaseTransferLine(var TransferHeader: Record Microsoft.Inventory.Transfer."Transfer Header"; WarehouseShipmentLine: Record "Warehouse Shipment Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeTryPostSourceTransferDocument(var TransferPostShipment: Codeunit Microsoft.Inventory.Transfer."TransferOrder-Post Shipment"; var TransHeader: Record Microsoft.Inventory.Transfer."Transfer Header"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterTryPostSourceTransferDocument(var CounterSourceDocOK: Integer; var TransferPostShipment: Codeunit Microsoft.Inventory.Transfer."TransferOrder-Post Shipment"; var TransHeader: Record Microsoft.Inventory.Transfer."Transfer Header"; Result: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterPostSourceTransferDocument(var CounterSourceDocOK: Integer; var TransferPostShipment: Codeunit Microsoft.Inventory.Transfer."TransferOrder-Post Shipment"; var TransHeader: Record Microsoft.Inventory.Transfer."Transfer Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforePostSourceTransferDocument(var TransferPostShipment: Codeunit Microsoft.Inventory.Transfer."TransferOrder-Post Shipment"; var TransHeader: Record Microsoft.Inventory.Transfer."Transfer Header"; var CounterSourceDocOK: Integer; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInitSourceDocumentHeaderOnBeforeTransferHeaderUpdatePostingDate(var TransferHeader: Record "Transfer Header"; var WarehouseShipmentHeader: Record "Warehouse Shipment Header"; var WarehouseShipmentLine: Record "Warehouse Shipment Line"; var ModifyHeader: Boolean; IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInitSourceDocumentHeaderOnBeforeTransHeaderModify(var TransferHeader: Record "Transfer Header"; var WarehouseShipmentHeader: Record "Warehouse Shipment Header"; var ModifyHeader: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnPostSourceDocumentOnBeforePrintTransferShipment(var TransferHeader: Record "Transfer Header"; var IsHandled: Boolean)
begin
end;
}