Cuatro maneras de identificar al comprador
| Elemento FA(3) | Descripción del esquema | Cuándo se usa |
|---|---|---|
NIP | «Identyfikator podatkowy NIP» (identificador fiscal NIP) | Comprador con NIP polaco. |
KodUE + NrVatUE | «Numer Identyfikacyjny VAT kontrahenta UE» (número de IVA de la contraparte en la UE) | Comprador con número de IVA de otro país de la UE, en los casos de la ley del IVA. |
KodKraju + NrID | «Identyfikator podatkowy inny» (otro identificador fiscal) | Otro identificador fiscal, por ejemplo de fuera de la UE. |
BrakID | «Podmiot nie posiada identyfikatora podatkowego lub identyfikator nie występuje na fakturze: 1- tak» (sin identificador fiscal, o no figura en la factura) | Consumidor o comprador sin identificador. |
El esquema solo comprueba el formato del NIP: 10 cifras según el patrón TNrNIP. La suma de control no la mira. La comprueba KSeF, pero solo en producción, para Podmiot1, Podmiot2, Podmiot3 y PodmiotUpowazniony. En el entorno de pruebas esa validación se activa con la cabecera X-KSeF-Feature: subject-identifier-validation. La documentación no dice con qué código rechaza KSeF una suma de control errónea.

Las marcas JST y GV
Las dos son obligatorias en Podmiot2 y valen 1 o 2:
- JST, «Znacznik jednostki podrzędnej JST.» (marca de unidad dependiente de un ente local): 1 si la factura afecta a una unidad dependiente de un ayuntamiento u otro ente local; entonces hay que rellenar
Podmiot3con el rol 8 y el NIP o el identificador interno de la unidad; - GV, «Znacznik członka grupy VAT.» (marca de miembro de un grupo de IVA): 1 si la factura afecta a un miembro de un grupo de IVA; entonces
Podmiot3con el rol 10; - 2 en cualquiera de las dos significa que la factura no les afecta.
Qué escriben Odoo 18, 19 y 20
Odoo elige el identificador a partir del NIF del cliente. Un NIP polaco va a NIP. Odoo solo escribe KodUE y NrVatUE en operaciones especiales, las que llevan las etiquetas de impuestos OSS_Base, OSS_Tax, Triangular Sale, K_21 o K_12; cualquier otro número extranjero va a KodKraju y NrID. Un cliente sin NIF recibe BrakID 1.
JST y GV, Odoo los escribe siempre como 2. Así que una factura para una unidad dependiente de un ente local, o para un miembro de un grupo de IVA, no se puede marcar desde Odoo como pide el esquema, y no llegará a esa unidad a través de Podmiot3.

Qué revisar antes de enviar
- El NIF del cliente: un NIP polaco con o sin el prefijo PL (sin él, Odoo toma el país de la ficha del cliente), con la suma de control correcta.
- Con un cliente de la UE: si la factura de verdad debe llevar
KodUEyNrVatUE, es decir, si las líneas tienen el impuesto adecuado. - Con clientes del sector público: si la factura debe llegar a una unidad dependiente; eso Odoo no lo escribe.
¿Nuestro módulo revisa el NIP del comprador?
En parte. Al usar «Mark ready for KSeF upload», Poland KSeF 2.0 Validator calcula la suma de control polaca del NIP del cliente y, si no cuadra, avisa con «Partner NIP invalid» y deja la factura en «Manual action required»: no pasa a «Ready to upload to KSeF». La aplica a cualquier NIF, también a uno extranjero, y un NIF de otro país casi nunca la cumple, así que con un cliente con NIF extranjero la factura se queda ahí aunque el NIF sea correcto. La validación de FlexigoTech Cloud revisa el fichero contra el esquema, es decir, el formato, sin la suma de control.
Sigue leyendo
Comprobado en el código del módulo (versión 20.0) y en las fuentes enlazadas
Fuentes
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/weryfikac
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/api-changelog.md#
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/data
- Código del módulo: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): models/account_move.py
- Código del módulo: FlexigoTech Cloud, validacion_efactura (motor_xsd.py y reglas.json)
- Código del módulo: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): models/ksef_cloud.py
