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
181 lines
8.4 KiB
Plaintext
181 lines
8.4 KiB
Plaintext
* test_s4g_cont_venit.prg
|
|
* Headless: S4g (VFP) - cont de venit derivat pentru articolele fara politica de pret, al 29-lea
|
|
* argument (V_CONT_VENIT) pe apelul RPC catre pack_facturare.adauga_articol_factura, cablat in
|
|
* do_scrie_articole (COMUN\clase\ofacturare.vc2, frm_facturare_articole si frm_facturare_articole2).
|
|
*
|
|
* Proba in doua parti, FARA sa invoce do_scrie_articole/formularul complet (ar cere un document
|
|
* real scris in VANZARI_DETALII_TEMP - lasat ca datorie explicita in docs\raport_s4g_vfp.md):
|
|
*
|
|
* PARTEA A - deriva_cont_venit_fara_pol() (COMUN\programe\ofacturare_comun.prg), cele 3 nivele ale
|
|
* derivarii (s4g_adaugare_articole_modificare.md sectiunea 3.1), verificate cu date REALE citite
|
|
* chiar in test (SELECT direct, nimic scris in Oracle):
|
|
* A1: cont de gestiune CU corespondenta reala in vcoresp_cont_venchelt -> exact CONT_VENIT.
|
|
* A2: cont de gestiune fara corespondenta, articol cu nom_articole.cont care incepe cu 6/7 ->
|
|
* exact acel cont.
|
|
* A3: cont de gestiune fara corespondenta, articol fara cont 6xx/7xx -> fallback '704'.
|
|
*
|
|
* PARTEA B - formula de cablare adaugata in do_scrie_articole (identica cu diff-ul), evaluata pe
|
|
* un poArt minimal, cele doua ramuri cerute de story. Pozitional (nu named notation: driverul ODBC
|
|
* respinge P=>val in interiorul {call ...}, vezi docs\verificare_named_notation_odbc.md):
|
|
* B1: poArt.id_pol populat -> argumentul (poz. 29) e ,NULL explicit (Oracle primeste NULL,
|
|
* comportament neschimbat fata de azi).
|
|
* B2: poArt.id_pol gol -> argumentul (poz. 29) e ,'<cont derivat>'.
|
|
*
|
|
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4g_cont_venit.prg"
|
|
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.log
|
|
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8.
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET NOTIFY OFF
|
|
CLOSE DATABASES
|
|
|
|
PUBLIC gcLog, gnPass, gnFail, gcCaz, gcErr
|
|
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.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)
|
|
gnPass = 0
|
|
gnFail = 0
|
|
gcCaz = ""
|
|
gcErr = ""
|
|
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
|
|
|
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
|
|
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
|
|
DO AfLog WITH "FAIL: conexiune Oracle esuata"
|
|
DO Final
|
|
ENDIF
|
|
gnIdUtil = 8
|
|
DO AfLog WITH "ENV OK"
|
|
|
|
LOCAL lnSucces, lnIdArtAny, lnIdArt67, lnIdArtFallback
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* orice articol valid, folosit ca ancora pentru A1 (nu conteaza nom_articole.cont acolo,
|
|
* corespondenta gaseste raspunsul inaintea CASE-ului de fallback)
|
|
gcCaz = "[setup-articol-oarecare] "
|
|
IF USED('crssetuparttv')
|
|
USE IN crssetuparttv
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and rownum = 1],[crssetuparttv])
|
|
DO Assert WITH lnSucces >= 0 AND USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1, "exista cel putin un articol in nom_articole"
|
|
lnIdArtAny = 0
|
|
IF USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1
|
|
lnIdArtAny = crssetuparttv.id_articol
|
|
ENDIF
|
|
IF USED('crssetuparttv')
|
|
USE IN crssetuparttv
|
|
ENDIF
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* PARTEA A1 - corespondenta cont_venit gaseste raspunsul
|
|
gcCaz = "[A1-coresp_cont_venchelt] "
|
|
IF USED('crssurscvc')
|
|
USE IN crssurscvc
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select cont, cont_venit from vcoresp_cont_venchelt where cont_venit is not null and rownum = 1],[crssurscvc])
|
|
DO Assert WITH lnSucces >= 0 AND USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1, "exista cel putin o corespondenta cont_venit in schema"
|
|
IF USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1 AND lnIdArtAny > 0
|
|
LOCAL lcContGest, lcAsteptat, lcRezultat
|
|
lcContGest = ALLTRIM(crssurscvc.cont)
|
|
lcAsteptat = ALLTRIM(crssurscvc.cont_venit)
|
|
USE IN crssurscvc
|
|
lcRezultat = deriva_cont_venit_fara_pol(lnIdArtAny, lcContGest)
|
|
DO Assert WITH lcRezultat == lcAsteptat, "cont_venit din corespondenta: asteptat [" + lcAsteptat + "], obtinut [" + lcRezultat + "]"
|
|
ENDIF
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* PARTEA A2 - fara corespondenta, nom_articole.cont incepe cu 6/7
|
|
gcCaz = "[A2-nom_articole 6-7] "
|
|
IF USED('crssursart')
|
|
USE IN crssursart
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_articol, cont from nom_articole where cont is not null and (substr(cont,1,1) = '6' or substr(cont,1,1) = '7') and rownum = 1],[crssursart])
|
|
DO Assert WITH lnSucces >= 0, "select articol cu cont 6xx/7xx executat"
|
|
lnIdArt67 = 0
|
|
IF USED('crssursart') AND RECCOUNT('crssursart') = 1
|
|
LOCAL lcAsteptat2, lcRezultat2
|
|
lnIdArt67 = crssursart.id_articol
|
|
lcAsteptat2 = ALLTRIM(crssursart.cont)
|
|
USE IN crssursart
|
|
lcRezultat2 = deriva_cont_venit_fara_pol(lnIdArt67, "ZZ_INEXISTENT")
|
|
DO Assert WITH lcRezultat2 == lcAsteptat2, "cont_venit din nom_articole (6/7): asteptat [" + lcAsteptat2 + "], obtinut [" + lcRezultat2 + "]"
|
|
ELSE
|
|
IF USED('crssursart')
|
|
USE IN crssursart
|
|
ENDIF
|
|
DO AfLog WITH "INFO: niciun articol cu cont 6xx/7xx in schema - A2 sarit (nu e regresie, doar lipsa de date)"
|
|
ENDIF
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* PARTEA A3 - fara corespondenta, fara cont 6/7 -> fallback 704
|
|
gcCaz = "[A3-fallback-704] "
|
|
IF USED('crssursart3')
|
|
USE IN crssursart3
|
|
ENDIF
|
|
lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and (cont is null or substr(cont,1,1) not in ('6','7')) and rownum = 1],[crssursart3])
|
|
DO Assert WITH lnSucces >= 0 AND USED('crssursart3') AND RECCOUNT('crssursart3') = 1, "exista cel putin un articol fara cont 6xx/7xx in schema"
|
|
lnIdArtFallback = 0
|
|
IF USED('crssursart3') AND RECCOUNT('crssursart3') = 1
|
|
LOCAL lcRezultat3
|
|
lnIdArtFallback = crssursart3.id_articol
|
|
USE IN crssursart3
|
|
lcRezultat3 = deriva_cont_venit_fara_pol(lnIdArtFallback, "ZZ_INEXISTENT")
|
|
DO Assert WITH lcRezultat3 == "704", "fallback 704: obtinut [" + lcRezultat3 + "]"
|
|
ENDIF
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
* PARTEA B - formula de cablare, identica cu cea adaugata in do_scrie_articole
|
|
gcCaz = "[B1-cu-id_pol] "
|
|
LOCAL loArt1, lcArg1
|
|
loArt1 = CREATEOBJECT('Empty')
|
|
ADDPROPERTY(loArt1, 'id_pol', 63)
|
|
ADDPROPERTY(loArt1, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny))
|
|
ADDPROPERTY(loArt1, 'Cont', 'ZZ_INEXISTENT')
|
|
lcArg1 = Iif(Empty(Nvl(loArt1.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt1.id_articol,loArt1.Cont)) + ['],[,NULL])
|
|
DO Assert WITH lcArg1 == ",NULL", "id_pol populat: argumentul RPC (poz. 29) e ,NULL explicit, obtinut [" + lcArg1 + "]"
|
|
|
|
gcCaz = "[B2-fara-id_pol] "
|
|
LOCAL loArt2, lcArg2
|
|
loArt2 = CREATEOBJECT('Empty')
|
|
ADDPROPERTY(loArt2, 'id_pol', .NULL.)
|
|
ADDPROPERTY(loArt2, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny))
|
|
ADDPROPERTY(loArt2, 'Cont', 'ZZ_INEXISTENT')
|
|
lcArg2 = Iif(Empty(Nvl(loArt2.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt2.id_articol,loArt2.Cont)) + ['],[,NULL])
|
|
DO Assert WITH LEFT(lcArg2,2) == ",'", "id_pol gol: argumentul RPC (poz. 29) incepe pozitional cu ,' [" + lcArg2 + "]"
|
|
DO Assert WITH RIGHT(lcArg2,1) == "'", "argumentul se inchide cu apostrof [" + lcArg2 + "]"
|
|
DO Assert WITH lcArg2 == ",'704'", "valoarea trimisa e fallback 704 (Cont test inexistent + articol A3): [" + lcArg2 + "]"
|
|
|
|
DO Final
|
|
|
|
*----------------------------------------------------------------------------------------
|
|
PROCEDURE Assert
|
|
LPARAMETERS tlCond, tcMsg
|
|
IF tlCond
|
|
gnPass = gnPass + 1
|
|
DO AfLog WITH "PASS: " + gcCaz + tcMsg
|
|
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
|
|
gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10)
|
|
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
|
|
ENDPROC
|
|
|
|
PROCEDURE Final
|
|
DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail)
|
|
DO AfLog WITH "END " + TTOC(DATETIME())
|
|
QUIT
|
|
ENDPROC
|