Codeunit 200 Alt. Cust. VAT. Reg. Facade

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

Procedures, 14Events, 6

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/VAT/Registration/AltCustVATRegFacade.Codeunit.al257 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.Sales.Customer;
using Microsoft.Sales.Document;
using System.Diagnostics;

/// <summary>
/// Facade for alternative customer VAT registration functionality in sales documents.
/// Provides simplified interface for VAT registration management across different shipping scenarios and country changes.
/// </summary>
codeunit 200 "Alt. Cust. VAT. Reg. Facade"
{
    Access = Public;

    var
        AltCustVATRegOrchestrator: Codeunit "Alt. Cust. VAT Reg. Orchest.";

    /// <summary>
    /// Updates VAT setup when ship-to country/region changes in sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header being modified</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    procedure UpdateSetupOnShipToCountryChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header")
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().UpdateSetupOnShipToCountryChangeInSalesHeader(SalesHeader, xSalesHeader);
    end;

    /// <summary>
    /// Updates VAT setup when VAT country/region changes in sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header being modified</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    procedure UpdateSetupOnVATCountryChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header")
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().UpdateSetupOnVATCountryChangeInSalesHeader(SalesHeader, xSalesHeader);
    end;

    /// <summary>
    /// Updates VAT setup when bill-to customer changes in sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header being modified</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    /// <param name="BillToCustomer">New bill-to customer record</param>
    procedure UpdateSetupOnBillToCustomerChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header"; BillToCustomer: Record Customer)
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().UpdateSetupOnBillToCustomerChangeInSalesHeader(SalesHeader, xSalesHeader, BillToCustomer);
    end;

    /// <summary>
    /// Copies alternative VAT registration settings from customer to sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header to update with customer VAT settings</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    procedure CopyFromCustomer(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header")
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().CopyFromCustomer(SalesHeader, xSalesHeader);
    end;

    /// <summary>
    /// Initializes alternative VAT registration setup for sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header to initialize with VAT registration settings</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    procedure Init(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header")
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().Init(SalesHeader, xSalesHeader);
    end;

    /// <summary>
    /// Retrieves alternative customer VAT registration record for specified customer and country.
    /// </summary>
    /// <param name="AltCustVATReg">Alternative customer VAT registration record to populate</param>
    /// <param name="CustNo">Customer number to search for</param>
    /// <param name="CountryCode">Country/region code for VAT registration</param>
    /// <returns>True if alternative VAT registration record found</returns>
    procedure GetAlternativeCustVATReg(var AltCustVATReg: Record "Alt. Cust. VAT Reg."; CustNo: Code[20]; CountryCode: Code[10]): Boolean
    begin
        AltCustVATReg.SetRange("Customer No.", CustNo);
        AltCustVATReg.SetRange("VAT Country/Region Code", CountryCode);
        exit(AltCustVATReg.FindFirst());
    end;

    /// <summary>
    /// Determines whether customer VAT registration number should be updated from sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header containing VAT registration information</param>
    /// <param name="Customer">Customer record to potentially update</param>
    /// <returns>True if customer VAT registration should be updated</returns>
    procedure UpdateVATRegNoInCustFromSalesHeader(SalesHeader: Record "Sales Header"; Customer: Record Customer) ShouldUpdate: Boolean
    var
        IsHandled: Boolean;
    begin
        OnBeforeUpdateVATRegNoInCustFromSalesHeader(SalesHeader, Customer, ShouldUpdate, IsHandled);
        if IsHandled then
            exit(ShouldUpdate);
        exit((Customer."VAT Registration No." = '') and (not SalesHeader."Alt. VAT Registration No."));
    end;

    /// <summary>
    /// Determines whether VAT data has changed during ship-to code validation.
    /// </summary>
    /// <param name="SalesHeader">Current sales header</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    /// <returns>True if VAT-related data has changed</returns>
    procedure VATDataIsChangedOnShipToCodeValidation(SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") Changed: Boolean
    var
        IsHandled: Boolean;
    begin
        OnBeforeVATDataIsChangedOnShipToCodeValidation(SalesHeader, xSalesHeader, Changed, IsHandled);
        if IsHandled then
            exit(Changed);
        if SalesHeader."Alt. Gen. Bus Posting Group" or SalesHeader."Alt. VAT Bus Posting Group" or
           xSalesHeader."Alt. Gen. Bus Posting Group" or xSalesHeader."Alt. VAT Bus Posting Group"
        then
            exit(false);
        exit(xSalesHeader."VAT Country/Region Code" <> SalesHeader."VAT Country/Region Code");
    end;

    /// <summary>
    /// Handles country/region change events in ship-to address records.
    /// </summary>
    /// <param name="ShipToAddress">Ship-to address record with country/region change</param>
    procedure HandleCountryChangeInShipToAddress(ShipToAddress: Record "Ship-to Address")
    begin
        AltCustVATRegOrchestrator.GetShipToAlCustVATRegImpl().HandleCountryChangeInShipToAddress(ShipToAddress);
    end;

    /// <summary>
    /// Validates consistency of alternative customer VAT registration setup.
    /// </summary>
    /// <param name="AltCustVATReg">Alternative customer VAT registration record to validate</param>
    procedure CheckAltCustVATRegConsistent(AltCustVATReg: Record "Alt. Cust. VAT Reg.")
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegConsistencyImpl().CheckAltCustVATRegConsistent(AltCustVATReg);
    end;

    /// <summary>
    /// Validates consistency of customer VAT registration setup across all alternative registrations.
    /// </summary>
    /// <param name="Customer">Customer record to validate for VAT registration consistency</param>
    procedure CheckCustomerConsistency(Customer: Record Customer)
    begin
        AltCustVATRegOrchestrator.GetAltCustVATRegConsistencyImpl().CheckCustomerConsistency(Customer);
    end;

    /// <summary>
    /// Copies the alternative customer VAT registration data to the sales header.
    /// </summary>
    procedure CopyAltCustVATRegToSalesHeader(var SalesHeader: Record "Sales Header"; AltCustVATReg: Record "Alt. Cust. VAT Reg.")
    begin
        if AltCustVATReg."VAT Registration No." <> '' then begin
            SalesHeader.Validate("Alt. VAT Registration No.", true);
            SalesHeader.Validate("VAT Registration No.", AltCustVATReg."VAT Registration No.");
        end;
        if AltCustVATReg."Gen. Bus. Posting Group" <> '' then begin
            SalesHeader.Validate("Alt. Gen. Bus Posting Group", true);
            SalesHeader.Validate("Gen. Bus. Posting Group", AltCustVATReg."Gen. Bus. Posting Group");
        end;
        if AltCustVATReg."VAT Bus. Posting Group" <> '' then begin
            SalesHeader.Validate("Alt. VAT Bus Posting Group", true);
            SalesHeader.Validate("VAT Bus. Posting Group", AltCustVATReg."VAT Bus. Posting Group");
        end;
        OnAfterCopyAltCustVATRegToSalesHeader(SalesHeader, AltCustVATReg);
    end;

    /// <summary>
    /// Adds a record to the temporary change log entry if values of alternative customer VAT registration fields have changed.
    /// </summary>
    procedure AddTempChangeLogEntryForAltCustVATRegChanges(var TempChangeLogEntry: Record "Change Log Entry" temporary; SalesHeader: Record "Sales Header"; AltCustVATReg: Record "Alt. Cust. VAT Reg.")
    begin
        if (AltCustVATReg."VAT Registration No." <> '') and (SalesHeader."VAT Registration No." <> AltCustVATReg."VAT Registration No.") then
            AddFieldChangeBuffer(TempChangeLogEntry, SalesHeader.FieldNo("VAT Registration No."), SalesHeader."VAT Registration No.", AltCustVATReg."VAT Registration No.");
        if (AltCustVATReg."Gen. Bus. Posting Group" <> '') and (SalesHeader."Gen. Bus. Posting Group" <> AltCustVATReg."Gen. Bus. Posting Group") then
            AddFieldChangeBuffer(TempChangeLogEntry, SalesHeader.FieldNo("Gen. Bus. Posting Group"), SalesHeader."Gen. Bus. Posting Group", AltCustVATReg."Gen. Bus. Posting Group");
        if (AltCustVATReg."VAT Bus. Posting Group" <> '') and (SalesHeader."VAT Bus. Posting Group" <> AltCustVATReg."VAT Bus. Posting Group") then
            AddFieldChangeBuffer(TempChangeLogEntry, SalesHeader.FieldNo("VAT Bus. Posting Group"), SalesHeader."VAT Bus. Posting Group", AltCustVATReg."VAT Bus. Posting Group");
        OnAfterAddTempChangeLogEntryForAltCustVATRegChanges(TempChangeLogEntry, SalesHeader, AltCustVATReg);
    end;

    /// <summary>
    /// Copies the bill-to customer data to sales header.
    /// </summary>
    procedure CopyBillToCustomerToSalesHeader(var SalesHeader: Record "Sales Header"; BillToCustomer: Record Customer)
    begin
        if (SalesHeader."VAT Bus. Posting Group" <> '') and (SalesHeader."VAT Bus. Posting Group" <> BillToCustomer."VAT Bus. Posting Group") then
            SalesHeader.Validate("VAT Bus. Posting Group", BillToCustomer."VAT Bus. Posting Group")
        else
            SalesHeader."VAT Bus. Posting Group" := BillToCustomer."VAT Bus. Posting Group";
        SalesHeader."VAT Country/Region Code" := BillToCustomer."Country/Region Code";
        SalesHeader."VAT Registration No." := BillToCustomer."VAT Registration No.";
        SalesHeader."Registration Number" := BillToCustomer."Registration Number";
        SalesHeader."Gen. Bus. Posting Group" := BillToCustomer."Gen. Bus. Posting Group";
        OnAfterCopyBillToCustomerToSalesHeader(SalesHeader, BillToCustomer);
    end;

    local procedure AddFieldChangeBuffer(var TempChangeLogEntry: Record "Change Log Entry" temporary; DocFieldNo: Integer; OldValue: Text[2048]; NewValue: Text[2048])
    begin
        TempChangeLogEntry."Entry No." += 1;
        TempChangeLogEntry."Table No." := Database::"Sales Header";
        TempChangeLogEntry."Field No." := DocFieldNo;
        TempChangeLogEntry."Old Value" := OldValue;
        TempChangeLogEntry."New Value" := NewValue;
        TempChangeLogEntry.Insert();
    end;

    /// <summary>
    /// Integration event raised before determining whether to update customer VAT registration number from sales header.
    /// </summary>
    /// <param name="SalesHeader">Sales header containing VAT registration information</param>
    /// <param name="Customer">Customer record to potentially update</param>
    /// <param name="ShouldUpdate">Set to true if customer VAT registration should be updated</param>
    /// <param name="IsHandled">Set to true to skip standard logic</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateVATRegNoInCustFromSalesHeader(var SalesHeader: Record "Sales Header"; Customer: Record Customer; var ShouldUpdate: Boolean; var IsHandled: Boolean)
    begin
    end;

    /// <summary>
    /// Integration event raised before determining whether VAT data has changed during ship-to code validation.
    /// </summary>
    /// <param name="SalesHeader">Current sales header</param>
    /// <param name="xSalesHeader">Original sales header before changes</param>
    /// <param name="Changed">Set to true if VAT data has changed</param>
    /// <param name="IsHandled">Set to true to skip standard logic</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeVATDataIsChangedOnShipToCodeValidation(var SalesHeader: Record "Sales Header"; var xSalesHeader: Record "Sales Header"; var Changed: Boolean; var IsHandled: Boolean)
    begin
    end;

    /// <summary>
    /// Integration event raised after copying alternative customer VAT registration data to sales header.
    /// </summary>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyAltCustVATRegToSalesHeader(var SalesHeader: Record "Sales Header"; var AltCustVATReg: Record "Alt. Cust. VAT Reg.")
    begin
    end;

    /// <summary>
    /// Integration event raised after adding temporary change log entries for alternative customer VAT registration changes.
    /// </summary>
    [IntegrationEvent(false, false)]
    local procedure OnAfterAddTempChangeLogEntryForAltCustVATRegChanges(var TempChangeLogEntry: Record "Change Log Entry" temporary; SalesHeader: Record "Sales Header"; AltCustVATReg: Record "Alt. Cust. VAT Reg.")
    begin
    end;

    /// <summary>
    /// Integration event raised after copying bill-to customer data to sales header.
    /// </summary>
    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyBillToCustomerToSalesHeader(var SalesHeader: Record "Sales Header"; Customer: Record Customer)
    begin
    end;
}