Monica, la mia ragazza, adesso si occupa dei turni di una Casa della Comunità.
All’inizio praticamente doveva segnarsi su un foglio di calcolo le disponibilità di ogni medico, sentendoli uno per uno in ordine di graduatoria.
Ho sinceramente provato pietà e ho iniziato a dare un senso a quel CAOS. Anche perché l’informatica che in sanità fa ostruzionismo è un po’ una mia fissa.
- Anno
- 2026
- Tipo
- Web app open source
- Stack
- WordPress · React
- Ruolo
- UX/UI · Sviluppo

E facciamo questo calendario
Allora, la base è il calendario della struttura, mese per mese, con le fasce della mattina e del pomeriggio da coprire. Il punto è chi le sceglie e in che ordine, perché i medici non scelgono quando gli pare. Va prima chi sta più in alto in graduatoria, poi il secondo con quello che è rimasto, e avanti così fino in fondo.
In pratica l’app va a turno. Quando tocca a un medico gli arriva una mail con un link, ci clicca, entra senza password e si ritrova il calendario con le fasce ancora libere. Sceglie le sue, controlla il totale delle ore e conferma, e a quel punto la mail parte per il prossimo.
Se in quelle ore ha già un turno in un’altra struttura, non glielo fa prenotare.

E siccome c’è sempre chi preferisce il telefono, Monica può scegliere al posto suo. Rimane segnato che l’ha fatto lei.
La graduatoria… parliamone
Per i medici di famiglia la graduatoria si ricava dalle regole, e la calcola l’app. Per la guardia medica invece arriva dal distretto, in un file Excel.
Il problema è che è un file pensato per essere stampato. Ci sono i gruppi per postazione, le liste mese per mese, lo stesso medico ripetuto su più righe, e in certi file nome e cognome sono pure invertiti.
L’ideale sarebbe riceverlo già strutturato, con una riga per contratto e le colonne sempre uguali, così l’importazione diventerebbe una formalità. Per ora non funziona così, e allora nel mezzo ci ho messo Claude.
Gli passo l’Excel, lui lo apre con un po’ di Python e me lo restituisce come CSV con le colonne che dico io. Le regole del file gliele ho scritte nel prompt una per una, tipo queste.
Un medico con PIÙ contratti va su PIÙ righe, una per periodo.
(l'ordine dei gruppi NON è una priorità)
Le righe "NON ASSEGNATO" vanno ignorate.
Non inventare dati: se un valore non è deducibile, cella vuota.

Comunque non salva niente da solo. Prima l’app confronta il CSV con i medici che ha già e fa vedere chi è nuovo, chi è cambiato e chi ha perso posizione, e importa solo dopo che hai confermato.
Da lì in poi la graduatoria sta nell’app, e per trovare un medico lo cerchi per nome.
E sotto c’è WordPress
L’app è in React, ma dietro c’è WordPress. Utenti, ruoli, permessi ed editor c’erano già, e io ho potuto pensare solo ai turni.
Le strutture sono delle pagine fatte a blocchi, che ho costruito con Define Blocks, così orari e chiusure Monica se li cambia da sola dall’editor. Anche la graduatoria imposta a una struttura è un blocco, e se lo togli non vale più ma la lista resta salvata.

Per gli stili e l’editor ho usato Core Editor. Sono altri due plugin miei.
Dove WordPress non bastava ho aggiunto delle tabelle per i turni e dei lock sul database, perché può capitare che Monica tocchi la griglia mentre un medico sta ancora scegliendo.
Altre cose, in ordine sparso
La notula
È il foglio presenze che il medico consegna a fine mese. Gliela prepara l’app, già compilata con i turni, e il PDF lo genero da zero senza librerie.
Il calendario pubblico
Ogni struttura ha un link da girare nel gruppo WhatsApp. Si vede cosa è libero e cosa no, ma senza nomi.
Quanti pazienti ha un medico
ESTAR, l’ente della Regione Toscana, pubblica l’elenco dei medici di famiglia con le scelte che hanno ancora libere. Quanti pazienti hanno non lo dice, ma conoscendo il massimale si ricava per differenza.
Se vuoi provarla
Il codice è su GitHub, con una demo da installare in locale con due strutture, tre medici e un coordinatore finti. In modalità demo non partono mail e non si chiama né ESTAR né Claude, puoi smanettare tranquillo.