Ir al contenido
Log in

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.

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.

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 es 1. Ú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.
  • 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 es false.

  • Aplicar impuestos por línea (apply_taxes_per_line): Si se establece en true, 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 es false.

    • 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 es false.

    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: true para tener efecto.

Importe base de línea = Cantidad * Precio / Cantidad base

Cuando 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.50

Si 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.

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ínea

Si 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ínea

Como 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ínea

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 factura

Si 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.

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ínea

Aplicar 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.

  • 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:

  1. apply_taxes_per_line = true y round_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)
  1. apply_taxes_per_line = true y round_before_sum = false
Importe imponible de línea = 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)
  1. apply_taxes_per_line = false y round_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)
  1. apply_taxes_per_line = false y round_before_sum = false
Importe imponible de línea = 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)

Total a nivel de factura:

Total = Subtotal + Importe de impuesto de factura

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.235 se redondea a 1.24, pero 1.225 se redondea a 1.22.
  • Truncar (truncate): Elimina la parte decimal del número para redondear.
    • Los números 1.234 y 1.236 ambos se redondean a 1.23.
  1. 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.
  2. Cálculos de impuestos: Los importes de impuesto se calculan y redondean antes de añadirse al importe neto de la línea.
  3. Subtotal y ajustes a nivel de factura: Los subtotales se redondean antes de aplicar los ajustes a nivel de factura.
  • 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.

Configuración:

  • Método de redondeo: bankers
  • Redondear antes de sumar: true
  • Aplicar impuestos por línea: true
{
"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"
}
  1. 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€.
  2. Subtotal de factura:

    • Suma de todos los importes netos de línea = 107.58€ + 37.48€ = 145.06€
    • Importe de cargo global = 3€.
  3. 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€
  4. Total de factura:

    • Subtotal de factura = 145.06€ + 3€ = 148.06€
    • Total de factura = 148.06€ + 30.46€ = 178.52€
{
"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»
{
"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"
}
  1. Línea 1: 500 * 12.50 / 100 = 62.50€
  2. Línea 2: 5000 * 45.00 / 1000 = 225.00€
  3. Subtotal: 62.50 + 225.00 = 287.50€
  4. IVA 21%: 287.50 × 21 / 100 = 60.375 → Redondeado a 60,38€
  5. Total: 287.50 + 60.38 = 347.88€
{
"subtotal": 287.50,
"taxes": [
{
"name": "VAT 21.00%",
"base": 287.50,
"amount": 60.38
}
],
"total": 347.88
}