BasinCheck
Controlli di sicurezza dal telefono, al posto dei fogli di carta
Incasso mensile: 895 USD (fonte indicata nella scheda)
Cosa fa
Piattaforma per fare controlli di sicurezza sul campo dal telefono, pensata per le ditte che lavorano nel petrolio e gas, al posto di moduli cartacei e fogli Excel.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- La stessa idea per i settori italiani con tanti controlli obbligatori: edilizia, impianti, cucine (HACCP).
- Funziona anche senza rete e sincronizza dopo.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Controllo Cantiere": sostituisce i moduli di carta per i controlli di sicurezza e manutenzione (cantieri, impianti, magazzini, mezzi): liste di controllo dal telefono, foto, firma e report in PDF, anche senza connessione. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale per le aziende con funzioni e prezzi
2. Registrazione dell'azienda e invito dei tecnici
3. Modelli di liste di controllo (es. ponteggi, estintori, carrelli elevatori, DPI)
4. Ispezione dal telefono: domanda per domanda, con foto e note
5. Pannello: ispezioni fatte, non conformità aperte, scadenze
Stile: da lavoro sul campo: sfondo bianco, giallo sicurezza #FACC15, nero #111827, rosso #DC2626 per le non conformità, verde #16A34A per le conformità, carattere "Inter", pulsanti enormi usabili con i guanti. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "aziende" e "membri": l'azienda e i suoi utenti (responsabile, tecnico)
- "modelli": liste di controllo con le domande in JSON
- "ispezioni": modello, luogo, tecnico, risposte, foto, firma, data
- "non_conformita": problema trovato, gravità, responsabile, scadenza, chiusa o no
Regole di sicurezza obbligatorie:
- ogni azienda vede solo i suoi dati
- i tecnici compilano ispezioni, i responsabili gestiscono modelli e non conformità
- un'ispezione firmata non si può più modificare
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Ispezioni anche senza campo
Crea l'app come PWA installabile sul telefono. Il tecnico sceglie il modello e il luogo, poi risponde una domanda alla volta: Conforme / Non conforme / Non applicabile, con foto obbligatoria per le non conformità, note e posizione GPS facoltativa. Alla fine firma con il dito.
Funziona anche senza connessione (in cantiere spesso manca): le ispezioni si salvano nel telefono e partono da sole appena torna la rete (codice nei Dettagli tecnici). In alto: "3 ispezioni in attesa di invio".
Ogni "Non conforme" crea una non conformità con gravità, responsabile e scadenza.
4. Report e scadenze
Per ogni ispezione si genera un PDF con logo, dati, risposte, foto e firma, da archiviare o mandare via email. Un'ispezione firmata non si modifica più: le correzioni si fanno con una nuova ispezione.
Pannello del responsabile: non conformità aperte per gravità e scadenza, calendario dei controlli periodici (es. estintori ogni 6 mesi) con promemoria via email, ed esportazione Excel. Ricorda che l'app aiuta a organizzare i controlli ma non sostituisce gli obblighi di legge e il responsabile della sicurezza.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 39 € al mese per azienda. Gratis l'utente ha: 2 utenti e 20 ispezioni al mese. Con il piano Pro sblocca: utenti e ispezioni illimitati, modelli personalizzati, scadenzario ed esportazioni.
A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Offline: metti il telefono in modalità aereo, compila 2 ispezioni con foto, riattiva la rete: devono arrivare entrambe una sola volta.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Coda offline delle ispezioni
Salva le ispezioni nel telefono (IndexedDB) e le invia appena torna la connessione. Ogni ispezione ha un id creato nel telefono, così non si duplica se l'invio viene ripetuto.
import { createStore, del, entries, set } from "idb-keyval";
import { supabase } from "./supabase";
const coda = createStore("controllo-cantiere", "ispezioni-in-attesa");
export async function salvaIspezione(ispezione: { id: string; [k: string]: unknown }) {
await set(ispezione.id, ispezione, coda); // id = crypto.randomUUID() creato nel telefono
void inviaInAttesa();
}
export async function inviaInAttesa() {
if (!navigator.onLine) return;
for (const [id, ispezione] of await entries(coda)) {
// upsert: se era già arrivata, non crea un doppione
const { error } = await supabase.from("ispezioni").upsert(ispezione, { onConflict: "id" });
if (!error) await del(id, coda);
}
}
// Riprova da sola quando torna la rete
window.addEventListener("online", () => void inviaInAttesa());Ispezioni bloccate dopo la firma
Le regole per azienda e ruolo, e un trigger che impedisce di modificare un'ispezione già firmata.
create table membri (
azienda_id uuid not null,
utente_id uuid not null references auth.users(id) on delete cascade,
ruolo text not null check (ruolo in ('responsabile', 'tecnico')),
primary key (azienda_id, utente_id)
);
create function membro_di(azienda uuid) returns boolean
language sql stable security definer set search_path = public as $
select exists (select 1 from membri where azienda_id = azienda and utente_id = auth.uid());
$;
create table ispezioni (
id uuid primary key, -- creato nel telefono
azienda_id uuid not null,
modello_id uuid not null,
luogo text not null,
tecnico_id uuid not null default auth.uid() references auth.users(id),
risposte jsonb not null,
firma_path text,
firmata_il timestamptz,
creato_il timestamptz not null default now()
);
alter table ispezioni enable row level security;
create policy "ispezioni dell'azienda" on ispezioni for all
using (membro_di(azienda_id)) with check (membro_di(azienda_id));
create function blocca_firmate() returns trigger language plpgsql as $
begin
if old.firmata_il is not null then
raise exception 'Ispezione firmata: non si può modificare';
end if;
return new;
end $;
create trigger ispezione_firmata before update or delete on ispezioni
for each row execute function blocca_firmate();
Pezzi comuni a tutti i progetti
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
- PWA
- Un sito che si installa sul telefono come un'app e funziona anche senza connessione.
- IndexedDB
- Un piccolo database dentro il browser del telefono, dove i dati restano anche offline.