Una empresa de transporte que trabaja con el puerto de Valencia vive pendiente del PCS (Port Community System), la plataforma por la que la comunidad portuaria se intercambia las órdenes. Desarrollamos para ella una aplicación de gestión que habla directamente con el PCS y con su contabilidad en Sage 50.
Qué hace la aplicación
- Pedidos de puerto, de importación y de exportación, que se crean solos a partir de los mensajes del PCS. Y viajes refrigerados, con varias cargas y descargas.
- Cada pedido se divide en tramos, y cada tramo avanza por sus estados: recogida del contenedor, paso por escáner o inspección, carga o descarga en el cliente, regreso…
- Flota: cabezas tractoras y remolques que se enganchan y desenganchan, mantenimientos con aviso por fecha o por kilómetros, y gastos.
- Incidencias con fotos y conversación en directo entre el conductor y tráfico.
- Documentos: la carta de porte, rellena con los datos que llegan del puerto, y la impresión de las órdenes con código de barras y QR.
Hablar con el PCS
El PCS ofrece una API de mensajería: cada orden es un mensaje XML que se descarga de un buzón, y las respuestas se suben al mismo sistema. La autenticación es OAuth2 con credenciales de cliente, y el token se renueva solo cuando caduca.
Lo que entra. Un proceso descarga los mensajes pendientes y los convierte en pedidos. El documento único de transporte (DUT) y las órdenes de admisión y de entrega crean o actualizan el pedido y sus tramos; las confirmaciones del puerto los dan por terminados y fijan la matrícula real. Si llega una cancelación, el pedido se cancela, y si una orden caduca sin usarse, también. Cada mensaje se guarda con su número para no procesarlo nunca dos veces.
Lo que sale. Cuando tráfico asigna camión y conductor, o cambia la hora prevista, la aplicación genera el mensaje con los detalles del transporte (matrícula, conductor y precinto, o la hora estimada) y lo sube al PCS.
El acuse de recibo, el detalle que más guerra dio
Subir el mensaje no basta: el PCS contesta con un acuse que dice si lo acepta o lo rechaza, y ese acuse llega al buzón unos segundos después.
La primera versión esperaba un tiempo fijo antes de mirar. Como a veces no bastaba, la espera creció hasta los 20 segundos, y cada envío tardaba eso, hiciera falta o no. La solución final fue consultar el buzón cada segundo, buscar el acuse que responde exactamente a nuestro mensaje, retirarlo del buzón y enseñar el resultado: aceptado, o el motivo del rechazo tal como lo da el puerto. Si en 30 segundos no ha llegado, se avisa.
Dos ajustes más salieron del uso real:
- Órdenes reemitidas. Si el puerto vuelve a emitir una orden, el tramo cancelado se sustituye conservando su número, y uno ya terminado no se reabre.
- Importación en segundo plano. Al principio se hacía mientras el usuario esperaba; pasó a una cola que avisa con una notificación al terminar.
Sage 50: albaranes sin teclear
La contabilidad sigue en Sage 50. La aplicación se conecta a su servicio web para traer los clientes y las formas de pago. Cuando los pedidos terminan, desde la pantalla de albaranes se seleccionan, se indican cliente, forma de pago e importe, y los albaranes se crean en Sage de una vez. Cada pedido queda marcado para no enviarlo dos veces.
Tiempo real en el panel de tráfico
El panel de tráfico es un tablero por columnas (orden de entrega, en ruta, en cliente, regresando…) que se actualiza solo con Laravel Reverb. Lo que cambia un conductor desde el móvil, o lo que llega del puerto, aparece al momento sin recargar la página.
Una decisión poco habitual: en lugar de enviar datos y montar la tarjeta en el navegador, el servidor envía la tarjeta ya montada. Así hay una sola plantilla para todo, la misma que se ve al cargar la página.
El conductor usa la misma aplicación adaptada al móvil. Avanza paso a paso, con las fotos que pide cada paso (la puerta del contenedor, el precinto, la temperatura del frigorífico…) y los kilómetros. Si su hora estimada de llegada supera la de descarga, se abre una incidencia automáticamente.
Lo que aprendimos
Con un sistema externo, lo difícil no es enviar: es saber qué ha pasado con lo que enviaste. El acuse de recibo merece tanto cuidado como el propio mensaje.
- Cada mensaje, entrante o saliente, queda guardado con su número y su resultado. Cuando algo no cuadra, se mira en el registro y no en la memoria de nadie.
- Lo que llega de fuera se trata con desconfianza: cancelaciones, órdenes reemitidas y órdenes caducadas son el día a día, no la excepción.