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,5 +1,6 @@
namespace Microsoft.SubscriptionBilling;

using Microsoft.Finance.Currency;
using Microsoft.Foundation.ExtendedText;
using Microsoft.Inventory.Item;
using Microsoft.Purchases.Document;
Expand Down Expand Up @@ -247,6 +248,7 @@ codeunit 8060 "Create Billing Documents"
SubContractsItemManagement: Codeunit "Sub. Contracts Item Management";
TransferExtendedText: Codeunit "Transfer Extended Text";
UsageBasedDocTypeConv: Codeunit "Usage Based Doc. Type Conv.";
UnitPrice: Decimal;
BillingLineNo: Integer;
begin
ServiceObject.Get(TempBillingLine."Subscription Header No.");
Expand Down Expand Up @@ -274,8 +276,11 @@ codeunit 8060 "Create Billing Documents"
if SalesLine."Unit of Measure Code" <> ServiceObject."Unit of Measure" then
SalesLine.Validate("Unit of Measure Code", ServiceObject."Unit of Measure");
SalesLine.Validate(Quantity, TempBillingLine.GetSign() * ServiceObject.Quantity);
UnitPrice := SalesLine.GetSalesDocumentSign() * TempBillingLine."Unit Price";
if SalesHeader."Prices Including VAT" then
UnitPrice := ToVATInclusiveUnitPrice(UnitPrice, SalesLine."VAT %", SalesLine."VAT Calculation Type" = SalesLine."VAT Calculation Type"::"Full VAT", SalesLine."Currency Code");
// Unit Price is assigned directly; the following Validate("Line Discount %") recalculates the line amount.
SalesLine."Unit Price" := SalesLine.GetSalesDocumentSign() * TempBillingLine."Unit Price";
SalesLine."Unit Price" := UnitPrice;
SalesLine.Validate("Line Discount %", TempBillingLine."Discount %");
SalesLine.Validate("Unit Cost (LCY)", TempBillingLine."Unit Cost (LCY)");
SalesLine."Recurring Billing from" := TempBillingLine."Billing from";
Expand Down Expand Up @@ -334,10 +339,28 @@ codeunit 8060 "Create Billing Documents"
OnAfterInsertSalesLineFromBillingLine(CustomerContractLine, SalesLine);
end;

local procedure ToVATInclusiveUnitPrice(NetUnitPrice: Decimal; VATPercent: Decimal; IsFullVAT: Boolean; CurrencyCode: Code[10]): Decimal
var
Currency: Record Currency;
VATFactor: Decimal;
begin
if IsFullVAT then
exit(NetUnitPrice);
VATFactor := 1 + VATPercent / 100;
if VATFactor = 0 then
exit(NetUnitPrice);
if CurrencyCode = '' then
Currency.InitRoundingPrecision()
else
Currency.Get(CurrencyCode);
exit(Round(NetUnitPrice * VATFactor, Currency."Unit-Amount Rounding Precision"));
end;

local procedure SetInvoicePriceFromUsageDataBilling(var SalesLine: Record "Sales Line"; var BillingLine: Record "Billing Line")
var
UsageDataBilling: Record "Usage Data Billing";
ServiceCommitment: Record "Subscription Line";
UnitPrice: Decimal;
begin
if not ServiceCommitment.Get(BillingLine."Subscription Line Entry No.") then
exit;
Expand All @@ -359,9 +382,12 @@ codeunit 8060 "Create Billing Documents"
UsageDataBilling.SetRange(Quantity);
UsageDataBilling.CalcSums(Amount);
if SalesLine.Quantity <> 0 then
SalesLine.Validate("Unit Price", SalesLine.GetSalesDocumentSign() * UsageDataBilling.Amount / SalesLine.Quantity)
UnitPrice := SalesLine.GetSalesDocumentSign() * UsageDataBilling.Amount / SalesLine.Quantity
else
SalesLine.Validate("Unit Price", UsageDataBilling."Unit Price");
UnitPrice := UsageDataBilling."Unit Price";
if SalesHeader."Prices Including VAT" then
UnitPrice := ToVATInclusiveUnitPrice(UnitPrice, SalesLine."VAT %", SalesLine."VAT Calculation Type" = SalesLine."VAT Calculation Type"::"Full VAT", SalesLine."Currency Code");
SalesLine.Validate("Unit Price", UnitPrice);
SalesLine.Validate("Line Discount %", ServiceCommitment."Discount %");
end;

Expand All @@ -375,6 +401,7 @@ codeunit 8060 "Create Billing Documents"
UsageBasedDocTypeConv: Codeunit "Usage Based Doc. Type Conv.";
SubContractsItemManagement: Codeunit "Sub. Contracts Item Management";
TransferExtendedText: Codeunit "Transfer Extended Text";
DirectUnitCost: Decimal;
BillingLineNo: Integer;
begin
ServiceObject.Get(TempBillingLine."Subscription Header No.");
Expand All @@ -397,8 +424,11 @@ codeunit 8060 "Create Billing Documents"
if PurchaseLine."Unit of Measure Code" <> ServiceObject."Unit of Measure" then
PurchaseLine.Validate("Unit of Measure Code", ServiceObject."Unit of Measure");
PurchaseLine.Validate(Quantity, TempBillingLine.GetSign() * ServiceObject.Quantity);
DirectUnitCost := PurchaseLine.GetPurchaseDocumentSign() * TempBillingLine."Unit Price";
if PurchaseHeader."Prices Including VAT" then
DirectUnitCost := ToVATInclusiveUnitPrice(DirectUnitCost, PurchaseLine."VAT %", PurchaseLine."VAT Calculation Type" = PurchaseLine."VAT Calculation Type"::"Full VAT", PurchaseLine."Currency Code");
// Direct Unit Cost is assigned directly; the following Validate("Line Discount %") recalculates the line amount.
PurchaseLine."Direct Unit Cost" := PurchaseLine.GetPurchaseDocumentSign() * TempBillingLine."Unit Price";
PurchaseLine."Direct Unit Cost" := DirectUnitCost;
PurchaseLine.Validate("Line Discount %", TempBillingLine."Discount %");
PurchaseLine."Recurring Billing from" := TempBillingLine."Billing from";
PurchaseLine."Recurring Billing to" := TempBillingLine."Billing to";
Expand Down Expand Up @@ -449,6 +479,7 @@ codeunit 8060 "Create Billing Documents"
var
UsageDataBilling: Record "Usage Data Billing";
ServiceCommitment: Record "Subscription Line";
DirectUnitCost: Decimal;
begin
if not ServiceCommitment.Get(BillingLine."Subscription Line Entry No.") then
exit;
Expand All @@ -470,9 +501,12 @@ codeunit 8060 "Create Billing Documents"
UsageDataBilling.SetRange(Quantity);
UsageDataBilling.CalcSums("Cost Amount");
if PurchLine.Quantity <> 0 then
PurchLine.Validate("Direct Unit Cost", PurchLine.GetPurchaseDocumentSign() * UsageDataBilling."Cost Amount" / PurchLine.Quantity)
DirectUnitCost := PurchLine.GetPurchaseDocumentSign() * UsageDataBilling."Cost Amount" / PurchLine.Quantity
else
PurchLine.Validate("Direct Unit Cost", 0);
DirectUnitCost := 0;
if PurchaseHeader."Prices Including VAT" then
DirectUnitCost := ToVATInclusiveUnitPrice(DirectUnitCost, PurchLine."VAT %", PurchLine."VAT Calculation Type" = PurchLine."VAT Calculation Type"::"Full VAT", PurchLine."Currency Code");
PurchLine.Validate("Direct Unit Cost", DirectUnitCost);
PurchLine.Validate("Line Discount %", ServiceCommitment."Discount %");
end;

Expand Down
Loading
Loading