3.1 KiB
3.1 KiB
ClientHub (IAMCAVALLI) — Status
Ultimo aggiornamento: 2026-06-22
Stato attuale
In prod su Coolify (Gitea→deploy). Milestone v2.3 "Email & Accesso" in planning (fase 23 non ancora avviata); ultime sessioni dedicate a fix/flow pre-fase-23. Build verde.
Fatto (recente, cumulativo)
- Tassonomie centralizzate in Impostazioni (modello Notion, pool persistenti
src/lib/taxonomy.ts): Categoria/Ticket/Tipo/Obiettivo offerte + Fase/Offerta/Pacchetto catalogo. Add/remove/sync globale. - Lead → Cliente:
clients.email/phone+leads.archived(migr. 0011, in prod).convertLeadToClientriusacreateClientCore, porta i transcript, archivia il lead mantenendo "won". Tasto Converti/Convertito; lead archiviati nascosti da lista/kanban. - Pagina progetto: tab "Preventivo" rimossa; sidebar riordinata (Lead prima di Clienti).
- Offerta → Fasi/Task:
importOfferIntoProjectcrea fasi raggruppando i servizi del tier perservices.fase(merge per titolo, dedup task). Trigger dalla tab Offerte (checkbox import). - Offerte (modello + UI): nuovo campo
offer_macros.offer_type('una_tantum'|'retainer') + toggle "Modalità" nell'editor (migr. 0012). Tab Offerte ridisegnata: assegnazione a 2 step (Offerta→Tier con prezzo), badge tipo invece di "X mesi". Deck preventivo mostra il tipo. - Cleanup dati: rimossi 3 tier duplicati di "Web Domination" (bug pre-fix) + vincolo
UNIQUE(macro_id, tier_letter). - Fix precedenti: persistenza flag A/B/C offerte, sort+reorder colonne catalogo.
Da fare
- Fasi/Task dall'offerta funzionano solo se i servizi hanno il campo Fase valorizzato nel Catalogo (altrimenti finiscono in "Generale").
- Forecast (
forecast-queries.ts) usa ancoraduration_months: i retainer andrebbero trattati come ricorrenti (follow-up). - Micro legacy "Mantenimento" senza tier: valutare se rimuoverlo/normalizzarlo.
- Avviare fase 23 (OTP gate portale cliente + invio link preventivo via email, integrazione Resend) —
/gsd-plan-phase 23.
Note tecniche
- DB prod =
.env.localporta 54321, raggiungibile SOLO via tunnel SSHssh -L 54321:localhost:54321 root@178.104.27.55(cade per idle; usare-o ServerAliveInterval=30).node/dockernon disponibili lato server → migrazioni si applicano da locale con scriptpostgres.jssu 127.0.0.1:54321. - Ordine deploy con schema: applicare la migrazione a prod PRIMA del push (il deploy gira subito il codice nuovo).
drizzle-kit generateè rotto → migrazioni SQL scritte a mano insrc/db/migrations/.offer_microsnon hacreated_at(no "tier più vecchio" affidabile).
File chiave
| File | Scopo |
|---|---|
| src/lib/taxonomy.ts | Pool tassonomie (Impostazioni) |
| src/app/admin/leads/actions.ts | convertLeadToClient |
| src/app/admin/clients/new/actions.ts | createClientCore (riuso) |
| src/app/admin/projects/project-actions.ts | importOfferIntoProject, assegna offerta |
| src/components/admin/tabs/OffersTab.tsx | Tab Offerte (2 step + badge tipo) |
| src/lib/admin-queries.ts | getProjectFullDetail (offerte/dedup) |
| src/db/migrations/ | 0011 (email/phone/archived), 0012 (offer_type/unique) |