Dashboard
Azioni Rapide
Attività Recente
0 attivitàLink Utili
Aggiorna Tutto
Aggiorna tutti gli impianti COSMINA da CURIT. Seleziona i responsabili da aggiornare. Gli impianti nascosti vengono saltati.
Confronto CURIT
Scarica la lista impianti da CURIT e la confronta con COSMINA e il file Excel. Segnala impianti mancanti, rimossi, e dati cambiati (manutentore, indirizzo, ecc.). Invia report via email.
Log Estrazione
Email Centralizzate ACG Suite
Tutte le email inviate dalle app ACG Suite tramite COSMINA Email Service
Email Recenti
0 emailCaricamento email...
File Esportati
Caricamento...
Alert e Monitor automatici
Questa pagina elenca tutti i controlli automatici attivi su COSMINA: cosa monitorano, quando girano, chi avvisano e cosa succede quando trovano un'anomalia.
L'elenco è mantenuto a mano — se aggiungi/modifichi un alert nelle Cloud Functions, aggiorna anche questa pagina (sezione alert-monitor in index.html).
Fuso orario: tutti gli orari sono Europe/Rome. Region: europe-west1.
CRM — Tipo cliente mancante
ATTIVO
Garantisce che ogni condominio in crm_clienti abbia il campo tipo_condominio valorizzato (CLIENTE ACG MAN, CLIENTE GUAZZOTTI MAN, CLIENTE ACG STR, CLIENTE GUAZZOTTI STR, CLIENTE ACG SOLO LETT, NON ATTIVO). Senza tipo cliente la classificazione del condominio in CRM è incompleta e i filtri/report per tipologia sono falsati.
Cloud Function onCrmClienteCreate: quando viene creato un nuovo doc in crm_clienti, se tipo_condominio è vuoto accoda un record in cosmina_pending_notifications.
Cloud Function onCrmClienteTipoChange: quando il tipo viene aggiunto o cambiato, manda subito una mail informativa (no debounce) a Alberto e Sara.
Schedule */5 * * * *: legge la coda, aggrega gli accodamenti più vecchi di 5 min (anti-spam in caso di import bulk), manda una sola mail aggregata, poi cancella i record dalla coda.
Schedule 0 8 * * *: scansiona TUTTA la collection crm_clienti, raccoglie quelli con tipo vuoto, manda mail riepilogativa. Se zero, nessuna mail.
functions/src/crm-tipo-cliente-monitor.jsCRM — Amministratore mancante
ATTIVO
Garantisce che ogni condominio attivo in crm_clienti abbia il campo amministratore valorizzato. L'amministratore è il riferimento principale per comunicazioni, contratti e visite tecniche; senza questo dato è impossibile contattare la proprietà del condominio in modo strutturato.
Stesso trigger onCrmClienteCreate del check tipo: se l'amministratore manca accoda in cosmina_pending_notifications con type=crm_amm_mancante.
Stesso trigger onCrmClienteTipoChange: se l'amministratore viene aggiunto/cambiato manda subito mail di conferma.
Stessa scheduled crmTipoMancanteFlusher: aggrega coda → 1 mail aggregata, cancella i record.
Stessa scheduled crmTipoMancanteDailyReport: scansione completa, mail riepilogativa solo se ≥1 mancante.
ZZ, tipo NON ATTIVO, CLIENTE ACG STR, CLIENTE GUAZZOTTI STR, amministratore = "Nessuno" (proprietà private/enti senza amministratore di riferimento — valore canonico per dichiarare l'assenza intenzionale)functions/src/crm-amministratore-monitor.jsCRM — Targhe CURIT mancanti (clienti MAN in PV)
ATTIVO
Garantisce che ogni cliente in manutenzione (MAN) della provincia di Pavia abbia almeno una targa CURIT in ref_cosmina_targhe. Senza targhe collegate non è possibile riconciliare i pagamenti CURIT con le proforma DOC nella sezione Riconciliazione, né mostrare la colonna Cliente (ACG/GUAZZOTTI) accanto ai movimenti.
Stesso trigger onCrmClienteCreate: se nuovo cliente è MAN-PV con ref_cosmina_targhe vuoto accoda in cosmina_pending_notifications con type=man_targhe_mancanti.
Stesso trigger onCrmClienteTipoChange: se un cliente cambia (es. da SOLO LETT/STR a MAN, oppure provincia cambia in PV) e si trova senza targhe → accodato. Gestisce la transizione "diventa problematico", non duplica se era già problematico.
Stessa scheduled crmTipoMancanteFlusher (riusata): aggrega coda type=man_targhe_mancanti più vecchia di 5 min, manda 1 mail aggregata, cancella i record.
Stessa scheduled crmTipoMancanteDailyReport: scansiona tutti i MAN-PV senza targhe, mail riepilogativa solo se ≥1.
CLIENTE ACG MAN/CLIENTE GUAZZOTTI MAN (STR/SOLO LETT/NON ATTIVO non sono monitorati), province diverse da PV (Piemonte usa CIT non CURIT, gestito da Task separato)functions/src/crm-tipo-cliente-monitor.js (sezione MAN-targhe)Sync proforma ↔ versamento CURIT
ATTIVO
Mantiene aggiornati i campi ultima_proforma e proforma_versata_curit su cosmina_impianti. Questo serve per il badge 🟡 PRF DA VERSARE nella tabella CURIT (Impianti Estratti) e per il filtro "Proforma emessa, versamento CURIT mancante". La logica replica quella della Riconciliazione CURIT: usa le PRF in docfin_documents (con targa esplicita, breakdown, o cumulative CURIT), i pagamenti in cosmina_curit_movimenti e il mapping crm_clienti.ref_cosmina_targhe.
Cloud Function onDocfinPrfWriteSyncCurit: ogni create/update/delete di docfin_documents con type=PRF scatena un full recalc degli impianti (perché una PRF cumulativa può impattare 100+ targhe).
Cloud Function onCuritMovimentoWriteSync: ogni nuovo pagamento CURIT estratto dal worker (collection cosmina_curit_movimenti) ricalcola la targa coinvolta.
Cloud Function onCrmClienteWriteSyncProforma: se cambia ref_cosmina_targhe o tipo_condominio di un cliente CRM, ricalcola tutti gli impianti collegati (vecchi e nuovi).
proformaCuritFullRecalc (0 3 * * *): ogni notte ricalcola tutti gli impianti per recuperare eventuali drift se i trigger sopra hanno fallito o sono stati skippati.
cosmina_impianti.ultima_proforma (oggetto PRF) + proforma_versata_curit (bool/null)functions/src/proforma-curit-sync.jsCURIT — Saldo non coincide (alert immediato)
ATTIVOOgni volta che il worker estrae l'estratto conto CURIT, confronta il saldo calcolato dai movimenti (somma ricariche − somma uscite) con il credito residuo scrapato dalla pagina portafoglio. Se i due valori differiscono oltre 1 centesimo, manda subito mail di alert ad Alberto e Sara. Significa che il worker ha perso movimenti, oppure CURIT ha applicato addebiti/storni non visibili nel registro — in entrambi i casi va indagato manualmente.
Cloud Function onCuritMetaWriteCheckSaldo: scatta ogni volta che il worker aggiorna i meta dell'estratto CURIT. Calcola il delta e, se |delta| > 0,01€, manda mail. Rate limit 2 ore: anche se il worker rigira più volte, non spamma.
functions/src/curit-alerts.js — checkSaldoOnMetaWrite()CURIT — Digest giornaliero riconciliazione
ATTIVOMail di sintesi alle 08:00 lun-ven con lo stato della riconciliazione portafoglio CURIT. Tre condizioni monitorate insieme. La mail parte solo se almeno una condizione è in errore: in giornate "pulite" niente posta.
Saldo calcolato dai movimenti ≠ credito residuo scrapato (oltre 1 cent).
Proforma emesse a Guazzotti/condominio per cui CURIT non ha ancora registrato la ricarica corrispondente. Conteggio e totale €.
Pagamenti registrati su CURIT senza una PRF Guazzotti/condominio collegata. Conteggio e totale €.
curitDailyDigest — 0 8 * * 1-5 (Europe/Rome).
cosmina_curit_movimenti + cosmina_curit_estratto_meta/latest + docfin_documents (PRF)functions/src/curit-alerts.js — dailyCuritDigest()Letture contaKW + contatore gas — notifica Lorenzo
ATTIVOQuando un tecnico chiude un intervento di lettura contaKW + contatore gas dalla PWA, Lorenzo riceve subito una mail con la descrizione del lavoro fatto e tutti gli allegati (foto contatori) caricati dal tecnico. Lorenzo può così procedere con l'invio delle letture senza dover aprire COSMINA per ogni intervento. Pattern simile alle letture WalkBy ma per le letture contaKW.
Riusato il trigger esistente onBachecaCardSyncTech: quando una card passa da aperta a chiusa (transizione esatta) e listName == "LETTURE CONTAKW CONTATORE GAS" oppure il nome contiene contakw + contatore + lettura, scarica gli allegati da Firebase Storage e manda una mail singola con i file in attachment fisico.
trello.com/1/cards/) vengono scartati automaticamente.LETTURE CONTAKW CONTATORE GAS è specifica per questa attività.functions/src/lettura-contakw-monitor.jsCRM — Dati essenziali mancanti
ATTIVO
Garantisce che ogni condominio attivo in crm_clienti abbia i dati essenziali di anagrafica: indirizzo, citta, provincia. Senza questi dati non si può mandare un tecnico, non si può preparare un preventivo, e i report territoriali risultano incompleti.
Trigger onCrmClienteCreate → coda cosmina_pending_notifications con type=crm_dati_mancanti.
Aggrega coda → mail singola.
Scan completo: mail solo se ≥1 missing.
functions/src/crm-dati-essenziali-monitor.js
ZZ, tipo NON ATTIVO/CLIENTE ACG STR/CLIENTE GUAZZOTTI STRInterventi — Riepilogo aperti a Sara (4 fasce)
ATTIVO4 volte al giorno (lun-ven) Sara riceve via mail il riepilogo aggiornato degli interventi della giornata, con focus sugli ancora aperti. Permette di intercettare interventi non chiusi prima di fine giornata e seguire il lavoro dei tecnici. Alberto in CC.
summaryAperti1225: prima foto a metà mattina, allineato col reminder WA tecnici.
summaryAperti1400: residuo mattina, dopo l'orario lavorativo dei tecnici.
summaryAperti1725: seconda foto metà pomeriggio.
summaryAperti2000: residuo serale, ultima chiamata prima di archiviare.
functions/src/interventi-summary.jsInterventi — Riepilogo fine giornata "tutti chiusi"
ATTIVOQuando tutti gli interventi del giorno risultano chiusi, parte una mail di riepilogo finale ad Alberto (Sara e Massimo in CC). Tabella stile Excel raggruppata per condominio (ordine A→Z), con descrizione lavoro e link diretto a ogni card. Idempotente: se già inviata oggi, non rispedisce.
summaryFineGiornata (*/15 17-22 * * 1-5): ogni quarto d'ora controlla. Se ci sono interventi del giorno e tutti sono chiusi, manda la mail (una sola volta). Idempotenza garantita da cosmina_alert_state/fine_giornata_{YYYY-MM-DD}.
completed=true / lista DA VALIDARE / labels DA VALIDARE/CHIUSO / nome contiene "Intervento concluso" o "ESEGUITO"archiviato=truefunctions/src/interventi-summary.jsInterventi — Reminder WhatsApp tecnici
ATTIVOA fine mattinata e fine giornata, controlla quali tecnici hanno ancora interventi aperti nella loro agenda e manda loro un reminder WhatsApp per chiuderli (rapportino, firma, foto). Senza questo reminder spesso interventi rimangono aperti per giorni e si perdono dati.
remindInterventiMattina: alle 12:25 invia il primo reminder WA ai tecnici con interventi mattutini ancora aperti.
remindInterventiMattinaRetry: ogni 5 min dalle 12:30 riprova finché tutti chiusi (max 10 reminder per tecnico).
remindInterventiPomeriggio: alle 17:25 invia il primo reminder WA per gli interventi pomeridiani.
remindInterventiPomeriggioRetry: ogni 5 min dalle 17:30 riprova finché tutti chiusi.
cosmina_config/tecnici_acg)functions/src/agenda-notifications.jsVerifica Passato — Alert giornaliero interventi scaduti
ATTIVO
Ogni giorno alle 18:00 conta gli interventi scaduti non completati (stessa logica della sezione Verifica Passato: due < oggi, stato ≠ chiuso, non archiviati, escluse le liste INTERVENTI DA ESEGUIRE e RIPARTIZIONE). Se ce n'è almeno uno, invia una mail di riepilogo con il totale e la ripartizione per lista.
verificaPassatoAlert: scansione bacheca_cards, mail solo se ≥1 intervento scaduto.
functions/src/verifica-passato-alert.jsWaha — Health check WhatsApp Gateway
ATTIVOVerifica che il server Waha (WhatsApp Gateway, ospitato su VPS Hetzner) sia online e che il webhook verso COSMINA sia configurato correttamente. Se Waha cade, smettono di funzionare i reminder WA, l'invio di messaggi a clienti, la ricezione di segnalazioni WhatsApp.
wahaHealthCheck (*/10 * * * *): chiama l'endpoint di status del server Waha. Se non risponde o webhook non configurato, scrive log + scrive in Firestore lo stato. La logica di alert visivo (badge rosso) è gestita lato UI.
waha-ops).functions/src/waha-health.jsGmail — Rinnovo watch automatico
ATTIVOGmail invia notifiche push a COSMINA via Pub/Sub ogni volta che arriva una mail (per il sistema "Email Watcher" che genera ticket automatici dalle mail clienti). La sottoscrizione "watch" Gmail scade dopo 7 giorni: questa scheduled la rinnova ogni 3 giorni per essere sicuri.
renewGmailWatch (0 4 */3 * *): chiama API Gmail users.watch per rinnovare la sottoscrizione push sul topic gmail-cosmina-push.
functions/src/gmail-push.jsGoogle Contacts — Sync bidirezionale
ATTIVO
Sincronizza la rubrica COSMINA (cosmina_contatti_clienti, cosmina_contatti_interni) con i contatti Google dell'account ac2clima@gmail.com. I tecnici hanno la rubrica aziendale automatica sul telefono; modifiche fatte sul telefono rientrano in COSMINA.
syncGoogleContacts (0 * * * *): polling completo Google → Firestore + bidirezionale. Recupera contatti aggiunti/modificati sul telefono (Google non emette webhook).
Trigger onContactClienteWriteSyncGoogle e onContactInternoWriteSyncGoogle: ogni write in Firestore viene propagato a Google entro pochi secondi.
origine='google_sync_manual' permanente, il trigger Firestore→Google viene bloccato (anti-loop).functions/src/google-contacts-sync.js + contact-sync-trigger.jsGDPR — Data retention cleanup
ATTIVOOgni notte cancella i dati che hanno superato la scadenza di conservazione configurata (audit log vecchi, sessioni di chat scadute, file temporanei in Storage). Garantisce conformità GDPR art. 5 (limitazione della conservazione) — i dati personali non possono essere conservati oltre il necessario.
dataRetentionCleanup (0 3 * * *): scansiona le collection con TTL configurato e cancella record con timestamp scaduto. Logga tutto su audit_log.
functions/src/data-retention.jsInterventi — Monitoraggio chiusura (UI lato Alberto)
ATTIVOPannello visivo (non un cron, ma un listener real-time) che mostra in tempo reale sulla home di COSMINA quali tecnici hanno interventi ancora aperti durante le finestre di chiusura mattina/pomeriggio. È la versione "lato office" del reminder WhatsApp che parte ai tecnici.
Listener Firestore su bacheca_cards: quando l'orario è dentro 12:25-14:00 o 17:25-20:00, mostra in dashboard la lista tecnici con interventi non chiusi. Si nasconde da sé fuori finestra.
remindInterventi*). È solo un monitor visivo.js/monitoraggio-chiusura.jsGuazzotti TEC — Monitor RTI pending
ATTIVO
Monitora la collection cross-project pending_rti sul progetto guazzotti-tec: quando i tecnici inviano un RTI dalla PWA, il documento finisce qui in attesa di essere convertito in CRTI/GRTI definitivo. Se i documenti restano "pending" troppo a lungo significa che la pipeline è incagliata.
monitorPendingRti: ascolta i write su pending_rti in tempo reale, controlla anomalie (documenti orfani, missing fields, RTI in stato pending da troppo).
monitorPendingRti in index.js📋 Note operative
- Forzare l'esecuzione manuale di una scheduled: Console Firebase → Cloud Functions → Triggers → seleziona la function → "Run now". Utile per testare daily report senza aspettare le 08:00.
- Vedere i log di un alert: Console Firebase → Cloud Functions → seleziona function → "Logs". I log con prefisso
[crm-tipo-monitor],[crm-amm-monitor],[GMAIL], ecc. identificano il monitor. - Disattivare temporaneamente un alert: commentare la registrazione in
functions/index.jse ridepleoy. Per riattivare, decommentare e ridepleoy. - Aggiungere un nuovo alert: scrivere il modulo in
functions/src/, registrarlo inindex.js, deploy con./deploy.sh functions, aggiornare anche questa pagina. - Fuso orario cron: tutte le scheduled hanno
timeZone: "Europe/Rome", quindi rispettano l'ora legale automaticamente.
AI Usage - Token & Costi
Storico Giornaliero
| Data | Richieste | Costo IN | Costo OUT | Totale | Avg/Req |
|---|
Listino Prezzi Modelli Claude
| Modello | Model ID | Input $/MTok | Output $/MTok | Rapporto OUT/IN | Costo 100K token |
|---|---|---|---|---|---|
| Caricamento... | |||||
Log Sistema
Strumenti di Sviluppo
Learning Mode - Istruzioni
- Clicca "Learning Mode" per aprire il browser
- Effettua il login su CURIT (automatico se configurato)
- Naviga alla pagina con i campi da mappare
- CTRL+Click su un campo per catturarlo
- Inserisci il nome del campo nel popup
- Chiudi il browser per salvare i selettori
Impianti Estratti
0 risultatiNessun impianto estratto
Esegui un'estrazione CURIT per visualizzare i dati qui.
Log ACG Suite
Movimenti CURIT
| Data movim. | Data dich. | Condominio / Indirizzo | Cliente | Cod. Impianto Targa |
Cod. Dich. Catasto |
Importo Versamento € | Stagioni Coperte | Proforma ACG | Fattura ACG | Descrizione |
|---|---|---|---|---|---|---|---|---|---|---|
| Caricamento... | ||||||||||
Impianti CIT - Regione Piemonte
0 risultatiNessun impianto CIT
La sezione CIT Piemonte (Provincia di Alessandria) e' in fase di implementazione.
~100 impianti | Login CIE | Bollino gratuito | REE Tipo 1 con NOx
Configurazione Estrazione CIT
Configura i parametri per l'estrazione degli impianti CIT Piemonte
Aggiorna Singolo Impianto CIT
Cerca un impianto per codice e aggiorna i dati in COSMINA
Log Estrazione CIT
Impianti CAITEL - Regione Liguria
0 risultatiNessun impianto CAITEL
La sezione CAITEL Liguria (Provincia di Genova) e' in attesa di accreditamento.
~10 impianti | Login SPID/CIE | Bollino a pagamento (borsellino) | RCEE Tipo 1-4
Preferenze Notifiche per Utente
Dispositivi Registrati
0 dispositivi| App | Utente | Dispositivo | Registrato | Azioni |
|---|---|---|---|---|
| Nessun dispositivo registrato | ||||
Invia Notifica Test
Configura Automazioni con AI
Descrivi in linguaggio naturale i trigger che vuoi crearePuoi chiedermi cose come:
- "Ogni mattina alle 8, avvisami se ci sono interventi non completati di ieri"
- "Quando un cantiere passa a COMPLETATO su KANT, notifica COSMINA"
- "Se non ci sono letture da 7 giorni su READER, manda un alert"
Descrivimi cosa vuoi automatizzare!
Trigger Attivi
Nessun trigger configurato
Usa la chat sopra per creare il tuo primo trigger!
Messaggi Automatici
Nessun messaggio automatico
I messaggi dai trigger attivi appariranno qui
Post-Operazione
Configura gli step automatici dopo ogni operazione CURIT
Compila Dichiarazione
Step dopo compilazione singola dichiarazione
Regolarizza Impianto
Step dopo regolarizzazione (include SOLO MAN)
Cambio Generatore
Step dopo sostituzione generatore
Download Libretto
Step dopo scaricamento libretto
| Nome | Azienda | Interno | Tel. Personale | Tel. Lavoro | Categoria | Azioni | |
|---|---|---|---|---|---|---|---|
| Caricamento... | |||||||
| Codice | Nome | Indirizzo | Città | Tipo Cliente | Amministratore |
|---|---|---|---|---|---|
| Caricamento... | |||||
Dichiarazioni Compilate
Caricamento...
Interventi Scaduti
0 interventiPremi "Aggiorna" per caricare gli interventi scaduti
IN ARRIVO (0)
Caricamento messaggi in arrivo...
BACHECA (0)
Agenda Ufficio
Riepilogo Giornata Odierna
Elenco Garanzie
| Inizio | Fine | Costruttore | Modello | Matricola | Cliente | Indirizzo | Stato | Azioni |
|---|---|---|---|---|---|---|---|---|
| Caricamento garanzie... | ||||||||
Interventi Bacheca
| Titolo | Lista | Etichette | Scadenza | Azioni |
|---|---|---|---|---|
| Seleziona la sezione Bacheca per caricare i dati | ||||
Filtra Interventi
Interventi Da Eseguire
| Condominio | Tipo | Intervento | Data | Etichette | Priorità | Azioni |
|---|---|---|---|---|---|---|
| Seleziona la sezione per caricare i dati | ||||||
Mappa Interventi
Gestione Campagne
Azioni Multiple
Interventi per Zona
Caricamento documenti...
Telegestione Impianti
Programmazione orari di accensione/spegnimento da remoto
| Condominio | Fase | Fornitore | Stato Comm. | Progresso | App. | Rip. | Pass. |
|---|---|---|---|---|---|---|---|
| Caricamento... | |||||||
Situazione Ripartitori ACG — Contabilizzazione Indiretta
Impianti Estratti
I dati degli impianti estratti dal catasto CURIT si trovano nella sezione CURIT.
Pubblica Evento
Eventi ACG Suite
| Priorità | Tipo | Sorgente | Destinatari | Data | Azioni |
|---|---|---|---|---|---|
| Clicca "Aggiorna" per caricare gli eventi | |||||