Skip to content

feat(partitario): sottoconti del Piano dei conti come DataTable paginata server-side#1851

Open
AllWorkNoPlay-95 wants to merge 1 commit into
devcode-it:masterfrom
AllWorkNoPlay-95:feat/piano-conti-sottoconti-datatable
Open

feat(partitario): sottoconti del Piano dei conti come DataTable paginata server-side#1851
AllWorkNoPlay-95 wants to merge 1 commit into
devcode-it:masterfrom
AllWorkNoPlay-95:feat/piano-conti-sottoconti-datatable

Conversation

@AllWorkNoPlay-95

@AllWorkNoPlay-95 AllWorkNoPlay-95 commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Descrizione

Risolve il degrado di performance della pagina Piano dei conti
(controller.php?id_module=17) quando un mastro contiene molti sottoconti
(es. oltre 6000 conti credito verso clienti): espandendo il mastro venivano
caricati tutti i sottoconti nel DOM e la query impiegava secondi,
congelando anche il front-end.

Su un mastro con ~6400 sottoconti il caricamento del dettaglio passa da
33,36 s a 75 ms.

609899333-e9aea28f-98c9-47f6-bc3f-4c137c4e5a22 Screenshot 2026-06-30 alle 13 04 57

Soluzione

Oltre una soglia configurabile, i sottoconti di un mastro vengono mostrati come
DataTable con ricerca e impaginazione server-side invece dell'elenco completo.

  • Soglia configurabile Soglia datatable sottoconti (default 500, sezione
    "Piano dei conti"). Sotto soglia il comportamento è invariato (elenco semplice).
  • Paginazione server-side: ogni pagina è una fetch AJAX con LIMIT/OFFSET +
    conteggi, quindi il browser carica ~25 righe per volta invece di migliaia.
  • Query ottimizzata: la pagina seleziona prima i soli sottoconti da mostrare
    in una derived table (con LIMIT), poi esegue i join anagrafica/movimenti solo
    su quelle righe (query di pagina da ~2,5 s a ~12 ms via EXPLAIN ANALYZE).
  • Join anagrafica indicizzato: due LEFT JOIN diretti su an_anagrafiche
    invece del join IN (...) su derived table (non indicizzabile), con i relativi
    indici su id_conto_cliente / id_conto_fornitore (assenza segnalata nella issue).
  • Indice co_piano_dei_conti3 (id_piano_dei_conti2, numero) per la selezione
    paginata per mastro.
  • La ricerca globale in cima alla pagina resta funzionante e pilota la ricerca
    server-side della tabella.
  • UI coerente con il resto del gestionale: select2 per "Visualizza N elementi",
    campo di ricerca, paginazione in stile Bootstrap 4, campo "Vai a pagina" e loader
    standard dell'app.
Screenshot 2026-06-30 alle 13 46 15

Nota sul modal dei movimenti

Nella discussione della issue si era ipotizzato un modal con i movimenti al clic
sul singolo conto. In questa PR non è stato implementato: è stata mantenuta la
funzionalità preesistente di espansione inline dei movimenti (clic sul sottoconto
→ i movimenti vengono mostrati inline sotto la riga), per non alterare il comportamento
già esistente. Eventualmente valutabile come miglioria in una PR successiva.

Modifiche al database (update/2_13.sql)

  • Impostazione Soglia datatable sottoconti.
  • Indice idx_id_piano_dei_conti2_numero su co_piano_dei_conti3.
  • Indici idx_id_conto_cliente / idx_id_conto_fornitore su an_anagrafiche.

Dipendenze

Nessuna nuova dipendenza (DataTables, select2 e Bootstrap 4 sono già inclusi).

Risolve / Implementa: #1846

Tipologia

  • Nuova funzionalità (cambiamenti minori che aggiungono una nuova funzionalità)

Checklist

  • Il codice segue le linee guida del progetto
  • Ho commentato il codice, in particolare nelle parti più complesse
  • Ho aggiornato di conseguenza la documentazione
  • Il codice non genera warnings

@AllWorkNoPlay-95 AllWorkNoPlay-95 marked this pull request as draft June 30, 2026 11:49
Oltre una soglia configurabile (impostazione "Soglia datatable sottoconti", default
500) i sottoconti di un mastro vengono mostrati come DataTable con ricerca e
impaginazione server-side invece di caricare tutto nel DOM.

La query di pagina seleziona prima i sottoconti da mostrare in una derived table
(con LIMIT) e solo dopo esegue i join anagrafica/movimenti, con indice su
co_piano_dei_conti3(id_piano_dei_conti2, numero). Il join anagrafica usa due LEFT
JOIN diretti indicizzati su an_anagrafiche invece di un join IN su derived table.

Il caricamento del dettaglio di un mastro con ~6400 sottoconti passa da 33,36s a 75ms.
@AllWorkNoPlay-95 AllWorkNoPlay-95 force-pushed the feat/piano-conti-sottoconti-datatable branch from 35fd28d to b255f51 Compare June 30, 2026 12:08
@AllWorkNoPlay-95 AllWorkNoPlay-95 marked this pull request as ready for review June 30, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant