Verificare ANAF la alegerea partenerului
ocautare.prg - miezul functionalitatii: - anaf_verif_cautare: verdictul ANAF pe randul curent din formularul de cautare (label sub grid), la data documentului; discordantele si codurile fiscale invalide cu rosu; F4 sau click deschide detaliile. - ANAF_StarePartener, cu cache pe sesiune, excludere parteneri externi si persoane fizice; ANAF_ValidareCod pentru CIF/CNP. - ANAF_NivelVerificare: cascada RC_ANAF_VERIF_SELECTIE (kill-switch settings.ini > optiuni utilizator > optiuni firma > implicit 1), cu cache invalidat la schimbarea firmei sau utilizatorului; ANAF_ComutaVerificare pentru punctul de meniu. - Detalii: alegerea variantei corecte de partener din perechea RO / fara RO, cu discriminator "are documente in perioada"; dupa Da sau Nu se inchide cautarea si se revine in formular cu partenerul ales (AplicaInlocuirePartenerANAF). - ANAF_CaData: data documentului poate veni si ca DateTime (tact.dataact). - Banda proprie sub grid pentru label: formularul creste cu 54, gridul isi pierde ancorarea de jos si primeste inaltimea din AjusteazaBanda, legata de Resize si Activate - formularul isi reaseaza gridul dupa Show, deci Activate e momentul util. validare.prg: ANAF_VerificaCuiSingle, wrapper single-CUI peste serviciul ANAF, cu data verificarii si o singura eroare logata pe sesiune. cauta_alfa.prg: hook generic - ataseaza poVerifAlegere pe formularul de cautare inainte de Show si il detaseaza dupa. Apelanti opt-in (lVerificaANAF): baza.vc2 (lookup-ul generic de partener din formularele actbaza/actbaza2007 lansate din meniuri), onote_contabile.vc2 (partener debit/credit), omodificari.vc2 (do_cauta din cele trei clase de modificare, cu data notei), ofacturare.vc2 (client, furnizor). Casa/banca ramane in afara: acolo partenerul se alege pentru imperecherea facturilor. cauta_alfa_forms.vc2: F4 deschide detaliile, iar terminarea cautarii trece prin VerificaAlegere. Teste: suita headless pentru fluxul de verificare (utile/Teste/partener_anaf/), cu mock pentru apelul ANAF si pentru dialoguri. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019H3r66sVojGhgaKq5niu1u
This commit is contained in:
146
utile/Teste/partener_anaf/shot_dialog_anaf.prg
Normal file
146
utile/Teste/partener_anaf/shot_dialog_anaf.prg
Normal file
@@ -0,0 +1,146 @@
|
||||
* shot_dialog_anaf.prg - captureaza dialogul REAL (AMESSAGEBOX neinlocuit) generat de
|
||||
* anaf_verif_cautare.VerificaAlegere() (ocautare.prg), pt. o captura de ecran cu mesajul de
|
||||
* PRODUCTIE real (AntetDialog/ListaCorecti/TextAnaf) - nu text scris de mana in script.
|
||||
* Mock ANAF (raspunsuri preconfigurate, fara apel real la anaf.ro) ca in suita principala, dar
|
||||
* FARA mock_amessagebox.prg: AMESSAGEBOX ramane cea reala din oproceduri_comune.prg. Acea functie
|
||||
* suporta DOUA ramuri: formularul MessageBox.vcx (daca acea clasa e incarcata) sau MESSAGEBOX()
|
||||
* nativ altfel (fereastra Windows separata, clasa #32770) - formularul VCX nu se randeaza in acest
|
||||
* mediu minimal headless (confirmat: se blocheaza fara eroare, indiferent de suita testata), asa ca
|
||||
* acest script elibereaza clasa (RELEASE CLASSLIB, doar in sesiunea proprie, niciun fisier atins)
|
||||
* ca AMESSAGEBOX sa aleaga singura ramura nativa. Fereastra nativa BLOCHEAZA scriptul pana e inchisa
|
||||
* din exterior (shot_dialog_anaf.ps1 o gaseste dupa semnalul ready_0, o captureaza cu PrintWindow
|
||||
* si o inchide cu WM_CLOSE).
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
SET DELETED ON
|
||||
SET EXACT ON
|
||||
SET CENTURY ON
|
||||
SET DATE DMY
|
||||
SET NULLDISPLAY TO ''
|
||||
CLOSE DATABASES
|
||||
|
||||
PUBLIC gcUILog, gcSyncDir
|
||||
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\shot_dialog_anaf_log.txt"
|
||||
gcSyncDir = "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\uisync_dialog\"
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
|
||||
|
||||
ON ERROR DO VpaErrD WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
ON SHUTDOWN QUIT
|
||||
|
||||
*-- doar mock-ul ANAF (raspunsuri) - FARA mock_amessagebox: AMESSAGEBOX ramane cea reala din productie
|
||||
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
|
||||
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\mock_anaf_verificare.prg" ADDITIVE
|
||||
DO VpaLogD WITH 'mock ANAF incarcat (fara mock amessagebox - dialog REAL)'
|
||||
|
||||
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
|
||||
IF gnHandle <= 0
|
||||
DO VpaLogD WITH 'EROARE: conectare Oracle esuata - GATA'
|
||||
DO HarnessDone WITH 'done-error'
|
||||
QUIT
|
||||
ENDIF
|
||||
DO VpaLogD WITH 'mediu OK, schema=' + gcS
|
||||
|
||||
*-- test_init_env_auto incarca "Set Classlib To Messagebox Additive" (ca in roacont.prg) - cu ea
|
||||
*-- incarcata, AMESSAGEBOX (productie) afiseaza formularul MessageBox.vcx (nu s-a randat in acest
|
||||
*-- mediu minimal headless, fara legatura cu suita testata). RELEASE CLASSLIB doar in acest script
|
||||
*-- de captura (nu atinge niciun fisier) - AMESSAGEBOX ramane codul REAL, foloseste doar cealalta
|
||||
*-- ramura pe care el insusi o suporta: MESSAGEBOX() nativ, fereastra Windows separata (#32770).
|
||||
RELEASE CLASSLIB Messagebox
|
||||
DO VpaLogD WITH 'Set(Classlib) dupa RELEASE: [' + SET('Classlib') + ']'
|
||||
|
||||
PUBLIC goANAFMockData, gnANAFCallCount, gdANAFUltimaData
|
||||
goANAFMockData = CREATEOBJECT('Collection')
|
||||
gnANAFCallCount = 0
|
||||
gdANAFUltimaData = {}
|
||||
LOCAL loRespDiscord
|
||||
loRespDiscord = CREATEOBJECT('Empty')
|
||||
ADDPROPERTY(loRespDiscord, 'cui', '7654321')
|
||||
ADDPROPERTY(loRespDiscord, 'scpTVA', .T.)
|
||||
ADDPROPERTY(loRespDiscord, 'statusInactivi', .F.)
|
||||
ADDPROPERTY(loRespDiscord, 'denumire', 'DISCORD SRL ANAF')
|
||||
ADDPROPERTY(loRespDiscord, 'mesaj', '')
|
||||
goANAFMockData.Add(loRespDiscord, 'C7654321')
|
||||
DO VpaLogD WITH 'mock ANAF: CUI 7654321 configurat'
|
||||
|
||||
PUBLIC gnIdDiscord, gnIdPereche
|
||||
|
||||
TRY
|
||||
DO CurataDateTestD
|
||||
DO CreeazaDateTestD
|
||||
|
||||
LOCAL lnOk
|
||||
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
|
||||
[WHERE ID_PART IN (] + TRANSFORM(gnIdDiscord) + [,] + TRANSFORM(gnIdPereche) + [) AND INACTIV = 0 ORDER BY ID_PART], 'ctestdialog')
|
||||
|
||||
PUBLIC goFormD, poVerifD
|
||||
goFormD = CREATEOBJECT('cauta_alfa_form', 'ctestdialog', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
|
||||
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
|
||||
goFormD.crs_cursor = 'ctestdialog'
|
||||
goFormD.lAles = .F.
|
||||
poVerifD = CREATEOBJECT('anaf_verif_cautare')
|
||||
ADDPROPERTY(goFormD, 'oVerifAlegere', poVerifD)
|
||||
poVerifD.Activeaza(goFormD)
|
||||
goFormD.WindowType = 0
|
||||
goFormD.Show()
|
||||
SELECT ctestdialog
|
||||
LOCATE FOR id_part = gnIdDiscord
|
||||
goFormD._GRID1.AfterRowColChange(1)
|
||||
poVerifD.VerificaRand(.T.)
|
||||
DO VpaLogD WITH 'stare pregatita, label=[' + ALLTRIM(goFormD.lb_anaf.Caption) + ']'
|
||||
|
||||
DO HarnessReady WITH 0, 'gata sa afisez dialogul REAL'
|
||||
*-- BLOCHEAZA aici (MESSAGEBOX() nativ) pana harnessul extern inchide fereastra (WM_CLOSE)
|
||||
LOCAL llRez
|
||||
llRez = poVerifD.VerificaAlegere(goFormD)
|
||||
DO VpaLogD WITH 'dialog inchis, VerificaAlegere a intors ' + TRANSFORM(llRez)
|
||||
|
||||
DO HarnessDone WITH 'done'
|
||||
CATCH TO loExcD
|
||||
DO VpaLogD WITH 'CATCH ErrorNo=' + TRANSFORM(loExcD.ErrorNo) + ' Message=' + loExcD.Message + ' Line=' + TRANSFORM(loExcD.LineNo)
|
||||
DO HarnessDone WITH 'done-error'
|
||||
FINALLY
|
||||
DO CurataDateTestD
|
||||
ENDTRY
|
||||
|
||||
QUIT
|
||||
|
||||
PROCEDURE CurataDateTestD
|
||||
LOCAL lnOk
|
||||
lnOk = goExecutor.oExecuta([DELETE FROM NOM_PARTENERI WHERE COD_FISCAL IN ('7654321','RO7654321')])
|
||||
=goExecutor.oExecuta('COMMIT')
|
||||
DO VpaLogD WITH 'CurataDateTestD: sters=' + TRANSFORM(m.lnOk)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE CreeazaDateTestD
|
||||
LOCAL lcIns
|
||||
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
|
||||
[('TEST ANAF DISCORD SRL','TEST ANAF DISCORD SRL','7654321',0,0,0,1,0,0)]
|
||||
=goExecutor.oExecuta(m.lcIns)
|
||||
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
|
||||
[('TEST ANAF DISCORD SRL','TEST ANAF DISCORD SRL','RO7654321',0,0,1,1,0,0)]
|
||||
=goExecutor.oExecuta(m.lcIns)
|
||||
=goExecutor.oExecuta('COMMIT')
|
||||
gnIdDiscord = 0
|
||||
gnIdPereche = 0
|
||||
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '7654321'], @gnIdDiscord)
|
||||
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO7654321'], @gnIdPereche)
|
||||
DO VpaLogD WITH 'CreeazaDateTestD: discord=' + TRANSFORM(gnIdDiscord) + ' pereche=' + TRANSFORM(gnIdPereche)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE VpaErrD
|
||||
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
|
||||
DO VpaLogD WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
|
||||
TRY
|
||||
DO CurataDateTestD
|
||||
CATCH
|
||||
ENDTRY
|
||||
QUIT
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE VpaLogD
|
||||
LPARAMETERS tcMsg
|
||||
SET SAFETY OFF
|
||||
LOCAL lcL
|
||||
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
|
||||
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog)
|
||||
ENDPROC
|
||||
Reference in New Issue
Block a user