Una semplice interfaccia grafica per poter creare preventivi velocemente e facilmente!
Il software eseguibile per Windows 11 è stato creato a partire da codice python il quale implementa l'interfaccia grafica attraverso la libreria PyQt.
- Possibilità di configurare i campi in maniera veloce e semplice attraverso un wizard:
- Società emittente (Logo o nome, o logo e nome), compresi tutti i dati di intestazione:
- indirizzo completo
- telefono
- partita iva
- Cliente destinatario:
- indirizzo completo
- telefono
- partita iva (eventuale)
- Termini e condizioni
- Corrispettivo IVA
- Nome utente che ha preparato il documento
- Società emittente (Logo o nome, o logo e nome), compresi tutti i dati di intestazione:
- Aggiunta dinamica delle righe nella tabella dei prodotti tramite comodo pulsante "Aggiungi Prodotto"
- Calcolo automatico di iva per riga di prodotto, sulla base del prezzo unitario
- Calcolo automatico del valore netto per ogni riga di prodotto, sulla base del prezzo unitario per la quantità meno lo sconto
- Calcolo automatico di percentuali di "totale netto", "totale iva" e "totale ivato" (totale ivato = netto + iva)
- Pulsante per eventuale aggiunta di note sotto la tabella dei prodotti, sopra il box "Termini e Condizioni", prelevati dalla configurazione
- Possibilità di visualizzare anteprima del pdf prima di completare la compilazione
- Possibilità di Salvare e Caricare un preventivo
- Path dell'output selezionabile
- Possibilità di creazione di diverse configurazioni, successivamente selezionabile
- Sistema di avvisi per domandare se si vuole salvare il preventivo, qualora fosse stato modificato, prima di chiudere l'applicazione
Ogni prodotto aggiunto al preventivo deve corrispondere a una nuova riga della tabella contente le seguenti colonne:
- "Codice art.", usare come default il numero della riga partendo da 1 ( stringa )
- "Descrizione", ( stringa )
- "Disponibile", default "Sì", in alternativa deve essere selezionabile "Ordinabile", tuttavia il tipo di valore sottostante è di tipo booleano ( bool )
- "Qnt.", indica la quantità, default 1 ( intero )
- "U.M.", indica l'unità di misura del singolo prodotto, default "PZ", possibili scelte sono (PZ, KG, MT, CM, MM, CF, RS, CT, ES)
- "Prezzo Unt.", indica il prezzo unitario del prodotto, ( float )
- "Sconto", indica lo sconto percentuale ( float )
- "Valore", indica il valore netto sulla base del prezzo unitario per la quantità meno lo sconto, ( float ) I campi "Prezzo Unt." e "Valore" devono essere rappresentati con il simbolo della valuta dell'euro ( € )
I preventivi possono essere conservati in un database Sqlite3.
Per creare il file eseguibile per Windows, è stato utilizzato PyInstaller, uno strumento che consente di impacchettare applicazioni Python in un singolo file eseguibile. Il processo di creazione dell'eseguibile è gestito dallo script build.py incluso nel progetto.
- Python 3.12 o superiore
- Tutte le dipendenze elencate in pyproject.toml
-
Assicurarsi che tutte le dipendenze siano installate:
pip install -e . -
Eseguire lo script di build:
python build.py -
Al termine del processo, l'eseguibile sarà disponibile nella cartella
distcon il nomePreventMaker.exe
L'eseguibile creato contiene tutte le dipendenze necessarie e può essere distribuito su qualsiasi sistema Windows 11 senza necessità di installare Python o altre librerie.
Il sistema di visualizzazione delle anteprime dei PDF è stato implementato utilizzando la libreria PyQt6-WebEngine, che fornisce un componente di visualizzazione web integrato nell'applicazione. Questo approccio offre diversi vantaggi:
- Quando l'utente richiede un'anteprima del preventivo, l'applicazione genera un file PDF temporaneo utilizzando la libreria ReportLab
- Il PDF viene quindi caricato in un componente QWebEngineView, che utilizza il motore di rendering di Chromium per visualizzare il documento
- L'utente può visualizzare il PDF completo all'interno dell'applicazione, senza necessità di aprire programmi esterni
- Visualizzazione integrata nell'applicazione
- Supporto nativo per lo zoom, la navigazione e altre funzionalità di visualizzazione PDF
- Rendering di alta qualità grazie al motore Chromium
- Esperienza utente fluida e coerente
La classe PDFPreviewDialog gestisce la visualizzazione dell'anteprima, creando una finestra di dialogo modale che contiene il visualizzatore PDF. Il componente QWebEngineView è configurato per abilitare il supporto ai plugin e il visualizzatore PDF integrato.
Questo sistema consente agli utenti di verificare l'aspetto finale del preventivo prima di salvarlo o esportarlo, garantendo che il documento rispetti le aspettative in termini di formattazione e contenuto.
- Solo caratteri esadecimali (0-9, a-f): 4 bit per carattere
- Caratteri alfanumerici (0-9, a-z, A-Z): ~5,95 bit per carattere
- Base64 (0-9, a-z, A-Z, + e /): 6 bit esatti per carattere alla luce di questa considerazione il sistema più sicuro è rappresentato codici Base64
- Utilizza Base64 - Che fornisce un alfabeto di 64 caratteri (A-Z, a-z, 0-9, + e /), permettendo di codificare 6 bit di informazione per carattere.
- Rimozione dei caratteri speciali - Sostituisce i caratteri non alfanumerici di Base64 (+ e /) con caratteri alfanumerici per garantire che il codice contenga solo lettere e numeri.
- Controllo dei duplicati - Include un meccanismo opzionale per verificare ed evitare duplicati aggiungendo un "salt" incrementale.
- Entropia elevata - Usa SHA-256 prima della codifica Base64 per garantire una distribuzione uniforme anche con input simili.
Se prendiamo un hash con output di n bit e lo tronchiamo a k bit, la probabilità di collisione dopo aver generato m hash diversi è approssimativamente:
P(collisione) ≈ 1 - e^(-m²/2^(k+1))
Vediamo alcuni esempi pratici con hash alfanumerici (consideriamo 6 bit per carattere alfanumerico):
- Con 1.000 codici: probabilità di collisione ≈ 0,000004%
- Con 100.000 codici: probabilità di collisione ≈ 0,04%
- Con 1.000.000 codici: probabilità di collisione ≈ 3,9%
- Con 1.000 codici: probabilità di collisione ≈ 0,001%
- Con 100.000 codici: probabilità di collisione ≈ 10%
- Con 1.000.000 codici: probabilità di collisione ≈ 63%
- Con 1.000 codici: probabilità di collisione ≈ 3%
- Con 10.000 codici: probabilità di collisione ≈ 27%
- Con 100.000 codici: probabilità di collisione ≈ 95%