Files
comun/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

787 lines
30 KiB
Plaintext

* test_s14_neregresie_emitere_noua.prg
* VIZIBIL (grid): proba de neregresie S14 pe calea de EMITERE NOUA (nu editare).
* Secventa: D0 = emitere noua (v1, frm_facturare_articole, tip 1) -> reemitere HEADLESS a lui D0
* (v2, frm_facturare_articole2.do_scrie_factura() apelat direct, ca in test_s9_4_regenerare.prg
* Rularea2) -> D2 = a doua emitere noua (v1, ACELASI proces VFP, fara restart). D1 = documentul
* nascut din reemiterea lui D0.
*
* Risc verificat: pack_facturare.nid_util_fortat/ddataora_fortata sunt variabile de sesiune
* Oracle (PACK_FACTURARE), nu VFP - fortate la reemiterea D0->D1 si curatate simetric in
* do_scrie_factura (ofacturare.vc2, v2). Daca CurataAuditCreareFortat ar lipsi sau ar fi ocolita,
* D2 (scris prin v1, care NU are deloc cod S14 - do_scrie_articole/do_scrie_factura proprii, alta
* zona a fisierului) ar mosteni tacut ID_UTIL/DATAORA fortate de reemiterea anterioara, fiindca
* INSERT-ul din scrie_in_vanzari e comun ambelor forme.
*
* Variabilele de pachet nu sunt selectabile direct din SQL (stare PL/SQL, nu date de tabel) -
* verificarea lor "sunt NULL la final" se face prin efectul observabil: DATAORA lui D2 trebuie sa
* fie proaspata (acum), nu cea transportata la D1 (data crearii lui D0, cu minute in urma).
*
* v1 (D0, D2): traseul si ocolirea din test_s6_1_lista_preturi.prg (incarca_cursor_articole +
* do_adauga_articol(.T.) direct, apoi but_termin1.Click() - FRM_ALTE_DATE condus de driver+timer,
* tehnica identica, copiata din acel fisier).
* v2 (D1): traseul din test_s9_4_regenerare.prg Rularea2 (IncarcaAntetFacturaEditare +
* IncarcaLiniiFacturaEditare + CreeazaSnapshotEditare, o cantitate modificata forteaza ruta 1 =
* regenerare, do_scrie_factura() apelat direct - fara Show(), fara buton, fara modal).
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s14_neregresie_emitere_noua.ps1 (timeout >= 400s)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\test_s14_neregresie_emitere_noua.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC goDriverS14P4, gcClaseVazute, gcSyncDir, gcUILog, gnCantitateAleasa
PUBLIC gcUltimaSerie, gnUltimulNract
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\test_s14_neregresie_emitere_noua.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out"
ENDIF
gcUILog = gcLog
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync_s14p4\"
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcClaseVazute = ";"
gcNumere = ""
gnCantitateAleasa = 2
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
DO HarnessInit
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx
*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8).
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, poSnapshotEditare
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
poSnapshotEditare = NULL
ON ERROR DO S14P4Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO S14P4Log WITH 'EROARE: conectare Oracle esuata'
DO S14P4Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S14P4Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S14P4Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S14P4Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO S14P4Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF !USED('saft_tip_facturi')
CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL)
INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '')
INDEX ON cod TAG cod
ENDIF
PUBLIC gdZiCurs
gdZiCurs = DataCursValid()
DO S14P4Log WITH ' zi_curs folosita pentru toate documentele: ' + DTOC(gdZiCurs)
*-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si
*-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera.
*-- Tehnica validata la S5c/S6-1/S6-5.
goDriverS14P4 = CREATEOBJECT('driverS14P4')
_SCREEN.AddObject('tmrS14P4', 'Timer')
_SCREEN.tmrS14P4.Interval = 200
BINDEVENT(_SCREEN.tmrS14P4, 'Timer', goDriverS14P4, 'Executa')
_SCREEN.tmrS14P4.Enabled = .T.
DO HarnessStep WITH 0, 'env gata', 8
DO S14P4Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE (comune D0 si D2) ====='
IF !AlegeArticole()
DO Assert WITH .F., 'alegerea celor doua articole a esuat - vezi log'
DO S14P4Final
ENDIF
LOCAL lnIdV0, lnIdV1, lnIdV2, lcSer0, lnNr0, lcSer2, lnNr2
LOCAL lnIdUtil0, ldDataora0, lnIdUtilm0, ldDataoram0, llUtilmNul0, llDataoramNul0
LOCAL lnIdUtil1, ldDataora1, lnIdUtilm1, ldDataoram1, llUtilmNul1, llDataoramNul1
LOCAL lnIdUtil2, ldDataora2, lnIdUtilm2, ldDataoram2, llUtilmNul2, llDataoramNul2
STORE 0 TO lnIdV0, lnIdV1, lnIdV2, lnNr0, lnNr2
STORE '' TO lcSer0, lcSer2
DO S14P4Log WITH CHR(13) + CHR(10) + '===== D0: EMITERE NOUA (v1, frm_facturare_articole) ====='
lnIdV0 = EmiteDocNou()
lcSer0 = gcUltimaSerie
lnNr0 = gnUltimulNract
DO Assert WITH lnIdV0 > 0, 'D0 s-a scris (baza pentru reemitere), id_vanzare=' + TRANSFORM(lnIdV0)
IF lnIdV0 <= 0
DO S14P4Final
ENDIF
IF !CitesteAuditVanzare(lnIdV0, @lnIdUtil0, @ldDataora0, @lnIdUtilm0, @ldDataoram0, @llUtilmNul0, @llDataoramNul0)
DO Assert WITH .F., 'D0: citirea auditului (ID_UTIL/DATAORA) a esuat'
DO S14P4Final
ENDIF
DO S14P4Log WITH ' D0 id_vanzare=' + TRANSFORM(lnIdV0) + ' serie=' + lcSer0 + ' nr=' + TRANSFORM(lnNr0) + ;
' id_util=' + TRANSFORM(lnIdUtil0) + ' dataora=' + TTOC(ldDataora0) + ;
' id_utilm_null=' + TRANSFORM(llUtilmNul0) + ' dataoram_null=' + TRANSFORM(llDataoramNul0)
DO Assert WITH llUtilmNul0 AND llDataoramNul0, 'D0 (document nou, fara editare): ID_UTILM/DATAORAM NULL'
DO HarnessStep WITH 1, 'D0 emis', 8
DO S14P4Log WITH CHR(13) + CHR(10) + '===== D1: REEMITERE HEADLESS a lui D0 (v2, do_scrie_factura direct) ====='
lnIdV1 = ReemiteDocument(lnIdV0)
DO Assert WITH lnIdV1 > 0, 'D1 s-a scris (reemiterea lui D0), id_vanzare=' + TRANSFORM(lnIdV1)
IF lnIdV1 <= 0
DO S14P4Final
ENDIF
IF !CitesteAuditVanzare(lnIdV1, @lnIdUtil1, @ldDataora1, @lnIdUtilm1, @ldDataoram1, @llUtilmNul1, @llDataoramNul1)
DO Assert WITH .F., 'D1: citirea auditului (ID_UTIL/DATAORA) a esuat'
DO S14P4Final
ENDIF
DO S14P4Log WITH ' D1 id_vanzare=' + TRANSFORM(lnIdV1) + ' id_util=' + TRANSFORM(lnIdUtil1) + ' dataora=' + TTOC(ldDataora1) + ;
' id_utilm=' + TRANSFORM(lnIdUtilm1) + ' dataoram=' + TTOC(ldDataoram1)
gcCaz = '[D1 reemitere - context, mecanismul S14 e deja probat in raport_s14_vfp_transport.md] '
DO Assert WITH lnIdUtil1 = lnIdUtil0, 'D1 pastreaza ID_UTIL-ul creatiei lui D0, e=' + TRANSFORM(lnIdUtil1) + ' vs ' + TRANSFORM(lnIdUtil0)
DO Assert WITH TTOC(ldDataora1) == TTOC(ldDataora0), 'D1 pastreaza DATAORA creatiei lui D0, e=[' + TTOC(ldDataora1) + '] vs [' + TTOC(ldDataora0) + ']'
DO Assert WITH !llUtilmNul1 AND !llDataoramNul1, 'D1 are perechea de modificare completata (ID_UTILM/DATAORAM)'
gcCaz = ''
DO HarnessStep WITH 2, 'D1 reemis', 8
DO S14P4Log WITH CHR(13) + CHR(10) + '===== D2: A DOUA EMITERE NOUA (v1), IN ACEEASI SESIUNE, IMEDIAT DUPA REEMITERE ====='
lnIdV2 = EmiteDocNou()
lcSer2 = gcUltimaSerie
lnNr2 = gnUltimulNract
DO Assert WITH lnIdV2 > 0, 'D2 s-a scris (emitere noua dupa reemitere), id_vanzare=' + TRANSFORM(lnIdV2)
IF lnIdV2 <= 0
DO S14P4Final
ENDIF
IF !CitesteAuditVanzare(lnIdV2, @lnIdUtil2, @ldDataora2, @lnIdUtilm2, @ldDataoram2, @llUtilmNul2, @llDataoramNul2)
DO Assert WITH .F., 'D2: citirea auditului (ID_UTIL/DATAORA) a esuat'
DO S14P4Final
ENDIF
DO S14P4Log WITH ' D2 id_vanzare=' + TRANSFORM(lnIdV2) + ' serie=' + lcSer2 + ' nr=' + TRANSFORM(lnNr2) + ;
' id_util=' + TRANSFORM(lnIdUtil2) + ' dataora=' + TTOC(ldDataora2) + ;
' id_utilm_null=' + TRANSFORM(llUtilmNul2) + ' dataoram_null=' + TRANSFORM(llDataoramNul2)
*-- discriminatorul de "acum" foloseste DOAR timpul Oracle (ldDataoram1, SYSDATE la reemitere,
*-- cateva secunde inaintea lui D2) - un DATETIME() din VFP ar compara cu ceasul clientului,
*-- care poate fi decalat fata de serverul Oracle (masurat: ~3 ore, nu e o scurgere reala)
gcCaz = '[S14-P4 NEREGRESIE emitere noua dupa reemitere] '
DO Assert WITH lnIdUtil2 = gnIdUtil, 'S14-P4-1 D2.ID_UTIL = utilizatorul curent (' + TRANSFORM(gnIdUtil) + '), e=' + TRANSFORM(lnIdUtil2)
DO Assert WITH ldDataora2 >= ldDataoram1, ;
'S14-P4-2a D2.DATAORA e ulterioara momentului reemiterii (SYSDATE Oracle, nu ceasul clientului), D2=[' + TTOC(ldDataora2) + '] >= reemitere=[' + TTOC(ldDataoram1) + ']'
DO Assert WITH TTOC(ldDataora2) <> TTOC(ldDataora0), ;
'S14-P4-2b D2.DATAORA NU e transportata de la D0/D1 (fortarea nu a scapat pe calea v1), D2=[' + TTOC(ldDataora2) + '] D0/D1=[' + TTOC(ldDataora0) + ']'
DO Assert WITH llUtilmNul2, 'S14-P4-3 D2.ID_UTILM = NULL (nu e reemitere)'
DO Assert WITH llDataoramNul2, 'S14-P4-4 D2.DATAORAM = NULL (nu e reemitere)'
gcCaz = ''
DO S14P4Log WITH CHR(13) + CHR(10) + '===== SECVENTA reemitere -> emitere noua: ' + ;
IIF(lnIdUtil2 = gnIdUtil AND TTOC(ldDataora2) <> TTOC(ldDataora0) AND llUtilmNul2 AND llDataoramNul2, 'PASS', 'FAIL') + ' ====='
DO HarnessStep WITH 3, 'D2 emis si verificat', 8
DO S14P4Final
CATCH TO loExc
DO S14P4Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S14P4Final
ENDTRY
QUIT
*==================================================================================
* Alegerea celor doua articole comune D0/D2: sonda cu incarca_cursor_articole (traseul real de pe
* v1), apoi TOP 2 negestionabile cu pret>0 si cota prezenta in jtva_coloane. Rezultat: crsAleseS14P4.
FUNCTION AlegeArticole
LOCAL loRez, lcStrategie
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loRez = incarca_cursor_articole(1, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(1) a adus articole'
IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO Goleste
RETURN .F.
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
DO Inchide WITH 'crsCandS14P4'
SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ;
WHERE NVL(a.gestionabil,0) = 0 AND NVL(a.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS14P4 READWRITE
lcStrategie = 'negestionabile cu cota in jtva_coloane'
IF RECCOUNT('crsCandS14P4') < 2
DO Inchide WITH 'crsCandS14P4'
SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ;
WHERE NVL(a.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS14P4 READWRITE
lcStrategie = 'orice cu cota in jtva_coloane (gestionabile incluse)'
ENDIF
IF RECCOUNT('crsCandS14P4') < 2
DO Inchide WITH 'crsCandS14P4'
SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS14P4 READWRITE
lcStrategie = 'primele din lista (nicio potrivire de cota)'
ENDIF
DO Inchide WITH 'crsAleseS14P4'
SELECT * FROM crsCandS14P4 WHERE .F. INTO CURSOR crsAleseS14P4 READWRITE
LOCAL lnUltimulId, loRowS14P4
lnUltimulId = -1
SELECT crsCandS14P4
SCAN
IF id_articol <> lnUltimulId
SCATTER MEMO NAME loRowS14P4
INSERT INTO crsAleseS14P4 FROM NAME loRowS14P4
lnUltimulId = id_articol
ENDIF
IF RECCOUNT('crsAleseS14P4') >= 2
EXIT
ENDIF
ENDSCAN
DO Inchide WITH 'crsCandS14P4'
DO Assert WITH RECCOUNT('crsAleseS14P4') = 2, 'doua articole DISTINCTE alese, e=' + TRANSFORM(RECCOUNT('crsAleseS14P4'))
DO S14P4Log WITH ' strategie: ' + lcStrategie
SELECT crsAleseS14P4
SCAN
DO S14P4Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ;
'] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0))
ENDSCAN
DO Inchide WITH 'crsarticole'
DO Goleste
RETURN (RECCOUNT('crsAleseS14P4') = 2)
ENDFUNC
*==================================================================================
* Emitere noua reala prin v1 (frm_facturare_articole), tip 1 - traseul si ocolirea din
* test_s6_1_lista_preturi.prg (EmiteV1): incarca_cursor_articole() inainte de formular, candidatii
* restransi la crsAleseS14P4, do_adauga_articol(.T.) direct, but_termin1.Click() (FRM_ALTE_DATE
* condus de driver+timer).
FUNCTION EmiteDocNou
LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[emitere-noua] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S14P4Log WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loRez = incarca_cursor_articole(1, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'incarca_cursor_articole a adus articole'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN 0
ENDIF
USE IN crsarticole
SELECT * FROM crsAleseS14P4 INTO CURSOR crsarticole READWRITE
DO Assert WITH RECCOUNT('crsarticole') = 2, 'cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole'))
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'Createobject frm_facturare_articole'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'butonul Adauga duce la do_urmator'
DO Assert WITH oform.but_urmator1.Visible, 'butonul Adauga e VIZIBIL pentru tip 1'
FOR lnI = 1 TO RECCOUNT('crsarticole')
SELECT crsarticole
GO lnI
oform.do_adauga_articol(.T.)
ENDFOR
DOEVENTS FORCE
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO Assert WITH lnFact = 2, 'crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S14P4Log WITH ' [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S14P4Log WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S14P4Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = NVL(poDate.nid_vanzare, 0)
DO Assert WITH lnIdVz > 0, 'documentul exista (poDate.nid_vanzare, parametru OUT), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Reemiterea headless a unui document existent prin v2 (frm_facturare_articole2), traseul din
* test_s9_4_regenerare.prg Rularea2: incarca antet+linii, modifica o cantitate (forteaza ruta 1 =
* regenerare), do_scrie_factura() apelat direct - fara Show(), fara buton, fara modal.
FUNCTION ReemiteDocument
LPARAMETERS tnIdVechi
LOCAL lnCod, lnAn, lnLuna, lnIdFactVechi, lnDiscRon, lnDiscVal, loForm, llRez, lnIdVNou, lnRuta
gcCaz = '[reemitere] '
lnCod = 0
lnAn = 0
lnLuna = 0
lnIdFactVechi = 0
IF USED('crsAntetS14P4')
USE IN crsAntetS14P4
ENDIF
IF goExecutor.oExecuta([select cod, id_fact, extract(year from data_act) an, extract(month from data_act) luna ] + ;
[from vanzari where id_vanzare = ] + TRANSFORM(NVL(tnIdVechi,0)), 'crsAntetS14P4')
IF RECCOUNT('crsAntetS14P4') > 0
SELECT crsAntetS14P4
GO TOP
lnCod = NVL(cod, 0)
lnIdFactVechi = NVL(id_fact, 0)
lnAn = NVL(an, 0)
lnLuna = NVL(luna, 0)
ENDIF
USE IN crsAntetS14P4
ENDIF
DO Assert WITH lnCod > 0 AND lnAn > 0 AND lnLuna > 0, 'antetul lui D0 s-a citit (cod/an/luna), cod=' + TRANSFORM(lnCod)
IF lnCod <= 0
RETURN 0
ENDIF
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdVechi, @lnDiscRon, @lnDiscVal)
DO Assert WITH VARTYPE(poDate) = 'O', 'antetul lui D0 s-a incarcat pentru editare'
IF VARTYPE(poDate) <> 'O'
RETURN 0
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdVechi)
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, 'liniile lui D0 s-au incarcat in crsfactura'
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN 0
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', 'Createobject frm_facturare_articole2 (fara Show)'
IF VARTYPE(loForm) <> 'O'
RETURN 0
ENDIF
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, tnIdVechi, lnIdFactVechi, lnCod, lnAn, lnLuna)
DO Assert WITH VARTYPE(poSnapshotEditare) = 'O', 'instantaneul de editare s-a creat'
IF VARTYPE(poSnapshotEditare) <> 'O'
TRY
loForm.Release()
CATCH
ENDTRY
RETURN 0
ENDIF
*-- modificare de cantitate: singura schimbare care forteaza ruta 1 (regenerare)
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
DO Assert WITH lnRuta = 1, 'ruta aleasa pentru modificarea de cantitate este 1 (regenerare), e=' + TRANSFORM(lnRuta)
IF lnRuta <> 1
TRY
loForm.Release()
CATCH
ENDTRY
RETURN 0
ENDIF
llRez = loForm.do_scrie_factura()
DO Assert WITH llRez, 'do_scrie_factura() a intors .T. pentru reemitere'
lnIdVNou = 0
IF llRez
lnIdVNou = NVL(poDate.nid_vanzare, 0)
ENDIF
DO Assert WITH lnIdVNou > 0, 'poDate.nid_vanzare (OUT) a iesit cu id-ul documentului nou, e=' + TRANSFORM(lnIdVNou)
TRY
loForm.Release()
CATCH
ENDTRY
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crsarticole_doc'
DO Inchide WITH 'crsarticole_editare'
DO Inchide WITH 'snap_linii_editare'
DO Inchide WITH 'jtva_coloane'
poSnapshotEditare = NULL
DO Goleste
gcCaz = ''
RETURN lnIdVNou
ENDFUNC
*==================================================================================
* Citeste ID_UTIL/DATAORA/ID_UTILM/DATAORAM pentru un id_vanzare, plus flag-uri NULL distincte
* (0/{} nu s-ar distinge de o valoare reala lipsa).
FUNCTION CitesteAuditVanzare
LPARAMETERS tnIdVanzare, tnIdUtil, tdDataora, tnIdUtilm, tdDataoram, tlUtilmNul, tlDataoramNul
tnIdUtil = 0
tdDataora = {}
tnIdUtilm = 0
tdDataoram = {}
tlUtilmNul = .F.
tlDataoramNul = .F.
LOCAL llOk
llOk = .F.
IF USED('crsAuditS14P4')
USE IN crsAuditS14P4
ENDIF
IF goExecutor.oExecuta([select id_util, dataora, id_utilm, dataoram, ] + ;
[case when id_utilm is null then 1 else 0 end as utilmnul, ] + ;
[case when dataoram is null then 1 else 0 end as dataoramnul ] + ;
[from vanzari where id_vanzare = ] + TRANSFORM(NVL(tnIdVanzare,0)), 'crsAuditS14P4')
IF RECCOUNT('crsAuditS14P4') > 0
SELECT crsAuditS14P4
GO TOP
tnIdUtil = NVL(id_util, 0)
tdDataora = NVL(dataora, {})
tnIdUtilm = NVL(id_utilm, 0)
tdDataoram = NVL(dataoram, {})
tlUtilmNul = (utilmnul = 1)
tlDataoramNul = (dataoramnul = 1)
llOk = (tnIdUtil > 0)
ENDIF
USE IN crsAuditS14P4
ENDIF
RETURN llOk
ENDFUNC
*==================================================================================
* Seteaza cantitatea (zeroita de do_initializeaza_articol pentru tip 1) pe toate liniile din
* crsfactura si recalculeaza linia, ca la S5c/S6-1.
PROCEDURE SeteazaCantitati
LPARAMETERS tcAlias
LOCAL loArt
SELECT (tcAlias)
SCAN
REPLACE cantitate WITH gnCantitateAleasa
SCATTER NAME loArt MEMO
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
ENDSCAN
ENDPROC
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticoleSel'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
* ultima zi din luna deschisa acoperita de VCURS pentru EURO - cursor_preturi refuza o zi fara curs
FUNCTION DataCursValid
LOCAL ldRez, lcSql, lnQ, lcUltima
ldRez = DATE(gnAn, gnLuna, 1)
lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01'
IF USED('crscurszi')
USE IN crscurszi
ENDIF
lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ;
[where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))]
lnQ = goExecutor.oExecute(lcSql, 'crscurszi')
IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0
GO TOP IN crscurszi
IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8
ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4))
ENDIF
ELSE
DO S14P4Log WITH ' DataCursValid ESEC: ' + goExecutor.oPrelucrareEroare()
ENDIF
IF USED('crscurszi')
USE IN crscurszi
ENDIF
RETURN ldRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S14P4Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S14P4Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S14P4Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S14P4Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S14P4Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S14P4Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS14P4') = 'O'
_SCREEN.tmrS14P4.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS14P4')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata),
*-- deci se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
*-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si
*-- care e ARS (alocat si nescris)
TRY
IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ;
[where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 750 order by numar_act], 'crsNrSSS') >= 0
DO S14P4Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-750):'
SELECT crsNrSSS
SCAN
DO S14P4Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S14P4Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S14P4Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S14P4Log WITH 'END ' + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC
*==================================================================================
* driverS14P4: apasa automat pe formele modale care nu trec prin functia amessagebox -
* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release).
DEFINE CLASS driverS14P4 AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS14P4') = 'O'
_SCREEN.tmrS14P4.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S14P4Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S14P4Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S14P4Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S14P4Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S14P4Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S14P4Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ')'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S14P4Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S14P4Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS14P4') = 'O'
_SCREEN.tmrS14P4.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE