Agrupar pedidos de clientes en una factura

En este ejemplo, crearemos un pequeño agrupador de pedidos dentro de la factura. De esta manera, con un solo script podemos recuperar lo que nuestro cliente nos debe y crear un solo documento.

Grupo ScriptEvento
FichaAcción
if dataview.getvalue("gguid_customer") == "" then
        dataview.showerror("Select a customer!")
        do return end
end

Primero verificamos que hemos seleccionado al cliente (customer) en la nueva factura (invoice). Obviamente, si no se ha hecho la elección, no podemos continuar.

tabellafattura = dataview.getatable("fattura_rows")
 
tabella= database.getsql("SELECT * FROM orders WHERE gguid_customer='" .. dataview.getvalue("gguid_customer") .. "' AND eli=0 AND billed=0")
rows= table_rows.getrows()
 
for i=1,table_rows.countrows() do
        date = rows[i].getvalue("date")
        number = rows[i].getvalue("number)
        description = "Order N." .. number .. " of " .. date

        -- ENTER THE DESCRIPTIVE LINE OF THE ORDER
        rowinvoice  = table_invoice.adddatarow()
        rowinvoice.setvalue("description",description)

        tabler= database.getsql("SELECT * FROM order_rows WHERE gguidp='" .. rows[i].getvalue("gguid")  .. "' AND eli=0")
 
        rowsorders= tabler.getrows()
 
        for i=1,tabler.countrows() do
               -- ENTER ALL THE LINES OF THE ORDER
               rowinvoice2= table_invoice.adddatarow()
 
               rowinvoice2.setvalue("code", rowsorders[i].getvalue("code"))
               rowinvoice2.setvalue("description", rowsorders[i].getvalue("description")
 
               rowitem2.setvalue("qty",rowsorders[i].getvalue("qty")) 
 
               rowitem2.setvalue("price", rowsorders[i].getvalue("price"))  
 
               rowitem2.setvalue("totalprice",rowsorders[i].getvalue("totalprice"))
        end
 
       --INSERT AN EMPTY LINE TO REMOVE THE ORDERS
 
       rowitem= table_invoice.adddatarow()
       rowitem.setvalue("description","")
 
       --CHANGE THE STATE ON THE ORDER TO AVOID BILLING IT TWICE
 
       database.setsql("UPDATE orders SET tid=" .. tostring(utility.tid()) .. ",billed=1 WHERE gguid='" .. rows[i].getvalue("gguid") .. "'")
 
       database.addsyncbox("orders",rows[i].getvalue("gguid"))


end

--FORCE THE INVOICE UPDATE
dataview.update()

El procedimiento consta de dos ciclos. El primero extrae los pedidos (orders) seleccionándolos en función del cliente y en función del valor facturado=0 (billed=0). Esto se utiliza para evitar la creación de dos facturas que informan el mismo pedido.

Una vez recuperados los pedidos, insertamos una primera línea en la factura donde informaremos el número del pedido y su fecha.

Luego extraeremos las líneas del pedido actual y comenzaremos el segundo ciclo para insertar todas las líneas que lo componen en la factura.

Luego insertaremos una línea vacía entre un pedido y otro para mostrarlos mejor dentro del cuerpo de la factura. Mientras tanto, cambiaremos el estado del pedido estableciendo el valor de billed en 1, de modo que el pedido no sea invocado por otra factura. Después de los dos ciclos, forzaremos la actualización de los cálculos de la factura.