Initial commit — sursa ROAACNPRO
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
79
docs/facturare.md
Normal file
79
docs/facturare.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# Fluxul facturilor (ROAACNPRO)
|
||||
|
||||
Document de referință minimal: ce fișiere trebuie verificate/modificate când se schimbă
|
||||
ceva la facturare. Backend = Oracle (prin `goExecutor`/`goConn`), front-end = VFP9.
|
||||
|
||||
## Componentele cheie
|
||||
|
||||
| Rol | Fișier | Observații |
|
||||
|-----|--------|-----------|
|
||||
| Formularul de facturare | clasa `frm_factura` din `Clase/oacnpro.vcx` (cod în `.vct`) | **se editează în IDE VFP**, nu manual |
|
||||
| Procedurile de facturare VFP | `Programe/proceduri_acnpro.prg` | `factura_salvare_db`, `make_cfactura`, `factura_acn` |
|
||||
| Rapoarte facturare | `Programe/proceduri_acnpro_rapoarte.prg` + `Rapoarte/*.frx` | relistare/printare factură |
|
||||
| Calcul + salvare valori în Oracle | `PACK_FACTURARE.pck` (pachet PL/SQL) | **sursa de adevăr** pentru valori |
|
||||
| Framework facturare partajat | `COMUN/programe/ofacturare_comun.prg`, `oproceduri_facturare.prg` | partajat între aplicațiile ROA; a se evita modificarea |
|
||||
|
||||
## Lanțul de calcul (form → pachet → rapoarte)
|
||||
|
||||
1. **Introducere / import** (`frm_factura` + `factura_acn`): articolele intră în cursorul
|
||||
`crsFactura` (creat în `make_cfactura`, `proceduri_acnpro.prg`). Import din
|
||||
contract/tranzit/cheiaj prin `Insert Into crsFactura(...)` în `factura_acn`.
|
||||
2. **Preview pe ecran** (`frm_factura.CalculeazaPreturiRand` + `CalculeazaTotaluri`):
|
||||
calculează valorile fiecărui rând **doar pentru afișare**.
|
||||
3. **Salvare** (`factura_salvare_db`): copiază rândurile din `crsFactura` în cursorul
|
||||
`crsvanztemp`, apoi le trimite în Oracle prin `PACK_FACTURARE` (un apel per rând).
|
||||
4. **Calcul autoritar** (`PACK_FACTURARE`): recalculează și stochează
|
||||
`total_fara_tva / total_tva / total_cu_tva` în `vanzari` (antet) și `vanzari_detalii` (rânduri).
|
||||
5. **Relistare / lista de facturi**: `proceduri_acnpro_rapoarte.prg` și interogările din
|
||||
`proceduri_acnpro.prg` (~liniile 1180, 1222) **citesc** valorile deja calculate din Oracle
|
||||
(`v.total_cu_tva` etc.) — **nu recalculează**.
|
||||
|
||||
> **Regula de sincronizare:** valorile reale sunt cele calculate de `PACK_FACTURARE` la salvare.
|
||||
> Preview-ul din `frm_factura` trebuie să folosească **aceleași formule** ca pachetul, iar
|
||||
> `factura_salvare_db` trebuie să trimită corect toți parametrii relevanți. Dacă cele două
|
||||
> diverg, ecranul arată altceva decât factura salvată/relistată.
|
||||
|
||||
## Structura `crsFactura` (rândul de factură în memorie)
|
||||
|
||||
Definit în `make_cfactura` (`proceduri_acnpro.prg`). Câmpuri relevante:
|
||||
|
||||
- `pretval` = preț unitar în valută (prețul introdus de operator; baza calculului)
|
||||
- `Curs` = curs valutar; `Pret` = preț unitar în lei = `pretval * Curs`
|
||||
- `cantitate`
|
||||
- `proc_tva` = multiplicatorul de TVA (ex. **1.19**, nu 19). La salvare e trimis ca `proc_tvav`.
|
||||
- `pret_cu_tva` N(1) = flag: 1 = `pretval` este **cu TVA inclus**, 0 = fără TVA
|
||||
- Lei: `valftva` (fără TVA), `valtva` (TVA), `valctva` (cu TVA)
|
||||
- Valută: `valval` (fără TVA), `tvaval` (TVA), `totval` (cu TVA)
|
||||
|
||||
## Formule TVA
|
||||
|
||||
Cu `proc_tva` = multiplicator (1 + cotă/100):
|
||||
|
||||
- **Preț fără TVA** (`pret_cu_tva = 0`): `valftva = Pret*cant`; `valtva = valftva*(proc_tva-1)`;
|
||||
`valctva = valftva + valtva`.
|
||||
- **Preț cu TVA inclus** (`pret_cu_tva = 1`, calcul invers, identic cu `PACK_FACTURARE`,
|
||||
`V_PRET_CU_TVA = 1`, PACK_FACTURARE.pck ~15700–15922):
|
||||
`valctva = Pret*cant`; `valtva = valctva*(proc_tva-1)/proc_tva`; `valftva = valctva - valtva`.
|
||||
|
||||
Rotunjiri: lei la `gnPC`, valută la `gnPval` (opțiuni firmă `PC` / `PPRETV` în pachet).
|
||||
|
||||
## Unde modific când...
|
||||
|
||||
- **Calculul valorilor pe rând (preview)** → `frm_factura.CalculeazaPreturiRand` (IDE VFP).
|
||||
- **Ce se trimite la salvare în Oracle** → `factura_salvare_db` (insert `crsvanztemp` + apel pachet).
|
||||
- **Calculul/stocarea finală a valorilor** → `PACK_FACTURARE.pck` (a se ține sincron cu preview-ul).
|
||||
- **Coloane noi pe rândul de factură** → `make_cfactura` (cursor) + grid `grdFactura` (IDE VFP)
|
||||
+ import în `factura_acn` + insert în `factura_salvare_db`.
|
||||
- **Aspectul facturii tipărite / relistare** → `proceduri_acnpro_rapoarte.prg` + `Rapoarte/*.frx`.
|
||||
- **Lista de facturi** → interogările din `proceduri_acnpro.prg` (citesc din `vanzari`).
|
||||
|
||||
## Exemplu real: suport „preț cu TVA inclus" (v2.0.4)
|
||||
|
||||
Lanțul complet care a trebuit atins pentru o singură funcționalitate:
|
||||
1. `make_cfactura` — coloană nouă `pret_cu_tva N(1)` în `crsFactura`.
|
||||
2. `frm_factura.CalculeazaPreturiRand` — branch pe `pret_cu_tva` (calcul invers).
|
||||
3. `grdFactura` — coloană checkbox editabilă legată de `crsFactura.pret_cu_tva`.
|
||||
4. `factura_salvare_db` — trimite `Nvl(pret_cu_tva,0)` (nu mai e hardcodat 0) către pachet.
|
||||
|
||||
Pachetul și rapoartele **aveau deja** suport pentru `pret_cu_tva`, deci nu au fost modificate —
|
||||
exemplu tipic de „verifică întâi ce face deja pachetul/raportul".
|
||||
Reference in New Issue
Block a user