Files
comun/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.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

670 lines
30 KiB
Plaintext

* test_s6_2_comanda_contract.prg
* Headless: proba de paritate v1 vs v2 pe doua surse care trec prin incarcare in masa
* (do_incarca_articole / incarca_cursor_articole): COMANDA (tip 3) si CONTRACT (tip 2).
* Emite 4 documente REALE in Oracle (MARIUSM_AUTO@ROA_CENTRAL, tipdoc 5, seria SSS):
* comanda v1 (frm_facturare_articole) <- listaid 2479 (client FETCU RELU, 3 linii)
* comanda v2 (frm_facturare_articole2) <- listaid 2478 (client BALOI IRINA, 9 linii)
* contract v1 (frm_facturare_articole) <- listaid 20 (client ABC PLOIESTI, 4 articole)
* contract v2 (frm_facturare_articole2) <- listaid 222 (client ABSOLUT SRL, 3 articole)
* Surse diferite intre v1 si v2 (nu aceeasi comanda/contract de doua ori) - o comanda/un contract
* se marcheaza facturat la prima emitere, deci reemiterea pe v2 din aceeasi sursa ar da 0 articole.
* Comparatia foloseste schela lib_comparatie_documente.prg (CompDoc), plus o comparatie separata
* pe campurile de CONFIGURATIE (nu depind de sursa: TIP, IN_VALUTA, ID_VALUTA, MULTIPLICATOR,
* DISCOUNT_EVIDENTIAT, TVA_INCASARE, TIP_FACTURA, TIP_SAFT, COEFICIENT_K) - acestea trebuie sa fie
* identice v1/v2 chiar daca sursele difera; diferentele de VANZARI_DETALII/ACT legate de sursa
* (cantitati, client, id_gestiune) sunt asteptate si se argumenteaza in raport, nu se raporteaza
* ca esecuri.
*
* Transferul crsarticole -> crsfactura foloseste do_adauga_tot() pe ambele formulare:
* - pe v1 e calea reala (butonul "Adauga tot" e cablat, caction = do_adauga_tot);
* - pe v2 metoda EXISTA in cod dar NU are niciun caction/buton care s-o declanseze (cod mort,
* confirmat deja pentru lista de preturi in S6-0/3.1 - aici se confirma ca acelasi lucru e
* valabil si pentru comanda/contract). Vezi AsertiuniRutare si raportul.
* mock_amessagebox.prg neutralizeaza aMessageBox-ul din bucla do_adauga_tot ("ati selectat toata
* cantitatea?") - pe contract (tip 2), crsarticole.cantitate nu se decrementeaza cu gnScadereStoc=0
* (do_initializeaza_articol zeroeste doar copia scatter-uita, nu cursorul sursa), deci acel dialog
* ar aparea o data per linie fara mock.
*
* FRM_ALTE_DATE (numai pe v1, deschis neconditionat de frm_facturare_articole.inainte_de_do_termin,
* ofacturare.vc2:15076) refuza sa se inchida cat timp poDate.id_delegat e gol
* (ferestre_cere_date.vc2:3073) - se precompleteaza poDate.id_delegat=39 (delegat real din
* vnom_delegati, MARIUSM_AUTO) identic pe v1 si v2, iar driverul apasa Termin
* (loForm.do_termin()), nu Release() - Release() ar sari peste scrierea lui poDate.ntip_incasare.
* gnFactSeturi=0 elimina FRM_ARTICOLE_COMPUSE (ofacturare.vc2:15028).
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_2_comanda_contract.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0.
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gcCaz, gcUltimaSerie, gnUltimulNract
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.log"
IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out")
MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out"
ENDIF
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
gnPass = 0
gnFail = 0
gcCaz = ""
ON ERROR DO S62Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL (SET PATH plain) - "Do Form verificare" (ofacturare.vc2:14404/:20126)
*-- rezolva la stub, nu la formularul real (tehnica validata in test_s3b_emitere_reala.prg)
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 S62Log WITH 'EROARE: conectare Oracle esuata'
DO S62Final
ENDIF
DO S62Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle)
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
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
*-- mock amessagebox: la nume duplicat castiga fisierul deschis cel mai recent - se incarca ULTIM
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
PUBLIC gcMockUltimMesaj, gnMockUltimTip
gcMockUltimMesaj = ''
gnMockUltimTip = 0
IF !actualizeaza_optiuni_program()
DO S62Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S62Final
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 S62Log WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ;
' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie
*-- (tehnica validata in test_s4_3_neregresie_masa.prg)
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: unele confirmari (ex. "Doriti sa se inchida comanda?" pe tip=3) folosesc o
*-- forma modala MESSAGEBOX_FORM, nu functia amessagebox() - mock_amessagebox nu le acopera.
*-- Tehnica validata in test_s3b_emitere_reala.prg: un Timer pe _SCREEN scaneaza _SCREEN.Forms
*-- si apasa automat cmdYes/cmdOk, ca raspunsul implicit "Da" al utilizatorului.
PUBLIC goDriverMsg, gcClaseVazuteS62
gcClaseVazuteS62 = ';'
goDriverMsg = CREATEOBJECT('driverMessageboxForm')
_SCREEN.AddObject('tmrS62Msg', 'Timer')
_SCREEN.tmrS62Msg.Interval = 200
BINDEVENT(_SCREEN.tmrS62Msg, 'Timer', goDriverMsg, 'Executa')
_SCREEN.tmrS62Msg.Enabled = .T.
DO S62Log WITH 'driver MESSAGEBOX_FORM + timer pregatiti'
*-- dovada ca stubul verificare ramane in fata dupa tot setup-ul, la momentul emiterii
DO S62Log WITH 'DIAG SET_PATH=' + SET('PATH')
DO S62Log WITH 'DIAG FULLPATH_VERIFICARE=' + FULLPATH('verificare.scx')
LOCAL lnIdVzC1, lcSerieC1, lnNractC1, lnIdVzC2, lcSerieC2, lnNractC2
LOCAL lnIdVzT1, lcSerieT1, lnNractT1, lnIdVzT2, lcSerieT2, lnNractT2
lnIdVzC1 = 0
lnIdVzC2 = 0
lnIdVzT1 = 0
lnIdVzT2 = 0
lcSerieC1 = ''
lcSerieC2 = ''
lcSerieT1 = ''
lcSerieT2 = ''
lnNractC1 = 0
lnNractC2 = 0
lnNractT1 = 0
lnNractT2 = 0
DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE COMANDA (tip 3) - v1 listaid=2479, v2 listaid=2478 ====='
lnIdVzC1 = EmiteMasa(3, 2479, .F., 'comanda-v1')
lcSerieC1 = gcUltimaSerie
lnNractC1 = gnUltimulNract
lnIdVzC2 = EmiteMasa(3, 2478, .T., 'comanda-v2')
lcSerieC2 = gcUltimaSerie
lnNractC2 = gnUltimulNract
DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE CONTRACT (tip 2) - v1 listaid=20, v2 listaid=222 ====='
lnIdVzT1 = EmiteMasa(2, 20, .F., 'contract-v1')
lcSerieT1 = gcUltimaSerie
lnNractT1 = gnUltimulNract
lnIdVzT2 = EmiteMasa(2, 222, .T., 'contract-v2')
lcSerieT2 = gcUltimaSerie
lnNractT2 = gnUltimulNract
DO S62Log WITH CHR(13) + CHR(10) + '===== ASERTIUNI STATICE DE RUTARE (ce probeaza / ce nu probeaza acest test) ====='
DO AsertiuniRutare
IF lnIdVzC1 > 0 AND lnIdVzC2 > 0
DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc COMANDA v1(' + TRANSFORM(lcSerieC1) + ' ' + TRANSFORM(lnNractC1) + ;
') vs v2(' + TRANSFORM(lcSerieC2) + ' ' + TRANSFORM(lnNractC2) + ') ====='
DO CompareazaSurse WITH lcSerieC1, lnNractC1, lcSerieC2, lnNractC2, 'comanda'
ELSE
DO Assert WITH .F., 'comanda: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzC1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzC2) + ')'
ENDIF
IF lnIdVzT1 > 0 AND lnIdVzT2 > 0
DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc CONTRACT v1(' + TRANSFORM(lcSerieT1) + ' ' + TRANSFORM(lnNractT1) + ;
') vs v2(' + TRANSFORM(lcSerieT2) + ' ' + TRANSFORM(lnNractT2) + ') ====='
DO CompareazaSurse WITH lcSerieT1, lnNractT1, lcSerieT2, lnNractT2, 'contract'
ELSE
DO Assert WITH .F., 'contract: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzT1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzT2) + ')'
ENDIF
DO S62Final
CATCH TO loExc
DO S62Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S62Final
ENDTRY
QUIT
*==================================================================================
* EmiteMasa: emite un document REAL prin incarcare in masa (comanda/contract), pe forma indicata.
* Intoarce id_vanzare (0 daca emiterea a esuat); serie_act/nract se intorc prin gcUltimaSerie/
* gnUltimulNract (variabile PUBLIC, citite de apelant imediat dupa apel).
FUNCTION EmiteMasa
LPARAMETERS tnTip, tnListaId, tlFormNou, tcEticheta
LOCAL tnIdVz, tcSerieAct, tnNract
tnIdVz = 0
tcSerieAct = ''
tnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest
LOCAL loSursa, lnIdSet, oform, llOk, loRez, lnScris
DO S62Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=' + TRANSFORM(tnListaId) + ;
', forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---'
IF tnTip = 3
loSursa = CreeazaSursaComanda(tnListaId)
ELSE
loSursa = CreeazaSursaContract(tnListaId)
ENDIF
IF ISNULL(loSursa)
DO Assert WITH .F., tcEticheta + ': sursa reala citita din Oracle pentru listaid=' + TRANSFORM(tnListaId)
RETURN 0
ENDIF
DO Assert WITH .T., tcEticheta + ': sursa reala citita, id_part=' + TRANSFORM(loSursa.id_part)
lnIdSet = 25000 + tnTip - 1
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, loSursa)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
*-- delegat real (vnom_delegati, MARIUSM_AUTO), identic pe v1 si v2: fara el
*-- frm_alte_date.inainte_de_do_termin (ferestre_cere_date.vc2:3073) respinge la infinit
poDate.id_delegat = 39
DO Assert WITH poDate.id_delegat = 39, tcEticheta + ': poDate.id_delegat precompletat'
DO Assert WITH TRANSFORM(poDate.listaid) == TRANSFORM(tnListaId), ;
tcEticheta + ': poDate.listaid provine din toSursa (Init cu parametru), e=' + TRANSFORM(poDate.listaid)
DO Assert WITH poDate.id_client = loSursa.id_part, tcEticheta + ': poDate.id_client din toSursa'
poGeneratorNumere.ResetNumere()
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
DO S62Log WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' rezultat_serii=' + TRANSFORM(poDate.rezultat_serii)
IF poDate.rezultat_serii <> 3
DO Assert WITH .F., tcEticheta + ': rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S62Log WITH ' serie_act=' + 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
IF tlFormNou
*-- v2 reala: crsfactura gol se creeaza INAINTE de formular (ca in factureaza(), ramura
*-- llFacturareNoua) - articolele se incarca DUPA, prin metoda do_incarca_articole
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO S62Log WITH ' formular creat (v2 frm_facturare_articole2)'
llOk = oform.do_incarca_articole()
ELSE
*-- v1 reala: incarca_cursor_articole() se cheama INAINTE de formular (ca in factureaza(),
*-- ramura veche) - functia isi creeaza singura crsfactura
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
llOk = (loRez.nSucces >= 0) AND loRez.lArticole
oform = CREATEOBJECT('frm_facturare_articole')
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
DO S62Log WITH ' formular creat (v1 frm_facturare_articole)'
ENDIF
DO Assert WITH llOk, tcEticheta + ': incarcarea sursei (incarca_cursor_articole) a reusit'
DO S62Log WITH ' incarcare -> Reccount(crsarticole)=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
IF !llOk OR !USED('crsarticole') OR RECCOUNT('crsarticole') = 0
DO S62Log WITH ' ABANDON: fara articole de incarcat pentru ' + tcEticheta
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
IF TYPE('oform') = 'O' AND !ISNULL(oform)
oform.Release()
ENDIF
DO CuratieCrs
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
RETURN 0
ENDIF
*-- transfer crsarticole -> crsfactura: do_adauga_tot() pe ambele forme (vezi antetul
*-- fisierului si AsertiuniRutare pt statutul cablarii pe v1 vs v2)
oform.do_adauga_tot()
DOEVENTS FORCE
DO S62Log WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ;
' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']'
DO Assert WITH RECCOUNT('crsfactura') > 0, tcEticheta + ': crsfactura populat dupa do_adauga_tot'
*-- diagnostic id_jtva_coloana: cine ramane pe 0 si cu ce proc_tvav
LOCAL lnSelDiag, lnRauDiag, lnAratDiag
lnSelDiag = SELECT()
lnRauDiag = 0
lnAratDiag = 0
SELECT crsfactura
SCAN
IF NVL(crsfactura.id_jtva_coloana, 0) <= 0
lnRauDiag = lnRauDiag + 1
IF lnAratDiag < 5
lnAratDiag = lnAratDiag + 1
DO S62Log WITH ' [diag jtva] rand=' + TRANSFORM(RECNO()) + ' id_articol=' + TRANSFORM(crsfactura.id_articol) + ;
' id_jtva=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana,0)) + ' proc_tvav=' + TRANSFORM(NVL(crsfactura.proc_tvav,-1)) + ;
' cant=' + TRANSFORM(crsfactura.cantitate)
ENDIF
ENDIF
ENDSCAN
DO S62Log WITH ' [diag jtva] crsfactura randuri cu id_jtva_coloana<=0: ' + TRANSFORM(lnRauDiag) + ' din ' + TRANSFORM(RECCOUNT('crsfactura'))
IF USED('jtva_coloane')
SELECT jtva_coloane
DO S62Log WITH ' [diag jtva] cursor jtva_coloane: reccount=' + TRANSFORM(RECCOUNT()) + ' filtru=[' + FILTER() + ']'
SET FILTER TO
LOCATE FOR cota_tva = 24
DO S62Log WITH ' [diag jtva] locate cota_tva=24 -> found=' + TRANSFORM(FOUND()) + ' id=' + TRANSFORM(IIF(FOUND(), jtva_coloane.id_jtva_coloana, -1))
ELSE
DO S62Log WITH ' [diag jtva] cursorul jtva_coloane NU e deschis in aceasta sesiune'
ENDIF
SELECT (lnSelDiag)
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
tcSerieAct = ALLTRIM(NVL(poDate.serie_act, ''))
tnNract = poDate.nract
lnScris = oform.do_termin()
DO S62Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ;
' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']'
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
*-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
tnIdVz = CdocGasesteIdVanzare(tcSerieAct, tnNract)
IF tnIdVz < 0
tnIdVz = 0
ENDIF
DO S62Log WITH ' verificare in VANZARI pe ' + tcSerieAct + ' ' + TRANSFORM(tnNract) + ' -> id_vanzare=' + TRANSFORM(tnIdVz)
DO Assert WITH tnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz)
IF tnIdVz > 0
DO S62Log WITH ' SCRIS: id_vanzare=' + TRANSFORM(tnIdVz) + ' serie_act=' + tcSerieAct + ' nract=' + TRANSFORM(tnNract)
ELSE
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
tcSerieAct = ''
tnNract = 0
ENDIF
IF TYPE('oform') = 'O' AND !ISNULL(oform)
oform.Release()
ENDIF
oform = NULL
DO CuratieCrs
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
gcUltimaSerie = tcSerieAct
gnUltimulNract = tnNract
RETURN tnIdVz
ENDFUNC
*==================================================================================
* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 (tehnica validata
* in test_s4_3_neregresie_masa.prg) - aplicata identic si pe v1, inofensiv acolo.
PROCEDURE PregatesteFacturaCrs
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
PROCEDURE CuratieCrs
DO InchideCrs WITH 'crsarticole'
DO InchideCrs WITH 'crsarticole1'
DO InchideCrs WITH 'crsfactura'
DO InchideCrs WITH 'crscursuri'
DO InchideCrs WITH 'crspolitici'
DO InchideCrs WITH 'crscontracte'
DO InchideCrs WITH 'crsgestiunidest'
DO InchideCrs WITH 'crsCtrTemp'
DO InchideCrs WITH 'crsComTemp'
DO InchideCrs WITH 'jtva_coloane'
ENDPROC
PROCEDURE InchideCrs
LPARAMETERS tcAlias
IF USED(tcAlias)
USE IN (tcAlias)
ENDIF
ENDPROC
*==================================================================================
* Sursa reala pentru comanda (tnTip=3): campurile citite de oDateFactura.Init pe ramura
* tnTip=3 (ofacturare_comun.prg): id_part, nume, cod_fiscal, id_comanda, nr_comanda, id_sectie.
FUNCTION CreeazaSursaComanda
LPARAMETERS tnIdComanda
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ;
[from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom')
IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1
DO S62Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
IF USED('crsSursaCom')
USE IN crsSursaCom
ENDIF
RETURN loSursa
ENDIF
SELECT crsSursaCom
SCATTER NAME loSursa MEMO
USE IN crsSursaCom
*-- poDate.listaid = loSursa.id_comanda (ofacturare_comun.prg:322), fara conversie - v2
*-- (do_scrie_factura, ofacturare.vc2:20167) cere Val(poDate.listaid), deci listaid trebuie
*-- caracter; SCATTER dintr-o coloana Oracle numerica da tip N, nu C - convertim aici, ca sursa
*-- reala (goComanda) sa ajunga la fel ca in productie, nu doar ca TRANSFORM() sa coincida.
loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda))
loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda))
RETURN loSursa
ENDFUNC
* Sursa reala pentru contract (tnTip=2): campurile citite de oDateFactura.Init pe ramura tip 2/6/52
* sunt id_part, denumire, cod_fiscal, id_ctr, contract, id_sectie, sectie, id_responsabil,
* responsabil, id_valuta, nume_val. FACT_VCONTRACTE nu are ultimele sase - se completeaza cu
* valori neutre (0/'' /RON), la fel pe v1 si v2, deci comparatia de configuratie ramane valida.
FUNCTION CreeazaSursaContract
LPARAMETERS tnIdCtr
LOCAL lnQ, loSursa
loSursa = NULL
lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ;
[from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr')
IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1
DO S62Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare())
IF USED('crsSursaCtr')
USE IN crsSursaCtr
ENDIF
RETURN loSursa
ENDIF
SELECT crsSursaCtr
SCATTER NAME loSursa MEMO
USE IN crsSursaCtr
ADDPROPERTY(loSursa, 'id_sectie', 0)
ADDPROPERTY(loSursa, 'sectie', '')
ADDPROPERTY(loSursa, 'id_responsabil', 0)
ADDPROPERTY(loSursa, 'responsabil', '')
ADDPROPERTY(loSursa, 'id_valuta', 1)
ADDPROPERTY(loSursa, 'nume_val', 'RON')
RETURN loSursa
ENDFUNC
*==================================================================================
* Asertiuni statice (text, fara rulare) - documenteaza exact ce traseu de productie ramane
* neprobat de acest test: v1 nu are metoda de forma pentru incarcare (calea reala trece prin
* functia procedurala incarca_cursor_articole, apelata din factureaza() INAINTE de formular);
* do_adauga_tot() e cablat pe un buton viu doar pe v1 - pe v2 metoda exista dar nu e apelata
* de niciun caption/buton in productie (acest test o cheama direct, ca S6-0/S3.1 a stabilit
* deja pentru lista de preturi).
PROCEDURE AsertiuniRutare
LOCAL lcTxt
lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2")
IF EMPTY(lcTxt)
DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol"
RETURN
ENDIF
DO Assert WITH OCCURS("PROCEDURE do_incarca_articole", lcTxt) = 1, ;
"do_incarca_articole exista o singura data in fisier (doar pe v2) - v1 nu are metoda de " + ;
"forma pentru incarcare, calea reala e prin incarca_cursor_articole() apelata din factureaza()"
DO Assert WITH "caction = do_adauga_tot" $ lcTxt, ;
"exista un caction = do_adauga_tot in fisier (butonul viu e pe v1)"
DO Assert WITH OCCURS("caction = do_adauga_tot", lcTxt) = 1, ;
"un singur caction = do_adauga_tot in tot fisierul - v2 NU are niciun buton cablat pt " + ;
"aceasta metoda (cod mort pe v2; acest test o cheama direct, deci nu probeaza ruta UI reala pe v2)"
DO Assert WITH OCCURS("PROCEDURE do_adauga_tot", lcTxt) = 2, ;
"do_adauga_tot exista de doua ori (o data pe fiecare clasa) - metoda exista pe v2, doar cablarea lipseste"
ENDPROC
*==================================================================================
* CompareazaSurse: ruleaza schela CompDoc (structura VANZARI/VANZARI_DETALII/ACT/RUL) si, separat,
* o comparatie pe campurile de CONFIGURATIE care nu depind de sursa (trebuie sa fie identice v1/v2
* chiar daca sursele - comenzi/contracte diferite - nu sunt).
PROCEDURE CompareazaSurse
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nFail
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-2 ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')')
DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail)
DO S62Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ;
' (surse diferite - vezi raportul pentru argumentarea camp cu camp)'
DO ComparaCampuriConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
ENDPROC
PROCEDURE ComparaCampuriConfig
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nId1, nId2, lnQ
nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1)
nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2)
IF nId1 <= 0 OR nId2 <= 0
DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ;
TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')'
RETURN
ENDIF
lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ;
[discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ;
[nvl(coeficient_k,0) as coeficient_k from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg')
IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2
DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)'
IF USED('crsCfg')
USE IN crsCfg
ENDIF
RETURN
ENDIF
LOCAL lnTip1, lnTip2, lnInVal1, lnInVal2, lnIdVal1, lnIdVal2, lnMul1, lnMul2, lnDisc1, lnDisc2
LOCAL lnTvaInc1, lnTvaInc2, lnTipFact1, lnTipFact2, lnTipSaft1, lnTipSaft2, lnCoef1, lnCoef2
SELECT crsCfg
LOCATE FOR id_vanzare = nId1
lnTip1 = tip
lnInVal1 = in_valuta
lnIdVal1 = id_valuta
lnMul1 = multiplicator
lnDisc1 = discount_evidentiat
lnTvaInc1 = tva_incasare
lnTipFact1 = tip_factura
lnTipSaft1 = tip_saft
lnCoef1 = coeficient_k
LOCATE FOR id_vanzare = nId2
lnTip2 = tip
lnInVal2 = in_valuta
lnIdVal2 = id_valuta
lnMul2 = multiplicator
lnDisc2 = discount_evidentiat
lnTvaInc2 = tva_incasare
lnTipFact2 = tip_factura
lnTipSaft2 = tip_saft
lnCoef2 = coeficient_k
USE IN crsCfg
DO Assert WITH lnTip1 = lnTip2, tcTip + ': VANZARI.TIP identic (config, nu sursa) v1=' + TRANSFORM(lnTip1) + ' v2=' + TRANSFORM(lnTip2)
DO Assert WITH lnInVal1 = lnInVal2, tcTip + ': IN_VALUTA identic v1=' + TRANSFORM(lnInVal1) + ' v2=' + TRANSFORM(lnInVal2)
DO Assert WITH lnIdVal1 = lnIdVal2, tcTip + ': ID_VALUTA identic v1=' + TRANSFORM(lnIdVal1) + ' v2=' + TRANSFORM(lnIdVal2)
DO Assert WITH lnMul1 = lnMul2, tcTip + ': MULTIPLICATOR identic v1=' + TRANSFORM(lnMul1) + ' v2=' + TRANSFORM(lnMul2)
DO Assert WITH lnDisc1 = lnDisc2, tcTip + ': DISCOUNT_EVIDENTIAT identic v1=' + TRANSFORM(lnDisc1) + ' v2=' + TRANSFORM(lnDisc2)
DO Assert WITH lnTvaInc1 = lnTvaInc2, tcTip + ': TVA_INCASARE identic v1=' + TRANSFORM(lnTvaInc1) + ' v2=' + TRANSFORM(lnTvaInc2)
DO Assert WITH lnTipFact1 = lnTipFact2, tcTip + ': TIP_FACTURA identic v1=' + TRANSFORM(lnTipFact1) + ' v2=' + TRANSFORM(lnTipFact2)
DO Assert WITH lnTipSaft1 = lnTipSaft2, tcTip + ': TIP_SAFT identic v1=' + TRANSFORM(lnTipSaft1) + ' v2=' + TRANSFORM(lnTipSaft2)
DO Assert WITH lnCoef1 = lnCoef2, tcTip + ': COEFICIENT_K identic v1=' + TRANSFORM(lnCoef1) + ' v2=' + TRANSFORM(lnCoef2)
ENDPROC
*==================================================================================
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S62Log WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO S62Log WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC
PROCEDURE S62Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S62Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO S62Log WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S62Final
IF TYPE('_SCREEN.tmrS62Msg') = 'O'
_SCREEN.tmrS62Msg.Enabled = .F.
ENDIF
DO S62Log WITH CHR(13) + CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
DO S62Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
* driverMessageboxForm: cauta o forma MESSAGEBOX_FORM printre _SCREEN.Forms si-i apasa automat
* cmdYes/cmdOk (raspunsul implicit "Da"/"OK"), ca sa nu blocheze rularea headless. Tehnica identica
* cu driverAlteDateAD din test_s3b_emitere_reala.prg (partea de MESSAGEBOX_FORM).
* Trateaza in plus FRM_ALTE_DATE (numai pe v1, deschis neconditionat de
* frm_facturare_articole.inainte_de_do_termin - ofacturare.vc2:15076): apasa Termin
* (loForm.do_termin(), nu Release()) ca sa se execute inainte_de_do_termin si sa se scrie
* poDate.ntip_incasare exact ca pe traseul real - un Release() ar sari peste acea scriere si ar
* fabrica o diferenta falsa fata de v2, unde codul echivalent ruleaza inline
* (ofacturare.vc2:20785-20808). Valideaza doar daca poDate.id_delegat e completat dinainte
* (vezi EmiteMasa) - altfel inainte_de_do_termin respinge din nou si formularul ramane deschis.
* Niciun tratament generic "strain -> Release()": clasele principale FRM_FACTURARE_ARTICOLE si
* FRM_FACTURARE_ARTICOLE2 nu sunt atinse de acest driver in niciun fel.
DEFINE CLASS driverMessageboxForm AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
*-- garda de reintrare: do_termin() declanseaza intern Release()/SetFocus, care cedeaza
*-- controlul buclei de mesaje Windows - fara ea, Timer-ul se reintra in timp ce
*-- formularul e pe cale sa se elibereze (obiect pe jumatate distrus -> eroare 1924 "nu e
*-- obiect"), observat empiric la prima rulare. lBusy e verificat/setat sincron, inainte
*-- de orice cod care ar putea ceda controlul - opreste reintrarea chiar daca Timer.Enabled
*-- nu apuca sa opreasca un WM_TIMER deja pus in coada.
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS62Msg') = 'O'
_SCREEN.tmrS62Msg.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa
loMsgForm = NULL
loAlteDate = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
DO S62Log WITH ' [diag alte_date] gasit la index=' + TRANSFORM(lnI) + ;
' FormCount=' + TRANSFORM(_SCREEN.FormCount) + ' VARTYPE(loAlteDate)=' + VARTYPE(loAlteDate)
ENDIF
IF !(lcClasa $ gcClaseVazuteS62)
gcClaseVazuteS62 = gcClaseVazuteS62 + lcClasa + ';'
DO S62Log WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S62Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
DO CASE
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S62Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S62Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ;
TRANSFORM(NVL(poDate.id_delegat, 0)) + ') VARTYPE=' + VARTYPE(loAlteDate) + ;
' TYPE=' + TYPE('loAlteDate')
loAlteDate.do_termin()
CATCH TO loExcAD
DO S62Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ;
' VARTYPE=' + VARTYPE(loAlteDate) + ' TYPE=' + TYPE('loAlteDate')
ENDTRY
ENDIF
CATCH TO loExcTop
DO S62Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS62Msg') = 'O'
_SCREEN.tmrS62Msg.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE