Skip to content

Despliegue y Servicios

En esta sección, se detalla el proceso de despliegue de la aplicación a producción y se describen los servicios externos con los que interactúa el microservicio.

Despliegue a Producción

El despliegue de glt-bol-service está completamente automatizado y se basa en un flujo de Integración y Despliegue Continuo (CI/CD).

Proceso de Despliegue Automático

El despliegue a producción se activa automáticamente cada vez que se realiza un merge a la rama main del repositorio oficial en GitHub: https://github.com/guanes/glt-bol-service.

El proceso funciona de la siguiente manera:

  1. Merge a main: Un desarrollador fusiona los cambios en la rama main.
  2. Activación del Pipeline: Esta acción dispara un pipeline de CI/CD (configurado en GitHub Actions o una herramienta similar) que construye una nueva imagen de Docker de la aplicación.
  3. Publicación de la Imagen: La nueva imagen se publica en el registro de contenedores de Google (GCR) bajo el nombre gcr.io/charliebertvg/glt-bol.
  4. Actualización en Kubernetes: El clúster de Kubernetes, que gestiona la aplicación, está configurado para usar esta imagen. La configuración del Deployment (kubernetes/base/deployment.yml) incluye la política imagePullPolicy: Always, lo que asegura que Kubernetes siempre descargue la versión más reciente de la imagen del contenedor al reiniciar el pod.
  5. Reinicio del Pod: El pipeline de CI/CD, después de publicar la imagen, fuerza un reinicio del pod correspondiente al servicio en Kubernetes. Esto hace que el clúster descarte el pod antiguo y cree uno nuevo con la imagen recién actualizada.

Gracias a esta configuración, los cambios se reflejan en producción de forma automática y segura, sin necesidad de intervención manual.

Servicios Externos

El microservicio depende de varias APIs y servicios externos para cumplir con su flujo de procesamiento de BOLs. A continuación, se describen cada uno de ellos.

1. CRM API

Este servicio gestiona toda la información relacionada con clientes, contactos, cotizaciones y Loads en la plataforma de SalesForce.

  • Cliente: app/services/crm_client.py
  • URL Base: https://crm-service-dev.charliebot.ai/api

Endpoints Utilizados:

  • POST /auth/access-token-v2

    • Propósito: Autenticarse en la API para obtener un token de acceso. Se reintenta automáticamente si un token expira.
  • POST /account

    • Propósito: Crear nuevas cuentas de tipo shipper (remitente) y consignee (destinatario).
  • POST /contact

    • Propósito: Crear nuevos contactos asociados a las cuentas, incluyendo contactos shipper, consignee y hazmat (materiales peligrosos) si es necesario.
  • GET /account/tai/{third_party}

    • Propósito: Obtener el ID de un cliente (customer_id) a partir de un identificador de terceros.
  • GET /mode

    • Propósito: Obtener el ID del modo de transporte (ej. "LTL").
  • POST /load/v2

    • Propósito: Crear un nuevo Load (registro de envío) en el sistema con toda la información procesada.
  • PATCH /load/{load_id}

    • Propósito: Actualizar un Load existente con información adicional como pro_number, carrier_bill_id, etc.
  • POST /carrier-quote

    • Propósito: Crear una cotización del transportista (CarrierQuote) asociada a un Load.
  • POST /customer-quote

    • Propósito: Crear una cotización para el cliente (CustomerQuote) asociada a un Load.
  • GET /carrier-service/primus/scacs

    • Propósito: Obtener información del servicio de un transportista utilizando su código SCAC.
  • GET /account/name

    • Propósito: Buscar y obtener el ID de una cuenta por su nombre, utilizado para encontrar el carrier_bill_id.

2. Primus API

Primus es la plataforma de donde provienen los correos con los BOLs. Esta API se utiliza para obtener información detallada de las reservas (bookings) a partir de los números de BOL.

  • Cliente: app/services/primus_client.py
  • URL Base: https://restapi.shipprimus.com/api/v1

Endpoints Utilizados:

  • POST /login

    • Propósito: Autenticarse para obtener un token de acceso.
  • GET /book

    • Propósito: Recuperar los datos completos de una o más reservas (bookings) utilizando una lista de BOLNumber.

3. Megatron API

Este servicio interno se utiliza para realizar cálculos específicos de logística, como los pies lineales (linear feet).

  • Cliente: app/services/megatron_client.py
  • URL Base: https://megatron.charliebot.ai/api/v1

Endpoints Utilizados:

  • POST /linear-feet/calculate
    • Propósito: Calcular los pies lineales totales de una carga a partir de sus dimensiones y si es apilable (stackable).

4. Google Vertex AI (GenAI)

Se utiliza el modelo multimodal de Google (gemini-2.5-flash) para extraer información estructurada directamente de los archivos PDF de los BOLs.

  • Cliente: app/services/agent/genai_client.py
  • Proyecto Vertex: automate-external-tms-loads

Funcionalidad:

  • Extracción de Datos: El cliente GenaiProcessor envía el contenido del PDF junto con un prompt y un schema de respuesta al modelo.
  • Procesamiento: El modelo analiza el documento y extrae campos clave como bill_to_third_party, detalles de los line_items (ej. hazmat_class_division, packaging_unit_count, stackable), entre otros.
  • Respuesta Estructurada: La API devuelve la información en un formato JSON que coincide con el schema definido, garantizando consistencia en los datos.

5. Mail API (Internal)

Un servicio interno que se conecta a una cuenta de correo para leer los emails que contienen los BOLs.

  • Cliente: app/services/mail_client.py
  • URL Base: http://graph-ltl-service.prod-assistant.svc.cluster.local

Endpoints Utilizados:

  • GET /api/graph/filtered-messages

    • Propósito: Obtener una lista de correos que coinciden con filtros predefinidos (asunto y remitente) para identificar los emails relevantes.
  • GET /api/graph/v2/attachments/{graph_id}

    • Propósito: Descargar los archivos adjuntos (los PDFs de los BOLs) de un correo específico, identificado por su graph_id.

6. SendGrid API

Servicio utilizado para el envío de notificaciones por correo electrónico, principalmente para alertar sobre errores en el procesamiento de un BOL.

  • Cliente: app/services/send_email.py

Funcionalidad:

  • Envío de Alertas: La clase EmailService utiliza la API de SendGrid para enviar correos electrónicos a una lista de destinatarios predefinida.
  • Plantillas Dinámicas: Se utiliza una plantilla de SendGrid (d-6c45b53a6ad24630a5df519bd5756147) que se rellena con datos dinámicos, como el número de BOL que falló y el mensaje de error correspondiente.