252 lines
9.9 KiB
Markdown
252 lines
9.9 KiB
Markdown
# DiDi Website (Next.js)
|
|
|
|
Componenta frontend a platformei DiDi - website public + dashboard client. Construit cu Next.js 16, integrat cu ERPNext (ERP/CRM), Stripe (plati), Keycloak (SSO) si platforma DiDi (analize AI).
|
|
|
|
## Cuprins
|
|
|
|
- [Arhitectura](#arhitectura)
|
|
- [Stack tehnic](#stack-tehnic)
|
|
- [Structura folder](#structura-folder)
|
|
- [Quickstart](#quickstart)
|
|
- [Pagini](#pagini)
|
|
- [API routes](#api-routes)
|
|
- [Integrari](#integrari)
|
|
- [Documentatie detaliata](#documentatie-detaliata)
|
|
|
|
## Arhitectura
|
|
|
|
```
|
|
Browser (client)
|
|
|
|
|
v
|
|
+-----------------------------+
|
|
| Website Next.js :3000 |
|
|
| (SSR + API routes) |
|
|
+-----+-------+-------+-------+
|
|
| | |
|
|
+-------+--+ +--+----+ +-+--------+
|
|
| ERPNext | |Stripe | | Keycloak |
|
|
| :8080 | | API | | :28080 |
|
|
| (REST) | | | | (OIDC) |
|
|
+----+-----+ +-------+ +----------+
|
|
|
|
|
(factura, customer, CRM)
|
|
|
|
|
DiDi platform API
|
|
(analize text/image/audio/video)
|
|
```
|
|
|
|
## Stack tehnic
|
|
|
|
| Componenta | Versiune |
|
|
|------------|----------|
|
|
| Next.js | 16.2.1 (App Router) |
|
|
| React | 19.2.4 |
|
|
| TypeScript | 5.x |
|
|
| Tailwind CSS | 4.x |
|
|
| NextAuth (Auth.js) | 5.0 beta |
|
|
| Stripe | 21.0 |
|
|
| Node.js | 20 (in container) |
|
|
|
|
## Structura folder
|
|
|
|
```
|
|
website/
|
|
├── README.md # Acest fisier
|
|
├── INSTALL.md # Build + deployment
|
|
├── OPERATIONS.md # Operare, log-uri, troubleshooting
|
|
├── CONFIGURATION.md # Env vars, integrari, credentiale
|
|
├── Dockerfile # Multi-stage: dev / builder / prod
|
|
├── docker-compose.yml # Stack de productie
|
|
├── .env.production # Configurare prod (NU se commiteaza)
|
|
├── package.json
|
|
├── tsconfig.json
|
|
├── next.config.ts
|
|
├── eslint.config.mjs
|
|
├── postcss.config.mjs
|
|
├── public/ # Static assets (clossersLogo2.png etc.)
|
|
├── src/
|
|
│ ├── app/ # App Router (Next.js 16)
|
|
│ │ ├── (public)/ # Pagini publice fara auth
|
|
│ │ │ ├── page.tsx # Homepage
|
|
│ │ │ ├── about/
|
|
│ │ │ ├── services/
|
|
│ │ │ ├── pricing/
|
|
│ │ │ ├── contact/
|
|
│ │ │ ├── privacy/
|
|
│ │ │ ├── terms/
|
|
│ │ │ └── layout.tsx # Navbar + Footer + Cookie consent
|
|
│ │ ├── (auth)/ # Login / Register
|
|
│ │ │ ├── login/
|
|
│ │ │ └── register/
|
|
│ │ ├── (dashboard)/dashboard/# Zona client autentificat
|
|
│ │ │ ├── page.tsx # Overview
|
|
│ │ │ ├── analiza/ # Run analiza
|
|
│ │ │ ├── analize/ # Istoric analize + rapoarte PDF
|
|
│ │ │ ├── achizitioneaza/ # Cumparare servicii
|
|
│ │ │ ├── checkout/success/ # Stripe success callback
|
|
│ │ │ ├── credits/ # Credite + consum (real-time)
|
|
│ │ │ ├── invoices/ # Facturi cu download PDF
|
|
│ │ │ ├── profile/ # Profil + GDPR (export, delete)
|
|
│ │ │ └── subscription/ # Abonament + upgrade/downgrade
|
|
│ │ ├── api/ # API routes (server-side)
|
|
│ │ │ ├── auth/[...nextauth]/ # Auth.js handler
|
|
│ │ │ ├── analyze/ # Analiza pipeline
|
|
│ │ │ ├── analysis-reports/
|
|
│ │ │ ├── analysis-report-pdf/
|
|
│ │ │ ├── checkout/ # Stripe Checkout Session
|
|
│ │ │ ├── subscribe/ # Stripe Subscription
|
|
│ │ │ ├── subscription/manage/ # Upgrade/downgrade/cancel
|
|
│ │ │ ├── customer/me/ # Get current user customer
|
|
│ │ │ ├── credits/ # Credite + history
|
|
│ │ │ ├── erp/[...path]/ # Proxy ERPNext
|
|
│ │ │ ├── invoice-pdf/ # Download factura PDF
|
|
│ │ │ ├── leads/ # Lead creation (contact form)
|
|
│ │ │ ├── webhooks/stripe/ # Stripe webhook handler
|
|
│ │ │ └── gdpr/ # Export + delete account
|
|
│ │ │ ├── export/
|
|
│ │ │ └── delete/
|
|
│ │ ├── layout.tsx # Root layout
|
|
│ │ ├── sitemap.ts
|
|
│ │ └── robots.ts
|
|
│ ├── components/ # React components
|
|
│ │ ├── layout/ # Navbar, Footer, DashboardSidebar
|
|
│ │ ├── forms/ # ContactForm
|
|
│ │ ├── providers/ # SessionProvider
|
|
│ │ └── ui/ # CookieConsent, SignOutButton
|
|
│ ├── i18n/ # Traduceri ro.json + en.json
|
|
│ ├── lib/ # Helpers server-side
|
|
│ │ ├── auth.ts # Auth.js config (Keycloak)
|
|
│ │ ├── erpnext.ts # ERPNext REST client
|
|
│ │ ├── stripe.ts # Stripe config + price map
|
|
│ │ ├── stripe-fulfillment.ts # Webhook fulfillment logic
|
|
│ │ ├── api.ts # Client API (browser)
|
|
│ │ ├── analysis-display.ts # Format rezultate analize
|
|
│ │ ├── analysis-report-pdf.ts# Generare PDF (jsPDF)
|
|
│ │ └── analysis-report-store.ts # Salvare PDF in ERPNext
|
|
│ ├── middleware.ts # Auth middleware (/dashboard/*)
|
|
│ └── types/ # TypeScript types
|
|
└── scripts/
|
|
└── archive/ # Scripturi generare doc-uri (one-off)
|
|
```
|
|
|
|
Documentatia de proiect (arhitectura, documentatia API, manuale, caiet de
|
|
sarcini) se livreaza separat, in dosarul de livrare — nu face parte din repo.
|
|
|
|
## Quickstart
|
|
|
|
Cere docker + docker compose v2 si reteaua `didi-network`:
|
|
|
|
```bash
|
|
docker network create didi-network 2>/dev/null || true
|
|
```
|
|
|
|
Build + start:
|
|
|
|
```bash
|
|
cd ~/website
|
|
cp .env.production.example .env.production # (daca exista, sau editeaza .env.production existent)
|
|
docker compose up -d --build
|
|
```
|
|
|
|
Acceseaza: http://localhost:3000
|
|
|
|
Pentru detalii, vezi [INSTALL.md](./INSTALL.md).
|
|
|
|
## Pagini
|
|
|
|
### Pagini publice (fara login)
|
|
|
|
| Ruta | Descriere |
|
|
|------|-----------|
|
|
| `/` | Homepage (continut din ERPNext CMS) |
|
|
| `/services` | Module AI DiDi (6 servicii) |
|
|
| `/about` | Despre Clossers + DiDi |
|
|
| `/pricing` | 14 servicii one-time + 4 abonamente recurente |
|
|
| `/contact` | Formular contact (creeaza Lead in ERPNext) |
|
|
| `/privacy` | Politica de confidentialitate (GDPR) |
|
|
| `/terms` | Termeni si conditii |
|
|
|
|
### Pagini auth
|
|
|
|
| Ruta | Descriere |
|
|
|------|-----------|
|
|
| `/login` | Redirect la Keycloak SSO |
|
|
| `/register` | Redirect la Keycloak registration |
|
|
|
|
### Pagini dashboard (auth obligatoriu)
|
|
|
|
| Ruta | Descriere |
|
|
|------|-----------|
|
|
| `/dashboard` | Overview - facturi recente, credite, achizitii |
|
|
| `/dashboard/analiza` | Selecteaza factura + ruleaza analiza |
|
|
| `/dashboard/analize` | Istoric analize + descarcare rapoarte PDF |
|
|
| `/dashboard/invoices` | Facturi emise + download PDF |
|
|
| `/dashboard/credits` | Credite disponibile + istoric consum |
|
|
| `/dashboard/achizitioneaza` | Servicii one-time + abonamente |
|
|
| `/dashboard/subscription` | Plan curent + upgrade/downgrade/cancel |
|
|
| `/dashboard/profile` | Profil + GDPR (export, delete) |
|
|
| `/dashboard/checkout/success` | Callback post-Stripe |
|
|
|
|
## API routes
|
|
|
|
### Public
|
|
| Endpoint | Metoda | Descriere |
|
|
|----------|--------|-----------|
|
|
| `/api/leads` | POST | Creeaza Lead in ERPNext din formular contact |
|
|
| `/api/webhooks/stripe` | POST | Webhook Stripe (events) |
|
|
|
|
### Autentificate
|
|
| Endpoint | Metoda | Descriere |
|
|
|----------|--------|-----------|
|
|
| `/api/auth/[...nextauth]` | GET/POST | Auth.js handler |
|
|
| `/api/analyze` | GET, POST | Lista analize + run + polling |
|
|
| `/api/checkout` | POST | Creeaza Stripe Checkout (one-time) |
|
|
| `/api/subscribe` | POST | Creeaza Stripe Subscription |
|
|
| `/api/subscription/manage` | POST | Upgrade/downgrade/cancel |
|
|
| `/api/customer/me` | GET | Datele Customer din ERPNext |
|
|
| `/api/credits` | GET | Credite + istoric |
|
|
| `/api/erp/[...path]` | * | Proxy autentificat catre ERPNext |
|
|
| `/api/invoice-pdf` | GET | Download factura PDF |
|
|
| `/api/analysis-reports` | GET, POST | List + salvare rapoarte |
|
|
| `/api/analysis-report-pdf` | GET | Download raport analiza PDF |
|
|
| `/api/gdpr/export` | GET | Export date utilizator (JSON) |
|
|
| `/api/gdpr/delete` | POST | Cerere stergere cont |
|
|
|
|
## Integrari
|
|
|
|
| Sistem | Protocol | Scop |
|
|
|--------|----------|------|
|
|
| ERPNext | REST API (token auth) | Facturi, customeri, lead-uri, CMS |
|
|
| Stripe | API + webhook | Plati one-time + recurente |
|
|
| Keycloak | OIDC | SSO (autentificare clienti) |
|
|
| DiDi platform | REST API (Bearer JWT) | Analize text/image/audio/video |
|
|
| SendGrid | (indirect prin ERPNext SMTP) | Email tranzactional |
|
|
|
|
## Functionalitati cheie
|
|
|
|
- Design responsive (desktop/tablet/mobile), WCAG 2.1 AA
|
|
- SEO (sitemap.xml, robots.txt, Open Graph)
|
|
- GDPR: cookie consent, export date, dreptul la stergere
|
|
- i18n RO + EN cu language switcher
|
|
- PDF generation (facturi + rapoarte analize)
|
|
- Webhook idempotency (Payment Log cu stripe_session_id unique)
|
|
|
|
## Documentatie detaliata
|
|
|
|
| Document | Scop |
|
|
|----------|------|
|
|
| [INSTALL.md](./INSTALL.md) | Build de la 0, dependinte, deployment |
|
|
| [OPERATIONS.md](./OPERATIONS.md) | Restart, log-uri, debug |
|
|
| [CONFIGURATION.md](./CONFIGURATION.md) | Env vars complete, integrari |
|
|
|
|
## Test user
|
|
|
|
Pentru testare:
|
|
- Email: `test@didi.local`
|
|
- Parola: `Test1234!`
|
|
- (creat in Keycloak local, realm `didi-clients` — acelasi nume ca pe platforma reala)
|
|
|
|
## Suport
|
|
|
|
Pentru intrebari tehnice: office@clossers.com
|