Composables

useAttivita

Composable principale per CRUD attività su una specifica entità.

Panoramica

useAttivita gestisce tutte le operazioni CRUD per le attività di una specifica entità. Dopo ogni operazione ricarica automaticamente la lista e emette eventi cross-app tramite onEvent.

Internamente usa repository ottenuto via useAttivitaContext — quindi richiede AttivitaPlugin configurato (con baseUrl o repository custom).

Auto-refresh cross-componente (v1.0.0): ogni metodo di scrittura (pianifica/completa/annulla/ripristina/elimina/segnaComeFatto/aggiungi/rimuoviAssegnatario) incrementa refreshSignal del context. Inoltre useAttivita watcha refreshSignal per ri-fetchare attività + riepilogo quando un altro componente dell'app effettua una modifica. Per disabilitare, usare un repository custom che non incrementi il signal.

Inizializzazione

import { useAttivita } from '@pzeta/vue-attivita'

const { attivita, riepilogo, loading, error, fetchAttivita, pianificaAttivita, completaAttivita } =
  useAttivita({
    entitasorgente: 'anagrafica',
    identitasorgente: 42,
  })

Accetta anche MaybeRef — utile in componenti dove l'ID cambia dinamicamente:

const { attivita } = useAttivita({
  entitasorgente: toRef(props, 'entitasorgente'),
  identitasorgente: toRef(props, 'identitasorgente'),
})

Stato reattivo

ProprietàTipoDescrizione
attivitaRef<AttivitaView[]>Lista attività
riepilogoRef<AttivitaRiepilogo | null>Contatori riepilogo
loadingRef<boolean>Caricamento in corso
errorRef<string | null>Messaggio errore

Metodi

Caricamento

// Carica attività con filtri opzionali
await fetchAttivita({ stato: 'pianificata', priorita: 3 })

// Carica riepilogo contatori
await fetchRiepilogo()

// Entrambi in parallelo
await refresh()

Pianificazione

const result = await pianificaAttivita({
  p_idtipoattivita: 1,
  p_entitasorgente: 'anagrafica',
  p_identitasorgente: 42,
  p_riepilogo: 'Chiamata di follow-up',
  p_datascadenza: '2025-12-31',
  p_idutente: 10,
  p_priorita: 2,
  p_assegnatari: [10, 15],
})
// Emette: 'attivita:created'

Completamento

const result = await completaAttivita({
  p_idattivita: 123,
  p_risultato: 'Cliente interessato, fissato appuntamento',
})
// result.attivita_successive → eventuali attività da pianificare
// Emette: 'attivita:completata'

Annullamento

const result = await annullaAttivita({
  p_idattivita: 123,
  p_motivo: 'Cliente non raggiungibile',
})
// Emette: 'attivita:annullata'

Segna come fatto (pianifica + completa subito)

await segnaComeFatto({
  p_idtipoattivita: 1,
  p_entitasorgente: 'anagrafica',
  p_identitasorgente: 42,
  p_riepilogo: 'Nota su cliente',
  // p_datascadenza non richiesta
})

Altre operazioni

await ripristinaAttivita(idattivita)   // da 'annullata' a 'pianificata'
await eliminaAttivita(idattivita)      // eliminazione definitiva

await aggiungiAssegnatario(idattivita, idutente)
await rimuoviAssegnatario(idattivita, idutente)
const assegnatari = await getAssegnatari(idattivita)

AttivitaFilters

interface AttivitaFilters {
  entitasorgente?: string
  identitasorgente?: number
  stato?: 'pianificata' | 'completata' | 'annullata'
  scaduta?: boolean
  idutente?: number
  codtipoattivita?: CodTipoAttivita
  priorita?: Priorita
  datascadenzaDa?: string    // YYYY-MM-DD
  datascadenzaA?: string     // YYYY-MM-DD
  order?: 'datascadenza.asc' | 'datascadenza.desc' | 'priorita.desc'
  limit?: number
  offset?: number
}