diff --git a/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustSubContractLine.Table.al b/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustSubContractLine.Table.al index 73b5e34f38..d677156e9a 100644 --- a/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustSubContractLine.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustSubContractLine.Table.al @@ -1,7 +1,9 @@ namespace Microsoft.SubscriptionBilling; using Microsoft.Finance.GeneralLedger.Account; +using Microsoft.Foundation.AuditCodes; using Microsoft.Inventory.Item; +using Microsoft.Purchases.Vendor; using System.Utilities; table 8062 "Cust. Sub. Contract Line" @@ -338,13 +340,15 @@ table 8062 "Cust. Sub. Contract Line" var VendorServiceCommitment: Record "Subscription Line"; VendorContract: Record "Vendor Subscription Contract"; + SourceCodeSetup: Record "Source Code Setup"; begin + SourceCodeSetup.Get(); VendorServiceCommitment.FilterOnServiceObjectAndPackage(ServiceCommitment."Subscription Header No.", ServiceCommitment.Template, ServiceCommitment."Subscription Package Code", Enum::"Service Partner"::Vendor); if VendorServiceCommitment.FindSet() then repeat VendorServiceCommitment.SetDefaultDimensions(true); if VendorContract.Get(VendorServiceCommitment."Subscription Contract No.") then - VendorServiceCommitment.GetCombinedDimensionSetID(VendorServiceCommitment."Dimension Set ID", VendorContract."Dimension Set ID"); + VendorServiceCommitment.ApplyContractDimensions(VendorContract."Dimension Set ID", SourceCodeSetup.Purchases, Database::Vendor); VendorServiceCommitment.Modify(false); until VendorServiceCommitment.Next() = 0; end; diff --git a/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustomerSubscriptionContract.Table.al b/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustomerSubscriptionContract.Table.al index 3068c44b79..83ce7e57d2 100644 --- a/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustomerSubscriptionContract.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Customer Contracts/Tables/CustomerSubscriptionContract.Table.al @@ -2090,6 +2090,7 @@ table 8052 "Customer Subscription Contract" var ServiceObject: Record "Subscription Header"; CustomerContract: Record "Customer Subscription Contract"; + SourceCodeSetup: Record "Source Code Setup"; OldDimSetID: Integer; InitHarmonizedBillingFields: Boolean; begin @@ -2109,7 +2110,8 @@ table 8052 "Customer Subscription Contract" ServiceCommitment."Subscription Contract No." := CustomerContractLine."Subscription Contract No."; ServiceCommitment."Subscription Contract Line No." := CustomerContractLine."Line No."; - ServiceCommitment.GetCombinedDimensionSetID(ServiceCommitment."Dimension Set ID", CustomerContract."Dimension Set ID"); + SourceCodeSetup.Get(); + ServiceCommitment.ApplyContractDimensions(CustomerContract."Dimension Set ID", SourceCodeSetup.Sales, Database::Customer); if "Currency Code" <> ServiceCommitment."Currency Code" then begin CalculateCurrencyFactor(ServiceCommitment."Subscription Line Start Date", CustomerContract."Currency Code"); ServiceCommitment.SetCurrencyData(CurrencyFactor, CurrencyFactorDate, CustomerContract."Currency Code"); diff --git a/src/Apps/W1/Subscription Billing/App/Import/Codeunits/CreateSubContractLine.Codeunit.al b/src/Apps/W1/Subscription Billing/App/Import/Codeunits/CreateSubContractLine.Codeunit.al index dac467856f..4239f4cb26 100644 --- a/src/Apps/W1/Subscription Billing/App/Import/Codeunits/CreateSubContractLine.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/App/Import/Codeunits/CreateSubContractLine.Codeunit.al @@ -1,5 +1,9 @@ namespace Microsoft.SubscriptionBilling; +using Microsoft.Foundation.AuditCodes; +using Microsoft.Purchases.Vendor; +using Microsoft.Sales.Customer; + codeunit 8007 "Create Sub. Contract Line" { TableNo = "Imported Subscription Line"; @@ -70,6 +74,7 @@ codeunit 8007 "Create Sub. Contract Line" local procedure CreateCustomerContractLine() var CustomerContractLine: Record "Cust. Sub. Contract Line"; + SourceCodeSetup: Record "Source Code Setup"; OldDimSetID: Integer; begin OnBeforeCreateCustomerContractLine(ServiceCommitment, ImportedServiceCommitment); @@ -86,7 +91,8 @@ codeunit 8007 "Create Sub. Contract Line" OldDimSetID := ServiceCommitment."Dimension Set ID"; ServiceCommitment."Subscription Contract No." := CustomerContractLine."Subscription Contract No."; ServiceCommitment."Subscription Contract Line No." := CustomerContractLine."Line No."; - ServiceCommitment.GetCombinedDimensionSetID(ServiceCommitment."Dimension Set ID", CustomerContract."Dimension Set ID"); + SourceCodeSetup.Get(); + ServiceCommitment.ApplyContractDimensions(CustomerContract."Dimension Set ID", SourceCodeSetup.Sales, Database::Customer); ServiceCommitment.Modify(true); ServiceCommitment.UpdateRelatedVendorServiceCommDimensions(OldDimSetID, ServiceCommitment."Dimension Set ID"); end; @@ -117,6 +123,7 @@ codeunit 8007 "Create Sub. Contract Line" local procedure CreateVendorContractLine() var VendorContractLine: Record "Vend. Sub. Contract Line"; + SourceCodeSetup: Record "Source Code Setup"; begin OnBeforeCreateVendorContractLine(ServiceCommitment, ImportedServiceCommitment); if ImportedServiceCommitment.IsContractCommentLine() then @@ -132,7 +139,8 @@ codeunit 8007 "Create Sub. Contract Line" ServiceCommitment."Subscription Contract No." := VendorContractLine."Subscription Contract No."; ServiceCommitment."Subscription Contract Line No." := VendorContractLine."Line No."; - ServiceCommitment.GetCombinedDimensionSetID(ServiceCommitment."Dimension Set ID", VendorContract."Dimension Set ID"); + SourceCodeSetup.Get(); + ServiceCommitment.ApplyContractDimensions(VendorContract."Dimension Set ID", SourceCodeSetup.Purchases, Database::Vendor); ServiceCommitment.Modify(false); VendorContractLine.UpdateServiceCommitmentDimensions(); end; diff --git a/src/Apps/W1/Subscription Billing/App/Service Commitments/Tables/SubscriptionLine.Table.al b/src/Apps/W1/Subscription Billing/App/Service Commitments/Tables/SubscriptionLine.Table.al index 541b482c7a..6004563cb6 100644 --- a/src/Apps/W1/Subscription Billing/App/Service Commitments/Tables/SubscriptionLine.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Service Commitments/Tables/SubscriptionLine.Table.al @@ -3,8 +3,11 @@ namespace Microsoft.SubscriptionBilling; using Microsoft.Finance.Currency; using Microsoft.Finance.Dimension; using Microsoft.Finance.GeneralLedger.Account; +using Microsoft.Foundation.AuditCodes; using Microsoft.Foundation.Calendar; using Microsoft.Inventory.Item; +using Microsoft.Purchases.Vendor; +using Microsoft.Sales.Customer; using Microsoft.Sales.Document; using Microsoft.Sales.Pricing; using System.Utilities; @@ -1099,24 +1102,51 @@ table 8059 "Subscription Line" internal procedure SetDefaultDimensions(UseSource: Boolean) var - ServiceObject: Record "Subscription Header"; DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; + begin + AddDefaultDimensionSources(DefaultDimSource, UseSource); + "Dimension Set ID" := DimMgt.GetDefaultDimID(DefaultDimSource, '', "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code", 0, 0); + DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code"); + end; + + internal procedure ApplyContractDimensions(ContractDimSetID: Integer; SourceCode: Code[10]; ContractPartnerTableID: Integer) + var + DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; + HighPriorityDimSource: List of [Dictionary of [Integer, Code[20]]]; + DimSetIDArr: array[10] of Integer; + TempDimValue1: Code[20]; + TempDimValue2: Code[20]; + begin + DimSetIDArr[1] := "Dimension Set ID"; + DimSetIDArr[2] := ContractDimSetID; + + AddDefaultDimensionSources(DefaultDimSource, true); + + if DimMgt.GetTableIDsForHigherPriorities(DefaultDimSource, HighPriorityDimSource, SourceCode, ContractPartnerTableID) then + DimSetIDArr[3] := + DimMgt.GetRecDefaultDimID( + Rec, CurrFieldNo, HighPriorityDimSource, SourceCode, + TempDimValue1, TempDimValue2, 0, 0); + + "Dimension Set ID" := + DimMgt.GetCombinedDimensionSetID(DimSetIDArr, "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code"); + end; + + local procedure AddDefaultDimensionSources(var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; UseSource: Boolean) + var + ServiceObject: Record "Subscription Header"; begin if Rec."Invoicing Item No." <> '' then DimMgt.AddDimSource(DefaultDimSource, Database::Item, Rec."Invoicing Item No."); - if UseSource then begin - ServiceObject.Get("Subscription Header No."); - case ServiceObject.Type of - ServiceObject.Type::Item: - DimMgt.AddDimSource(DefaultDimSource, Database::Item, ServiceObject."Source No."); - ServiceObject.Type::"G/L Account": - DimMgt.AddDimSource(DefaultDimSource, Database::"G/L Account", ServiceObject."Source No."); - end; - end; - - "Dimension Set ID" := DimMgt.GetDefaultDimID(DefaultDimSource, '', "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code", 0, 0); - DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code"); + if UseSource then + if ServiceObject.Get("Subscription Header No.") then + case ServiceObject.Type of + ServiceObject.Type::Item: + DimMgt.AddDimSource(DefaultDimSource, Database::Item, ServiceObject."Source No."); + ServiceObject.Type::"G/L Account": + DimMgt.AddDimSource(DefaultDimSource, Database::"G/L Account", ServiceObject."Source No."); + end; end; internal procedure GetCombinedDimensionSetID(DimSetID1: Integer; DimSetID2: Integer) @@ -1230,18 +1260,24 @@ table 8059 "Subscription Line" end; internal procedure UpdateFromCustomerContract(CustomerContract: Record "Customer Subscription Contract") + var + SourceCodeSetup: Record "Source Code Setup"; begin "Currency Code" := CustomerContract."Currency Code"; InitCurrencyData(); - GetCombinedDimensionSetID("Dimension Set ID", CustomerContract."Dimension Set ID"); + SourceCodeSetup.Get(); + ApplyContractDimensions(CustomerContract."Dimension Set ID", SourceCodeSetup.Sales, Database::Customer); "Exclude from Price Update" := CustomerContract.DefaultExcludeFromPriceUpdate; end; internal procedure UpdateFromVendorContract(VendorContract: Record "Vendor Subscription Contract") + var + SourceCodeSetup: Record "Source Code Setup"; begin "Currency Code" := VendorContract."Currency Code"; InitCurrencyData(); - GetCombinedDimensionSetID("Dimension Set ID", VendorContract."Dimension Set ID"); + SourceCodeSetup.Get(); + ApplyContractDimensions(VendorContract."Dimension Set ID", SourceCodeSetup.Purchases, Database::Vendor); "Exclude from Price Update" := VendorContract.DefaultExcludeFromPriceUpdate; end; diff --git a/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendSubContractLine.Table.al b/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendSubContractLine.Table.al index 627325b83b..3929110dfb 100644 --- a/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendSubContractLine.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendSubContractLine.Table.al @@ -1,7 +1,9 @@ namespace Microsoft.SubscriptionBilling; using Microsoft.Finance.GeneralLedger.Account; +using Microsoft.Foundation.AuditCodes; using Microsoft.Inventory.Item; +using Microsoft.Sales.Customer; using System.Utilities; table 8065 "Vend. Sub. Contract Line" @@ -306,6 +308,7 @@ table 8065 "Vend. Sub. Contract Line" ServiceCommitment: Record "Subscription Line"; CustomerServiceCommitment: Record "Subscription Line"; CustomerContract: Record "Customer Subscription Contract"; + SourceCodeSetup: Record "Source Code Setup"; begin if Rec."Subscription Header No." = '' then exit; @@ -315,8 +318,10 @@ table 8065 "Vend. Sub. Contract Line" ServiceCommitment.SetDefaultDimensions(true); CustomerServiceCommitment.FilterOnServiceObjectAndPackage(Rec."Subscription Header No.", ServiceCommitment.Template, ServiceCommitment."Subscription Package Code", Enum::"Service Partner"::Customer); if CustomerServiceCommitment.FindFirst() then - if CustomerContract.Get(CustomerServiceCommitment."Subscription Contract No.") then - ServiceCommitment.GetCombinedDimensionSetID(ServiceCommitment."Dimension Set ID", CustomerContract."Dimension Set ID"); + if CustomerContract.Get(CustomerServiceCommitment."Subscription Contract No.") then begin + SourceCodeSetup.Get(); + ServiceCommitment.ApplyContractDimensions(CustomerContract."Dimension Set ID", SourceCodeSetup.Sales, Database::Customer); + end; ServiceCommitment.Modify(false); end; diff --git a/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendorSubscriptionContract.Table.al b/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendorSubscriptionContract.Table.al index eabe29b505..dbcdb0c6a6 100644 --- a/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendorSubscriptionContract.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Vendor Contracts/Tables/VendorSubscriptionContract.Table.al @@ -1598,6 +1598,7 @@ table 8063 "Vendor Subscription Contract" var ServiceObject: Record "Subscription Header"; VendorContract: Record "Vendor Subscription Contract"; + SourceCodeSetup: Record "Source Code Setup"; begin ServiceObject.Get(ServiceCommitment."Subscription Header No."); VendorContractLine.InitFromServiceCommitment(ServiceCommitment, ContractNo); @@ -1607,7 +1608,8 @@ table 8063 "Vendor Subscription Contract" ServiceCommitment."Subscription Contract Line No." := VendorContractLine."Line No."; VendorContract.Get(ServiceCommitment."Subscription Contract No."); - ServiceCommitment.GetCombinedDimensionSetID(ServiceCommitment."Dimension Set ID", VendorContract."Dimension Set ID"); + SourceCodeSetup.Get(); + ServiceCommitment.ApplyContractDimensions(VendorContract."Dimension Set ID", SourceCodeSetup.Purchases, Database::Vendor); if "Currency Code" <> ServiceCommitment."Currency Code" then begin CalculateCurrencyFactor(ServiceCommitment."Subscription Line Start Date", VendorContract."Currency Code"); ServiceCommitment.SetCurrencyData(CurrencyFactor, CurrencyFactorDate, VendorContract."Currency Code"); diff --git a/src/Apps/W1/Subscription Billing/Test/Service Commitments/ServiceCommDimensions.Codeunit.al b/src/Apps/W1/Subscription Billing/Test/Service Commitments/ServiceCommDimensions.Codeunit.al index 2b67c67b3e..c9a005eb9c 100644 --- a/src/Apps/W1/Subscription Billing/Test/Service Commitments/ServiceCommDimensions.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/Test/Service Commitments/ServiceCommDimensions.Codeunit.al @@ -2,6 +2,7 @@ namespace Microsoft.SubscriptionBilling; using Microsoft.Finance.Dimension; using Microsoft.Finance.GeneralLedger.Setup; +using Microsoft.Foundation.AuditCodes; using Microsoft.Inventory.Item; using Microsoft.Projects.Project.Job; using Microsoft.Purchases.Document; @@ -865,6 +866,59 @@ codeunit 148160 "Service Comm. Dimensions" ServiceCommitment.TestField("Dimension Set ID", NewDimSetID); end; + [Test] + [HandlerFunctions('MessageHandler,ExchangeRateSelectionModalPageHandler')] + procedure RespectDefaultDimensionPrioritiesOnCustomerContractCreation() + var + Customer: Record Customer; + CustomerContract: Record "Customer Subscription Contract"; + DefaultDimension: Record "Default Dimension"; + Dimension: Record Dimension; + CustomerDimensionValue: Record "Dimension Value"; + ItemDimensionValue: Record "Dimension Value"; + Item: Record Item; + ServiceCommitment: Record "Subscription Line"; + ServiceObject: Record "Subscription Header"; + SourceCodeSetup: Record "Source Code Setup"; + begin + // [SCENARIO #8084] Default Dimension Priorities are respected when a Customer Subscription Contract spawns Subscription Lines + Initialize(); + + // [GIVEN] Default Dimension Priorities for source code "Sales": Item = 1 (highest), Customer = 2 + SourceCodeSetup.Get(); + SetDefaultDimensionPriority(SourceCodeSetup.Sales, Database::Item, 1); + SetDefaultDimensionPriority(SourceCodeSetup.Sales, Database::Customer, 2); + + // [GIVEN] A shared dimension with two distinct values for Customer and Item + LibraryDimension.CreateDimension(Dimension); + LibraryDimension.CreateDimensionValue(CustomerDimensionValue, Dimension.Code); + LibraryDimension.CreateDimensionValue(ItemDimensionValue, Dimension.Code); + + // [GIVEN] Customer carries that dimension with one value, Item with another + ContractTestLibrary.CreateCustomer(Customer); + LibraryDimension.CreateDefaultDimension(DefaultDimension, Database::Customer, Customer."No.", Dimension.Code, CustomerDimensionValue.Code); + ContractTestLibrary.CreateItemForServiceObject(Item, false); + LibraryDimension.CreateDefaultDimension(DefaultDimension, Database::Item, Item."No.", Dimension.Code, ItemDimensionValue.Code); + + // [GIVEN] A Service Object created from the Item + ContractTestLibrary.CreateServiceObjectForItemWithServiceCommitments(ServiceObject, Enum::"Invoicing Via"::Contract, false, Item, 1, 0); + ServiceObject.SetHideValidationDialog(true); + ServiceObject.Validate("End-User Customer No.", Customer."No."); + ServiceObject.Modify(false); + + // [WHEN] The Service Object is assigned to a Customer Subscription Contract + ContractTestLibrary.CreateCustomerContractAndCreateContractLinesForItems(CustomerContract, ServiceObject, Customer."No."); + + // [THEN] The Subscription Line carries Item's dim value (Item priority outranks Customer) + ServiceCommitment.SetRange("Subscription Header No.", ServiceObject."No."); + ServiceCommitment.FindFirst(); + VerifyDimensionSetValue(ServiceCommitment."Dimension Set ID", Dimension.Code, ItemDimensionValue.Code); + + // [CLEANUP] Reset the Default Dimension Priorities we added so subsequent tests run with vanilla settings + ResetDefaultDimensionPriority(SourceCodeSetup.Sales, Database::Item); + ResetDefaultDimensionPriority(SourceCodeSetup.Sales, Database::Customer); + end; + #endregion Tests #region Procedures @@ -968,6 +1022,30 @@ codeunit 148160 "Service Comm. Dimensions" SalesLine.Modify(true); end; + local procedure SetDefaultDimensionPriority(SourceCode: Code[10]; TableID: Integer; Priority: Integer) + var + DefaultDimensionPriority: Record "Default Dimension Priority"; + begin + if DefaultDimensionPriority.Get(SourceCode, TableID) then begin + DefaultDimensionPriority.Validate(Priority, Priority); + DefaultDimensionPriority.Modify(true); + end else begin + DefaultDimensionPriority.Init(); + DefaultDimensionPriority."Source Code" := SourceCode; + DefaultDimensionPriority."Table ID" := TableID; + DefaultDimensionPriority.Validate(Priority, Priority); + DefaultDimensionPriority.Insert(true); + end; + end; + + local procedure ResetDefaultDimensionPriority(SourceCode: Code[10]; TableID: Integer) + var + DefaultDimensionPriority: Record "Default Dimension Priority"; + begin + if DefaultDimensionPriority.Get(SourceCode, TableID) then + DefaultDimensionPriority.Delete(true); + end; + local procedure VerifyDimensionSetValue(DimensionSetID: Integer; DimensionCode: Code[20]; ExpectedDimensionValueCode: Code[20]) var DimensionSetEntry: Record "Dimension Set Entry";