Generar la orden de pago para renovar un certificado
POST/certificate-request/:id/issuance/renew
Crea una orden de pago (order_type=CERTIFICATE_RENEWAL, status=PENDING, quantity=1, vigencia=1) para extender 1 año la vigencia de un certificado Viafirma de 1 año, sin reemitirlo (Viafirma ya lo emitió por 2 años). Sin cuerpo. Elegibilidad: la misma de GET /certificate-request/{id}/issuance/renewal (certificado Viafirma emitido, solicitud en PROCESSED, life menor a 2 y hasta el fin del periodo de gracia: vencimiento comercial + viafirma.revocation.grace_days); si no se cumple responde 422 con reason y las fechas en data, sin crear orden. Una sola orden pendiente: si ya existe una orden de renovación PENDING para la solicitud, devuelve esa misma (con su precio original) en lugar de crear otra y actualiza su updated_at; también responde 200. Una orden de renovación PENDING creada o actualizada (o con un pago iniciado) en las últimas 48 h cuenta como pago en curso y frena la revocación automática, pero solo hasta vencimiento comercial + días de gracia + 3 días; pasado ese tope el certificado se revoca aunque haya un pago en curso. Orden nueva: el precio es la tarifa de 1 año (IVA incluido) del tipo de usuario de quien llama (users.type_id); si llama un administrador (type_id 1) se usa la del primer usuario no administrador de la empresa dueña de la solicitud (business_users) y, si la empresa no tiene ninguno, la del propio administrador (tipo 1). Para los tipos 3 (Arrendamiento en Servidor) y 4 (Partner) el tramo se elige por volumen (el mismo cálculo de GET .../issuance/renewal: solicitudes de la empresa en PROCESSED o PROCESSING creadas en el año actual o el anterior y aún vigentes, más 1; suele incluir el propio certificado mientras no haya vencido), así que puede no ser la tarifa de 1 certificado; para los demás tipos es la de 1 certificado. La orden queda a nombre de quien llama (user_id) y de la empresa de la solicitud (company_id), con el proveedor de pago WOMPI (payment_provider=WOMPI, payment_method=null en una orden nueva; una orden PENDING reutilizada puede traer el medio de pago de un intento anterior que quedó pendiente, anulado o con error) y una referencia con el formato {prefijo}-RNW-{AAAAMMDDhhmmss}-{6 caracteres}. Esta llamada NO cobra: el pago se ejecuta después con los endpoints de Órdenes; al aprobarse, se extienden life y expiration_date del mismo certificado.
Request
Responses
- 200
- 400
- 401
- 404
- 422
- 429
- 500
Orden de renovación creada, o la orden PENDING que ya existía. La orden viene en data (no en dataRecords); el mensaje es el mismo en ambos casos. Siempre es una orden CERTIFICATE_RENEWAL: certificate_request_id es el {id} de la ruta, quantity=1, vigencia=1, status=PENDING, payment_provider=WOMPI, payment_method=null en una orden nueva (una orden PENDING reutilizada puede traer el medio de pago de un intento anterior que quedó pendiente, anulado o con error) y provider_reference con -RNW-; los importes son strings decimales con 2 cifras y el id numérico no se expone.
Cualquier otro error al generar la orden (p. ej. no hay un rango de precios configurado para el tipo de usuario, o falla la base de datos una vez superada la comprobación de acceso a la solicitud: al evaluar la renovación, calcular el precio o buscar o crear la orden), prefijado por 'Error al procesar la renovación: '. Un error de negocio conserva su mensaje; un fallo de base de datos se reemplaza por un texto genérico sin SQL ni datos (p. ej. 'Error al procesar la renovación: No se pudo completar la operación en la base de datos.'). No se crea ninguna orden.
No autenticado (token ausente, inválido o expirado).
La solicitud no existe o pertenece a otra empresa (el administrador accede a todas). Mensaje: La solicitud de certificado {id} no existe. (provider=null).
El certificado no es renovable hoy: reason es NOT_RENEWABLE_PROVIDER, NOT_ACTIVE, MAX_TERM o GRACE_EXPIRED y data trae la evaluación completa (mismos campos que GET .../issuance/renewal, sin quote ni pending_order). No se crea ninguna orden.
Límite general de 60 peticiones por minuto excedido.
Error no controlado, que no pasa por el 400 anterior: p. ej. cuando {id} no es un número entero (como el UUID de la solicitud que usan los endpoints de descarga), cuando falla la base de datos al buscar la solicitud, antes de evaluar la renovación (responde 500, no 400), u otro error interno que no es una excepción de aplicación. Lo responde el manejador de errores general con {"message": "Server Error"} (sin success) en producción; si la petición no envía Accept: application/json, la respuesta puede ser una página HTML.