Files
comun/utile/Teste/facturare_unificat/probe_12b_s8_calea_2.prg
2026-09-15 23:58:47 +03:00

383 lines
18 KiB
Plaintext

* probe_12b_s8_calea_2.prg
* Plan 12b, S8-4a: proba headless a caii 2 (do_adauga_articol_cautat) din frm_facturare_articole2
* (COMUN\clase\ofacturare.vc2) pentru verificarea prietenoasa D10 a contului de venit (S8-3/S8-4a).
*
* PAS 0 (dovada): pe aceasta cale, obiectul toArticol vine dintr-un Scatter Name pe crsCodmat/
* crsDenumire. Analiza statica din raportul S8-3 a citat proprietatile design-time csourcesql/
* csourcewhere de pe combosql_cautare (:17528/:17564, doar 7 coloane, fara id_pol) - dar acelea NU
* sunt folosite la rulare: refreshdata/selectdata (ofacturare.vc2:463-529) ignora total csourcesql
* si cheama This.cursor_preturi_call() (:446-461), adica {call pack_facturare.cursor_preturi(...)}
* (sau cursor_gestiune pentru tip=41) - acelasi mecanism ca la crsarticole (calea 1). Structura reala
* a cursorului (creeaza_cursor_gol :426-444, reordoneaza :498-512) INCLUDE id_pol. Asadar in cazul
* normal Type('toArticol.Id_Pol')='N' e adevarat, iar linia scrisa in crsfactura (Gather la
* ofacturare.vc2:19018) primeste chiar politica reala rezolvata de cursor_preturi pentru articolul
* respectiv - nu politica de stoc.
*
* Fix S8-4a (ofacturare.vc2:18968-18972): confirmat empiric (probe separat, Gather Name cu
* proprietate lipsa NU arunca eroare si LASA campul destinatie neschimbat, adica linia ar fi ramas
* cu Id_Pol vechi/implicit daca toArticol nu are proprietatea) ca fallback-ul gnId_pol_pret_stoc
* calculat pentru verificare (lnIdPolLinie) nu ajungea niciodata in linia scrisa cand proprietatea
* lipsea din toArticol - AddProperty(toArticol,'Id_Pol',lnIdPolLinie) inchide acest gol; e no-op
* cand Type('toArticol.Id_Pol')='N' (cazul normal, politica reala).
*
* Cazuri (fara mock goExecutor, politica de stoc cu ID_NOTA NULL in tranzactie, ROLLBACK la final):
* (a) toArticol FARA proprietatea Id_Pol, articol fara cont dedus -> do_adauga_articol_cautat = .F.,
* Reccount(crsfactura) neschimbat, spion amessagebox: mesaj continand denumirea articolului.
* (b) toArticol FARA proprietatea Id_Pol, articol CU cont dedus -> linia se adauga (Reccount+1),
* spion 0 apeluri, iar crsfactura.Id_Pol al liniei noi == gnId_pol_pret_stoc (fallback aplicat).
* (c) toArticol CU Id_Pol = o politica reala (<> politica de stoc, cu nota proprie valida) -> linia
* se adauga, crsfactura.Id_Pol al liniei noi == acea politica reala (Type='N', fix no-op,
* politica ramane cea reala, nu cea de stoc).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_calea_2.prg"
* Log: D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_calea_2.log
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, gcCaz, gnPass, gnFail, gnTransOriginal
PUBLIC gcSpionMesaje, gnSpionCount
gcLog = "D:\ROA\ROAFACTURARE\docs\loguri_12b\s8_calea_2.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\docs\loguri_12b")
MD "D:\ROA\ROAFACTURARE\docs\loguri_12b"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gcCaz = ""
gnPass = 0
gnFail = 0
gcSpionMesaje = ""
gnSpionCount = 0
ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
*-- spion amessagebox: se incarca PRIMUL (inaintea aplicatiei), ca sa castige la nume duplicat
LOCAL lcProcExistent, lcCmdProc
lcProcExistent = SET("PROCEDURE")
lcCmdProc = [SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_12b_s8_calea_2.prg"]
IF !EMPTY(lcProcExistent)
lcCmdProc = lcCmdProc + ", " + lcProcExistent
ENDIF
&lcCmdProc
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO AfLog WITH "FAIL: conexiune Oracle esuata"
DO Final
ENDIF
gnIdUtil = 8
DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle)
gnTransOriginal = SQLGETPROP(gnHandle, "Transactions")
SQLSETPROP(gnHandle, "Transactions", 2)
DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal)
IF !actualizeaza_optiuni_program()
DO AfLog WITH "FAIL: actualizeaza_optiuni_program()"
DO Final
ENDIF
DO AfLog WITH "actualizeaza_optiuni_program OK, gnScadereStoc=" + TRANSFORM(NVL(gnScadereStoc, -1))
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
DO AfLog WITH "SET CLASSLIB suplimentar OK"
update_jtva_coloane([JV], [jtva_coloane_temp])
*==========================================================================================
* alegere date: politica de stoc curenta + articol OK (cont dedus) + articol problema (fara cont)
* + o politica reala cu nota proprie valida (caz c) - acelasi tipar ca probe_12b_s8_cai_1_3.prg /
* probe_12b_s8_verifica_linie.prg
*==========================================================================================
LOCAL lnOk, lnIdPolStoc, lnIdArtOk, lnIdArtProblema, lcDenOk, lcDenProblema, lnIdPolReal, lnIdArtReal
LOCAL llGasitOk, llGasitProblema, llGasitPolReal, llGasitArtReal
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "select varvalue from optiuni where program='ROAFACTURARE' and varname='ID_POL_PRET_STOC'", "crsopt")
lnIdPolStoc = IIF(lnOk > 0 AND USED('crsopt') AND !ISNULL(crsopt.varvalue), VAL(ALLTRIM(crsopt.varvalue)), 0)
IF USED('crsopt')
USE IN crsopt
ENDIF
DO Verdict WITH lnIdPolStoc > 0, "politica de stoc citita din OPTIUNI, id_pol=" + TRANSFORM(lnIdPolStoc)
IF lnIdPolStoc <= 0
DO Final
ENDIF
PUBLIC gnId_pol_pret_stoc
gnId_pol_pret_stoc = lnIdPolStoc
* articol OK: rand al politicii de stoc, ID_NOTA propriu NULL, cont_venit_articol_stoc rezolvat
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is not null and rownum = 1", "crsok")
llGasitOk = lnOk > 0 AND USED('crsok') AND RECCOUNT('crsok') = 1
lnIdArtOk = IIF(llGasitOk, crsok.id_articol, 0)
IF USED('crsok')
USE IN crsok
ENDIF
DO AfLog WITH "articol OK ales: id_articol=" + TRANSFORM(lnIdArtOk)
* articol problema: alt rand al politicii de stoc, ID_NOTA propriu NULL, fara cont dedus
lnOk = SQLEXEC(gnHandle, ;
"select a.id_articol from crm_politici_pret_art a " + ;
"where a.id_pol = " + TRANSFORM(lnIdPolStoc) + " and a.id_nota is null " + ;
"and a.id_articol <> " + TRANSFORM(lnIdArtOk) + " " + ;
"and pack_facturare.cont_venit_articol_stoc(a.id_articol) is null and rownum = 1", "crsprob")
llGasitProblema = lnOk > 0 AND USED('crsprob') AND RECCOUNT('crsprob') = 1
lnIdArtProblema = IIF(llGasitProblema, crsprob.id_articol, 0)
IF USED('crsprob')
USE IN crsprob
ENDIF
DO AfLog WITH "articol PROBLEMA ales: id_articol=" + TRANSFORM(lnIdArtProblema)
* caz (c): o politica reala (<> politica de stoc) cu nota proprie valida (scc nenul) + un articol activ
lnOk = SQLEXEC(gnHandle, ;
"select p.id_pol from crm_politici_preturi p " + ;
"join crm_note_vanzari v on v.id_nota = p.id_nota " + ;
"join note_contabile n on n.id_set = v.id_set and n.scc is not null " + ;
"where p.id_pol <> " + TRANSFORM(lnIdPolStoc) + " and rownum = 1", "crspolreal")
llGasitPolReal = lnOk > 0 AND USED('crspolreal') AND RECCOUNT('crspolreal') = 1
lnIdPolReal = IIF(llGasitPolReal, crspolreal.id_pol, 0)
IF USED('crspolreal')
USE IN crspolreal
ENDIF
lnOk = SQLEXEC(gnHandle, "select id_articol from nom_articole where sters = 0 and rownum = 1", "crsartreal")
llGasitArtReal = lnOk > 0 AND USED('crsartreal') AND RECCOUNT('crsartreal') = 1
lnIdArtReal = IIF(llGasitArtReal, crsartreal.id_articol, 0)
IF USED('crsartreal')
USE IN crsartreal
ENDIF
DO AfLog WITH "CAZ(c) ales: id_pol_real=" + TRANSFORM(lnIdPolReal) + " id_articol=" + TRANSFORM(lnIdArtReal)
IF !llGasitOk OR !llGasitProblema OR !llGasitPolReal OR !llGasitArtReal
DO AfLog WITH "FAIL: date insuficiente in baza vie, opresc proba"
gnFail = gnFail + 1
DO Final
ENDIF
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtOk), "crsden1")
lcDenOk = IIF(lnOk > 0 AND USED('crsden1') AND RECCOUNT('crsden1') = 1, ALLTRIM(NVL(crsden1.denumire, [])), [<necunoscut>])
IF USED('crsden1')
USE IN crsden1
ENDIF
lnOk = SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(lnIdArtProblema), "crsden2")
lcDenProblema = IIF(lnOk > 0 AND USED('crsden2') AND RECCOUNT('crsden2') = 1, ALLTRIM(NVL(crsden2.denumire, [])), [<necunoscut>])
IF USED('crsden2')
USE IN crsden2
ENDIF
DO AfLog WITH "denumiri: OK=[" + lcDenOk + "] PROBLEMA=[" + lcDenProblema + "]"
* politica de stoc cu ID_NOTA NULL (tranzactie, ROLLBACK la final) - fortez ramura "fara cont dedus"
gcCaz = "[setup] "
lnOk = SQLEXEC(gnHandle, "UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = " + TRANSFORM(lnIdPolStoc))
DO Verdict WITH lnOk > 0, "UPDATE politica de stoc ID_NOTA=NULL (tranzactie, ROLLBACK la final) - lnOk=" + TRANSFORM(lnOk)
*==========================================================================================
* mediu formular: poDate, jtva_coloane, crsfactura gol, Createobject
*==========================================================================================
PRIVATE poDate, poGeneratorNumere
LOCAL lnIdSet
lnIdSet = 25000 + 30 - 1 + NVL(gnScadereStoc, 0) * 10
poDate = CREATEOBJECT("oDateFactura", lnIdSet, 30)
poDate.dataireg = DATE(gnAn, gnLuna, 10)
poDate.dataact = poDate.dataireg
poDate.zi_curs = poDate.dataireg
poDate.id_client = 1
poDate.nIdTipDoc = 6
poGeneratorNumere = NULL
DO AfLog WITH "poDate OK, tip=" + TRANSFORM(poDate.tip) + " id_pol=" + TRANSFORM(NVL(poDate.id_pol,-1)) + " in_valuta=" + TRANSFORM(poDate.in_valuta)
IF USED('jtva_coloane')
USE IN jtva_coloane
ENDIF
IF NVL(poDate.tva_incasare, 0) = 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 AfLog WITH "jtva_coloane Reccount=" + TRANSFORM(RECCOUNT('jtva_coloane'))
DO PregatesteFacturaGoala
LOCAL loForm
loForm = CREATEOBJECT('frm_facturare_articole2')
DO Verdict WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2"
IF VARTYPE(loForm) <> 'O'
DO Final
ENDIF
DO AfLog WITH "formular creat, nu afisat (fara Show())"
*==========================================================================================
* CAZ (a): toArticol fara Id_Pol, articol fara cont dedus -> refuz
*==========================================================================================
gcCaz = "[a-calea2-refuz] "
LOCAL loArticol, lnReccountInainte
loArticol = PregatesteToArticol(lnIdArtProblema, lcDenProblema, .F., 0)
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
LOCAL llRezA
llRezA = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Verdict WITH llRezA = .F., "do_adauga_articol_cautat = .F. (obtinut " + TRANSFORM(llRezA) + ")"
DO Verdict WITH RECCOUNT('crsfactura') == lnReccountInainte, ;
"Reccount(crsfactura) neschimbat (" + TRANSFORM(RECCOUNT('crsfactura')) + ", era " + TRANSFORM(lnReccountInainte) + ")"
DO Verdict WITH gnSpionCount >= 1, "spion: cel putin 1 mesaj (obtinut " + TRANSFORM(gnSpionCount) + ")"
DO Verdict WITH lcDenProblema $ gcSpionMesaje, "mesajul contine denumirea articolului [" + lcDenProblema + "] - mesaj: [" + gcSpionMesaje + "]"
*==========================================================================================
* CAZ (b): toArticol fara Id_Pol, articol CU cont dedus -> linia se adauga cu Id_Pol = politica de stoc
*==========================================================================================
gcCaz = "[b-calea2-cont-dedus] "
loArticol = PregatesteToArticol(lnIdArtOk, lcDenOk, .F., 0)
DO Verdict WITH TYPE('loArticol.Id_Pol') = 'U', "toArticol FARA proprietatea Id_Pol (Type=" + TYPE('loArticol.Id_Pol') + ")"
SELECT crsfactura
APPEND BLANK
lnReccountInainte = RECCOUNT('crsfactura')
gnSpionCount = 0
gcSpionMesaje = ""
LOCAL llRezB
llRezB = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Verdict WITH llRezB = .T., "do_adauga_articol_cautat = .T. (obtinut " + TRANSFORM(llRezB) + ")"
DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje
DO Verdict WITH VARTYPE(crsfactura.Id_Pol) = 'N' AND crsfactura.Id_Pol == gnId_pol_pret_stoc, ;
"linia noua primeste Id_Pol = politica de stoc (" + TRANSFORM(gnId_pol_pret_stoc) + ", obtinut " + TRANSFORM(NVL(crsfactura.Id_Pol,-999)) + ")"
*==========================================================================================
* CAZ (c): toArticol CU Id_Pol = politica reala (<> politica de stoc) -> linia pastreaza politica reala
*==========================================================================================
gcCaz = "[c-calea2-politica-reala] "
loArticol = PregatesteToArticol(lnIdArtReal, "articol-real", .T., lnIdPolReal)
DO Verdict WITH TYPE('loArticol.Id_Pol') = 'N' AND loArticol.Id_Pol == lnIdPolReal, ;
"toArticol.Id_Pol = politica reala aleasa (" + TRANSFORM(lnIdPolReal) + ", obtinut " + TRANSFORM(NVL(loArticol.Id_Pol,-999)) + ")"
SELECT crsfactura
APPEND BLANK
gnSpionCount = 0
gcSpionMesaje = ""
LOCAL llRezC
llRezC = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate)
DO Verdict WITH llRezC = .T., "do_adauga_articol_cautat = .T. (obtinut " + TRANSFORM(llRezC) + ")"
DO Verdict WITH gnSpionCount == 0, "spion: 0 mesaje (obtinut " + TRANSFORM(gnSpionCount) + ") - " + gcSpionMesaje
DO Verdict WITH VARTYPE(crsfactura.Id_Pol) = 'N' AND crsfactura.Id_Pol == lnIdPolReal, ;
"linia noua pastreaza Id_Pol = politica reala (" + TRANSFORM(lnIdPolReal) + ", obtinut " + TRANSFORM(NVL(crsfactura.Id_Pol,-999)) + "), nu politica de stoc"
IF VARTYPE(loForm) = 'O' AND !ISNULL(loForm)
loForm.Release()
ENDIF
loForm = NULL
DO Final
*==================================================================================================
*-- spion amessagebox - contor + texte, incarcat PRIMUL (vezi SET PROCEDURE la inceput)
FUNCTION amessagebox
LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue
gnSpionCount = gnSpionCount + 1
gcSpionMesaje = gcSpionMesaje + "[" + TRANSFORM(tcMessage) + "]" + CHR(13) + CHR(10)
DO AfLog WITH " [spion amessagebox] " + TRANSFORM(tcMessage)
RETURN 6
ENDFUNC
*-- crsfactura gol, cu campul 'gestiune' suplimentar cerut de grd_factura.cGestiune (ca in
*-- probe_12b_s8_cai_1_3.prg) - obligatoriu inainte de Createobject (legare ControlSource)
PROCEDURE PregatesteFacturaGoala
IF USED('crsfactura')
USE IN crsfactura
ENDIF
creeaza_facturacrs([crsfactura])
SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE
USE IN crsfactura
SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE
USE IN crsfact_tmp
ENDPROC
*-- toArticol: obiect echivalent unui Scatter Name pe crsCodmat/crsDenumire (structura reala,
*-- creeaza_cursor_gol/reordoneaza din ofacturare.vc2, 20 coloane), fara/cu id_pol dupa caz
FUNCTION PregatesteToArticol
LPARAMETERS tnIdArticol, tcDenumire, tlCuIdPol, tnIdPol
LOCAL lcCursor, loObj
IF USED('crstoart')
USE IN crstoart
ENDIF
IF m.tlCuIdPol
CREATE CURSOR crstoart (codmat C(100), denumire C(100), um C(10), pret N(20,4), ;
nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ;
id_pol N(20), gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ;
multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
cantitate N(20,4), pret_val N(20,4))
INSERT INTO crstoart (codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, ;
id_articol, id_pol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ;
discount_unitar, discount_unitar_val, cantitate, pret_val) ;
VALUES ([S8-4A], tcDenumire, [BUC], 100, [RON], [S8-4a], 1.19, [], tnIdArticol, ;
tnIdPol, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0)
ELSE
CREATE CURSOR crstoart (codmat C(100), denumire C(100), um C(10), pret N(20,4), ;
nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ;
gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ;
multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ;
cantitate N(20,4), pret_val N(20,4))
INSERT INTO crstoart (codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, ;
id_articol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ;
discount_unitar, discount_unitar_val, cantitate, pret_val) ;
VALUES ([S8-4A], tcDenumire, [BUC], 100, [RON], [S8-4a], 1.19, [], tnIdArticol, ;
0, 0, 0, 1, 1, 1, 0, 0, 1, 0)
ENDIF
SELECT crstoart
GO TOP
SCATTER NAME loObj MEMO
RETURN loObj
ENDFUNC
PROCEDURE Verdict
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO AfLog WITH "PASS: " + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO AfLog WITH "FAIL: " + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE AfLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE AfErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg
gnFail = gnFail + 1
ENDPROC
PROCEDURE Final
LOCAL lnOk
gcCaz = "[final] "
IF TYPE('gnHandle') = 'N' AND gnHandle > 0
lnOk = SQLEXEC(gnHandle, "ROLLBACK")
DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk)
IF TYPE('gnTransOriginal') = 'N'
SQLSETPROP(gnHandle, "Transactions", gnTransOriginal)
ENDIF
ENDIF
DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail)
DO AfLog WITH "END " + TTOC(DATETIME())
QUIT
ENDPROC