chore: archive v2.2 Sales Loop milestone
- ROADMAP.md: collassato a milestone summary, v2.2 in <details> - PROJECT.md: full evolution review — What This Is, Validated v2.2, Active v2.3, Key Decisions aggiornate - MILESTONES.md: entry v2.2 + entry v2.1 aggiunti - milestones/v2.2-ROADMAP.md: archivio completo fasi 18-22 - milestones/v2.2-REQUIREMENTS.md: archivio requirements con outcomes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
# Milestone v2.2: Sales Loop
|
||||
|
||||
**Status:** ✅ SHIPPED 2026-06-20
|
||||
**Phases:** 18–22 (R1–R5)
|
||||
**Total Plans:** 9 plans · 27 commits · 87 files · +7.349/-842 righe
|
||||
**Timeline:** 2026-06-19 → 2026-06-20
|
||||
|
||||
## Overview
|
||||
|
||||
v2.2 chiude il **loop di vendita end-to-end**: dopo che l'utente ha articolato il flusso commerciale reale (piano `.claude/plans/glittery-sprouting-pudding.md`), le fasi residue v2.1 (13/15/16/17) sono state congelate/abbandonate e sostituite da 5 fasi nuove. Il flusso: lead in pipeline Kanban → transcript datati delle call → agente AI genera preventivo → deck pubblico 20+ slide → accept/reject manuale nel CRM.
|
||||
|
||||
## Phases
|
||||
|
||||
### Phase 18: Cleanup & Consolidamento (R1)
|
||||
|
||||
**Goal**: Sgomberare il campo dai doppioni e dal peso morto prima di costruire il loop di vendita.
|
||||
**Mode:** ui (solo rimozioni/rotte, nessun drop di tabelle)
|
||||
**Requirements**: CLEAN-01, CLEAN-02, CLEAN-03, CLEAN-04
|
||||
**Plans**: 3 plans
|
||||
|
||||
Plans:
|
||||
- [x] 18-01-PLAN.md — Rimozione Forecast + Quote Builder manuale (CLEAN-01, CLEAN-02)
|
||||
- [x] 18-02-PLAN.md — Fusione analytics nella Dashboard, eliminazione rotta /admin/analytics (CLEAN-03)
|
||||
- [x] 18-03-PLAN.md — Verifica CLEAN-04 planning docs + build check + checkpoint visuale
|
||||
|
||||
**Status**: ✅ Complete (2026-06-19)
|
||||
|
||||
**What was built:**
|
||||
- Rimossa pagina `/admin/forecast` + voce sidebar
|
||||
- Rimosso quote builder manuale `/admin/quotes/new` + SendQuoteModal rami irraggiungibili
|
||||
- Statistiche annuali `/admin/analytics` fuse nella Dashboard `/admin` (CLEAN-03); rotta duplicata eliminata
|
||||
- Fasi v2.1 residue (13/15/16/17) marcate cancellate/congelate nel planning
|
||||
|
||||
---
|
||||
|
||||
### Phase 19: Pipeline CRM Kanban (R2)
|
||||
|
||||
**Goal**: I lead si gestiscono in una board Kanban stile Pipedrive con drag-drop tra gli stage.
|
||||
**Mode:** ui
|
||||
**Depends on**: Phase 14 (CRM lead esistente). Riusa `@dnd-kit`.
|
||||
**Requirements**: PIPE-01, PIPE-02
|
||||
**Plans**: 1 plan
|
||||
|
||||
Plans:
|
||||
- [x] 19-01-PLAN.md — LeadsKanbanBoard + LeadsViewToggle + page wiring (PIPE-01, PIPE-02)
|
||||
|
||||
**Status**: ✅ Complete (2026-06-19)
|
||||
|
||||
**What was built:**
|
||||
- Board Kanban 6 colonne (contacted → qualified → proposal_sent → negotiating → won/lost) con drag-drop persistente
|
||||
- Toggle Lista/Kanban con ricerca integrata
|
||||
- Spostare un lead su "Vinto"/"Perso" aggiorna `leads.status` → registra l'esito manuale
|
||||
|
||||
---
|
||||
|
||||
### Phase 20: Knowledge Base Cliente (R3)
|
||||
|
||||
**Goal**: Memorizzare i transcript datati delle call e mostrarli nel profilo lead.
|
||||
**Mode:** schema + ui
|
||||
**Depends on**: Phase 14 (lead). Migration a prod via SSH.
|
||||
**Requirements**: KB-01, KB-02
|
||||
**Plans**: 3 plans
|
||||
|
||||
Plans:
|
||||
- [x] 20-01-PLAN.md — Migration SQL `0009_client_transcripts` (BLOCKING prod checkpoint)
|
||||
- [x] 20-02-PLAN.md — Schema Drizzle `clientTranscripts` + `getTranscripts`/`addTranscript`/`deleteTranscript`
|
||||
- [x] 20-03-PLAN.md — `TranscriptModal` + sezione "Transcript Call" in `LeadDetail` + wiring `page.tsx`
|
||||
|
||||
**Status**: ✅ Complete (2026-06-20)
|
||||
|
||||
**What was built:**
|
||||
- Tabella `client_transcripts` (lead_id, client_id, content, call_date, title, created_at) applicata a prod via SSH tunnel
|
||||
- Data layer completo con Drizzle ORM + server actions
|
||||
- UI: sezione "Transcript Call" nel dettaglio lead con modal per incollare, lista espandibile/collassabile, elimina
|
||||
|
||||
---
|
||||
|
||||
### Phase 21: Agente AI — Generazione Preventivo (R4)
|
||||
|
||||
**Goal**: Admin seleziona cliente+offerta; AI legge transcript+offerta → genera bozza preventivo.
|
||||
**Mode:** ai + ui
|
||||
**Depends on**: Phase 20 (transcript) + Phase 11/12 (offerte)
|
||||
**Requirements**: AI-01, AI-02
|
||||
**Plans**: 1 plan (21+22 eseguiti insieme per coerenza architetturale)
|
||||
|
||||
Plans:
|
||||
- [x] 21-01-PLAN.md — Agente AI + form builder admin + migration 0010 proposals
|
||||
|
||||
**Status**: ✅ Complete (2026-06-20)
|
||||
|
||||
**What was built:**
|
||||
- `@anthropic-ai/sdk@0.105.0` + `ANTHROPIC_API_KEY` in Coolify
|
||||
- `src/lib/proposal/schema.ts` — Zod schema `ProposalContent` (20+ sezioni strutturate)
|
||||
- `src/lib/proposal/agent.ts` — `generateProposalContent()` → Claude Opus 4.8, JSON validato Zod
|
||||
- `src/lib/proposal/assemble.ts` — `assembleProposal()`: fonde AI + offerta DB + profilo consulente
|
||||
- `src/lib/proposal/profile.ts` — `CONSULTANT_PROFILE` (bio, fatti, testimonianze, legal, nextSteps)
|
||||
- `proposals` table in DB: id, slug, lead_id, client_id, offer_macro_id, content jsonb, state, accepted_at
|
||||
- Admin pages: lista preventivi, form genera (con pre-fill `?lead_id=X`), review bozza, pubblica/elimina
|
||||
|
||||
---
|
||||
|
||||
### Phase 22: Pagina Pubblica Preventivo + Email (R5)
|
||||
|
||||
**Goal**: Pubblicare la proposta come deck pubblico `/preventivo/[slug]` con accept/reject.
|
||||
**Mode:** ui
|
||||
**Depends on**: Phase 21 (proposals table + content)
|
||||
**Requirements**: PUB-01, PUB-02 ✅ · PUB-03 ❌ deferred
|
||||
**Plans**: 1 plan
|
||||
|
||||
Plans:
|
||||
- [x] 22-01-PLAN.md — ProposalDeck + public page + accept/reject actions
|
||||
|
||||
**Status**: ✅ Complete (2026-06-20) · PUB-03 deferred
|
||||
|
||||
**What was built:**
|
||||
- `src/app/preventivo/[slug]/page.tsx` — server component pubblico con gestione stati
|
||||
- `src/app/preventivo/[slug]/actions.ts` — `acceptProposal` + `rejectProposal` con `accepted_at` immutabile
|
||||
- `ProposalDeck.tsx` — deck client component: `h-screen overflow-hidden`, keyboard nav, dots
|
||||
- 20 componenti slide: Cover, Vision, Index, ChapterDivider ×5, Strategist, Facts, Testimonials, ProblemNode ×N, SynthesisDiagram, SolutionNode ×N, SolutionSynthesis, Scope, Deliverables, Timeline, Pricing, StagesRecap, ComparisonMatrix, NextSteps, Accept, Closing
|
||||
- **PUB-03 (email Resend) NOT implemented** — link va condiviso manualmente; deferred a v2.3 backlog
|
||||
|
||||
---
|
||||
|
||||
## Milestone Summary
|
||||
|
||||
**Key Decisions:**
|
||||
- Sales Loop come north-star v2.2: abbandonato workspace post-vendita (Phase 13), revenue stats (Phase 15), Proposal AI v2.1 (16/17) — riscopate come 21+22 con transcript
|
||||
- AI model: `claude-opus-4-8` per qualità copywriting strategico (~$0.44/preventivo)
|
||||
- Output AI: JSON strutturato validato Zod → template fisso → coerenza visiva garantita
|
||||
- `proposals.content` come JSONB snapshot (non riferimento a entità live) → immutabile
|
||||
- Email Resend (PUB-03) deferred: scope minimo funziona, priorità al loop core
|
||||
|
||||
**Known Gaps at Close:**
|
||||
- PUB-03: invio email Resend non implementato (1 item, vedi backlog v2.3)
|
||||
- `profile.ts`: testimonianze placeholder, da aggiornare con dati reali
|
||||
|
||||
**Technical Debt:**
|
||||
- Tabelle legacy `service_catalog`/`offer_services`/`offer_micro_services` ancora presenti (deadweight, cleanup futuro)
|
||||
- `createService`/`serviceSchema` dead code in `catalog/actions.ts`
|
||||
- `drizzle-kit generate` rotto da Phase 8 (meta snapshots out of sync) — SQL scritto a mano
|
||||
|
||||
---
|
||||
|
||||
*Per lo stato corrente del progetto, vedi `.planning/ROADMAP.md`*
|
||||
Reference in New Issue
Block a user