#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:
2026-09-09 21:38:25 +03:00
parent d1d0d7c37f
commit 8e022d332e
259 changed files with 57305 additions and 1576 deletions

View File

@@ -27,7 +27,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog)
ON ERROR DO ErrBench WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLogB WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -28,7 +28,7 @@ gcUltimaEroareSQL = ''
ON ERROR DO ErrDeCe WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog5 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -68,7 +68,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErr200 WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLog200 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -50,7 +50,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrRTVAI WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLogRTVAI WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -33,7 +33,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrMargine WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLogMargine WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -28,7 +28,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrTvainc WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLogTvainc WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -40,7 +40,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WriteTestLog WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -29,7 +29,7 @@ gcUltimaEroareSQL = ''
ON ERROR DO ErrRand WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog4 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -26,7 +26,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog)
ON ERROR DO ErrCompl WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
DO WrLog3 WITH 'mediu OK'
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE

View File

@@ -29,7 +29,7 @@ gnMockRaspuns = 6
ON ERROR DO ErrP1000 WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog2 WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -45,7 +45,7 @@ gnMockRaspuns = 6
ON ERROR DO ErrTimp WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
DO WrLog WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT

View File

@@ -0,0 +1,100 @@
* assert_id_part_rez.prg
* Verificarea pe date vii ceruta inainte de reparatia 3.3 (id_part_rez / id_lucrare_rez la editare).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* A. coloanele exista in VANZARI_DETALII?
lcSql = "select column_name, data_type, nullable from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ','ID_VANZARE','ID_VANZARE_DET','STERS') order by column_name"
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) VANZARI_DETALII coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA')
SELECT crsA
SCAN
STRTOFILE(' ' + PADR(ALLTRIM(column_name), 18) + ' ' + PADR(ALLTRIM(data_type), 10) + ' null=' + ALLTRIM(NVL(nullable,'?')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsA
ENDIF
goExecutor.oReset()
*!* B. exista randuri cu valori nenule?
lcSql = "select count(*) as tot, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from vanzari_detalii where sters = 0"
lnS = goExecutor.oExecute(lcSql, 'crsB')
STRTOFILE('B) numaratoare rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsB') AND RECCOUNT('crsB') > 0
STRTOFILE(' total=' + TRANSFORM(crsB.tot) + ' cu id_part_rez=' + TRANSFORM(crsB.cu_part) + ' cu id_lucrare_rez=' + TRANSFORM(crsB.cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsB
ENDIF
goExecutor.oReset()
*!* C. documentele cu valori nenule (top 20)
lcSql = "select id_vanzare, count(*) as nr, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from vanzari_detalii where sters = 0 and (id_part_rez is not null or id_lucrare_rez is not null) group by id_vanzare order by id_vanzare desc"
lnS = goExecutor.oExecute(lcSql, 'crsC')
STRTOFILE('C) documente cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsC')
SELECT crsC
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' linii=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsC
ENDIF
goExecutor.oReset()
*!* D. VVANZARI_ARTICOLE chiar nu le expune?
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ') order by column_name"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('D) VVANZARI_ARTICOLE expune? rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsD'), RECCOUNT('crsD'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
*!* E. ce face Oracle cu valoarea (BODY 4110-4165)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 4100 and 4165 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsE')
STRTOFILE('E) BODY 4100-4165 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsE'), RECCOUNT('crsE'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsE')
SELECT crsE
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsE
ENDIF
goExecutor.oReset()
*!* F. orice consumator al coloanelor in PL/SQL (unde conteaza 0 vs NULL)
lcSql = "select name, type, line, text from user_source where (lower(text) like '%id_part_rez%' or lower(text) like '%id_lucrare_rez%') order by name, type, line"
lnS = goExecutor.oExecute(lcSql, 'crsF')
STRTOFILE('F) consumatori PL/SQL rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsF'), RECCOUNT('crsF'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsF')
SELECT crsF
SCAN
STRTOFILE(' ' + PADR(ALLTRIM(name), 22) + ' ' + PADR(ALLTRIM(type), 14) + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsF
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,100 @@
* assert_id_part_rez2.prg
* Unde traiesc de fapt ID_PART_REZ / ID_LUCRARE_REZ: VANZARI_DETALII nu le are (proba 1).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez2_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* G. toate obiectele MARIUSM_AUTO care au coloanele
lcSql = "select t.table_name, o.object_type, count(*) as nr from all_tab_columns t, all_objects o where t.owner = 'MARIUSM_AUTO' and o.owner = t.owner and o.object_name = t.table_name and t.column_name in ('ID_PART_REZ','ID_LUCRARE_REZ') group by t.table_name, o.object_type order by t.table_name"
lnS = goExecutor.oExecute(lcSql, 'crsG')
STRTOFILE('G) obiecte cu coloanele rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsG'), RECCOUNT('crsG'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsG')
SELECT crsG
SCAN
STRTOFILE(' ' + PADR(ALLTRIM(table_name), 32) + ' ' + PADR(ALLTRIM(object_type), 12) + ' col=' + TRANSFORM(nr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsG
ENDIF
goExecutor.oReset()
*!* H. cate randuri RUL au valori nenule, si pe ce documente
lcSql = "select count(*) as tot, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from rul where sters = 0"
lnS = goExecutor.oExecute(lcSql, 'crsH')
STRTOFILE('H) RUL rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsH') AND RECCOUNT('crsH') > 0
STRTOFILE(' total=' + TRANSFORM(crsH.tot) + ' cu id_part_rez=' + TRANSFORM(crsH.cu_part) + ' cu id_lucrare_rez=' + TRANSFORM(crsH.cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsH
ENDIF
goExecutor.oReset()
*!* I. documente de vanzare cu rezervare pe RUL
lcSql = "select v.id_vanzare, v.tip, count(*) as nr, count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) group by v.id_vanzare, v.tip order by v.id_vanzare desc"
lnS = goExecutor.oExecute(lcSql, 'crsI')
STRTOFILE('I) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsI'), RECCOUNT('crsI'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsI')
SELECT crsI
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(NVL(tip,-1)) + ' linii=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsI
ENDIF
goExecutor.oReset()
*!* J. de unde citeste PACK_FACTURARE coloanele (BODY 3190-3270)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 3190 and 3270 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsJ')
STRTOFILE('J) BODY 3190-3270 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsJ'), RECCOUNT('crsJ'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsJ')
SELECT crsJ
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsJ
ENDIF
goExecutor.oReset()
*!* K. ce coloane are VANZARI_DETALII, integral (ca sa nu ramana dubiu)
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' order by column_id"
lnS = goExecutor.oExecute(lcSql, 'crsK')
STRTOFILE('K) VANZARI_DETALII toate coloanele rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsK'), RECCOUNT('crsK'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsK')
SELECT crsK
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsK
ENDIF
goExecutor.oReset()
*!* L. ce coloane are VANZARI_DETALII_TEMP
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII_TEMP' order by column_id"
lnS = goExecutor.oExecute(lcSql, 'crsL')
STRTOFILE('L) VANZARI_DETALII_TEMP coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsL'), RECCOUNT('crsL'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsL')
SELECT crsL
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsL
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,86 @@
* assert_id_part_rez3.prg
* Unde persista legatura de rezervare, daca VANZARI_DETALII nu are coloanele (proba 2).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez3_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* M. coloanele RUL
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'RUL' order by column_id"
lnS = goExecutor.oExecute(lcSql, 'crsM')
STRTOFILE('M) RUL coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsM'), RECCOUNT('crsM'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsM')
SELECT crsM
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsM
ENDIF
goExecutor.oReset()
*!* N. documente de vanzare cu rezervare pe RUL (fara v.tip)
lcSql = "select v.id_vanzare as idv, count(*) as nr, count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) group by v.id_vanzare order by v.id_vanzare desc"
lnS = goExecutor.oExecute(lcSql, 'crsN')
STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsN')
SELECT crsN
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsN
ENDIF
goExecutor.oReset()
*!* O. unde scrie PACK_FACTURARE in VANZARI_DETALII (mutarea din TEMP)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and lower(text) like '%vanzari_detalii%' order by line"
lnS = goExecutor.oExecute(lcSql, 'crsO')
STRTOFILE('O) referinte VANZARI_DETALII in BODY rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsO'), RECCOUNT('crsO'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsO')
SELECT crsO
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsO
ENDIF
goExecutor.oReset()
*!* P. cum se calculeaza CUSTODIE (BODY 4166-4200)
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 4166 and 4200 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsP')
STRTOFILE('P) BODY 4166-4200 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsP'), RECCOUNT('crsP'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsP')
SELECT crsP
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsP
ENDIF
goExecutor.oReset()
*!* Q. sursa view-ului VVANZARI_ARTICOLE (ca sa se vada de unde vine, si ce se poate adauga fara sa se atinga)
lcSql = "select count(*) as nr from all_views where owner = 'MARIUSM_AUTO' and view_name = 'VVANZARI_ARTICOLE'"
lnS = goExecutor.oExecute(lcSql, 'crsQ')
STRTOFILE('Q) VVANZARI_ARTICOLE e view? rc=' + TRANSFORM(lnS) + ' nr=' + TRANSFORM(IIF(USED('crsQ') AND RECCOUNT('crsQ')>0, crsQ.nr, -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsQ')
USE IN crsQ
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,74 @@
* assert_id_part_rez4.prg
* Documentele de vanzare care au legatura de rezervare pe RUL (candidati pentru proba pe date reale).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez4_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select v.id_vanzare as idv, v.id_firma as idf, count(*) as nr, ] + ;
[count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr ] + ;
[from rul r, vanzari v ] + ;
[where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ;
[group by v.id_vanzare, v.id_firma order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsN')
STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsN')
SELECT crsN
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' id_firma=' + TRANSFORM(NVL(idf,-1)) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsN
ENDIF
goExecutor.oReset()
*!* distributia pe tipuri de rulaj a randurilor cu rezervare
lcSql = [select r.id_tip_rulaj as tipr, count(*) as nr from rul r ] + ;
[where r.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ;
[group by r.id_tip_rulaj order by r.id_tip_rulaj]
lnS = goExecutor.oExecute(lcSql, 'crsO')
STRTOFILE('O) distributie id_tip_rulaj rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsO'), RECCOUNT('crsO'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsO')
SELECT crsO
SCAN
STRTOFILE(' id_tip_rulaj=' + TRANSFORM(NVL(tipr,-1)) + ' randuri=' + TRANSFORM(nr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsO
ENDIF
goExecutor.oReset()
*!* constrangeri pe RUL.ID_PART_REZ / ID_LUCRARE_REZ (0 vs NULL)
lcSql = [select c.constraint_name as cnume, c.constraint_type as ctip, cc.column_name as ccol ] + ;
[from all_constraints c, all_cons_columns cc ] + ;
[where c.owner = 'MARIUSM_AUTO' and c.constraint_name = cc.constraint_name ] + ;
[and c.owner = cc.owner and cc.table_name = 'RUL' ] + ;
[and cc.column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')]
lnS = goExecutor.oExecute(lcSql, 'crsP')
STRTOFILE('P) constrangeri RUL rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsP'), RECCOUNT('crsP'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsP')
SELECT crsP
SCAN
STRTOFILE(' ' + ALLTRIM(NVL(cnume,'')) + ' tip=' + ALLTRIM(NVL(ctip,'')) + ' col=' + ALLTRIM(NVL(ccol,'')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsP
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,55 @@
* assert_id_part_rez5.prg
* Candidatii pentru proba pe date reale + coloanele VANZARI.
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez5_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'VANZARI' order by column_id]
lnS = goExecutor.oExecute(lcSql, 'crsV')
STRTOFILE('V) VANZARI coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsV'), RECCOUNT('crsV'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsV')
SELECT crsV
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsV
ENDIF
goExecutor.oReset()
lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ;
[count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr ] + ;
[from rul r, vanzari v ] + ;
[where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ;
[group by v.id_vanzare order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsN')
STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsN')
SELECT crsN
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsN
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,78 @@
* assert_id_part_rez6.prg
* Exista o cheie directa intre randul RUL si linia de document (id_vanzare_det)?
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez6_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql, lcDoc
lcDoc = '540'
*!* randurile RUL ale documentului
lcSql = [select r.id_rul as idrul, r.id_fact as idfact, r.id_articol as idart, r.id_gestiune as idgest, ] + ;
[r.cont as ccont, r.pret as npret, r.cante as ncante, r.pretv as npretv, ] + ;
[r.id_tip_rulaj as tipr, r.id_part_rez as ipr, r.id_lucrare_rez as ilr, r.serie as cserie ] + ;
[from rul r, vanzari v where r.cod = v.cod and v.id_vanzare = ] + lcDoc + ;
[ and r.sters = 0 order by r.id_tip_rulaj desc, r.id_rul]
lnS = goExecutor.oExecute(lcSql, 'crsR')
STRTOFILE('R) RUL doc ' + lcDoc + ' rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsR'), RECCOUNT('crsR'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsR')
SELECT crsR
SCAN
STRTOFILE(' id_rul=' + TRANSFORM(idrul) + ' id_fact=' + IIF(ISNULL(idfact),'NULL',TRANSFORM(idfact)) + ;
' art=' + TRANSFORM(NVL(idart,-1)) + ' gest=' + TRANSFORM(NVL(idgest,-1)) + ;
' cont=[' + ALLTRIM(NVL(ccont,'')) + '] pret=' + TRANSFORM(NVL(npret,0)) + ;
' cante=' + TRANSFORM(NVL(ncante,0)) + ' pretv=' + TRANSFORM(NVL(npretv,0)) + ;
' tipr=' + TRANSFORM(NVL(tipr,-1)) + ' serie=[' + ALLTRIM(NVL(cserie,'')) + ']' + ;
' id_part_rez=' + IIF(ISNULL(ipr),'NULL',TRANSFORM(ipr)) + ;
' id_lucrare_rez=' + IIF(ISNULL(ilr),'NULL',TRANSFORM(ilr)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsR
ENDIF
goExecutor.oReset()
*!* liniile documentului
lcSql = [select d.id_vanzare_det as idvd, d.id_articol as idart, d.id_gestiune as idgest, ] + ;
[d.cont as ccont, d.pret_achizitie as npa, d.cantitate as ncant, d.serie as cserie ] + ;
[from vanzari_detalii d where d.id_vanzare = ] + lcDoc + [ and d.sters = 0 order by d.id_vanzare_det]
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('S) VANZARI_DETALII doc ' + lcDoc + ' rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsD'), RECCOUNT('crsD'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(idvd) + ' art=' + TRANSFORM(NVL(idart,-1)) + ;
' gest=' + TRANSFORM(NVL(idgest,-1)) + ' cont=[' + ALLTRIM(NVL(ccont,'')) + ']' + ;
' pret_achiz=' + TRANSFORM(NVL(npa,0)) + ' cant=' + TRANSFORM(NVL(ncant,0)) + ;
' serie=[' + ALLTRIM(NVL(cserie,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
*!* cate randuri RUL au id_fact care exista in vanzari_detalii (potrivire directa)
lcSql = [select count(*) as tot, count(r.id_fact) as cu_fact ] + ;
[from rul r where r.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null)]
lnS = goExecutor.oExecute(lcSql, 'crsT')
STRTOFILE('T) RUL cu rezervare: id_fact completat rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsT') AND RECCOUNT('crsT') > 0
STRTOFILE(' total=' + TRANSFORM(crsT.tot) + ' cu_id_fact=' + TRANSFORM(crsT.cu_fact) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsT
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,78 @@
* assert_id_part_rez7.prg
* Cate randuri au valori NENULE SI NENULE-DE-ZERO; ce documente. Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez7_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select count(*) as tot, ] + ;
[sum(case when r.id_part_rez is not null and r.id_part_rez <> 0 then 1 else 0 end) as part_nz, ] + ;
[sum(case when r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0 then 1 else 0 end) as lucr_nz, ] + ;
[sum(case when r.id_part_rez = 0 then 1 else 0 end) as part_z ] + ;
[from rul r where r.sters = 0]
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) RUL rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA') AND RECCOUNT('crsA') > 0
STRTOFILE(' total=' + TRANSFORM(crsA.tot) + ' part<>0=' + TRANSFORM(NVL(crsA.part_nz,0)) + ;
' lucr<>0=' + TRANSFORM(NVL(crsA.lucr_nz,0)) + ' part=0=' + TRANSFORM(NVL(crsA.part_z,0)) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crsA
ENDIF
goExecutor.oReset()
lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ;
[sum(case when r.id_part_rez is not null and r.id_part_rez <> 0 then 1 else 0 end) as part_nz, ] + ;
[sum(case when r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0 then 1 else 0 end) as lucr_nz ] + ;
[from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and ((r.id_part_rez is not null and r.id_part_rez <> 0) or (r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0)) ] + ;
[group by v.id_vanzare order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsB')
STRTOFILE('B) documente cu rezervare reala rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsB'), RECCOUNT('crsB'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsB')
SELECT crsB
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ;
' part<>0=' + TRANSFORM(NVL(part_nz,0)) + ' lucr<>0=' + TRANSFORM(NVL(lucr_nz,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsB
ENDIF
goExecutor.oReset()
*!* valorile efective, cu documentul si linia
lcSql = [select v.id_vanzare as idv, r.id_rul as idrul, r.id_articol as idart, r.id_gestiune as idgest, ] + ;
[r.cont as ccont, r.pret as npret, r.cante as ncante, r.id_tip_rulaj as tipr, ] + ;
[r.id_part_rez as ipr, r.id_lucrare_rez as ilr ] + ;
[from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ;
[and ((r.id_part_rez is not null and r.id_part_rez <> 0) or (r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0)) ] + ;
[order by v.id_vanzare desc, r.id_rul]
lnS = goExecutor.oExecute(lcSql, 'crsC')
STRTOFILE('C) randurile cu rezervare reala rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsC')
SELECT crsC
SCAN
STRTOFILE(' doc=' + TRANSFORM(idv) + ' id_rul=' + TRANSFORM(idrul) + ' art=' + TRANSFORM(NVL(idart,-1)) + ;
' gest=' + TRANSFORM(NVL(idgest,-1)) + ' cont=[' + ALLTRIM(NVL(ccont,'')) + ']' + ;
' pret=' + TRANSFORM(NVL(npret,0)) + ' cante=' + TRANSFORM(NVL(ncante,0)) + ' tipr=' + TRANSFORM(NVL(tipr,-1)) + ;
' id_part_rez=' + IIF(ISNULL(ipr),'NULL',TRANSFORM(ipr)) + ;
' id_lucrare_rez=' + IIF(ISNULL(ilr),'NULL',TRANSFORM(ilr)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsC
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,43 @@
* assert_id_part_rez8.prg
* Alegerea unui document de control cu id_part_rez = 0 SI linii gestionabile (in_stoc <> 0).
* Doar SELECT pe MARIUSM_AUTO.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez8_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ;
[sum(case when nvl(n.in_stoc,0) <> 0 then 1 else 0 end) as gest ] + ;
[from rul r, vanzari v, nom_articole n ] + ;
[where r.cod = v.cod and r.sters = 0 and v.sters = 0 and n.id_articol = r.id_articol ] + ;
[and r.id_part_rez = 0 and r.cante <> 0 ] + ;
[group by v.id_vanzare having sum(case when nvl(n.in_stoc,0) <> 0 then 1 else 0 end) > 0 ] + ;
[order by v.id_vanzare desc]
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) docuri cu id_part_rez=0 si articole in stoc rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA')
SELECT crsA
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri=' + TRANSFORM(nr) + ' gestionabile=' + TRANSFORM(NVL(gest,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsA
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,68 @@
* assert_pretval_apelanti.prg
* Asertiune ceruta inainte de reparatia vpretctva/vdiscountctva (docs\propunere_comparatie_coloane_crsfactura.md:310):
* toti apelantii lui prelucreaza_facturacrs trebuie sa aiba pret_val si discount_unitar_val in cursorul sursa.
* Doar SELECT pe MARIUSM_AUTO. Sursele statice (Create Cursor / SELECT ... As pret_val) se verifica in raport.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
*!* A. crsdetalii (ofacturare_stoc.prg:578 "select * from fact_vfacturi_detalii")
lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'FACT_VFACTURI_DETALII' and column_name in ('PRET_VAL','DISCOUNT_UNITAR_VAL') order by column_name"
lnS = goExecutor.oExecute(lcSql, 'crsA')
STRTOFILE('A) FACT_VFACTURI_DETALII rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsA')
SELECT crsA
SCAN
STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsA
ENDIF
goExecutor.oReset()
*!* B. antetele procedurilor care produc ref cursoarele celorlalti apelanti Oracle
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ;
"and (lower(text) like '%procedure citeste_vanzari_seturi%' or lower(text) like '%procedure citeste_proforme_seturi%' " + ;
"or lower(text) like '%procedure finalizeaza_scriere_verificare%') order by line"
lnS = goExecutor.oExecute(lcSql, 'crsB')
STRTOFILE('B) antete proceduri rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsB'), RECCOUNT('crsB'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsB')
SELECT crsB
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsB
ENDIF
goExecutor.oReset()
*!* C. toate liniile din corpul pachetului care numesc pret_val / discount_unitar_val
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ;
"and (lower(text) like '%pret_val%' or lower(text) like '%discount_unitar_val%') order by line"
lnS = goExecutor.oExecute(lcSql, 'crsC')
STRTOFILE('C) linii cu pret_val/discount_unitar_val rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsC')
SELECT crsC
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsC
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,42 @@
* assert_pretval_apelanti2.prg -- delimitarea procedurilor din PACK_FACTURARE intre 14200 si 15900
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti2_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ;
"and line between 14200 and 15900 and regexp_like(text, '^\s*(procedure|function)\s', 'i') order by line"
lnS = goExecutor.oExecute(lcSql, 'crsH')
STRTOFILE('antete 14200..15900 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsH'), RECCOUNT('crsH'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsH')
SELECT crsH
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsH
ENDIF
goExecutor.oReset()
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 15100 and 15200 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('corp 15100..15200 rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,30 @@
* assert_pretval_apelanti3.prg -- corpul finalizeaza_scriere_verificare (14238..14340)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti3_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 14238 and 14340 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,30 @@
* assert_pretval_apelanti3.prg -- corpul finalizeaza_scriere_verificare (14238..14340)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti4_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS, lcSql
lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 14183 and 14238 order by line"
lnS = goExecutor.oExecute(lcSql, 'crsD')
STRTOFILE('rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('crsD')
SELECT crsD
SCAN
STRTOFILE(PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsD
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,60 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_cols_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select column_name from user_tab_columns where table_name='VPLAJE_NUMERE' order by column_id", 'crsCol1')
STRTOFILE('VPLAJE_NUMERE cols: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsCol1')
SELECT crsCol1
SCAN
STRTOFILE(column_name + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS2
lnS2 = goExecutor.oExecute("select column_name, data_type from user_tab_columns where table_name in ('FACT_VFACTURI') and column_name in ('INCASAT','NR_INCASARE','INCASATCARD','INCASATTICHETE','TIP_INCASARE','SERIE_CHIT') order by column_name", 'crsCol2')
STRTOFILE('FACT_VFACTURI incasare cols: ' + Transform(lnS2) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsCol2')
SELECT crsCol2
SCAN
STRTOFILE(column_name + ' ' + data_type + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS3
lnS3 = goExecutor.oExecute("select column_name, data_type from user_tab_columns where table_name = 'VANZARI' and column_name in ('INCASAT','NR_INCASARE','INCASATCARD','INCASATTICHETE','TIP_INCASARE','SERIE_CHIT','ID_CASA') order by column_name", 'crsCol3')
STRTOFILE('VANZARI incasare cols: ' + Transform(lnS3) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsCol3')
SELECT crsCol3
SCAN
STRTOFILE(column_name + ' ' + data_type + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS4
lnS4 = goExecutor.oExecute("select id_vanzare, incasat, nr_incasare from fact_vfacturi where id_vanzare=1071", 'crsDoc')
STRTOFILE('doc 1071: ' + Transform(lnS4) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsDoc')
SELECT crsDoc
STRTOFILE('incasat=' + Transform(incasat) + ' nr_incasare=' + Transform(Nvl(nr_incasare,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,50 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_doc1071_incasare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select id_vanzare, incasat, nr_incasare, serie_chit, tip_incasare, cod, numar_act from fact_vfacturi where id_vanzare=1071", 'crsD')
STRTOFILE('doc1071: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsD')
SELECT crsD
STRTOFILE('incasat=' + Transform(incasat) + ' nr_incasare=' + Transform(Nvl(nr_incasare,-1)) + ;
' serie_chit=[' + Transform(Nvl(serie_chit,'?')) + '] tip_incasare=' + Transform(Nvl(tip_incasare,-1)) + ;
' cod=' + Transform(cod) + ' numar_act=' + Transform(numar_act) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
LOCAL lnS2
lnS2 = goExecutor.oExecute("select scd, scc, id_fdoc, serie_act, nract, suma, sters, perechec from act where cod=(select cod from fact_vfacturi where id_vanzare=1071) and perechec=(select numar_act from fact_vfacturi where id_vanzare=1071) and substr(scd,1,1)='5' and scc<>'418'", 'crsAct')
STRTOFILE('act rows: ' + Transform(lnS2) + ' reccount=' + Transform(Iif(Used('crsAct'),Reccount('crsAct'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsAct')
SELECT crsAct
SCAN
STRTOFILE('scd=' + scd + ' scc=' + scc + ' id_fdoc=' + Transform(Nvl(id_fdoc,-1)) + ' serie_act=' + Transform(Nvl(serie_act,'?')) + ;
' nract=' + Transform(Nvl(nract,0)) + ' suma=' + Transform(Nvl(suma,0)) + ' sters=' + Transform(sters) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
LOCAL lnS3
lnS3 = goExecutor.oExecute("select PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_CHITANTA') as chit, PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_BONFISCAL') as bon, PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_CARD') as card from dual", 'crsOpt')
STRTOFILE('optiuni fdoc: ' + Transform(lnS3) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsOpt')
SELECT crsOpt
STRTOFILE('ID_FDOC_CHITANTA=' + Transform(chit) + ' ID_FDOC_BONFISCAL=' + Transform(bon) + ' ID_FDOC_CARD=' + Transform(card) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,29 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_tip_incasare_distrib_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select tip_incasare, count(*) as nr from fact_vfacturi where incasat<>0 and sters=0 group by tip_incasare order by tip_incasare", 'crsD')
STRTOFILE('distrib: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsD')
SELECT crsD
SCAN
STRTOFILE('tip_incasare=' + Transform(Nvl(tip_incasare,-1)) + ' nr=' + Transform(nr) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,27 @@
* check_vartype_semantics.prg
* Verifica empiric daca Vartype(varNedeclarata) arunca eroare sau intoarce 'U',
* fara Oracle, fara conectare - doar semantica limbajului VFP.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_vartype_semantics_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
LOCAL lcRezultat
lcRezultat = 'NEATINS'
lcRezultat = Vartype(poNedeclaratXyz)
STRTOFILE('Vartype(poNedeclaratXyz) = [' + Transform(lcRezultat) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lcRezultat2
lcRezultat2 = 'NEATINS'
lcRezultat2 = Type('poNedeclaratXyz')
STRTOFILE('Type(''poNedeclaratXyz'') = [' + Transform(lcRezultat2) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,38 @@
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_view_def_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnS
lnS = goExecutor.oExecute("select text from user_views where view_name='FACT_VFACTURI'", 'crsV')
STRTOFILE('view text: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsV')
SELECT crsV
STRTOFILE(Text + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
goExecutor.oReset()
LOCAL lnS2
lnS2 = goExecutor.oExecute("select table_name from user_tables where table_name in ('VANZARI','VANZARI_DETALII','VANZARI_INCASARI','VANZARI_CORESP')", 'crsT')
STRTOFILE('tabele: ' + Transform(lnS2) + CHR(13) + CHR(10), gcErrLog, 1)
IF Used('crsT')
SELECT crsT
SCAN
STRTOFILE(table_name + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -125,6 +125,8 @@ TRY
*----- PROCEDURI (mock amessagebox PRIMUL) -----
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg"
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO proceduri_comune ADDITIVE
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
@@ -406,7 +408,10 @@ FUNCTION CreeazaDocument
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
pnTotalDiscountAvize = 0
update_jtva_coloane([JV], [jtva_coloane_temp])
@@ -460,6 +465,8 @@ FUNCTION CreeazaDocument
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
gnIdUtil = -3
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO S8Log WITH ' numar alocat: serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + '] nract=' + TRANSFORM(poDate.nract)
IF poDate.tva_incasare = 0
@@ -513,8 +520,13 @@ FUNCTION CreeazaDocument
*-- crsarticole vine cu Buffering optimistic pe rand (3) - REPLACE fara TABLEUPDATE() ramane
*-- in bufferul local si e pierdut la urmatoarea citire/mutare de recno (verificat empiric:
*-- REPLACE arata cantitate=1 imediat, dar orice citire ulterioara arata iar 0).
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
DO S8Log WITH ' dupa fix cantitate: ' + lcCursor + '.cantitate=' + TRANSFORM(cantitate)
@@ -580,11 +592,14 @@ FUNCTION CreeazaDocument
ENDDO
DO S8Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' (frm_alte_date tratat=' + TRANSFORM(glDlgTratat8) + ') poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
IF lnScris
lnIdVanzareRezultat = NVL(poDate.nid_vanzare, 0)
ELSE
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO S8Log WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrm8') = 'O' AND !ISNULL(goFrm8)
goFrm8.Release()

View File

@@ -0,0 +1,57 @@
* curata_s11_borderou.prg - sterge fizic borderourile semanate de proba S11 (rularile 2 si 4 ale
* lui test_s9_4_regenerare.prg le lasa in urma; rularile 3 si 5 se curata singure).
* Parametru: lista de id-uri FACT_BORDEROU, separate prin virgula. Borderourile dinainte de proba
* (id <= 19 pe MARIUSM_AUTO la 04.09.2026) NU se ating.
LPARAMETERS tcListaId
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\curata_s11_borderou_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' lista=' + TRANSFORM(tcListaId) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
LOCAL lcLista
lcLista = CHRTRAN(ALLTRIM(TRANSFORM(tcListaId)), ' ', '')
IF EMPTY(lcLista) OR !ISDIGIT(LEFT(lcLista, 1))
STRTOFILE('EROARE: se cere o lista de id-uri numerice, ex: DO curata_s11_borderou WITH "20,21"' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnDet, lnAnt
lnDet = -1
lnAnt = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)], @lnDet)
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou where id in (] + lcLista + [)], @lnAnt)
STRTOFILE('inainte: ' + TRANSFORM(lnAnt) + ' borderouri, ' + TRANSFORM(lnDet) + ' randuri de detaliu' + CHR(13) + CHR(10), gcErrLog, 1)
IF goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)]) AND ;
goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou where id in (] + lcLista + [)])
goExecutor.oExecuta([COMMIT])
ELSE
STRTOFILE('ESEC la stergere: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oExecuta([ROLLBACK])
ENDIF
lnDet = -1
lnAnt = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)], @lnDet)
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou where id in (] + lcLista + [)], @lnAnt)
STRTOFILE('dupa: ' + TRANSFORM(lnAnt) + ' borderouri, ' + TRANSFORM(lnDet) + ' randuri de detaliu' + CHR(13) + CHR(10), gcErrLog, 1)
lnDet = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii], @lnDet)
STRTOFILE('total ramas in FACT_BORDEROU_DETALII: ' + TRANSFORM(lnDet) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,40 @@
* curata_s9_5_atasamente.prg - sterge fizic atasamentele semanate de probele S9-5 si S11 pe
* documentele atinse (S9-5: 1073 controlul negativ, 1074 rularea verde; S11: 1127 rularea verde,
* 1128 controlul negativ, 1076/1111/1129 rulari care nu au consumat documentul).
* Randurile legate prin COD (cele 20 mostenite) NU se ating.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\curata_s9_5_atasamente_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lnNr
lnNr = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)], @lnNr)
STRTOFILE('inainte: ' + TRANSFORM(lnNr) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
IF goExecutor.oExecuta([delete from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)])
goExecutor.oExecuta([COMMIT])
ENDIF
lnNr = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)], @lnNr)
STRTOFILE('dupa: ' + TRANSFORM(lnNr) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
lnNr = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari], @lnNr)
STRTOFILE('total ramas in tabela: ' + TRANSFORM(lnNr) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -4,6 +4,11 @@
* (pack_contafin.finalizeaza_modificare_nota -> pack_facturare.actualizeaza_vanzari), deci orice
* ancorare pe cod moare tacut; ID_VANZARE ramane, dar nici el nu e cunoscut dinainte.
*
* *!* 06.09.2026
* *!* marius.mutu
* *!* Cazurile care aleg documente cu articole reale exclud notele cu un rand activ pe un cont
* *!* care cere simbol analitic si nu il are; altfel verificare_note_contabile respinge salvarea.
*
* DescoperaCazTest(<nume caz>, <alias destinatie>) -> .T. daca a gasit un document, lasand in alias
* un singur rand cu cod, an, luna, id_vanzare, tip, nlin (plus nract/serie_act/dataact/nract_fara
* pentru cazul de coliziune). Pe .F. aliasul ramane cu 0 randuri.
@@ -26,7 +31,7 @@
FUNCTION DescoperaCazTest
LPARAMETERS tcCaz, tcAlias
LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcSql, lnSucces
LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcFiltruAnalitic, lcSql, lnSucces
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz')
@@ -59,15 +64,21 @@ FUNCTION DescoperaCazTest
[(select 1 from vanzari w where w.cod=y.cod and nvl(w.numar_act,-1)=nvl(y.nract,-1) ] + ;
[and nvl(w.serie_act,' ')=nvl(y.serie_act,' ') and trunc(w.data_act)=trunc(y.dataact) and w.sters=0))]
*!* verificare_note_contabile respinge salvarea unei note cu cont ce cere analitic si nu il are
lcFiltruAnalitic = [not exists (select 1 from vact_tot x where x.cod=p.cod and x.an=p.an and x.luna=p.luna ] + ;
[and x.sters=0 and nvl(x.suma,0)<>0 and ( ] + ;
[(x.ascd is null and exists (select 1 from vplcont_analitic pa where pa.cont=x.scd and pa.an=?gnAn and pa.inactiv=0)) ] + ;
[or (x.ascc is null and exists (select 1 from vplcont_analitic pa where pa.cont=x.scc and pa.an=?gnAn and pa.inactiv=0)) ))]
DO CASE
CASE Upper(Alltrim(m.tcCaz)) == 'FACTURA_ARTICOLE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'NEFACTURA_ARTICOLE'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 ] + ;
m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'FARA_RULAJE'
@@ -75,11 +86,12 @@ FUNCTION DescoperaCazTest
m.lcPrim + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 ] + ;
[and not exists (select 1 from vrul_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ;
[and not exists (select 1 from vrul_obinv_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ;
[and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'PRIM_RAND_ORB'
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ;
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'COLIZIUNE_COD'
@@ -91,6 +103,7 @@ FUNCTION DescoperaCazTest
m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ;
[and (select count(distinct v2.id_vanzare) from vanzari v2 where v2.cod=p.cod and v2.sters=0) >= 2 ] + ;
[and ] + Strtran(m.lcNractFara, [<COL>], [nract]) + [ is not null ] + ;
[and ] + m.lcFiltruAnalitic + [ ] + ;
[order by v.id_vanzare desc) where rownum = 1]
CASE Upper(Alltrim(m.tcCaz)) == 'NOTA_FARA_VANZARI'

View File

@@ -0,0 +1,454 @@
* emite_document_stoc_s93.prg
* Reumple rezervorul lui test_s9_3_stergere.prg (candidat eligibil: STERS=0, in luna activa,
* fara referinte/urmasi, cu randuri REALE in vact_tot SI vrul_tot). Emite UN document REAL
* in MARIUSM_AUTO@ROA_CENTRAL prin fluxul de productie (docs\raport_datoria4_stergere.md).
*
* Baza: COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg (tnTip=22, AVIZ din lista
* de preturi, client RAJA id_part=463, forma veche frm_facturare_articole, tip_incasare=1) -
* singura combinatie confirmata ca scrie in VANZARI in acest mediu. DOUA modificari fata de acel
* fisier, ambele necesare ca sa apara randuri in RUL (nu doar in ACT):
*
* 1) NU se mai reseteaza gnIdUtil la -3 inainte de cursor_preturi (acolo ramane doar pentru
* alocarea numarului). Cu gnIdUtil=8 lista de preturi FACT_VPRETURI_UTILIZATOR intoarce
* articole GESTIONABILE cu stoc real (verificat read-only); cu -3 intoarce un singur articol
* negestionabil, cantitate 0 - de-asta suita S3b/creeaza_documente_s8 nu producea niciodata
* randuri vrul_tot (docs\raport_s13b_fixturi.md §6.1).
* 2) V_FILTRU_COD = '11.00003' (id_articol=315554536, ACOPERIRE FAR VOLVO FH12) restrange
* cursor_preturi la UN singur articol gestionabil cu stoc mare (>11000 bucati la data
* scrierii acestui fisier), ca sa nu intre in document toata lista de preturi a utilizatorului 8.
*
* Rulare: vfp9.exe -A -T "D:\ROA\...\emite_document_stoc_s93.prg" (headless, cateva secunde)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log
* Rezultat: STRTOFILE cu 'id_vanzare=<n>' la succes, sau 'ESEC' - vezi raportul pentru numerele arse.
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out"
ENDIF
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
gnPass = 0
gnFail = 0
ON ERROR DO EmiteErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
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 EmiteLog WITH 'EROARE: conectare Oracle esuata'
DO EmiteFinal
ENDIF
DO EmiteLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO gridextras.vcx ADDITIVE
SET CLASSLIB TO _cb_base.vcx ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
IF !actualizeaza_optiuni_program()
DO EmiteLog WITH 'EROARE: actualizeaza_optiuni_program()'
DO EmiteFinal
ENDIF
*-- gnScadereStoc=1 (nu 0, spre deosebire de test_s3b_emitere_reala.prg): cu 0, do_adauga_articol
*-- ocoleste mereu do_alege_stoc (ofacturare.vc2:13021), deci ID_GESTIUNE ramane null pe linie si
*-- nu apare niciun rand in vrul_tot, indiferent de cantitate/stoc. Cu 1 si UN singur candidat de
*-- gestiune (Reccount(crsgestarticol)=1) + tlImplicit=.T., do_alege_stoc(ofacturare.vc2:13478)
*-- alege automat gestiunea, FARA sa arate modalul (frm_articol_gest_factura.inainte_de_do_termin
*-- se autoconfirma cand nu exista nicio eroare de validare).
gnScadereStoc = 1
gnModTotFact = 0
gnFactSeturi = 0
gnListareAvizBonFiscal = 0
gnid_part_casa = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
DO EmiteLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
gnNrIncasareCapturat = 0
gcClaseVazute = ';'
goDriverAD = CREATEOBJECT('driverAlteDateEmite')
_SCREEN.AddObject('tmrDrvEmite', 'Timer')
_SCREEN.tmrDrvEmite.Interval = 200
BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverAD, 'Executa')
_SCREEN.tmrDrvEmite.Enabled = .T.
*-- driverGestArticol: acelasi timer, un al doilea BINDEVENT - conduce modalul per-linie
*-- FRM_ARTICOL_GEST_FACTURA (do_alege_stoc, ofacturare.vc2:13518/13526/13540)
PUBLIC goDriverGest, glDlgTratatGest, goUltimulFormGest
glDlgTratatGest = .F.
goUltimulFormGest = .NULL.
goDriverGest = CREATEOBJECT('driverGestArticol')
BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverGest, 'Executa')
_SCREEN.Caption = 'emite_document_stoc_s93 - reumplere pool S9-3'
LOCAL lnIdVz
lnIdVz = CreeazaDocumentStoc()
_SCREEN.tmrDrvEmite.Enabled = .F.
DO Assert WITH lnIdVz > 0, 'documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
DO EmiteLog WITH 'id_vanzare=' + TRANSFORM(lnIdVz)
ELSE
DO EmiteLog WITH 'ESEC'
ENDIF
DO EmiteFinal
CATCH TO loExc
DO EmiteLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO EmiteFinal
ENDTRY
QUIT
*==================================================================================
PROCEDURE EmiteLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
ENDPROC
PROCEDURE EmiteErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO EmiteLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE EmiteFinal
DO EmiteLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO EmiteLog WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO EmiteLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO EmiteLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
*==================================================================================
* CreeazaDocumentStoc: emite un document REAL (tnTip=22, cursor_preturi filtrat pe UN articol
* gestionabil cu stoc), tip_incasare=1 (Fara incasare), forma veche. Intoarce id_vanzare (>0
* succes) sau 0.
FUNCTION CreeazaDocumentStoc
*-- lcFiltruCod PRIVATE, nu LOCAL: goExecutor.oExecute leaga parametrii dupa numele
*-- variabilei (ca poDate.* mai jos), deci trebuie vizibila din metoda apelata, nu doar aici.
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, lcFiltruCod
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
LOCAL lcSerieAlocata, lnNractAlocat
lnIdVanzareRezultat = 0
lcSerieAlocata = ''
lnNractAlocat = 0
gnNrIncasareCapturat = 0
tnTip = 22
tnIdClient = 463
tnIdDelegat = 256
*-- 4294507796 / MOTOREDUCTOR 20SEC: UN singur lot in gestiunea 1 (Reccount(crsgestarticol)=1,
*-- verificat read-only) - conditia lui do_alege_stoc pentru autoselectie fara modal.
lcFiltruCod = '0V2549'
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
lnIdSet = 25900
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 6 && AVIZ - plaja globala
gnIdUtil = 8
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
poDate.id_client = tnIdClient
poDate.id_delegat = tnIdDelegat
poDate.zi_curs = {^2026-08-10}
*-- gestiune reala (nu NULL): fara ea cursor_preturi arata articolul gestionabil dar
*-- scrierea documentului nu are de unde sa scada stocul - primul document emis (id_vanzare=1474)
*-- a iesit cu 0 randuri in vrul_tot desi articolul era gestionabil, cu stoc.
poDate.id_gestiune_init = 1
IF poDate.rezultat_serii = 3
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
ENDIF
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
*-- gnIdUtil ramane 8 (NU -3, spre deosebire de test_s3b_emitere_reala.prg): cu -3
*-- cursor_preturi intoarce un singur articol negestionabil, cantitate 0 - fara asta
*-- documentul nu ar avea nicio sansa de rand in RUL.
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
lnNractAlocat = poDate.nract
DO EmiteLog WITH 'poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ;
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?lcFiltruCod)}]
lcCursor = [crsarticole]
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
IF lnSucces < 0
DO EmiteLog WITH 'EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO CurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
IF RECCOUNT(lcCursor) = 0
DO EmiteLog WITH 'Nu exista articole (Reccount=0) - abandon document'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO CurataJtva
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
DO EmiteLog WITH 'crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
SELECT (lcCursor)
REPLACE ALL cantitate WITH 1, ;
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
=TABLEUPDATE(.T., .T., lcCursor)
GO TOP
creeaza_facturacrs([crsfactura])
IF poDate.in_valuta = 1
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
SELECT crscursuri
poDate.Curs = Curs
poDate.multiplicator = multiplicator
ELSE
citeste_cursuri_zi(poDate.zi_curs)
IF RECCOUNT('crscursuri') = 0
USE IN crscursuri
ENDIF
ENDIF
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
SELECT crspolitici
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi
ENDIF
PUBLIC goFrmEmite
goFrmEmite = CREATEOBJECT('frm_facturare_articole')
goFrmEmite.WindowType = 0
goFrmEmite.Show()
DOEVENTS FORCE
DO EmiteLog WITH 'formular afisat modeless (VECHI frm_facturare_articole)'
glDlgTratatGest = .F.
goFrmEmite.do_adauga_tot()
DOEVENTS FORCE
DO EmiteLog WITH 'do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ;
' glDlgTratatGest=' + TRANSFORM(glDlgTratatGest)
*-- do_initializeaza_articol zeroeste cantitatea la adaugare (ca la tip 1, ofacturare.vc2:13890) -
*-- se scrie explicit dupa adaugare, ca in test_s6_1_lista_preturi.prg (SeteazaCantitati):
*-- fara asta VANZARI_DETALII.CANTITATE ramane 0 si nu apare niciun rand in vrul_tot.
LOCAL loArtCant
SELECT crsfactura
SCAN
REPLACE cantitate WITH 1
SCATTER NAME loArtCant MEMO
loArtCant = calculeaza_totaluri(loArtCant)
GATHER NAME loArtCant MEMO
ENDSCAN
DO EmiteLog WITH 'cantitate setata explicit pe crsfactura'
goFrmEmite.do_calculeaza_totaluri()
DOEVENTS FORCE
LOCAL lnScris
glDlgTratatAD = .F.
gnTipIncasareCerut = 1
lnScris = goFrmEmite.do_termin()
LOCAL lnWait
lnWait = 0
DO WHILE !glDlgTratatAD AND lnWait < 10
DOEVENTS FORCE
lnWait = lnWait + 1
ENDDO
DO EmiteLog WITH 'do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
IF lnIdVanzareRezultat < 0
lnIdVanzareRezultat = 0
ENDIF
DO EmiteLog WITH 'verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
IF TYPE('goFrmEmite') = 'O' AND !ISNULL(goFrmEmite)
goFrmEmite.Release()
ENDIF
goFrmEmite = NULL
IF USED('crspolitici')
USE IN crspolitici
ENDIF
IF USED('crscursuri')
USE IN crscursuri
ENDIF
IF USED('crsfactura')
USE IN crsfactura
ENDIF
IF USED('crsarticole')
USE IN crsarticole
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN lnIdVanzareRezultat
ENDFUNC
PROCEDURE CurataJtva
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF USED('jtva_coloane_temp')
USE IN jtva_coloane_temp
ENDIF
ENDPROC
*==================================================================================
*-- driverAlteDateEmite: identic cu driverAlteDateAD din test_s3b_emitere_reala.prg - cauta
* FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value INAINTE de do_termin().
DEFINE CLASS driverAlteDateEmite AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit, loMsgForm
llGasit = .F.
loMsgForm = NULL
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ALTE_DATE'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO EmiteLog WITH '[diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ENDIF
IF glDlgTratatAD OR !llGasit
RETURN
ENDIF
TRY
loForm.opt_incasat.Value = gnTipIncasareCerut
gnNrIncasareCapturat = poDate.nr_incasare
loForm.do_termin()
glDlgTratatAD = .T.
CATCH TO loExcDrv
DO EmiteLog WITH 'driverAlteDateEmite: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatAD = .T.
ENDTRY
ENDPROC
ENDDEFINE
*==================================================================================
*-- driverGestArticol: acelasi mecanism (poll _SCREEN.Forms + apel direct do_termin(), fara input
* real) ca driverAlteDateAD/driverAlteDateEmite, dar pentru FRM_ARTICOL_GEST_FACTURA - modalul
* per-linie al lui do_alege_stoc (ofacturare.vc2:13518/13526/13540), aratat neconditionat cand
* inainte_de_do_termin() esueaza pe randul curent din crsgestarticol (chiar si pe ramura cu un
* singur lot + tlImplicit, ofacturare.vc2:13495-13524, pentru ca poArticol.cantitate a fost deja
* zeroit de do_initializeaza_articol - ofacturare.vc2:13922, tip 22 fara opt_facturare 1/2).
* Copiaza pe poArticol campurile randului curent din crsgestarticol (ce ar face si navigarea in
* grid_gestiuni.AfterRowColChange, ofacturare.vc2:4227-4239) plus o cantitate nenula, apoi cheama
* do_termin() direct pe formular.
*-- do_adauga_tot() SCANeaza crsarticole (aici 2 randuri, acelasi articol pe doua liste de preturi
* ale utilizatorului 8) si cheama do_alege_stoc() o data PE RAND - modalul poate aparea de mai multe
* ori, secvential, in aceeasi rulare. De-asta flagul de "tratat" nu e global (ca la frm_alte_date,
* aratat o singura data): retine INSTANTA de formular deja tratata (goUltimulFormGest) - o instanta
* noua (formular urmator) tot se trateaza, aceeasi instanta nu se retrateaza daca timer-ul mai apuca
* un tick inainte sa se inchida.
DEFINE CLASS driverGestArticol AS Custom
PROCEDURE Executa
LOCAL lnI, loForm, llGasit
llGasit = .F.
FOR lnI = 1 TO _SCREEN.FormCount
LOCAL lcClasa
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ARTICOL_GEST_FACTURA'
loForm = _SCREEN.Forms(lnI)
llGasit = .T.
ENDIF
ENDFOR
IF !llGasit OR loForm = goUltimulFormGest
RETURN
ENDIF
TRY
SELECT crsgestarticol
GO TOP
poArticol.cantitate = 1
poArticol.pret_achizitie = Pret
poArticol.lot = NVL(lot, [])
poArticol.serie = NVL(serie, [])
poArticol.id_gestiune = id_gestiune
poArticol.Cont = ALLTRIM(Cont)
poArticol.id_lucrare_rez = id_lucrare_rez
poArticol.id_part_rez = id_part_rez
poArticol.pretv_orig = pretv
poArticol.id_valuta_d = NVL(id_valuta, 0)
poArticol.pretd = pretd
DO EmiteLog WITH ' driverGestArticol: id_gestiune=' + TRANSFORM(poArticol.id_gestiune) + ;
' pret_achizitie=' + TRANSFORM(poArticol.pret_achizitie) + ' cantitate=' + TRANSFORM(poArticol.cantitate)
loForm.do_termin()
glDlgTratatGest = .T.
goUltimulFormGest = loForm
CATCH TO loExcDrv
DO EmiteLog WITH 'driverGestArticol: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
glDlgTratatGest = .T.
goUltimulFormGest = loForm
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,49 @@
* find_defect5_doc.prg
* Cautare read-only: document real cu incasat<>0, tip 1-4, ne-proforma, in luna curenta,
* care trece garzile din do_editare_unificata (nesters, fara referinte/urmasi/eFactura).
* Nu scrie nimic. Scris pentru dovada defectului 5 (docs\raport_s8_defect5_incasat.md).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\find_defect5_doc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcSelect, lnSucces
lcSelect = [select id_vanzare, tip, eproforma, sters, incasat, data_act, nr_incasare, id_fact from fact_vfacturi ] + ;
[where incasat <> 0 and tip between 1 and 4 and eproforma = 0 and sters = 0 ] + ;
[and extract(year from data_act) = ] + TRANSFORM(gnAn) + [ and extract(month from data_act) = ] + TRANSFORM(gnLuna) + [ ] + ;
[order by id_vanzare]
lnSucces = goExecutor.oExecute(lcSelect, 'crsCandidati')
STRTOFILE('oExecute: ' + TRANSFORM(lnSucces) + ' eroare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
IF lnSucces >= 0 AND USED('crsCandidati')
STRTOFILE('candidati gasiti: ' + TRANSFORM(RECCOUNT('crsCandidati')) + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsCandidati
SCAN
STRTOFILE('id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' incasat=' + TRANSFORM(incasat) + ;
' data_act=' + TRANSFORM(data_act) + ' nr_incasare=' + TRANSFORM(nr_incasare) + ' id_fact=' + TRANSFORM(NVL(id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ELSE
STRTOFILE('interogare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,61 @@
* find_tipincasare23_doc.prg
* Cautare read-only: document real cu tip_incasare in (2,3), incasat<>0, tip 1-4, ne-proforma,
* nesters, ca sa probeze maparea D4 (bon fiscal / card) alaturi de documentul 1071 (chitanta).
* Nu scrie nimic.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\find_tipincasare23_doc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcSelect, lnSucces
lcSelect = [select id_vanzare, tip, eproforma, sters, incasat, nr_incasare, tip_incasare, serie_chit, data_act, id_fact from fact_vfacturi ] + ;
[where incasat <> 0 and tip between 1 and 4 and eproforma = 0 and sters = 0 and tip_incasare in (2,3) ] + ;
[order by tip_incasare, id_vanzare]
lnSucces = goExecutor.oExecute(lcSelect, 'crsCandidati')
STRTOFILE('oExecute: ' + TRANSFORM(lnSucces) + ' eroare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
IF lnSucces >= 0 AND USED('crsCandidati')
STRTOFILE('candidati gasiti: ' + TRANSFORM(RECCOUNT('crsCandidati')) + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsCandidati
SCAN
STRTOFILE('id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' incasat=' + TRANSFORM(incasat) + ;
' nr_incasare=' + TRANSFORM(nr_incasare) + ' tip_incasare=' + TRANSFORM(tip_incasare) + ;
' serie_chit=[' + TRANSFORM(NVL(serie_chit,'')) + ']' + ;
' data_act=' + TRANSFORM(data_act) + ' id_fact=' + TRANSFORM(NVL(id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
ELSE
STRTOFILE('interogare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
*!* verifica si luna documentului 1071, util pentru decizia rutei de proba (do_editare_unificata cere luna curenta)
IF Used('crs1071')
Use In crs1071
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare, data_act, sters, eproforma, tip, id_fact from fact_vfacturi where id_vanzare = 1071], 'crs1071')
goExecutor.oReset()
IF lnSucces >= 0 AND USED('crs1071') AND RECCOUNT('crs1071') = 1
STRTOFILE('1071: data_act=' + TRANSFORM(crs1071.data_act) + ' sters=' + TRANSFORM(crs1071.sters) + ' eproforma=' + TRANSFORM(crs1071.eproforma) + ' tip=' + TRANSFORM(crs1071.tip) + ' id_fact=' + TRANSFORM(NVL(crs1071.id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,57 @@
* mock_incarca_linii_prefix.prg
* Control negativ pentru FACT-008: versiunea DINAINTE de reparatie a lui
* IncarcaLiniiFacturaEditare (fara Cont in crsarticole_editare / REPLACE si fara re-derivarea lui
* pretv_orig din RUL). Se incarca INAINTEA lui ofacturare_editare.prg in SET PROCEDURE, deci
* castiga la nume duplicat. Nu atinge niciun fisier de productie.
FUNCTION IncarcaLiniiFacturaEditare
LPARAMETERS toDate, tnIdVanzare
LOCAL llInValuta, lnCursDoc, lnMultDoc, lnIdTemp, lnGestionabil
llInValuta = (toDate.in_valuta = 1)
lnCursDoc = Nvl(toDate.Curs,1)
lnMultDoc = Nvl(toDate.multiplicator,1)
IncarcaArticoleFactura(m.tnIdVanzare, 'crsarticole_doc')
IF Used('crsarticole_editare')
Use In crsarticole_editare
ENDIF
SELECT id_vanzare_det, id_articol, explicatie, Nvl(denumire,[]) As denumire, lot, serie, codmat, id_jtva_coloana, taxcode, ;
pret_achizitie, cantitate, proc_tvav, pret_cu_tva, id_vanzare_set, id_gestiune, id_ctr, id_valuta, nume_val, in_stoc, ;
id_pol, pretd, id_valutad, ;
Nvl(curs, m.lnCursDoc) As curs, Nvl(multiplicator, m.lnMultDoc) As multiplicator, ;
Iif(m.llInValuta, Round(pret * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), pret) As pret, ;
Iif(m.llInValuta, pret, 0) As pret_val, ;
Iif(m.llInValuta, Round(discount_unitar * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), discount_unitar) As discount_unitar, ;
Iif(m.llInValuta, discount_unitar, 0) As discount_unitar_val, ;
Iif(m.llInValuta,1,0) As tip_valuta, ;
Cast(.Null. As N(10)) As id_jtva_coloana_ex, Space(50) As codmatf, Space(50) As codbare, Space(10) As um, Space(50) As numar_contract ;
FROM crsarticole_doc INTO CURSOR crsarticole_editare READWRITE
creeaza_facturacrs('crsfactura')
prelucreaza_facturacrs('crsarticole_editare','crsfactura',0,0,0)
*!* gestionabil vine din nomenclatorul curent, nu din id_gestiune; id_gestiune, Cont, id_pol/
*!* pretd/id_valuta_d si vvaldiminuatctva (total in valuta cu tva, cf. oproceduri_facturare.prg:2282)
*!* nu sunt in lista de insert a lui prelucreaza_facturacrs
SELECT crsarticole_editare
SCAN
lnIdTemp = id_vanzare_det
lnGestionabil = Iif(Nvl(in_stoc,0) <> 0, 1, 0)
SELECT crsfactura
REPLACE gestionabil WITH m.lnGestionabil, ;
id_gestiune WITH Nvl(crsarticole_editare.id_gestiune, -1000), ;
id_pol WITH crsarticole_editare.id_pol, ;
pretd WITH crsarticole_editare.pretd, ;
id_valuta_d WITH crsarticole_editare.id_valutad, ;
vvaldiminuatctva WITH vvaldiminuatftva + vvaldiminuattva ;
FOR id_temp = m.lnIdTemp
SELECT crsarticole_editare
ENDSCAN
Use In crsarticole_doc
Use In crsarticole_editare
RETURN .T.
ENDFUNC

View File

@@ -0,0 +1,147 @@
* probe_defect5.prg
* Proba unica, ne-permanenta: deschide pe traseul real (frm_facturi.do_editare_unificata) un
* document cu incasat<>0, tip 1-4, ne-proforma (id_vanzare=1071, gasit prin find_defect5_doc.prg)
* si logheaza daca apare eroare VFP sau daca formularul se deschide normal. Nu scrie in Oracle.
* Foloseste acelasi mecanism ca test_s8_pas7_cablare.prg (driverS8p7), copiat aici temporar.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_defect5_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p7', 'Timer')
_SCREEN.tmrS8p7.Interval = 150
Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p7.Enabled = .T.
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare = 1071]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
IF !Used('crsfacturi') OR Reccount('crsfacturi') <> 1
STRTOFILE('EROARE: crsfacturi nu are 1071' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('crsfacturi OK, incasat=' + Transform(crsfacturi.incasat) + ' tip=' + Transform(crsfacturi.tip) + ' eproforma=' + Transform(crsfacturi.eproforma) + CHR(13) + CHR(10), gcErrLog, 1)
Select crsfacturi
Local loFrm
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
STRTOFILE('Newobject(frm_facturi): ' + Vartype(m.loFrm) + CHR(13) + CHR(10), gcErrLog, 1)
Select crsfacturi
Locate For id_vanzare = 1071
STRTOFILE('Locate 1071: Found=' + Transform(Found()) + CHR(13) + CHR(10), gcErrLog, 1)
goDriverS8p7.Reseteaza()
STRTOFILE('inainte de do_editare_unificata' + CHR(13) + CHR(10), gcErrLog, 1)
loFrm.do_editare_unificata()
STRTOFILE('dupa do_editare_unificata, mesaj amessagebox=[' + gcMockUltimMesaj + '] driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1)
_SCREEN.tmrS8p7.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p7')
Catch
Endtry
Try
loFrm.Release()
Catch
Endtry
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, loFrm2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,233 @@
* probe_defect5_latent.prg
* I1 din mandatul defect5b: simuleaza reparatia golului de incarcare (poDate.incasat nepopulat,
* docs\raport_s8_defect5_incasat.md) FARA sa atinga codul de productie. Repeta pas-cu-pas corpul
* real al frm_facturi.do_editare_unificata (ofacturare_comun.vc2:3890-3975), cu poDate.incasat
* fortat la valoarea reala din baza dupa IncarcaAntetFacturaEditare si inainte de Createobject/Show,
* ca sa arate ce s-ar intampla daca golul de incarcare ar fi reparat. Nu scrie in Oracle (doar
* SELECT prin gencursor/goExecutor), nu modifica niciun .vc2/.vcx.
* Document: id_vanzare=1071 (tip=1, incasat=119, eproforma=0, sters=0), gasit de
* find_defect5_doc.prg. Driver de inchidere modal: acelasi driverS8p7 din test_s8_pas7_cablare.prg.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_defect5_latent_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p7', 'Timer')
_SCREEN.tmrS8p7.Interval = 150
Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p7.Enabled = .T.
*!* --- G2: instantaneu vplaje_numere INAINTE ---
LOCAL lnSuccesG2a
lnSuccesG2a = goExecutor.oExecute('select * from vplaje_numere order by 1', 'crsplaje_inainte')
STRTOFILE('vplaje_numere INAINTE: oExecute=' + Transform(lnSuccesG2a) + ' randuri=' + ;
Transform(Iif(Used('crsplaje_inainte'), Reccount('crsplaje_inainte'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
LOCAL lnIdVanzare
lnIdVanzare = 1071
*!* --- replica exacta a corpului do_editare_unificata (ofacturare_comun.vc2:3890-3975) ---
Local lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta
Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP
LOCAL lnSuccesSel
lnSuccesSel = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(lnIdVanzare), 'crsUnic')
IF lnSuccesSel < 0 OR !Used('crsUnic') OR Reccount('crsUnic') <> 1
STRTOFILE('EROARE: documentul 1071 nu a putut fi reincarcat pentru replica' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SELECT crsUnic
lnIdVanzareP = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
LOCAL lnIncasatReal
lnIncasatReal = incasat
STRTOFILE('replica: id_vanzare=' + Transform(lnIdVanzareP) + ' tip=' + Transform(lnTipDoc) + ;
' eproforma=' + Transform(llEProforma) + ' sters=' + Transform(lnSters) + ' incasat_real=' + Transform(lnIncasatReal) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnSters = 1
STRTOFILE('OPRIT: document sters' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF llEProforma
STRTOFILE('OPRIT: proforma' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF Inlist(lnTipDoc, 44, 45, 46, 51)
STRTOFILE('OPRIT: tip in afara perimetrului' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna
STRTOFILE('OPRIT: nu e in luna curenta de lucru' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF ReferinteDocumenteNota(pnAn, pnLuna, lnCod)
STRTOFILE('OPRIT: are referinte (incasari/plati)' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF EsteInEFactura(lnIdFact)
STRTOFILE('OPRIT: e in eFactura' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
IF DocumentAreUrmasi(lnIdVanzareP)
STRTOFILE('OPRIT: are urmasi' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta)
IF Vartype(poDate) <> 'O'
STRTOFILE('OPRIT: IncarcaAntetFacturaEditare a esuat' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('poDate.incasat INAINTE de fortare (asa cum e azi, defect infirmat/latent) = ' + Transform(poDate.incasat) + CHR(13) + CHR(10), gcErrLog, 1)
*!* FORTARE - simuleaza reparatia golului de incarcare, fara sa atinga IncarcaAntetFacturaEditare
poDate.incasat = lnIncasatReal
STRTOFILE('poDate.incasat DUPA fortare (simuleaza reparatia) = ' + Transform(poDate.incasat) + CHR(13) + CHR(10), gcErrLog, 1)
IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF Used('jtva_coloane')
Use In jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ELSE
Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ENDIF
STRTOFILE('inainte de Createobject(frm_facturare_articole2)' + CHR(13) + CHR(10), gcErrLog, 1)
goDriverS8p7.Reseteaza()
loForm = Createobject('frm_facturare_articole2')
STRTOFILE('Createobject terminat (Init a rulat deja aici, inclusiv blocul incasat<>0 daca poDate.incasat<>0)' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
STRTOFILE('inainte de Show()' + CHR(13) + CHR(10), gcErrLog, 1)
loForm.Show()
STRTOFILE('dupa Show(), mesaj amessagebox=[' + gcMockUltimMesaj + '] driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1)
_SCREEN.tmrS8p7.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p7')
Catch
Endtry
Try
loForm.Release()
Catch
Endtry
*!* --- G2: instantaneu vplaje_numere DUPA ---
LOCAL lnSuccesG2b
lnSuccesG2b = goExecutor.oExecute('select * from vplaje_numere order by 1', 'crsplaje_dupa')
STRTOFILE('vplaje_numere DUPA: oExecute=' + Transform(lnSuccesG2b) + ' randuri=' + ;
Transform(Iif(Used('crsplaje_dupa'), Reccount('crsplaje_dupa'), -1)) + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor.oReset()
IF Used('crsplaje_inainte') AND Used('crsplaje_dupa')
LOCAL lnDiferente, lnIdPlajaC, lnUrmvalInainte, lnUrmvalDupa
lnDiferente = 0
SELECT crsplaje_inainte
SCAN
lnIdPlajaC = id_plaja
lnUrmvalInainte = urmval
SELECT crsplaje_dupa
LOCATE FOR id_plaja = lnIdPlajaC
IF FOUND()
lnUrmvalDupa = urmval
IF lnUrmvalInainte <> lnUrmvalDupa
lnDiferente = lnDiferente + 1
STRTOFILE('DIFERENTA vplaje_numere: id_plaja=' + Transform(lnIdPlajaC) + ;
' urmval_inainte=' + Transform(lnUrmvalInainte) + ' urmval_dupa=' + Transform(lnUrmvalDupa) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ELSE
lnDiferente = lnDiferente + 1
STRTOFILE('LIPSA in dupa: id_plaja=' + Transform(lnIdPlajaC) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SELECT crsplaje_inainte
ENDSCAN
STRTOFILE('G2 vplaje_numere: total diferente urmval=' + Transform(lnDiferente) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, loFrm2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,403 @@
* probe_fact005_avize.prg
* Diagnostic pentru "Nu exista articole in lista de vanzare! (FACT-005)" pe documentul 1119
* (AVIZ-B, rularea 2 din test_s9_8_flux.prg, firma 167). Repeta EXACT scenariul rularii 2, dar cu
* goExecutor inlocuit de o subclasa care logheaza fiecare statement, masoara starea reala in
* Oracle in punctele-cheie (dupa stergere, inainte de scrie_factura_avize) si BLOCHEAZA apelul
* scrie_factura_avize - deci nu se scrie nimic si nu se consuma niciun numar.
*
* Masoara, in ordine, in ACEEASI tranzactie:
* - inainte: FACTURAT pe avizul sursa 684, randurile VANZARI_CORESP, VANZARI_CANTITATI
* - dupa StergeDocumentFacturare (detectat prin primul initializeaza_date_factura): aceleasi
* - inainte de scrie_factura_avize: count(*) pe VANZARI_DETALII_TEMP + listaid + ramas avize
* La final: ROLLBACK.
*!* tnIdFirma: firma pe care intra harness-ul. 167 = firma documentului 1119 (corect);
*!* 0 = fara firma, exact cum a rulat sweep-ul S12 din 04.09 01:23 (cade pe firma implicita 110)
*!* tnControlNegativ = 1: goleste CONT-ul in apelurile adauga_articol_factura (ca inainte de
*!* reparatia FACT-008), ca sa se vada daca reapare FACT-005
*!* tnFaraInfasurare = 1: apelul se trimite EXACT cum il trimite productia, fara EXCEPTION WHEN
*!* OTHERS - se vede codul real intors de SQLExec, deci daca eroarea e tacuta sau zgomotoasa
LPARAMETERS tnIdFirma, tnControlNegativ, tnFaraInfasurare
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, poDate, poSnapshotEditare, gnNrAdaugaArt, pcErrF005, gnControlNegativ, gnFaraInfasurare
pcErrF005 = SPACE(400)
gnControlNegativ = VAL(TRANSFORM(tnControlNegativ))
gnFaraInfasurare = VAL(TRANSFORM(tnFaraInfasurare))
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_fact005_avize_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=F005-AVIZ doc=1119 aviz=684 firma_ceruta=' + ;
TRANSFORM(VAL(TRANSFORM(tnIdFirma))) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8, VAL(TRANSFORM(tnIdFirma))
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnNrAdaugaArt = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ;
' gnIdFirma=' + TRANSFORM(gnIdFirma) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + CHR(13) + CHR(10), gcErrLog, 1)
DO Probeaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Probeaza
LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal
lnIdV = 1119
DO StareAvize WITH 'INAINTE'
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE('poDate.tip=' + TRANSFORM(poDate.tip) + ' poDate.listaid=[' + TRANSFORM(NVL(poDate.listaid,'<NULL>')) + ;
'] poDate.cListaSursaAvize=[' + TRANSFORM(NVL(poDate.cListaSursaAvize,'<NULL>')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IncarcaLiniiFacturaEditare(poDate, lnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE('crsfactura: ' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsfactura
SCAN
STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': id_temp=' + TRANSFORM(NVL(crsfactura.id_temp,-1)) + ;
' id_articol=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ;
' id_gestiune=' + TRANSFORM(NVL(crsfactura.id_gestiune,-1)) + ;
' cantitate=' + TRANSFORM(crsfactura.cantitate) + ;
' opt_facturare=' + TRANSFORM(NVL(crsfactura.opt_facturare,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
GO TOP IN crsfactura
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('SpyFrm005')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyF005')
loSpy.nHandle = gnHandle
goExecutor = loSpy
STRTOFILE('--- INCEPE do_scrie_factura ---' + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor = loReal
STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' adauga_articol_factura: ' + TRANSFORM(gnNrAdaugaArt) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO StareAvize WITH 'DUPA ROLLBACK'
ENDPROC
*==============================================================================================
* StareAvize: starea legaturii aviz->factura, citita prin conexiunea curenta (deci vede si ce e
* nescris-inca-necomis in tranzactia proprie).
*==============================================================================================
PROCEDURE StareAvize
LPARAMETERS tcEticheta
STRTOFILE(tcEticheta + ' | vanzari.1119 sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 1119])) + ;
' id_fact=' + TRANSFORM(Val1([select nvl(id_fact,-9) as v from vanzari where id_vanzare = 1119])) + ;
' | aviz 684 facturat=' + TRANSFORM(Val1([select nvl(facturat,-9) as v from vanzari where id_vanzare = 684])) + ;
' sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 684])) + ;
' | coresp(fact=1119,sters=0)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = 1119 and sters = 0])) + ;
' coresp(fact=1119,total)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = 1119])) + ;
' | cantitati vii pe det 1119=' + TRANSFORM(Val1([select count(*) as v from vanzari_cantitati where sters = 0 and id_vanzare_det in (select id_vanzare_det from vanzari_detalii where id_vanzare = 1119)])) + ;
' | ramas_avize_lista(684)=' + TRANSFORM(Val1([select pack_facturare.exista_ramas_avize_lista('684') as v from dual])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* ListeazaTemp: continutul VANZARI_DETALII_TEMP in tranzactia curenta (tabela temporara pe
* tranzactie - se vede doar din aceasta sesiune).
*==============================================================================================
PROCEDURE ListeazaTemp
LPARAMETERS tcEticheta
LOCAL lnR
IF USED('v_tmp95')
USE IN v_tmp95
ENDIF
lnR = SQLExec(gnHandle, [select id_temp, id_articol, id_gestiune, cantitate, pret, proc_tvav, in_stoc from vanzari_detalii_temp order by id_temp], 'v_tmp95')
IF lnR < 0 OR !USED('v_tmp95')
STRTOFILE(tcEticheta + ': EROARE la citirea VANZARI_DETALII_TEMP' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE(tcEticheta + ': VANZARI_DETALII_TEMP are ' + TRANSFORM(RECCOUNT('v_tmp95')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT v_tmp95
SCAN
STRTOFILE(' id_temp=' + TRANSFORM(NVL(v_tmp95.id_temp,-1)) + ;
' id_articol=' + TRANSFORM(NVL(v_tmp95.id_articol,-1)) + ;
' id_gestiune=' + TRANSFORM(NVL(v_tmp95.id_gestiune,-1)) + ;
' cantitate=' + TRANSFORM(NVL(v_tmp95.cantitate,-1)) + ;
' pret=' + TRANSFORM(NVL(v_tmp95.pret,-1)) + ;
' proc_tvav=' + TRANSFORM(NVL(v_tmp95.proc_tvav,-1)) + ;
' in_stoc=' + TRANSFORM(NVL(v_tmp95.in_stoc,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_tmp95
ENDPROC
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet, lnR
lnRet = -1
IF USED('v_val96')
USE IN v_val96
ENDIF
lnR = SQLExec(gnHandle, tcSql, 'v_val96')
IF lnR >= 0 AND USED('v_val96')
SELECT v_val96
IF RECCOUNT('v_val96') > 0
GO TOP
lnRet = NVL(v_val96.v, -1)
ENDIF
USE IN v_val96
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* SpyFrm005: subclasa a formularului real, cu o singura schimbare - do_inchide_tranzactie face
* MEREU ROLLBACK, niciodata COMMIT. Restul fluxului ruleaza neatins, deci nimic nu se scrie.
*==============================================================================================
DEFINE CLASS SpyFrm005 AS frm_facturare_articole2 OF "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx"
PROCEDURE do_inchide_tranzactie
LPARAMETERS tnTip
STRTOFILE(' [SpyFrm005] do_inchide_tranzactie(' + TRANSFORM(tnTip) + ') -> fortat ROLLBACK' + CHR(13) + CHR(10), gcErrLog, 1)
*!* documentul reemis se masoara AICI - dupa acest apel nu mai exista nimic
LOCAL lnIdVNou
lnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari])
STRTOFILE('DOCUMENT REEMIS (inainte de rollback) id_vanzare=' + TRANSFORM(lnIdVNou) + ;
' linii vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = ] + TRANSFORM(lnIdVNou) + [ and sters = 0])) + ;
' (originalul 1119 are 4)' + ;
' id_fact=' + TRANSFORM(Val1([select nvl(id_fact,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ;
' tip=' + TRANSFORM(Val1([select nvl(tip,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ;
' coresp(fact=nou,tip=1,sters=0)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = ] + TRANSFORM(lnIdVNou) + [ and tip = 1 and sters = 0])) + ;
' total_cu_tva=' + TRANSFORM(Val1([select nvl(total_cu_tva,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ;
CHR(13) + CHR(10), gcErrLog, 1)
RETURN DODEFAULT(2)
ENDPROC
ENDDEFINE
*==============================================================================================
* SpyF005: subclasa a lui oexecutor. Logheaza fiecare statement, masoara starea in punctele-cheie
* si BLOCHEAZA scrie_factura_avize (RETURN -1) - deci nu se scrie nimic.
*==============================================================================================
DEFINE CLASS SpyF005 AS oexecutor
nIdx = 0
nVazutInit = 0
nUrmaTemp = 0
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc
THIS.nIdx = THIS.nIdx + 1
lnI = THIS.nIdx
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '')
STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ;
' len=' + TRANSFORM(LEN(lcS)) + CHR(13) + CHR(10) + ;
' SQL=[' + LEFT(lcS, 1400) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
*!* apelul se ruleaza infasurat intr-un EXCEPTION WHEN OTHERS care intoarce sqlcode/sqlerrm
*!* prin bind OUT - acelasi apel, aceleasi argumente, dar cu eroarea vizibila
IF 'adauga_articol_factura' $ lcS
gnNrAdaugaArt = gnNrAdaugaArt + 1
LOCAL lcInner, lnB, lcNou
IF gnControlNegativ = 1
lcS = STRTRAN(lcS, [,'371',], [,'',])
STRTOFILE(' [control negativ] CONT golit in apel' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
lcInner = SUBSTR(lcS, 7)
lnB = RAT('end;', lcInner)
IF lnB > 1
lcInner = LEFT(lcInner, lnB - 1)
ENDIF
pcErrF005 = SPACE(400)
IF gnFaraInfasurare = 1
LOCAL ARRAY laErr[1]
lnRet = SQLExec(gnHandle, lcS)
pcErrF005 = IIF(lnRet < 0 AND AERROR(laErr) > 0, TRANSFORM(laErr[1,3]), 'OK')
STRTOFILE(' -> [neinfasurat] ret=' + TRANSFORM(lnRet) + ' err=[' + ALLTRIM(TRANSFORM(pcErrF005)) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO ListeazaTemp WITH ' dupa acest adauga_articol_factura'
RETURN lnRet
ENDIF
LOCAL lcQ
lcQ = CHR(39)
lcNou = [begin begin ] + lcInner + [ ?@pcErrF005 := ] + lcQ + [OK] + lcQ + [; exception when others then ] + ;
[?@pcErrF005 := to_char(sqlcode) || ] + lcQ + [ ] + lcQ + [ || substr(sqlerrm,1,300); end; end;]
lnRet = SQLExec(gnHandle, lcNou)
STRTOFILE(' -> [infasurat] ret=' + TRANSFORM(lnRet) + ' pcErrF005=[' + ALLTRIM(TRANSFORM(pcErrF005)) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO ListeazaTemp WITH ' dupa acest adauga_articol_factura'
RETURN IIF(lnRet < 0, -1, 1)
ENDIF
*!* primul initializeaza_date_factura vine imediat DUPA StergeDocumentFacturare
IF 'initializeaza_date_factura' $ lcS AND THIS.nVazutInit = 0
THIS.nVazutInit = 1
DO StareAvize WITH 'DUPA STERGERE (inainte de initializeaza_date_factura)'
ENDIF
IF 'scrie_factura_avize' $ lcS
STRTOFILE(' *** punct de masura: inainte de scrie_factura_avize ***' + CHR(13) + CHR(10) + ;
' vanzari_detalii_temp = ' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii_temp])) + ' randuri' + CHR(13) + CHR(10) + ;
' act_temp = ' + TRANSFORM(Val1([select count(*) as v from act_temp])) + ' randuri' + CHR(13) + CHR(10) + ;
' poDate.listaid = [' + TRANSFORM(NVL(poDate.listaid,'<NULL>')) + ']' + CHR(13) + CHR(10) + ;
' clistaid Oracle = [' + TRANSFORM(Sir1([select nvl(pack_facturare.clistaid,'<NULL>') as v from dual])) + ']' + CHR(13) + CHR(10) + ;
' ntip Oracle = ' + TRANSFORM(Val1([select nvl(pack_facturare.ntip,-9) as v from dual])) + CHR(13) + CHR(10) + ;
' nid_sucursala Oracle = ' + TRANSFORM(Val1([select nvl(pack_facturare.nid_sucursala,-9) as v from dual])) + CHR(13) + CHR(10), gcErrLog, 1)
DO ListeazaTemp WITH ' inainte de scrie_factura_avize'
DO StareAvize WITH 'INAINTE DE scrie_factura_avize'
*!* acelasi apel, dar cu REF CURSOR-ul si OUT-ul in variabile PL/SQL locale si cu
*!* EXCEPTION WHEN OTHERS care intoarce sqlcode/sqlerrm - apoi se intoarce mereu -1,
*!* deci fluxul cade pe ramura de eroare (ROLLBACK) chiar daca apelul ar fi reusit
LOCAL lcQ2, lnP1, lcArg, lcBloc
lcQ2 = CHR(39)
lnP1 = AT('(', lcS)
lcArg = SUBSTR(lcS, lnP1 + 1, RAT(')', lcS) - lnP1 - 1)
lcArg = STRTRAN(lcArg, '?@poDate.nid_vanzare', 'v')
pcErrF005 = SPACE(400)
THIS.nUrmaTemp = 2
ENDIF
lnRet = -1
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1)
IF THIS.nUrmaTemp > 0
THIS.nUrmaTemp = 0
DO ListeazaTemp WITH ' dupa acest statement'
ENDIF
CATCH TO loEx
STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ;
': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -1
THIS.cEroare = 'SpyF005: ' + TRANSFORM(loEx.Message)
ENDTRY
RETURN lnRet
ENDPROC
FUNCTION oPrelucrareEroare
RETURN 'SpyF005: ' + TRANSFORM(THIS.cEroare)
ENDFUNC
ENDDEFINE
FUNCTION Sir1
LPARAMETERS tcSql
LOCAL lcRet, lnR
lcRet = '<eroare>'
IF USED('v_sir96')
USE IN v_sir96
ENDIF
lnR = SQLExec(gnHandle, tcSql, 'v_sir96')
IF lnR >= 0 AND USED('v_sir96')
SELECT v_sir96
IF RECCOUNT('v_sir96') > 0
GO TOP
lcRet = ALLTRIM(TRANSFORM(NVL(v_sir96.v, '<NULL>')))
ENDIF
USE IN v_sir96
ENDIF
RETURN lcRet
ENDFUNC

View File

@@ -0,0 +1,39 @@
* probe_incarca_antet.prg - apeleaza direct IncarcaAntetFacturaEditare (fara do_editare_unificata,
* fara Createobject pe forma) pe cele 4 documente vechi, sa vada daca poDate se construieste OK.
* Read-only. Diagnostic pentru docs\triaj_s8_regresie_28fail.md.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_incarca_antet_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
PROCEDURE Proba
LPARAMETERS tnId
LOCAL loDate, pnA, pnB
loDate = IncarcaAntetFacturaEditare(tnId, @pnA, @pnB)
STRTOFILE(Transform(tnId) + ': Vartype=' + Vartype(loDate) + ' oExecutor.cEroare=[' + Nvl(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IF Vartype(loDate) == 'O'
STRTOFILE(Transform(tnId) + ': tip=' + Transform(loDate.tip) + ' incasat=' + Transform(loDate.incasat) + ' lEditare=' + Transform(loDate.lEditare) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
DO Proba WITH 1113
DO Proba WITH 1055
DO Proba WITH 1048
DO Proba WITH 1130
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,50 @@
* probe_s11_borderou_schema.prg - read-only: semnaturile PACK_FACT_BORDEROU + structurile
* FACT_BORDEROU / FACT_BORDEROU_DETALII / FACT_VBORDEROU_DETALII
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_borderou_schema_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Dump WITH [select line, text from user_source where name = 'PACK_FACT_BORDEROU' and type = 'PACKAGE' order by line], 'SPEC PACK_FACT_BORDEROU'
DO Dump WITH [select column_name, data_type, data_length, nullable, column_id from user_tab_columns where table_name = 'FACT_BORDEROU' order by column_id], 'COLOANE FACT_BORDEROU'
DO Dump WITH [select column_name, data_type, data_length, nullable, column_id from user_tab_columns where table_name = 'FACT_BORDEROU_DETALII' order by column_id], 'COLOANE FACT_BORDEROU_DETALII'
DO Dump WITH [select column_name, data_type, data_length, column_id from user_tab_columns where table_name = 'FACT_VBORDEROU_DETALII' order by column_id], 'COLOANE FACT_VBORDEROU_DETALII'
DO Dump WITH [select id, id_borderou, id_vanzare from ] + gcs + [.fact_borderou_detalii order by id], 'CONTINUT FACT_BORDEROU_DETALII'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Dump
LPARAMETERS tcSql, tcTitlu
LOCAL lnI, lcLinie
STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dump')
USE IN v_dump
ENDIF
IF !goExecutor.oExecuta(m.tcSql, 'v_dump')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dump
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_dump')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), '')))
ENDFOR
STRTOFILE(STRTRAN(STRTRAN(lcLinie, CHR(13), ''), CHR(10), '') + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dump
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,53 @@
* probe_s11_borderou_view.prg - read-only: coloanele de total din VANZARI + definitia
* FACT_VBORDEROU_DETALII prin dbms_metadata (CLOB, nu LONG - LONG agata ODBC-ul)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_borderou_view_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Dump WITH [select column_name, data_type from user_tab_columns where table_name = 'VANZARI' ] + ;
[and (column_name like '%TOTAL%' or column_name like '%VAL%') order by column_id], 'COLOANE TOTAL/VAL in VANZARI'
DO Dump WITH [select rn, substr(d, 1 + (rn-1)*180, 180) as bucata from ] + ;
[(select dbms_metadata.get_ddl('VIEW','FACT_VBORDEROU_DETALII') d from dual), ] + ;
[(select level rn from dual connect by level <= 60) ] + ;
[where 1 + (rn-1)*180 <= length(d) order by rn], 'DDL FACT_VBORDEROU_DETALII'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Dump
LPARAMETERS tcSql, tcTitlu
LOCAL lnI, lcLinie
STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dump')
USE IN v_dump
ENDIF
IF !goExecutor.oExecuta(m.tcSql, 'v_dump')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dump
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_dump')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), '')))
ENDFOR
STRTOFILE(STRTRAN(STRTRAN(lcLinie, CHR(13), ''), CHR(10), ' '), gcErrLog, 1)
STRTOFILE(CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dump
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,52 @@
* probe_s11_candidati.prg - read-only: candidatii eligibili pentru rularea 2, cu totalul si
* numarul de linii, ca sa se vada care sunt reziduuri degenerate (total 0).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_candidati_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcSql, lnI, lcLinie
lcSql = [select v.id_vanzare, v.cod, v.tip, v.id_fact, v.total_cu_tva, v.serie_act, v.numar_act, ] + ;
[(select count(*) from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare) as linii, ] + ;
[(select nvl(min(d.id_articol),0) from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare) as art_min ] + ;
[from vanzari v where v.sters = 0 ] + ;
[ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ;
[ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ;
[ and nvl(v.eproforma,0) = 0 ] + ;
[ and v.id_vanzare not in (1047,1048,1055,1113,1130) ] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ;
[ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare and nvl(d.cantitate,0) > 0) ] + ;
[ order by v.id_vanzare]
IF !goExecutor.oExecuta(lcSql, 'v_c')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('id_vanzare | cod | tip | id_fact | total_cu_tva | serie | numar | linii | art_min' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT v_c
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_c')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_c')), '')))
ENDFOR
STRTOFILE(lcLinie + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_c
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,52 @@
* probe_s11_stare_dupa.prg - read-only: starea lasata de rularile probei S11 (documente atinse,
* atasamente semanate, borderouri semanate), inainte de curatenie.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_stare_dupa_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Dump WITH [select id_vanzare, sters, serie_act, numar_act, total_cu_tva, id_fact from vanzari ] + ;
[where id_vanzare in (1076,1111,1127,1128,1129,1169,1170) order by id_vanzare], 'DOCUMENTE ATINSE'
DO Dump WITH [select id_vanzare, sters, count(*) as nr from ] + gcs + [.atasamente_vanzari ] + ;
[where id_vanzare in (1076,1111,1127,1128,1129,1169,1170) group by id_vanzare, sters order by 1,2], 'ATASAMENTE SEMANATE'
DO Dump WITH [select id, id_part, sters, trimis from ] + gcs + [.fact_borderou where id >= 20 order by id], 'BORDEROURI SEMANATE'
DO Dump WITH [select id, id_borderou, id_vanzare from ] + gcs + [.fact_borderou_detalii where id_borderou >= 20 order by id], 'DETALII BORDEROU SEMANATE'
DO Dump WITH [select max(numar_act) as ultim_sss from vanzari where serie_act = 'SSS'], 'ULTIMUL NUMAR SSS'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Dump
LPARAMETERS tcSql, tcTitlu
LOCAL lnI, lcLinie
STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dump')
USE IN v_dump
ENDIF
IF !goExecutor.oExecuta(m.tcSql, 'v_dump')
STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dump
SCAN
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_dump')
lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), '')))
ENDFOR
STRTOFILE(lcLinie + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dump
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,278 @@
* probe_s12_gestiune.prg
* Proba care APARA reparatia FACT-007 (docs\propunere_fact007_gestiune.md, aplicata in
* ofacturare_editare.prg): verifica ca id_gestiune ajunge de la VANZARI_DETALII pana la
* argumentul V_ID_GESTIUNE al apelului pack_facturare.adauga_articol_factura, cu NULL in sursa
* mapat la -1000. Cade daca reparatia dispare sau daca e inlocuita cu o alta valoare (ex. 0).
* NIMIC nu se scrie in Oracle: citirile sunt reale, dar do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura) - construieste harta
* id_temp -> gestiune asteptata (NULL -> -1000).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - compara linie cu linie cu harta.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 6 (V_ID_GESTIUNE) per apel, comparat
* cu harta.
* Pasul 4: rerulare pe acelasi crsfactura - verifica idempotenta rezultatului.
LPARAMETERS tnIdV
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 631
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_gestiune_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcGestiuniSql
gcGestiuniSql = ''
DO Diagnostic WITH tnIdV
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Diagnostic
LPARAMETERS tnIdV
LOCAL lnDiscRon, lnDiscVal, lnRanduri, lnCorecte, lcAsteptatGestiuni, lnGestAsteptata
*!* PASUL 1: sursa reala, inainte de orice prelucrare; construieste harta id_temp -> gestiune asteptata
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
IF USED('crs_gest_expect')
USE IN crs_gest_expect
ENDIF
CREATE CURSOR crs_gest_expect (id_temp N(10), gest_exp N(10))
INDEX ON id_temp TAG id_temp
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnIdTempSrc, lnGestExpSrc
SELECT crs_src_probe
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
lnIdTempSrc = id_vanzare_det
lnGestExpSrc = NVL(id_gestiune,-1000)
INSERT INTO crs_gest_expect (id_temp, gest_exp) VALUES (lnIdTempSrc, lnGestExpSrc)
ENDSCAN
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
*!* PASUL 2: incarcarea de editare
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1)
lnRanduri = 0
lnCorecte = 0
lcAsteptatGestiuni = ''
SELECT crsfactura
SCAN
lnRanduri = lnRanduri + 1
lnGestAsteptata = GestiuneAsteptata(id_temp)
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_articol=' + IIF(ISNULL(id_articol), 'NULL', TRANSFORM(id_articol)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + CHR(13) + CHR(10), gcErrLog, 1)
IF NVL(id_gestiune,-9999999) = lnGestAsteptata
lnCorecte = lnCorecte + 1
ENDIF
lcAsteptatGestiuni = lcAsteptatGestiuni + ALLTRIM(STR(lnGestAsteptata)) + ';'
ENDSCAN
DO asserteaza WITH 'P2 liniile din crsfactura poarta gestiunea din sursa (NULL -> -1000)', ;
lnCorecte = lnRanduri AND lnRanduri > 0, TRANSFORM(lnCorecte) + '/' + TRANSFORM(lnRanduri)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 6 sa fie extractibil
SELECT crsfactura
REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
*!* PASUL 3: ce ajunge in SQL, cu mock (nimic nu se executa in Oracle)
DO RuleazaCuMock WITH 'PAS3'
DO asserteaza WITH 'P3 argumentul 6 (V_ID_GESTIUNE) e gestiunea sursei pe fiecare apel', ;
gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni
*!* PASUL 4: idempotenta - a doua rulare pe acelasi crsfactura trebuie sa dea acelasi rezultat
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS4-idempotenta'
DO asserteaza WITH 'P4 a doua rulare da acelasi argument 6 (idempotenta)', ;
gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 6 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcGestiuniSql, separat prin ';'.
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS12Gest')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcGestiuniSql = loMock.cGestiuni
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_6=[' + gcGestiuniSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ;
TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE GestiuneAsteptata
LPARAMETERS tnIdTemp
LOCAL lnRet, lnSelPrev
lnSelPrev = SELECT()
SELECT crs_gest_expect
IF SEEK(m.tnIdTemp)
lnRet = gest_exp
ELSE
lnRet = -9999999
ENDIF
SELECT (lnSelPrev)
RETURN lnRet
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
DEFINE CLASS MockGoExecutorS12Gest AS Custom
cGestiuni = ''
cSqlUltim = ''
nApeluri = 0
nApeluriArticol = 0
cEroare = ''
FUNCTION oExecute(tcSql)
LOCAL lcSql, lnPoz, lcRest
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcSql) <> 'C'
RETURN 1
ENDIF
lcSql = m.tcSql
lnPoz = AT('adauga_articol_factura(', lcSql)
DO WHILE lnPoz > 0
THIS.nApeluriArticol = THIS.nApeluriArticol + 1
lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura('))
THIS.cGestiuni = THIS.cGestiuni + ALLTRIM(GETWORDNUM(lcRest, 6, ',')) + ';'
THIS.cSqlUltim = m.tcSql
lcSql = lcRest
lnPoz = AT('adauga_articol_factura(', lcSql)
ENDDO
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS12Gest: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,297 @@
* probe_s12_stoc.prg
* Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig
* (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere.
* pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar
* V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului
* pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig.
* Asertiunile sunt scrise in sensul CORECT: pretv_orig = STOC.PRETV al lotului, adica nenul
* doar pe gestiunile la pret de vanzare (NOM_GESTIUNI.NR_PAG in 6/7) si 0 in rest.
* NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel.
LPARAMETERS tnIdV
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 1188
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcPretvSql, gcContSql
gcPretvSql = ''
gcContSql = ''
DO Diagnostic WITH tnIdV
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Diagnostic
LPARAMETERS tnIdV
LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal
LOCAL lnAsteptatNenule, lcGestPV
LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crs_src_probe
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ;
' cont=[' + NVL(cont,'') + ']' + ;
' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont
lnSrcCuCont = crs_cnt_cont.n
USE IN crs_cnt_cont
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1)
*!* pe gestiunile la pret de achizitie STOC.PRETV e 0, deci si pretv_orig trebuie sa fie 0
lcGestPV = ','
IF goExecutor.oExecuta('select id_gestiune from nom_gestiuni where nr_pag in (6,7)', 'crs_gest_pv')
SELECT crs_gest_pv
SCAN
lcGestPV = lcGestPV + ALLTRIM(STR(crs_gest_pv.id_gestiune)) + ','
ENDSCAN
USE IN crs_gest_pv
ENDIF
DO asserteaza WITH 'P2 lista gestiunilor la pret de vanzare s-a incarcat', LEN(lcGestPV) > 1, lcGestPV
lnGestionabile = 0
lnCuPretv = 0
lnAsteptatNenule = 0
lnCuCont = 0
SELECT crsfactura
SCAN
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + ;
' pret_achizitie=' + TRANSFORM(pret_achizitie) + ;
' cont=[' + Cont + ']' + ;
' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1)
IF !EMPTY(Cont)
lnCuCont = lnCuCont + 1
ENDIF
IF gestionabil = 1
lnGestionabile = lnGestionabile + 1
IF ',' + ALLTRIM(STR(NVL(id_gestiune, -1))) + ',' $ lcGestPV
lnAsteptatNenule = lnAsteptatNenule + 1
ENDIF
IF pretv_orig <> 0
lnCuPretv = lnCuPretv + 1
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile)
DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul exact pe liniile de pe gestiuni la pret de vanzare', ;
lnCuPretv = lnAsteptatNenule AND lnGestionabile > 0, ;
TRANSFORM(lnCuPretv) + ' nenule fata de ' + TRANSFORM(lnAsteptatNenule) + ' asteptate din ' + TRANSFORM(lnGestionabile) + ' gestionabile'
DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ;
lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil
SELECT crsfactura
REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS3'
lnArgTotal = 0
lnArgNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';')
lnArgTotal = lnArgTotal + 1
IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0
lnArgNenule = lnArgNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) reia pretv_orig din crsfactura', ;
lnArgTotal > 0 AND lnArgNenule = lnCuPretv, gcPretvSql
lnCtTotal = 0
lnCtNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';')
lnCtTotal = lnCtTotal + 1
IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), ''))
lnCtNenule = lnCtNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ;
lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'.
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS12Stoc')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcPretvSql = loMock.cPretv
gcContSql = loMock.cCont
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_22=[' + gcPretvSql + ']' + ;
' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ;
TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
DEFINE CLASS MockGoExecutorS12Stoc AS Custom
cPretv = ''
cCont = ''
cSqlUltim = ''
nApeluri = 0
nApeluriArticol = 0
cEroare = ''
FUNCTION oExecute(tcSql)
LOCAL lcSql, lnPoz, lcRest
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcSql) <> 'C'
RETURN 1
ENDIF
lcSql = m.tcSql
lnPoz = AT('adauga_articol_factura(', lcSql)
DO WHILE lnPoz > 0
THIS.nApeluriArticol = THIS.nApeluriArticol + 1
lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura('))
THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';'
THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';'
THIS.cSqlUltim = m.tcSql
lcSql = lcRest
lnPoz = AT('adauga_articol_factura(', lcSql)
ENDDO
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,282 @@
* probe_s12_stoc.prg
* Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig
* (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere.
* pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar
* V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului
* pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig.
* Asertiunile sunt scrise in sensul CORECT (pretv_orig <> 0 pe liniile gestionabile), deci ele
* PICA atat timp cat defectul exista si TREC dupa reparatie.
* NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor
* mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg).
*
* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura).
* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie.
* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel.
LPARAMETERS tnIdV
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 631
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_ctrlneg_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\mock_incarca_linii_prefix.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcPretvSql, gcContSql
gcPretvSql = ''
gcContSql = ''
DO Diagnostic WITH tnIdV
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Diagnostic
LPARAMETERS tnIdV
LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal
LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule
IncarcaArticoleFactura(tnIdV, 'crs_src_probe')
STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crs_src_probe
SCAN
STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ;
' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ;
' cont=[' + NVL(cont,'') + ']' + ;
' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont
lnSrcCuCont = crs_cnt_cont.n
USE IN crs_cnt_cont
DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe'))
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1)
lnGestionabile = 0
lnCuPretv = 0
lnCuCont = 0
SELECT crsfactura
SCAN
STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ;
' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ;
' gestionabil=' + TRANSFORM(gestionabil) + ;
' pret_achizitie=' + TRANSFORM(pret_achizitie) + ;
' cont=[' + Cont + ']' + ;
' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1)
IF !EMPTY(Cont)
lnCuCont = lnCuCont + 1
ENDIF
IF gestionabil = 1
lnGestionabile = lnGestionabile + 1
IF pretv_orig <> 0
lnCuPretv = lnCuPretv + 1
ENDIF
ENDIF
ENDSCAN
DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile)
DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul pe liniile gestionabile', ;
lnCuPretv = lnGestionabile AND lnGestionabile > 0, TRANSFORM(lnCuPretv) + '/' + TRANSFORM(lnGestionabile)
DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ;
lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont)
*!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil
SELECT crsfactura
REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS3'
lnArgTotal = 0
lnArgNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';')
lnArgTotal = lnArgTotal + 1
IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0
lnArgNenule = lnArgNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) e nenul pe fiecare apel de articol', ;
lnArgTotal > 0 AND lnArgNenule = lnArgTotal, gcPretvSql
lnCtTotal = 0
lnCtNenule = 0
FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';')
lnCtTotal = lnCtTotal + 1
IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), ''))
lnCtNenule = lnCtNenule + 1
ENDIF
ENDFOR
DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ;
lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql
ENDPROC
*==============================================================================================
* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel
* pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'.
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS12Stoc')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcPretvSql = loMock.cPretv
gcContSql = loMock.cCont
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ;
' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ;
' argumente_22=[' + gcPretvSql + ']' + ;
' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ;
TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
DEFINE CLASS MockGoExecutorS12Stoc AS Custom
cPretv = ''
cCont = ''
cSqlUltim = ''
nApeluri = 0
nApeluriArticol = 0
cEroare = ''
FUNCTION oExecute(tcSql)
LOCAL lcSql, lnPoz, lcRest
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcSql) <> 'C'
RETURN 1
ENDIF
lcSql = m.tcSql
lnPoz = AT('adauga_articol_factura(', lcSql)
DO WHILE lnPoz > 0
THIS.nApeluriArticol = THIS.nApeluriArticol + 1
lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura('))
THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';'
THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';'
THIS.cSqlUltim = m.tcSql
lcSql = lcRest
lnPoz = AT('adauga_articol_factura(', lcSql)
ENDDO
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,316 @@
* probe_s12_sucursala.prg
* Masoara starea de sesiune Oracle care intra in predicatul de stoc al lui
* pack_facturare.descarca_gestiune (PACK_FACTURARE BODY:7329-7341): nid_sucursala, nan, nluna.
* O variabila de pachet PL/SQL traieste per sesiune, deci se citeste pe ACELASI gnHandle pe care
* ruleaza fluxul, printr-un bloc anonim care intoarce valorile in textul unui
* raise_application_error (fara DML, fara DDL).
*
* tnIdV - documentul reemis (631 sau 580)
* tnForceAn - perioada activa fortata (ca in test_s9_8_flux: 2014 1)
* tnForceLuna
* tnSuc - daca <> 0, forteaza gnIdSucursala inainte de do_scrie_factura (experimentul
* decisiv: daca FACT-008 dispare, esecul era artefact de harness). ATENTIE: pe
* valoarea corecta fluxul SCRIE in Oracle.
LPARAMETERS tnIdV, tnForceAn, tnForceLuna, tnSuc
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate, poSnapshotEditare
IF VARTYPE(tnIdV) = 'C'
tnIdV = VAL(tnIdV)
ENDIF
IF EMPTY(tnIdV)
tnIdV = 631
ENDIF
IF VARTYPE(tnSuc) = 'C'
tnSuc = VAL(tnSuc)
ENDIF
IF EMPTY(tnSuc)
tnSuc = 0
ENDIF
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_sucursala_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc=' + TRANSFORM(tnIdV) + ;
' suc_fortata=' + TRANSFORM(tnSuc) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', VAL(TRANSFORM(tnForceAn)), VAL(TRANSFORM(tnForceLuna))
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
DO Masoara WITH tnIdV, tnSuc
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Masoara
LPARAMETERS tnIdV, tnSuc
LOCAL loForm, lnDiscRon, lnDiscVal, lnRuta, llRez, lnIdVMaxInainte, lnNr, lnIdVNou
STRTOFILE('--- STAREA VFP DUPA INIT ---' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gnIdFirma = ' + TRANSFORM(gnIdFirma) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gnIdSucursala: tip=' + VARTYPE(gnIdSucursala) + ' isnull=' + TRANSFORM(ISNULL(gnIdSucursala)) + ;
' valoare=' + TRANSFORM(NVL(gnIdSucursala, -777)) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' gcCondSucursala = <' + TRANSFORM(gcCondSucursala) + '>' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' goFirma.id_firma = ' + TRANSFORM(NVL(goFirma.Id_Firma, -777)) + ;
' goFirma.id_mama = ' + TRANSFORM(NVL(goFirma.id_mama, -777)) + ;
' goFirma.firma = ' + TRANSFORM(NVL(goFirma.firma, '')) + CHR(13) + CHR(10), gcErrLog, 1)
*!* ce intoarce interogarea de firma din harness, in ordinea reala a randurilor
IF USED('c_fsuc')
USE IN c_fsuc
ENDIF
IF goExecutor.oExecuta("select id_firma, firma, id_mama from syn_v_nom_firme where schema = ?gcS", 'c_fsuc')
STRTOFILE('--- syn_v_nom_firme pentru schema (ordinea reala) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT c_fsuc
SCAN
STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': id_firma=' + TRANSFORM(id_firma) + ;
' id_mama=' + TRANSFORM(NVL(id_mama, -777)) + ' firma=' + ALLTRIM(NVL(firma, '')) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN c_fsuc
ENDIF
*!* id_sucursala al documentului tintit
STRTOFILE(' VANZARI.id_sucursala doc ' + TRANSFORM(tnIdV) + ' = ' + ;
TRANSFORM(Val1("select nvl(id_sucursala,-777) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV))) + ;
CHR(13) + CHR(10), gcErrLog, 1)
DO CitestePachet WITH 'INAINTE de flux'
IF tnSuc <> 0
gnIdSucursala = tnSuc
STRTOFILE('*** gnIdSucursala FORTAT la ' + TRANSFORM(gnIdSucursala) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
lnIdVMaxInainte = Val1("select nvl(max(id_vanzare),0) as v from vanzari")
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
STRTOFILE(' poDate.dataireg = ' + TRANSFORM(poDate.dataireg) + ;
' poDate.dataact = ' + TRANSFORM(poDate.dataact) + ;
' poDate.tip = ' + TRANSFORM(poDate.Tip) + CHR(13) + CHR(10), gcErrLog, 1)
IncarcaLiniiFacturaEditare(poDate, tnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
update_jtva_coloane("JV", "jtva_coloane_temp")
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
tnIdV, Val1("select nvl(id_fact,0) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV)), ;
Val1("select nvl(cod,0) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE(' ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE(' do_scrie_factura() = ' + TRANSFORM(llRez) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' ultimul mesaj prin mock: <' + gcMockUltimMesaj + '>' + CHR(13) + CHR(10), gcErrLog, 1)
DO CitestePachet WITH 'DUPA do_scrie_factura'
lnNr = Val1("select count(*) as v from vanzari where sters = 0 and id_vanzare > " + TRANSFORM(lnIdVMaxInainte))
lnIdVNou = Val1("select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > " + TRANSFORM(lnIdVMaxInainte))
STRTOFILE(' documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou = ' + TRANSFORM(lnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1)
DO ReplayPredicat WITH tnIdV
RELEASE loForm
ENDPROC
*==============================================================================================
* ReplayPredicat: rejoaca ramura ELSE "din STOC" a lui descarca_gestiune (BODY:7328-7345) in
* ACEEASI sesiune, cu valorile reale trimise pentru prima linie a documentului, de doua ori:
* (a) cu pack_facturare.nid_sucursala asa cum e in sesiune, (b) cu 167 pus literal in locul ei.
* Singura diferenta intre cele doua rulari e sucursala. Doar SELECT, in bloc PL/SQL (variabilele
* de pachet nu se pot referi din SQL pur); rezultatul vine in textul unei erori.
*==============================================================================================
PROCEDURE ReplayPredicat
LPARAMETERS tnIdV
LOCAL lcArt, lcGest, lcPret, lcPretd, lcValutad, lcPretv, lcCante, lcUnde
DO CASE
CASE tnIdV = 631
lcArt = '315554536'
lcGest = '19'
lcPret = '100'
lcPretd = '0'
lcValutad = '0'
lcPretv = '200'
lcCante = '4'
CASE tnIdV = 580
lcArt = '315554536'
lcGest = '4'
lcPret = '100'
lcPretd = '0'
lcValutad = '3'
lcPretv = '120.97'
lcCante = '2'
OTHERWISE
STRTOFILE(' ReplayPredicat: document necunoscut, sarit' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDCASE
lcUnde = " from stoc a where " + lcCante + " <> 0 and nvl(a.id_sucursala,-99) = @SUC@" + ;
" and a.id_articol = " + lcArt + ;
" and a.id_gestiune = " + lcGest + ;
" and nvl(a.cont,'XXXX') = '371'" + ;
" and a.pret = " + lcPret + ;
" and a.pretd = " + lcPretd + ;
" and nvl(a.id_valuta,0) = decode(" + lcValutad + ", -99, 0, nvl(" + lcValutad + ",0))" + ;
" and a.pretv = " + lcPretv + ;
" and nvl(a.serie,'+_') = nvl(null,'+_')" + ;
" and a.luna = pack_facturare.nluna and a.an = pack_facturare.nan" + ;
" and a.cants + a.cant > a.cante" + ;
" and nvl(a.id_part_rez,0) = 0 and nvl(a.id_lucrare_rez,0) = 0"
DO NumaraLoturi WITH 'REPLAY sucursala = cea din sesiune', ;
STRTRAN(lcUnde, '@SUC@', 'nvl(pack_facturare.nid_sucursala,-99)')
DO NumaraLoturi WITH 'REPLAY sucursala = 167 (literal)', ;
STRTRAN(lcUnde, '@SUC@', 'nvl(167,-99)')
ENDPROC
PROCEDURE NumaraLoturi
LPARAMETERS tcEticheta, tcUnde
LOCAL lcSql, lnR, laErr, lcVechi
lcVechi = SQLGETPROP(gnHandle, 'DispWarnings')
SQLSETPROP(gnHandle, 'DispWarnings', .F.)
lcSql = "declare n number; begin select count(*) into n" + tcUnde + ;
"; raise_application_error(-20998, 'REPLAY n=<'||n||'>'); end;"
DIMENSION laErr[1]
lnR = SQLEXEC(gnHandle, lcSql)
IF lnR < 0
AERROR(laErr)
STRTOFILE(' [' + tcEticheta + '] ' + STRTRAN(STRTRAN(TRANSFORM(laErr[1,3]), CHR(13), ' '), CHR(10), ' ') + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' [' + tcEticheta + '] NEASTEPTAT: fara eroare (r=' + TRANSFORM(lnR) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SQLSETPROP(gnHandle, 'DispWarnings', lcVechi)
ENDPROC
*==============================================================================================
* CitestePachet: citeste variabilele publice de pachet pe ACELASI handle, printr-un bloc anonim
* care le intoarce in textul erorii (nu scrie nimic). SQLEXEC nu declanseaza ON ERROR.
*==============================================================================================
PROCEDURE CitestePachet
LPARAMETERS tcMoment
LOCAL lcSql, lnR, laErr, lcVechi
lcVechi = SQLGETPROP(gnHandle, 'DispWarnings')
SQLSETPROP(gnHandle, 'DispWarnings', .F.)
lcSql = "begin raise_application_error(-20999, 'PKVAR nid_sucursala=<'" + ;
"||nvl(to_char(pack_facturare.nid_sucursala),'NULL')||'> nan=<'" + ;
"||nvl(to_char(pack_facturare.nan),'NULL')||'> nluna=<'" + ;
"||nvl(to_char(pack_facturare.nluna),'NULL')||'>'); end;"
DIMENSION laErr[1]
lnR = SQLEXEC(gnHandle, lcSql)
IF lnR < 0
AERROR(laErr)
STRTOFILE(' [' + tcMoment + '] ' + STRTRAN(STRTRAN(TRANSFORM(laErr[1,3]), CHR(13), ' '), CHR(10), ' ') + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' [' + tcMoment + '] NEASTEPTAT: blocul nu a intors eroare (r=' + TRANSFORM(lnR) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SQLSETPROP(gnHandle, 'DispWarnings', lcVechi)
ENDPROC
*==============================================================================================
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnV
lnV = -1
IF USED('c_val1')
USE IN c_val1
ENDIF
IF goExecutor.oExecuta(tcSql, 'c_val1')
SELECT c_val1
IF RECCOUNT('c_val1') >= 1
GO TOP
lnV = NVL(v, -1)
ENDIF
USE IN c_val1
ENDIF
RETURN lnV
ENDFUNC
*==============================================================================================
PROCEDURE probe_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,99 @@
* probe_s13_callshape.prg
* Forma apelului care cade: {call proc(...argumente..., ?@obiect.proprietate)} unde procedura are
* si un ultim parametru OUT REF CURSOR nedat in apel (legat automat de driver ca result set).
* Reproducem forma pe pack_facturare.cursor_avize (V_LISTAID IN, V_ID_UTIL IN, V_DISCOUNT OUT
* NUMBER, V_CURSOR OUT REF CURSOR) - aceeasi forma ca scrie_factura2, dar procedura NU scrie nimic
* (initializeaza_facturare seteaza doar variabile de pachet; cursorul se deschide pe lista goala).
*
* Trei variante, ca sa izolam ce declanseaza VFP 1872:
* 1) ?@ legat de o variabila PUBLIC simpla
* 2) ?@ legat de o proprietate de obiect (exact ca ?@poDate.nid_vanzare)
* 3) acelasi cursor, dar chemat fara {call} (control)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, pnDisc, poX
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_callshape_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-CALLSHAPE' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
pnDisc = 0
poX = CREATEOBJECT('Empty')
ADDPROPERTY(poX, 'nid_vanzare', 0)
DO Incearca WITH '1. {call cursor_avize(...,?@pnDisc)} - variabila PUBLIC', [{call pack_facturare.cursor_avize('',8,?@pnDisc)}], 'c_1'
DO Incearca WITH '2. {call cursor_avize(...,?@poX.nid_vanzare)} - proprietate de obiect', [{call pack_facturare.cursor_avize('',8,?@poX.nid_vanzare)}], 'c_2'
DO Incearca WITH '3. {call cursor_verificare} - fara parametru OUT scalar (control)', [{call pack_facturare.cursor_verificare}], 'c_3'
*!* CONTROLUL care conteaza: aceeasi procedura (are OUT REF CURSOR), dar cu un argument care
*!* face Oracle sa arunce INAINTE de OPEN-ul cursorului. Daca VFP raporteaza 1872 in loc de
*!* eroarea Oracle, atunci "Too many columns." e MASCA unei erori Oracle, nu un defect de coloane.
DO Incearca WITH '4. {call cursor_avize} cu lista invalida - Oracle arunca inainte de OPEN', [{call pack_facturare.cursor_avize('abc',8,?@pnDisc)}], 'c_4'
DO Incearca WITH '5. {call cursor_avize} cu id_util inexistent', [{call pack_facturare.cursor_avize('',-987654,?@pnDisc)}], 'c_5'
DO Incearca WITH '6. begin ... end; care arunca (fara REF CURSOR) - control', [begin raise_application_error(-20000,'proba s13'); end;], 'c_6'
DO Incearca WITH '7. {call} pe procedura inexistenta', [{call pack_facturare.procedura_inexistenta_s13(1)}], 'c_7'
*!* Argumentul 11 al lui scrie_factura2 e o EXPRESIE cu virgula in ea:
*!* to_date('20090518121908','YYYYMMDDHH24MISS'). Driverul ODBC construieste blocul anonim din
*!* lista de argumente (vezi testul 7: foloseste DBMS_DESCRIBE), deci virgula dinauntru poate fi
*!* citita ca separator si numarul de argumente iese gresit.
DO Incearca WITH '8. {call cursor_avize} cu expresie ce contine virgula ca argument', [{call pack_facturare.cursor_avize(to_char(sysdate,'YYYYMMDD'),8,?@pnDisc)}], 'c_8'
DO Incearca WITH '9. {call cursor_avize} cu NULL ca argument text', [{call pack_facturare.cursor_avize(NULL,8,?@pnDisc)}], 'c_9'
DO Incearca WITH '10. {call cursor_avize} cu to_date(...) ca argument', [{call pack_facturare.cursor_avize(to_char(to_date('20090518','YYYYMMDD'),'DD'),8,?@pnDisc)}], 'c_10'
*!* Statement-ul EXACT care cade in flux, dar intr-o sesiune curata: VANZARI_DETALII_TEMP (tabela
*!* temporara de sesiune) e goala, deci procedura arunca FACT-004 la linia 4974 INAINTE sa deschida
*!* REF CURSOR-ul si inainte de orice scriere reala. Daca VFP raporteaza eroarea Oracle -> 1872
*!* apare doar pe drumul de succes. Daca raporteaza tot 1872 -> e defect de descriere, nu de date.
DO Incearca WITH '11. statement-ul REAL al doc 360, sesiune curata (temp goale)', ;
[{call pack_facturare.scrie_factura2(300.00,57.00,0.00,'',0,NULL,NULL,NULL,NULL,0,to_date('20090518121908','YYYYMMDDHH24MISS'),NULL,'',1,0,?@poX.nid_vanzare)}], 'c_11'
STRTOFILE('pnDisc dupa apel = ' + TRANSFORM(pnDisc) + ' poX.nid_vanzare = ' + TRANSFORM(poX.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF, lcAlte, lnJ
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ' SQL=[' + tcSql + ']' + CHR(13) + CHR(10), gcErrLog, 1)
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet >= 0
FOR lnJ = 0 TO 3
lcAlte = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
IF USED(lcAlte)
lnF = AFIELDS(laF, lcAlte)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(' cursor [' + lcAlte + ']: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + ;
TRANSFORM(lnLatime) + ' octeti, ' + TRANSFORM(RECCOUNT(lcAlte)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (lcAlte)
ENDIF
ENDFOR
ELSE
IF AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
CATCH TO loEx
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,27 @@
* probe_s13_errtext.prg
* Ce numar de eroare VFP are textul "Too many columns." - masurat, nu ghicit.
* Comanda ERROR n genereaza eroarea VFP cu numarul n; TRY/CATCH ii citeste textul.
* Nu atinge Oracle, nu atinge nimic pe disc in afara propriului log.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog, lnI, loEx, lcMsg
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-ERRTEXT' + CHR(13) + CHR(10), lcLog)
FOR lnI = 1 TO 2500
lcMsg = ''
TRY
ERROR lnI
CATCH TO loEx
lcMsg = loEx.Message
ENDTRY
IF 'COLUMN' $ UPPER(lcMsg) OR 'TOO MANY' $ UPPER(lcMsg)
STRTOFILE(TRANSFORM(lnI) + ' -> [' + lcMsg + ']' + CHR(13) + CHR(10), lcLog, 1)
ENDIF
ENDFOR
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1,33 @@
* probe_s13_errtext2.prg
* Continuarea sweep-ului de numere de eroare VFP (prima rulare s-a oprit in jurul lui 224).
* Scrie un heartbeat cu numarul curent, ca sa se vada exact unde moare.
SET SAFETY OFF
SET TALK OFF
LOCAL lcLog, lcBeat, lnI, loEx, lcMsg, lcBuf
lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext2_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
lcBeat = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext2_beat.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-ERRTEXT2' + CHR(13) + CHR(10), lcLog)
lcBuf = ''
FOR lnI = 224 TO 2500
STRTOFILE(TRANSFORM(lnI), lcBeat)
lcMsg = ''
TRY
ERROR lnI
CATCH TO loEx
lcMsg = loEx.Message
ENDTRY
IF 'COLUMN' $ UPPER(lcMsg) OR 'TOO MANY' $ UPPER(lcMsg)
lcBuf = lcBuf + TRANSFORM(lnI) + ' -> [' + lcMsg + ']' + CHR(13) + CHR(10)
ENDIF
IF MOD(lnI, 100) = 0
STRTOFILE('... ajuns la ' + TRANSFORM(lnI) + CHR(13) + CHR(10) + lcBuf, lcLog, 1)
lcBuf = ''
ENDIF
ENDFOR
STRTOFILE(lcBuf + 'end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1 @@
1116

View File

@@ -0,0 +1,91 @@
* probe_s13_poison.prg
* In flux, statement-ul care cade ({call scrie_factura2 ... REF CURSOR OUT}) vine imediat dupa doua
* statemente cu 52 de parametri legati fiecare (INSERT INTO ACT_TEMP ... 52 x "?"), din mecanismul
* de stergere/regenerare S9. Aceeasi procedura, chemata din bloc anonim cu REF CURSOR-ul intr-o
* variabila locala PL/SQL, se executa fara probleme - deci esecul e strict la materializarea
* result set-ului in VFP.
*
* Ipoteza probata aici: un statement cu multi parametri legati executat inainte strica descrierea
* result set-ului pentru urmatorul apel cu REF CURSOR OUT. Totul read-only (select din dual +
* proceduri care doar deschid cursoare).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, p1
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_poison_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-POISON' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
p1 = 1
DO Incearca WITH 'T1 baseline: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t1'
DO Incearca WITH 'T2 statement cu 52 parametri legati', CuParametri(52), 'c_t2'
DO Incearca WITH 'T3 dupa 52 parametri: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t3'
DO Incearca WITH 'T4 dupa 52 parametri: select normal', [select * from vact where 1 = 2], 'c_t4'
DO Incearca WITH 'T5 din nou: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t5'
DO Incearca WITH 'T6 statement cu 5 parametri legati', CuParametri(5), 'c_t6'
DO Incearca WITH 'T7 dupa 5 parametri: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t7'
*!* in flux, conexiunea e in tranzactie MANUALA (Transactions = 2) si a facut deja DML
STRTOFILE('--- trec pe tranzactie manuala (Transactions = 2) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SQLSetProp(gnHandle, 'Transactions', 2)
DO Incearca WITH 'T8 in tranzactie manuala: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t8'
DO Incearca WITH 'T9 DML pe tabela temporara de sesiune', [insert into act_temp (id_act, luna, an, sters) values (?p1, 4, 2009, 0)], 'c_t9'
DO Incearca WITH 'T10 dupa DML, in tranzactie: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t10'
DO Incearca WITH 'T11 dupa DML, in tranzactie: select normal', [select * from vact where 1 = 2], 'c_t11'
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
STRTOFILE('--- rollback facut, inapoi pe Transactions = 1 ---' + CHR(13) + CHR(10), gcErrLog, 1)
DO Incearca WITH 'T12 dupa rollback: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t12'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
FUNCTION CuParametri
LPARAMETERS tnN
LOCAL lcS, lnI
lcS = 'select 1 as v from dual where '
FOR lnI = 1 TO tnN
lcS = lcS + '?p1 is not null and '
ENDFOR
RETURN lcS + '1 = 1'
ENDFUNC
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
IF lnRet >= 0 AND USED(tcCursor)
lnF = AFIELDS(laF, tcCursor)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(tcEticheta + ' -> ret=' + TRANSFORM(lnRet) + ' ' + TRANSFORM(lnF) + ' coloane, latime ' + ;
TRANSFORM(lnLatime) + ', ' + TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (tcCursor)
ELSE
STRTOFILE(tcEticheta + ' -> ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet < 0 AND AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
CATCH TO loEx
STRTOFILE(tcEticheta + ' -> EXCEPTIE ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' [' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,86 @@
* probe_s13_refcursor.prg
* Ce anume nu poate materializa VFP la statement-ul {call pack_facturare.scrie_factura2(...)}:
* rezultatul lui este REF CURSOR-ul OUT V_CURSOR_VERIFICARE (parametrul 17, nedat in apel, legat
* automat de driverul ODBC ca result set). Doua ramuri posibile in pachet (liniile 4877/4881,
* 5113/5126 din PACKAGE BODY):
* a) pack_facturare.cursor_verificare(...) - SELECT cu ~75 coloane si 17 JOIN-uri pe ACT_TEMP
* b) SELECT * FROM ACT_TEMP WHERE 1 = 2 - doar coloanele lui ACT_TEMP
* Probam ambele forme direct prin SQLExec, in aceeasi sesiune, FARA nicio scriere:
* cursor_verificare are un singur parametru, OUT REF CURSOR, deci nu modifica nimic.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_refcursor_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-REFCURSOR' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Incearca WITH 'A. select direct din ACT_TEMP', [select * from act_temp where 1 = 2], 'c_a'
DO Incearca WITH 'B. {call} cu REF CURSOR OUT (cursor_verificare)', [{call pack_facturare.cursor_verificare}], 'c_b'
DO Incearca WITH 'C. select cu 300 de coloane din dual', ConstruiesteSelectLarg(300), 'c_c'
DO Incearca WITH 'D. select cu 254 de coloane din dual', ConstruiesteSelectLarg(254), 'c_d'
DO Incearca WITH 'E. select cu 255 de coloane din dual', ConstruiesteSelectLarg(255), 'c_e'
DO Incearca WITH 'F. select cu 256 de coloane din dual', ConstruiesteSelectLarg(256), 'c_f'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
FUNCTION ConstruiesteSelectLarg
LPARAMETERS tnN
LOCAL lcS, lnI
lcS = 'select '
FOR lnI = 1 TO tnN
lcS = lcS + IIF(lnI > 1, ',', '') + '1 as c' + TRANSFORM(lnI)
ENDFOR
RETURN lcS + ' from dual'
ENDFUNC
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ;
' SQL(len=' + TRANSFORM(LEN(tcSql)) + ')=[' + LEFT(tcSql, 400) + IIF(LEN(tcSql) > 400, '...', '') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -999
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet < 0
IF AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ELSE
IF USED(tcCursor)
lnF = AFIELDS(laF, tcCursor)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti, ' + ;
TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (tcCursor)
ELSE
STRTOFILE(' (niciun cursor creat)' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDIF
CATCH TO loEx
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,407 @@
* probe_s13_toomanycolumns.prg
* Diagnostic pentru "Too many columns." pe documentul 360 (CONTRACT-B, rularea 6 din
* test_s9_8_flux.prg, perioada fortata 2009/4). Repeta EXACT scenariul rularii 6, dar cu
* goExecutor inlocuit de o SUBCLASA a lui oexecutor care logheaza fiecare statement inainte de
* executie si prinde exceptia exact la statement-ul care cade (numar de eroare + mesaj + procedura
* + linie), apoi intoarce -1 in loc sa o propage - ca fluxul sa cada pe ramura normala de eroare
* (do_inchide_tranzactie(2) = ROLLBACK), nu pe CATCH-ul din do_scrie_factura.
*
* Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada de 6 randuri
* a documentului 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate, poSnapshotEditare, goFormReemitere
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_toomanycolumns_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-TMC doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
DO Probeaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Probeaza
LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal
lnIdV = 360
DO bat WITH 'intrat in Probeaza'
DO StareCascada WITH 'INAINTE'
DO bat WITH 'dupa StareCascada INAINTE'
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
DO DescrieCursorFactura
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyS13')
loSpy.nHandle = gnHandle
goExecutor = loSpy
STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor = loReal
STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' esecuri: ' + TRANSFORM(loSpy.nEsecuri) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO StareCascada WITH 'DUPA'
ENDPROC
*==============================================================================================
* DescrieCursorFactura: structura si continutul crsfactura (campurile NULL + opt_facturare, care
* decide branch-ul adauga_rata_factura vs adauga_articol_factura).
*==============================================================================================
PROCEDURE DescrieCursorFactura
LOCAL laF[1], lnF, lnI, lcNule
lnF = AFIELDS(laF, 'crsfactura')
STRTOFILE('--- crsfactura: ' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri, ' + TRANSFORM(lnF) + ' campuri ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsfactura
SCAN
lcNule = ''
FOR lnI = 1 TO lnF
IF ISNULL(EVALUATE('crsfactura.' + laF[lnI,1]))
lcNule = lcNule + laF[lnI,1] + ' '
ENDIF
ENDFOR
STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': opt_facturare=' + TRANSFORM(crsfactura.opt_facturare) + ;
' id_rata=' + TRANSFORM(NVL(crsfactura.id_rata,-1)) + ' denumire=[' + TRANSFORM(NVL(crsfactura.denumire,'<NULL>')) + ']' + ;
' NULL pe -> ' + IIF(EMPTY(lcNule), '(niciun camp)', lcNule) + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
GO TOP IN crsfactura
ENDPROC
*==============================================================================================
PROCEDURE StareCascada
LPARAMETERS tcEticheta
LOCAL lnIdFact
lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360])
STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ;
' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ;
' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ;
' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ;
' id_fact=' + TRANSFORM(lnIdFact) + ;
' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ;
' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ;
' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
*==============================================================================================
* MasoaraResultSets: ruleaza statement-ul care cade cu BatchMode = .F., ca sa vada result set-urile
* unul cate unul (cate coloane are fiecare), si logheaza integral AERROR() daca tot cade.
*==============================================================================================
PROCEDURE MasoaraResultSets
LPARAMETERS tcSql, tcCursor
LOCAL lnR, lnM, lnPas, loEx, laE[1], lnI, lnJ, lcN, laF[1], lnF, lnLat
STRTOFILE(' *** masurare separata, BatchMode=.F. ***' + CHR(13) + CHR(10) + ;
' BatchMode initial = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1)
*!* diagnostice in ACEEASI stare de sesiune, inainte de statement-ul care cade
PUBLIC pnDummyS13
pnDummyS13 = 0
LOCAL laM[1], lnM2
lnM2 = AMEMBERS(laM, poDate, 0)
STRTOFILE(' poDate: ' + TRANSFORM(lnM2) + ' membri, TYPE(poDate.nid_vanzare)=' + TYPE('poDate.nid_vanzare') + ;
' valoare=' + TRANSFORM(poDate.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1)
DO Diag WITH 'D1 {call cursor_avize} cu ?@poDate.nid_vanzare', [{call pack_facturare.cursor_avize('',8,?@poDate.nid_vanzare)}], 'c_dg1'
DO Diag WITH 'D2 {call cursor_avize} cu ?@pnDummyS13 (PUBLIC)', [{call pack_facturare.cursor_avize('',8,?@pnDummyS13)}], 'c_dg2'
DO Diag WITH 'D3 select * from vact where 1 = 2', [select * from vact where 1 = 2], 'c_dg3'
DO Diag WITH 'D4 {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_dg4'
STRTOFILE(' USED(crsact) inainte de apel = ' + TRANSFORM(USED('crsact')) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH 'crsact', 'inainte de apel'
*!* Acelasi apel, aceeasi stare de sesiune, dar prin bloc anonim cu REF CURSOR-ul intr-o
*!* variabila LOCALA PL/SQL - deci nu se mai intoarce niciun result set catre VFP. Daca asa
*!* trece, atunci esecul e strict la materializarea REF CURSOR-ului, nu la executia procedurii.
LOCAL lcArg, lnP1, lcBloc
lnP1 = AT('(', tcSql)
lcArg = SUBSTR(tcSql, lnP1 + 1, RAT(')', tcSql) - lnP1 - 1)
lcArg = STRTRAN(lcArg, '?@poDate.nid_vanzare', '?@pnDummyS13')
lcBloc = 'begin declare c pack_facturare.cursor_facturare; begin pack_facturare.scrie_factura2(' + ;
lcArg + ',c); end; end;'
DO Diag WITH 'D5 acelasi apel, REF CURSOR in variabila locala PL/SQL', lcBloc, 'c_real'
STRTOFILE(' pnDummyS13 dupa D5 = ' + TRANSFORM(pnDummyS13) + ' ISNULL=' + TRANSFORM(ISNULL(pnDummyS13)) + CHR(13) + CHR(10), gcErrLog, 1)
*!* ce ramura a luat scrie_factura2 la linia 5112: verifica_note_contabile(1) > 0 -> cursor_verificare
DO Diag WITH 'D6 verifica_note_contabile(1) dupa D5', [select pack_contafin.verifica_note_contabile(1) as v from dual], 'c_ver'
IF USED('c_ver')
USE IN c_ver
ENDIF
IF SQLExec(gnHandle, [select pack_contafin.verifica_note_contabile(1) as v from dual], 'c_ver') >= 0 AND USED('c_ver')
SELECT c_ver
GO TOP
STRTOFILE(' verifica_note_contabile(1) = ' + TRANSFORM(NVL(c_ver.v, -1)) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN c_ver
ENDIF
DO Diag WITH 'D7 {call cursor_verificare} dupa D5', [{call pack_facturare.cursor_verificare}], 'c_dg7'
SQLSetProp(gnHandle, 'BatchMode', .F.)
lnPas = 0
TRY
lnR = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH tcCursor, 'dupa SQLExec'
DO WHILE lnPas < 10
lnPas = lnPas + 1
lnM = SQLMoreResults(gnHandle, tcCursor)
STRTOFILE(' SQLMoreResults #' + TRANSFORM(lnPas) + ' ret=' + TRANSFORM(lnM) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH tcCursor, 'dupa SQLMoreResults #' + TRANSFORM(lnPas)
IF lnM <> 1
EXIT
ENDIF
ENDDO
CATCH TO loEx
STRTOFILE(' EXCEPTIE la masurare (pas ' + TRANSFORM(lnPas) + '): ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnI = AERROR(laE)
IF lnI > 0
FOR lnJ = 1 TO ALEN(laE, 2)
STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDFOR
ENDIF
DO LogCursoare WITH tcCursor, 'dupa exceptie'
ENDTRY
SQLSetProp(gnHandle, 'BatchMode', .T.)
ENDPROC
PROCEDURE Diag
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnR, loEx
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
TRY
lnR = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ' + tcEticheta + ' -> ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1)
DO LogCursoare WITH tcCursor, tcEticheta
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
CATCH TO loEx
STRTOFILE(' ' + tcEticheta + ' -> EXCEPTIE ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' [' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC
PROCEDURE LogCursoare
LPARAMETERS tcCursor, tcMoment
LOCAL lnJ, lcN, laF[1], lnF, lnI, lnLat
FOR lnJ = 0 TO 4
lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
IF USED(lcN)
lnF = AFIELDS(laF, lcN)
lnLat = 0
FOR lnI = 1 TO lnF
lnLat = lnLat + laF[lnI, 3]
ENDFOR
STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, latime ' + ;
TRANSFORM(lnLat) + ', ' + TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDFOR
ENDPROC
PROCEDURE bat
LPARAMETERS tcPas
STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
DO bat WITH 'Val1 intra: ' + m.tcSql
IF USED('v_val97')
USE IN v_val97
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val97')
SELECT v_val97
IF RECCOUNT('v_val97') > 0
GO TOP
lnRet = NVL(v_val97.v, -1)
ENDIF
USE IN v_val97
ENDIF
DO bat WITH 'Val1 iese: ' + TRANSFORM(lnRet)
RETURN lnRet
ENDFUNC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* SpyS13: subclasa a lui oexecutor. Logheaza fiecare statement INAINTE de executie, il executa
* prin DODEFAULT (comportament identic cu al clasei de baza, acelasi PCOUNT), si daca SQLExec
* arunca o exceptie o logheaza integral (ErrorNo/Message/Procedure/LineNo) si intoarce -1 in loc
* sa o propage - fluxul cade atunci pe ramura normala de eroare, care face ROLLBACK.
*==============================================================================================
DEFINE CLASS SpyS13 AS oexecutor
nIdx = 0
nEsecuri = 0
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc
THIS.nIdx = THIS.nIdx + 1
lnI = THIS.nIdx
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '')
STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ;
' vartype=' + VARTYPE(m.tcSql) + ' len=' + TRANSFORM(LEN(lcS)) + ;
' semne_intrebare=' + TRANSFORM(OCCURS('?', lcS)) + CHR(13) + CHR(10) + ;
' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IF 'scrie_factura2' $ lcS
DO MasoaraResultSets WITH lcS, lcC
THIS.nEsecuri = THIS.nEsecuri + 1
THIS.cEroare = 'SpyS13: statement masurat separat, nu se mai executa'
RETURN -1
ENDIF
lnRet = -1
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1)
CATCH TO loEx
THIS.nEsecuri = THIS.nEsecuri + 1
STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ;
': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + ']' + ;
' Details=[' + TRANSFORM(loEx.Details) + ']' + ;
' Procedure=' + TRANSFORM(loEx.Procedure) + ;
' LineNo=' + TRANSFORM(loEx.Lineno) + ;
' LineContents=[' + TRANSFORM(loEx.LineContents) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -1
THIS.cEroare = 'SpyS13: ' + TRANSFORM(loEx.Message)
ENDTRY
RETURN lnRet
ENDPROC
FUNCTION oPrelucrareEroare
RETURN 'SpyS13: ' + TRANSFORM(THIS.cEroare)
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,58 @@
* probe_s13_vact.prg
* Ramura de succes a lui pack_facturare.scrie_factura2 (PACKAGE BODY, liniile 5126-5127) deschide
* REF CURSOR-ul OUT pe [select * from VACT where 1 = 2]. Verificam daca VFP poate materializa acel
* result set - si daca nu, cate coloane vede de fapt. Doar SELECT-uri, nicio scriere.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_vact_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-VACT' + CHR(13) + CHR(10), gcErrLog)
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
DO Incearca WITH 'A. select * from vact where 1 = 2', [select * from vact where 1 = 2], 'c_a'
DO Incearca WITH 'B. select * from vact_tot where 1 = 2', [select * from vact_tot where 1 = 2], 'c_b'
DO Incearca WITH 'C. select * from vact (fara filtru, primul rand)', [select * from vact where rownum <= 1], 'c_c'
DO Incearca WITH 'D. select * from fact_vfacturi where 1 = 2', [select * from fact_vfacturi where 1 = 2], 'c_d'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Incearca
LPARAMETERS tcEticheta, tcSql, tcCursor
LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF
IF USED(tcCursor)
USE IN (tcCursor)
ENDIF
STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
TRY
lnRet = SQLExec(gnHandle, tcSql, tcCursor)
STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnRet >= 0 AND USED(tcCursor)
lnF = AFIELDS(laF, tcCursor)
lnLatime = 0
FOR lnI = 1 TO lnF
lnLatime = lnLatime + laF[lnI, 3]
ENDFOR
STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN (tcCursor)
ENDIF
IF lnRet < 0 AND AERROR(laE) > 0
STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
CATCH TO loEx
STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDTRY
ENDPROC

View File

@@ -0,0 +1,301 @@
* probe_s13b_batchmode_direct.prg
* Ultima verificare ceruta de docs/diagnostic_contract_too_many_columns.md (sectiunea Necunoscut):
* statement-ul #15 ({call pack_facturare.scrie_factura2(...)}, ofacturare.vc2:20307-20328) executat
* DIRECT dupa statement-ul #14, cu BatchMode ramas .T. (neschimbat) si FARA diagnosticele D1-D7
* intercalate - spre deosebire de probe_s13_toomanycolumns.prg, care la #15 devia intai prin
* MasoaraResultSets (D1-D7, apoi comuta pe BatchMode=.F.).
*
* Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada documentului
* 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
PUBLIC poDate, poSnapshotEditare, goFormReemitere
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13b_batchmode_direct_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13B-DIRECT doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
DO Probeaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Probeaza
LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal
lnIdV = 360
DO StareCascada WITH 'INAINTE'
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ;
lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ;
Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna)
IF VARTYPE(poSnapshotEditare) <> 'O'
STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1)
loReal = goExecutor
loSpy = CREATEOBJECT('SpyS13Direct')
loSpy.nHandle = gnHandle
goExecutor = loSpy
STRTOFILE('BatchMode inainte de do_scrie_factura = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1)
llRez = loForm.do_scrie_factura()
STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
goExecutor = loReal
STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' #15 interceptat=' + TRANSFORM(loSpy.lInterceptat15) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO StareCascada WITH 'DUPA'
ENDPROC
*==============================================================================================
PROCEDURE StareCascada
LPARAMETERS tcEticheta
LOCAL lnIdFact
lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360])
STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ;
' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ;
' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ;
' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ;
' id_fact=' + TRANSFORM(lnIdFact) + ;
' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ;
' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ;
' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ;
CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* LogCursoareCumulativ: la BatchMode=.T., un singur SQLExec pe un statement cu mai multe result
* set-uri le materializeaza direct in tcCursor, tcCursor1, tcCursor2, ... (fara SQLMoreResults).
* Numara coloanele PE FIECARE si intoarce totalul cumulat - ipoteza de testat e ca VFP insumeaza
* coloanele tuturor cursoarelor batch-ului, nu doar pe ale celui mai lat.
*==============================================================================================
FUNCTION LogCursoareCumulativ
LPARAMETERS tcCursor, tcMoment
LOCAL lnJ, lcN, laF[1], lnF, lnTotalCampuri
lnTotalCampuri = 0
FOR lnJ = 0 TO 8
lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ))
IF USED(lcN)
lnF = AFIELDS(laF, lcN)
lnTotalCampuri = lnTotalCampuri + lnF
STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, ' + ;
TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDFOR
STRTOFILE(' [' + tcMoment + '] TOTAL CUMULAT coloane (toate sub-cursoarele batch-ului) = ' + ;
TRANSFORM(lnTotalCampuri) + CHR(13) + CHR(10), gcErrLog, 1)
RETURN lnTotalCampuri
ENDFUNC
PROCEDURE bat
LPARAMETERS tcPas
STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
IF USED('v_val97b')
USE IN v_val97b
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val97b')
SELECT v_val97b
IF RECCOUNT('v_val97b') > 0
GO TOP
lnRet = NVL(v_val97b.v, -1)
ENDIF
USE IN v_val97b
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* SpyS13Direct: subclasa a lui oexecutor, identica cu SpyS13 (probe_s13_toomanycolumns.prg) pentru
* toate statementele - DODEFAULT, acelasi PCOUNT. Diferenta e DOAR la statement-ul #15
* (continut = 'scrie_factura2'): aici NU devia prin diagnostice (D1-D7) si NU schimba BatchMode -
* face SQLExec() direct, cu BatchMode ramas asa cum e (implicit .T.), si prinde exceptia integral.
*==============================================================================================
DEFINE CLASS SpyS13Direct AS oexecutor
nIdx = 0
lInterceptat15 = .F.
PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect)
LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc, lnR, laE[1], lnJ, lnTotalCol
THIS.nIdx = THIS.nIdx + 1
lnI = THIS.nIdx
lnPc = PCOUNT()
lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '<NU E SIR>')
lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '')
STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ;
' BatchMode=' + TRANSFORM(SQLGetProp(THIS.nHandle, 'BatchMode')) + CHR(13) + CHR(10) + ;
' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1)
IF 'scrie_factura2' $ lcS
THIS.lInterceptat15 = .T.
STRTOFILE(' *** statement #15: SQLExec DIRECT, fara D1-D7, BatchMode neschimbat ***' + CHR(13) + CHR(10), gcErrLog, 1)
IF USED(lcC)
USE IN (lcC)
ENDIF
TRY
lnR = SQLExec(THIS.nHandle, m.tcSql, m.tcCursor)
STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnR < 0
STRTOFILE(' ret<0 FARA exceptie VFP - eroare SQL normala, nu 1872.' + CHR(13) + CHR(10), gcErrLog, 1)
IF AERROR(laE) > 0
FOR lnJ = 1 TO ALEN(laE, 2)
STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDFOR
ENDIF
ENDIF
lnTotalCol = LogCursoareCumulativ(lcC, 'dupa SQLExec #15 direct')
STRTOFILE(' NU s-a reprodus 1872 - statement #15 a reusit direct (fara eroare 1872).' + CHR(13) + CHR(10), gcErrLog, 1)
CATCH TO loEx
STRTOFILE(' S-A REPRODUS: EXCEPTIE la statement #15 direct: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ;
' Message=[' + TRANSFORM(loEx.Message) + '] Procedure=' + TRANSFORM(loEx.Procedure) + ;
' LineNo=' + TRANSFORM(loEx.Lineno) + CHR(13) + CHR(10), gcErrLog, 1)
IF AERROR(laE) > 0
FOR lnJ = 1 TO ALEN(laE, 2)
STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1)
ENDFOR
ENDIF
ENDTRY
THIS.cEroare = 'SpyS13Direct: statement #15 masurat direct'
RETURN -1
ENDIF
lnRet = -1
TRY
DO CASE
CASE lnPc <= 1
lnRet = DODEFAULT(m.tcSql)
CASE lnPc = 2
lnRet = DODEFAULT(m.tcSql, m.tcCursor)
CASE lnPc = 3
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress)
CASE lnPc = 4
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress)
CASE lnPc = 5
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle)
CASE lnPc = 6
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError)
CASE lnPc = 7
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError)
OTHERWISE
lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect)
ENDCASE
STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1)
CATCH TO loEx
STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ;
': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
lnRet = -1
THIS.cEroare = 'SpyS13Direct: ' + TRANSFORM(loEx.Message)
ENDTRY
RETURN lnRet
ENDPROC
FUNCTION oPrelucrareEroare
RETURN 'SpyS13Direct: ' + TRANSFORM(THIS.cEroare)
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,123 @@
* probe_s8p8_candidati.prg
* READ-ONLY. Cauta in MARIUSM_AUTO candidati pentru test_s8_editare_incarcare.prg (pasul 8):
* A) document FARA delegat (id_delegat null/0), tip intre 1 si 4, luna curenta (gnAn/gnLuna)
* B) document de tip AVIZ SUBUNITATI (23) sau AVIZ RETUR SUBUNITATI (41) - singurele doua tipuri
* pe care Ct_clb_politici_preturi ramane prezent la editare (verificat pe cod, ofacturare.vc2
* ~21580-21660), luna curenta
* Foloseste fact_vfacturi (acelasi view ca IncarcaAntetFacturaEditare), an/luna derivate din data_act.
* Nu scrie nimic - doar SELECT.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s8p8_candidati_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO ErrH WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
STRTOFILE('gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lnSucces
*!* --- A: document fara delegat, tip 1-4, luna curenta, nesters, ne-eproforma ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip between 1 and 4 and sters=0 and nvl(eproforma,0)=0 and nvl(id_delegat,0)=0] + ;
[ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ;
[ order by id_vanzare desc], 'v_faradeleg')
STRTOFILE('A) fara delegat: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_faradeleg'),RECCOUNT('v_faradeleg'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_faradeleg')
SELECT v_faradeleg
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' sters=' + TRANSFORM(sters) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_faradeleg
ENDIF
goExecutor.oReset()
*!* --- B: aviz subunitati (23) / retur subunitati (41), luna curenta, nesters, ne-eproforma ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip in (23,41) and sters=0 and nvl(eproforma,0)=0] + ;
[ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ;
[ order by id_vanzare desc], 'v_aviz')
STRTOFILE('B) aviz 23/41 luna curenta: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz'),RECCOUNT('v_aviz'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_aviz')
SELECT v_aviz
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_aviz
ENDIF
goExecutor.oReset()
*!* --- B2: acelasi, fara restrictia de luna, ca sa vedem daca exista DELOC in schema ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip in (23,41) and sters=0 and nvl(eproforma,0)=0 order by id_vanzare desc], 'v_aviz_all')
STRTOFILE('B2) aviz 23/41 ORICE luna: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz_all'),RECCOUNT('v_aviz_all'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_aviz_all')
SELECT v_aviz_all
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_aviz_all
ENDIF
goExecutor.oReset()
*!* --- B3: orice tip de aviz posibil (21,22,23,24,25,26,28,30,41,42,47), orice luna - ca sa stim daca
*!* exista MACAR ceva aviz in schema, chiar daca nu pe 23/41 ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip in (21,22,23,24,25,26,28,30,41,42,47) and sters=0 and nvl(eproforma,0)=0 order by id_vanzare desc], 'v_aviz_larg')
STRTOFILE('B3) orice tip aviz, orice luna: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz_larg'),RECCOUNT('v_aviz_larg'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_aviz_larg')
SELECT v_aviz_larg
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_aviz_larg
ENDIF
goExecutor.oReset()
*!* --- C: sanitate - documentele 1113/1055/1048/1130/1071/1072 folosite deja, ce data au ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, data_act from fact_vfacturi where id_vanzare in (1113,1055,1048,1130,1071,1072) order by id_vanzare], 'v_ref')
STRTOFILE('C) documente existente in suita (referinta data_act): lnSucces=' + TRANSFORM(lnSucces) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_ref')
SELECT v_ref
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_ref
ENDIF
goExecutor.oReset()
*!* --- D: fara delegat, ORICE tip valid (exclus 44,45,46,51 - garda do_editare_unificata), luna curenta ---
lnSucces = goExecutor.oExecute(;
[select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ;
[ where tip not in (44,45,46,51) and sters=0 and nvl(eproforma,0)=0 and nvl(id_delegat,0)=0] + ;
[ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ;
[ order by id_vanzare desc], 'v_faradeleg2')
STRTOFILE('D) fara delegat, orice tip valid, luna curenta: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_faradeleg2'),RECCOUNT('v_faradeleg2'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('v_faradeleg2')
SELECT v_faradeleg2
SCAN
STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_faradeleg2
ENDIF
goExecutor.oReset()
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE ErrH
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,82 @@
* probe_s8p8_garzi.prg
* READ-ONLY. Verifica, pentru candidatii gasiti de probe_s8p8_candidati.prg, garzile REALE ale
* do_editare_unificata (ofacturare_comun.vc2:3890+), enumerate in docs\raport_s8_driver_determinist.md
* X3: nesters, ne-eproforma, tip valid (not in 44,45,46,51), luna documentului = luna curenta
* (gnAn/gnLuna), ReferinteDocumenteNota, EsteInEFactura, DocumentAreUrmasi, IncarcaAntetFacturaEditare.
* Nu scrie in Oracle - doar SELECT + apeluri read-only la functiile de garda.
* Candidati verificati: 1047 (fara delegat, tip=-12), 953 (aviz tip=23, mai 2022 - istoric).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s8p8_garzi_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO ErrH WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
STRTOFILE('gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
DO VerificaGarzi WITH 1047, 'fara delegat, tip=-12 DEVIZE AUTO'
DO VerificaGarzi WITH 953, 'aviz tip=23, istoric mai 2022'
DO VerificaGarzi WITH 1110, 'aviz tip=22, august 2026 (Ct_clb_politici_preturi scos oricum)'
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE VerificaGarzi
LPARAMETERS tnIdVanzare, tcEticheta
LOCAL lnSucces, lnSters, llEProforma, lnTipDoc, pnAn, pnLuna, lnCod, lnIdFact
STRTOFILE(CHR(13)+CHR(10) + '=== ' + TRANSFORM(tnIdVanzare) + ' [' + tcEticheta + '] ===' + CHR(13)+CHR(10), gcErrLog, 1)
IF USED('crsGarzi')
USE IN crsGarzi
ENDIF
lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip from fact_vfacturi where id_vanzare=' + TRANSFORM(m.tnIdVanzare), 'crsGarzi')
goExecutor.oReset()
IF lnSucces < 0 OR !USED('crsGarzi') OR RECCOUNT('crsGarzi') <> 1
STRTOFILE(' NU S-A GASIT documentul (lnSucces=' + TRANSFORM(lnSucces) + ')' + CHR(13)+CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT crsGarzi
lnCod = cod
pnAn = YEAR(data_act)
pnLuna = MONTH(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
USE IN crsGarzi
STRTOFILE(' sters=' + TRANSFORM(lnSters) + ' eproforma=' + TRANSFORM(llEProforma) + ' tip=' + TRANSFORM(lnTipDoc) + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate2 nesters: ' + TRANSFORM(lnSters = 0) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate5 ne-eproforma: ' + TRANSFORM(!llEProforma) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate6 tip valid (not in 44,45,46,51): ' + TRANSFORM(!INLIST(lnTipDoc,44,45,46,51)) + CHR(13)+CHR(10), gcErrLog, 1)
STRTOFILE(' gate7 luna curenta (' + TRANSFORM(pnAn*12+pnLuna) + '=' + TRANSFORM(gnAn*12+gnLuna) + '): ' + TRANSFORM((pnAn*12+pnLuna) == (gnAn*12+gnLuna)) + CHR(13)+CHR(10), gcErrLog, 1)
LOCAL llRef, llEFact, llUrm
llRef = ReferinteDocumenteNota(pnAn, pnLuna, lnCod)
STRTOFILE(' gate8 fara referinte (!ReferinteDocumenteNota): ' + TRANSFORM(!llRef) + CHR(13)+CHR(10), gcErrLog, 1)
llEFact = EsteInEFactura(lnIdFact)
STRTOFILE(' gate9 nu e in eFactura: ' + TRANSFORM(!llEFact) + CHR(13)+CHR(10), gcErrLog, 1)
llUrm = DocumentAreUrmasi(m.tnIdVanzare)
STRTOFILE(' gate10 fara urmasi: ' + TRANSFORM(!llUrm) + CHR(13)+CHR(10), gcErrLog, 1)
LOCAL poDateT, lnDiscR, lnDiscV
poDateT = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscR, @lnDiscV)
STRTOFILE(' gate11 IncarcaAntetFacturaEditare reuseste: ' + TRANSFORM(VARTYPE(poDateT) == 'O') + CHR(13)+CHR(10), gcErrLog, 1)
LOCAL llToateTrec
llToateTrec = (lnSters=0) AND !llEProforma AND !INLIST(lnTipDoc,44,45,46,51) AND ((pnAn*12+pnLuna)==(gnAn*12+gnLuna)) ;
AND !llRef AND !llEFact AND !llUrm AND (VARTYPE(poDateT) == 'O')
STRTOFILE(' ==> TOATE GARZILE TREC (ar trebui sa se deschida): ' + TRANSFORM(llToateTrec) + CHR(13)+CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE ErrH
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,33 @@
* probe_s9_4_coldoc.prg - READ-ONLY: coloanele tabelei DOCUMENTE.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_coldoc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
LOCAL lnOk, lcL, lnI
IF goExecutor.oExecuta([select column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'DOCUMENTE' order by column_id], 'v_c')
SELECT v_c
STRTOFILE('DOCUMENTE are ' + TRANSFORM(RECCOUNT('v_c')) + ' coloane:' + CHR(13) + CHR(10), gcErrLog, 1)
lcL = ''
SCAN
lcL = lcL + ALLTRIM(column_name) + '(' + ALLTRIM(data_type) + ') '
ENDSCAN
STRTOFILE(lcL + CHR(13) + CHR(10), gcErrLog, 1)
USE IN v_c
ENDIF
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,43 @@
* probe_s9_4_coloane.prg - READ-ONLY: coloanele tabelelor pe care le interogheaza test_s9_4.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_coloane_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
DO Col WITH 'RUL'
DO Col WITH 'VANZARI_DETALII'
DO Col WITH 'VANZARI_CORESP'
DO Col WITH 'VANZARI'
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Col
LPARAMETERS tcTabela
LOCAL lcL
IF USED('v_c')
USE IN v_c
ENDIF
IF goExecutor.oExecuta([select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = '] + tcTabela + [' order by column_id], 'v_c')
SELECT v_c
lcL = ''
SCAN
lcL = lcL + ALLTRIM(column_name) + ' '
ENDSCAN
STRTOFILE('=== ' + tcTabela + ' (' + TRANSFORM(RECCOUNT('v_c')) + '): ' + lcL + CHR(13) + CHR(10) + CHR(13) + CHR(10), gcErrLog, 1)
USE IN v_c
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,66 @@
* probe_s9_4_documente.prg - READ-ONLY: de ce atarna "select count(*) from documente where id_fact = ?"
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_documente_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
*!* sesiuni blocante inainte de orice altceva
DO Lista WITH 'sesiuni care blocheaza', ;
[select s.sid, s.status, s.osuser, s.machine, s.last_call_et, s.blocking_session, s.event ] + ;
[from v$session s where s.username = 'MARIUSM_AUTO' order by s.sid]
DO Lista WITH 'lacate pe obiecte', ;
[select l.session_id, o.object_name, l.locked_mode from v$locked_object l, all_objects o ] + ;
[where l.object_id = o.object_id]
DO Lista WITH 'cate randuri are DOCUMENTE (cu timeout implicit)', [select count(*) as nr from documente]
DO Lista WITH 'indecsi pe DOCUMENTE', ;
[select index_name, column_name, column_position from all_ind_columns ] + ;
[where table_name = 'DOCUMENTE' and table_owner = 'MARIUSM_AUTO' order by index_name, column_position]
DO Lista WITH 'DOCUMENTE - ce fel de obiect e', ;
[select owner, object_type from all_objects where object_name = 'DOCUMENTE']
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL, ltT
ltT = DATETIME()
STRTOFILE('--> pornesc: ' + tcTitlu + ' ' + TTOC(ltT) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_dg')
USE IN v_dg
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_dg')
IF !lnOk
STRTOFILE(' EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_dg
STRTOFILE(' ' + TRANSFORM(RECCOUNT('v_dg')) + ' randuri in ' + ;
TRANSFORM(DATETIME() - ltT) + ' sec' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 15
lcL = ''
FOR lnI = 1 TO FCOUNT('v_dg')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_dg')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_dg')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_dg
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,62 @@
* probe_s9_4_fdoc.prg - READ-ONLY: id_fdoc e uniform pe randurile vact_tot ale unui document?
* Extractia din StergeDocumentFacturare ia primul rand (GO top, order by id_act), nu max().
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_fdoc_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
*!* randurile documentului vechi 1071 (cod 1141096), in ordinea pe care o vede actactan
DO Lista WITH 'vact_tot cod 1141096 (doc vechi 1071), order by id_act - primul rand e cel citit', ;
[select id_act, id_fdoc, id_set, dataireg from ] + gcs + [.vact_tot ] + ;
[where an = 2026 and luna = 8 and cod = 1141096 order by id_act]
DO Lista WITH 'vact_tot pentru documentul nou 1138', ;
[select a.id_act, a.id_fdoc, a.dataireg from ] + gcs + [.vact_tot a, vanzari v ] + ;
[where v.id_vanzare = 1138 and a.cod = v.cod and a.sters = 0 order by a.id_act]
*!* cat de des e id_fdoc neuniform in interiorul unui document
DO Lista WITH 'documente cu id_fdoc NEUNIFORM pe perioada activa', ;
[select count(*) as documente_neuniforme from (] + ;
[select cod from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8 ] + ;
[group by cod having count(distinct id_fdoc) > 1)]
DO Lista WITH 'total documente distincte in vact_tot pe perioada activa', ;
[select count(distinct cod) as total from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_q')
USE IN v_q
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_q')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_q
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_q')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 20
lcL = ''
FOR lnI = 1 TO FCOUNT('v_q')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_q')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_q')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_q
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,70 @@
* probe_s9_4_fidelitate.prg - READ-ONLY: ID_FDOC si DATAIREG sunt ajungibile din cursorul pe care
* piciorul de stergere il citeste deja (actactan = select * from vact_tot)? Si ce valori au?
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_fidelitate_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
gnIdUtil = 8
*!* 1. coloanele view-ului din care se umple actactan
DO Lista WITH 'coloane VACT_TOT care ne intereseaza', ;
[select column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'VACT_TOT' and column_name in ('ID_FDOC','DATAIREG','ID_SET','ID_FACT','ID_FACTD','COD','AN','LUNA') ] + ;
[order by column_name]
*!* 2. exista ID_FDOC pe VANZARI? (alta sursa posibila pentru valoarea documentului vechi)
DO Lista WITH 'cate randuri vact_tot au id_fdoc nenul, pe perioada activa', ;
[select count(*) as total, sum(case when id_fdoc is null then 1 else 0 end) as nule, ] + ;
[sum(case when id_fdoc is not null then 1 else 0 end) as nenule ] + ;
[from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8]
*!* 3. valorile reale pentru documentele de test (exact ce ar citi actactan)
DO Lista WITH 'vact_tot pentru codurile de test (1141095=doc 1070, 1140912=doc 1056)', ;
[select cod, id_set, id_fdoc, id_fact, dataireg from ] + gcs + [.vact_tot ] + ;
[where sters = 0 and an = 2026 and luna = 8 and cod in (1141095, 1140912) order by cod, id_act]
*!* 4. cate randuri din vact_tot au dataireg diferita de data_act a documentului
DO Lista WITH 'dataireg vs data_act pe perioada activa (cate difera)', ;
[select count(*) as total, ] + ;
[sum(case when trunc(a.dataireg) = trunc(v.data_act) then 1 else 0 end) as egale, ] + ;
[sum(case when trunc(a.dataireg) <> trunc(v.data_act) then 1 else 0 end) as diferite ] + ;
[from ] + gcs + [.vact_tot a, vanzari v ] + ;
[where a.sters = 0 and a.an = 2026 and a.luna = 8 and v.sters = 0 and v.cod = a.cod]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_f')
USE IN v_f
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_f')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_f
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_f')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 20
lcL = ''
FOR lnI = 1 TO FCOUNT('v_f')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_f')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_f')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_f
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,67 @@
* probe_s9_4_hang.prg - READ-ONLY: reproduce secventa INAINTE din Rularea2 pe documentul 1056.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_hang_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lnIdV, lnIdFact, lcSerie, lnNumar, lnDoc, lnOk
lnIdV = 1056
DO U WITH 'antet prin oExecuta'
IF goExecutor.oExecuta([select id_fact, serie_act, numar_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), 'v_a')
SELECT v_a
GO TOP
lnIdFact = NVL(id_fact, 0)
lcSerie = ALLTRIM(NVL(serie_act, ''))
lnNumar = NVL(numar_act, 0)
USE IN v_a
ENDIF
DO U WITH 'id_fact=[' + TRANSFORM(lnIdFact) + '] tip=' + VARTYPE(lnIdFact) + ;
' serie=[' + TRANSFORM(lcSerie) + '] numar=' + TRANSFORM(lnNumar)
DO U WITH 'SQL construit: ' + [select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact)
DO U WITH 'varianta A: oExecuta pe documente'
lnOk = goExecutor.oExecuta([select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact), 'v_d')
DO U WITH ' oExecuta a intors ' + TRANSFORM(lnOk) + ' eroare=[' + TRANSFORM(goExecutor.cEroare) + ']'
IF USED('v_d')
SELECT v_d
GO TOP
DO U WITH ' nr = ' + TRANSFORM(nr)
USE IN v_d
ENDIF
DO U WITH 'varianta B: oSelecteaza2Value pe documente (suspectul)'
lnDoc = -1
goExecutor.oSelecteaza2Value([select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact), @lnDoc)
DO U WITH ' lnDoc = ' + TRANSFORM(lnDoc)
DO U WITH 'ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']'
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE U
LPARAMETERS tcT
STRTOFILE(TTOC(DATETIME()) + ' ' + m.tcT + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,59 @@
* probe_s9_4_nota.prg - READ-ONLY: s-a creat o nota contabila NOUA la regenerarea doc 1070 -> 1137?
* ID_SET e comun pe perioada, deci identitatea notei e ID_DOC (PK-ul din DOCUMENTE).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_nota_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
DO Lista WITH 'DOCUMENTE pentru SSS/594 (nota veche + nota noua)', ;
[select id_doc, id_set, sters, nract, serie_act, dataact, dataireg from documente ] + ;
[where nract = 594 and serie_act = 'SSS' order by id_doc]
DO Lista WITH 'cate valori distincte de ID_SET exista pe perioada activa', ;
[select count(distinct id_set) as seturi, count(*) as randuri from ] + gcs + [.vact_tot ] + ;
[where sters = 0 and an = 2026 and luna = 8]
DO Lista WITH 'documentul nou 1137 - id_fdoc si dataireg reale scrise', ;
[select a.cod, a.id_fdoc, a.dataireg, v.data_act from ] + gcs + [.vact_tot a, vanzari v ] + ;
[where v.id_vanzare = 1137 and a.cod = v.cod and a.sters = 0]
DO Lista WITH 'documentul vechi 1070 - stare finala', ;
[select id_vanzare, cod, sters, id_fact from vanzari where id_vanzare in (1070, 1137) order by id_vanzare]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_n')
USE IN v_n
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_n')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_n
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_n')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN WHILE RECNO() <= 20
lcL = ''
FOR lnI = 1 TO FCOUNT('v_n')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_n')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_n')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_n
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,87 @@
* probe_s9_4_nuluri.prg - READ-ONLY: ce proprietati ale lui poDate raman NULL pe calea de editare
* si care dintre ele pica in expresia de construire a SQL-ului din do_scrie_articole.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, poDate
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_nuluri_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
LOCAL lnR, lnV
poDate = IncarcaAntetFacturaEditare(1070, @lnR, @lnV)
IF VARTYPE(poDate) <> 'O'
STRTOFILE('nu s-a incarcat antetul' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
*!* exact proprietatile folosite in expresia SQL din do_scrie_articole
DO P WITH 'dataireg'
DO P WITH 'id_fdoc'
DO P WITH 'dataact'
DO P WITH 'datascad'
DO P WITH 'serie_act'
DO P WITH 'nract'
DO P WITH 'id_client'
DO P WITH 'id_lucrare'
DO P WITH 'id_sectie'
DO P WITH 'id_venchelt'
DO P WITH 'id_responsabil'
DO P WITH 'explicatia4'
DO P WITH 'listaid'
DO P WITH 'descriere'
DO P WITH 'tip'
DO P WITH 'id_set'
DO P WITH 'zi_curs'
DO P WITH 'id_valuta'
DO P WITH 'in_valuta'
DO P WITH 'tva_incasare'
*!* care apel concret pica: Alltrim(Str(x)) pe fiecare proprietate numerica suspecta
DO T WITH 'id_fdoc'
DO T WITH 'id_valuta'
DO T WITH 'id_lucrare'
DO T WITH 'id_sectie'
DO T WITH 'id_set'
DO T WITH 'tva_incasare'
DO T WITH 'in_valuta'
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE P
LPARAMETERS tcProp
LOCAL lcT, lcV
lcT = TYPE('poDate.' + tcProp)
lcV = '?'
IF ISNULL(EVALUATE('poDate.' + tcProp))
lcV = '.NULL.'
ELSE
lcV = TRANSFORM(EVALUATE('poDate.' + tcProp))
ENDIF
STRTOFILE(PADR(tcProp, 18) + ' TYPE=' + lcT + ' valoare=' + lcV + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE T
LPARAMETERS tcProp
LOCAL lcRez
lcRez = '<<< A PICAT >>>'
TRY
lcRez = '[' + Alltrim(Str(EVALUATE('poDate.' + tcProp))) + ']'
CATCH TO loE
lcRez = '<<< EROARE ' + TRANSFORM(loE.ErrorNo) + ': ' + loE.Message + ' >>>'
ENDTRY
STRTOFILE('Alltrim(Str(poDate.' + PADR(tcProp, 16) + ')) -> ' + lcRez + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,54 @@
* probe_s9_4_parameters.prg
* READ-ONLY, fara Oracle: PARAMETERS() vs PCOUNT() vs VARTYPE() intr-o functie cu parametri
* optionali, dupa ce s-a executat un apel imbricat. Decide garda din hunk C (S9-4).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_parameters_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
LOCAL lnOut, llR
lnOut = 0
*!* cazul 1: apelant care TRANSMITE al 6-lea parametru prin referinta
llR = Tinta(1, 2, 3, 4, 5, @lnOut)
STRTOFILE('CU al 6-lea param: lnOut dupa apel = ' + TRANSFORM(lnOut) + CHR(13) + CHR(10), gcErrLog, 1)
*!* cazul 2: apelant care NU il transmite
llR = Tinta(1, 2, 3, 4, 5)
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
FUNCTION Tinta
LPARAMETERS t1, t2, t3, t4, t5, t6
LOCAL lnDummy
STRTOFILE('--- apel Tinta ---' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(' INAINTE de apel imbricat: PARAMETERS()=' + TRANSFORM(PARAMETERS()) + ;
' PCOUNT()=' + TRANSFORM(PCOUNT()) + ' VARTYPE(m.t6)=' + VARTYPE(m.t6) + CHR(13) + CHR(10), gcErrLog, 1)
*!* apel imbricat cu 2 parametri - exact situatia din StergeDocumentFacturare (goExecutor, OSCRIE_IN_FISIERE)
lnDummy = Imbricat(10, 20)
STRTOFILE(' DUPA apel imbricat cu 2 param: PARAMETERS()=' + TRANSFORM(PARAMETERS()) + ;
' PCOUNT()=' + TRANSFORM(PCOUNT()) + ' VARTYPE(m.t6)=' + VARTYPE(m.t6) + CHR(13) + CHR(10), gcErrLog, 1)
IF VARTYPE(m.t6) = 'N'
t6 = 4242
STRTOFILE(' garda VARTYPE: a scris in t6' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' garda VARTYPE: NU a scris in t6' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION Imbricat
LPARAMETERS a, b
RETURN a + b
ENDFUNC

View File

@@ -0,0 +1,141 @@
* probe_s9_4_recensamant.prg
* READ-ONLY: recensamant de candidati eligibili pe paliere + disponibilitatea DATA_IREG.
* Nu scrie nimic in Oracle.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_recensamant_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
DO Ruleaza
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Ruleaza
LOCAL lcExclusi, lcPer, lcSql, lnOk
lcExclusi = [1047,1048,1055,1113,1130]
STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ;
' gcs=' + gcs + CHR(13) + CHR(10), gcErrLog, 1)
lcPer = [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ;
[ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna)
*!* --- palier 3 (cel mai larg): STERS=0 in perioada activa, fara niciun filtru de continut ---
DO Listeaza WITH 'P3a toate nesterse in perioada activa', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + [ order by v.id_vanzare]
DO Listeaza WITH 'P3b + randuri reale in vact_tot', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) order by v.id_vanzare]
DO Listeaza WITH 'P3c + vact_tot SI vrul_tot', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ;
[ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) order by v.id_vanzare]
*!* --- paliere 1 si 2: peste P3c / P3b se aplica in VFP filtrul referinte + urmasi ---
DO Filtreaza WITH 'PALIER 1 (strict S9-3: vact+vrul, fara referinte/urmasi)', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and v.id_vanzare not in (] + lcExclusi + [)] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ;
[ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ;
[ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) order by v.id_vanzare]
DO Filtreaza WITH 'PALIER 2 (fara cerinta vrul_tot)', ;
[select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ;
[ and v.id_vanzare not in (] + lcExclusi + [)] + ;
[ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ;
[ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) order by v.id_vanzare]
*!* --- DATA_IREG: exista pe VANZARI / pe view-ul folosit de IncarcaAntetFacturaEditare? ---
DO Listeaza WITH 'COLOANE %IREG% in all_tab_columns', ;
[select owner, table_name, column_name, data_type from all_tab_columns ] + ;
[where column_name like '%IREG%' and table_name in ('VANZARI','FACT_VFACTURI','VACT_TOT') ] + ;
[order by owner, table_name, column_name]
DO Listeaza WITH 'toate coloanele FACT_VFACTURI cu DATA in nume', ;
[select owner, table_name, column_name from all_tab_columns ] + ;
[where table_name = 'FACT_VFACTURI' and column_name like 'DATA%' order by owner, column_name]
ENDPROC
PROCEDURE Listeaza
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcLinie
IF USED('v_rec')
USE IN v_rec
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_rec')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_rec
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_rec')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
GO TOP
SCAN WHILE RECNO() <= 12
lcLinie = ''
FOR lnI = 1 TO FCOUNT('v_rec')
lcLinie = lcLinie + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_rec')))) + ' | '
ENDFOR
STRTOFILE(' ' + lcLinie + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_rec
ENDPROC
PROCEDURE Filtreaza
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnNr, lcLista, lnIdV, lnCod, lnTip
IF USED('v_rec2')
USE IN v_rec2
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_rec2')
IF !lnOk
STRTOFILE('=== ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
lnNr = 0
lcLista = ''
SELECT v_rec2
SCAN
lnIdV = id_vanzare
lnCod = cod
lnTip = tip
IF !ReferinteDocumenteNota(gnAn, gnLuna, lnCod) AND !DocumentAreUrmasi(lnIdV)
lnNr = lnNr + 1
IF lnNr <= 8
lcLista = lcLista + TRANSFORM(lnIdV) + '/' + TRANSFORM(lnCod) + '/tip=' + TRANSFORM(lnTip) + ' '
ENDIF
ENDIF
ENDSCAN
USE IN v_rec2
STRTOFILE('=== ' + tcTitlu + ': ' + TRANSFORM(lnNr) + ' eligibili' + CHR(13) + CHR(10) + ;
' ' + lcLista + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,51 @@
* probe_s9_4_stare.prg - READ-ONLY: starea documentului 1051 si a eventualelor documente noi.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_stare_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
DO Lista WITH 'doc 1051', [select id_vanzare, cod, tip, sters, id_fact, serie_act, numar_act, dataoras from vanzari where id_vanzare = 1051]
DO Lista WITH 'orice vanzare cu id_vanzare > 1140 (documente noi)', [select id_vanzare, cod, tip, sters, id_fact, numar_act from vanzari where id_vanzare > 1140 order by id_vanzare]
DO Lista WITH 'ultimele 8 vanzari dupa id', [select * from (select id_vanzare, cod, tip, sters, id_fact, numar_act, dataoras from vanzari order by id_vanzare desc) where rownum <= 8]
DO Lista WITH 'rul nesters pe cod 1140907', [select count(*) as nr from rul where sters = 0 and an = 2026 and luna = 8 and cod = 1140907]
DO Lista WITH 'vact_tot nesters pe cod 1140907', [select count(*) as nr from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8 and cod = 1140907]
STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Lista
LPARAMETERS tcTitlu, tcSql
LOCAL lnOk, lnI, lcL
IF USED('v_st')
USE IN v_st
ENDIF
lnOk = goExecutor.oExecuta(tcSql, 'v_st')
IF !lnOk
STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
RETURN
ENDIF
SELECT v_st
STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_st')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1)
SCAN
lcL = ''
FOR lnI = 1 TO FCOUNT('v_st')
lcL = lcL + ALLTRIM(FIELD(lnI, 'v_st')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_st')))) + ' '
ENDFOR
STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_st
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,78 @@
* probe_s9_5_atasamente.prg - READ-ONLY: structura ATASAMENTE_VANZARI, sursa view-ului
* VATASAMENTE_VANZARI, orice referinta din PL/SQL, si populatia din perioada activa.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_5_atasamente_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
IF EMPTY(lcProcExistent)
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg"
ELSE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
ENDIF
DO Sectiune WITH 'F. constrangeri pe ATASAMENTE_VANZARI', ;
[select c.constraint_name || ' ' || c.constraint_type as l ] + ;
[from all_constraints c where c.owner = 'MARIUSM_AUTO' and c.table_name = 'ATASAMENTE_VANZARI']
DO Sectiune WITH 'G. populatia: total randuri / distincte id_vanzare', ;
[select 'total=' || count(*) || ' documente=' || count(distinct id_vanzare) as l from MARIUSM_AUTO.atasamente_vanzari]
DO Sectiune WITH 'H. atasamente pe documentele perioadei active (top 20)', ;
[select 'id_vanzare=' || a.id_vanzare || ' nr=' || count(*) as l ] + ;
[from MARIUSM_AUTO.atasamente_vanzari a join MARIUSM_AUTO.vanzari v on v.id_vanzare = a.id_vanzare ] + ;
[where extract(year from v.data_act) = 2026 and extract(month from v.data_act) = 8 ] + ;
[group by a.id_vanzare order by a.id_vanzare]
DO Sectiune WITH 'I. atasamente pe documentele produse de S9-4 (1137,1138,1139) si sursele lor', ;
[select 'id_vanzare=' || id_vanzare || ' nr=' || count(*) as l from MARIUSM_AUTO.atasamente_vanzari ] + ;
[where id_vanzare in (1070,1071,1072,1137,1138,1139,1051) group by id_vanzare order by id_vanzare]
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Sectiune
LPARAMETERS tcTitlu, tcSql
LOCAL lcOut, lnN
STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcTitlu + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_s')
USE IN v_s
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_s')
SELECT v_s
lnN = RECCOUNT('v_s')
IF lnN = 0
STRTOFILE(' (zero randuri)' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
lcOut = ''
SCAN
lcOut = lcOut + ' ' + ALLTRIM(NVL(v_s.l, '<null>')) + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(lcOut, gcErrLog, 1)
ENDIF
USE IN v_s
ELSE
STRTOFILE(' ESEC interogare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,73 @@
* probe_s9_5_plsql.prg - READ-ONLY: sursa PL/SQL din jurul referintelor la ATASAMENTE_VANZARI.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_5_plsql_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
DO Sursa WITH 'PACK_CONTAFIN', 8250, 8345
DO Sursa WITH 'PACK_FACTURARE', 12800, 12885
DO Randuri WITH 'populatia ATASAMENTE_VANZARI, pe coloane cheie', ;
[select 'id_at_vanz=' || id_at_vanz || ' id_vanzare=' || nvl(to_char(id_vanzare),'NULL') || ] + ;
[' cod=' || nvl(to_char(cod),'NULL') || ' tip=' || nvl(to_char(tip),'NULL') || ' sters=' || sters || ] + ;
[' lung=' || nvl(to_char(dbms_lob.getlength(document)),'NULL') as l ] + ;
[from MARIUSM_AUTO.atasamente_vanzari order by id_at_vanz]
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE Sursa
LPARAMETERS tcNume, tnDe, tnPana
LOCAL lcOut
STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcNume + ' ' + TRANSFORM(tnDe) + '-' + TRANSFORM(tnPana) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_s')
USE IN v_s
ENDIF
IF goExecutor.oExecuta([select line, rtrim(text) as t from all_source where owner = 'MARIUSM_AUTO' ] + ;
[and name = '] + tcNume + [' and type = 'PACKAGE BODY' and line between ] + ;
TRANSFORM(tnDe) + [ and ] + TRANSFORM(tnPana) + [ order by line], 'v_s')
lcOut = ''
SELECT v_s
SCAN
lcOut = lcOut + PADL(TRANSFORM(v_s.line), 6) + ': ' + CHRTRAN(ALLTRIM(NVL(v_s.t, '')), CHR(10) + CHR(13), '') + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(lcOut, gcErrLog, 1)
USE IN v_s
ELSE
STRTOFILE(' ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE Randuri
LPARAMETERS tcTitlu, tcSql
LOCAL lcOut
STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcTitlu + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_r')
USE IN v_r
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_r')
lcOut = ''
SELECT v_r
SCAN
lcOut = lcOut + ' ' + ALLTRIM(NVL(v_r.l, '<null>')) + CHR(13) + CHR(10)
ENDSCAN
STRTOFILE(IIF(EMPTY(lcOut), ' (zero randuri)' + CHR(13) + CHR(10), lcOut), gcErrLog, 1)
USE IN v_r
ELSE
STRTOFILE(' ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,58 @@
* probe_s9_aviz.prg
* Repeta doar cautarea candidatului aviz din probe_s9_candidati.prg, cu diagnostic de eroare Oracle
* (coloana gresita suspectata: id_vanzare_sursa in loc de id_vanzare_aviz pe VANZARI_CORESP).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_aviz_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
LOCAL lcSql, lnSucces
lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip=4 ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ;
[and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz')
STRTOFILE('aviz(fara luna): ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz'),RECCOUNT('v_cand_aviz'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnSucces < 0
STRTOFILE('eroare: ' + goExecutor.oPrelucrareEroare() + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
IF USED('v_cand_aviz')
SELECT v_cand_aviz
SCAN
STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_aviz
ENDIF
goExecutor.oReset()
*!* fara restrictia de luna curenta, doar sa vedem daca exista vreun aviz cu sursa in tot arhivul
lcSql = [select v.id_vanzare, v.tip, v.cod, v.data_act from vanzari v where v.sters=0 and v.tip=4 ] + ;
[and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ;
[and rownum <= 10 order by v.data_act desc]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz2')
STRTOFILE('aviz(orice data): ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz2'),RECCOUNT('v_cand_aviz2'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF lnSucces < 0
STRTOFILE('eroare: ' + goExecutor.oPrelucrareEroare() + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
IF USED('v_cand_aviz2')
SELECT v_cand_aviz2
SCAN
STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' data_act=' + TRANSFORM(data_act) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_aviz2
ENDIF
goExecutor.oReset()
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,88 @@
* probe_s9_candidati.prg
* Cauta, read-only, cate un document editabil de fiecare familie pentru testul S9-1/S9-2:
* aviz (tip=4, cu avize sursa reale), comanda (tip in 3,21,25,28,42,47, cu id_comanda), contract
* (tip in 2,6,26,52, cu id_ctr), ELSE (fara comanda/ctr/aviz sursa). Luna curenta, sters=0,
* fara urmasi, fara eproforma, fara efactura.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_candidati_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lcSql, lnSucces
*!* aviz cu avize sursa reale (VANZARI_CORESP TIP=1)
lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip=4 ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ;
[and not exists (select 1 from vanzari_coresp c where c.id_vanzare_sursa=v.id_vanzare and c.sters=0) ] + ;
[and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz')
STRTOFILE('aviz: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz'),RECCOUNT('v_cand_aviz'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_aviz')
SELECT v_cand_aviz
SCAN
STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_aviz
ENDIF
goExecutor.oReset()
*!* comanda, cu id_comanda populat
lcSql = [select v.id_vanzare, v.tip, v.cod, v.id_comanda from vanzari v where v.sters=0 and v.tip in (3,21,25,28,42,47) ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_comanda is not null and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_cmd')
STRTOFILE('comanda: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_cmd'),RECCOUNT('v_cand_cmd'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_cmd')
SELECT v_cand_cmd
SCAN
STRTOFILE(' comanda cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' id_comanda=' + TRANSFORM(id_comanda) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_cmd
ENDIF
goExecutor.oReset()
*!* contract, cu id_ctr populat
lcSql = [select v.id_vanzare, v.tip, v.cod, v.id_ctr from vanzari v where v.sters=0 and v.tip in (2,6,26,52) ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_ctr is not null and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_ctr')
STRTOFILE('contract: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_ctr'),RECCOUNT('v_cand_ctr'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_ctr')
SELECT v_cand_ctr
SCAN
STRTOFILE(' contract cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' id_ctr=' + TRANSFORM(id_ctr) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_ctr
ENDIF
goExecutor.oReset()
*!* ELSE: tip fara comanda/ctr, fara aviz sursa (asteptam listaid = '')
lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip not in (3,21,25,28,42,47,4,2,6,26,52,44,45,46,51) ] + ;
[and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ;
[ and v.eproforma=0 and v.id_comanda is null and v.id_ctr is null and rownum <= 5]
lnSucces = goExecutor.oExecute(lcSql, 'v_cand_else')
STRTOFILE('else: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_else'),RECCOUNT('v_cand_else'),-1)) + CHR(13) + CHR(10), gcErrLog, 1)
IF USED('v_cand_else')
SELECT v_cand_else
SCAN
STRTOFILE(' else cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1)
ENDSCAN
USE IN v_cand_else
ENDIF
goExecutor.oReset()
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,183 @@
* probe_trace_editare.prg - trace pas cu pas a do_editare_unificata (replica, read-only in afara de
* obiectele in memorie) pe documentele 1055 (PASS) si 1113 (FAIL), ca sa gaseasca unde diverg.
* Diagnostic pentru docs\triaj_s8_regresie_28fail.md. Nu scrie in Oracle.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_trace_editare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
PROCEDURE Traseaza(tcDoc, tcMsg)
STRTOFILE(tcDoc + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*!* driver minimal: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms si il elibereaza, ca sa nu
*!* blocheze la infinit modalul din proba (acelasi tipar ca driverS8p7 din test_s8_pas7_cablare.prg)
DEFINE CLASS driverTrace AS Custom
lBusy = .F.
lGasit = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
LOCAL lnI, loFrm2
TRY
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
STRTOFILE('driverTrace: gasit form, WindowType=' + Transform(loFrm2.WindowType) + CHR(13) + CHR(10), gcErrLog, 1)
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcTrace
STRTOFILE('driverTrace EROARE ' + Transform(loExcTrace.ErrorNo) + ' ' + loExcTrace.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE
PUBLIC goDriverTrace
goDriverTrace = Createobject('driverTrace')
_SCREEN.AddObject('tmrTrace', 'Timer')
_SCREEN.tmrTrace.Interval = 150
Bindevent(_SCREEN.tmrTrace, 'Timer', goDriverTrace, 'Executa')
_SCREEN.tmrTrace.Enabled = .T.
PROCEDURE VerificaTrace
LPARAMETERS tnIdVanzare
LOCAL lcDoc, lnSucces, lcSchema, lcSelect, lcOrder, lcFiltru
lcDoc = Transform(tnIdVanzare)
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare = ] + lcDoc
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
DO Traseaza WITH lcDoc, 'crsfacturi Reccount=' + Transform(Reccount('crsfacturi'))
LOCAL lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta
Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare, poDate
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare
Select crsfacturi
lnIdVanzare = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
DO Traseaza WITH lcDoc, 'garzi: sters=' + Transform(lnSters) + ' eproforma=' + Transform(llEProforma) + ' tip=' + Transform(lnTipDoc) + ;
' luna_ok=' + Transform((pnAn*12+pnLuna)==(gnAn*12+gnLuna)) + ' referinte=' + Transform(ReferinteDocumenteNota(pnAn,pnLuna,lnCod)) + ;
' efactura=' + Transform(EsteInEFactura(lnIdFact)) + ' urmasi=' + Transform(DocumentAreUrmasi(lnIdVanzare))
poDate = IncarcaAntetFacturaEditare(lnIdVanzare, @pnDiscountRon, @pnDiscountValuta)
DO Traseaza WITH lcDoc, 'IncarcaAntetFacturaEditare Vartype=' + Vartype(poDate)
IF Vartype(poDate) <> 'O'
DO Traseaza WITH lcDoc, 'ABANDON: poDate nu e obiect'
RETURN
ENDIF
DO Traseaza WITH lcDoc, 'poDate.tip=' + Transform(poDate.tip) + ' poDate.incasat=' + Transform(poDate.incasat) + ' poDate.lEditare=' + Transform(poDate.lEditare) + ' poDate.ntip_incasare=' + Transform(poDate.ntip_incasare)
IncarcaLiniiFacturaEditare(poDate, lnIdVanzare)
DO Traseaza WITH lcDoc, 'IncarcaLiniiFacturaEditare terminat'
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF Used('jtva_coloane')
Use In jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ELSE
Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ENDIF
DO Traseaza WITH lcDoc, 'jtva_coloane pregatit'
loForm = Createobject('frm_facturare_articole2')
DO Traseaza WITH lcDoc, 'Createobject Vartype=' + Vartype(loForm)
IF Vartype(loForm) <> 'O'
DO Traseaza WITH lcDoc, 'ABANDON: loForm nu e obiect'
RETURN
ENDIF
DO Traseaza WITH lcDoc, 'loForm.WindowType=' + Transform(loForm.WindowType) + ' Visible=' + Transform(loForm.Visible)
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
DO Traseaza WITH lcDoc, 'do_calculeaza_totaluri terminat, ntotalron=' + Transform(loForm.ntotalron)
DO Traseaza WITH lcDoc, 'inainte de Show(), FormCount=' + Transform(_SCREEN.FormCount)
goDriverTrace.Reseteaza()
loForm.Show()
DO Traseaza WITH lcDoc, 'DUPA Show() - a revenit, lGasit=' + Transform(goDriverTrace.lGasit) + ' gcMockUltimMesaj=[' + gcMockUltimMesaj + ']'
TRY
loForm.Release()
CATCH
ENDTRY
ENDPROC
DO VerificaTrace WITH 1055
DO VerificaTrace WITH 1113
_SCREEN.tmrTrace.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrTrace')
CATCH
ENDTRY
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,42 @@
* probe_triaj_incasare.prg - diagnostic read-only, triaj regresie 28 FAIL (docs\triaj_s8_regresie_28fail.md)
* Interogheaza campurile relevante pentru bugul din actualizeaza_tipincasare / seteaza_mod_incasare
* pe cele 4 documente vechi (1113,1055,1048,1130) + cele 2 noi (1071,1072), sa gaseasca ce le diferentiaza.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_triaj_incasare_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
LOCAL lnSucces, lcSql
lcSql = [select id_vanzare, tip, eproforma, sters, in_valuta, incasat, tip_incasare, ] + ;
[nr_incasare, serie_chit from fact_vfacturi where id_vanzare in (1113,1055,1048,1130,1071,1072) order by id_vanzare]
lnSucces = goExecutor.oExecute(lcSql, 'crsProbe')
goExecutor.oReset()
IF lnSucces < 0
STRTOFILE('EROARE query: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SELECT crsProbe
SCAN
STRTOFILE(TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' eproforma=' + TRANSFORM(eproforma) + ;
' sters=' + TRANSFORM(sters) + ' in_valuta=' + TRANSFORM(in_valuta) + ' incasat=' + TRANSFORM(Nvl(incasat,-1)) + ;
' tip_incasare=' + TRANSFORM(Nvl(tip_incasare,-1)) + ;
' nr_incasare=' + TRANSFORM(Nvl(nr_incasare,-1)) + ;
' serie_chit=[' + TRANSFORM(Nvl(serie_chit,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDSCAN
USE IN crsProbe
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT

View File

@@ -0,0 +1,54 @@
===== B1: randuri DOCUMENTE scrise prin ramura NOT MATCHED, DUPA aplicare (8010204..8010208) =====
===== comparate cu randurile scrise prin INSERT-ul vechi, INAINTE de aplicare (8010196..8010203) =====
ID_DOC DATAORA ID_UTIL STERS DATAORAS ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG TIP_SAFT
---------- ------------------- ---------- ---------- ------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ----------
8010196 03.09.2026 06:37:00 8 0 0 0 SSS 594 26.08.2026 25021 26.08.2026
8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026
8010198 03.09.2026 06:40:14 8 0 0 0 SSS 595 26.08.2026 25021 26.08.2026
8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026
8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026
8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026
8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026
8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026
8010204 03.09.2026 08:37:25 8 1 03.09.2026 08:41:30 8 0 SSS 602 26.08.2026 25021 26.08.2026
8010205 03.09.2026 08:37:25 8 1 03.09.2026 08:41:11 8 0 67 26.08.2026 25021 26.08.2026
8010206 03.09.2026 08:41:11 8 1 03.09.2026 08:41:30 8 0 67 26.08.2026 25021 26.08.2026
8010207 03.09.2026 08:41:30 8 1 03.09.2026 08:41:46 8 0 67 26.08.2026 25021 26.08.2026
8010208 03.09.2026 08:41:46 8 1 03.09.2026 08:41:47 8 0 67 26.08.2026 25021 26.08.2026
8017983 03.09.2026 08:41:30 8 0 03.09.2026 08:41:47 8 0 SSS 602 26.08.2026 25021 26.08.2026
14 rows selected.
===== coloane care difera intre lotul INAINTE si lotul DUPA (asteptat: niciuna, in afara de id_doc/dataora/nract) =====
COLOANA VALORI_DISTINCTE
-------- ----------------
ID_UTIL 1
STERS 1
ID_UTILS 2
ID_SET 1
DATAIREG 1
5 rows selected.
===== totaluri DOCUMENTE dupa toate probele =====
TOTAL STERS1 STERS0 MAX_ID_DOC
---------- ---------- ---------- ----------
37564 370 37194 8017983
1 row selected.
===== igiena: id_doc duplicat (trebuie gol) =====
no rows selected
===== marcaj VERSIUNE =====
SCRIPT_FINAL TIP_SCRIPT DATA_SCRIP SEQ_SCRIPT
---------------------------------------------------------------------------------------------------- -------------------------------------------------- ---------- ----------
wip13_2026_09_03_01_COMUN_PACK_CONTAFIN.sql COMUN_PACK_CONTAFIN 03.09.2026 1
1 row selected.

View File

@@ -0,0 +1,38 @@
===== SNAPSHOT DOCUMENTE, INAINTE DE APLICAREA S9-6 =====
MOMENTUL
-------------------
03.09.2026 08:28:34
1 row selected.
===== totaluri =====
TOTAL STERS1 STERS0 MAX_ID_DOC
---------- ---------- ---------- ----------
37557 363 37194 8010203
1 row selected.
===== ultimele 15 randuri scrise (dataora desc) =====
ID_DOC DATAORA ID_UTIL STERS DATAORAS ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG TIP_SAFT
---------- -------------------- ---------- ---------- -------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ----------
8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026
8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026
8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026
8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026
8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026
8010198 03.09.2026 06:40:14 8 0 0 0 SSS 595 26.08.2026 25021 26.08.2026
8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026
8010196 03.09.2026 06:37:00 8 0 0 0 SSS 594 26.08.2026 25021 26.08.2026
8010181 02.09.2026 06:43:33 8 0 0 1 SSS 691 31.08.2026 25000 31.08.2026
8010180 02.09.2026 06:43:30 8 0 0 1 SSS 690 31.08.2026 25000 31.08.2026
8010179 02.09.2026 06:09:51 8 0 0 1 SSS 689 31.08.2026 25000 31.08.2026
8010178 02.09.2026 06:09:48 8 0 0 1 SSS 688 31.08.2026 25000 31.08.2026
8010177 02.09.2026 05:50:46 8 0 0 1 SSS 687 31.08.2026 25000 31.08.2026
8010176 02.09.2026 05:50:43 8 0 0 1 SSS 686 31.08.2026 25000 31.08.2026
8010175 01.09.2026 21:58:18 8 0 0 1 SSS 684 31.08.2026 25000 31.08.2026
15 rows selected.

View File

@@ -0,0 +1,61 @@
===== SNAPSHOT DOCUMENTE, DUPA S9-7 (rularea 1, control negativ A) =====
MOMENTUL
-------------------
03.09.2026 10:25:18
===== totaluri =====
TOTAL STERS1 STERS0 MAX_ID_DOC
---------- ---------- ---------- ----------
37566 372 37194 8017983
===== ultimele 15 randuri scrise (dataora_raw desc) =====
ID_DOC DATAORA_FMT ID_UTIL STERS DATAORAS_FMT ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT_FM ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG_F
---------- ------------------- ---------- ---------- ------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ----------
TIP_SAFT DATAORA_R
---------- ---------
8010211 03.09.2026 10:21:30 8 0 0 0 SSS 608 26.08.2026 25021 26.08.2026
03-SEP-26
8010210 03.09.2026 10:16:52 8 0 0 0 SSS 604 26.08.2026 25021 26.08.2026
03-SEP-26
8010209 03.09.2026 08:41:47 8 0 0 0 67 26.08.2026 25021 26.08.2026
03-SEP-26
8010208 03.09.2026 08:41:46 8 1 03.09.2026 08:41:47 8 0 67 26.08.2026 25021 26.08.2026
03-SEP-26
8017983 03.09.2026 08:41:30 8 0 03.09.2026 08:41:47 8 0 SSS 602 26.08.2026 25021 26.08.2026
03-SEP-26
8010207 03.09.2026 08:41:30 8 1 03.09.2026 08:41:46 8 0 67 26.08.2026 25021 26.08.2026
03-SEP-26
8010206 03.09.2026 08:41:11 8 1 03.09.2026 08:41:30 8 0 67 26.08.2026 25021 26.08.2026
03-SEP-26
8010204 03.09.2026 08:37:25 8 1 03.09.2026 08:41:30 8 0 SSS 602 26.08.2026 25021 26.08.2026
03-SEP-26
8010205 03.09.2026 08:37:25 8 1 03.09.2026 08:41:11 8 0 67 26.08.2026 25021 26.08.2026
03-SEP-26
8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026
03-SEP-26
8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026
03-SEP-26
8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026
03-SEP-26
8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026
03-SEP-26
8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026
03-SEP-26
8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026
03-SEP-26

View File

@@ -0,0 +1,233 @@
* test_id_part_rez.prg
* Proba tintita pentru reparatia sectiunii 3.3 din docs\propunere_comparatie_coloane_crsfactura.md:
* id_part_rez / id_lucrare_rez trebuie sa fie refacute la editare din rulajul original (RUL), nu sa
* ramana NULL. Sursa propusa in document (VANZARI_DETALII) NU are aceste coloane - se probeaza si
* asta, plus faptul ca VVANZARI_ARTICOLE nu le expune, deci valoarea gasita in crsfactura nu poate
* veni din alta parte. Nimic nu se scrie in Oracle: doar SELECT si incarcarea in cursoare.
*
* Caz 1 (doc 872, rezervare reala): RUL are un rand cu id_part_rez = 742 si id_lucrare_rez NULL.
* Caz 2 (doc 951, rezervare absenta scrisa ca 0): randul RUL are 0 pe ambele; 0 trebuie pastrat ca 0,
* nu convertit in NULL si nici NULL convertit in 0.
* Caz 3 (premisele): VANZARI_DETALII fara coloane, VVANZARI_ARTICOLE fara coloane, RUL cu ambele.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_id_part_rez_log.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
DO Premise
DO CazDocument WITH 872, 742, .T.
DO CazDocument WITH 951, 0, .F.
STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
* Premise: nici tabela propusa in document, nici view-ul sursa nu au coloanele; RUL le are.
*==============================================================================================
PROCEDURE Premise
LOCAL lcSql
STRTOFILE(CHR(13) + CHR(10) + '--- PREMISE ---' + CHR(13) + CHR(10), gcErrLog, 1)
lcSql = [select count(*) as nr from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'VANZARI_DETALII' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')]
DO AssertaSql WITH 'VANZARI_DETALII NU are coloanele (varianta (a) din propunere e imposibila)', lcSql, 0
lcSql = [select count(*) as nr from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'VVANZARI_ARTICOLE' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')]
DO AssertaSql WITH 'VVANZARI_ARTICOLE NU expune coloanele', lcSql, 0
lcSql = [select count(*) as nr from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ;
[and table_name = 'RUL' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')]
DO AssertaSql WITH 'RUL are ambele coloane (singura sursa la editare)', lcSql, 2
ENDPROC
*==============================================================================================
* CazDocument: incarca documentul si compara crsfactura cu RUL, rand cu rand.
* tnIdV - id_vanzare
* tnPartAstept - valoarea id_part_rez asteptata pe cel putin o linie
* tlLucrNull - .T. daca id_lucrare_rez din RUL e NULL pe acea linie
*==============================================================================================
PROCEDURE CazDocument
LPARAMETERS tnIdV, tnPartAstept, tlLucrNull
LOCAL lcSql, lnDiscRon, lnDiscVal, lnPotriviri, lnPart, lnLucr, lnNule, lnStrict, lcPref
lcPref = 'D' + TRANSFORM(tnIdV) + ' '
STRTOFILE(CHR(13) + CHR(10) + '--- CAZ document ' + TRANSFORM(tnIdV) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1)
*!* sursa independenta: randurile RUL ale documentului, exact ca in productie
IF USED('crs_rul_astept')
USE IN crs_rul_astept
ENDIF
lcSql = [select r.id_articol, r.id_gestiune, Nvl(r.cont,' ') as cont, r.pret, ] + ;
[Nvl(r.serie,' ') as serie, r.cante as cantitate, r.pretv, r.id_tip_rulaj, ] + ;
[r.id_part_rez, r.id_lucrare_rez ] + ;
[from rul r, vanzari v ] + ;
[where v.id_vanzare = ] + ALLTRIM(STR(tnIdV)) + ;
[ and r.cod = v.cod and r.sters = 0 and r.cante <> 0 ] + ;
[order by r.id_tip_rulaj desc, r.id_rul]
IF !goExecutor.oExecuta(lcSql, 'crs_rul_astept')
DO Asserta WITH lcPref + 'randurile RUL s-au citit', .F., 'oExecuta a esuat'
RETURN
ENDIF
goExecutor.oReset()
DO Asserta WITH lcPref + 'documentul are randuri RUL', RECCOUNT('crs_rul_astept') > 0, TRANSFORM(RECCOUNT('crs_rul_astept'))
*!* incarcarea reala
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal)
DO Asserta WITH lcPref + 'antetul s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdV)
DO Asserta WITH lcPref + 'crsfactura are linii', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
*!* comparatia rand cu rand, pe aceeasi cheie ca productia
lnPotriviri = 0
lnPart = 0
lnLucr = 0
lnNule = 0
lnStrict = 0
SELECT crsfactura
SCAN FOR gestionabil = 1
SELECT crs_rul_astept
LOCATE FOR id_articol = crsfactura.id_articol AND id_gestiune = crsfactura.id_gestiune ;
AND ALLTRIM(cont) == ALLTRIM(crsfactura.Cont) AND pret = crsfactura.pret_achizitie ;
AND ALLTRIM(serie) == ALLTRIM(NVL(crsfactura.serie,[])) AND cantitate = crsfactura.cantitate
IF FOUND()
lnPotriviri = lnPotriviri + 1
*!* pretv_orig populat din acelasi rand = dovada ca potrivirea chiar a avut loc
IF crsfactura.pretv_orig = NVL(crs_rul_astept.pretv, -987654)
lnStrict = lnStrict + 1
ENDIF
IF ISNULL(crs_rul_astept.id_part_rez) = ISNULL(crsfactura.id_part_rez) ;
AND NVL(crs_rul_astept.id_part_rez, -1) = NVL(crsfactura.id_part_rez, -1)
lnPart = lnPart + 1
ENDIF
IF ISNULL(crs_rul_astept.id_lucrare_rez) = ISNULL(crsfactura.id_lucrare_rez) ;
AND NVL(crs_rul_astept.id_lucrare_rez, -1) = NVL(crsfactura.id_lucrare_rez, -1)
lnLucr = lnLucr + 1
ENDIF
STRTOFILE(' id_temp=' + TRANSFORM(crsfactura.id_temp) + ;
' art=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ;
' cant=' + TRANSFORM(crsfactura.cantitate) + ;
' pretv_orig=' + TRANSFORM(crsfactura.pretv_orig) + ;
' id_part_rez=' + IIF(ISNULL(crsfactura.id_part_rez), 'NULL', TRANSFORM(crsfactura.id_part_rez)) + ;
' id_lucrare_rez=' + IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez)) + ;
' potrivit=da' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
*!* fara potrivire in RUL nu exista sursa: valoarea trebuie sa ramana NULL
IF ISNULL(crsfactura.id_part_rez) AND ISNULL(crsfactura.id_lucrare_rez)
lnNule = lnNule + 1
ENDIF
STRTOFILE(' id_temp=' + TRANSFORM(crsfactura.id_temp) + ;
' art=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ;
' cant=' + TRANSFORM(crsfactura.cantitate) + ;
' id_part_rez=' + IIF(ISNULL(crsfactura.id_part_rez), 'NULL', TRANSFORM(crsfactura.id_part_rez)) + ;
' id_lucrare_rez=' + IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez)) + ;
' potrivit=nu' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
SELECT crsfactura
ENDSCAN
DO Asserta WITH lcPref + 'exista cel putin o linie potrivita in RUL (proba nu e vida)', ;
lnPotriviri > 0, TRANSFORM(lnPotriviri)
DO Asserta WITH lcPref + 'pretv_orig e cel din RUL pe toate liniile potrivite', ;
lnStrict = lnPotriviri AND lnPotriviri > 0, TRANSFORM(lnStrict) + '/' + TRANSFORM(lnPotriviri)
DO Asserta WITH lcPref + 'id_part_rez identic cu RUL pe toate liniile potrivite (NULL ramane NULL)', ;
lnPart = lnPotriviri AND lnPotriviri > 0, TRANSFORM(lnPart) + '/' + TRANSFORM(lnPotriviri)
DO Asserta WITH lcPref + 'id_lucrare_rez identic cu RUL pe toate liniile potrivite (NULL ramane NULL)', ;
lnLucr = lnPotriviri AND lnPotriviri > 0, TRANSFORM(lnLucr) + '/' + TRANSFORM(lnPotriviri)
*!* valoarea concreta asteptata pe document, ca sa nu treaca o comparatie NULL = NULL
SELECT crsfactura
LOCATE FOR gestionabil = 1 AND !ISNULL(id_part_rez) AND id_part_rez = tnPartAstept
DO Asserta WITH lcPref + 'exista o linie cu id_part_rez = ' + TRANSFORM(tnPartAstept), ;
FOUND(), IIF(FOUND(), 'gasita', 'lipseste')
IF FOUND()
IF tlLucrNull
DO Asserta WITH lcPref + 'pe acea linie id_lucrare_rez a ramas NULL', ;
ISNULL(crsfactura.id_lucrare_rez), IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez))
ELSE
DO Asserta WITH lcPref + 'pe acea linie id_lucrare_rez nu e NULL', ;
!ISNULL(crsfactura.id_lucrare_rez), IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez))
ENDIF
ENDIF
STRTOFILE(' (linii fara potrivire RUL, ramase NULL pe ambele: ' + TRANSFORM(lnNule) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
USE IN crs_rul_astept
IF USED('crsfactura')
USE IN crsfactura
ENDIF
ENDPROC
*==============================================================================================
PROCEDURE AssertaSql
LPARAMETERS tcNume, tcSql, tnAsteptat
LOCAL lnGasit
lnGasit = -1
IF goExecutor.oExecuta(tcSql, 'crs_assert_sql')
lnGasit = NVL(crs_assert_sql.nr, -1)
USE IN crs_assert_sql
ENDIF
goExecutor.oReset()
DO Asserta WITH tcNume, lnGasit = tnAsteptat, TRANSFORM(lnGasit) + ' (asteptat ' + TRANSFORM(tnAsteptat) + ')'
ENDPROC
PROCEDURE Asserta
LPARAMETERS tcNume, tlConditie, tcDetaliu
IF tlConditie
gnPass = gnPass + 1
STRTOFILE(' OK ' + tcNume + ' [' + tcDetaliu + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE(' FAIL ' + tcNume + ' [' + tcDetaliu + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,334 @@
* test_s10_cablare_vfp.prg
* Proba de cablare S10 (docs\raport_s10_cablare_vfp.md) - LIMITA semnalata explicit in
* docs\propunere_s10_proc_tvav.md §11.0: test_s10_proc_tvav.prg dovedeste ca pachetul Oracle
* (CASE-ul din PACK_FACTURARE.adauga_articol_factura) respecta flag-ul/parametrul nou, dar apeleaza
* pack_facturare DIRECT - nu dovedeste ca frm_facturare_articole2.do_scrie_articole (ofacturare.vc2,
* diff-ul din propunere §8) chiar APRINDE pack_facturare.nregenerare_editare si chiar TRIMITE al
* 28-lea argument. Aceasta proba umple exact acel gol.
*
* Metoda: mock pe goExecutor care CAPTUREAZA lcSql-ul trimis prin oExecute()/oExecuta(), FARA sa
* execute nimic in Oracle (tiparul S4e-5, verificare pe sirul SQL construit, nu pe rezultatul
* Oracle). Documentul se incarca REAL (IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare,
* tiparul test_s9_8_flux.prg) - CITIRE, cu goExecutor REAL, inainte de orice mock; abia dupa
* incarcare se inlocuieste goExecutor cu mock-ul, inainte de a chema loForm.do_scrie_articole().
* Rezultat: ZERO scriere reala, nici in Oracle, nici in VANZARI_DETALII_TEMP - captura e strict pe
* text, nu pe efect.
*
* Parametru tnCaz:
* 1 = flag=0 (plRegenerareEditare NEDECLARAT - RELEASE explicit inainte, ca sa fie sigur Type()='U',
* exact starea unei prime emiteri, fara nicio regenerare in curs). Asterturi:
* - lcSql contine "pack_facturare.nregenerare_editare := 0"
* - fiecare apel adauga_articol_factura din text are 28 argumente (parametrul nou se trimite
* oricum, necondiționat - Oracle il ignora fara flag, cf. §11.0/§7.3 din propunere)
* 2 = flag=1 (plRegenerareEditare = .T., PRIVATE, cu poSnapshotEditare minimal construit ca sa
* treaca garda din StergeDocumentFacturare - an/luna = perioada activa, id_fact=0 ca sa sara
* peste ForteazaIdFactReemitere). Asterturi:
* - lcSql contine "pack_facturare.nregenerare_editare := 1"
* - fiecare apel adauga_articol_factura din text are 28 argumente
* - ORDINEA: "initializeaza_date_factura" apare INAINTEA lui "nregenerare_editare := 1" in
* acelasi sir - daca ordinea ar fi inversa, reset-ul din initializeaza_date_factura (aplicat
* pe Oracle, verificat la runtime in docs\raport_s10_aplicare_oracle.md §4.1) ar sterge
* flag-ul tacit, exact defectul pe care insertia din propunere §8.1 il evita prin ancorare
* DUPA capatul apelului la initializeaza_date_factura.
*
* Document folosit: 630 (CONTRACT-A din test_s9_8_flux.prg rularea 5 - driver deja validat pe el).
* Cursorul crsfactura e curatat local (explicatie/serie/lot golite, opt_facturare fortat la 0 pe
* toate randurile) DOAR in memorie, ca sa garanteze ca (a) textul capturat n-are ")" accidental
* intr-un camp text si (b) toate randurile cad pe branch-ul adauga_articol_factura, nu pe
* adauga_rata_factura (poArt.opt_facturare in (1,2)) - fara asta proba n-ar mai testa ce trebuie.
* Documentul real din baza NU e atins - toate modificarile sunt pe cursorul local incarcat in RAM.
*
* Tranzactia: do_scrie_articole() (ofacturare.vc2:19842) deschide Transactions=2 pe gnHandle
* (conexiunea REALA - SQLSetprop, nu goExecutor) si NU o inchide pe ramura de succes (o lasa
* deschisa pentru do_scrie_factura, care nu se apeleaza aici) - ROLLBACK explicit dupa fiecare caz,
* direct pe gnHandle, indiferent de rezultat.
LPARAMETERS tnCaz
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s10_cablare_vfp_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' caz=' + TRANSFORM(tnCaz) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
LOCAL lnCaz
lnCaz = VAL(TRANSFORM(tnCaz))
DO CASE
CASE lnCaz = 1
DO CazFlag WITH .F.
CASE lnCaz = 2
DO CazFlag WITH .T.
OTHERWISE
STRTOFILE('EROARE: tnCaz trebuie sa fie 1 (flag=0) / 2 (flag=1)' + CHR(13) + CHR(10), gcErrLog, 1)
ENDCASE
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
* CazFlag: incarca REAL doc 630, curata local crsfactura, apeleaza loForm.do_scrie_articole() cu
* goExecutor MOCKAT (nicio scriere reala), verifica textul capturat.
*==============================================================================================
PROCEDURE CazFlag
LPARAMETERS tlFlagPornit
LOCAL loForm, loMock, loExecutorReal, lnIdV, lcPrefix
lnIdV = 630
lcPrefix = IIF(m.tlFlagPornit, 'FLAG1', 'FLAG0')
DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(lnIdV) + ' e viu (STERS=0)', ;
Val1([select count(*) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV) + [ and sters = 0]) = 1, ;
TRANSFORM(Val1([select count(*) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV) + [ and sters = 0]))
LOCAL lnDiscRon, lnDiscVal
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH lcPrefix + '-0a antetul documentului ' + TRANSFORM(lnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
DO asserteaza WITH lcPrefix + '-0b liniile documentului ' + TRANSFORM(lnIdV) + ' s-au incarcat', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
*!* curatare LOCALA (doar cursorul din RAM): (a) fara ")" accidental in text, (b) toate randurile
*!* pe branch-ul adauga_articol_factura, (c) fara NULL pe niciun camp NUMERIC folosit NEprotejat
*!* (fara Nvl()/Iif(Isnull())) in constructia lcSql din do_scrie_articole (ofacturare.vc2:19978-
*!* 20001) - un NULL real pe orice document istoric prabuseste tot sirul concatenat la NULL
*!* (VFP propaga NULL prin "+"), descoperit la runtime: PCOUNT()=1 dar VARTYPE(tcSql)='X' (NULL)
SELECT crsfactura
REPLACE ALL ;
id_temp WITH NVL(id_temp,0), id_articol WITH NVL(id_articol,0), ;
pret_achizitie WITH NVL(pret_achizitie,0), cu_tva WITH NVL(cu_tva,0), tip_valuta WITH NVL(tip_valuta,0), ;
pretftva WITH NVL(pretftva,0), vpretftva WITH NVL(vpretftva,0), ;
pretctva WITH NVL(pretctva,0), vpretctva WITH NVL(vpretctva,0), ;
id_valuta WITH NVL(id_valuta,0), gestionabil WITH NVL(gestionabil,0), cantitate WITH NVL(cantitate,0), ;
discountftva WITH NVL(discountftva,0), vdiscountftva WITH NVL(vdiscountftva,0), ;
discountctva WITH NVL(discountctva,0), vdiscountctva WITH NVL(vdiscountctva,0), ;
Curs WITH NVL(Curs,1), multiplicator WITH NVL(multiplicator,1), id_jtva_coloana WITH NVL(id_jtva_coloana,0), ;
pretv_orig WITH NVL(pretv_orig,0), ;
explicatie WITH 'test-s10-cablare', serie WITH '', lot WITH '', opt_facturare WITH 0 ;
IN crsfactura
*!* REPLACE ALL lasa pointerul pe EOF - Scan (folosit de do_scrie_articole) porneste de la
*!* POZITIA CURENTA, nu de la Top - fara acest GO TOP, bucla de articole rula 0 iteratii
GO TOP IN crsfactura
LOCAL lnRandurAsteptate
lnRandurAsteptate = RECCOUNT('crsfactura')
loForm = CREATEOBJECT('frm_facturare_articole2')
IF m.tlFlagPornit
PRIVATE plRegenerareEditare
PUBLIC poSnapshotEditare
plRegenerareEditare = .T.
poSnapshotEditare = CREATEOBJECT('Empty')
AddProperty(poSnapshotEditare, 'id_vanzare', m.lnIdV)
AddProperty(poSnapshotEditare, 'cod', 1)
AddProperty(poSnapshotEditare, 'an', gnAn)
AddProperty(poSnapshotEditare, 'luna', gnLuna)
AddProperty(poSnapshotEditare, 'id_fact', 0)
ELSE
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
ENDIF
*!* dupa acest punct: NICIO citire/scriere reala in Oracle - totul trece prin mock
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS10Cablare')
goExecutor = loMock
LOCAL llReturn
llReturn = loForm.do_scrie_articole()
*!* ROLLBACK explicit pe conexiunea REALA - do_scrie_articole nu inchide tranzactia pe succes
*!* (o lasa deschisa pentru do_scrie_factura, care nu se apeleaza aici)
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
DO asserteaza WITH lcPrefix + '-1 do_scrie_articole() a intors .T. (nicio eroare in constructia sirului)', llReturn, TRANSFORM(llReturn)
STRTOFILE(lcPrefix + ' apeluri capturate de mock: ' + TRANSFORM(loMock.nApeluri) + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(lcPrefix + ' --- lcSql capturat ---' + CHR(13) + CHR(10) + loMock.cSqlCapturat + CHR(13) + CHR(10), gcErrLog, 1)
LOCAL lcAsteptat
lcAsteptat = 'pack_facturare.nregenerare_editare := ' + IIF(m.tlFlagPornit, '1', '0') + ';'
DO asserteaza WITH lcPrefix + '-2 lcSql contine [' + lcAsteptat + ']', ;
lcAsteptat $ loMock.cSqlCapturat, IIF(lcAsteptat $ loMock.cSqlCapturat, 'gasit', 'LIPSA')
IF m.tlFlagPornit
LOCAL lnPozInit, lnPozFlag
lnPozInit = AT('initializeaza_date_factura', loMock.cSqlCapturat)
lnPozFlag = AT('nregenerare_editare := 1', loMock.cSqlCapturat)
DO asserteaza WITH lcPrefix + '-3 ORDINE: initializeaza_date_factura (pozitia ' + TRANSFORM(lnPozInit) + ;
') apare INAINTEA nregenerare_editare := 1 (pozitia ' + TRANSFORM(lnPozFlag) + ')', ;
lnPozInit > 0 AND lnPozFlag > 0 AND lnPozInit < lnPozFlag, ;
TRANSFORM(lnPozInit) + ' vs ' + TRANSFORM(lnPozFlag)
ENDIF
*!* AT() cu al treilea parametru (nr. de ordine al aparitiei) - gaseste direct a n-a aparitie,
*!* fara iterare manuala pe substring-uri
LOCAL lnNrApeluriAdauga, lnN, lnPozGasit, lnPozInceputArg, lnPozSfarsitRel, lcSegmentArg, lnVirgule
lnNrApeluriAdauga = 0
lnN = 0
DO WHILE .T.
lnN = lnN + 1
lnPozGasit = AT('adauga_articol_factura(', loMock.cSqlCapturat, lnN)
IF lnPozGasit = 0
EXIT
ENDIF
lnNrApeluriAdauga = lnNrApeluriAdauga + 1
lnPozInceputArg = lnPozGasit + LEN('adauga_articol_factura(')
lnPozSfarsitRel = AT(');', SUBSTR(loMock.cSqlCapturat, lnPozInceputArg))
lcSegmentArg = SUBSTR(loMock.cSqlCapturat, lnPozInceputArg, lnPozSfarsitRel - 1)
lnVirgule = OCCURS(',', lcSegmentArg)
DO asserteaza WITH lcPrefix + '-4.' + TRANSFORM(lnNrApeluriAdauga) + ' apelul #' + TRANSFORM(lnNrApeluriAdauga) + ;
' la adauga_articol_factura are 28 argumente (27 virgule)', lnVirgule = 27, TRANSFORM(lnVirgule) + ' virgule -> ' + TRANSFORM(lnVirgule + 1) + ' argumente'
ENDDO
DO asserteaza WITH lcPrefix + '-5 numarul de apeluri adauga_articol_factura = numarul de randuri din crsfactura (' + TRANSFORM(lnRandurAsteptate) + ')', ;
lnNrApeluriAdauga = lnRandurAsteptate, TRANSFORM(lnNrApeluriAdauga) + ' vs ' + TRANSFORM(lnRandurAsteptate)
IF m.tlFlagPornit
IF TYPE('poSnapshotEditare') <> 'U'
RELEASE poSnapshotEditare
ENDIF
ENDIF
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
ENDPROC
*==============================================================================================
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
IF USED('v_val10c')
USE IN v_val10c
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val10c')
SELECT v_val10c
IF RECCOUNT('v_val10c') > 0
GO TOP
lnRet = NVL(v_val10c.v, -1)
ENDIF
USE IN v_val10c
ELSE
STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
*!* daca a ramas o tranzactie manuala deschisa dupa o eroare in mijlocul CazFlag, o inchidem
*!* aici - nu lasam conexiunea agatata pe Transactions=2
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* MockGoExecutorS10Cablare: captureaza fiecare lcSql trimis prin oExecute()/oExecuta(), fara sa
* execute NIMIC in Oracle. oExecuta cu alias de cursor creeaza un cursor GOL (0 randuri) cu acel
* nume - StergeDocumentFacturare (ofacturare_rutare_scriere.prg:344) citeste doar Reccount() pe
* cursoarele intoarse, niciodata continutul lor, deci 0 randuri il duce corect pe ramura
* "sterge_factura" (fara nota contabila de reversat) - ramura simpla, un singur oExecuta in plus,
* tot mockat.
*==============================================================================================
DEFINE CLASS MockGoExecutorS10Cablare AS Custom
cSqlCapturat = ''
nApeluri = 0
cEroare = ''
FUNCTION oExecute(tcSql)
THIS.nApeluri = THIS.nApeluri + 1
LOCAL lcDiagCrs
IF USED('crsfactura')
lcDiagCrs = ' [DIAG crsfactura: RECNO=' + TRANSFORM(RECNO('crsfactura')) + ' RECCOUNT=' + TRANSFORM(RECCOUNT('crsfactura')) + ' EOF=' + TRANSFORM(EOF('crsfactura')) + ' ALIAS()=' + ALIAS() + ']'
ELSE
lcDiagCrs = ' [DIAG crsfactura: NEUSED]'
ENDIF
THIS.cSqlCapturat = THIS.cSqlCapturat + '>>>APEL ' + TRANSFORM(THIS.nApeluri) + ' (oExecute) VARTYPE(tcSql)=' + VARTYPE(m.tcSql) + lcDiagCrs + CHR(13) + CHR(10) + TRANSFORM(m.tcSql) + CHR(13) + CHR(10)
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
THIS.cSqlCapturat = THIS.cSqlCapturat + '>>>APEL ' + TRANSFORM(THIS.nApeluri) + ' (oExecuta)' + CHR(13) + CHR(10) + TRANSFORM(m.tcSql) + CHR(13) + CHR(10)
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS10Cablare: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,421 @@
* test_s10_proc_tvav.prg
* Control negativ S10 (docs\propunere_s10_proc_tvav.md §10), PE COD NEMODIFICAT: dovedeste ca
* PACK_FACTURARE.adauga_articol_factura re-deriva PROC_TVAV, silentios, pe ramura contract SI pe
* ramura ELSE - inainte de a scrie diff-ul din runda 2.
*
* PROIECTARE REVIZUITA (fata de prima incercare din aceasta sesiune): apel DIRECT la
* pack_facturare.adauga_articol_factura, cu parametrii exact ca linia reala 1604 (doc 1055), nu
* prin tot lantul do_scrie_factura()/scrie_factura2 - acela a picat cu o eroare Oracle NELEGATA de
* S10 ("SQL statement parameter is required for non-prepared SQLEXEC() calls", pe scrie_factura2
* pentru documente CONTRACT reale - vezi §11 din propunere). Apelul direct testeaza EXACT
* mecanismul in discutie (CASE-ul din adauga_articol_factura), scrie doar in
* VANZARI_DETALII_TEMP (niciodata in VANZARI/VANZARI_DETALII/DOCUMENTE - zero risc, zero SSS ars,
* nimic de reparat la un document real) si e complet reversibil.
*
* EXTINDERE (aplicare Oracle, dupa scrierea diff-ului din §7 - vezi docs\raport_s10_aplicare_oracle.md):
* cazurile 3 si 4 folosesc parametrul nou V_PROC_TVAV_TEMP (pozitia 28) si flag-ul de pachet
* pack_facturare.nregenerare_editare, ca sa dovedeasca proba ceruta de decizia 3: cu flag=1 si
* V_PROC_TVAV_TEMP trimis, cota scrisa trebuie sa fie cea SALVATA, nu cea derivata. Cazurile 1/2
* raman NESCHIMBATE LA COD (apel cu 27 argumente, flag-ul niciodata atins) - proba de "neschimbat"
* e ca produc EXACT ACELASI TIPAR de PASS/FAIL dupa diff ca inainte (CTR-2/ELSE-2 continua sa PICE,
* adica tot re-deriva - flag-ul implicit 0 inseamna "override-ul nu se aplica", nu "comportament
* corect"), nu ca ar incepe sa treaca.
*
* Parametru tnCaz:
* 1 = CONTRACT - parametrii liniei reale 1604 (doc 1055: id_articol 4294507173, id_pol 41,
* pret 101.13, id_valuta 3, id_jtva_coloana 37, proc_tvav SALVAT 1.21), trimisi la
* adauga_articol_factura (27 argumente, flag neatins - ramane 0) cu V_ID_CTR = 61
* (CONTRACTE.OPT_FACTURARE NULL -> branch-ul principal, nu portita NO_DATA_FOUND). Setup:
* CRM_POLITICI_PRET_ART (id_pol_art 1593, acelasi articol/politica ca linia reala, azi
* PROC_TVAV NULL) -> 1.09; CTR_ARTICOLE nou care leaga contractul 61 de politica 1593
* (pret_unitar=0, ca sa nu amestece si divergenta de PRET - izolat strict pe PROC_TVAV).
* INAINTE si DUPA diff: TREBUIE sa PICE la fel (CTR-2), tot re-deriva - flag=0 nu schimba
* nimic pentru apelantii de azi.
* 2 = ELSE - parametrii liniei reale 481 (doc 287: id_jtva_coloana 1 "RO19B", proc_tvav
* SALVAT 1.19), trimisi cu pack_facturare.ntip := 1 (tip simplu, nu comanda/aviz/restaurant/
* contract - cade pe ELSE). Setup: JTVA_COLOANE.COTA_TVA (id 1) 19 -> 9 (simuleaza o
* schimbare legala de cota intre emiterea documentului si o eventuala regenerare). INAINTE si
* DUPA diff: TREBUIE sa PICE la fel (ELSE-2).
* 3 = CONTRACT + FLAG - acelasi setup ca 1, dar apel cu 28 argumente:
* pack_facturare.nregenerare_editare := 1 inainte de apel, V_PROC_TVAV_TEMP = cota salvata
* (1.21). Cere pachetul deja recompilat cu diff-ul din §7 (altfel pica cu "wrong number of
* arguments"). TREBUIE sa TREACA: cota scrisa = cea salvata, nu cea noua din politica.
* 4 = ELSE + FLAG - acelasi setup ca 2, apel cu 28 argumente, flag=1, V_PROC_TVAV_TEMP = cota
* salvata (1.19). TREBUIE sa TREACA: cota scrisa = cea salvata, nu cea noua din JTVA_COLOANE.
*
* Cazurile 1/2: asertul central e "PROC_TVAV in TEMP = cel salvat pe linia reala" - PICA mereu (si
* inainte, si dupa diff, cat timp flag-ul ramane 0): Oracle re-deriva din politica/JTVA_COLOANE
* curente, nu primeste si nu respecta o valoare salvata pe calea normala (fara flag). Asertul de
* control CTR-3/ELSE-3 (valoarea noua chiar a ajuns in TEMP) confirma ca testul masoara ceva real
* si inainte, si dupa - proba ca diff-ul n-a schimbat comportamentul implicit. Setup-ul de schema e
* revertit necondiționat la finalul fiecarui caz. Cazurile 3/4 reseteaza flag-ul la 0 imediat dupa
* citirea rezultatului, in ACELASI bloc/sesiune, ca sa nu ramana agatat pentru vreun apel urmator
* din aceeasi conexiune.
LPARAMETERS tnCaz
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s10_proc_tvav_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' caz=' + TRANSFORM(tnCaz) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
gnPass = 0
gnFail = 0
LOCAL lnCaz
lnCaz = VAL(TRANSFORM(tnCaz))
DO CASE
CASE lnCaz = 1
DO CazContract
CASE lnCaz = 2
DO CazElse
CASE lnCaz = 3
DO CazContractFlag
CASE lnCaz = 4
DO CazElseFlag
OTHERWISE
STRTOFILE('EROARE: tnCaz trebuie sa fie 1 (CONTRACT) / 2 (ELSE) / 3 (CONTRACT+FLAG) / 4 (ELSE+FLAG)' + CHR(13) + CHR(10), gcErrLog, 1)
ENDCASE
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
* CazContract: parametrii liniei reale 1604 (doc 1055), trimisi cu V_ID_CTR=61 (OPT_FACTURARE
* NULL - branch-ul principal, nu NO_DATA_FOUND).
*==============================================================================================
PROCEDURE CazContract
LOCAL lnIdPolArt, lnIdCtr, lnProcTvavVechi, lnIdCtrArtNou, lnProcTvavSalvat, lnProcTvavTemp
LOCAL llOk
lnIdPolArt = 1593
lnIdCtr = 61
lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 1604])
DO asserteaza WITH 'PRECONDITIE linia reala 1604 are proc_tvav salvat = 1.21', lnProcTvavSalvat = 1.21, TRANSFORM(lnProcTvavSalvat)
lnProcTvavVechi = Val1([select proc_tvav as v from crm_politici_pret_art where id_pol_art = ] + TRANSFORM(lnIdPolArt))
STRTOFILE('SETUP inainte: crm_politici_pret_art.proc_tvav (id_pol_art=' + TRANSFORM(lnIdPolArt) + ') = ' + TRANSFORM(lnProcTvavVechi) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'PRECONDITIE contractul 61 are OPT_FACTURARE care cade pe branch-ul principal (NVL(...,3)=3)', ;
Val1([select nvl(opt_facturare,3) as v from contracte where id_ctr = ] + TRANSFORM(lnIdCtr)) = 3, ;
TRANSFORM(Val1([select nvl(opt_facturare,3) as v from contracte where id_ctr = ] + TRANSFORM(lnIdCtr)))
llOk = goExecutor.oExecuta([update crm_politici_pret_art set proc_tvav = 1.09 where id_pol_art = ] + TRANSFORM(lnIdPolArt))
DO asserteaza WITH 'SETUP update politica reusit', llOk, TRANSFORM(llOk)
IF !llOk
RETURN
ENDIF
lnIdCtrArtNou = Val1([select seq_ctr_articole.nextval as v from dual])
llOk = goExecutor.oExecuta([insert into ctr_articole (id_ctr_art, id_ctr, id_pol_art, pret_unitar) values (] + ;
TRANSFORM(lnIdCtrArtNou) + [, ] + TRANSFORM(lnIdCtr) + [, ] + TRANSFORM(lnIdPolArt) + [, 0)])
DO asserteaza WITH 'SETUP insert ctr_articole reusit (id_ctr_art=' + TRANSFORM(lnIdCtrArtNou) + ')', llOk, TRANSFORM(llOk)
IF !llOk
DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, -1
RETURN
ENDIF
*!* apel DIRECT, 27 argumente, ca la ofacturare.vc2:19977-19999 - flag NEATINS (implicit 0 pe
*!* pachet, sau ce a ramas de la un caz anterior din aceeasi sesiune - de aceea CazContractFlag/
*!* CazElseFlag reseteaza flag-ul la 0 imediat dupa citire). CITIREA rezultatului trebuie sa fie
*!* in ACELASI apel/tranzactie: VANZARI_DETALII_TEMP e GLOBAL TEMPORARY TABLE cu
*!* DURATION=SYS$TRANSACTION (verificat pe USER_TABLES) - randul dispare la primul COMMIT, iar
*!* goExecutor face auto-commit dupa fiecare oExecuta separat (Transactions <> 2, nicio
*!* tranzactie manuala deschisa aici). Un al doilea apel SELECT separat vedea mereu 0 randuri.
*!* Solutia: SELECT ... INTO ?@pnRezultatCtr (bind OUT, PRIVATE - vezi tiparul ?@poDate.nid_vanzare
*!* din ofacturare.vc2) IN ACELASI bloc PL/SQL, inainte de commit-ul acelui apel.
PRIVATE pnRezultatCtr
pnRezultatCtr = -999
LOCAL lcSqlApel
lcSqlApel = [begin pack_facturare.ntip := 2; pack_facturare.adauga_articol_factura(] + ;
[999001, 4294507173, '', '', 41, NULL, 0, NULL, NULL, ] + ;
[101.13, 3, 0, 1, 1, 0, 'XXXX', 1, 1, 37, NULL, NULL, 101.13, NULL, ] + TRANSFORM(lnIdCtr) + [, 8, NULL, NULL); ] + ;
[select proc_tvav into ?@pnRezultatCtr from vanzari_detalii_temp where id_temp = 999001; end;]
*!* oExecute (spre deosebire de oExecuta) intoarce direct codul numeric (lnSucces < 0 = eroare)
LOCAL lnSuccesApel
lnSuccesApel = goExecutor.oExecute(lcSqlApel)
llOk = (lnSuccesApel >= 0)
STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'CTR-1 apelul la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel)
IF llOk
lnProcTvavTemp = NVL(pnRezultatCtr, -1)
STRTOFILE('CTR proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ;
' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', politica_noua=1.09)' + CHR(13) + CHR(10), gcErrLog, 1)
*!* ASERTUL CENTRAL - flag ramane 0 (neatins) - TREBUIE sa PICE la fel INAINTE si DUPA diff
*!* (dovada ca diff-ul nu schimba comportamentul implicit pentru apelantii de azi)
DO asserteaza WITH 'CTR-2 PROC_TVAV = cel salvat pe document (decizia 3, flag implicit 0 - trebuie sa PICE, neschimbat fata de azi)', ;
lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp)
DO asserteaza WITH 'CTR-3 (control ca testul masoara ceva) cota noua a politicii chiar a ajuns in TEMP', ;
lnProcTvavTemp = 1.09, TRANSFORM(lnProcTvavTemp)
ENDIF
DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, lnIdCtrArtNou
ENDPROC
PROCEDURE CazContractRevert
LPARAMETERS tnIdPolArt, tnProcTvavVechi, tnIdCtrArtNou
LOCAL llOk1, llOk2
llOk2 = .T.
IF tnIdCtrArtNou <> -1
llOk2 = goExecutor.oExecuta([delete from ctr_articole where id_ctr_art = ] + TRANSFORM(tnIdCtrArtNou))
ENDIF
llOk1 = goExecutor.oExecuta([update crm_politici_pret_art set proc_tvav = ] + ;
IIF(ISNULL(tnProcTvavVechi) OR tnProcTvavVechi = -1, [NULL], TRANSFORM(tnProcTvavVechi)) + [ where id_pol_art = ] + TRANSFORM(tnIdPolArt))
STRTOFILE('REVERT: delete ctr_articole=' + TRANSFORM(llOk2) + ' update politica=' + TRANSFORM(llOk1) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'CTR-9 revert setup (politica + ctr_articole) reusit', llOk1 AND llOk2, TRANSFORM(llOk1) + '/' + TRANSFORM(llOk2)
LOCAL lnVerif
lnVerif = Val1([select proc_tvav as v from crm_politici_pret_art where id_pol_art = ] + TRANSFORM(tnIdPolArt))
STRTOFILE('REVERT verificat: proc_tvav acum = ' + TRANSFORM(lnVerif) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* CazElse: parametrii liniei reale 481 (doc 287), trimisi cu pack_facturare.ntip := 1 (cade pe
* ELSE - nu e in nicio lista comanda/aviz/restaurant/contract).
*==============================================================================================
PROCEDURE CazElse
LOCAL lnCotaVeche, lnProcTvavSalvat, lnProcTvavTemp, llOk
lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 481])
DO asserteaza WITH 'PRECONDITIE linia reala 481 are proc_tvav salvat = 1.19', lnProcTvavSalvat = 1.19, TRANSFORM(lnProcTvavSalvat)
lnCotaVeche = Val1([select cota_tva as v from jtva_coloane where id_jtva_coloana = 1])
STRTOFILE('SETUP inainte: jtva_coloane.cota_tva (id=1) = ' + TRANSFORM(lnCotaVeche) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'PRECONDITIE cota_tva porneste de la 19', lnCotaVeche = 19, TRANSFORM(lnCotaVeche)
llOk = goExecutor.oExecuta([update jtva_coloane set cota_tva = 9 where id_jtva_coloana = 1])
DO asserteaza WITH 'SETUP update jtva_coloane reusit', llOk, TRANSFORM(llOk)
IF !llOk
RETURN
ENDIF
*!* apel DIRECT, 27 argumente (V_ID_JTVA_COLOANA=1, restul dupa vanzari_detalii), ntip=1
*!* (tip simplu -> ELSE); V_ID_ARTICOL 691698485 ca in linia reala - flag NEATINS. Citire in
*!* ACELASI apel/tranzactie - vezi comentariul din CazContract (VANZARI_DETALII_TEMP e GTT
*!* DURATION=SYS$TRANSACTION, disparea la commit-ul automat al urmatorului oExecuta separat)
PRIVATE pnRezultatElse
pnRezultatElse = -999
LOCAL lcSqlApel2, lnSuccesApel2
lcSqlApel2 = [begin pack_facturare.ntip := 1; pack_facturare.adauga_articol_factura(] + ;
[999002, 691698485, '', '', NULL, NULL, 0, NULL, NULL, ] + ;
[100, 1, 0, 1, 1, 0, 'XXXX', 1, 1, 1, NULL, NULL, 100, NULL, NULL, 8, NULL, NULL); ] + ;
[select proc_tvav into ?@pnRezultatElse from vanzari_detalii_temp where id_temp = 999002; end;]
lnSuccesApel2 = goExecutor.oExecute(lcSqlApel2)
llOk = (lnSuccesApel2 >= 0)
STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'ELSE-1 apelul la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel2)
IF llOk
lnProcTvavTemp = NVL(pnRezultatElse, -1)
STRTOFILE('ELSE proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ;
' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', cota_noua_asteptata=1.09)' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'ELSE-2 PROC_TVAV = cel salvat pe document (decizia 3, flag implicit 0 - trebuie sa PICE, neschimbat fata de azi)', ;
lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp)
DO asserteaza WITH 'ELSE-3 (control ca testul masoara ceva) cota noua din JTVA_COLOANE chiar a ajuns in TEMP', ;
lnProcTvavTemp = 1.09, TRANSFORM(lnProcTvavTemp)
ENDIF
DO CazElseRevert WITH lnCotaVeche
ENDPROC
PROCEDURE CazElseRevert
LPARAMETERS tnCotaVeche
LOCAL llOk
llOk = goExecutor.oExecuta([update jtva_coloane set cota_tva = ] + TRANSFORM(tnCotaVeche) + [ where id_jtva_coloana = 1])
STRTOFILE('REVERT: update jtva_coloane=' + TRANSFORM(llOk) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'ELSE-9 revert setup (jtva_coloane) reusit', llOk, TRANSFORM(llOk)
LOCAL lnVerif
lnVerif = Val1([select cota_tva as v from jtva_coloane where id_jtva_coloana = 1])
STRTOFILE('REVERT verificat: cota_tva acum = ' + TRANSFORM(lnVerif) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* CazContractFlag: acelasi setup ca CazContract, dar apel cu 28 argumente - flag=1,
* V_PROC_TVAV_TEMP = cota salvata (1.21). Cere parametrul nou pe pachet (dupa diff-ul din §7).
*==============================================================================================
PROCEDURE CazContractFlag
LOCAL lnIdPolArt, lnIdCtr, lnProcTvavVechi, lnIdCtrArtNou, lnProcTvavSalvat, lnProcTvavTemp
LOCAL llOk
lnIdPolArt = 1593
lnIdCtr = 61
lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 1604])
DO asserteaza WITH 'PRECONDITIE linia reala 1604 are proc_tvav salvat = 1.21', lnProcTvavSalvat = 1.21, TRANSFORM(lnProcTvavSalvat)
lnProcTvavVechi = Val1([select proc_tvav as v from crm_politici_pret_art where id_pol_art = ] + TRANSFORM(lnIdPolArt))
STRTOFILE('SETUP inainte: crm_politici_pret_art.proc_tvav (id_pol_art=' + TRANSFORM(lnIdPolArt) + ') = ' + TRANSFORM(lnProcTvavVechi) + CHR(13) + CHR(10), gcErrLog, 1)
llOk = goExecutor.oExecuta([update crm_politici_pret_art set proc_tvav = 1.09 where id_pol_art = ] + TRANSFORM(lnIdPolArt))
DO asserteaza WITH 'SETUP update politica reusit', llOk, TRANSFORM(llOk)
IF !llOk
RETURN
ENDIF
lnIdCtrArtNou = Val1([select seq_ctr_articole.nextval as v from dual])
llOk = goExecutor.oExecuta([insert into ctr_articole (id_ctr_art, id_ctr, id_pol_art, pret_unitar) values (] + ;
TRANSFORM(lnIdCtrArtNou) + [, ] + TRANSFORM(lnIdCtr) + [, ] + TRANSFORM(lnIdPolArt) + [, 0)])
DO asserteaza WITH 'SETUP insert ctr_articole reusit (id_ctr_art=' + TRANSFORM(lnIdCtrArtNou) + ')', llOk, TRANSFORM(llOk)
IF !llOk
DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, -1
RETURN
ENDIF
*!* apel cu 28 argumente: flag pornit inainte de apel, V_PROC_TVAV_TEMP = cota salvata pe
*!* document. Flag resetat la 0 IN ACELASI bloc, dupa citirea rezultatului, ca sa nu ramana
*!* agatat pentru vreun apel urmator din aceeasi sesiune (goExecutor.oExecute e o singura
*!* conexiune reutilizata pe tot testul).
PRIVATE pnRezultatCtrFlag
pnRezultatCtrFlag = -999
LOCAL lcSqlApel
lcSqlApel = [begin pack_facturare.nregenerare_editare := 1; pack_facturare.ntip := 2; ] + ;
[pack_facturare.adauga_articol_factura(] + ;
[999003, 4294507173, '', '', 41, NULL, 0, NULL, NULL, ] + ;
[101.13, 3, 0, 1, 1, 0, 'XXXX', 1, 1, 37, NULL, NULL, 101.13, NULL, ] + TRANSFORM(lnIdCtr) + [, 8, NULL, NULL, ] + ;
ALLTRIM(STR(lnProcTvavSalvat,18,4)) + [); ] + ;
[select proc_tvav into ?@pnRezultatCtrFlag from vanzari_detalii_temp where id_temp = 999003; ] + ;
[pack_facturare.nregenerare_editare := 0; end;]
LOCAL lnSuccesApel
lnSuccesApel = goExecutor.oExecute(lcSqlApel)
llOk = (lnSuccesApel >= 0)
STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'CTRF-1 apelul (28 arg, flag=1) la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel)
IF llOk
lnProcTvavTemp = NVL(pnRezultatCtrFlag, -1)
STRTOFILE('CTRF proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ;
' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', politica_noua=1.09)' + CHR(13) + CHR(10), gcErrLog, 1)
*!* ASERTUL CENTRAL - cu flag=1 SI V_PROC_TVAV_TEMP trimis, TREBUIE sa TREACA: cota
*!* pastrata = cea salvata, nu cea noua din politica
DO asserteaza WITH 'CTRF-2 PROC_TVAV = cel salvat pe document (decizia 3, flag=1 - pastrat)', ;
lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp)
DO asserteaza WITH 'CTRF-3 (control) cota pastrata NU e cea noua a politicii (1.09)', ;
lnProcTvavTemp <> 1.09, TRANSFORM(lnProcTvavTemp)
ENDIF
DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, lnIdCtrArtNou
ENDPROC
*==============================================================================================
* CazElseFlag: acelasi setup ca CazElse, dar apel cu 28 argumente - flag=1, V_PROC_TVAV_TEMP =
* cota salvata (1.19).
*==============================================================================================
PROCEDURE CazElseFlag
LOCAL lnCotaVeche, lnProcTvavSalvat, lnProcTvavTemp, llOk
lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 481])
DO asserteaza WITH 'PRECONDITIE linia reala 481 are proc_tvav salvat = 1.19', lnProcTvavSalvat = 1.19, TRANSFORM(lnProcTvavSalvat)
lnCotaVeche = Val1([select cota_tva as v from jtva_coloane where id_jtva_coloana = 1])
STRTOFILE('SETUP inainte: jtva_coloane.cota_tva (id=1) = ' + TRANSFORM(lnCotaVeche) + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'PRECONDITIE cota_tva porneste de la 19', lnCotaVeche = 19, TRANSFORM(lnCotaVeche)
llOk = goExecutor.oExecuta([update jtva_coloane set cota_tva = 9 where id_jtva_coloana = 1])
DO asserteaza WITH 'SETUP update jtva_coloane reusit', llOk, TRANSFORM(llOk)
IF !llOk
RETURN
ENDIF
PRIVATE pnRezultatElseFlag
pnRezultatElseFlag = -999
LOCAL lcSqlApel2, lnSuccesApel2
lcSqlApel2 = [begin pack_facturare.nregenerare_editare := 1; pack_facturare.ntip := 1; ] + ;
[pack_facturare.adauga_articol_factura(] + ;
[999004, 691698485, '', '', NULL, NULL, 0, NULL, NULL, ] + ;
[100, 1, 0, 1, 1, 0, 'XXXX', 1, 1, 1, NULL, NULL, 100, NULL, NULL, 8, NULL, NULL, ] + ;
ALLTRIM(STR(lnProcTvavSalvat,18,4)) + [); ] + ;
[select proc_tvav into ?@pnRezultatElseFlag from vanzari_detalii_temp where id_temp = 999004; ] + ;
[pack_facturare.nregenerare_editare := 0; end;]
lnSuccesApel2 = goExecutor.oExecute(lcSqlApel2)
llOk = (lnSuccesApel2 >= 0)
STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'ELSEF-1 apelul (28 arg, flag=1) la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel2)
IF llOk
lnProcTvavTemp = NVL(pnRezultatElseFlag, -1)
STRTOFILE('ELSEF proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ;
' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', cota_noua_asteptata=1.09)' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'ELSEF-2 PROC_TVAV = cel salvat pe document (decizia 3, flag=1 - pastrat)', ;
lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp)
DO asserteaza WITH 'ELSEF-3 (control) cota pastrata NU e cea noua din JTVA_COLOANE (1.09)', ;
lnProcTvavTemp <> 1.09, TRANSFORM(lnProcTvavTemp)
ENDIF
DO CazElseRevert WITH lnCotaVeche
ENDPROC
*==============================================================================================
FUNCTION Val1
LPARAMETERS tcSql
LOCAL lnRet
lnRet = -1
IF USED('v_val10')
USE IN v_val10
ENDIF
IF goExecutor.oExecuta(tcSql, 'v_val10')
SELECT v_val10
IF RECCOUNT('v_val10') > 0
GO TOP
lnRet = NVL(v_val10.v, -1)
ENDIF
USE IN v_val10
ELSE
STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
RETURN lnRet
ENDFUNC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,259 @@
* test_s11_izolare_camp_1472.prg
* Proba S11 (docs\raport_s11_cauza_1472_camp.md): izoleaza EXACT campul/campurile NULL din poArt
* care duc lcSql la NULL in frm_facturare_articole2.do_scrie_articole (ofacturare.vc2:19977-20001).
* Tipar identic cu test_s10_cablare_vfp.prg (mock pe goExecutor, NIMIC scris in Oracle): doc 630
* incarcat REAL (IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare, citire, goExecutor real),
* apoi goExecutor inlocuit cu mock INAINTE de do_scrie_articole(). Fara curatare/REPLACE ALL pe
* crsfactura la Pasul 1 - vrem NULL-urile REALE, nu ascunse.
*
* Pasul 1: enumera (AFIELDS) toate campurile din crsfactura, logheaza VARTYPE/ISNULL pe fiecare,
* pe fiecare rand.
* Pasul 2: apeleaza do_scrie_articole() cu mock, capteaza lcSql brut per apel, verifica VARTYPE.
* Pasul 3 (cauzalitate, sens 1): pe cursorul curatat DOAR pe campul/campurile gasite NULL la pasul 1
* SI nepazite in cod (candidatii: id_articol, id_jtva_coloana - singurele doua campuri din
* lista nepazita 19978-20000 care sunt si NULL-capabile in structura crsfactura, cf.
* creeaza_facturacrs, ofacturare_comun.prg:1801-1811), reruleaza - asteptam VARTYPE='C'.
* Pasul 4 (cauzalitate, sens 2): reintroduce NULL pe UN SINGUR camp cauzal, reruleaza - asteptam
* VARTYPE='X' din nou.
LPARAMETERS tnCaz
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s11_izolare_camp_1472_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcSqlUltim, gcVartypeUltim
gcSqlUltim = ''
gcVartypeUltim = ''
DO Izoleaza
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE Izoleaza
LOCAL lnIdV
lnIdV = 630
LOCAL lnDiscRon, lnDiscVal
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH '0a antetul documentului ' + TRANSFORM(lnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
DO asserteaza WITH '0b liniile documentului ' + TRANSFORM(lnIdV) + ' s-au incarcat', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
*!* curatare LOCALA (doar in RAM) doar pe ce trebuie ca sa nu strice testul de baza:
*!* fara ")" accidental in text, toate randurile pe branch-ul adauga_articol_factura
SELECT crsfactura
REPLACE ALL explicatie WITH 'test-s11-izolare', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
*!* PASUL 1: enumerare EFECTIVA (AFIELDS), nu lista ghicita - toate campurile, toate randurile
LOCAL laFields[1], lnFields, lnI, lnRand
lnFields = AFIELDS(laFields, 'crsfactura')
STRTOFILE('--- PASUL 1: campuri NULL in crsfactura, pe fiecare rand (' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri) ---' + CHR(13) + CHR(10), gcErrLog, 1)
SELECT crsfactura
SCAN
lnRand = RECNO('crsfactura')
LOCAL lcNuleRand
lcNuleRand = ''
FOR lnI = 1 TO lnFields
IF ISNULL(EVALUATE('crsfactura.' + laFields[lnI,1]))
lcNuleRand = lcNuleRand + laFields[lnI,1] + '(' + laFields[lnI,2] + ') '
ENDIF
ENDFOR
IF EMPTY(lcNuleRand)
STRTOFILE(' rand ' + TRANSFORM(lnRand) + ': niciun camp NULL' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE(' rand ' + TRANSFORM(lnRand) + ': NULL pe -> ' + lcNuleRand + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDSCAN
GO TOP IN crsfactura
*!* PASUL 2: rulare BRUTA (fara nicio curatare pe campuri numerice) - reproduce defectul
DO RuleazaCuMock WITH 'PAS2-brut'
DO asserteaza WITH 'PAS2 lcSql BRUT (fara curatare) e NULL (VARTYPE X) - reproduce defectul', gcVartypeUltim = 'X', gcVartypeUltim
*!* PASUL 3: cauzalitate sens 1 - NVL DOAR pe candidatii NULL-capabili si nepaziti in cod
*!* (id_articol: ofacturare.vc2:19979; id_jtva_coloana: ofacturare.vc2:19994) - singurii doi
*!* campuri din lista nepazita 19978-20000 care sunt NULL-capabili in structura crsfactura
*!* (ofacturare_comun.prg:1801-1811 - restul candidatilor nepaziti in SQL nu sunt marcati NULL
*!* in CREATE CURSOR, deci nu pot ajunge NULL pe acest traseu, indiferent de sursa Oracle).
SELECT crsfactura
REPLACE ALL id_articol WITH NVL(id_articol,0), id_jtva_coloana WITH NVL(id_jtva_coloana,0) IN crsfactura
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS3-curat-id_articol-id_jtva_coloana'
DO asserteaza WITH 'PAS3 dupa NVL DOAR pe id_articol+id_jtva_coloana, lcSql devine text (VARTYPE C)', gcVartypeUltim = 'C', gcVartypeUltim
*!* PASUL 4: cauzalitate sens 2 - reintroduce NULL pe UN SINGUR camp (id_articol) pe primul rand
SELECT crsfactura
GO TOP IN crsfactura
REPLACE id_articol WITH .NULL. IN crsfactura
DO RuleazaCuMock WITH 'PAS4-regresie-doar-id_articol-null'
DO asserteaza WITH 'PAS4 cu id_articol NULL pe un rand (restul curat), lcSql redevine NULL (VARTYPE X)', gcVartypeUltim = 'X', gcVartypeUltim
*!* PASUL 5: control - NULL DOAR pe id_jtva_coloana (id_articol curat), separat de id_articol
SELECT crsfactura
GO TOP IN crsfactura
REPLACE ALL id_articol WITH NVL(id_articol,0) IN crsfactura
GO TOP IN crsfactura
REPLACE id_jtva_coloana WITH .NULL. IN crsfactura
DO RuleazaCuMock WITH 'PAS5-regresie-doar-id_jtva_coloana-null'
DO asserteaza WITH 'PAS5 cu id_jtva_coloana NULL pe un rand (restul curat), lcSql redevine NULL (VARTYPE X)', gcVartypeUltim = 'X', gcVartypeUltim
ENDPROC
*==============================================================================================
* RuleazaCuMock: apeleaza do_scrie_articole() cu goExecutor mockat, intoarce lcSql-ul (sau
* diagnosticul VARTYPE) al APELULUI cu PCOUNT()=1 (adauga_articol_factura din Scan), plus
* rollback pe conexiunea REALA dupa fiecare rulare (tranzactia ramane deschisa pe succes).
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS11Izolare')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcSqlUltim = loMock.cSqlArticolCapturat
gcVartypeUltim = loMock.cVartypeArticol
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ' VARTYPE(tcSql pe apelul articol)=' + gcVartypeUltim + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- lcSql capturat (apelul articol) ---' + CHR(13) + CHR(10) + TRANSFORM(gcSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* MockGoExecutorS11Izolare: captureaza, pe FIECARE apel oExecute, PCOUNT()/VARTYPE(tcSql); retine
* separat apelul cu PCOUNT()=1 (semnatura do_scrie_articole pentru adauga_articol_factura, spre
* deosebire de apelul antetului care are 0 parametri suplimentari observabili din tcSql insusi -
* de fapt toate apelurile din do_scrie_articole trec 1 parametru; distingem prin continut: apelul
* articolului contine 'adauga_articol_factura' SAU e chiar cel NULL de pe randul cu bug-ul cautat -
* pastram DOAR ultimul apel (cel mai relevant, cel din Scan) pentru comparatie inainte/dupa.
*==============================================================================================
DEFINE CLASS MockGoExecutorS11Izolare AS Custom
cSqlArticolCapturat = ''
cVartypeArticol = ''
nApeluri = 0
cEroare = ''
FUNCTION oExecute(tcSql)
THIS.nApeluri = THIS.nApeluri + 1
LOCAL lcVartype
lcVartype = VARTYPE(m.tcSql)
*!* pastram ultimul apel care contine (in forma text) sau ar putea contine (NULL) linia de
*!* articol - primele doua apeluri din do_scrie_articole sunt garantat antetul (nu contin
*!* 'adauga_articol_factura'); din al treilea apel incolo, retinem fiecare, ultimul castiga
IF THIS.nApeluri >= 3
THIS.cSqlArticolCapturat = TRANSFORM(m.tcSql)
THIS.cVartypeArticol = m.lcVartype
ENDIF
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS11Izolare: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,225 @@
* test_s11_reparatie_1472.prg
* Proba reparatiei S11 (docs\raport_s11_reparatie_1472.md): confirma ca garda Nvl(...,[NULL])
* aplicata pe poArt.id_articol (ofacturare.vc2:19979) si poArt.id_jtva_coloana (ofacturare.vc2:19994,
* in frm_facturare_articole2.do_scrie_articole) repara EROAREA 1472 pe documentul 630, fara sa
* schimbe lcSql-ul pe randuri fara NULL pe aceste doua campuri (neregresie).
*
* Tipar identic cu test_s11_izolare_camp_1472.prg: mock pe goExecutor, NIMIC scris in Oracle,
* document 630 incarcat REAL (IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare), goExecutor
* inlocuit cu mock DOAR dupa incarcare, inaintea do_scrie_articole().
*
* PAS1 (regresia care conta): doc 630 BRUT (id_articol ramane NULL, ca in Oracle) - inainte de
* reparatie VARTYPE(lcSql)='X' (control negativ, citat din
* docs\raport_s11_cauza_1472_camp.md §4 PAS2-brut, nu s-a rerulat). Asteptam acum VARTYPE='C'.
* PAS2 (neregresie, comparatie caracter-cu-caracter): acelasi scenariu ca PAS3 din
* test_s11_izolare_camp_1472.prg (id_articol/id_jtva_coloana normalizate cu NVL(...,0), ca sa
* nu mai fie NULL) - garda noua e un no-op pe valori ne-NULL, deci lcSql trebuie sa fie
* IDENTIC, caracter cu caracter, cu sirul deja capturat inainte de reparatie
* (docs\raport_s11_cauza_1472_camp.md §4 PAS3, citat mai jos ca literal).
LPARAMETERS tnCaz
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog, gnPass, gnFail
PUBLIC poDate
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s11_reparatie_1472_log_' + ;
STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt'
STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
LOCAL lcPathVechi, lcPathNou
lcPathVechi = SET("PATH")
lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi
SET PATH TO &lcPathNou
PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip
gnMockRaspuns = 7
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnPass = 0
gnFail = 0
PUBLIC gcSqlUltim, gcVartypeUltim
gcSqlUltim = ''
gcVartypeUltim = ''
DO ProbaReparatie
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*==============================================================================================
PROCEDURE ProbaReparatie
LOCAL lnIdV
lnIdV = 630
LOCAL lnDiscRon, lnDiscVal
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal)
DO asserteaza WITH '0a antetul documentului ' + TRANSFORM(lnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate)
IF VARTYPE(poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdV)
DO asserteaza WITH '0b liniile documentului ' + TRANSFORM(lnIdV) + ' s-au incarcat', ;
USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1))
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN
ENDIF
*!* curatare LOCALA (doar in RAM), identica cu test_s11_izolare_camp_1472.prg
SELECT crsfactura
REPLACE ALL explicatie WITH 'test-s11-izolare', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura
GO TOP IN crsfactura
*!* PAS1: doc 630 BRUT (id_articol ramane NULL) - proba REGRESIEI CARE CONTA
DO RuleazaCuMock WITH 'PAS1-brut-postfix'
DO asserteaza WITH 'PAS1 lcSql BRUT (id_articol NULL, ca in Oracle) e text valid dupa reparatie (VARTYPE C)', gcVartypeUltim = 'C', gcVartypeUltim
IF gcVartypeUltim = 'C'
DO asserteaza WITH 'PAS1 lcSql contine apelul adauga_articol_factura', 'pack_facturare.adauga_articol_factura(' $ gcSqlUltim, gcSqlUltim
ENDIF
*!* PAS2: neregresie - acelasi scenariu ca PAS3 din test_s11_izolare_camp_1472.prg (id_articol,
*!* id_jtva_coloana normalizate cu NVL(...,0)); garda e no-op pe valori ne-NULL, deci lcSql
*!* trebuie sa fie IDENTIC caracter-cu-caracter cu sirul capturat INAINTE de reparatie
*!* (docs\raport_s11_cauza_1472_camp.md §4 PAS3, citat literal, nu recalculat).
SELECT crsfactura
GO TOP IN crsfactura
REPLACE ALL id_articol WITH NVL(id_articol,0), id_jtva_coloana WITH NVL(id_jtva_coloana,0) IN crsfactura
GO TOP IN crsfactura
DO RuleazaCuMock WITH 'PAS2-neregresie-normalizat'
LOCAL lcAsteptatDinRaportInainteDeReparatie
lcAsteptatDinRaportInainteDeReparatie = "begin pack_facturare.adauga_articol_factura(905,0,'','test-s11-izolare',NULL,0,0.0000,NULL,NULL,100.00,0,0,0,1.000,0.00,'',0.000000,1,0,0,0,0.0000,0,134,8,NULL,'',1.1900); end;"
DO asserteaza WITH 'PAS2 lcSql (dupa reparatie, valori ne-NULL) e IDENTIC caracter-cu-caracter cu sirul din raportul dinainte de reparatie', ;
ALLTRIM(gcSqlUltim) == ALLTRIM(lcAsteptatDinRaportInainteDeReparatie), 'CAPTURAT: ' + TRANSFORM(gcSqlUltim)
STRTOFILE('PAS2 --- sirul asteptat (din raport, dinainte de reparatie) ---' + CHR(13) + CHR(10) + lcAsteptatDinRaportInainteDeReparatie + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('PAS2 --- sirul capturat (dupa reparatie) ---' + CHR(13) + CHR(10) + TRANSFORM(gcSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*==============================================================================================
* RuleazaCuMock: apeleaza do_scrie_articole() cu goExecutor mockat, intoarce lcSql-ul (sau
* diagnosticul VARTYPE) al APELULUI cu PCOUNT()=1 (adauga_articol_factura din Scan), plus
* rollback pe conexiunea REALA dupa fiecare rulare (tranzactia ramane deschisa pe succes).
*==============================================================================================
PROCEDURE RuleazaCuMock
LPARAMETERS tcPrefix
LOCAL loForm, loMock, loExecutorReal, llReturn
loForm = CREATEOBJECT('frm_facturare_articole2')
IF TYPE('plRegenerareEditare') <> 'U'
RELEASE plRegenerareEditare
ENDIF
loExecutorReal = goExecutor
loMock = CREATEOBJECT('MockGoExecutorS11Reparatie')
goExecutor = loMock
llReturn = loForm.do_scrie_articole()
goExecutor = loExecutorReal
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
gcSqlUltim = loMock.cSqlArticolCapturat
gcVartypeUltim = loMock.cVartypeArticol
STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ' VARTYPE(tcSql pe apelul articol)=' + gcVartypeUltim + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE(tcPrefix + ' --- lcSql capturat (apelul articol) ---' + CHR(13) + CHR(10) + TRANSFORM(gcSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1)
RELEASE loForm
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
SQLROLLBACK(gnHandle)
SQLSetProp(gnHandle, 'Transactions', 1)
ENDIF
gnFail = gnFail + 1
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC
*==============================================================================================
* MockGoExecutorS11Reparatie: identic cu MockGoExecutorS11Izolare (test_s11_izolare_camp_1472.prg),
* clasa distincta doar ca sa nu se coliziona cu cea din fisierul de izolare pe acelasi SET PROCEDURE.
*==============================================================================================
DEFINE CLASS MockGoExecutorS11Reparatie AS Custom
cSqlArticolCapturat = ''
cVartypeArticol = ''
nApeluri = 0
cEroare = ''
FUNCTION oExecute(tcSql)
THIS.nApeluri = THIS.nApeluri + 1
LOCAL lcVartype
lcVartype = VARTYPE(m.tcSql)
IF THIS.nApeluri >= 3
THIS.cSqlArticolCapturat = TRANSFORM(m.tcSql)
THIS.cVartypeArticol = m.lcVartype
ENDIF
RETURN 1
ENDFUNC
FUNCTION oExecuta(tcSql, tcCursor)
THIS.nApeluri = THIS.nApeluri + 1
IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor)
IF USED(m.tcCursor)
USE IN (m.tcCursor)
ENDIF
CREATE CURSOR (m.tcCursor) (xdummy I)
ENDIF
RETURN .T.
ENDFUNC
FUNCTION oPrelucrareEroare()
RETURN 'MockGoExecutorS11Reparatie: ' + THIS.cEroare
ENDFUNC
ENDDEFINE

View File

@@ -0,0 +1,106 @@
* test_s14_grid_coloane_modif.prg
* Verifica headless coloanele noi de audit-modificare (id_utilm/utilm/dataoram) in cursorul
* crsfacturi construit exact ca oproceduri_facturare.vizualizare_facturi (S14, decizia 65).
* Nu deschide niciun formular - doar gencursor + afisare(), citire pe structura si valori.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s14_grid_coloane_modif_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
PUBLIC gnPass, gnFail
gnPass = 0
gnFail = 0
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
*!* --- exact lcSchema/lcSelect din oproceduri_facturare.prg:340-362, dupa S14 ---
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),id_utilm I,utilm c(30),dataoram t,delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,id_utilm,utilm,dataoram,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [rownum <= 10 and sters = 0]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
DO asserteaza WITH 'crsfacturi incarcat (rownum>0)', Used('crsfacturi') AND Reccount('crsfacturi') > 0, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa')
IF Used('crsfacturi')
Select crsfacturi
DO asserteaza WITH 'camp id_utilm exista, tip N', Type('crsfacturi.id_utilm') = 'N', Type('crsfacturi.id_utilm')
DO asserteaza WITH 'camp utilm exista, tip C', Type('crsfacturi.utilm') = 'C', Type('crsfacturi.utilm')
DO asserteaza WITH 'camp dataoram exista, tip T', Type('crsfacturi.dataoram') = 'T', Type('crsfacturi.dataoram')
LOCAL lnConIdUtilm
lnConIdUtilm = 0
Select crsfacturi
Scan
IF !Isnull(id_utilm) AND id_utilm != 0
lnConIdUtilm = m.lnConIdUtilm + 1
ENDIF
Endscan
IF m.lnConIdUtilm = 0
STRTOFILE('ATENTIE: zero randuri cu id_utilm completat in esantion (rownum<=10) - absenta din date, nu dovada de defect' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
STRTOFILE('gasit ' + TRANSFORM(m.lnConIdUtilm) + ' rand(uri) cu id_utilm completat' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
Use In crsfacturi
ENDIF
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE asserteaza
LPARAMETERS tcEticheta, tlConditie, tcDetaliu
IF m.tlConditie
gnPass = m.gnPass + 1
STRTOFILE('PASS: ' + m.tcEticheta + ' (' + Transform(m.tcDetaliu) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = m.gnFail + 1
STRTOFILE('FAIL: ' + m.tcEticheta + ' (' + Transform(m.tcDetaliu) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLine
STRTOFILE('EROARE ' + TRANSFORM(m.tnError) + ': ' + m.tcMessage + ' in ' + m.tcProgram + ' linia ' + TRANSFORM(m.tnLine) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDPROC

View File

@@ -0,0 +1,786 @@
* test_s14_neregresie_emitere_noua.prg
* VIZIBIL (grid): proba de neregresie S14 pe calea de EMITERE NOUA (nu editare).
* Secventa: D0 = emitere noua (v1, frm_facturare_articole, tip 1) -> reemitere HEADLESS a lui D0
* (v2, frm_facturare_articole2.do_scrie_factura() apelat direct, ca in test_s9_4_regenerare.prg
* Rularea2) -> D2 = a doua emitere noua (v1, ACELASI proces VFP, fara restart). D1 = documentul
* nascut din reemiterea lui D0.
*
* Risc verificat: pack_facturare.nid_util_fortat/ddataora_fortata sunt variabile de sesiune
* Oracle (PACK_FACTURARE), nu VFP - fortate la reemiterea D0->D1 si curatate simetric in
* do_scrie_factura (ofacturare.vc2, v2). Daca CurataAuditCreareFortat ar lipsi sau ar fi ocolita,
* D2 (scris prin v1, care NU are deloc cod S14 - do_scrie_articole/do_scrie_factura proprii, alta
* zona a fisierului) ar mosteni tacut ID_UTIL/DATAORA fortate de reemiterea anterioara, fiindca
* INSERT-ul din scrie_in_vanzari e comun ambelor forme.
*
* Variabilele de pachet nu sunt selectabile direct din SQL (stare PL/SQL, nu date de tabel) -
* verificarea lor "sunt NULL la final" se face prin efectul observabil: DATAORA lui D2 trebuie sa
* fie proaspata (acum), nu cea transportata la D1 (data crearii lui D0, cu minute in urma).
*
* v1 (D0, D2): traseul si ocolirea din test_s6_1_lista_preturi.prg (incarca_cursor_articole +
* do_adauga_articol(.T.) direct, apoi but_termin1.Click() - FRM_ALTE_DATE condus de driver+timer,
* tehnica identica, copiata din acel fisier).
* v2 (D1): traseul din test_s9_4_regenerare.prg Rularea2 (IncarcaAntetFacturaEditare +
* IncarcaLiniiFacturaEditare + CreeazaSnapshotEditare, o cantitate modificata forteaza ruta 1 =
* regenerare, do_scrie_factura() apelat direct - fara Show(), fara buton, fara modal).
*
* Rulare: powershell -ExecutionPolicy Bypass -File test_s14_neregresie_emitere_noua.ps1 (timeout >= 400s)
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\test_s14_neregresie_emitere_noua.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC goDriverS14P4, gcClaseVazute, gcSyncDir, gcUILog, gnCantitateAleasa
PUBLIC gcUltimaSerie, gnUltimulNract
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\test_s14_neregresie_emitere_noua.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out"
ENDIF
gcUILog = gcLog
gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync_s14p4\"
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcClaseVazute = ";"
gcNumere = ""
gnCantitateAleasa = 2
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
DO HarnessInit
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx
*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8).
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, poSnapshotEditare
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
poSnapshotEditare = NULL
ON ERROR DO S14P4Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
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 S14P4Log WITH 'EROARE: conectare Oracle esuata'
DO S14P4Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S14P4Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S14P4Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S14P4Final
ENDIF
gnScadereStoc = 0
gnFactSeturi = 0
gnIdSucursala = 167
goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;])
gnIdUtil = 8
goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;])
DO S14P4Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF !USED('saft_tip_facturi')
CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL)
INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '')
INDEX ON cod TAG cod
ENDIF
PUBLIC gdZiCurs
gdZiCurs = DataCursValid()
DO S14P4Log WITH ' zi_curs folosita pentru toate documentele: ' + DTOC(gdZiCurs)
*-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si
*-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera.
*-- Tehnica validata la S5c/S6-1/S6-5.
goDriverS14P4 = CREATEOBJECT('driverS14P4')
_SCREEN.AddObject('tmrS14P4', 'Timer')
_SCREEN.tmrS14P4.Interval = 200
BINDEVENT(_SCREEN.tmrS14P4, 'Timer', goDriverS14P4, 'Executa')
_SCREEN.tmrS14P4.Enabled = .T.
DO HarnessStep WITH 0, 'env gata', 8
DO S14P4Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE (comune D0 si D2) ====='
IF !AlegeArticole()
DO Assert WITH .F., 'alegerea celor doua articole a esuat - vezi log'
DO S14P4Final
ENDIF
LOCAL lnIdV0, lnIdV1, lnIdV2, lcSer0, lnNr0, lcSer2, lnNr2
LOCAL lnIdUtil0, ldDataora0, lnIdUtilm0, ldDataoram0, llUtilmNul0, llDataoramNul0
LOCAL lnIdUtil1, ldDataora1, lnIdUtilm1, ldDataoram1, llUtilmNul1, llDataoramNul1
LOCAL lnIdUtil2, ldDataora2, lnIdUtilm2, ldDataoram2, llUtilmNul2, llDataoramNul2
STORE 0 TO lnIdV0, lnIdV1, lnIdV2, lnNr0, lnNr2
STORE '' TO lcSer0, lcSer2
DO S14P4Log WITH CHR(13) + CHR(10) + '===== D0: EMITERE NOUA (v1, frm_facturare_articole) ====='
lnIdV0 = EmiteDocNou()
lcSer0 = gcUltimaSerie
lnNr0 = gnUltimulNract
DO Assert WITH lnIdV0 > 0, 'D0 s-a scris (baza pentru reemitere), id_vanzare=' + TRANSFORM(lnIdV0)
IF lnIdV0 <= 0
DO S14P4Final
ENDIF
IF !CitesteAuditVanzare(lnIdV0, @lnIdUtil0, @ldDataora0, @lnIdUtilm0, @ldDataoram0, @llUtilmNul0, @llDataoramNul0)
DO Assert WITH .F., 'D0: citirea auditului (ID_UTIL/DATAORA) a esuat'
DO S14P4Final
ENDIF
DO S14P4Log WITH ' D0 id_vanzare=' + TRANSFORM(lnIdV0) + ' serie=' + lcSer0 + ' nr=' + TRANSFORM(lnNr0) + ;
' id_util=' + TRANSFORM(lnIdUtil0) + ' dataora=' + TTOC(ldDataora0) + ;
' id_utilm_null=' + TRANSFORM(llUtilmNul0) + ' dataoram_null=' + TRANSFORM(llDataoramNul0)
DO Assert WITH llUtilmNul0 AND llDataoramNul0, 'D0 (document nou, fara editare): ID_UTILM/DATAORAM NULL'
DO HarnessStep WITH 1, 'D0 emis', 8
DO S14P4Log WITH CHR(13) + CHR(10) + '===== D1: REEMITERE HEADLESS a lui D0 (v2, do_scrie_factura direct) ====='
lnIdV1 = ReemiteDocument(lnIdV0)
DO Assert WITH lnIdV1 > 0, 'D1 s-a scris (reemiterea lui D0), id_vanzare=' + TRANSFORM(lnIdV1)
IF lnIdV1 <= 0
DO S14P4Final
ENDIF
IF !CitesteAuditVanzare(lnIdV1, @lnIdUtil1, @ldDataora1, @lnIdUtilm1, @ldDataoram1, @llUtilmNul1, @llDataoramNul1)
DO Assert WITH .F., 'D1: citirea auditului (ID_UTIL/DATAORA) a esuat'
DO S14P4Final
ENDIF
DO S14P4Log WITH ' D1 id_vanzare=' + TRANSFORM(lnIdV1) + ' id_util=' + TRANSFORM(lnIdUtil1) + ' dataora=' + TTOC(ldDataora1) + ;
' id_utilm=' + TRANSFORM(lnIdUtilm1) + ' dataoram=' + TTOC(ldDataoram1)
gcCaz = '[D1 reemitere - context, mecanismul S14 e deja probat in raport_s14_vfp_transport.md] '
DO Assert WITH lnIdUtil1 = lnIdUtil0, 'D1 pastreaza ID_UTIL-ul creatiei lui D0, e=' + TRANSFORM(lnIdUtil1) + ' vs ' + TRANSFORM(lnIdUtil0)
DO Assert WITH TTOC(ldDataora1) == TTOC(ldDataora0), 'D1 pastreaza DATAORA creatiei lui D0, e=[' + TTOC(ldDataora1) + '] vs [' + TTOC(ldDataora0) + ']'
DO Assert WITH !llUtilmNul1 AND !llDataoramNul1, 'D1 are perechea de modificare completata (ID_UTILM/DATAORAM)'
gcCaz = ''
DO HarnessStep WITH 2, 'D1 reemis', 8
DO S14P4Log WITH CHR(13) + CHR(10) + '===== D2: A DOUA EMITERE NOUA (v1), IN ACEEASI SESIUNE, IMEDIAT DUPA REEMITERE ====='
lnIdV2 = EmiteDocNou()
lcSer2 = gcUltimaSerie
lnNr2 = gnUltimulNract
DO Assert WITH lnIdV2 > 0, 'D2 s-a scris (emitere noua dupa reemitere), id_vanzare=' + TRANSFORM(lnIdV2)
IF lnIdV2 <= 0
DO S14P4Final
ENDIF
IF !CitesteAuditVanzare(lnIdV2, @lnIdUtil2, @ldDataora2, @lnIdUtilm2, @ldDataoram2, @llUtilmNul2, @llDataoramNul2)
DO Assert WITH .F., 'D2: citirea auditului (ID_UTIL/DATAORA) a esuat'
DO S14P4Final
ENDIF
DO S14P4Log WITH ' D2 id_vanzare=' + TRANSFORM(lnIdV2) + ' serie=' + lcSer2 + ' nr=' + TRANSFORM(lnNr2) + ;
' id_util=' + TRANSFORM(lnIdUtil2) + ' dataora=' + TTOC(ldDataora2) + ;
' id_utilm_null=' + TRANSFORM(llUtilmNul2) + ' dataoram_null=' + TRANSFORM(llDataoramNul2)
*-- discriminatorul de "acum" foloseste DOAR timpul Oracle (ldDataoram1, SYSDATE la reemitere,
*-- cateva secunde inaintea lui D2) - un DATETIME() din VFP ar compara cu ceasul clientului,
*-- care poate fi decalat fata de serverul Oracle (masurat: ~3 ore, nu e o scurgere reala)
gcCaz = '[S14-P4 NEREGRESIE emitere noua dupa reemitere] '
DO Assert WITH lnIdUtil2 = gnIdUtil, 'S14-P4-1 D2.ID_UTIL = utilizatorul curent (' + TRANSFORM(gnIdUtil) + '), e=' + TRANSFORM(lnIdUtil2)
DO Assert WITH ldDataora2 >= ldDataoram1, ;
'S14-P4-2a D2.DATAORA e ulterioara momentului reemiterii (SYSDATE Oracle, nu ceasul clientului), D2=[' + TTOC(ldDataora2) + '] >= reemitere=[' + TTOC(ldDataoram1) + ']'
DO Assert WITH TTOC(ldDataora2) <> TTOC(ldDataora0), ;
'S14-P4-2b D2.DATAORA NU e transportata de la D0/D1 (fortarea nu a scapat pe calea v1), D2=[' + TTOC(ldDataora2) + '] D0/D1=[' + TTOC(ldDataora0) + ']'
DO Assert WITH llUtilmNul2, 'S14-P4-3 D2.ID_UTILM = NULL (nu e reemitere)'
DO Assert WITH llDataoramNul2, 'S14-P4-4 D2.DATAORAM = NULL (nu e reemitere)'
gcCaz = ''
DO S14P4Log WITH CHR(13) + CHR(10) + '===== SECVENTA reemitere -> emitere noua: ' + ;
IIF(lnIdUtil2 = gnIdUtil AND TTOC(ldDataora2) <> TTOC(ldDataora0) AND llUtilmNul2 AND llDataoramNul2, 'PASS', 'FAIL') + ' ====='
DO HarnessStep WITH 3, 'D2 emis si verificat', 8
DO S14P4Final
CATCH TO loExc
DO S14P4Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S14P4Final
ENDTRY
QUIT
*==================================================================================
* Alegerea celor doua articole comune D0/D2: sonda cu incarca_cursor_articole (traseul real de pe
* v1), apoi TOP 2 negestionabile cu pret>0 si cota prezenta in jtva_coloane. Rezultat: crsAleseS14P4.
FUNCTION AlegeArticole
LOCAL loRez, lcStrategie
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
loRez = incarca_cursor_articole(1, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(1) a adus articole'
IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO Goleste
RETURN .F.
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
DO Inchide WITH 'crsCandS14P4'
SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ;
WHERE NVL(a.gestionabil,0) = 0 AND NVL(a.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS14P4 READWRITE
lcStrategie = 'negestionabile cu cota in jtva_coloane'
IF RECCOUNT('crsCandS14P4') < 2
DO Inchide WITH 'crsCandS14P4'
SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ;
ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ;
WHERE NVL(a.pret,0) > 0 ;
ORDER BY a.id_articol INTO CURSOR crsCandS14P4 READWRITE
lcStrategie = 'orice cu cota in jtva_coloane (gestionabile incluse)'
ENDIF
IF RECCOUNT('crsCandS14P4') < 2
DO Inchide WITH 'crsCandS14P4'
SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS14P4 READWRITE
lcStrategie = 'primele din lista (nicio potrivire de cota)'
ENDIF
DO Inchide WITH 'crsAleseS14P4'
SELECT * FROM crsCandS14P4 WHERE .F. INTO CURSOR crsAleseS14P4 READWRITE
LOCAL lnUltimulId, loRowS14P4
lnUltimulId = -1
SELECT crsCandS14P4
SCAN
IF id_articol <> lnUltimulId
SCATTER MEMO NAME loRowS14P4
INSERT INTO crsAleseS14P4 FROM NAME loRowS14P4
lnUltimulId = id_articol
ENDIF
IF RECCOUNT('crsAleseS14P4') >= 2
EXIT
ENDIF
ENDSCAN
DO Inchide WITH 'crsCandS14P4'
DO Assert WITH RECCOUNT('crsAleseS14P4') = 2, 'doua articole DISTINCTE alese, e=' + TRANSFORM(RECCOUNT('crsAleseS14P4'))
DO S14P4Log WITH ' strategie: ' + lcStrategie
SELECT crsAleseS14P4
SCAN
DO S14P4Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ;
'] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0))
ENDSCAN
DO Inchide WITH 'crsarticole'
DO Goleste
RETURN (RECCOUNT('crsAleseS14P4') = 2)
ENDFUNC
*==================================================================================
* Emitere noua reala prin v1 (frm_facturare_articole), tip 1 - traseul si ocolirea din
* test_s6_1_lista_preturi.prg (EmiteV1): incarca_cursor_articole() inainte de formular, candidatii
* restransi la crsAleseS14P4, do_adauga_articol(.T.) direct, but_termin1.Click() (FRM_ALTE_DATE
* condus de driver+timer).
FUNCTION EmiteDocNou
LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[emitere-noua] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000, 1)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.nIdTipDoc = 5
poDate.id_client = 463
poDate.id_delegat = 256
poDate.zi_curs = gdZiCurs
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO Assert WITH poDate.rezultat_serii = 3, 'rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S14P4Log WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract)
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loRez = incarca_cursor_articole(1, .F., poGeneratorNumere)
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'incarca_cursor_articole a adus articole'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN 0
ENDIF
USE IN crsarticole
SELECT * FROM crsAleseS14P4 INTO CURSOR crsarticole READWRITE
DO Assert WITH RECCOUNT('crsarticole') = 2, 'cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole'))
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'Createobject frm_facturare_articole'
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'butonul Adauga duce la do_urmator'
DO Assert WITH oform.but_urmator1.Visible, 'butonul Adauga e VIZIBIL pentru tip 1'
FOR lnI = 1 TO RECCOUNT('crsarticole')
SELECT crsarticole
GO lnI
oform.do_adauga_articol(.T.)
ENDFOR
DOEVENTS FORCE
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO Assert WITH lnFact = 2, 'crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (fara linii);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO SeteazaCantitati WITH 'crsfactura'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S14P4Log WITH ' [pas] but_termin1.Click'
oform.but_termin1.Click()
DOEVENTS FORCE
DO S14P4Log WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S14P4Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = NVL(poDate.nid_vanzare, 0)
DO Assert WITH lnIdVz > 0, 'documentul exista (poDate.nid_vanzare, parametru OUT), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Reemiterea headless a unui document existent prin v2 (frm_facturare_articole2), traseul din
* test_s9_4_regenerare.prg Rularea2: incarca antet+linii, modifica o cantitate (forteaza ruta 1 =
* regenerare), do_scrie_factura() apelat direct - fara Show(), fara buton, fara modal.
FUNCTION ReemiteDocument
LPARAMETERS tnIdVechi
LOCAL lnCod, lnAn, lnLuna, lnIdFactVechi, lnDiscRon, lnDiscVal, loForm, llRez, lnIdVNou, lnRuta
gcCaz = '[reemitere] '
lnCod = 0
lnAn = 0
lnLuna = 0
lnIdFactVechi = 0
IF USED('crsAntetS14P4')
USE IN crsAntetS14P4
ENDIF
IF goExecutor.oExecuta([select cod, id_fact, extract(year from data_act) an, extract(month from data_act) luna ] + ;
[from vanzari where id_vanzare = ] + TRANSFORM(NVL(tnIdVechi,0)), 'crsAntetS14P4')
IF RECCOUNT('crsAntetS14P4') > 0
SELECT crsAntetS14P4
GO TOP
lnCod = NVL(cod, 0)
lnIdFactVechi = NVL(id_fact, 0)
lnAn = NVL(an, 0)
lnLuna = NVL(luna, 0)
ENDIF
USE IN crsAntetS14P4
ENDIF
DO Assert WITH lnCod > 0 AND lnAn > 0 AND lnLuna > 0, 'antetul lui D0 s-a citit (cod/an/luna), cod=' + TRANSFORM(lnCod)
IF lnCod <= 0
RETURN 0
ENDIF
lnDiscRon = 0
lnDiscVal = 0
poDate = IncarcaAntetFacturaEditare(tnIdVechi, @lnDiscRon, @lnDiscVal)
DO Assert WITH VARTYPE(poDate) = 'O', 'antetul lui D0 s-a incarcat pentru editare'
IF VARTYPE(poDate) <> 'O'
RETURN 0
ENDIF
IncarcaLiniiFacturaEditare(poDate, tnIdVechi)
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, 'liniile lui D0 s-au incarcat in crsfactura'
IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0
RETURN 0
ENDIF
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ELSE
SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane
ENDIF
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Assert WITH VARTYPE(loForm) = 'O', 'Createobject frm_facturare_articole2 (fara Show)'
IF VARTYPE(loForm) <> 'O'
RETURN 0
ENDIF
loForm.ndiscfactron = lnDiscRon
loForm.ndiscfactval = lnDiscVal
loForm.do_calculeaza_totaluri()
poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, tnIdVechi, lnIdFactVechi, lnCod, lnAn, lnLuna)
DO Assert WITH VARTYPE(poSnapshotEditare) = 'O', 'instantaneul de editare s-a creat'
IF VARTYPE(poSnapshotEditare) <> 'O'
TRY
loForm.Release()
CATCH
ENDTRY
RETURN 0
ENDIF
*-- modificare de cantitate: singura schimbare care forteaza ruta 1 (regenerare)
SELECT crsfactura
GO TOP
REPLACE cantitate WITH cantitate + 1 IN crsfactura
loForm.do_calculeaza_totaluri()
lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')
DO Assert WITH lnRuta = 1, 'ruta aleasa pentru modificarea de cantitate este 1 (regenerare), e=' + TRANSFORM(lnRuta)
IF lnRuta <> 1
TRY
loForm.Release()
CATCH
ENDTRY
RETURN 0
ENDIF
llRez = loForm.do_scrie_factura()
DO Assert WITH llRez, 'do_scrie_factura() a intors .T. pentru reemitere'
lnIdVNou = 0
IF llRez
lnIdVNou = NVL(poDate.nid_vanzare, 0)
ENDIF
DO Assert WITH lnIdVNou > 0, 'poDate.nid_vanzare (OUT) a iesit cu id-ul documentului nou, e=' + TRANSFORM(lnIdVNou)
TRY
loForm.Release()
CATCH
ENDTRY
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crsarticole_doc'
DO Inchide WITH 'crsarticole_editare'
DO Inchide WITH 'snap_linii_editare'
DO Inchide WITH 'jtva_coloane'
poSnapshotEditare = NULL
DO Goleste
gcCaz = ''
RETURN lnIdVNou
ENDFUNC
*==================================================================================
* Citeste ID_UTIL/DATAORA/ID_UTILM/DATAORAM pentru un id_vanzare, plus flag-uri NULL distincte
* (0/{} nu s-ar distinge de o valoare reala lipsa).
FUNCTION CitesteAuditVanzare
LPARAMETERS tnIdVanzare, tnIdUtil, tdDataora, tnIdUtilm, tdDataoram, tlUtilmNul, tlDataoramNul
tnIdUtil = 0
tdDataora = {}
tnIdUtilm = 0
tdDataoram = {}
tlUtilmNul = .F.
tlDataoramNul = .F.
LOCAL llOk
llOk = .F.
IF USED('crsAuditS14P4')
USE IN crsAuditS14P4
ENDIF
IF goExecutor.oExecuta([select id_util, dataora, id_utilm, dataoram, ] + ;
[case when id_utilm is null then 1 else 0 end as utilmnul, ] + ;
[case when dataoram is null then 1 else 0 end as dataoramnul ] + ;
[from vanzari where id_vanzare = ] + TRANSFORM(NVL(tnIdVanzare,0)), 'crsAuditS14P4')
IF RECCOUNT('crsAuditS14P4') > 0
SELECT crsAuditS14P4
GO TOP
tnIdUtil = NVL(id_util, 0)
tdDataora = NVL(dataora, {})
tnIdUtilm = NVL(id_utilm, 0)
tdDataoram = NVL(dataoram, {})
tlUtilmNul = (utilmnul = 1)
tlDataoramNul = (dataoramnul = 1)
llOk = (tnIdUtil > 0)
ENDIF
USE IN crsAuditS14P4
ENDIF
RETURN llOk
ENDFUNC
*==================================================================================
* Seteaza cantitatea (zeroita de do_initializeaza_articol pentru tip 1) pe toate liniile din
* crsfactura si recalculeaza linia, ca la S5c/S6-1.
PROCEDURE SeteazaCantitati
LPARAMETERS tcAlias
LOCAL loArt
SELECT (tcAlias)
SCAN
REPLACE cantitate WITH gnCantitateAleasa
SCATTER NAME loArt MEMO
loArt = calculeaza_totaluri(loArt)
GATHER NAME loArt MEMO
ENDSCAN
ENDPROC
PROCEDURE Elibereaza
LPARAMETERS toForm
IF TYPE('toForm') = 'O' AND !ISNULL(toForm)
TRY
toForm.Release()
CATCH
ENDTRY
ENDIF
DO CuratieCrs
ENDPROC
PROCEDURE Goleste
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
ENDPROC
PROCEDURE CuratieCrs
DO Inchide WITH 'crsarticole'
DO Inchide WITH 'crsarticoleSel'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
* ultima zi din luna deschisa acoperita de VCURS pentru EURO - cursor_preturi refuza o zi fara curs
FUNCTION DataCursValid
LOCAL ldRez, lcSql, lnQ, lcUltima
ldRez = DATE(gnAn, gnLuna, 1)
lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01'
IF USED('crscurszi')
USE IN crscurszi
ENDIF
lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ;
[where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))]
lnQ = goExecutor.oExecute(lcSql, 'crscurszi')
IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0
GO TOP IN crscurszi
IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8
ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4))
ENDIF
ELSE
DO S14P4Log WITH ' DataCursValid ESEC: ' + goExecutor.oPrelucrareEroare()
ENDIF
IF USED('crscurszi')
USE IN crscurszi
ENDIF
RETURN ldRez
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S14P4Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S14P4Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S14P4Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S14P4Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S14P4Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S14P4Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS14P4') = 'O'
_SCREEN.tmrS14P4.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS14P4')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata),
*-- deci se inchid explicit inainte
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
*-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si
*-- care e ARS (alocat si nescris)
TRY
IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ;
[where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 750 order by numar_act], 'crsNrSSS') >= 0
DO S14P4Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-750):'
SELECT crsNrSSS
SCAN
DO S14P4Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S14P4Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S14P4Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S14P4Log WITH 'END ' + TTOC(DATETIME())
DO HarnessDone WITH 'done'
QUIT
ENDPROC
*==================================================================================
* driverS14P4: apasa automat pe formele modale care nu trec prin functia amessagebox -
* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release).
DEFINE CLASS driverS14P4 AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS14P4') = 'O'
_SCREEN.tmrS14P4.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S14P4Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S14P4Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S14P4Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S14P4Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S14P4Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S14P4Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ')'
loAlteDate.do_termin()
CATCH TO loExcAD
DO S14P4Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S14P4Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS14P4') = 'O'
_SCREEN.tmrS14P4.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,16 @@
# test_s14_neregresie_emitere_noua.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru
# test_s14_neregresie_emitere_noua.prg (S14, proba 4: neregresie pe calea de emitere noua).
# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T
# coloanele de grid nu se materializeaza si FRM_ALTE_DATE (Show(1)) ar bloca rularea.
# Rulare: powershell -ExecutionPolicy Bypass -File test_s14_neregresie_emitere_noua.ps1 (timeout >= 400s)
$ErrorActionPreference = 'Stop'
$Teste = $PSScriptRoot
Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue
& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') `
-TestPrg (Join-Path $Teste 'test_s14_neregresie_emitere_noua.prg') `
-Steps @('env_gata','d0_emis','d1_reemis','d2_emis_si_verificat') `
-StepTimeoutSec 150 `
-ReadyTimeoutSec 180 `
-SyncDir (Join-Path $Teste 'uisync_s14p4') `
-ShotsDir (Join-Path $Teste 'screenshots_s14p4')

View File

@@ -55,7 +55,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -49,7 +49,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
*-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit)
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -60,7 +60,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -47,7 +47,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
*-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit)
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -43,7 +43,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
*!* fisierul cautat PRIMUL, deci trebuie deschis inaintea lantului din test_init_env_auto
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -34,7 +34,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1,130 @@
* test_s7_urmasi.prg
* Verifica DocumentAreUrmasi (ofacturare_editare.prg), functie noua S7: interogare read-only
* pe VANZARI_CORESP, aceeasi conditie citita de pack_facturare.sterge_factura, dar mai devreme.
* Documente reale, gasite prin interogare (nu inventate): un aviz cu factura emisa din el
* (id_vanzare_aviz dintr-un rand TIP=1), un aviz fara nicio corespondenta, si o factura cu
* retur emis pe ea (id_vanzare_aviz dintr-un rand TIP=3). Nu scrie in Oracle - doar SELECT.
* Verifica de asemenea ca Createobject('frm_facturi') compileaza clasa dupa adaugarea metodei
* noi do_editare_unificata (fara Show() - doar proba de compilare/instantiere).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s7_urmasi_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul -
*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
gnPass = 0
gnFail = 0
*!* --- control direct pe DocumentAreUrmasi, fara formular ---
*!* id_vanzare=664: aviz cu factura emisa din el (vanzari_coresp.tip=1) -> are urmasi
DO asserteaza WITH 'DocumentAreUrmasi(664) = .T. (aviz cu factura emisa)', DocumentAreUrmasi(664), TRANSFORM(DocumentAreUrmasi(664))
*!* id_vanzare=1061: aviz fara nicio corespondenta in vanzari_coresp -> fara urmasi
DO asserteaza WITH 'DocumentAreUrmasi(1061) = .F. (aviz fara corespondenta)', !DocumentAreUrmasi(1061), TRANSFORM(DocumentAreUrmasi(1061))
*!* id_vanzare=622: factura cu retur emis pe ea (vanzari_coresp.tip=3) -> are urmasi
DO asserteaza WITH 'DocumentAreUrmasi(622) = .T. (factura cu retur emis)', DocumentAreUrmasi(622), TRANSFORM(DocumentAreUrmasi(622))
DO asserteaza WITH 'DocumentAreUrmasi(0) = .F. (id inexistent)', !DocumentAreUrmasi(0), TRANSFORM(DocumentAreUrmasi(0))
*!* --- proba de traseu real: crsfacturi construit exact ca in oproceduri_facturare.vizualizare_facturi,
*!* filtrat pe cele 3 documente reale de mai sus (nu pe luna curenta - ele pot fi din alta luna) ---
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare in (664, 622, 1061)]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
DO asserteaza WITH 'crsfacturi incarcat cu cele 3 documente reale (rownum=3)', Used('crsfacturi') AND Reccount('crsfacturi') = 3, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa')
LOCAL loFrm
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
DO asserteaza WITH 'Newobject(frm_facturi) reuseste dupa adaugarea metodei noi, cu crsfacturi real deschis', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
IF Vartype(m.loFrm) == 'O'
DO asserteaza WITH 'frm_facturi.ClassLibrary e fisierul editat (nu alt produs)', Upper(loFrm.ClassLibrary) == Upper('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx'), loFrm.ClassLibrary
DO asserteaza WITH 'metoda noua do_editare_unificata exista pe obiect (PEMSTATUS)', Pemstatus(m.loFrm, 'do_editare_unificata', 5), ''
*!* id_vanzare=664: aviz cu urmasi -> proba ca traseul complet (garzile) ruleaza fara eroare VFP
Select crsfacturi
Locate For id_vanzare = 664
IF Found()
loFrm.do_editare_unificata()
STRTOFILE('do_editare_unificata(664): lactiv3=' + Transform(loFrm.lactiv3) + ' mesaj mock=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1)
DO asserteaza WITH 'do_editare_unificata(664) ruleaza fara eroare VFP necaptata (mock a primit un mesaj sau lactiv3=.F.)', !Empty(gcMockUltimMesaj) OR !loFrm.lactiv3, gcMockUltimMesaj
ENDIF
ENDIF
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,540 @@
* test_s8_pas7_cablare.prg
* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de
* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2).
* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe
* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea).
* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile
* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin
* interogare read-only pe MARIUSM_AUTO:
* 1113 - sursa COMANDA (tip=3, id_comanda=2479)
* 1055 - sursa CONTRACT (tip=2, id_ctr=234)
* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr)
* 1130 - VALUTA (tip=5, in_valuta=1)
* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie
* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII).
*
* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il
* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine
* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN,
* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza
* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma
* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS -
* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa-
* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in
* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie.
*
* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7
* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele,
* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init,
* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare
* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc,
* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece
* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu
* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice
* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum
* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_base_triaj_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul -
*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
gnPass = 0
gnFail = 0
*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului ---
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p7', 'Timer')
_SCREEN.tmrS8p7.Interval = 150
Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p7.Enabled = .T.
*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea
*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) ---
LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda
lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2')
lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc)
DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart)
IF lnStart > 0
lcTail = SUBSTR(lcSrc, lnStart)
lnEnd = AT('ENDPROC', lcTail)
lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6))
DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., ''
DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., ''
DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., ''
ENDIF
*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente ---
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa')
*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din
*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10).
DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda'
DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract'
DO VerificaEditare WITH 1048, 'factura simpla', .F., ''
DO VerificaEditare WITH 1130, 'valuta', .F., ''
_SCREEN.tmrS8p7.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p7')
Catch
Endtry
*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) ---
DO VerificaDocumentNou
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE VerificaEditare
LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata
LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm
LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB
LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA
lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']'
gcMockUltimMesaj = ''
*!* --- G2: snapshot generator de numere, INAINTE ---
IF Used('v_plaje_a')
Use In v_plaje_a
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a')
goExecutor.oReset()
lcSnapPlajeA = CursorToSnapshot('v_plaje_a')
Use In v_plaje_a
*!* --- G8: snapshot dataoras/id_utils, INAINTE ---
IF Used('v_g8a')
Use In v_g8a
ENDIF
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces)
ltDataorasVanzareA = v_g8a.dataoras
lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0)
Use In v_g8a
IF Used('v_g8d_a')
Use In v_g8d_a
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a')
goExecutor.oReset()
lcSnapDetA = CursorToSnapshot('v_g8d_a')
Use In v_g8d_a
*!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata ---
*!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) -
*!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici
Select crsfacturi
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
IF Vartype(m.loFrm) <> 'O'
RETURN
ENDIF
Select crsfacturi
Locate For id_vanzare = m.tnIdVanzare
DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found())
IF !Found()
loFrm.Release()
RETURN
ENDIF
*!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi
*!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis ---
goDriverS8p7.Reseteaza()
loFrm.do_editare_unificata()
DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit)
*!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis
*!* (infirmarea §3.2 - vezi raport) ---
DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ;
goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent)
IF m.tlCtClbAsteptat
DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ;
Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta
ENDIF
*!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul
*!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) ---
DO VerificaBlocajGrupBC WITH m.lcPrefix
*!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata)
*!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor ---
Select crsfacturi
IF Nvl(crsfacturi.in_valuta, 0) = 1
DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ;
Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval)
ELSE
DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ;
Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva)
ENDIF
loFrm.Release()
*!* --- G9: niciun dialog modal la deschidere ---
DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj
*!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter ---
IF Used('v_plaje_b')
Use In v_plaje_b
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b')
goExecutor.oReset()
lcSnapPlajeB = CursorToSnapshot('v_plaje_b')
Use In v_plaje_b
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
*!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII ---
IF Used('v_g8a2')
Use In v_g8a2
ENDIF
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2')
goExecutor.oReset()
*!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.),
*!* fals negativ fara el
DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ;
Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL')
DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0))
Use In v_g8a2
IF Used('v_g8d_b')
Use In v_g8d_b
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b')
goExecutor.oReset()
lcSnapDetB = CursorToSnapshot('v_g8d_b')
Use In v_g8d_b
DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, ''
*!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare
*!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala ---
DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, ''
ENDPROC
*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja
*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e
*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare.
PROCEDURE VerificaBlocajGrupBC
LPARAMETERS tcPrefix
IF goDriverS8p7.lCtClbPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv)
ENDIF
DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ;
goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv)
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ;
goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv)
IF goDriverS8p7.lCtClbValutaPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv)
ENDIF
IF goDriverS8p7.lClbZiCursPrezent
DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv)
ENDIF
IF goDriverS8p7.lCtClbGestiuneInitPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv)
ENDIF
IF goDriverS8p7.lCtClbPolPreturiPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv)
ENDIF
DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ;
goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv)
DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ;
goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv)
IF goDriverS8p7.lCtIncasarePrezent
DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv)
DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv)
ENDIF
ENDPROC
*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md).
*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate
*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0),
*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou
*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa
*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus);
*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle.
*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara
*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e
*!* nevoie de driverS8p7 aici.
PROCEDURE VerificaDocumentNou
PRIVATE poDate
LOCAL loForm
poDate = Createobject('oDateFactura', 0, 0)
poDate.tip = 3
poDate.id_client = 0
poDate.incasat = 0
loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx')
DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
IF Vartype(m.loForm) <> 'O'
RETURN
ENDIF
DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare)
IF loForm.do_exista_obiect('Ct_clb_altele')
DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv)
ENDIF
DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled)
DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv)
IF loForm.do_exista_obiect('Ct_clb_valuta')
DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv)
ENDIF
IF loForm.do_exista_obiect('Clb_zi_curs')
DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly)
ENDIF
IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate)
DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv)
ENDIF
IF loForm.do_exista_obiect('Ct_clb_politici_preturi')
DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv)
ENDIF
DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled)
DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled)
IF loForm.do_exista_obiect('ct_incasare')
DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
ENDIF
loForm.Release()
ENDPROC
PROCEDURE CursorToSnapshot
LPARAMETERS tcAlias
LOCAL lcResult, lnI
lcResult = ''
SELECT (m.tcAlias)
SCAN
FOR lnI = 1 TO FCOUNT()
lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|'
ENDFOR
lcResult = lcResult + Chr(10)
ENDSCAN
RETURN m.lcResult
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe
*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi
*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM).
*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS
*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului.
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
lCtClbPrezent = .F.
lCtClbAlteleActiv = .F.
cCtClbEticheta = ''
nTotalRon = 0
nTotalVal = 0
*!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost
*!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa
*!* mecanismul folosit de fiecare control)
lClbFdocPrezent = .F.
lClbFdocActiv = .F.
lCtClbNumeClientPrezent = .F.
lCtClbNumeClientActiv = .F.
lCtClbValutaPrezent = .F.
lCtClbValutaActiv = .F.
lClbZiCursPrezent = .F.
lClbZiCursActiv = .F.
lCtClbGestiuneInitPrezent = .F.
lCtClbGestiuneInitActiv = .F.
lCtClbPolPreturiPrezent = .F.
lCtClbPolPreturiActiv = .F.
lButIncarcaArticolePrezent = .F.
lButIncarcaArticoleActiv = .F.
lButCursuriPrezent = .F.
lButCursuriActiv = .F.
lCtIncasarePrezent = .F.
lCtIncasareActiv = .F.
lChkIncasarePrezent = .F.
lChkIncasareActiv = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
This.lCtClbPrezent = .F.
This.lCtClbAlteleActiv = .F.
This.cCtClbEticheta = ''
This.nTotalRon = 0
This.nTotalVal = 0
This.lClbFdocPrezent = .F.
This.lClbFdocActiv = .F.
This.lCtClbNumeClientPrezent = .F.
This.lCtClbNumeClientActiv = .F.
This.lCtClbValutaPrezent = .F.
This.lCtClbValutaActiv = .F.
This.lClbZiCursPrezent = .F.
This.lClbZiCursActiv = .F.
This.lCtClbGestiuneInitPrezent = .F.
This.lCtClbGestiuneInitActiv = .F.
This.lCtClbPolPreturiPrezent = .F.
This.lCtClbPolPreturiActiv = .F.
This.lButIncarcaArticolePrezent = .F.
This.lButIncarcaArticoleActiv = .F.
This.lButCursuriPrezent = .F.
This.lButCursuriActiv = .F.
This.lCtIncasarePrezent = .F.
This.lCtIncasareActiv = .F.
This.lChkIncasarePrezent = .F.
This.lChkIncasareActiv = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
This.nTotalRon = Nvl(loFrm2.ntotalron, 0)
This.nTotalVal = Nvl(loFrm2.ntotalval, 0)
FOR lnJ = 1 TO loFrm2.Objects.Count
loObj = loFrm2.Objects(m.lnJ)
DO CASE
CASE Upper(loObj.Name) == 'CT_CLB_ALTELE'
This.lCtClbPrezent = .T.
This.lCtClbAlteleActiv = loObj.lactiv
This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption)
CASE Upper(loObj.Name) == 'CLB_FDOC'
This.lClbFdocPrezent = .T.
This.lClbFdocActiv = loObj.cboFdoc.Enabled
CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT'
This.lCtClbNumeClientPrezent = .T.
This.lCtClbNumeClientActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'CT_CLB_VALUTA'
This.lCtClbValutaPrezent = .T.
This.lCtClbValutaActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'CLB_ZI_CURS'
This.lClbZiCursPrezent = .T.
This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly
CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI'
This.lCtClbPolPreturiPrezent = .T.
This.lCtClbPolPreturiActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE'
This.lButIncarcaArticolePrezent = .T.
This.lButIncarcaArticoleActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'BUT_CURSURI'
This.lButCursuriPrezent = .T.
This.lButCursuriActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CT_INCASARE'
This.lCtIncasarePrezent = .T.
This.lCtIncasareActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CHK_INCASARE'
This.lChkIncasarePrezent = .T.
This.lChkIncasareActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CT_CONTABILITATE'
FOR lnJ2 = 1 TO loObj.Objects.Count
loObj2 = loObj.Objects(m.lnJ2)
IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT'
This.lCtClbGestiuneInitPrezent = .T.
This.lCtClbGestiuneInitActiv = loObj2.lactiv
ENDIF
ENDFOR
ENDCASE
ENDFOR
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -0,0 +1,922 @@
* test_s8_editare_incarcare.prg
* Suita COMPLETA a pasului 8 (docs\propunere_s8_incarcare.md §5.1): G1-G11 intr-o singura rulare,
* traseul REAL Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe
* frm_facturare_articole2 - proba doar codul, nu rutarea, cf. handoff §4.0a).
*
* NU inlocuieste test_s8_pas7_cablare.prg (ramane pe loc, neatins) - o completeaza cu:
* - un al treilea tip de sursa (1047, DEVIZE AUTO, fara delegat)
* - un document AVIZ pozitiv (1110, tip=22) si unul NEGATIV/istoric (953, tip=23, respins de garda
* "luna curenta") - Ct_clb_politici_preturi ramane totusi neexercitat, vezi raportul (motivat mai jos)
* - G3/G4/G4b (linii) verificate si pe traseul COMPLET, nu doar pe IncarcaLiniiFacturaEditare izolat
* - R1: curatenie de aliasuri + jurnal AUSED() intre cazuri (lectia din triaj_s8_regresie_28fail.md)
* - R2: diagnostic care distinge, cand formularul NU se deschide, intre iesire CU mesaj de garda,
* iesire silentioasa CONFIRMATA prin IncarcaAntetFacturaEditare (ofacturare_editare.prg:83-86) si
* iesire silentioasa NEEXPLICATA de acea cale (candidat: cursa driverului/Timer)
*
* Documente reale, gasite prin interogare read-only pe MARIUSM_AUTO (probe_s8p8_candidati.prg,
* probe_s8p8_garzi.prg - pastrate ca dovada in acest director):
* 1113 - sursa COMANDA (tip=3) [reluat din pas7, stabil 133/0 x3]
* 1055 - sursa CONTRACT (tip=2) [reluat din pas7]
* 1048 - factura SIMPLA, lista de preturi (tip=1) [reluat din pas7]
* 1130 - VALUTA (tip=5) [reluat din pas7]
* 1047 - DEVIZE AUTO (tip=-12), FARA DELEGAT (id_delegat=0/NULL) - singurul document din toata
* schema care trece toate garzile do_editare_unificata SI nu are delegat (interogarea D din
* probe_s8p8_candidati_log.txt: 0 rezultate pe tip 1-4 fara delegat, 1 rezultat pe orice tip
* valid - exact acesta). Deja folosit, izolat, in test_s8_pas6_linii.prg.
* 1110 - AVIZ DIN LISTA DE PRETURI (tip=22), luna curenta, toate garzile trec (probe_s8p8_garzi).
* CORECTAT fata de prima trecere a acestei suite (vezi docs\raport_s8_pas8_suita.md §2/§10):
* la editare, IncarcaAntetFacturaEditare (ofacturare_editare.prg:94) seteaza intotdeauna
* nIdTipDoc = nIdTipDocFactura pentru documente ne-proforma, deci llAviz = (poDate.nIdTipDoc
* = poDate.nIdTipDocAvizExpeditie) e mereu .F. la editare, indiferent de poDate.tip - ramura
* "aviz" a Do Case-ului din Init (ofacturare.vc2 ~21030) nu se activeaza NICIODATA la editare.
* Toate documentele editate, aviz sau nu, trec prin ramura "factura" (~21148+), care scoate
* Ct_clb_politici_preturi NECONDITIONAT pentru orice tip. Deci controlul lipseste la editare
* pe toate tipurile, nu doar pe 22 - exercita restul traseului de aviz (G1-G9,G11).
* 953 - AVIZ SUBUNITATI (tip=23), mai 2022 (istoric) - caz NEGATIV. Premiza initiala ("tip 23/41
* pastreaza Ct_clb_politici_preturi la editare") s-a dovedit FALSA (vezi 1110 mai sus - acea
* ramura nu se activeaza deloc la editare). Documentul ramane util ca proba a garzii "luna
* curenta": probe_s8p8_garzi_log.txt arata ca 953 cade pe ea (documentul e din mai 2022,
* sesiunea de test ruleaza in luna contabila curenta august 2026) - respins CU mesaj, nu
* silentios, fara sa deschida formularul si fara sa consume niciun numar (G2).
*
* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie (G8).
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_editare_incarcare_log.txt'
STRTOFILE('start ' + Transform(Datetime()) + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
gnIdUtil = 8
*!* gnScadereStoc: neinitializat de test_init_env_auto_roafacturare.prg. Documentele tip 1-5 nu-l
*!* citesc (cad in ramura OTHERWISE a Do Case-ului din Init, care nu-l testeaza), dar 1110 (tip=22)
*!* intra pe ramura "CASE gnScadereStoc=0 AND poDate.tip=22" - fara variabila declarata, VFP arunca
*!* "Variable GNSCADERESTOC is not found". Precedent: creeaza_documente_s8.prg (acelasi director)
*!* seteaza explicit gnScadereStoc=0 ca parte a mediului de test, nu a codului de productie.
PUBLIC gnScadereStoc
gnScadereStoc = 0
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul -
*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless
LOCAL lcProcExistent
lcProcExistent = SET("PROCEDURE")
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent
PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
gnPass = 0
gnFail = 0
*!* --- driver care inchide fereastra modala frm_facturare_articole2 (acelasi tipar validat in
*!* test_s8_pas7_cablare.prg / driverS8p7 - Timer legat de _SCREEN prin Bindevent, viu in interiorul
*!* Show()-ului modal, care citeste formularul din colectia Objects si il elibereaza) ---
PUBLIC goDriverS8p7
goDriverS8p7 = Createobject('driverS8p7')
_SCREEN.AddObject('tmrS8p8', 'Timer')
_SCREEN.tmrS8p8.Interval = 150
Bindevent(_SCREEN.tmrS8p8, 'Timer', goDriverS8p7, 'Executa')
_SCREEN.tmrS8p8.Enabled = .T.
*!* --- verificare statica G2: corpul do_editare_unificata nu contine nicio referinta la alocarea
*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) ---
LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda
lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2')
lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc)
DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart)
IF lnStart > 0
lcTail = SUBSTR(lcSrc, lnStart)
lnEnd = AT('ENDPROC', lcTail)
lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6))
DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., ''
DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., ''
DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., ''
ENDIF
*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe toate documentele de test ---
Private poFacturi
poFacturi = Null
IF Used('crsfacturi')
Use In crsfacturi
ENDIF
LOCAL lcSchema, lcSelect, lcOrder, lcFiltru
lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ;
['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ;
['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ;
['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ;
['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ;
['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ;
['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ;
['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ;
['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ;
['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+;
['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)']
lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ;
['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ;
['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ;
['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ;
['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ;
['valuta,id_valuta,valval,tvaval,totval,'+] + ;
['id_delegat,id_agent,id_masina,valoarea,'+] + ;
['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ;
['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ;
['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+;
['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where ']
lcOrder = [data_act,numar_act]
lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130, 1047, 1110, 953)]
gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., [])
poFacturi.ca_baza1.afisare()
DO asserteaza WITH 'crsfacturi incarcat cu cele 7 documente reale (rownum=7)', Used('crsfacturi') AND Reccount('crsfacturi') = 7, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa')
*!* =====================================================================================
*!* Cazurile POZITIVE - documentul trebuie sa se deschida (G1-G9, G11, plus G3/G4/G4b pe linii)
*!* Ct_clb_altele (infirmare §3.2 din propunerea S8): document CU sursa comanda/contract -> prezent,
*!* etichetat; factura simpla/valuta/aviz(tip22)/devize(tip-12) editate (nu copiate) -> absent, G10.
*!* =====================================================================================
DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda', .T.
DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract', .T.
DO VerificaEditare WITH 1048, 'factura simpla', .F., '', .T.
DO VerificaEditare WITH 1130, 'valuta', .F., '', .T.
*!* 1047/1110: nici tip=-12 (DEVIZE AUTO), nici tip=22 (aviz lista preturi) nu se incadreaza in
*!* Inlist(poDate.tip,1,5,10,48,49) - unicul grup pe care Init il scoate la editare (llCopiere=.F.)
*!* in ramura "factura" (llAviz e mereu .F. la editare, cf. IncarcaAntetFacturaEditare:94, care
*!* seteaza mereu nIdTipDocFactura pentru documente ne-proforma - ramura de aviz din Do Case NU se
*!* activeaza niciodata la editare, indiferent de poDate.tip). Deci Ct_clb_altele RAMANE prezent,
*!* dar FARA eticheta schimbata (niciun Case din Do Case-ul "gnScadereStoc=0" nu acopera 22/-12) -
*!* verificat pe rulare (test_s8_p8_candidati/garzi + prima trecere a acestei suite). Nu se
*!* verifica eticheta exacta (ramane design-time, neschimbata de do_schimba_explicatia).
DO VerificaEditare WITH 1047, 'DEVIZE AUTO, fara delegat', .T., '', .T.
DO VerificaEditare WITH 1110, 'aviz din lista de preturi (tip=22)', .T., '', .F.
*!* =====================================================================================
*!* Cazul NEGATIV - 953, aviz istoric (tip=23), respins de garda "luna curenta"
*!* =====================================================================================
DO VerificaEditareRespinsa WITH 953, 'aviz istoric tip=23, respins - luna curenta', 'luna curenta'
*!* --- S8 incasarea la editare (D1/D3/D4) - foloseste Show() real, deci trebuie sa ruleze inainte
*!* de teardown-ul lui tmrS8p8 de mai jos. 1071: tip_incasare=11 (chitanta) -> mod 2.
*!* 1072: tip_incasare=2 (bon fiscal) -> mod 3, cazul in care hardcodarea veche "mod 2" ar fi mintit.
DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2
DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3
_SCREEN.tmrS8p8.Enabled = .F.
Try
_SCREEN.RemoveObject('tmrS8p8')
Catch
Endtry
*!* --- S8 grupurile B/C: neregresie pe document NOU ---
DO VerificaDocumentNou
STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('end ' + Transform(Datetime()) + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
*!* =====================================================================================
*!* R1: curatenie intre cazuri - inchide aliasurile care raman deschise dupa
*!* IncarcaLiniiFacturaEditare/do_calculeaza_totaluri/Init-ul formularului (gasite la X2,
*!* docs\raport_s8_driver_determinist.md): CRSGESTIUNI, JTVA_COLOANE(_TEMP), SAFT_TAXTABLE,
*!* CRSCURSURI. Nu produc FAIL azi (X2: Select crsfacturi/crsfactura restaureaza mereu zona
*!* corecta), dar cresc numarul de work area-uri intre cazuri - se inchid explicit aici ca sa nu
*!* se acumuleze pe 8 cazuri (limita VFP de work areas e departe, dar igiena conteaza pe R1).
*!* =====================================================================================
PROCEDURE CurataAliasuriReziduale
LOCAL laAlias(1), lnI, lcA
laAlias(1) = 'CRSGESTIUNI'
DIMENSION laAlias(9)
laAlias(2) = 'JTVA_COLOANE'
laAlias(3) = 'JTVA_COLOANE_TEMP'
laAlias(4) = 'SAFT_TAXTABLE'
laAlias(5) = 'CRSCURSURI'
laAlias(6) = 'CRSARTICOLE_DOC'
laAlias(7) = 'CRSARTICOLE_EDITARE'
laAlias(8) = 'V_ANTET_EDITARE'
laAlias(9) = 'CRSFACTURA'
FOR lnI = 1 TO ALEN(laAlias)
lcA = laAlias(lnI)
IF Used(m.lcA)
Use In (m.lcA)
ENDIF
ENDFOR
ENDPROC
*!* R1: jurnal AUSED() - numarul de work area-uri deschise, ca sa se vada ca starea de start e
*!* aceeasi la fiecare caz (semnalul de scurgere din triaj: 16 -> 16 -> 17 -> 17, in crestere)
PROCEDURE LogAUsed
LPARAMETERS tcEticheta
LOCAL lnN, laAliasuri(1), lnI, lcLista
lnN = AUSED(laAliasuri)
lcLista = ''
FOR lnI = 1 TO m.lnN
lcLista = lcLista + laAliasuri(m.lnI,1) + ' '
ENDFOR
STRTOFILE('AUSED ' + m.tcEticheta + ' = ' + TRANSFORM(m.lnN) + ' [' + m.lcLista + ']' + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
PROCEDURE VerificaEditare
LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata, tlVerificaLinii
LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm
LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB
LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA
lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']'
gcMockUltimMesaj = ''
*!* --- R1: curatenie + jurnal AUSED INAINTE de caz ---
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' INAINTE'
*!* --- G2: snapshot generator de numere, INAINTE ---
IF Used('v_plaje_a')
Use In v_plaje_a
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a')
goExecutor.oReset()
lcSnapPlajeA = CursorToSnapshot('v_plaje_a')
Use In v_plaje_a
*!* --- G8: snapshot dataoras/id_utils, INAINTE ---
IF Used('v_g8a')
Use In v_g8a
ENDIF
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces)
ltDataorasVanzareA = v_g8a.dataoras
lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0)
Use In v_g8a
IF Used('v_g8d_a')
Use In v_g8d_a
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a')
goExecutor.oReset()
lcSnapDetA = CursorToSnapshot('v_g8d_a')
Use In v_g8d_a
*!* --- martor G3/G4/G4b: interogare INDEPENDENTA pe VANZARI_DETALII+NOM_ARTICOLE, INAINTE de
*!* codul testat (acelasi tipar ca test_s8_pas6_linii.prg, dar aici pe traseul COMPLET) ---
LOCAL lnMartorLinii
lnMartorLinii = 0
IF m.tlVerificaLinii
IF Used('v_g4pre')
Use In v_g4pre
ENDIF
lnSucces = goExecutor.oExecute([select count(*) as nr from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ and sters = 0], 'v_g4pre')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': martor G3 Oracle a reusit', lnSucces >= 0 AND Used('v_g4pre'), Transform(lnSucces)
lnMartorLinii = Nvl(v_g4pre.nr, 0)
Use In v_g4pre
IF Used('v_g4')
Use In v_g4
ENDIF
lnSucces = goExecutor.oExecute([select vd.id_vanzare_det, vd.cantitate, vd.taxcode, vd.lot, vd.serie, ] + ;
[na.in_stoc from vanzari_detalii vd left join nom_articole na on na.id_articol = vd.id_articol ] + ;
[where vd.id_vanzare = ] + Transform(m.tnIdVanzare) + [ and vd.sters = 0 order by vd.id_vanzare_det], 'v_g4')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': martor G4/G4b Oracle a reusit', lnSucces >= 0 AND Used('v_g4'), Transform(lnSucces)
ENDIF
*!* --- R2 diagnostic PRE: IncarcaAntetFacturaEditare, apel direct izolat - baseline. Daca
*!* traseul complet de mai jos nu deschide formularul, aceasta valoare arata daca poarta
*!* silentioasa (cale 11, ofacturare_editare.prg:83-86) era deja activa INAINTE de orice
*!* interferenta a traseului complet (frm_facturi/driver) ---
LOCAL poDateDiagPre, lnDiscRPre, lnDiscVPre
poDateDiagPre = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPre, @lnDiscVPre)
DO asserteaza WITH lcPrefix + ': diagnostic - IncarcaAntetFacturaEditare (apel direct, izolat) reuseste', Vartype(poDateDiagPre) == 'O', Vartype(poDateDiagPre)
IF Used('v_antet_editare')
Use In v_antet_editare
ENDIF
*!* --- G1/G6/G7: poDateDiagPre e chiar obiectul pe care do_editare_unificata il va construi mai
*!* jos (aceeasi functie, acelasi id_vanzare, fara nicio scriere intre timp) - comparat cu randul
*!* deja incarcat in crsfacturi (acelasi SELECT ca fact_vfacturi, martor independent) ---
IF Vartype(poDateDiagPre) == 'O'
Select crsfacturi
Locate For id_vanzare = m.tnIdVanzare
IF Found()
DO asserteaza WITH lcPrefix + ' G1: serie_act = VANZARI', Alltrim(Nvl(poDateDiagPre.serie_act,'')) == Alltrim(Nvl(crsfacturi.serie_act,'')), poDateDiagPre.serie_act
DO asserteaza WITH lcPrefix + ' G1: nract = VANZARI', poDateDiagPre.nract == Nvl(crsfacturi.numar_act,0), Transform(poDateDiagPre.nract)
DO asserteaza WITH lcPrefix + ' G1: dataact = VANZARI', poDateDiagPre.dataact == crsfacturi.data_act, Dtoc(poDateDiagPre.dataact)
DO asserteaza WITH lcPrefix + ' G1: datascad = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.data_scad), Isnull(poDateDiagPre.datascad), poDateDiagPre.datascad == crsfacturi.data_scad), Transform(poDateDiagPre.datascad)
DO asserteaza WITH lcPrefix + ' G6: discount_evidentiat = VANZARI', poDateDiagPre.discount_evidentiat == Nvl(crsfacturi.discount_evidentiat,0), Transform(poDateDiagPre.discount_evidentiat)
IF poDateDiagPre.in_valuta = 0
DO asserteaza WITH lcPrefix + ' G6: discount (lei) = VANZARI', Round(lnDiscRPre,2) == Round(Nvl(crsfacturi.discount,0),2), Transform(lnDiscRPre)
ENDIF
DO asserteaza WITH lcPrefix + ' G7: id_delegat = VANZARI (sau ambele NULL - cazul "fara delegat")', ;
Iif(Isnull(crsfacturi.id_delegat), Isnull(poDateDiagPre.id_delegat), Nvl(poDateDiagPre.id_delegat,0) == Nvl(crsfacturi.id_delegat,0)), Transform(Nvl(poDateDiagPre.id_delegat,-1))
DO asserteaza WITH lcPrefix + ' G7: nume_delegat = VANZARI', Alltrim(Nvl(poDateDiagPre.nume_delegat,'')) == Alltrim(Nvl(crsfacturi.delegat,'')), poDateDiagPre.nume_delegat
DO asserteaza WITH lcPrefix + ' G7: adresa_facturare = VANZARI', Alltrim(Nvl(poDateDiagPre.adresa_facturare,'')) == Alltrim(Nvl(crsfacturi.adresa_facturare,'')), poDateDiagPre.adresa_facturare
DO asserteaza WITH lcPrefix + ' G7: listare_detaliata = VANZARI', poDateDiagPre.nListareDetaliata == Nvl(crsfacturi.listare_detaliata,0), Transform(poDateDiagPre.nListareDetaliata)
DO asserteaza WITH lcPrefix + ' G7: efactura = VANZARI', poDateDiagPre.eFactura == Nvl(crsfacturi.efactura,0), Transform(poDateDiagPre.eFactura)
DO asserteaza WITH lcPrefix + ' G7: id_ruta = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.id_ruta), Isnull(poDateDiagPre.id_ruta), poDateDiagPre.id_ruta == crsfacturi.id_ruta), Transform(poDateDiagPre.id_ruta)
ENDIF
ENDIF
*!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata ---
*!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) -
*!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici
Select crsfacturi
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
IF Vartype(m.loFrm) <> 'O'
RETURN
ENDIF
Select crsfacturi
Locate For id_vanzare = m.tnIdVanzare
DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found())
IF !Found()
loFrm.Release()
RETURN
ENDIF
*!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()) ---
goDriverS8p7.Reseteaza()
loFrm.do_editare_unificata()
IF !goDriverS8p7.lGasit
*!* --- R2: iesirea a esuat - distinge CU MESAJ (garda explicita) de SILENTIOASA, si in acest
*!* caz distinge daca poarta 11 (IncarcaAntetFacturaEditare->NULL) e cauza confirmata ---
DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', .F., 'NU s-a deschis'
IF !Empty(gcMockUltimMesaj)
DO asserteaza WITH lcPrefix + ' diagnostic: iesire CU MESAJ de garda (nu silentioasa) - mesaj=[' + gcMockUltimMesaj + ']', .F., gcMockUltimMesaj
ELSE
LOCAL poDateDiagPost, lnDiscRPost, lnDiscVPost
poDateDiagPost = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPost, @lnDiscVPost)
IF Vartype(poDateDiagPost) <> 'O'
DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa CONFIRMATA - cale 11 (ofacturare_editare.prg:83-86), IncarcaAntetFacturaEditare revine .NULL. si la apel direct chiar acum', .F., 'confirmat cale 11'
ELSE
DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa NEEXPLICATA de cale 11 (IncarcaAntetFacturaEditare reuseste izolat chiar acum) - candidat: cale 3 (glLunaInchisa) sau cursa driverului/Timer', .F., 'neexplicat, nu e cale 11'
ENDIF
IF Used('v_antet_editare')
Use In v_antet_editare
ENDIF
ENDIF
Try
loFrm.Release()
Catch
Endtry
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' DUPA (esec deschidere)'
RETURN
ENDIF
DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit)
*!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis ---
DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ;
goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent)
IF m.tlCtClbAsteptat AND !Empty(m.tcCtClbEtichetaAsteptata)
DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ;
Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta
ENDIF
*!* --- grupul B si C (S8, decizia 25): needitabile la editare ---
DO VerificaBlocajGrupBC WITH m.lcPrefix
*!* --- G5: totalul afisat = totalul deja scris in VANZARI ---
Select crsfacturi
IF Nvl(crsfacturi.in_valuta, 0) = 1
DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ;
Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval)
ELSE
DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ;
Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva)
ENDIF
*!* --- G3/G4/G4b: crsfactura ramane deschis dupa ce driverul a eliberat formularul (nu e
*!* proprietate a obiectului, e o zona de lucru globala populata inaintea Createobject) ---
IF m.tlVerificaLinii
DO asserteaza WITH lcPrefix + ' G3: crsfactura a ramas deschis dupa inchiderea formularului', Used('crsfactura'), Transform(Used('crsfactura'))
IF Used('crsfactura') AND Used('v_g4')
DO asserteaza WITH lcPrefix + ' G3: Reccount(crsfactura)=' + Transform(Reccount('crsfactura')) + ' = martor(' + Transform(m.lnMartorLinii) + ')', ;
Reccount('crsfactura') == m.lnMartorLinii, Transform(Reccount('crsfactura'))
LOCAL lnDetTemp, llGasitLinie
Select v_g4
Scan
lnDetTemp = v_g4.id_vanzare_det
Select crsfactura
Locate For id_temp = m.lnDetTemp
llGasitLinie = Found()
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ': gasit in crsfactura', m.llGasitLinie, Transform(m.llGasitLinie)
IF m.llGasitLinie
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: cantitate', Round(crsfactura.cantitate,4) == Round(v_g4.cantitate,4), Transform(crsfactura.cantitate)
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: taxcode', Nvl(crsfactura.taxcode,0) == Nvl(v_g4.taxcode,0), Transform(Nvl(crsfactura.taxcode,0))
DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4b: gestionabil = in_stoc curent(' + Transform(Nvl(v_g4.in_stoc,0)) + ')', ;
crsfactura.gestionabil == Iif(Nvl(v_g4.in_stoc,0) <> 0, 1, 0), Transform(crsfactura.gestionabil)
ENDIF
Select v_g4
Endscan
ENDIF
IF Used('v_g4')
Use In v_g4
ENDIF
ENDIF
loFrm.Release()
*!* --- G9: niciun dialog modal la deschidere ---
DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj
*!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter ---
IF Used('v_plaje_b')
Use In v_plaje_b
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b')
goExecutor.oReset()
lcSnapPlajeB = CursorToSnapshot('v_plaje_b')
Use In v_plaje_b
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
*!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII ---
IF Used('v_g8a2')
Use In v_g8a2
ENDIF
lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ;
Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL')
DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0))
Use In v_g8a2
IF Used('v_g8d_b')
Use In v_g8d_b
ENDIF
lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b')
goExecutor.oReset()
lcSnapDetB = CursorToSnapshot('v_g8d_b')
Use In v_g8d_b
DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, ''
*!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare
*!* de stoc noua pe acest document; proba indirecta, partiala (forma completa a G11 cere S9/reemitere) ---
DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, ''
*!* --- R1: curatenie + jurnal AUSED DUPA caz ---
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' DUPA'
ENDPROC
*!* Caz NEGATIV: documentul e respins de o garda CU MESAJ a do_editare_unificata (aici, "luna
*!* curenta") - formularul nu trebuie sa se deschida, trebuie sa apara mesajul asteptat, si G2
*!* (niciun numar alocat) trebuie sa ramana curat chiar si pe calea de refuz.
PROCEDURE VerificaEditareRespinsa
LPARAMETERS tnIdVanzare, tcEticheta, tcMesajContine
LOCAL lcPrefix, lnSucces, loFrm, lcSnapPlajeA, lcSnapPlajeB
lcPrefix = Transform(m.tnIdVanzare) + ' [' + m.tcEticheta + ']'
gcMockUltimMesaj = ''
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' INAINTE'
IF Used('v_plaje_resp_a')
Use In v_plaje_resp_a
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_a')
goExecutor.oReset()
lcSnapPlajeA = CursorToSnapshot('v_plaje_resp_a')
Use In v_plaje_resp_a
Select crsfacturi
loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx')
DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm)
IF Vartype(m.loFrm) <> 'O'
RETURN
ENDIF
Select crsfacturi
Locate For id_vanzare = m.tnIdVanzare
DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found())
IF !Found()
loFrm.Release()
RETURN
ENDIF
goDriverS8p7.Reseteaza()
loFrm.do_editare_unificata()
DO asserteaza WITH lcPrefix + ': formularul NU s-a deschis (garda a respins documentul)', !goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit)
DO asserteaza WITH lcPrefix + ': a aparut un mesaj de garda (refuz explicat, nu iesire silentioasa)', !Empty(gcMockUltimMesaj), gcMockUltimMesaj
DO asserteaza WITH lcPrefix + ': mesajul contine [' + m.tcMesajContine + ']', m.tcMesajContine $ Lower(gcMockUltimMesaj), gcMockUltimMesaj
Try
loFrm.Release()
Catch
Endtry
IF Used('v_plaje_resp_b')
Use In v_plaje_resp_b
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_b')
goExecutor.oReset()
lcSnapPlajeB = CursorToSnapshot('v_plaje_resp_b')
Use In v_plaje_resp_b
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (refuz, dar tot fara numar ars)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' DUPA'
ENDPROC
*!* S8 - blocarea grupurilor B si C la editare. Citeste starea deja capturata de goDriverS8p7
*!* (formularul e inchis pana aici) si asearta doar cand controlul e prezent.
PROCEDURE VerificaBlocajGrupBC
LPARAMETERS tcPrefix
IF goDriverS8p7.lCtClbPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv)
ENDIF
DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ;
goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv)
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ;
goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv)
IF goDriverS8p7.lCtClbValutaPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv)
ENDIF
IF goDriverS8p7.lClbZiCursPrezent
DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv)
ENDIF
IF goDriverS8p7.lCtClbGestiuneInitPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv)
ENDIF
IF goDriverS8p7.lCtClbPolPreturiPrezent
DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv)
ENDIF
DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ;
goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv)
DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ;
goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv)
IF goDriverS8p7.lCtIncasarePrezent
DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv)
DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv)
ENDIF
ENDPROC
*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (acelasi tipar validat in
*!* test_s8_pas7_cablare.prg). NU trece prin factureaza()/poGeneratorNumere.
PROCEDURE VerificaDocumentNou
PRIVATE poDate
LOCAL loForm
poDate = Createobject('oDateFactura', 0, 0)
poDate.tip = 3
poDate.id_client = 0
poDate.incasat = 0
*!* Init-ul lui frm_facturare_articole2 presupune 'crsfactura' deja deschis (in productie,
*!* creeaza_facturacrs('crsfactura') ruleaza in factureaza() inainte de Createobject, pentru
*!* orice document, nou sau editat). R1 (curatenie de aliasuri intre cazuri) inchide crsfactura
*!* dupa fiecare caz anterior - fara acest bloc, acest test ar depinde tacit de un leftover
*!* (exact cum facea, neintentionat, test_s8_pas7_cablare.prg).
IF !Used('crsfactura')
creeaza_facturacrs('crsfactura')
ENDIF
loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx')
DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
IF Vartype(m.loForm) <> 'O'
RETURN
ENDIF
DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare)
IF loForm.do_exista_obiect('Ct_clb_altele')
DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv)
ENDIF
DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled)
DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv)
IF loForm.do_exista_obiect('Ct_clb_valuta')
DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv)
ENDIF
IF loForm.do_exista_obiect('Clb_zi_curs')
DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly)
ENDIF
IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate)
DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv)
ENDIF
IF loForm.do_exista_obiect('Ct_clb_politici_preturi')
DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv)
ENDIF
DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled)
*!* but_cursuri.Enabled = Used('crscursuri') AND Reccount('crscursuri')>0 (ofacturare.vc2:20918),
*!* iar citeste_cursuri_zi() ruleaza in Init doar pentru Inlist(poDate.tip,1,22,5,29,7,10,45)
*!* (:20899) - tip=3 (comanda) NU e in acea lista, deci but_cursuri e NATURAL needitabil pe un
*!* document nou de acest tip, indiferent de lEditare. Prima trecere a acestei suite astepta
*!* .T. aici (copiat din test_s8_pas7_cablare.prg) si a picat: R1 (curatenie de aliasuri intre
*!* cazuri) a inchis 'crscursuri' ramas din cazul anterior, care mascase adevaratul comportament -
*!* asertiunea veche trecea din intamplare, nu din cauza codului. Corectata aici la valoarea reala.
DO asserteaza WITH 'document nou grupB: but_cursuri needitabil natural (tip=3 nu incarca crscursuri in Init, independent de lEditare)', !loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled)
IF loForm.do_exista_obiect('ct_incasare')
DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
ENDIF
loForm.Release()
ENDPROC
*!* S8 - incasarea la editare (D1/D3/D4). Replica dovedita a corpului do_editare_unificata pana la
*!* Createobject (acelasi tipar validat in test_s8_pas7_cablare.prg).
PROCEDURE VerificaIncasareLaEditare
LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat
LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta
LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB
PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate
Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP
lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']'
gcMockUltimMesaj = ''
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' INAINTE'
IF Used('v_plaje_inc_a')
Use In v_plaje_inc_a
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a')
goExecutor.oReset()
lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a')
Use In v_plaje_inc_a
lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic')
goExecutor.oReset()
DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces)
IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1)
RETURN
ENDIF
SELECT crsIncUnic
lnIdVanzareP = id_vanzare
lnCod = cod
pnAn = Year(data_act)
pnLuna = Month(data_act)
lnSters = sters
lnIdFact = id_fact
llEProforma = (eproforma = 1)
lnTipDoc = tip
Use In crsIncUnic
DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ;
lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), ''
DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), ''
DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), ''
DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), ''
poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta)
DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate)
IF Vartype(m.poDate) <> 'O'
RETURN
ENDIF
IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
IF Used('jtva_coloane')
Use In jtva_coloane
ENDIF
IF poDate.tva_incasare = 0
Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ELSE
Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane
ENDIF
loForm = Createobject('frm_facturare_articole2')
DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm)
IF Vartype(m.loForm) <> 'O'
RETURN
ENDIF
DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj
*!* --- asertiunile care prind regresia D1/D3/D4 ---
DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ;
Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1))
DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ;
Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1))
DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ;
Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1))
DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ;
loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value)
DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value)
DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled)
DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled)
loForm.ndiscfactron = pnDiscountRon
loForm.ndiscfactval = pnDiscountValuta
loForm.do_calculeaza_totaluri()
*!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release()
loForm.WindowType = 0
goDriverS8p7.Reseteaza()
loForm.Show()
DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj
Try
loForm.Release()
Catch
Endtry
IF Used('v_plaje_inc_b')
Use In v_plaje_inc_b
ENDIF
lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b')
goExecutor.oReset()
lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b')
Use In v_plaje_inc_b
DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, ''
DO CurataAliasuriReziduale
DO LogAUsed WITH lcPrefix + ' DUPA'
ENDPROC
PROCEDURE CursorToSnapshot
LPARAMETERS tcAlias
LOCAL lcResult, lnI
lcResult = ''
SELECT (m.tcAlias)
SCAN
FOR lnI = 1 TO FCOUNT()
lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|'
ENDFOR
lcResult = lcResult + Chr(10)
ENDSCAN
RETURN m.lcResult
ENDPROC
PROCEDURE asserteaza
LPARAMETERS tcNume, tlConditie, tcValoare
IF m.tlConditie
gnPass = gnPass + 1
STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1)
ELSE
gnFail = gnFail + 1
STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1)
ENDIF
ENDPROC
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC
*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe
*!* modal (acelasi tipar ca test_s8_pas7_cablare.prg). Citeste Ct_clb_altele din Objects (nu
*!* PEMSTATUS) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului.
DEFINE CLASS driverS8p7 AS Custom
lBusy = .F.
lGasit = .F.
lCtClbPrezent = .F.
lCtClbAlteleActiv = .F.
cCtClbEticheta = ''
nTotalRon = 0
nTotalVal = 0
lClbFdocPrezent = .F.
lClbFdocActiv = .F.
lCtClbNumeClientPrezent = .F.
lCtClbNumeClientActiv = .F.
lCtClbValutaPrezent = .F.
lCtClbValutaActiv = .F.
lClbZiCursPrezent = .F.
lClbZiCursActiv = .F.
lCtClbGestiuneInitPrezent = .F.
lCtClbGestiuneInitActiv = .F.
lCtClbPolPreturiPrezent = .F.
lCtClbPolPreturiActiv = .F.
lButIncarcaArticolePrezent = .F.
lButIncarcaArticoleActiv = .F.
lButCursuriPrezent = .F.
lButCursuriActiv = .F.
lCtIncasarePrezent = .F.
lCtIncasareActiv = .F.
lChkIncasarePrezent = .F.
lChkIncasareActiv = .F.
PROCEDURE Reseteaza
This.lGasit = .F.
This.lCtClbPrezent = .F.
This.lCtClbAlteleActiv = .F.
This.cCtClbEticheta = ''
This.nTotalRon = 0
This.nTotalVal = 0
This.lClbFdocPrezent = .F.
This.lClbFdocActiv = .F.
This.lCtClbNumeClientPrezent = .F.
This.lCtClbNumeClientActiv = .F.
This.lCtClbValutaPrezent = .F.
This.lCtClbValutaActiv = .F.
This.lClbZiCursPrezent = .F.
This.lClbZiCursActiv = .F.
This.lCtClbGestiuneInitPrezent = .F.
This.lCtClbGestiuneInitActiv = .F.
This.lCtClbPolPreturiPrezent = .F.
This.lCtClbPolPreturiActiv = .F.
This.lButIncarcaArticolePrezent = .F.
This.lButIncarcaArticoleActiv = .F.
This.lButCursuriPrezent = .F.
This.lButCursuriActiv = .F.
This.lCtIncasarePrezent = .F.
This.lCtIncasareActiv = .F.
This.lChkIncasarePrezent = .F.
This.lChkIncasareActiv = .F.
ENDPROC
PROCEDURE Executa
IF This.lBusy OR This.lGasit
RETURN
ENDIF
This.lBusy = .T.
TRY
LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2
FOR lnI = 1 TO _SCREEN.FormCount
IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2'
loFrm2 = _SCREEN.Forms(m.lnI)
This.lGasit = .T.
This.nTotalRon = Nvl(loFrm2.ntotalron, 0)
This.nTotalVal = Nvl(loFrm2.ntotalval, 0)
FOR lnJ = 1 TO loFrm2.Objects.Count
loObj = loFrm2.Objects(m.lnJ)
DO CASE
CASE Upper(loObj.Name) == 'CT_CLB_ALTELE'
This.lCtClbPrezent = .T.
This.lCtClbAlteleActiv = loObj.lactiv
This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption)
CASE Upper(loObj.Name) == 'CLB_FDOC'
This.lClbFdocPrezent = .T.
This.lClbFdocActiv = loObj.cboFdoc.Enabled
CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT'
This.lCtClbNumeClientPrezent = .T.
This.lCtClbNumeClientActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'CT_CLB_VALUTA'
This.lCtClbValutaPrezent = .T.
This.lCtClbValutaActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'CLB_ZI_CURS'
This.lClbZiCursPrezent = .T.
This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly
CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI'
This.lCtClbPolPreturiPrezent = .T.
This.lCtClbPolPreturiActiv = loObj.lactiv
CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE'
This.lButIncarcaArticolePrezent = .T.
This.lButIncarcaArticoleActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'BUT_CURSURI'
This.lButCursuriPrezent = .T.
This.lButCursuriActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CT_INCASARE'
This.lCtIncasarePrezent = .T.
This.lCtIncasareActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CHK_INCASARE'
This.lChkIncasarePrezent = .T.
This.lChkIncasareActiv = loObj.Enabled
CASE Upper(loObj.Name) == 'CT_CONTABILITATE'
FOR lnJ2 = 1 TO loObj.Objects.Count
loObj2 = loObj.Objects(m.lnJ2)
IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT'
This.lCtClbGestiuneInitPrezent = .T.
This.lCtClbGestiuneInitActiv = loObj2.lactiv
ENDIF
ENDFOR
ENDCASE
ENDFOR
loFrm2.Release()
EXIT
ENDIF
ENDFOR
CATCH TO loExcS8p7
STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1)
FINALLY
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE

View File

@@ -50,7 +50,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
*-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit)
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1)
QUIT

View File

@@ -0,0 +1,154 @@
* test_s8_pas1_aplica.prg
* S8 pas 1 (planul #13) - aplica CREATE OR REPLACE VIEW VVANZARI_ARTICOLE (extensie) pe
* MARIUSM_AUTO, apoi verifica in aceeasi rulare: coloanele noi (30 in loc de 23, cele vechi
* neschimbate ca pozitie/tip), randurile pe id_vanzare de control - IDENTICE cu inainte
* (1047->2, 1050->4, 1040->1, 1055->2, 1125->4) - si continut real (nu NULL) pe coloanele noi
* pentru un document cu contract+valuta (1040) si un document cu pretd real (894).
* Scrie in Oracle (CREATE OR REPLACE VIEW, comanda idempotenta) - fara DROP, fara atingere de
* date. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_aplica_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcOut, lcSql, llOk
lcOut = ''
*!* --- 1. aplica CREATE OR REPLACE VIEW ---
lcSql = [create or replace view vvanzari_articole as ] + ;
[select vd.id_vanzare, vd.id_vanzare_det, vd.id_articol, vd.cantitate, vd.pret, vd.pret_cu_tva, vd.proc_tvav, ] + ;
[vd.discount_unitar, vd.id_gestiune, vd.cont, vd.id_valuta, vd.id_jtva_coloana, vd.serie, vd.explicatie, ] + ;
[vd.taxcode, vd.lot, vd.sters, vd.id_vanzare_set, vd.pret_achizitie, na.denumire, na.codmat, ng.nume_gestiune, ] + ;
[nv.nume_val, vd.id_pol, vd.id_ctr, vd.diferenta, vd.pretd, vd.id_valutad, vc.curs, vc.multiplicator ] + ;
[from vanzari_detalii vd ] + ;
[left join nom_articole na on na.id_articol = vd.id_articol ] + ;
[left join nom_gestiuni ng on ng.id_gestiune = vd.id_gestiune ] + ;
[left join nom_valute nv on nv.id_valuta = vd.id_valuta ] + ;
[left join vanzari_cursuri vc on vc.id_vanzare = vd.id_vanzare and vc.id_valuta = vd.id_valuta]
llOk = goExecutor.oExecuta(m.lcSql)
lcOut = lcOut + '--- CREATE OR REPLACE VIEW ---' + CHR(13) + CHR(10)
lcOut = lcOut + 'rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10)
IF !m.llOk
lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
IF !m.llOk
STRTOFILE('OPRIT dupa eroare la CREATE OR REPLACE - nu se mai verifica.' + CHR(13) + CHR(10), gcErrLog, 1)
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
*!* --- 2. marcheaza versiunea (registru intern Oracle, separat de docs\scripturi_oracle_13.md) ---
*!* "exec ..." e sintaxa SQL*Plus, nu SQL valid - prin goExecutor blocheaza rularea headless;
*!* forma corecta aici e blocul PL/SQL anonim
llOk = goExecutor.oExecuta([begin pack_migrare.UpdateVersiune('wip13_2026_09_02_01_COMUN_VVANZARI_ARTICOLE_EXT'); end;])
lcOut = lcOut + '--- UpdateVersiune ---' + CHR(13) + CHR(10) + 'rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10)
IF !m.llOk
lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 3. coloanele DUPA - trebuie 30, primele 23 neschimbate ca pozitie/tip ---
lcSql = [select column_id, column_name, data_type, data_length, data_precision, data_scale ] + ;
[from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' order by column_id]
IF Used('crscols')
Use In crscols
ENDIF
IF goExecutor.oExecute(m.lcSql, [crscols]) < 0
lcOut = lcOut + 'EROARE coloane dupa: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- coloane DUPA (' + TRANSFORM(RECCOUNT('crscols')) + ', asteptat 30) ---' + CHR(13) + CHR(10)
SELECT crscols
SCAN
lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + ;
IIF(NVL(data_precision,0) > 0, '(' + TRANSFORM(data_precision) + ',' + TRANSFORM(NVL(data_scale,0)) + ')', ;
IIF(NVL(data_length,0) > 0 AND ALLTRIM(data_type) $ 'VARCHAR2,CHAR', '(' + TRANSFORM(data_length) + ')', '')) + CHR(13) + CHR(10)
ENDSCAN
USE IN crscols
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 4. randuri DUPA pe cele 5 id_vanzare de control - trebuie identice cu INAINTE ---
lcSql = [select id_vanzare, count(*) as nr from vvanzari_articole where id_vanzare in (1050,1047,1055,1040,1125) and sters = 0 group by id_vanzare order by id_vanzare]
IF Used('crscnt')
Use In crscnt
ENDIF
IF goExecutor.oExecute(m.lcSql, [crscnt]) < 0
lcOut = lcOut + 'EROARE numarare dupa: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- randuri sters=0 pe id_vanzare de control (DUPA) - asteptat 1040->1,1047->2,1050->4,1055->2,1125->4 ---' + CHR(13) + CHR(10)
SELECT crscnt
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' -> ' + TRANSFORM(nr) + ' randuri' + CHR(13) + CHR(10)
ENDSCAN
USE IN crscnt
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 5. continut real pe coloanele noi: 1040 (contract + valuta), 894 (pretd real) ---
lcSql = [select id_vanzare, id_vanzare_det, id_pol, id_ctr, diferenta, pretd, id_valutad, curs, multiplicator ] + ;
[from vvanzari_articole where id_vanzare in (1040,894) and sters = 0 order by id_vanzare, id_vanzare_det]
IF Used('crscheck')
Use In crscheck
ENDIF
IF goExecutor.oExecute(m.lcSql, [crscheck]) < 0
lcOut = lcOut + 'EROARE continut nou: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- continut coloane noi, 1040 (contract+valuta) si 894 (pretd real) ---' + CHR(13) + CHR(10)
SELECT crscheck
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ;
' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ' id_ctr=' + TRANSFORM(NVL(id_ctr,-1)) + ;
' diferenta=' + TRANSFORM(NVL(diferenta,-1)) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + ;
' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + ' curs=' + TRANSFORM(NVL(curs,-1)) + ;
' multiplicator=' + TRANSFORM(NVL(multiplicator,-1)) + CHR(13) + CHR(10)
ENDSCAN
USE IN crscheck
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 6. proba directa a consumatorului real IncarcaArticoleFactura (select v.*) - nu trebuie sa pice ---
SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
IncarcaArticoleFactura(1050)
lcOut = lcOut + CHR(13) + CHR(10) + '--- IncarcaArticoleFactura(1050) dupa extindere ---' + CHR(13) + CHR(10)
lcOut = lcOut + 'Reccount(tvd) = ' + TRANSFORM(RECCOUNT('tvd')) + ' (asteptat 4)' + CHR(13) + CHR(10)
lcOut = lcOut + 'Fcount(tvd) = ' + TRANSFORM(FCOUNT('tvd')) + CHR(13) + CHR(10)
lcOut = lcOut + 'are id_pol: ' + TRANSFORM(TYPE('tvd.id_pol') <> 'U') + ', are curs: ' + TRANSFORM(TYPE('tvd.curs') <> 'U') + CHR(13) + CHR(10)
IF Used('tvd')
Use In tvd
ENDIF
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,115 @@
* test_s8_pas1_cardinalitate.prg
* S8 pas 1 - continuare investigare read-only: verifica daca (id_vanzare, id_valuta) e unic in
* VANZARI_CURSURI (altfel un join pe aceasta cheie ar multiplica randurile view-ului), cauta un
* exemplu cu pretd nenul, si numara randurile INAINTE pe cateva id_vanzare suplimentare
* (1055, 1040, 1125) care vor fi folosite ca proba de continut real (contract / valuta).
* Nu scrie nimic in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_cardinalitate_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcOut, lcSql
lcOut = ''
*!* --- 1. dubluri pe (id_vanzare, id_valuta) in VANZARI_CURSURI - risc de multiplicare la join ---
lcSql = [select max(nr) as maxnr, count(*) as grupuri from (select id_vanzare, id_valuta, count(*) as nr from vanzari_cursuri group by id_vanzare, id_valuta having count(*) > 1)]
IF Used('crsdup')
Use In crsdup
ENDIF
IF goExecutor.oExecute(m.lcSql, [crsdup]) < 0
lcOut = lcOut + 'EROARE dubluri: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + '--- dubluri (id_vanzare,id_valuta) in VANZARI_CURSURI ---' + CHR(13) + CHR(10)
lcOut = lcOut + 'grupuri cu >1 rand: ' + TRANSFORM(NVL(crsdup.grupuri,0)) + ', max randuri intr-un grup: ' + TRANSFORM(NVL(crsdup.maxnr,0)) + CHR(13) + CHR(10)
USE IN crsdup
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 2. exemplu cu pretd nenul ---
lcSql = [select * from (select id_vanzare, id_vanzare_det, id_valutad, pretd from vanzari_detalii where nvl(pretd,0) <> 0 and sters = 0 order by id_vanzare_det desc) where rownum <= 5]
IF Used('crspretd')
Use In crspretd
ENDIF
IF goExecutor.oExecute(m.lcSql, [crspretd]) < 0
lcOut = lcOut + 'EROARE pretd nenul: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- exemple cu pretd <> 0 (max 5) ---' + CHR(13) + CHR(10)
IF RECCOUNT('crspretd') = 0
lcOut = lcOut + '(niciun rand cu pretd <> 0 in toata VANZARI_DETALII)' + CHR(13) + CHR(10)
ELSE
SELECT crspretd
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + ' pretd=' + TRANSFORM(pretd) + CHR(13) + CHR(10)
ENDSCAN
ENDIF
USE IN crspretd
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 3. randuri INAINTE pe id_vanzare suplimentare (1055 contract, 1040 contract, 1125 valuta) ---
lcSql = [select id_vanzare, count(*) as nr from vvanzari_articole where id_vanzare in (1055,1040,1125) and sters = 0 group by id_vanzare order by id_vanzare]
IF Used('crscnt2')
Use In crscnt2
ENDIF
IF goExecutor.oExecute(m.lcSql, [crscnt2]) < 0
lcOut = lcOut + 'EROARE numarare suplimentara: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- randuri sters=0 pe id_vanzare 1055/1040/1125 (INAINTE) ---' + CHR(13) + CHR(10)
SELECT crscnt2
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' -> ' + TRANSFORM(nr) + ' randuri' + CHR(13) + CHR(10)
ENDSCAN
USE IN crscnt2
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 4. VANZARI_CURSURI pentru id_vanzare 1055/1040/1125, ca sa vedem daca exista randuri de curs pentru ele ---
lcSql = [select id_vanzare, id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare in (1055,1040,1125) order by id_vanzare]
IF Used('crscurex')
Use In crscurex
ENDIF
IF goExecutor.oExecute(m.lcSql, [crscurex]) < 0
lcOut = lcOut + 'EROARE vanzari_cursuri exemple: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI_CURSURI pentru 1055/1040/1125 ---' + CHR(13) + CHR(10)
IF RECCOUNT('crscurex') = 0
lcOut = lcOut + '(niciun rand)' + CHR(13) + CHR(10)
ELSE
SELECT crscurex
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator) + CHR(13) + CHR(10)
ENDSCAN
ENDIF
USE IN crscurex
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

View File

@@ -0,0 +1,135 @@
* test_s8_pas1_cursuri.prg
* S8 pas 1 - continuare investigare read-only: CURS/MULTIPLICATOR nu exista direct pe
* VANZARI_DETALII (confirmat de test_s8_pas1_ddl_view.prg). Aici se verifica VANZARI_CURSURI:
* structura, cheia de join catre o linie de vanzare, si daca join-ul ar multiplica randurile
* view-ului (risc de cardinalitate). Nu scrie nimic in Oracle. QUIT la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcErrLog
gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_cursuri_log.txt'
STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog)
ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8
IF gnHandle <= 0
STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
ENDIF
LOCAL lcOut, lcSql
lcOut = ''
*!* --- 1. exista tabela VANZARI_CURSURI? coloanele ei ---
lcSql = [select column_id, column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_CURSURI' order by column_id]
IF Used('crscur')
Use In crscur
ENDIF
IF goExecutor.oExecute(m.lcSql, [crscur]) < 0
lcOut = lcOut + 'EROARE VANZARI_CURSURI: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + '--- VANZARI_CURSURI, coloane (' + TRANSFORM(RECCOUNT('crscur')) + ') ---' + CHR(13) + CHR(10)
IF RECCOUNT('crscur') = 0
lcOut = lcOut + '(tabela nu exista sau owner gresit)' + CHR(13) + CHR(10)
ELSE
SELECT crscur
SCAN
lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + CHR(13) + CHR(10)
ENDSCAN
ENDIF
USE IN crscur
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 2. VANZARI, coloane CURS/MULTIPLICATOR pe antet (ca sa comparam cu ce s-ar citi pe linie) ---
lcSql = [select column_id, column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI' ] + ;
[and (column_name like '%CURS%' or column_name like '%MULTIPLIC%') order by column_id]
IF Used('crsvcurs')
Use In crsvcurs
ENDIF
IF goExecutor.oExecute(m.lcSql, [crsvcurs]) < 0
lcOut = lcOut + 'EROARE VANZARI curs: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI (antet), coloane CURS/MULTIPLICATOR (' + TRANSFORM(RECCOUNT('crsvcurs')) + ') ---' + CHR(13) + CHR(10)
SELECT crsvcurs
SCAN
lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + CHR(13) + CHR(10)
ENDSCAN
USE IN crsvcurs
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 3. mostre de valori din VANZARI_DETALII pentru documentele 1050/1047 - PRETD, ID_VALUTAD, ID_CTR, ID_POL, DIFERENTA ---
lcSql = [select id_vanzare, id_vanzare_det, id_pol, id_ctr, diferenta, pretd, id_valutad from vanzari_detalii where id_vanzare in (1050,1047) order by id_vanzare, id_vanzare_det]
IF Used('crsval')
Use In crsval
ENDIF
IF goExecutor.oExecute(m.lcSql, [crsval]) < 0
lcOut = lcOut + 'EROARE mostre 1050/1047: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI_DETALII, mostre 1050/1047 ---' + CHR(13) + CHR(10)
SELECT crsval
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ;
' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ' id_ctr=' + TRANSFORM(NVL(id_ctr,-1)) + ;
' diferenta=' + TRANSFORM(NVL(diferenta,-1)) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + ;
' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + CHR(13) + CHR(10)
ENDSCAN
USE IN crsval
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
*!* --- 4. cauta un document cu id_ctr populat si unul cu id_valutad populat (in afara de 1050/1047), ca proba de continut real ---
lcSql = [select * from (select id_vanzare, id_vanzare_det, id_ctr, id_pol from vanzari_detalii where id_ctr is not null and sters = 0 order by id_vanzare_det desc) where rownum <= 3]
IF Used('crsctr')
Use In crsctr
ENDIF
IF goExecutor.oExecute(m.lcSql, [crsctr]) < 0
lcOut = lcOut + 'EROARE cautare id_ctr: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- exemple cu id_ctr populat (max 3) ---' + CHR(13) + CHR(10)
SELECT crsctr
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ' id_ctr=' + TRANSFORM(id_ctr) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + CHR(13) + CHR(10)
ENDSCAN
USE IN crsctr
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
lcSql = [select * from (select id_vanzare, id_vanzare_det, id_valutad, pretd from vanzari_detalii where id_valutad is not null and sters = 0 order by id_vanzare_det desc) where rownum <= 3]
IF Used('crsval2')
Use In crsval2
ENDIF
IF goExecutor.oExecute(m.lcSql, [crsval2]) < 0
lcOut = lcOut + 'EROARE cautare id_valutad: ' + goExecutor.cEroare + CHR(13) + CHR(10)
ELSE
lcOut = lcOut + CHR(13) + CHR(10) + '--- exemple cu id_valutad populat (max 3) ---' + CHR(13) + CHR(10)
SELECT crsval2
SCAN
lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ' id_valutad=' + TRANSFORM(id_valutad) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + CHR(13) + CHR(10)
ENDSCAN
USE IN crsval2
ENDIF
goExecutor.oReset()
STRTOFILE(m.lcOut, gcErrLog, 1)
lcOut = ''
STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1)
QUIT
PROCEDURE test_error_handler
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1)
ENDPROC

Some files were not shown because too many files have changed in this diff Show More