← Tutte le idee Attività locali e immobiliare

Bali Villa Hub

Il portale degli affitti a lungo termine in una località precisa

Incasso mensile: 5600 USD (fonte indicata nella scheda)

Cosa fa

Piattaforma dedicata agli affitti di lunga durata a Bali, per chi ci si trasferisce o ci passa mesi.

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 una località italiana amata dagli stranieri che lavorano da remoto: Puglia, Sicilia, laghi.
  • Affitti per studenti fuori sede in una città universitaria.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Casa per Mesi": una bacheca di affitti a medio e lungo periodo in una città italiana (es. Bologna, Milano, Torino) per studenti, lavoratori in trasferta e smart worker, con annunci verificati. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con ricerca per zona, budget e durata
2. Elenco annunci con filtri e mappa
3. Scheda dell'annuncio con foto, contratto, spese e modulo di contatto
4. Pubblica il tuo annuncio (per i proprietari)
5. Pannello del proprietario con annunci e richieste ricevute

Stile: accogliente e chiaro: sfondo bianco, terracotta #C2410C, verde salvia #4D7C0F, carattere "Nunito", foto delle case grandi e mappa sempre a portata. 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:
- "annunci": titolo, zona, indirizzo approssimativo, prezzo mensile, spese, tipo di contratto (transitorio, studenti, 4+4, 3+2), durata minima, disponibile dal, foto, stato (in attesa, approvato, scaduto), visibile fino a, collegati al proprietario
- "richieste": nome, email, messaggio, durata, collegate all'annuncio

Regole di sicurezza obbligatorie:
- tutti vedono gli annunci approvati e ancora visibili
- il proprietario vede e modifica solo i suoi annunci e le richieste ricevute
- approvazione e scadenza le cambiano solo gli amministratori e il pagamento
- l'email del proprietario non è mai mostrata

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. Ricerca e annunci

Crea la ricerca con filtri: zona, prezzo massimo comprese le spese, durata (1–6 mesi, 6–18 mesi, oltre), tipo di contratto, arredato, animali ammessi. Risultati in elenco e su mappa (posizione approssimativa, mai l'indirizzo esatto).

Ogni annuncio deve indicare obbligatoriamente: tipo di contratto, prezzo, spese condominiali e utenze, deposito, durata minima e massima. Mostra accanto al tipo di contratto una spiegazione semplice (es. "Transitorio: da 1 a 18 mesi, per esigenze temporanee").

Il modulo "Contatta il proprietario" invia la richiesta via email al proprietario senza mostrare l'indirizzo.

4. Pannello proprietari e verifica

Il proprietario pubblica l'annuncio con foto (fino a 15), e lo paga per renderlo visibile 30 giorni. Dopo il pagamento passa "in attesa": un amministratore lo controlla (foto coerenti, prezzo plausibile, dati completi) e lo approva.

Pannello con gli annunci, le richieste ricevute, il pulsante "Rinnova" e "Affittato" che lo nasconde. Avviso fisso ai cercatori: "Non pagare mai caparre prima di aver visto la casa e firmato un contratto".

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di 19 € per 30 giorni di pubblicazione. Il pagamento rende l'annuncio visibile per 30 giorni, dopo l'approvazione.

A pagamento riuscito il webhook imposta "visibile_fino" a la data di oggi più 30 giorni nella tabella "annunci", sulla riga del annuncio indicata in client_reference_id.

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. Truffe: verifica che non si possa pubblicare un annuncio senza tipo di contratto, prezzo e spese, e che l'indirizzo esatto non compaia mai.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Tabelle con approvazione e scadenza

Gli annunci sono visibili solo se approvati e non scaduti. Le richieste le legge solo il proprietario.

create table annunci (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  titolo text not null,
  zona text not null,
  lat_approssimata double precision,
  lng_approssimata double precision,
  prezzo_mese int not null check (prezzo_mese > 0),
  spese_mese int not null default 0,
  deposito int not null default 0,
  contratto text not null check (contratto in ('transitorio', 'studenti', '4+4', '3+2')),
  durata_min_mesi int not null,
  disponibile_dal date not null,
  arredato boolean not null default true,
  stato text not null default 'in_attesa' check (stato in ('in_attesa', 'approvato', 'affittato')),
  visibile_fino timestamptz
);
alter table annunci enable row level security;

create policy "annunci visibili" on annunci for select using (
  (stato = 'approvato' and visibile_fino > now()) or auth.uid() = utente_id
);
create policy "pubblico il mio" on annunci
  for insert with check (auth.uid() = utente_id and stato = 'in_attesa' and visibile_fino is null);
create policy "modifico il mio" on annunci
  for update using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

create function proteggi_annuncio() returns trigger language plpgsql as $
begin
  if coalesce(auth.role(), '') <> 'service_role' and (
       new.visibile_fino is distinct from old.visibile_fino
       or (new.stato is distinct from old.stato and new.stato <> 'affittato')) then
    raise exception 'Approvazione e scadenza le cambia solo la redazione';
  end if;
  return new;
end $;
create trigger annuncio_protetto before update on annunci
  for each row execute function proteggi_annuncio();

create table richieste (
  id uuid primary key default gen_random_uuid(),
  annuncio_id uuid not null references annunci(id) on delete cascade,
  nome text not null,
  email text not null,
  messaggio text not null,
  creato_il timestamptz not null default now()
);
alter table richieste enable row level security;
create policy "chiunque scrive" on richieste for insert with check (true);
create policy "le leggo se l'annuncio è mio" on richieste for select using (exists (
  select 1 from annunci a where a.id = annuncio_id and a.utente_id = auth.uid()));

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.
Contratto transitorio
Un contratto d'affitto da 1 a 18 mesi, per chi ha esigenze temporanee documentate (lavoro, studio).