403Webshell
Server IP : 80.211.21.168  /  Your IP : 216.73.217.33
Web Server : Apache
System : Linux alex-webdesign.it 3.10.0-1160.119.1.el7.tuxcare.els22.x86_64 #1 SMP Mon Aug 18 06:07:12 UTC 2025 x86_64
User : admin_japan ( 10003)
PHP Version : 8.2.32
Disable Function : opcache_get_status
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/vhosts/cerchijapan.it/app.valutatoreauto.it/docs/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/vhosts/cerchijapan.it/app.valutatoreauto.it/docs/piano-estratto-calendario-task.md
# Estratto Piano Calendario e Task

Fonte: `docs/piano-integrazioni-lead-calendario.md` (22 aprile 2026)

## Scope estratto
Piano implementativo relativo a:
1. Visuale calendari Vue3 con task, categorie KPI, passaggi tra utenti e regole di accettazione.

## Stato attuale (as-is) - solo calendario/task
- Calendario oggi usato soprattutto per appuntamenti chat/voicebot via Google/Outlook (`calendar_event_id` su `customer_conversations`), ma senza modulo agenda operativo con task interni.
- Frontend Vue3 attivo (chat interna), ma FullCalendar non presente tra le dipendenze NPM correnti.

## Stream 3 - Visuale Calendari + Task

### 3.1 Modello dati proposto
- `calendar_task_categories`
    - `id`, `profile_id`, `name`, `slug`, `is_active`, timestamps
- `calendar_task_category_fields`
    - `id`, `category_id`, `key`, `label`, `type`, `is_required`, `options_json`, `sort_order`, `is_active`, timestamps
- `calendar_tasks`
    - `id`, `profile_id`, `creator_user_id`, `owner_user_id`, `title`, `duration_minutes`, `category_id`, `starts_at`, `ends_at`, `linked_event_provider`, `linked_event_ref`, `requires_acceptance`, `status`, timestamps
- `calendar_task_field_values`
    - `id`, `task_id`, `category_field_id`, typed values, timestamps
- `calendar_task_transfers`
    - `id`, `task_id`, `from_user_id`, `to_user_id`, `requested_by_user_id`, `status`, `requires_acceptance`, `approved_by_user_id`, `decided_at`, timestamps
- `user_task_permissions` (o setting equivalente)
    - es. `can_bypass_task_transfer_acceptance`
- Nuovo setting profilo:
    - `seller_can_view_other_sellers_calendars` (boolean)

### 3.2 Regole business principali
- Admin:
    - crea task per tutti.
    - vede tutti i calendari dell'account.
    - configura categorie task e campi extra.
    - configura se serve accettazione nei passaggi tra seller.
- Seller:
    - crea solo task propri.
    - vede solo proprio calendario (o anche altri seller se setting attivo).
    - puo' passare task ad altro seller, con flusso accettazione in base alle regole.
- Bypass:
    - utente con permission specifica puo' eseguire trasferimenti auto-accettati.

### 3.3 Frontend
- Vue3 + `@fullcalendar/vue3` (day grid + time grid + interaction).
- Nuovo entrypoint Vite dedicato pagina calendario.
- Sidebar/pannello dettaglio evento-task con:
    - nome, durata, categoria
    - campi custom categoria
    - owner, stato, storico trasferimenti

### 3.4 Integrazione calendario provider
- MVP: eventi provider letti live per range data (Google/Outlook) + overlay task locali.
- Possibile fase 2: mirror locale eventi esterni per performance/storico.

## Permessi (solo calendario/task)
- `ADMIN`: full CRUD task cross-user + policy accettazione.
- `SELLER_MANAGER`: CRUD task propri; trasferimento secondo regole; visibilita' calendari da setting.

## Rischi tecnici principali (solo calendario/task)
- Race condition su passaggi task (doppia accettazione/rifiuto concorrente).
- Costi/performance nel fetch multi-calendario provider.
- Timezone e allineamento durata slot/eventi.

## Roadmap consigliata (solo calendario/task)
1. Modulo calendario Vue3 con sola visualizzazione + task propri.
2. Trasferimenti task + accettazione + bypass permission.
3. Hardening e test regressione focalizzati sui flussi calendario/task.

## Strategia test (solo calendario/task)
- Feature:
    - ACL su CRUD task.
    - trasferimento task con/without accettazione e bypass.
    - visibilita' calendari admin/seller in base a setting profilo.
- Unit:
    - motore decisionale trasferimento task.

## Decisioni confermate (solo calendario/task)
1. Nel passaggio task seller->seller con accettazione richiesta, approva il destinatario.
2. Bypass configurabile per utente singolo, con supporto azione massiva "seleziona tutti".
3. Notifiche richieste via email per passaggio task / richiesta accettazione.
4. KPI task rinviati a fase successiva post-integrazione (fuori scope MVP).
5. Task solo se collegati a evento; niente task standalone nel perimetro attuale.

## Impatti immediati sul piano (solo calendario/task)
- Stream 3 (Calendari/Task):
    - workflow trasferimento con stato `pending_acceptance` e decisione del destinatario.
    - gestione permission bypass a livello user-specific con utility bulk apply ("seleziona tutti").
    - progettare task vincolati a evento (`linked_event_ref` obbligatorio a livello validazione).
- Notifiche:
    - prevedere email template per: richiesta accettazione task, task trasferito, task accettato/rifiutato.

## Spec vincolante v1 (anti-improvvisazione agent)

### 1) State machine trasferimento task
- Stati ammessi per `calendar_task_transfers.status`:
    - `pending_acceptance`
    - `accepted`
    - `rejected`
    - `cancelled`
- Transizioni valide:
    - `create transfer` -> `pending_acceptance`
    - `accept` (solo destinatario) -> `accepted`
    - `reject` (solo destinatario) -> `rejected`
    - `cancel` (solo richiedente o admin) -> `cancelled` (solo da `pending_acceptance`)
- Regole di coerenza:
    - `accept` aggiorna anche `calendar_tasks.owner_user_id = to_user_id`.
    - `decided_at` e `approved_by_user_id` valorizzati solo su `accepted`/`rejected`.
    - ogni azione su transfer non `pending_acceptance` deve rispondere `409 Conflict` (idempotenza forte).
    - non e ammesso piu di un transfer `pending_acceptance` per lo stesso task.

### 2) ACL precedence (ordine vincolante)
- Regola 1 (hard deny): mai consentite operazioni cross-`profile_id`.
- Regola 2: `ADMIN` puo gestire task e trasferimenti di tutti gli utenti del proprio `profile_id`.
- Regola 3: `SELLER_MANAGER` puo creare/modificare solo task di cui e owner o creator (salvo takeover admin).
- Regola 4: visibilita calendari seller:
    - se `seller_can_view_other_sellers_calendars = false` -> solo proprio calendario;
    - se `true` -> calendari seller dello stesso `profile_id`.
- Regola 5: bypass trasferimento:
    - se `can_bypass_task_transfer_acceptance = true`, il trasferimento chiude direttamente in `accepted`;
    - altrimenti segue il flusso `pending_acceptance`.
- In caso di conflitto tra regole, prevale sempre il `deny` piu restrittivo.

### 3) Contratto vincolo evento (`linked_event_*`)
- `calendar_tasks` richiede sempre:
    - `linked_event_provider` in enum: `google`, `outlook`
    - `linked_event_ref` non vuoto (id evento provider)
- Validazioni minime creazione task:
    - provider supportato;
    - evento esistente sul provider per il `profile_id` corrente;
    - `starts_at` e `ends_at` coerenti con evento provider al momento della creazione.
- Se l'evento provider non risulta piu disponibile in lettura:
    - il task resta non eliminato;
    - API task deve restituire flag `is_orphaned = true`;
    - sono bloccati nuovi trasferimenti finche non viene rilinkato o chiuso.

### 4) Vincoli DB e indici minimi
- FK obbligatorie su tutte le colonne `_id` del modello proposto.
- Unique:
    - `calendar_task_categories`: (`profile_id`, `slug`)
    - `calendar_task_category_fields`: (`category_id`, `key`)
- Indici:
    - `calendar_tasks`: (`profile_id`, `owner_user_id`, `starts_at`)
    - `calendar_tasks`: (`profile_id`, `starts_at`, `ends_at`)
    - `calendar_tasks`: (`linked_event_provider`, `linked_event_ref`)
    - `calendar_task_transfers`: (`task_id`, `status`, `created_at`)
- Contesa transfer pending:
    - enforcement applicativo in transazione con lock pessimista sul task (`SELECT ... FOR UPDATE`) prima di creare transfer.

### 5) Contratto timezone
- Timezone applicativa unica in v1: `Europe/Rome` (non configurabile per utente o profilo).
- Persistenza DB sempre in UTC.
- API datetime in ISO-8601:
    - input senza offset interpretato come `Europe/Rome`;
    - output esposto in `Europe/Rome` per coerenza UI.
- Range giornalieri/settimanali calcolati in `Europe/Rome` e convertiti in UTC lato query.
- FullCalendar renderizza forzatamente in `Europe/Rome`.
- Casi DST (cambio ora) coperti nei test.

### 5.1 Evoluzione futura (internazionalizzazione)
- Aggiunta `timezone` a livello `profiles` (ed eventualmente `users`) con fallback `Europe/Rome`.
- Nessuna migrazione dati temporali necessaria se UTC resta il formato di persistenza.
- Adeguamento principale su validazione input, serializzazione output e rendering frontend.

### 6) Contratto API minimo (routes `webapi.php`)
- `GET /webapi/calendar/tasks?from=...&to=...&owner_ids[]=...`
    - ritorna task locali + metadati transfer + flag `is_orphaned`.
- `POST /webapi/calendar/tasks`
    - crea task vincolato a evento (`linked_event_*` obbligatori).
- `PATCH /webapi/calendar/tasks/{task}`
    - aggiorna dati consentiti secondo ACL.
- `POST /webapi/calendar/tasks/{task}/transfers`
    - crea trasferimento (auto-accept se bypass).
- `POST /webapi/calendar/task-transfers/{transfer}/accept`
- `POST /webapi/calendar/task-transfers/{transfer}/reject`
- HTTP status vincolanti:
    - `403` ACL
    - `404` task/transfer non nel profilo
    - `409` transizione non valida o transfer gia deciso
    - `422` payload o vincolo evento non valido

### 7) Criteri minimi di accettazione test (non negoziabili)
- Feature:
    - seller senza setting visibilita vede solo proprio calendario.
    - seller con setting visibilita vede solo seller del proprio `profile_id`.
    - creazione task senza `linked_event_ref` -> `422`.
    - transfer standard crea `pending_acceptance`; accept aggiorna owner; reject non aggiorna owner.
    - utente con bypass crea transfer direttamente `accepted`.
    - seconda accept/reject sullo stesso transfer -> `409`.
    - blocco cross-profile su tutte le endpoint -> `403` o `404` coerente.
    - task `is_orphaned = true` blocca nuovo transfer -> `422`.
- Unit:
    - motore decisionale ACL precedence.
    - motore state machine transfer (tabella transizioni valide/non valide).

Youez - 2016 - github.com/yon3zu
LinuXploit