{"id":96,"date":"2026-10-10T17:04:06","date_gmt":"2026-10-10T23:04:06","guid":{"rendered":"https:\/\/rafaelsolis.dev\/proyectos\/ruta-distribucion-cerveceria\/"},"modified":"2026-10-10T17:04:06","modified_gmt":"2026-10-10T23:04:06","slug":"ruta-distribucion-cerveceria","status":"publish","type":"page","link":"https:\/\/rafaelsolis.dev\/en\/proyectos\/ruta-distribucion-cerveceria\/","title":{"rendered":"Distribution-route tracking platform for an international brewery"},"content":{"rendered":"<div class=\"wp-block-group alignfull rs-b-cabeza rs-b-cabeza--proyecto is-layout-flow wp-block-group-is-layout-flow\">\n<nav class=\"rs-migas\" aria-label=\"Breadcrumb\"><ol><li><a href=\"https:\/\/rafaelsolis.dev\/en\/\">Home<\/a><\/li><li><a href=\"https:\/\/rafaelsolis.dev\/en\/proyectos\/\">Projects<\/a><\/li><li aria-current=\"page\">Distribution-route tracking platform for an international brewery<\/li><\/ol><\/nav>\n\n\n\n<p class=\"rs-b-ceja wp-block-paragraph\">Distribution and logistics \u00b7 Confidential client<\/p>\n\n\n\n<h1 class=\"wp-block-heading rs-b-h1\">Distribution-route tracking platform for an international brewery<\/h1>\n\n\n\n<p class=\"rs-b-entrada wp-block-paragraph\">Dispatch-route tracking for a distributor of an international beer brand, with dynamic search across thousands of records.<\/p>\n\n\n\n<dl class=\"rs-ficha\"><div><dt>Client<\/dt><dd>Confidential client (through CodyExpert)<\/dd><\/div><div><dt>Role<\/dt><dd>Full-stack developer<\/dd><\/div><div><dt>Industry<\/dt><dd>Distribution and logistics<\/dd><\/div><div><dt>Period<\/dt><dd>2024 \u2013 2025<\/dd><\/div><div><dt>Solutions<\/dt><dd><ul class=\"rs-chips\"><li>Data and reporting<\/li><li>Process automation<\/li><\/ul><\/dd><\/div><div><dt>Technology<\/dt><dd>Yii2 \u00b7 PHP \u00b7 MySQL \u00b7 PostgreSQL<\/dd><\/div><\/dl>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull rs-b-seccion rs-b-caso is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rs-b-rotulo wp-block-paragraph\">Case study<\/p>\n\n\n\n<h2 class=\"wp-block-heading rs-b-h2\">The case<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The project tracked the delivery routes a distributor used to dispatch product from the brand to its points of sale. The core requirement was that any combination of filters \u2014 date, route, unit, delivery point, dispatch status \u2014 could be queried across thousands of records without each combination needing its own hand-written query.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rafael solved this by building an engine that dynamically concatenates SQL against the database based on the active filters: the resulting queries were huge but fully dynamic, generated at query time instead of maintained as a fixed catalog of reports. He also supported the system's infrastructure \u2014 permissions and routes \u2014 so different roles could check dispatch status according to their access level.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The design challenge wasn't just assembling dynamic SQL, but keeping it maintainable: adding a new filter had to mean extending the engine, not rewriting it.<\/p>\n\n\n\n<p class=\"rs-b-nota-conf wp-block-paragraph\">Confidential client: by agreement, its name is not published. That is professional discretion, not missing content.<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull rs-b-seccion is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rs-b-rotulo wp-block-paragraph\">Related<\/p>\n\n\n\n<h2 class=\"wp-block-heading rs-b-h2 translation-block\">Other <em>similar<\/em> projects.<\/h2>\n\n\n\n<div class=\"rs-obras\"><article class=\"rs-obra\" data-industria=\"energia\" data-soluciones=\"cfdi automatizacion datos apis\"><p class=\"rs-obra-meta\"><span>Energy and fuel<\/span><\/p><span class=\"rs-logos\"><img src=\"https:\/\/rafaelsolis.dev\/wp-content\/uploads\/2026\/10\/logo-bonobo.png\" alt=\"\" width=\"56\" height=\"56\" loading=\"lazy\" decoding=\"async\"><\/span><h3 class=\"rs-obra-nombre\"><a href=\"https:\/\/rafaelsolis.dev\/en\/proyectos\/bonobo\/\">Bonobo<\/a><\/h3><p class=\"rs-obra-cliente\">Brentec Soluciones Tecnol\u00f3gicas<\/p><p class=\"rs-obra-resumen\">Volumetric-control software for fuel stations: generates billing and the JSON file Mexico's tax authority (SAT) requires to audit fuel purchases and sales.<\/p><ul class=\"rs-chips\"><li>CFDI e-invoicing (SAT)<\/li><li>Process automation<\/li><li>Data and reporting<\/li><li>APIs and integrations<\/li><\/ul><\/article><article class=\"rs-obra\" data-industria=\"gobierno\" data-soluciones=\"reservas pagos datos apps\"><p class=\"rs-obra-meta\"><span>Government and parks<\/span><\/p><span class=\"rs-logos\"><img src=\"https:\/\/rafaelsolis.dev\/wp-content\/uploads\/2026\/10\/logo-cozumel-parks.png\" alt=\"\" width=\"56\" height=\"56\" loading=\"lazy\" decoding=\"async\"><img src=\"https:\/\/rafaelsolis.dev\/wp-content\/uploads\/2026\/10\/logo-fpmc.png\" alt=\"\" width=\"56\" height=\"56\" loading=\"lazy\" decoding=\"async\" class=\"is-claro\"><\/span><h3 class=\"rs-obra-nombre\"><a href=\"https:\/\/rafaelsolis.dev\/en\/proyectos\/entradas-parques-naturales\/\">CozumelParks \/ MERCAWEB<\/a><\/h3><p class=\"rs-obra-cliente\">Cozumel Parks and Museums Foundation (Fundaci\u00f3n de Parques y Museos de Cozumel)<\/p><p class=\"rs-obra-resumen\">Sales platform for the four parks and museums of the Cozumel Parks and Museums Foundation: online sales, box office, revenue reports and the identity \u201cCuatro sendas, una isla\u201d (Four paths, one island).<\/p><ul class=\"rs-chips\"><li>Bookings and online sales<\/li><li>Online payments<\/li><li>Data and reporting<\/li><li>Web and mobile apps<\/li><\/ul><\/article><article class=\"rs-obra\" data-industria=\"turismo\" data-soluciones=\"saas nube automatizacion\"><p class=\"rs-obra-meta\"><span>Tourism<\/span><\/p><span class=\"rs-logos\"><img src=\"https:\/\/rafaelsolis.dev\/wp-content\/uploads\/2026\/10\/logo-site-engine.png\" alt=\"\" width=\"56\" height=\"56\" loading=\"lazy\" decoding=\"async\"><\/span><h3 class=\"rs-obra-nombre\"><a href=\"https:\/\/rafaelsolis.dev\/en\/proyectos\/site-engine\/\">Site Engine<\/a><\/h3><p class=\"rs-obra-cliente\">Adventure Planet Group<\/p><p class=\"rs-obra-resumen\">Engine that automates domain purchasing and management so every site in the tour ecosystem is controlled from a single panel.<\/p><ul class=\"rs-chips\"><li>SaaS platforms<\/li><li>Cloud and infrastructure<\/li><li>Process automation<\/li><\/ul><\/article><\/div>\n<\/div>\n\n\n\n<div id=\"contacto\" class=\"wp-block-group alignfull rs-b-cierre is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"rs-b-rotulo wp-block-paragraph\">Contact<\/p>\n\n\n\n<h2 class=\"wp-block-heading rs-b-h2 translation-block\">Does your company have a <em>similar<\/em> problem?<\/h2>\n\n\n\n<p class=\"rs-b-entrada wp-block-paragraph\">Tell me how it operates today and what you want to solve.<\/p>\n\n\n\n<p class=\"rs-b-telefono wp-block-paragraph\"><a href=\"https:\/\/wa.me\/529999583010\">+52 999 958 3010<\/a><\/p>\n\n\n\n<p class=\"rs-b-correo wp-block-paragraph\"><a href=\"mailto:rafael.solis@adventureplanet.mx\">rafael.solis@adventureplanet.mx<\/a><\/p>\n\n\n\n<div class=\"wp-block-buttons rs-b-botones rs-centro is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button rs-b-boton-linea\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/rafaelsolis.dev\/en\/contacto\/\">Use the contact form<\/a><\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Inicio Proyectos Plataforma de seguimiento de rutas de distribuci\u00f3n para una cervecer\u00eda internacional Distribuci\u00f3n y log\u00edstica \u00b7 Cliente confidencial Plataforma de seguimiento de rutas de distribuci\u00f3n para una cervecer\u00eda internacional Seguimiento de las rutas de despacho de un proveedor de una marca de cervecer\u00eda internacional, con b\u00fasqueda din\u00e1mica sobre miles de registros. Cliente Cliente confidencial\u2026<\/p>","protected":false},"author":0,"featured_media":0,"parent":79,"menu_order":12,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-96","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/pages\/96","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/comments?post=96"}],"version-history":[{"count":0,"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/pages\/96\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/pages\/79"}],"wp:attachment":[{"href":"https:\/\/rafaelsolis.dev\/en\/wp-json\/wp\/v2\/media?parent=96"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}