Cálculo de factura
Esta guía explica cómo B2Brouter calcula los importes netos y brutos a partir de datos como cantidad, precio, cantidad base, impuestos y descuentos o cargos opcionales, que pueden proporcionarse como porcentajes o importes fijos. Los cálculos admiten ajustes tanto a nivel de línea como a nivel de factura.
Todos los cálculos y redondeos los realiza B2Brouter de forma automática. El alcance de esta guía es explicar el proceso y qué resultados se deben esperar.
Datos de entrada requeridos
Sección titulada «Datos de entrada requeridos»A nivel de factura
Sección titulada «A nivel de factura»Estos son los descuentos y cargos globales a nivel de factura, mediante allowance_charges_attributes:
- Descuento (Allowance): (Opcional)
{allowance_charge_indicator: "allowance"}con:- percentage: Porcentaje de descuento aplicado a toda la factura.
- amount: Importe fijo de descuento aplicado a toda la factura.
- Cargo (Charge): (Opcional)
{allowance_charge_indicator: "charge"}con:- percentage: Porcentaje de cargo aplicado a toda la factura.
- amount: Importe fijo de cargo aplicado a toda la factura.
A nivel de línea
Sección titulada «A nivel de línea»Para cada línea (invoice_lines_attributes) se deben proporcionar los siguientes datos:
- Cantidad (
quantity): Número de unidades. - Precio (
price): Precio para la cantidad base de unidades indicada. - Cantidad base (
base_quantity): El número de unidades al que se aplica el precio. Por defecto es1. Úselo cuando el precio se cotiza por múltiples unidades (p. ej., precio por 100 piezas). - Impuestos (
taxes_attributes):- Name: Nombre del impuesto (p. ej., VAT, IVA, IRPF).
- Category: Categoría del impuesto.
- Percent: Porcentaje de impuesto aplicado (puede ser positivo o negativo).
- Descuento (Allowance): (Opcional) mediante
allowance_charges_attributes[]{allowance_charge_indicator: "allowance"}con:- percentage: Porcentaje de descuento aplicado a la línea.
- amount: Importe fijo de descuento aplicado a la línea.
- Cargo (Charge): (Opcional) mediante
allowance_charges_attributes[]{allowance_charge_indicator: "charge"}con:- percentage: Porcentaje de cargo aplicado a la línea.
- amount: Importe fijo de cargo aplicado a la línea.
- Importe de extensión: (Opcional) El importe “neto” total de la línea de factura antes de aplicar impuestos. Si no se proporciona, la API lo calculará como se explica en Importes netos a nivel de línea.
Cálculos
Sección titulada «Cálculos»Configuración a nivel de cuenta
Sección titulada «Configuración a nivel de cuenta»-
Método de redondeo (
rounding_method): Método de redondeo utilizado para los cálculos. Por defecto es Redondeo hacia arriba (half_up). -
Redondear antes de sumar (
round_before_sum): Redondea los importes imponibles de cada línea antes de sumarlos. Por defecto esfalse. -
Aplicar impuestos por línea (
apply_taxes_per_line): Si se establece entrue, calcula el importe de impuesto a nivel de factura aplicando los impuestos a cada línea y sumándolos. En caso contrario, suma las bases imponibles de todas las líneas y aplica el impuesto a la suma. Por defecto esfalse.- Omitir redondeo de base imponible por línea (
skip_line_taxable_base_rounding): Cuando está activado, las bases imponibles y los importes de impuesto por línea no se redondean individualmente — solo se redondea el total acumulado final de impuestos. Por defecto esfalse.
Importante: Esta configuración está destinada exclusivamente a cuentas cuyo ERP utiliza totales con IVA incluido, ya que se desvía del cálculo de impuesto estándar. Requiere
apply_taxes_per_line: truepara tener efecto. - Omitir redondeo de base imponible por línea (
Importes netos a nivel de línea
Sección titulada «Importes netos a nivel de línea»Importe base de línea = Cantidad * Precio / Cantidad baseCuando base_quantity es 1 (valor predeterminado), esto se simplifica a Cantidad * Precio.
Cuando base_quantity es mayor que 1, permite expresar precios por múltiples unidades. Por ejemplo, si los tornillos tienen un precio de 12,50 por 100 piezas y se piden 500:
Importe base de línea = 500 * 12.50 / 100 = 62.50Si se ha proporcionado el importe de extensión (extension_amount), se utilizará como el importe neto de la línea en todos los cálculos. En caso contrario, se calcula el importe neto de la línea.
Línea con descuento y cargo
Sección titulada «Línea con descuento y cargo»Para cada línea, se calcula el importe neto aplicando el descuento y el cargo:
Importe neto de línea = Importe base de línea - Importe de descuento de línea + Importe de cargo de líneaSi el descuento o los cargos se expresan como porcentajes, sus importes se calculan así:
Importe de cargo de línea = Importe base de línea * (Porcentaje de cargo de línea / 100)Importe de descuento de línea = Importe base de línea * (Porcentaje de descuento de línea / 100)Si los importes de descuento o cargo son importes fijos, se puede omitir este paso.
Finalmente, se calcula el importe neto de línea restando el descuento y añadiendo el cargo:
Importe neto de línea = Importe base de línea - Importe de descuento de línea + Importe de cargo de líneaComo el importe neto de la línea debe redondearse a dos decimales, tenga en cuenta que las distintas partes del cálculo deben redondearse por separado.
Por ejemplo, el resultado de Importe neto de línea = Importe base de línea debe redondearse a dos decimales, y los importes de descuento/cargo también se redondean por separado.
Si no se proporcionan importes de descuento/cargo en la línea, se tratan como 0.
Importe neto de línea = Importe base de líneaSubtotal a nivel de factura
Sección titulada «Subtotal a nivel de factura»Se suman los importes netos de todas las líneas para calcular el subtotal. Este cálculo depende de la configuración round_before_sum.
- Redondear antes de sumar está en
true: El método de redondeo se aplica a cada importe neto de línea antes de sumarlos todos.
Subtotal = ∑(rounding_method(Importe neto de línea))- Redondear antes de sumar está en
false: El método de redondeo se aplica a la suma de todos los importes netos de línea.
Subtotal = rounding_method(∑(Importe neto de línea))Si se proporcionan descuentos o cargos a nivel de factura:
Subtotal = ∑(Importes netos de línea) - Importe de descuento de factura + Importe de cargo de facturaSi se proporciona el porcentaje para el descuento o cargo a nivel de factura, sus importes se calcularán de forma similar al cálculo a nivel de línea.
Lógica de cálculo de impuestos
Sección titulada «Lógica de cálculo de impuestos»Tras calcular el importe neto de la línea, se aplican los impuestos (si se proporcionan) según los taxes_attributes. Un porcentaje de impuesto negativo indica una deducción. Los impuestos se aplican según la configuración apply_taxes_per_line.
Importe imponible de línea (o base) = Importe neto de líneaAplicar impuestos por línea está en true: Los impuestos se aplicarán a cada importe imponible de línea (o base) y luego se sumarán todos para obtener el importe total de impuesto de la factura.
Cálculo de impuesto para cada línea
Sección titulada «Cálculo de impuesto para cada línea»- A cada línea pueden aplicarse varios impuestos. Cada impuesto se aplica individualmente.
Importe de impuesto de línea = Importe imponible de línea × (Porcentaje de impuesto / 100)- Si la configuración Redondear antes de sumar está
activa, el importe imponible de cada línea se redondea antes de aplicar el porcentaje de impuesto. En caso contrario, se redondeará después de aplicar el porcentaje de impuesto.
Importe de impuesto de línea = rounding_method(Importe imponible de línea) x (Porcentaje de impuesto / 100) [Activo]Importe de impuesto de línea = rounding_method(Importe imponible de línea x (Porcentaje de impuesto / 100)) [Inactivo]Suma de importes de impuesto por línea
El importe total de impuesto para cada línea es la suma de todos los impuestos aplicados a esa línea.
Cálculo de impuesto a nivel de factura
El cálculo del importe de impuesto a nivel de factura se basa en las configuraciones apply_taxes_per_line y round_before_sum. Por tanto, se esperan 4 enfoques diferentes según la configuración:
apply_taxes_per_line = trueyround_before_sum = true
Importe imponible de línea = rounding_method(Importe neto de línea - Importe de descuento de línea)Importe de impuesto de línea = rounding_method(Importe imponible de línea x (Porcentaje de impuesto / 100))Importe de impuesto de factura = ∑(Importes de impuesto de línea)apply_taxes_per_line = trueyround_before_sum = false
Importe imponible de línea = Importe neto de línea - Importe de descuento de líneaImporte de impuesto de línea = rounding_method(Importe imponible de línea x (Porcentaje de impuesto / 100))Importe de impuesto de factura = ∑(Importes de impuesto de línea)apply_taxes_per_line = falseyround_before_sum = true
Importe imponible de línea = rounding_method(Importe neto de línea - Importe de descuento de línea)Importe de impuesto de factura = Importes imponibles de línea x (Porcentaje de impuesto / 100)apply_taxes_per_line = falseyround_before_sum = false
Importe imponible de línea = Importe neto de línea - Importe de descuento de líneaImporte de impuesto de factura = Importes imponibles de línea x (Porcentaje de impuesto / 100)Total a nivel de factura:
Total = Subtotal + Importe de impuesto de facturaMétodos de redondeo
Sección titulada «Métodos de redondeo»Principios
Sección titulada «Principios»Precisión decimal
Todos los valores se redondean a dos decimales (que representan céntimos en la mayoría de las monedas).
Reglas de redondeo
La configuración del método de redondeo define cómo se aplica el redondeo, y puede establecerse entre tres opciones diferentes:
- Redondeo hacia arriba (
half_up): Es el método de redondeo predeterminado.- Si el tercer decimal es 5 o mayor, el segundo decimal se redondea hacia arriba.
- Si el tercer decimal es 4 o menor, el segundo decimal se deja sin cambios.
- Redondeo bancario (
bankers): Redondea los valores intermedios al valor par más cercano.- Si el tercer decimal es 6 o mayor, el segundo decimal se redondea hacia arriba.
- Si el tercer decimal es 4 o menor, el segundo decimal se redondea hacia abajo.
- Si el tercer decimal es 5, el segundo decimal se redondea al valor par más cercano. Por ejemplo,
1.235se redondea a1.24, pero1.225se redondea a1.22.
- Truncar (
truncate): Elimina la parte decimal del número para redondear.- Los números
1.234y1.236ambos se redondean a1.23.
- Los números
Cómo se aplica el redondeo en la API
Sección titulada «Cómo se aplica el redondeo en la API»- Cálculos a nivel de línea: Todos los importes netos a nivel de línea se redondean a dos decimales antes de cualquier cálculo posterior.
- Cálculos de impuestos: Los importes de impuesto se calculan y redondean antes de añadirse al importe neto de la línea.
- Subtotal y ajustes a nivel de factura: Los subtotales se redondean antes de aplicar los ajustes a nivel de factura.
Resumen
Sección titulada «Resumen»- Primero, aplique el redondeo por separado en cada paso (descuentos, cargos e impuesto) para evitar errores acumulados.
- Siempre redondee a dos decimales antes de usar el valor en cálculos posteriores.
Ejemplo de flujo de cálculo de la API
Sección titulada «Ejemplo de flujo de cálculo de la API»Ejemplo 1: Precio estándar
Sección titulada «Ejemplo 1: Precio estándar»Configuración:
- Método de redondeo:
bankers - Redondear antes de sumar:
true - Aplicar impuestos por línea:
true
Entrada
Sección titulada «Entrada»{ "invoice_lines_attributes": [ { "quantity": 3, "price": 33.275, "taxes_attributes": [ { "name": "VAT", "category": "S", "percent": 21 } ], "allowance_charges_attributes": [ { "allowance_charge_indicator": "allowance", "amount": 5 }, { "allowance_charge_indicator": "charge", "percentage": 12.777 } ] }, { "quantity": 7, "price": 5.355, "taxes_attributes": [ { "name": "VAT", "category": "S", "percent": 21 } ] } ], "allowance_charges_attributes": [ { "allowance_charge_indicator": "charge", "amount": 3 } ], "currency": "EUR"}Cálculo paso a paso
Sección titulada «Cálculo paso a paso»-
Importe neto de línea (antes de impuesto):
Línea 1:
- Importe base =
3 × 33.275€ = 99.825€ - Importe de descuento (allowance) = 5,00€.
- Importe de cargo =
99.825€ × 12.777/100 = 12.75464€→ Redondeado a 12,75€. - Importe neto de línea =
99.825€ - 5.00€ + 12.75€ = 107.575€→ Redondeado a 107,58€.
Línea 2:
- Importe base =
7 x 5.355€ = 37.485€→ Redondeado a 37,48€.
- Importe base =
-
Subtotal de factura:
- Suma de todos los importes netos de línea =
107.58€ + 37.48€ = 145.06€ - Importe de cargo global = 3€.
- Suma de todos los importes netos de línea =
-
Cálculo de impuesto (aplicar impuestos por línea = true):
- Línea 1:
107.58€ × 21/100 = 22.5918€→ Redondeado a 22,59€. - Línea 2:
37.48€ × 21/100 = 7.8708€→ Redondeado a 7,87€. - Total de impuesto =
22.59€ + 7.87€ = 30.46€
- Línea 1:
-
Total de factura:
- Subtotal de factura =
145.06€ + 3€ = 148.06€ - Total de factura =
148.06€ + 30.46€ = 178.52€
- Subtotal de factura =
{ "subtotal": 148.06, "taxes": [ { "name": "VAT 21.00%", "base": 145.06, "amount": 30.46 } ], "total": 178.52}Ejemplo 2: Uso de cantidad base para precios a granel
Sección titulada «Ejemplo 2: Uso de cantidad base para precios a granel»Entrada
Sección titulada «Entrada»{ "invoice_lines_attributes": [ { "description": "Steel screws M6x20", "quantity": 500, "price": 12.50, "base_quantity": 100, "unit": 1, "taxes_attributes": [{ "name": "VAT", "category": "S", "percent": 21 }] }, { "description": "A4 printing paper", "quantity": 5000, "price": 45.00, "base_quantity": 1000, "unit": 1, "taxes_attributes": [{ "name": "VAT", "category": "S", "percent": 21 }] } ], "currency": "EUR"}Cálculo paso a paso
Sección titulada «Cálculo paso a paso»- Línea 1:
500 * 12.50 / 100 = 62.50€ - Línea 2:
5000 * 45.00 / 1000 = 225.00€ - Subtotal:
62.50 + 225.00 = 287.50€ - IVA 21%:
287.50 × 21 / 100 = 60.375→ Redondeado a 60,38€ - Total:
287.50 + 60.38 = 347.88€
{ "subtotal": 287.50, "taxes": [ { "name": "VAT 21.00%", "base": 287.50, "amount": 60.38 } ], "total": 347.88}