Saltar al contenido

Integrar el Page Part de contactos B2Brouter

El Page Part B2Brouter vincula un cliente de Business Central con un contacto de su cuenta B2Brouter desde una página personalizada. Como en la Ficha de cliente estándar, permite buscar, crear y actualizar contactos, comprobar receptores Peppol y configurar los tipos de transporte y documento.

Requisitos y alcance

  • Instale Document Dispatch, active su licencia y configure el acceso de usuarios. Incluya Document Dispatch y CORE by Simova en las dependencias de app.json, con los IDs, el editor y las versiones compatibles de las aplicaciones instaladas. Descargue sus símbolos.
  • Configure cuenta y clave API en la Configuración del módulo B2Brouter. El modo de prueba utiliza staging; de lo contrario se utiliza producción. La condición de visibilidad del ejemplo solo comprueba que exista un ID de cuenta, sin validar la conexión seleccionada.
  • Los usuarios necesitan acceso a la página principal y a Customer, además de los permisos de Document Dispatch. SIM_EDS USER y SIM_EDS ADMIN incluyen el Page Part, su tabla de contactos y la codeunit de gestión. La visibilidad no concede permisos.
  • Utilice un cliente guardado con un número no vacío. Adapte el ID de objeto 50100, los nombres y los títulos a su solución.

Páginas personalizadas basadas en Customer

El flujo completo requiere actualmente SourceTable = Customer. Aunque SetContext acepta un ID de tabla, Crear contacto, Actualizar contacto y los cambios de enrutamiento recuperan internamente un Customer mediante el número recibido. La confirmación también busca la vinculación con Database::Customer. Pasar un ID de tabla personalizada independiente no adapta estas acciones a dicha tabla. Para otra entidad, defina primero su correspondencia con un cliente real y pase el número, ID de tabla y datos de ese cliente.

Objetos y almacenamiento

El objeto integrado es la página 5492741, SIM_EDS B2Brouter Contact LP. A pesar del sufijo LP, su PageType es CardPart. Su origen es la tabla 5492683, SIM_EDS B2Brouter Contact, con SourceTableTemporary = true.

El Page Part muestra una fila temporal y lee la configuración persistente mediante la clave compuesta No. + Table Id. Las páginas con la misma clave de cliente comparten la vinculación. Se guardan el ID del contacto, los ajustes y resultados del directorio, los tipos de transporte/documento y el estado pendiente del enrutamiento. La clave no incluye cuenta ni entorno: cambiar el modo de prueba no selecciona automáticamente otra vinculación local. Compruebe el contacto en la cuenta seleccionada.

Rellenar el Page Part con SetContext

SubPageLink relaciona el Page Part con la clave del cliente. Además, debe llamar al procedimiento público SetContext para preparar la fila temporal y las variables de búsqueda. SubPageLink por sí solo no es suficiente.

procedure SetContext(ParamNoCode: Code[50]; ParamTableIdInteger: Integer;
    ParamNameText: Text; ParamCountryCodeText: Text;
    ParamSchemeCodeText: Text; ParamIdentifierText: Text; ParamEmailText: Text)
Parámetro Tipo Valor y finalidad
ParamNoCode Code[50] Rec."No.": número de cliente y primera parte de la clave.
ParamTableIdInteger Integer Database::Customer: segunda parte de la clave; debe coincidir con SubPageLink.
ParamNameText Text Rec.Name: texto para buscar contactos.
ParamCountryCodeText Text Rec."Country/Region Code": país para la búsqueda en el directorio.
ParamSchemeCodeText Text '' para buscar por NIF-IVA y país, o un esquema B2Brouter válido. El Page Part admite hasta 100 caracteres.
ParamIdentifierText Text Rec."VAT Registration No.": identificador predeterminado.
ParamEmailText Text Rec."E-Mail": se considera al ofrecer los tipos de transporte.

Cada llamada reconstruye la fila temporal y carga la vinculación existente. Directory Scheme Code guardado sustituye al esquema recibido. Se utiliza Lookup Identifier guardado si no está vacío y hay un esquema seleccionado; en caso contrario se utiliza el identificador predeterminado recibido. El Page Part gestiona la selección y validación del esquema. Un esquema vacío en la llamada no borra uno guardado.

Abrir o cambiar de cliente no crea una vinculación persistente. Guardar ajustes del directorio, vincular/crear un contacto o comprobar el directorio sí puede crearla. Para un contacto vinculado, SetContext puede consultar sus datos de enrutamiento en B2Brouter. El contexto cargado se conserva para evitar una nueva consulta en cada validación de campo; la llamada no es exclusivamente local.

Ejemplo completo: ficha de cliente personalizada

Esta página independiente utiliza Customer e incluye el Page Part en el grupo B2Brouter. Actualiza el contexto al cambiar de registro y después de editar. Los diez campos transferidos solicitan una actualización externa solo cuando cambia realmente su valor.

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;
}

Adaptar el ejemplo

  • Integre grupo, variables, procedimientos y triggers en su página de Customer. En una Page Extension, agregue el grupo con addlast(Content) o un anclaje addafter(...) adecuado. Amplíe las validaciones mediante modify(...) y OnAfterValidate, con HandleCustomerChange(Rec.<campo> <> xRec.<campo>).
  • CurrPage.B2BrouterContact.Page... se refiere al control part(B2BrouterContact; ...), no al nombre del objeto de página integrado.
  • Llame a SetContext en OnAfterGetCurrRecord para actualizar la vinculación al navegar. Actualice también el contexto después de cambiar nombre, país, NIF-IVA o correo y después de guardar. Conserve las validaciones y la lógica de guardado existentes.
  • Para reproducir la ficha estándar, gestione Nombre, Dirección, Dirección 2, Código postal, Población, Provincia, Código de país o región, NIF-IVA, Correo electrónico y Teléfono. Tras actualizar el contexto, pase el cliente actual completo, incluidas las modificaciones aún no guardadas, a ConfirmCustomerContactUpdate(ParamRecordCustomer: Record Customer). Este procedimiento público solicita confirmación antes de actualizar un contacto vinculado. Si se rechaza o falla, se conserva la edición de BC.
  • No solicite confirmación simplemente al abrir, navegar o guardar sin cambios. El OnModifyRecord del ejemplo solo actualiza el contexto. El Page Part gestiona sus acciones; la página principal no llama a procedimientos internos de SIM_EDS B2Brouter Contact Mgt.
  • La ficha de cliente estándar ya incluye este Page Part. Agréguelo a su propia página sin duplicarlo en la ficha estándar.

Funciones disponibles

Lookup Contact selecciona un contacto existente de la cuenta. Create Contact utiliza datos de cliente guardados, incluida la dirección y el teléfono; guarde antes el cliente. Update Contact transfiere los datos actuales tras la confirmación. La página principal solo necesita los dos procedimientos públicos descritos.

En Check Peppol Receiver, deje el esquema vacío para usar NIF-IVA y país o seleccione un esquema con su identificador. Se guardan el resultado y la fecha de comprobación. Si cambia el país, esquema o identificador, el estado indica datos modificados hasta repetir la comprobación. La disponibilidad del receptor y la vinculación con un contacto de la cuenta son resultados independientes.

Tipo de transporte y Tipo de documento se cargan para el contacto vinculado. Utilice las búsquedas de valores admitidos y seleccione primero el transporte. Para Peppol deben confirmarse los formatos del receptor para el identificador actual. Los cambios de enrutamiento solicitan confirmación; si se rechazan o fallan, quedan como Routing Changes Pending. Update Contact permite reintentarlos. Refresh Contact recarga los valores remotos y pide confirmación antes de descartar cambios pendientes. Estos ajustes no sustituyen el perfil de envío ni la configuración del esquema JSON.

Comprobar la integración

  1. Abra un cliente guardado sin vinculación: el Page Part debe mostrar su contexto sin crear un contacto solo por abrir la página.
  2. Cambie entre dos clientes y vuelva a abrir la página. Compruebe cada vinculación y sus ajustes guardados.
  3. Vincule un contacto, compruebe un receptor y cree un contacto para otro cliente guardado en la cuenta de prueba configurada. Verifique los datos en B2Brouter.
  4. Cambie cada campo transferido. Una edición real de un cliente vinculado debe ofrecer una actualización; abrir o guardar sin cambios no debe solicitarla. Pruebe aceptar y rechazar.
  5. Cambie el enrutamiento, rechace la transferencia y reintente con Update Contact. Pruebe Refresh Contact con cambios pendientes y el estado del receptor tras cambiar identificador/país.
Síntoma Comprobación
Page Part oculto Permisos, registro de configuración, variable de visibilidad e IDs de cuenta de producción/staging.
Contexto vacío o incorrecto Rec, nombre del control, OnAfterGetCurrRecord, los siete argumentos de SetContext y clave coincidente en SubPageLink.
Cliente inexistente en una acción Número de cliente guardado y Database::Customer; el flujo completo no admite IDs de tablas independientes.
Error de conexión o sin opciones de enrutamiento Entorno/cuenta/clave API, contacto vinculado, país/esquema/identificador y formatos del receptor.
Confirmaciones repetidas Confirmar solo cambios reales de campos, no desde triggers de navegación o guardado.

Véase también