Menú
← Desarrollador
Desarrollador · Case study

La Luna

Plataforma completa para el mayorista de frutas y verduras más importante de Maciel, Santa Fe.

Sitio web institucional + sistema de backoffice para gestión de pedidos, clientes y stock.

ReactViteNestJSTypeScriptPostgreSQLJWT
Ver sitio en producción

🌙

La Luna

Mayorista · Maciel, Santa Fe

6

Módulos admin

27

Endpoints API

7

Tablas en DB

En producción

Sitio público

La Luna — Sitio web institucional

Sistema admin

La Luna — Backoffice administrativo
El problema

La Luna es el mayorista de frutas y verduras más importante de Maciel, Santa Fe. Más de 15 años de trayectoria, múltiples sucursales, decenas de clientes mayoristas — y toda la operación gestionada por teléfono, WhatsApp y anotaciones en papel.

Sin presencia online, sin historial de pedidos, sin trazabilidad de pagos, sin control de stock por sucursal. Cada pedido era una conversación de WhatsApp manual sin registro. Cada mes, horas perdidas en la misma tarea.

El objetivo era claro: presencia digital que los posicione, y un sistema que les ahorre tiempo real todos los días.

Qué construí

Dos aplicaciones integradas

Sitio web

Web Institucional

  • Home con carrusel, valores de la empresa y sección mayorista
  • Página de sucursales: ubicación, horarios, contacto
  • Página mayorista con formulario de cotización
  • SEO local: meta tags, Open Graph, canonical
  • Responsive mobile-first
  • Carga rápida con React + Vite + code splitting
Sistema admin

Backoffice Administrativo

  • Autenticación JWT con roles (Admin / Vendedor)
  • Gestión de pedidos con integración WhatsApp automática
  • Control de pagos: precio total vs. monto abonado
  • CRUD de clientes con historial y estadísticas por cliente
  • Stock por sucursal con historial de cambios auditado
  • Dashboard con gráficos de ventas y top clientes

Módulos del backoffice

/ventas

Pedidos

Listado paginado con filtros, control de pagos (precio vs. abonado), estado Pago/Impago, y generación automática de links WhatsApp con mensaje pre-formateado para cada cliente.

/clientes

Clientes

CRUD completo con soft delete. Página de detalle por cliente: total facturado acumulado, cantidad de pedidos, último pedido y historial completo.

/mercaderia

Stock por sucursal

Gestión de stock en 4 sucursales. Modos SET (cantidad exacta) y ADD (suma/resta). Historial de cambios con auditoría: quién hizo el ajuste, cuándo y cuánto.

/estadisticas

Dashboard

KPIs de ventas (total, cobrado, pendiente), gráficos de tendencia, barras mensuales y pie chart. Tabla de top clientes por volumen de compra con filtros por período.

Técnico

Decisiones que importan

📱

WhatsApp integrado

Genera links wa.me con mensaje pre-formateado para cada pedido: cliente, descripción, precio formateado y dirección. Normaliza el número automáticamente desde cualquier formato.

📊

Auditoría de stock

Tabla historial que registra cada ajuste: usuario responsable, sucursal, cantidad anterior/nueva y timestamp. Trazabilidad completa sin pérdida de información.

Reportes en DB

Estadísticas calculadas con JOIN + GROUP BY en PostgreSQL. Queries de reporte por debajo de 500ms incluso con miles de pedidos, sin traer datos a memoria.

🔒

Soft delete + constraints

Clientes eliminados marcados como inactivos sin perder historial ni foreign keys. Check constraint en DB garantiza precioAbonado ≤ precio.

🗄️

Migraciones versionadas

Schema de DB con TypeORM migrations. Control de versión, reproducibilidad en cualquier entorno, rollback posible. Los cambios al schema son código.

📄

API documentada

27 endpoints REST documentados con Swagger disponible en /api/docs. Organizado en módulos por entidad. Facilita integraciones futuras.

Stack completo

Frontend

React 18ViteTypeScriptBootstrap 5React Hook FormRechartsFramer Motion

Backend

NestJS 11TypeORMPostgreSQLJWT + PassportbcryptSwagger

Infra

VercelRenderGitHub CI/CD