Composables

UseAttivita


title: useAttivita description: 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
}