#13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2. Clase: ofacturare (nucleul formularului unificat), ofacturare_comun, ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de cautare), omodificari. Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie si cota standard de TVA cand articolul nu are cota pe politica. Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte proiecte sunt rezolvate pastrand ambele parti. Loguri de rulare a testelor scoase din versionare; testele raman. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
This commit is contained in:
233
utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg
Normal file
233
utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg
Normal file
@@ -0,0 +1,233 @@
|
||||
* test_s5c_rutare_copiere.prg
|
||||
* Headless (-A -T), static, FARA Oracle: probeaza RUTAREA copierii unui document, nu formularul.
|
||||
* Testul UI existent instantiaza frm_facturare_articole2 direct si sare peste rutarea din
|
||||
* factureaza() - de aceea nu a prins ca scrie_legatura_proforma() lipsea de pe calea reala (v1).
|
||||
* R1 - copiere_factura cheama factureaza(toFactura.Tip, toFactura), fara plFacturareNoua
|
||||
* R2 - plFacturareNoua e declarat Private numai in Clase\ofundal_facturare.vc2 (doua situri)
|
||||
* si nu apare deloc in COMUN\programe\oproceduri_facturare.prg
|
||||
* R3 - deci pe calea de copiere llFacturareNoua = .F. -> se emite pe frm_facturare_articole (v1)
|
||||
* R4 - completeaza_setari_document(toFactura, .T.) se cheama INAINTE de comutarea v1/v2,
|
||||
* deci poDate.lProformaSursa se ridica si pe traseul v1
|
||||
* R5 - scrie_legatura_proforma() apare de doua ori in ofacturare.vc2: o data in v1, o data in v2
|
||||
* R6 - in do_scrie_factura din v1 apelul e conditionat de If m.llReturn si e inainte de
|
||||
* do_inchide_tranzactie(1) (aceeasi tranzactie)
|
||||
* R7 - acelasi lucru in do_scrie_factura din v2 (neregresie fata de S5c)
|
||||
*
|
||||
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_rutare_copiere.prg"
|
||||
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.log
|
||||
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
SET NOTIFY OFF
|
||||
PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gcVc2, gcPrgRut, gcPrgFact, gcFundal
|
||||
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.log"
|
||||
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
|
||||
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
|
||||
ENDIF
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
|
||||
gnFail = 0
|
||||
gnPass = 0
|
||||
gnSarit = 0
|
||||
gcCaz = ""
|
||||
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
|
||||
gcVc2 = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2"
|
||||
gcPrgRut = "D:\ROA\ROAFACTURARE\COMUN\programe\oproceduri_facturare.prg"
|
||||
gcPrgFact = "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg"
|
||||
gcFundal = "D:\ROA\ROAFACTURARE\Clase\ofundal_facturare.vc2"
|
||||
|
||||
DO TestCopiereFaraSteagulNou
|
||||
DO TestSteagulNouDoarPeButoaneleNoi
|
||||
DO TestSemnalulSeSeteazaInainteDeRutare
|
||||
DO TestApelPeAmbeleFormulare
|
||||
DO TestApelInV1
|
||||
DO TestApelInV2
|
||||
|
||||
DO Final
|
||||
|
||||
*----------------------------------------------------------------------------------------
|
||||
* R1: copiere_factura ruteaza catre factureaza fara sa ridice plFacturareNoua
|
||||
PROCEDURE TestCopiereFaraSteagulNou
|
||||
LOCAL lcTxt, lcProc
|
||||
gcCaz = "[R1 copiere_factura -> factureaza fara plFacturareNoua] "
|
||||
lcTxt = FILETOSTR(gcPrgRut)
|
||||
IF EMPTY(lcTxt)
|
||||
DO Assert WITH .F., "FILETOSTR oproceduri_facturare.prg a esuat/gol"
|
||||
RETURN
|
||||
ENDIF
|
||||
lcProc = Fereastra(lcTxt, "PROCEDURE copiere_factura", "ENDPROC")
|
||||
IF EMPTY(lcProc)
|
||||
DO Assert WITH .F., "nu s-a putut izola PROCEDURE copiere_factura"
|
||||
RETURN
|
||||
ENDIF
|
||||
DO AfLog WITH "DIAG R1: copiere_factura len=" + TRANSFORM(LEN(lcProc))
|
||||
DO Assert WITH "factureaza(toFactura.Tip, toFactura)" $ lcProc, ;
|
||||
"copiere_factura cheama factureaza(toFactura.Tip, toFactura)"
|
||||
DO Assert WITH OCCURS("plFacturareNoua", lcTxt) = 0, ;
|
||||
"plFacturareNoua nu apare in oproceduri_facturare.prg, ocurente=" + ;
|
||||
TRANSFORM(OCCURS("plFacturareNoua", lcTxt))
|
||||
ENDPROC
|
||||
|
||||
* R2 + R3: steagul e ridicat numai de butoanele "Facturare (nou)" / "Avize (nou)"
|
||||
PROCEDURE TestSteagulNouDoarPeButoaneleNoi
|
||||
LOCAL lcFundal, lcFact
|
||||
gcCaz = "[R2/R3 plFacturareNoua ridicat numai in ofundal_facturare] "
|
||||
lcFundal = FILETOSTR(gcFundal)
|
||||
lcFact = FILETOSTR(gcPrgFact)
|
||||
IF EMPTY(lcFundal) OR EMPTY(lcFact)
|
||||
DO Assert WITH .F., "FILETOSTR ofundal_facturare.vc2 / ofacturare.prg a esuat/gol"
|
||||
RETURN
|
||||
ENDIF
|
||||
DO Assert WITH OCCURS("Private plFacturareNoua", lcFundal) = 2, ;
|
||||
"doua declaratii Private plFacturareNoua in ofundal_facturare.vc2, ocurente=" + ;
|
||||
TRANSFORM(OCCURS("Private plFacturareNoua", lcFundal))
|
||||
DO Assert WITH OCCURS("Private plFacturareNoua", lcFact) = 0, ;
|
||||
"ofacturare.prg doar citeste steagul, nu il declara"
|
||||
DO Assert WITH "llFacturareNoua = (Type('plFacturareNoua') = 'L'" $ lcFact, ;
|
||||
"factureaza decide v1/v2 dupa Type('plFacturareNoua')"
|
||||
* fara declaratie pe lantul de apel, Type() da 'U' -> llFacturareNoua = .F. -> v1
|
||||
DO Assert WITH "ofrmdetaliifactura = Createobject('frm_facturare_articole2')" $ lcFact, ;
|
||||
"ramura llFacturareNoua = .T. instantiaza v2 (deci ramura .F. ramane pe v1)"
|
||||
ENDPROC
|
||||
|
||||
* R4: semnalul lProformaSursa se ridica inaintea comutarii v1/v2, deci si pe traseul v1
|
||||
PROCEDURE TestSemnalulSeSeteazaInainteDeRutare
|
||||
LOCAL lcTxt, lnSetare, lnComutare
|
||||
gcCaz = "[R4 completeaza_setari_document inainte de comutarea v1/v2] "
|
||||
lcTxt = FILETOSTR(gcPrgFact)
|
||||
IF EMPTY(lcTxt)
|
||||
DO Assert WITH .F., "FILETOSTR ofacturare.prg a esuat/gol"
|
||||
RETURN
|
||||
ENDIF
|
||||
lnSetare = AT("poDate.completeaza_setari_document(m.toFactura, .T.)", lcTxt)
|
||||
lnComutare = AT("llFacturareNoua = (Type('plFacturareNoua')", lcTxt)
|
||||
DO Assert WITH lnSetare > 0, "completeaza_setari_document(m.toFactura, .T.) prezent, poz=" + TRANSFORM(lnSetare)
|
||||
DO Assert WITH lnComutare > 0, "comutarea v1/v2 prezenta, poz=" + TRANSFORM(lnComutare)
|
||||
IF lnSetare > 0 AND lnComutare > 0
|
||||
DO Assert WITH lnSetare < lnComutare, ;
|
||||
"semnalul se ridica INAINTE de rutare (comun ambelor formulare), setare=" + ;
|
||||
TRANSFORM(lnSetare) + " comutare=" + TRANSFORM(lnComutare)
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
* R5: apelul exista pe ambele formulare, cate o singura data
|
||||
PROCEDURE TestApelPeAmbeleFormulare
|
||||
LOCAL lcTxt, lcV1, lcV2
|
||||
gcCaz = "[R5 apelul e si pe v1 si pe v2] "
|
||||
lcTxt = FILETOSTR(gcVc2)
|
||||
IF EMPTY(lcTxt)
|
||||
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
|
||||
RETURN
|
||||
ENDIF
|
||||
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcTxt) = 2, ;
|
||||
"doua apeluri scrie_legatura_proforma() in ofacturare.vc2, ocurente=" + ;
|
||||
TRANSFORM(OCCURS("scrie_legatura_proforma()", lcTxt))
|
||||
lcV1 = FereastraClasa(lcTxt, 1)
|
||||
lcV2 = FereastraClasa(lcTxt, 2)
|
||||
DO Assert WITH !EMPTY(lcV1), "clasa frm_facturare_articole (v1) izolata"
|
||||
DO Assert WITH !EMPTY(lcV2), "clasa frm_facturare_articole2 (v2) izolata"
|
||||
IF !EMPTY(lcV1)
|
||||
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV1) = 1, ;
|
||||
"un apel in clasa v1, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV1))
|
||||
ENDIF
|
||||
IF !EMPTY(lcV2)
|
||||
DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV2) = 1, ;
|
||||
"un apel in clasa v2, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV2))
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
* R6: pozitia si conditia apelului in do_scrie_factura din v1
|
||||
PROCEDURE TestApelInV1
|
||||
gcCaz = "[R6 v1: apel conditionat, inainte de COMMIT] "
|
||||
DO VerificaMetoda WITH 1, "If m.llReturn"
|
||||
ENDPROC
|
||||
|
||||
* R7: acelasi lucru in v2 (neregresie)
|
||||
PROCEDURE TestApelInV2
|
||||
gcCaz = "[R7 v2: apel conditionat, inainte de COMMIT] "
|
||||
DO VerificaMetoda WITH 2, "If llReturn"
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE VerificaMetoda
|
||||
LPARAMETERS tnVersiune, tcGarda
|
||||
LOCAL lcTxt, lcClasa, lcMetoda, lnApel, lnCommit, lcSecventa
|
||||
lcTxt = FILETOSTR(gcVc2)
|
||||
lcClasa = FereastraClasa(lcTxt, tnVersiune)
|
||||
IF EMPTY(lcClasa)
|
||||
DO Assert WITH .F., "clasa nu s-a putut izola"
|
||||
RETURN
|
||||
ENDIF
|
||||
lcMetoda = Fereastra(lcClasa, CHR(9) + "PROCEDURE do_scrie_factura" + CHR(13), CHR(9) + "ENDPROC")
|
||||
IF EMPTY(lcMetoda)
|
||||
DO Assert WITH .F., "nu s-a putut izola do_scrie_factura"
|
||||
RETURN
|
||||
ENDIF
|
||||
DO AfLog WITH "DIAG: do_scrie_factura v" + TRANSFORM(tnVersiune) + " len=" + TRANSFORM(LEN(lcMetoda))
|
||||
lnApel = AT("scrie_legatura_proforma()", lcMetoda)
|
||||
lnCommit = AT("Thisform.do_inchide_tranzactie(1)", lcMetoda)
|
||||
DO Assert WITH lnApel > 0, "apelul e in do_scrie_factura, poz=" + TRANSFORM(lnApel)
|
||||
DO Assert WITH lnCommit > 0, "do_inchide_tranzactie(1) prezent, poz=" + TRANSFORM(lnCommit)
|
||||
IF lnApel > 0 AND lnCommit > 0
|
||||
DO Assert WITH lnApel < lnCommit, ;
|
||||
"apelul e INAINTE de do_inchide_tranzactie(1), apel=" + TRANSFORM(lnApel) + ;
|
||||
" commit=" + TRANSFORM(lnCommit)
|
||||
ENDIF
|
||||
lcSecventa = tcGarda + CHR(13) + CHR(10) + REPLICATE(CHR(9), 4) + "llReturn = scrie_legatura_proforma()"
|
||||
DO Assert WITH lcSecventa $ lcMetoda, ;
|
||||
"apelul e in ramura " + tcGarda + " (nu neconditionat)"
|
||||
ENDPROC
|
||||
|
||||
*----------------------------------------------------------------------------------------
|
||||
* felie de text intre un marcaj de start si primul marcaj de sfarsit de dupa el
|
||||
FUNCTION Fereastra
|
||||
LPARAMETERS tcTxt, tcStart, tcEnd
|
||||
LOCAL lnStart, lnEnd
|
||||
lnStart = AT(tcStart, tcTxt)
|
||||
IF lnStart = 0
|
||||
RETURN ""
|
||||
ENDIF
|
||||
lnEnd = AT(tcEnd, SUBSTR(tcTxt, lnStart))
|
||||
IF lnEnd = 0
|
||||
RETURN ""
|
||||
ENDIF
|
||||
RETURN SUBSTR(tcTxt, lnStart, lnEnd + LEN(tcEnd) - 1)
|
||||
ENDFUNC
|
||||
|
||||
* corpul clasei frm_facturare_articole (tnVersiune = 1) sau frm_facturare_articole2 (tnVersiune = 2)
|
||||
FUNCTION FereastraClasa
|
||||
LPARAMETERS tcTxt, tnVersiune
|
||||
LOCAL lnV1, lnV2
|
||||
lnV1 = AT("DEFINE CLASS frm_facturare_articole AS", tcTxt)
|
||||
lnV2 = AT("DEFINE CLASS frm_facturare_articole2 AS", tcTxt)
|
||||
IF lnV1 = 0 OR lnV2 = 0 OR lnV1 >= lnV2
|
||||
RETURN ""
|
||||
ENDIF
|
||||
IF tnVersiune = 1
|
||||
RETURN SUBSTR(tcTxt, lnV1, lnV2 - lnV1)
|
||||
ENDIF
|
||||
RETURN SUBSTR(tcTxt, lnV2)
|
||||
ENDFUNC
|
||||
|
||||
PROCEDURE Assert
|
||||
LPARAMETERS tlCond, tcMsg
|
||||
IF tlCond
|
||||
gnPass = gnPass + 1
|
||||
ELSE
|
||||
gnFail = gnFail + 1
|
||||
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
|
||||
ENDIF
|
||||
ENDPROC
|
||||
PROCEDURE AfLog
|
||||
LPARAMETERS tcMsg
|
||||
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
|
||||
ENDPROC
|
||||
PROCEDURE AfErr
|
||||
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
|
||||
gnFail = gnFail + 1
|
||||
DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
|
||||
ENDPROC
|
||||
PROCEDURE Final
|
||||
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit)
|
||||
DO AfLog WITH "END " + TTOC(DATETIME())
|
||||
QUIT
|
||||
ENDPROC
|
||||
Reference in New Issue
Block a user