Inspectly
Verbali di ispezione degli immobili con foto e aiuto dell'AI
Cosa fa
Software per documentare lo stato di un immobile (per esempio all'ingresso e all'uscita di un inquilino): stanza per stanza, con foto, note e un verbale finale.
Come guadagna
Il progetto è stato messo in vendita su SideProjectors a circa 1.250 $. Come guadagna non è indicato pubblicamente.
Rendilo tuo
- Per affitti brevi e property manager in Italia: verbale di check-in e check-out per Airbnb, con le foto dei danni.
- L'AI descrive lo stato della stanza dalle foto e prepara il verbale da firmare.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Verbale Casa": documenta lo stato di un immobile all'ingresso e all'uscita dell'inquilino, stanza per stanza, con foto, note e un verbale in PDF firmato da entrambi, per evitare discussioni sulla cauzione. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con un esempio di verbale e prezzi
2. Registrazione e accesso
3. Nuovo verbale: immobile, tipo (ingresso o uscita), stanze
4. Compilazione stanza per stanza dal telefono: elementi, stato, foto, note
5. Confronto ingresso/uscita e firma
Stile: chiaro e imparziale: sfondo bianco, blu #1E3A8A, verde #16A34A (buono), giallo #CA8A04 (usurato), rosso #DC2626 (danneggiato), carattere "Inter". 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:
- "verbali": immobile, tipo (ingresso, uscita), data, parti, firme, impronta del PDF
- "elementi": stanza, elemento (pareti, pavimento, infissi, sanitari...), stato, note, foto
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi verbali
- un verbale firmato non si modifica più
- le foto stanno in uno spazio privato
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. Stanza per stanza, con foto
Per ogni stanza il sito propone gli elementi tipici (pareti, soffitto, pavimento, porte, finestre, prese, termosifoni, sanitari, elettrodomestici). Per ognuno: stato (buono, usurato, danneggiato), note e foto. Le foto hanno data e ora stampate sopra e si salvano subito nello Storage privato.
Alla fine si genera il PDF del verbale, firmato con il dito da proprietario e inquilino sullo stesso telefono. Del PDF si salva l'impronta digitale (SHA-256, codice nei Dettagli tecnici): se qualcuno modificasse il file in seguito, l'impronta non corrisponderebbe più.
Ognuna delle parti riceve il PDF via email.
4. Confronto all'uscita
Il verbale d'uscita si crea partendo da quello d'ingresso: stessi elementi e stanze, con le foto d'ingresso affiancate per scattare quelle nuove dalla stessa angolazione.
Il confronto mostra in automatico gli elementi peggiorati (query nei Dettagli tecnici), con foto prima/dopo: una base chiara per parlare della cauzione. Ricorda che la normale usura non è un danno.
5. Pagamenti con Stripe
Aggiungi pacchetti di crediti: 1 verbale a 9 €, 10 verbali a 59 €. Ogni nuovo utente riceve 1 crediti gratis. Ogni verbale firmato costa un credito; l'uscita collegata a un ingresso è inclusa. Mostra sempre in alto quanti crediti restano e, quando finiscono, un riquadro per comprarne altri.
A pagamento riuscito il webhook aggiunge i crediti del pacchetto con la funzione aggiungi_crediti.
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. Integrità: modifica un byte del PDF scaricato e usa la pagina di verifica: deve dire che il file non corrisponde.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Impronta del PDF per dimostrare che non è stato modificato
Calcola l'impronta SHA-256 del PDF firmato. Si salva nel database e si stampa in fondo all'email: chiunque può ricalcolarla e confrontarla.
export async function impronta(file: Blob): Promise<string> {
const byte = await file.arrayBuffer();
const hash = await crypto.subtle.digest("SHA-256", byte);
return [...new Uint8Array(hash)].map((b) => b.toString(16).padStart(2, "0")).join("");
}
// Pagina di verifica: l'utente carica il PDF e il sito confronta con l'impronta salvata
export async function verifica(file: Blob, improntaSalvata: string) {
return (await impronta(file)) === improntaSalvata
? "Il verbale è identico a quello firmato."
: "Attenzione: questo file è diverso da quello firmato.";
}Verbali bloccati e confronto ingresso/uscita
Un verbale firmato non si modifica; la query confronta ogni elemento tra ingresso e uscita e mostra quelli peggiorati.
create table verbali (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
immobile text not null,
tipo text not null check (tipo in ('ingresso', 'uscita')),
ingresso_id uuid references verbali(id),
firmato_il timestamptz,
impronta_pdf text
);
create table elementi (
id uuid primary key default gen_random_uuid(),
verbale_id uuid not null references verbali(id) on delete cascade,
utente_id uuid not null references auth.users(id) on delete cascade,
stanza text not null,
elemento text not null,
stato int not null check (stato in (1, 2, 3)), -- 1 buono, 2 usurato, 3 danneggiato
note text not null default '',
foto text[] not null default '{}'
);
alter table verbali enable row level security;
create policy "le mie righe" on verbali
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table elementi enable row level security;
create policy "le mie righe" on elementi
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create function blocca_firmato() returns trigger language plpgsql as $
begin
if exists (select 1 from verbali v where v.id = coalesce(new.verbale_id, old.verbale_id) and v.firmato_il is not null) then
raise exception 'Verbale già firmato: non si può modificare';
end if;
return coalesce(new, old);
end $;
create trigger elementi_bloccati before insert or update or delete on elementi
for each row execute function blocca_firmato();
-- Elementi peggiorati tra ingresso e uscita
select u.stanza, u.elemento, i.stato as stato_ingresso, u.stato as stato_uscita, i.foto as prima, u.foto as dopo
from verbali vu
join elementi u on u.verbale_id = vu.id
join elementi i on i.verbale_id = vu.ingresso_id and i.stanza = u.stanza and i.elemento = u.elemento
where vu.id = 'ID-VERBALE-USCITA' and u.stato > i.stato
order by u.stanza;
Pezzi comuni a tutti i progetti
Glossario
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
- Impronta SHA-256
- Un codice calcolato dal contenuto di un file: se cambia anche una virgola, il codice cambia completamente.