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
853 lines
38 KiB
Plaintext
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
|