iDynamics SII - Ejemplos de personalización
Este documento pretende servir de guía para realizar las personalizaciones más habituales en clientes, ofreciendo ejemplos que sirvan como punto de partida.
Si modifica valores en los documentos de la cola del SII, recuerde siempre hacerlo usando el método .Validate(), ya que en muchos casos la asignación de valores en un campo puede tener repercusiones en otros.
Facturas simplificadas
Por omisión, iDynamics SII respetará el valor de los campos Invoice Type o Cr. Memo Type de las cabeceras de facturas y abonos, lo cuál significa que cualquier personalización de este tipo se podría realizar directamente asignado los campos anteriores al documento de venta o compra, junto a los campos IDPSII Simplified From No. y IDPSII Simplified To No. en caso de querer crear una factura de resumen.
El caso siguiente, no obstante, presenta un ejemplo simple en el que, si la factura de venta corresponde a un código de cliente en particular, el documento de la cola de salida se identificará automáticamente como factura simplificada.
No es necesario alterar el contenido de los campos de contraparte (que indican los datos del cliente al que se ha emitido la factura), ya que el propio iDynamics SII omitirá el envío de esta información en el caso de facturas simplificadas o de resumen.
[EventSubscriber(ObjectType::Codeunit, Codeunit::"IDPSII Load Document Mgt", 'OnAfterAddDocument', '', false, false)]
local procedure OnAfterAddDocument(var SiiDocument: Record "IDPSII Document")
var
SalesInvoiceHeader: Record "Sales Invoice Header";
ClienteCaja: Code[10];
begin
// Obtenemos de alguna tabla de configuración el código del cliente de venta al público.
ClienteCaja := GetClienteCaja();
// Si el registro de la cola es una factura de venta, comparamos el código de cliente con un valor
// que corresponda al código del cliente de venta al público.
if (SiiDocument."Document Type" = SiiDocument."Document Type"::"Issued Invoice") and (not SiiDocument.CreditMemo) then
if SalesInvoiceHeader.Get(SiiDocument."Invoice No.") then
if SalesInvoiceHeader."Bill-to Customer No." = ClienteCaja then begin
SiiDocument.Validate("Invoice Type", 'F2');
SiiDocument.Modify(true);
end;
end;
Si el cliente emite multitud de facturas al día, de tipo simplificada, es posible que prefiera enviar un resumen de las mismas, creando un único registro del tipo "F4" (resumen de facturas). Aunque no incluimos ningún ejemplo de código, ya que es un caso relativamente complejo que dependerá de las personalizaciones del cliente, para resolverlo sugerimos el siguiente planteamiento:
- Añadir el código anterior, para que las facturas simplificadas se marquen como "F2".
- Añadir un nuevo código al evento OnAfterLoadDocuments que recorra todas las facturas de la cola de envío, con tipo "F2", y acumule, en un único registro (por fecha) todos los campos de importe (campos 165, 180, 200, 201, y 240-294), eliminando los registros "F2" originales.
- Asignar a los campos Simplified Invoice From No. y Simplified Invoice To No. el valor de la primera y la última factura simplificada incluida en el resumen, y marcar el campo Simplified Invoice a true (el Validate() de este último campo cambiará el tipo de factura a F4).
Facturas emitidas por terceros
Si se están enviando facturas emitidas por terceros, la tabla de documentos de SII IDPSII Document contiene un campo llamado "Third Party", de tipo boolean, que permite indicar este hecho. Para asignarlo, la manera recomendada de proceder es suscribirse al evento OnAfterAddDocument, para recuperar la factura de origen y, si es de este tipo, asignar los valores correspondientes al registro de la cola.
Por ejemplo, suponiendo que hubiera un campo NIF Emisor en la cabecera de las facturas de compra, este sería un posible código que implementaría la asignación:
[EventSubscriber(ObjectType::Codeunit, Codeunit::"IDPSII Load Document Mgt", 'OnAfterAddDocument', '', false, false)]
local procedure OnAfterAddDocument(var SiiDocument: Record "IDPSII Document")
var
SalesInvoiceHeader: Record "Sales Invoice Header";
begin
// Si el registro de la cola es una factura de venta, recuperamos el NIF del emisor.
if (SiiDocument."Document Type" = SiiDocument."Document Type"::"Issued Invoice") and (not SiiDocument.CreditMemo) then
if SalesInvoiceHeader.Get(SiiDocument."Invoice No.") then
if SalesInvoiceHeader."NIF Emisor" <> '' then begin
SiiDocument.Validate("Third Party", true);
SiiDocument.Validate("VAT Issuer", SalesInvoiceHeader."NIF Emisor");
SiiDocument.Modify(true);
end;
end;
Indicar NIF del representante
La agencia tributaria permite especificar el NIF del representante legal del cliente que recibe la factura emitida, del proveedor que emite la factura recibida, y de la propia empresa que presenta los datos a la agencia tributaria. Para poder especificar esta información, en la tabla SII Document existen los campos CP Legal Agent VAT No. y Legal Agent VAT No.. Dado que lo más habitual es que sea necesario indicar el representante legal del cliente o proveedor, vamos a incluir un ejemplo en el que se recupera el representante del cliente.
Nota: los campos que empiezan por CP se corresponden a los datos de la contraparte, que es el cliente en el caso de las facturas emitidas, y el proveedor en el caso de las facturas recibidas.
[EventSubscriber(ObjectType::Codeunit, Codeunit::"IDPSII Load Document Mgt", 'OnAfterAddDocument', '', false, false)]
local procedure OnAfterAddDocument(var SiiDocument: Record "IDPSII Document")
var
SalesInvoiceHeader: Record "Sales Invoice Header";
Customer: Record Customer;
begin
// Si el registro de la cola es una factura de venta, recuperamos el cliente, y de él
// recuperamos el representante legal, si existe ("NIF Representante" sería un campo
// personalizado que se habría agregado en la ficha del cliente).
if (SiiDocument."Document Type" = SiiDocument."Document Type"::"Issued Invoice") and (not SiiDocument.CreditMemo) then
if SalesInvoiceHeader.Get(SiiDocument."Invoice No.") then
if Customer.Get(SalesInvoiceHeader."Bill-to Customer No.") then
if Customer."NIF Representante" <> '' then begin
SiiDocument.Validate("CP Legal Agent VAT No.", Customer."NIF Representante");
SiiDocument.Modify(TRUE);
end;
end;
Tipo de identificador para clientes fuera de la UE
Por precaución, ya que hay múltiples maneras de identificar a clientes y proveedores, y no queremos asignar valores incorrectos, iDynamics SII sólo asigna de manera automática el tipo de identificación NIF Europeo (02), cuando el cliente está identificado como perteneciente a la UE en la configuración de IVA, y Otro documento probatorio (06), cuando se trate de un cliente o proveedor de fuera de la UE.
Si, por ejemplo, se prefiere que la identificación predeterminada para clientes de fuera de la UE fuera Documento oficial expedido por el país de residencia (04), el siguiente código asignaría dicho valor.
[EventSubscriber(ObjectType::Codeunit, Codeunit::"IDPSII Load Document Mgt", 'OnAfterAddDocument', '', false, false)]
local procedure OnAfterAddDocument(var SiiDocument: Record "IDPSII Document")
begin
// Si iDynamics SII ha asignado "Otro documento probatorio (06)" como identificación,
// asignamos "Documento oficial expedido por el país de residencia (04)" en su lugar.
if SiiDocument."CP VAT Identif. Type" = "IDPSII VAT Identification Type"::"06" then begin
SiiDocument.Validate("CP VAT Identif. Type", "IDPSII VAT Identification Type"::"04");
SiiDocument.Modify();
end;
end;
Generación automática de operaciones de seguros
Para aquellos clientes que trabajen con operaciones de seguros, estas comunicaciones se pueden crear manualmente desde la cola de documentos de salida. Sin embargo, esta tarea puede ser laboriosa y, si el cliente cuenta ya con esta información almacenada en alguna tabla de Microsoft Dynamics 365 Business Central, su carga se puede automatizar. Para ello, recomendamos usar el evento OnAfterLoadDocuments, que se ejecuta al acabar el proceso estándar de carga de la aplicación.
A continuación se incluye un ejemplo de pseudo-código que explica como se generarían de manera automática este tipo de documentos, en el evento mencionado.
[EventSubscriber(ObjectType::Report, Report::"IDPSII Load Documents", 'OnAfterLoadDocuments', '', false, false)]
local procedure OnAfterLoadDocuments()
var
SiiDocument: Record "IDPSII Document";
begin
while ALGO_ALGO_OBTEN_DATOS do begin
SiiDocument.Init();
SiiDocument.SetInsuranceOperationDefaultValues();
// El año de la operación (si no se indica será por omisión el actual)
SiiDocument.Validate("Fiscal Year", 2021);
// El importe de las operaciones realizadas durante el año.
SiiDocument.Validate("Insurance Amount", 4500);
// El tipo de operación (si somos los emisores o receptores de la misma).
SiiDocument.Validate("Insurance Operation Key", SiiDocument."Insurance Operation Key"::"B");
// El NIF (u otra identificación) de la contraparte
SiiDocument.Validate("CP VAT No.", 'B97618573');
// El nombre de la contraparte.
SiiDocument.Validate("CP Name", 'Cronus ES S.L.');
// El tipo de identificación (blanco equivale a NIF/CIF Español)
// https://docs.idynamics.es/es/sii/vatidtype.html
SiiDocument.Validate("CP VAT Identif. Type", SiiDocument."CP VAT Identif. Type"::" ");
// El código de país (opcional si es España)
SiiDocument.Validate("CP Country Code", 'ES');
// Una descripción opcional. Se puede omitir por completo, pero puede resultar
// útil si se quiere ofrecer alguna información adicional sobre la operación
// a los usuarios de Dynamics 365 Business Central.
SiiDocument.Validate("Operation Description", 'Operación de seguros');
SiiDocument.Insert(true);
end;
end;
Generación automática de operaciones de agencias de viajes
A continuación se incluye un ejemplo de pseudo-código que explica como se generarían de manera automática este tipo de documentos, en el evento mencionado.
[EventSubscriber(ObjectType::Report, Report::"IDPSII Load Documents", 'OnAfterLoadDocuments', '', false, false)]
local procedure OnAfterLoadDocuments()
var
SiiDocument: Record "IDPSII Document";
begin
while ALGO_ALGO_OBTEN_DATOS do begin
SiiDocument.Init();
SiiDocument.SetTravelAgencyOperationDefaultValues();
// El año de la operación (si no se indica será por omisión el actual)
SiiDocument.Validate("Fiscal Year", 2021);
// El importe de las operaciones realizadas durante el año.
SiiDocument.Validate("Travel Agency Amount", 4500);
// El NIF (u otra identificación) de la contraparte
SiiDocument.Validate("CP VAT No.", 'B97618573');
// El nombre de la contraparte.
SiiDocument.Validate("CP Name", 'Cronus ES S.L.');
// El tipo de identificación (blanco equivale a NIF/CIF Español)
// https://docs.idynamics.es/es/sii/vatidtype.html
SiiDocument.Validate("CP VAT Identif. Type", SiiDocument."CP VAT Identif. Type"::" ");
// El código de país (opcional si es España)
SiiDocument.Validate("CP Country Code", 'ES');
// Una descripción opcional. Se puede omitir por completo, pero puede resultar
// útil si se quiere ofrecer alguna información adicional sobre la operación
// a los usuarios de Dynamics 365 Business Central.
SiiDocument.Validate("Operation Description", 'Operación de agencias de viajes');
SiiDocument.Insert(true);
end;
end;
Una vez inicializado un registro usando el método SetTravelAgencyOperationDefaultValues(), los únicos datos que es necesario especificar son el año, el importe, y la contraparte.