Files
comun/utile/Teste/facturare_unificat/test_s4g_cont_venit.prg
Marius Mutu 8e022d332e #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
2026-09-09 21:38:25 +03:00

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