# once-store/once-verduleria architecture

> Architecture diagram of the GitHub repository once-store/once-verduleria, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/once-store/once-verduleria
- Repository: https://github.com/once-store/once-verduleria

## Overview

This repository is a browser-based produce-shop PWA: customers browse lot-priced products, place an order, choose payment, and receive a ticket; staff use role-gated screens to prepare orders and run store operations. The frontend connects to Supabase for authentication and business data, while Mercado Pago and the WhatsApp bot are external. Several staff-screen capabilities are documented in the README but their full implementations were not sampled, so those relationships are shown only where documented.

Main entry points: [`sesion.js`](https://github.com/once-store/once-verduleria/blob/master/sesion.js) (Session and roles), [`app.js`](https://github.com/once-store/once-verduleria/blob/master/app.js) (Catalog and checkout), [`armado.js`](https://github.com/once-store/once-verduleria/blob/master/armado.js) (Order assembly), [`admin.js`](https://github.com/once-store/once-verduleria/blob/master/admin.js) (Staff dashboard)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_shop["Customer storefront"]
  node_storefront["Catalog and checkout<br/>[app.js]"]
  node_payment_returns["Payment returns<br/>[pago-exitoso.html]"]
  node_ticket["Order ticket<br/>[ticket.js]"]
end

subgraph group_staff["Staff operations"]
  node_admin["Staff dashboard<br/>[admin.js]"]
  node_assembly["Order assembly<br/>[armado.js]"]
  node_cash["Cash register<br/>[caja.js]"]
  node_customers["Customer accounts<br/>[clientes.js]"]
  node_conversations["WhatsApp conversations<br/>[conversaciones.js]"]
  node_hours["Store hours<br/>[horario.js]"]
  node_alerts["Staff alerts<br/>[sidebar-alertas.js]"]
end

subgraph group_stock["Stock and finance"]
  node_purchases["Purchases and ripening<br/>[compras.js]"]
  node_inventory["Inventory control<br/>[inventario.js]"]
  node_promotions["Promotions<br/>[promociones.js]"]
  node_finance["Financial management<br/>[finanzas.js]"]
  node_metrics["Sales metrics<br/>[metricas.js]"]
  node_crate["Crate lookup<br/>[cajon.js]"]
end

subgraph group_core["Shared services"]
  node_session["Session and roles<br/>[sesion.js]"]
  node_database[("Supabase database")]
end

node_customer(("Customer"))
node_mercadopago["Mercado Pago"]
node_whatsapp_bot["WhatsApp bot"]

node_customer -->|"browses and orders"| node_storefront
node_storefront -->|"reads catalog; checks out"| node_database
node_storefront -.->|"starts payment"| node_mercadopago
node_mercadopago -->|"confirms payment"| node_database
node_mercadopago -->|"returns customer"| node_payment_returns
node_customer -->|"opens order receipt"| node_ticket
node_admin -->|"checks role"| node_session
node_admin -->|"loads dashboard data"| node_database
node_assembly -->|"checks role"| node_session
node_assembly -->|"loads orders and items"| node_database
node_cash -->|"checks role"| node_session
node_cash -->|"loads cash state"| node_database
node_customers -->|"checks role"| node_session
node_customers -->|"manages accounts"| node_database
node_conversations -->|"checks role"| node_session
node_conversations -->|"loads conversations"| node_database
node_purchases -->|"checks role"| node_session
node_purchases -->|"records purchases and lots"| node_database
node_inventory -->|"checks role"| node_session
node_inventory -->|"reads stock lots"| node_database
node_promotions -->|"checks role"| node_session
node_promotions -->|"manages promotions"| node_database
node_finance -->|"checks role"| node_session
node_finance -->|"loads finance data"| node_database
node_metrics -->|"checks role"| node_session
node_metrics -->|"loads sales metrics"| node_database
node_hours -->|"manages store hours"| node_database
node_crate -->|"looks up crate"| node_database
node_alerts -->|"displays calculated alerts"| node_database
node_whatsapp_bot -->|"leaves orders for preparation"| node_assembly

click node_storefront "https://github.com/once-store/once-verduleria/blob/master/app.js"
click node_payment_returns "https://github.com/once-store/once-verduleria/blob/master/pago-exitoso.html"
click node_ticket "https://github.com/once-store/once-verduleria/blob/master/ticket.js"
click node_admin "https://github.com/once-store/once-verduleria/blob/master/admin.js"
click node_assembly "https://github.com/once-store/once-verduleria/blob/master/armado.js"
click node_cash "https://github.com/once-store/once-verduleria/blob/master/caja.js"
click node_customers "https://github.com/once-store/once-verduleria/blob/master/clientes.js"
click node_conversations "https://github.com/once-store/once-verduleria/blob/master/conversaciones.js"
click node_purchases "https://github.com/once-store/once-verduleria/blob/master/compras.js"
click node_inventory "https://github.com/once-store/once-verduleria/blob/master/inventario.js"
click node_promotions "https://github.com/once-store/once-verduleria/blob/master/promociones.js"
click node_finance "https://github.com/once-store/once-verduleria/blob/master/finanzas.js"
click node_metrics "https://github.com/once-store/once-verduleria/blob/master/metricas.js"
click node_hours "https://github.com/once-store/once-verduleria/blob/master/horario.js"
click node_crate "https://github.com/once-store/once-verduleria/blob/master/cajon.js"
click node_alerts "https://github.com/once-store/once-verduleria/blob/master/sidebar-alertas.js"
click node_session "https://github.com/once-store/once-verduleria/blob/master/sesion.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_storefront,node_payment_returns,node_ticket toneBlue
class node_admin,node_assembly,node_cash,node_customers,node_conversations,node_hours,node_alerts toneAmber
class node_purchases,node_inventory,node_promotions,node_finance,node_metrics,node_crate toneMint
class node_session,node_database toneRose
class node_customer,node_mercadopago,node_whatsapp_bot toneIndigo
```

## Components

### Customer storefront

- [Catalog and checkout](https://github.com/once-store/once-verduleria/blob/master/app.js): `app.js`
- [Payment returns](https://github.com/once-store/once-verduleria/blob/master/pago-exitoso.html): `pago-exitoso.html`
- [Order ticket](https://github.com/once-store/once-verduleria/blob/master/ticket.js): `ticket.js`

### Staff operations

- [Staff dashboard](https://github.com/once-store/once-verduleria/blob/master/admin.js): `admin.js`
- [Order assembly](https://github.com/once-store/once-verduleria/blob/master/armado.js): `armado.js`
- [Cash register](https://github.com/once-store/once-verduleria/blob/master/caja.js): `caja.js`
- [Customer accounts](https://github.com/once-store/once-verduleria/blob/master/clientes.js): `clientes.js`
- [WhatsApp conversations](https://github.com/once-store/once-verduleria/blob/master/conversaciones.js): `conversaciones.js`
- [Store hours](https://github.com/once-store/once-verduleria/blob/master/horario.js): `horario.js`
- [Staff alerts](https://github.com/once-store/once-verduleria/blob/master/sidebar-alertas.js): `sidebar-alertas.js`

### Stock and finance

- [Purchases and ripening](https://github.com/once-store/once-verduleria/blob/master/compras.js): `compras.js`
- [Inventory control](https://github.com/once-store/once-verduleria/blob/master/inventario.js): `inventario.js`
- [Promotions](https://github.com/once-store/once-verduleria/blob/master/promociones.js): `promociones.js`
- [Financial management](https://github.com/once-store/once-verduleria/blob/master/finanzas.js): `finanzas.js`
- [Sales metrics](https://github.com/once-store/once-verduleria/blob/master/metricas.js): `metricas.js`
- [Crate lookup](https://github.com/once-store/once-verduleria/blob/master/cajon.js): `cajon.js`

### Shared services

- [Session and roles](https://github.com/once-store/once-verduleria/blob/master/sesion.js): `sesion.js`
- **Supabase database**

### Other components

- **Customer**
- **Mercado Pago**
- **WhatsApp bot**

## Connections

- Customer → Catalog and checkout: browses and orders (evidence: `README.md`)
- Catalog and checkout → Supabase database: reads catalog; checks out (evidence: `README.md`)
- Catalog and checkout → Mercado Pago: starts payment
- Mercado Pago → Supabase database: confirms payment (evidence: `README.md`)
- Mercado Pago → Payment returns: returns customer (evidence: `README.md`)
- Customer → Order ticket: opens order receipt (evidence: `README.md`)
- Staff dashboard → Session and roles: checks role (evidence: `admin.js`)
- Staff dashboard → Supabase database: loads dashboard data (evidence: `admin.js`)
- Order assembly → Session and roles: checks role (evidence: `armado.js`)
- Order assembly → Supabase database: loads orders and items (evidence: `armado.js`)
- Cash register → Session and roles: checks role (evidence: `caja.js`)
- Cash register → Supabase database: loads cash state (evidence: `caja.js`)
- Customer accounts → Session and roles: checks role (evidence: `clientes.js`)
- Customer accounts → Supabase database: manages accounts (evidence: `clientes.js`)
- WhatsApp conversations → Session and roles: checks role (evidence: `conversaciones.js`)
- WhatsApp conversations → Supabase database: loads conversations (evidence: `README.md`)
- Purchases and ripening → Session and roles: checks role (evidence: `compras.js`)
- Purchases and ripening → Supabase database: records purchases and lots (evidence: `compras.js`)
- Inventory control → Session and roles: checks role (evidence: `inventario.js`)
- Inventory control → Supabase database: reads stock lots (evidence: `README.md`)
- Promotions → Session and roles: checks role (evidence: `promociones.js`)
- Promotions → Supabase database: manages promotions (evidence: `promociones.js`)
- Financial management → Session and roles: checks role (evidence: `finanzas.js`)
- Financial management → Supabase database: loads finance data (evidence: `finanzas.js`)
- Sales metrics → Session and roles: checks role (evidence: `metricas.js`)
- Sales metrics → Supabase database: loads sales metrics (evidence: `metricas.js`)
- Store hours → Supabase database: manages store hours (evidence: `horario.js`)
- Crate lookup → Supabase database: looks up crate (evidence: `README.md`)
- Staff alerts → Supabase database: displays calculated alerts (evidence: `README.md`)
- WhatsApp bot → Order assembly: leaves orders for preparation (evidence: `README.md`)
