Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Graco pumps erp dashboard
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Aplicație web de ofertare și devize pentru firme de betoane și construcții: catalog de produse și servicii, oferte numerotate automat, calcul de TVA și discounturi, export PDF pentru client. Stack: Next.js 16 (App Router, Server Actions) · TypeScript · Tailwind CSS v4 · Supabase (Postgres + Auth, cu Row Level Security).Read the full README ↗
Aplicație web de ofertare și devize pentru firme de betoane și construcții: catalog de produse și servicii, oferte numerotate automat, calcul de TVA și discounturi, export PDF pentru client.
Stack: Next.js 16 (App Router, Server Actions) · TypeScript · Tailwind CSS v4 · Supabase (Postgres + Auth, cu Row Level Security).
OF-2026-0001, serie per firmă și an),
linii din catalog sau linii libere, discount pe linie și pe ofertă, stări
(ciornă / trimisă / acceptată / respinsă / expirată), duplicare.{persoana}, {firma}, {agent}…), se vede
exact cum ajunge pe email și pe WhatsApp, apoi se trimite din Outlook-ul local (un email comun
cu firmele în BCC, pe loturi, sau câte unul personalizat) ori din WhatsApp, firmă cu firmă.
Fiecare firmă are canalul preferat și poate refuza newsletterele; trimiterea intră în istoric.Creează un proiect pe supabase.com, apoi rulează în SQL Editor, în ordine:
Fișierele din supabase/migrations/, în ordinea numelui.
Fișierele respectă convenția de nume a Supabase CLI (<timestamp>_nume.sql), deci le aplică
și supabase db push sau integrarea GitHub, în aceeași ordine.
Alternativ, cu Supabase CLI — supabase/config.toml
conține deja referința proiectului:
supabase link
supabase db push
În Authentication → URL Configuration, setează Site URL la adresa aplicației și
adaugă în template-ul de confirmare linkul:
{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=email
Pentru dezvoltare poți dezactiva confirmarea pe email din Authentication → Providers → Email.
cp .env.example .env.local
Completează NEXT_PUBLIC_SUPABASE_URL și NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
din Project Settings → API.
npm install
npm run dev
Aplicația pornește pe http://localhost:3000. Creezi cont, completezi datele firmei, adaugi un client și emiți prima ofertă.
src/
├─ app/
│ ├─ (auth)/ autentificare: login, înregistrare, acțiuni de sesiune
│ ├─ (app)/ zona privată: oferte, clienți, catalog, setări
│ ├─ auth/confirm/ ținta linkului de confirmare pe email
│ ├─ onboarding/ configurarea firmei la primul login
│ ├─ print/oferta/[id]/ documentul A4 gata de tipărit / salvat ca PDF
│ └─ page.tsx pagina publică de intrare
├─ components/ bucăți de interfață reutilizate
├─ lib/
│ ├─ auth.ts stratul de acces: cine e utilizatorul, din ce firmă face parte
│ ├─ supabase/ clienții Supabase pentru server și browser
│ ├─ totals.ts calculul valorilor, TVA-ului și formatarea în format românesc
│ ├─ types.ts tipurile rândurilor din baza de date
│ └─ validation.ts schemele zod folosite de Server Actions
└─ proxy.ts reîmprospătarea sesiunii și protecția rutelor
| Tabel | Rol |
|---|---|
organizations | firma: date de facturare, cotă TVA implicită, condiții comerciale |
memberships | legătura utilizator ↔ firmă, cu rol (owner, admin, agent) |
clients | clienții firmei |
catalog_items | produse și servicii cu preț, UM și cotă TVA |
quotes | oferta: număr, client, stare, date, discount pe total |
quote_items | liniile ofertei, cu prețul înghețat la momentul adăugării |
quote_counters | contorul de numerotare, per firmă și an |
quote_totals | view cu totalurile calculate, folosit în listă |
visits | vizita de teren: răspunsurile agentului, pasul următor, modelele discutate |
client_contacts | oamenii întâlniți la firmă: patron, șef de echipă, meșter |
client_state | view: starea firmei derivată din toate vizitele ei, cu prioritatea A/B/C |
question_sections / question_groups / question_options | catalogul de întrebări din vizită, ca date |
newsletters | textele newsletterelor, comune echipei; trimiterile stau în client_activities |
invitations | invitarea unui coleg în organizația existentă |
Toate tabelele au RLS activ. Accesul are două niveluri, verificate de
public.is_member(uuid) și public.is_org_admin(uuid):
clients.owner_agent_id), vizitele lui și
ofertele firmelor lui; citește tot catalogul, dar nu îl modificăUn coleg nou intră în organizație printr-o invitație (accept_invitation), nu creând una nouă. Excepția e organizația proaspăt creată —
până la adăugarea primului membru ea rămâne vizibilă prin created_by, altfel onboarding-ul
s-ar bloca imediat după inserare.
Catalogul Romcrete — 103 pompe Graco și 55 de familii de accesorii, 155 de poziții — intră printr-o migrație, ca orice altă schimbare de bază de date. Nu se copiază nimic manual în SQL Editor.
La actualizarea prețurilor nu se modifică migrația existentă: se generează una nouă, datată, care reconstruiește catalogul. Istoricul rămâne întreg și se poate vedea oricând ce prețuri erau valabile la o anumită dată.
This is the beginning of the README. Read the rest at the original. Read the full README ↗