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
Expand Up @@ -616,6 +616,10 @@ codeunit 8060 "Create Billing Documents"
SalesHeader.Validate("Posting Date", PostingDate);
SalesHeader.Validate("Document Date", DocumentDate);
SalesHeader.Validate("Currency Code");
if SalesHeader."Payment Terms Code" <> OldSalesHeader."Payment Terms Code" then begin
SalesHeader."Payment Terms Code" := OldSalesHeader."Payment Terms Code";
SalesHeader.Validate("Payment Terms Code", CustomerContract."Payment Terms Code");
end;
SalesHeader."Assigned User ID" := CopyStr(UserId(), 1, MaxStrLen(SalesHeader."Assigned User ID"));
TranslationHelper.SetGlobalLanguageByCode(SalesHeader."Language Code");
SalesHeader."Posting Description" := CustomerContractLbl + ' ' + CustomerContract."No.";
Expand Down Expand Up @@ -662,6 +666,8 @@ codeunit 8060 "Create Billing Documents"
DocumentChangeManagement.SetSkipContractPurchaseHeaderModifyCheck(false);
PurchaseHeader.Validate("Document Date", DocumentDate);
PurchaseHeader.Validate("Currency Code");
if PurchaseHeader."Payment Terms Code" <> OldPurchaseHeader."Payment Terms Code" then
PurchaseHeader.Validate("Payment Terms Code", VendorContract."Payment Terms Code");
PurchaseHeader."Assigned User ID" := CopyStr(UserId(), 1, MaxStrLen(SalesHeader."Assigned User ID"));
TranslationHelper.SetGlobalLanguageByCode(PurchaseHeader."Language Code");
PurchaseHeader."Posting Description" := VendorContractLbl + ' ' + VendorContract."No.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ namespace Microsoft.SubscriptionBilling;

using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Foundation.PaymentTerms;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Item.Attribute;
Expand Down Expand Up @@ -818,6 +819,156 @@ codeunit 139687 "Recurring Billing Docs Test"
PurchaseHeader.TestField("Pay-to Vendor No.", PayToVendor."No.");
end;

[Test]
[HandlerFunctions('CreateCustomerBillingDocsContractWithDocumentDatePageHandler,MessageHandler')]
procedure PaymentDiscountOnSalesInvoiceIsTakenFromCustomerContractPaymentTerms()
var
Customer: Record Customer;
ContractPaymentTerms: Record "Payment Terms";
CustomerPaymentTerms: Record "Payment Terms";
NewDocumentDate: Date;
begin
// [SCENARIO 10095] The payment discount on a sales document created from a Customer Subscription Contract
// follows the payment terms stored on the contract, not the ones on the customer
Initialize();

// [GIVEN] A customer with payment terms that grant no discount
CreatePaymentTermsWithDiscount(CustomerPaymentTerms, 0);
// [GIVEN] Payment terms that grant a discount, set on the contract only
CreatePaymentTermsWithDiscount(ContractPaymentTerms, 2);
ContractTestLibrary.CreateCustomerInLCY(Customer);
Customer.Validate("Payment Terms Code", CustomerPaymentTerms.Code);
Customer.Modify(false);
ContractTestLibrary.CreateCustomerContractAndCreateContractLinesForItems(CustomerContract, ServiceObject, Customer."No.");
ContractTestLibrary.DisableDeferralsForCustomerContract(CustomerContract, false);
CustomerContract.Validate("Payment Terms Code", ContractPaymentTerms.Code);
CustomerContract.Modify(false);

// [WHEN] Billing documents are created with a document date that differs from the posting date
NewDocumentDate := CalcDate('<1D>', WorkDate());
LibraryVariableStorage.Enqueue(NewDocumentDate);
ContractTestLibrary.CreateBillingProposal(BillingTemplate, Enum::"Service Partner"::Customer);
CreateBillingDocuments(false);

// [THEN] The sales invoice carries the contract's payment terms including their discount
GetSalesHeaderFromBillingLines();
SalesHeader.TestField("Document Date", NewDocumentDate);
SalesHeader.TestField("Payment Terms Code", ContractPaymentTerms.Code);
SalesHeader.TestField("Payment Discount %", ContractPaymentTerms."Discount %");
SalesHeader.TestField("Pmt. Discount Date", CalcDate(ContractPaymentTerms."Discount Date Calculation", NewDocumentDate));
end;

[Test]
[HandlerFunctions('CreateCustomerBillingDocsContractWithDocumentDatePageHandler,MessageHandler')]
procedure PaymentDiscountOnSalesInvoiceIsRemovedWhenCustomerContractPaymentTermsGrantNone()
var
Customer: Record Customer;
ContractPaymentTerms: Record "Payment Terms";
CustomerPaymentTerms: Record "Payment Terms";
NewDocumentDate: Date;
begin
// [SCENARIO 10095] The customer's payment discount is not granted when the contract's payment terms grant none
Initialize();

// [GIVEN] A customer with payment terms that grant a discount
CreatePaymentTermsWithDiscount(CustomerPaymentTerms, 3);
// [GIVEN] Payment terms without discount, set on the contract only
CreatePaymentTermsWithDiscount(ContractPaymentTerms, 0);
ContractTestLibrary.CreateCustomerInLCY(Customer);
Customer.Validate("Payment Terms Code", CustomerPaymentTerms.Code);
Customer.Modify(false);
ContractTestLibrary.CreateCustomerContractAndCreateContractLinesForItems(CustomerContract, ServiceObject, Customer."No.");
ContractTestLibrary.DisableDeferralsForCustomerContract(CustomerContract, false);
CustomerContract.Validate("Payment Terms Code", ContractPaymentTerms.Code);
CustomerContract.Modify(false);

// [WHEN] Billing documents are created with a document date that differs from the posting date
NewDocumentDate := CalcDate('<1D>', WorkDate());
LibraryVariableStorage.Enqueue(NewDocumentDate);
ContractTestLibrary.CreateBillingProposal(BillingTemplate, Enum::"Service Partner"::Customer);
CreateBillingDocuments(false);

// [THEN] The sales invoice grants no payment discount
GetSalesHeaderFromBillingLines();
SalesHeader.TestField("Payment Terms Code", ContractPaymentTerms.Code);
SalesHeader.TestField("Payment Discount %", 0);
end;

[Test]
[HandlerFunctions('CreateVendorBillingDocsContractWithDocumentDatePageHandler,MessageHandler')]
procedure PaymentDiscountOnPurchaseInvoiceIsTakenFromVendorContractPaymentTerms()
var
Vendor: Record Vendor;
ContractPaymentTerms: Record "Payment Terms";
VendorPaymentTerms: Record "Payment Terms";
NewDocumentDate: Date;
begin
// [SCENARIO 10095] The payment discount on a purchase document created from a Vendor Subscription Contract
// follows the payment terms stored on the contract, not the ones on the vendor
Initialize();

// [GIVEN] A vendor with payment terms that grant no discount
CreatePaymentTermsWithDiscount(VendorPaymentTerms, 0);
// [GIVEN] Payment terms that grant a discount, set on the contract only
CreatePaymentTermsWithDiscount(ContractPaymentTerms, 2);
ContractTestLibrary.CreateVendorInLCY(Vendor);
Vendor.Validate("Payment Terms Code", VendorPaymentTerms.Code);
Vendor.Modify(false);
ContractTestLibrary.CreateVendorContractAndCreateContractLinesForItems(VendorContract, ServiceObject, Vendor."No.");
ContractTestLibrary.DisableDeferralsForVendorContract(VendorContract, false);
VendorContract.Validate("Payment Terms Code", ContractPaymentTerms.Code);
VendorContract.Modify(false);

// [WHEN] Billing documents are created with a document date that differs from the posting date
NewDocumentDate := CalcDate('<1D>', WorkDate());
LibraryVariableStorage.Enqueue(NewDocumentDate);
ContractTestLibrary.CreateBillingProposal(BillingTemplate, Enum::"Service Partner"::Vendor);
CreateBillingDocuments(false);

// [THEN] The purchase invoice carries the contract's payment terms including their discount
GetPurchaseHeaderFromBillingLines();
PurchaseHeader.TestField("Document Date", NewDocumentDate);
PurchaseHeader.TestField("Payment Terms Code", ContractPaymentTerms.Code);
PurchaseHeader.TestField("Payment Discount %", ContractPaymentTerms."Discount %");
PurchaseHeader.TestField("Pmt. Discount Date", CalcDate(ContractPaymentTerms."Discount Date Calculation", NewDocumentDate));
end;

[Test]
[HandlerFunctions('CreateVendorBillingDocsContractWithDocumentDatePageHandler,MessageHandler')]
procedure PaymentDiscountOnPurchaseInvoiceIsRemovedWhenVendorContractPaymentTermsGrantNone()
var
Vendor: Record Vendor;
ContractPaymentTerms: Record "Payment Terms";
VendorPaymentTerms: Record "Payment Terms";
NewDocumentDate: Date;
begin
// [SCENARIO 10095] The vendor's payment discount is not taken when the contract's payment terms grant none
Initialize();

// [GIVEN] A vendor with payment terms that grant a discount
CreatePaymentTermsWithDiscount(VendorPaymentTerms, 3);
// [GIVEN] Payment terms without discount, set on the contract only
CreatePaymentTermsWithDiscount(ContractPaymentTerms, 0);
ContractTestLibrary.CreateVendorInLCY(Vendor);
Vendor.Validate("Payment Terms Code", VendorPaymentTerms.Code);
Vendor.Modify(false);
ContractTestLibrary.CreateVendorContractAndCreateContractLinesForItems(VendorContract, ServiceObject, Vendor."No.");
ContractTestLibrary.DisableDeferralsForVendorContract(VendorContract, false);
VendorContract.Validate("Payment Terms Code", ContractPaymentTerms.Code);
VendorContract.Modify(false);

// [WHEN] Billing documents are created with a document date that differs from the posting date
NewDocumentDate := CalcDate('<1D>', WorkDate());
LibraryVariableStorage.Enqueue(NewDocumentDate);
ContractTestLibrary.CreateBillingProposal(BillingTemplate, Enum::"Service Partner"::Vendor);
CreateBillingDocuments(false);

// [THEN] The purchase invoice grants no payment discount
GetPurchaseHeaderFromBillingLines();
PurchaseHeader.TestField("Payment Terms Code", ContractPaymentTerms.Code);
PurchaseHeader.TestField("Payment Discount %", 0);
end;

[Test]
[HandlerFunctions('CheckDialogConfirmHandler,ExchangeRateSelectionModalPageHandler,CreateVendorBillingDocsTestOpenPageHandler,MessageHandler')]
procedure CheckVendorBillingProposalCanBeCreatedForPurchaseInvoiceExists()
Expand Down Expand Up @@ -2660,6 +2811,33 @@ codeunit 139687 "Recurring Billing Docs Test"
Commit(); // retain data after asserterror
end;

local procedure CreatePaymentTermsWithDiscount(var PaymentTerms: Record "Payment Terms"; DiscountPerc: Decimal)
begin
LibraryERM.CreatePaymentTerms(PaymentTerms);
Evaluate(PaymentTerms."Due Date Calculation", '<1M>');
Evaluate(PaymentTerms."Discount Date Calculation", '<8D>');
PaymentTerms.Validate("Due Date Calculation", PaymentTerms."Due Date Calculation");
PaymentTerms.Validate("Discount Date Calculation", PaymentTerms."Discount Date Calculation");
PaymentTerms.Validate("Discount %", DiscountPerc);
PaymentTerms.Modify(false);
end;

local procedure GetSalesHeaderFromBillingLines()
begin
BillingLine.Reset();
BillingLine.SetFilter("Document No.", '<>%1', '');
BillingLine.FindFirst();
SalesHeader.Get(Enum::"Sales Document Type"::Invoice, BillingLine."Document No.");
end;

local procedure GetPurchaseHeaderFromBillingLines()
begin
BillingLine.Reset();
BillingLine.SetFilter("Document No.", '<>%1', '');
BillingLine.FindFirst();
PurchaseHeader.Get(Enum::"Purchase Document Type"::Invoice, BillingLine."Document No.");
end;

local procedure CreateCustomerContractAndAssignServiceObjects(ItemNo: Code[20])
var
TempServiceCommitment: Record "Subscription Line" temporary;
Expand Down Expand Up @@ -3110,6 +3288,13 @@ codeunit 139687 "Recurring Billing Docs Test"
CreateCustomerBillingDocs.OK().Invoke();
end;

[ModalPageHandler]
procedure CreateCustomerBillingDocsContractWithDocumentDatePageHandler(var CreateCustomerBillingDocs: TestPage "Create Customer Billing Docs")
begin
CreateCustomerBillingDocs.DocumentDate.SetValue(LibraryVariableStorage.DequeueDate());
CreateCustomerBillingDocs.OK().Invoke();
end;

[ModalPageHandler]
procedure CreateCustomerBillingDocsModalPageHandler(var CreateCustomerBillingDocsPage: TestPage "Create Customer Billing Docs")
begin
Expand Down Expand Up @@ -3149,6 +3334,13 @@ codeunit 139687 "Recurring Billing Docs Test"
CreateVendorBillingDocs.OK().Invoke();
end;

[ModalPageHandler]
procedure CreateVendorBillingDocsContractWithDocumentDatePageHandler(var CreateVendorBillingDocs: TestPage "Create Vendor Billing Docs")
begin
CreateVendorBillingDocs.DocumentDate.SetValue(LibraryVariableStorage.DequeueDate());
CreateVendorBillingDocs.OK().Invoke();
end;

[ModalPageHandler]
procedure CreateVendorBillingDocsModalPageHandler(var CreateVendorBillingDocsPage: TestPage "Create Vendor Billing Docs")
begin
Expand Down Expand Up @@ -3244,4 +3436,4 @@ codeunit 139687 "Recurring Billing Docs Test"

#endregion Handlers
}
#pragma warning restore AA0210
#pragma warning restore AA0210
Loading