Codeunit 1314 Purch. Doc. From Sales Doc., source in 29
Source29
src/Layers/W1/BaseApp/Purchases/Document/PurchDocFromSalesDoc.Codeunit.al302 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.Purchases.Document;
using Microsoft.Foundation.Navigate;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Requisition;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Document;
codeunit 1314 "Purch. Doc. From Sales Doc."
{
trigger OnRun()
begin
end;
var
CreatePurchInvOptionQst: Label 'All Lines,Selected Lines';
CreatePurchInvInstructionTxt: Label 'A purchase invoice will be created. Select which sales invoice lines to use.';
SelectVentorTxt: Label 'Select a vendor';
#pragma warning disable AA0470
TypeNotSupportedErr: Label 'Type %1 is not supported.', Comment = 'Line or Document type';
#pragma warning restore AA0470
NoPurchaseOrdersCreatedMsg: Label 'No purchase orders are created.';
procedure CreatePurchaseInvoice(SalesHeader: Record "Sales Header"; var SelectedSalesLine: Record "Sales Line")
var
Vendor: Record Vendor;
PurchaseHeader: Record "Purchase Header";
SalesLine: Record "Sales Line";
OptionNumber: Integer;
IsHandled: Boolean;
begin
OptionNumber := DIALOG.StrMenu(CreatePurchInvOptionQst, 1, CreatePurchInvInstructionTxt);
if OptionNumber = 0 then
exit;
case OptionNumber of
0:
exit;
1:
begin
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
SalesLine.SetRange("Document No.", SalesHeader."No.");
end;
2:
SalesLine.Copy(SelectedSalesLine);
end;
if SelectVendor(Vendor, SalesLine) then begin
OnBeforeCreatePurchaseInvoice(SalesHeader, SalesLine);
CreatePurchaseHeader(PurchaseHeader, SalesHeader, Vendor);
CopySalesLinesToPurchaseLines(PurchaseHeader, SalesLine);
IsHandled := false;
OnCreatePurchaseInvoiceOnBeforeOpenPage(PurchaseHeader, IsHandled);
if not IsHandled then
PAGE.Run(PAGE::"Purchase Invoice", PurchaseHeader);
end;
end;
procedure CreatePurchaseOrder(SalesHeader: Record "Sales Header")
var
TempManufacturingUserTemplate: Record "Manufacturing User Template" temporary;
RequisitionLine: Record "Requisition Line";
PurchaseHeader: Record "Purchase Header";
TempDocumentEntry: Record "Document Entry" temporary;
OrderPlanningMgt: Codeunit "Order Planning Mgt.";
PurchOrderFromSalesOrder: Page "Purch. Order From Sales Order";
NoFilter: Text;
begin
TempManufacturingUserTemplate.Init();
TempManufacturingUserTemplate."User ID" := CopyStr(UserId(), 1, MaxStrLen(TempManufacturingUserTemplate."User ID"));
TempManufacturingUserTemplate."Make Orders" := TempManufacturingUserTemplate."Make Orders"::"The Active Order";
TempManufacturingUserTemplate."Create Purchase Order" :=
TempManufacturingUserTemplate."Create Purchase Order"::"Make Purch. Orders";
TempManufacturingUserTemplate."Create Production Order" := TempManufacturingUserTemplate."Create Production Order"::" ";
TempManufacturingUserTemplate."Create Transfer Order" := TempManufacturingUserTemplate."Create Transfer Order"::" ";
TempManufacturingUserTemplate."Create Assembly Order" := TempManufacturingUserTemplate."Create Assembly Order"::" ";
TempManufacturingUserTemplate.Insert();
PurchOrderFromSalesOrder.LookupMode(true);
PurchOrderFromSalesOrder.SetSalesOrderNo(SalesHeader."No.");
if PurchOrderFromSalesOrder.RunModal() <> ACTION::LookupOK then begin
OrderPlanningMgt.PrepareRequisitionRecord(RequisitionLine);
exit;
end;
PurchOrderFromSalesOrder.GetRecord(RequisitionLine);
RequisitionLine.SetRange("User ID", UserId);
RequisitionLine.SetRange("Demand Order No.", SalesHeader."No.");
RequisitionLine.SetRange("Demand Subtype", SalesHeader."Document Type"::Order);
RequisitionLine.SetRange(Level);
RequisitionLine.SetFilter(Quantity, '>%1', 0);
if not RequisitionLine.IsEmpty() then
MakeSupplyOrders(TempManufacturingUserTemplate, TempDocumentEntry, RequisitionLine);
TempDocumentEntry.SetRange("Table ID", DATABASE::"Purchase Header");
if TempDocumentEntry.FindSet() then
repeat
if PurchaseHeader.Get(TempDocumentEntry."Document Type", TempDocumentEntry."Document No.") then
BuildFilter(NoFilter, PurchaseHeader."No.");
until TempDocumentEntry.Next() = 0;
Clear(RequisitionLine);
OrderPlanningMgt.PrepareRequisitionRecord(RequisitionLine);
if NoFilter = '' then begin
Message(NoPurchaseOrdersCreatedMsg);
exit;
end;
PurchaseHeader.SetFilter("No.", NoFilter);
PurchaseHeader.SetRange("Document Type", PurchaseHeader."Document Type"::Order);
OnCreatePurchaseOrderOnAfterPurchaseHeaderSetFilters(PurchaseHeader, SalesHeader);
case PurchaseHeader.Count of
0:
Message(NoPurchaseOrdersCreatedMsg);
1:
PAGE.Run(PAGE::"Purchase Order", PurchaseHeader);
else
PAGE.Run(PAGE::"Purchase Order List", PurchaseHeader);
end;
end;
local procedure CreatePurchaseHeader(var PurchaseHeader: Record "Purchase Header"; SalesHeader: Record "Sales Header"; Vendor: Record Vendor)
begin
PurchaseHeader.Init();
if SalesHeader."Document Type" in [SalesHeader."Document Type"::Invoice, SalesHeader."Document Type"::Order] then
PurchaseHeader.Validate("Document Type", PurchaseHeader."Document Type"::Invoice)
else
Error(TypeNotSupportedErr, Format(SalesHeader."Document Type"));
OnBeforeInitRecord(PurchaseHeader, SalesHeader, Vendor);
PurchaseHeader.InitRecord();
PurchaseHeader.Validate("Buy-from Vendor No.", Vendor."No.");
OnCreatePurchaseHeaderOnBeforeInsert(PurchaseHeader, SalesHeader, Vendor);
PurchaseHeader.Insert(true);
end;
local procedure CopySalesLinesToPurchaseLines(PurchaseHeader: Record "Purchase Header"; var SalesLine: Record "Sales Line")
var
PurchaseLine: Record "Purchase Line";
PurchaseLineNo: Integer;
IsHandled: Boolean;
begin
PurchaseLineNo := 0;
if SalesLine.Find('-') then
repeat
Clear(PurchaseLine);
PurchaseLine.Init();
PurchaseLine."Document No." := PurchaseHeader."No.";
PurchaseLine."Document Type" := PurchaseHeader."Document Type";
PurchaseLineNo := PurchaseLineNo + 10000;
PurchaseLine."Line No." := PurchaseLineNo;
case SalesLine.Type of
SalesLine.Type::" ":
PurchaseLine.Type := PurchaseLine.Type::" ";
SalesLine.Type::Item:
PurchaseLine.Type := PurchaseLine.Type::Item;
else begin
IsHandled := false;
OnCopySalesLinesToPurchaseLinesOnLineTypeValidate(PurchaseLine, SalesLine, IsHandled);
if not IsHandled then
Error(TypeNotSupportedErr, Format(SalesLine.Type));
end
end;
PurchaseLine.Validate("No.", SalesLine."No.");
PurchaseLine.Description := SalesLine.Description;
OnCopySalesLinesToPurchaseLinesOnAfterAssignDescription(PurchaseLine, SalesLine);
if PurchaseLine."No." <> '' then begin
PurchaseLine.Validate("Buy-from Vendor No.", PurchaseHeader."Buy-from Vendor No.");
PurchaseLine.Validate("Pay-to Vendor No.", PurchaseHeader."Pay-to Vendor No.");
PurchaseLine.Validate(Quantity, SalesLine.Quantity);
PurchaseLine.Validate("Unit of Measure Code", SalesLine."Unit of Measure Code");
end;
OnCopySalesLinesToPurchaseLinesOnBeforeInsert(PurchaseLine, SalesLine);
PurchaseLine.Insert(true);
until SalesLine.Next() = 0;
end;
local procedure SelectVendor(var Vendor: Record Vendor; var SelectedSalesLine: Record "Sales Line"): Boolean
var
SalesLine: Record "Sales Line";
Item: Record Item;
VendorList: Page "Vendor List";
VendorNo: Code[20];
DefaultVendorFound: Boolean;
begin
SalesLine.Copy(SelectedSalesLine);
SalesLine.SetRange(Type, SalesLine.Type::Item);
SalesLine.SetFilter("No.", '<>%1', '');
if SalesLine.FindSet() then begin
Item.Get(SalesLine."No.");
VendorNo := Item."Vendor No.";
DefaultVendorFound := (VendorNo <> '');
while DefaultVendorFound and (SalesLine.Next() <> 0) do begin
Item.Get(SalesLine."No.");
DefaultVendorFound := (VendorNo = Item."Vendor No.");
end;
if DefaultVendorFound then begin
Vendor.Get(VendorNo);
exit(true);
end;
end;
VendorList.LookupMode(true);
VendorList.Caption(SelectVentorTxt);
if VendorList.RunModal() = ACTION::LookupOK then begin
VendorList.GetRecord(Vendor);
exit(true);
end;
exit(false);
end;
local procedure BuildFilter(var InitialFilter: Text; NewValue: Text)
begin
if StrPos(InitialFilter, NewValue) = 0 then begin
if StrLen(InitialFilter) > 0 then
InitialFilter += '|';
InitialFilter += NewValue;
end;
end;
local procedure MakeSupplyOrders(var TempManufacturingUserTemplate: Record "Manufacturing User Template" temporary; var TempDocumentEntry: Record "Document Entry" temporary; var RequisitionLine: Record "Requisition Line")
var
MakeSupplyOrdersYesNo: Codeunit "Make Supply Orders (Yes/No)";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeMakeSupplyOrders(TempManufacturingUserTemplate, TempDocumentEntry, RequisitionLine, IsHandled);
if IsHandled then
exit;
MakeSupplyOrdersYesNo.SetManufUserTemplate(TempManufacturingUserTemplate);
MakeSupplyOrdersYesNo.SetBlockForm();
MakeSupplyOrdersYesNo.SetCreatedDocumentBuffer(TempDocumentEntry);
MakeSupplyOrdersYesNo.Run(RequisitionLine);
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeCreatePurchaseInvoice(var SalesHeader: Record "Sales Header"; var SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInitRecord(var PurchaseHeader: Record "Purchase Header"; SalesHeader: Record "Sales Header"; Vendor: Record Vendor)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopySalesLinesToPurchaseLinesOnAfterAssignDescription(var PurchaseLine: Record "Purchase Line"; SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopySalesLinesToPurchaseLinesOnBeforeInsert(var PurchaseLine: Record "Purchase Line"; SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopySalesLinesToPurchaseLinesOnLineTypeValidate(var PurchaseLine: Record "Purchase Line"; SalesLine: Record "Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCreatePurchaseHeaderOnBeforeInsert(var PurchaseHeader: Record "Purchase Header"; SalesHeader: Record "Sales Header"; Vendor: Record Vendor)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCreatePurchaseOrderOnAfterPurchaseHeaderSetFilters(var PurchaseHeader: Record "Purchase Header"; SalesHeader: Record "Sales Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeMakeSupplyOrders(var TempManufacturingUserTemplate: Record "Manufacturing User Template" temporary; var TempDocumentEntry: Record "Document Entry" temporary; var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean);
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCreatePurchaseInvoiceOnBeforeOpenPage(var PurchaseHeader: Record "Purchase Header"; var IsHandled: Boolean)
begin
end;
}