Saltar al contenido principal

Anulación de Secuencias (ANECF)

Permite anular ante la DGII rangos de e-NCF que no fueron utilizados o no fueron aceptados, mediante el formato de Anulación de e-NCF (ANECF v1.0). Facturo genera el documento ANECF, lo firma con el certificado de la empresa y lo envía a la DGII.

POST /api/v1/companies/{company_id}/emission/cancel-ranges

Reglas de negocio de la DGII​

  1. Solo secuencias no utilizadas: la DGII acepta ANECF únicamente para números que no fueron aceptados previamente. Un comprobante ya aceptado se neutraliza con una Nota de Crédito Electrónica (E34), no con ANECF.
  2. 13 caracteres exactos: todo e-NCF tiene el formato [Serie 1][Tipo 2][Secuencia 10], por ejemplo E310000000001.
  3. Series válidas: de E a Z, excepto P.
  4. Orden ascendente: la parte numérica de from_encf debe ser menor o igual que la de to_encf.

Cuerpo de la petición​

CampoTipoRequeridoDescripción
detailsarraySíAnulaciones agrupadas por tipo de e-CF.
details[].ecf_typeintegerSíTipo de e-CF (31, 32, 33, 34, 41, 43, 44, 45, 46, 47).
details[].sequence_rangesarraySíRangos a anular.
details[].sequence_ranges[].from_encfstringSíe-NCF inicial (13 caracteres).
details[].sequence_ranges[].to_encfstringSíe-NCF final (13 caracteres). Igual a from_encf para anular un solo número.
details[].line_numberintegerNoNúmero de línea del detalle.
dgii_envstringNotestecf, certecf o ecf.
company_idstringNoUUID de la empresa (ya va en la ruta).

Facturo convierte el cuerpo al XML ANECF v1.0 de la DGII: cada elemento de details es una Anulacion (máximo 10 por petición) y cada rango una Secuencias (SecuenciaeNCFDesde / SecuenciaeNCFHasta). Facturo calcula CantidadeNCFAnulados y la fecha de anulación.

Anular un solo e-NCF​

curl -X POST \
"https://ecf.facturord.app/api/v1/companies/$FACTURO_COMPANY_ID/emission/cancel-ranges" \
-H "X-API-Key: $FACTURO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"dgii_env": "testecf",
"details": [
{
"ecf_type": 31,
"sequence_ranges": [
{ "from_encf": "E310000000001", "to_encf": "E310000000001" }
]
}
]
}'

Anular varios rangos y tipos en una sola petición​

{
"dgii_env": "testecf",
"details": [
{
"ecf_type": 31,
"sequence_ranges": [
{ "from_encf": "E310000000010", "to_encf": "E310000000020" },
{ "from_encf": "E310000000035", "to_encf": "E310000000035" }
]
},
{
"ecf_type": 32,
"sequence_ranges": [
{ "from_encf": "E320000000100", "to_encf": "E320000000150" }
]
}
]
}

Respuesta​

{
"rnc": "101672919",
"code": "1",
"name": "Aprobada",
"total_cancelled": 1,
"messages": [],
"signed_xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?>...",
"signed_xml_path": "..."
}
CampoTipoDescripción
rncstringRNC del emisor.
codestringCódigo de respuesta de la DGII.
namestringDescripción del código (ej.: Aprobada).
total_cancelledintegerCantidad total de secuencias anuladas.
messagesstring[]Mensajes devueltos por la DGII.
signed_xmlstring | nullXML ANECF firmado enviado a la DGII.
signed_xml_pathstring | nullRuta interna del XML ANECF firmado.

¿ANECF o Nota de Crédito?​

SituaciónAcción
El e-NCF nunca se envió, o la DGII no lo aceptóAnular con ANECF (este endpoint)
Secuencias saltadas, dañadas o vencidasAnular el rango con ANECF
El comprobante ya fue aceptado por la DGIIEmitir una Nota de Crédito Electrónica (E34)

Con los clientes oficiales​

Los clientes oficiales incluyen atajos para este endpoint:

MétodoDescripción
cancel_ranges / CancelRangesAsync / cancelRangesEnvía uno o varios detalles por tipo de e-CF
cancel_single_sequence / CancelSingleSequenceAsync / cancelSingleSequenceAnula un único e-NCF
cancel_sequence_range / CancelSequenceRangeAsync / cancelSequenceRangeAnula un rango continuo
from ecf_client import FacturoClient, ECFType, DGIIEnv

client = FacturoClient(api_key="...", company_id="...")
res = client.cancel_sequence_range(
ecf_type=ECFType.E31_CREDITO_FISCAL,
from_encf="E310000000010",
to_encf="E310000000020",
dgii_env=DGIIEnv.TESTECF,
)
print(res.code, res.name, res.total_cancelled)