Aplicație desktop pentru gestionarea Casei de Ajutor Reciproc Petroșani, dezvoltată în Python cu PyQt5, cu suport complet pentru conversie RON→EUR și sistem dual currency cu protecție avansată a datelor.
- 🔐 Criptare AES-256 REALĂ: Migrare de la
zipfilestandard lapyzipperpentru criptare profesională - Prevenire WinError 32: Funcție nouă
_force_close_database_connections()pentru cleanup conexiuni SQLite - UX îmbunătățit: Dialoguri cu butoane clare în română ("Da, închide", "Nu, rămân", "Arhivează (recomandat)")
- Cleanup complet la închidere: Metodă nouă
_cleanup_before_close()înmain_ui.py - Build actualizat:
CARpetrosani.specinclude acumpyzipperșiCryptodomepentru criptare
- BUG #1: Precizie financiară 100% - Eliminare completă erori de rotunjire în
generare_luna.py:859-861șidividende.py:808 - BUG #2: Protecție transfer dividende - Validare critică existență Ianuarie obligatorie în
dividende.py:707-730 - BUG #3, #4, #5, #6: Critical bug fixes în multiple module (generare_luna, dividende, sume_lunare, stergere_membru)
- Fix validare: Corectare validare număr fișă 0 în
stergere_membru.py - Eliminare BENEFICIU: Înlocuire referințe la câmpul inexistent BENEFICIU cu DIVIDEND conform schemei oficiale
- Migrare openpyxl → xlsxwriter: Eliminare vulnerabilități CVE-2023-43810 (XXE) și CVE-2024-47204 (ReDoS)
- 🔐 Sistem Securitate Baze de Date (Ianuarie 2025-2026): Protecție completă cu criptare AES-256 REALĂ
- Arhivare automată cu parolă la închidere aplicație
- Dezarhivare cu autentificare la pornire (3 încercări)
- Cleanup automat baze de date expuse din crash-uri
- Protecție race condition - previne corupere date
- NOU: Prevenire WinError 32 (file locked) pe Windows
- Module:
security_manager.py,dialog_styles.py
- Exception handling: Înlocuire bare except clauses cu specific exception handling
- GitHub Actions: Implementare workflows CodeQL Analysis și Microsoft Defender
- Monkey patching: Corectare 3 buguri critice în sistemul de patching dual currency
- Suite teste complete: Adăugare
test_conversie_widget.py,test_dividende.py,test_generare_luna.py,test_sume_lunare.py - pytest.ini: Configurare cu suport coverage, markers și verbose output
- requirements-dev.txt: Dependențe dezvoltare separate (pytest, pytest-cov, pytest-qt)
- BUGURI_IDENTIFICATE.md: Raport exhaustiv cu 9 buguri categorizate (critice/majore/minore)
- Claude.md: Documentație contribuții AI și proces dezvoltare
- README_TESTS.md: Ghid complet pentru rulare și scriere teste
- generare_luna.py: Eliminare auto-generare dividende în ianuarie, restaurare logging CAZ 1 și CAZ 2
- dividende.py: Implementare paritate cu TypeScript, validare comprehensivă, înlocuire BENEFICIU → DIVIDEND
- despre.py: Modernizare completă cu ghid utilizare profesional
- CARpetrosani.spec: Actualizare eliminare dependențe învechite
- Rezolvare conflicte Git: Fix merge conflicts în
generare_luna.py - .gitignore: Actualizare pentru excludere baze de date și fișiere temporare Python
- Logging optimizat: Îmbunătățiri în logging împrumuturi active și moștenire rate
- Monkey Patching Condițional: Comutare dinamică între bazele de date RON și EUR la runtime
- Protecție Scriere Avansată: Modul RON devine read-only după aplicarea conversiei
- Toggle Valutar: Comutare rapidă între RON și EUR direct din interfață
- Indicatori Vizuali: Afișare clară a monedei active și permisiunilor (Citire-Scriere / Doar Citire)
- Fișier Configurare:
dual_currency.jsonpentru persistența statusului conversiei
- Conformitate CE: Conversie conform Regulamentului CE 1103/97
- Conversie Directă Individuală: Fiecare înregistrare este convertită separat
- Precizie Decimal: Calcule financiare exacte pentru conformitate UE
- Curs Fix Configurabil: Curs implicit 4.9755 RON/EUR (modificabil)
- Clone Perfecte: Creează baze de date EUR ca clone ale bazelor RON
- Statistici Conversie: Raportare detaliată cu totaluri și diferențe de rotunjire
- Teme Clasice Glass
- Teme Profesionale
- Teme Optimizate
- Persistență: Tema selectată este salvată automat în
car_settings.json - Preview Real-Time: Vizualizare instantanee a temelor înainte de aplicare
- Efecte Moderne: Gradient glass, shadow effects, animații fluide
Protecție completă a datelor sensibile prin criptare AES-256 REALĂ cu parolă folosind biblioteca pyzipper.
Protecție Automată la Pornire/Închidere:
- ✅ Criptare AES-256 reală - folosește
pyzipperpentru criptare profesională (nu doar ZIP cu parolă) - ✅ Arhivare cu parolă la închiderea aplicației - toate bazele de date sunt criptate automat în
MEMBRII.zip - ✅ Dezarhivare cu autentificare la pornire - solicită parolă pentru acces la date (3 încercări)
- ✅ Ștergere automată - bazele de date sunt eliminate de pe disc după arhivare pentru securitate maximă
- ✅ Cleanup inteligent - detectează și curăță baze de date expuse din crash-uri anterioare
Dialog Personalizat de Autentificare:
- 🔑 Câmp parolă cu opțiune "Arată parola" pentru verificare
- 🔄 Sistem de retry cu 3 încercări pentru parolă incorectă
- ⏱️ Progress dialog pentru operații de arhivare/dezarhivare
- 📊 Mesaje clare și detaliate pentru utilizator
- 🇷🇴 Butoane în română - "Da, închide", "Nu, rămân", "Arhivează (recomandat)", etc.
Protecție Avansată:
- 🛡️ Protecție race condition - previne închiderea aplicației în timpul operațiilor de arhivare
- 🔒 Prevenire WinError 32 - cleanup complet conexiuni SQLite înainte de arhivare
- 🔍 Validare integritate - verificare automată integritate arhivă ZIP la pornire
⚠️ Gestionare erori - mesaje user-friendly pentru toate scenariile excepționale- 💾 Suport dual currency - protejează atât MEMBRII.db cât și MEMBRIIEUR.db
Scenarii Suportate:
- Prima configurare: Creează arhiva cu parolă automată dacă DB-uri există dar arhiva lipsește
- Operare normală: Dezarhivare → Lucru cu date → Arhivare automată la închidere
- Recuperare crash: Detectează date expuse și oferă opțiune de arhivare înainte de ștergere
- Schimbare parolă: Permite setarea unei parole noi la fiecare arhivare
-
security_manager.py(~950 linii) - Modul principal de securitate:cleanup_exposed_database()- Curățare baze de date expuseextract_database_with_password()- Dezarhivare cu autentificare (3 încercări)archive_database_with_password()- Arhivare cu criptare AES-256_force_close_database_connections()- NOU: Închidere forțată conexiuni SQLite pentru prevenire WinError 32CustomPasswordDialog- Dialog personalizat PyQt5 pentru parolăget_security_status()- Debugging și monitoring securitate
-
dialog_styles.py- Stiluri moderne pentru dialogurile de securitate -
Integrare în
main.py(linii 95-102) - Verificări obligatorii la pornire -
Integrare în
main_ui.py- Arhivare obligatorie la închidere cu cleanup complet:_cleanup_before_close()- NOU: Cleanup conexiuni și ferestre înainte de arhivare- Dialog de confirmare cu butoane clare în română
La pornirea aplicației:
1. cleanup_exposed_database() → Curățare DB expuse din crash-uri
2. extract_database_with_password() → Dialog parolă → Dezarhivare MEMBRII.zip
3. Aplicație pornește cu DB active pe disc
La închiderea aplicației:
1. Dialog confirmare "Sigur închideți?"
2. archive_database_with_password() → Dialog parolă → Arhivare în MEMBRII.zip
3. Ștergere automată DB de pe disc
4. Aplicație se închide cu date protejate
- ✅ Criptare profesională - folosește
pyzipperpentru criptare AES-256 reală - ✅ Compatibil Windows/macOS - testare completă pe ambele platforme
- ✅ Build PyInstaller - include module în
CARpetrosani.spec(pyzipper, Cryptodome) - ✅ Backward compatible - nu afectează funcționalitatea existentă
- ✅ Prevenire WinError 32 - cleanup automat conexiuni SQLite înainte de arhivare
BUG #1: Precizie Financiară 100% - Eliminare Erori Rotunjire
- Problemă Identificată: Conversie Decimal→Float în operații de bază de date cauzând erori microscopice de rotunjire
- Impact Potențial: Acumulare diferențe 1-5 lei anual pentru 800 membri × 12 luni
- Soluție Implementată:
generare_luna.py:859-861- INSERT folosește acumstr(decimal)pentru toate cele 7 coloane financiaredividende.py:808- UPDATE transfer dividende foloseștestr(decimal)pentru precizie exactă- Pattern consistent: Scriere
str(decimal)↔ CitireDecimal(str(value))
- Rezultat: Zero erori de rotunjire, precizie financiară perfectă în toate calculele
BUG #2: Protecție Transfer Dividende - Validare Critică Ianuarie
- Problemă Identificată: Transfer dividende fără validare existență lună Ianuarie, risc corupere date
- Impact Potențial: Eșec silențios sau date corupte la transfer dividende anual
- Soluție Implementată:
dividende.py:707-730- Validare obligatorie la începutul funcției_transfera_dividend()- Verificare existență Ianuarie cu mesaj explicit pentru utilizator
- Protecție dublă: validare buton + validare funcție cu QMessageBox.critical
- Rezultat: Imposibilitate transfer fără Ianuarie generat, mesaje clare cu instrucțiuni specifice
- Analiză Exhaustivă: 26 module, ~15,000 linii cod verificate
- Raport Buguri:
BUGURI_IDENTIFICATE.mdcu 9 buguri categorizate (critice/majore/minore) - Testare Efecte Adverse: Verificare completă compatibilitate schema SQLite și pattern-uri existente
- Documentație Actualizată: README sincronizat 100% cu funcționalitatea reală a codului
Migrare openpyxl → xlsxwriter pentru Securitate Îmbunătățită
- Problemă Identificată: Biblioteca openpyxl avea 2 vulnerabilități critice:
- CVE-2023-43810 (XXE - XML External Entity Injection)
- CVE-2024-47204 (ReDoS - Regular Expression Denial of Service)
- Detectări false positive frecvente de la antiviruși
- Soluție Implementată:
- Migrare completă la xlsxwriter (bibliotecă write-only, zero vulnerabilități cunoscute)
- 4 module actualizate:
vizualizare_lunara.py,vizualizare_trimestriala.py,vizualizare_anuala.py,dividende.py - Toate formatările Excel păstrate IDENTIC (fonturi, culori, alignments, borders, freeze panes)
- Performanță îmbunătățită la scriere Excel
- Rezultat: Export Excel 100% securizat, fără compromisuri vizuale sau funcționale
- Adăugare Membru: Înregistrare membri noi cu validare completă
- Lichidare Membru: Procesare lichidare cu calcul solduri finale
- Ștergere Membru: Ștergere cu verificări de integritate
- Verificare Fișe: Validare consistență date membri
- Sume Lunare: Introducere plăți lunare cu calculator automatizat pentru dobândă integrat
- Rezumat amănunțit al modulului sume_lunare
- Scop general
Modulul sume_lunare gestionează toate operațiile lunare din aplicația CAR:
vizualizarea și editarea tranzacțiilor din tabela DEPCRED
recalcularea soldurilor lunare după modificări
calculul dobânzii la stingerea împrumuturilor
actualizarea cotizației standard
propagarea modificărilor în lunile ulterioare.
Totul rulează în interfață PyQt5, cu fire separate pentru recalculare.
- Structură logică
a. Clase și funcții principale
SumeLunareWidget — componenta principală a UI-ului lunar.
Gestionează fișele membrilor, modificările, recalculările, butoanele de comandă și etichetele de stare.
Apelează funcțiile interne _handle_aplica_dobanda, _declanseaza_recalculare_ulterioara, _on_recalculation_finished, _on_recalculation_error, _worker_recalculeaza_luni_ulterioare.
TranzactieDialog — dialog modern pentru modificarea tranzacțiilor.
Include validatori numerici, calcul estimativ al ratelor (prin număr de luni sau rată fixă).
Poate fi deschis automat din logica de aplicare a dobânzii.
get_config_path() / get_dobanda()
Localizează și citește fișierul config_dobanda.json.
Extrage valoarea loan_interest_rate_on_extinction (ex. 0.004 = 4‰).
Dacă lipsește fișierul, folosește valoarea implicită.
- Calculul soldurilor
Soldurile curente se bazează pe:
impr_sold_nou = impr_sold_vechi + impr_deb - impr_cred dep_sold_nou = dep_sold_vechi + dep_deb - dep_cred
Soldurile sunt ajustate la 0 dacă rezultatul este ≤ 0.005.
Orice modificare manuală într-o lună declanșează recalcularea automată a lunilor ulterioare (prin _declanseaza_recalculare_ulterioara → _worker_recalculeaza_luni_ulterioare).
Recalcularea iterează lună cu lună, preluând soldurile de deschidere din luna anterioară și rescrie valorile corecte în depcred.
- Calculul dobânzii
Dobânda este calculată în două contexte:
-
La stingerea automată a împrumutului – în timpul generării lunii (sincronizat cu generare_luna.py).
-
Manual, prin butonul “Aplică dobândă” – pentru achitare anticipată.
Algoritm principal (_calculeaza_dobanda_la_zi)
- Se determină perioada ultimului împrumut activ:
SELECT MAX(anul100+luna) FROM depcred WHERE nr_fisa=? AND impr_deb>0 AND (anul100+luna <= ?)
-
Se caută perioada de început (ultima lună cu sold zero înainte de acel împrumut).
-
Se adună toate soldurile lunare pozitive din perioada împrumutului:
SELECT SUM(impr_sold) FROM depcred WHERE nr_fisa=? AND (anul*100+luna BETWEEN ? AND ?) AND impr_sold > 0
- Dobânda este:
dobanda = SUM(impr_sold) * rata_dobanda
apoi rotunjită la 2 zecimale.
- Dobânda se adaugă în dialogul de tranzacție, dar se salvează doar dacă utilizatorul confirmă.
- Alte funcții relevante
_actualizeaza_cotizatie_standard() – modifică COTIZATIE_STANDARD în tabela membrii.
_on_recalculation_progress(), _on_recalculation_error() – actualizează UI în timp real.
Validatori – asigură introducerea valorilor numerice corecte pentru toate câmpurile.
-
Fluxul general al operațiilor
-
Utilizatorul selectează o fișă → se încarcă istoricul.
-
Modifică o lună → soldurile se recalculează și propagate automat.
-
Poate aplica manual dobânda → se deschide dialogul precompletat.
-
Se salvează tranzacția → se actualizează baza DEPCRED.
-
Recalcularea lunilor ulterioare pornește în fundal.
-
Interfața se reactivează după finalizare.
- Legătura cu generare_luna.py
sume_lunare operează la nivel de membru (individual), în timp ce generare_luna procesează toți membrii simultan.
Ambele folosesc aceleași formule pentru calculul soldurilor și dobânzii.
sume_lunare permite intervenții manuale și recalculări selective.
- Împrumuturi Noi: Instrument adiacent strict pentru Sume lunare. Permite vizualizarea, marcarea și copierea numelor membrilor la care trebuie stabilită Prima rată și lipirea numelui respectiv în căsuța de căutare din Sume lunare. De asemenea afișează lista velor vare au primit împrumut în luna sursă, ajutând utilizatorul să consemneze respectivul împrumut (Fereastră separată - F12)
- Dividende: Modul separat pentru calculul dividendelor anuale. Calculează dividende pe baza sumei soldurilor lunare ale membrilor activi din anul selectat. Permite transferul manual al dividendelor calculate în luna Ianuarie a anului următor prin actualizarea DEP_DEB și DEP_SOLD
- Calculator: Calculator integrat cu funcții avansate (Ctrl+Alt+C)
- Situație Lunară: Vizualizare detalii pentru o lună selectată
- Situație Trimestrială: Raportare date pe trimestru
- Situație Anuală: Sinteză anuală completă
- Statistici: Dashboard cu totaluri, situații financiare și de membrii chitanțe etc.
- Afișare Membri cu Date Incomplete: Identifică și afișează membri care lipsesc din luna anterioară ultimei luni procesate (necesari pentru generarea lunii noi). Include funcționalitate de ștergere definitivă a membrilor selectați
- Generare Chitanțe PDF: Creare automată chitanțe lunare pentru membri
- Configurare Tipărire: Număr chitanță inițial, chitanțe per pagină (5-15)
- Preview Chitanțe: Previzualizare date înainte de generare PDF
- Sistem Progres: Bare de progres pentru operații lungi cu protecție anti-înghețare
- Pagină Totaluri: PDF include pagină finală cu totaluri dobândă, împrumuturi, depuneri
- Listări RON: Modul specializat pentru generare chitanțe în RON
- Listări EUR: Modul specializat pentru generare chitanțe în EUR
- Actualizare Automată: CHITANTE.db actualizat cu numerele chitanțelor (STARTCH_PR, STARTCH_AC)
- Generare Lună Nouă: Proces automatizat cu calcul dobânzi la achitarea împrumuturilor și actualizare solduri, automatizarea completării datelor financiare preluate din luna sursă
- Rezumat amănunțit generare_luna.py:
Scop și context
Modul GUI PyQt5 pentru "Generare Lună Nouă" în aplicația CAR. Generează înregistrările lunare în DEPCRED.db, pe baza stării din luna anterioară, aplică cotizații, moștenește rate și calculează dobânda la stingerea împrumutului. Folosește MEMBRII.db și LICHIDATI.db ca surse și scrie în DEPCRED.db. Verifică existența fișierelor și afișează erori dacă lipsesc. NOTĂ: Dividendele se gestionează separat prin modulul Dividende.
Baze de date și fișiere
DB principale: MEMBRII.db, DEPCRED.db, LICHIDATI.db (+ opțional ACTIVI.db pentru dividende). La inițializare se avertizează dacă lipsesc.
Config rată dobândă în config_dobanda.json (cheie loan_interest_rate_on_extinction). Citire și salvare cu fallback la valoare implicită.
Interfața (UI)
Widget principal cu etichete de perioadă curentă/următoare, selector de lună, butoane: generează, șterge ultima lună, modifică rata, export log, curăță log, listează lichidați/activi și numere nealocate; zonă de status. Stilizare prin stylesheet.
Fluxul de generare a lunii
-
Determină perioada sursă M-1 față de țintă; validează anul. Deschide conexiuni la DB. Preia setul de lichidați.
-
Verifică schema MEMBRII.membrii pentru COTIZATIE_STANDARD. Selectează membrii activi (excludere lichidați). Resetează prima=0 pe luna sursă.
-
Pentru fiecare membru:
Citește impr_sold și dep_sold din luna sursă; dacă lipsesc, omite. Inițializează impr_deb_nou=0, dep_cred_nou=0.
Moștenește rata plătită luna anterioară, doar dacă nu există împrumut nou în luna sursă. Valoarea este quantizată la 0,01; altfel 0,00.
Setează dep_deb_nou = cotizație_standard (aplicat uniform pentru toate lunile).
Plafonează impr_cred_nou la soldul sursă; dacă soldul sursă ≤ 0.005, rata devine 0.00.
Calculează solduri noi:
Împrumut: impr_sold_nou = max(0, impr_sold_sursa + impr_deb_nou - impr_cred_nou) cu prag de zeroizare 0.005. Depozit: dep_sold_nou = dep_sold_sursa + dep_deb_nou - dep_cred_nou.
Dacă împrumutul se stinge acum (impr_sold_sursa > 0.005 și impr_sold_nou == 0), calculează dobânda de lichidare: caută perioada de început (MAX anul*100+luna cu impr_deb>0 ≤ luna sursă), însumează impr_sold pozitiv pe interval [start..sursă], apoi dobândă = SUM(impr_sold) × rată_lichidare, cu rotunjire la 0.01.
Inserează în depcred rândul lunii țintă: câmpuri nr_fisa, luna, anul, dobanda, impr_deb, impr_cred, impr_sold, dep_deb, dep_cred, dep_sold, prima=1. Commit la final. Rezumat cu totaluri și număr dobânzi calculate.
Gestionare perioadă curentă și selecție
Detectează ultima lună procesată din DEPCRED.depcred și afișează următoarea lună logică; actualizează combobox. Verifică existența unei luni în DB.
Ștergerea ultimei luni / unei luni țintă
Ștergere sigură a ultimei luni generate cu confirmare. Operația internă: DELETE FROM depcred WHERE luna=? AND anul=?. Reactualizează perioada. Suport și pentru suprascriere: dacă luna țintă există, întreabă pentru ștergere + regenerare.
Alte funcții utile
Listă membri lichidați: citește LICHIDATI.lichidati, atașează numele din MEMBRII.membrii, afișează în log.
Listă membri activi pe luna curentă: join DEPCRED + MEMBRII, raportează total depuneri/împrumuturi și statistici.
Numere de fișă nealocate: calculează diferența dintre [1..max] și setul de NR_FISA din MEMBRII. Dialog dedicat.
Configurarea și modificarea ratei
Dialog pentru setarea ratei în ‰. Intern salvează ca fracție la mie în loan_interest_rate_on_extinction. Actualizează eticheta și persistă în config_dobanda.json. Validări și rotunjiri.
Threading, progres, erori
Rulează generarea în worker thread, raportează progres în UI, gestionează erorile cu rollback la blocări/exceptii și reînchide conexiunile. Mesaje clare în log și pop-ups.
Reguli de calcul critice
Prag zeroizare împrumut: 0.005.
Moștenire rată doar dacă nu există impr_deb în luna sursă.
Cotizație standard aplicată uniform în toate lunile (dividendele se gestionează separat prin modulul Dividende).
Rotunjiri: sume la 0.01, rata la 0.000001, dobândă la 0.01.
- Optimizare Baze: VACUUM și REINDEX pentru performanță optimă
- Salvări: Operațiuni backup și restore pentru bazele de date
- CAR DBF Converter: Import/export date din formate DBF (Ctrl+Alt+D)
| Scurtătură | Funcție |
|---|---|
| Alt+A | Meniu Actualizări |
| Alt+V | Meniu Vizualizări |
| Alt+L | Listări |
| Alt+S | Salvări |
| Alt+I | Împrumuturi Noi |
| Alt+O | Optimizare Baze |
| Alt+G | Generare Lună |
| Alt+T | Selector Temă |
| Alt+R | Versiune |
| Alt+Q | Ieșire |
| Ctrl+Alt+C | Calculator |
| Ctrl+Alt+D | CAR DBF Converter |
| Ctrl+Alt+R | Conversie RON→EUR |
| F12 | Comutare rapidă către Împrumuturi Noi |
După aplicarea conversiei RON→EUR, sistemul implementează protecție automată:
Modul RON (Doar Citire):
- Vizualizare date permisă
- Operațiuni de scriere blocate
- Meniuri protejate: Actualizări, Generare Lună, Optimizare Baze
Modul EUR (Citire-Scriere):
- Toate operațiunile permise
- Modificări salvate în bazele EUR
- Flexibilitate completă pentru actualizări
Indicator Vizual:
- ✅ Citire-Scriere (verde) - Operațiuni permise
- 🔒 Doar Citire (portocaliu) - Protecție activă
- Python: 3.7+ (recomandat 3.9 sau 3.10)
- PyQt5: 5.15.0+
- SQLite3: Include în Python (versiune 3.30+)
- IDE Recomandat: PyCharm Community/Professional
PyQt5>=5.15.0
reportlab>=3.6.0 # Pentru generarea PDF chitanțe
xlsxwriter>=3.2.9 # Pentru export Excel securizat (fără vulnerabilități)
pyzipper>=0.3.6 # Pentru criptare AES-256 baze de date
sqlite3 # Inclus în Python standard library
pathlib # Inclus în Python standard library
json # Inclus în Python standard libraryNote Securitate:
xlsxwriterpentru export Excel - elimină vulnerabilitățile CVE-2023-43810 (XXE) și CVE-2024-47204 (ReDoS)pyzipperpentru criptare AES-256 REALĂ a bazelor de date (nu doar ZIP cu parolă standard)
- Windows: 10 sau 11 (64-bit recomandat)
- Minimum RAM: 4 GB
- Spațiu Disc: 500 MB (incluzând baze de date)
- Rezoluție Ecran: Minimum 1366x768 (recomandat 1920x1080)
git clone https://github.com/totilaAtila/CARpetrosani.git
cd CARpetrosani# Creare mediu virtual
python -m venv venv
# Activare mediu virtual
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activatepip install -r requirements.txtSau instalare manuală:
pip install PyQt5>=5.15.0
pip install reportlab>=3.6.0Plasați bazele de date SQLite în directorul principal al aplicației:
Baze de Date Obligatorii:
MEMBRII.db- Informații despre membriDEPCRED.db- Depuneri și crediteLICHIDATI.db- Membri lichidațiactivi.db- Membri activi (pentru dividende)INACTIVI.db- Membri inactiviCHITANTE.db- Tracking numere chitanțe (creat automat dacă lipsește)
Fișiere de Configurare:
dual_currency.json- Status conversie și configurare sistem dual currencyconfig_dobanda.json- Configurare rată dobândă
După Conversie EUR (generate automat):
MEMBRIIEUR.dbDEPCREDEUR.dbactiviEUR.dbLICHIDATIEUR.dbINACTIVIEUR.dbdual_currency.json- Status conversie și configurare
python main.pyCARpetrosani/
├── main.py # Punct de intrare cu early database patching
├── main_ui.py # Interfața principală cu sistem dual currency
├── currency_logic.py # Logică gestionare monede și permisiuni
├── dialog_styles.py # Stiluri pentru dialoguri
├── car_settings.json # Setări persistente (tema selectată)
├── dual_currency.json # Status conversie și configurare dual currency
├── config_dobanda.json # Configurare rată dobândă (creat la prima utilizare)
│
├── ui/ # Module interfață utilizator
│ ├── statistici.py # Dashboard statistici
│ ├── adaugare_membru.py # Widget adăugare membri noi
│ ├── adauga_membru.py # Logică adăugare membri (modul auxiliar)
│ ├── actualizare_membru.py # Widget actualizare date membri
│ ├── modificare_membru.py # Logică modificare membri (modul auxiliar)
│ ├── sume_lunare.py # Introducere plăți lunare
│ ├── lichidare_membru.py # Procesare lichidări
│ ├── stergere_membru.py # Ștergere membri
│ ├── dividende.py # Calcul și distribuire dividende
│ ├── vizualizare_lunara.py # Vizualizare date lunare
│ ├── vizualizare_trimestriala.py # Vizualizare date trimestriale
│ ├── vizualizare_anuala.py # Vizualizare date anuale
│ ├── verificare_fise.py # Validare consistență date
│ ├── afisare_membri_lichidati.py # Identificare membri cu date incomplete
│ ├── listari.py # Generare chitanțe PDF pentru RON
│ ├── listariEUR.py # Generare chitanțe PDF pentru EUR
│ ├── salvari.py # Operațiuni salvare/backup
│ ├── calculator.py # Calculator integrat
│ ├── imprumuturi_noi.py # Gestionare împrumuturi (fereastră separată)
│ ├── generare_luna.py # Generare lună nouă automată
│ ├── optimizare_index.py # Optimizare performanță baze
│ ├── despre.py # Informații aplicație
│ ├── validari.py # Funcții validare date (modul utilitar)
│ └── ...
│
├── conversie_widget.py # Widget conversie RON→EUR
├── car_dbf_converter_widget.py # Converter DBF (opțional)
│
├── fonts/ # Fonturi pentru generare PDF
│ ├── Arial.ttf
│ ├── DejaVuSans-Bold.ttf
│ └── ...
│
├── icons/ # Iconițe aplicație
│ ├── app_icon.png
│ ├── calc.png
│ └── ...
│ # Baze de date SQLite (RON)
|─ MEMBRII.db
├── DEPCRED.db
├── activi.db
├── INACTIVI.db
├── LICHIDATI.db
├── CHITANTE.db # Tracking chitanțe (creat automat)
│ # Baze de date SQLite (nume original + sufix EUR - după conversie)
├── MEMBRIIEUR.db
├── DEPCREDEUR.db
├── activiEUR.db
├── INACTIVIEUR.db
├── LICHIDATIEUR.db
├── CHITANTEEUR.db # Tracking chitanțe EUR (creat automat)
│
└── README.md # Documentație
Informații Membri
Coloane:
- NR_FISA INTEGER PRIMARY KEY -- Număr fișă unic
- NUM_PREN TEXT -- Nume și prenume
- DOMICILIUL TEXT -- Adresă domiciliu
- CALITATEA TEXT -- Funcție/Departament
- DATA_INSCR TEXT -- Data înscrierii (YYYY-MM-DD)
- COTIZATIE_STANDARD REAL -- Cotizație lunară standard REALDepuneri și Credite
Coloane:
- NR_FISA INTEGER -- Referință către MEMBRII
- DOBANDA REAL -- Dobândă calculată
- IMPR_DEB REAL -- Împrumut debit (nou împrumut)
- IMPR_CRED REAL -- Împrumut credit (plată)
- IMPR_SOLD REAL -- Sold împrumut
- LUNA INTEGER -- Luna (1-12)
- ANUL INTEGER -- Anul
- DEP_DEB REAL -- Cotizația, se consideră debit lunar,se adaugă la DEP_SOLD
- DEP_CRED REAL - Retragere din fondul social
- DEP_SOLD REAL -- Sold depunere
- PRIMA LOGIC -- Prima este un câmp boolean, marchează luna activă 1= luna activă. Generare lună folosește acest câmp: când se generează luna țintă - devine 1, uar luna sursă - devine 0Coloane:
- NR_FISA INTEGER PRIMARY KEY -- Număr fișă
- NUM_PREN TEXT -- Nume și prenume
- DEP_SOLD REAL -- Sold depuneri
- DIVIDEND REAL -- Dividend calculatMembri Lichidați
Coloane:
- nr_fisa INTEGER PRIMARY KEY -- Număr fișă
- data_lichidare TEXT -- Data lichidăriiMembri Inactivi
Coloane:
- nr_fisa INTEGER PRIMARY KEY -- Număr fișă
- num_pren TEXT -- Nume și prenume
- lipsa_luni INTEGER -- Număr luni lipsă consecutiveColoane:
- STARTCH_PR INTEGER -- Număr chitanță precedent (ultima sesiune)
- STARTCH_AC INTEGER -- Număr chitanță actual (sesiunea curentă)Utilizare:
STARTCH_AC= numărul ultimei chitanțe generateSTARTCH_PR= numărul ultimei chitanțe din sesiunea precedentă (pentru istoric)- La resetare:
STARTCH_PR = 0 - Actualizare automată la fiecare generare PDF chitanțe
Baze RON (MEMBRII.db, DEPCRED.db, etc.):
- Câmp
COTIZATIE_STANDARDcu
Baze EUR (MEMBRIIEUR.db, DEPCREDEUR.db, etc.):
- Structura Identică!, doar valorile sunt convertite la momentul folosirii conversie_widget
Dobânda se calculează DOAR la achitarea Rezumat calculuri în generare_luna.py:
- Calcul solduri
a) Împrumut (impr_sold)
impr_sold_nou_calculat = impr_sold_sursa + impr_deb_nou - impr_cred_nou if impr_sold_nou_calculat <= Decimal('0.005'): impr_sold_nou = Decimal("0.00") else: impr_sold_nou = impr_sold_nou_calculat
Interpretare:
impr_sold_sursa = soldul anterior al împrumutului.
impr_deb_nou = debit nou (împrumut acordat în luna curentă).
impr_cred_nou = credit nou (rată plătită luna aceasta).
Rezultatul final este zeroizat dacă diferența este sub 0.005 RON (rotunjire).
b) Depozit (dep_sold)
dep_sold_nou = dep_sold_sursa + dep_deb_nou - dep_cred_nou
Interpretare:
dep_sold_sursa = sold anterior al depozitului.
dep_deb_nou = sumă nou depusă (de obicei cotizația standard în generare_luna.py; dividendele se adaugă separat prin modulul Dividende).
dep_cred_nou = sume retrase din depozit.
- Calcul dobândă la stingere împrumut
Dobânda se calculează doar dacă:
if impr_sold_sursa > Decimal('0.005') and impr_sold_nou == Decimal("0.00"):
adică membrul avea împrumut activ și acum l-a stins complet.
Etape:
- Se caută prima lună de început a împrumutului:
SELECT MAX(anul100+luna) FROM depcred WHERE nr_fisa=? AND impr_deb>0 AND (anul100+luna <= ?)
- Se calculează suma tuturor soldurilor de împrumut din perioada activă:
SELECT SUM(impr_sold) FROM depcred WHERE nr_fisa=? AND (anul*100+luna BETWEEN ? AND ?) AND impr_sold > 0
- Dobânda este:
dobanda_noua = (sum_balances * self.loan_interest_rate_on_extinction).quantize(Decimal("0.01"), ROUND_HALF_UP)
loan_interest_rate_on_extinction este rata configurabilă (‰ – la mie).
Se înmulțește cu suma totală a soldurilor din perioada împrumutului și se rotunjește la 0.01.
- Rata dobânzii (configurare)
Se salvează/încarcă din fișierul config_dobanda.json.
Poate fi modificată prin UI:
self.loan_interest_rate_on_extinction = Decimal(str(new_permille)) / 1000
Sinteză practică
Tip sold Formula Observații
Împrumut nou impr_sold_nou = impr_sold_sursa + impr_deb_nou - impr_cred_nou Dacă < 0.005 ⇒ 0 Depozit nou dep_sold_nou = dep_sold_sursa + dep_deb_nou - dep_cred_nou dep_deb_nou = cotizația standard în generare_luna.py Dobândă lichidare dobanda = SUM(impr_sold) × rata_lichidare doar la stingerea totala
### Conversie RON → EUR
Aplicația implementează conversia conform **Regulamentului CE 1103/97**:
**Metodologie:**
- **Conversie Directă Individuală**: Fiecare înregistrare convertită separat
- **Precizie Decimal**: Utilizare aritmetică precisă pentru evitarea erorilor de rotunjire
- **Metodă de Rotunjire**: ROUND_HALF_UP (0.5 rotunjit la 1)
- **Curs Fix**: 4.9755 RON/EUR implicit (configurabil)
**Exemplu Conversie:**
```python
Suma RON: 497.55 RON
Curs: 4.9755 RON/EUR
Suma EUR = 497.55 ÷ 4.9755 = 100.00 EUR (rotunjit la 2 zecimale)
Formula Generală:
Valoare_EUR = ROUND(Valoare_RON / Curs_Schimb, 2)
Procesul automatizat de generare lună nouă:
- Citire Solduri: Extrage soldurile din luna anterioară pentru fiecare membru
- Aplicare Tranzacții: Procesează toate tranzacțiile din luna curentă
- Calcul Dobândă: Calculează dobânda pe soldul împrumutului
- Creare Înregistrări: Generează înregistrări pentru luna următoare
- Raportare: Raport cu membrii procesați, împrumuturi noi și omiși
- Lansare: Executați
python main.pysau dublu-click pemain.py(dacă Python este configurat) - Încărcare Automată: Aplicația încarcă automat tema salvată și verifică statusul conversiei
- Interfață: Se deschide fereastra principală cu meniul lateral și zona de conținut
Meniu Lateral:
- Click pe butoane pentru acces rapid la module
- Utilizați scurtăturile tastatură pentru eficiență
- Toggle RON/EUR pentru comutare monedă
- Indicator permisiuni (Citire-Scriere / Doar Citire)
Submeniuri:
- Se deschid automat la click pe module cu opțiuni multiple
- Buton "⬅ Ieșire Meniu" pentru revenire la statistici
Teme Vizuale:
- Click pe "Selector temă" sau Alt+T
- Navigare cu tastatura pentru preview real-time
- Aplicare automată și salvare persistentă
Actualizări (Alt+A) → Adăugare membru
→ Completare date → Salvare
Actualizări (Alt+A) → Sume lunare
→ Selectare membru → Introducere date → Salvare
Generare lună (Alt+G)
→ Selectare lună și an → Confirmare → Procesare automată
Conversie RON->EUR (Ctrl+Alt+R)
→ Verificare curs → Confirmare → Conversie automată
→ Descărcare baze EUR generate
Toggle în meniul lateral: Click pe RON sau EUR
→ Aplicația re-patchuiește modulele automat
→ Widget-urile se reîncarcă cu datele corecte
Listări (Alt+L)
→ Selectare lună și an pentru chitanțe
→ Setare număr chitanță inițial (ex: 1001)
→ Configurare chitanțe per pagină (5-15, default 10)
→ Click "Preview" pentru verificare date
→ Verificare totaluri (dobândă, împrumuturi, depuneri)
→ Click "Tipărește PDF" → Confirmare
→ Generare automată cu progres vizual
→ PDF salvat ca chitante_LUNA_AN.pdf
→ Deschidere automată PDF sau click "Deschide PDF"
Caracteristici Chitanțe:
- Format A4 cu 10 chitanțe per pagină (configurabil 5-15)
- Dimensiune chitanță: 2,5 cm înălțime
- Informații: Nr.Fișă, Nume, Dobândă, Rată Împrumut, Sold Împrumut, Depuneri, Retrageri, Total de Plată
- Pagină finală cu totaluri generale
- Actualizare automată CHITANTE.db (tracking STARTCH_PR, STARTCH_AC)
{
"current_theme": 0,
"app_version": "3.2",
"last_updated": "2025-10-24 14:30:00"
}{
"conversie_aplicata": true,
"data_conversie": "2025-10-24 15:45:00",
"curs_folosit": 4.9755,
"baze_convertite": [
"MEMBRII",
"DEPCRED",
"activi",
"INACTIVI",
"LICHIDATI"
]
}{
"rata_dobanda": 0.004
}Notă: Rata dobândă = 0.004 înseamnă 4‰ (4 la mie). Acest fișier este creat automat la prima utilizare a modulelor de generare lună sau sume lunare.
Soluții:
# Verificare versiune Python
python --version # Trebuie să fie 3.7+
# Reinstalare PyQt5
pip uninstall PyQt5
pip install PyQt5
# Verificare dependențe
pip list | grep PyQt5Verificări:
- Bazele de date există în directorul aplicației
- Fișierele nu sunt corupte (testare cu DB Browser for SQLite)
- Permisiuni de citire/scriere pe fișiere
- Spațiu disponibil pe disc
# Testare integritate bază de date
sqlite3 MEMBRII.db "PRAGMA integrity_check;"Cauze Posibile:
- Fișierul
dual_currency.jsonlipsește sau este corupt - Bazele EUR nu există după conversie
- Permisiuni de scriere blocate
Soluție:
# Verificare existență baze EUR
ls *EUR.db
# Verificare dual_currency.json
cat dual_currency.jsonSoluție:
# Verificare permisiuni
# Windows (PowerShell):
Get-Acl car_settings.json
# Ștergere fișier corupt și regenerare
del car_settings.json
# Repornire aplicație pentru regenerare automatăVerificări:
- Toate valorile sunt numerice (nu TEXT)
- Câmpurile nu conțin NULL
- Soldurile sunt consistente
-- Verificare consistență
SELECT NR_FISA, LUNA, ANUL,
IMPR_SOLD, DEP_SOLD
FROM DEPCRED
WHERE IMPR_SOLD IS NULL OR DEP_SOLD IS NULL;Cauze Posibile:
- Fonturile lipsesc (Arial.ttf, DejaVuSans-Bold.ttf) . Ele trebuie să fie atât in dosarul Fonturi cât si în rădăcina aplicației
- Permisiuni insuficiente pentru scriere
- DEPCRED.db sau MEMBRII.db lipsesc
Soluții:
# Verificare fonturi
ls fonts/Arial.ttf
ls fonts/DejaVuSans-Bold.ttf
# Copiere fonturi din Windows
copy C:\Windows\Fonts\Arial.ttf fonts\
# Verificare permisiuni
# Windows:
icacls chitante_*.pdf
# Verificare existență baze
dir DEPCRED.db MEMBRII.dbSoluție:
- Apăsați "Reset" în modulul Listări
- Confirmați resetarea numărului la 1
- Sau setați manual un număr mai mic
- CHITANTE.db va fi actualizat cu noul număr
**