← Tutte le idee Gestionali per aziende

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.