Codeunit 7009 CopyFromToPriceListLine
- App
- Base Application
- Namespace
- Microsoft.Pricing.PriceList
- Versions
- 17-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Pricing/PriceList/CopyFromToPriceListLine.Codeunit.al1223 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.Pricing.PriceList;
using Microsoft.Finance.Currency;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory.Item;
using Microsoft.Pricing.Calculation;
using Microsoft.Pricing.Source;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Pricing;
using Microsoft.Projects.Resources.Pricing;
using Microsoft.Projects.Resources.Resource;
using Microsoft.Purchases.Pricing;
using Microsoft.Sales.Pricing;
using Microsoft.Utilities;
using System.Telemetry;
codeunit 7009 CopyFromToPriceListLine
{
var
CheckedReferencedItemDictionary: Dictionary of [Code[20], Boolean];
CheckedReferencedItemVariantDictionary: Dictionary of [Code[31], Boolean];
CheckedReferencedUnitOfMeasureDictionary: Dictionary of [Code[10], Boolean];
CheckedReferencedItemUnitOfMeasureDictionary: Dictionary of [Code[31], Boolean];
CheckedReferencedCurrencyDictionary: Dictionary of [Code[10], Boolean];
CheckedReferencedGLAccountDictionary: Dictionary of [Code[20], Boolean];
CheckedReferencedResourceDictionary: Dictionary of [Code[20], Boolean];
CheckedReferencedWorkTypeDictionary: Dictionary of [Code[10], Boolean];
CheckedReferencedJobDictionary: Dictionary of [Code[20], Boolean];
CheckedReferencedJobTaskDictionary: Dictionary of [Code[41], Boolean];
GenerateHeader: Boolean;
UseDefaultPriceLists: Boolean;
NotMatchSalesLineDiscTypeErr: Label 'does not match sales line discount type.';
PlaceHolderBracketTok: Label ' (%1)', Locked = true;
PlaceHolderTok: Label ' %1', Locked = true;
PlaceHolderRangeTok: Label ', %1 - %2', Locked = true;
procedure SetGenerateHeader()
begin
SetGenerateHeader(false);
end;
procedure SetGenerateHeader(UseDefault: Boolean)
begin
GenerateHeader := true;
UseDefaultPriceLists := UseDefault;
end;
procedure CopyFrom(var SalesPrice: Record "Sales Price"; var PriceListLine: Record "Price List Line")
var
OrigSalesPrice: Record "Sales Price";
begin
OrigSalesPrice := SalesPrice;
if SalesPrice.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if SalesPrice.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine.Validate("Source Type", ConvertToSourceType(SalesPrice));
PriceListLine.Validate("Source No.", SalesPrice."Sales Code");
if PriceListLine."Source No." = SalesPrice."Sales Code" then begin
PriceListLine."VAT Bus. Posting Gr. (Price)" := SalesPrice."VAT Bus. Posting Gr. (Price)";
PriceListLine."Starting Date" := SalesPrice."Starting Date";
PriceListLine."Ending Date" := SalesPrice."Ending Date";
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Item);
PriceListLine.Validate("Asset No.", SalesPrice."Item No.");
if PriceListLine."Asset No." = SalesPrice."Item No." then
if VerifySalesPriceConsistency(SalesPrice) then begin
PriceListLine.Validate("Variant Code", SalesPrice."Variant Code");
PriceListLine.Validate("Unit of Measure Code", SalesPrice."Unit of Measure Code");
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine."Unit Price" := SalesPrice."Unit Price";
PriceListLine."Allow Invoice Disc." := SalesPrice."Allow Invoice Disc.";
PriceListLine."Allow Line Disc." := SalesPrice."Allow Line Disc.";
PriceListLine."Currency Code" := SalesPrice."Currency Code";
PriceListLine."Minimum Quantity" := SalesPrice."Minimum Quantity";
PriceListLine."Price Includes VAT" := SalesPrice."Price Includes VAT";
PriceListLine.Status := PriceListLine.Status::Active;
PriceListLine."Price Type" := PriceListLine."Price Type"::Sale;
OnCopyFromSalesPrice(SalesPrice, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
end;
until SalesPrice.Next() = 0;
SalesPrice := OrigSalesPrice;
end;
local procedure VerifySalesPriceConsistency(SalesPrice: Record "Sales Price"): Boolean;
begin
if SalesPrice."Item No." = '' then
exit(false);
if ReferencedItemRecordMissing(SalesPrice."Item No.") then
exit(false);
if ReferencedItemVariantRecordMissing(SalesPrice."Item No.", SalesPrice."Variant Code") then
exit(false);
if ReferencedUnitOfMeasureRecordMissing(SalesPrice."Item No.", SalesPrice."Unit of Measure Code") then
exit(false);
if ReferencedCurrencyRecordMissing(SalesPrice."Currency Code") then
exit(false);
exit(true);
end;
local procedure ReferencedItemRecordMissing(ItemNo: Code[20]): Boolean;
var
Item: Record Item;
begin
if CheckedReferencedItemDictionary.ContainsKey(ItemNo) then
exit(not CheckedReferencedItemDictionary.Get(ItemNo));
Item.SetRange("No.", ItemNo);
if not Item.IsEmpty() then begin
CheckedReferencedItemDictionary.Add(ItemNo, true);
exit(false);
end else begin
CheckedReferencedItemDictionary.Add(ItemNo, false);
exit(true);
end;
end;
local procedure ReferencedItemVariantRecordMissing(ItemNo: Code[20]; VariantCode: Code[10]): Boolean;
var
ItemVariant: Record "Item Variant";
ItemVariantCompositeKey: Code[31];
begin
if VariantCode = '' then
exit(false);
ItemVariantCompositeKey := PadStr(ItemNo, MaxStrLen(ItemVariant."Item No."), '_') + '*' + PadStr(ItemNo, MaxStrLen(ItemVariant.Code), '_');
if CheckedReferencedItemVariantDictionary.ContainsKey(ItemVariantCompositeKey) then
exit(not CheckedReferencedItemVariantDictionary.Get(ItemVariantCompositeKey));
ItemVariant.SetRange("Item No.", ItemNo);
ItemVariant.SetRange(Code, VariantCode);
if not ItemVariant.IsEmpty() then begin
CheckedReferencedItemVariantDictionary.Add(ItemVariantCompositeKey, true);
exit(false);
end else begin
CheckedReferencedItemVariantDictionary.Add(ItemVariantCompositeKey, false);
exit(true);
end;
end;
local procedure ReferencedUnitOfMeasureRecordMissing(ItemNo: Code[20]; UnitOfMeasureCode: Code[10]): Boolean;
var
UnitOfMeasure: Record "Unit of Measure";
ItemUnitOfMeasure: Record "Item Unit of Measure";
ItemUnitOfMeasureCompositeKey: Code[31];
begin
if UnitOfMeasureCode = '' then
exit(false);
if CheckedReferencedUnitOfMeasureDictionary.ContainsKey(UnitOfMeasureCode) then begin
if not CheckedReferencedUnitOfMeasureDictionary.Get(UnitOfMeasureCode) then
exit(true);
end else begin
UnitOfMeasure.SetRange(Code, UnitOfMeasureCode);
if not UnitOfMeasure.IsEmpty() then
CheckedReferencedUnitOfMeasureDictionary.Add(UnitOfMeasureCode, true)
else begin
CheckedReferencedUnitOfMeasureDictionary.Add(UnitOfMeasureCode, false);
exit(true);
end;
end;
ItemUnitOfMeasureCompositeKey := PadStr(ItemNo, MaxStrLen(ItemUnitOfMeasure."Item No."), '_') + '*' + PadStr(UnitOfMeasureCode, MaxStrLen(ItemUnitOfMeasure.Code), '_');
if CheckedReferencedItemUnitOfMeasureDictionary.ContainsKey(ItemUnitOfMeasureCompositeKey) then
exit(not CheckedReferencedItemUnitOfMeasureDictionary.Get(ItemUnitOfMeasureCompositeKey));
ItemUnitOfMeasure.SetRange("Item No.", ItemNo);
ItemUnitofMeasure.SetRange(Code, UnitOfMeasureCode);
if not ItemUnitOfMeasure.IsEmpty() then begin
CheckedReferencedItemUnitOfMeasureDictionary.Add(ItemUnitOfMeasureCompositeKey, true);
exit(false);
end else begin
CheckedReferencedItemUnitOfMeasureDictionary.Add(ItemUnitOfMeasureCompositeKey, false);
exit(true);
end;
end;
local procedure ReferencedCurrencyRecordMissing(CurrencyCode: Code[10]): Boolean;
var
Currency: Record Currency;
begin
if CurrencyCode = '' then
exit(false);
if CheckedReferencedCurrencyDictionary.ContainsKey(CurrencyCode) then
exit(not CheckedReferencedCurrencyDictionary.Get(CurrencyCode));
Currency.SetRange(Code, CurrencyCode);
if not Currency.IsEmpty() then begin
CheckedReferencedCurrencyDictionary.Add(CurrencyCode, true);
exit(false);
end else begin
CheckedReferencedCurrencyDictionary.Add(CurrencyCode, false);
exit(true);
end;
end;
local procedure ReferencedGLAccountRecordMissing(GLAccountNo: Code[20]): Boolean;
var
GLAccount: Record "G/L Account";
begin
if CheckedReferencedGLAccountDictionary.ContainsKey(GLAccountNo) then
exit(not CheckedReferencedGLAccountDictionary.Get(GLAccountNo));
GLAccount.SetRange("No.", GLAccountNo);
if not GLAccount.IsEmpty() then begin
CheckedReferencedGLAccountDictionary.Add(GLAccountNo, true);
exit(false);
end else begin
CheckedReferencedGLAccountDictionary.Add(GLAccountNo, false);
exit(true);
end;
end;
local procedure ReferencedResourceRecordMissing(ResourceNo: Code[20]): Boolean;
var
Resource: Record Resource;
begin
if CheckedReferencedResourceDictionary.ContainsKey(ResourceNo) then
exit(not CheckedReferencedResourceDictionary.Get(ResourceNo));
Resource.SetRange("No.", ResourceNo);
if not Resource.IsEmpty() then begin
CheckedReferencedResourceDictionary.Add(ResourceNo, true);
exit(false);
end else begin
CheckedReferencedResourceDictionary.Add(ResourceNo, false);
exit(true);
end;
end;
local procedure ReferencedWorkTypeRecordMissing(WorkTypeCode: Code[10]): Boolean;
var
WorkType: Record "Work Type";
begin
if WorkTypeCode = '' then
exit(false);
if CheckedReferencedWorkTypeDictionary.ContainsKey(WorkTypeCode) then
exit(not CheckedReferencedWorkTypeDictionary.Get(WorkTypeCode));
WorkType.SetRange(Code, WorkTypeCode);
if not WorkType.IsEmpty() then begin
CheckedReferencedWorkTypeDictionary.Add(WorkTypeCode, true);
exit(false);
end else begin
CheckedReferencedWorkTypeDictionary.Add(WorkTypeCode, false);
exit(true);
end;
end;
local procedure ReferencedJobRecordMissing(JobNo: Code[20]): Boolean;
var
Job: Record Job;
begin
if CheckedReferencedJobDictionary.ContainsKey(JobNo) then
exit(not CheckedReferencedJobDictionary.Get(JobNo));
Job.SetRange("No.", JobNo);
if not Job.IsEmpty() then begin
CheckedReferencedJobDictionary.Add(JobNo, true);
exit(false);
end else begin
CheckedReferencedJobDictionary.Add(JobNo, false);
exit(true);
end;
end;
local procedure ReferencedJobTaskRecordMissing(JobNo: Code[20]; JobTaskNo: Code[20]): Boolean;
var
JobTask: Record "Job Task";
JobTaskCompositeKey: Code[41];
begin
JobTaskCompositeKey := PadStr(JobNo, MaxStrLen(JobTask."Job No."), '_') + '*' + PadStr(JobTaskNo, MaxStrLen(JobTask."Job Task No."), '_');
if CheckedReferencedJobTaskDictionary.ContainsKey(JobTaskCompositeKey) then
exit(not CheckedReferencedJobTaskDictionary.Get(JobTaskCompositeKey));
JobTask.SetRange("Job No.", JobNo);
JobTask.SetRange("Job Task No.", JobTaskNo);
if not JobTask.IsEmpty() then begin
CheckedReferencedJobTaskDictionary.Add(JobTaskCompositeKey, true);
exit(false);
end else begin
CheckedReferencedJobTaskDictionary.Add(JobTaskCompositeKey, false);
exit(true);
end;
end;
procedure CopyFrom(var SalesLineDiscount: Record "Sales Line Discount"; var PriceListLine: Record "Price List Line")
var
OrigSalesLineDiscount: Record "Sales Line Discount";
begin
OrigSalesLineDiscount := SalesLineDiscount;
if SalesLineDiscount.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if SalesLineDiscount.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine.Validate("Source Type", ConvertToSourceType(SalesLineDiscount));
PriceListLine.Validate("Source No.", SalesLineDiscount."Sales Code");
if PriceListLine."Source No." = SalesLineDiscount."Sales Code" then begin
PriceListLine."Starting Date" := SalesLineDiscount."Starting Date";
PriceListLine."Ending Date" := SalesLineDiscount."Ending Date";
case SalesLineDiscount.Type of
SalesLineDiscount.Type::Item:
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Item);
SalesLineDiscount.Type::"Item Disc. Group":
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::"Item Discount Group");
end;
PriceListLine.Validate("Asset No.", SalesLineDiscount.Code);
if PriceListLine."Asset No." = SalesLineDiscount.Code then
if VerifySalesLineDiscConsistency(SalesLineDiscount) then begin
if SalesLineDiscount.Type = SalesLineDiscount.Type::Item then begin
PriceListLine.Validate("Variant Code", SalesLineDiscount."Variant Code");
PriceListLine.Validate("Unit of Measure Code", SalesLineDiscount."Unit of Measure Code");
end;
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Discount;
PriceListLine."Line Discount %" := SalesLineDiscount."Line Discount %";
PriceListLine."Currency Code" := SalesLineDiscount."Currency Code";
PriceListLine."Minimum Quantity" := SalesLineDiscount."Minimum Quantity";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := false;
PriceListLine.Status := PriceListLine.Status::Active;
PriceListLine."Price Type" := PriceListLine."Price Type"::Sale;
OnCopyFromSalesLineDiscount(SalesLineDiscount, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
end;
until SalesLineDiscount.Next() = 0;
SalesLineDiscount := OrigSalesLineDiscount;
end;
local procedure VerifySalesLineDiscConsistency(SalesLineDiscount: Record "Sales Line Discount"): Boolean;
begin
if SalesLineDiscount.Type = SalesLineDiscount.Type::Item then begin
if SalesLineDiscount.Code = '' then
exit(false);
if ReferencedItemRecordMissing(SalesLineDiscount.Code) then
exit(false);
if ReferencedItemVariantRecordMissing(SalesLineDiscount.Code, SalesLineDiscount."Variant Code") then
exit(false);
if ReferencedUnitOfMeasureRecordMissing(SalesLineDiscount.Code, SalesLineDiscount."Unit of Measure Code") then
exit(false);
end;
if ReferencedCurrencyRecordMissing(SalesLineDiscount."Currency Code") then
exit(false);
exit(true);
end;
local procedure ConvertToSourceType(SalesPrice: Record "Sales Price") SourceType: Enum "Price Source Type";
begin
case SalesPrice."Sales Type" of
SalesPrice."Sales Type"::Customer:
exit(SourceType::Customer);
SalesPrice."Sales Type"::"Customer Price Group":
exit(SourceType::"Customer Price Group");
SalesPrice."Sales Type"::"All Customers":
exit(SourceType::"All Customers");
SalesPrice."Sales Type"::Campaign:
exit(SourceType::Campaign);
end;
end;
local procedure ConvertToSourceType(SalesLineDiscount: Record "Sales Line Discount") SourceType: Enum "Price Source Type";
begin
case SalesLineDiscount."Sales Type" of
SalesLineDiscount."Sales Type"::Customer:
exit(SourceType::Customer);
SalesLineDiscount."Sales Type"::"Customer Disc. Group":
exit(SourceType::"Customer Disc. Group");
SalesLineDiscount."Sales Type"::"All Customers":
exit(SourceType::"All Customers");
SalesLineDiscount."Sales Type"::Campaign:
exit(SourceType::Campaign);
end;
end;
procedure CopyTo(var TempSalesPrice: Record "Sales Price" temporary; var PriceListLine: Record "Price List Line") Copied: Boolean;
begin
TempSalesPrice.Reset();
TempSalesPrice.DeleteAll();
if PriceListLine.FindSet() then
repeat
TempSalesPrice.Init();
ConvertFromSourceType(PriceListLine."Source Type", TempSalesPrice);
TempSalesPrice."Sales Code" := PriceListLine."Source No.";
TempSalesPrice."VAT Bus. Posting Gr. (Price)" := PriceListLine."VAT Bus. Posting Gr. (Price)";
TempSalesPrice."Starting Date" := PriceListLine."Starting Date";
TempSalesPrice."Ending Date" := PriceListLine."Ending Date";
TempSalesPrice."Item No." := PriceListLine."Asset No.";
TempSalesPrice."Variant Code" := PriceListLine."Variant Code";
TempSalesPrice."Unit of Measure Code" := PriceListLine."Unit of Measure Code";
TempSalesPrice."Unit Price" := PriceListLine."Unit Price";
TempSalesPrice."Allow Invoice Disc." := PriceListLine."Allow Invoice Disc.";
TempSalesPrice."Allow Line Disc." := PriceListLine."Allow Line Disc.";
TempSalesPrice."Currency Code" := PriceListLine."Currency Code";
TempSalesPrice."Minimum Quantity" := PriceListLine."Minimum Quantity";
TempSalesPrice."Price Includes VAT" := PriceListLine."Price Includes VAT";
OnCopyToSalesPrice(TempSalesPrice, PriceListLine);
if TempSalesPrice.Insert(true) then
Copied := true;
until PriceListLine.Next() = 0;
end;
local procedure ConvertFromSourceType(SourceType: Enum "Price Source Type"; var SalesPrice: Record "Sales Price")
begin
case SourceType of
SourceType::Customer:
SalesPrice."Sales Type" := SalesPrice."Sales Type"::Customer;
SourceType::"Customer Price Group":
SalesPrice."Sales Type" := SalesPrice."Sales Type"::"Customer Price Group";
SourceType::"All Customers":
SalesPrice."Sales Type" := SalesPrice."Sales Type"::"All Customers";
SourceType::Campaign:
SalesPrice."Sales Type" := SalesPrice."Sales Type"::Campaign;
end;
end;
procedure CopyTo(var TempSalesLineDiscount: Record "Sales Line Discount" temporary; var PriceListLine: Record "Price List Line") Copied: Boolean;
begin
TempSalesLineDiscount.Reset();
TempSalesLineDiscount.DeleteAll();
if PriceListLine.FindSet() then
repeat
TempSalesLineDiscount.Init();
ConvertFromSourceType(PriceListLine."Source Type", TempSalesLineDiscount);
TempSalesLineDiscount."Sales Code" := PriceListLine."Source No.";
TempSalesLineDiscount."Starting Date" := PriceListLine."Starting Date";
TempSalesLineDiscount."Ending Date" := PriceListLine."Ending Date";
TempSalesLineDiscount.Type := ConvertAssetTypeToSalesDiscType(PriceListLine);
TempSalesLineDiscount.Code := PriceListLine."Asset No.";
if TempSalesLineDiscount.Type = TempSalesLineDiscount.Type::Item then begin
TempSalesLineDiscount."Variant Code" := PriceListLine."Variant Code";
TempSalesLineDiscount."Unit of Measure Code" := PriceListLine."Unit of Measure Code";
end;
TempSalesLineDiscount."Line Discount %" := PriceListLine."Line Discount %";
TempSalesLineDiscount."Currency Code" := PriceListLine."Currency Code";
TempSalesLineDiscount."Minimum Quantity" := PriceListLine."Minimum Quantity";
OnCopyToSalesLineDiscount(TempSalesLineDiscount, PriceListLine);
if TempSalesLineDiscount.Insert(true) then
Copied := true;
until PriceListLine.Next() = 0;
end;
local procedure ConvertFromSourceType(SourceType: Enum "Price Source Type"; var SalesLineDiscount: Record "Sales Line Discount")
begin
case SourceType of
SourceType::Customer:
SalesLineDiscount."Sales Type" := SalesLineDiscount."Sales Type"::Customer;
SourceType::"Customer Disc. Group":
SalesLineDiscount."Sales Type" := SalesLineDiscount."Sales Type"::"Customer Disc. Group";
SourceType::"All Customers":
SalesLineDiscount."Sales Type" := SalesLineDiscount."Sales Type"::"All Customers";
SourceType::Campaign:
SalesLineDiscount."Sales Type" := SalesLineDiscount."Sales Type"::Campaign;
end;
end;
local procedure ConvertAssetTypeToSalesDiscType(PriceListLine: Record "Price List Line") DiscType: Enum "Sales Line Discount Type";
begin
case PriceListLine."Asset Type" of
PriceListLine."Asset Type"::Item:
DiscType := DiscType::Item;
PriceListLine."Asset Type"::"Item Discount Group":
DiscType := DiscType::"Item Disc. Group";
else
PriceListLine.FieldError("Asset Type", NotMatchSalesLineDiscTypeErr);
end;
end;
procedure CopyFrom(var JobItemPrice: Record "Job Item Price"; var PriceListLine: Record "Price List Line")
var
OrigJobItemPrice: Record "Job Item Price";
begin
OrigJobItemPrice := JobItemPrice;
if JobItemPrice.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if JobItemPrice.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine."Price Type" := PriceListLine."Price Type"::Sale;
if SetJobAsSource(JobItemPrice."Job No.", JobItemPrice."Job Task No.", PriceListLine) then begin
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Item);
PriceListLine.Validate("Asset No.", JobItemPrice."Item No.");
if PriceListLine."Asset No." = JobItemPrice."Item No." then
if VerifyJobItemPriceConsistency(JobItemPrice) then begin
PriceListLine.Validate("Variant Code", JobItemPrice."Variant Code");
PriceListLine.Validate("Unit of Measure Code", JobItemPrice."Unit of Measure Code");
PriceListLine."Currency Code" := JobItemPrice."Currency Code";
PriceListLine."Allow Invoice Disc." := false;
if JobItemPrice."Apply Job Price" then begin
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine."Unit Price" := JobItemPrice."Unit Price";
PriceListLine."Cost Factor" := JobItemPrice."Unit Cost Factor";
PriceListLine."Allow Line Disc." := JobItemPrice."Apply Job Discount";
PriceListLine.Status := PriceListLine.Status::Active;
InsertPriceListLine(PriceListLine);
end;
if JobItemPrice."Apply Job Discount" then begin
PriceListLine."Price List Code" := '';
PriceListLine.Status := PriceListLine.Status::Draft;
PriceListLine.Validate("Amount Type", PriceListLine."Amount Type"::Discount);
PriceListLine."Unit Price" := 0;
PriceListLine."Cost Factor" := 0;
PriceListLine."Line Discount %" := JobItemPrice."Line Discount %";
PriceListLine.Status := PriceListLine.Status::Active;
InsertPriceListLine(PriceListLine);
end;
OnCopyFromJobItemPrice(JobItemPrice, PriceListLine);
end;
end;
until JobItemPrice.Next() = 0;
JobItemPrice := OrigJobItemPrice;
end;
local procedure VerifyJobItemPriceConsistency(JobItemPrice: Record "Job Item Price"): Boolean;
begin
if JobItemPrice."Item No." = '' then
exit(false);
if ReferencedItemRecordMissing(JobItemPrice."Item No.") then
exit(false);
if ReferencedItemVariantRecordMissing(JobItemPrice."Item No.", JobItemPrice."Variant Code") then
exit(false);
if ReferencedUnitOfMeasureRecordMissing(JobItemPrice."Item No.", JobItemPrice."Unit of Measure Code") then
exit(false);
if ReferencedCurrencyRecordMissing(JobItemPrice."Currency Code") then
exit(false);
exit(true);
end;
procedure CopyFrom(var JobGLAccountPrice: Record "Job G/L Account Price"; var PriceListLine: Record "Price List Line")
var
OrigJobGLAccountPrice: Record "Job G/L Account Price";
begin
OrigJobGLAccountPrice := JobGLAccountPrice;
if JobGLAccountPrice.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if JobGLAccountPrice.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
if SetJobAsSource(JobGLAccountPrice."Job No.", JobGLAccountPrice."Job Task No.", PriceListLine) then begin
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::"G/L Account");
PriceListLine.Validate("Asset No.", JobGLAccountPrice."G/L Account No.");
if PriceListLine."Asset No." = JobGLAccountPrice."G/L Account No." then
if VerifyJobGLAccountPriceConsistency(JobGLAccountPrice) then begin
PriceListLine."Currency Code" := JobGLAccountPrice."Currency Code";
if JobGLAccountPrice."Line Discount %" <> 0 then begin
PriceListLine."Line Discount %" := JobGLAccountPrice."Line Discount %";
PriceListLine."Amount Type" := "Price Amount Type"::Any;
end;
PriceListLine."Unit Price" := JobGLAccountPrice."Unit Price";
PriceListLine."Cost Factor" := JobGLAccountPrice."Unit Cost Factor";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := true;
if (PriceListLine."Line Discount %" <> 0) or
(PriceListLine."Unit Price" <> 0) or (PriceListLine."Cost Factor" <> 0)
then begin
if PriceListLine."Line Discount %" = 0 then
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price
else
if (PriceListLine."Unit Price" = 0) and (PriceListLine."Cost Factor" = 0) then begin
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Discount;
PriceListLine."Allow Line Disc." := false;
end;
PriceListLine.Status := PriceListLine.Status::Active;
PriceListLine."Price Type" := PriceListLine."Price Type"::Sale;
OnCopyFromJobGLAccountPrice(JobGLAccountPrice, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
if JobGLAccountPrice."Unit Cost" <> 0 then begin
PriceListLine."Price List Code" := '';
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine."Line Discount %" := 0;
PriceListLine."Unit Price" := 0;
PriceListLine."Cost Factor" := 0;
PriceListLine."Allow Line Disc." := false;
PriceListLine."Unit Cost" := JobGLAccountPrice."Unit Cost";
PriceListLine."Price Type" := PriceListLine."Price Type"::Purchase;
OnCopyFromJobGLAccountPrice(JobGLAccountPrice, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
end;
end;
until JobGLAccountPrice.Next() = 0;
JobGLAccountPrice := OrigJobGLAccountPrice;
end;
local procedure VerifyJobGLAccountPriceConsistency(JobGLAccountPrice: Record "Job G/L Account Price"): Boolean;
begin
if JobGLAccountPrice."G/L Account No." = '' then
exit(false);
if ReferencedGLAccountRecordMissing(JobGLAccountPrice."G/L Account No.") then
exit(false);
if ReferencedCurrencyRecordMissing(JobGLAccountPrice."Currency Code") then
exit(false);
exit(true);
end;
procedure CopyFrom(var JobResourcePrice: Record "Job Resource Price"; var PriceListLine: Record "Price List Line")
var
OrigJobResourcePrice: Record "Job Resource Price";
begin
OrigJobResourcePrice := JobResourcePrice;
if JobResourcePrice.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if JobResourcePrice.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine."Price Type" := PriceListLine."Price Type"::Sale;
if SetJobAsSource(JobResourcePrice."Job No.", JobResourcePrice."Job Task No.", PriceListLine) then begin
case JobResourcePrice.Type of
JobResourcePrice.Type::All,
JobResourcePrice.Type::Resource:
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Resource);
JobResourcePrice.Type::"Group(Resource)":
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::"Resource Group");
end;
PriceListLine.Validate("Asset No.", JobResourcePrice.Code);
if PriceListLine."Asset No." = JobResourcePrice.Code then
if VerifyJobResourcePriceConsistency(JobResourcePrice) then begin
PriceListLine."Work Type Code" := JobResourcePrice."Work Type Code";
PriceListLine."Currency Code" := JobResourcePrice."Currency Code";
PriceListLine."Allow Invoice Disc." := false;
if JobResourcePrice."Apply Job Price" then begin
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine."Unit Price" := JobResourcePrice."Unit Price";
PriceListLine."Cost Factor" := JobResourcePrice."Unit Cost Factor";
PriceListLine."Allow Line Disc." := JobResourcePrice."Apply Job Discount";
PriceListLine.Status := PriceListLine.Status::Active;
InsertPriceListLine(PriceListLine);
end;
if JobResourcePrice."Apply Job Discount" then begin
PriceListLine."Price List Code" := '';
PriceListLine.Status := PriceListLine.Status::Draft;
PriceListLine.Validate("Amount Type", PriceListLine."Amount Type"::Discount);
PriceListLine."Unit Price" := 0;
PriceListLine."Cost Factor" := 0;
PriceListLine."Line Discount %" := JobResourcePrice."Line Discount %";
PriceListLine.Status := PriceListLine.Status::Active;
InsertPriceListLine(PriceListLine);
end;
OnCopyFromJobResourcePrice(JobResourcePrice, PriceListLine);
end;
end;
until JobResourcePrice.Next() = 0;
JobResourcePrice := OrigJobResourcePrice;
end;
local procedure VerifyJobResourcePriceConsistency(JobResourcePrice: Record "Job Resource Price"): Boolean;
begin
if JobResourcePrice.Type = JobResourcePrice.Type::Resource then begin
if JobResourcePrice.Code = '' then
exit(false);
if ReferencedResourceRecordMissing(JobResourcePrice.Code) then
exit(false);
end;
if ReferencedCurrencyRecordMissing(JobResourcePrice."Currency Code") then
exit(false);
if ReferencedWorkTypeRecordMissing(JobResourcePrice."Work Type Code") then
exit(false);
exit(true);
end;
local procedure SetJobAsSource(JobNo: Code[20]; JobTaskNo: Code[20]; var PriceListLine: Record "Price List Line"): Boolean;
begin
if JobNo <> '' then
if ReferencedJobRecordMissing(JobNo) then
exit(false);
if JobTaskNo <> '' then
if ReferencedJobTaskRecordMissing(JobNo, JobTaskNo) then
exit(false);
if JobTaskNo = '' then begin
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::Job);
PriceListLine.Validate("Source No.", JobNo);
end else begin
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::"Job Task");
PriceListLine.Validate("Parent Source No.", JobNo);
PriceListLine.Validate("Source No.", JobTaskNo);
end;
exit(true);
end;
procedure CopyFrom(var ResourceCost: Record "Resource Cost"; var PriceListLine: Record "Price List Line")
var
OrigResourceCost: Record "Resource Cost";
TempResourceCost: Record "Resource Cost" temporary;
begin
OrigResourceCost := ResourceCost;
if ResourceCost.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
ResourceCost.SetRange("Cost Type", ResourceCost."Cost Type"::Fixed);
if ResourceCost.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine."Price Type" := PriceListLine."Price Type"::Purchase;
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::"All Vendors");
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
case ResourceCost.Type of
ResourceCost.Type::All,
ResourceCost.Type::Resource:
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Resource);
ResourceCost.Type::"Group(Resource)":
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::"Resource Group");
end;
PriceListLine.Validate("Asset No.", ResourceCost.Code);
if PriceListLine."Asset No." = ResourceCost.Code then
if VerifyResourceCostConsistency(ResourceCost) then begin
PriceListLine."Work Type Code" := ResourceCost."Work Type Code";
PriceListLine."Unit Cost" := ResourceCost."Unit Cost";
PriceListLine."Direct Unit Cost" := ResourceCost."Direct Unit Cost";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := true;
PriceListLine.Status := PriceListLine.Status::Active;
OnCopyFromResourceCost(ResourceCost, PriceListLine);
InsertPriceListLine(PriceListLine);
TempResourceCost := ResourceCost;
TempResourceCost.Insert();
end;
until ResourceCost.Next() = 0;
CopySpecialCostTypes(TempResourceCost, PriceListLine);
ResourceCost := OrigResourceCost;
end;
local procedure VerifyResourceCostConsistency(ResourceCost: Record "Resource Cost"): Boolean;
begin
if ResourceCost.Type = ResourceCost.Type::Resource then begin
if ResourceCost.Code = '' then
exit(false);
if ReferencedResourceRecordMissing(ResourceCost.Code) then
exit(false);
end;
if ReferencedWorkTypeRecordMissing(ResourceCost."Work Type Code") then
exit(false);
exit(true);
end;
local procedure CopySpecialCostTypes(var TempResourceCost: Record "Resource Cost" temporary; var PriceListLine: Record "Price List Line")
var
Resource: Record Resource;
ResourceCost: Record "Resource Cost";
begin
ResourceCost.SetFilter("Cost Type", '<>%1', ResourceCost."Cost Type"::Fixed);
if ResourceCost.FindSet() then
repeat
if FindResources(ResourceCost, Resource) then
CreatePriceLinePerResource(Resource, ResourceCost, TempResourceCost, PriceListLine);
until ResourceCost.Next() = 0;
end;
local procedure FindResources(ResourceCost: Record "Resource Cost"; var Resource: Record Resource): Boolean
begin
case ResourceCost.Type of
ResourceCost.Type::Resource:
Resource.SetRange("No.", ResourceCost.Code);
ResourceCost.Type::"Group(Resource)":
Resource.SetRange("Resource Group No.", ResourceCost.Code);
ResourceCost.Type::All:
Resource.Reset();
end;
exit(Resource.FindSet());
end;
local procedure CreatePriceLinePerResource(var Resource: Record Resource; ResourceCost: Record "Resource Cost"; var TempResourceCost: Record "Resource Cost" temporary; var PriceListLine: Record "Price List Line")
var
NewResourceCost: Record "Resource Cost";
ResourceFindCost: Codeunit "Resource-Find Cost";
begin
repeat
if not IsDuplicateResourceCost(ResourceCost, TempResourceCost, Resource."No.") then begin
NewResourceCost := ResourceCost;
NewResourceCost.Type := ResourceCost.Type::Resource;
NewResourceCost.Code := Resource."No.";
ResourceFindCost.Run(NewResourceCost);
TempResourceCost := NewResourceCost;
if TempResourceCost.Insert() then begin
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine."Price Type" := PriceListLine."Price Type"::Purchase;
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::"All Vendors");
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Resource);
PriceListLine.Validate("Asset No.", Resource."No.");
if PriceListLine."Asset No." = Resource."No." then
if VerifyResourceCostConsistency(ResourceCost) then begin
PriceListLine."Work Type Code" := ResourceCost."Work Type Code";
PriceListLine."Unit Cost" := NewResourceCost."Unit Cost";
PriceListLine."Direct Unit Cost" := NewResourceCost."Direct Unit Cost";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := true;
PriceListLine.Status := PriceListLine.Status::Active;
OnCopyFromResourceCost(ResourceCost, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
end;
end;
until Resource.Next() = 0;
end;
local procedure IsDuplicateResourceCost(ResourceCost: Record "Resource Cost"; var TempResourceCost: Record "Resource Cost" temporary; ResourceNo: Code[20]): Boolean;
begin
if ResourceCost.Type = ResourceCost.Type::Resource then
exit(false);
exit(TempResourceCost.Get(TempResourceCost.Type::Resource, ResourceNo, ResourceCost."Work Type Code"));
end;
procedure CopyFrom(var ResourcePrice: Record "Resource Price"; var PriceListLine: Record "Price List Line")
var
OrigResourcePrice: Record "Resource Price";
begin
OrigResourcePrice := ResourcePrice;
if ResourcePrice.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if ResourcePrice.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::"All Customers");
case ResourcePrice.Type of
ResourcePrice.Type::All,
ResourcePrice.Type::Resource:
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Resource);
ResourcePrice.Type::"Group(Resource)":
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::"Resource Group");
end;
PriceListLine.Validate("Asset No.", ResourcePrice.Code);
if PriceListLine."Asset No." = ResourcePrice.Code then
if VerifyResourcePriceConsistency(ResourcePrice) then begin
PriceListLine."Currency Code" := ResourcePrice."Currency Code";
PriceListLine."Work Type Code" := ResourcePrice."Work Type Code";
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine."Unit Price" := ResourcePrice."Unit Price";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := true;
PriceListLine.Status := PriceListLine.Status::Active;
PriceListLine."Price Type" := PriceListLine."Price Type"::Sale;
OnCopyFromResourcePrice(ResourcePrice, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
until ResourcePrice.Next() = 0;
ResourcePrice := OrigResourcePrice;
end;
local procedure VerifyResourcePriceConsistency(ResourcePrice: Record "Resource Price"): Boolean;
begin
if ResourcePrice.Type = ResourcePrice.Type::Resource then begin
if ResourcePrice.Code = '' then
exit(false);
if ReferencedResourceRecordMissing(ResourcePrice.Code) then
exit(false);
end;
if ReferencedCurrencyRecordMissing(ResourcePrice."Currency Code") then
exit(false);
if ReferencedWorkTypeRecordMissing(ResourcePrice."Work Type Code") then
exit(false);
exit(true);
end;
procedure CopyFrom(var PurchasePrice: Record "Purchase Price"; var PriceListLine: Record "Price List Line")
var
OrigPurchasePrice: Record "Purchase Price";
begin
OrigPurchasePrice := PurchasePrice;
if PurchasePrice.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if PurchasePrice.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::Vendor);
PriceListLine.Validate("Source No.", PurchasePrice."Vendor No.");
if PriceListLine."Source No." = PurchasePrice."Vendor No." then begin
PriceListLine."Starting Date" := PurchasePrice."Starting Date";
PriceListLine."Ending Date" := PurchasePrice."Ending Date";
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Item);
PriceListLine.Validate("Asset No.", PurchasePrice."Item No.");
if PriceListLine."Asset No." = PurchasePrice."Item No." then
if VerifyPurchPriceConsistency(PurchasePrice) then begin
PriceListLine.Validate("Variant Code", PurchasePrice."Variant Code");
PriceListLine.Validate("Unit of Measure Code", PurchasePrice."Unit of Measure Code");
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Price;
PriceListLine."Direct Unit Cost" := PurchasePrice."Direct Unit Cost";
PriceListLine."Currency Code" := PurchasePrice."Currency Code";
PriceListLine."Minimum Quantity" := PurchasePrice."Minimum Quantity";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := true;
PriceListLine.Status := PriceListLine.Status::Active;
PriceListLine."Price Type" := PriceListLine."Price Type"::Purchase;
OnCopyFromPurchasePrice(PurchasePrice, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
end;
until PurchasePrice.Next() = 0;
PurchasePrice := OrigPurchasePrice;
end;
local procedure VerifyPurchPriceConsistency(PurchasePrice: Record "Purchase Price"): Boolean;
begin
if PurchasePrice."Item No." = '' then
exit(false);
if ReferencedItemRecordMissing(PurchasePrice."Item No.") then
exit(false);
if ReferencedItemVariantRecordMissing(PurchasePrice."Item No.", PurchasePrice."Variant Code") then
exit(false);
if ReferencedUnitOfMeasureRecordMissing(PurchasePrice."Item No.", PurchasePrice."Unit of Measure Code") then
exit(false);
if ReferencedCurrencyRecordMissing(PurchasePrice."Currency Code") then
exit(false);
exit(true);
end;
procedure CopyFrom(var PurchaseLineDiscount: Record "Purchase Line Discount"; var PriceListLine: Record "Price List Line")
var
OrigPurchaseLineDiscount: Record "Purchase Line Discount";
begin
OrigPurchaseLineDiscount := PurchaseLineDiscount;
if PurchaseLineDiscount.IsTemporary then begin
PriceListLine.Reset();
PriceListLine.DeleteAll();
end;
if PurchaseLineDiscount.FindSet() then
repeat
PriceListLine.Init();
PriceListLine."Price List Code" := '';
PriceListLine.Validate("Source Type", PriceListLine."Source Type"::Vendor);
PriceListLine.Validate("Source No.", PurchaseLineDiscount."Vendor No.");
if PriceListLine."Source No." = PurchaseLineDiscount."Vendor No." then begin
PriceListLine."Starting Date" := PurchaseLineDiscount."Starting Date";
PriceListLine."Ending Date" := PurchaseLineDiscount."Ending Date";
PriceListLine.Validate("Asset Type", PriceListLine."Asset Type"::Item);
PriceListLine.Validate("Asset No.", PurchaseLineDiscount."Item No.");
if PriceListLine."Asset No." = PurchaseLineDiscount."Item No." then
if VerifyPurchLineDiscConsistency(PurchaseLineDiscount) then begin
PriceListLine.Validate("Variant Code", PurchaseLineDiscount."Variant Code");
PriceListLine.Validate("Unit of Measure Code", PurchaseLineDiscount."Unit of Measure Code");
PriceListLine."Amount Type" := PriceListLine."Amount Type"::Discount;
PriceListLine."Line Discount %" := PurchaseLineDiscount."Line Discount %";
PriceListLine."Currency Code" := PurchaseLineDiscount."Currency Code";
PriceListLine."Minimum Quantity" := PurchaseLineDiscount."Minimum Quantity";
PriceListLine."Allow Invoice Disc." := false;
PriceListLine."Allow Line Disc." := false;
PriceListLine.Status := PriceListLine.Status::Active;
PriceListLine."Price Type" := PriceListLine."Price Type"::Purchase;
OnCopyFromPurchLineDiscount(PurchaseLineDiscount, PriceListLine);
InsertPriceListLine(PriceListLine);
end;
end;
until PurchaseLineDiscount.Next() = 0;
PurchaseLineDiscount := OrigPurchaseLineDiscount;
end;
local procedure VerifyPurchLineDiscConsistency(PurchaseLineDiscount: Record "Purchase Line Discount"): Boolean;
begin
if PurchaseLineDiscount."Item No." = '' then
exit(false);
if ReferencedItemRecordMissing(PurchaseLineDiscount."Item No.") then
exit(false);
if ReferencedItemVariantRecordMissing(PurchaseLineDiscount."Item No.", PurchaseLineDiscount."Variant Code") then
exit(false);
if ReferencedUnitOfMeasureRecordMissing(PurchaseLineDiscount."Item No.", PurchaseLineDiscount."Unit of Measure Code") then
exit(false);
if ReferencedCurrencyRecordMissing(PurchaseLineDiscount."Currency Code") then
exit(false);
exit(true);
end;
local procedure InsertPriceListLine(var PriceListLine: Record "Price List Line")
begin
InitLineNo(PriceListLine);
OnBeforeInsertPriceListLine(PriceListLine);
PriceListLine.Insert(true);
end;
procedure InitLineNo(var PriceListLine: Record "Price List Line")
var
PriceListManagement: Codeunit "Price List Management";
begin
if PriceListLine.IsTemporary() then
PriceListLine."Line No." += 10000
else begin
SetPriceListCode(PriceListLine);
PriceListLine.SetNextLineNo();
if GenerateHeader and UseDefaultPriceLists and (PriceListLine."Line No." > GetMaxPriceLineNo()) then begin
PriceListLine."Price List Code" :=
PriceListManagement.DefineDefaultPriceList(PriceListLine."Price Type", PriceListLine."Source Group");
PriceListLine.SetNextLineNo();
end;
end;
OnAfterInitLineNo(PriceListLine);
end;
local procedure GetMaxPriceLineNo(): Integer;
begin
exit(1000000000)
end;
local procedure SetPriceListCode(var PriceListLine: Record "Price List Line")
var
PriceListHeader: Record "Price List Header";
PriceListManagement: Codeunit "Price List Management";
begin
if GenerateHeader then
if UseDefaultPriceLists then
PriceListLine."Price List Code" :=
PriceListManagement.GetDefaultPriceListCode(
PriceListLine."Price Type", PriceListLine."Source Group", true)
else begin
if not FindHeader(PriceListLine, PriceListHeader) then
InsertHeader(PriceListLine, PriceListHeader);
PriceListLine."Price List Code" := PriceListHeader.Code;
if (PriceListLine."Amount Type" = "Price Amount Type"::Any) and
(PriceListHeader."Amount Type" <> "Price Amount Type"::Any)
then begin
PriceListHeader."Amount Type" := "Price Amount Type"::Any;
PriceListHeader.Modify();
end;
end
end;
local procedure FindHeader(PriceListLine: Record "Price List Line"; var PriceListHeader: Record "Price List Header"): Boolean;
begin
PriceListHeader.SetRange("Price Type", PriceListLine."Price Type");
PriceListHeader.SetRange("Source Type", PriceListLine."Source Type");
PriceListHeader.SetRange("Parent Source No.", PriceListLine."Parent Source No.");
PriceListHeader.SetRange("Source No.", PriceListLine."Source No.");
PriceListHeader.SetRange("Starting Date", PriceListLine."Starting Date");
PriceListHeader.SetRange("Ending Date", PriceListLine."Ending Date");
PriceListHeader.SetRange("Currency Code", PriceListLine."Currency Code");
PriceListHeader.SetRange("Amount Type", PriceListLine."Amount Type");
OnBeforeFindHeader(PriceListLine, PriceListHeader);
exit(PriceListHeader.FindFirst());
end;
local procedure InsertHeader(PriceListLine: Record "Price List Line"; var PriceListHeader: Record "Price List Header")
var
PriceSource: Record "Price Source";
FeatureTelemetry: Codeunit "Feature Telemetry";
PriceCalculationMgt: Codeunit "Price Calculation Mgt.";
begin
FeatureTelemetry.LogUptake('0000LLR', PriceCalculationMgt.GetFeatureTelemetryName(), Enum::"Feature Uptake Status"::"Used");
PriceListLine.CopyTo(PriceSource);
PriceListHeader.CopyFrom(PriceSource);
GenerateDescription(PriceListHeader);
PriceListHeader."Amount Type" := PriceListLine."Amount Type";
PriceListHeader.Status := PriceListHeader.Status::Active;
OnBeforeInsertHeader(PriceListLine, PriceListHeader);
PriceListHeader.Insert(true);
FeatureTelemetry.LogUsage('0000LLR', PriceCalculationMgt.GetFeatureTelemetryName(), 'Price List automatically activated');
end;
/// <summary>
/// Generates the description for the header, e.g. 'Customer 10000, 01.01.2021 - 31.01.2021'
/// </summary>
/// <param name="PriceListHeader">the generated header</param>
local procedure GenerateDescription(var PriceListHeader: Record "Price List Header")
var
Description: Text;
begin
Description := Format(PriceListHeader."Source Type");
if PriceListHeader."Parent Source No." <> '' then
Description += StrSubstNo(PlaceHolderBracketTok, PriceListHeader."Parent Source No.");
if PriceListHeader."Source No." <> '' then
Description += StrSubstNo(PlaceHolderTok, PriceListHeader."Source No.");
if PriceListHeader."Starting Date" <> 0D then
Description += StrSubstNo(PlaceHolderRangeTok, PriceListHeader."Starting Date", PriceListHeader."Ending Date");
PriceListHeader.Description := CopyStr(Description, 1, MaxStrLen(PriceListHeader.Description));
end;
[IntegrationEvent(false, false)]
local procedure OnAfterInitLineNo(var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeFindHeader(PriceListLine: Record "Price List Line"; var PriceListHeader: Record "Price List Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertHeader(PriceListLine: Record "Price List Line"; var PriceListHeader: Record "Price List Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertPriceListLine(var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromPurchLineDiscount(PurchaseLineDiscount: Record "Purchase Line Discount"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromPurchasePrice(PurchasePrice: Record "Purchase Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromResourceCost(ResourceCost: Record "Resource Cost"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromResourcePrice(ResourcePrice: Record "Resource Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromJobItemPrice(var JobItemPrice: Record "Job Item Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromJobGLAccountPrice(var JobGLAccountPrice: Record "Job G/L Account Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromJobResourcePrice(var JobResourcePrice: Record "Job Resource Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromSalesPrice(var SalesPrice: Record "Sales Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyToSalesPrice(var SalesPrice: Record "Sales Price"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyFromSalesLineDiscount(var SalesLineDiscount: Record "Sales Line Discount"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCopyToSalesLineDiscount(var SalesLineDiscount: Record "Sales Line Discount"; var PriceListLine: Record "Price List Line")
begin
end;
}