Files
comun/utile/Teste/efactura_import/test_repro_gridprefs_cales.prg
Marius Mutu 940bb39701 Import eFactura in lot: borderou cu ce lipseste, coada de contabilizare, alegerea contului
Borderoul tine per factura ce mai are de completat si daca are articole de gestiune
(camp gest, coloana si filtru), coada contabilizeaza in serie facturile bifate si
incheie cu un rezumat, iar contul de furnizor/client se alege din planul de conturi.
Cheia normalizata de articol, rezolvarea automata a partenerului si anularea in bloc
intra tot aici. Pozitia in lista se pastreaza peste reaplicarea filtrului.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Aroafxp4z8bmM5oVECZRXY
2026-09-09 22:06:48 +03:00

155 lines
7.5 KiB
Plaintext

* test_repro_gridprefs_cales.prg
* Reproducere IZOLATA (fara Oracle, fara formularul real - instanta ROA_CENTRAL plina, vezi
* COMUN\docs\progres.md) a capcanei GridExtras (COMUN\utile\GridExtras\gridextras.vc2,
* restoregridpreferences ~1051-1080) pe grdFacturi din frm_import_efactura
* (COMUN\clase\anaf_efactura.vc2): un grid de test cu 5 coloane in ACELEASI pozitii relative ca
* in clasa reala (cAles=Columns(1), cSemafor=Columns(ColumnCount), la fel ca in grdFacturi -
* vezi COMUN\clase\anaf_efactura.vc2:10600 si :10814) + un gridprefs.tmp vechi (3 coloane,
* salvat inainte ca ultimele doua sa existe). Corpul lui restoregridpreferences si blocul de
* garda de azi (Init, anaf_efactura.vc2:13904-13916) sunt copiate LITERAL aici (nu reimplementate),
* aplicate pe grid-ul de test in loc de pe formularul real, ca sa masoare mecanismul fara sa
* atinga Oracle.
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_repro_gridprefs_cales.ps1
SET SAFETY OFF
SET TALK OFF
CLOSE DATABASES ALL
PUBLIC gcUILog, gnPass, gnFail
gcUILog = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\test_repro_gridprefs_cales_log.txt'
gnPass = 0
gnFail = 0
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
ON ERROR DO TErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
* cursor local, fara Oracle - grid-ul de test nu are nevoie de campuri reale (coloanele sunt
* ADD OBJECT/redenumite manual, ca in clasa reala)
CREATE CURSOR crsTest (id I)
loForm = CREATEOBJECT('Form')
loForm.AddObject('grd1', 'grid')
loForm.grd1.RecordSourceType = 1
loForm.grd1.RecordSource = 'crsTest'
loForm.grd1.ColumnCount = 5
loForm.grd1.Columns(1).Name = 'cAles'
loForm.grd1.Columns(2).Name = 'cB'
loForm.grd1.Columns(3).Name = 'cC'
loForm.grd1.Columns(4).Name = 'cD'
loForm.grd1.Columns(5).Name = 'cSemafor'
* latimea implicita din clasa reala pentru cAles (COMUN\clase\anaf_efactura.vc2:10603) - 26
loForm.grd1.cAles.Width = 26
DO TLog WITH 'BASELINE ColumnOrder inainte de restore: cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder)
lcPrefFile = ADDBS(SYS(2023)) + 'test_repro_gridprefs_cales_prefs.tmp'
IF FILE(m.lcPrefFile)
DELETE FILE (m.lcPrefFile)
ENDIF
lcKey = SYS(1272, loForm.grd1)
DO TLog WITH 'lcKey=' + m.lcKey
* ---------- gridprefs.tmp vechi: 3 coloane, salvate inainte ca ultimele doua (cD/cSemafor)
* sa existe. Pozitia 1 = cAles (ColumnOrder=1, Width=26 - identic cu azi, cAles a existat
* dintotdeauna primul in grdFacturi) ----------
lcOldPrefs = '1,26,2,90,3,60,'
STRTOFILE(m.lcKey + '(' + m.lcOldPrefs + ')' + CHR(13) + CHR(10), m.lcPrefFile, 0)
DO TLog WITH 'gridprefs vechi (3 coloane): ' + m.lcOldPrefs
* ---------- restoregridpreferences, copiat LITERAL din gridextras.vc2:1058-1077 ----------
Local lcPrefFileContents, lcGridHierarchy, lcPrefs, lcBeginPrefs, lcEndPrefs, loColumn, lnCounter, lnMax, loExc as Exception
Local Array laPrefs(1)
m.lcPrefFileContents = ""
If File(m.lcPrefFile)
Try
m.lcPrefFileContents = Filetostr(m.lcPrefFile)
m.lcGridHierarchy = Sys(1272, loForm.grd1)
m.lcBeginPrefs = m.lcGridHierarchy + "("
m.lcEndPrefs = ")"
m.lcPrefs = Strextract(m.lcPrefFileContents,m.lcBeginPrefs,m.lcEndPrefs,1,1)
If !Empty(m.lcPrefs)
=Alines(laPrefs, m.lcPrefs, 7, ",")
m.lnMax = Min(loForm.grd1.ColumnCount * 2, Alen(laPrefs))
For m.lnCounter = 1 To m.lnMax Step 2
m.loColumn = loForm.grd1.Columns((m.lnCounter + 1)/2)
If Type("m.loColumn.columnorder") = "N"
m.loColumn.ColumnOrder = Val(laPrefs(m.lnCounter))
m.loColumn.Width = Val(laPrefs(m.lnCounter + 1))
Endif
Endfor
Endif
CATCH TO m.loExc
DO TLog WITH 'EXCEPTIE restoregridpreferences: ' + m.loExc.Message + ' | lnMax=' + TRANSFORM(m.lnMax) + ' Alen(laPrefs)=' + TRANSFORM(Alen(laPrefs)) + ' lnCounter=' + TRANSFORM(m.lnCounter)
Endtry
ENDIF
DO TLog WITH 'DUPA restoregridpreferences (toate): cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cAles.Width) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cB.Width) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cC.Width) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cD.Width) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder) + '/' + TRANSFORM(loForm.grd1.cSemafor.Width)
* ---------- blocul de garda EXISTENT azi in Init (anaf_efactura.vc2:13904-13916), copiat
* literal, aplicat pe grid-ul de test ----------
Local lcPrefFileContentsSem, lcKeySem, lcPrefsSem
Local Array laPrefsSem(1)
lcPrefFileContentsSem = ""
If File(m.lcPrefFile)
lcPrefFileContentsSem = Filetostr(m.lcPrefFile)
Endif
lcKeySem = Sys(1272, loForm.grd1) + "("
lcPrefsSem = Strextract(m.lcPrefFileContentsSem, m.lcKeySem, ")", 1, 1)
IF Empty(m.lcPrefsSem) Or Alines(laPrefsSem, m.lcPrefsSem, 7, ",") < loForm.grd1.ColumnCount * 2
loForm.grd1.cSemafor.ColumnOrder = 1
ENDIF
DO TLog WITH 'DUPA garda (toate coloanele): cAles=' + TRANSFORM(loForm.grd1.cAles.ColumnOrder) + ' cB=' + TRANSFORM(loForm.grd1.cB.ColumnOrder) + ' cC=' + TRANSFORM(loForm.grd1.cC.ColumnOrder) + ' cD=' + TRANSFORM(loForm.grd1.cD.ColumnOrder) + ' cSemafor=' + TRANSFORM(loForm.grd1.cSemafor.ColumnOrder)
lnOrdAles = loForm.grd1.cAles.ColumnOrder
lnWidAles = loForm.grd1.cAles.Width
lnOrdSem = loForm.grd1.cSemafor.ColumnOrder
lnWidSem = loForm.grd1.cSemafor.Width
DO TLog WITH 'MASURAT dupa garda EXISTENTA (doar cSemafor tratat): cAles.ColumnOrder=' + TRANSFORM(lnOrdAles) + ' cAles.Width=' + TRANSFORM(lnWidAles) + ' | cSemafor.ColumnOrder=' + TRANSFORM(lnOrdSem) + ' cSemafor.Width=' + TRANSFORM(lnWidSem)
DO TVerdict WITH lnWidAles > 0, 'A1 cAles.Width > 0 (coloana nu e latime 0)', TRANSFORM(lnWidAles)
DO TVerdict WITH lnOrdSem = 1, 'A2 cSemafor.ColumnOrder = 1 (garda existenta)', TRANSFORM(lnOrdSem)
DO TVerdict WITH lnOrdAles = loForm.grd1.ColumnCount, 'A3 BUG: cAles ajunge ULTIMA coloana (ColumnOrder=ColumnCount) - ColumnOrder e swap, nu set brut: cSemafor.ColumnOrder=1 ii ia locul lui cAles si il trimite la coada', 'cAles=' + TRANSFORM(lnOrdAles) + ' ColumnCount=' + TRANSFORM(loForm.grd1.ColumnCount)
* ---------- CAZ B: reparare - aceeasi garda, plus o linie care repozitioneaza cAles pe 2 ----------
loForm.grd1.cAles.ColumnOrder = 2
lnOrdAlesFix = loForm.grd1.cAles.ColumnOrder
lnOrdSemFix = loForm.grd1.cSemafor.ColumnOrder
DO TLog WITH 'CAZ B (dupa reparare, +cAles.ColumnOrder=2): cAles=' + TRANSFORM(lnOrdAlesFix) + ' cSemafor=' + TRANSFORM(lnOrdSemFix)
DO TVerdict WITH lnOrdSemFix = 1, 'B1 cSemafor.ColumnOrder = 1 dupa reparare', TRANSFORM(lnOrdSemFix)
DO TVerdict WITH lnOrdAlesFix = 2, 'B2 cAles.ColumnOrder = 2 dupa reparare', TRANSFORM(lnOrdAlesFix)
loForm.Release()
IF FILE(m.lcPrefFile)
DELETE FILE (m.lcPrefFile)
ENDIF
IF USED('crsTest')
USE IN crsTest
ENDIF
DO TLog WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
QUIT
***********************
PROCEDURE TLog
LPARAMETERS tcMsg
STRTOFILE(TTOC(DATETIME()) + ' ' + tcMsg + CHR(13) + CHR(10), gcUILog, 1)
ENDPROC
***********************
PROCEDURE TVerdict
LPARAMETERS tlOk, tcNume, tcDetalii
IF tlOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO TLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume + ' | ' + TRANSFORM(tcDetalii)
ENDPROC
***********************
PROCEDURE TErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
DO TLog WITH 'EROARE ' + TRANSFORM(tnError) + ' [' + TRANSFORM(tcMessage) + '] in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLine)
ENDPROC