Flowr
Prenotazioni, fatture, clienti e statistiche in un unico programma
Cosa fa
Un software tutto in uno per piccole imprese di servizi: prenotazioni, fatturazione, rapporto con i clienti e analisi.
Come guadagna
Il progetto è stato messo in vendita su SideProjectors a circa 4.950 $. Come guadagna non è indicato pubblicamente.
Rendilo tuo
- In Italia le fatture devono essere elettroniche: meglio preventivi e incassi, collegandosi a un servizio di fatturazione elettronica.
- Un solo settore per cominciare.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Tutto Qui": un gestionale semplice per piccole imprese di servizi (pulizie, manutenzioni, consulenti, centri estetici): clienti, appuntamenti, preventivi, fatture e incassi in un posto solo. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con le funzioni e il prezzo
2. Registrazione e dati dell'azienda (partita IVA, regime fiscale, logo)
3. Clienti con storico di lavori, preventivi e fatture
4. Agenda dei lavori e appuntamenti
5. Fatture: creazione, numerazione, stato del pagamento, esportazione per il commercialista
Stile: professionale e ordinato: sfondo grigio chiaro #F8FAFC, blu #1D4ED8, verde #16A34A per gli incassi, rosso #DC2626 per gli scaduti, carattere "Inter", tabelle leggibili e numeri allineati a destra. 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:
- "clienti": ragione sociale o nome, partita IVA o codice fiscale, codice destinatario o PEC, indirizzo
- "lavori": cliente, data, descrizione, ore, stato
- "fatture": numero progressivo dell'anno, data, cliente, righe in JSON, imponibile, IVA, totale, pagata il
- "numerazione": l'ultimo numero usato per ogni anno
Regole di sicurezza obbligatorie:
- ogni azienda vede solo i suoi dati
- il numero delle fatture è progressivo per anno, senza buchi né doppioni: lo assegna il database
- una fattura emessa non si modifica più: si corregge con una nota di credito
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. Fatture con numerazione corretta
Crea la fattura partendo da un lavoro o da un preventivo accettato: righe con descrizione, quantità, prezzo e aliquota IVA (o la dicitura del regime forfettario, che non applica l'IVA). Totali calcolati in centesimi per evitare errori di arrotondamento.
Il numero si assegna solo all'emissione, con una funzione del database che lo rende progressivo per anno e senza buchi anche se due fatture vengono emesse nello stesso istante (codice nei Dettagli tecnici).
Per l'invio allo SDI (Sistema di Interscambio) serve la fattura elettronica in formato XML: genera il file FatturaPA e prevedi l'invio tramite un intermediario accreditato con API. Mostra chiaramente che il sito prepara le fatture ma non sostituisce il commercialista.
4. Incassi e scadenze
Pannello con: fatturato del mese e dell'anno, fatture da incassare e scadute (in rosso, con il pulsante per inviare un sollecito cortese via email), lavori da fatturare.
Esportazione per il commercialista: elenco fatture del periodo in Excel e i file XML in uno zip.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 19 € al mese. Gratis l'utente ha: 10 clienti e 5 fatture al mese. Con il piano Pro sblocca: clienti e fatture illimitati, preventivi, solleciti automatici 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. Numerazione: emetti 10 fatture velocemente da due finestre diverse: i numeri devono essere 1–10, senza doppioni né buchi.
2. Correzioni: verifica che una fattura emessa non si possa modificare né cancellare.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Numero di fattura progressivo senza buchi
La riga della numerazione dell'anno viene bloccata mentre si assegna il numero: le fatture emesse insieme vengono messe in fila e ricevono numeri consecutivi.
create table numerazione (
utente_id uuid not null references auth.users(id) on delete cascade,
anno int not null,
ultimo int not null default 0,
primary key (utente_id, anno)
);
alter table numerazione enable row level security;
create table fatture (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
cliente_id uuid not null,
anno int,
numero int,
data date,
righe jsonb not null,
totale_centesimi int not null,
emessa boolean not null default false,
pagata_il date,
unique (utente_id, anno, numero)
);
alter table fatture enable row level security;
create policy "le mie righe" on fatture
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create function emetti_fattura(fattura uuid) returns int
language plpgsql security definer set search_path = public as $
declare a int := extract(year from current_date); n int;
begin
insert into numerazione (utente_id, anno) values (auth.uid(), a) on conflict do nothing;
update numerazione set ultimo = ultimo + 1 -- blocca la riga fino alla fine
where utente_id = auth.uid() and anno = a
returning ultimo into n;
update fatture set anno = a, numero = n, data = current_date, emessa = true
where id = fattura and utente_id = auth.uid() and not emessa;
if not found then raise exception 'Fattura non trovata o già emessa'; end if;
return n;
end $;
-- Una fattura emessa non si tocca più (si corregge con una nota di credito)
create function blocca_emesse() returns trigger language plpgsql as $
begin
if old.emessa and (tg_op = 'DELETE' or new.righe is distinct from old.righe
or new.totale_centesimi is distinct from old.totale_centesimi or new.numero is distinct from old.numero) then
raise exception 'Fattura già emessa: usa una nota di credito';
end if;
return coalesce(new, old);
end $;
create trigger fattura_bloccata before update or delete on fatture
for each row execute function blocca_emesse();
Pezzi comuni a tutti i progetti
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- SDI
- Il Sistema di Interscambio dell'Agenzia delle Entrate, da cui passano tutte le fatture elettroniche in Italia.
- Nota di credito
- Il documento che corregge o annulla una fattura già emessa.