Files
clienthub/STATUS.md
T

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). convertLeadToClient riusa createClientCore, 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: importOfferIntoProject crea fasi raggruppando i servizi del tier per services.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 ancora duration_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.local porta 54321, raggiungibile SOLO via tunnel SSH ssh -L 54321:localhost:54321 root@178.104.27.55 (cade per idle; usare -o ServerAliveInterval=30). node/docker non disponibili lato server → migrazioni si applicano da locale con script postgres.js su 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 in src/db/migrations/.
  • offer_micros non ha created_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)