Table 320 Tax Jurisdiction, source in 29
Source29
src/Layers/W1/BaseApp/Finance/SalesTax/TaxJurisdiction.Table.al344 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.SalesTax;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Setup;
using System.Globalization;
/// <summary>
/// Stores tax jurisdiction definitions with account mappings and calculation rules.
/// Represents governmental tax authorities (city, county, state) with specific tax configuration.
/// </summary>
table 320 "Tax Jurisdiction"
{
Caption = 'Tax Jurisdiction';
DataCaptionFields = "Code", Description;
LookupPageID = "Tax Jurisdictions";
DataClassification = CustomerContent;
fields
{
/// <summary>
/// Unique identifier for the tax jurisdiction.
/// </summary>
field(1; "Code"; Code[10])
{
Caption = 'Code';
ToolTip = 'Specifies the code you want to assign to this tax jurisdiction. You can enter up to 10 characters, both numbers and letters. It is a good idea to enter a code that is easy to remember.';
NotBlank = true;
}
/// <summary>
/// Descriptive name for the tax jurisdiction.
/// </summary>
field(2; Description; Text[100])
{
Caption = 'Description';
ToolTip = 'Specifies a description of the tax jurisdiction. For example, if the tax jurisdiction code is ATLANTA GA, enter the description as Atlanta, Georgia.';
}
/// <summary>
/// G/L account for posting tax amounts on sales transactions.
/// </summary>
field(3; "Tax Account (Sales)"; Code[20])
{
Caption = 'Tax Account (Sales)';
TableRelation = "G/L Account";
}
/// <summary>
/// G/L account for posting tax amounts on purchase transactions.
/// </summary>
field(4; "Tax Account (Purchases)"; Code[20])
{
Caption = 'Tax Account (Purchases)';
TableRelation = "G/L Account";
}
/// <summary>
/// Parent jurisdiction for consolidated tax reporting.
/// </summary>
field(5; "Report-to Jurisdiction"; Code[10])
{
Caption = 'Report-to Jurisdiction';
ToolTip = 'Specifies the tax jurisdiction you want to associate with the jurisdiction you are setting up. For example, if you are setting up a jurisdiction for Atlanta, Georgia, the report-to jurisdiction is Georgia because Georgia is the tax authority to which you report Atlanta sales tax.';
TableRelation = "Tax Jurisdiction";
}
/// <summary>
/// Date filter for tax calculation queries and reports.
/// </summary>
field(6; "Date Filter"; Date)
{
Caption = 'Date Filter';
FieldClass = FlowFilter;
}
/// <summary>
/// Tax group filter for jurisdiction-specific tax calculations.
/// </summary>
field(7; "Tax Group Filter"; Code[20])
{
Caption = 'Tax Group Filter';
FieldClass = FlowFilter;
TableRelation = "Tax Group";
}
/// <summary>
/// G/L account for unrealized tax amounts on sales transactions.
/// </summary>
field(8; "Unreal. Tax Acc. (Sales)"; Code[20])
{
Caption = 'Unreal. Tax Acc. (Sales)';
TableRelation = "G/L Account";
}
/// <summary>
/// G/L account for unrealized tax amounts on purchase transactions.
/// </summary>
field(9; "Unreal. Tax Acc. (Purchases)"; Code[20])
{
Caption = 'Unreal. Tax Acc. (Purchases)';
TableRelation = "G/L Account";
}
/// <summary>
/// G/L account for reverse charge amounts on purchase transactions.
/// </summary>
field(10; "Reverse Charge (Purchases)"; Code[20])
{
Caption = 'Reverse Charge (Purchases)';
TableRelation = "G/L Account";
}
/// <summary>
/// G/L account for unrealized reverse charge amounts on purchase transactions.
/// </summary>
field(11; "Unreal. Rev. Charge (Purch.)"; Code[20])
{
Caption = 'Unreal. Rev. Charge (Purch.)';
TableRelation = "G/L Account";
}
/// <summary>
/// Method for calculating unrealized VAT on partial payments.
/// </summary>
field(12; "Unrealized VAT Type"; Option)
{
Caption = 'Unrealized VAT Type';
ToolTip = 'Specifies how to handle unrealized tax, which is tax that is calculated but not due until the invoice is paid.';
OptionCaption = ' ,Percentage,First,Last,First (Fully Paid),Last (Fully Paid)';
OptionMembers = " ",Percentage,First,Last,"First (Fully Paid)","Last (Fully Paid)";
trigger OnValidate()
begin
if "Unrealized VAT Type" > 0 then begin
GLSetup.Get();
GLSetup.TestField("Unrealized VAT", true);
end;
end;
}
/// <summary>
/// Indicates whether tax is calculated on previously calculated taxes (compound taxation).
/// </summary>
field(13; "Calculate Tax on Tax"; Boolean)
{
Caption = 'Calculate Tax on Tax';
ToolTip = 'Specifies whether to calculate the sales tax amount with the tax on tax principle.';
trigger OnValidate()
begin
TaxDetail.SetRange("Tax Jurisdiction Code", Code);
TaxDetail.ModifyAll("Calculate Tax on Tax", "Calculate Tax on Tax");
Modify();
end;
}
/// <summary>
/// Controls whether tax amounts are adjusted for payment discounts.
/// </summary>
field(14; "Adjust for Payment Discount"; Boolean)
{
Caption = 'Adjust for Payment Discount';
ToolTip = 'Specifies whether to recalculate tax amounts when you post payments that trigger payment discounts.';
trigger OnValidate()
begin
if "Adjust for Payment Discount" then begin
GLSetup.Get();
GLSetup.TestField("Adjust for Payment Disc.", true);
end;
end;
}
/// <summary>
/// Short name for the tax jurisdiction used in reports and displays.
/// </summary>
field(15; Name; Text[30])
{
Caption = 'Name';
}
}
keys
{
key(Key1; "Code")
{
Clustered = true;
}
key(Key2; "Report-to Jurisdiction")
{
}
}
fieldgroups
{
}
trigger OnDelete()
begin
DeleteDetailLines();
end;
trigger OnInsert()
begin
SetDefaults();
InsertDetailLines();
end;
var
GLSetup: Record "General Ledger Setup";
TaxDetail: Record "Tax Detail";
/// <summary>
/// Returns the appropriate sales tax G/L account based on realization status.
/// </summary>
/// <param name="Unrealized">Whether to return the unrealized tax account</param>
/// <returns>G/L account code for sales tax posting</returns>
procedure GetSalesAccount(Unrealized: Boolean): Code[20]
begin
if Unrealized then begin
TestField("Unreal. Tax Acc. (Sales)");
exit("Unreal. Tax Acc. (Sales)");
end;
TestField("Tax Account (Sales)");
exit("Tax Account (Sales)");
end;
/// <summary>
/// Returns the appropriate purchase tax G/L account based on realization status.
/// </summary>
/// <param name="Unrealized">Whether to return the unrealized tax account</param>
/// <returns>G/L account code for purchase tax posting</returns>
procedure GetPurchAccount(Unrealized: Boolean): Code[20]
begin
if Unrealized then begin
TestField("Unreal. Tax Acc. (Purchases)");
exit("Unreal. Tax Acc. (Purchases)");
end;
TestField("Tax Account (Purchases)");
exit("Tax Account (Purchases)");
end;
/// <summary>
/// Returns the appropriate reverse charge G/L account based on realization status.
/// </summary>
/// <param name="Unrealized">Whether to return the unrealized reverse charge account</param>
/// <returns>G/L account code for reverse charge posting</returns>
procedure GetRevChargeAccount(Unrealized: Boolean): Code[20]
begin
if Unrealized then begin
TestField("Unreal. Rev. Charge (Purch.)");
exit("Unreal. Rev. Charge (Purch.)");
end;
TestField("Reverse Charge (Purchases)");
exit("Reverse Charge (Purchases)");
end;
/// <summary>
/// Creates a new tax jurisdiction with the specified code and default account setup.
/// </summary>
/// <param name="NewJurisdictionCode">Code for the new tax jurisdiction</param>
procedure CreateTaxJurisdiction(NewJurisdictionCode: Code[10])
begin
Init();
Code := NewJurisdictionCode;
Description := NewJurisdictionCode;
SetDefaults();
if Insert(true) then;
end;
local procedure SetDefaults()
var
TaxSetup: Record "Tax Setup";
begin
TaxSetup.Get();
"Tax Account (Sales)" := TaxSetup."Tax Account (Sales)";
"Tax Account (Purchases)" := TaxSetup."Tax Account (Purchases)";
"Unreal. Tax Acc. (Sales)" := TaxSetup."Unreal. Tax Acc. (Sales)";
"Unreal. Tax Acc. (Purchases)" := TaxSetup."Unreal. Tax Acc. (Purchases)";
"Reverse Charge (Purchases)" := TaxSetup."Reverse Charge (Purchases)";
"Unreal. Rev. Charge (Purch.)" := TaxSetup."Unreal. Rev. Charge (Purch.)";
end;
local procedure InsertDetailLines()
var
TaxDetail: Record "Tax Detail";
TaxSetup: Record "Tax Setup";
begin
TaxSetup.Get();
if not TaxSetup."Auto. Create Tax Details" then
exit;
TaxDetail.SetRange("Tax Jurisdiction Code", Code);
if not TaxDetail.IsEmpty() then
exit;
TaxDetail.Init();
TaxDetail."Tax Jurisdiction Code" := Code;
TaxDetail."Tax Group Code" := '';
TaxDetail."Tax Type" := TaxDetail."Tax Type"::"Sales Tax";
TaxDetail."Effective Date" := WorkDate();
TaxDetail.Insert();
if TaxSetup."Non-Taxable Tax Group Code" <> '' then begin
TaxDetail.Init();
TaxDetail."Tax Jurisdiction Code" := Code;
TaxDetail."Tax Group Code" := TaxSetup."Non-Taxable Tax Group Code";
TaxDetail."Tax Type" := TaxDetail."Tax Type"::"Sales Tax";
TaxDetail."Effective Date" := WorkDate();
TaxDetail.Insert();
end;
end;
local procedure DeleteDetailLines()
var
TaxAreaLine: Record "Tax Area Line";
TaxDetail: Record "Tax Detail";
begin
TaxAreaLine.SetRange("Tax Jurisdiction Code", Code);
TaxAreaLine.DeleteAll();
TaxDetail.SetRange("Tax Jurisdiction Code", Code);
TaxDetail.DeleteAll();
end;
/// <summary>
/// Returns the tax jurisdiction description in the user's current language.
/// Falls back to the default description if no translation is available.
/// </summary>
/// <returns>Localized description text</returns>
procedure GetDescriptionInCurrentLanguageFullLength(): Text[100]
var
TaxJurisdictionTranslation: Record "Tax Jurisdiction Translation";
Language: Codeunit Language;
begin
if TaxJurisdictionTranslation.Get(Code, Language.GetUserLanguageCode()) then
exit(TaxJurisdictionTranslation.Description);
exit(Description);
end;
/// <summary>
/// Returns the jurisdiction name, defaulting to the code if name is empty.
/// </summary>
/// <returns>Jurisdiction name or code</returns>
procedure GetName(): Text[30]
begin
if Name = '' then
Name := Code;
exit(Name);
end;
}