Ir al contenido

Simular respuestas de SUNAT

En test, la razón social del cliente (customer.name) de una solicitud nueva elige el resultado: con estos valores el documento no va a SUNAT beta y responde un transporte simulado. Se compara sin distinguir mayúsculas y sin espacios en los extremos. En live estos nombres no simulan nada: son una razón social cualquiera y el documento va a SUNAT.

customer.name Factura Boleta (por resumen diario)
SIMULAR RECHAZO rejected con sunat.response_code 2022 y el webhook document.rejected El resumen se rechaza nombrándola: queda rejected, y las demás boletas del resumen vuelven a pending y van en el próximo
SIMULAR OBSERVACIONES accepted_with_observations con una nota 4287 en sunat.notes El resumen se acepta con esa nota: todas sus boletas quedan accepted_with_observations
SIMULAR TIMEOUT Sin respuesta: queda submitted con sunat.reconciliation_required: true, como un tiempo de espera real que la plataforma no reenvía El envío del resumen queda sin respuesta: sus boletas, submitted y por conciliar
SIMULAR VENCIMIENTO No se envía: queda deadline_missed y status: expired, con el webhook document.deadline_missed y el aviso por correo Igual, en la próxima corrida del planificador de resúmenes, a lo sumo 10 minutos después, sin entrar en un resumen

Este bloque emite una factura por caso, cada una con su archivo, su identidad y su clave. Usa la terminal y el COMPANY_ID de Primeros pasos:

Ventana de terminal
for CASO in RECHAZO OBSERVACIONES TIMEOUT VENCIMIENTO; do
OPERACION=$(python -c 'import uuid; print(uuid.uuid4())')
cat > "caso-$CASO.json" <<JSON
{
"type": "factura",
"company_id": "$COMPANY_ID",
"customer": {
"document_type": "ruc",
"document_number": "20000000001",
"name": "SIMULAR $CASO"
},
"items": [{"description": "Ensayo", "quantity": 1, "unit": "ZZ", "unit_price": 12.00}],
"external_id": "guia-$OPERACION"
}
JSON
curl -sS -o "caso-$CASO-respuesta.json" -w "$CASO %{http_code}\n" \
-H "Authorization: Bearer $BOLETURA_API_KEY" \
-H "Idempotency-Key: $OPERACION" \
-H 'Content-Type: application/json' \
--data-binary "@caso-$CASO.json" "$BOLETURA_BASE_URL/v1/documents"
done

Espera 201 en los cuatro. Unos segundos después, consulta cómo quedó cada uno; si alguno sigue pending, repite el bloque:

Ventana de terminal
for CASO in RECHAZO OBSERVACIONES TIMEOUT VENCIMIENTO; do
ID=$(campo "caso-$CASO-respuesta.json" id)
curl -sS -o "caso-$CASO-estado.json" \
-H "Authorization: Bearer $BOLETURA_API_KEY" \
"$BOLETURA_BASE_URL/v1/documents/${ID:?}"
printf '%s: ' "$CASO"
campo "caso-$CASO-estado.json" sunat_status
done
customer.name Resultado que debes manejar
SIMULAR RECHAZO rejected, código 2022; corrección con un documento nuevo
SIMULAR OBSERVACIONES accepted_with_observations, nota 4287
SIMULAR TIMEOUT submitted, sunat.reconciliation_required: true; sin respuesta fiscal definitiva, no reemitir
SIMULAR VENCIMIENTO deadline_missed y status: expired; pedir la intervención de Boletura

Usa facturas para empezar: se envían una por una. En boletas, el rechazo, el tiempo de espera y las observaciones afectan al resumen y pueden afectar a las otras boletas de la misma corrida, porque en un resumen manda el caso que más lo afecta: un rechazo, después un tiempo de espera y después las observaciones. Usa datos de ensayo separados o deja más de 10 minutos entre una y otra. Un tiempo de espera simulado de SUNAT no es un tiempo de espera de tu llamada HTTP: la emisión sigue respondiendo 201. En SUNAT beta, un resultado incierto puede quedar pendiente de intervención, porque beta no ofrece la consulta de un CDR individual.

No hace falta registrar credenciales SOL: sin credenciales propias, test usa el usuario público de beta. Si la empresa guardó unas y quedaron no válidas, el envío se pausa como uno real, salvo SIMULAR VENCIMIENTO, que vence sin pasar por el transporte.

SIMULAR RECHAZO, SIMULAR TIMEOUT y SIMULAR VENCIMIENTO también envían el correo de aviso de un caso real a los usuarios activos de la cuenta con rol operator o superior; en una simulación no hay que hacer nada con él. SIMULAR OBSERVACIONES no envía correo. En test, cada cuenta recibe unos 20 de estos correos al día como máximo; los demás no salen, y el estado del comprobante se sigue consultando igual.