La automatización en la creación de documentos es una de las mayores ventajas de Business Central. En esta ocasión, veremos cómo se puede automatizar la generación de facturas a partir de albaranes de envío utilizando un codeunit en AL. Este enfoque no solo ahorra tiempo, sino que también reduce errores manuales, mejorando la eficiencia del negocio.

¡Vamos manos a la obra! 🤩

Definiendo el Proceso Principal

codeunit 60004 "CrearLineasFacturaDesdeAlbaranes"
{
    procedure Ejecute(SalesShipment: Text; CustomerNo: Code[20])
    var
        SalesHeader: Record "Sales Header";
        SalesShipmentLine: Record "Sales Shipment Line";
        SalesPost: Codeunit "Sales-Post";
    begin
        CreateHeaderInvoice(CustomerNo, SalesHeader);

        SalesShipmentLine.Reset();
        SalesShipmentLine.SetFilter("Document No.", SalesShipment);
        SalesShipmentLine.SetFilter("Qty. Shipped Not Invoiced", '<>0');
        if SalesShipmentLine.FindSet() then
            repeat
                CreateInvoiceLineFromShipment(SalesShipmentLine, SalesHeader);
            until SalesShipmentLine.Next() < 1;

        Clear(SalesPost);
        SalesPost.Run(SalesHeader);
    end;

La función Ejecute es el corazón del codeunit. Aquí se reciben como parámetros el número del albarán de envío (SalesShipment) y el número del cliente (CustomerNo). Vamos a desglosar esta función paso a paso:

  1. Creación del Encabezado de la Factura:
    Primero, se llama a la función CreateHeaderInvoice para crear el encabezado de la factura. Esto se hace pasando el número de cliente y una variable de registro de encabezado de ventas.
  2. Filtrar Líneas de Envío:
    Luego, se resetea el registro SalesShipmentLine y se aplican dos filtros:
  • Document No.: Se filtra por el número del documento de envío proporcionado.
  • Qty. Shipped Not Invoiced: Se filtra para obtener solo las líneas donde la cantidad enviada no ha sido facturada.
  1. Crear Líneas de Factura:
    Si se encuentran líneas de envío que cumplan con los filtros anteriores, se itera sobre cada línea con un bucle repeat-until, llamando a la función CreateInvoiceLineFromShipment para cada línea de envío.
  2. Registrar la Factura:
    Finalmente, se utiliza el codeunit SalesPost para registrar la factura generada.

Creación del Encabezado de la Factura

    procedure CreateHeaderInvoice(CustomerNo: Code[20]; var SalesHeader: Record "Sales Header")
    begin
        SalesHeader.Init();
        SalesHeader.Validate("Document Type", SalesHeader."Document Type"::Invoice);
        SalesHeader."No." := '';
        SalesHeader.Insert(true);

        SalesHeader.Invoice := true;
        SalesHeader.Validate("Sell-to Customer No.", CustomerNo);
        SalesHeader.Modify();
    end;

Esta función CreateHeaderInvoice es responsable de inicializar y configurar el encabezado de la factura. Aquí está el desglose:

  1. Inicialización del Registro:
    Se inicializa el registro SalesHeader con SalesHeader.Init().
  2. Validación del Tipo de Documento:
    Se valida que el tipo de documento sea una factura (Invoice).
  3. Inserción del Registro:
    Se inserta el registro con un número de documento vacío para que el sistema lo genere automáticamente.
  4. Configuración del Cliente y Modificación del Registro:
    Se marca el documento como una factura (SalesHeader.Invoice := true;) y se valida el número del cliente. Finalmente, se modifica el registro para guardar los cambios.

Creación de las Líneas de Factura desde Albaranes

    procedure CreateInvoiceLineFromShipment(var SalesShipmentLine: Record "Sales Shipment Line"; SalesHeader: Record "Sales Header")
    var
        SalesGetShipment: Codeunit "Sales-Get Shipment";
    begin
        Clear(SalesGetShipment);
        SalesGetShipment.SetSalesHeader(SalesHeader);
        SalesGetShipment.CreateInvLines(SalesShipmentLine);
    end;
}

La función CreateInvoiceLineFromShipment se encarga de crear las líneas de factura basadas en las líneas de envío. Aquí está el desglose:

  1. Inicialización del Codeunit:
    Se limpia el codeunit SalesGetShipment para asegurarse de que esté en un estado limpio.
  2. Configuración del Encabezado de Ventas:
    Se establece el encabezado de ventas con SalesGetShipment.SetSalesHeader(SalesHeader).
  3. Creación de las Líneas de Factura:
    Finalmente, se llama a SalesGetShipment.CreateInvLines(SalesShipmentLine) para crear las líneas de factura basadas en las líneas de envío.

Beneficios y Aplicaciones Prácticas

Implementar este codeunit en un entorno real de Business Central puede ofrecer numerosos beneficios:

  • Ahorro de Tiempo: Automatiza tareas repetitivas y manuales, permitiendo al personal concentrarse en tareas más estratégicas.
  • Reducción de Errores: Minimiza la entrada manual de datos, reduciendo la posibilidad de errores humanos.
  • Eficiencia Operativa: Mejora la eficiencia operativa al agilizar el proceso de facturación.

Conclusión

Automatizar la creación de facturas a partir de albaranes en Business Central es una práctica que puede transformar la eficiencia y precisión de las operaciones. Este codeunit muestra cómo se puede implementar esta automatización de manera efectiva.

Si quieres ver el código completo, está en GitHub.

¡Hasta la próxima y feliz programación!