Fieldwork
Rapportini di cantiere, controlli di sicurezza e ore delle squadre dal telefono
Cosa fa
App per chi lavora nei cantieri: ogni giorno si compila il rapportino, si fanno i controlli di sicurezza e si segnano le ore di ogni squadra.
Come guadagna
Il progetto è stato messo in vendita su SideProjectors a partire da circa 2.000 $. Come guadagna non è indicato pubblicamente.
Rendilo tuo
- Su misura per le imprese edili italiane: giornale dei lavori, foto con data e posizione, firma del capocantiere.
- Funziona anche senza internet in cantiere, e sincronizza quando torna la rete.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Rapportino": l'app per imprese edili e impiantisti: ogni giorno il capocantiere compila dal telefono il rapportino con lavori fatti, ore di ogni operaio, mezzi, materiali, foto e meteo, e l'ufficio ha tutto ordinato. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con le funzioni e il prezzo
2. Cantieri: indirizzo, committente, squadra
3. Rapportino del giorno dal telefono
4. Ore per operaio e per cantiere, settimana per settimana
5. Archivio dei rapportini in PDF
Stile: robusto da cantiere: sfondo bianco, arancione #EA580C, grigio cemento #374151, carattere "Inter" grande, 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:
- "cantieri": nome, indirizzo, committente, attivo
- "operai": nome, qualifica, costo orario (visibile solo all'ufficio)
- "rapportini": cantiere, data, lavori svolti, meteo, note, foto, firmato
- "ore": rapportino, operaio, ore ordinarie e straordinarie
Regole di sicurezza obbligatorie:
- ogni impresa vede solo i suoi dati
- un solo rapportino per cantiere al giorno
- i costi orari li vede solo l'ufficio, non i capocantiere
- un rapportino firmato non si modifica
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. Il rapportino in 3 minuti
Il capocantiere apre l'app, il cantiere di oggi è già scelto (dalla posizione o dall'ultimo usato). Compila: lavori svolti (scrivendo o dettando), operai presenti con le ore (precompilati con la squadra abituale), mezzi usati, materiali arrivati, foto. Il meteo si compila da solo.
Il database permette un solo rapportino per cantiere al giorno, e lo blocca dopo la firma. Funziona anche senza campo: si salva nel telefono e si invia appena torna la rete.
Il PDF del rapportino si genera in automatico con logo, foto e firma, pronto per la direzione lavori.
4. Ore e costi per l'ufficio
L'ufficio vede le ore per operaio e per cantiere, settimana per settimana (query nei Dettagli tecnici), da usare per le buste paga e per capire quanto costa ogni cantiere. Il costo della manodopera per cantiere si calcola dai costi orari, visibili solo all'ufficio.
Esportazione in Excel delle ore del mese per il consulente del lavoro. Avviso se un operaio supera le ore settimanali consentite.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 29 € al mese per impresa. Gratis l'utente ha: un cantiere attivo e 5 operai. Con il piano Pro sblocca: cantieri e operai illimitati, foto illimitate, costi per cantiere 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. Ruoli: entra come capocantiere e prova a leggere i costi orari degli operai: deve essere impossibile.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Un rapportino al giorno e ore per operaio
Il vincolo unique impedisce due rapportini per lo stesso cantiere e giorno; la query somma le ore della settimana per operaio e cantiere.
create table rapportini (
id uuid primary key, -- creato nel telefono (funziona anche offline)
impresa_id uuid not null,
cantiere_id uuid not null,
giorno date not null,
lavori text not null,
meteo jsonb,
firmato_il timestamptz,
unique (cantiere_id, giorno)
);
create table ore (
rapportino_id uuid not null references rapportini(id) on delete cascade,
operaio_id uuid not null,
ordinarie numeric(4, 1) not null default 8 check (ordinarie between 0 and 12),
straordinarie numeric(4, 1) not null default 0 check (straordinarie between 0 and 8),
primary key (rapportino_id, operaio_id)
);
-- Costi orari in una tabella separata: solo l'ufficio
create table costi_operai (
operaio_id uuid primary key,
impresa_id uuid not null,
costo_orario_centesimi int not null
);
alter table costi_operai enable row level security;
create policy "solo ufficio" on costi_operai for all using (exists (
select 1 from membri m where m.impresa_id = costi_operai.impresa_id
and m.utente_id = auth.uid() and m.ruolo = 'ufficio'));
-- Ore della settimana per operaio e cantiere
select o.operaio_id, r.cantiere_id,
sum(o.ordinarie) as ordinarie, sum(o.straordinarie) as straordinarie
from ore o join rapportini r on r.id = o.rapportino_id
where r.impresa_id = 'ID-IMPRESA'
and r.giorno >= date_trunc('week', current_date)
group by o.operaio_id, r.cantiere_id
order by o.operaio_id;Meteo del giorno per il cantiere
Il meteo del rapportino si compila da solo con Open-Meteo, gratuito e senza chiave, dalla posizione del cantiere.
export async function meteoCantiere(lat: number, lng: number, giorno: string) {
const url = "https://api.open-meteo.com/v1/forecast?latitude=" + lat + "&longitude=" + lng +
"&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,wind_speed_10m_max" +
"&timezone=Europe%2FRome&start_date=" + giorno + "&end_date=" + giorno;
const { daily } = await fetch(url).then((r) => r.json());
return {
massima: daily.temperature_2m_max[0],
minima: daily.temperature_2m_min[0],
pioggiaMm: daily.precipitation_sum[0],
ventoKmh: daily.wind_speed_10m_max[0],
codice: daily.weather_code[0], // 0 sereno, 61-65 pioggia, 71-75 neve...
};
}
Pezzi comuni a tutti i progetti
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- Rapportino
- Il resoconto giornaliero del cantiere: chi ha lavorato, quante ore, cosa è stato fatto.
- PWA
- Un sito che si installa come un'app e funziona anche senza connessione.