diff --git a/src/Apps/W1/Subscription Billing/App/Base/Enums/InvoiceDetailOrigin.Enum.al b/src/Apps/W1/Subscription Billing/App/Base/Enums/InvoiceDetailOrigin.Enum.al new file mode 100644 index 0000000000..f38d556075 --- /dev/null +++ b/src/Apps/W1/Subscription Billing/App/Base/Enums/InvoiceDetailOrigin.Enum.al @@ -0,0 +1,15 @@ +namespace Microsoft.SubscriptionBilling; + +enum 8021 "Invoice Detail Origin" +{ + Extensible = true; + + value(0; "Product Name (default)") + { + Caption = 'Product Name (default)'; + } + value(1; "Subscription Line") + { + Caption = 'Subscription Line'; + } +} diff --git a/src/Apps/W1/Subscription Billing/App/Base/Pages/ServiceContractSetup.Page.al b/src/Apps/W1/Subscription Billing/App/Base/Pages/ServiceContractSetup.Page.al index a5dab98a61..fcfcda38b4 100644 --- a/src/Apps/W1/Subscription Billing/App/Base/Pages/ServiceContractSetup.Page.al +++ b/src/Apps/W1/Subscription Billing/App/Base/Pages/ServiceContractSetup.Page.al @@ -82,6 +82,15 @@ page 8051 "Service Contract Setup" { ToolTip = 'Specifies which customer information (name) is transferred to collective invoices. This setting is applies for collective invoices only.'; } + group("Usage Data") + { + Caption = 'Usage Data'; + + field("Invoice Desc. (Surcharge)"; Rec."Invoice Desc. (Surcharge)") + { + ToolTip = 'Specifies the origin of the invoice details'' description for usage data to be charged as Unit Cost Surcharge.'; + } + } group(ArrangeTexts) { Caption = 'Arrange Texts'; diff --git a/src/Apps/W1/Subscription Billing/App/Base/Tables/SubscriptionContractSetup.Table.al b/src/Apps/W1/Subscription Billing/App/Base/Tables/SubscriptionContractSetup.Table.al index 6e7195ea8e..b119a400a2 100644 --- a/src/Apps/W1/Subscription Billing/App/Base/Tables/SubscriptionContractSetup.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Base/Tables/SubscriptionContractSetup.Table.al @@ -76,6 +76,10 @@ table 8051 "Subscription Contract Setup" Caption = 'Dimension Code for Customer Subscription Contract'; TableRelation = Dimension; } + field(30; "Invoice Desc. (Surcharge)"; Enum "Invoice Detail Origin") + { + Caption = 'Invoice Description (Surcharge)'; + } field(59; "Default Period Calculation"; enum "Period Calculation") { Caption = 'Default Period Calculation'; diff --git a/src/Apps/W1/Subscription Billing/App/Billing/Codeunits/SubContractBillingPrintout.Codeunit.al b/src/Apps/W1/Subscription Billing/App/Billing/Codeunits/SubContractBillingPrintout.Codeunit.al index b8a6bbf1a5..216f501771 100644 --- a/src/Apps/W1/Subscription Billing/App/Billing/Codeunits/SubContractBillingPrintout.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/App/Billing/Codeunits/SubContractBillingPrintout.Codeunit.al @@ -48,7 +48,7 @@ codeunit 8064 "Sub. Contract Billing Printout" TempJobLedgerEntryBuffer."Document Date" := UsageDataBilling."Charge Start Date"; TempJobLedgerEntryBuffer."Posting Date" := UsageDataBilling."Charge End Date"; TempJobLedgerEntryBuffer.Quantity := UsageDataBilling.Quantity; - TempJobLedgerEntryBuffer.Description := UsageDataBilling."Subscription Description"; + TempJobLedgerEntryBuffer.Description := UsageDataBilling.GetPrintoutDescription(); TempJobLedgerEntryBuffer."External Document No." := UsageDataBilling."Subscription Contract No."; TempJobLedgerEntryBuffer."Resource Group No." := SalesInvoiceHeader."Sell-to Customer No."; if SalesInvoiceHeader."Sub. Contract Detail Overview" = Enum::"Contract Detail Overview"::Complete then begin diff --git a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/CreateUsageDataBilling.Codeunit.al b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/CreateUsageDataBilling.Codeunit.al index 7022595fab..6e9d506350 100644 --- a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/CreateUsageDataBilling.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/CreateUsageDataBilling.Codeunit.al @@ -57,24 +57,26 @@ codeunit 8023 "Create Usage Data Billing" OnAfterCollectServiceCommitments(TempServiceCommitment, ServiceObjectNo, SubscriptionEndDate); end; - internal procedure CreateUsageDataBillingFromTempServiceCommitments(var TempServiceCommitment: Record "Subscription Line"; SupplierNo: Code[20]; UsageDataImportEntryNo: Integer; ServiceObjectNo: Code[20]; BillingPeriodStartDate: Date; - BillingPeriodEndDate: Date; UnitCost: Decimal; NewQuantity: Decimal; CostAmount: Decimal; UnitPrice: Decimal; NewAmount: Decimal; CurrencyCode: Code[10]) + internal procedure CreateUsageDataBillingFromTempServiceCommitments( + var TempServiceCommitment: Record "Subscription Line"; SupplierNo: Code[20]; UsageDataImportEntryNo: Integer; ServiceObjectNo: Code[20]; ProductID: Text[80]; ProductName: Text[100]; + BillingPeriodStartDate: Date; BillingPeriodEndDate: Date; UnitCost: Decimal; NewQuantity: Decimal; CostAmount: Decimal; UnitPrice: Decimal; NewAmount: Decimal; CurrencyCode: Code[10]) begin repeat - CreateUsageDataBillingFromTempServiceCommitment(TempServiceCommitment, SupplierNo, UsageDataImportEntryNo, ServiceObjectNo, BillingPeriodStartDate, BillingPeriodEndDate, UnitCost, NewQuantity, CostAmount, UnitPrice, NewAmount, CurrencyCode); + CreateUsageDataBillingFromTempServiceCommitment(TempServiceCommitment, SupplierNo, UsageDataImportEntryNo, ServiceObjectNo, ProductID, ProductName, BillingPeriodStartDate, BillingPeriodEndDate, UnitCost, NewQuantity, CostAmount, UnitPrice, NewAmount, CurrencyCode); until TempServiceCommitment.Next() = 0; OnAfterCreateUsageDataBillingFromTempSubscriptionLines(TempServiceCommitment); end; - local procedure CreateUsageDataBillingFromTempServiceCommitment(var TempServiceCommitment: Record "Subscription Line"; SupplierNo: Code[20]; UsageDataImportEntryNo: Integer; ServiceObjectNo: Code[20]; BillingPeriodStartDate: Date; - BillingPeriodEndDate: Date; UnitCost: Decimal; NewQuantity: Decimal; CostAmount: Decimal; UnitPrice: Decimal; NewAmount: Decimal; CurrencyCode: Code[10]) + local procedure CreateUsageDataBillingFromTempServiceCommitment( + var TempServiceCommitment: Record "Subscription Line"; SupplierNo: Code[20]; UsageDataImportEntryNo: Integer; SubscriptionNo: Code[20]; ProductID: Text[80]; ProductName: Text[100]; + BillingPeriodStartDate: Date; BillingPeriodEndDate: Date; UnitCost: Decimal; NewQuantity: Decimal; CostAmount: Decimal; UnitPrice: Decimal; NewAmount: Decimal; CurrencyCode: Code[10]) var UsageDataBilling: Record "Usage Data Billing"; UsageDataSupplier: Record "Usage Data Supplier"; begin UsageDataSupplier.Get(SupplierNo); - UsageDataBilling.InitFrom(UsageDataImportEntryNo, ServiceObjectNo, BillingPeriodStartDate, BillingPeriodEndDate, UnitCost, NewQuantity, CostAmount, UnitPrice, NewAmount, CurrencyCode); + UsageDataBilling.InitFrom(UsageDataImportEntryNo, SubscriptionNo, ProductID, ProductName, BillingPeriodStartDate, BillingPeriodEndDate, UnitCost, NewQuantity, CostAmount, UnitPrice, NewAmount, CurrencyCode); UsageDataBilling."Supplier No." := SupplierNo; UsageDataBilling."Subscription Header No." := TempServiceCommitment."Subscription Header No."; UsageDataBilling.Partner := TempServiceCommitment.Partner; diff --git a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/GenericConnectorProcessing.Codeunit.al b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/GenericConnectorProcessing.Codeunit.al index 4c1759b926..d7a62d3902 100644 --- a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/GenericConnectorProcessing.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Codeunits/GenericConnectorProcessing.Codeunit.al @@ -205,9 +205,19 @@ codeunit 8033 "Generic Connector Processing" implements "Usage Data Processing" SetUsageDataGenericImportError(''); if not CheckServiceCommitments(TempServiceCommitment) then exit; - CreateUsageDataBilling.CreateUsageDataBillingFromTempServiceCommitments(TempServiceCommitment, UsageDataImport."Supplier No.", UsageDataGenericImportGlobal."Usage Data Import Entry No.", UsageDataGenericImportGlobal."Subscription Header No.", UsageDataGenericImportGlobal."Billing Period Start Date", - UsageDataGenericImportGlobal."Billing Period End Date", UsageDataGenericImportGlobal.Cost, UsageDataGenericImportGlobal.Quantity, - UsageDataGenericImportGlobal."Cost Amount", UsageDataGenericImportGlobal.Price, UsageDataGenericImportGlobal.Amount, UsageDataGenericImportGlobal.GetCurrencyCode()); + CreateUsageDataBilling.CreateUsageDataBillingFromTempServiceCommitments( + TempServiceCommitment, UsageDataImport."Supplier No.", + UsageDataGenericImportGlobal."Usage Data Import Entry No.", + UsageDataGenericImportGlobal."Subscription Header No.", + UsageDataGenericImportGlobal."Product ID", + UsageDataGenericImportGlobal."Product Name", + UsageDataGenericImportGlobal."Billing Period Start Date", + UsageDataGenericImportGlobal."Billing Period End Date", + UsageDataGenericImportGlobal.Cost, UsageDataGenericImportGlobal.Quantity, + UsageDataGenericImportGlobal."Cost Amount", + UsageDataGenericImportGlobal.Price, + UsageDataGenericImportGlobal.Amount, + UsageDataGenericImportGlobal.GetCurrencyCode()); until UsageDataGenericImportGlobal.Next() = 0 else begin UsageDataImport.SetErrorReason(StrSubstNo(NoDataFoundErr, UsageDataImport."Processing Step")); diff --git a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Pages/UsageDataBillings.Page.al b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Pages/UsageDataBillings.Page.al index 0a844b6ffa..faa5696d94 100644 --- a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Pages/UsageDataBillings.Page.al +++ b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Pages/UsageDataBillings.Page.al @@ -55,6 +55,8 @@ page 8035 "Usage Data Billings" { ToolTip = 'Specifies the Subscription Line for which the usage data is billed.'; } + field("Product ID"; Rec."Product ID") { } + field("Product Name"; Rec."Product Name") { } field("Processing Date"; Rec."Processing Date") { ToolTip = 'Specifies the date of processing.'; diff --git a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Tables/UsageDataBilling.Table.al b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Tables/UsageDataBilling.Table.al index 3587f979e2..eabe9786e4 100644 --- a/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Tables/UsageDataBilling.Table.al +++ b/src/Apps/W1/Subscription Billing/App/Usage Based Billing/Tables/UsageDataBilling.Table.al @@ -275,6 +275,16 @@ table 8006 "Usage Data Billing" { Caption = 'Rebilling'; } + field(35; "Product ID"; Text[80]) + { + Caption = 'Product Id'; + ToolTip = 'Specifies the unique ID of the product for this subscription with the supplier.'; + } + field(36; "Product Name"; Text[100]) + { + Caption = 'Product Name'; + ToolTip = 'Specifies the vendor''s product name for this subscription.'; + } } keys { @@ -347,20 +357,22 @@ table 8006 "Usage Data Billing" end; end; - internal procedure InitFrom(UsageDataImportEntryNo: Integer; ServiceObjectNo: Code[20]; BillingPeriodStartDate: Date; - BillingPeriodEndDate: Date; UnitCost: Decimal; NewQuantity: Decimal; CostAmount: Decimal; UnitPrice: Decimal; - NewAmount: Decimal; CurrencyCode: Code[10]) + internal procedure InitFrom(UsageDataImportEntryNo: Integer; SubscriptionHeaderNo: Code[20]; ProductID: Text[80]; ProductName: Text[100]; + BillingPeriodStartDate: Date; BillingPeriodEndDate: Date; UnitCost: Decimal; NewQuantity: Decimal; CostAmount: Decimal; + UnitPrice: Decimal; NewAmount: Decimal; CurrencyCode: Code[10]) begin Rec.Init(); Rec."Entry No." := 0; Rec."Usage Data Import Entry No." := UsageDataImportEntryNo; - Rec."Subscription Header No." := ServiceObjectNo; + Rec."Subscription Header No." := SubscriptionHeaderNo; + Rec."Product ID" := ProductID; + Rec."Product Name" := ProductName; Rec."Charge Start Date" := BillingPeriodStartDate; Rec."Charge End Date" := BillingPeriodEndDate; Rec."Unit Cost" := UnitCost; Rec.Quantity := NewQuantity; if CostAmount = 0 then - Rec."Cost Amount" := NewQuantity * unitCost + Rec."Cost Amount" := NewQuantity * UnitCost else Rec."Cost Amount" := CostAmount; Rec."Unit Price" := UnitPrice; @@ -694,11 +706,41 @@ table 8006 "Usage Data Billing" exit((Rec."Document Type" <> "Usage Based Billing Doc. Type"::None) and (Rec."Document No." <> '')); end; + internal procedure GetPrintoutDescription() Description: Text[100] + begin + if ShouldPrintProductName() then + Description := "Product Name" + else + Description := "Subscription Description"; + OnAfterGetPrintoutDescription(Rec, Description); + end; + + internal procedure ShouldPrintProductName() Result: Boolean + var + ServiceContractSetup: Record "Subscription Contract Setup"; + begin + ServiceContractSetup.Get(); + Result := + ("Usage Base Pricing" = Enum::"Usage Based Pricing"::"Unit Cost Surcharge") and + (ServiceContractSetup."Invoice Desc. (Surcharge)" = Enum::"Invoice Detail Origin"::"Product Name (default)"); + OnAfterShouldPrintProductName(Rec, Result); + end; + [IntegrationEvent(false, false)] local procedure OnAfterSaveDocumentValues(UsageDateBilling: Record "Usage Data Billing") begin end; + [IntegrationEvent(false, false)] + local procedure OnAfterGetPrintoutDescription(Rec: Record "Usage Data Billing"; var Description: Text[100]) + begin + end; + + [IntegrationEvent(false, false)] + local procedure OnAfterShouldPrintProductName(Rec: Record "Usage Data Billing"; var Result: Boolean) + begin + end; + var UsageBasedDocTypeConv: Codeunit "Usage Based Doc. Type Conv."; } diff --git a/src/Apps/W1/Subscription Billing/Demo Data/.resources/USAGE-GENERIC-US.xml b/src/Apps/W1/Subscription Billing/Demo Data/.resources/USAGE-GENERIC-US.xml new file mode 100644 index 0000000000..935c91ab98 --- /dev/null +++ b/src/Apps/W1/Subscription Billing/Demo Data/.resources/USAGE-GENERIC-US.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Apps/W1/Subscription Billing/Demo Data/Demo Data/2.Master Data/CreateSubBillGenSett.Codeunit.al b/src/Apps/W1/Subscription Billing/Demo Data/Demo Data/2.Master Data/CreateSubBillGenSett.Codeunit.al index d0563321ee..d4fd9b4937 100644 --- a/src/Apps/W1/Subscription Billing/Demo Data/Demo Data/2.Master Data/CreateSubBillGenSett.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/Demo Data/Demo Data/2.Master Data/CreateSubBillGenSett.Codeunit.al @@ -37,7 +37,7 @@ codeunit 8115 "Create Sub. Bill. Gen. Sett." DataExchDef.Delete(true); TempBlob.CreateOutStream(XMLOutStream); - XMLOutStream.WriteText(UsageDataGenericUsTxt); + XMLOutStream.WriteText(NavApp.GetResourceAsText('USAGE-GENERIC-US.xml', TextEncoding::UTF8)); TempBlob.CreateInStream(XMLInStream); Xmlport.Import(Xmlport::"Imp / Exp Data Exch Def & Map", XMLInStream); Clear(TempBlob); @@ -45,5 +45,4 @@ codeunit 8115 "Create Sub. Bill. Gen. Sett." var UsageDataGenericUsTok: Label 'USAGE-GENERIC-US', Locked = true; - UsageDataGenericUsTxt: Label '', Locked = true; } \ No newline at end of file diff --git a/src/Apps/W1/Subscription Billing/Demo Data/app.json b/src/Apps/W1/Subscription Billing/Demo Data/app.json index 6fcbd6f961..b299534f09 100644 --- a/src/Apps/W1/Subscription Billing/Demo Data/app.json +++ b/src/Apps/W1/Subscription Billing/Demo Data/app.json @@ -42,5 +42,8 @@ }, "features": [ "TranslationFile" + ], + "resourceFolders": [ + ".resources" ] } diff --git a/src/Apps/W1/Subscription Billing/Test/UBB/UsageBasedBillingTest.Codeunit.al b/src/Apps/W1/Subscription Billing/Test/UBB/UsageBasedBillingTest.Codeunit.al index 125a1b9170..ed9621597a 100644 --- a/src/Apps/W1/Subscription Billing/Test/UBB/UsageBasedBillingTest.Codeunit.al +++ b/src/Apps/W1/Subscription Billing/Test/UBB/UsageBasedBillingTest.Codeunit.al @@ -51,10 +51,8 @@ codeunit 148153 "Usage Based Billing Test" ServiceCommitmentPackage: Record "Subscription Package"; ServiceCommitmentTemplate: Record "Sub. Package Line Template"; ServiceObject: Record "Subscription Header"; - UsageDataBilling: Record "Usage Data Billing"; UsageDataBlob: Record "Usage Data Blob"; UsageDataCustomer: Record "Usage Data Supp. Customer"; - UsageDataGenericImport: Record "Usage Data Generic Import"; UsageDataImport: Record "Usage Data Import"; UsageDataSubscription: Record "Usage Data Supp. Subscription"; UsageDataSupplier: Record "Usage Data Supplier"; @@ -93,6 +91,7 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('MessageHandler,CreateCustomerBillingDocumentPageHandler')] procedure ApplyServiceCommitmentDiscountInContractInvoice() var + UsageDataBilling: Record "Usage Data Billing"; DiscountPct: Decimal; begin // [SCENARIO] Check that discount from Subscription Line is applied in the invoice and usage data is updated accordingly @@ -125,7 +124,7 @@ codeunit 148153 "Usage Based Billing Test" UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); // [THEN] Expect that discount is not applied in the Usage data, but in the invoice - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); UsageDataBilling.FindFirst(); BillingLine.FilterBillingLineOnContractLine(UsageDataBilling.Partner, UsageDataBilling."Subscription Contract No.", UsageDataBilling."Subscription Contract Line No."); @@ -135,12 +134,14 @@ codeunit 148153 "Usage Based Billing Test" until BillingLine.Next() = 0; // [THEN] Test that prices Subscription Line is not updated - CheckIfServiceCommitmentRemains(); + CheckIfServiceCommitmentRemains(UsageDataBilling); end; [Test] [HandlerFunctions('MessageHandler,CreateCustomerBillingDocsContractPageHandler,ConfirmHandler')] procedure CheckIfCreditMemoIsCreatedWhenDiscountInServiceCommitmentIs100Percent() + var + UsageDataBilling: Record "Usage Data Billing"; begin //[SCENARIO]: Create service object with two service commitments; One has discount 100%, and the other one is marked as discount; Test that credit memo is created on recurring billing @@ -202,16 +203,50 @@ codeunit 148153 "Usage Based Billing Test" Codeunit.Run(Codeunit::"Create Billing Documents", BillingLine); //[THEN]: Test that credit memo is created - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); UsageDataBilling.SetRange("Document Type", UsageDataBilling."Document Type"::"Credit Memo"); Assert.RecordIsNotEmpty(UsageDataBilling); end; + [Test] + [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateCustomerBillingDocumentPageHandler,MessageHandler')] + procedure EnsureUsageDataBillingContainsSubscriptionAndProduct() + var + UsageDataBilling: Record "Usage Data Billing"; + UsageDataGenericImport: Record "Usage Data Generic Import"; + SubscriptionLine: Record "Subscription Line"; + begin + // [SCENARIO] Ensure that Usage Data Billing contains Subscription Line Entry No and Product details after processing usage data import + + // [GIVEN] Create Usage data and process it + Initialize(); + CreateUsageDataBilling("Usage Based Pricing"::"Unit Cost Surcharge", LibraryRandom.RandDec(10, 2)); + + // [WHEN] Process Usage Data Import + PostDocument := false; + UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Process Usage Data Billing"); + UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); + UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); + + // [THEN] Test that Subscription Line Entry No and Product details are populated in Usage Data Billing + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No."); + UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); + UsageDataGenericImport.FindFirst(); + UsageDataBilling.FindSet(); + repeat + UsageDataBilling.TestField("Subscription Line Entry No."); + SubscriptionLine.Get(UsageDataBilling."Subscription Line Entry No."); + UsageDataBilling.TestField("Subscription Line Description", SubscriptionLine.Description); + UsageDataBilling.TestField("Product ID", UsageDataGenericImport."Product ID"); + UsageDataBilling.TestField("Product Name", UsageDataGenericImport."Product Name"); + until UsageDataBilling.Next() = 0; + end; + [Test] procedure ExistForContractLineDependsOnUsageDataForContractLine() var CustomerContractLine1: Record "Cust. Sub. Contract Line"; - UsageDataBilling1: Record "Usage Data Billing"; + UsageDataBilling: Record "Usage Data Billing"; UsageDataExist: Boolean; begin // [SCENARIO] Action Usage Data should be disabled if there is no Usage Data for Contract Line and should be enabled if there is Usage Data for Contract Line @@ -221,15 +256,15 @@ codeunit 148153 "Usage Based Billing Test" UsageBasedBTestLibrary.MockCustomerContractLine(CustomerContractLine1); // [WHEN] Contract line is selected - UsageDataExist := UsageDataBilling1.ExistForContractLine("Service Partner"::Customer, CustomerContractLine1."Subscription Contract No.", CustomerContractLine1."Line No."); + UsageDataExist := UsageDataBilling.ExistForContractLine("Service Partner"::Customer, CustomerContractLine1."Subscription Contract No.", CustomerContractLine1."Line No."); // [THEN] Action Usage Data should be disabled Assert.IsFalse(UsageDataExist, 'Usage Data Action should be disabled'); // [WHEN] Usage Data is created and Contract line is selected UsageBasedBTestLibrary.MockCustomerContractLine(CustomerContractLine1); - UsageBasedBTestLibrary.MockUsageDataBillingForContractLine(UsageDataBilling1, "Service Partner"::Customer, CustomerContractLine1."Subscription Contract No.", CustomerContractLine1."Line No."); - UsageDataExist := UsageDataBilling1.ExistForContractLine("Service Partner"::Customer, CustomerContractLine1."Subscription Contract No.", CustomerContractLine1."Line No."); + UsageBasedBTestLibrary.MockUsageDataBillingForContractLine(UsageDataBilling, "Service Partner"::Customer, CustomerContractLine1."Subscription Contract No.", CustomerContractLine1."Line No."); + UsageDataExist := UsageDataBilling.ExistForContractLine("Service Partner"::Customer, CustomerContractLine1."Subscription Contract No.", CustomerContractLine1."Line No."); // [THEN] Action Usage Data should be enabled Assert.IsTrue(UsageDataExist, 'Usage Data Action should be enabled'); @@ -241,7 +276,7 @@ codeunit 148153 "Usage Based Billing Test" Item1: Record Item; SalesHeader1: Record "Sales Header"; SalesLine1: Record "Sales Line"; - UsageDataBilling1: Record "Usage Data Billing"; + UsageDataBilling: Record "Usage Data Billing"; UsageDataExist: Boolean; begin // [SCENARIO] Action Usage Data should be disabled if there is no Usage Data for Document line and should be enabled if there is Usage Data for Document Line @@ -253,14 +288,14 @@ codeunit 148153 "Usage Based Billing Test" LibrarySales.CreateSalesLine(SalesLine1, SalesHeader1, SalesLine1.Type::Item, Item1."No.", LibraryRandom.RandInt(100)); // [WHEN] Sales line is selected - UsageDataExist := UsageDataBilling1.ExistForSalesDocuments(SalesLine1."Document Type", SalesLine1."Document No.", SalesLine1."Line No."); + UsageDataExist := UsageDataBilling.ExistForSalesDocuments(SalesLine1."Document Type", SalesLine1."Document No.", SalesLine1."Line No."); // [THEN] Action Usage Data should be disabled Assert.IsFalse(UsageDataExist, 'Usage Data Action should be disabled'); // [WHEN] Usage Data is created and Sales line is selected - UsageBasedBTestLibrary.MockUsageDataBillingForDocuments(UsageDataBilling1, SalesLine1."Document Type", SalesLine1."Document No.", SalesLine1."Line No."); - UsageDataExist := UsageDataBilling1.ExistForSalesDocuments(SalesLine1."Document Type", SalesLine1."Document No.", SalesLine1."Line No."); + UsageBasedBTestLibrary.MockUsageDataBillingForDocuments(UsageDataBilling, SalesLine1."Document Type", SalesLine1."Document No.", SalesLine1."Line No."); + UsageDataExist := UsageDataBilling.ExistForSalesDocuments(SalesLine1."Document Type", SalesLine1."Document No.", SalesLine1."Line No."); // [THEN] Action Usage Data should be enabled Assert.IsTrue(UsageDataExist, 'Usage Data Action should be enabled'); @@ -270,7 +305,7 @@ codeunit 148153 "Usage Based Billing Test" procedure ExistForRecurringBillingDependsOnBillingUsageData() var BillingLine1: Record "Billing Line"; - UsageDataBilling1: Record "Usage Data Billing"; + UsageDataBilling: Record "Usage Data Billing"; UsageDataExist: Boolean; begin // [SCENARIO] Action Usage Data should be disabled if there is no Usage Data for Billing Line and should be enabled if there is Usage Data for Billing Line @@ -280,7 +315,7 @@ codeunit 148153 "Usage Based Billing Test" UsageBasedBTestLibrary.MockBillingLine(BillingLine1); // [WHEN] Billing line is selected - UsageDataExist := UsageDataBilling1.ExistForRecurringBilling(BillingLine1."Subscription Header No.", BillingLine1."Subscription Line Entry No.", BillingLine1."Document Type", BillingLine1."Document No."); + UsageDataExist := UsageDataBilling.ExistForRecurringBilling(BillingLine1."Subscription Header No.", BillingLine1."Subscription Line Entry No.", BillingLine1."Document Type", BillingLine1."Document No."); // [THEN] Action Usage Data should be disabled Assert.IsFalse(UsageDataExist, 'Usage Data Action should be disabled'); @@ -288,8 +323,8 @@ codeunit 148153 "Usage Based Billing Test" // [WHEN] Usage Data is created and Billing line is selected UsageBasedBTestLibrary.MockBillingLineWithServObjectNo(BillingLine1); UsageBasedBTestLibrary.CreateSalesInvoiceAndAssignToBillingLine(BillingLine1); - UsageBasedBTestLibrary.MockUsageDataForBillingLine(UsageDataBilling1, BillingLine1); - UsageDataExist := UsageDataBilling1.ExistForRecurringBilling(BillingLine1."Subscription Header No.", BillingLine1."Subscription Line Entry No.", BillingLine1."Document Type", BillingLine1."Document No."); + UsageBasedBTestLibrary.MockUsageDataForBillingLine(UsageDataBilling, BillingLine1); + UsageDataExist := UsageDataBilling.ExistForRecurringBilling(BillingLine1."Subscription Header No.", BillingLine1."Subscription Line Entry No.", BillingLine1."Document Type", BillingLine1."Document No."); // [THEN] Action Usage Data should be enabled Assert.IsTrue(UsageDataExist, 'Usage Data Action should be enabled'); @@ -299,7 +334,7 @@ codeunit 148153 "Usage Based Billing Test" procedure ExistForServiceCommitmentsDependsOnServiceCommitmentUsageData() var ServiceCommitment1: Record "Subscription Line"; - UsageDataBilling1: Record "Usage Data Billing"; + UsageDataBilling: Record "Usage Data Billing"; UsageDataExist: Boolean; begin // [SCENARIO] Action Usage Data should be disabled if there is no Usage Data for Subscription Line Line and should be enabled if there is Usage Data for Subscription Line Line @@ -309,14 +344,14 @@ codeunit 148153 "Usage Based Billing Test" UsageBasedBTestLibrary.MockServiceCommitmentLine(ServiceCommitment1); // [WHEN] Subscription Line line is selected - UsageDataExist := UsageDataBilling1.ExistForServiceCommitments(ServiceCommitment1.Partner, ServiceCommitment1."Subscription Header No.", ServiceCommitment1."Entry No."); + UsageDataExist := UsageDataBilling.ExistForServiceCommitments(ServiceCommitment1.Partner, ServiceCommitment1."Subscription Header No.", ServiceCommitment1."Entry No."); // [THEN] Action Usage Data should be disabled Assert.IsFalse(UsageDataExist, 'Usage Data Action should be disabled'); // [WHEN] Usage data is created and Subscription Line line is selected - UsageBasedBTestLibrary.MockUsageDataBillingForServiceCommitmentLine(UsageDataBilling1, ServiceCommitment1.Partner, ServiceCommitment1."Subscription Header No.", ServiceCommitment1."Entry No."); - UsageDataExist := UsageDataBilling1.ExistForServiceCommitments(ServiceCommitment1.Partner, ServiceCommitment1."Subscription Header No.", ServiceCommitment1."Entry No."); + UsageBasedBTestLibrary.MockUsageDataBillingForServiceCommitmentLine(UsageDataBilling, ServiceCommitment1.Partner, ServiceCommitment1."Subscription Header No.", ServiceCommitment1."Entry No."); + UsageDataExist := UsageDataBilling.ExistForServiceCommitments(ServiceCommitment1.Partner, ServiceCommitment1."Subscription Header No.", ServiceCommitment1."Entry No."); // [THEN] Action Usage Data should be enabled Assert.IsTrue(UsageDataExist, 'Usage Data Action should be enabled'); @@ -336,6 +371,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure ExpectErrorIfServiceCommitmentIsNotAssignedToContract() + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin Initialize(); SetupUsageDataForProcessingToGenericImport(WorkDate(), WorkDate(), WorkDate(), WorkDate(), 1, false); @@ -358,7 +395,7 @@ codeunit 148153 "Usage Based Billing Test" UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); UsageDataGenericImport.FindFirst(); - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling("Usage Based Pricing"::"Usage Quantity", '1D', '1D'); + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, "Usage Based Pricing"::"Usage Quantity", '1D', '1D'); Codeunit.Run(Codeunit::"Import And Process Usage Data", UsageDataImport); UsageDataImport.SetRecFilter(); UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Create Usage Data Billing"); @@ -370,6 +407,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure ExpectErrorOnDeleteCustomerContractLine() + var + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); @@ -430,6 +469,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure ExpectErrorWhenServiceCommitmentStartDateIsNotValid() + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin Initialize(); SetupUsageDataForProcessingToGenericImport(); @@ -450,6 +491,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure ExpectNoInvoicesCreateIfUsageDataImportProcessingStatusIsError() + var + UsageDataBilling: Record "Usage Data Billing"; begin // [SCENARIO] When usage data is processed with an error // expect no invoices to be created @@ -468,7 +511,7 @@ codeunit 148153 "Usage Based Billing Test" // [THEN] Test if Processing Status Error is set in Usage Data Import and that no invoice has been created and assigned in Usage Data Billing UsageDataImport.Get(UsageDataImport."Entry No."); UsageDataImport.TestField("Processing Status", Enum::"Processing Status"::Error); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::Invoice); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::Invoice); Assert.RecordIsEmpty(UsageDataBilling); end; @@ -553,6 +596,7 @@ codeunit 148153 "Usage Based Billing Test" var CustomerContract2: Record "Customer Subscription Contract"; ServiceObject2: Record "Subscription Header"; + UsageDataBilling: Record "Usage Data Billing"; TestSubscribers: Codeunit "Usage Based B. Test Subscr."; QuantityOfServiceCommitments: Integer; begin @@ -592,6 +636,7 @@ codeunit 148153 "Usage Based Billing Test" var CustomerContract2: Record "Customer Subscription Contract"; ServiceObject2: Record "Subscription Header"; + UsageDataBilling: Record "Usage Data Billing"; TestSubscribers: Codeunit "Usage Based B. Test Subscr."; QuantityOfServiceCommitments: Integer; begin @@ -627,13 +672,18 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure TestCreateUsageDataBilling() + var + UsageDataBilling: Record "Usage Data Billing"; + UsageDataGenericImport: Record "Usage Data Generic Import"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); UsageDataImport.FindLast(); UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); UsageDataBilling.FindLast(); - TestUsageDataBilling(); + UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); + UsageDataGenericImport.FindFirst(); + TestUsageDataBilling(UsageDataGenericImport, UsageDataBilling); end; [Test] @@ -658,6 +708,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] procedure TestCreateUsageDataGenericImport() + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin // Create Setup Data and Import file Initialize(); @@ -723,13 +775,16 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure TestDeleteUsageDataBilling() + var + UsageDataBilling: Record "Usage Data Billing"; + UsageDataGenericImport: Record "Usage Data Generic Import"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); UsageDataImport.DeleteUsageDataBillingLines(); Commit(); // retain data after asserterror - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No."); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No."); Assert.RecordIsEmpty(UsageDataBilling); Clear(UsageDataGenericImport); UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); @@ -766,6 +821,9 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure TestIfRelatedDataIsDeletedOnDeleteUsageDataImport() + var + UsageDataBilling: Record "Usage Data Billing"; + UsageDataGenericImport: Record "Usage Data Generic Import"; begin Initialize(); j := LibraryRandom.RandIntInRange(2, 10); @@ -787,7 +845,7 @@ codeunit 148153 "Usage Based Billing Test" UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); Assert.RecordIsEmpty(UsageDataGenericImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No."); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No."); Assert.RecordIsEmpty(UsageDataBilling); until UsageDataImport.Next() = 0; end; @@ -852,6 +910,8 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure TestPriceCalculationInUsageBasedBasedOnDay() var + UsageDataBilling: Record "Usage Data Billing"; + UsageDataGenericImport: Record "Usage Data Generic Import"; ProcessUsageDataBilling: Codeunit "Process Usage Data Billing"; RoundingPrecision: Decimal; begin @@ -877,13 +937,13 @@ codeunit 148153 "Usage Based Billing Test" UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); UsageDataGenericImport.FindFirst(); - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling("Usage Based Pricing"::"Usage Quantity", '1D', '1D'); + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, "Usage Based Pricing"::"Usage Quantity", '1D', '1D'); Codeunit.Run(Codeunit::"Import And Process Usage Data", UsageDataImport); UsageDataImport.SetRecFilter(); UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Create Usage Data Billing"); UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Process Usage Data Billing"); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No."); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No."); UsageDataBilling.FindSet(); ProcessUsageDataBilling.SetRoundingPrecision(RoundingPrecision, UsageDataBilling."Unit Price", Currency); Assert.AreEqual(Round(ServiceCommitment.Price, RoundingPrecision), UsageDataBilling."Unit Price", 'Amount was not calculated properly in Usage data.'); @@ -929,6 +989,7 @@ codeunit 148153 "Usage Based Billing Test" [Test] procedure TestProcessUsageDataBillingWithFixedQuantityAndPartialPeriods() var + UsageDataBilling: Record "Usage Data Billing"; ProcessUsageDataBilling: Codeunit "Process Usage Data Billing"; CalculatedAmount: Decimal; ExpectedResult: Decimal; @@ -954,7 +1015,7 @@ codeunit 148153 "Usage Based Billing Test" ProcessUsageDataWithSimpleGenericImport(CalcDate('<-CM>', WorkDate()), WorkDate(), CalcDate('<-CM>', WorkDate()), WorkDate(), ServiceObject.Quantity, "Usage Based Pricing"::"Fixed Quantity"); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); UsageDataBilling.CalcSums(Amount); CalculatedAmount := UsageDataBilling.Amount; UsageDataBilling.FindFirst(); @@ -966,6 +1027,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure TestProcessUsageDataGenericImport() + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin Initialize(); SetupUsageDataForProcessingToGenericImport(); @@ -978,11 +1041,11 @@ codeunit 148153 "Usage Based Billing Test" SetupServiceObjectAndContracts(WorkDate()); ProcessUsageDataImport(Enum::"Processing Step"::"Process Imported Lines"); // Process Usage Data Generic Import - CheckIfUsageDataSubscriptionIsCreated(); - CheckIfUsageDataCustomerIsCreated(); - CheckIfCustomerSupplierReferencesAreIsCreated(); - CheckIfSubscriptionSupplierReferencesAreIsCreated(); - CheckIfProductSupplierReferencesAreIsCreated(); + CheckIfUsageDataSubscriptionIsCreated(UsageDataGenericImport); + CheckIfUsageDataCustomerIsCreated(UsageDataGenericImport."Customer ID"); + CheckIfCustomerSupplierReferencesAreIsCreated(UsageDataGenericImport."Customer ID"); + CheckIfSubscriptionSupplierReferencesAreIsCreated(UsageDataGenericImport."Supp. Subscription ID"); + CheckIfProductSupplierReferencesAreIsCreated(UsageDataGenericImport."Product ID"); end; [Test] @@ -1128,6 +1191,7 @@ codeunit 148153 "Usage Based Billing Test" procedure TestUpdateUsageBasedAfterDeletePurchaseCreditMemo() var PurchaseInvoiceHeader: Record "Purch. Inv. Header"; + UsageDataBilling: Record "Usage Data Billing"; begin //[SCENARIO]: Check that usage data billing is deleted after deleting purchase credit memo ResetAll(); @@ -1159,13 +1223,15 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateVendorBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterDeletePurchaseInvoice() + var + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Process Usage Data Billing"); UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); UsageDataImport.CollectVendorContractsAndCreateInvoices(UsageDataImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No."); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No."); UsageDataBilling.MarkPurchaseHeaderFromUsageDataBilling(UsageDataBilling, PurchaseHeader); PurchaseHeader.FindSet(); PurchaseHeader.Delete(true); @@ -1202,6 +1268,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateCustomerBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterDeleteSalesCreditMemo() + var + UsageDataBilling: Record "Usage Data Billing"; begin //[SCENARIO]: Check that usage data billing is deleted after deleting sales credit memo ResetAll(); @@ -1214,7 +1282,7 @@ codeunit 148153 "Usage Based Billing Test" //[GIVEN] Create sales invoice from Usage Data Import UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); UsageDataBilling.FindSet(); SalesInvoiceHeader.Get(UsageDataBilling."Document No."); @@ -1276,6 +1344,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateCustomerBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterInsertCreditMemo() + var + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); @@ -1283,12 +1353,12 @@ codeunit 148153 "Usage Based Billing Test" UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Process Usage Data Billing"); UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); UsageDataBilling.FindSet(); SalesInvoiceHeader.Get(UsageDataBilling."Document No."); CorrectPostedSalesInvoice.CreateCreditMemoCopyDocument(SalesInvoiceHeader, SalesCrMemoHeader); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); Assert.RecordCount(UsageDataBilling, 2); // Expect additional usage data billing for credit memo UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(Enum::"Service Partner"::Customer, Enum::"Usage Based Billing Doc. Type"::"Credit Memo", SalesCrMemoHeader."No."); @@ -1299,6 +1369,7 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateVendorBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterInsertPurchaseCreditMemo() var + UsageDataBilling: Record "Usage Data Billing"; PurchaseInvoiceHeader: Record "Purch. Inv. Header"; begin Initialize(); @@ -1312,7 +1383,7 @@ codeunit 148153 "Usage Based Billing Test" PurchaseInvoiceHeader.FindLast(); CorrectPostedPurchaseInvoice.CreateCreditMemoCopyDocument(PurchaseInvoiceHeader, PurchaseHeader); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Vendor); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Vendor); Assert.RecordCount(UsageDataBilling, 2); // Expect additional usage data billing for credit memo and one without document type and document no UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(Enum::"Service Partner"::Vendor, Enum::"Usage Based Billing Doc. Type"::"Credit Memo", PurchaseHeader."No."); @@ -1322,6 +1393,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateCustomerBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterInsertSalesCreditMemo() + var + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); @@ -1330,12 +1403,12 @@ codeunit 148153 "Usage Based Billing Test" UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); UsageDataBilling.FindSet(); SalesInvoiceHeader.Get(UsageDataBilling."Document No."); CorrectPostedSalesInvoice.CreateCreditMemoCopyDocument(SalesInvoiceHeader, SalesCrMemoHeader); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); Assert.RecordCount(UsageDataBilling, 2); // Expect additional usage data billing for credit memo and one without document type and document no UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(Enum::"Service Partner"::Customer, Enum::"Usage Based Billing Doc. Type"::"Credit Memo", SalesCrMemoHeader."No."); @@ -1345,6 +1418,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateCustomerBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterPostCreditMemo() + var + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); @@ -1352,14 +1427,14 @@ codeunit 148153 "Usage Based Billing Test" UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Process Usage Data Billing"); UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); UsageDataBilling.FindSet(); SalesInvoiceHeader.Get(UsageDataBilling."Document No."); CorrectPostedSalesInvoice.CreateCreditMemoCopyDocument(SalesInvoiceHeader, SalesCrMemoHeader); CorrectedDocumentNo := LibrarySales.PostSalesDocument(SalesCrMemoHeader, true, true); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); Assert.RecordCount(UsageDataBilling, 3); // Expect additional usage data billing for credit memo and one without document type and document no UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(Enum::"Service Partner"::Customer, Enum::"Usage Based Billing Doc. Type"::"Posted Credit Memo", CorrectedDocumentNo); @@ -1373,6 +1448,7 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateVendorBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterPostPurchaseCreditMemo() var + UsageDataBilling: Record "Usage Data Billing"; PurchaseInvoiceHeader: Record "Purch. Inv. Header"; begin Initialize(); @@ -1389,7 +1465,7 @@ codeunit 148153 "Usage Based Billing Test" PurchaseHeader.Modify(false); CorrectedDocumentNo := LibraryPurchase.PostPurchaseDocument(PurchaseHeader, true, true); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Vendor); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Vendor); Assert.RecordCount(UsageDataBilling, 3); // Expect additional usage data billing for credit memo and one without document type and document no UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(Enum::"Service Partner"::Vendor, Enum::"Usage Based Billing Doc. Type"::"Posted Credit Memo", CorrectedDocumentNo); @@ -1420,6 +1496,8 @@ codeunit 148153 "Usage Based Billing Test" [Test] [HandlerFunctions('ExchangeRateSelectionModalPageHandler,CreateCustomerBillingDocumentPageHandler,MessageHandler')] procedure TestUpdateUsageBasedAfterPostSalesCreditMemo() + var + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); CreateUsageDataBilling("Usage Based Pricing"::"Fixed Quantity", LibraryRandom.RandDec(10, 2)); @@ -1427,14 +1505,14 @@ codeunit 148153 "Usage Based Billing Test" UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Process Usage Data Billing"); UsageDataImport.TestField("Processing Status", "Processing Status"::Ok); UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer, UsageDataBilling."Document Type"::"Posted Invoice"); UsageDataBilling.FindSet(); SalesInvoiceHeader.Get(UsageDataBilling."Document No."); CorrectPostedSalesInvoice.CreateCreditMemoCopyDocument(SalesInvoiceHeader, SalesCrMemoHeader); CorrectedDocumentNo := LibrarySales.PostSalesDocument(SalesCrMemoHeader, true, true); - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); Assert.RecordCount(UsageDataBilling, 3); // Expect additional usage data billing for credit memo and one without document type and document no UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(Enum::"Service Partner"::Customer, Enum::"Usage Based Billing Doc. Type"::"Posted Credit Memo", CorrectedDocumentNo); @@ -1463,7 +1541,7 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('MessageHandler,CreateCustomerBillingDocumentPageHandler')] procedure TestYearlyServiceCommitmentWithDailyUsageData() var - UsageDataBilling2: Record "Usage Data Billing"; + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); ContractTestLibrary.CreateItemWithServiceCommitmentOption(Item, Enum::"Item Service Commitment Type"::"Service Commitment Item"); @@ -1476,13 +1554,13 @@ codeunit 148153 "Usage Based Billing Test" '1Y', '1Y', '1Y', "Service Partner"::Customer, 100, Item."No."); ProcessUsageDataWithSimpleGenericImport(WorkDate(), WorkDate(), WorkDate(), WorkDate(), 1); - UsageDataBilling2.Reset(); - UsageDataBilling2.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); - UsageDataBilling2.SetRange(Partner, "Service Partner"::Customer); - if UsageDataBilling2.FindSet() then + UsageDataBilling.Reset(); + UsageDataBilling.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); + UsageDataBilling.SetRange(Partner, "Service Partner"::Customer); + if UsageDataBilling.FindSet() then repeat - UsageDataBilling2.TestField("Unit Price", UsageDataBilling2."Charged Period (Days)"); - until UsageDataBilling2.Next() = 0; + UsageDataBilling.TestField("Unit Price", UsageDataBilling."Charged Period (Days)"); + until UsageDataBilling.Next() = 0; CreateContractInvoicesAndTestProcessedUsageData(); end; @@ -1490,7 +1568,7 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('MessageHandler,CreateCustomerBillingDocumentPageHandler')] procedure TestYearlyServiceCommitmentWithMonthlyUsageData() var - UsageDataBilling2: Record "Usage Data Billing"; + UsageDataBilling: Record "Usage Data Billing"; begin Initialize(); ContractTestLibrary.CreateItemWithServiceCommitmentOption(Item, Enum::"Item Service Commitment Type"::"Service Commitment Item"); @@ -1503,13 +1581,13 @@ codeunit 148153 "Usage Based Billing Test" '1Y', '1Y', '1Y', "Service Partner"::Customer, 100, Item."No."); ProcessUsageDataWithSimpleGenericImport(WorkDate(), CalcDate('', WorkDate()), WorkDate(), CalcDate('', WorkDate()), 1); - UsageDataBilling2.Reset(); - UsageDataBilling2.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); - UsageDataBilling2.SetRange(Partner, "Service Partner"::Customer); - if UsageDataBilling2.FindSet() then + UsageDataBilling.Reset(); + UsageDataBilling.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); + UsageDataBilling.SetRange(Partner, "Service Partner"::Customer); + if UsageDataBilling.FindSet() then repeat - UsageDataBilling2.TestField("Unit Price", UsageDataBilling2."Charged Period (Days)"); - until UsageDataBilling2.Next() = 0; + UsageDataBilling.TestField("Unit Price", UsageDataBilling."Charged Period (Days)"); + until UsageDataBilling.Next() = 0; CreateContractInvoicesAndTestProcessedUsageData(); end; @@ -1517,6 +1595,7 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('ExchangeRateSelectionModalPageHandler,MessageHandler')] procedure UpdatingServiceObjectAvailabilityDuringProcessing() var + UsageDataGenericImport: Record "Usage Data Generic Import"; ItemReference: Record "Item Reference"; begin // [SCENARIO]: The Subscription Availability should be properly updated after processing imported lines @@ -1542,6 +1621,8 @@ codeunit 148153 "Usage Based Billing Test" ValidateUsageDataGenericImportAvailability(UsageDataImport."Entry No.", "Service Object Availability"::"Not Available", ''); // [WHEN]: insert an item reference to a usage data supplier reference + UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); + UsageDataGenericImport.FindFirst(); UsageDataSubscription.FindForSupplierReference(UsageDataImport."Supplier No.", UsageDataGenericImport."Supp. Subscription ID"); UsageDataSupplierReference.FindSupplierReference(UsageDataImport."Supplier No.", UsageDataSubscription."Product ID", Enum::"Usage Data Reference Type"::Product); LibraryItemReference.CreateItemReference(ItemReference, Item."No.", "Item Reference Type"::Vendor, UsageDataSupplier."Vendor No."); @@ -1645,7 +1726,8 @@ codeunit 148153 "Usage Based Billing Test" [HandlerFunctions('MessageHandler,CreateCustomerBillingDocumentPageHandler')] procedure TestUsageDataImportWithMultipleUsageDataGenericImports() var - UBBTestLibrary: Codeunit "Usage Based B. Test Library"; + UsageDataBilling: Record "Usage Data Billing"; + UsageDataGenericImport: Record "Usage Data Generic Import"; BillingPeriodStartDate: Date; SubscriptionStartDate: Date; SubscriptionID: Text; @@ -1668,14 +1750,14 @@ codeunit 148153 "Usage Based Billing Test" '1M', '1M', '1M', "Service Partner"::Customer, 100, Item."No."); // [WHEN] Create and process simple usage data - UBBTestLibrary.CreateUsageDataSupplier(UsageDataSupplier, Enum::"Usage Data Supplier Type"::Generic, false, Enum::"Vendor Invoice Per"::Import); - UBBTestLibrary.CreateGenericImportSettings(GenericImportSettings, UsageDataSupplier."No.", true, true); - UBBTestLibrary.CreateUsageDataImport(UsageDataImport, UsageDataSupplier."No."); + UsageBasedBTestLibrary.CreateUsageDataSupplier(UsageDataSupplier, Enum::"Usage Data Supplier Type"::Generic, false, Enum::"Vendor Invoice Per"::Import); + UsageBasedBTestLibrary.CreateGenericImportSettings(GenericImportSettings, UsageDataSupplier."No.", true, true); + UsageBasedBTestLibrary.CreateUsageDataImport(UsageDataImport, UsageDataSupplier."No."); BillingPeriodStartDate := CalcDate('<-CM>', WorkDate()); SubscriptionStartDate := CalcDate('<-CM>', WorkDate()); SubscriptionID := LibraryRandom.RandText(80); for i := 1 to LibraryRandom.RandInt(10) do begin - UBBTestLibrary.CreateSimpleUsageDataGenericImport(UsageDataGenericImport, UsageDataImport."Entry No.", ServiceObject."No.", Customer."No.", Item."Unit Cost", + UsageBasedBTestLibrary.CreateSimpleUsageDataGenericImport(UsageDataGenericImport, UsageDataImport."Entry No.", ServiceObject."No.", Customer."No.", Item."Unit Cost", BillingPeriodStartDate, CalcDate('', BillingPeriodStartDate), SubscriptionStartDate, CalcDate('', SubscriptionStartDate), LibraryRandom.RandInt(10)); UsageDataGenericImport."Supp. Subscription ID" := CopyStr(SubscriptionID, 1, MaxStrLen(UsageDataGenericImport."Supp. Subscription ID")); @@ -1690,7 +1772,7 @@ codeunit 148153 "Usage Based Billing Test" UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); UsageDataGenericImport.FindFirst(); repeat - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(Enum::"Usage Based Pricing"::"Usage Quantity", '1M', '1M', Calcdate('<-CM>', WorkDate())); + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, Enum::"Usage Based Pricing"::"Usage Quantity", '1M', '1M', Calcdate('<-CM>', WorkDate())); until UsageDataGenericImport.Next() = 0; Codeunit.Run(Codeunit::"Import And Process Usage Data", UsageDataImport); @@ -1761,15 +1843,15 @@ codeunit 148153 "Usage Based Billing Test" BillingLine.DeleteAll(false); end; - local procedure CheckIfCustomerSupplierReferencesAreIsCreated() + local procedure CheckIfCustomerSupplierReferencesAreIsCreated(CustomerID: Text[80]) begin - UsageDataSupplierReference.FilterUsageDataSupplierReference(UsageDataImport."Supplier No.", UsageDataGenericImport."Customer ID", Enum::"Usage Data Reference Type"::Customer); + UsageDataSupplierReference.FilterUsageDataSupplierReference(UsageDataImport."Supplier No.", CustomerID, Enum::"Usage Data Reference Type"::Customer); UsageDataSupplierReference.FindFirst(); end; - local procedure CheckIfProductSupplierReferencesAreIsCreated() + local procedure CheckIfProductSupplierReferencesAreIsCreated(ProductID: Text[80]) begin - UsageDataSupplierReference.FilterUsageDataSupplierReference(UsageDataImport."Supplier No.", UsageDataGenericImport."Product ID", Enum::"Usage Data Reference Type"::Product); + UsageDataSupplierReference.FilterUsageDataSupplierReference(UsageDataImport."Supplier No.", ProductID, Enum::"Usage Data Reference Type"::Product); UsageDataSupplierReference.FindFirst(); end; @@ -1818,6 +1900,8 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure TestIfInvoicesMatchesUsageData(ServicePartner: Enum "Service Partner"; InvoiceAmount: Decimal; DocumentNo: Code[20]) + var + UsageDataBilling: Record "Usage Data Billing"; begin UsageDataBilling.Reset(); UsageDataBilling.FilterOnDocumentTypeAndDocumentNo(ServicePartner, Enum::"Usage Based Billing Doc. Type"::"Invoice", DocumentNo); @@ -1830,7 +1914,7 @@ codeunit 148153 "Usage Based Billing Test" end; end; - local procedure CheckIfServiceCommitmentRemains() + local procedure CheckIfServiceCommitmentRemains(UsageDataBilling: Record "Usage Data Billing") begin ServiceCommitment.Reset(); ServiceCommitment.SetRange("Subscription Header No.", UsageDataBilling."Subscription Header No."); @@ -1844,20 +1928,20 @@ codeunit 148153 "Usage Based Billing Test" until ServiceCommitment.Next() = 0; end; - local procedure CheckIfSubscriptionSupplierReferencesAreIsCreated() + local procedure CheckIfSubscriptionSupplierReferencesAreIsCreated(SuppSubscriptionID: Text[80]) begin - UsageDataSupplierReference.FilterUsageDataSupplierReference(UsageDataImport."Supplier No.", UsageDataGenericImport."Supp. Subscription ID", Enum::"Usage Data Reference Type"::Subscription); + UsageDataSupplierReference.FilterUsageDataSupplierReference(UsageDataImport."Supplier No.", SuppSubscriptionID, Enum::"Usage Data Reference Type"::Subscription); UsageDataSupplierReference.FindFirst(); end; - local procedure CheckIfUsageDataCustomerIsCreated() + local procedure CheckIfUsageDataCustomerIsCreated(CustomerID: Text[80]) begin UsageDataCustomer.SetRange("Supplier No.", UsageDataImport."Supplier No."); - UsageDataCustomer.SetRange("Supplier Reference", UsageDataGenericImport."Customer ID"); + UsageDataCustomer.SetRange("Supplier Reference", CustomerID); UsageDataCustomer.FindFirst(); end; - local procedure CheckIfUsageDataSubscriptionIsCreated() + local procedure CheckIfUsageDataSubscriptionIsCreated(UsageDataGenericImport: Record "Usage Data Generic Import") begin UsageDataSubscription.FindForSupplierReference(UsageDataImport."Supplier No.", UsageDataGenericImport."Supp. Subscription ID"); UsageDataSubscription.TestField("Customer ID", UsageDataGenericImport."Customer ID"); @@ -1887,9 +1971,10 @@ codeunit 148153 "Usage Based Billing Test" local procedure CreateContractInvoicesAndTestProcessedUsageData() var + UsageDataBilling: Record "Usage Data Billing"; ExpectedInvoiceAmount: Decimal; begin - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", "Service Partner"::Customer); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", "Service Partner"::Customer); UsageDataBilling.CalcSums(Amount); ExpectedInvoiceAmount := UsageDataBilling.Amount; UsageDataImport.CollectCustomerContractsAndCreateInvoices(UsageDataImport); @@ -1897,7 +1982,7 @@ codeunit 148153 "Usage Based Billing Test" Currency.InitRoundingPrecision(); UsageDataBilling.FindFirst(); - CheckIfServiceCommitmentRemains(); + CheckIfServiceCommitmentRemains(UsageDataBilling); BillingLine.FilterBillingLineOnContractLine(UsageDataBilling.Partner, UsageDataBilling."Subscription Contract No.", UsageDataBilling."Subscription Contract Line No."); BillingLine.CalcSums(Amount); @@ -1940,6 +2025,8 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure CreateUsageDataBilling(UsageBasedPricing: Enum "Usage Based Pricing"; BillingPeriodStartingDate: Date; BillingPeriodEndingDate: Date; SubscriptionStartingDate: Date; SubscriptionEndingDate: Date; Quantity: Decimal) + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin SetupUsageDataForProcessingToGenericImport(BillingPeriodStartingDate, BillingPeriodEndingDate, SubscriptionStartingDate, SubscriptionEndingDate, Quantity); SetupDataExchangeDefinition(); @@ -1952,7 +2039,7 @@ codeunit 148153 "Usage Based Billing Test" // Therefore Processing needs to be performed twice - refer to AB2070 UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); UsageDataGenericImport.FindFirst(); - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing); + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, UsageBasedPricing); Codeunit.Run(Codeunit::"Import And Process Usage Data", UsageDataImport); UsageDataImport.SetRecFilter(); UsageDataImport.ProcessUsageDataImport(UsageDataImport, Enum::"Processing Step"::"Create Usage Data Billing"); @@ -1987,21 +2074,21 @@ codeunit 148153 "Usage Based Billing Test" ContractTestLibrary.SetGeneralPostingSetup(Vendor."Gen. Bus. Posting Group", Item."Gen. Prod. Posting Group", false, Enum::"Service Partner"::Vendor); end; - local procedure FilterUsageDataBillingOnUsageDataImport(UsageDataImportEntryNo: Integer) + local procedure FilterUsageDataBillingOnUsageDataImport(var UsageDataBilling: Record "Usage Data Billing"; UsageDataImportEntryNo: Integer) begin UsageDataBilling.Reset(); UsageDataBilling.SetRange("Usage Data Import Entry No.", UsageDataImportEntryNo); end; - local procedure FilterUsageDataBillingOnUsageDataImport(UsageDataImportEntryNo: Integer; ServicePartner: Enum "Service Partner") + local procedure FilterUsageDataBillingOnUsageDataImport(var UsageDataBilling: Record "Usage Data Billing"; UsageDataImportEntryNo: Integer; ServicePartner: Enum "Service Partner") begin - FilterUsageDataBillingOnUsageDataImport(UsageDataImportEntryNo); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImportEntryNo); UsageDataBilling.SetRange(Partner, ServicePartner); end; - local procedure FilterUsageDataBillingOnUsageDataImport(UsageDataImportEntryNo: Integer; ServicePartner: Enum "Service Partner"; UsageBasedBillingDocType: Enum "Usage Based Billing Doc. Type") + local procedure FilterUsageDataBillingOnUsageDataImport(var UsageDataBilling: Record "Usage Data Billing"; UsageDataImportEntryNo: Integer; ServicePartner: Enum "Service Partner"; UsageBasedBillingDocType: Enum "Usage Based Billing Doc. Type") begin - FilterUsageDataBillingOnUsageDataImport(UsageDataImportEntryNo, ServicePartner); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImportEntryNo, ServicePartner); UsageDataBilling.SetRange("Document Type", UsageBasedBillingDocType); end; @@ -2046,8 +2133,11 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure PostPurchaseDocuments() + var + + UsageDataBilling: Record "Usage Data Billing"; begin - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No."); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No."); UsageDataBilling.MarkPurchaseHeaderFromUsageDataBilling(UsageDataBilling, PurchaseHeader); PurchaseHeader.FindSet(); repeat @@ -2057,20 +2147,17 @@ codeunit 148153 "Usage Based Billing Test" until PurchaseHeader.Next() = 0; end; - local procedure PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing: Enum "Usage Based Pricing") + local procedure PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport: Record "Usage Data Generic Import"; UsageBasedPricing: Enum "Usage Based Pricing") begin - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing, '', ''); + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, UsageBasedPricing, '', ''); end; - local procedure PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing: Enum "Usage Based Pricing"; BillingBasePeriod: Text; - BillingRhythm: Text) + local procedure PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport: Record "Usage Data Generic Import"; UsageBasedPricing: Enum "Usage Based Pricing"; BillingBasePeriod: Text; BillingRhythm: Text) begin - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing, BillingBasePeriod, BillingRhythm, 0D); - + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, UsageBasedPricing, BillingBasePeriod, BillingRhythm, 0D); end; - local procedure PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing: Enum "Usage Based Pricing"; BillingBasePeriod: Text; - BillingRhythm: Text; ServiceStartDate: Date) + local procedure PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport: Record "Usage Data Generic Import"; UsageBasedPricing: Enum "Usage Based Pricing"; BillingBasePeriod: Text; BillingRhythm: Text; ServiceStartDate: Date) begin ServiceCommitment.SetRange("Subscription Header No.", ServiceObject."No."); ServiceCommitment.FindSet(); @@ -2104,6 +2191,8 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure ProcessUsageDataWithSimpleGenericImport(BillingPeriodStartDate: Date; BillingPeriodEndDate: Date; SubscriptionStartDate: Date; SubscriptionEndDate: Date; Quantity: Decimal; UsageBasedPricing: Enum "Usage Based Pricing") + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin UsageBasedBTestLibrary.CreateUsageDataSupplier(UsageDataSupplier, Enum::"Usage Data Supplier Type"::Generic, false, Enum::"Vendor Invoice Per"::Import); UsageBasedBTestLibrary.CreateGenericImportSettings(GenericImportSettings, UsageDataSupplier."No.", true, true); @@ -2112,7 +2201,7 @@ codeunit 148153 "Usage Based Billing Test" ProcessUsageDataImport(Enum::"Processing Step"::"Process Imported Lines"); UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImport."Entry No."); UsageDataGenericImport.FindFirst(); - PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageBasedPricing); + PrepareServiceCommitmentAndUsageDataGenericImportForUsageBilling(UsageDataGenericImport, UsageBasedPricing); Codeunit.Run(Codeunit::"Import And Process Usage Data", UsageDataImport); UsageDataImport.SetRecFilter(); @@ -2224,6 +2313,8 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure SetupUsageDataForProcessingToGenericImport(BillingPeriodStartingDate: Date; BillingPeriodEndingDate: Date; SubscriptionStartingDate: Date; SubscriptionEndingDate: Date; Quantity: Decimal; UnitPriceFromImport: Boolean) + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin UsageBasedBTestLibrary.CreateUsageDataSupplier(UsageDataSupplier, Enum::"Usage Data Supplier Type"::Generic, UnitPriceFromImport, Enum::"Vendor Invoice Per"::Import); UsageBasedBTestLibrary.CreateGenericImportSettings(GenericImportSettings, UsageDataSupplier."No.", true, true); @@ -2245,8 +2336,10 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure TestIfRelatedUsageDataBillingIsUpdated(ServicePartner: Enum "Service Partner"; UsageBasedBillingDocType: Enum "Usage Based Billing Doc. Type"; DocumentNo: Code[20]; TestNotEmptyDocLineNo: Boolean; BillingLineNo: Integer) + var + UsageDataBilling: Record "Usage Data Billing"; begin - FilterUsageDataBillingOnUsageDataImport(UsageDataImport."Entry No.", ServicePartner); + FilterUsageDataBillingOnUsageDataImport(UsageDataBilling, UsageDataImport."Entry No.", ServicePartner); UsageDataBilling.FindSet(); repeat UsageDataBilling.TestField("Document Type", UsageBasedBillingDocType); @@ -2262,7 +2355,7 @@ codeunit 148153 "Usage Based Billing Test" until UsageDataBilling.Next() = 0 end; - local procedure TestUsageDataBilling() + local procedure TestUsageDataBilling(UsageDataGenericImport: Record "Usage Data Generic Import"; var UsageDataBilling: Record "Usage Data Billing") begin UsageDataBilling.TestField("Usage Data Import Entry No.", UsageDataGenericImport."Usage Data Import Entry No."); UsageDataBilling.TestField("Subscription Header No.", UsageDataGenericImport."Subscription Header No."); @@ -2285,6 +2378,8 @@ codeunit 148153 "Usage Based Billing Test" end; local procedure ValidateUsageDataGenericImportAvailability(UsageDataImportEntryNo: Integer; ExpectedServiceObjectAvailability: Enum "Service Object Availability"; ExpectedServiceObjectNo: Code[20]) + var + UsageDataGenericImport: Record "Usage Data Generic Import"; begin UsageDataGenericImport.SetRange("Usage Data Import Entry No.", UsageDataImportEntryNo); UsageDataGenericImport.FindFirst();