Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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");
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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";
Expand Down
Loading