← Tutte le idee Strumenti online

Bankstatemently

Trasforma gli estratti conto in PDF in file Excel

Incasso mensile: 375 USD (fonte indicata nella scheda)

Cosa fa

Converte gli estratti conto bancari in PDF in file CSV, Excel o per programmi di contabilità.

Come guadagna

Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.

Rendilo tuo

  • Per le banche italiane e per i commercialisti, che ricevono estratti conto in PDF dai clienti.
  • Attenzione alla privacy: file cancellati subito dopo la conversione.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Estratto in Excel": converte gli estratti conto bancari in PDF in file Excel o CSV ordinati (data, descrizione, entrate, uscite, saldo), con il controllo che i conti tornino. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con un esempio e i prezzi
2. Registrazione e accesso
3. Caricamento del PDF: tutto viene letto nel browser
4. Anteprima della tabella con il controllo dei saldi
5. Esportazione in Excel, CSV o formato per il gestionale

Stile: sobrio e affidabile: sfondo bianco, verde #15803D, grigio #374151, carattere "Inter", tabella stile foglio di calcolo con i totali in fondo. 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:
- "conversioni": nome della banca, periodo, numero di movimenti, esito del controllo, data. I movimenti NON si salvano
- "profili": piano e pagine convertite nel mese

Regole di sicurezza obbligatorie:
- i dati dei movimenti non lasciano il browser e non si salvano sul server
- ogni utente vede solo il registro delle sue conversioni
- il piano non si modifica dal browser

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. Lettura nel browser e controllo dei saldi

Il PDF viene letto nel browser con pdf.js (codice nei Dettagli tecnici): nessun dato bancario viene caricato sul server. Mostra in grande: "Il tuo estratto conto non lascia il tuo computer".

Dal testo si ricavano le righe dei movimenti con regole per i formati delle principali banche italiane (data, data valuta, descrizione su più righe, importo con la virgola). Per i formati non riconosciuti, l'utente indica una volta quali colonne sono cosa.

Controllo dei conti: saldo iniziale + entrate − uscite deve dare il saldo finale stampato. Se torna, spunta verde; se no, evidenzia la pagina dove probabilmente manca un movimento.

4. Esportazione

Esportazione in Excel (.xlsx) con le colonne Data, Descrizione, Entrate, Uscite, Saldo, i totali e il formato numerico italiano; in CSV; e in formati di importazione per i gestionali più usati.

Categorie automatiche facoltative (stipendio, affitto, utenze, carburante) con regole sulle parole della descrizione, modificabili dall'utente e salvate nel browser.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 9 € al mese. Gratis l'utente ha: 5 pagine al mese. Con il piano Pro sblocca: pagine illimitate, più conti, categorie automatiche ed esportazione per i gestionali.

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. Privacy: apri la scheda Rete degli strumenti del browser durante una conversione: non deve partire nessuna richiesta con i dati dell'estratto conto.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Leggere il PDF nel browser

Estrae le righe di testo da ogni pagina del PDF con pdf.js, raggruppando i pezzi di testo che stanno alla stessa altezza.

import * as pdfjs from "pdfjs-dist";
pdfjs.GlobalWorkerOptions.workerSrc = new URL("pdfjs-dist/build/pdf.worker.mjs", import.meta.url).toString();

export async function righeDelPdf(file: File): Promise<string[][]> {
  const pdf = await pdfjs.getDocument({ data: await file.arrayBuffer() }).promise;
  const pagine: string[][] = [];

  for (let n = 1; n <= pdf.numPages; n++) {
    const contenuto = await (await pdf.getPage(n)).getTextContent();
    const perRiga = new Map<number, { x: number; testo: string }[]>();
    for (const pezzo of contenuto.items as { str: string; transform: number[] }[]) {
      const y = Math.round(pezzo.transform[5]);           // altezza sulla pagina
      if (!perRiga.has(y)) perRiga.set(y, []);
      perRiga.get(y)!.push({ x: pezzo.transform[4], testo: pezzo.str });
    }
    pagine.push(
      [...perRiga.entries()]
        .sort((a, b) => b[0] - a[0])                      // dall'alto in basso
        .map(([, pezzi]) => pezzi.sort((a, b) => a.x - b.x).map((p) => p.testo).join(" ").trim())
        .filter(Boolean),
    );
  }
  return pagine;
}

I conti tornano?

Converte gli importi in formato italiano e controlla che saldo iniziale più movimenti dia il saldo finale, lavorando in centesimi per evitare errori di arrotondamento.

// "1.234,56" -> 123456 centesimi; "-45,00" -> -4500
export function centesimi(importo: string): number {
  const pulito = importo.replace(/[^\d,-]/g, "").replace(",", ".");
  return Math.round(Number(pulito) * 100);
}

type Movimento = { data: string; descrizione: string; entrata: number; uscita: number };  // centesimi

export function controllaSaldi(saldoIniziale: number, movimenti: Movimento[], saldoFinale: number) {
  const calcolato = movimenti.reduce((s, m) => s + m.entrata - m.uscita, saldoIniziale);
  return {
    ok: calcolato === saldoFinale,
    differenza: (saldoFinale - calcolato) / 100,     // in euro: il movimento che probabilmente manca
    entrate: movimenti.reduce((s, m) => s + m.entrata, 0) / 100,
    uscite: movimenti.reduce((s, m) => s + m.uscita, 0) / 100,
  };
}

Pezzi comuni a tutti i progetti

Glossario

CSV
Un file di testo con i dati separati da virgole, che si apre con Excel.
pdf.js
La libreria gratuita di Mozilla che legge i PDF direttamente nel browser.
Elaborazione nel browser
I dati vengono letti dal computer dell'utente e non arrivano mai a nessun server: il modo più sicuro per la privacy.