Codeunit 7041 Price Asset - Item, source in 29
Source29
src/Layers/W1/BaseApp/Pricing/Asset/PriceAssetItem.Codeunit.al261 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.Asset;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Pricing.Calculation;
using Microsoft.Pricing.PriceList;
codeunit 7041 "Price Asset - Item" implements "Price Asset"
{
var
Item: Record Item;
ItemUnitofMeasure: Record "Item Unit of Measure";
ItemVariant: Record "Item Variant";
procedure GetNo(var PriceAsset: Record "Price Asset")
begin
PriceAsset."Table Id" := Database::Item;
if Item.GetBySystemId(PriceAsset."Asset ID") then begin
PriceAsset."Asset No." := Item."No.";
PriceAsset."Variant Code" := '';
FillAdditionalFields(PriceAsset);
end else
if ItemVariant.GetBySystemId(PriceAsset."Asset ID") then begin
PriceAsset."Table Id" := Database::"Item Variant";
PriceAsset."Asset No." := ItemVariant."Item No.";
PriceAsset."Variant Code" := ItemVariant.Code;
FillAdditionalFields(PriceAsset);
end else
PriceAsset.InitAsset();
end;
procedure GetId(var PriceAsset: Record "Price Asset")
begin
PriceAsset."Table Id" := Database::Item;
if PriceAsset."Variant Code" = '' then begin
if Item.Get(PriceAsset."Asset No.") then begin
PriceAsset."Asset ID" := Item.SystemId;
FillAdditionalFields(PriceAsset);
end else
PriceAsset.InitAsset();
end else
if Item.Get(PriceAsset."Asset No.") and
ItemVariant.Get(PriceAsset."Asset No.", PriceAsset."Variant Code")
then begin
PriceAsset."Table Id" := Database::"Item Variant";
PriceAsset."Asset ID" := ItemVariant.SystemId;
FillAdditionalFields(PriceAsset);
end else
if not ClearVariantIfNotBelongsToItem(PriceAsset) then
PriceAsset.InitAsset();
end;
procedure IsLookupOK(var PriceAsset: Record "Price Asset"): Boolean
var
xPriceAsset: Record "Price Asset";
begin
OnBeforeIsLookupOK(PriceAsset, Item);
xPriceAsset := PriceAsset;
if Item.Get(xPriceAsset."Asset No.") then;
if Page.RunModal(Page::"Item Lookup", Item) = ACTION::LookupOK then begin
xPriceAsset.Validate("Asset No.", Item."No.");
PriceAsset := xPriceAsset;
exit(true);
end;
end;
procedure ValidateUnitOfMeasure(var PriceAsset: Record "Price Asset"): Boolean
begin
ItemUnitofMeasure.SetLoadFields("Item No.", Code);
ItemUnitofMeasure.Get(PriceAsset."Asset No.", PriceAsset."Unit of Measure Code");
end;
procedure IsLookupUnitOfMeasureOK(var PriceAsset: Record "Price Asset"): Boolean
begin
if ItemUnitofMeasure.Get(PriceAsset."Asset No.", PriceAsset."Unit of Measure Code") then;
ItemUnitofMeasure.SetRange("Item No.", PriceAsset."Asset No.");
if Page.RunModal(Page::"Item Units of Measure", ItemUnitofMeasure) = ACTION::LookupOK then begin
PriceAsset.Validate("Unit of Measure Code", ItemUnitofMeasure.Code);
exit(true);
end;
end;
procedure IsLookupVariantOK(var PriceAsset: Record "Price Asset"): Boolean
begin
if ItemVariant.Get(PriceAsset."Asset No.", PriceAsset."Variant Code") then;
ItemVariant.SetRange("Item No.", PriceAsset."Asset No.");
if Page.RunModal(Page::"Item Variants", ItemVariant) = ACTION::LookupOK then begin
PriceAsset.Validate("Variant Code", ItemVariant.Code);
exit(true);
end;
end;
procedure IsAssetNoRequired(): Boolean;
begin
exit(true)
end;
procedure FillBestLine(PriceCalculationBuffer: Record "Price Calculation Buffer"; AmountType: Enum "Price Amount Type"; var PriceListLine: Record "Price List Line")
begin
Item.Get(PriceCalculationBuffer."Asset No.");
PriceListLine."VAT Prod. Posting Group" := Item."VAT Prod. Posting Group";
PriceListLine."Unit of Measure Code" := '';
PriceListLine."Currency Code" := '';
if AmountType <> AmountType::Discount then
case PriceCalculationBuffer."Price Type" of
PriceCalculationBuffer."Price Type"::Sale:
begin
PriceListLine."VAT Bus. Posting Gr. (Price)" := Item."VAT Bus. Posting Gr. (Price)";
PriceListLine."Price Includes VAT" := Item."Price Includes VAT";
PriceListLine."Unit Price" := Item."Unit Price";
end;
PriceCalculationBuffer."Price Type"::Purchase:
begin
PriceListLine."Price Includes VAT" := false;
CopyCostFromSKU(PriceCalculationBuffer, Item."Last Direct Cost");
PriceListLine."Direct Unit Cost" := Item."Last Direct Cost";
end;
end;
OnAfterFillBestLine(PriceCalculationBuffer, AmountType, PriceListLine);
end;
local procedure CopyCostFromSKU(PriceCalculationBuffer: Record "Price Calculation Buffer"; var UnitCost: Decimal)
var
StockkeepingUnit: Record "Stockkeeping Unit";
begin
StockkeepingUnit.SetLoadFields("Last Direct Cost");
if StockkeepingUnit.Get(PriceCalculationBuffer."Location Code", PriceCalculationBuffer."Asset No.", PriceCalculationBuffer."Variant Code") then
if StockkeepingUnit."Last Direct Cost" <> 0 then
UnitCost := StockkeepingUnit."Last Direct Cost";
end;
procedure FilterPriceLines(PriceAsset: Record "Price Asset"; var PriceListLine: Record "Price List Line") Result: Boolean;
begin
PriceListLine.SetRange("Asset Type", PriceAsset."Asset Type");
PriceListLine.SetRange("Asset No.", PriceAsset."Asset No.");
PriceListLine.SetFilter("Variant Code", '%1|%2', PriceAsset."Variant Code", '');
OnAfterFilterPriceLines(PriceAsset, PriceListLine, Result);
end;
procedure PutRelatedAssetsToList(PriceAsset: Record "Price Asset"; var PriceAssetList: Codeunit "Price Asset List")
var
NewPriceAsset: Record "Price Asset";
begin
if PriceAsset."Asset No." = '' then
exit;
Item.Get(PriceAsset."Asset No.");
if Item."Item Disc. Group" <> '' then begin
PriceAssetList.SetLevel(PriceAsset.Level);
PriceAssetList.Add(PriceAsset."Asset Type"::"Item Discount Group", Item."Item Disc. Group");
end;
PriceAssetList.SetLevel(PriceAsset.Level - 1);
NewPriceAsset := PriceAsset;
NewPriceAsset.Validate("Asset No.", ''); // All Items
PriceAssetList.Add(NewPriceAsset);
OnAfterPutRelatedAssetsToList(PriceAsset, PriceAssetList);
end;
procedure FillFromBuffer(var PriceAsset: Record "Price Asset"; PriceCalculationBuffer: Record "Price Calculation Buffer")
begin
PriceAsset.NewEntry(PriceCalculationBuffer."Asset Type", PriceAsset.Level);
PriceAsset.Validate("Asset No.", PriceCalculationBuffer."Asset No.");
PriceAsset.Validate("Variant Code", PriceCalculationBuffer."Variant Code");
PriceAsset."Unit of Measure Code" := PriceCalculationBuffer."Unit of Measure Code";
OnAfterFillFromBuffer(PriceAsset, PriceCalculationBuffer);
end;
local procedure FillAdditionalFields(var PriceAsset: Record "Price Asset")
begin
PriceAsset."Unit of Measure Code" := GetUnitOfMeasure(PriceAsset."Price Type");
if PriceAsset."Variant Code" = '' then
PriceAsset.Description := Item.Description
else
PriceAsset.Description := ItemVariant.Description;
case PriceAsset."Price Type" of
PriceAsset."Price Type"::Sale:
begin
PriceAsset."Allow Invoice Disc." := Item."Allow Invoice Disc.";
PriceAsset."Price Includes VAT" := Item."Price Includes VAT";
PriceAsset."VAT Bus. Posting Gr. (Price)" := Item."VAT Bus. Posting Gr. (Price)";
PriceAsset."Unit Price" := Item."Unit Price";
end;
PriceAsset."Price Type"::Purchase:
begin
PriceAsset."Allow Invoice Disc." := Item."Allow Invoice Disc.";
PriceAsset."Unit Price" := Item."Last Direct Cost";
end;
end;
OnAfterFillAdditionalFields(PriceAsset, Item, ItemVariant);
end;
local procedure GetUnitOfMeasure(PriceType: Enum "Price Type"): Code[10]
begin
case PriceType of
PriceType::Any:
exit(Item."Base Unit of Measure");
PriceType::Purchase:
exit(Item."Purch. Unit of Measure");
PriceType::Sale:
exit(Item."Sales Unit of Measure");
end;
end;
local procedure ClearVariantIfNotBelongsToItem(var PriceAsset: Record "Price Asset"): Boolean
var
ItemVar: Record "Item Variant";
begin
if (PriceAsset."Asset Type" <> PriceAsset."Asset Type"::Item) or (PriceAsset."Variant Code" = '') or (PriceAsset."Asset No." = '') then
exit;
ItemVar.SetRange("Item No.", PriceAsset."Asset No.");
ItemVar.SetRange(Code, PriceAsset."Variant Code");
if not ItemVar.IsEmpty() then
exit;
if Item.Get(PriceAsset."Asset No.") then begin
PriceAsset."Asset ID" := Item.SystemId;
PriceAsset."Variant Code" := '';
FillAdditionalFields(PriceAsset);
exit(true);
end;
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFillBestLine(PriceCalculationBuffer: Record "Price Calculation Buffer"; AmountType: Enum "Price Amount Type"; var PriceListLine: Record "Price List Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFilterPriceLines(PriceAsset: Record "Price Asset"; var PriceListLine: Record "Price List Line"; var Result: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterPutRelatedAssetsToList(PriceAsset: Record "Price Asset"; var PriceAssetList: Codeunit "Price Asset List")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFillAdditionalFields(var PriceAsset: Record "Price Asset"; Item: Record Item; ItemVariant: Record "Item Variant")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeIsLookupOK(PriceAsset: Record "Price Asset"; var Item: Record Item)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFillFromBuffer(var PriceAsset: Record "Price Asset"; var PriceCalculationBuffer: Record "Price Calculation Buffer")
begin
end;
}