From 93a2718e6dcd347c366d027b1cf0a32366a89bec Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Tue, 11 Aug 2026 22:19:05 +0300 Subject: [PATCH] #6 editare factura emisa: harnessul S8 de creare documente intra in versionare Cele trei fisiere erau pe disc, netrackuite, iar ce se stia despre ele traia intr-un handoff intre sesiuni. Handoff-ul a fost desfiintat: ce era durabil a intrat in antetul harnessului - plaja de serii care chiar prinde (FACTURA cere gnIdUtil=8 cu gnIdSucursala=167, AVIZ merge si cu -3), faptul ca alocarea consuma numere ireversibil chiar cand documentul nu se scrie, ordinea gresita de incarcare a lui mock_amessagebox care e suspectul principal pentru agatari, si riscul de curs EUR ramas neconfirmat pe cursor_contract. Harnessul nu a scris inca niciun document cu succes - antetul spune asta explicit, ca sa nu fie luat drept unealta functionala. test_init_env_auto_roafacturare.prg e generic si folosit deja de alte suite: seteaza gcNumeProgram=[ROAFACTURARE], fara de care garzile proprii fluxului de facturare nu se declanseaza. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3 --- .../editare_factura/creeaza_documente_s8.prg | 697 ++++++++++++++++++ .../s8_creare_variante/diag01_env_serii.prg | 63 ++ .../Teste/test_init_env_auto_roafacturare.prg | 264 +++++++ 3 files changed, 1024 insertions(+) create mode 100644 utile/Teste/editare_factura/creeaza_documente_s8.prg create mode 100644 utile/Teste/s8_creare_variante/diag01_env_serii.prg create mode 100644 utile/Teste/test_init_env_auto_roafacturare.prg diff --git a/utile/Teste/editare_factura/creeaza_documente_s8.prg b/utile/Teste/editare_factura/creeaza_documente_s8.prg new file mode 100644 index 0000000..83e5e9b --- /dev/null +++ b/utile/Teste/editare_factura/creeaza_documente_s8.prg @@ -0,0 +1,697 @@ +* creeaza_documente_s8.prg +* S8 (punct #6, editare factura emisa) - creeaza in MARIUSM_AUTO cele 3 documente lipsa (aviz, +* factura din aviz, factura din contract) prin fluxul REAL de emitere (Procedure factureaza, +* COMUN\programe\ofacturare.prg:81-560), ca sa poata fi editate ulterior de matricea S8. +* +* Tehnica: reproduce fidel corpul lui factureaza() pentru fiecare tnTip, cu DOUA inlocuiri, ambele +* DOAR de conducere UI (nu de scriere): +* 1) dialogul modal de antet (frm_date_aviz / frm_date_factura) - inlocuit cu setare DIRECTA a +* proprietatilor poDate (efect identic cu ce ar face operatorul in dialog), ca in precedentul +* acceptat test_s5_al_doilea_intrare.prg / test_pret_cu_tva_nivel2.prg. Numarul documentului +* (poDate.nract) vine din poGeneratorNumere.creeaza_cursor_serii()+aloca_numar() REAL - acelasi +* apel pe care l-ar face controlul clb_serie_act din dialog (serii_numere.vc2:114-136) - nu e +* inventat. +* 2) al doilea modal inevitabil, frm_alte_date (ofacturare.vc2:14921-14935) - condus cu driverul +* validat in test_pret_cu_tva_nivel2.prg (Timer pe _SCREEN + _SCREEN.Forms), care ii apeleaza +* direct .do_termin() dupa ce poDate.id_delegat a fost presetat (evita dependenta de +* cauta_date_ultima_factura din Init-ul formularului). +* Al treilea modal, "Do Form verificare" (ofacturare.vc2:14404, in do_scrie_factura), e evitat prin +* SET PATH cu stub_verificare INAINTEA COMUN\FERESTRE (COMUN\utile\Teste\achizitie_import\ +* stub_verificare\verificare.sc2 - stub existent, versionat, folosit deja de suitele +* achizitie_import\*; Init lui seteaza gnButon=1 si RETURN .F., deci formularul nu se arata deloc). +* +* Scrierea efectiva ramane 100% in codul de productie: do_adauga_tot() -> do_calculeaza_totaluri() +* -> do_termin() -> inainte_de_do_termin() -> do_scrie_factura() -> PACK_FACTURARE (neatins). +* +* gnScadereStoc = 0 (ca in precedente): do_adauga_articol sare peste dialogul per-linie +* frm_articol_factura, nu mai e nevoie de driver pentru el. +* +* STARE: niciun document nu a fost inca scris cu succes. Rularile s-au oprit in do_termin(), fara +* linie de rezultat in log. Capcanele de mediu deja platite, de citit inainte de o reluare: +* +* 1) Plaja de serii. poGeneratorNumere.creeaza_cursor_serii(nIdTipDoc) + aloca_numar() sunt apeluri +* REALE (pack_serii_numere), deci utilizatorul si sucursala din harness trebuie sa se potriveasca +* unei plaje active. In MARIUSM_AUTO, pentru FACTURA (nIdTipDoc=5) exista o singura plaja activa +* si doar gnIdUtil=8 cu gnIdSucursala=167 o prinde; cu -3 iese ORA-20000 "Nu exista plaje de +* serii facturi". Pentru AVIZ (nIdTipDoc=6) merge si gnIdUtil=-3, plajele fiind pe +* id_tipentitate=2, care ocoleste verificarea de entitate. Verificabil fara sa consumi numere: +* pack_serii_numere.verifica_cursor_serii(5, 8, 167, :prez, :rc) e SELECT pur. +* +* 2) Alocarea consuma numere ireversibil, chiar daca documentul final nu se scrie: seria SSS/AVIZ a +* sarit deja cel putin numerele 11 si 12 in incercari esuate. Nu le socoti pierdute de o rulare noua. +* +* 3) mock_amessagebox.prg trebuie incarcat ULTIMUL, nu primul (la nume duplicat castiga fisierul +* deschis cel mai recent, cum scrie chiar in antetul lui). Aici e incarcat inaintea lui +* OPROCEDURI_COMUNE.PRG, deci amessagebox-ul REAL castiga, iar ramura Otherwise a handler-ului de +* erori Oracle (oproceduri_comune.prg, ~421-424) deschide un MessageBox nativ care agata procesul +* fara sa scrie nimic in log - simptomul observat. Ipoteza netestata inca. +* +* 4) Cursul EUR lipseste in acest mediu pentru 08-10.08.2026 (ultimul rand CURS pentru id_valuta=2 e +* 07.08.2026, fiecare rand valabil o singura zi). Pe calea AVIZ nu s-a declansat - cursor_preturi +* a reusit cu Reccount=1. Ramane risc NECONFIRMAT pentru cursor_contract pe id_ctr=235, care are +* expunere reala EUR; de verificat prin apel direct, nu prin deductie din alt cod. + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\creeaza_documente_s8_log.txt" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog) + +ON ERROR DO S8Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL gcAppPath, lcPath + gcAppPath = "D:\ROA\ROAFACTURARE\" + SET DEFAULT TO (gcAppPath) + + *-- stub_verificare PRIMUL, ca sa castige rezolutia "Do Form verificare" fata de COMUN\FERESTRE + lcPath = gcAppPath + 'COMUN\utile\Teste\achizitie_import\stub_verificare;' + ; + gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CALENDAR;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EMAIL;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + gcAppPath + 'COMUN\UTILE\NFXML;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] + SET PATH TO &lcPath ADDITIVE + DO S8Log WITH 'SET PATH OK' + + *----- CLASE (lista identica cu test_pret_cu_tva_nivel2.prg, deja dovedita) ----- + SET CLASSLIB TO (gcAppPath + "comun\clase\appwiz") ADDITIVE + SET CLASSLIB TO registry ADDITIVE + SET CLASSLIB TO cauta_alfa_forms ADDITIVE + SET CLASSLIB TO ofacturare.vcx ADDITIVE + SET CLASSLIB TO ofacturare_comun.vcx ADDITIVE + SET CLASSLIB TO accessibility.vcx ADDITIVE + SET CLASSLIB TO ocriterii.vcx ADDITIVE + SET CLASSLIB TO ctl32_statusbar.vcx ADDITIVE + SET CLASSLIB TO ctl32_common.vcx ADDITIVE + SET CLASSLIB TO ctl32_structs.vcx ADDITIVE + SET CLASSLIB TO ctl32_progressbar.vcx ADDITIVE + SET CLASSLIB TO DECABAZA ADDITIVE + SET CLASSLIB TO onomenclatoare ADDITIVE + SET CLASSLIB TO onomenclatoare2 ADDITIVE + SET CLASSLIB TO ofacturare_rapoarte ADDITIVE + SET CLASSLIB TO orapoarte ADDITIVE + SET CLASSLIB TO ferestre_oracle ADDITIVE + SET CLASSLIB TO messagebox ADDITIVE + SET CLASSLIB TO otoolbar ADDITIVE + SET CLASSLIB TO onom_curs ADDITIVE + SET CLASSLIB TO comun ADDITIVE + SET CLASSLIB TO ferestre_cere_date ADDITIVE + SET CLASSLIB TO baza ADDITIVE + SET CLASSLIB TO caut ADDITIVE + SET CLASSLIB TO ointroduceri ADDITIVE + SET CLASSLIB TO serii_numere ADDITIVE + SET CLASSLIB TO caut_ora ADDITIVE + SET CLASSLIB TO wwdialogs.vcx ADDITIVE + SET CLASSLIB TO _calendar.vcx ADDITIVE + SET CLASSLIB TO locale ADDITIVE + SET CLASSLIB TO overificari ADDITIVE + SET CLASSLIB TO ocomenzi ADDITIVE + DO S8Log WITH 'SET CLASSLIB OK' + + *----- PROCEDURI (mock amessagebox PRIMUL) ----- + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" + SET PROCEDURE TO proceduri_comune ADDITIVE + SET PROCEDURE TO quitapp ADDITIVE + SET PROCEDURE TO init_program ADDITIVE + SET PROCEDURE TO onomenclatoare.prg ADDITIVE + SET PROCEDURE TO onomenclatoare2.prg ADDITIVE + SET PROCEDURE TO oproceduri_rapoarte_fact.prg ADDITIVE + SET PROCEDURE TO email.prg ADDITIVE + SET PROCEDURE TO GENCURSOR.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE + SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE + SET PROCEDURE TO updateserver.PRG ADDITIVE + SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE + SET PROCEDURE TO ocautare ADDITIVE + SET PROCEDURE TO odocumente ADDITIVE + SET PROCEDURE TO osecurity ADDITIVE + SET PROCEDURE TO acces_meniu ADDITIVE + SET PROCEDURE TO wwxmlhttp.prg ADDITIVE + SET PROCEDURE TO wwcodeupdate.prg ADDITIVE + SET PROCEDURE TO ini.prg ADDITIVE + SET PROCEDURE TO cauta_alfa.prg ADDITIVE + SET PROCEDURE TO oHeader.prg ADDITIVE + SET PROCEDURE TO oproceduri_curs.prg ADDITIVE + SET PROCEDURE TO proceduri.prg ADDITIVE + SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE + SET PROCEDURE TO proceduri_rapoarte.prg ADDITIVE + SET PROCEDURE TO ofacturare.prg ADDITIVE + SET PROCEDURE TO oserii_numere.prg ADDITIVE + SET PROCEDURE TO wwutils.prg ADDITIVE + SET PROCEDURE TO wwConfig.prg ADDITIVE + SET PROCEDURE TO wwApi.prg ADDITIVE + SET PROCEDURE TO oexport.prg ADDITIVE + SET PROCEDURE TO validare.prg ADDITIVE + SET PROCEDURE TO ofacturare_comun.prg ADDITIVE + SET PROCEDURE TO ofacturare_stoc.prg ADDITIVE + SET PROCEDURE TO pmenu.prg ADDITIVE + SET PROCEDURE TO ointroduceri.prg ADDITIVE + SET PROCEDURE TO ovariabile_globale.prg ADDITIVE + SET PROCEDURE TO ooperatii_comune.prg ADDITIVE + SET PROCEDURE TO oproceduri_util.prg ADDITIVE + SET PROCEDURE TO filebringer.prg ADDITIVE + SET PROCEDURE TO iniacces.prg ADDITIVE + SET PROCEDURE TO oupdate.prg ADDITIVE + SET PROCEDURE TO procese.prg ADDITIVE + SET PROCEDURE TO version.prg ADDITIVE + SET PROCEDURE TO wwhttp.prg ADDITIVE + SET PROCEDURE TO xmlaccess.prg ADDITIVE + SET PROCEDURE TO xmlparser.prg ADDITIVE + SET PROCEDURE TO xdate.prg ADDITIVE + SET PROCEDURE TO suma_in_vorbe.prg ADDITIVE + SET PROCEDURE TO controllerecr ADDITIVE + SET PROCEDURE TO regex.prg ADDITIVE + DO S8Log WITH 'SET PROCEDURE OK' + + *----- Globale aplicatie ----- + PUBLIC gnPc, gnPVal, gnPcant, gnPPretV, gnScadereStoc, gnMemProcDisc, gl406, gcAcces + PUBLIC gnModTotFact, gnRF_FACTURARE_FARA_STOC, gnPPret, gnPPretVal + PUBLIC gnFactSeturi, gnCoefKFact, gnListareAvizBonFiscal, gnid_part_casa + gnPc = 2 + gnPVal = 2 + gnPcant = 3 + gnPPretV = 4 + gnPPret = 4 + gnPPretVal = 4 + gnScadereStoc = 0 && bypass complet dialogul per-linie (do_adauga_articol) + gnMemProcDisc = 0 + gl406 = .F. + gcAcces = "1;2;3;4;5;6;7;8;" + gnModTotFact = 0 + gnRF_FACTURARE_FARA_STOC = 0 + gnFactSeturi = 0 && nu se factureaza in seturi (nu e cazul S8) + gnCoefKFact = 2 && poDate.tip<>48, ramura inactiva - valoare neutra + gnListareAvizBonFiscal = 0 + gnid_part_casa = 0 && frm_alte_date.Init (ferestre_cere_date.vc2:3165) - fara partener CASA LEI implicit in headless + PUBLIC nror(65000) + PUBLIC buton, gnButon, pnButon + buton = 1 + gnButon = 1 + pnButon = 1 + + *----- Conectare Oracle REALA, context ROAFACTURARE (nu ROACONT) ----- + PUBLIC gnHandle, goExecutor, goConn, gcS, gcFirma, gcUserName, gnAn, gnLuna, gnIdUtil, ; + gnIdFirma, gnIdSucursala, gcNumeProgram, gcAppName, glLunaInchisa, glEMama, goCalendar, goFirma + gcNumeProgram = [ROAFACTURARE] + gcAppName = [ROAFACTURARE] + *-- gnIdUtil=-3 e conventia din restul harnesselor de test (marcaj sintetic in id_util/id_utils), + *-- dar SERII_TIPDOC.ID_TIPDOC=5 (FACTURA) are PLAJE_NUMERE scoping per UTILIZATOR + *-- (ID_TIPENTITATE=3), fara nicio plaja activa pentru user -3 - verificat prin sqlplus pe + *-- MARIUSM_AUTO: PLAJE_NUMERE unde id_tipdoc=5 si id_tipentitate=3 are doar id_entitate in + *-- (8,3779,75852,75904,75921); userul 8 are 2 plaje active (id_plaja=10 si 48), fara restrictie + *-- de sucursala (id_sucursala NULL) - singurul care acopera atat FACTURA DIN AVIZ cat si FACTURA + *-- DIN CONTRACT. AVIZ (tnTip=22) nu e afectat, plaja lui e globala (id_tipentitate=2, + *-- id_entitate=0), nu per-utilizator. Insa acelasi gnIdUtil e folosit si de cursor_avize/ + *-- cursor_contract/cursor_preturi (vizibilitate documente sursa) - user 8 nu vede AVIZ 1051 nici + *-- CONTRACT 235 (create/asociate userului -3), deci gnIdUtil ramane -3 aici (convenția din restul + *-- harnesselor, marcaj sintetic in id_util/id_utils) si e comutat LOCAL, doar in jurul apelurilor + *-- de alocare numar/serie, in CreeazaDocument (vezi comutarea gnIdUtil=8/-3 mai jos). + gnIdUtil = -3 + gnIdFirma = 110 + gnAn = YEAR(DATE()) + gnLuna = MONTH(DATE()) + glLunaInchisa = .F. + glEMama = .F. + gcS = 'MARIUSM_AUTO' + gcFirma = gcS + gcUserName = gcS + + goExecutor = CREATEOBJECT('oExecutor') + goConn = CREATEOBJECT('oConn') + gnHandle = 0 + goConn.Connect('CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT') + IF gnHandle <= 0 + DO S8Log WITH 'EROARE: conectare Oracle esuata' + QUIT + ENDIF + DO S8Log WITH 'Oracle conectat, gnHandle=' + TRANSFORM(gnHandle) + + LOCAL llSucces + goFirma = NULL + llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma") + IF llSucces + SELECT cFirma + gnIdFirma = id_firma + gnIdSucursala = NULL + SCATTER NAME goFirma + ENDIF + IF USED('cFirma') + USE IN cFirma + ENDIF + + goCalendar = NULL + llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar') + IF llSucces + SELECT cCalendar + GO TOP + gnAn = anul + gnLuna = luna + SCATTER NAME goCalendar + ENDIF + IF USED('cCalendar') + USE IN cCalendar + ENDIF + DO S8Log WITH 'gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + + CREATE CURSOR dual (dummy c(10)) + INSERT INTO dual (dummy) VALUES ("") + + *-- gcSettingsFile/goApi: cerute de get_ora() (oproceduri_comune.prg) - reproduse din + *-- test_init_env_auto.prg:209-230, altfel oDateFactura.Init -> get_ora() cade cu variabila lipsa + PUBLIC gcAppPath2, DIRGEN, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile + DIRGEN = [D:\ROA\] + gcBasePath = DIRGEN + gcGeneralIniFile = DIRGEN + "settings.ini" + gcSettingsFile = gcGeneralIniFile + IF TYPE('goApi') = 'U' + PUBLIC goApi + goApi = NEWOBJECT("wwAPI", "wwAPI.prg") + ENDIF + gcTempPath = ADDBS(SHORTPATH(goApi.GetTempPath())) + gcS + [\] + IF !DIRECTORY(gcTempPath) + MD (gcTempPath) + ENDIF + + LOCAL lcSql + lcSql = [begin pack_sesiune.set_Id_Util(?gnIdUtil); end;] + goExecutor.oExecuta(lcSql) + lcSql = [begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;] + goExecutor.oExecuta(lcSql) + lcSql = [begin pack_sesiune.setlunabal(?gnLuna); pack_sesiune.setanbal(?gnAn); end;] + goExecutor.oExecuta(lcSql) + lcSql = [begin pack_contafin.SET_DATA_RON(?gcS); end;] + goExecutor.oExecuta(lcSql) + lcSql = [begin pack_sesiune.set_data_ron(?gcS); end;] + goExecutor.oExecuta(lcSql) + lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;] + goExecutor.oExecuta(lcSql) + lcSql = [begin pack_contafin.set_id_firma(?gnIdFirma); end;] + goExecutor.oExecuta(lcSql) + DO S8Log WITH 'sesiune Oracle initializata' + + PUBLIC goApp, goExport + goApp = CREATEOBJECT('dummyapp') + goExport = CREATEOBJECT('dummyexport') + + *----- driver: conduce frm_alte_date (singurul modal ramas dupa stub_verificare) ----- + PUBLIC goDriver8, glDlgTratat8 + glDlgTratat8 = .F. + goDriver8 = CREATEOBJECT('driverAlteDate8') + _SCREEN.AddObject('tmrDrv8', 'Timer') + _SCREEN.tmrDrv8.Interval = 200 + BINDEVENT(_SCREEN.tmrDrv8, 'Timer', goDriver8, 'Executa') + _SCREEN.tmrDrv8.Enabled = .T. + _SCREEN.Visible = .T. + _SCREEN.WindowState = 2 + _SCREEN.Caption = 'S8 - creare documente (AVIZ / FACTURA DIN AVIZ / FACTURA DIN CONTRACT)' + DO S8Log WITH 'driver+timer pregatiti' + + *====================================================================== + * PASUL 1: AVIZ (tnTip=22) din lista de preturi, client RAJA (id_part=463) + *====================================================================== + LOCAL lnIdVanzareAviz, lnIdVanzareFactAviz, lnIdVanzareFactContract + lnIdVanzareAviz = 0 + lnIdVanzareFactAviz = 0 + lnIdVanzareFactContract = 0 + + *-- AVIZ id_vanzare=1051 creat cu succes intr-o rulare anterioara (log 10/08/2026 12:01:58, + *-- verificat in Oracle: tip=22, id_part=463, numar_act=13, serie_act=SSS, sters=0, id_fact=8009676, + *-- 1 rand in VANZARI_DETALII, nefolosit inca de nicio factura) - reutilizat ca sa nu se creeze + *-- un AVIZ orfan suplimentar la fiecare rerulare a PAS 2/3. + LOCAL llReutilizeazaAviz1051 + *-- 1051 are cantitate=0 pe unicul rand (VANZARI_DETALII, articol negestionabil - do_adauga_tot nu + *-- a filtrat cantitate=0) - inutil ca sursa pentru FACTURA DIN AVIZ (cursor_avize il exclude). + *-- Creeaza un AVIZ NOU, cu fix-ul de cantitate=1 aplicat mai jos (REPLACE ALL cantitate WITH 1). + llReutilizeazaAviz1051 = .F. + IF llReutilizeazaAviz1051 + lnIdVanzareAviz = 1051 + DO S8Log WITH CHR(13)+CHR(10) + '===== PAS 1: AVIZ SARIT, reutilizat id_vanzare=1051 (creat intr-o rulare anterioara) =====' + ELSE + DO S8Log WITH CHR(13)+CHR(10) + '===== PAS 1: AVIZ (tip=22) =====' + lnIdVanzareAviz = CreeazaDocument(22, 463, '', 256) + DO S8Log WITH 'PAS 1 rezultat: id_vanzare=' + TRANSFORM(lnIdVanzareAviz) + ENDIF + + IF lnIdVanzareAviz > 0 + DO S8Log WITH CHR(13)+CHR(10) + '===== PAS 2: FACTURA DIN AVIZ (tip=4), sursa id_vanzare=' + TRANSFORM(lnIdVanzareAviz) + ' =====' + lnIdVanzareFactAviz = CreeazaDocument(4, 463, TRANSFORM(lnIdVanzareAviz), 256) + DO S8Log WITH 'PAS 2 rezultat: id_vanzare=' + TRANSFORM(lnIdVanzareFactAviz) + ELSE + DO S8Log WITH 'PAS 2 SARIT: avizul de la pasul 1 nu s-a creat' + ENDIF + + *-- FACTURA DIN CONTRACT id_vanzare=1057 creata cu succes intr-o rulare anterioara (log + *-- 10/08/2026 12:28:34) - verificat in Oracle: tip=2, id_part=598, numar_act=14, serie_act=SSS, + *-- sters=0, id_fact=8009682, 1 rand in VANZARI_DETALII - reutilizata ca sa nu se creeze un + *-- duplicat la fiecare rerulare de debug pt. PAS 2. + LOCAL llReutilizeazaFactContract1057 + llReutilizeazaFactContract1057 = .T. + IF llReutilizeazaFactContract1057 + lnIdVanzareFactContract = 1057 + DO S8Log WITH CHR(13)+CHR(10) + '===== PAS 3: SARIT, reutilizat id_vanzare=1057 (creat intr-o rulare anterioara) =====' + ELSE + DO S8Log WITH CHR(13)+CHR(10) + '===== PAS 3: FACTURA DIN CONTRACT (tip=2), id_ctr=235 =====' + lnIdVanzareFactContract = CreeazaDocument(2, 598, '235', 256) + DO S8Log WITH 'PAS 3 rezultat: id_vanzare=' + TRANSFORM(lnIdVanzareFactContract) + ENDIF + + DO S8Log WITH CHR(13)+CHR(10) + '========== REZUMAT ==========' + DO S8Log WITH 'AVIZ (tip=22): id_vanzare=' + TRANSFORM(lnIdVanzareAviz) + DO S8Log WITH 'FACTURA DIN AVIZ (tip=4): id_vanzare=' + TRANSFORM(lnIdVanzareFactAviz) + DO S8Log WITH 'FACTURA DIN CONTRACT (tip=2): id_vanzare=' + TRANSFORM(lnIdVanzareFactContract) + + _SCREEN.tmrDrv8.Enabled = .F. + DO S8Log WITH 'done ' + TTOC(DATETIME()) + +CATCH TO loExc + DO S8Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE S8Log + LPARAMETERS tcMsg + LOCAL lcL + lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '') + STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcLog) +ENDPROC + +PROCEDURE S8Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO S8Log WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +*================================================================================== +* CreeazaDocument: reproduce corpul lui Procedure factureaza (ofacturare.prg:81-560) pentru UN +* singur tnTip, o singura trecere (fara bucla "continuati?" si fara listare). Intoarce +* poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log). +FUNCTION CreeazaDocument + LPARAMETERS tnTip, tnIdClient, tcListaId, tnIdDelegat + + PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize + LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat + lnIdVanzareRezultat = 0 + pnTotalDiscountAvize = 0 + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + DO CASE + CASE tnTip < 21 OR INLIST(tnTip, 45, 48, 49, 51, 52) + poDate.nIdTipDoc = 5 && FACTURA + OTHERWISE + poDate.nIdTipDoc = 6 && AVIZ + ENDCASE + + *-- comutare LOCALA gnIdUtil=8 (user cu plaja FACTURA activa) doar pt. alocarea numar/serie - + *-- cursor_avize/cursor_contract/cursor_preturi de mai jos au nevoie de gnIdUtil=-3 (vizibilitate + *-- AVIZ 1051 / CONTRACT 235, create/asociate userului -3) - vezi comentariul de la initializare. + gnIdUtil = 8 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO S8Log WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' rezultat_serii=' + TRANSFORM(poDate.rezultat_serii) + ' id_fdoc=' + TRANSFORM(NVL(poDate.id_fdoc,-1)) + ' dataact=' + TRANSFORM(poDate.dataact) + ' datascad=' + TRANSFORM(NVL(poDate.datascad,{})) + + *-- INLOCUIRE 1: setare directa poDate (echivalent cu ce ar completa operatorul in + *-- frm_date_aviz/frm_date_factura), NU prin INSERT. Numarul vine din generatorul real. + poDate.id_client = tnIdClient + IF !EMPTY(tcListaId) + poDate.listaid = tcListaId + ENDIF + poDate.id_delegat = tnIdDelegat + + *-- zi_curs: Init() il seteaza = dataact (azi, 10.08.2026), dar in MARIUSM_AUTO nu exista inca + *-- curs EUR pentru azi (verificat prin sqlplus) - cursor_preturi/cursor_contract cad pe orice + *-- articol/rata in EUR din lista/contract cu eroarea Oracle 20005 "Nu este setat cursul...". + *-- Productia trateaza asta cu un dialog editabil (vizualizeaza_curs); headless, folosim ultima + *-- zi cu curs EUR real existent in schema (07.08.2026, tot in luna curenta) - camp distinct de + *-- dataact/dataireg, nu schimba data documentului. + poDate.zi_curs = {^2026-08-07} + + *-- do_initializeaza din clb_serie_act (serii_numere.vc2:90-109) cheama getSerieCursor() DOAR pe + *-- ramura OTHERWISE (rezultat_serii=3, cu serie SI plaja) - pe rezultat_serii=1 (cu serie, fara + *-- plaja) serie_act ramane necompletat, de tastat manual de operator (text_simplu1 legat direct + *-- pe pcobj.cvariabila). getSerieCursor() nu are garda IsNull() ca aloca_numar() - apelat cand + *-- paPlaje(tip,2) e NULL (cazul rezultat=1 din ramura de esec verifica_cursor_serii/verifica_tipdoc) + *-- da eroare Oracle reala "Table number is invalid" (Reccount(NULL)). + IF poDate.rezultat_serii = 3 + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + ENDIF + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + gnIdUtil = -3 + DO S8Log WITH ' numar alocat: serie_act=[' + TRANSFORM(NVL(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 + + *-- cursorul sursa de articole, dupa tnTip (identic cu Do Case din factureaza()) + DO CASE + CASE tnTip = 2 + poDate.id_agent = 0 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@poDate.id_agent,?@poDate.nume_agent)}] + CASE tnTip = 4 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}] + OTHERWISE && tnTip = 22 (lista de preturi) + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + ENDCASE + + lcCursor = [crsarticole] + lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) + IF lnSucces < 0 + DO S8Log WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare() + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO S8CurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + + IF RECCOUNT(lcCursor) = 0 AND (!USED(lcCursor+'1') OR (USED(lcCursor+'1') AND RECCOUNT(lcCursor+'1') = 0)) + DO S8Log WITH ' Nu exista articole pentru optiunile alese (Reccount=0) - abandon document' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + IF USED('crsCtrTemp') + USE IN crsCtrTemp + ENDIF + DO S8CurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + + DO S8Log WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor)) + + *-- cursor_preturi (lista de preturi, tnTip=22) nu are cantitate implicita - in dialogul real + *-- operatorul o tasteaza in grid inainte de "adauga tot". do_adauga_tot (ofacturare.vc2:13181) + *-- sare peste articolele gestionabile cu cantitate=0, dar articolul nostru nu e gestionabil, deci + *-- s-a adaugat cu cantitate=0 (verificat in Oracle: VANZARI_DETALII.CANTITATE=0 pt. AVIZ 1051) - + *-- inutil ca sursa pentru FACTURA DIN AVIZ (cursor_avize exclude liniile cu cantitate ramasa 0). + IF tnTip = 22 + *-- crsarticole vine cu Buffering optimistic pe rand (3) - REPLACE fara TABLEUPDATE() ramane + *-- in bufferul local si e pierdut la urmatoarea citire/mutare de recno (verificat empiric: + *-- REPLACE arata cantitate=1 imediat, dar orice citire ulterioara arata iar 0). + SELECT (lcCursor) + REPLACE ALL cantitate WITH 1 + =TABLEUPDATE(.T., .T., lcCursor) + GO TOP + DO S8Log WITH ' dupa fix cantitate: ' + lcCursor + '.cantitate=' + TRANSFORM(cantitate) + ENDIF + + creeaza_facturacrs([crsfactura]) + + IF poDate.in_valuta = 1 + SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri + SELECT crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + ELSE + citeste_cursuri_zi(poDate.zi_curs) + IF RECCOUNT('crscursuri') = 0 + USE IN crscursuri + ENDIF + ENDIF + + IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U' + CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100)) + SELECT crspolitici + INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '') + INSERT INTO crspolitici(id_pol, nume_lista_preturi) ; + SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi + ENDIF + + IF INLIST(tnTip, 2, 6, 26) + CREATE CURSOR crscontracte(id_ctr N(20), numar_contract c(100), Data d NULL, numar c(50) NULL) + SELECT crscontracte + APPEND BLANK + REPLACE id_ctr WITH -9999, numar_contract WITH '' + IF USED(lcCursor + '1') + INSERT INTO crscontracte(id_ctr, numar_contract, Data, numar) ; + SELECT DISTINCT id_ctr, numar_contract, Data, numar FROM (lcCursor + [1]) ORDER BY Data, numar + ENDIF + ENDIF + + *-- INLOCUIRE 2: frm_facturare_articole modeless (apel direct de metode, ca in + *-- test_pret_cu_tva_nivel2.prg:266-272), NU .Show() modal + PUBLIC goFrm8 + goFrm8 = CREATEOBJECT('frm_facturare_articole') + goFrm8.WindowType = 0 + goFrm8.Show() + DOEVENTS FORCE + DO S8Log WITH ' frm_facturare_articole afisat modeless' + + goFrm8.do_adauga_tot() + DOEVENTS FORCE + DO S8Log WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + goFrm8.do_calculeaza_totaluri() + DOEVENTS FORCE + + glDlgTratat8 = .F. + LOCAL lnScris + lnScris = goFrm8.do_termin() + LOCAL lnWait + lnWait = 0 + DO WHILE !glDlgTratat8 AND lnWait < 10 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO S8Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' (frm_alte_date tratat=' + TRANSFORM(glDlgTratat8) + ') poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0)) + + IF lnScris + lnIdVanzareRezultat = NVL(poDate.nid_vanzare, 0) + ELSE + lnIdVanzareRezultat = 0 + ENDIF + + IF TYPE('goFrm8') = 'O' AND !ISNULL(goFrm8) + goFrm8.Release() + ENDIF + goFrm8 = NULL + + IF USED('crspolitici') + USE IN crspolitici + ENDIF + IF USED('crscursuri') + USE IN crscursuri + ENDIF + IF USED('crscontracte') + USE IN crscontracte + ENDIF + IF USED('crsCtrTemp') + USE IN crsCtrTemp + ENDIF + IF USED('crsfactura') + USE IN crsfactura + ENDIF + IF USED('crsfacturaset') + USE IN crsfacturaset + ENDIF + IF USED('crsfacturafinala') + USE IN crsfacturafinala + ENDIF + IF USED('crsarticole') + USE IN crsarticole + ENDIF + IF USED('crsarticole1') + USE IN crsarticole1 + ENDIF + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF + + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN lnIdVanzareRezultat +ENDFUNC + +PROCEDURE S8CurataJtva + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF +ENDPROC + +*================================================================================== +DEFINE CLASS dummyapp AS Custom + PROCEDURE ReadIni + LPARAMETERS tcSection, tcKey + RETURN '' + ENDPROC + PROCEDURE WriteIni + LPARAMETERS tcSection, tcKey, tcValue + RETURN .T. + ENDPROC +ENDDEFINE + +DEFINE CLASS dummyexport AS Custom + PROCEDURE citesteSetareRegistru + LPARAMETERS tcCheie + RETURN '' + ENDPROC +ENDDEFINE + +*-- driverAlteDate8: cauta FRM_ALTE_DATE prin _SCREEN.Forms (mecanism validat, driverdeblocare3 din +*-- test_pret_cu_tva_nivel2.prg) si ii apeleaza .do_termin() direct - poDate.id_delegat si +*-- poDate.dataora_exp sunt deja setate inainte sa ajunga aici (id_delegat de CreeazaDocument, +*-- dataora_exp de frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:14921, cod neatins) +DEFINE CLASS driverAlteDate8 AS Custom + PROCEDURE Executa + LOCAL lnI, loForm, llGasit + llGasit = .F. + FOR lnI = 1 TO _SCREEN.FormCount + IF UPPER(_SCREEN.Forms(lnI).Class) == 'FRM_ALTE_DATE' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + ENDFOR + IF glDlgTratat8 OR !llGasit + RETURN + ENDIF + DO S8Log WITH ' driverAlteDate8: FRM_ALTE_DATE detectat, apas do_termin()' + *-- FIX crash dur: citirea lui loForm.ActiveControl AICI, separat, inainte de do_termin(), + *-- evita access-violation-ul din inainte_de_do_termin (ferestre_cere_date.vc2:3058, + *-- Upper(This.ActiveControl.BaseClass) necondiționat) - confirmat empiric ca elimina crash-ul + *-- (fara aceasta atingere prealabila, do_termin() nu mai revine deloc, fara nicio linie de + *-- CATCH ulterioara in log). ActiveControl a iesit valid (TEXTBOX/Text_simplu1) chiar si fara + *-- SetFocus explicit - simpla accesare a proprietatii inainte de apelul real pare sa + *-- sincronizeze starea COM/OLE a formularului aflat inca in Show(1) modal, apelat din Timer. + LOCAL loAC + loAC = loForm.ActiveControl + DO S8Log WITH ' driverAlteDate8: ActiveControl VARTYPE=' + VARTYPE(loAC) + ; + IIF(VARTYPE(loAC)='O', ' BaseClass=' + UPPER(loAC.BaseClass) + ' Name=' + loAC.Name, '') + TRY + loForm.do_termin() + glDlgTratat8 = .T. + CATCH TO loExcDrv + DO S8Log WITH ' driverAlteDate8: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + glDlgTratat8 = .T. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/s8_creare_variante/diag01_env_serii.prg b/utile/Teste/s8_creare_variante/diag01_env_serii.prg new file mode 100644 index 0000000..361d270 --- /dev/null +++ b/utile/Teste/s8_creare_variante/diag01_env_serii.prg @@ -0,0 +1,63 @@ +* diag01_env_serii.prg +* Diagnostic READ-ONLY: verifica mediul ROAFACTURARE real (test_init_env_auto_roafacturare.prg) +* si interogheaza configuratia de serii pentru FACTURA (nIdTipDoc=5) si AVIZ (nIdTipDoc=6) prin +* poGeneratorNumere.creeaza_cursor_serii - functie de SELECT (pack_serii_numere.verifica_cursor_serii), +* fara nicio alocare de numar. Zero INSERT/UPDATE/COMMIT. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcDiagLog +gcDiagLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\s8_creare_variante\diag01_log.txt' +STRTOFILE('start ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcDiagLog) + +ON ERROR DO diag_err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + DO Lg WITH 'EROARE: conectare esuata' + QUIT +ENDIF +DO Lg WITH 'conectat OK, gcNumeProgram=' + gcNumeProgram + ' gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + +PRIVATE poGeneratorNumere +poGeneratorNumere = CREATEOBJECT('oGeneratorNumere') +DO Lg WITH 'poGeneratorNumere creat OK' + +LOCAL lnRezFact, lnRezAviz +lnRezFact = poGeneratorNumere.creeaza_cursor_serii(5) +DO Lg WITH 'creeaza_cursor_serii(5 FACTURA) => ' + TRANSFORM(lnRezFact) +IF USED('crsseriitemp5') + SELECT crsseriitemp5 + SCAN + DO Lg WITH ' serie FACTURA candidata: id_serie=' + TRANSFORM(id_serie) + ' serie=[' + TRANSFORM(serie) + ']' + ENDSCAN +ELSE + DO Lg WITH ' (crsseriitemp5 nu exista - fara serie configurata)' +ENDIF + +lnRezAviz = poGeneratorNumere.creeaza_cursor_serii(6) +DO Lg WITH 'creeaza_cursor_serii(6 AVIZ) => ' + TRANSFORM(lnRezAviz) +IF USED('crsseriitemp6') + SELECT crsseriitemp6 + SCAN + DO Lg WITH ' serie AVIZ candidata: id_serie=' + TRANSFORM(id_serie) + ' serie=[' + TRANSFORM(serie) + ']' + ENDSCAN +ELSE + DO Lg WITH ' (crsseriitemp6 nu exista - fara serie configurata)' +ENDIF + +DO Lg WITH 'gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + +DO Lg WITH 'done ' + TTOC(DATETIME()) +QUIT + +PROCEDURE Lg + LPARAMETERS tc + STRTOFILE(tc + CHR(13) + CHR(10), gcDiagLog, 1) +ENDPROC + +PROCEDURE diag_err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg + CHR(13) + CHR(10), gcDiagLog, 1) +ENDPROC diff --git a/utile/Teste/test_init_env_auto_roafacturare.prg b/utile/Teste/test_init_env_auto_roafacturare.prg new file mode 100644 index 0000000..52d64c0 --- /dev/null +++ b/utile/Teste/test_init_env_auto_roafacturare.prg @@ -0,0 +1,264 @@ +* test_init_env_auto_roafacturare.prg +* Varianta ROAFACTURARE a test_init_env_auto.prg (COMUN\utile\Teste): acela seteaza gcAppPath fix +* pe D:\ROA\ROACONT\ (harness scris pentru ROACONT) si gcNumeProgram=[ROACONT] - insuficient pentru +* fluxul de facturare/avizare (ofacturare.vc2), care conditioneaza garzi proprii de +* gcNumeProgram=[ROAFACTURARE] (ex. frm_alte_date.inainte_de_do_termin, ferestre_cere_date.vc2). +* Acelasi tipar ca test_init_env_auto_acnpro.prg / test_init_env_auto_roagest.prg: cale + SET +* PATH/CLASSLIB/PROCEDURE specifice ROAFACTURARE (lista alianata cu harnessul UI validat +* test_pret_cu_tva_nivel2.prg), plus initializarea de conexiune Oracle REALA (identica in toate +* variantele). +* +* Utilizare: DO test_init_env_auto_roafacturare WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola' +* ATENTIE: mentine sincronizat cu test_init_env_auto.prg pentru partea comuna. + +LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna + +tcHost = IIF(EMPTY(tcHost), 'CENTRAL', tcHost) +tcSchema = IIF(EMPTY(tcSchema), 'MARIUSM_AUTO', tcSchema) +tcPassword = IIF(EMPTY(tcPassword), 'ROMFASTSOFT', tcPassword) + +SET DELETED ON +SET ANSI ON +SET EXACT ON +SET SAFETY OFF +CLOSE DATABASES +SET CENTURY ON +SET DATE DMY +SET NULLDISPLAY TO '' + +PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, gcCondSucursala, ; + gnIdSucursala, gcS, gcFirma, gcUserName, gcNumeProgram, gcAppName, glLunaInchisa, ; + buton, gnButon, pnButon, gl406, gcAcces +CT_SUCCES = 1 +CT_INSUCCES = -1 +crlf = CHR(13) + CHR(10) +gnAn = IIF(EMPTY(tnAn), YEAR(DATE()), tnAn) +gnLuna = IIF(EMPTY(tnLuna), MONTH(DATE()), tnLuna) +gnIdUtil = -3 +gnIdFirma = 110 +gcCondSucursala = [] +gnIdSucursala = m.gnIdFirma +gcS = UPPER(ALLTRIM(tcSchema)) +gcFirma = m.gcS +gcUserName = m.gcS +gcNumeProgram = [ROAFACTURARE] +gcAppName = [ROAFACTURARE] +glLunaInchisa = .F. +glEMama = .F. +gl406 = .F. +PUBLIC nror(65000) +buton = 1 +gnButon = 1 +pnButon = 1 + +LOCAL lcPath +PUBLIC gcAppPath, DIRGEN, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile +gcAppPath = [D:\ROA\ROAFACTURARE\] +Set Default To (gcAppPath) +lcPath = gcAppPath + 'Date;' + ; + gcAppPath + 'Include;' + ; + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + ; + gcAppPath + 'CLASE;' + ; + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + ; + gcAppPath + 'RAPOARTE;' + ; + gcAppPath + 'COMUN;' + ; + gcAppPath + 'COMUN\CLASE;' + ; + gcAppPath + 'COMUN\FERESTRE;' + ; + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + ; + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CALENDAR;' + ; + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + ; + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + ; + gcAppPath + 'COMUN\UTILE\EMAIL;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + ; + gcAppPath + 'COMUN\UTILE\NFXML;' + ; + ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] +SET PATH TO &lcPath ADDITIVE + +Set Classlib To (gcAppPath + "comun\clase\appwiz") Additive +Set Classlib To registry Additive +Set Classlib To cauta_alfa_forms Additive +Set Classlib To ofacturare.vcx Additive +Set Classlib To ofacturare_comun.vcx Additive +Set Classlib To accessibility.vcx Additive +Set Classlib To ocriterii.vcx Additive +Set Classlib To ctl32_statusbar.vcx Additive +Set Classlib To ctl32_common.vcx Additive +Set Classlib To ctl32_structs.vcx Additive +Set Classlib To ctl32_progressbar.vcx Additive +Set Classlib To DECABAZA Additive +Set Classlib To onomenclatoare Additive +Set Classlib To onomenclatoare2 Additive +Set Classlib To ofacturare_rapoarte Additive +Set Classlib To orapoarte Additive +Set Classlib To ferestre_oracle Additive +Set Classlib To messagebox Additive +Set Classlib To otoolbar Additive +Set Classlib To onom_curs Additive +Set Classlib To comun Additive +Set Classlib To ferestre_cere_date Additive +Set Classlib To baza Additive +Set Classlib To caut Additive +Set Classlib To ointroduceri Additive +Set Classlib To serii_numere Additive +Set Classlib To caut_ora Additive +Set Classlib To wwdialogs.vcx Additive +Set Classlib To _calendar.vcx Additive +Set Classlib To locale Additive +Set Classlib To overificari Additive +Set Classlib To ocomenzi Additive +Set Classlib To anaf_efactura Additive + +Set Procedure To proceduri_comune Additive +Set Procedure To quitapp Additive +Set Procedure To init_program Additive +Set Procedure To onomenclatoare.prg Additive +Set Procedure To onomenclatoare2.prg Additive +Set Procedure To oproceduri_rapoarte_fact.prg Additive +Set Procedure To email.prg Additive +Set Procedure To GENCURSOR.PRG Additive +Set Procedure To OPROCEDURI_COMUNE.PRG Additive +Set Procedure To OINIT_OPTIUNI.PRG Additive +Set Procedure To updateserver.PRG Additive +Set Procedure To OPROCEDURI_aMS.PRG Additive +Set Procedure To ocautare Additive +Set Procedure To odocumente Additive +Set Procedure To osecurity Additive +Set Procedure To acces_meniu Additive +Set Procedure To wwxmlhttp.prg Additive +Set Procedure To wwcodeupdate.prg Additive +Set Procedure To ini.prg Additive +Set Procedure To cauta_alfa.prg Additive +Set Procedure To oHeader.prg Additive +Set Procedure To oproceduri_curs.prg Additive +Set Procedure To proceduri.prg Additive +Set Procedure To oproceduri_facturare.prg Additive +Set Procedure To proceduri_rapoarte.prg Additive +Set Procedure To ofacturare.prg Additive +Set Procedure To oserii_numere.prg Additive +Set Procedure To wwutils.prg Additive +Set Procedure To wwConfig.prg Additive +Set Procedure To wwApi.prg Additive +Set Procedure To oexport.prg Additive +Set Procedure To validare.prg Additive +Set Procedure To ofacturare_comun.prg Additive +Set Procedure To ofacturare_stoc.prg Additive +Set Procedure To pmenu.prg Additive +Set Procedure To ointroduceri.prg Additive +Set Procedure To ovariabile_globale.prg Additive +Set Procedure To ooperatii_comune.prg Additive +Set Procedure To oproceduri_util.prg Additive +Set Procedure To filebringer.prg Additive +Set Procedure To iniacces.prg Additive +Set Procedure To oupdate.prg Additive +Set Procedure To procese.prg Additive +Set Procedure To version.prg Additive +Set Procedure To wwhttp.prg Additive +Set Procedure To xmlaccess.prg Additive +Set Procedure To xmlparser.prg Additive +Set Procedure To xdate.prg Additive +Set Procedure To suma_in_vorbe.prg Additive +Set Procedure To controllerecr Additive +Set Procedure To regex.prg Additive +SET PROCEDURE TO anaf_efactura.prg ADDITIVE + +Declare Integer GetPrivateProfileString In WIN32API ; + string, String, String, String @, Integer, String +Declare Integer WritePrivateProfileString In Win32Api ; + string, String, String, String +Declare Integer CopyFile In WIN32API ; + STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists +Declare Integer PathFileExists In shlwapi STRING pszPath + +If Type('goApi') = 'U' + Public goApi + goApi = Newobject("wwAPI", "wwAPI.prg") +ENDIF + +set procedure to oinit_optiuni.prg additive +set procedure to oproceduri_comune.prg additive + +PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar, poLog, goLog, goApp, goExport +DIRGEN = [D:\ROA\] +gcBasePath = dirgen +gcGeneralIniFile = DIRGEN + "settings.ini" +gcSettingsFile = m.gcGeneralIniFile +gcTempPath = Addbs(shortpath(goApi.GetTempPath())) + gcS + [\] +If !Directory(gcTempPath) + Md (gcTempPath) +Endif +gcAcces = [1;2;3;4;5;6;7;8;] + +poLog = Newobject("Log_Mesaje","Log_Mesaje.prg") +goLog = poLog +goApp = Createobject("wzApplication") +goExport = Createobject("oExportConfig") +gnHandle = 0 +goExecutor = createobject("oExecutor") +goConn = createobject("oConn") +goConn.Connect(m.tcHost, m.tcSchema, m.tcPassword) +IF m.gnHandle <= 0 + RETURN .F. +ENDIF + +LOCAL llSucces, lcSql +goFirma = null +llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma") +IF m.llSucces + SELECT cFirma + gnIdFirma = id_firma + gnIdSucursala = null + gcFirma = ALLTRIM(firma) + SCATTER NAME goFirma + IF TYPE('goFirma.codfiscalfro') = 'U' + ADDPROPERTY(goFirma, 'codfiscalfro', ALLTRIM(STRTRAN(ALLTRIM(NVL(goFirma.cod_fiscal, '')), 'RO', ''))) + ENDIF +ELSE + goFirma = CREATEOBJECT('custom') + goFirma.addproperty('cod_fiscal', '') + goFirma.addproperty('schema', m.gcS) + goFirma.addproperty('firma', m.gcS) + goFirma.addproperty('codfiscalfro', '') +ENDIF +USE IN (SELECT('cFirma')) + +goCalendar = null +llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar') +IF m.llSucces + SELECT cCalendar + GO TOP + IF EMPTY(m.tnAn) + gnAn = anul + gnLuna = luna + ENDIF + SCATTER NAME goCalendar +ENDIF +USE IN (SELECT('cCalendar')) + +CREATE CURSOR dual (dummy c(10)) +INSERT INTO dual (dummy) VALUES ("") + +actualizeaza_optiuni() +Do optiuni_firma IN oinit_optiuni.prg + +lcSql = [begin pack_sesiune.set_Id_Util(?gnIdUtil); end;] +llSucces = goExecutor.oExecuta(lcSql) +lcSql = [begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;] +llSucces = goExecutor.oExecuta(lcSql) +lcSql = [begin pack_sesiune.setlunabal(?gnLuna); pack_sesiune.setanbal(?gnAn); end;] +llSucces = goExecutor.oExecuta(lcSql) +lcSql = [begin pack_contafin.SET_DATA_RON(?gcS); end;] +llSucces = goExecutor.oExecuta(lcSql) +lcSql = [begin pack_sesiune.set_data_ron(?gcS); end;] +llSucces = goExecutor.oExecuta(lcSql) +lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;] +llSucces = goExecutor.oExecuta(lcSql) +lcSql = [begin pack_contafin.set_id_firma(?gnIdFirma); end;] +llSucces = goExecutor.oExecuta(lcSql) + +RETURN .T.