Pedimos juntos, pagamos claro.
Comanda es una webapp local para organizar pedidos grupales sin hacer cuentas a mano. Sirve para juntadas, oficina, reuniones, partidos, cooperativas chicas o cualquier situación donde una persona centraliza un pedido y después tiene que dividir lo que paga cada uno.
La app permite cargar productos distintos por persona, cerrar la comanda, copiar el pedido para el local, calcular deudas, marcar quién pagó y compartir el resumen por WhatsApp.
Nombre: Comanda
Tagline: Pedimos juntos, pagamos claro.
Hero: Una comanda para toda la juntada.
Descripción corta: Organizá pedidos grupales multiproducto, calculá deudas, marcá pagos y compartí el resumen por WhatsApp.
Tono: simple, cercano, práctico.
Color principal: naranja cálido.
Ícono: ticket/comanda.
Cuando varias personas piden comida juntas, suelen aparecer los mismos problemas:
- alguien tiene que anotar qué pidió cada uno;
- el pedido para el local queda mezclado;
- los precios cambian por producto;
- hay envío, recargo o descuento;
- no todos pagan al mismo tiempo;
- el resumen se termina armando a mano para WhatsApp.
Comanda ordena todo eso en una sola pantalla.
- Cargar pedidos por persona.
- Combinar productos distintos dentro de una misma comanda.
- Cargar por renglón:
- producto;
- opción o variedad;
- cantidad;
- unidad;
- precio unitario.
- Usar productos sugeridos, como:
- Empanada;
- Pizza;
- Gaseosa;
- Sanguche.
- Crear productos, opciones o unidades nuevas escribiéndolas directamente.
- Guardar automáticamente las nuevas sugerencias para próximas cargas.
- Total por producto y opción para enviar al local.
- Total por persona.
- Subtotal por persona.
- Recargo/envío.
- Descuento.
- Total general.
- Total pagado.
- Total pendiente.
El recargo/envío y el descuento pueden dividirse de dos formas:
-
Proporcional al consumo
Quien pidió más, paga una parte mayor del ajuste. -
Partes iguales
El ajuste se reparte en partes iguales entre todas las personas cargadas.
La configuración está en la sección Configuración, en el campo:
Dividir recargo/descuento- Marcar persona como pagada.
- Volver a marcar como pendiente.
- Ver total pagado y total pendiente.
- Incluir el estado de pago en los textos copiados.
- Copiar resumen completo.
- Copiar sólo pedido para el local.
- Copiar sólo deudas por persona.
- Compartir resumen por WhatsApp.
- Imprimir resumen.
- Guarda la comanda en
localStorage. - No requiere backend.
- No requiere base de datos.
- No requiere login.
- Permite exportar/importar JSON para mover una comanda entre equipos.
Ejemplo de carga:
Persona: Nico
Producto Opción Cantidad Unidad Precio
Empanada Jamón y queso 3 unidad 1200
Empanada Carne 2 unidad 1200
Gaseosa Coca 1.5L 1 botella 2800Otra persona:
Persona: Timo
Producto Opción Cantidad Unidad Precio
Pizza Muzzarella 0.5 pizza 9000
Gaseosa Sprite 1.5L 1 botella 2800🧾 Viernes oficina
Pedido para el local:
Empanada:
- Carne: 2 unidades
- Jamón y queso: 3 unidades
Gaseosa:
- Coca 1.5L: 1 botella
- Sprite 1.5L: 1 botella
Pizza:
- Muzzarella: 0,5 pizzas
Total: 5 unidades · 2 botellas · 0,5 pizzas💸 Viernes oficina
Deudas por persona:
- Nico: $8.800 - PENDIENTE
- Timo: $7.300 - PAGADO
Recargo/envío: $1.500
División del ajuste: proporcional
Total pagado: $7.300
Total pendiente: $8.800
Total general: $16.100Comanda está construida como una app web estática modular.
- HTML
- CSS
- JavaScript ES Modules
- Vite
- localStorage
- PWA básica con
manifest.jsonysw.js
No usa backend, base de datos ni framework frontend pesado.
comanda-grupal/
├── index.html
├── manifest.json
├── sw.js
├── package.json
├── README.md
├── .gitignore
├── assets/
│ └── icon.svg
└── src/
├── main.js
├── ui.js
├── state.js
├── catalog.js
├── normalize.js
├── totals.js
├── texts.js
├── dom.js
└── styles.cssManeja la interfaz, eventos y renderizado.
Contiene:
- formulario de configuración;
- selector de división del ajuste;
- carga de personas;
- carga de productos;
- resumen por producto;
- resumen por persona;
- acciones de copiar, compartir, cerrar y reabrir.
El selector de división del recargo/descuento está en este archivo:
<select id="adjustmentMode">
<option value="proportional">Proporcional al consumo</option>
<option value="equal">Partes iguales</option>
</select>Maneja el estado inicial, guardado, carga, exportación e importación.
El estado principal tiene esta forma:
{
name: "Comanda",
closed: false,
adjustments: {
surcharge: 0,
discount: 0,
mode: "proportional"
},
catalog: {
products: []
},
people: []
}Contiene los cálculos.
Responsabilidades:
- agrupar productos para el local;
- calcular subtotal general;
- calcular total por persona;
- calcular recargo/descuento;
- dividir el ajuste proporcionalmente o en partes iguales;
- calcular pagado y pendiente.
Genera los textos para copiar o compartir.
Incluye:
generateStoreText;generateDebtsText;generateFullSummaryText.
Define productos iniciales y sugerencias dinámicas.
Productos base:
- Empanada;
- Pizza;
- Gaseosa;
- Sanguche.
Cada producto puede tener:
{
name: "Pizza",
key: "pizza",
unit: "pizza",
unitOptions: ["pizza", "porción", "unidad"],
basePrice: 9000,
allowDecimals: true,
options: ["Muzzarella", "Napolitana", "Fugazzeta"]
}Normaliza productos y opciones para evitar duplicados.
Ejemplos:
"empanadas" → "empanada"
"JyQ" → "jamon y queso"
"jamon queso" → "jamon y queso"Requisitos:
- Node.js instalado.
- npm funcionando.
Instalar dependencias:
npm installCorrer en desarrollo:
npm run devAbrir:
http://localhost:5173En package.json:
"dev": "vite --host 0.0.0.0 --port 5173"Cambiar 5173 por el puerto deseado.
Ejemplo:
"dev": "vite --host 0.0.0.0 --port 3000"npm run buildEl resultado queda en:
dist/Vista previa del build:
npm run previewAl ser una app estática, se puede desplegar en:
- GitHub Pages;
- Netlify;
- Vercel;
- Cloudflare Pages;
- cualquier hosting estático.
Comanda guarda los datos localmente en el navegador.
Eso significa:
- los datos no se suben a ningún servidor;
- cada navegador/equipo tiene su propia comanda;
- si se borra el almacenamiento del navegador, se pierden los datos;
- para mover datos a otra máquina se debe usar exportar/importar JSON.
La app permite exportar la comanda a un archivo .json.
El archivo se descarga con nombre similar a:
comanda-2026-06-30.jsonLuego puede importarse desde otro navegador o computadora.
La primera versión está pensada para una persona que centraliza el pedido. Por eso no necesita usuarios, login ni base de datos.
Ventajas:
- más simple;
- más rápida;
- funciona localmente;
- no requiere deploy obligatorio;
- se puede usar offline parcialmente;
- no hay costos de servidor.
Aunque nació como una idea para empanadas, el modelo se generalizó para soportar:
- empanadas;
- pizza;
- bebidas;
- sanguches;
- helado;
- facturas;
- cualquier otro producto.
La unidad mínima es un ítem:
{
product: "Empanada",
option: "Jamón y queso",
quantity: 3,
unit: "unidad",
price: 1200
}- Editar personas ya cargadas.
- Duplicar persona.
- Duplicar comanda anterior.
- Historial local de comandas.
- Alias o datos de pago.
- Notas para el local.
- Plantillas personalizadas.
- Precios por unidad, por ejemplo pizza completa y porción.
- Modo oscuro.
- Instalable con mejor iconografía.
- Mejor soporte offline.
- Pantalla de inicio.
- Cache de assets más robusto.
Para que cada persona cargue desde su celular habría que sumar backend o base remota.
Opciones posibles:
- Supabase;
- Firebase;
- Django + Postgres;
- API propia.
Funciones posibles:
- crear comanda con link;
- compartir link;
- cada persona carga su pedido;
- organizador cierra la comanda;
- resumen en tiempo real.
comanda-grupalMIT.