Achizitie din import: valuta pe documente secundare (DVI)

Rundele 1-7: golire campuri valuta la debifare in_valuta (cu suma_doc_val),
recalcul din curs pe tot documentul (cu refacere suma_doc/suma_doc_val),
spargere document principal in valuta (suma_val doar pe randuri in valuta),
TVA repartizat din baza in valuta pe import, iar la recalculeaza()/procente
per rand sumele in valuta ale documentelor participante aflate in alta
valuta decat a principalei se convertesc prin lei (suma/curs principal),
nu se mai aduna direct la baza in valuta (100 USD nu mai devine 100 EUR).

Teste UI: test_valuta_dvi_usd (scenariu mixt EUR+USD, 8/8 PASS),
test_debifare_invaluta (64/64 PASS), test_repro_valuta_dblclick,
mock_caut_valuta; regresie test_scenariu_dvi_complet PASS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KXsyJZBek1e9RvyLAQkoCx
This commit is contained in:
2026-07-24 23:45:45 +03:00
parent df9698375a
commit 39c825c1f8
8 changed files with 2188 additions and 15 deletions

View File

@@ -11225,11 +11225,11 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Sum suma For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) To lnBazaLei
Sum suma For tip_rand = 'T' And !Empty(id_jtva_coloana) To lnTvaLei
Endif
Sum suma_val For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnBazaVal
Sum Round(suma/This.oact.Curs, gnPval) For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnBazaVal2
Sum suma_val For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And in_valuta = 1 And Nvl(id_valuta,0) = Nvl(This.oact.id_valuta,0) And participa_valuta To lnBazaVal
Sum Round(suma/This.oact.Curs, gnPval) For Inlist(tip_rand,'B','S') And !Inlist(scd,'4426','4428') And !Empty(id_jtva_coloana) And (in_valuta = 0 Or Nvl(id_valuta,0) <> Nvl(This.oact.id_valuta,0)) And participa_valuta To lnBazaVal2
lnBazaVal = lnBazaVal + lnBazaVal2
Sum suma_val For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 1 And participa_valuta To lnTvaVal
Sum Round(suma/This.oact.Curs, gnPval) For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 0 And participa_valuta To lnTvaVal2
Sum suma_val For tip_rand = 'T' And !Empty(id_jtva_coloana) And in_valuta = 1 And Nvl(id_valuta,0) = Nvl(This.oact.id_valuta,0) And participa_valuta To lnTvaVal
Sum Round(suma/This.oact.Curs, gnPval) For tip_rand = 'T' And !Empty(id_jtva_coloana) And (in_valuta = 0 Or Nvl(id_valuta,0) <> Nvl(This.oact.id_valuta,0)) And participa_valuta To lnTvaVal2
lnTvaVal = lnTvaVal + lnTvaVal2
*!* baza documentului principal (nr_doc minim dintre B/S), pentru procent_val, procent_lei (intern) si procentele pe rand
@@ -11710,7 +11710,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Replace explicatia5 With Iif(in_valuta = 1 Or participa_valuta, '100.00', '')
Else
Replace explicatia4 With Iif(This.nbazaprincipala_lei <> 0, Allt(Str(suma/This.nbazaprincipala_lei*100,6,2)), '')
lnValRandProc = Iif(in_valuta = 1, suma_val, Round(suma/This.oact.Curs, gnPval))
lnValRandProc = Iif(in_valuta = 1 And Nvl(id_valuta,0) = Nvl(This.oact.id_valuta,0), suma_val, Round(suma/This.oact.Curs, gnPval))
Replace explicatia5 With Iif(This.nbazaprincipala_val <> 0, Allt(Str(lnValRandProc/This.nbazaprincipala_val*100,6,2)), '')
Endif
Endscan
@@ -11889,7 +11889,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
If This.lIntern
Thisform.creeaza_rand_s(tcDocKey, cont, baza_lei, 0, loBaza, acont)
Else
Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), baza_val, loBaza, acont)
Thisform.creeaza_rand_s(tcDocKey, cont, Round(baza_val*lnCurs,gnPc), Iif(loBaza.in_valuta = 1, baza_val, 0), loBaza, acont)
Endif
Select crsGrupCont
Endscan
@@ -12053,6 +12053,9 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
scc With crsGrupCota.scc, ascc With crsGrupCota.ascc, ;
suma_val With Round(crsGrupCota.baza_val * lnCotaCrt / 100, gnPval)
Replace suma With Round(suma_val * lnCurs, gnPc)
If !llValuta
Replace suma_val With 0
Endif
Endif
If lnIdJtvaCrt <> lnIdJtvaOrig
Select jtva_coloane2
@@ -12080,9 +12083,13 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Select Sum(baza_lei) As tot_lei, Sum(baza_val) As tot_val, Count(*) As nr_grup ;
From crsGrupCota Where cota_tva == lnCotaCrt Into Cursor crsBazaCota NOFILTER
If crsBazaCota.nr_grup > 1
If This.lIntern
If This.lIntern Or !llValuta
Select Sum(suma) As s From introdc Where doc_key == tcDocKey And tip_rand == 'T' And ptva == lnCotaCrt And mod_manual <> 1 Into Cursor crsSumTCota NOFILTER
lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
If This.lIntern
lnRestLei = Round(crsBazaCota.tot_lei * lnCotaCrt / 100, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
Else
lnRestLei = Round(Round(crsBazaCota.tot_val * lnCotaCrt / 100, gnPval) * lnCurs, gnPc) - Round(Nvl(crsSumTCota.s,0), gnPc)
Endif
Use In crsSumTCota
If lnRestLei <> 0
lnMaxAbs = -1
@@ -12447,22 +12454,61 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
*!* cursul editat se scrie explicit (ca la cSumaVal.Valid - dupa amessagebox grid-ul
*!* nu-l mai scria in camp) si se copiaza pe randul de TVA pereche; apoi ofer
*!* recalcularea sumei in lei din suma in valuta, ca la modificarea sumei in valuta
Local lnSumaDinVal, lnRaspuns
*!* 24.07.2026 claude - recalcularea din curs se aplica pe toate randurile documentului si reface totalurile suma_doc/suma_doc_val
Local lnSumaDinVal, lnRaspuns, lcDocKeyC, lnRecC, lnCntS, lnSLei, lnSVal
If This.Value # 0
Select introdc
Replace curs With This.Value
Thisform.copiaza_valoare([curs])
If in_valuta = 1 And suma_val # 0
lnSumaDinVal = Round(suma_val * This.Value, gnPC)
If in_valuta = 1 And !Empty(Nvl(introdc.doc_key,''))
lcDocKeyC = introdc.doc_key
lnRecC = Recno('introdc')
lnRaspuns = 6
If suma <> 0 And suma <> lnSumaDinVal
lnRaspuns = amessagebox("Suma in lei difera de suma in valuta transformata in lei!" + CHR(13) + CHR(10) + ;
"Doriti recalcularea sumei in lei?",4+32,"Diferente sume")
Locate For doc_key == lcDocKeyC And in_valuta = 1 And suma_val # 0 And suma <> 0 And suma <> Round(suma_val * This.Value, gnPC)
If Found()
lnRaspuns = amessagebox("Suma in lei difera de suma in valuta transformata in lei!" + Chr(13) + Chr(10) + ;
"Doriti recalcularea sumelor in lei pe document?",4+32,"Diferente sume")
Endif
If lnRaspuns = 6
Replace suma With lnSumaDinVal
Scan For doc_key == lcDocKeyC And in_valuta = 1 And suma_val # 0
Replace suma With Round(suma_val * This.Value, gnPC)
Endscan
Calculate Cnt(), Sum(suma), Sum(suma_val) For doc_key == lcDocKeyC And tip_rand == 'S' To lnCntS, lnSLei, lnSVal
If lnCntS = 0
Locate For doc_key == lcDocKeyC And tip_rand == 'B'
If Found()
lnCntS = -1
lnSLei = suma
lnSVal = suma_val
Endif
Else
Locate For doc_key == lcDocKeyC
Endif
If lnCntS <> 0
Replace suma_doc With lnSLei, suma_doc_val With lnSVal
Thisform.copiaza_valoare([suma_doc])
Thisform.copiaza_valoare([suma_doc_val])
Endif
Endif
Try
Go lnRecC In introdc
Catch
Go Top In introdc
Endtry
Thisform.do_executa
Else
If in_valuta = 1 And suma_val # 0
lnSumaDinVal = Round(suma_val * This.Value, gnPC)
lnRaspuns = 6
If suma <> 0 And suma <> lnSumaDinVal
lnRaspuns = amessagebox("Suma in lei difera de suma in valuta transformata in lei!" + Chr(13) + Chr(10) + ;
"Doriti recalcularea sumei in lei?",4+32,"Diferente sume")
Endif
If lnRaspuns = 6
Replace suma With lnSumaDinVal
Endif
Thisform.do_executa
Endif
Endif
Endif
ENDPROC
@@ -12516,7 +12562,21 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
ENDPROC
PROCEDURE Grid1.cInValuta.Check1.Valid
*!* 24.07.2026 claude - la debifare se sterg valuta, suma in valuta si cursul pe liniile documentului
Select introdc
Replace in_valuta With This.Value
Thisform.copiaza_valoare([in_valuta])
If This.Value = 0
Replace id_valuta With 0, nume_val With '', curs With 0, suma_val With 0, suma_doc_val With 0
Thisform.copiaza_valoare([id_valuta])
Thisform.copiaza_valoare([nume_val])
Thisform.copiaza_valoare([curs])
Thisform.copiaza_valoare([suma_val])
Thisform.copiaza_valoare([suma_doc_val])
Endif
thisform.do_executa
Thisform.lSyncPending = .T.
Thisform.tmrSync.Interval = 1
ENDPROC
PROCEDURE Grid1.cNract.Text1.Valid
@@ -12664,6 +12724,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
PROCEDURE Grid1.cParticipaValuta.Check1.Valid
thisform.do_executa
Thisform.lSyncPending = .T.
Thisform.tmrSync.Interval = 1
ENDPROC
PROCEDURE Grid1.cScc.Text1.GotFocus
@@ -12888,6 +12950,7 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
Replace id_valuta With loCauta.id_valuta, nume_val With Alltrim(loCauta.nume_val)
Thisform.copiaza_valoare([id_valuta])
Thisform.copiaza_valoare([nume_val])
This.Value = introdc.nume_val
Thisform.grid1.Refresh()
Endif
ENDPROC