Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

¿Hay algún ejemplo de factura con Recargo Equiv. + Retención + IVA + Descuento? #72

Closed
simplygest opened this issue Mar 26, 2021 · 6 comments

Comments

@simplygest
Copy link

Hola!

Estoy probando la librería y he conseguido crear algunas facturas "sencillas" (con IVA, IVA+Retención, etc.) pero no consigo crear una factura que tenga IVA + Recargo de Equivalencia + Retención + Descuento por línea.

Es decir, la factura se genera, pero los importes, totales, etc. no coinciden con los de la factura original.

Este es el código que estoy usando para añadir una línea (item):

$fac->addItem(new FacturaeItem([ "name" => $descr, "articleCode" => $codigo, "quantity" => $cantidad, "unitPriceWithoutTax" => $precio, "discounts" => array( ["reason" => "Descuento de Línea", "rate" => $dto] ), "charges" => array( ["reason" => "Recargo Equiv.", "rate" => $re, "hasTaxes" => false] ), "taxes" => array( Facturae::TAX_IVA => $impuesto, Facturae::TAX_IRPF => $ret ) ]));

También he probado a añadir el Recargo Equiv. como "taxes" y no como "charges" con el mismo resultado. ¿Hay algún truco que se deba tener en cuenta cuando se usan todos estos impuestos?

Gracias

@josemmo
Copy link
Owner

josemmo commented Mar 27, 2021

Hola @simplygest,

Es decir, la factura se genera, pero los importes, totales, etc. no coinciden con los de la factura original.

¿Podrías pasar el código que estás utilizando para generar la factura? Si los totales no coinciden es un fallo muy grave de la librería, pero para poder arreglarlo necesito dar con el fallo primero.


Hay algún truco que se deba tener en cuenta cuando se usan todos estos impuestos?

"Truco" no hay, todo depende del formato en el que lo quiera la entidad receptora de la factura. Aquí existentes varias soluciones para añadir el recargo equivalente:

1. Como un impuesto

$fac->addItem(new FacturaeItem([
    "name" => "Nombre",
    "articleCode" => "A1234",
    "quantity" => 2,
    "unitPriceWithoutTax" => 100,
    "discounts" => [
        ["reason" => "Descuento del 20%", "rate" => 20]
    ],
    "taxes" => [
        Facturae::TAX_IVA => 21,
        Facturae::TAX_IRPF => 19,
        Facturae::TAX_OTHER => 5.2 // <----- Recargo de equivalencia
    ]
]));

2. Como un cargo

$fac->addItem(new FacturaeItem([
    "name" => "Nombre",
    "articleCode" => "A1234",
    "quantity" => 2,
    "unitPriceWithoutTax" => 100,
    "discounts" => [
        ["reason" => "Descuento del 20%", "rate" => 20]
    ],
    "charges" => [
       ["reason" => "Recargo de equivalencia", "rate" => 5.2, "hasTaxes" => false] // <----- Recargo de equivalencia
    ],
    "taxes" => [
        Facturae::TAX_IVA => 21,
        Facturae::TAX_IRPF => 19
    ]
]));

3. Como un impuesto especial

Esta funcionalidad que se recoge en los campos EquivalenceSurcharge y EquivalenceSurchargeAmount está contemplada en el formato FacturaE. Es seguramente la más correcta pero todavía no está implementada en Facturae-PHP.

@simplygest
Copy link
Author

Hola!

Al final conseguí crear la factura correctamente haciéndolo como un impuesto más, aunque utilicé TAX_IE en vez de TAX_OTHER.

Si lo hacía en "charges" no me cuadraban los totales, y si lo hacía con otro TAX_IVA para el Rec. Equiv. tampoco.

Como es un caso complejo (IVA, Recargo, Ret y Descuento) no conseguí averiguar cuándo me fallaba exactamente, así que voy a intentar recopilar más información y si consigo reproducirlo lo pongo aquí.

Gracias

josemmo referenced this issue Mar 30, 2021
- Añadida propiedad "surcharge" a FacturaeItem
- Modificados PropertiesTrait y ExportableTrait
@josemmo
Copy link
Owner

josemmo commented Apr 8, 2021

@simplygest, conseguiste reproducir el fallo?

@simplygest
Copy link
Author

Hola!

Disculpa, estoy con varios proyectos a la vez y no he podido hacer pruebas.

Lo solucioné en su momento usando otro impuesto (TAX_IE) en vez de usando "charges".

Voy a intentar replicarlo en cuanto retome ese proyecto.

@simplygest
Copy link
Author

Hola!

Hoy me he acordado de que estaba esto pendiente y he hecho algunas pruebas.

Añadiendo el recargo como otro impuesto, al validar la factura (por ejemplo en viewer.facturadirecta.com) el resultado es correcto. Coincide con la factura original.

Si lo hago usando el apartado "charges" como en el ejemplo 2, el total es incorrecto. El "total sin impuestos" tiene en cuenta el recargo, y luego se aplica el IVA (y la retención irpf) a ese total, cuando creo que debería ser al contrario.

En el primer caso (el que me funciona), el total sin impuestos no tiene en cuenta ni el IVA ni el RE, y luego se añade el RE y se resta la Retención.

Hice una prueba sencilla, con importes "redondos" (100 + 21% IVA +5.2% RE - 19%IRPF) para analizar mejor qué pasaba.

Usando "otro impuesto": 100 + 21 + 5,20 - 19 = 107,20

Usando "charges": 105,20 -19,99 + 22,09 = 107.30

En mis primeras pruebas la factura era incluso más complicada (con descuento global y por línea) y era más difícil averiguar el origen del problema.

Un saludo!

@josemmo
Copy link
Owner

josemmo commented Apr 15, 2021

Hola @simplygest,

Gracias por retomar el issue! He estado haciendo pruebas para reproducir lo que comentas y ya entiendo por qué ocurre.
He generado la factura (100€ BI, 21% IVA, 5.2% RE, 19% IRPF) de tres formas distintas, y este es el resultado:

Total factura Total importe bruto
Usando cargos 107,30 € 105,20 €
Usando Impuestos Especiales 107,20 € 100,00 €
Usando Recargo de Equivalencia 107,20 € 100,00 €

El primer método devuelve unos importes distintos porque los cargos y descuentos se aplican antes de impuestos sobre la base imponible, alterando el total de la factura. Aunque no es un fallo (es lo que dice la especificación), creo que es importante tenerlo en cuenta a la hora de definir una factura (yo tampoco era suficientemente consciente de esto... 😓).

TLDR: Los recargos de equivalencia es mejor definirlos con la funcionalidad añadida en la v1.6.0 o como impuesto especial, pero nunca como cargo.


Dejo por aquí el script que he utilizado para hacer las pruebas:

use josemmo\Facturae\Facturae;
use josemmo\Facturae\FacturaeItem;
use josemmo\Facturae\FacturaeParty;

$party = new FacturaeParty([
  "taxNumber" => "A00000000",
  "name"      => "Perico de los Palotes S.A.",
  "address"   => "C/ Falsa, 123",
  "postCode"  => "12345",
  "town"      => "Madrid",
  "province"  => "Madrid"
]);

$fac = new Facturae();
$fac->setNumber('TEST-DEC', '0001');
$fac->setIssueDate('2021-04-15');
$fac->setSeller($party);
$fac->setBuyer($party);

echo "==== 1. USANDO CARGOS ====\n";
$fac->addItem(new FacturaeItem([
    "name" => "Prueba",
    "quantity" => 1,
    "unitPriceWithoutTax" => 100,
    "charges" => [
        ["reason" => "Recargo de equivalencia", "rate" => 5.2, "hasTaxes" => false]
    ],
    "taxes" => [
        Facturae::TAX_IVA => 21,
        Facturae::TAX_IRPF => 19
    ]
]));
$totals = $fac->getTotals();
echo "Total factura: {$totals['invoiceAmount']}\n";
echo "Total importe bruto: {$totals['grossAmountBeforeTaxes']}\n\n";
$fac->clearItems();

echo "==== 2. USANDO IMPUESTOS ESPECIALES ====\n";
$fac->addItem(new FacturaeItem([
    "name" => "Prueba",
    "quantity" => 1,
    "unitPriceWithoutTax" => 100,
    "taxes" => [
        Facturae::TAX_IVA => 21,
        Facturae::TAX_IE => 5.2,
        Facturae::TAX_IRPF => 19
    ]
]));
$totals = $fac->getTotals();
echo "Total factura: {$totals['invoiceAmount']}\n";
echo "Total importe bruto: {$totals['grossAmountBeforeTaxes']}\n\n";
$fac->clearItems();

echo "==== 3. USANDO RECARGO DE EQUIVALENCIA ====\n";
$fac->addItem(new FacturaeItem([
    "name" => "Prueba",
    "quantity" => 1,
    "unitPriceWithoutTax" => 100,
    "taxes" => [
        Facturae::TAX_IVA => ['rate'=>21, 'surcharge'=>5.2],
        Facturae::TAX_IRPF => 19
    ]
]));
$totals = $fac->getTotals();
echo "Total factura: {$totals['invoiceAmount']}\n";
echo "Total importe bruto: {$totals['grossAmountBeforeTaxes']}\n\n";

@josemmo josemmo closed this as completed Apr 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants