Table 213 Alt. Cust. VAT Reg.

App
Base Application
Namespace
Microsoft.Finance.VAT.Registration
Versions
25-28

Fields, 6Keys, 2Procedures, 1Events, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/VAT/Registration/AltCustVATReg.Table.al203 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.VAT.Registration;

using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.VAT.Setup;
using Microsoft.Foundation.Address;
using Microsoft.Sales.Customer;
using System.Telemetry;

/// <summary>
/// Stores alternative VAT registration numbers for customers operating in multiple countries.
/// Enables country-specific VAT configurations with associated posting groups and validation rules.
/// </summary>
table 213 "Alt. Cust. VAT Reg."
{
    Caption = 'Alternative Customer VAT Registration';
    LookupPageId = "Alt. Cust. VAT Reg.";
    DrillDownPageId = "Alt. Cust. VAT Reg.";

    fields
    {
        /// <summary>
        /// Unique identifier for the alternative VAT registration record.
        /// </summary>
        field(1; ID; Integer)
        {
            DataClassification = SystemMetadata;
            AutoIncrement = true;
        }
        /// <summary>
        /// Customer number associated with this alternative VAT registration.
        /// </summary>
        field(2; "Customer No."; Code[20])
        {
            DataClassification = CustomerContent;
            TableRelation = Customer;
            NotBlank = true;
            ToolTip = 'Specifies the customer number.';
        }
        /// <summary>
        /// Country or region code for which this alternative VAT registration applies.
        /// </summary>
        field(3; "VAT Country/Region Code"; Code[10])
        {
            DataClassification = CustomerContent;
            TableRelation = "Country/Region";
            ToolTip = 'Specifies the country or region code for the VAT';
            NotBlank = true;

            trigger OnLookup()
            var
                Customer: Record Customer;
                CountryRegion: Record "Country/Region";
                CountriesRegionsPage: Page "Countries/Regions";
            begin
                if "Customer No." <> '' then begin
                    Customer.Get("Customer No.");
                    if Customer."Country/Region Code" <> '' then
                        CountryRegion.SetFilter(Code, '<>%1', Customer."Country/Region Code");
                end;
                CountriesRegionsPage.SetTableView(CountryRegion);
                CountriesRegionsPage.LookupMode(true);
                if CountriesRegionsPage.RunModal() = Action::LookupOK then begin
                    CountriesRegionsPage.GetRecord(CountryRegion);
                    Validate("VAT Country/Region Code", CountryRegion.Code);
                end;
            end;

            trigger OnValidate()
            begin
                if "VAT Country/Region Code" <> xRec."VAT Country/Region Code" then
                    VATRegistrationValidation();
            end;
        }
        /// <summary>
        /// VAT registration number for the specified country or region.
        /// </summary>
        field(4; "VAT Registration No."; Text[20])
        {
            Caption = 'VAT Registration No.';
            DataClassification = CustomerContent;
            ToolTip = 'Specifies the VAT registration number.';

            trigger OnValidate()
            begin
                "VAT Registration No." := UpperCase("VAT Registration No.");
                if "VAT Registration No." <> xRec."VAT Registration No." then
                    VATRegistrationValidation();
            end;
        }
        /// <summary>
        /// General business posting group for transactions in this VAT jurisdiction.
        /// </summary>
        field(5; "Gen. Bus. Posting Group"; Code[20])
        {
            Caption = 'Gen. Bus. Posting Group';
            DataClassification = CustomerContent;
            TableRelation = "Gen. Business Posting Group";
            ToolTip = 'Specifies the customer''s trade type to link transactions made for this customer with the appropriate general ledger account according to the general posting setup.';

            trigger OnValidate()
            var
                GenBusPostingGrp: Record "Gen. Business Posting Group";
            begin
                if xRec."Gen. Bus. Posting Group" <> "Gen. Bus. Posting Group" then
                    if GenBusPostingGrp.ValidateVatBusPostingGroup(GenBusPostingGrp, "Gen. Bus. Posting Group") then
                        Validate("VAT Bus. Posting Group", GenBusPostingGrp."Def. VAT Bus. Posting Group");
            end;
        }
        /// <summary>
        /// VAT business posting group for transactions in this VAT jurisdiction.
        /// </summary>
        field(6; "VAT Bus. Posting Group"; Code[20])
        {
            Caption = 'VAT Bus. Posting Group';
            DataClassification = CustomerContent;
            TableRelation = "VAT Business Posting Group";
            ToolTip = 'Specifies the customer''s VAT specification to link transactions made for this customer to.';
        }
    }

    keys
    {
        key(PK; ID)
        {
            Clustered = true;
        }
        key(CustomerVATCountryKey; "Customer No.", "VAT Country/Region Code")
        {
        }
    }

    var
        AltCustVATRegFacade: Codeunit "Alt. Cust. VAT. Reg. Facade";
        FeatureTelemetry: Codeunit "Feature Telemetry";
        FeatureNameTxt: Label 'Alternative Customer VAT Registration', Locked = true;

    trigger OnInsert()
    begin
        AltCustVATRegFacade.CheckAltCustVATRegConsistent(Rec);
        FeatureTelemetry.LogUptake('0000NFH', FeatureNameTxt, Enum::"Feature Uptake Status"::"Set up");
    end;

    trigger OnModify()
    begin
        AltCustVATRegFacade.CheckAltCustVATRegConsistent(Rec);
    end;

    /// <summary>
    /// Validates VAT registration number against format rules and VIES service when enabled.
    /// </summary>
    procedure VATRegistrationValidation()
    var
        VATRegistrationNoFormat: Record "VAT Registration No. Format";
        VATRegistrationLog: Record "VAT Registration Log";
        VATRegNoSrvConfig: Record "VAT Reg. No. Srv Config";
        Customer: Record Customer;
        VATRegistrationLogMgt: Codeunit "VAT Registration Log Mgt.";
        ResultRecordRef: RecordRef;
        ApplicableCountryCode: Code[10];
        IsHandled: Boolean;
        LogNotVerified: Boolean;
    begin
        IsHandled := false;
        OnBeforeVATRegistrationValidation(Rec, IsHandled);
        if IsHandled then
            exit;

        if not VATRegistrationNoFormat.Test("VAT Registration No.", "VAT Country/Region Code", "Customer No.", DATABASE::Customer) then
            exit;

        LogNotVerified := true;
        if ("VAT Country/Region Code" <> '') or (VATRegistrationNoFormat."Country/Region Code" <> '') then begin
            ApplicableCountryCode := "VAT Country/Region Code";
            if ApplicableCountryCode = '' then
                ApplicableCountryCode := VATRegistrationNoFormat."Country/Region Code";
            if VATRegNoSrvConfig.VATRegNoSrvIsEnabled() then begin
                LogNotVerified := false;
                VATRegistrationLogMgt.ValidateVATRegNoWithVIES(
                    ResultRecordRef, Rec, "Customer No.", VATRegistrationLog."Account Type"::Customer.AsInteger(), ApplicableCountryCode);
                ResultRecordRef.SetTable(Rec);
            end;
        end;

        if LogNotVerified then begin
            Customer.Get(Rec."Customer No.");
            VATRegistrationLogMgt.LogCustomer(Customer);
        end;
    end;

    /// <summary>
    /// Integration event raised before starting VAT registration validation process.
    /// </summary>
    /// <param name="AltCustVATReg">Alternative customer VAT registration record being validated</param>
    /// <param name="IsHandled">Set to true to skip standard validation processing</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeVATRegistrationValidation(var AltCustVATReg: Record "Alt. Cust. VAT Reg."; var IsHandled: Boolean)
    begin
    end;
}