# ernesthdj/artisastock-v2 architecture

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

- Interactive diagram: https://gitdiagram.com/ernesthdj/artisastock-v2
- Repository: https://github.com/ernesthdj/artisastock-v2

## Overview

Artisastock is a multi-tenant bakery operations application spanning ingredient purchasing and stock, recipe/BOM production, product management, point-of-sale, and an online storefront. The principal operational flow is purchasing ingredients, defining producible BOM sheets, publishing products, and selling them through POS or the storefront; sales and payment events update operational records. The tree also shows team access, CMS, invoicing, and dashboard capabilities. The README is empty, and sampled source is limited, so links between unsampled screens and API routes are not inferred.

Main entry points: [`src/lib/prisma.ts`](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/prisma.ts) (Tenant data), [`src/app/api/webhooks/stripe/route.ts`](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/webhooks/stripe/route.ts) (Stripe webhook), [`src/app/api/v1/bom/sheets/route.ts`](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/bom/sheets/route.ts) (BOM sheets API), [`src/app/api/v1/products/route.ts`](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/products/route.ts) (Products API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_admin["Operations UI"]
  node_dashboard_ui["Operations pages<br/>[page.tsx]"]
  node_team_ui["Team settings<br/>[page.tsx]"]
  node_cms_ui["Storefront CMS<br/>[page.tsx]"]
  node_cms_api["CMS pages API<br/>[route.ts]"]
  node_users_api["Team API<br/>[route.ts]"]
end

subgraph group_inventory["Inventory"]
  node_purchase_api["Purchases API<br/>[route.ts]"]
  node_ingredient_api["Ingredients API<br/>[route.ts]"]
  node_stock_ui["Stock views<br/>[page.tsx]"]
  node_supplier_api["Suppliers API<br/>[route.ts]"]
end

subgraph group_production["Production"]
  node_recipe_api["Recipes API<br/>[route.ts]"]
  node_bom_api["BOM sheets API<br/>[route.ts]"]
  node_bom_cost["BOM costing<br/>[cost.ts]"]
  node_fifo["FIFO production stock<br/>[fifo.ts]"]
end

subgraph group_commerce["Sales Channels"]
  node_product_api["Products API<br/>[route.ts]"]
  node_pos_api["POS sales API<br/>[route.ts]"]
  node_storefront_ui["Online storefront<br/>[page.tsx]"]
  node_checkout_api["Storefront checkout<br/>[route.ts]"]
  node_stripe_webhook["Stripe webhook<br/>[route.ts]"]
  node_orders_api["Orders API<br/>[route.ts]"]
end

subgraph group_platform["Application Services"]
  node_tenant_db[("Tenant data<br/>[prisma.ts]")]
  node_costs["Price calculations<br/>[costs.ts]"]
  node_stock_helper["Channel stock helper<br/>[channel-stock.ts]"]
  node_stripe_service["Stripe integration<br/>[stripe.ts]"]
  node_email_service["Email service<br/>[email.ts]"]
end

node_operator(("Staff user"))
node_payment_provider(("Stripe"))

node_operator -->|"uses"| node_dashboard_ui
node_operator -->|"shops"| node_storefront_ui
node_purchase_api -->|"reads/writes"| node_tenant_db
node_purchase_api -->|"updates stock"| node_ingredient_api
node_ingredient_api -->|"reads/writes"| node_tenant_db
node_supplier_api -->|"reads/writes"| node_tenant_db
node_stock_ui -->|"shows stock"| node_operator
node_recipe_api -->|"reads/writes"| node_tenant_db
node_recipe_api -->|"calculates cost"| node_costs
node_bom_api -->|"reads/writes"| node_tenant_db
node_bom_api -->|"checks availability"| node_fifo
node_bom_api -->|"calculates cost"| node_bom_cost
node_product_api -->|"reads/writes"| node_tenant_db
node_product_api -->|"checks availability"| node_fifo
node_product_api -->|"calculates price"| node_costs
node_pos_api -->|"reads/writes"| node_tenant_db
node_pos_api -->|"calculates cost"| node_bom_cost
node_pos_api -->|"consumes FIFO"| node_fifo
node_storefront_ui -->|"submits checkout"| node_checkout_api
node_checkout_api -.->|"creates payment"| node_payment_provider
node_payment_provider -.->|"sends events"| node_stripe_webhook
node_stripe_webhook -->|"verifies event"| node_stripe_service
node_stripe_webhook -->|"reads/writes"| node_tenant_db
node_stripe_webhook -->|"generates order number"| node_costs
node_stripe_webhook -->|"consumes channel stock"| node_stock_helper
node_stripe_webhook -->|"sends confirmation"| node_email_service
node_orders_api -->|"reads/writes"| node_tenant_db
node_cms_ui -->|"manages pages"| node_cms_api
node_cms_api -->|"reads/writes"| node_tenant_db
node_team_ui -->|"manages team"| node_users_api
node_users_api -->|"reads/writes"| node_tenant_db
node_users_api -->|"sends invitation"| node_email_service

click node_dashboard_ui "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/dashboard/page.tsx"
click node_team_ui "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/settings/team/page.tsx"
click node_cms_ui "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/cms/page.tsx"
click node_purchase_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/achats/route.ts"
click node_ingredient_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/ingredients/route.ts"
click node_stock_ui "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/vue-stock/page.tsx"
click node_supplier_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/suppliers/route.ts"
click node_recipe_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/recipes/route.ts"
click node_bom_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/bom/sheets/route.ts"
click node_bom_cost "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/bom/cost.ts"
click node_fifo "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/bom/fifo.ts"
click node_product_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/products/route.ts"
click node_pos_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/pos/sales/route.ts"
click node_storefront_ui "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/storefront/%5BtenantSlug%5D/catalog/page.tsx"
click node_checkout_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/storefront/%5BtenantSlug%5D/checkout/route.ts"
click node_stripe_webhook "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/webhooks/stripe/route.ts"
click node_orders_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/orders/route.ts"
click node_cms_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/cms/pages/route.ts"
click node_users_api "https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/users/route.ts"
click node_tenant_db "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/prisma.ts"
click node_costs "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/costs.ts"
click node_stock_helper "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/products/channel-stock.ts"
click node_stripe_service "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/stripe.ts"
click node_email_service "https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/email.ts"

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_dashboard_ui,node_team_ui,node_cms_ui,node_cms_api,node_users_api,node_operator toneBlue
class node_purchase_api,node_ingredient_api,node_stock_ui,node_supplier_api toneAmber
class node_recipe_api,node_bom_api,node_bom_cost,node_fifo toneMint
class node_product_api,node_pos_api,node_storefront_ui,node_checkout_api,node_stripe_webhook,node_orders_api toneRose
class node_tenant_db,node_costs,node_stock_helper,node_stripe_service,node_email_service,node_payment_provider toneIndigo
```

## Components

### Operations UI

- [Operations pages](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/dashboard/page.tsx): `src/app/[locale]/(dashboard)/dashboard/page.tsx`
- [Team settings](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/settings/team/page.tsx): `src/app/[locale]/(dashboard)/settings/team/page.tsx`
- [Storefront CMS](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/cms/page.tsx): `src/app/[locale]/(dashboard)/cms/page.tsx`
- [CMS pages API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/cms/pages/route.ts): `src/app/api/v1/cms/pages/route.ts`
- [Team API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/users/route.ts): `src/app/api/v1/users/route.ts`

### Inventory

- [Purchases API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/achats/route.ts): `src/app/api/v1/achats/route.ts`
- [Ingredients API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/ingredients/route.ts): `src/app/api/v1/ingredients/route.ts`
- [Stock views](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/%5Blocale%5D/(dashboard)/vue-stock/page.tsx): `src/app/[locale]/(dashboard)/vue-stock/page.tsx`
- [Suppliers API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/suppliers/route.ts): `src/app/api/v1/suppliers/route.ts`

### Production

- [Recipes API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/recipes/route.ts): `src/app/api/v1/recipes/route.ts`
- [BOM sheets API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/bom/sheets/route.ts): `src/app/api/v1/bom/sheets/route.ts`
- [BOM costing](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/bom/cost.ts): `src/lib/bom/cost.ts`
- [FIFO production stock](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/bom/fifo.ts): `src/lib/bom/fifo.ts`

### Sales Channels

- [Products API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/products/route.ts): `src/app/api/v1/products/route.ts`
- [POS sales API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/pos/sales/route.ts): `src/app/api/v1/pos/sales/route.ts`
- [Online storefront](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/storefront/%5BtenantSlug%5D/catalog/page.tsx): `src/app/storefront/[tenantSlug]/catalog/page.tsx`
- [Storefront checkout](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/storefront/%5BtenantSlug%5D/checkout/route.ts): `src/app/api/storefront/[tenantSlug]/checkout/route.ts`
- [Stripe webhook](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/webhooks/stripe/route.ts): `src/app/api/webhooks/stripe/route.ts`
- [Orders API](https://github.com/ernesthdj/artisastock-v2/blob/master/src/app/api/v1/orders/route.ts): `src/app/api/v1/orders/route.ts`

### Application Services

- [Tenant data](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/prisma.ts): `src/lib/prisma.ts`
- [Price calculations](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/costs.ts): `src/lib/costs.ts`
- [Channel stock helper](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/products/channel-stock.ts): `src/lib/products/channel-stock.ts`
- [Stripe integration](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/stripe.ts): `src/lib/stripe.ts`
- [Email service](https://github.com/ernesthdj/artisastock-v2/blob/master/src/lib/email.ts): `src/lib/email.ts`

### Other components

- **Staff user**
- **Stripe**

## Connections

- Staff user → Operations pages: uses
- Staff user → Online storefront: shops
- Purchases API → Tenant data: reads/writes
- Purchases API → Ingredients API: updates stock
- Ingredients API → Tenant data: reads/writes
- Suppliers API → Tenant data: reads/writes
- Stock views → Staff user: shows stock
- Recipes API → Tenant data: reads/writes
- Recipes API → Price calculations: calculates cost
- BOM sheets API → Tenant data: reads/writes
- BOM sheets API → FIFO production stock: checks availability
- BOM sheets API → BOM costing: calculates cost
- Products API → Tenant data: reads/writes
- Products API → FIFO production stock: checks availability
- Products API → Price calculations: calculates price
- POS sales API → Tenant data: reads/writes
- POS sales API → BOM costing: calculates cost
- POS sales API → FIFO production stock: consumes FIFO
- Online storefront → Storefront checkout: submits checkout
- Storefront checkout → Stripe: creates payment
- Stripe → Stripe webhook: sends events
- Stripe webhook → Stripe integration: verifies event
- Stripe webhook → Tenant data: reads/writes
- Stripe webhook → Price calculations: generates order number
- Stripe webhook → Channel stock helper: consumes channel stock
- Stripe webhook → Email service: sends confirmation
- Orders API → Tenant data: reads/writes
- Storefront CMS → CMS pages API: manages pages
- CMS pages API → Tenant data: reads/writes
- Team settings → Team API: manages team
- Team API → Tenant data: reads/writes
- Team API → Email service: sends invitation
