Composables

useFasiService

Composable principale per board pipeline — caricamento, spostamento schede, CRUD e team.

Panoramica

useFasiService è il composable centrale per board basate sullo schema fasi. Coordina tutti i dati e le operazioni di una pipeline: fasi, schede, campi, priorità, tag e team. Internamente usa @pzeta/postgrest per le chiamate API con header Content-Profile: fasi.

Inizializzazione

import { useFasiService } from '@pzeta/vue-kanban'

// Con ID numerico
const fasiService = useFasiService(42)

// Con codboard stringa (auto-resolve → ID)
const fasiService = useFasiService('crm')

Stato reattivo

ProprietàTipoDescrizione
fasiRef<FasePipeline[]>Fasi ordinate da v_fasi_pipeline
schedeRef<SchedaKanban[]>Schede da v_schede_kanban
campiRef<BoardCampoRow[]>Campi dinamici attivi
prioritaRef<BoardPrioritaRow[]>Priorità della board
tagsRef<BoardTagRow[]>Tag disponibili
loadingRef<boolean>Caricamento in corso
errorRef<string | null>Messaggio errore

Metodi di caricamento

// Caricamento iniziale completo (fasi + schede in parallelo)
await fasiService.loadFasiData()

// Ricaricamenti parziali
await fasiService.loadFasi()
await fasiService.loadSchede()
await fasiService.loadCampi()
await fasiService.loadPriorita()
await fasiService.loadTags()

Spostamento schede

// BR-003: SEMPRE tramite RPC, mai PATCH diretto su idfase
const response = await fasiService.spostaScheda(
  idScheda,
  idFaseDestinazione,
  idUtente
)
// response: SpostaSchedaResponse
// - response.notifiche_accodate > 0 se fase con template email/SMS
// - response.datachiusura valorizzata se fase finale

Lo spostamento è ottimistico: aggiorna schede.value immediatamente, poi chiama la RPC. In caso di errore esegue rollback ripristinando lo stato precedente.

Riordino fasi

// Aggiorna l'ordine delle colonne tramite RPC riordina_fasi
await fasiService.riordinaFasi([
  { idfase: 1, ordine: 1 },
  { idfase: 2, ordine: 2 },
  { idfase: 3, ordine: 3 },
])
// Il payload deve includere TUTTE le fasi della board

CRUD schede

const nuovaScheda = await fasiService.creaScheda({
  titolo: 'Nuovo lead',
  idfase: 5,
  descrizione: 'Cliente da contattare',
  idpriorita: 2,
})

await fasiService.aggiornaScheda(idScheda, {
  titolo: 'Lead aggiornato',
  idpriorita: 1,
})

await fasiService.eliminaScheda(idScheda)

// Tag: sostituzione completa del set
await fasiService.aggiornaSchedaTag(idScheda, [1, 3, 5])

Gestione fasi

const nuovaFase = await fasiService.creaFase({
  idboard: 42,
  nome: 'Qualificazione',
  ordine: 2,
  colore: '#3b82f6',
})

await fasiService.aggiornaFase(idfase, { nome: 'Nuova qualificazione' })

await fasiService.eliminaFase(idfase)

Team per fase

// Carica team disponibili nel sistema
const teamsDisponibili = await fasiService.caricaTeamDisponibili()

// Team assegnati a una fase specifica
const teamFase = await fasiService.caricaTeamFase(idfase)

// Sincronizza: sostituisce completamente i team della fase
await fasiService.sincronizzaTeamFase(idfase, [
  { idteam: 10 },
  { idteam: 15 },
])

Note

  • La board è identificata all'init: se boardId è una stringa viene risolto tramite GET /board?codboard=eq.{cod} al primo accesso.
  • Lo schema PostgreSQL fasi è richiesto come Content-Profile su ogni chiamata.
  • v_fasi_pipeline include metriche aggregate (totale_schede, schede_incorso, schede_pronto, schede_stallo, teams).
  • v_schede_kanban include dati denormalizzati per la card: priorita_nome, priorita_colore, assegnatario_nome, etichette (array JSON).