Achizitie din import: schimbarea cursului resincronizeaza articolele si diferenta
cCurs.Text1.Valid armeaza sincronizarea amanata (repretare articole + recalc diferente) si propaga cursul principalei in antet (oact.curs, doar pe randuri in valuta). Teste: pas nou de schimbare curs pe DVI secundar in test_valuta_dvi_usd (22/22 PASS), regresie test_debifare_invaluta (68/68) si 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:
@@ -12455,11 +12455,22 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
|
|||||||
*!* nu-l mai scria in camp) si se copiaza pe randul de TVA pereche; apoi ofer
|
*!* 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
|
*!* recalcularea sumei in lei din suma in valuta, ca la modificarea sumei in valuta
|
||||||
*!* 24.07.2026 claude - recalcularea din curs se aplica pe toate randurile documentului si reface totalurile suma_doc/suma_doc_val
|
*!* 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
|
Local lnSumaDinVal, lnRaspuns, lcDocKeyC, lnRecC, lnCntS, lnSLei, lnSVal, lnMinNrDocC
|
||||||
If This.Value # 0
|
If This.Value # 0
|
||||||
Select introdc
|
Select introdc
|
||||||
Replace curs With This.Value
|
Replace curs With This.Value
|
||||||
Thisform.copiaza_valoare([curs])
|
Thisform.copiaza_valoare([curs])
|
||||||
|
lnRecC = Recno('introdc')
|
||||||
|
lnMinNrDocC = 99999998
|
||||||
|
Calculate Min(Iif(Inlist(tip_rand,'B','S'), nr_doc, 99999998)) To lnMinNrDocC
|
||||||
|
Try
|
||||||
|
Go lnRecC In introdc
|
||||||
|
Catch
|
||||||
|
Go Top In introdc
|
||||||
|
Endtry
|
||||||
|
If nr_doc = lnMinNrDocC And in_valuta = 1
|
||||||
|
Thisform.oact.curs = This.Value
|
||||||
|
Endif
|
||||||
If in_valuta = 1 And !Empty(Nvl(introdc.doc_key,''))
|
If in_valuta = 1 And !Empty(Nvl(introdc.doc_key,''))
|
||||||
lcDocKeyC = introdc.doc_key
|
lcDocKeyC = introdc.doc_key
|
||||||
lnRecC = Recno('introdc')
|
lnRecC = Recno('introdc')
|
||||||
@@ -12510,6 +12521,8 @@ DEFINE CLASS import_nota AS frm_termin_renunt OF "_frm_child.vcx"
|
|||||||
Thisform.do_executa
|
Thisform.do_executa
|
||||||
Endif
|
Endif
|
||||||
Endif
|
Endif
|
||||||
|
Thisform.lSyncPending = .T.
|
||||||
|
Thisform.tmrSync.Interval = 1
|
||||||
Endif
|
Endif
|
||||||
ENDPROC
|
ENDPROC
|
||||||
|
|
||||||
|
|||||||
@@ -543,7 +543,16 @@ poAct.AddProperty('id_valuta', 1)
|
|||||||
|
|
||||||
goObj.grid1.cCurs.text1.Value = 4.00
|
goObj.grid1.cCurs.text1.Value = 4.00
|
||||||
goObj.grid1.cCurs.text1.Valid()
|
goObj.grid1.cCurs.text1.Valid()
|
||||||
|
|
||||||
|
*-- runda8: cCurs.Valid armeaza acum sincronizarea amanata (lSyncPending+tmrSync) in loc
|
||||||
|
*-- sa faca doar do_executa - imediat dupa Valid, INAINTE de DOEVENTS: doar armata
|
||||||
|
=Assert3('PAS4 armare: lSyncPending=.T. dupa Valid curs (pre-DOEVENTS)', IIF(goObj.lSyncPending,1,0), 1)
|
||||||
|
=Assert3('PAS4 armare: tmrSync.Interval>0 dupa Valid curs (pre-DOEVENTS)', IIF(goObj.tmrSync.Interval>0,1,0), 1)
|
||||||
|
|
||||||
DOEVENTS FORCE
|
DOEVENTS FORCE
|
||||||
|
|
||||||
|
=Assert3('PAS4 sync consumat: lSyncPending=.F. dupa DOEVENTS', IIF(goObj.lSyncPending,1,0), 0)
|
||||||
|
=Assert3('PAS4 sync consumat: tmrSync.Interval=0 dupa DOEVENTS', goObj.tmrSync.Interval, 0)
|
||||||
ELSE
|
ELSE
|
||||||
DO UILog WITH 'PAS4: ABANDONAT - nu exista rand S pe doc 102'
|
DO UILog WITH 'PAS4: ABANDONAT - nu exista rand S pe doc 102'
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|||||||
@@ -402,6 +402,102 @@ TRY
|
|||||||
DO DcLog WITH ' FAIL 7-valideaza_sume (' + TRANSFORM(llValidSume) + ', cmesajsync=[' + ALLTRIM(NVL(goObj.cmesajsync,'')) + '])'
|
DO DcLog WITH ' FAIL 7-valideaza_sume (' + TRANSFORM(llValidSume) + ', cmesajsync=[' + ALLTRIM(NVL(goObj.cmesajsync,'')) + '])'
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
|
*========================= PAS NOU: schimbare curs pe randul S(371) al DVI USD (nract=101) - resincronizare (runda8) =========================
|
||||||
|
LOCAL lcDocKeyDvi2
|
||||||
|
lcDocKeyDvi2 = ''
|
||||||
|
SELECT introdc
|
||||||
|
LOCATE FOR nract = 101 AND ALLTRIM(fdoc) == 'DVI' AND tip_rand == 'S' AND ALLTRIM(scd) == '371'
|
||||||
|
DO Assert3 WITH '8-rand S DVI USD (371) gasit inainte de schimbare curs', IIF(FOUND(),1,0), 1
|
||||||
|
IF FOUND()
|
||||||
|
lcDocKeyDvi2 = ALLTRIM(NVL(introdc.doc_key,''))
|
||||||
|
DO DcLog WITH 'PAS-curs: pozitionat pe randul S (nract=101,scd=371), curs INAINTE=' + TRANSFORM(introdc.curs) + ' doc_key=[' + lcDocKeyDvi2 + ']'
|
||||||
|
|
||||||
|
goObj.grid1.cCurs.text1.Value = 4.50
|
||||||
|
goObj.grid1.cCurs.text1.Valid()
|
||||||
|
|
||||||
|
DO Assert3 WITH '9-armare lSyncPending=.T. dupa Valid curs (pre-DOEVENTS)', IIF(goObj.lSyncPending,1,0), 1
|
||||||
|
DO Assert3 WITH '10-armare tmrSync.Interval>0 dupa Valid curs (pre-DOEVENTS)', IIF(goObj.tmrSync.Interval>0,1,0), 1
|
||||||
|
|
||||||
|
DOEVENTS FORCE
|
||||||
|
|
||||||
|
DO Assert3 WITH '11-sync consumat lSyncPending=.F. dupa DOEVENTS', IIF(goObj.lSyncPending,1,0), 0
|
||||||
|
DO Assert3 WITH '12-sync consumat tmrSync.Interval=0 dupa DOEVENTS', goObj.tmrSync.Interval, 0
|
||||||
|
ELSE
|
||||||
|
pnAsserts = pnAsserts + 4
|
||||||
|
DO DcLog WITH ' FAIL 9-12: nu exista randul S(371) pe DVI 101, sar peste schimbarea de curs'
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DO DcLog WITH 'dump introdc dupa schimbare curs DVI USD (4.50):'
|
||||||
|
DO DumpIntrodc
|
||||||
|
|
||||||
|
SELECT introdc
|
||||||
|
LOCATE FOR nract = 101 AND ALLTRIM(fdoc) == 'DVI' AND tip_rand == 'S' AND ALLTRIM(scd) == '371'
|
||||||
|
IF FOUND()
|
||||||
|
DO Assert3 WITH '13-S(371) suma recalculata (450 lei)', suma, 450
|
||||||
|
ELSE
|
||||||
|
pnAsserts = pnAsserts + 1
|
||||||
|
DO DcLog WITH ' FAIL 13: nu am gasit randul S(371) dupa sync'
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
SELECT introdc
|
||||||
|
LOCATE FOR ALLTRIM(NVL(doc_key,'')) == lcDocKeyDvi2 AND tip_rand == 'T'
|
||||||
|
IF FOUND()
|
||||||
|
DO Assert3 WITH '14-T DVI suma recalculata (94.50 lei)', suma, 94.50
|
||||||
|
ELSE
|
||||||
|
pnAsserts = pnAsserts + 1
|
||||||
|
DO DcLog WITH ' FAIL 14: nu am gasit randul T al doc2 (doc_key=' + lcDocKeyDvi2 + ') dupa sync'
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DO DcLog WITH 'goObj.procent_val=' + TRANSFORM(goObj.procent_val) + ' goObj.nbaza_val=' + TRANSFORM(goObj.nbaza_val)
|
||||||
|
DO Assert3 WITH '15-procent_val dupa curs (astept 108.604)', goObj.procent_val, 108.604
|
||||||
|
DO Assert3 WITH '16-nbaza_val dupa curs (astept 1086.04)', goObj.nbaza_val, 1086.04
|
||||||
|
|
||||||
|
SELECT rul_temp
|
||||||
|
LOCATE FOR ALLTRIM(codmat) == 'ART-A8-371'
|
||||||
|
IF FOUND()
|
||||||
|
DO DcLog WITH 'rul_temp dupa curs: pretd=' + TRANSFORM(pretd) + ' pret=' + TRANSFORM(pret)
|
||||||
|
DO Assert3 WITH '17-rul_temp.pretd dupa curs (astept 1086.04)', pretd, 1086.04
|
||||||
|
*!* 5679.99, nu pretd*curs=5680.03 - do_reface rotunjeste intermediar (acelasi tipar ca 3b)
|
||||||
|
DO Assert3 WITH '18-rul_temp.pret dupa curs (astept 5679.99)', pret, 5679.99
|
||||||
|
ELSE
|
||||||
|
pnAsserts = pnAsserts + 2
|
||||||
|
DO DcLog WITH ' FAIL 17/18: nu am gasit articolul ART-A8-371 in rul_temp dupa curs'
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
SELECT introdc
|
||||||
|
LOCATE FOR tip_rand == 'D'
|
||||||
|
IF FOUND()
|
||||||
|
DO DcLog WITH 'randul D dupa curs: suma=' + TRANSFORM(suma)
|
||||||
|
DO Assert3 WITH '19-diferenta D dupa curs (|suma|<=0.02)', ABS(suma), 0
|
||||||
|
ELSE
|
||||||
|
DO DcLog WITH ' INFO 19: nu exista rand D dupa curs - OK'
|
||||||
|
pnAsserts = pnAsserts + 1
|
||||||
|
pnPass = pnPass + 1
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
SELECT introdc
|
||||||
|
LOCATE FOR nract = 101 AND ALLTRIM(fdoc) == 'DVI' AND tip_rand == 'S' AND ALLTRIM(scd) == '371'
|
||||||
|
IF FOUND()
|
||||||
|
DO DcLog WITH 'S doc2 dupa curs: explicatia5=[' + ALLTRIM(NVL(explicatia5,'')) + ']'
|
||||||
|
DO AssertStr WITH '20-explicatia5 S DVI dupa curs (astept 8.60)', ALLTRIM(NVL(explicatia5,'')), '8.60'
|
||||||
|
ELSE
|
||||||
|
pnAsserts = pnAsserts + 1
|
||||||
|
DO DcLog WITH ' FAIL 20: nu am gasit randul S(371) pt explicatia5 dupa curs'
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
LOCAL llValidSume2
|
||||||
|
llValidSume2 = goObj.valideaza_sume()
|
||||||
|
DO DcLog WITH '21-valideaza_sume() dupa curs=' + TRANSFORM(llValidSume2) + ' cmesajsync=[' + ALLTRIM(NVL(goObj.cmesajsync,'')) + ']'
|
||||||
|
pnAsserts = pnAsserts + 1
|
||||||
|
IF llValidSume2 AND EMPTY(ALLTRIM(NVL(goObj.cmesajsync,'')))
|
||||||
|
pnPass = pnPass + 1
|
||||||
|
DO DcLog WITH ' PASS 21-valideaza_sume dupa curs (.T., cmesajsync gol)'
|
||||||
|
ELSE
|
||||||
|
DO DcLog WITH ' FAIL 21-valideaza_sume dupa curs (' + TRANSFORM(llValidSume2) + ', cmesajsync=[' + ALLTRIM(NVL(goObj.cmesajsync,'')) + '])'
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
DO HarnessStep WITH 3, 'curs resincronizare DVI USD: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
|
||||||
|
|
||||||
DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
|
DO DcLog WITH 'REZULTAT: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS'
|
||||||
IF pnPass = pnAsserts
|
IF pnPass = pnAsserts
|
||||||
DO DcLog WITH 'VERDICT FINAL: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
|
DO DcLog WITH 'VERDICT FINAL: PASS (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ')'
|
||||||
@@ -409,7 +505,7 @@ TRY
|
|||||||
DO DcLog WITH 'VERDICT FINAL: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
|
DO DcLog WITH 'VERDICT FINAL: FAIL (' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' assert-uri PASS)'
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
DO HarnessStep WITH 3, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
|
DO HarnessStep WITH 4, 'final: ' + TRANSFORM(pnPass) + '/' + TRANSFORM(pnAsserts) + ' PASS'
|
||||||
DO HarnessDone WITH 'done'
|
DO HarnessDone WITH 'done'
|
||||||
|
|
||||||
CATCH TO loExc
|
CATCH TO loExc
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ $ErrorActionPreference = 'Stop'
|
|||||||
$Teste = $PSScriptRoot
|
$Teste = $PSScriptRoot
|
||||||
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
|
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
|
||||||
-TestPrg (Join-Path $Teste 'test_valuta_dvi_usd.prg') `
|
-TestPrg (Join-Path $Teste 'test_valuta_dvi_usd.prg') `
|
||||||
-Steps @('2documente','articol_adaugat','sync','final') `
|
-Steps @('2documente','articol_adaugat','sync','curs_resync','final') `
|
||||||
-ShotsDir (Join-Path $Teste 'screenshots_valuta_usd') `
|
-ShotsDir (Join-Path $Teste 'screenshots_valuta_usd') `
|
||||||
-SyncDir (Join-Path $Teste 'uisync_valuta_usd') `
|
-SyncDir (Join-Path $Teste 'uisync_valuta_usd') `
|
||||||
-StepTimeoutSec 180 `
|
-StepTimeoutSec 180 `
|
||||||
|
|||||||
Reference in New Issue
Block a user