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:
- Merge a
main: Un desarrollador fusiona los cambios en la ramamain. - 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.
- 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. - 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íticaimagePullPolicy: Always, lo que asegura que Kubernetes siempre descargue la versión más reciente de la imagen del contenedor al reiniciar el pod. - 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) yconsignee(destinatario).
- Propósito: Crear nuevas cuentas de tipo
-
POST /contact- Propósito: Crear nuevos contactos asociados a las cuentas, incluyendo contactos
shipper,consigneeyhazmat(materiales peligrosos) si es necesario.
- Propósito: Crear nuevos contactos asociados a las cuentas, incluyendo contactos
-
GET /account/tai/{third_party}- Propósito: Obtener el ID de un cliente (
customer_id) a partir de un identificador de terceros.
- Propósito: Obtener el ID de un cliente (
-
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.
- Propósito: Crear un nuevo
-
PATCH /load/{load_id}- Propósito: Actualizar un
Loadexistente con información adicional comopro_number,carrier_bill_id, etc.
- Propósito: Actualizar un
-
POST /carrier-quote- Propósito: Crear una cotización del transportista (
CarrierQuote) asociada a unLoad.
- Propósito: Crear una cotización del transportista (
-
POST /customer-quote- Propósito: Crear una cotización para el cliente (
CustomerQuote) asociada a unLoad.
- Propósito: Crear una cotización para el cliente (
-
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.
- Propósito: Buscar y obtener el ID de una cuenta por su nombre, utilizado para encontrar el
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 deBOLNumber.
- Propósito: Recuperar los datos completos de una o más reservas (
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).
- Propósito: Calcular los pies lineales totales de una carga a partir de sus dimensiones y si es apilable (
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
GenaiProcessorenvía el contenido del PDF junto con unprompty unschemade respuesta al modelo. - Procesamiento: El modelo analiza el documento y extrae campos clave como
bill_to_third_party, detalles de losline_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
schemadefinido, 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.
- Propósito: Descargar los archivos adjuntos (los PDFs de los BOLs) de un correo específico, identificado por su
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
EmailServiceutiliza 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.