Lalabase
Tickets, Doku, Zeiterfassung und Kundengespräche an einem Ort, durchsuchbar per KI. Für Softwarefirmen mit Kundenprojekten. Open Source: auf deinem eigenen Server oder in unserer Cloud in Deutschland.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Graco pumps erp dashboard
翻译准备中
取自仓库 README
正在加载完整 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).查看完整 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ă.
Fiecare poziție păstrează materialele pe care le aplică echipamentul — cele trecute în fișa produsului separat de cele deduse după consistență. Din ele se construiesc sugestiile de pe teren: agentul bifează materialele cu care lucrează meseriașul, iar categoriile de pompe potrivite se marchează singure.
Prețurile din magazin sunt cu TVA; unit_price e prețul fără TVA, folosit pe ofertă,
iar price_with_vat păstrează prețul din magazin ca să se poată verifica oricând conversia.
Schema are un set de verificări care rulează pe o bază PostgreSQL locală, peste un stub minimal
al schemei auth din Supabase:
npm run db:test
Baza romcrete_test este recreată de la zero la fiecare rulare. Se verifică numerotarea
ofertelor, totalurile cu discount, protecția clienților care au oferte emise și izolarea
completă a datelor între două firme diferite.
Regulile sunt într-un singur loc, src/lib/totals.ts, și sunt folosite identic în interfață
și în documentul tipărit:
cantitate × preț unitar × (1 − discount linie)ro-ROProiectul merge direct pe Vercel: importă repository-ul, adaugă cele
două variabile de mediu și actualizează Site URL în Supabase cu domeniul de producție.
npm run dev # dezvoltare
npm run build # build de producție
npm run start # rulează build-ul
npm run lint # ESLint
npm run db:test # verificările pe schema de bază de date