* test_s9_8_flux.prg * Proba S9-8 (docs\propunere_s9_stergere_reemitere.md:115): testul de flux. Reemitere IDENTICA + * reemitere CU MODIFICARI, pe cate un document din fiecare familie de dispecerizare a scrierii * (ofacturare.vc2:20171,20214,20249): AVIZ (tip=4), COMANDA (tip in 3,21,25,28,42,47), CONTRACT * (tip in 2,6,26,52), ELSE (restul - aici tip=-3). Depinde de S9-1..S9-7, toate probate. * * Foloseste acelasi driver ca test_s9_7_cablare_idfact.prg (IncarcaAntetFacturaEditare + * IncarcaLiniiFacturaEditare + do_scrie_factura() REAL, fara nicio fortare manuala si fara * glRegenerareEditare - fortarea ID_FACT o face automat cablajul S9-7). Diferenta: scenariul A * (identica) NU modifica nimic pe crsfactura inainte de apel; scenariul B (modificata) creste * cantitatea primei linii cu 1, ca in test_s9_7. * * CONSTATARE, verificata pe cod (ofacturare_rutare_scriere.prg:69-95) inainte de a scrie probele * de mai jos: AlegeRutaScriereEditare intoarce ruta 1 (regenerare = sterge+reemite) NUMAI cand * LiniiAuSumeSchimbate() gaseste o diferenta reala fata de instantaneu (cantitate/pret/discount/ * tva/gestiune/lot/serie sau discountul de document). O salvare FARA nicio modificare nu trece * niciodata prin sterge+reemite - ea cade pe ruta 0 (nimic), exact ca a doua chemare din D3 * (test_s9_7 P5). Deci scenariul A ("reemitere identica") NU produce un rand DOCUMENTE "STERS * revenit la 0" prin fluxul normal de editare - documentul original ramane pur si simplu neatins. * Testat mai jos ca atare (ruta 0 confirmata, nimic scris), nu fortat artificial pe ruta 1. * * Parametru tnRulare: * 0 = DESCOPERIRE (read-only, nu scrie nimic) - lista candidati vii pe fiecare familie, pentru * alegerea documentelor de mai jos. Nu face parte din sweep-ul de proba. * 1 = AVIZ A (identica) doc 1118 (DATA_ACT 2026/8 - coincide cu perioada implicita) * 2 = AVIZ B (modificata) doc 1189 (DATA_ACT 2026/8 - coincide cu perioada implicita; * lantul 1119 -> 1180 -> 1182 -> 1184 -> 1186 -> 1189, fiecare rulare B isi consuma documentul) * 3 = COMANDA A (identica) doc 306 * 4 = COMANDA B (modificata) doc 1188 (DATA_ACT 2014/1 - necesita tnForceAn=2014, * tnForceLuna=1; doc 146 initial ales a picat cu ORA-01400 chiar cu perioada implicita, * pastrat in raport ca prima dovada a CONSTATARII a doua) * 5 = CONTRACT A (identica) doc 630 * 6 = CONTRACT B (modificata) doc 1191 (DATA_ACT 2024/7 - necesita tnForceAn=2024, * tnForceLuna=7; lantul 992 -> 1191, fiecare rulare B isi consuma documentul; * doc 1192 e rezerva echivalenta, din lantul 870 -> 1192) * 7 = ELSE A (identica) doc 372 (tip -3) * 8 = ELSE B (modificata) doc 1190 (tip 1, DATA_ACT 2014/1 - necesita tnForceAn=2014, * tnForceLuna=1; lantul 580 -> 1172 -> 1181 -> 1183 -> 1185 -> 1187 -> 1190, fiecare rulare B isi consuma documentul) * * Scenariul A verifica: ruta aleasa e 0 (nimic), niciun document nou, iar documentul ORIGINAL * ramane neatins (ID_FACT/serie/numar/total/STERS/ID_UTIL/DATAORA identice) - vezi CONSTATAREA * de mai sus. Scenariul B verifica: ruta 1, ID_FACT pastrat pe documentul NOU, serie/numar * identice (identitatea de act), randul DOCUMENTE reinviat (STERS revenit la 0), ID_UTIL/DATAORA * initiale (auditul de creare nu se rescrie), TOTAL_CU_TVA schimbat (modificarea a ajuns in * Oracle) si legatura cu sursa (AVIZ: VANZARI_CORESP tip=1; COMANDA/CONTRACT: * FACT_VFACTURI.id_comanda/id_ctr) pastrata pe documentul NOU. * * Documente alese prin interogare directa (sqlplus, citite, nu scrise) pe MARIUSM_AUTO, apoi * verificate ca nu apar in niciun alt fisier din COMUN\utile\Teste (grep pe numar exact) - vezi * raportul S9-8 pentru lista completa cercetata si motivul alegerii fiecarui id. * * CONSTATARE (a doua): rularea 4 pe doc 146 (id_facturare NULL) A DAT ORA-01400 "cannot insert * NULL into ACT_TEMP.ID_FDOC" (PACK_FACTURARE, linia ~11315, din 6309/5006) - dar acelasi * ORA-01400 a reaparut IDENTIC si pe doc 631 (id_facturare=523, NENULL!) - deci NU e despre * id_facturare. Cauza reala, confirmata pe codul test_s9_3_stergere.prg:15-17,61-67: candidatii * eligibili pentru stergere/reemitere sunt filtrati explicit "extract(year/month from data_act) = * gnAn/gnLuna" - mecanismul S9 (ACT_TEMP/VACT_TOT/VRUL_TOT) e SCOPAT pe perioada activa. Toate * documentele COMANDA/CONTRACT/ELSE gasite initial sunt din 2008-2015, in afara perioadei active * (gnAn/gnLuna, azi 2026/8) - de-asta pica orice document mai vechi, indiferent de familie sau de * id_facturare. Solutia (tiparul test_s9_3): tnForceAn/tnForceLuna, LPARAMETERS suplimentare care * forteaza perioada activa sa coincida cu DATA_ACT a documentului tintit - vezi mai jos. * CONSTATARE (a treia): familia CONTRACT nu e uniforma. Documentele CONTRACT ale caror linii * au VANZARI_DETALII.ID_RATA <> 0 cad la reemitere cu "Too many columns." (VFP 1872), pentru * ca PACK_FACTURARE body 5055-5058 le trimite prin contabilizeaza_rata - ramura pe care nicio * alta familie n-o atinge. Documentele CONTRACT fara linii de rata trec (992, 870: 13/0). * Docs 360 si 1055 sunt documente cu rata si raman datorie deschisa - docs/raport_contract_b.md. *!* tnForceAn/tnForceLuna optionale (tiparul test_s9_3_stergere.prg:15-17): forteaza perioada *!* activa gnAn/gnLuna sa coincida cu DATA_ACT a documentului tintit de scenariul B - necesar *!* pentru COMANDA/CONTRACT/ELSE (vezi CONSTATAREA a doua); scenariile A si AVIZ nu au nevoie *!* (A nu scrie nimic, AVIZ nu foloseste ACT_TEMP scopat pe perioada) LPARAMETERS tnRulare, tnForceAn, tnForceLuna, tnIdFirma SET SAFETY OFF SET TALK OFF PUBLIC gcErrLog, gnPass, gnFail PUBLIC poDate, poSnapshotEditare, goFormReemitere gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_8_flux_log_' + ; STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog) ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT *!* tnForceAn/tnForceLuna sosesc ca STRING cand vin din linia de comanda vfp9.exe (nu din DO...WITH *!* intern) - VAL() le converteste; VAL('') = 0, iar EMPTY(0) e .T. in test_init_env_auto_..., deci *!* neforsat cade corect pe YEAR(DATE())/MONTH(DATE()) DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', VAL(TRANSFORM(tnForceAn)), VAL(TRANSFORM(tnForceLuna)), VAL(TRANSFORM(tnIdFirma)) 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 *!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul LOCAL lcProcExistent lcProcExistent = SET("PROCEDURE") SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent *!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza LOCAL lcPathVechi, lcPathNou lcPathVechi = SET("PATH") lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi SET PATH TO &lcPathNou PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip gnMockRaspuns = 7 gcMockUltimMesaj = '' gnMockUltimTip = 0 gnPass = 0 gnFail = 0 STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) LOCAL lnRulare lnRulare = VAL(TRANSFORM(tnRulare)) STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1) DO CASE CASE lnRulare = 0 DO Descoperire CASE lnRulare = 1 DO ProbaScenariu WITH 1118, 'AVIZ', .F., 'AVIZ-A' CASE lnRulare = 2 DO ProbaScenariu WITH 1189, 'AVIZ', .T., 'AVIZ-B' CASE lnRulare = 3 DO ProbaScenariu WITH 306, 'COMANDA', .F., 'COM-A' CASE lnRulare = 4 DO ProbaScenariu WITH 1188, 'COMANDA', .T., 'COM-B' CASE lnRulare = 5 DO ProbaScenariu WITH 630, 'CONTRACT', .F., 'CTR-A' CASE lnRulare = 6 DO ProbaScenariu WITH 1191, 'CONTRACT', .T., 'CTR-B' CASE lnRulare = 7 DO ProbaScenariu WITH 372, 'ELSE', .F., 'ELSE-A' CASE lnRulare = 8 DO ProbaScenariu WITH 1190, 'ELSE', .T., 'ELSE-B' OTHERWISE STRTOFILE('EROARE: tnRulare trebuie sa fie intre 0 si 8' + CHR(13) + CHR(10), gcErrLog, 1) ENDCASE 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 *============================================================================================== * Descoperire: LISTEAZA candidati vii (STERS=0, ID_FACT>0) pe fiecare familie - read-only, nu * face parte din sweep-ul de proba. Rulata o singura data, inaintea alegerii documentelor de mai * sus (rezultatul e citat in raportul S9-8, nu retesteaza nimic aici). *============================================================================================== PROCEDURE Descoperire DO ListeazaCandidati WITH 'AVIZ', [tip=4 and exists (select 1 from vanzari_coresp vc where vc.tip=1 and vc.sters=0 and vc.id_vanzare_fact=v.id_vanzare)] DO ListeazaCandidati WITH 'COMANDA', [tip in (3,21,25,28,42,47)] DO ListeazaCandidati WITH 'CONTRACT', [tip in (2,6,26,52)] DO ListeazaCandidati WITH 'ELSE', [tip not in (4,3,21,25,28,42,47,2,6,26,52)] ENDPROC PROCEDURE ListeazaCandidati LPARAMETERS tcFamilie, tcFiltru IF USED('v_disc98') USE IN v_disc98 ENDIF IF !goExecutor.oExecuta([select id_vanzare, tip, id_fact from vanzari v where sters=0 and nvl(id_fact,0)>0 and ] + ; tcFiltru + [ and rownum <= 10 order by id_vanzare desc], 'v_disc98') STRTOFILE('EROARE la descoperire ' + tcFamilie + CHR(13) + CHR(10), gcErrLog, 1) RETURN ENDIF STRTOFILE('--- candidati ' + tcFamilie + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) SELECT v_disc98 SCAN STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' id_fact=' + TRANSFORM(id_fact) + CHR(13) + CHR(10), gcErrLog, 1) ENDSCAN USE IN v_disc98 ENDPROC *============================================================================================== * ProbaScenariu: reemite tnIdV o singura data. tlModifica = .F. -> reemitere IDENTICA (nicio * schimbare pe crsfactura). tlModifica = .T. -> reemitere CU MODIFICARI (cantitatea primei linii * +1). Verifica identitatea (ID_FACT, serie/numar/data), auditul de creare neschimbat, si - pe * scenariul B - ca schimbarea a ajuns in Oracle (TOTAL_CU_TVA diferit) si ca legatura cu sursa * s-a pastrat pe documentul nou (AVIZ: VANZARI_CORESP; COMANDA/CONTRACT: FACT_VFACTURI). *============================================================================================== PROCEDURE ProbaScenariu LPARAMETERS tnIdV, tcFamilie, tlModifica, tcPrefix LOCAL lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lcSerieInainte, lnNumarInainte LOCAL lnTotalInainte, lnLegaturaInainte, lnComandaInainte, lnCtrInainte LOCAL lnIdVNou, llRez, lcSerieDupa, lnNumarDupa, lnTotalDupa, lnLegaturaDupa LOCAL lnComandaDupa, lnCtrDupa, lnLiniiInainte, lnLiniiDupa IF !CititStareInainte(tnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) RETURN ENDIF CititAntetInainte(tnIdV, @lcSerieInainte, @lnNumarInainte, @lnTotalInainte, @lnComandaInainte, @lnCtrInainte) lnLegaturaInainte = CititLegaturaSursa(tcFamilie, tnIdV) lnLiniiInainte = NumaraLiniiVii(tnIdV) STRTOFILE(tcPrefix + ' INAINTE: serie=[' + lcSerieInainte + '] numar=' + TRANSFORM(lnNumarInainte) + ; ' total=' + TRANSFORM(lnTotalInainte) + ' legatura=' + TRANSFORM(lnLegaturaInainte) + ; ' id_comanda=' + TRANSFORM(lnComandaInainte) + ' id_ctr=' + TRANSFORM(lnCtrInainte) + ; ' linii=' + TRANSFORM(lnLiniiInainte) + CHR(13) + CHR(10), gcErrLog, 1) LOCAL lnRuta IF !ReemiteDocumentAuto2(tnIdV, @lnIdVNou, @llRez, tlModifica, @lnRuta) RETURN ENDIF DO asserteaza WITH tcPrefix + '-1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez) IF !llRez RETURN ENDIF IF !tlModifica *!* scenariul A, verificat pe cod (vezi antetul fisierului): fara nicio modificare, ruta e 0 *!* (nimic) - documentul ORIGINAL (tnIdV) trebuie sa ramana complet neatins, fara reemitere DO asserteaza WITH tcPrefix + '-2 niciun document nou (ruta 0, nimic scris)', lnIdVNou = 0, TRANSFORM(lnIdVNou) LOCAL lnIdFactAcum, lnStersAcum lnIdFactAcum = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) lnStersAcum = Val1([select nvl(sters,-1) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) DO asserteaza WITH tcPrefix + '-3 ID_FACT-ul documentului original neschimbat', lnIdFactAcum = lnIdFactVechi, ; TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactAcum) DO asserteaza WITH tcPrefix + '-4 documentul original ramane STERS = 0 (n-a fost sters/reemis)', ; lnStersAcum = 0, TRANSFORM(lnStersAcum) CititAntetInainte(tnIdV, @lcSerieDupa, @lnNumarDupa, @lnTotalDupa, @lnComandaDupa, @lnCtrDupa) DO asserteaza WITH tcPrefix + '-5 serie/numar/total identice (nimic scris)', ; lcSerieDupa == lcSerieInainte AND lnNumarDupa = lnNumarInainte AND lnTotalDupa = lnTotalInainte, ; '[' + lcSerieInainte + '/' + TRANSFORM(lnNumarInainte) + '/' + TRANSFORM(lnTotalInainte) + ; '] vs [' + lcSerieDupa + '/' + TRANSFORM(lnNumarDupa) + '/' + TRANSFORM(lnTotalDupa) + ']' DO VerificaRandulDocumente WITH lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, tcPrefix RETURN ENDIF *!* scenariul B: modificare reala -> ruta 1 -> sterge+reemite. Identitatea (ID_FACT, serie, *!* numar) trebuie pastrata pe documentul NOU, iar continutul trebuie sa reflecte modificarea. LOCAL lnIdFactNou lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) DO asserteaza WITH tcPrefix + '-2 ID_FACT pastrat (identitate)', lnIdFactNou = lnIdFactVechi, ; TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou) CititAntetInainte(lnIdVNou, @lcSerieDupa, @lnNumarDupa, @lnTotalDupa, @lnComandaDupa, @lnCtrDupa) DO asserteaza WITH tcPrefix + '-3 serie/numar identice fata de inainte (identitatea de act pastrata)', ; lcSerieDupa == lcSerieInainte AND lnNumarDupa = lnNumarInainte, ; '[' + lcSerieInainte + '/' + TRANSFORM(lnNumarInainte) + '] vs [' + lcSerieDupa + '/' + TRANSFORM(lnNumarDupa) + ']' DO VerificaRandulDocumente WITH lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, tcPrefix DO asserteaza WITH tcPrefix + '-6 TOTAL_CU_TVA s-a schimbat (modificarea a ajuns in Oracle)', ; lnTotalDupa <> lnTotalInainte, TRANSFORM(lnTotalInainte) + ' -> ' + TRANSFORM(lnTotalDupa) DO CASE CASE tcFamilie == 'AVIZ' lnLegaturaDupa = CititLegaturaSursa(tcFamilie, lnIdVNou) DO asserteaza WITH tcPrefix + '-7 legatura AVIZ (VANZARI_CORESP) pastrata pe documentul nou', ; lnLegaturaDupa >= 1 AND lnLegaturaDupa = lnLegaturaInainte, ; TRANSFORM(lnLegaturaInainte) + ' -> ' + TRANSFORM(lnLegaturaDupa) CASE tcFamilie == 'COMANDA' DO asserteaza WITH tcPrefix + '-7 legatura ID_COMANDA pastrata pe documentul nou', ; lnComandaDupa = lnComandaInainte AND lnComandaInainte > 0, ; TRANSFORM(lnComandaInainte) + ' -> ' + TRANSFORM(lnComandaDupa) CASE tcFamilie == 'CONTRACT' DO asserteaza WITH tcPrefix + '-7 legatura ID_CTR pastrata pe documentul nou', ; lnCtrDupa = lnCtrInainte AND lnCtrInainte > 0, ; TRANSFORM(lnCtrInainte) + ' -> ' + TRANSFORM(lnCtrDupa) OTHERWISE STRTOFILE(tcPrefix + '-7 familia ELSE nu are legatura sursa de verificat' + CHR(13) + CHR(10), gcErrLog, 1) ENDCASE *!* fara asta, o linie pierduta tacut la reemitere (FACT-005 / FACT-030) trece de toate *!* asertiunile de mai sus, care verifica doar identitatea si antetul lnLiniiDupa = NumaraLiniiVii(lnIdVNou) DO asserteaza WITH tcPrefix + '-8 numarul de linii vii pastrat pe documentul nou', ; lnLiniiDupa = lnLiniiInainte AND lnLiniiInainte > 0, ; TRANSFORM(lnLiniiInainte) + ' -> ' + TRANSFORM(lnLiniiDupa) ENDPROC *============================================================================================== * NumaraLiniiVii: cate linii nesterse are documentul. *============================================================================================== FUNCTION NumaraLiniiVii LPARAMETERS tnIdV RETURN Val1([select count(*) as v from vanzari_detalii where sters = 0 and id_vanzare = ] + TRANSFORM(tnIdV)) ENDFUNC *============================================================================================== * ReemiteDocumentAuto2: acelasi driver ca test_s9_7 (IncarcaAntetFacturaEditare + * IncarcaLiniiFacturaEditare + do_scrie_factura() REAL, fara fortare manuala). tlModifica = .F. * NU atinge crsfactura (reemitere identica); .T. creste cantitatea primei linii cu 1. *============================================================================================== PROCEDURE ReemiteDocumentAuto2 LPARAMETERS tnIdV, tnIdVNou, tlRez, tlModifica, tnRutaAleasa LOCAL loForm, lnDiscRon, lnDiscVal, lnCantVeche, lnCantNoua, lnNr, lnIdVMaxInainte lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) DO urma WITH 'IncarcaAntetFacturaEditare ' + TRANSFORM(tnIdV) lnDiscRon = 0 lnDiscVal = 0 poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) DO asserteaza WITH 'antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) IF VARTYPE(poDate) <> 'O' RETURN .F. ENDIF DO urma WITH 'IncarcaLiniiFacturaEditare ' + TRANSFORM(tnIdV) IncarcaLiniiFacturaEditare(poDate, tnIdV) DO asserteaza WITH 'liniile documentului ' + TRANSFORM(tnIdV) + ' s-au incarcat', ; USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 RETURN .F. ENDIF update_jtva_coloane([JV], [jtva_coloane_temp]) update_saft_taxtable() 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') loForm.ndiscfactron = lnDiscRon loForm.ndiscfactval = lnDiscVal loForm.do_calculeaza_totaluri() poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; tnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)), ; Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)), gnAn, gnLuna) IF VARTYPE(poSnapshotEditare) <> 'O' DO asserteaza WITH 'instantaneul de editare s-a creat (' + TRANSFORM(tnIdV) + ')', .F., VARTYPE(poSnapshotEditare) RETURN .F. ENDIF IF tlModifica SELECT crsfactura GO TOP lnCantVeche = cantitate lnCantNoua = lnCantVeche + 1 REPLACE cantitate WITH lnCantNoua IN crsfactura loForm.do_calculeaza_totaluri() STRTOFILE('cantitate ' + TRANSFORM(lnCantVeche) + ' -> ' + TRANSFORM(lnCantNoua) + CHR(13) + CHR(10), gcErrLog, 1) ELSE STRTOFILE('reemitere IDENTICA - crsfactura neatins' + CHR(13) + CHR(10), gcErrLog, 1) ENDIF tnRutaAleasa = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') DO asserteaza WITH 'ruta aleasa e ' + TRANSFORM(IIF(tlModifica,1,0)) + IIF(tlModifica,' (regenerare)',' (nimic)') + ', doc ' + TRANSFORM(tnIdV), ; tnRutaAleasa = IIF(tlModifica, 1, 0), TRANSFORM(tnRutaAleasa) *!* FARA nicio fortare manuala, FARA glRegenerareEditare - fortarea o face automat cablajul S9-7 DO urma WITH 'do_scrie_factura (SCRIE IN ORACLE, fortare automata prin cablaj) doc ' + TRANSFORM(tnIdV) tlRez = loForm.do_scrie_factura() DO urma WITH 'do_scrie_factura a revenit, doc ' + TRANSFORM(tnIdV) STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) goFormReemitere = loForm lnNr = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte)) tnIdVNou = 0 IF lnNr >= 1 tnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte)) ENDIF STRTOFILE('documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou=' + TRANSFORM(tnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1) RETURN .T. ENDPROC *============================================================================================== PROCEDURE CititStareInainte LPARAMETERS tnIdV, tnIdFactVechi, tnIdUtilInainte, tcDataOraInainte tnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV) + [ and sters = 0]) DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(tnIdV) + ' e viu si are ID_FACT', tnIdFactVechi > 0, TRANSFORM(tnIdFactVechi) IF tnIdFactVechi <= 0 RETURN .F. ENDIF tnIdUtilInainte = -1 tcDataOraInainte = '' IF USED('v_doc98') USE IN v_doc98 ENDIF IF goExecutor.oExecuta([select id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat from documente ] + ; [where id_doc = ] + TRANSFORM(tnIdFactVechi), 'v_doc98') SELECT v_doc98 IF RECCOUNT('v_doc98') = 1 GO TOP tnIdUtilInainte = NVL(id_util, -1) tcDataOraInainte = ALLTRIM(NVL(dataorat, '')) ENDIF USE IN v_doc98 ENDIF STRTOFILE('INAINTE doc ' + TRANSFORM(tnIdV) + ': id_fact=' + TRANSFORM(tnIdFactVechi) + ; ' documente.id_util=' + TRANSFORM(tnIdUtilInainte) + ' documente.dataora=' + tcDataOraInainte + CHR(13) + CHR(10), gcErrLog, 1) RETURN .T. ENDPROC *============================================================================================== * CititAntetInainte: serie/numar/total/id_comanda/id_ctr direct din FACT_VFACTURI (o singura * interogare, aceleasi coloane folosite si "inainte" si "dupa"). *============================================================================================== PROCEDURE CititAntetInainte LPARAMETERS tnIdV, tcSerie, tnNumar, tnTotal, tnComanda, tnCtr tcSerie = '' tnNumar = 0 tnTotal = -1 tnComanda = 0 tnCtr = 0 IF USED('v_ant98') USE IN v_ant98 ENDIF IF goExecutor.oExecuta([select nvl(serie_act,' ') as serie_act, nvl(numar_act,-1) as numar_act, ] + ; [nvl(total_cu_tva,-1) as total_cu_tva, nvl(id_comanda,0) as id_comanda, nvl(id_ctr,0) as id_ctr ] + ; [from fact_vfacturi where id_vanzare = ] + TRANSFORM(tnIdV), 'v_ant98') SELECT v_ant98 IF RECCOUNT('v_ant98') = 1 GO TOP tcSerie = ALLTRIM(NVL(serie_act, '')) tnNumar = NVL(numar_act, -1) tnTotal = NVL(total_cu_tva, -1) tnComanda = NVL(id_comanda, 0) tnCtr = NVL(id_ctr, 0) ENDIF USE IN v_ant98 ENDIF ENDPROC *============================================================================================== * CititLegaturaSursa: numarul de avize sursa vii (VANZARI_CORESP TIP=1) legate de documentul dat. * Foloseste doar familia AVIZ; celelalte familii se verifica direct din FACT_VFACTURI. *============================================================================================== FUNCTION CititLegaturaSursa LPARAMETERS tcFamilie, tnIdV IF tcFamilie <> 'AVIZ' RETURN -1 ENDIF RETURN Val1([select count(*) as v from vanzari_coresp where tip=1 and sters=0 and id_vanzare_fact = ] + TRANSFORM(tnIdV)) ENDFUNC *============================================================================================== PROCEDURE VerificaRandulDocumente LPARAMETERS tnIdDoc, tnIdUtilInainte, tcDataOraInainte, tcPrefix LOCAL lnSters, lnIdUtil, lcDataOra IF USED('v_ver98') USE IN v_ver98 ENDIF IF !goExecutor.oExecuta([select sters, id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat ] + ; [from documente where id_doc = ] + TRANSFORM(tnIdDoc), 'v_ver98') DO asserteaza WITH tcPrefix + '-4 randul reinviat s-a putut citi', .F., 'eroare interogare' RETURN ENDIF SELECT v_ver98 IF RECCOUNT('v_ver98') <> 1 DO asserteaza WITH tcPrefix + '-4 randul reinviat exista o singura data', .F., TRANSFORM(RECCOUNT('v_ver98')) USE IN v_ver98 RETURN ENDIF GO TOP lnSters = NVL(sters, -1) lnIdUtil = NVL(id_util, -1) lcDataOra = ALLTRIM(NVL(dataorat, '')) USE IN v_ver98 DO asserteaza WITH tcPrefix + '-4 randul reinviat are STERS = 0', lnSters = 0, TRANSFORM(lnSters) DO asserteaza WITH tcPrefix + '-5a ID_UTIL neschimbat (audit de creare)', lnIdUtil = tnIdUtilInainte, ; TRANSFORM(tnIdUtilInainte) + ' -> ' + TRANSFORM(lnIdUtil) DO asserteaza WITH tcPrefix + '-5b DATAORA neschimbata (audit de creare)', lcDataOra == tcDataOraInainte, ; '[' + tcDataOraInainte + '] -> [' + lcDataOra + ']' ENDPROC *============================================================================================== * Val1: o singura valoare numerica dintr-un select care aliaseaza coloana ca "v". *============================================================================================== FUNCTION Val1 LPARAMETERS tcSql LOCAL lnRet lnRet = -1 IF USED('v_val98') USE IN v_val98 ENDIF IF goExecutor.oExecuta(tcSql, 'v_val98') SELECT v_val98 IF RECCOUNT('v_val98') > 0 GO TOP lnRet = NVL(v_val98.v, -1) ENDIF USE IN v_val98 ELSE STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) ENDIF RETURN lnRet ENDFUNC PROCEDURE urma LPARAMETERS tcPas STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) 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) gnFail = gnFail + 1 STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) QUIT ENDPROC