1. Arhitectura MVC (Model-View-Controller)
Arhitectura MVC este un **model de design software** care separă reprezentarea informațiilor de interacțiunile utilizatorului, organizând aplicația în trei componente interconectate.
1.1. Fluxul de Interacțiune
- **Utilizatorul Interacționează cu Vizualizarea (View):** Utilizatorul efectuează o acțiune (apăsarea unui buton).
- **Vizualizarea Transmite Solicitarea Către Controller:** Vizualizarea trimite evenimentul către **Controller**.
- **Controller-ul Procesează Solicitarea:** Controller-ul apelează metodele necesare din **Model** pentru a prelua sau modifica datele.
- **Modelul Gestionează Logica de Business și Datele:** Modelul interacționează cu baza de date, aplică **logica de business** și, după finalizarea operațiunii, notifică.
- **Controller-ul Alege Vizualizarea Corectă:** Pe baza rezultatului, Controller-ul decide ce **Vizualizare** trebuie afișată.
- **Vizualizarea Afișează Datele:** Vizualizarea folosește datele primite de la Model pentru a genera **interfața de utilizator actualizată** și o afișează.
1.2. Rolul Fiecărei Componente
- **Model (M):** Gestionează **Datele și Logica de Business** (regulile, starea, interacțiunea cu baza de date).
- **View (V):** Reprezintă **Interfața de Utilizator (UI)**. Responsabilă cu afișarea datelor și captarea interacțiunilor.
- **Controller (C):** Este **Intermediarul/Coordonatorul**. Primește acțiunile de la View, le deleagă către Model și alege View-ul de afișat.
2. Reguli de Business în Model
Regulile de business sunt logica specifică ce guvernează modul în care datele sunt manipulate și sunt implementate exclusiv în componenta **Model**.
2.1. Exemplu: Reguli de Business
- **Reguli de Validare:**
- Prețul unui produs nu poate fi negativ ($Preț > 0$).
- O adresă de livrare nu poate fi identică cu cea de facturare dacă opțiunea "Cadou" este bifată.
- **Reguli de Calcul:**
- **Reguli de Stare:**
- O comandă aflată în starea "Expediată" nu mai poate fi anulată de către client.
3. Relaționarea Datelor în Baza de Date
Relaționarea datelor conectează tabelele (entitățile) dintr-o bază de date relațională prin intermediul unor câmpuri comune pentru a evita redundanța și a menține integritatea.
3.1. Chei Esențiale
- **Cheia Primară (PK):** Identifică în mod **unic** fiecare rând dintr-un tabel.
- **Cheia Externă (FK):** Stabilește link-ul, făcând referire la **Cheia Primară** dintr-un alt tabel.
3.2. Tipurile de Relații
- **Unu la Unu (1:1):** Un rând din A asociat cu exact un rând din B.
- **Unu la Mai Mulți (1:M):** Un rând din A asociat cu mai multe rânduri din B.
- **Mai Mulți la Mai Mulți (M:N):** Un rând din A asociat cu mai multe rânduri din B, și invers. Necesită o tabelă de joncțiune.
3.3. Exemplu de Interogare SQL (JOIN)
Interogare pentru a extrage detalii dintr-o comandă, folosind un tabel de legătură (`Detalii_Comanda`):
SELECT
C.id_comanda,
P.nume_produs,
DC.cantitate
FROM
Comenzi C
JOIN
Detalii_Comanda DC ON C.id_comanda = DC.id_comanda
JOIN
Produse P ON DC.id_produs = P.id_produs
WHERE
C.id_comanda = 101;
4. Relația Mai Mulți la Mai Mulți (M:N)
Relația **M:N** (Mai Mulți la Mai Mulți) este formulată mai explicit ca:
$$(M \text{ of many}) : (N \text{ of many})$$
Acest tip de relație nu poate fi implementat direct.
4.1. Soluția: Tabela de Legătură (Joncțiune)
Se folosește un al treilea tabel (de exemplu, **`Detalii_Comanda`**), care conține Cheile Externe ale ambelor tabele principale. Acest tabel transformă relația **M:N** în două relații separate de tip **1:M**.
5. MVC aplicat la Software Contabil
Aplicarea MVC pe un software de contabilitate asigură separarea logicii financiare complexe de interfață.
5.1. Exemplu: Înregistrarea unei Facturi de Vânzare
- **Controller (`FacturaController`):** Primește datele din formular, validează formatul datelor și apelează `FacturaModel`.
- **Model (`FacturaModel`):**
- Calculează TVA-ul total și Totalul Final.
- Actualizează Stocul (scade cantitatea vândută).
- Generează automat înregistrările contabile (Debit=Credit).
- **View (`AdaugareFacturaView`, `FacturaDetaliiView`):** Afișează formularul sau Factura Finală (HTML/PDF), utilizând datele calculate de Model.
5.2. Exemplu: Generarea Balanței de Verificare
- **Controller (`RapoarteController`):** Primește parametrii (perioada, filtre) de la View și apelează `BalantaModel.genereazaBalanta(...)`.
- **Model (`BalantaModel`):**
- Extrage Soldurile Inițiale.
- Interoghează Jurnalul Contabil pentru tranzacțiile din perioadă.
- Calculează **Rulajele** (total Debit/Credit) și **Soldurile Finale** pentru fiecare cont.
- Verifică Egalitatea Balanței (D=C).
Formulele de calcul folosite de Model sunt:
$$\text{Calcul Rulaj: } Rulaj\_Debit = \sum \text{Sumele Debitate}$$
$$\text{Calcul Rulaj: } Rulaj\_Credit = \sum \text{Sumele Creditare}$$
$$\text{Calcul Sold Final: } Sold\_Final = Sold\_Initial + Rulaj\_Debit - Rulaj\_Credit$$
(Formula Soldului Final este ajustată în funcție de funcția contului: activ sau pasiv).
- **View (`BalantaRaportView`):** Formatează și afișează setul de date sumarizate sub formă de tabel.
6. Definiția Jurnalului Contabil
Jurnalul Contabil (Registrul Jurnal) este un document contabil obligatoriu care înregistrează în ordine **cronologică** și **sistematică** **toate operațiunile economice și financiare** ale unei entități pe parcursul unei perioade fiscale. Reprezintă **evidența primară** și sursa de date pentru toate celelalte rapoarte.
6.1. Rolul Jurnalului Contabil
- **Integritatea Datelor:** Asigură respectarea principiului **contabilității în partidă dublă**, unde fiecare tranzacție afectează cel puțin două conturi, iar suma debitată este egală cu suma creditată (Debit = Credit).
- **Pista de Audit (Audit Trail):** Oferă o înregistrare detaliată și cronologică, permițând urmărirea oricărei tranzacții de la documentul justificativ până la raportul final.
- **Baza pentru Balanță:** Este sursa de date utilizată de **Model** pentru a calcula rulajele și soldurile conturilor în scopul generării Balanței de Verificare.
6.2. Structura unei Înregistrări (Articol Contabil)
Fiecare linie din Jurnalul Contabil (numită articol contabil) trebuie să conțină informațiile esențiale pentru a fi validă și completă:
- **Data înregistrării** (criteriul cronologic).
- **Numărul documentului justificativ** (de exemplu, numărul facturii sau chitanței).
- **Scurtă explicație** a naturii operațiunii economice (de exemplu, "Vânzare mărfuri").
- **Contul Debitor** și **Contul Creditor** (criteriul sistematic).
- **Suma** (valoarea tranzacției, care trebuie să fie egală pe cele două coloane).
În MVC, **Modelul** se asigură că la salvarea oricărei tranzacții (factură, plată, încasare) se generează automat o înregistrare completă și echilibrată în Jurnalul Contabil.