#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:
180
utile/Teste/facturare_unificat/test_s4g_cont_venit.prg
Normal file
180
utile/Teste/facturare_unificat/test_s4g_cont_venit.prg
Normal file
@@ -0,0 +1,180 @@
|
||||
* 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
|
||||
Reference in New Issue
Block a user