A'lure
App di prenotazione per un salone di bellezza riservato alle donne
Cosa fa
App per prenotare trattamenti in un salone di bellezza pensato solo per donne: servizi, orari liberi, prenotazione e promemoria.
Come guadagna
Il progetto è stato messo in vendita su SideProjectors a partire da circa 2.500 $. Come guadagna non è indicato pubblicamente.
Rendilo tuo
- Vendila come app con il marchio del salone a più saloni della tua città, con un piccolo canone mensile.
- Aggiungi le schede delle clienti: colore usato l'ultima volta, allergie, preferenze.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Salone Prenota": prenotazioni online per saloni di bellezza con più operatrici: la cliente sceglie il trattamento e l'operatrice (o "qualsiasi"), vede gli orari liberi e riceve i promemoria. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale per i saloni con funzioni e prezzo
2. Configurazione del salone: operatrici, trattamenti che sa fare ognuna, orari
3. Pagina pubblica di prenotazione /:slug
4. Agenda del salone a colonne, una per operatrice
5. Clienti e storico
Stile: elegante e accogliente: sfondo bianco, rosa cipria #E8B4BC, oro #B08D57, carattere "Cormorant Garamond" per i titoli e "Jost" per i testi, foto dei trattamenti. 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:
- "operatrici": nome, foto, orari, trattamenti che esegue
- "trattamenti": nome, durata, prezzo
- "appuntamenti": cliente, trattamento, operatrice, periodo, stato
Regole di sicurezza obbligatorie:
- pagina, operatrici e trattamenti sono pubblici
- la cliente non vede gli appuntamenti delle altre
- la stessa operatrice non può avere due appuntamenti sovrapposti: lo impedisce il database
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. Scegli l'operatrice o "qualsiasi"
La cliente sceglie il trattamento, poi l'operatrice preferita oppure "Qualsiasi operatrice". Il calendario mostra gli orari liberi del giorno.
Con "qualsiasi", il database assegna da solo la prima operatrice libera che sa fare quel trattamento (codice nei Dettagli tecnici), distribuendo il lavoro. Un vincolo impedisce che la stessa operatrice abbia due appuntamenti che si sovrappongono, anche se due clienti prenotano nello stesso istante.
Conferma via email o WhatsApp, promemoria il giorno prima con il link per spostare o annullare.
4. Agenda e clienti
Agenda del giorno a colonne, una per operatrice, con gli appuntamenti colorati per trattamento; si spostano trascinandoli da una colonna all'altra.
Scheda cliente con storico dei trattamenti, preferenze e note (allergie in evidenza). Statistiche: incasso per operatrice e per trattamento, clienti nuove del mese.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 25 € al mese per salone. Gratis l'utente ha: una operatrice e 40 appuntamenti al mese. Con il piano Pro sblocca: operatrici e appuntamenti illimitati, promemoria WhatsApp e statistiche.
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. Sovrapposizioni: con due operatrici, prenota da 3 finestre lo stesso orario con "qualsiasi": due prenotazioni riescono (una per operatrice), la terza no.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
La prima operatrice libera
Il vincolo exclude vieta le sovrapposizioni per operatrice; la funzione prova le operatrici che sanno fare il trattamento, iniziando da quella con meno appuntamenti quel giorno.
create extension if not exists btree_gist;
create table competenze (
operatrice_id uuid not null,
trattamento_id uuid not null,
primary key (operatrice_id, trattamento_id)
);
create table appuntamenti (
id uuid primary key default gen_random_uuid(),
salone_id uuid not null,
operatrice_id uuid not null,
trattamento_id uuid not null,
cliente_nome text not null,
cliente_telefono text not null,
periodo tstzrange not null,
stato text not null default 'confermato' check (stato in ('confermato', 'annullato')),
exclude using gist (operatrice_id with =, periodo with &&) where (stato = 'confermato')
);
create function prenota_qualsiasi(salone uuid, trattamento uuid, inizio timestamptz, minuti int, nome text, telefono text)
returns uuid language plpgsql security definer set search_path = public as $
declare op uuid; nuovo uuid;
begin
for op in
select c.operatrice_id from competenze c
where c.trattamento_id = trattamento
order by (select count(*) from appuntamenti a
where a.operatrice_id = c.operatrice_id and a.stato = 'confermato'
and lower(a.periodo)::date = inizio::date) -- la meno impegnata prima
loop
begin
insert into appuntamenti (salone_id, operatrice_id, trattamento_id, cliente_nome, cliente_telefono, periodo)
values (salone, op, trattamento, nome, telefono, tstzrange(inizio, inizio + make_interval(mins => minuti)))
returning id into nuovo;
return nuovo; -- riuscita
exception when exclusion_violation then
null; -- occupata: prova la prossima
end;
end loop;
raise exception 'Nessuna operatrice libera a quell''ora';
end $;
grant execute on function prenota_qualsiasi(uuid, uuid, timestamptz, int, text, text) to anon, authenticated;
Pezzi comuni a tutti i progetti
Glossario
- Slug
- La parte finale e leggibile dell'indirizzo di una pagina, es. /pizzeria-da-mario.
- Vincolo exclude
- Una regola del database che impedisce di salvare due righe in conflitto, per esempio due appuntamenti sovrapposti.