Tipi

SchedaKanban

Tipo principale per le schede della pipeline fasi.

Panoramica

SchedaKanban è la view model usata per le card nel Kanban. Proviene dalla vista v_schede_kanban che denormalizza i join più comuni per evitare N+1.

Definizione

interface SchedaKanban {
  // Identificativi
  idscheda: number
  idfase: number
  idboard: number

  // Dati principali
  titolo: string
  descrizione: string | null
  codstatoscheda: CodStatoScheda
  ordine: number

  // Priorità (denormalizzata da fasi.priorita)
  idpriorita: number | null
  priorita_nome: string | null
  priorita_colore: string | null    // hex senza '#'

  // Assegnatario
  idassegnatario: number | null
  assegnatario_nome: string | null

  // Scadenza
  datascadenza: string | null       // ISO 8601

  // Tag (array JSON da JOIN)
  etichette: Array<{ idtag: number; nome: string; colore: string }> | null

  // Attività e allegati (contatori)
  nattivita: number
  nallegati: number
  ncommenti: number

  // Metriche
  giorni_infase: number             // giorni trascorsi nella fase corrente
  installo: boolean                 // true se giorni_infase > fase.giornistallo

  // Campi dinamici — oggetto JSON flat
  dati_extra: Record<string, unknown> | null

  // Audit
  datacreazione: string
  datamodifica: string | null
  datachisura: string | null        // valorizzata quando fase.finale = true
}

Campi flat vs annidati

ElementCard è progettato per leggere sia la forma flat di SchedaKanban (priorita_nome, priorita_colore) sia forme annidate (item.priorita.nome). Questo permette di usare ElementCard anche con strutture dati legacy.

dati_extra

dati_extra è un oggetto JSON con una chiave per ogni campo dinamico configurato in BoardCampoRow.nomecampo. I tipi dei valori seguono BoardCampoRow.tipocampo:

// Esempio: board con campi 'budget' (number) e 'urgente' (boolean)
scheda.dati_extra = {
  budget: 15000,
  urgente: true,
}

ElementCard legge dati_extra filtrandolo tramite la configurazione BoardCampoRow e formatta i valori per tipo.

Utilizzo

// In useFasiService
const schede: Ref<SchedaKanban[]> = ref([])
// Popolato da GET /v_schede_kanban?idboard=eq.{id}

// Accesso diretto
const schedeInCorso = computed(() =>
  fasiService.schede.value.filter(s => s.codstatoscheda === 'incorso')
)