From a580dfd6e186fe29ac625786ba1528852d70f415 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Sun, 23 Aug 2026 20:28:32 +0300 Subject: [PATCH] teste ANAF nomenclator: proba e2e pe formularul real + init mediu ROADEF Proba end-to-end ruleaza formularul frm_firme_nou_desktopf peste nomenclatorul Oracle real; 997/1000 coduri fiscale reale potrivite corect. Testul sintetic acopera 42 de verificari, fara Oracle si fara ANAF. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_015husoVS24ewJZr21ZoVR3v --- utile/Teste/cache_anaf/codes_1000_reale.txt | 1000 +++++++++++++++++ utile/Teste/mock_amessagebox.prg | 10 +- .../mock_verifica_partener_show_info.prg | 50 + .../partener_anaf/test_e2e_anaf_firma.prg | 299 +++++ utile/Teste/test_anaf_nomenclator.prg | 167 +++ utile/Teste/test_init_env_auto_roadef.prg | 263 +++++ 6 files changed, 1787 insertions(+), 2 deletions(-) create mode 100644 utile/Teste/cache_anaf/codes_1000_reale.txt create mode 100644 utile/Teste/partener_anaf/mock_verifica_partener_show_info.prg create mode 100644 utile/Teste/partener_anaf/test_e2e_anaf_firma.prg create mode 100644 utile/Teste/test_anaf_nomenclator.prg create mode 100644 utile/Teste/test_init_env_auto_roadef.prg diff --git a/utile/Teste/cache_anaf/codes_1000_reale.txt b/utile/Teste/cache_anaf/codes_1000_reale.txt new file mode 100644 index 0000000..9eb715e --- /dev/null +++ b/utile/Teste/cache_anaf/codes_1000_reale.txt @@ -0,0 +1,1000 @@ +28508964 +31102256 +38159101 +37229012 +34450077 +36924452 +1959695 +4239966 +29527964 +48049238 +30661675 +23535372 +18450431 +47674432 +42522395 +31456628 +4505596 +40516370 +17488080 +3626921 +36653752 +9787668 +46334190 +15011024 +46267040 +31605711 +19844850 +40164762 +1384414 +35871180 +12472171 +9718978 +37980531 +18691553 +11296867 +43681305 +36281772 +40781393 +35456914 +32005243 +29372720 +21584263 +43692061 +45346374 +45128892 +23025071 +32333763 +14162177 +48225300 +328289 +9318882 +47958000 +32383290 +29108656 +1444869 +25449480 +38240485 +39602877 +34652718 +46438492 +14639030 +42299715 +30160410 +15751375 +3032236 +37899535 +39511647 +32370923 +35963070 +15431788 +39406218 +2816464 +40943940 +30488389 +37572648 +36915535 +27058004 +38186041 +21311530 +857867 +30941527 +42683286 +29900965 +41431019 +9010105 +41174012 +17942207 +47325491 +21834238 +6466990 +47644849 +40339953 +26491963 +29704683 +31524080 +31481850 +34225750 +45179381 +18226257 +54780720 +17347277 +50223750 +4992254 +512906 +40801423 +5261031 +21255775 +35629233 +16104008 +37313082 +41727198 +53704970 +33801633 +21767066 +30923148 +52169640 +33072097 +11747177 +21581372 +30911844 +18988482 +44979033 +34963277 +35235786 +24163196 +5005408 +21549460 +30864548 +16638243 +37216470 +29128009 +39376907 +45238135 +13527569 +33866063 +12529456 +16454275 +48636712 +19085164 +40923110 +22042589 +25773281 +37031731 +37315016 +44538894 +26503979 +34510632 +45736849 +18256010 +30526512 +8477324 +24581237 +33214949 +22223879 +13892807 +37816122 +44797813 +45093662 +51027108 +35970981 +44243168 +27670150 +42513567 +16526142 +44803346 +17244611 +31239483 +42932786 +44640184 +41600398 +40847552 +32050724 +48681519 +29519996 +42282713 +6469414 +3451510 +26813708 +53149934 +40166950 +17412685 +34706370 +37821749 +17845530 +22705274 +42838097 +18676090 +29866561 +50672237 +7709175 +3601803 +28672532 +30468586 +19215671 +35067291 +1655157 +37942120 +17822260 +48993685 +23232077 +34839091 +46311900 +39273090 +30940491 +12276949 +38134000 +38628674 +44742923 +50072623 +41931987 +27460132 +43410390 +22269671 +24624877 +17985232 +36362699 +6233005 +31487527 +46862004 +30085211 +2806142 +19194781 +16976252 +23599317 +20303416 +10763549 +15618914 +24188123 +35458460 +30164455 +33694014 +66811 +44111485 +33990842 +45189857 +21782619 +18285164 +39989251 +35012059 +34613735 +18214074 +36552570 +54562792 +33179256 +6462360 +30214960 +26157808 +47206121 +34527472 +4730059 +36708351 +42075769 +36385811 +49386169 +6345653 +26752988 +33656584 +33974901 +33433795 +33012532 +29792987 +5788792 +35447002 +43519215 +25873523 +20796950 +30921155 +15108907 +21274351 +45419042 +40570060 +5052558 +30158860 +13713944 +39308287 +29365773 +9977590 +13823815 +35577150 +18363823 +46111341 +52474317 +25196930 +45107016 +36795404 +37087120 +44910504 +47704819 +42888290 +10758330 +26857682 +33815787 +25422485 +42452877 +19235890 +7740731 +5450286 +25207282 +22478082 +40365430 +41106050 +1821020 +28114820 +50211535 +45644230 +33236157 +29718913 +14732022 +39318272 +21503536 +34808273 +13906384 +21186420 +31739470 +24455794 +52484345 +27355790 +36188534 +16177867 +32224855 +13556726 +45420268 +34577063 +16252306 +5150270 +51738534 +50494377 +31682390 +40821188 +21535805 +34149105 +27689781 +14431151 +15214118 +40675155 +3054536 +38030319 +4058331 +40559380 +43951867 +33154367 +45092888 +40672981 +28751229 +39032202 +39983038 +25677381 +37335390 +7637257 +45623980 +33905880 +6175494 +38715282 +48222729 +50505310 +35582351 +50571500 +39097350 +48111445 +44048043 +15917355 +36255030 +11926202 +16014100 +40670751 +19333979 +27714001 +37473008 +32608503 +38625589 +49867383 +37234582 +32352692 +49180230 +19031423 +36174687 +22847759 +40956410 +45135059 +378660 +25948332 +38734683 +34128218 +37769837 +37523300 +50835474 +33215812 +15995434 +40910366 +18026410 +19241301 +21694681 +33419553 +31979031 +15905547 +13665367 +17733090 +38604799 +26470456 +19066650 +42449928 +19616630 +35127890 +8984971 +25250355 +48650105 +34890639 +35642585 +45032223 +41024589 +8069929 +4014041 +36305162 +35867472 +37620761 +37008330 +30379683 +47878017 +28829476 +2543321 +49860695 +35652481 +35389220 +35949920 +45076599 +6841720 +34325651 +37312907 +40931628 +36336487 +22749351 +24448010 +10957057 +46000963 +43807951 +31041531 +2417935 +34649917 +42281955 +4193117 +24471552 +37080467 +45262168 +43072680 +8156596 +18433929 +22300904 +45120430 +28429801 +15437993 +38038789 +474152 +12185069 +40742009 +1717977 +15344312 +34000188 +39946277 +43586524 +29231631 +34037330 +6288825 +45256085 +47795280 +36799546 +4266898 +38026938 +35058587 +31145907 +45081722 +48787448 +32515943 +43255350 +31153152 +2806207 +33663344 +16625715 +4845920 +33233177 +43099294 +41892691 +49870273 +21001912 +35824064 +34363264 +33570644 +34335442 +49118395 +41710234 +9999857 +46289994 +8890621 +29851340 +46828363 +33552478 +35731070 +15823285 +41180359 +33973302 +30713553 +42761481 +36983327 +36635314 +30533137 +13921597 +44529780 +1168348 +42658444 +16000996 +40291669 +18211884 +26299330 +32496876 +24649197 +17324320 +48037233 +41024198 +52100444 +16768936 +23690465 +33201418 +44286967 +50598408 +43845475 +36730561 +29939205 +27974559 +45806480 +42627588 +45458637 +25392139 +45811754 +46481930 +558580 +26029124 +43934092 +41345678 +31721449 +43850994 +2896277 +44633063 +16005870 +32089090 +51353775 +15528900 +33775631 +24553539 +31641293 +38641711 +49222719 +10287470 +6692717 +28987638 +27078460 +5708580 +42000448 +18741902 +29307829 +45952010 +35781176 +11201891 +49786343 +30451576 +41718793 +40568493 +29113806 +14645945 +16661980 +29187501 +39911554 +12655284 +49097918 +36804154 +33464147 +5466592 +42811334 +18779419 +29955774 +31032037 +14916459 +52929028 +40566638 +42346094 +43154356 +23571995 +37801350 +43995758 +19129848 +18851646 +41218712 +16315943 +32999061 +36202167 +11142701 +16495836 +33941343 +43827002 +33141871 +28686732 +46856835 +40139807 +10943540 +15419458 +31701913 +26306381 +8458446 +36654383 +43958008 +9225651 +29211740 +36664549 +43040238 +40629302 +50411177 +40341040 +14140462 +37453817 +9646928 +4266081 +27398723 +48616570 +49699336 +46121434 +20487580 +28473475 +42554583 +41895892 +46602942 +33774016 +33549227 +40080700 +21059094 +35766672 +49984804 +31218430 +29078130 +48175635 +2873052 +6079578 +34699788 +44912521 +9638020 +36085750 +36915039 +44703738 +18733209 +30711668 +37183225 +34262570 +9780309 +46899470 +36911592 +5373078 +33002849 +34547186 +16205932 +24802109 +34231425 +7919363 +46963190 +46333240 +26625593 +36349657 +42663076 +32891557 +30011370 +15168330 +42690429 +5189475 +50796685 +39257566 +48223996 +51512285 +49182940 +49527330 +46357436 +41272681 +27998760 +26487091 +30715139 +35094385 +16446710 +24446621 +52907712 +41505477 +13101724 +18917716 +40264397 +23359381 +29734080 +40751244 +33509419 +20828211 +36813314 +42177173 +30156355 +21850004 +14492779 +36507927 +40423816 +5328123 +46100660 +38813825 +37231802 +43443486 +48223317 +5931085 +44194430 +41039466 +43844640 +18196946 +41458650 +4043330 +35195053 +9250710 +36185899 +38414611 +42145368 +53087645 +34370229 +45772108 +6595366 +43807455 +32213767 +10520280 +32844369 +10655369 +50907287 +6036119 +38976563 +39097341 +35868079 +36743987 +37802895 +46309331 +33020144 +25393673 +39160970 +26740738 +34093403 +52598293 +8466457 +21323250 +45176199 +40303178 +49649087 +53823598 +33256472 +31122296 +22315905 +42242166 +37226415 +41794219 +40558309 +36454350 +13044149 +16787997 +18350009 +14265482 +13554423 +17156161 +32980212 +34162619 +39921833 +47681030 +18421762 +14756056 +32799799 +38501025 +48178003 +49948631 +45706708 +33554568 +43575746 +35713783 +14811894 +764520 +41715487 +23700739 +18240260 +47670074 +49193516 +46706242 +29197319 +9555137 +33194256 +2849747 +23225592 +42039960 +33751608 +42017784 +45025552 +2434847 +33308164 +34839300 +13456573 +38911424 +37278325 +29281230 +7074676 +32516175 +42120045 +32738120 +46282856 +41517757 +16273830 +14328360 +23903083 +36069894 +39611832 +32553394 +24056785 +42906469 +30595210 +23773293 +42740446 +34627390 +31021453 +36621351 +1387925 +32705140 +13453151 +8031851 +17616820 +40486288 +46981056 +3597311 +48008688 +37211562 +21707030 +40298306 +42832302 +35814931 +43043471 +41023290 +44274377 +36562026 +46439617 +49194279 +44784945 +44350679 +32865272 +52623400 +45104699 +6954907 +44767740 +38850718 +40920319 +17425278 +39469682 +43175723 +27016696 +32412107 +42944730 +11758273 +18242562 +1217815 +28157120 +24716369 +29258009 +22575018 +31292525 +29782738 +31333846 +33745797 +44107670 +43054535 +15532960 +16649765 +15308891 +10934363 +26104684 +35817830 +19939488 +35253278 +5414623 +31532539 +16962095 +45038919 +11271340 +46012003 +42206953 +5581222 +24867051 +41209951 +23319301 +5290886 +46322004 +35241931 +36423141 +51169749 +30719556 +17942037 +4696399 +49052851 +9256208 +35179201 +44500008 +23140585 +35856023 +43015790 +5990561 +36131368 +6196861 +44733569 +49225200 +23058400 +30681346 +45472950 +36838971 +44825891 +40858403 +50317529 +8024331 +4363815 +10138800 +34982538 +16892356 +8959218 +43309639 +28308419 +30358079 +9550768 +27835232 +43194350 +52402787 +34658303 +41864152 +15958681 +37425469 +32368338 +16526606 +1137082 +28927962 +22354360 +29474118 +30702112 +26787323 +43991420 +38619846 +49414129 +48760787 +25697729 +16424177 +35969065 +41184385 +5156249 +34221235 +36260125 +28364656 +27650714 +35253243 +16139863 +6511071 +14002427 +34723312 +8309185 +13458124 +18284649 +6417962 +27309823 +16800441 +2315501 +27906970 +35826901 +24126708 +40863825 +40965132 +43254967 +18491148 +34788290 +21470129 +49972133 +34170026 +1406490 +22511723 +24256457 +21408445 +6861786 +29961490 +13650960 +137408 +18836638 +36069738 +33294352 +35151278 +39774066 +37547920 +39230749 +44112790 +24359711 +29280472 +35146263 +40709231 +44703690 +45367482 +38811310 +32203550 +15079577 +54610458 diff --git a/utile/Teste/mock_amessagebox.prg b/utile/Teste/mock_amessagebox.prg index ec82a1a..83b3f66 100644 --- a/utile/Teste/mock_amessagebox.prg +++ b/utile/Teste/mock_amessagebox.prg @@ -1,7 +1,13 @@ * mock_amessagebox.prg - inlocuieste FUNCTION amessagebox (din oproceduri_comune.prg) in teste, * ca dialogurile modale de confirmare sa NU blocheze testul headless. Returneaza 6 (Da/OK) implicit. -* Se incarca ULTIMA cu SET PROCEDURE ... ADDITIVE - in VFP, la nume duplicat de procedura, -* castiga fisierul de proceduri deschis cel mai recent. Logheaza apelul (dovada rezolutiei). +* Se incarca cu SET PROCEDURE ... ADDITIVE **PRIMA**, INAINTEA fisierelor aplicatiei: la nume +* duplicat de procedura VFP foloseste fisierul cautat PRIMUL (verificat empiric - vezi +* COMUN\docs\testare-ui-vfp.md capcana g si antetul lui partener_anaf\mock_anaf_verificare.prg). +* 23.08.2026: antetul spunea pana acum "ULTIMA", ceea ce e invers si a costat o rulare blocata +* pe un dialog modal (test_e2e_anaf_firma). Logheaza apelul (dovada rezolutiei). +* LIMITA: nu acopera sigur apelurile INTRA-FISIER. `verifica_partener_show_info` si `amessagebox` +* sunt amandoua in oproceduri_comune.prg, deci dialogul acelei functii ramane modal chiar cu +* mock-ul incarcat; pentru el exista partener_anaf\mock_verifica_partener_show_info.prg. * Configurabil per apel: daca testul declara PUBLIC gnMockRaspuns (implicit 6 daca nedeclarata), * mock-ul returneaza acea valoare - necesar pt. meniuri cu raspunsuri diferite (6/7/2) pe acelasi * dialog (ex. do_sterge/do_copiaza_nota, flag 3+32 Yes/No/Cancel). diff --git a/utile/Teste/partener_anaf/mock_verifica_partener_show_info.prg b/utile/Teste/partener_anaf/mock_verifica_partener_show_info.prg new file mode 100644 index 0000000..e4a9d9d --- /dev/null +++ b/utile/Teste/partener_anaf/mock_verifica_partener_show_info.prg @@ -0,0 +1,50 @@ +* mock_verifica_partener_show_info.prg - inlocuieste FUNCTION verifica_partener_show_info +* (COMUN\programe\oproceduri_comune.prg:4767) in teste headless. +* +* DE CE UN MOCK SEPARAT, cand exista deja mock_amessagebox.prg: functia reala se termina cu +* `amessagebox(lcText, ...)`, iar acel apel pleaca DIN oproceduri_comune.prg, adica din acelasi +* fisier in care e definita si FUNCTION amessagebox. Mock-ul de messagebox nu acopera sigur +* apelurile intra-fisier, deci dialogul de confirmare "Doriti sa se completeze datele in +* formular?" ramanea modal si bloca rularea headless (masurat: proba se opreste pe primul CIF). +* Aici se inlocuieste direct wrapper-ul de dialog - tot infrastructura, nu un pas al fluxului +* testat: functia reala doar formateaza un text si intoarce raspunsul utilizatorului. +* +* Se incarca cu SET PROCEDURE ... ADDITIVE **INAINTEA** fisierelor aplicatiei: la nume duplicat +* de FUNCTION, VFP foloseste fisierul cautat PRIMUL (vezi COMUN\docs\testare-ui-vfp.md capcana g). +* +* Raspunsul intors: gnMockRaspunsShowInfo daca e declarata PUBLIC, altfel 6 (Da). +* Efect secundar util testelor: datele BRUTE primite de la ANAF (inainte de potrivirea peste +* nomenclator) se depun in variabilele publice de mai jos, daca testul le-a declarat ca string: +* gcMockAnafJudet, gcMockAnafLocalitate, gcMockAnafAdresa, gcMockAnafFirma +* plus contorul gnMockShowInfoApeluri (numeric), daca e declarat. + +FUNCTION verifica_partener_show_info + LPARAMETERS toPartenerVerificare, tcCodFiscal, tcDenumire, tcMesajIntrebare + LOCAL lnRaspuns + + IF TYPE('gnMockShowInfoApeluri') = 'N' + gnMockShowInfoApeluri = gnMockShowInfoApeluri + 1 + ENDIF + + IF VARTYPE(m.toPartenerVerificare) = 'O' + IF TYPE('gcMockAnafJudet') = 'C' + gcMockAnafJudet = IIF(PEMSTATUS(m.toPartenerVerificare, 'judet', 5), ; + ALLTRIM(NVL(toPartenerVerificare.judet, '')), '') + ENDIF + IF TYPE('gcMockAnafLocalitate') = 'C' + gcMockAnafLocalitate = IIF(PEMSTATUS(m.toPartenerVerificare, 'localitate', 5), ; + ALLTRIM(NVL(toPartenerVerificare.localitate, '')), '') + ENDIF + IF TYPE('gcMockAnafAdresa') = 'C' + gcMockAnafAdresa = IIF(PEMSTATUS(m.toPartenerVerificare, 'adresa', 5), ; + ALLTRIM(NVL(toPartenerVerificare.adresa, '')), '') + ENDIF + IF TYPE('gcMockAnafFirma') = 'C' + gcMockAnafFirma = IIF(PEMSTATUS(m.toPartenerVerificare, 'firma', 5), ; + ALLTRIM(NVL(toPartenerVerificare.firma, '')), '') + ENDIF + ENDIF + + lnRaspuns = IIF(TYPE('gnMockRaspunsShowInfo') = 'N', gnMockRaspunsShowInfo, 6) + RETURN m.lnRaspuns +ENDFUNC diff --git a/utile/Teste/partener_anaf/test_e2e_anaf_firma.prg b/utile/Teste/partener_anaf/test_e2e_anaf_firma.prg new file mode 100644 index 0000000..dcd932f --- /dev/null +++ b/utile/Teste/partener_anaf/test_e2e_anaf_firma.prg @@ -0,0 +1,299 @@ +* test_e2e_anaf_firma.prg +* Proba END-TO-END pentru todo #22 (preluare date ANAF la datele firmei), pe traseul REAL: +* formularul frm_firme_nou_desktopf + Click pe But_verifica1 -> anaf_completeaza_firma -> +* verifica_partener (apel ANAF live) -> ParseAdresaAnaf/FaraPrefixLoc -> AnafNomenclator -> +* Ct_localitate1.modifica_judet / modifica_localitate, peste nomenclatorul Oracle REAL. +* +* Ce acopera in plus fata de test_anaf_nomenclator.prg: acela ruleaza potrivirea pe cursoare +* SINTETICE, in afara formularului. Aici cursoarele sunt cele construite de ct_localitate din +* syn_vnom_judete / syn_vnom_localitati (inclusiv randul-santinela ""), iar +* apasarea e pe butonul real - conform regulii: testele pe frontend exerseaza fluxul real, +* nu populeaza direct cursoarele. +* +* ATENTIE (1): foloseste test_init_env_auto_ROADEF, nu test_init_env_auto.prg. Acela porneste pe +* D:\ROA\ROACONT\, alt working copy de COMUN, fara modificarile necomise de aici - ar testa +* codul vechi si ar da rezultate false. +* ATENTIE (2): tot codul care construieste obiecte sta INLINE in programul principal, nu in +* proceduri (capcana l din COMUN\docs\testare-ui-vfp.md), iar TRY/CATCH nu contine RETURN +* (VFP9: eroare 2060 "RETURN/RETRY statement not allowed in TRY/CATCH"). +* +* Rulare headless (nu tine VFP IDE sau roadef.exe deschis): +* Remove-Item -Force +* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ; +* "D:\ROA\ROADEF\COMUN\utile\Teste\partener_anaf\test_e2e_anaf_firma.prg" +* Log: test_e2e_anaf_firma_log.txt, langa acest fisier. +* +* Numarul de coduri fiscale rulate: gnE2ELimita (implicit 8). Codurile vin din +* ..\cache_anaf\codes_200_reale.txt (coduri reale). Fiecare cod = un apel ANAF live. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcLogE2E, gnOk, gnEsec, gnSarite, gnE2ELimita, goNomE2E, ; + gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip, ; + gnMockRaspunsShowInfo, gnMockShowInfoApeluri, ; + gcMockAnafJudet, gcMockAnafLocalitate, gcMockAnafAdresa, gcMockAnafFirma +gcLogE2E = ADDBS(JUSTPATH(SYS(16, 0))) + 'test_e2e_anaf_firma_log.txt' +IF EMPTY(JUSTPATH(SYS(16, 0))) + gcLogE2E = 'D:\ROA\ROADEF\COMUN\utile\Teste\partener_anaf\test_e2e_anaf_firma_log.txt' +ENDIF +gnOk = 0 +gnEsec = 0 +gnSarite = 0 +* cate coduri se ruleaza: implicit 8, sau variabila de mediu E2E_LIMITA (ex. 200 pentru +* o masuratoare completa) - vfp9.exe nu poate primi parametri pentru scriptul din -T +gnE2ELimita = IIF(VAL(GETENV('E2E_LIMITA')) > 0, INT(VAL(GETENV('E2E_LIMITA'))), 8) +goNomE2E = .NULL. +gnMockRaspuns = 6 && "Da" la dialogurile amessagebox +gcMockUltimMesaj = '' && mock_amessagebox memoreaza aici textul ultimului dialog +gnMockUltimTip = 0 +gnMockRaspunsShowInfo = 6 && "Da" la "Doriti sa se completeze datele in formular?" +gnMockShowInfoApeluri = 0 +* datele BRUTE de la ANAF, depuse de mock_verifica_partener_show_info INAINTE de potrivire +gcMockAnafJudet = '' +gcMockAnafLocalitate = '' +gcMockAnafAdresa = '' +gcMockAnafFirma = '' + +STRTOFILE('START test_e2e_anaf_firma ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLogE2E) + +ON ERROR DO E2EErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +* ===== mock-urile de dialoguri, INAINTEA fisierelor aplicatiei ===== +* La nume duplicat de FUNCTION, VFP foloseste fisierul cautat PRIMUL +* (COMUN\docs\testare-ui-vfp.md capcana g). Incarcate DUPA mediu, dialogurile raman modale +* si rularea headless se blocheaza pe primul CIF (masurat: proba s-a oprit pe 10117033). +SET PROCEDURE TO D:\ROA\ROADEF\COMUN\utile\Teste\partener_anaf\mock_verifica_partener_show_info.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROADEF\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE + +* ===== mediu ===== +DO D:\ROA\ROADEF\COMUN\utile\Teste\test_init_env_auto_roadef.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0 + DO E2ELog WITH 'EROARE: conectare Oracle esuata, gnHandle=' + TRANSFORM(IIF(TYPE('gnHandle') = 'N', gnHandle, -1)) + DO E2ELog WITH 'REZULTAT: NEDETERMINAT' + QUIT +ENDIF +DO E2ELog WITH 'mediu OK: gcS=' + gcS + ' gnIdFirma=' + TRANSFORM(gnIdFirma) + ; + ' gnScrieRegistru=' + TRANSFORM(gnScrieRegistru) + ' gcNumeProgram=' + gcNumeProgram + +* ===== dovada 1: rulam pe COMUN-ul din ROADEF, cu fixul din todo #22 ===== +LOCAL llAreFix, loEx AS Exception +llAreFix = .F. +TRY + goNomE2E = CREATEOBJECT('AnafNomenclator') + llAreFix = (VARTYPE(goNomE2E) = 'O') +CATCH TO loEx + llAreFix = .F. +ENDTRY +DO E2ELog WITH 'AnafNomenclator disponibil: ' + IIF(m.llAreFix, 'DA', 'NU') +IF !m.llAreFix + DO E2ELog WITH 'REZULTAT: NEDETERMINAT - s-a incarcat un COMUN fara fixul din todo #22' + QUIT +ENDIF + +* ===== dovada 2: mock-ul de dialog a castigat ===== +* Cu obiect gol, functia REALA moare la loPartener.platitortvamfin inainte de amessagebox; +* mock-ul intoarce 6 fara sa deschida nimic. Daca nu castiga, rularea s-ar bloca pe primul modal. +LOCAL loDummyE2E, lnProbaMock +loDummyE2E = CREATEOBJECT('empty') +lnProbaMock = -1 +TRY + lnProbaMock = verifica_partener_show_info(m.loDummyE2E, '0', '', 'proba mock') +CATCH TO loEx + lnProbaMock = -2 +ENDTRY +gnMockShowInfoApeluri = 0 +DO E2ELog WITH 'mock verifica_partener_show_info activ: ' + ; + IIF(m.lnProbaMock = 6, 'DA', 'NU (raspuns ' + TRANSFORM(m.lnProbaMock) + ')') +IF m.lnProbaMock <> 6 + DO E2ELog WITH 'REZULTAT: NEDETERMINAT - fara mock, primul dialog modal blocheaza rularea headless' + QUIT +ENDIF + +* ===== firma curenta, ca in oproceduri_roadef.viz_firme ===== +LOCAL lcSqlFirma +lcSqlFirma = [select * from syn_v_nom_firme where sters = 0 and id_firma = ] + ALLTRIM(STR(goFirma.id_firma)) +IF !goExecutor.oExecuta(m.lcSqlFirma, 'crsFirmaE2E') OR RECCOUNT('crsFirmaE2E') = 0 + DO E2ELog WITH 'EROARE: nu am putut citi firma curenta (' + m.lcSqlFirma + ')' + DO E2ELog WITH 'REZULTAT: NEDETERMINAT' + QUIT +ENDIF +SELECT crsFirmaE2E +GO TOP +DO E2ELog WITH 'firma de lucru: id_firma=' + TRANSFORM(id_firma) + ' [' + ALLTRIM(NVL(firma, '')) + ']' + +* ===== lista de coduri fiscale reale ===== +LOCAL lcFisCoduri, lnTotalCoduri, lnI, lcCod +LOCAL ARRAY laCoduri[1] +* lotul de coduri: implicit cel de 200, sau variabila de mediu E2E_CODURI (cale completa) +lcFisCoduri = ALLTRIM(GETENV('E2E_CODURI')) +IF EMPTY(m.lcFisCoduri) + lcFisCoduri = 'D:\ROA\ROADEF\COMUN\utile\Teste\cache_anaf\codes_200_reale.txt' +ENDIF +IF !FILE(m.lcFisCoduri) + DO E2ELog WITH 'EROARE: lipseste ' + m.lcFisCoduri + DO E2ELog WITH 'REZULTAT: NEDETERMINAT' + QUIT +ENDIF +lnTotalCoduri = ALINES(laCoduri, FILETOSTR(m.lcFisCoduri)) +DO E2ELog WITH 'lot: ' + m.lcFisCoduri +DO E2ELog WITH 'coduri disponibile: ' + TRANSFORM(m.lnTotalCoduri) + ', rulez primele ' + TRANSFORM(gnE2ELimita) +DO E2ELog WITH REPLICATE('-', 110) + +* ===== rulare: un cod fiscal = un formular nou + un Click pe butonul real ===== +* Totul inline (capcana l): CREATEOBJECT pe formular dintr-o procedura e nesigur headless. +PRIVATE poRec +LOCAL lnRulate, loFrm, llFrmOk, llClickOk, lcErr +LOCAL lcAdrAnaf, lcJudAnaf, lcLocAnaf, lcJudet, lcLoc, lnIdJudet, lnIdLoc +LOCAL llOkJud, llOkLoc, lcDetaliu +lnRulate = 0 + +FOR lnI = 1 TO m.lnTotalCoduri + lcCod = ALLTRIM(laCoduri[m.lnI]) + IF !EMPTY(m.lcCod) AND ISDIGIT(m.lcCod) AND m.lnRulate < gnE2ELimita + lnRulate = m.lnRulate + 1 + + * record proaspat pentru fiecare cod, direct din cursorul firmei (ca in viz_firme: + * Select v_firme / Scatter Name loRec), ca sa nu ramana stare de la codul anterior. + * Plasa: _frm_base.Destroy face USE IN (SELECT(thisform.ccursor)) si, cu ccursor gol, + * poate inchide zona de lucru curenta - refacem cursorul daca s-a pierdut. + IF !USED('crsFirmaE2E') + IF !goExecutor.oExecuta(m.lcSqlFirma, 'crsFirmaE2E') + DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC: nu am putut reface crsFirmaE2E' + gnEsec = gnEsec + 1 + LOOP + ENDIF + ENDIF + SELECT crsFirmaE2E + GO TOP + SCATTER NAME poRec MEMO + * golim campurile pe care le completeaza traseul ANAF, ca sa nu confundam o valoare + * ramasa din firma curenta cu una preluata acum + poRec.cod_fiscal = m.lcCod + poRec.judet = '' + poRec.id_judet = .NULL. + poRec.localitate = '' + poRec.id_loc = .NULL. + poRec.adresa = '' + IF TYPE('poRec.modificare_schema') = 'U' + ADDPROPERTY(poRec, 'modificare_schema', 0) + ENDIF + + gcMockUltimMesaj = '' + gcMockAnafJudet = '' + gcMockAnafLocalitate = '' + gcMockAnafAdresa = '' + gcMockAnafFirma = '' + gnMockShowInfoApeluri = 0 + + llFrmOk = .F. + lcErr = '' + TRY + loFrm = CREATEOBJECT('frm_firme_nou_desktopf', poRec, poRec.id_firma, 'UPDATE') + llFrmOk = (VARTYPE(loFrm) = 'O') + CATCH TO loEx + lcErr = loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']' + ENDTRY + + IF !m.llFrmOk + gnEsec = gnEsec + 1 + DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC: nu s-a putut crea formularul: ' + m.lcErr + ELSE + llClickOk = .F. + lcErr = '' + TRY + loFrm.But_verifica1.Click() + llClickOk = .T. + CATCH TO loEx + lcErr = loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']' + ENDTRY + + IF !m.llClickOk + gnEsec = gnEsec + 1 + DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC: exceptie in But_verifica1.Click: ' + m.lcErr + ELSE + lcAdrAnaf = UPPER(ALLTRIM(gcMockAnafAdresa)) + lcJudAnaf = UPPER(ALLTRIM(gcMockAnafJudet)) + lcLocAnaf = UPPER(ALLTRIM(gcMockAnafLocalitate)) + lcJudet = ALLTRIM(NVL(poRec.judet, '')) + lcLoc = ALLTRIM(NVL(poRec.localitate, '')) + lnIdJudet = NVL(poRec.id_judet, -1) + lnIdLoc = NVL(poRec.id_loc, -1) + + IF gnMockShowInfoApeluri = 0 OR EMPTY(m.lcJudAnaf) + * ANAF n-a intors un partener valid, sau l-a intors fara adresa (cod inactiv / + * fara raspuns / notFound): nu se poate judeca potrivirea peste nomenclator + gnSarite = gnSarite + 1 + DO E2ELog WITH 'CIF ' + m.lcCod + ' -> SARIT: ANAF nu a intors adresa. Ultim dialog: [' + ; + LEFT(STRTRAN(STRTRAN(gcMockUltimMesaj, CHR(13), ' '), CHR(10), ' '), 150) + ']' + ELSE + * judetul e OK daca s-a completat, are id din nomenclator si denumirea potrivita + * corespunde textului brut primit de la ANAF + llOkJud = !EMPTY(m.lcJudet) AND m.lnIdJudet > 0 AND E2EPotrivit(m.lcJudet, m.lcJudAnaf) + * localitatea: la fel; santinela "" NU e rezultat valid + llOkLoc = !EMPTY(m.lcLoc) AND !(' 0 ; + AND E2EPotrivit(m.lcLoc, m.lcLocAnaf) + + lcDetaliu = 'ANAF[jud=' + m.lcJudAnaf + ' loc=' + m.lcLocAnaf + ']' + ; + ' -> NOM[judet=' + m.lcJudet + ' id_judet=' + TRANSFORM(m.lnIdJudet) + ; + ' localitate=' + m.lcLoc + ' id_loc=' + TRANSFORM(m.lnIdLoc) + ']' + + IF m.llOkJud AND m.llOkLoc + gnOk = gnOk + 1 + DO E2ELog WITH 'CIF ' + m.lcCod + ' -> OK ' + m.lcDetaliu + ELSE + gnEsec = gnEsec + 1 + DO E2ELog WITH 'CIF ' + m.lcCod + ' -> ESEC ' + ; + IIF(!m.llOkJud, '[judet] ', '') + IIF(!m.llOkLoc, '[localitate] ', '') + m.lcDetaliu + DO E2ELog WITH ' adresa ANAF: ' + LEFT(m.lcAdrAnaf, 150) + DO E2ELog WITH ' ultim dialog: [' + ; + LEFT(STRTRAN(STRTRAN(gcMockUltimMesaj, CHR(13), ' '), CHR(10), ' '), 200) + ']' + ENDIF + ENDIF + ENDIF + loFrm.Release() + loFrm = .NULL. + ENDIF + ENDIF +ENDFOR + +DO E2ELog WITH REPLICATE('-', 110) +DO E2ELog WITH 'TOTAL: ' + TRANSFORM(gnOk) + ' ok, ' + TRANSFORM(gnEsec) + ' esec, ' + ; + TRANSFORM(gnSarite) + ' sarite (fara raspuns ANAF), din ' + TRANSFORM(m.lnRulate) + ' coduri rulate' +DO E2ELog WITH 'REZULTAT: ' + IIF(gnEsec = 0, 'TOATE OK', 'AU FOST ESECURI') + ' ' + TTOC(DATETIME()) +QUIT + + +********************************************************************* +* Denumirea aleasa din nomenclator corespunde textului brut de la ANAF? +* Comparatia foloseste cheia toleranta a clasei (fara sufixul dintre paranteze, fara +* separatoare, cu A si I unificate) - altfel "TIRGU MURES" din nomenclator nu ar corespunde +* cu "TARGU MURES" de la ANAF si am raporta un esec fals. +* goNomE2E e construit INLINE in main (capcana l); aici doar se foloseste. +FUNCTION E2EPotrivit + LPARAMETERS tcDinNomenclator, tcDeLaAnaf + LOCAL lcA, lcB + IF VARTYPE(goNomE2E) <> 'O' OR EMPTY(ALLTRIM(NVL(m.tcDeLaAnaf, ''))) + RETURN .F. + ENDIF + lcA = goNomE2E.cheie_fuzzy(m.tcDinNomenclator) + lcB = goNomE2E.cheie_fuzzy(m.tcDeLaAnaf) + RETURN !EMPTY(m.lcA) AND (m.lcA == m.lcB) +ENDFUNC + + +********************************************************************* +PROCEDURE E2EErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO E2ELog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + + +********************************************************************* +PROCEDURE E2ELog + LPARAMETERS tcMsg + LOCAL lcL + lcL = IIF(FILE(gcLogE2E), FILETOSTR(gcLogE2E), '') + STRTOFILE(m.lcL + TRANSFORM(m.tcMsg) + CHR(13) + CHR(10), gcLogE2E) +ENDPROC diff --git a/utile/Teste/test_anaf_nomenclator.prg b/utile/Teste/test_anaf_nomenclator.prg new file mode 100644 index 0000000..906d8b4 --- /dev/null +++ b/utile/Teste/test_anaf_nomenclator.prg @@ -0,0 +1,167 @@ +*!* 23.08.2026 +*!* marius.mutu +*!* Test headless pentru potrivirea denumirilor ANAF peste nomenclator: taierea prefixului in +*!* ParseAdresaAnaf si treptele din AnafNomenclator (exact / fara sufix / fuzzy A-I). + +Local lcLog, lcComun, loV, loN, lnOk, lnNok + +lcComun = Addbs(Justpath(Justpath(Justpath(Sys(16))))) +lcLog = Addbs(Justpath(Sys(16))) + "test_anaf_nomenclator_log.txt" +If File(m.lcLog) + Erase (m.lcLog) +Endif + +Public gnOk, gnNok, gcLog +gnOk = 0 +gnNok = 0 +gcLog = m.lcLog + +*** fara On Error o eroare de runtime ar deschide un dialog modal si testul ar atarna +On Error Strtofile("EROARE " + Transform(Error()) + " linia " + Transform(Lineno()) + ": " + Message() + Chr(13) + Chr(10), m.gcLog, .T.) + +Set Procedure To (m.lcComun + "programe\validare.prg") Additive +Set Procedure To (m.lcComun + "programe\onomenclatoare.prg") Additive + +loV = Createobject("VerificareANAF") +loN = Createobject("AnafNomenclator") + +*** --- FaraPrefixLoc: prefixul se taie, restul denumirii ramane intreg --- +Verif("prefix JUD. un cuvant", loV.FaraPrefixLoc("JUD. CONSTANTA"), "CONSTANTA") +Verif("prefix JUD. doua cuvinte", loV.FaraPrefixLoc("JUD. SATU MARE"), "SATU MARE") +Verif("prefix ORS.", loV.FaraPrefixLoc("ORS. TIRGU NEAMT"), "TIRGU NEAMT") +Verif("prefix MUN. cu cratima", loV.FaraPrefixLoc("MUN. CLUJ-NAPOCA"), "CLUJ-NAPOCA") +Verif("prefix COM.", loV.FaraPrefixLoc("COM. AGHIRESU"), "AGHIRESU") +Verif("prefix SAT fara punct", loV.FaraPrefixLoc("SAT AGHIRESU-FABRICI"), "AGHIRESU-FABRICI") +Verif("fara prefix", loV.FaraPrefixLoc("CONSTANTA"), "CONSTANTA") +*** forma NEprescurtata: pe Bucuresti ANAF trimite "MUNICIPIUL BUCURESTI", nu "JUD. BUCURESTI" +Verif("prefix MUNICIPIUL", loV.FaraPrefixLoc("MUNICIPIUL BUCURESTI"), "BUCURESTI") +Verif("prefix JUDETUL", loV.FaraPrefixLoc("JUDETUL CLUJ"), "CLUJ") +*** ORASUL/COMUNA/SATUL NU se taie: exista localitati care chiar incep asa +Verif("ORASUL NU e prefix", loV.FaraPrefixLoc("ORASUL NOU"), "ORASUL NOU") + +*** --- ParseAdresaAnaf: adresa completa, inclusiv cazul Bucuresti --- +Local loA +loA = loV.ParseAdresaAnaf("JUD. SATU MARE, MUN. SATU MARE, STR. LALELELOR, NR.12") +Verif("adresa judet doua cuvinte", loA.judet, "SATU MARE") +Verif("adresa loc doua cuvinte", loA.localitate, "SATU MARE") + +loA = loV.ParseAdresaAnaf("MUN. BUCURESTI, SECTOR 1, STR. AVIATORILOR, NR.2") +Verif("bucuresti judet", loA.judet, "BUCURESTI") +Verif("bucuresti sectorul", loA.localitate, "BUCURESTI SECTORUL 1") + +*** forma pe care o trimite ANAF in realitate (masurat pe 200 de coduri reale): nu "MUN.", ci +*** "MUNICIPIUL", si fara "JUD." pe primul element +loA = loV.ParseAdresaAnaf("MUNICIPIUL BUCURESTI, SECTOR 1, STR EMANOIL PORUMBARU, NR.90-92") +Verif("bucuresti real judet", loA.judet, "BUCURESTI") +Verif("bucuresti real sectorul", loA.localitate, "BUCURESTI SECTORUL 1") + +loA = loV.ParseAdresaAnaf("JUD. CONSTANTA, MUN. CONSTANTA, ALEEA CRIZANTEMELOR, NR.6, BL.H1, SC.F, ET.2, AP.109") +Verif("nemodificat judet", loA.judet, "CONSTANTA") +Verif("nemodificat loc", loA.localitate, "CONSTANTA") +Verif("nemodificat strada", loA.strada, "CRIZANTEMELOR") +Verif("nemodificat nr", loA.nr, "6") +Verif("nemodificat bloc", loA.Bloc, "H1") +Verif("nemodificat apart", loA.apart, "109") + +*** --- AnafNomenclator pe cursoare modelate dupa syn_vnom_* --- +Create Cursor crsJudeteT (id_judet I Null, judet C(30)) +Insert Into crsJudeteT Values (Null, "") +Insert Into crsJudeteT Values (10, "BUCURESTI") +Insert Into crsJudeteT Values (14, "CLUJ") +Insert Into crsJudeteT Values (34, "SATU MARE") + +VerifId("judet exact", loN.pozitioneaza_judet("crsJudeteT", "CLUJ"), "crsJudeteT.id_judet", 14) +VerifId("judet doua cuvinte", loN.pozitioneaza_judet("crsJudeteT", "SATU MARE"), "crsJudeteT.id_judet", 34) +Verif("judet inexistent", Transform(loN.pozitioneaza_judet("crsJudeteT", "ATLANTIDA")), ".F.") + +Create Cursor crsLocT (id_loc I Null, localitate C(45)) +Insert Into crsLocT Values (Null, "") +Insert Into crsLocT Values (57, "AGHIRESU") +Insert Into crsLocT Values (58, "AGHIRESU-FABRICI (COM. AGHIRESU)") +Insert Into crsLocT Values (1759, "BUCURESTI SECTORUL 1") +Insert Into crsLocT Values (9001, "TIRGU MURES") +Insert Into crsLocT Values (9002, "TIRGU NEAMT") +Insert Into crsLocT Values (9101, "SATU NOU (COM. ALFA)") +Insert Into crsLocT Values (9102, "SATU NOU (COM. BETA)") +Insert Into crsLocT Values (9201, "MAMAIA (MUN. CONSTANTA)") +Insert Into crsLocT Values (9202, "POIANA (ORS. OVIDIU)") +*** omonime departajabile dupa comuna (cazul real GRECI din Olt) +Insert Into crsLocT Values (9301, "GRECI (COM. SCHITU)") +Insert Into crsLocT Values (9302, "GRECI (COM. OSICA DE SUS)") +*** omonime unde marcajul e scris diferit in cele doua surse: nomenclatorul "(ORAS X)", +*** ANAF "ORS. X" - departajarea compara doar denumirea comunei/orasului +Insert Into crsLocT Values (9401, "STEFANESTI (COM. SUSENI)") +Insert Into crsLocT Values (9402, "STEFANESTI (ORAS STEFANESTI)") +*** omonime care difera de ANAF SI prin A/I: treapta exacta nu gaseste nimic, cea fuzzy gaseste +*** doi - departajarea dupa comuna trebuie sa se aplice si acolo (cazul real SIRBI, Maramures) +Insert Into crsLocT Values (9501, "SIRBI (COM. BUDESTI)") +Insert Into crsLocT Values (9502, "SIRBI (COM. FARCASA)") + +*** exactul are prioritate: AGHIRESU nu trebuie sa cada pe AGHIRESU-FABRICI +VerifId("loc exact", loN.pozitioneaza_localitate("crsLocT", "AGHIRESU"), "crsLocT.id_loc", 57) +VerifId("loc fara sufix", loN.pozitioneaza_localitate("crsLocT", "AGHIRESU-FABRICI"), "crsLocT.id_loc", 58) +VerifId("loc sector", loN.pozitioneaza_localitate("crsLocT", "BUCURESTI SECTORUL 1"), "crsLocT.id_loc", 1759) +*** fuzzy: ANAF trimite forma cu A, nomenclatorul o tine cu I +VerifId("loc fuzzy A-I", loN.pozitioneaza_localitate("crsLocT", "TARGU MURES"), "crsLocT.id_loc", 9001) +VerifId("loc fuzzy A-I 2", loN.pozitioneaza_localitate("crsLocT", "TARGU NEAMT"), "crsLocT.id_loc", 9002) +*** sufix administrativ FARA paranteze - asa il trimite ANAF, intr-un singur element de virgula: +*** "JUD. CONSTANTA, SAT AGIGEA COM. AGIGEA, STR. ECLUZEI, NR.1". Nomenclatorul il tine cu +*** paranteze, deci ambele forme trebuie sa se reduca la aceeasi denumire. +VerifId("loc sufix COM. fara paranteze", ; + loN.pozitioneaza_localitate("crsLocT", "AGHIRESU-FABRICI COM. AGHIRESU"), "crsLocT.id_loc", 58) +VerifId("loc sufix MUN. fara paranteze", ; + loN.pozitioneaza_localitate("crsLocT", "MAMAIA MUN. CONSTANTA"), "crsLocT.id_loc", 9201) +VerifId("loc sufix ORS. fara paranteze", ; + loN.pozitioneaza_localitate("crsLocT", "POIANA ORS. OVIDIU"), "crsLocT.id_loc", 9202) +*** ambiguu: doua sate omonime in comune diferite - se refuza, nu se ghiceste +Verif("loc ambiguu refuzat", Transform(loN.pozitioneaza_localitate("crsLocT", "SATU NOU")), ".F.") +*** ...dar daca ANAF trimite comuna, omonimele SE departajeaza dupa ea +VerifId("omonime departajate dupa comuna", ; + loN.pozitioneaza_localitate("crsLocT", "SATU NOU COM. BETA"), "crsLocT.id_loc", 9102) +VerifId("omonime departajate, caz real GRECI", ; + loN.pozitioneaza_localitate("crsLocT", "GRECI COM. SCHITU"), "crsLocT.id_loc", 9301) +*** marcaj scris diferit in cele doua surse: ANAF "ORS. STEFANESTI" vs nomenclator "(ORAS STEFANESTI)" +VerifId("omonime, marcaj scris diferit", ; + loN.pozitioneaza_localitate("crsLocT", "STEFANESTI ORS. STEFANESTI"), "crsLocT.id_loc", 9402) +*** comuna care nu exista printre omonime: NU se ghiceste, ramane refuzat +Verif("omonime, comuna necunoscuta refuzata", ; + Transform(loN.pozitioneaza_localitate("crsLocT", "GRECI COM. ATLANTIDA")), ".F.") +*** fara comuna de la ANAF nu se poate departaja - refuz corect (cazul real STEFANESTI, Arges) +Verif("omonime fara comuna refuzate", ; + Transform(loN.pozitioneaza_localitate("crsLocT", "STEFANESTI")), ".F.") +*** departajarea se aplica SI dupa treapta fuzzy: ANAF "SARBI", nomenclatorul "SIRBI" +VerifId("omonime fuzzy departajate dupa comuna", ; + loN.pozitioneaza_localitate("crsLocT", "SARBI COM. FARCASA"), "crsLocT.id_loc", 9502) +Verif("omonime fuzzy fara comuna refuzate", ; + Transform(loN.pozitioneaza_localitate("crsLocT", "SARBI")), ".F.") +Verif("loc inexistent", Transform(loN.pozitioneaza_localitate("crsLocT", "ATLANTIDA")), ".F.") + +*** On Error continua executia, deci o verificare sarita (obiect neinstantiat) nu s-ar vedea +*** in numarul de esecuri; se verifica explicit ca au rulat toate. +If m.gnOk + m.gnNok # 42 + gnNok = m.gnNok + 1 + Strtofile("ESEC au rulat doar " + Transform(m.gnOk + m.gnNok) + " verificari din 42" + Chr(13) + Chr(10), m.gcLog, .T.) +Endif +Strtofile("TOTAL: " + Transform(m.gnOk) + " ok, " + Transform(m.gnNok) + " esec" + Chr(13) + Chr(10), m.gcLog, .T.) +Quit + +Procedure Verif + Lparameters tcNume, tcObtinut, tcAsteptat + Local lcStare + If Alltrim(Nvl(m.tcObtinut, "")) == Alltrim(m.tcAsteptat) + gnOk = m.gnOk + 1 + lcStare = "ok " + Else + gnNok = m.gnNok + 1 + lcStare = "ESEC " + Endif + Strtofile(m.lcStare + Padr(m.tcNume, 26) + " obtinut=[" + Alltrim(Nvl(m.tcObtinut, "")) + ; + "] asteptat=[" + Alltrim(m.tcAsteptat) + "]" + Chr(13) + Chr(10), m.gcLog, .T.) +Endproc + +Procedure VerifId + Lparameters tcNume, tlGasit, tcExpresieId, tnAsteptat + Local lnId + lnId = Iif(m.tlGasit, Nvl(Evaluate(m.tcExpresieId), -1), -1) + Verif(m.tcNume, Transform(m.lnId), Transform(m.tnAsteptat)) +Endproc diff --git a/utile/Teste/test_init_env_auto_roadef.prg b/utile/Teste/test_init_env_auto_roadef.prg new file mode 100644 index 0000000..54a4e89 --- /dev/null +++ b/utile/Teste/test_init_env_auto_roadef.prg @@ -0,0 +1,263 @@ +* test_init_env_auto_roadef.prg +* Varianta ROADEF a test_init_env_auto.prg (acel fisier e specializat pe ROACONT - +* gcAppPath/clase/proceduri hardcodate D:\ROA\ROACONT\ - nu poate initializa mediul ROADEF). +* Initializare completa de mediu FARA interactiune, pentru vfp9.exe -A -T. +* +* MOTIVUL EXISTENTEI: D:\ROA\ROACONT\COMUN si D:\ROA\ROADEF\COMUN sunt doua working copy-uri +* SEPARATE ale aceluiasi COMUN din SVN, nu junctions. Un test pornit cu test_init_env_auto.prg +* incarca D:\ROA\ROACONT\COMUN\programe\*.prg, deci NU vede modificarile necomise din +* D:\ROA\ROADEF\COMUN si da rezultate false (verificat: AnafNomenclator lipseste acolo). +* Testele pe cod ROADEF necomis folosesc acest fisier. +* +* Utilizare: +* DO test_init_env_auto_roadef WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola' +* IF gnHandle <= 0 ... eroare conectare +* Mediu de test standard: server CENTRAL, schema MARIUSM_AUTO. +* +* Dupa apel sunt disponibile: goConn/goExecutor/goApp/goLog/goApi, goFirma/goCalendar, +* gnAn/gnLuna/gcS/gnIdFirma/gnScrieRegistru etc., SET PATH/CLASSLIB/PROCEDURE ca in roadef.prg. +* ATENTIE: mentine lista de SET CLASSLIB/PROCEDURE sincronizata cu Programe\roadef.prg. + +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, gcUserNameApp, gcNumeProgram, gcAppName, glLunaInchisa, ; + buton, gnButon, pnButon, gl406, gcAcces, gnid_prg_owner, gnScrieRegistru, ; + pcTitlu, pl_verificat, a4, gcUtilizatoriPath, gcPasswordApp, gcCaleServerDate, ; + gnNivelUtilizator, gnGrupUtilizator +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 +gcUserNameApp = [MARIUS M] +gcPasswordApp = [] +gcNumeProgram = [ROADEF] +gcAppName = [ROADEF] +glLunaInchisa = .F. +glEMama = .F. +gl406 = .F. +gnid_prg_owner = 0 +pcTitlu = [] +pl_verificat = .F. +a4 = .T. +gnNivelUtilizator = 0 +gnGrupUtilizator = 0 +gcCaleServerDate = [] +* gnScrieRegistru: optiune de firma (registrul electronic al salariatilor). frm_firme_nou.Init +* o citeste NEPROTEJAT (ofirma.vc2, "IF gnScrieRegistru = 0"), deci trebuie sa existe INAINTE de +* optiuni_firma; daca optiunile o redefinesc mai jos, valoarea lor castiga. +gnScrieRegistru = 0 +* PUBLIC, nu Declare: nrcrt() (oproceduri_comune.prg) citeste NROR din ControlSource-uri +* de grid mult dupa ce acest program s-a terminat (Declare ar muri la RETURN) +PUBLIC nror(65000) +buton = 1 +gnButon = 1 +pnButon = 1 + +LOCAL lcPath +PUBLIC gcAppPath, DIRGEN, gcDirMare, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile, ; + gcSecurityPath, gcSecurityFile +gcAppPath = [D:\ROA\ROADEF\] +Set Default To (gcAppPath) +lcPath = gcAppPath + 'Date;' + ; + gcAppPath + 'Include;' + ; + gcAppPath + 'FERESTRE;' + ; + gcAppPath + 'GRAFICE;' + ; + gcAppPath + 'CLASE;' + ; + gcAppPath + 'MENIURI;' + ; + gcAppPath + 'PROGRAME;' + ; + gcAppPath + 'RAPOARTE;' + ; + gcAppPath + 'COMUN\CLASE;' + ; + gcAppPath + 'COMUN\FERESTRE;' + ; + gcAppPath + 'COMUN\PROGRAME;' + ; + gcAppPath + 'COMUN\GRAFICE;' + ; + gcAppPath + 'COMUN\RAPOARTE;' + ; + gcAppPath + 'COMUN\UTILE\CTL32;' + ; + gcAppPath + 'COMUN\UTILE\HPDF;' + ; + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ; + gcAppPath + 'COMUN\UTILE\WEB;' + ; + gcAppPath + 'COMUN\UTILE\NFJSON;' + ; + Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\] +SET PATH TO &lcPath ADDITIVE + +Local lcMainClassLib +lcMainClassLib = gcAppPath + "clase\ofundal_sal" +SET CLASSLIB TO (lcMainClassLib) ADDITIVE +SET CLASSLIB TO CAUT ADDITIVE +SET CLASSLIB TO ooptiuni ADDITIVE +SET CLASSLIB TO ferestre_cere_date ADDITIVE +SET CLASSLIB TO oblocare ADDITIVE +SET CLASSLIB TO registry ADDITIVE +SET CLASSLIB TO decabaza ADDITIVE +SET CLASSLIB TO onomenclatoare ADDITIVE +SET CLASSLIB TO onom_sal ADDITIVE +SET CLASSLIB TO cauta_alfa_forms ADDITIVE +SET CLASSLIB TO ferestre_oracle ADDITIVE +SET CLASSLIB TO caut_ora ADDITIVE +SET CLASSLIB TO otoolbar ADDITIVE +SET CLASSLIB TO Messagebox ADDITIVE +SET CLASSLIB TO opersonal ADDITIVE +SET CLASSLIB TO oasociere ADDITIVE +SET CLASSLIB TO ofirma ADDITIVE +SET CLASSLIB TO ferestre_roadef ADDITIVE +SET CLASSLIB TO oconfigurare_seturi.vcx ADDITIVE +SET CLASSLIB TO wwdialogs.vcx ADDITIVE +SET CLASSLIB TO overificari.vcx ADDITIVE +SET CLASSLIB TO appwiz.vcx ADDITIVE +SET CLASSLIB TO accessibility.vcx ADDITIVE + +SET PROCEDURE TO acces_meniu ADDITIVE +SET PROCEDURE TO ooperatii_comune ADDITIVE +SET PROCEDURE TO quitapp ADDITIVE +SET PROCEDURE TO init_program ADDITIVE +SET PROCEDURE TO proceduri_comune ADDITIVE +SET PROCEDURE TO oproceduri_comune ADDITIVE +SET PROCEDURE TO gencursor.prg ADDITIVE +SET PROCEDURE TO updateserver.prg ADDITIVE +SET PROCEDURE TO oproceduri_maintenance.prg ADDITIVE +SET PROCEDURE TO onomenclatoare ADDITIVE +SET PROCEDURE TO oproceduri_ams ADDITIVE +SET PROCEDURE TO ocautare ADDITIVE +SET PROCEDURE TO oproceduri_roadef_sal ADDITIVE +SET PROCEDURE TO oinit_optiuni ADDITIVE +SET PROCEDURE TO osecurity ADDITIVE +SET PROCEDURE TO oproceduri_roadef ADDITIVE +SET PROCEDURE TO wwcodeupdate.prg ADDITIVE +SET PROCEDURE TO wwxmlhttp.prg ADDITIVE +SET PROCEDURE TO ini.prg ADDITIVE +SET PROCEDURE TO osalarii_comun.prg ADDITIVE +SET PROCEDURE TO wwutils.prg ADDITIVE +SET PROCEDURE TO proceduri_Excel.prg ADDITIVE +SET PROCEDURE TO cauta_alfa.prg ADDITIVE +SET PROCEDURE TO oproceduri_app.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 xmlaccess.prg ADDITIVE +SET PROCEDURE TO xmlparser.prg ADDITIVE +SET PROCEDURE TO filebringer.prg ADDITIVE +SET PROCEDURE TO wwhttp.prg ADDITIVE +SET PROCEDURE TO wwApi.prg ADDITIVE +SET PROCEDURE TO validare.prg ADDITIVE +SET PROCEDURE TO nfjsonread.prg ADDITIVE +SET PROCEDURE TO nfjsoncreate.prg ADDITIVE + +Declare Integer GetPrivateProfileString In Kernel32 ; + string, String, String, String @, Integer, String +Declare Integer WritePrivateProfileString In Kernel32 ; + string, String, String, String +Declare Integer CopyFile In kernel32 ; + STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists +Declare Integer URLDownloadToFile In urlmon.Dll ; + INTEGER pCaller, String szURL, String szFileName, INTEGER dwReserved, Integer lpfnCB +Declare Integer PathFileExists In shlwapi STRING pszPath + +If Type('goApi') = 'U' + Public goApi + goApi = Newobject("wwAPI", "wwAPI.prg") +ENDIF + +PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar, poLog, goLog, goApp +DIRGEN = [D:\ROA\] +gcDirMare = DIRGEN +gcBasePath = DIRGEN +gcSecurityPath = DIRGEN + 'Security\' +gcSecurityFile = gcSecurityPath + 'ROA_SECURITY.TXT' +gcGeneralIniFile = DIRGEN + "settings.ini" +gcSettingsFile = m.gcGeneralIniFile +gcUtilizatoriPath = gcAppPath + "UTILIZATORI\" +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") +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.