* test_s9_3_stergere.prg * Proba S9-3 (docs\propunere_s9_stergere_reemitere.md, sectiunea 3) - StergeDocumentFacturare * (ofacturare_rutare_scriere.prg), piciorul de stergere extras din ofacturare_comun.vc2:4837-4977. * * SCRIE IN ORACLE: alege singur, la rulare, un document eligibil (STERS=0, in perioada gnAn/gnLuna * activa din calendar, fara referinte incasari/plati, fara urmasi, cu randuri reale in vact_tot/ * vrul_tot - ca sa probeze reversarea de stoc) si il sterge definitiv (soft-delete). Nu reemite. * Zero numere SSS consumate. Trei rulari distincte ale acestui script sterg trei documente diferite * (fiecare candidat ales e exclus de urmatoarea rulare, fiindca STERS a devenit 1). * * Documente EXCLUSE explicit (folosite de alte suite / DATA_ACT alterata): * 1047, 1048, 1055, 1130 (test_s8b_rutare_scriere / test_s9_1_2_listaid_snapshot) * 1113 (DATA_ACT alterata, iese din luna curenta) LPARAMETERS tnForceAn, tnForceLuna *!* tnForceAn/tnForceLuna optionale: forteaza perioada activa gnAn/gnLuna (test_init_env_auto_ *!* roafacturare accepta tnAn/tnLuna) - folosit doar cand luna curenta reala e epuizata de candidati *!* eligibili (STERS=0 + randuri reale vact_tot/vrul_tot + fara referinte/urmasi); alege un document *!* real din acea perioada, nu ocoleste nicio garda a functiei testate SET SAFETY OFF SET TALK OFF PUBLIC gcErrLog gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_3_stergere_log_' + ; STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', tnForceAn, tnForceLuna IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) QUIT ENDIF gnIdUtil = 8 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 PUBLIC gnPass, gnFail gnPass = 0 gnFail = 0 DO RuleazaS93 STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT PROCEDURE RuleazaS93 STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) *!* --- alege un candidat eligibil: STERS=0, in perioada activa, cu randuri reale in vact_tot SI vrul_tot *!* (vact_tot singur nu garanteaza randuri de stoc - articolele pot fi negestionabile) --- LOCAL lcSqlCand, lcExclusi *!* documentele-martor ale celorlalte teste din suita: le sterge o singura data si raman *!* rosii pana la rularea scriptului de regenerare (docs\wip13_2026_09_05_04_COMUN_FIXTURI_TEST) lcExclusi = [1047,1048,1049,1050,1055,1071,1072,1113,1125,1126,1128,1129,1130,1160] lcSqlCand = [select v.id_vanzare, v.cod, v.tip, v.data_act from vanzari v ] + ; [where v.sters = 0 and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ; [ and v.id_vanzare not in (] + lcExclusi + [) ] + ; [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; [ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ; [ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) ] + ; [order by v.id_vanzare] IF USED('v_candidati_s93') USE IN v_candidati_s93 ENDIF LOCAL lnSuccesCand lnSuccesCand = goExecutor.oExecuta(lcSqlCand, 'v_candidati_s93') DO asserteaza WITH 'interogarea de candidati a reusit', m.lnSuccesCand, TRANSFORM(m.lnSuccesCand) IF !m.lnSuccesCand RETURN ENDIF LOCAL lnIdVanzareAles, lnCodAles, lnTipAles, lnAnAles, lnLunaAles lnIdVanzareAles = 0 SELECT v_candidati_s93 SCAN lnIdVanzareAles = id_vanzare lnCodAles = cod lnTipAles = tip lnAnAles = YEAR(data_act) lnLunaAles = MONTH(data_act) *!* excludem candidatii cu referinte incasari/plati sau cu urmasi - garzile pe care do_sterge/ *!* editarea le fac deja INAINTE de piciorul de stergere, nu fac parte din functia extrasa IF !ReferinteDocumenteNota(lnAnAles, lnLunaAles, lnCodAles) AND !DocumentAreUrmasi(lnIdVanzareAles) EXIT ENDIF lnIdVanzareAles = 0 ENDSCAN USE IN v_candidati_s93 DO asserteaza WITH 'exista un candidat eligibil (fara referinte, fara urmasi)', m.lnIdVanzareAles > 0, TRANSFORM(m.lnIdVanzareAles) IF m.lnIdVanzareAles = 0 RETURN ENDIF STRTOFILE('candidat ales: id_vanzare=' + TRANSFORM(lnIdVanzareAles) + ' cod=' + TRANSFORM(lnCodAles) + ; ' tip=' + TRANSFORM(lnTipAles) + ' an=' + TRANSFORM(lnAnAles) + ' luna=' + TRANSFORM(lnLunaAles) + CHR(13) + CHR(10), gcErrLog, 1) *!* --- stare INAINTE --- LOCAL lnStersInainte, lnRulInainte lnStersInainte = -1 lnRulInainte = -1 goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdVanzareAles), @lnStersInainte) DO asserteaza WITH 'INAINTE: documentul ales nu e deja sters', m.lnStersInainte == 0, TRANSFORM(m.lnStersInainte) goExecutor.oSelecteaza2Value([select count(*) as nr from rul where sters = 0 and an = ] + TRANSFORM(lnAnAles) + ; [ and luna = ] + TRANSFORM(lnLunaAles) + [ and cod = ] + TRANSFORM(lnCodAles), @lnRulInainte) STRTOFILE('INAINTE: vanzari.sters=' + TRANSFORM(lnStersInainte) + ' rul sters=0 count=' + TRANSFORM(lnRulInainte) + CHR(13) + CHR(10), gcErrLog, 1) DO asserteaza WITH 'INAINTE: exista randuri RUL nesterse de reversat (precondite candidat)', m.lnRulInainte > 0, TRANSFORM(m.lnRulInainte) IF m.lnRulInainte <= 0 RETURN ENDIF *!* --- executa piciorul de stergere --- LOCAL llRezultat llRezultat = StergeDocumentFacturare(m.lnIdVanzareAles, m.lnCodAles, m.lnAnAles, m.lnLunaAles, 8) DO asserteaza WITH 'StergeDocumentFacturare a intors .T.', m.llRezultat, TRANSFORM(m.llRezultat) *!* --- stare DUPA: VANZARI.STERS=1 si RUL marcat STERS=1 (dovada reversarii de stoc) --- LOCAL lnStersDupa, lnRulRamasNesters lnStersDupa = -1 lnRulRamasNesters = -1 goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdVanzareAles), @lnStersDupa) goExecutor.oSelecteaza2Value([select count(*) as nr from rul where sters = 0 and an = ] + TRANSFORM(lnAnAles) + ; [ and luna = ] + TRANSFORM(lnLunaAles) + [ and cod = ] + TRANSFORM(lnCodAles), @lnRulRamasNesters) STRTOFILE('DUPA: vanzari.sters=' + TRANSFORM(lnStersDupa) + ' rul sters=0 count=' + TRANSFORM(lnRulRamasNesters) + CHR(13) + CHR(10), gcErrLog, 1) DO asserteaza WITH 'DUPA: vanzari.sters = 1', m.lnStersDupa == 1, TRANSFORM(m.lnStersDupa) DO asserteaza WITH 'DUPA: toate randurile RUL ale documentului sunt sters=1 (reversare stoc probata)', m.lnRulRamasNesters == 0, TRANSFORM(m.lnRulRamasNesters) ENDPROC PROCEDURE asserteaza LPARAMETERS tcNume, tlConditie, tcValoare IF m.tlConditie gnPass = gnPass + 1 STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) ELSE gnFail = gnFail + 1 STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) ENDIF ENDPROC PROCEDURE test_error_handler LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) ENDPROC