Saltar a contenido

Mejoras en Manejo de Errores - registerPaymentsQB

Descripción General

Se implementó un sistema robusto de captura y manejo de errores para la API registerPaymentsQB utilizada en la sincronización de pagos con QuickBooks Online.

🎯 Problemas Solucionados

Antes de las Mejoras

  • ❌ Errores genéricos sin contexto específico
  • ❌ Falta de validación de parámetros requeridos
  • ❌ Logging insuficiente para debugging
  • ❌ Sin diferenciación entre tipos de error
  • ❌ Timeout y cuelgues en llamadas API
  • ❌ Respuestas malformadas sin captura

Después de las Mejoras

  • Categorización específica de errores por tipo
  • Validación previa de campos requeridos
  • Logging detallado en cada etapa del proceso
  • Timeouts configurables para evitar cuelgues
  • Context completo en logs para debugging
  • Manejo específico de diferentes tipos de error HTTP

🔧 Mejoras Técnicas Implementadas

1. Mejoras en UpdateIntuitOrdersTrait.php

A. Método registerInQuickBooks() Mejorado

Funcionalidades agregadas: - Logging detallado antes y después de llamadas API - Timeouts configurables (30s total, 10s conexión) - Validación de respuesta JSON - Categorización específica de errores - Manejo de diferentes excepciones HTTP

Tipos de Error Capturados: - connection_error: Problemas de conectividad - http_error: Errores HTTP (4xx, 5xx) - json_error: Respuesta JSON malformada
- api_error: Errores reportados por la API QB - general_error: Otros errores no categorizados

B. Método registerPaymentsQB() Mejorado

Validaciones Agregadas:

$requiredFields = ['CustomerRef', 'Total', 'FormaPago'];

Logging Detallado: - Log antes de envío con contexto completo - Log de éxito con IDs de QuickBooks - Log de error con detalles específicos

2. Mejoras en Jobs que Usan registerPaymentsQB

A. UpdateIntuitOrdersJob.php

  • ✅ Logging detallado antes de registrar pagos
  • ✅ Manejo específico de errores con context
  • ✅ Actualización de estado con información de error
  • ✅ Contador de errores para análisis
  • ✅ Información de reintentos y attempts

B. UploadSalesIntuitJob.php

  • ✅ Logging de éxito y error en registro de pagos
  • ✅ Import de Log facade agregado
  • ✅ Context específico para Invupos integration

C. UpdateIntuitFEJob.php

  • ✅ Logging completo del proceso de pagos
  • ✅ Información de FE (Factura Electrónica) en logs
  • ✅ Validación de respuesta mejorada

📊 Estructura de Logs Mejorada

Logs de registerPaymentsQB()

// Antes de envío
Log::info("registerPaymentsQB: Registrando pago", [
    'payment_id' => $datos['Id'],
    'customer_ref' => $datos['CustomerRef'],
    'total' => $datos['Total'],
    'forma_pago' => $datos['FormaPago'],
    'connection_id' => $this->connectionModel->id
]);

// En caso de error
Log::error("registerPaymentsQB: Fallo al registrar pago", [
    'payment_id' => $datos['Id'],
    'customer_ref' => $datos['CustomerRef'], 
    'total' => $datos['Total'],
    'connection_id' => $this->connectionModel->id
]);

// En caso de éxito
Log::info("registerPaymentsQB: Pago registrado exitosamente", [
    'payment_id' => $datos['Id'],
    'qb_payment_id' => $result['Id'],
    'connection_id' => $this->connectionModel->id
]);

Logs de registerInQuickBooks()

// Inicio de llamada
Log::info("registerInQuickBooks: Iniciando llamada API", [
    'endpoint' => $endpoint,
    'connection_id' => $this->connectionModel->id,
    'datos_count' => count($datos),
    'has_auth' => !empty($email) && !empty($password)
]);

// Respuesta recibida
Log::info("registerInQuickBooks: Respuesta recibida", [
    'endpoint' => $endpoint,
    'status_code' => $statusCode,
    'response_length' => strlen($responseContent),
    'connection_id' => $this->connectionModel->id
]);

Logs de Jobs con Context Extendido

// UpdateIntuitOrdersJob
Log::error("UpdateIntuitOrdersJob: Fallo crítico en registro de pago", [
    'organization_id' => $this->connectionModel->organization->id,
    'sales_header_id' => $salesHeader->ID,
    'payment_id' => $payment->UniqueReceiptID,
    'error_message' => $errorMessage,
    'payment_data' => $paymentData,
    'attempt_number' => $this->attempts(),
    'max_attempts' => config('queue.connections.redis.retry_after', 3)
]);

🔍 Casos de Error Específicos

1. Validación de Campos Requeridos

// Error cuando faltan campos requeridos
Log::error("registerPaymentsQB: Campos requeridos faltantes", [
    'missing_fields' => ['CustomerRef', 'Total'],
    'provided_data' => ['Id', 'FormaPago'],
    'connection_id' => $this->connectionModel->id
]);

2. Errores de Conexión

Log::error("registerInQuickBooks: Error de conexión", [
    'error' => 'cURL error 28: Operation timed out',
    'endpoint' => '/aciv2/create_payment_quickbooks',
    'connection_id' => 123,
    'error_type' => 'connection_error'
]);

3. Errores HTTP

Log::error("registerInQuickBooks: Error HTTP", [
    'error' => 'Client error: 400 Bad Request',
    'status_code' => 400,
    'response_body' => '{"error": "Invalid customer reference"}',
    'endpoint' => '/aciv2/create_payment_quickbooks',
    'connection_id' => 123,
    'error_type' => 'http_error'
]);

4. Errores de Respuesta JSON

Log::error("registerInQuickBooks: Error general", [
    'error' => 'Error decodificando respuesta JSON: Syntax error',
    'error_line' => 65,
    'error_file' => '/app/Traits/UpdateIntuitOrdersTrait.php',
    'endpoint' => '/aciv2/create_payment_quickbooks',
    'connection_id' => 123,
    'error_type' => 'general_error'
]);

🎯 Beneficios para Debugging

1. Identificación Rápida de Problemas

  • Logs categorizados por tipo de error
  • Context específico de organización y pago
  • Información de reintentos disponible

2. Trazabilidad Completa

  • ID de pago traceable en todos los logs
  • ID de organización y conexión incluidos
  • Timeline completo del proceso

3. Información para Monitoreo

  • Contadores de error por tipo
  • Métricas de tiempo de respuesta
  • Status codes de respuesta HTTP

4. Context para Resolución

  • Datos enviados disponibles en logs
  • Respuestas completas de API guardadas
  • Stack traces con línea específica de error

🧪 Testing y Validación

Script de Testing

Ubicación: docs/testing/test-registerpaymentsqb-error-handling.php

Funcionalidades: - ✅ Validación de campos requeridos - ✅ Simulación de errores de API - ✅ Testing de diferentes tipos de error - ✅ Verificación de logs generados

Ejecución:

cd /home/weirdolabs/code/docucenter
php docs/testing/test-registerpaymentsqb-error-handling.php

Casos de Prueba Incluidos

  1. Datos válidos completos - Verificar flujo normal
  2. Campo CustomerRef faltante - Error de validación
  3. Campo Total faltante - Error de validación
  4. Campo FormaPago faltante - Error de validación
  5. Conexión inexistente - Error de API
  6. Datos inválidos - Error HTTP

📈 Métricas de Mejora

Antes

  • ~5 líneas de código de manejo de error
  • 1 tipo de log genérico
  • Sin validación previa de datos
  • Sin context específico en errores

Después

  • ~150 líneas de código robusto de manejo de errores
  • 8 tipos diferentes de logs específicos
  • Validación completa de campos requeridos
  • Context detallado en todos los logs
  • 5 categorías de error específicas
  • Timeouts configurables para mejor control

🔄 Compatibilidad

Backward Compatibility

  • 100% compatible con jobs existentes
  • Misma interface pública de métodos
  • Sin breaking changes en signatures
  • Logs adicionales no afectan funcionalidad

Jobs Actualizados

  • UpdateIntuitOrdersJob - Manejo robusto de errores de pago
  • UploadSalesIntuitJob - Logging mejorado para Invupos
  • UpdateIntuitFEJob - Context de FE en logs

🎯 Próximos Pasos

Monitoreo en Producción

  1. Implementar alertas basadas en logs de error
  2. Dashboard de métricas de errores por tipo
  3. Análisis de patrones de fallo para optimización

Expansión de Mejoras

  1. Aplicar patrón similar a otros métodos del trait
  2. Implementar retry automático para errores transitorios
  3. Cache de respuestas exitosas para performance

Optimizaciones Adicionales

  1. Rate limiting para evitar spam de API
  2. Circuit breaker para protección de servicios
  3. Métricas de performance y throughput

Implementado por: Team de Docucenter

Fecha: 18 de Septiembre, 2025
Archivos Modificados: 4 archivos (trait + 3 jobs)
Líneas Agregadas: ~200 líneas de código robusto
Compatibilidad: 100% backward compatible