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.
Translation pending
Aplicație de ofertare și devize pentru firme de betoane și construcții: catalog de produse, oferte numerotate automat și export PDF.
Translation pending
BusinessTypeScript · PLpgSQLGitHub @automatorroOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Graco pumps erp dashboard
Translation pending
Taken from the repository README
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ă.
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