Ga naar inhoud

Het B2Brouter-contact-Page-Part integreren

Met het Page Part B2Brouter koppelt u een Business Central-klant op een eigen klantpagina aan een contact in uw B2Brouter-account. Zoals op de standaard Klantenkaart kunt u contacten zoeken, maken en bijwerken, Peppol-ontvangers controleren en transport- en documenttypen instellen.

Vereisten en toepassingsgebied

  • Installeer en licentieer Document Dispatch en richt de gebruikerstoegang in. Neem Document Dispatch en CORE by Simova op als afhankelijkheden in app.json. Gebruik de ID's, uitgever en compatibele versies van de geïnstalleerde apps en download hun symbolen.
  • Stel account-ID en API-sleutel in bij B2Brouter-module-instellingen. De testmodus gebruikt staging; anders wordt productie gebruikt. De zichtbaarheidscontrole in het voorbeeld controleert alleen een aanwezig account-ID, zonder de geselecteerde verbinding te valideren.
  • Gebruikers hebben toegang nodig tot de hoofdpagina en Customer, plus passende Document Dispatch-machtigingen. SIM_EDS USER en SIM_EDS ADMIN bevatten het Page Part, de contacttabel en de beheercodeunit. Zichtbaarheid verleent geen machtigingen.
  • Gebruik een opgeslagen klant met een ingevuld nummer. Pas object-ID 50100, namen en bijschriften aan uw oplossing aan.

Eigen pagina's op basis van Customer

De volledige werking vereist momenteel SourceTable = Customer. Hoewel SetContext een tabel-ID accepteert, halen Contact maken, Contact bijwerken en routeringswijzigingen intern een Customer op via het opgegeven nummer. Ook de bevestiging zoekt de koppeling met Database::Customer. Een willekeurige eigen tabel-ID maakt deze acties niet geschikt voor die tabel. Koppel een andere entiteit eerst aan een echte klant en geef het nummer, tabel-ID en de gegevens van die klant door.

Objecten en opgeslagen gegevens

Het ingesloten object is pagina 5492741, SIM_EDS B2Brouter Contact LP. Ondanks het achtervoegsel LP is het PageType CardPart. De brontabel is 5492683, SIM_EDS B2Brouter Contact, met SourceTableTemporary = true.

Het Page Part gebruikt een tijdelijke regel en leest de blijvende configuratie via de samengestelde sleutel No. + Table Id. Pagina's met dezelfde klantsleutel delen de koppeling. Opgeslagen worden contact-ID, zoekinstellingen en resultaten, transport-/documenttype en openstaande routeringswijzigingen. De sleutel bevat geen account of omgeving: wisselen van testmodus selecteert niet automatisch een afzonderlijke lokale koppeling. Controleer het gekoppelde contact in het geselecteerde account.

Het Page Part vullen met SetContext

SubPageLink koppelt het Page Part aan de klantsleutel. Roep daarnaast de openbare procedure SetContext aan om de tijdelijke regel en zoekvariabelen te vullen. Alleen SubPageLink is onvoldoende.

procedure SetContext(ParamNoCode: Code[50]; ParamTableIdInteger: Integer;
    ParamNameText: Text; ParamCountryCodeText: Text;
    ParamSchemeCodeText: Text; ParamIdentifierText: Text; ParamEmailText: Text)
Parameter Type Waarde en doel
ParamNoCode Code[50] Rec."No.": klantnummer en eerste deel van de sleutel.
ParamTableIdInteger Integer Database::Customer: tweede sleuteldeel; moet overeenkomen met SubPageLink.
ParamNameText Text Rec.Name: zoektekst voor contacten.
ParamCountryCodeText Text Rec."Country/Region Code": land voor de zoekopdracht.
ParamSchemeCodeText Text '' voor zoeken op btw-nummer en land, of een geldige B2Brouter-schemacode. Het Page Part accepteert maximaal 100 tekens.
ParamIdentifierText Text Rec."VAT Registration No.": standaardidentificatie voor de zoekopdracht.
ParamEmailText Text Rec."E-Mail": wordt gebruikt bij de beschikbare transportkeuzes.

Elke aanroep bouwt de tijdelijke regel opnieuw op en laadt een bestaande koppeling. Opgeslagen Directory Scheme Code vervangt het doorgegeven schema. Een ingevulde opgeslagen Lookup Identifier wordt gebruikt als er een schema is geselecteerd; anders geldt de doorgegeven standaardidentificatie. Het Page Part beheert de keuze en validatie van het schema. Een leeg doorgegeven schema wist geen opgeslagen keuze.

Een klant openen of naar een andere klant gaan maakt geen blijvende koppeling aan. Zoekinstellingen opslaan, een contact koppelen/maken of het register controleren kan dat wel doen. Voor een gekoppeld contact kan SetContext routeringsgegevens bij B2Brouter ophalen. De geladen context wordt bewaard om een nieuwe aanvraag bij elke veldvalidatie te voorkomen; de aanroep is dus niet uitsluitend lokaal.

Volledig voorbeeld: eigen klantenkaart

Deze zelfstandige pagina gebruikt Customer en plaatst het Page Part in een groep B2Brouter. De context wordt bijgewerkt bij een andere huidige record en na wijzigingen. De tien overgedragen velden vragen alleen een externe update als hun waarde werkelijk verandert.

page 50100 "My B2Brouter Customer Card"
{
    PageType = Card;
    SourceTable = Customer;
    ApplicationArea = All;
    Caption = 'My Customer Card';

    layout
    {
        area(Content)
        {
            group(General)
            {
                Caption = 'General';
                field(CustomerNo; Rec."No.")
                {
                    ApplicationArea = All;
                }
                field(Name; Rec.Name)
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec.Name <> xRec.Name);
                    end;
                }
                field(Address; Rec."Address")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."Address" <> xRec."Address");
                    end;
                }
                field(Address2; Rec."Address 2")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."Address 2" <> xRec."Address 2");
                    end;
                }
                field(PostCode; Rec."Post Code")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."Post Code" <> xRec."Post Code");
                    end;
                }
                field(City; Rec."City")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."City" <> xRec."City");
                    end;
                }
                field(County; Rec."County")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."County" <> xRec."County");
                    end;
                }
                field(CountryCode; Rec."Country/Region Code")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."Country/Region Code" <> xRec."Country/Region Code");
                    end;
                }
                field(VATRegistrationNo; Rec."VAT Registration No.")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."VAT Registration No." <> xRec."VAT Registration No.");
                    end;
                }
                field(Email; Rec."E-Mail")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."E-Mail" <> xRec."E-Mail");
                    end;
                }
                field(PhoneNo; Rec."Phone No.")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        HandleCustomerChange(Rec."Phone No." <> xRec."Phone No.");
                    end;
                }
            }
            group(B2Brouter)
            {
                Caption = 'B2Brouter';
                Visible = B2BrouterVisible;
                part(B2BrouterContact; "SIM_EDS B2Brouter Contact LP")
                {
                    ApplicationArea = All;
                    SubPageLink = "No." = field("No."),
                                  "Table Id" = const(Database::Customer);
                }
            }
        }
    }

    trigger OnOpenPage()
    var
        EDSSetup: Record "SIM_EDS Setup";
        COREManagement: Codeunit "SIM_CORE Mgt";
    begin
        if not COREManagement.CheckPermissions(
            UserSecurityId(), 'SIM_EDS USER | SIM_EDS ADMIN | SUPER')
        then
            exit;
        if not EDSSetup.Get() then
            exit;
        B2BrouterVisible := (EDSSetup."B2Brouter Account Id" <> '') or
            (EDSSetup."B2Brouter Account Id Staging" <> '');
    end;

    trigger OnAfterGetCurrRecord()
    begin
        UpdateB2BrouterContext();
    end;

    trigger OnModifyRecord(): Boolean
    begin
        UpdateB2BrouterContext();
        exit(true);
    end;

    local procedure UpdateB2BrouterContext()
    begin
        if not B2BrouterVisible then
            exit;
        CurrPage.B2BrouterContact.Page.SetContext(
            Rec."No.", Database::Customer, Rec.Name,
            Rec."Country/Region Code", '',
            Rec."VAT Registration No.", Rec."E-Mail");
    end;

    local procedure HandleCustomerChange(Changed: Boolean)
    begin
        UpdateB2BrouterContext();
        if B2BrouterVisible and Changed then
            CurrPage.B2BrouterContact.Page.ConfirmCustomerContactUpdate(Rec);
    end;

    var
        B2BrouterVisible: Boolean;
}

Het voorbeeld aanpassen

  • Integreer groep, variabelen, procedures en triggers in uw eigen Customer-pagina. Gebruik in een Page Extension addlast(Content) of een geschikte addafter(...)-positie. Breid veldvalidaties uit met modify(...) en OnAfterValidate, met HandleCustomerChange(Rec.<veld> <> xRec.<veld>).
  • CurrPage.B2BrouterContact.Page... verwijst naar de controlenaam in part(B2BrouterContact; ...), niet naar de objectnaam van de ingesloten pagina.
  • Roep SetContext aan in OnAfterGetCurrRecord, zodat navigeren de juiste koppeling toont. Vernieuw de context ook na wijzigingen van naam, land, btw-nummer of e-mail en na opslaan. Behoud bestaande validatie- en opslaglogica.
  • Verwerk voor hetzelfde gedrag als de standaardkaart Naam, Adres, Adres 2, Postcode, Plaats, Regio, Land-/regiocode, Btw-nummer, E-mail en Telefoonnummer. Geef na het vernieuwen van de context de volledige huidige klant, inclusief nog niet opgeslagen veldwijzigingen, door aan ConfirmCustomerContactUpdate(ParamRecordCustomer: Record Customer). Deze openbare procedure vraagt toestemming voor het bijwerken van een gekoppeld contact. Bij weigering of een fout blijft de BC-wijziging behouden.
  • Vraag geen bevestiging bij alleen openen, navigeren of ongewijzigd opslaan. Het OnModifyRecord in het voorbeeld vernieuwt uitsluitend de context. Het Page Part beheert de eigen acties; de hoofdpagina roept geen interne procedures van SIM_EDS B2Brouter Contact Mgt aan.
  • De standaardklantenkaart bevat dit Page Part al. Voeg het toe aan uw eigen pagina zonder het op de standaardkaart te dupliceren.

Beschikbare functies

Lookup Contact selecteert een bestaand accountcontact. Create Contact gebruikt opgeslagen klantgegevens, inclusief adres en telefoon; sla de klant vooraf op. Update Contact verstuurt de huidige gegevens na bevestiging. De hoofdpagina heeft alleen de twee beschreven openbare procedures nodig.

Laat voor Check Peppol Receiver het schema leeg om btw-nummer en land te gebruiken, of selecteer een schema met identificatie. Resultaat en tijdstip worden opgeslagen. Na wijziging van land, schema of identificatie meldt de status gewijzigde gegevens totdat u opnieuw controleert. Ontvangerregistratie en een koppeling met een accountcontact zijn afzonderlijke resultaten.

Transporttype en Documenttype worden voor een gekoppeld contact geladen. Gebruik de keuzelijsten voor ondersteunde waarden en kies eerst het transport. Voor Peppol moeten de ontvangerformaten voor de huidige identificatie bevestigd zijn. Routeringswijzigingen vragen bevestiging; bij weigering of een fout blijven ze als Routing Changes Pending openstaan. Update Contact verstuurt ze opnieuw. Refresh Contact haalt externe waarden op en vraagt bevestiging voordat openstaande wijzigingen worden verworpen. Deze instellingen vervangen het verzendprofiel of de JSON-schema-inrichting niet.

De integratie controleren

  1. Open een opgeslagen klant zonder koppeling: het zichtbare Page Part toont de context zonder alleen door het openen een contact aan te maken.
  2. Wissel tussen twee klanten en open de pagina opnieuw. Controleer elke koppeling en de opgeslagen zoekinstellingen.
  3. Koppel een contact, controleer een ontvanger en maak voor een andere opgeslagen klant een contact in het ingestelde testaccount. Controleer de gegevens in B2Brouter.
  4. Wijzig elk overgedragen veld. Een echte wijziging van een gekoppelde klant moet een update aanbieden; openen en ongewijzigd opslaan mogen dit niet doen. Test bevestigen en weigeren.
  5. Wijzig de routering, weiger de overdracht en probeer opnieuw met Update Contact. Test Refresh Contact bij openstaande wijzigingen en de ontvangerstatus na wijziging van identificatie/land.
Symptoom Controle
Page Part verborgen Machtigingen, instellingsrecord, zichtbaarheidsvariabele en productie-/staging-account-ID's.
Lege of verkeerde context Rec, controlenaam, OnAfterGetCurrRecord, alle zeven SetContext-argumenten en overeenkomende SubPageLink-sleutel.
Klant ontbreekt bij een actie Opgeslagen klantnummer en Database::Customer; de volledige werking ondersteunt geen willekeurige tabel-ID's.
Verbindingsfout of geen routeringskeuzes Omgeving/account/API-sleutel, gekoppeld contact, land/schema/identificatie en ontvangerformaten.
Herhaalde bevestigingen Alleen bevestigen bij echte veldwijzigingen, niet vanuit navigatie- of opslagtriggers.

Zie ook