MINUTE_IN_SECONDS, 'display' => __( 'Cada minuto (ValidaFirma)', 'validafirma' ), ); $intervalos['validafirma_15_min'] = array( 'interval' => 15 * MINUTE_IN_SECONDS, 'display' => __( 'Cada 15 minutos (ValidaFirma)', 'validafirma' ), ); return $intervalos; } /** * Programa las tareas que falten. * * @return void */ public static function programar() { $tareas = array( 'validafirma_reintentos' => 'validafirma_minuto', 'validafirma_revision' => 'validafirma_15_min', 'validafirma_diario' => 'daily', ); foreach ( $tareas as $gancho => $intervalo ) { if ( ! wp_next_scheduled( $gancho ) ) { wp_schedule_event( time() + 60, $intervalo, $gancho ); } } } /** * Quita todas las tareas del plugin. * * @return void */ public static function desprogramar() { foreach ( array( 'validafirma_reintentos', 'validafirma_revision', 'validafirma_diario', 'validafirma_descargar_firmado' ) as $gancho ) { wp_clear_scheduled_hook( $gancho ); } } /** * Cron cada minuto: repite los envíos con falla pasajera. * * @return void */ public static function tarea_reintentos() { if ( Validafirma_Conexion::estado() ) { Validafirma_Enviador::reintentar_pendientes(); } } /** * Cron cada 15 minutos: revisa solo lo pendiente, 50 por pasada, a lo más una vez cada 15 minutos por documento. * * @return void */ public static function tarea_revision() { if ( ! Validafirma_Conexion::estado() ) { return; } foreach ( Validafirma_Envios::para_revisar( 50 ) as $envio ) { self::revisar_envio( $envio ); } } /** * Consulta el estado de un documento y aplica la transición si terminó. * * @param array $envio Envío pendiente. * @return array|WP_Error Cuerpo de la respuesta de la API. */ public static function revisar_envio( array $envio ) { // La marca de revisión va primero: garantiza el espacio de 15 minutos aunque la consulta falle. Validafirma_Envios::actualizar( $envio['id'], array( 'ultima_revision_en' => Validafirma_Envios::ahora() ) ); $modo = $envio['es_prueba'] ? 'prueba' : 'produccion'; $respuesta = Validafirma_Cliente_API::instancia()->estado_documento( $modo, $envio['documento_id'] ); if ( is_wp_error( $respuesta ) ) { $datos = Validafirma_Cliente_API::datos_de( $respuesta ); if ( 404 === $datos['status'] ) { // Un 404 no se consulta más: o el documento de prueba ya se borró, o es un error de configuración. Validafirma_Envios::actualizar( $envio['id'], array( 'motivo' => 'no_encontrado' ) ); } return $respuesta; } $cuerpo = is_array( $respuesta['cuerpo'] ) ? $respuesta['cuerpo'] : array(); $estado = isset( $cuerpo['documento']['estado'] ) ? (string) $cuerpo['documento']['estado'] : ''; self::aplicar_estado_de_la_api( $envio, $estado ); return $cuerpo; } /** * Traduce el estado de la API al del sitio y lo aplica. * * @param array $envio Envío. * @param string $estado Estado según la API. * @return string El mismo estado. */ public static function aplicar_estado_de_la_api( array $envio, $estado ) { $mapa = array( 'firmado' => 'firmado', 'rechazado' => 'rechazado', 'cancelado' => 'cancelado', 'expirado' => 'vencido', 'no_emitido' => 'no_emitido', ); if ( isset( $mapa[ $estado ] ) ) { Validafirma_Avisos::aplicar_estado( $envio, $mapa[ $estado ] ); } return $estado; } /** * Pasada diaria: purga lo viejo, refresca el secreto de avisos y reintenta las descargas que faltan. * * @return void */ public static function tarea_diaria() { Validafirma_Envios::purgar_sin_enviar(); global $wpdb; $tabla = Validafirma_Instalador::tabla( 'entregas' ); $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE recibida_en < %s', $tabla, Validafirma_Envios::ahora( time() - 30 * DAY_IN_SECONDS ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery if ( Validafirma_Conexion::estado() ) { Validafirma_Conexion::refrescar_secretos(); foreach ( Validafirma_Envios::firmados_sin_copia() as $envio ) { Validafirma_Avisos::programar_descarga( $envio['id'], 1 ); } } } }