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:
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"doneEspera 201 en los cuatro. Unos segundos después, consulta cómo quedó cada uno; si alguno sigue pending, repite el bloque:
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_statusdonecustomer.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.