Commit iniziale di eminuxCRM: CRM Rails con pipeline, campagne email e Docker.
Include autenticazione, progetti isolati, mail marketing HTML con SMTP, test A/B e editor WYSIWYG. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
# eminuxCRM
|
||||
|
||||
CRM commerciale standalone focalizzato su una domanda:
|
||||
|
||||
> Cosa devo fare oggi per trasformare i miei prospect in clienti?
|
||||
|
||||
Applicazione Rails tradizionale (Hotwire / Turbo / Stimulus + Tailwind), pensata per poche persone, veloce da usare e semplice da mantenere. Completamente indipendente da MatchLiveTV.
|
||||
|
||||
## Architettura
|
||||
|
||||
- **Ruby on Rails 8** + **PostgreSQL 16**
|
||||
- **Hotwire** (Turbo + Stimulus) — nessuna SPA
|
||||
- **Tailwind CSS**
|
||||
- Autenticazione locale con `has_secure_password` (bcrypt)
|
||||
- Audit base `created_by` / `updated_by` sulle entità principali
|
||||
- Timezone: `Europe/Rome` · UI: italiano
|
||||
|
||||
### Servizi Docker
|
||||
|
||||
| Servizio | Ruolo |
|
||||
|----------|--------|
|
||||
| `web` | Applicazione Rails (porta 3000) |
|
||||
| `postgres` | Database PostgreSQL 16 |
|
||||
|
||||
## Requisiti
|
||||
|
||||
- Docker + Docker Compose
|
||||
- (Opzionale) Ruby 3.3+ per sviluppo fuori da Docker
|
||||
|
||||
## Avvio rapido (Docker)
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# modifica SECRET_KEY_BASE e password DB se necessario
|
||||
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Al primo avvio vengono eseguiti automaticamente:
|
||||
|
||||
1. `bundle install` (in build)
|
||||
2. `tailwindcss:build`
|
||||
3. `db:prepare` (create + migrate)
|
||||
4. `db:seed`
|
||||
|
||||
Apri: [http://localhost:3001](http://localhost:3001)
|
||||
|
||||
> Su questa macchina la porta 3000 è già usata da un altro stack: di default eminuxCRM usa **3001**.
|
||||
> Puoi cambiarla con `APP_PORT` nel file `.env`.
|
||||
|
||||
|
||||
### Progetti = istanze CRM separate
|
||||
|
||||
Ogni progetto ha un URL dedicato:
|
||||
|
||||
- Launcher: `/`
|
||||
- MatchLiveTV: `/p/matchlivetv`
|
||||
- RiskMeter: `/p/riskmeter`
|
||||
- Cardoo: `/p/cardoo`
|
||||
|
||||
Dentro ogni istanza trovi dashboard, organizzazioni, pipeline, task, report e impostazioni **del solo quel progetto**.
|
||||
|
||||
- Gli **admin** vedono tutti i progetti
|
||||
- Gli **utenti** solo i progetti abilitati
|
||||
- In sidebar: “Tutti i progetti” + switch rapido tra istanze
|
||||
|
||||
## Credenziali development (solo seed)
|
||||
|
||||
| Email | Password | Ruolo | Progetti |
|
||||
|-------|----------|-------|----------|
|
||||
| `admin@simplecrm.local` | `password123` | Admin | Tutti |
|
||||
| `marco@simplecrm.local` | `password123` | Utente | MatchLiveTV, RiskMeter |
|
||||
| `lucia@simplecrm.local` | `password123` | Utente | MatchLiveTV, Cardoo |
|
||||
|
||||
## Configurazione `.env`
|
||||
|
||||
Copia `.env.example` → `.env`. Variabili principali:
|
||||
|
||||
- `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB`
|
||||
- `DATABASE_HOST` (in Docker: `postgres`)
|
||||
- `SECRET_KEY_BASE`
|
||||
- `MAILER_FROM`
|
||||
- `APP_HOST` / `APP_PORT`
|
||||
- `TZ=Europe/Rome`
|
||||
|
||||
**Non committare** `.env` con secret reali.
|
||||
|
||||
## Migration e seed
|
||||
|
||||
```bash
|
||||
docker compose exec web bin/rails db:migrate
|
||||
docker compose exec web bin/rails db:seed
|
||||
```
|
||||
|
||||
Reset completo (distruttivo):
|
||||
|
||||
```bash
|
||||
docker compose exec web bin/rails db:reset
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
docker compose exec web bin/rails db:test:prepare
|
||||
docker compose exec web bin/rails test
|
||||
```
|
||||
|
||||
## Backup / restore
|
||||
|
||||
```bash
|
||||
bin/backup
|
||||
# crea tmp/backups/simplecrm_YYYYMMDD_HHMMSS.sql.gz
|
||||
|
||||
bin/restore tmp/backups/simplecrm_YYYYMMDD_HHMMSS.sql.gz
|
||||
```
|
||||
|
||||
Con Docker Compose attivo gli script usano `pg_dump` / `psql` sul container `postgres`.
|
||||
|
||||
## Import CSV
|
||||
|
||||
Pagina: **Impostazioni → Import CSV** oppure `/imports/new`.
|
||||
|
||||
Formato standard (file esempio: `examples/organizations_import_sample.csv`):
|
||||
|
||||
```csv
|
||||
organization_name,organization_type,sport,country,region,province,city,website,organization_email,contact_first_name,contact_last_name,contact_role,contact_email,contact_phone,lead_source,notes
|
||||
```
|
||||
|
||||
Duplicati evitati confrontando nome organizzazione, email e sito.
|
||||
|
||||
## Export CSV
|
||||
|
||||
Disponibile da liste Organizzazioni, Contatti e Opportunità (rispetta i filtri attivi dove applicabile).
|
||||
|
||||
## Struttura database (principale)
|
||||
|
||||
- `users` — autenticazione, ruolo admin/user
|
||||
- `organizations` — prospect/clienti
|
||||
- `contacts` — contatti per organizzazione
|
||||
- `opportunities` — pipeline commerciale
|
||||
- `activities` — timeline
|
||||
- `tasks` — follow-up / next actions
|
||||
- `sales_goals` — obiettivi dashboard
|
||||
- `products` — catalogo prodotti (Light, Full, …)
|
||||
|
||||
Pipeline stages: Da contattare → Contattato → Ha risposto → Interessato → Demo/Trial → Primo utilizzo → Proposta → Cliente / Perso.
|
||||
|
||||
## Funzionalità principali
|
||||
|
||||
- Dashboard con obiettivo, KPI, funnel, “Cosa fare oggi”, indicatori di attenzione
|
||||
- Pagina `/today` operativa
|
||||
- Scheda Organization come centro operativo + quick actions
|
||||
- Kanban pipeline con drag & drop (Stimulus) e cambio stage da menu
|
||||
- Task con evidenziazione scaduti / oggi / futuri
|
||||
- Report: funnel, lead source, won/lost, lost reasons, sales owner, revenue
|
||||
- Import/export CSV
|
||||
|
||||
## Deploy (suggerimento semplice)
|
||||
|
||||
1. Copia il progetto su una VM
|
||||
2. Configura `.env` di produzione (`RAILS_ENV=production`, `SECRET_KEY_BASE`, password DB forti)
|
||||
3. `docker compose up -d --build` (oppure builda il target `production` del Dockerfile)
|
||||
4. Metti un reverse proxy (Caddy/Nginx) con HTTPS davanti alla porta 3000
|
||||
5. Esegui backup periodici con `bin/backup`
|
||||
|
||||
## Sviluppo locale senza Docker (opzionale)
|
||||
|
||||
```bash
|
||||
bundle install
|
||||
bin/rails db:prepare db:seed
|
||||
bin/dev # server + tailwind watch
|
||||
```
|
||||
|
||||
## Volutamente fuori scope (fase successiva)
|
||||
|
||||
- Integrazioni Gmail/SMTP avanzate, sync email, calendario
|
||||
- Stripe, webhook, API REST pubblica
|
||||
- Multi-tenant / multi-progetto
|
||||
- Dark mode, BI avanzata, microservizi
|
||||
|
||||
## Licenza
|
||||
|
||||
Uso interno / progetto privato.
|
||||
Reference in New Issue
Block a user