Cuándo KSeF da una factura por duplicada
KSeF busca duplicados en todas las facturas guardadas en el sistema. Deciden tres campos:
- el NIP del vendedor,
Podmiot1:NIP; - el tipo de factura,
RodzajFaktury; - el número de factura,
P_2, que según el esquema FA(3) tiene que identificar la factura sin ambigüedad.
La unicidad dura 10 años completos, contados desde el final del año en que se emitió la factura. Cuenta siempre el NIP del vendedor: si varias sucursales o unidades emiten en nombre de una misma empresa, tienen que ponerse de acuerdo en la numeración.

Qué trae la respuesta y qué guarda Odoo
En la respuesta de KSeF, el estado 440 tiene la descripción «Duplikat faktury» (factura duplicada) y dos campos en extensions: originalKsefNumber, el número KSeF de la factura que ya está en el sistema, y originalSessionReferenceNumber, la sesión en la que entró. El ejemplo de la documentación de la API pone en details un mensaje del tipo «Duplikat faktury. Faktura o numerze KSeF: … została już prawidłowo przesłana do systemu w sesji: …».
En Odoo 18, 19 y 20, el módulo l10n_pl_edi pone «KSeF Status» en Rejected y añade al historial «KSeF Status: Rejected (Code: 440). Duplicate invoice.» (en polaco en la 18 y la 19: «Status KSeF: Odrzucono (Kod: 440). Powielona faktura.»). Odoo no guarda extensions, así que el número KSeF del original no aparece en la factura. Como P_2, Odoo escribe el número de la factura en Odoo.
De dónde sale un duplicado con facturas de Odoo
| Situación | Qué pasa |
|---|---|
| La factura ya llegó a KSeF por otro canal y luego se envió desde Odoo | El original está en KSeF; el nuevo envío recibe 440. |
| El mismo NIP emite desde dos bases o empresas de Odoo con secuencias idénticas | Dos facturas distintas comparten tipo y número. |
| Las sucursales de una empresa llevan numeraciones propias que se pisan | KSeF cuenta el NIP del vendedor, no la sucursal. |
Odoo solo envía facturas sin estado KSeF. Una factura en Sent o Accepted no se puede enviar dos veces por despiste desde el mismo Odoo.
Cómo resolverlo
- Localiza el original: el número KSeF de
originalKsefNumbero la factura con ese número en KSeF. - Si es la misma factura, enviada antes por otro canal, no la vuelvas a enviar. Cada envío nuevo con ese número recibe 440.
- Si es otra factura con el mismo número, el problema está en la numeración: acuerda con tu asesoría series separadas para cada base, empresa o sucursal que comparta NIP.
¿La factura está en KSeF después de un 440?
Sí. En KSeF está la factura original, la de originalKsefNumber. Solo se rechazó el envío nuevo.
¿Cuánto tiempo recuerda KSeF un número de factura?
Durante 10 años completos desde el final del año de emisión. Hasta entonces, el mismo NIP, tipo y número dan 440.

Con nuestro módulo
Poland KSeF 2.0 Validator no envía facturas, pero tiene el botón «Mark accepted by KSeF» para una factura subida a KSeF fuera de Odoo, con el número KSeF que dio el sistema. Si después l10n_pl_edi envía también esa factura y KSeF la rechaza, el módulo la deja en Accepted y añade: «KSeF rejected the new sending of this invoice by l10n_pl_edi, already accepted by KSeF with KSeF number …: it stays Accepted.». En los demás casos toma de l10n_pl_edi el estado Rejected, sin el código 440.
Sigue leyendo
Comprobado en el código del módulo (versión 20.0) y en las fuentes enlazadas
Fuentes
- Código del módulo: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): i18n/pl.po
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/open-api.json
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/weryfikac
- github.com/CIRFMF/ksef-client-csharp/blob/a66cbc669814e6c2a615748a13a0a04a650ba04f/KSeF.Cl
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/i18n
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/i18n
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- 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: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): views/account_move_views.xml
