* 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