Files
comun/utile/Teste/facturare_unificat/test_s6_4_transfer.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

853 lines
38 KiB
Plaintext

* test_s6_4_transfer.prg
* Headless: S6-4, transfer (tip 23) si retur transfer (tip 41).
* Bloc A (structural, mereu ruleaza, 0 numere): dovedeste ca v2 nu are traseu catre crsfactura
* nevid pentru 23/41 - cablare, zeroire, absenta grid/buton pe rand.
* Bloc B (structural, mereu ruleaza, 0 numere): dovedeste traseul real pe v1 - But_urmator1,
* ramura modala din do_adauga_articol cu gnScadereStoc=0, clasa frm_articol_factura.
* Bloc D (structural, mereu ruleaza, 0 numere): asertiuni pe cele doua divergente v1/v2 cunoscute
* si inca vii azi in Do Case-ul din do_initializeaza_articol - nu sunt defecte azi (tip 24 nu
* apare in intervalul clasei v2, iar copierea ruteaza azi pe v1), dar sunt capcane latente
* pentru ziua in care v2 ramane singurul formular. Pica daca cineva "unifica" gresit garda.
* Bloc C (emitere REALA, doar pe v1, 1-2 numere tipdoc 6): condtionat de sursa de stoc gasita
* in date (articolul 315554536 / gestiunea 6) sau de scriptul wip13_..._STOC_TRANSFER aplicat.
* Fara sursa: se dezaloca numarul, blocul se marcheaza NEEXERCITAT, nu FAIL.
* NU exista Bloc de comparatie CompDoc: nu exista niciodata document v2 pentru tip 23/41 (§5.d
* din propunere) - a incerca sa emiti pe v2 ar testa cod mort, nu traseul (lectia platita de 3
* ori in acest plan).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_4_transfer.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.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 TABLEPROMPT 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 gcClaseVazute, goDriverS64, gnModaleArticolInchise
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gnErr = 0
gcCaz = ""
gcMockApeluri = ""
gnMockRaspuns = 6
gcMockDuplicat = ""
gcClaseVazute = ";"
gnModaleArticolInchise = 0
gcNumere = ""
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
*-- poDate & co. declarate SI initializate la nivel de program (capcana platita: PRIVATE declarat
*-- intr-o procedura si asignat in alta ramane invizibil formei)
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
ON ERROR DO S64Err 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 S64Log WITH 'EROARE: conectare Oracle esuata'
DO S64Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S64Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
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\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S64Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S64Final
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 S64Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
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
*-- driver + timer: frm_articol_factura (modalul din §3.2) nu trece prin amessagebox, deci
*-- mock-ul nu il acopera. Acelasi tipar de timer/driver validat la S6-2/S6-3/S8.
goDriverS64 = CREATEOBJECT('driverS64')
_SCREEN.AddObject('tmrS64', 'Timer')
_SCREEN.tmrS64.Interval = 200
BINDEVENT(_SCREEN.tmrS64, 'Timer', goDriverS64, 'Executa')
_SCREEN.tmrS64.Enabled = .T.
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC A: v2 nu are traseu (structural, 0 numere) ====='
DO BlocA_V2FaraTraseu
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC B: v1 are traseu per-articol cu modal (structural, 0 numere) ====='
DO BlocB_V1Traseu
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC D: divergentele v1/v2 cunoscute, latente azi (structural, 0 numere) ====='
DO BlocD_DivergenteV1V2
DO S64Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSEI REALE (STOC) ====='
DO AlegeSursaStoc
DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC C: emitere REALA pe v1 (conditionata de sursa) ====='
DO BlocC_EmitereV1
DO S64Final
CATCH TO loExc
DO S64Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S64Final
ENDTRY
QUIT
*==================================================================================
* BLOC A: cele trei goluri de pe v2, verificate pe cod, fara sa incarce nimic.
PROCEDURE BlocA_V2FaraTraseu
LOCAL lcTxt, lcV2
gcCaz = '[A] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol'
RETURN
ENDIF
*-- A1: cablarea do_incarca_articole (v2) nu include 23/41 in Inlist-ul catre do_adauga_tot
DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt AND ;
!("Inlist(poDate.tip, 3, 4, 21, 23, 25, 28, 41, 42, 47, 8, 9)" $ lcTxt), ;
'A1: cablarea do_adauga_tot (v2) NU contine 23 sau 41 - crsfactura ramane gol dupa Incarca articole'
*-- A2: do_initializeaza_articol zeroeste cantitatea pt 23/41 pe AMBELE clase
DO Assert WITH OCCURS("If Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !INLIST(toArticol.opt_facturare,1,2)", lcTxt) >= 1, ;
'A2: do_initializeaza_articol (v2) zeroeste cantitatea pt grupul care include 23 si 41'
*-- A3: v2 nu are But_urmator1 (buton per-rand). NU e unic in tot fisierul (frm_articole_compuse,
*-- clasa nelegata, il are si el la ofacturare.vc2:4489) - scopat pe intervalul claselor v1/v2.
LOCAL lnA3v1, lnA3v2, lnA3Next, lcA3v1, lcA3v2
lnA3v1 = AT('DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx"', lcTxt)
lnA3v2 = AT('DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"', lcTxt)
lnA3Next = AT('DEFINE CLASS frm_nomrute AS frm_termin OF "_frm_child.vcx"', lcTxt)
IF lnA3v1 = 0 OR lnA3v2 = 0 OR lnA3Next = 0 OR lnA3v2 <= lnA3v1 OR lnA3Next <= lnA3v2
DO Assert WITH .F., 'A3: pre-conditie - ancorele DEFINE CLASS frm_facturare_articole/2/frm_nomrute gasite si in ordine'
ELSE
lcA3v1 = SUBSTR(lcTxt, lnA3v1, lnA3v2 - lnA3v1)
lcA3v2 = SUBSTR(lcTxt, lnA3v2, lnA3Next - lnA3v2)
DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v1) = 1, ;
'A3a: v1 (frm_facturare_articole) are But_urmator1 (buton per-rand)'
DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v2) = 0, ;
'A3b: v2 (frm_facturare_articole2) NU are But_urmator1 - fara echivalent per-rand'
ENDIF
*-- A4: linia libera (do_adauga_articol_cautat) nu verifica 23/41 (Inlist-ul de gardare)
DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47) And !Thisform.do_verifica_articol" $ lcTxt, ;
'A4: garda de stoc a liniei libere (v2) nu acopera 23/41 - nici pe acolo nu exista traseu utilizabil'
*-- A5: instantiere directa a v2 + Incarca articole pe un antet de transfer -> crsfactura ramane gol
*-- (proba comportamentala, nu doar text - dar NU e "traseul real", e control ca A1-A4 nu mint)
DO ControlComportamentalV2
ENDPROC
*-- Control comportamental: cheama Incarca articole pe v2 cu poDate.tip=23, verifica ca
*-- crsfactura ramane gol chiar daca crsarticole s-a umplut. Nu emite, nu consuma numar.
PROCEDURE ControlComportamentalV2
LOCAL loForm, lnArt, lnFact
gcCaz = '[A5] '
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25022, 23)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.id_client = 6
poDate.nume_client = 'DEPOZIT'
IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init)
poDate.id_gestiune_init = 6
ENDIF
poDate.id_delegat = 39
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., 'A5: rezultat_serii = 3 pe antet de control (transfer), e=' + TRANSFORM(poDate.rezultat_serii)
DO Goleste
RETURN
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
DO S64Log WITH ' A5 control: 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
DO PregatesteFacturaCrsV2
loForm = CREATEOBJECT('frm_facturare_articole2')
IF VARTYPE(loForm) <> 'O'
DO Assert WITH .F., 'A5: Createobject frm_facturare_articole2 (control)'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN
ENDIF
loForm.WindowType = 0
loForm.Show()
DOEVENTS FORCE
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
loForm.but_incarca_articole.Click()
DOEVENTS FORCE
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S64Log WITH ' A5 control: dupa Click crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
DO Assert WITH lnFact = 0, ;
'A5: pe v2, transfer (tip 23), crsfactura ramane GOL dupa Incarca articole - confirma A1-A2 pe comportament'
TRY
loForm.Release()
CATCH
ENDTRY
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (A5, control, niciodata scris);'
DO CuratieCrs
DO Goleste
ENDPROC
PROCEDURE PregatesteFacturaCrsV2
DO creeaza_facturacrs WITH '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
*==================================================================================
* BLOC B: traseul real pe v1 - buton, ramura modala, clasa frm_articol_factura. Doar text/PEMSTATUS,
* nu instantiaza formularul (evita orice dialog inutil).
PROCEDURE BlocB_V1Traseu
LOCAL lcTxt
gcCaz = '[B] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
DO Assert WITH "caction = do_urmator," $ lcTxt, ;
'B1: But_urmator1 (v1) are cAction = do_urmator - butonul viu pentru adaugare per-articol'
DO Assert WITH "Case (poArticol.gestionabil = 0 Or gnScadereStoc = 0 Or poDate.tip = 45)" $ lcTxt, ;
'B2: do_adauga_articol (v1) ia ramura modala necoditionat cand gnScadereStoc = 0'
DO Assert WITH 'Createobject("frm_articol_factura", lnCantitate, tlImplicit)' $ lcTxt, ;
'B3: ramura modala instantiaza frm_articol_factura (nu do_alege_stoc)'
DO Assert WITH "If !tlImplicit" $ lcTxt AND "ofrmadarticol.Show(1)" $ lcTxt, ;
'B4: modalul se arata (Show(1)) cand tlImplicit = .F. - cazul But_urmator1, nu Adauga tot'
*-- B5: pe v1, but_urmator_tot1 NU e vizibil pentru 23/41 (spre deosebire de 3,4,8,9,21,24,25,28,42,47)
DO VerificaButUrmatorTotAscunsPentruTransfer WITH lcTxt
ENDPROC
* Cauta blocul "Case poDate.tip = 23 ... Endcase/Case urmator" si verifica ca nu contine
* "but_urmator_tot1.Visible = .T." intre el si urmatorul Case. Cautare pe text, robusta la
* reformatari minore (nu presupune numar de linie).
PROCEDURE VerificaButUrmatorTotAscunsPentruTransfer
LPARAMETERS tcTxt
LOCAL lnStart23, lnStart41, lnNextAfter23, lnNextAfter41, lcBloc23, lcBloc41
lnStart23 = AT("Case poDate.tip = 23" + CHR(13) + CHR(10), tcTxt)
IF lnStart23 = 0
lnStart23 = AT("Case poDate.tip = 23", tcTxt)
ENDIF
lnStart41 = AT("Case poDate.tip = 41", tcTxt, 2) && a doua aparitie (dupa cea din alt context, daca exista)
IF lnStart41 = 0 OR lnStart41 < lnStart23
lnStart41 = AT("Case poDate.tip = 41", tcTxt)
ENDIF
IF lnStart23 = 0 OR lnStart41 = 0
DO Assert WITH .F., 'B5: blocurile Case poDate.tip = 23 / 41 gasite in text (pre-conditie cautare)'
RETURN
ENDIF
lnNextAfter23 = AT("Case poDate.tip = 41", tcTxt, 1)
lcBloc23 = SUBSTR(tcTxt, lnStart23, MAX(lnNextAfter23 - lnStart23, 1))
lnNextAfter41 = AT("Case poDate.tip = 25", tcTxt, 1)
lcBloc41 = SUBSTR(tcTxt, lnStart41, MAX(lnNextAfter41 - lnStart41, 1))
DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc23)), ;
'B5a: blocul Case poDate.tip=23 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns'
DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc41)), ;
'B5b: blocul Case poDate.tip=41 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns'
ENDPROC
*==================================================================================
* BLOC D: cele doua divergente v1/v2 in do_initializeaza_articol, gasite dincolo de propunere.
* Verificat pe cod (ofacturare.vc2): v1 :13878/13890, v2 :19700/19712. NU sunt defecte azi -
* tipul 24 (aviz retur) nu apare deloc in intervalul clasei v2 (15894-21780), iar copierea
* (poDate.lCopiere) ruteaza azi pe v1 (S5c) - dar sunt capcane latente pentru ziua in care v2
* ramane singurul formular (tinta planului #13). Asertiunile pica daca cineva "unifica" garda
* gresit (adica sterge divergenta fara sa decida explicit ce se intampla cu lCopiere/tip 24 pe v2).
* D3 (a treia asertiune ceruta): masinaria modalului per-rand (do_adauga_articol cu tip hint
* frm_articol_factura) exista SI pe v2 - lipseste doar punctul de intrare din UI (A3/B1), nu
* motorul. Distinctia schimba forma reparatiei din propunere §7.
PROCEDURE BlocD_DivergenteV1V2
LOCAL lcTxt
gcCaz = '[D] '
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
*-- D1: v1 (:13890) zeroeste cu exceptia suplimentara "OR poDate.lCopiere" - v2 nu o are
DO Assert WITH "Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)" $ lcTxt, ;
'D1: v1 (ofacturare.vc2:13890) are exceptia OR poDate.lCopiere in garda de zeroire - v2 (:19712) nu o are'
*-- D2: varianta cu lCopiere apare o singura data (doar v1) - daca ar aparea si pe v2, divergenta ar fi disparuta silentios
DO Assert WITH OCCURS("Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)", lcTxt) = 1, ;
'D2: garda cu OR poDate.lCopiere exista o singura data in fisier (doar pe v1, :13890) - divergenta e inca vie azi'
*-- D3: v1 (:13878) negeaza cantitatea si pentru tip 24 (aviz retur) - v2 (:19700) doar 8,9.
*-- Substringul scurt "Inlist(poDate.tip,8,9,24)" apare de 8 ori in fisier (Iif/Case aiurea,
*-- alte metode) - asertiunea foloseste sirul complet cu comentariul, unic garantat.
*-- capcana platita aici: VFP trateaza "&&" ca inceput de comentariu chiar si in interiorul unui
*-- string literal (verificat - eroarea 36 aparea si fara linie continuata) - construit din
*-- CHR(38) ca sa nu apara deloc literalul "&&" in sursa .prg
LOCAL lcD3Cauta
lcD3Cauta = "If Inlist(poDate.tip,8,9,24) " + CHR(38) + CHR(38) + " retur lei, retur valuta, aviz retur"
DO Assert WITH OCCURS(lcD3Cauta, lcTxt) = 1, 'D3: garda cu Inlist(poDate.tip,8,9,24) si comentariul aferent exista o singura data (doar pe v1, :13878) - v2 (:19700) are doar 8,9, fara 24'
*-- D4: masinaria modalului per-rand (do_adauga_articol) exista pe AMBELE clase - motorul nu lipseste, doar intrarea din UI
DO Assert WITH OCCURS('Local ofrmadarticol As "frm_articol_factura"', lcTxt) = 2, ;
'D4: type hint ofrmadarticol As frm_articol_factura apare de doua ori (v1 SI v2) - masinaria modalului exista si pe v2, lipseste doar But_urmator1/grd_articole (A3/B1)'
ENDPROC
*==================================================================================
* Alege sursa reala de stoc: intai articolul/gestiunea gasite in propunere (315554536 / gestiunea 6),
* verificat inca valabil; altfel scaneaza gestiunile 1,4,6,19 dupa orice articol cu stoc > 0.
PROCEDURE AlegeSursaStoc
PUBLIC gnArtSursa, gnGestSursa, gnGestDest, gnCantSursa
gnArtSursa = 0
gnGestSursa = 0
gnGestDest = 0
gnCantSursa = 0
LOCAL lnQ
lnQ = goExecutor.oExecute([select cant from stoc where id_articol=315554536 and id_gestiune=6 ] + ;
[and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + [ and cant>0], 'crsSondaStoc')
IF lnQ >= 0 AND USED('crsSondaStoc') AND RECCOUNT('crsSondaStoc') > 0
gnArtSursa = 315554536
gnGestSursa = 6
gnGestDest = 4
gnCantSursa = crsSondaStoc.cant
DO S64Log WITH ' sursa cunoscuta inca valabila: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa)
ENDIF
DO Inchide WITH 'crsSondaStoc'
IF gnArtSursa = 0
lnQ = goExecutor.oExecute([select id_gestiune, id_articol, cant from stoc ] + ;
[where id_gestiune in (1,4,6,19) and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + ;
[ and cant>0 order by cant desc], 'crsStocCand')
IF lnQ >= 0 AND USED('crsStocCand') AND RECCOUNT('crsStocCand') > 0
SELECT crsStocCand
GO TOP
gnArtSursa = id_articol
gnGestSursa = id_gestiune
gnCantSursa = cant
gnGestDest = IIF(gnGestSursa = 4, 1, 4)
DO S64Log WITH ' sursa gasita prin scanare: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa)
ENDIF
DO Inchide WITH 'crsStocCand'
ENDIF
IF gnArtSursa = 0
DO S64Log WITH ' NICIO sursa de stoc gasita in gestiunile 1,4,6,19, perioada ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ;
' - Blocul C ramane NEEXERCITAT. Vezi propunerea sectiunea 4.1 (script wip13 neaplicat).'
ENDIF
ENDPROC
*==================================================================================
* BLOC C: emitere REALA pe v1, doar daca AlegeSursaStoc a gasit o sursa. NU exista echivalent v2,
* deci NU exista Compara/CompDoc aici - vezi verdictul din propunere, punctul d.
PROCEDURE BlocC_EmitereV1
LOCAL oform, lcSerie, lnNract, lnIdVz
gcCaz = '[C] '
IF gnArtSursa = 0
DO S64Log WITH ' C NEEXERCITAT: nicio sursa de stoc (vezi ALEGEREA SURSEI REALE de mai sus)'
RETURN
ENDIF
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25022, 23)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
poDate.id_client = gnGestSursa
poDate.nume_client = 'GESTIUNE SURSA ' + TRANSFORM(gnGestSursa)
IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init)
poDate.id_gestiune_init = gnGestSursa
ENDIF
poDate.id_delegat = 39
IF EMPTY(NVL(poDate.id_fdoc, 0))
poDate.id_fdoc = 1
ENDIF
*-- necunoscuta #1 (propunere §6.2): mapare id_client/id_gestiune_init = ambele sursa e confirmata
*-- EMPIRIC mai jos (incarca_cursor_articole a adus stocul din gestiunea 6 cu id_gestiune_init=6).
*-- Blocajul real gasit la prima rulare a fost altul: poDateGestiuneDest si poDate.listaid raman
*-- goale in acest test (nu trecem prin frm_date_aviz.do_cauta_gestiune_dest, calea UI normala) -
*-- do_scrie_articole (ofacturare.vc2:14152/19863) foloseste poDateGestiuneDest.id_gestiune=0 in
*-- pack_facturare.initializeaza_date_gestiune(), care Oracle a respins cu "Eroare la selectarea
*-- gestiunii! (FACT-019)". Reparat aici cu acelasi SELECT folosit de caut_gestiune_dest()
*-- (ocautare.prg:3298-3305), filtrat direct pe gnGestDest - fara picker modal, deci fara risc de
*-- atarnare.
LOCAL lcSqlGD, lnQGD
lcSqlGD = [select distinct c.nume_gestiune,c.cgest,b.id_gestiune,d.id_tipgest,] + ;
[NVL(c.cont, d.cont) as cont,NVL(c.acont, p.acont) as acont ] + ;
[from gest_coresp_util_grupe a ] + ;
[left join gest_coresp_grupe_gestiuni b on a.id_grupe=b.id_grupe ] + ;
[left join nom_gestiuni c on b.id_gestiune=c.id_gestiune ] + ;
[left join coresp_cont_tipgest d on c.nr_pag=d.id_tipgest ] + ;
[left join vplcont_analitic p on NVL(c.cont, d.cont) = p.cont and p.an = ] + TRANSFORM(gnAn) + [ and p.inactiv = 0 ] + ;
[where a.id_util=] + TRANSFORM(gnIdUtil) + [ and a.sters=0 and b.sters=0 and c.sters=0 and c.nr_pag in (2,4,5,6,7) and b.id_gestiune = ] + TRANSFORM(gnGestDest)
lnQGD = goExecutor.oExecute(lcSqlGD, 'crsGestDest')
IF lnQGD >= 0 AND USED('crsGestDest') AND RECCOUNT('crsGestDest') > 0
poDateGestiuneDest.id_gestiune = crsGestDest.id_gestiune
poDateGestiuneDest.id_tipgest = NVL(crsGestDest.id_tipgest, 0)
poDateGestiuneDest.Cont = NVL(crsGestDest.cont, 'XXXX')
poDateGestiuneDest.acont = NVL(crsGestDest.acont, 'XXXX')
poDate.listaid = TRANSFORM(crsGestDest.id_gestiune)
poDate.descriere = ALLTRIM(NVL(crsGestDest.nume_gestiune, ''))
DO S64Log WITH ' C: gestiune destinatie rezolvata din gest_coresp_util_grupe - id_gestiune=' + TRANSFORM(poDateGestiuneDest.id_gestiune) + ;
' id_tipgest=' + TRANSFORM(poDateGestiuneDest.id_tipgest) + ' Cont=' + poDateGestiuneDest.Cont + ' listaid=' + poDate.listaid
ELSE
DO S64Log WITH ' C: NICIO corespondenta gest_coresp_util_grupe pentru gnIdUtil=' + TRANSFORM(gnIdUtil) + ' si gestiunea destinatie=' + TRANSFORM(gnGestDest) + ;
' - poDateGestiuneDest ramane 0, emiterea va pica probabil la but_termin1 (FACT-019)'
ENDIF
DO Inchide WITH 'crsGestDest'
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., 'C: rezultat_serii = 3 (transfer), e=' + TRANSFORM(poDate.rezultat_serii)
DO Goleste
RETURN
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
DO S64Log WITH ' C: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ;
' gestiune sursa=' + TRANSFORM(gnGestSursa) + ' articol=' + TRANSFORM(gnArtSursa)
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
*-- v1: incarca_cursor_articole INAINTE de formular (ca in factureaza(), ramura veche)
LOCAL loRez
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
DO S64Log WITH ' C: incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ' lArticole=' + TRANSFORM(loRez.lArticole) + ;
' crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'C: incarca_cursor_articole a adus articole (sursa reala)'
IF !((loRez.nSucces >= 0) AND loRez.lArticole)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, fara articole);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN
ENDIF
*-- pastreaza doar articolul-sursa ales, ca sa nu deschida un modal per fiecare rand din gestiune
IF USED('crsarticole')
SELECT * FROM crsarticole WHERE id_articol = gnArtSursa INTO CURSOR crsarticole_filtrat READWRITE
IF USED('crsarticole_filtrat') AND RECCOUNT('crsarticole_filtrat') > 0
USE IN crsarticole
SELECT * FROM crsarticole_filtrat INTO CURSOR crsarticole READWRITE
USE IN crsarticole_filtrat
ENDIF
ENDIF
DO S64Log WITH ' C: crsarticole filtrat la articolul sursa, randuri=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0))
*-- SIMULARE (optiunea 2 din sarcina): traseul real (grd_gestiuni/AfterRowColChange, ofacturare.vc2:4219-4232)
*-- ruleaza doar pe ramura gnScadereStoc=1 (do_alege_stoc -> frm_articol_gest_factura), interzisa explicit
*-- (interdictia #5). Cu gnScadereStoc=0, do_adauga_articol instantiaza frm_articol_factura de baza
*-- (fara grd_gestiuni), care nu atinge deloc poArticol.id_gestiune - ramane pe sentinela -1000 din
*-- do_initializeaza_articol (ofacturare.vc2:13771-13773), pe care Oracle o trateaza explicit ca "nesetat"
*-- (ADAUGA_ARTICOL_FACTURA: IF V_ID_GESTIUNE <> -1000 ...), deci V_ID_GESTIUNE2 ramane NULL -> FACT-019.
*-- Reparat aici imbogatind crsarticole cu exact campurile pe care AfterRowColChange le-ar seta pe poArticol,
*-- citite din acelasi cursor real (pack_facturare.cursor_gestiuni_articol, apelat de do_alege_stoc:13389 -
*-- verificat pe USER_SOURCE:3174-3268, doar SELECT/OPEN CURSOR, nicio scriere), nu valori inventate.
LOCAL lcSqlGA, lnQGA, lnGA_idgest, lnGA_pretach, lcGA_lot, lcGA_serie, lcGA_cont, lnGA_idlucrez, lnGA_idpartrez, lnGA_pretv, lnGA_idval, lnGA_pretd
lnGA_idgest = 0
lcSqlGA = [{call pack_facturare.cursor_gestiuni_articol(] + TRANSFORM(gnArtSursa) + [,] + TRANSFORM(poDate.tip) + [,] + ;
TRANSFORM(gnGestSursa) + [,] + TRANSFORM(gnLuna) + [,] + TRANSFORM(gnAn) + [,] + TRANSFORM(gnIdUtil) + [,] + ;
IIF(ISNULL(gnIdSucursala), [NULL], TRANSFORM(gnIdSucursala)) + [)}]
lnQGA = goExecutor.oExecute(lcSqlGA, 'crsgestarticol')
DO S64Log WITH ' C: crsgestarticol (cursor real de loturi, cursor_gestiuni_articol) -> nSucces=' + TRANSFORM(lnQGA) + ;
' randuri=' + IIF(USED('crsgestarticol'), TRANSFORM(RECCOUNT('crsgestarticol')), '(nedeschis)')
IF lnQGA >= 0 AND USED('crsgestarticol') AND RECCOUNT('crsgestarticol') > 0
SELECT crsgestarticol
LOCATE FOR id_gestiune = gnGestSursa
IF !FOUND()
GO TOP
ENDIF
lnGA_idgest = id_gestiune
lnGA_pretach = Pret
lcGA_lot = NVL(lot, '')
lcGA_serie = NVL(serie, '')
lcGA_cont = ALLTRIM(NVL(Cont, 'XXXX'))
lnGA_idlucrez = NVL(id_lucrare_rez, 0)
lnGA_idpartrez = NVL(id_part_rez, 0)
lnGA_pretv = NVL(pretv, 0)
lnGA_idval = NVL(id_valuta, 0)
lnGA_pretd = NVL(pretd, 0)
DO S64Log WITH ' C: crsgestarticol rand ales - id_gestiune=' + TRANSFORM(lnGA_idgest) + ' Pret=' + TRANSFORM(lnGA_pretach) + ;
' lot=[' + lcGA_lot + '] serie=[' + lcGA_serie + '] Cont=' + lcGA_cont
ELSE
DO S64Log WITH ' C: crsgestarticol GOL pentru articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ;
' - sursa de stoc nu suporta transferul pe acest traseu (alt verdict, nu artefact de test)'
ENDIF
DO Inchide WITH 'crsgestarticol'
IF lnGA_idgest > 0 AND USED('crsarticole')
*-- ALTER TABLE ADD COLUMN a picat cu eroare 1712 "duplicate or invalid" pe nume de camp > 10
*-- caractere (id_gestiune, pret_achizitie, ...) desi TYPE() confirma ca lipsesc - capcana VFP:
*-- ALTER TABLE nu accepta nume lungi pe cursor, desi SELECT...INTO CURSOR le accepta (vezi
*-- tiparul deja folosit in acest fisier, PregatesteFacturaCrsV2). Reconstruit cu SELECT+CAST.
SELECT *, ;
CAST(m.lnGA_idgest AS N(20)) AS id_gestiune, ;
CAST(m.lnGA_pretach AS N(18,6)) AS pret_achizitie, ;
CAST(m.lcGA_cont AS C(20)) AS Cont, ;
CAST(m.lnGA_idlucrez AS N(20)) AS id_lucrare_rez, ;
CAST(m.lnGA_idpartrez AS N(20)) AS id_part_rez, ;
CAST(m.lnGA_pretv AS N(18,6)) AS pretv_orig, ;
CAST(m.lnGA_idval AS N(10)) AS id_valuta_d, ;
CAST(m.lnGA_pretd AS N(18,6)) AS pretd ;
FROM crsarticole INTO CURSOR crsarticole_ge READWRITE
IF USED('crsarticole_ge') AND RECCOUNT('crsarticole_ge') > 0
REPLACE ALL lot WITH lcGA_lot, serie WITH lcGA_serie IN crsarticole_ge
USE IN crsarticole
SELECT * FROM crsarticole_ge INTO CURSOR crsarticole READWRITE
USE IN crsarticole_ge
DO S64Log WITH ' C: crsarticole imbogatit (SELECT+CAST) cu id_gestiune/pret_achizitie/lot/serie/Cont din crsgestarticol (simulare AfterRowColChange)'
ELSE
DO Assert WITH .F., 'C: reconstructia crsarticole cu campurile din crsgestarticol a esuat'
ENDIF
ENDIF
oform = CREATEOBJECT('frm_facturare_articole')
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., 'C: Createobject frm_facturare_articole'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', ;
'C: butonul But_urmator1 duce la do_urmator (traseul real pentru transfer)'
DO Assert WITH !oform.but_urmator_tot1.Visible, ;
'C: but_urmator_tot1 NU e vizibil pe transfer (confirma B5a pe instanta reala)'
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
gnModaleArticolInchise = 0
oform.but_urmator1.Click()
DOEVENTS FORCE
DO S64Log WITH ' C: dupa but_urmator1.Click, modale frm_articol_factura inchise de driver=' + TRANSFORM(gnModaleArticolInchise) + ;
' crsfactura=' + IIF(USED('crsfactura'), TRANSFORM(RECCOUNT('crsfactura')), '(nedeschis)')
DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, ;
'C: crsfactura are cel putin o linie dupa parcurgerea modalului per-articol'
*-- inchide neverificatul #1 din diagnostic (§5): valoarea reala pe care a scris-o poArticol, citita direct
*-- din crsfactura (poArticol e PRIVATE, iesit din scop dupa ce do_adauga_articol s-a intors)
IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0
SELECT crsfactura
GO TOP
DO S64Log WITH ' C: crsfactura.id_gestiune dupa modal=' + TRANSFORM(NVL(id_gestiune, -99999)) + ;
' (sursa aleasa gnGestSursa=' + TRANSFORM(gnGestSursa) + ')'
ENDIF
IF !(USED('crsfactura') AND RECCOUNT('crsfactura') > 0)
TRY
oform.Release()
CATCH
ENDTRY
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, crsfactura gol);'
DO CuratieCrs
DO Goleste
RETURN
ENDIF
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
oform.but_termin1.Click()
DOEVENTS FORCE
DO S64Log WITH ' C: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ;
' apeluri amessagebox=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO Assert WITH lnIdVz > 0, 'C: documentul de transfer exista in VANZARI (jonctiune serie_act+numar_act), id=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (C, transfer real);'
DO Assert WITH goExecutor.oExecute([select tip from vanzari where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVzC') >= 0 ;
AND USED('crsVzC') AND RECCOUNT('crsVzC') = 1 AND crsVzC.tip = 23, ;
'C: VANZARI.TIP = 23 pe documentul emis'
DO Inchide WITH 'crsVzC'
DO Assert WITH goExecutor.oExecute([select id_gestiune from vanzari_detalii where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVdC') >= 0 ;
AND USED('crsVdC') AND RECCOUNT('crsVdC') = 1 AND NVL(crsVdC.id_gestiune, -99999) = gnGestSursa, ;
'C: VANZARI_DETALII.ID_GESTIUNE = gestiunea sursa aleasa (' + TRANSFORM(gnGestSursa) + '), nu NULL si nu alta'
DO Inchide WITH 'crsVdC'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (C, nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
ENDIF
TRY
oform.Release()
CATCH
ENDTRY
DO CuratieCrs
DO Goleste
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 'crsarticole1'
DO Inchide WITH 'crsarticole_filtrat'
DO Inchide WITH 'crsarticole_ge'
DO Inchide WITH 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
DO Inchide WITH 'crsgestarticol'
DO Inchide WITH 'crsCtrTemp'
DO Inchide WITH 'crsComTemp'
DO Inchide WITH 'crsartselectate'
DO Inchide WITH 'jtva_coloane'
ENDPROC
PROCEDURE Inchide
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S64Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S64Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S64Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S64Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S64Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S64Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS64') = 'O'
_SCREEN.tmrS64.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS64')
CATCH
ENDTRY
ENDIF
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
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 720 order by numar_act], 'crsNrSSS') >= 0
DO S64Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):'
SELECT crsNrSSS
SCAN
DO S64Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S64Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S64Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S64Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
* driverS64: inchide automat modalul frm_articol_factura (§3.2), setand cantitatea pe controlul
* clb_cantitate.Text_simplu1 si apeland do_termin() direct (acelasi tipar validat la S6-3 pentru
* FRM_ALTE_DATE - apel direct pe metoda de baza, nu Release, ca sa nu sara peste procesarea din
* do_termin). Trateaza si MESSAGEBOX_FORM (cmdYes/cmdOk) - nu trece prin amessagebox, deci mock-ul
* nu il acopera; tipar identic cu driverMsgS8/driverS63 (capcana platita, gasita la prima rulare
* aici: A5/Incarca articole pe v2 a deschis un MESSAGEBOX_FORM neprevazut in propunere si a atarnat
* fara acest bloc). Nu atinge FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2 in niciun fel.
DEFINE CLASS driverS64 AS Custom
lBusy = .F.
nUltimAlteDate = 0
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS64') = 'O'
_SCREEN.tmrS64.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loArtForm, loMsgForm, loAlteDate, lcClasa
loArtForm = NULL
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF lcClasa == 'FRM_ARTICOL_FACTURA'
loArtForm = _SCREEN.Forms(lnI)
ENDIF
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 S64Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loArtForm)
TRY
LOCAL lnCantSetata
lnCantSetata = MAX(gnCantSursa, 1)
loArtForm.clb_cantitate.Text_simplu1.Value = lnCantSetata
DO S64Log WITH ' [driver articol] cantitate setata=' + TRANSFORM(lnCantSetata)
loArtForm.do_termin()
gnModaleArticolInchise = gnModaleArticolInchise + 1
CATCH TO loExcArt
DO S64Log WITH ' [driver articol] CATCH ' + TRANSFORM(loExcArt.ErrorNo) + ' ' + loExcArt.Message
TRY
loArtForm.Release()
CATCH
ENDTRY
ENDTRY
ELSE
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S64Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S64Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S64Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S64Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
*-- FRM_ALTE_DATE nu apare pe traseul transferului conform propunerii §8, dar
*-- confirmarea "totalul 0" de la BLOC C l-a deschis totusi (id_delegat cerut la
*-- antet) - tratat identic cu driverS63 (do_termin() direct, garda 1s reintrare).
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S64Log 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 S64Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
ENDIF
CATCH TO loExcTop
DO S64Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS64') = 'O'
_SCREEN.tmrS64.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE