Skip to content

feat: implementare CalendarView e VisitFormView #75

@artcava

Description

@artcava

🎯 Obiettivo

Implementare CalendarView e VisitFormView per supportare:

  • FLUSSO 3: Visualizzazione Calendario Appuntamenti (Coordinatore)
  • FLUSSO 4: Registrazione Visita (Educatore)

descritti in docs/USER-WORKFLOW.md.

Questa issue è contenitore UI per il modulo Calendario/Visite (logica di dominio in issue dedicate ai servizi/repositories).


🗓️ 1. CalendarView (Coordinatore)

Requisiti Funzionali

Da USER-WORKFLOW:

  • Calendario mensile con legenda stato progetto (non tipo appuntamento)
  • Lista appuntamenti per giorno selezionato
  • Filtri:
    • Tipo appuntamento (INTAKE, Verifiche, Dimissioni)
    • Educatore
    • Stato progetto (Active, Suspended, Completed, Deceased)
  • Azioni rapide per ogni appuntamento:
    • "Registra Visita"
    • "Riprogramma"
    • "Segna Mancato"

Layout Proposto (semplificato)

┌────────────────────────────────────────────────────────────┐
│ 📅 Calendario Appuntamenti - [Mese Anno]  [◀ Oggi ▶] [+]  │
├────────────────────────────────────────────────────────────┤
│  L    M    M    G    V    S    D                          │
│       1    2🟢  3    4    5    6                          │
│  7    8    9   10   11   12   13                          │
│ 14   15   16   17🟡 18   19   20                          │
│ 21   22   23⚫ 24   25   26   27                          │
│ 28   29   30                                              │
│                                                            │
│ Legenda (Stato Progetto):                                 │
│ 🟢 Active   🟡 Suspended   ⚪ Completed   ⚫ Deceased       │
│                                                            │
│ Filtri:                                                   │
│ [✓] Prima Apertura  [✓] Verifiche  [✓] Dimissioni        │
│ Educatore: [▼ Tutti               ]                       │
│ Stato Progetto: [▼ Tutti          ]                       │
└────────────────────────────────────────────────────────────┘

┌────────────────────────────────────────────────────────────┐
│ Appuntamenti del [Data Selezionata]                       │
├────────────────────────────────────────────────────────────┤
│ 🟢 Prima Apertura - ROSSI Mario                           │
│    Educatori: Bianchi, Verdi                              │
│    Progetto: PTRP 2025-2027 (Active)                      │
│    [Registra Visita] [Riprogramma] [Segna Mancato]       │
│                                                            │
└────────────────────────────────────────────────────────────┘

Componenti UI

  • CalendarView.xaml
  • CalendarViewModel
  • Eventuale DayViewModel per rappresentare i giorni

Binding principali

  • CurrentMonth (DateTime)
  • SelectedDate (DateTime)
  • Days (ObservableCollection)
  • SelectedDayAppointments (ObservableCollection)
  • Filtri (bool + enum + Guid?)

Comandi

  • GoToTodayCommand
  • GoToPreviousMonthCommand
  • GoToNextMonthCommand
  • SelectDayCommand
  • RegisterVisitCommand (apre VisitFormView)
  • RescheduleCommand
  • MarkAsMissedCommand

✍️ 2. VisitFormView (Educatore)

Requisiti Funzionali

Da USER-WORKFLOW:

  • La visita può essere creata SOLO a partire da un appuntamento esistente (relazione 1:1)
  • Campi obbligatori:
    • Data effettiva (non futura)
    • Ora inizio/fine (fine > inizio)
    • Almeno un operatore presente selezionato
    • Note cliniche
    • Presenza paziente (enum)

Layout Proposto (semplificato)

┌────────────────────────────────────────────────────────────┐
│ Registrazione Visita                                [X]   │
├────────────────────────────────────────────────────────────┤
│ Paziente: ROSSI Mario                                     │
│ Tipo Appuntamento: Prima Apertura (INTAKE)                │
│ Data Programmata: 02/04/2025                              │
│                                                            │
│ Data Effettiva:  [📅 02/04/2025]                          │
│ Ora Inizio:      [🕐 10:00]                               │
│ Ora Fine:        [🕐 11:30]                               │
│                                                            │
│ Operatori Presenti:                                       │
│ [✓] Bianchi (io)                                          │
│ [✓] Verdi                                                 │
│                                                            │
│ Note Cliniche (obbligatorio):                            │
│ [_______________________________________________]        │
│                                                            │
│ Esiti e Obiettivi:                                       │
│ [_______________________________________________]        │
│                                                            │
│ Presenza Paziente: [Presente e Collaborativo ▼]          │
│                                                            │
│ [Annulla]                              [Salva Visita]     │
└────────────────────────────────────────────────────────────┘

Componenti UI

  • VisitFormView.xaml
  • VisitFormViewModel

Binding principali

  • PatientName (string, read-only)
  • AppointmentTypeDisplay (string, read-only)
  • ScheduledDate (DateTime, read-only)
  • ActualDate (DateTime)
  • StartTime / EndTime (TimeSpan)
  • Operators (ObservableCollection)
  • ClinicalNotes (string)
  • Outcomes (string?)
  • SelectedPresenceStatus (enum PresenceStatus)

Comandi

  • SaveCommand → chiama IVisitService.RegisterVisitAsync(...)
  • CancelCommand

Validazioni (collegate a issue #54)

  • Mostrare errori di validazione vicino ai campi
  • Snackbar globale con messaggio "Correggi gli errori evidenziati"

📋 Tasks

  • Creare Views/Calendar/CalendarView.xaml + code-behind
  • Creare ViewModels/Calendar/CalendarViewModel.cs
  • Creare Views/Visits/VisitFormView.xaml + code-behind
  • Creare ViewModels/Visits/VisitFormViewModel.cs
  • Integrare CalendarView nella navigazione (Sidebar → Calendario)
  • Integrare VisitFormView con comando RegisterVisit in calendario e vista educatore "I miei appuntamenti"
  • Collegare CalendarViewModel a servizi dominio (es. IScheduledVisitService / IPatientService / IEducatorService)
  • Collegare VisitFormViewModel a servizio dominio visite (issue futura VisitService)

✅ Acceptance Criteria

  • Il Coordinatore può aprire "Calendario" dalla Sidebar e vedere la vista proposta
  • I giorni con appuntamenti mostrano un badge colorato in base allo stato del progetto
  • La lista "Appuntamenti del giorno" mostra paziente, tipo appuntamento, educatori, stato progetto
  • Il click su "Registra Visita" apre VisitFormView precompilata con dati appuntamento
  • Il salvataggio visita crea ActualVisitModel legato all'appuntamento e aggiorna lo stato a Completed
  • Le validazioni principali sono enforced lato UI (anche se parte della UX dettagliata arriverà con FASE 4 - Polish & Deploy: Validation UI e Error Handling Globale #54)

🔗 Riferimenti


FASE: 2B - Core Business: Calendario e Visite
PRIORITÀ: 🟡 ALTA
DIPENDENZE: #71, #72, #73
BLOCKING: Utilizzo completo FLUSSI 3-4 lato Coordinatore/Educatore

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions