Documentación de uso para partners

Page content
    Add a header to begin generating the table of contents

    CODEUNIT: AQAEPR EXTEND DOCUMENTS (72684582)

    Esta documentación describe las funciones globales de la codeunitaqaepr Extend Documents, para que los partners puedan reutilizarlas al extender reports de venta de Dynamics 365 Business Central (factura, abono, albarán, devolución, etc.). 

    La codeunit genera un buffer temporalde tipo aqaepr Buffer con el detalle EPR calculado para documentos y líneas de venta. 

    OBJETIVO DE LA CODEUNIT

    Las funciones públicas de esta codeunit permiten obtener, para un documento o línea de venta: 

    • los materiales de envase asociados al producto, 
    • el tipo de envase (primario, secundario, terciario), 
    • la categoría EPR aplicable, 
    • la cantidad de envases/material, 
    • el precio por kg vigente, 
    • y el importe EPR calculado. 

    El resultado siempre se devuelve en unrecord temporalde la tabla aqaepr Buffer. 

    FUNCIONES GLOBALES

    Todas las funciones públicas se llaman igual: AdderitEPRSalesValues, pero están sobrecargadas según el tipo de documento/línea recibido. 

    Funciones disponibles

     

    Tipo de entrada 

    Procedimiento 

    Documento de venta 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesHeader: Record «Sales Header»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Línea de venta 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesLine: Record «Sales Line»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Factura de venta registrada 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesInvHeader: Record «Sales Invoice Header»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Línea factura de venta registrada 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesInvLine: Record «Sales Invoice Line»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Abono de venta registrado 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesCrMHeader: Record «Sales Cr.Memo Header»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Línea de abono de venta registrado 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesCrMLine: Record «Sales Cr.Memo Line»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Albarán de venta registrado 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesShipmentHeader: Record «Sales Shipment Header»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Línea de albarán de venta registrado 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesShipmentLine: Record «Sales Shipment Line»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Recepción de devolución registrada 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; ReturnReceiptHeader: Record «Return Receipt Header»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Línea de recepción de devolución registrada 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; ReturnReceiptLine: Record «Return Receipt Line»; IncludePackage: array[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    PARÁMETROS COMUNES

    var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary 

    Buffer temporal de salida.

    Importante: Cada procedimiento hace Clear(aqaEPRTempBuffer) al inicio, por lo que el buffer se reconstruye desde cero en cada llamada. 

    IncludePackagearray[3] of Boolean 

    Indica qué niveles de envase se deben calcular: 

    • IncludePackage[1] = Primario 
    • IncludePackage[2] = Secundario 
    • IncludePackage[3] = Terciario 

    Ejemplo: 

    • [true, false, false] → solo primario 
    • [true, true, false] → primario y secundario 
    • [true, true, true] → todos los niveles 

    IncludeHighLevelBoolean 

    Se utiliza al calcular la cantidad de envases a partir de la cantidad base del producto.

    Internamente se apoya en aqa_epr Management.GetQtyfromItem(…): 

    • true → redondeo hacia arriba (>) 
    • false → redondeo hacia abajo (<) 

    Esto afecta al número de envases calculado cuando la relación entre cantidad base y unidad de medida del envase no es exacta. 

    FindVendorBoolean 

    En la implementación actual de esta codeunit, este parámetro no se utiliza. 

    Se mantiene en la firma pública, pero actualmente no altera el cálculo ni el resultadodel buffer. 

    COMPORTAMIENTO GENERAL

    Si se llama con una cabecera

    La función: 

    1. localiza las líneas del documento, 
    2. filtra únicamente las líneas de tipo Item, 
    3. descarta líneas sin No. o con Quantity (Base) = 0, 
    4. calcula el detalle EPR de cada línea,
    5. y copia todos los resultados al buffer temporal de salida. 

    Si se llama con una línea

    La función: 

    1. valida que la línea sea de tipo Item y tenga No.,
    2. obtiene los materiales de envase asociados al producto, 
    3. calcula cantidades, pesos, precio unitario e importe, 
    4. y devuelve una o varias líneas en el buffer temporal. 

    ¿Qué devuelve el buffer aqaepr Buffer?

    Las funciones rellenan principalmente estos campos del buffer temporal:

    Campo 

    Description 

    Document No. 

    Nº de documento origen 

    Document Line No. 

    Nº de línea origen 

    Container Category 

    Categoría EPR aplicada 

    Container Type 

    Tipo de envase: primario, secundario o terciario 

    Material Code 

    Código de material del BOM del envase 

    Recycled % 

    % reciclado del material 

    Quantity 

    Cantidad base de producto de la línea 

    Material Weight 

    Peso unitario del material definido en el Package BOM 

    Material Quantity 

    Cantidad de envases/material calculado para la línea 

    Dangerous 

    Indica si el artículo está marcado como peligroso 

    Unit Price 

    Tarifa por kg encontrada para la fecha de registro 

    Amount 

    Importe EPR calculado 

    Fórmula del importe

    Cuando existe tarifa SCRAP aplicable, el importe se calcula así: 

    Amount = Material Weight * Material Quantity * Unit Price * (1 – (Recycled % / 100)) 

    Si no se encuentra tarifa válida, Unit Price y Amount permanecen a 0. 

    REGLAS DE CÁLCULO RELEVANTES

    1. Solo procesa líneas de producto 

    No se calculan líneas de tipo recurso, cuenta contable, comentario, etc. 

    2. Si la categoría EPR de la línea está vacía, usa la del artículo

    Cuando el campo aqaepr EPR Category de la línea está en blanco, la codeunit toma la categoría del Item. 

    3. Solo calcula niveles de envase seleccionados en IncludePackage 

    Si un nivel no está marcado a true, no se generarán líneas de buffer para ese nivel. 

    4. El artículo debe tener configurado el envase en su UoM 

    Para cada nivel seleccionado, la codeunit busca: 

    • la UoM del envase en el artículo, 
    • el aqa_epr Package Code en Item Unit of Measure, 
    • y el Package BOM asociado. 

    Si esa configuración no existe, no habrá líneas para ese nivel. 

    5. Una línea de venta puede generar varias líneas de buffer

    Esto ocurre cuando el BOM del envase tiene varios materiales o varios niveles de envase seleccionados. 

    6. La valoración usa la fecha de registro de la línea

    Para las líneas registradas se usa Posting Date de la línea. En documentos de venta, la codeunit calcula el campo antes de valorar el buffer. 

    7. La tarifa SCRAP se busca por combinación de datos 

    La valoración se busca por: 

    • entidad SCRAP de la categoría EPR, 
    • material, 
    • categoría de envase, 
    • tipo de envase, 
    • indicador de peligroso, 
    • fecha de inicio menor o igual a la fecha de registro, 
    • y tarifa distinta de 0. 

    Detalle por procedimiento

    1. Sales Header

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesHeader: Record «Sales Header»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    Cuando el report trabaja a nivel de cabecera de documento de venta y necesita obtener el detalle EPR de todas sus líneas válidas. 

    ¿Qué hace?
    • Recorre las Sales Line del documento. 
    • Solo procesa líneas Type = Item. 
    • Excluye líneas sin artículo o con Quantity (Base) = 0. 
    • Acumula en el buffer el resultado de cada línea. 

    2. Sales Line

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesLine: Record «Sales Line»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean)  

    Uso recomendado

    Cuando el report ya está posicionado en una línea concreta y solo necesita calcular el EPR de esa línea. 

    ¿Qué hace?
    • Valida que la línea sea de artículo. 
    • Genera las líneas del buffer para el artículo y sus envases. 
    • Informa Document No. y Document Line No.. 
    • Valora el buffer con la fecha de registro. 

    3. Sales Invoice Header

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesInvHeader: Record «Sales Invoice Header»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    For reports defactura de venta registrada cuando se necesita el total de detalle EPR del documento.  

    ¿Qué hace?

    Mismo patrón que Sales Header, pero recorriendo Sales Invoice Line. 

    4. Sales Invoice Line

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesInvLine: Record «Sales Invoice Line»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    Para ampliar reports de factura registrada a nivel de línea. 

    ¿Qué hace?

    Calcula el EPR de una única línea registrada y valora el resultado con Sales Invoice Line.»Posting Date». 

    5. Sales Cr. Memo Header

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporarySalesCrMHeader: Record «Sales Cr.Memo Header»; IncludePackagearray[3] of BooleanIncludeHighLevelBooleanFindVendorBoolean) 

    Uso recomendado

    For reports de abono de venta registradoa nivel de cabecera. 

    ¿Qué hace?

    Mismo patrón que Sales Header, pero recorriendo Sales Cr.Memo Line. 

    6. Sales Cr. Memo Line

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporarySalesCrMLine: Record «Sales Cr.Memo Line»; IncludePackagearray[3] of BooleanIncludeHighLevelBooleanFindVendorBoolean) 

    Uso recomendado

    Para ampliar reports de abono registrado a nivel de línea. 

    ¿Qué hace?

    Calcula el EPR de una única línea registrada y valora el resultado con Sales Cr.Memo Line.»Posting Date». 

    7. Sales Shipment Header

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesShipmentHeader: Record «Sales Shipment Header»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    For reports de albarán de venta registrado a nivel de cabecera. 

    ¿Qué hace?

    Mismo patrón que Sales Header, pero recorriendo Sales Shipment Line. 

    8. Sales Shipment Line

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; SalesShipmentLine: Record «Sales Shipment Line»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    Para ampliar reports de albarán registrado a nivel de línea. 

    ¿Qué hace?

    Calcula el EPR de una única línea registrada y valora el resultado con Sales Shipment Line.»Posting Date». 

    9.  Return Receipt Header

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; ReturnReceiptHeader: Record «Return Receipt Header»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    For reports derecepción de devolución registrada a nivel de cabecera. 

    ¿Qué hace?

    Mismo patrón que Sales Header, pero recorriendo Return Receipt Line. 

    10.  Return Receipt Line

    Firma 

    AdderitEPRSalesValues(var aqaEPRTempBuffer: Record «aqaepr Buffer» temporary; ReturnReceiptLine: Record «Return Receipt Line»; IncludePackagearray[3] of Boolean; IncludeHighLevel: Boolean; FindVendor: Boolean) 

    Uso recomendado

    Para ampliar reports de recepción de devolución registradaa nivel de línea.  

    ¿Qué hace?

    Calcula el EPR de una única línea registrada y valora el resultado con Return Receipt Line.»Posting Date». 

    Ejemplo de uso en un report

    var 

        ExtendDocuments: Codeunit «aqaepr Extend Documents»; 

        TempBuffer: Record «aqaepr Buffer» temporary; 

        IncludePackage: array[3] of Boolean; 

    begin 

        IncludePackage[1] := true; // Primario 

        IncludePackage[2] := false; 

        IncludePackage[3] := false; 

     

        ExtendDocuments.AdderitEPRSalesValues( 

            TempBuffer, 

            «Sales Invoice Header», 

            IncludePackage, 

            false, 

            false); 

     

        if TempBuffer.FindSet() then 

            repeat 

                // Imprimir o acumular datos EPR 

                // TempBuffer.»Material Code» 

                // TempBuffer.»Material Quantity» 

                // TempBuffer.Amount 

            until TempBuffer.Next() = 0; 

    end; 

    Recomendaciones de uso para partners
    1. Usar siempre un buffer temporal independiente para el cálculo. 
    2. No asumir una sola línea de resultado por línea de documento; puede haber varias. 
    3. Recorrer todo el buffer después de la llamada. 
    4. Si el report necesita solo un subtotal EPR por documento, sumar Amount del buffer. 
    5. Si el report necesita mostrar el detalle, imprimir al menos: 

     

    • tipo de envase, 
    • material, 
    • cantidad de material, 
    • precio unitario, 
    • importe. 

      

         6. Si se quieren incluir varios niveles de envase, activar las posiciones adecuadas de IncludePackage. 

         7. Si el cálculo esperado depende del redondeo de envases, revisar el valor de IncludeHighLevel. 

    Limitaciones conocidas de la API pública
    • El parámetro FindVendor está presente pero no tiene efecto en esta codeunit. 

     

    • El resultado depende de la correcta configuración de:  
      • artículo, 
      • unidades de medida, 
      • package code, 
      • package BOM, 
      • categoría EPR, 
      • y tarifas SCRAP. 

     

    • Si falta cualquiera de esos datos, el buffer puede salir vacío o con importes a 0. 
    Recomendación práctica

    Para extensiones de reports de partners: 

    • usar las funciones de cabecera cuando se quiera obtener el detalle completo del documento, 
    • y las funciones de línea cuando el report ya trabaje dentro de un dataitem de líneas. 

    En general: 

    • Factura registrada → Sales Invoice Header o Sales Invoice Line 
    • Abono registrado → Sales Cr.Memo Header o Sales Cr.Memo Line 
    • Albarán registrado → Sales Shipment Header o Sales Shipment Line 
    • Devolución registrada → Return Receipt Header o Return Receipt Line 
    • Documento de venta no registrado → Sales Header o Sales Line 
    Archivo fuente analizado

    Para extensiones de reports de partners: 

    • src/codeunit/aqaeprExtendDocuments.Codeunit.al 

    SOPORTE TÉCNICO

    Si precisas de nuestra ayuda o tienes dudas, contáctanos vía el formulario.
    También puedes llamarnos a los teléfonos indicados a continuación o enviarnos un correo.

    Central Mail

    adderit@adderit.es

    Barcelona Office

    Trafalgar street, nº 4, 5º B,
    08010 Barcelona

    Barcelona telephone

    (+34) 938 323 134

    Madrid Office

    Paseo de la Castellana (Azca) 79, 28046 Madrid

    Madrid telephone

    (+34) 910 971 702

    ¿El IEPNR te preocupa?

    TENEMOS SOLUCIÓN

    El impuesto sobre plásticos no reutilizables está en vigor desde el 1 de enero de 2023.

    Desde Adderit hemos desarrollado una extensión para Microsoft Dynamics 365 Business Central para que puedas estar al día con la hacienda.

    Te guiamos para que puedas registrar las operaciones que realices sujetas al nuevo impuesto
    sin problemas ni contratiempos.