Facturas

Conjunto de llamadas que permiten realizar acciones sobre las facturas de una cuenta de FacturaDirecta.

Recurso Descripción
GET /api/invoices.xml Devuelve un listado de facturas permitiendo el filtrado por múltiples atributos
GET /api/invoices/#{id}.xml Devuelve una factura con identificador #{id}
GET /api/invoices/#{id}.facturae Devuelve una factura con identificador #{id} en formato FACTURAE
GET /api/invoices/#{id}.pdf Devuelve una factura con identificador #{id} en formato PDF
PUT /api/invoices/#{id}.xml Modifica los datos de una factura existente identificada por el identificador #{id}
POST /api/invoices.xml Permite crear una nueva factura
DELETE /api/invoices/#{id}.xml Elimina una factura existente identificada por el identificador #{id}
POST /api/invoices/send/#{id}.xml Envía por email la factura con identificador #{id} al cliente
PUT /api/invoices.xml Devuelve una plantilla de la estructura en xml para poder utilizarla para crear una nueva factura

Trabajando con campos personalizados

Si el objeto tiene definidos campos personalizados estos se recibirán en un elemento XML de la siguiente forma:

<customAttributes>
 <customAttribute>
 <label><![CDATA[Campo 1]]></label>
 <value><![CDATA[Valor 1]]></value>
 </customAttribute>
 <customAttribute>
 <label><![CDATA[Campo 2]]></label>
 <value><![CDATA[Valor 2]]></value>
 </customAttribute>
</customAttributes>

El ejemplo anterior se corresponde con un objeto que tiene definidos dos campos personalizados con nombres “Campo 1” y “Campo 2”.

Los valores pueden tanto consultarse como modificarse.

Si se recibe un elemento con un campo personalizado con un nombre que no existe la llamada a la API fallará con el siguiente error:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <httpStatus>400</httpStatus>
 <errorCode>INVALID_INPUT_DATA</errorCode>
 <errorMessage><![CDATA[Se ha recibido un atributo personalizado que no existe en el objeto]]></errorMessage>
</xml>

Cuando se está actualizando un objeto solo se actualizarán aquellos campos personalizados incluidos en el XML. Si no existe el elemento customAttribute el campo personalizado no se actualiza, si existe se actualiza su valor, y su no se recibe un valor dentro del elemento customAttribute se elimina el contenido del campo personalizado.

Si consideramos el elemento customAttributes indicado arriba y en una actualización se recibe el siguiente fragmento:

<customAttributes>
 <customAttribute>
 <label><![CDATA[Campo 1]]></label>
 <value><![CDATA[Valor 1b]]></value>
 </customAttribute>
</customAttributes>

Se actualiza el valor del campo “Campo 1” a “Valor 1b” y “Campo 2” se mantiene.

Sin embargo si recibimos esto:

<customAttributes>
 <customAttribute>
 <label><![CDATA[Campo 1]]></label>
 <value><![CDATA[Valor 1]]></value>
 </customAttribute>
 <customAttribute>
 <label><![CDATA[Campo 2]]></label>
 </customAttribute>
</customAttributes>

Se actualiza el valor del campo “Campo 1” a “Valor 1b” y “Campo 2” se elimina.

Se ha definido este comportamiento para poder trabajar con la API sin perder valores de campos personalizados que son añadidos posteriormente a la integración con la API de FacturaDirecta.

GET /api/invoices.xml

Devuelve un listado de facturas permitiendo el filtrado por múltiples atributos.

Obtener la lista de facturas

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices.xml

Opciones de paginación de lista y límites de elementos

Por defecto la llamada devuelve los 100 primeros elementos. Para obtener la lista de más elementos o bien paginar las llamadas deben utilizarse los siguientes parámetros:

Parámetro Descripción
limit Indica el número de entradas que devolverá la llamada (por defecto son 100 y se pueden listar hasta un máximo de 250 entradas en una sola llamda)
start Indica la posición del primer elemento que se devolverá en la llamada (por defecto es el elemento de la posición 0)

Opciones de filtrado de facturas

Para focalizar más la consulta de facturas, puedes utilizar las siguientes opciones de filtrado:

Parámetro Descripción
client Permite obtener solo las facturas de un cliente (especificado por su ID)
status (múltiple) Permite obtener las facturas que se encuentren en cualquier estado indicado en este parámetro. Opciones: draft (Provisional), pastDue (Impagada), open (En curso), closed (Pagada)
fromDate Permite obtener las facturas desde la fecha indicada (en formato AAAAMMDD)
toDate Permite obtener las facturas hasta la fecha indicada (en formato AAAAMMDD)
invoiceSerial (múltiple) Permite obtener las facturas de una única serie
invoiceNumber Permite obtener las facturas con un determinado número (se refiere al número de factura dentro de una serie, para buscar por número de factura incluyendo serie debe utilizarse el parámetro invoiceNumberFormatted)
invoiceNumberFormatted Permite obtener las facturas con un determinado número y serie tal y como se representan en el documento en formato PDF
subject Permite obtener las facturas donde su título contenga el valor indicado
tag Permite obtener las facturas que tengan asignada la etiqueta con texto indicado (Se puede incluir más de un parámetro tag en la petición)
tagCond Cuando la consulta contiene más de un parámetro tag indica si la consulta mostrará las facturas que tengan todas las etiquetas indicadas (valor and del parámetro) o cualquiera de ellas (valor or del parámetro)
sent Permite obtener las facturas según su estado de envío. Opciones: false (facturas no enviadas), true (facturas enviadas), cualquier otro valor es ignorado
ownerEmail Permite obtener sólo las facturas propiedad del usuario con el email indicado
ivaCaja_ES Esta opción de filtrado está disponible sólo para cuentas españolas y permite obtener facturas emitidas con o sin criterio de caja. Opciones: false(facturas sin criterio de caja), true (facturas con criterio de caja).

Ejemplos

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices.xml?client=52\&fromDate=20110101\&toDate=20110331

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices.xml?client=52\&fromDate=20110101\&toDate=20110331\&tag=Etiqueta 1\&tag=Etiqueta 2\&tagCond=and

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices.xml?client=52\&fromDate=20110101\&toDate=20110331\&tag=Etiqueta 1\&tag=Etiqueta 2\&tagCond=or

GET /api/invoices/#{id}.xml

Devuelve una factura existente

Ejemplo para obtener una factura con id=90

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90.xml

RESPUESTA SATISFACTORIA

<?xml version="1.0" encoding="UTF-8"?>
<invoice>
        <id>90</id>
        <updateDate>20110326085908.161</updateDate>
        <client>
                <id><![CDATA[3]]></id>
                <name><![CDATA[name_CREATE]]></name>
                <taxCode><![CDATA[taxCode_CREATE]]></taxCode>
        </client>
        <invoiceDate>20110326</invoiceDate>
        <invoiceSerial><![CDATA[T11]]></invoiceSerial>
        <invoiceNumber>3</invoiceNumber>
        <invoiceNumberFormatted>T1100003</invoiceNumberFormatted>
        <ivaCaja_ES>false</ivaCaja_ES>
        <currency>EUR</currency>
        <tags>
                <globalTag><![CDATA[Etiqueta global 1]]></globalTag>
                <localTag><![CDATA[Etiqueta local 1]]></localTag>
                <globalTag><![CDATA[Global 2]]></globalTag>
        </tags>
        <netTotal>88.50</netTotal>
        <tax1>
                <name>IVA</name>
                <base>13.50</base>
                <rate>18.00</rate>
                <total>2.43</total>
        </tax1>
        <grossTotal>90.93</grossTotal>
        <notes></notes>
        <subject></subject>
        <draft>false</draft>
        <sent>true</sent>
        <linePricesIncludeTaxes>false</linePricesIncludeTaxes>
        <invoiceLines>
                <invoiceLine>
                        <productCode><![CDATA[T2]]></productCode>
                        <description><![CDATA[Servicio de transporte urgente europa (hasta 40Kb)]]></description>
                        <quantity>3.00</quantity>
                        <unitPrice>25.00</unitPrice>
                        <totalPrice>75.00</totalPrice>
                </invoiceLine>
                <invoiceLine>
                        <productCode><![CDATA[T1]]></productCode>
                        <description><![CDATA[Servicio de transporte rápido peninsular (hasta 30Kg)]]></description>
                        <quantity>1.50</quantity>
                        <unitPrice>10.00</unitPrice>
                        <discountRate>10.00</discountRate>
                        <totalPrice>13.50</totalPrice>
                        <applyTax1>true</applyTax1>
                </invoiceLine>
        </invoiceLines>
        <payments>
                <payment>
                        <id>4</id>
                        <updateDate>20110326085907.627</updateDate>
                        <dueDate>20110401</dueDate>
                        <referenceNumber><![CDATA[Example A]]></referenceNumber>
                        <comment><![CDATA[Example Comment A]]></comment>
                        <paymentMean>02</paymentMean>
                        <paymentDate>20110430</paymentDate>
                        <amount>0.93</amount>
                </payment>
                <payment>
                        <id>5</id>
                        <updateDate>20110326085907.952</updateDate>
                        <referenceNumber><![CDATA[Example B]]></referenceNumber>
                        <comment><![CDATA[Example Comment B]]></comment>
                        <paymentMean>02</paymentMean>
                        <dueDate>20110501</dueDate>
                        <paymentDate></paymentDate>
                        <amount>90.00</amount>
                </payment>
        </payments>
</invoice>

Cosas a tener en cuenta al obtener la información de una factura

La estructura que devuelve el sistema con información de factura es mucho más completa que la estructura que se requiere enviar en la creación o edición de factura. El motivo principal es que el sistema devuelve información que se calcula automáticamente para la factura. Los campos que pueden calcularse automáticamente son:

Campos Observaciones
invoiceDate si no se indica en la creación se asume la fecha actual de creación
invoiceNumber si no se indica en la creación se asume el número correlativo para la serie definida
netTotal siempre se calcula automáticamente siendo la suma de los totales (totalPrice) en invoiceLines
taxN/base siempre se calcula automáticamente a partir de los totales (totalPrice) de los invoiceLines que tenga el invoiceLine/applyTaxN a true
taxN/total siempre se calcula automáticamente a partir del taxN/base multiplicado por el taxN/rate y dividido por 100.
grossTotal siempre se calcula automáticamente siendo la suma de netTotal + taxN/total

GET /api/invoices/#{id}.facturae

Descarga una factura en FACTURA-E

Ejemplo para descargar una factura en Facturae con id=90

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90.facturae

Por defecto, el formato de facturae se descargará siempre en la última versión de facturae soportada en FacturaDirecta (en el momento de escribir estas lineas 3.2).

Para descargar una versión anterior de facturae puede utilizar el parámetro facturaeVersion, los valores admitidos son 3.1, 3.2 y 3.2.1 De la forma siguiente,

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90.facturae?facturaeVersion=3.1

GET /api/invoices/#{id}.pdf

Descarga una factura en PDF. Genera la descarga de un PDF con la factura identificada por el id: #{id}

Ejemplo para descargar una factura en PDF con id=90

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90.pdf

Modo seguro de descarga de PDF

Para asegurar que nunca se transfiere el token se acceso en la url de descarga, la llamada permite pasar como parámetro resultType=url. La respuesta de una llamda con este parámetro devolverá directamente una url temporal que puede ser utilizada para obtener el PDF de manera segura sin tener que introducir el token de acceso primario.

Ejemplo para descargar una factura en PDF con id=90 en modo seguro

curl -u 03334b0a261a2c355ae2db022a963d8e:x https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90.pdf?resultType=url

La respuesta a esta llamada no será directamente el PDF sino otra URL temporal del estilo:

https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90/print?temporaryKey=b134af657d23b3e21f657d23b3e21&u=1

Es esta última URL la que descargará el documento PDF generado.

PUT /api/invoices/#{id}.xml

Modifica una factura existente

Ejemplo para actualizar una factura con id=90.

Prácticamente todos los elementos son opcionales, y solo aquellos que estén presentes en el xml serán actualizados.

Si algún elemento es obligatorio y no existe en el xml, el sistema devolverá un mensaje de error con una pequeña descripción indicando el motivo del error.

curl -u 03334b0a261a2c355ae2db022a963d8e:x -X PUT -H 'Accept: application/xml' -H 'Content-Type: application/xml'
-d "<?xml version='1.0' encoding='UTF-8'?>
<invoice>
        <id>90</id>
        <draft>false</draft>
        <sent>true</sent>
        <invoiceLines>
                <invoiceLine>
                        <productCode><![CDATA[T2]]></productCode>
                        <description><![CDATA[Servicio de transporte urgente europa (hasta 40Kb)]]></description>
                        <quantity>3.00</quantity>
                        <unitPrice>25.00</unitPrice>
                        <totalPrice>75.00</totalPrice>
                </invoiceLine>
                <invoiceLine>
                        <productCode><![CDATA[T1]]></productCode>
                        <description><![CDATA[Servicio de transporte rápido peninsular (hasta 30Kg)]]></description>
                        <quantity>1.50</quantity>
                        <unitPrice>10.00</unitPrice>
                        <discountRate>10.00</discountRate>
                        <totalPrice>13.50</totalPrice>
                        <applyTax1>true</applyTax1>
                </invoiceLine>
        </invoiceLines>
        <payments>
                <payment>
                        <id>4</id>
                        <dueDate>20110401</dueDate>
                        <referenceNumber><![CDATA[Example A]]></referenceNumber>
                        <comment><![CDATA[Example Comment A]]></comment>
                        <paymentMean>02</paymentMean>
                        <paymentDate>20110430</paymentDate>
                        <amount>0.93</amount>
                </payment>
                <payment>
                        <id>5</id>
                        <referenceNumber><![CDATA[Example B]]></referenceNumber>
                        <comment><![CDATA[Example Comment B]]></comment>
                        <paymentMean>02</paymentMean>
                        <dueDate>20110501</dueDate>
                        <paymentDate></paymentDate>
                        <amount>90.00</amount>
                </payment>
        </payments>
</invoice>"
https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/90.xml

Cosas a tener en cuenta al modificar una factura

En una modificación de factura, la mayoría de campos son OPCIONALES.

Si se desean modificar lineas de factura (invoiceLines), siempre es necesario enviar toda la información de todos los invoiceLines de la factura. (Ya que la llamada para realizar modificaciones en estos datos regenera completamente la estructura).

Si se desean indicar que una factura pasa de estado borrado a estado definitivo, debe indicarse: <draft>false</draft>. En este momento, si la factura no tiene un número asignado (invoiceNumber), el sistema le asignará automáticamente un número correlativo teniendo en cuenta la serie de la factura.

Los vencimientos/pagos (payments) deben indicarse con su ID correcto si se desea hacer alguna modificación y es siempre necesario que LA SUMA DE TODOS LOS IMPORTES DE LOS VENCIMIENTOS SUMEN EL TOTAL DE LA FACTURA (en un futuro próximo se incluirá un nuevo atributo en los vencimientos que permita indicar el porcentaje del total de la factura asociado al vencimiento y así evitar tener que calcular el importe final del pago).

Para indicar el medio de pago (paymentMean) será necesario utilizar los códigos que se muestran en una lista en el siguiente capítulo.

POST /api/invoices.xml

Crea una nueva factura

curl -u 03334b0a261a2c355ae2db022a963d8e:x -X POST -H 'Accept: application/xml' -H 'Content-Type: application/xml'
-d "<?xml version='1.0' encoding='UTF-8'?>
<invoice>
        <client>
                <id>12</id>
        </client>
        <invoiceDate>20110326</invoiceDate>
        <invoiceSerial><![CDATA[T11]]></invoiceSerial>
        <invoiceNumber>2</invoiceNumber>
        <currency>EUR</currency>
        <tags>
                <globalTag><![CDATA[Etiqueta global 1]]></globalTag>
                <localTag><![CDATA[Etiqueta local 1]]></localTag>
                <globalTag><![CDATA[Global 2]]></globalTag>
        </tags>
        <tax1>
                <name>IVA</name>
                <rate>18.00</rate>
        </tax1>
        <tax2>
                <name>IRPF</name>
                <rate>-15.00</rate>
        </tax2>
        <notes></notes>
        <subject></subject>
        <draft>false</draft>
        <sent>true</sent>
        <invoiceLines>
                <invoiceLine>
                        <productCode><![CDATA[T2]]></productCode>
                        <description><![CDATA[Servicio de transporte]]></description>
                        <quantity>3.00</quantity>
                        <unitPrice>25.00</unitPrice>
                </invoiceLine>
                <invoiceLine>
                        <productCode><![CDATA[T1]]></productCode>
                        <description><![CDATA[Servicio rápido peninsular]]></description>
                        <quantity>1.50</quantity>
                        <unitPrice>10.00</unitPrice>
                        <discountRate>10.00</discountRate>
                        <applyTax1>true</applyTax1>
                        <applyTax2>true</applyTax2>
                </invoiceLine>
        </invoiceLines>
        <payments>
                <payment>
                        <dueDate>20110326</dueDate>
                        <dueRate>50</dueRate>
                </payment>
                <payment>
                        <dueDate>20110526</dueDate>
                </payment>
        </payments>
</invoice>
"
https://[ACCOUNT_NAME].facturadirecta.com/api/invoices.xml

Cosas a tener en cuenta en la creación de una factura

La estructura de creación de factura dispone de muchos campos pero muchos de ellos son opcionales. El campo cliente (invoice/client) es siempre obligatorio y debe indicarse el ID del cliente (invoice/client/id). El cliente debe existir previamente a la llamada de creación de factura, con lo que si el cliente es nuevo debe utilizarse primero la llamada de creación de cliente antes de continuar con la llamada de creación de factura.

Si no se indica la fecha de la factura (invoiceDate), el sistema asignará automáticamente la fecha actual.

Si no se indica el número de factura (invoiceNumber), el sistema asignará automáticamente (siempre que la factura no esté en borrador, <draft>true</draft>``) un número correlativo teniendo en cuenta la serie de la factura (invoiceSerial`)

En los atributos tax1, tax2, tax3 y tax4 a nivel de invoice, tan solo deben indicarse:

  • El nombre (invoice/tax1/name): IRPF, IVA, etc..
  • El porcentaje aplicado (invoice/tax1/rate): 18, -15

En la zona de vencimientos de pago (payments), es posible indicar el importe de cada pago de múltiples formas:

  • Indicando el importe exacto (con el campo amount)
  • Indicando el porcentaje a cobrar respecto al todo (con el campo dueRate)
  • No indicando ni el importe (amount) ni el porcentaje (dueRate). En este caso, el sistema intentará autorellenar el contenido con el importe de forma que sea coherente con la factura.

IVA de caja en cuentas españolas

Se puede indicar que una factura se crea con o sin IVA de caja utilizando el elemento ivaCaja_ES. Si dicho elemento no está presente la factura se creará con el criterio de caja según esté indicado este comportamiento en la configuración de impuestos de la cuenta.

Ejemplos

<payment>
        <dueDate>20110326</dueDate>
        <amount>90.93</amount>
</payment>
<payment>
        <dueDate>20110326</dueDate>
        <dueRate>50</dueRate>
</payment>
<payment>
        <dueDate>20110326</dueDate>
</payment>

DELETE /api/invoices/#{id}.xml

Elimina una factura existente

Ejemplo para eliminar una factura con id=90

curl -u 03334b0a261a2c355ae2db022a963d8e:x -X DELETE https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/10.xml

POST /api/invoices/send/#{id}.xml

Permite enviar una factura por correo electrónico incluyendo la factura en formato PDF (y opcionalmente en formato Facture)

Hacer un envío de una factura

Para hacer el envío de la factura con id=90 personalizando todos los valores:

curl -u 03334b0a261a2c355ae2db022a963d8e:x -X POST -H 'Accept: application/xml' -H 'Content-Type: application/xml'
-d "<?xml version='1.0' encoding='UTF-8'?>
<send>
 <subject><![CDATA[Título del mensaje]]></subject>
 <body><![CDATA[<p>Estimado cliente,</p> ...]]></body>
 <contentType>text/html</contentType>
 <from>usuario@miempresa.com</from>
 <toRecipients>
 <address>contacto1@micliente.com</address>
 <address>contacto2@micliente.com</address>
 <contact>12</contact>
 </toRecipients>
 <ccRecipients>
 <address>usuario1@miempresa.com</address>
 </ccRecipients>
 <bccRecipients>
 <address>usuario2@miempresa.com</address>
 </bccRecipients>
 <signFiles>true</signFiles>
 <sendFacturae>false</sendFacturae>
 <facturaeVersion>3.2</facturaeVersion>
</send>" https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/send/90.xml

Se puede enviar la misma factura sin indicar ningún dato del envío y la factura se enviará con el texto por defecto al primer destinatario del cliente con el siguiente comando:

curl -u 03334b0a261a2c355ae2db022a963d8e:x -X POST -H 'Accept: application/xml' -H 'Content-Type: application/xml' https://[ACCOUNT_NAME].facturadirecta.com/api/invoices/send/90.xml

Si el mensaje puede enviarse correctamente se obtiene una respuesta con código de estado 200:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <httpStatus>200</httpStatus>
</xml>

Formato del XML de entrada

Todos los elementos del XML de entrada son opcionales.

Nombre Descripción
subject Título del mensaje. (Si no se indica se genera uno por defecto).
body Contenido del mensaje. (Si no se indica se genera uno por defecto).
contenType Se pueden indicar los valores text/plain o text/html. El contenido indicado en el elemento body debe tener el formato indicado en este elemento.
from Dirección de correo electrónico del remitente del mensaje. (Sólo se aceptan las siguiente direcciones para realizar el envío: la de la propia empresa o la de cualquier usuario de la cuenta).
toRecipients Lista de destinatarios del mensaje. Si no se indica se buscará entre las direcciones del cliente, primero la de la empresa y luego la de cualquier contacto para realizar el envío (Ver formato más adelante).
ccRecipients Lista de destinatarios en copia del mensaje (Ver formato más adelante).
bccRecipients Lista de destinatarios en copia oculta del mensaje. (Ver formato más adelante).
signFiles Indicar true para firmar la factura generada (La factura solo se firma si el plan contratado en la cuenta lo permite y para facturas definitivas, no se firmarán facturas provisionales aunque se indique).
sendFacturae Indicar true para generar también la factura en formato facturae (Sólo aplicable para cuentas españolas y para facturas definitivas)
facturaeVersion 3.1, 3.2 o 3.2.1 (Si se ha indicado la generación de facturae en el elemento anterior y no se indica la versión se generará en la versión más reciente disponible en la aplicación, acutalmente 3.2)

Formato de las listas de destinatarios

Cada una de las listas de destinatarios (toRecipients, ccRecipients, bccRecipients) puede tener dos tipos de elementos:

Nombre Descripción
address Dirección de correo electrónico
contact ID del contacto (El mensaje se enviará a su dirección de correo electrónico)

El programa validará que las direcciones introducidas en elementos address correspondan a alguna dirección permitida para el envío de mensajes. Para los elementos contact se validará que el contacto pertenece al cliente indicado en el documento que se está enviando.

Las direcciones de correo permitidas para el envío son: - La del cliente, - la de cualquier contacto del cliente, - la de tu propia empresa - la de cualquiera de los usuarios de tu cuenta.

PUT /api/invoices.xml

Obtiene la plantilla xml de nueva factura

curl -u 03334b0a261a2c355ae2db022a963d8e:x -X PUT https://[ACCOUNT_NAME].facturadirecta.com/api/invoices.xml