achizitie import: TVA DVI cu valuta proprie, discount financiar, cote multiple

- TVA-ul de pe DVI poate avea valuta si curs proprii, diferite de ale facturii
  (rand "protejat": rand_dvi/valuta_proprie pe introdc, sparge_tva_protejat).
- Discount financiar pe factura: rand tip_rand='G' (401 = 767), TVA calculat pe
  baza diminuata, marfa si preturile articolelor pe valoarea integrala.
- Factura multi-cota: randurile S, G si T se sparg pe cotele articolelor, cu
  explicatia TVA din familia coloanei si alinierea T -> S.
- Teste noi in utile/Teste/achizitie_import (discount, DVI, cote, e2e).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U9uDgDfUQXbh2Neib36CN8
This commit is contained in:
2026-08-01 09:32:35 +03:00
parent 704e25e190
commit 832fea4913
62 changed files with 12071 additions and 575 deletions

View File

@@ -15,7 +15,7 @@
* rul_temp.pretd = 1000.00 (pretul valuta NU include cei 523 lei ai secundarei)
* rul_temp.pret = 5230.00 (pretul lei NU mai include cei 523 lei)
* goObj.procent_lei = 100, goObj.procent_val = 100
* rand D (diferenta) cu suma = 523.00, cont dominant clasa 3 = 371 (scd D = 607)
* FARA rand D: documentul debifat nu intra in diferenta (v2.11.11)
* explicatia4/explicatia5 goale pe randul secundarei (371, doc2)
* valideaza_sume() = .T., cmesajsync gol
*
@@ -274,7 +274,7 @@ TRY
*-- F1 (ointroduceri.prg): index ord_doc INAINTE de CREATEOBJECT - vezi docs/testare-ui-vfp.md capcana p.
SELECT introdc
INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='T','3', tip_rand='D','4', '5') + Padr(Nvl(scd,''),10) TAG ord_doc
INDEX ON Str(Nvl(nr_doc,0),8) + Icase(tip_rand='B','1', tip_rand='S','2', tip_rand='G','3', tip_rand='T','4', tip_rand='D','5', '6') + Padr(Nvl(scd,''),10) TAG ord_doc
SET ORDER TO ord_doc
DO DcLog WITH 'cursoare pregatite, CREATEOBJECT(import_nota, .F.) - lIntern=.F. (import)'
@@ -405,12 +405,13 @@ TRY
LOCATE FOR tip_rand == 'D'
IF FOUND()
DO DcLog WITH 'randul D (diferenta): scd=' + ALLTRIM(scd) + ' scc=' + ALLTRIM(scc) + ' suma=' + TRANSFORM(suma)
DO Assert3 WITH '4a-randul D exista cu suma=523.00 (diferenta absorbita)', suma, 523.00
DO AssertStr WITH '4b-randul D cont dominant clasa 3 (scc=371)', ALLTRIM(scc), '371'
DO Assert3 WITH '4a-randul D nu mai preia documentul debifat (astept suma 0)', suma, 0
ELSE
pnAsserts = pnAsserts + 2
DO DcLog WITH ' FAIL 4a/4b: nu exista randul D (diferenta) - asteptat suma=523.00'
pnAsserts = pnAsserts + 1
pnPass = pnPass + 1
DO DcLog WITH ' PASS 4a-nu exista rand D: documentul debifat nu intra in diferenta'
ENDIF
DO Assert3 WITH '4b-ndif_lei (astept 0, documentul debifat nu incarca pretul)', goObj.ndif_lei, 0
SELECT introdc
LOCATE FOR nract == 201 AND ALLTRIM(scd) == '371' AND INLIST(tip_rand,'B','S')
@@ -595,8 +596,8 @@ PROCEDURE CreeazaIntrodc
nract N(14), serie_act C(10), explicatia4 C(50), explicatia5 C(50), participa_valuta L, ;
id_valuta N(14), curs N(14,4), nume_val C(10), dataact D, fdoc C(50), id_fdoc N(14), ;
se_scrie N(1), tva_incasare N(1), doc_color N(10), doc_label C(10), tip_rand C(1), ;
doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), ;
scd_orig C(20), ascd_orig C(20))
doc_key C(80), nr_doc N(8), suma_doc N(18,4), suma_doc_val N(18,4), mod_manual N(1), expl_manual N(1), ;
scd_orig C(20), ascd_orig C(20), rand_dvi N(1), valuta_proprie N(1))
ENDPROC
PROCEDURE VerificaPereche