Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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