diff --git a/Apps/W1/MultipleVATNumbers/AltCustVATRegDocImpl.Codeunit.al b/Apps/W1/MultipleVATNumbers/AltCustVATRegDocImpl.Codeunit.al new file mode 100644 index 0000000000..1ef975981e --- /dev/null +++ b/Apps/W1/MultipleVATNumbers/AltCustVATRegDocImpl.Codeunit.al @@ -0,0 +1,347 @@ +// ------------------------------------------------------------------------------------------------ +// 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.Sales.Customer; +using Microsoft.Sales.Document; +using System.Diagnostics; +using System.Environment.Configuration; +using System.Telemetry; + +codeunit 205 "Alt. Cust. VAT Reg. Doc. Impl." implements "Alt. Cust. VAT Reg. Doc." +{ + Access = Internal; + InherentEntitlements = X; + InherentPermissions = X; + EventSubscriberInstance = Manual; + + var + AltCustVATRegFacade: Codeunit "Alt. Cust. VAT. Reg. Facade"; + FeatureTelemetry: Codeunit "Feature Telemetry"; + SalesLinesRecreated: Boolean; + InstructionTxt: Label 'The following data is taken from the Alternative VAT Registration setup. It will override values in the document and affect the posting. Do you want to continue?'; + DocumentValueTxt: Label 'Document value'; + AlternativeValueTxt: Label 'Alternative value'; + CannotChangeVATDataWhenPrepmtErr: Label 'You cannot make this change because it leads to a different VAT Registration No., Gen. Bus. Posting Group or VAT Bus. Posting Group than in the sales document. Since you have posted a prepayment invoice, such a change will cause an inconsistency in the ledger entries.'; + CannotChangeVATDataWhenPartiallyPostedErr: Label 'You cannot make this change because it leads to a different VAT Registration No., Gen. Bus. Posting Group or VAT Bus. Posting Group than in the sales document. Since you have posted a partial shipment, such a change will cause an inconsistency in the ledger entries.'; + VATDataTakenFromCustomerMsg: Label 'The VAT Country/Region code has been changed to the value that does not have an alternative VAT registration.\\The following fields have been updated from the customer card: %1', Comment = '%1 = list of the fields'; + FeatureNameTxt: Label 'Alternative Customer VAT Registration', Locked = true; + ConfirmAltCustVATRegNotificationNameTok: Label 'Confirm an alternative customer VAT registration.'; + ConfirmAltCustVATRegNotificationDescTok: Label 'Show the user the page to confirm an alternative customer VAT registration when choosing either ship-to address or the VAT country different from the customer''s'; + AddAlternativeCustVATRegQst: Label 'The VAT country is different than the customer''s. Do you want to add an alternative VAT registration for this VAT country?'; + AddAlternativeCustVATRegMsg: Label 'Add'; + DontShowMsg: Label 'Don''t show'; + AddAltCustVATRegNotificationNameTok: Label 'Suggest an alternative customer VAT registration from sales document'; + AddAltCustVATRegNotificationDescTok: Label 'Suggest the user to add an alternative customer VAT registration when choosing a VAT country different from the customer''s'; + + procedure Init(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + begin + if xSalesHeader."Bill-to Customer No." = '' then + exit; + SalesHeader.Validate("Alt. VAT Registration No.", false); + SalesHeader.Validate("Alt. Gen. Bus Posting Group", false); + SalesHeader.Validate("Alt. VAT Bus Posting Group", false); + end; + + procedure CopyFromCustomer(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + var + Customer: Record Customer; + begin + if not IsAltVATRegUsed(SalesHeader) then + exit; + RunChecks(SalesHeader); + Customer.SetLoadFields("Country/Region Code", "VAT Registration No.", "Gen. Bus. Posting Group", "VAT Bus. Posting Group"); + if not GetCustVATCalc(Customer, SalesHeader) then + exit; + CopyFromCustomer(SalesHeader, xSalesHeader, Customer); + end; + + local procedure CopyFromCustomer(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header"; Customer: Record Customer) + var + ChangedFieldsList: Text; + begin + if (SalesHeader."Alt. VAT Registration No." or SalesHeader."Alt. VAT Bus Posting Group") and + (SalesHeader."VAT Country/Region Code" <> Customer."Country/Region Code") and + (xSalesHeader."VAT Country/Region Code" = SalesHeader."VAT Country/Region Code") + then begin + SalesHeader."VAT Country/Region Code" := Customer."Country/Region Code"; + AddStringToCommaSeparatedList(ChangedFieldsList, SalesHeader.FieldCaption("VAT Country/Region Code")); + end; + if SalesHeader."Alt. VAT Registration No." then begin + SalesHeader.Validate("Alt. VAT Registration No.", false); + SalesHeader.Validate("VAT Registration No.", Customer."VAT Registration No."); + AddStringToCommaSeparatedList(ChangedFieldsList, SalesHeader.FieldCaption("VAT Registration No.")); + end; + if SalesHeader."Alt. Gen. Bus Posting Group" then begin + SalesHeader.Validate("Alt. Gen. Bus Posting Group", false); + SalesHeader.Validate("Gen. Bus. Posting Group", Customer."Gen. Bus. Posting Group"); + AddStringToCommaSeparatedList(ChangedFieldsList, SalesHeader.FieldCaption("Gen. Bus. Posting Group")); + end; + if SalesHeader."Alt. VAT Bus Posting Group" then begin + SalesHeader.Validate("Alt. VAT Bus Posting Group", false); + SalesHeader.Validate("VAT Bus. Posting Group", Customer."VAT Bus. Posting Group"); + AddStringToCommaSeparatedList(ChangedFieldsList, SalesHeader.FieldCaption("VAT Bus. Posting Group")); + end; + if GuiAllowed() then + Message(VATDataTakenFromCustomerMsg, ChangedFieldsList); + end; + + procedure UpdateSetupOnShipToCountryChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + var + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + VATCustomer: Record Customer; + begin + GetCustVATCalc(VATCustomer, SalesHeader); + if AltCustVATRegFacade.GetAlternativeCustVATReg(AltCustVATReg, VATCustomer."No.", SalesHeader."Ship-to Country/Region Code") then + SalesHeader.Validate("VAT Country/Region Code", AltCustVATReg."VAT Country/Region Code") + else + CopyFromCustomer(SalesHeader, xSalesHeader); + end; + + procedure UpdateSetupOnVATCountryChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + var + Customer: Record Customer; + begin + if AlternativeCustVATRegIsBlank(SalesHeader) then begin + CopyFromCustomer(SalesHeader, xSalesHeader); + if not GetCustVATCalc(Customer, SalesHeader) then + exit; + if Customer."Country/Region Code" = SalesHeader."VAT Country/Region Code" then + exit; + ThrowAddAltCustVATRegNotification(Customer."No.", SalesHeader."VAT Country/Region Code"); + exit; + end; + RunChecks(SalesHeader); + if SalesHeader.SystemCreatedAt <> 0DT then + if not ConfirmChanges(SalesHeader) then + error(''); + UpdateAltCustVATRegInSalesHeader(SalesHeader); + end; + + procedure UpdateSetupOnBillToCustomerChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header"; BillToCustomer: Record Customer) + var + GLSetup: Record "General Ledger Setup"; + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + begin + GLSetup.Get(); + if GLSetup."Bill-to/Sell-to VAT Calc." <> GLSetup."Bill-to/Sell-to VAT Calc."::"Bill-to/Pay-to No." then + exit; + + if IsAltVATRegUsed(SalesHeader) then begin + if SalesHeader."Bill-to Customer No." = SalesHeader."Sell-to Customer No." then + exit; + CopyFromCustomer(SalesHeader, xSalesHeader, BillToCustomer); + exit; + end; + if AltCustVATRegFacade.GetAlternativeCustVATReg(AltCustVATReg, BillToCustomer."No.", SalesHeader."Ship-to Country/Region Code") then begin + SalesHeader.Validate("VAT Country/Region Code", AltCustVATReg."VAT Country/Region Code"); + exit; + end; + AltCustVATRegFacade.CopyBillToCustomerToSalesHeader(SalesHeader, BillToCustomer); + end; + + local procedure IsAltVATRegUsed(SalesHeader: Record "Sales Header"): Boolean + begin + exit(SalesHeader."Alt. VAT Registration No." or SalesHeader."Alt. Gen. Bus Posting Group" or SalesHeader."Alt. VAT Bus Posting Group"); + end; + + local procedure AlternativeCustVATRegIsBlank(SalesHeader: Record "Sales Header"): Boolean + var + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + begin + exit(not GetAlternativeCustVATReg(AltCustVATReg, SalesHeader)); + end; + + local procedure GetAlternativeCustVATReg(var AltCustVATReg: Record "Alt. Cust. VAT Reg."; SalesHeader: Record "Sales Header"): Boolean + var + Customer: Record Customer; + begin + Customer.SetLoadFields("No."); + GetCustVATCalc(Customer, SalesHeader); + exit(AltCustVATRegFacade.GetAlternativeCustVATReg(AltCustVATReg, Customer."No.", SalesHeader."VAT Country/Region Code")); + end; + + local procedure ConfirmChanges(var SalesHeader: Record "Sales Header") Confirmed: Boolean + var + TempChangeLogEntry: Record "Change Log Entry" temporary; + ConfirmAltCustVATRegPage: Page "Confirm Alt. Cust. VAT Reg."; + begin + FeatureTelemetry.LogUsage('0000NHM', FeatureNameTxt, 'Confirm changes'); + if not BuildFieldChangeBuffer(TempChangeLogEntry, SalesHeader) then + exit(true); + if not GuiAllowed() then + exit(true); + if SalesHeader.GetHideValidationDialog() then + exit(true); + if not ShowConfirmation() then + exit(true); + ConfirmAltCustVATRegPage.SetUIControls(InstructionTxt, DocumentValueTxt, AlternativeValueTxt); + ConfirmAltCustVATRegPage.SetSource(TempChangeLogEntry); + Confirmed := ConfirmAltCustVATRegPage.RunModal() = Action::Ok; + if ConfirmAltCustVATRegPage.DontShowAgainOptionSelected() then + DisableConfirmation(); + exit(Confirmed); + end; + + local procedure ShowConfirmation(): Boolean + var + MyNotifications: Record "My Notifications"; + begin + if Database.IsInWriteTransaction() then + exit(false); + exit(MyNotifications.IsEnabled(GetConfirmChangesNotificationId())); + end; + + local procedure DisableConfirmation() + var + MyNotifications: Record "My Notifications"; + begin + if not MyNotifications.Disable(GetConfirmChangesNotificationId()) then + MyNotifications.InsertDefault(GetConfirmChangesNotificationId(), ConfirmAltCustVATRegNotificationNameTok, ConfirmAltCustVATRegNotificationDescTok, false); + end; + + local procedure UpdateAltCustVATRegInSalesHeader(var SalesHeader: Record "Sales Header") + var + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + begin + GetAlternativeCustVATReg(AltCustVATReg, SalesHeader); + BindSubscription(this); + AltCustVATRegFacade.CopyAltCustVATRegToSalesHeader(SalesHeader, AltCustVATReg); + UnbindSubscription(this); + FeatureTelemetry.LogUptake('0000NHG', FeatureNameTxt, Enum::"Feature Uptake Status"::Used); + end; + + local procedure BuildFieldChangeBuffer(var TempChangeLogEntry: Record "Change Log Entry" temporary; SalesHeader: Record "Sales Header"): Boolean + var + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + begin + GetAlternativeCustVATReg(AltCustVATReg, SalesHeader); + AltCustVATRegFacade.AddTempChangeLogEntryForAltCustVATRegChanges(TempChangeLogEntry, SalesHeader, AltCustVATReg); + exit(not TempChangeLogEntry.IsEmpty()); + end; + + local procedure RunChecks(SalesHeader: Record "Sales Header") + begin + CheckPrepayment(SalesHeader); + CheckPartialPosting(SalesHeader); + end; + + local procedure CheckPrepayment(SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetFilter("Prepmt. Amt. Inv.", '<>%1', 0); + if not SalesLine.IsEmpty() then + error(CannotChangeVATDataWhenPrepmtErr); + end; + + local procedure CheckPartialPosting(SalesHeader: Record "Sales Header") + var + SalesLine: Record "Sales Line"; + begin + SalesLine.SetRange("Document Type", SalesHeader."Document Type"); + SalesLine.SetRange("Document No.", SalesHeader."No."); + SalesLine.SetFilter("Quantity Shipped", '<>%1', 0); + if not SalesLine.IsEmpty() then + error(CannotChangeVATDataWhenPartiallyPostedErr); + end; + + local procedure GetCustVATCalc(var VATCustomer: Record Customer; SalesHeader: Record "Sales Header"): Boolean + var + GLSetup: Record "General Ledger Setup"; + begin + GLSetup.GetRecordOnce(); + case GLSetup."Bill-to/Sell-to VAT Calc." of + GLSetup."Bill-to/Sell-to VAT Calc."::"Bill-to/Pay-to No.": + begin + if not VATCustomer.Get(SalesHeader."Bill-to Customer No.") then + exit(VATCustomer.Get(SalesHeader."Sell-to Customer No.")); + exit(true); + end; + GLSetup."Bill-to/Sell-to VAT Calc."::"Sell-to/Buy-from No.": + exit(VATCustomer.Get(SalesHeader."Sell-to Customer No.")); + end; + end; + + local procedure GetConfirmChangesNotificationId(): Guid + begin + exit('5a911b76-547b-49f4-ba6f-ffc64d75077d'); + end; + + local procedure AddStringToCommaSeparatedList(var List: Text; Value: Text) + begin + if List <> '' then + List += ', '; + List += Value; + end; + + local procedure ThrowAddAltCustVATRegNotification(CustNo: Code[20]; VATCountryRegionCode: Code[10]) + var + MyNotifications: Record "My Notifications"; + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + Notification: Notification; + begin + if not MyNotifications.IsEnabled(AddAltCustVATRegNotificationId()) then + exit; + Notification.Id(AddAltCustVATRegNotificationId()); + Notification.Message(AddAlternativeCustVATRegQst); + Notification.SetData(AltCustVATReg.FieldName("Customer No."), CustNo); + Notification.SetData(AltCustVATReg.FieldName("VAT Country/Region Code"), VATCountryRegionCode); + Notification.AddAction(AddAlternativeCustVATRegMsg, Codeunit::"Alt. Cust. VAT Reg. Doc. Impl.", 'AddAltCustVATRegFromNotification'); + Notification.AddAction(DontShowMsg, Codeunit::"Alt. Cust. VAT Reg. Doc. Impl.", 'DisableAddAltCustVATRegNotification'); + Notification.Send(); + end; + + procedure AddAltCustVATRegFromNotification(Notification: Notification) + var + AltCustVATReg: Record "Alt. Cust. VAT Reg."; + NewId: Integer; + begin + if AltCustVATReg.FindLast() then + NewId := AltCustVATReg.Id; + NewId += 1; + AltCustVATReg.Init(); + AltCustVATReg.Validate(Id, NewId); + AltCustVATReg.Validate("Customer No.", + CopyStr(Notification.GetData(AltCustVATReg.FieldName("Customer No.")), 1, MaxStrLen(AltCustVATReg."Customer No."))); + AltCustVATReg.Validate("VAT Country/Region Code", + CopyStr(Notification.GetData(AltCustVATReg.FieldName("VAT Country/Region Code")), 1, MaxStrLen(AltCustVATReg."VAT Country/Region Code"))); + AltCustVATReg.Insert(true); + Commit(); + Page.RunModal(0, AltCustVATReg); + end; + + procedure DisableAddAltCustVATRegNotification(Notification: Notification) + var + MyNotifications: Record "My Notifications"; + begin + if not MyNotifications.Disable(Notification.Id()) then + MyNotifications.InsertDefault(Notification.Id(), AddAltCustVATRegNotificationNameTok, AddAltCustVATRegNotificationDescTok, false); + end; + + local procedure AddAltCustVATRegNotificationId(): Text + begin + exit('44c9f482-ed1e-4882-9c96-3135915b566d') + end; + + [EventSubscriber(ObjectType::Table, Database::"Sales Header", 'OnRecreateSalesLinesOnBeforeConfirm', '', false, false)] + local procedure AvoidDoubleConfirmationOnRecreateSalesLinesOnBeforeConfirm(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header"; var Confirmed: Boolean; var IsHandled: Boolean) + begin + if not SalesLinesRecreated then + exit; + Confirmed := true; + IsHandled := true; + SalesLinesRecreated := false; + end; + + [EventSubscriber(ObjectType::Table, Database::"Sales Header", 'OnAfterRecreateSalesLines', '', false, false)] + local procedure SetSalesLineRecreatedOnAfterRecreateSalesLines() + begin + SalesLinesRecreated := true; + end; +} \ No newline at end of file diff --git a/Apps/W1/MultipleVATNumbers/AltCustVATRegFacade.Codeunit.al b/Apps/W1/MultipleVATNumbers/AltCustVATRegFacade.Codeunit.al new file mode 100644 index 0000000000..2566087869 --- /dev/null +++ b/Apps/W1/MultipleVATNumbers/AltCustVATRegFacade.Codeunit.al @@ -0,0 +1,257 @@ +// ------------------------------------------------------------------------------------------------ +// 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; + +/// +/// Facade for alternative customer VAT registration functionality in sales documents. +/// Provides simplified interface for VAT registration management across different shipping scenarios and country changes. +/// +codeunit 200 "Alt. Cust. VAT. Reg. Facade" +{ + Access = Public; + + var + AltCustVATRegOrchestrator: Codeunit "Alt. Cust. VAT Reg. Orchest."; + + /// + /// Updates VAT setup when ship-to country/region changes in sales header. + /// + /// Sales header being modified + /// Original sales header before changes + procedure UpdateSetupOnShipToCountryChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + begin + AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().UpdateSetupOnShipToCountryChangeInSalesHeader(SalesHeader, xSalesHeader); + end; + + /// + /// Updates VAT setup when VAT country/region changes in sales header. + /// + /// Sales header being modified + /// Original sales header before changes + procedure UpdateSetupOnVATCountryChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + begin + AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().UpdateSetupOnVATCountryChangeInSalesHeader(SalesHeader, xSalesHeader); + end; + + /// + /// Updates VAT setup when bill-to customer changes in sales header. + /// + /// Sales header being modified + /// Original sales header before changes + /// New bill-to customer record + procedure UpdateSetupOnBillToCustomerChangeInSalesHeader(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header"; BillToCustomer: Record Customer) + begin + AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().UpdateSetupOnBillToCustomerChangeInSalesHeader(SalesHeader, xSalesHeader, BillToCustomer); + end; + + /// + /// Copies alternative VAT registration settings from customer to sales header. + /// + /// Sales header to update with customer VAT settings + /// Original sales header before changes + procedure CopyFromCustomer(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + begin + AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().CopyFromCustomer(SalesHeader, xSalesHeader); + end; + + /// + /// Initializes alternative VAT registration setup for sales header. + /// + /// Sales header to initialize with VAT registration settings + /// Original sales header before changes + procedure Init(var SalesHeader: Record "Sales Header"; xSalesHeader: Record "Sales Header") + begin + AltCustVATRegOrchestrator.GetAltCustVATRegDocImpl().Init(SalesHeader, xSalesHeader); + end; + + /// + /// Retrieves alternative customer VAT registration record for specified customer and country. + /// + /// Alternative customer VAT registration record to populate + /// Customer number to search for + /// Country/region code for VAT registration + /// True if alternative VAT registration record found + 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; + + /// + /// Determines whether customer VAT registration number should be updated from sales header. + /// + /// Sales header containing VAT registration information + /// Customer record to potentially update + /// True if customer VAT registration should be updated + 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; + + /// + /// Determines whether VAT data has changed during ship-to code validation. + /// + /// Current sales header + /// Original sales header before changes + /// True if VAT-related data has changed + 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; + + /// + /// Handles country/region change events in ship-to address records. + /// + /// Ship-to address record with country/region change + procedure HandleCountryChangeInShipToAddress(ShipToAddress: Record "Ship-to Address") + begin + AltCustVATRegOrchestrator.GetShipToAlCustVATRegImpl().HandleCountryChangeInShipToAddress(ShipToAddress); + end; + + /// + /// Validates consistency of alternative customer VAT registration setup. + /// + /// Alternative customer VAT registration record to validate + procedure CheckAltCustVATRegConsistent(AltCustVATReg: Record "Alt. Cust. VAT Reg.") + begin + AltCustVATRegOrchestrator.GetAltCustVATRegConsistencyImpl().CheckAltCustVATRegConsistent(AltCustVATReg); + end; + + /// + /// Validates consistency of customer VAT registration setup across all alternative registrations. + /// + /// Customer record to validate for VAT registration consistency + procedure CheckCustomerConsistency(Customer: Record Customer) + begin + AltCustVATRegOrchestrator.GetAltCustVATRegConsistencyImpl().CheckCustomerConsistency(Customer); + end; + + /// + /// Copies the alternative customer VAT registration data to the sales header. + /// + 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; + + /// + /// Adds a record to the temporary change log entry if values of alternative customer VAT registration fields have changed. + /// + 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); + end; + + /// + /// Copies the bill-to customer data to sales header. + /// + 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; + + /// + /// Integration event raised before determining whether to update customer VAT registration number from sales header. + /// + /// Sales header containing VAT registration information + /// Customer record to potentially update + /// Set to true if customer VAT registration should be updated + /// Set to true to skip standard logic + [IntegrationEvent(false, false)] + local procedure OnBeforeUpdateVATRegNoInCustFromSalesHeader(var SalesHeader: Record "Sales Header"; Customer: Record Customer; var ShouldUpdate: Boolean; var IsHandled: Boolean) + begin + end; + + /// + /// Integration event raised before determining whether VAT data has changed during ship-to code validation. + /// + /// Current sales header + /// Original sales header before changes + /// Set to true if VAT data has changed + /// Set to true to skip standard logic + [IntegrationEvent(false, false)] + local procedure OnBeforeVATDataIsChangedOnShipToCodeValidation(var SalesHeader: Record "Sales Header"; var xSalesHeader: Record "Sales Header"; var Changed: Boolean; var IsHandled: Boolean) + begin + end; + + /// + /// Integration event raised after copying alternative customer VAT registration data to sales header. + /// + [IntegrationEvent(false, false)] + local procedure OnAfterCopyAltCustVATRegToSalesHeader(var SalesHeader: Record "Sales Header"; var AltCustVATReg: Record "Alt. Cust. VAT Reg.") + begin + end; + + /// + /// Integration event raised after adding temporary change log entries for alternative customer VAT registration changes. + /// + [IntegrationEvent(false, false)] + local procedure OnAfterAddTempChangeLogEntryForAltCustVATRegChanges(var TempChangeLogEntry: Record "Change Log Entry" temporary; SalesHeader: Record "Sales Header"); + begin + end; + + /// + /// Integration event raised after copying bill-to customer data to sales header. + /// + [IntegrationEvent(false, false)] + local procedure OnAfterCopyBillToCustomerToSalesHeader(var SalesHeader: Record "Sales Header"; Customer: Record Customer) + begin + end; +} \ No newline at end of file