🇮🇹 100% Italiano | Conforme GDPR e DPR 430/2001
🚀 MVP Beta - Primo Sistema in Italia

Lotterie Benefiche Digitali.
Legali. Trasparenti.

La piattaforma SaaS che trasforma 68 ore di burocrazia in 5 minuti

68
Ore Risparmiate
800
Euro Risparmiati
100
% Compliance

Il Terzo Settore Merita di Meglio

Le lotterie benefiche sono un potente strumento di fundraising, ma la burocrazia le rende proibitive

68+ Ore

Per ogni autorizzazione Questura: raccolta documenti, compilazione moduli, invio raccomandate

💸

€500-800

In consulenze legali per garantire compliance con DPR 430/2001 e normative locali

Errori e Ritardi

Processo manuale = alto rischio di errori che causano ritardi o dinieghi

Prima Piattaforma in Italia

Sistema dedicato alle lotterie benefiche digitali

TechHearts è il primo e unico sistema SaaS in Italia progettato specificamente per le lotterie benefiche digitali conformi al DPR 430/2001.

Compliance DPR 430/2001 Primo in Italia MVP Beta

Tecnologia al Servizio della Solidarietà

Una piattaforma completa che automatizza ogni aspetto delle lotterie benefiche

Compliance Automatica

Documenti Questura generati automaticamente. Conformità DPR 430/2001 garantita.

Scopri di più →
💳

Pagamenti Sicuri

Stripe Connect integrato. Bonifici automatici all'ONG. Tracciabilità totale.

Scopri di più →
🎲

Sorteggio Trasparente

Basato su Bitcoin blockchain. Provabilmente equo. Video-registrato su YouTube.

Scopri di più →
📱

Supporto WhatsApp

Invio biglietti automatico. Notifiche vincite. Support dedicato per ONGs.

Scopri di più →

Primo e Unico in Italia

Il sistema SaaS dedicato alle lotterie benefiche digitali

Prima Piattaforma Dedicata

Non esiste nessun altro sistema in Italia progettato specificamente per le lotterie benefiche digitali conformi al DPR 430/2001.

Compliance Automatica DPR 430/2001

Nessun'altra piattaforma gestisce automaticamente tutta la burocrazia prevista dal decreto per le lotterie benefiche.

Automazione AI-Powered

L'unico sistema che integra AI workflows, N8N automations, e blockchain verification per le estrazioni.

MVP Beta - Primi Utenti

Siamo in fase MVP Beta. I primi 20 ONGs pilota avranno accesso esclusivo alla piattaforma e supporto prioritario.

Diventa Founding Member

Solo 20 posti disponibili per il programma pilota

Piani Trasparenti, Scalabili

Più raccogli, meno paghi. Il nostro successo è legato al vostro.

IDEALE PER INIZIARE

Starter

€197 /mese
+ 15%
commissione
  • 1 Lotteria attiva
  • Compliance automatica
  • Sorteggio Bitcoin
  • WhatsApp dedicato
  • Video YouTube
14 Giorni Gratis
PIÙ POPOLARE
CRESCI CON NOI

Pro

€347 /mese
+ 13%
commissione
  • 3 Lotterie attive
  • Tutto di Starter +
  • Report impatto
  • Supporto prioritario
  • 3 utenti team
14 Giorni Gratis
PER GRANDI ORGANIZZAZIONI

Enterprise

€697 /mese
+ 10%
commissione
  • Lotterie illimitate
  • Tutto di Pro +
  • Account manager
  • API access
  • Custom branding
Contattaci
ESCLUSIVO

I Primi 100 Avranno Vantaggi Esclusivi a Vita

Commissione ridotta all'8.5%, roadmap esclusiva, community VIP

8.5%
Commissione a Vita
€349
Canone Mensile Fisso
2 Mesi
Gratis al Lancio
Attenzione: Interrompendo l'abbonamento si perde lo status Founding Member
Scopri i Vantaggi
Posti rimasti: 94/100

Per Ogni Organizzazione del Terzo Settore

Da piccole associazioni a grandi network nazionali

🦁

Club Service

Lions, Rotary, Leo, Rotaract

Scopri di più →
🏛️

Enti RUNTS

APS, ODV, ONLUS registrate

Scopri di più →

Enti Religiosi

Parrocchie, oratori, comunità

Scopri di più →
🎓

Istruzione

Scuole, università, borse di studio

Scopri di più →
🏥

Sanità Non-Profit

Ospedali, ricerca medica

Scopri di più →
🏘️

Comunità Locali

Pro Loco, comitati cittadini

Scopri di più →

Dal Nostro Blog

Guide, case studies e novità sulle lotterie benefiche in Italia

Domande Frequenti

È davvero conforme al DPR 430/2001?

Sì, al 100%. Abbiamo lavorato con avvocati specializzati in diritto amministrativo per garantire compliance totale. Generiamo automaticamente tutti i documenti richiesti dalla Questura secondo i template ufficiali.

Chi è il responsabile legale della lotteria?

La vostra organizzazione. TechHearts è un fornitore di tecnologia (come Stripe per i pagamenti). La responsabilità legale della lotteria rimane dell'ONG che la organizza, come previsto dalla legge.

Come funziona il sorteggio trasparente?

Usiamo l'hash del blocco Bitcoin più recente come seed random provabilmente equo. Il sorteggio è video-registrato e pubblicato su YouTube. Chiunque può verificare la correttezza matematica.

Quanto tempo ci vuole per avere l'autorizzazione?

Noi prepariamo i documenti in 5 minuti. La Questura/Comune ha per legge 30 giorni per rispondere (silenzio-assenso). In pratica, con documenti perfetti, molte Questure approvano in 7-15 giorni.

Posso provare prima di pagare?

Sì! Tutti i piani includono 14 giorni di prova gratuita. Nessuna carta di credito richiesta. Puoi esplorare l'intera piattaforma e creare una lotteria di test.

Cosa succede se voglio cancellare?

Puoi cancellare in qualsiasi momento, senza penali. Le lotterie già avviate verranno completate. Se sei Founding Member e cancelli, perdi i vantaggi esclusivi permanentemente.

Pronto a Rivoluzionare le Tue Lotterie Benefiche?

Unisciti alle centinaia di organizzazioni che hanno già scelto TechHearts

Hai domande? Scrivici a info@techhearts.it o chiamaci al +39 000 000 000
`) }) // API Routes app.get('/api/health', (c) => { return c.json({ status: 'ok', timestamp: new Date().toISOString(), service: 'TechHearts Lottery Benefica API' }) }) // Pagina Founding Members app.get('/founding-members', (c) => { return c.html(` Founding Members - TechHearts Lottery Benefica
ESCLUSIVO - SOLO 100 POSTI

Diventa un
Founding Member

I primi 100 Lions Club, Rotary Club e organizzazioni qualificate
ottengono vantaggi esclusivi a vita

POSTI RIMASTI
94/100

Vantaggi Esclusivi a Vita

Una volta perso, lo status Founding Member non può essere recuperato

💰

8.5% Commissione

La commissione più bassa in assoluto, garantita a vita. Gli altri pagano 10-15%.

Valore: €3.000+/anno
🎯

€349/mese Fisso

Piano Enterprise a prezzo Pro. Lotterie illimitate, account manager, API access.

Valore: €4.176/anno
🎁

2 Mesi Gratis

Al lancio (Maggio 2026) ricevi €698 di credito. Inizia subito senza pagare.

Valore: €698
🗺️

Roadmap Esclusiva

Voti prioritari sulle nuove feature. Le tue richieste saranno implementate per prime.

Valore: Inestimabile
👥

Community VIP

Accesso a gruppo Telegram privato con altri Founding Members. Networking di alto livello.

Valore: Networking
🏆

Badge Esclusivo

Badge oro sul profilo pubblico. Maggiore visibilità e credibilità per le tue lotterie.

Valore: Branding
Valore Totale: €7.874+
Solo per i primi 100. Per sempre.

Founding vs Standard

Vedi la differenza

Caratteristica
🏆 FOUNDING
€349/mese
+ 8.5%
Enterprise
€697/mese
+ 10%
Commissione 8.5% 10%
Canone mensile €349 €697
Lotterie attive Illimitate Illimitate
Roadmap prioritaria
Community VIP
Badge esclusivo
Bonus lancio (2 mesi) €698 -
RISPARMIO ANNUALE
€7.874+
€0

Richiedi il Tuo Posto

Compila il form per essere ricontattato entro 24 ore

Solo 94 posti disponibili

Domande Frequenti

Chi può diventare Founding Member?

Lions Club, Rotary Club, APS, ODV, ONLUS e altre organizzazioni non-profit registrate al RUNTS e operative in Italia. Priorità a chi può partire subito (Maggio 2026).

L'8.5% è garantito per sempre?

SÌ. La commissione 8.5% è garantita a vita finché mantieni l'abbonamento attivo. Se cancelli, perdi lo status e non potrai recuperarlo.

Cosa succede dopo i primi 100?

Il programma Founding Members si chiude per sempre. Chi entra dopo pagherà €697/mese con commissione 10% e non avrà accesso ai vantaggi esclusivi.

C'è un contratto minimo?

No, nessun lock-in. Puoi cancellare quando vuoi. Ma attenzione: una volta cancellato, perdi lo status Founding Member permanentemente e dovrai pagare le tariffe standard per rientrare.

Quando parte la piattaforma?

Lancio ufficiale: 5 Maggio 2026. I Founding Members riceveranno accesso anticipato dal 1° Aprile 2026 per testare e dare feedback.

Non Aspettare

Ogni giorno perso è un posto in meno disponibile.
Solo 94 posti rimasti.

Richiedi il Tuo Posto Ora
`) }) // Pagina Dettaglio Lotteria (dinamica) app.get('/lottery/:slug', async (c) => { const { DB } = c.env const slug = c.req.param('slug') try { // Fetch lottery data const lottery = await DB.prepare(` SELECT l.*, o.name as ong_name, o.legal_name as ong_legal_name, o.logo_url as ong_logo_url, o.category as ong_category, o.city as ong_city, o.province as ong_province, o.region as ong_region, o.website as ong_website, o.email as ong_email, o.phone as ong_phone FROM lotteries l JOIN ongs o ON l.ong_id = o.id WHERE l.slug = ? AND l.is_public = 1 `).bind(slug).first() as any if (!lottery) { return c.html(` Lotteria Non Trovata - TechHearts

404

Lotteria non trovata

← Torna alla Home
`) } // Update views count await DB.prepare(`UPDATE lotteries SET views_count = views_count + 1 WHERE id = ?`).bind(lottery.id).run() // Calculate stats const soldPercentage = Math.round((lottery.tickets_sold / lottery.max_tickets) * 100) const available = lottery.max_tickets - lottery.tickets_sold const totalRaised = lottery.tickets_sold * lottery.ticket_price // Calculate days to draw const drawDate = new Date(lottery.draw_date + 'T' + lottery.draw_time) const now = new Date() const daysToGo = Math.ceil((drawDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)) return c.html(` ${lottery.title} - ${lottery.ong_name}
${lottery.ong_logo_url ? `${lottery.ong_name}` : '
'}
${lottery.ong_category}
${lottery.ong_name}

${lottery.title}

${lottery.description}

€${lottery.ticket_price}
Prezzo Biglietto
${available}
Disponibili
${daysToGo}
Giorni al Sorteggio
Vendite ${soldPercentage}%
${lottery.tickets_sold} venduti su ${lottery.max_tickets} totali
€${totalRaised.toLocaleString()}
Raccolti finora
Mancano al Sorteggio
00
Giorni
00
Ore
00
Min
00
Sec
Sorteggio: ${new Date(lottery.draw_date).toLocaleDateString('it-IT', {weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'})} ore ${lottery.draw_time}

Premi in Palio

Valore totale: €${lottery.total_prize_value.toLocaleString()}

🥇 1° PREMIO
${lottery.prize_1_image_url ? `${lottery.prize_1_description}` : '
'}

${lottery.prize_1_description}

€${lottery.prize_1_value.toLocaleString()}
${lottery.prize_2_description ? `
🥈 2° PREMIO
${lottery.prize_2_image_url ? `${lottery.prize_2_description}` : '
'}

${lottery.prize_2_description}

€${lottery.prize_2_value?.toLocaleString()}
` : ''} ${lottery.prize_3_description ? `
🥉 3° PREMIO
${lottery.prize_3_image_url ? `${lottery.prize_3_description}` : '
'}

${lottery.prize_3_description}

€${lottery.prize_3_value?.toLocaleString()}
` : ''}

A Cosa Servono i Fondi

${lottery.project_description}

Obiettivo Raccolta
€${(lottery.max_tickets * lottery.ticket_price).toLocaleString()}
Proventi per ${lottery.ong_name}
~€${Math.round((lottery.max_tickets * lottery.ticket_price) * (1 - lottery.platform_commission_rate/100)).toLocaleString()}
(dopo commissione ${lottery.platform_commission_rate}%)

Scegli i Tuoi Numeri Fortunati

Clicca sui numeri per selezionarli. ${available} biglietti ancora disponibili!

Chi Organizza

${lottery.ong_logo_url ? `${lottery.ong_name}` : '
'}
${lottery.ong_category}

${lottery.ong_name}

${lottery.ong_legal_name}
${lottery.ong_city}, ${lottery.ong_province} (${lottery.ong_region})
${lottery.ong_email ? `
${lottery.ong_email}
` : ''} ${lottery.ong_phone ? `
${lottery.ong_phone}
` : ''} ${lottery.ong_website ? `` : ''}

Domande Frequenti

Come funziona l'acquisto?

Selezioni i tuoi numeri, procedi al checkout, paghi con carta/bonifico. Riceverai i biglietti via email e WhatsApp.

Quando avviene il sorteggio?

Il sorteggio è previsto per il ${new Date(lottery.draw_date).toLocaleDateString('it-IT')} alle ore ${lottery.draw_time}. Sarà video-registrato e pubblicato su YouTube.

Come viene scelto il vincitore?

Usiamo il sistema Bitcoin blockchain: l'hash del blocco più recente genera un numero random provabilmente equo. 100% trasparente e verificabile.

Se vinco, come ricevo il premio?

Ti contatteremo entro 24h via email e telefono. Coordineremo la consegna del premio secondo le tue preferenze.

`) } catch (error: any) { return c.html(` Errore - TechHearts

Errore

${error.message}

← Torna alla Home
`) } }) // Login Page app.get('/login', (c) => { return c.html(` Accedi - TechHearts Lottery Benefica
TechHearts

Accedi al tuo account

Gestisci le tue lotterie benefiche

Non hai un account? Registrati

Torna alla home
`) }) // Register Page app.get('/register', (c) => { return c.html(` Registrati - TechHearts Lottery Benefica
TechHearts

Crea il tuo account

Inizia subito con 14 giorni gratis

Minimo 8 caratteri

Consensi GDPR:

Hai già un account? Accedi

Torna alla home
`) }) // Pagina Piani e Prezzi app.get('/piani', (c) => { return c.html(` Piani e Prezzi - TechHearts Lottery Benefica

Scegli il Piano Giusto
per la Tua Organizzazione

Più raccogli, meno paghi. Tutti i piani includono 14 giorni gratis.

Caratteristica
STARTER
€197/mese
+ 15%
PIÙ POPOLARE
PRO
€347/mese
+ 13%
ENTERPRISE
€697/mese
+ 10%
Funzionalità Base
Lotterie attive13Illimitate
Utenti team13Illimitati
Commissione variabile15%13%10%
Compliance & Legale
Compliance automatica DPR 430/2001
Generazione documenti Questura
GDPR compliance tools
Sorteggio & Trasparenza
Sorteggio Bitcoin blockchain
Video recording sorteggio
Pubblicazione YouTube automatica
Pagamenti & Finanziari
Stripe Connect integrato
Bonifici automatici ONG
Fatturazione elettronica
Comunicazione & Notifiche
WhatsApp dedicato
Email transazionali
Campagne email marketing-
Analytics & Report
Dashboard base
Report impatto progetti-
Export dati (CSV, Excel)-
API access--
Supporto
Supporto email (24h)
Supporto prioritario (4h)-
Account manager dedicato--
Onboarding dedicato--
Custom branding--
Prova Gratis Prova Gratis Contattaci

Calcola il Tuo ROI

Scopri quanto puoi risparmiare con TechHearts

€15.000
ESCLUSIVO

Sei un Lions o Rotary Club?

I primi 100 ottengono 8.5% commissione a vita

Scopri Founding Members →

Domande Frequenti sui Piani

Posso cambiare piano in qualsiasi momento?

Sì! Puoi fare upgrade o downgrade in qualsiasi momento. Le modifiche entrano in vigore immediatamente e il costo viene proporzionato.

Cosa succede se supero il limite di lotterie?

Riceverai una notifica per fare upgrade al piano successivo. Non ci sono extra charges - semplicemente non potrai creare nuove lotterie fino all'upgrade.

Le commissioni sono fisse per sempre?

Per i piani standard: no, potrebbero variare (con preavviso di 60 giorni). Per i Founding Members: SÌ, l'8.5% è garantito a vita!

`) }) // Dashboard ONG - Overview app.get('/dashboard', async (c) => { // Fetch stats from API const statsResponse = await fetch(`http://localhost:3000/api/dashboard/stats`) const statsData = await statsResponse.json() if (!statsData.success) { return c.redirect('/login') } const { ong, stats, active_lotteries, recent_transactions } = statsData.data return c.html(` Dashboard - ${ong.name} | TechHearts

Dashboard

Benvenuto, ${ong.name}

Entrate Totali
€${(stats.total_revenue || 0).toLocaleString()}
Netto: €${(stats.net_revenue || 0).toLocaleString()}
Lotterie Attive
${stats.active_lotteries}
${stats.total_lotteries} totali
Biglietti Venduti
${stats.total_tickets_sold}
Tutte le lotterie
Lotterie Completate
${stats.completed_lotteries}
Sorteggi conclusi

Lotterie Attive

Vedi Tutte
${active_lotteries.length === 0 ? `

Nessuna lotteria attiva

` : `
${active_lotteries.map((lottery: any) => `

${lottery.title}

${lottery.tickets_sold}/${lottery.max_tickets} €${lottery.total_raised} Sorteggio: ${new Date(lottery.draw_date).toLocaleDateString('it-IT')}
${Math.round((lottery.tickets_sold / lottery.max_tickets) * 100)}% Vedi
`).join('')}
`}

Transazioni Recenti

Vedi Tutte
${recent_transactions.length === 0 ? ` ` : recent_transactions.map((tx: any) => ` `).join('')}
Data Lotteria Importo Stato
Nessuna transazione
${new Date(tx.created_at).toLocaleString('it-IT')} ${tx.lottery_title} €${tx.amount} ${tx.status}
`) }) // Dynamic Lottery Detail Page /lottery/:slug app.get('/lottery/:slug', async (c) => { const slug = c.req.param('slug') // Fetch lottery data from API const lottery = await c.env.DB.prepare(` SELECT l.*, o.name as ong_name, o.logo_url as ong_logo, o.category as ong_category, o.description as ong_description, o.city as ong_city, o.province as ong_province FROM lotteries l LEFT JOIN ongs o ON l.ong_id = o.id WHERE l.slug = ? LIMIT 1 `).bind(slug).first() if (!lottery) { return c.html(` Lotteria Non Trovata - TechHearts

404 - Lotteria Non Trovata

La lotteria che cerchi non esiste

← Torna alla Home
`) } // Calculate stats const available = lottery.max_tickets - lottery.tickets_sold const percentageSold = Math.round((lottery.tickets_sold / lottery.max_tickets) * 100) const now = new Date() const drawDate = new Date(lottery.draw_date) const saleEndDate = new Date(lottery.sale_end_date) const daysUntilDraw = Math.ceil((drawDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)) const salesOpen = now < saleEndDate && lottery.status === 'active' return c.html(` ${lottery.title} - ${lottery.ong_name} | TechHearts Lottery
${lottery.ong_logo ? `${lottery.ong_name}` : ''}
${lottery.ong_name}
${lottery.ong_city}, ${lottery.ong_province} • ${lottery.ong_category}

${lottery.title}

${lottery.description}

${lottery.tickets_sold}
Biglietti Venduti
${available}
Ancora Disponibili
€${lottery.ticket_price}
Prezzo Biglietto
Vendite ${percentageSold}% venduto
${salesOpen ? `
Vendite Aperte
` : `
Vendite Chiuse
`}
MANCANO
${daysUntilDraw} giorni
al sorteggio
${new Date(lottery.draw_date).toLocaleDateString('it-IT', { day: 'numeric', month: 'long', year: 'numeric' })} alle ${lottery.draw_time}

Premi in Palio

${lottery.prize_1_description ? `
🥇 1° Premio €${lottery.prize_1_value}
${lottery.prize_1_description}
` : ''} ${lottery.prize_2_description ? `
🥈 2° Premio €${lottery.prize_2_value}
${lottery.prize_2_description}
` : ''} ${lottery.prize_3_description ? `
🥉 3° Premio €${lottery.prize_3_value}
${lottery.prize_3_description}
` : ''}
Montepremi Totale
€${lottery.total_prize_value?.toLocaleString() || 0}
${salesOpen ? `

Seleziona i Tuoi Biglietti

Disponibile Venduto Selezionato
0 biglietti selezionati • Totale: €0
` : ''}

A Cosa Servono i Fondi

${lottery.project_description || lottery.description}

${lottery.ong_description ? `

Chi Siamo

${lottery.ong_description}

` : ''}

Informazioni Legali

Autorizzazione Questura
${lottery.questura_city} (${lottery.questura_province})
${lottery.authorization_status === 'approved' ? ' Approvata' : ' In attesa' }
Tipo Lotteria
${lottery.type}
Conforme DPR 430/2001
Sorteggio Trasparente
Blockchain Bitcoin
100% Verificabile
Pagamenti Sicuri
Stripe Payment Gateway
PCI-DSS Compliant
`) }) // Dashboard Page app.get('/dashboard', async (c) => { // Check authentication const sessionToken = c.req.header('Cookie')?.split('session_token=')[1]?.split(';')[0]; if (!sessionToken) { return c.redirect('/login'); } return c.html(` Dashboard - TechHearts Lottery Benefica

Dashboard

Avatar
Caricamento...
...

Benvenuto su TechHearts! 👋

Ecco un riepilogo delle tue attività recenti

0%
€0
Totale Raccolto
Ultimi 30 giorni: €0
0
Lotterie Attive
Totale: 0
0
Biglietti Venduti
0
Sorteggi Prossimi
Autorizzazioni pendenti: 0

Entrate Mensili

Il Tuo Piano

Starter
Stato: Trial
Commissione
15%
Lotterie Attive 0 / 1

Le Mie Lotterie

Vedi Tutte
`) }) // Pagina Lista Lotterie app.get('/dashboard/lotteries', async (c) => { const sessionToken = c.req.header('Cookie')?.split('session_token=')[1]?.split(';')[0]; if (!sessionToken) return c.redirect('/login'); return c.html(` Le Mie Lotterie - TechHearts

Le Mie Lotterie

Gestisci tutte le tue lotterie benefiche

Totale Lotterie

0

Attive

0

Bozze

0

Concluse

0

`) }) // Pagina Dettaglio Lotteria app.get('/dashboard/lotteries/:id', async (c) => { const sessionToken = c.req.header('Cookie')?.split('session_token=')[1]?.split(';')[0]; if (!sessionToken) return c.redirect('/login'); const lotteryId = c.req.param('id'); return c.html(` Dettaglio Lotteria - TechHearts
Torna alla Lista

Caricamento...

Biglietti Venduti

0

0 totali

Entrate Totali

€0

Commissione: €0

Netto ONG

€0

Tasso: 0%

Giorni Rimanenti

-

al sorteggio

Informazioni Lotteria

-

-

-

-

Premi

Valore Totale Premi €0

Configurazione Biglietti

€0

0

Illimitato

Illimitato

Andamento Vendite

Ultimi Acquirenti (Top 10)

Utente Email Biglietti Totale Data
Nessun acquisto ancora

Timeline

Inizio Vendita

-

Fine Vendita

-

Sorteggio

-

-

Autorizzazione Questura

-

-

-

Metodo Sorteggio

-

-

-

Condividi

Metadata

ID -
Creata da -
Data Creazione -
Ultima Modifica -
`) }) // RUNTS & Prodotti Dashboard app.get('/dashboard/runts', async (c) => { const sessionToken = c.req.header('Cookie')?.split('session_token=')[1]?.split(';')[0]; if (!sessionToken) return c.redirect('/login'); return c.html(` RUNTS & Prodotti - TechHearts

RUNTS & Prodotti

Iscrizione RUNTS

Caricamento dati RUNTS...

`) }) // Wizard Creazione Lotteria app.get('/dashboard/create', async (c) => { const sessionToken = c.req.header('Cookie')?.split('session_token=')[1]?.split(';')[0]; if (!sessionToken) return c.redirect('/login'); return c.html(` Nuova Lotteria - TechHearts
Torna alla Dashboard

Crea Nuova Lotteria

Segui i 5 passi per creare la tua lotteria benefica

1
2
3
4
5

Step 1: Informazioni Base

Il tipo determina il valore massimo dei premi secondo DPR 430/2001

Obbligatorio per trasparenza verso i partecipanti

`) }) // ============================================ // DASHBOARD PRODUCTS PAGE // ============================================ app.get('/dashboard/products', async (c) => { const { DB } = c.env // TODO: Get ONG from session const ongId = 'test-ong-1' // Get products const products = await DB.prepare(` SELECT * FROM products WHERE ong_id = ? ORDER BY created_at DESC `).bind(ongId).all() // Get stats const stats = await DB.prepare(` SELECT COUNT(*) as total_products, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as active_products, SUM(total_sold) as total_sales, SUM(total_revenue) as total_revenue FROM products WHERE ong_id = ? `).bind(ongId).first() return c.html(` Prodotti - Dashboard ONG | TechHearts

Gestione Prodotti

Gestisci il catalogo e-commerce della tua organizzazione

Totale

${stats?.total_products || 0}

Prodotti Totali

Attivi

${stats?.active_products || 0}

Prodotti Attivi

Vendite

${stats?.total_sales || 0}

Unità Vendute

Revenue

€${(stats?.total_revenue || 0).toLocaleString('it-IT', {minimumFractionDigits: 2})}

Ricavi Totali

${products.results.map((product: any) => ` `).join('')} ${products.results.length === 0 ? ` ` : ''}
Prodotto Categoria Prezzo Stock Vendite Status Azioni
${product.image_url ? ` ${product.name} ` : `
`}

${product.name}

${product.sku || 'N/A'}

${product.category}

€${product.price.toLocaleString('it-IT', {minimumFractionDigits: 2})}

+IVA ${product.tax_rate}%

${product.track_inventory ? `
${product.stock_quantity}
` : ` N/A `}

${product.total_sold || 0}

€${(product.total_revenue || 0).toLocaleString('it-IT', {minimumFractionDigits: 2})}

${product.status === 'active' ? 'Attivo' : ''} ${product.status === 'draft' ? 'Bozza' : ''} ${product.status === 'archived' ? 'Archiviato' : ''} ${product.status === 'out_of_stock' ? 'Esaurito' : ''}

Nessun prodotto trovato

`) }) // ============================================ // ============================================ // DASHBOARD ORDERS PAGE // ============================================ app.get('/dashboard/orders', async (c) => { const { DB } = c.env // TODO: Get ONG from session const ongId = 'test-ong-1' // Get orders with stats const orders = await DB.prepare(` SELECT po.*, (SELECT name FROM ongs WHERE id = po.ong_id) as ong_name FROM product_orders po WHERE po.ong_id = ? ORDER BY po.created_at DESC `).bind(ongId).all() // Get stats const stats = await DB.prepare(` SELECT COUNT(*) as total_orders, SUM(CASE WHEN payment_status = 'paid' THEN 1 ELSE 0 END) as paid_orders, SUM(CASE WHEN shipping_status = 'pending' THEN 1 ELSE 0 END) as pending_shipments, SUM(CASE WHEN payment_status = 'paid' THEN total ELSE 0 END) as total_revenue FROM product_orders WHERE ong_id = ? `).bind(ongId).first() return c.html(` Ordini - Dashboard ONG | TechHearts

Gestione Ordini

Monitora e gestisci tutti gli ordini e-commerce

Totale

${stats?.total_orders || 0}

Ordini Totali

Pagati

${stats?.paid_orders || 0}

Ordini Pagati

Da Spedire

${stats?.pending_shipments || 0}

In Attesa

Revenue

€${(stats?.total_revenue || 0).toLocaleString('it-IT', {minimumFractionDigits: 2})}

Entrate Totali

${orders.results.map((order: any) => { const items = JSON.parse(order.items) const itemsCount = items.length const createdDate = new Date(order.created_at).toLocaleDateString('it-IT', { day: '2-digit', month: 'short', year: 'numeric' }) return ` `}).join('')} ${orders.results.length === 0 ? ` ` : ''}
Ordine Cliente Prodotti Totale Pagamento Spedizione Azioni

${order.order_number}

${createdDate}

${order.customer_name}

${order.customer_email}

${order.customer_phone ? `

${order.customer_phone}

` : ''}
${itemsCount} ${itemsCount === 1 ? 'prodotto' : 'prodotti'}

€${order.total.toLocaleString('it-IT', {minimumFractionDigits: 2})}

Sub: €${order.subtotal.toLocaleString('it-IT', {minimumFractionDigits: 2})}

${order.payment_status === 'paid' ? 'Pagato' : ''} ${order.payment_status === 'pending' ? 'In Attesa' : ''} ${order.payment_status === 'failed' ? 'Fallito' : ''} ${order.payment_status === 'refunded' ? 'Rimborsato' : ''} ${order.shipping_status === 'pending' ? 'In Attesa' : ''} ${order.shipping_status === 'processing' ? 'Lavorazione' : ''} ${order.shipping_status === 'shipped' ? 'Spedito' : ''} ${order.shipping_status === 'delivered' ? 'Consegnato' : ''} ${order.shipping_status === 'cancelled' ? 'Annullato' : ''}

Nessun ordine trovato

Gli ordini appariranno qui quando i clienti acquisteranno prodotti