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

1009 lines
43 KiB
Plaintext

* test_s6_3_aviz_retur.prg
* Headless: proba de paritate v1 vs v2 pe celelalte doua surse cu cantitati fixate de documentul
* sursa: AVIZ (tip 4, pack_facturare.cursor_avize) si RETUR in lei (tip 8, cursor_retur).
* Emite 4 documente REALE in MARIUSM_AUTO@ROA_CENTRAL (tipdoc 5, seria SSS):
* aviz v1 (frm_facturare_articole) / aviz v2 (frm_facturare_articole2)
* retur v1 (frm_facturare_articole) / retur v2 (frm_facturare_articole2)
* Surse DIFERITE intre v1 si v2, obligatoriu: prima emitere consuma sursa (avizul se marcheaza
* facturat, cantitatea returnabila se epuizeaza), deci acelasi document ar da 0 linii a doua oara.
* Sursele se aleg din date la rulare, preferand o pereche cu acelasi numar de linii - id-uri fixe
* nu tin de la o rulare la alta.
*
* Traseul probat este cel REAL pe fiecare forma, nu metoda interna:
* v1: incarca_cursor_articole() INAINTE de formular (ca in factureaza(), ofacturare.prg:299),
* apoi butonul "Adauga tot" -> but_urmator_tot1.Click() (caction = do_adauga_tot,
* ofacturare.vc2:11407-11409; Init il face vizibil pe tip 4 la :15319 si pe 8/9 la :15389)
* v2: crsfactura gol INAINTE de formular, apoi butonul "Incarca articole" ->
* but_incarca_articole.Click() (caction = do_incarca_articole), care cheama do_adauga_tot
* prin Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9) - cablarea W1 din S8
* Emiterea trece prin but_termin1.Click() pe ambele, niciodata prin do_termin() direct.
* Un test care instantiaza formularul si cheama metoda probeaza codul, nu traseul (lectia S5c/S4b).
*
* Antetul se compune ca in productie, fara formularele modale de cautare (cauta_alfa):
* tip 4: do_cauta_avize (ofacturare_antet.prg:73-86) - listaid = lista de id_vanzare a avizelor
* nefacturate ale clientului, descriere = lista numerelor, plus id_comanda_aviz
* tip 8: do_cauta_facturi (ofacturare_antet.prg:459-468) - listaid = lista de id_vanzare a
* facturilor sursa, descriere = lista numerelor, text_aditional = 'RETUR FACTURA ...'
*
* FRM_ALTE_DATE apare numai pe v1 (frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:15076,
* .Show(1) neconditionat pentru tip <> 30) si se inchide apasand Termin (loForm.do_termin()), nu
* Release(): Release() ar sari peste inainte_de_do_termin, unde se scrie poDate.ntip_incasare, si ar
* fabrica un esec fals de paritate pe campurile de incasare. Cere poDate.id_delegat completat dinainte
* (ferestre_cere_date.vc2:3073), la fel pe v1 si v2.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3_aviz_retur.prg"
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3_aviz_retur.log
* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167;
* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare.
SET SAFETY OFF
SET TALK OFF
SET NOTIFY OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET DECIMALS TO 4
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere
PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat
PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS63, gcClaseVazute, gcRaspunsMsgForm
PUBLIC gnIntrebariRetur, gnAvizReturDeschis
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3_aviz_retur.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 = ""
gcUltimaSerie = ""
gnUltimulNract = 0
gcClaseVazute = ";"
gcRaspunsMsgForm = "NU"
gnIntrebariRetur = 0
gnAvizReturDeschis = 0
gcNumere = ""
gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg"
*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx
*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8: un PRIVATE
*-- declarat intr-o procedura si asignat in alta ramane invizibil in forma).
*-- pnTotalDiscountAvize e cerut prin referinta de cursor_avize (ofacturare.prg:495).
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil
poDate = NULL
poGeneratorNumere = NULL
poDateGestiuneDest = NULL
pnTotalDiscountAvize = 0
plVizibil = .F.
ON ERROR DO S63Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare"
DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0
DO S63Log WITH 'EROARE: conectare Oracle esuata'
DO S63Final
ENDIF
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
DO S63Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE
SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
SET PROCEDURE TO (gcMock) ADDITIVE
IF !actualizeaza_optiuni_program()
DO S63Log WITH 'EROARE: actualizeaza_optiuni_program()'
DO S63Final
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 S63Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ;
' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ;
' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ;
' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406)
update_jtva_coloane([JV], [jtva_coloane_temp])
update_saft_taxtable()
*-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2
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_ALTE_DATE (v1) si formele modale MESSAGEBOX_FORM nu trec prin functia
*-- amessagebox, deci mock-ul nu le acopera. Tehnica validata la S6-2.
goDriverS63 = CREATEOBJECT('driverS63')
_SCREEN.AddObject('tmrS63', 'Timer')
_SCREEN.tmrS63.Interval = 200
BINDEVENT(_SCREEN.tmrS63, 'Timer', goDriverS63, 'Executa')
_SCREEN.tmrS63.Enabled = .T.
DO S63Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx')
LOCAL lnIdA1, lcSerA1, lnNrA1, lnIdA2, lcSerA2, lnNrA2
LOCAL lnIdR1, lcSerR1, lnNrR1, lnIdR2, lcSerR2, lnNrR2
STORE 0 TO lnIdA1, lnIdA2, lnIdR1, lnIdR2, lnNrA1, lnNrA2, lnNrR1, lnNrR2
STORE '' TO lcSerA1, lcSerA2, lcSerR1, lcSerR2
DO S63Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE ====='
DO AlegeSurseAviz
DO AlegeSurseRetur
DO S63Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) ====='
DO AsertiuniRutare
IF USED('crsSurseAviz') AND RECCOUNT('crsSurseAviz') >= 2
DO S63Log WITH CHR(13) + CHR(10) + '===== EMITERE AVIZ (tip 4) ====='
GO 1 IN crsSurseAviz
lnIdA1 = EmiteProtejat(4, 'crsSurseAviz', .F., 'aviz-v1')
lcSerA1 = gcUltimaSerie
lnNrA1 = gnUltimulNract
GO 2 IN crsSurseAviz
lnIdA2 = EmiteProtejat(4, 'crsSurseAviz', .T., 'aviz-v2')
lcSerA2 = gcUltimaSerie
lnNrA2 = gnUltimulNract
ELSE
DO Assert WITH .F., 'aviz: doua surse distincte cu articole gasite in date (vezi alegerea surselor)'
ENDIF
IF USED('crsSurseRetur') AND RECCOUNT('crsSurseRetur') >= 2
DO S63Log WITH CHR(13) + CHR(10) + '===== EMITERE RETUR (tip 8, lei) ====='
GO 1 IN crsSurseRetur
lnIdR1 = EmiteProtejat(8, 'crsSurseRetur', .F., 'retur-v1')
lcSerR1 = gcUltimaSerie
lnNrR1 = gnUltimulNract
GO 2 IN crsSurseRetur
lnIdR2 = EmiteProtejat(8, 'crsSurseRetur', .T., 'retur-v2')
lcSerR2 = gcUltimaSerie
lnNrR2 = gnUltimulNract
ELSE
DO Assert WITH .F., 'retur: doua surse distincte cu articole gasite in date (vezi alegerea surselor)'
ENDIF
IF lnIdA1 > 0 AND lnIdA2 > 0
DO S63Log WITH CHR(13) + CHR(10) + '===== CompDoc AVIZ v1(' + lcSerA1 + ' ' + TRANSFORM(lnNrA1) + ;
') vs v2(' + lcSerA2 + ' ' + TRANSFORM(lnNrA2) + ') ====='
DO Compara WITH lcSerA1, lnNrA1, lcSerA2, lnNrA2, 'aviz'
ELSE
DO Assert WITH .F., 'aviz: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdA1) + ;
' v2 id_vanzare=' + TRANSFORM(lnIdA2) + ')'
ENDIF
IF lnIdR1 > 0 AND lnIdR2 > 0
DO S63Log WITH CHR(13) + CHR(10) + '===== CompDoc RETUR v1(' + lcSerR1 + ' ' + TRANSFORM(lnNrR1) + ;
') vs v2(' + lcSerR2 + ' ' + TRANSFORM(lnNrR2) + ') ====='
DO Compara WITH lcSerR1, lnNrR1, lcSerR2, lnNrR2, 'retur'
ELSE
DO Assert WITH .F., 'retur: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdR1) + ;
' v2 id_vanzare=' + TRANSFORM(lnIdR2) + ')'
ENDIF
DO S63Final
CATCH TO loExc
DO S63Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ;
' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
DO S63Final
ENDTRY
QUIT
*==================================================================================
* Sursele pentru AVIZ (tip 4). Filtrul e cel din caut_avize (oproceduri_facturare.prg:2038):
* vanzari, tip in (21,22,26,42), facturat = 0. O sursa = UN aviz (selectorul din productie e
* multi-select, deci si un singur aviz e o alegere legitima); un aviz per sursa da mult mai multi
* candidati, deci sanse reale sa existe o pereche cu acelasi numar de linii.
PROCEDURE AlegeSurseAviz
LOCAL lnQ, lnI, lnLinii
CREATE CURSOR crsCandAviz (idpart N(20), nume C(100), listaid M, descr M, linii N(10), idcom N(20))
DO AsigurSurseAvizVii WITH 20, 10
*-- vitalitate la sursa, in WHERE: multe avize nefacturate sunt fixturi moarte (toate liniile
*-- cu cantitate 0, ramase din rulari anterioare) - fara acest filtru se aduna la nesfarsit,
*-- sunt mereu mai noi (deci primele in ORDER BY id_vanzare DESC), si ii impinge pe cei vii
*-- oricat de mult s-ar ridica limita de scanare de mai jos (verificat pe Oracle: elimina exact
*-- cele fara vreo linie cu cantitate reala, pastreaza restul)
lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, ] + ;
[(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ;
[from vanzari a, nom_parteneri p ] + ;
[where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ;
[ and exists (select 1 from vanzari_detalii d ] + ;
[ where d.id_vanzare = a.id_vanzare and d.sters = 0 and d.cantitate > 0) ] + ;
STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ;
[ and upper(p.nume) not like '%CLIENT%' order by a.id_vanzare desc], 'crsAvLista')
IF lnQ < 0 OR !USED('crsAvLista')
DO Assert WITH .F., 'aviz: lista avizelor nefacturate citita din Oracle'
RETURN
ENDIF
DO S63Log WITH ' aviz: avize nefacturate vii (cu cel putin o linie cu cantitate>0) = ' + TRANSFORM(RECCOUNT('crsAvLista'))
lnI = 0
SELECT crsAvLista
SCAN WHILE lnI < 25
lnI = lnI + 1
LOCAL lnIdAv, lnIdPart, lcNume, lcDescr, lnComanda
lnIdAv = crsAvLista.id_vanzare
lnIdPart = crsAvLista.id_part
lcNume = ALLTRIM(NVL(crsAvLista.nume, ''))
lcDescr = NumarDoc(crsAvLista.serie_act, crsAvLista.numar_act)
lnComanda = NVL(crsAvLista.id_comanda, 0)
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(lnIdAv)))
pnTotalDiscountAvize = 0
DO Inchide WITH 'crsSonda'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda')
lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0)
LOCAL lnValAv
lnValAv = ValoareSonda(lnLinii)
DO Inchide WITH 'crsSonda'
DO S63Log WITH ' aviz candidat: aviz ' + TRANSFORM(lnIdAv) + ' [' + lcDescr + '] client ' + ;
TRANSFORM(lnIdPart) + ' [' + lcNume + '] -> linii=' + TRANSFORM(lnLinii) + ' valoare=' + TRANSFORM(lnValAv)
IF lnLinii > 0 AND lnValAv <> 0
INSERT INTO crsCandAviz (idpart, nume, listaid, descr, linii, idcom) ;
VALUES (lnIdPart, lcNume, ALLTRIM(TRANSFORM(lnIdAv)), lcDescr, lnLinii, lnComanda)
ENDIF
SELECT crsAvLista
ENDSCAN
DO Inchide WITH 'crsAvLista'
poDate = NULL
DO AlegePereche WITH 'crsCandAviz', 'crsSurseAviz', 'aviz'
ENDPROC
*==================================================================================
* Reumple sursele de aviz cand scad sub prag, ca testul sa nu depinda de un rezervor
* pregatit manual: emite tnLot avize noi in AVZ13, clona a avizului 684, cu baza de
* numerotare calculata la rulare (max(numar_act) pe serie), nu hardcodata.
PROCEDURE AsigurSurseAvizVii
LPARAMETERS tnPrag, tnLot
LOCAL lnQ, lnVii, lcSql
lnQ = goExecutor.oExecute([select count(distinct d.id_vanzare) as nr from vanzari_detalii d ] + ;
[join vanzari a on a.id_vanzare = d.id_vanzare ] + ;
[where a.tip in (21,22,26,42) and a.facturat = 0 and a.sters = 0 and d.sters = 0 ] + ;
[and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ;
[where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0)], 'crsViiCount')
lnVii = IIF(lnQ >= 0 AND USED('crsViiCount'), NVL(crsViiCount.nr, 0), 0)
DO Inchide WITH 'crsViiCount'
DO S63Log WITH ' aviz: pool AVZ13 surse vii = ' + TRANSFORM(lnVii) + ' (prag=' + TRANSFORM(tnPrag) + ')'
IF lnVii >= tnPrag
RETURN
ENDIF
DO S63Log WITH ' aviz: pool sub prag, emit ' + TRANSFORM(tnLot) + ' avize noi in AVZ13'
lcSql = [declare ] + ;
[ c_nrbaza number; ] + ;
[ c_nravize constant number := ] + TRANSFORM(tnLot) + [; ] + ;
[ c_serie constant varchar2(10) := 'AVZ13'; ] + ;
[ c_sablon constant number := 684; ] + ;
[ c_act_sablon constant number := 111906; ] + ;
[ v_nr number; v_id number; v_cod number; ] + ;
[begin ] + ;
[ select nvl(max(numar_act),0) into c_nrbaza from vanzari where serie_act = c_serie; ] + ;
[ for i in 1 .. c_nravize loop ] + ;
[ v_nr := c_nrbaza + i; ] + ;
[ select seq_cod.nextval into v_cod from dual; ] + ;
[ merge into vanzari t ] + ;
[ using (select v.*, v_nr as nr_nou, v_cod as cod_nou from vanzari v where v.id_vanzare = c_sablon) s ] + ;
[ on (t.serie_act = c_serie and t.numar_act = s.nr_nou) ] + ;
[ when matched then update set t.facturat = 0, t.sters = 0, t.id_fact = null, ] + ;
[ t.data_facturat = null, t.id_utilfact = null, t.total_fara_tva = 730, ] + ;
[ t.total_tva = 138.7, t.total_cu_tva = 868.7, t.valoare_achizitie = 0 ] + ;
[ when not matched then insert ] + ;
[ (id_vanzare, id_util, dataora, sters, id_lucrare, id_part, numar_act, nr_persoane, ] + ;
[ nrinmat, facturat, data_facturat, id_utilfact, id_punctvanzare, id_comanda, tip, ] + ;
[ id_gestiune, cod, id_delegat, id_masina, data_act, id_agent, discount, ] + ;
[ discount_evidentiat, text_aditional, in_valuta, serie_act, id_sucursala, id_ruta, ] + ;
[ id_sectie, diftotftva, diftottva, dataora_exp, afisare_scadenta, tva_incasare, ] + ;
[ id_facturare, listare_detaliata, valoare_achizitie, total_fara_tva, total_tva, ] + ;
[ total_cu_tva, id_valuta, curs, multiplicator, eproforma) ] + ;
[ values ] + ;
[ (0, s.id_util, sysdate, 0, s.id_lucrare, s.id_part, s.nr_nou, s.nr_persoane, ] + ;
[ s.nrinmat, 0, null, null, s.id_punctvanzare, null, s.tip, ] + ;
[ s.id_gestiune, s.cod_nou, s.id_delegat, s.id_masina, trunc(sysdate), s.id_agent, s.discount, ] + ;
[ s.discount_evidentiat, s.text_aditional, s.in_valuta, c_serie, s.id_sucursala, s.id_ruta, ] + ;
[ s.id_sectie, s.diftotftva, s.diftottva, sysdate, s.afisare_scadenta, s.tva_incasare, ] + ;
[ s.id_facturare, s.listare_detaliata, 0, 730, 138.7, ] + ;
[ 868.7, s.id_valuta, s.curs, s.multiplicator, 0); ] + ;
[ select id_vanzare, cod into v_id, v_cod from vanzari where serie_act = c_serie and numar_act = v_nr; ] + ;
[ merge into vanzari_detalii t ] + ;
[ using (select v_id as id_vanzare, 4294507316 as id_articol, 2 as id_pol, 100 as pret, ] + ;
[ 3 as cantitate, 0 as pret_achizitie from dual union all ] + ;
[ select v_id, 4294507331, 36, 70, 1, 0 from dual union all ] + ;
[ select v_id, 4294506670, 35, 180, 2, null from dual) s ] + ;
[ on (t.id_vanzare = s.id_vanzare and t.id_articol = s.id_articol and t.id_pol = s.id_pol) ] + ;
[ when matched then update set t.pret = s.pret, t.cantitate = s.cantitate, ] + ;
[ t.pret_achizitie = s.pret_achizitie, t.sters = 0 ] + ;
[ when not matched then insert ] + ;
[ (id_vanzare, id_articol, id_pol, pret, validat, sters, proc_tvav, cantitate, diferenta, ] + ;
[ discount_unitar, id_gestiune, cont, id_valuta, pret_cu_tva, pret_achizitie, custodie, ] + ;
[ id_jtva_coloana, descarcat, pretd, id_valutad, lot, serie) ] + ;
[ values ] + ;
[ (s.id_vanzare, s.id_articol, s.id_pol, s.pret, 0, 0, 1.19, s.cantitate, 0, ] + ;
[ 0, null, null, 3, 0, s.pret_achizitie, 0, ] + ;
[ 31, 0, 0, null, null, null); ] + ;
[ merge into act t ] + ;
[ using (select a.*, v_cod as cod_nou, v_nr as nr_nou from act a where a.id_act = c_act_sablon) s ] + ;
[ on (t.cod = s.cod_nou and t.scd = '418' and t.scc = '4428') ] + ;
[ when matched then update set t.nract = s.nr_nou, t.serie_act = c_serie, t.sters = 0, ] + ;
[ t.dataireg = trunc(sysdate), t.dataact = trunc(sysdate) ] + ;
[ when not matched then insert ] + ;
[ (luna, an, cod, dataireg, nract, dataact, explicatia, scd, ascd, scc, ascc, suma, ] + ;
[ id_factd, id_factc, pereched, perechec, suma_val, curs, datascad, neimpozab, nnir, ] + ;
[ id_util, dataora, id_responsabil, id_venchelt, id_sectie, id_set, id_fact, id_partd, ] + ;
[ id_partc, id_sucursala, id_fdoc, sters, id_lucrare, id_gestin, id_gestout, id_valuta, ] + ;
[ proc_tva, id_ctr, id_jtva_coloana, serie_act, validat, taxcode, paymentcode) ] + ;
[ values ] + ;
[ (to_number(to_char(sysdate,'mm')), to_number(to_char(sysdate,'yyyy')), s.cod_nou, ] + ;
[ trunc(sysdate), s.nr_nou, trunc(sysdate), s.explicatia, '418', s.ascd, '4428', s.ascc, ] + ;
[ 138.7, s.id_factd, 0, s.pereched, 0, 0, 0, s.datascad, s.neimpozab, s.nnir, ] + ;
[ s.id_util, sysdate, s.id_responsabil, s.id_venchelt, s.id_sectie, s.id_set, 0, s.id_partd, ] + ;
[ s.id_partc, s.id_sucursala, s.id_fdoc, 0, s.id_lucrare, s.id_gestin, s.id_gestout, ] + ;
[ s.id_valuta, 1.19, s.id_ctr, 32, c_serie, s.validat, s.taxcode, s.paymentcode); ] + ;
[ end loop; ] + ;
[ commit; ] + ;
[end;]
goExecutor.oExecuta(lcSql)
DO S63Log WITH ' aviz: pool AVZ13 completat cu ' + TRANSFORM(tnLot) + ' avize noi'
ENDPROC
*==================================================================================
* Sursele pentru RETUR in lei (tip 8). Filtrul e cel din caut_facturi_multiple_client
* (oproceduri_facturare.prg:2110): fact_vfacturi, tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11),
* in_valuta = 0. O sursa = o singura factura (lista de un element), ca la alegerea uzuala.
PROCEDURE AlegeSurseRetur
LOCAL lnQ, lnI, lnLinii
CREATE CURSOR crsCandRetur (idpart N(20), nume C(100), listaid M, descr M, linii N(10), idcom N(20))
lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act ] + ;
[from fact_vfacturi f, nom_parteneri p ] + ;
[where f.id_part = p.id_part and f.sters = 0 and f.tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11) ] + ;
[and f.in_valuta = 0 and f.tip <> 4 ] + STRTRAN(gcCondSucursala, [id_sucursala], [f.id_sucursala]) + ;
[ and upper(p.nume) not like '%CLIENT%' order by f.id_vanzare desc], 'crsRetLista')
IF lnQ < 0 OR !USED('crsRetLista')
DO Assert WITH .F., 'retur: lista facturilor returnabile citita din Oracle'
RETURN
ENDIF
DO S63Log WITH ' retur: facturi returnabile in lei = ' + TRANSFORM(RECCOUNT('crsRetLista'))
lnI = 0
SELECT crsRetLista
SCAN WHILE lnI < 20
lnI = lnI + 1
LOCAL lnIdVz, lnIdP, lcNm, lcNr
lnIdVz = crsRetLista.id_vanzare
lnIdP = crsRetLista.id_part
lcNm = ALLTRIM(NVL(crsRetLista.nume, ''))
lcNr = NumarDoc(crsRetLista.serie_act, crsRetLista.numar_act)
poDate = CREATEOBJECT('empty')
ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(lnIdVz)))
ADDPROPERTY(poDate, 'in_valuta', 0)
DO Inchide WITH 'crsSonda'
lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsSonda')
lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0)
LOCAL lnValRet
lnValRet = ValoareSonda(lnLinii)
DO Inchide WITH 'crsSonda'
DO S63Log WITH ' retur candidat: factura ' + TRANSFORM(lnIdVz) + ' [' + lcNr + '] client ' + ;
TRANSFORM(lnIdP) + ' -> linii=' + TRANSFORM(lnLinii) + ' valoare=' + TRANSFORM(lnValRet)
IF lnLinii > 0 AND lnValRet <> 0
INSERT INTO crsCandRetur (idpart, nume, listaid, descr, linii, idcom) ;
VALUES (lnIdP, lcNm, ALLTRIM(TRANSFORM(lnIdVz)), lcNr, lnLinii, 0)
ENDIF
SELECT crsRetLista
ENDSCAN
DO Inchide WITH 'crsRetLista'
poDate = NULL
DO AlegePereche WITH 'crsCandRetur', 'crsSurseRetur', 'retur'
ENDPROC
*==================================================================================
* Din candidatii gasiti, alege DOUA surse distincte, preferand o pereche cu acelasi numar de linii:
* liniile difera oricum ca articole (surse diferite), dar un numar egal de linii face comparatia
* VANZARI_DETALII interpretabila in loc de un esec garantat pe "numar de linii diferit".
PROCEDURE AlegePereche
LPARAMETERS tcCandidati, tcRezultat, tcEticheta
LOCAL lnI, lnJ, lnCnt, lnA, lnB
DO Inchide WITH tcRezultat
lnCnt = IIF(USED(tcCandidati), RECCOUNT(tcCandidati), 0)
DO S63Log WITH ' ' + tcEticheta + ': candidati cu articole = ' + TRANSFORM(lnCnt)
IF lnCnt < 2
DO Assert WITH .F., tcEticheta + ': cel putin 2 surse cu articole in date, e=' + TRANSFORM(lnCnt)
RETURN
ENDIF
lnA = 0
lnB = 0
FOR lnI = 1 TO lnCnt - 1
FOR lnJ = lnI + 1 TO lnCnt
GO lnI IN (tcCandidati)
LOCAL lnLinI
lnLinI = EVALUATE(tcCandidati + '.linii')
GO lnJ IN (tcCandidati)
IF lnA = 0 AND EVALUATE(tcCandidati + '.linii') = lnLinI
lnA = lnI
lnB = lnJ
ENDIF
ENDFOR
ENDFOR
IF lnA = 0
lnA = 1
lnB = 2
DO S63Log WITH ' ' + tcEticheta + ': nicio pereche cu acelasi numar de linii - se iau primii doi candidati'
ENDIF
SELECT * FROM (tcCandidati) WHERE RECNO() = lnA OR RECNO() = lnB INTO CURSOR (tcRezultat) READWRITE
SELECT (tcRezultat)
SCAN
DO S63Log WITH ' ' + tcEticheta + ' sursa ' + TRANSFORM(RECNO()) + ': client ' + ;
TRANSFORM(idpart) + ' [' + ALLTRIM(nume) + '] listaid=[' + ALLTRIM(listaid) + ;
'] descriere=[' + ALLTRIM(descr) + '] linii=' + TRANSFORM(linii)
ENDSCAN
DO Assert WITH RECCOUNT(tcRezultat) = 2, tcEticheta + ': doua surse distincte alese, e=' + TRANSFORM(RECCOUNT(tcRezultat))
DO Inchide WITH tcCandidati
ENDPROC
*==================================================================================
* EmiteS63: emite un document REAL pe forma indicata, din sursa pe care e pozitionat tcCursorSursa.
* Intoarce id_vanzare (0 = esec); serie/numar se intorc prin gcUltimaSerie / gnUltimulNract.
FUNCTION EmiteS63
LPARAMETERS tnTip, tcCursorSursa, tlFormNou, tcEticheta
LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, llOk, lnArt, lnFact, lcClasa
lnIdVz = 0
lcSerie = ''
lnNract = 0
gcUltimaSerie = ''
gnUltimulNract = 0
gcCaz = '[' + tcEticheta + '] '
LOCAL lnIdPart, lcNume, lcLista, lcDescr, lnIdCom
SELECT (tcCursorSursa)
lnIdPart = idpart
lcNume = ALLTRIM(nume)
lcLista = ALLTRIM(listaid)
lcDescr = ALLTRIM(descr)
lnIdCom = idcom
DO S63Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + lcLista + '] client=' + ;
TRANSFORM(lnIdPart) + ' [' + lcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---'
DO CuratieCrs
poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip)
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
*-- antetul, exact ca dupa cautarea din productie (do_cauta_avize / do_cauta_facturi)
poDate.id_client = lnIdPart
poDate.nume_client = lcNume
poDate.listaid = lcLista
poDate.descriere = lcDescr
IF tnTip = 4
*-- do_cauta_avize adauga mereu proprietatea, chiar cand niciun aviz nu vine din comanda
*-- (ofacturare_antet.prg:80); e citita in interogarea de antet, ofacturare.prg:954
ADDPROPERTY(poDate, 'id_comanda_aviz', lnIdCom)
ELSE
poDate.text_aditional = [RETUR FACTURA ] + lcDescr
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., tcEticheta + ': rezultat_serii = 3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii)
DO Goleste
RETURN 0
ENDIF
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
DO S63Log WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ;
' nract=' + TRANSFORM(poDate.nract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta)
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
gcMockApeluri = ''
IF tlFormNou
*-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua);
*-- articolele se incarca DUPA, prin butonul "Incarca articole"
DO PregatesteFacturaCrs
oform = CREATEOBJECT('frm_facturare_articole2')
lcClasa = 'frm_facturare_articole2'
ELSE
*-- v1: incarca_cursor_articole() INAINTE de formular (ca in factureaza(), ramura veche);
*-- functia isi creeaza singura crsfactura
pnTotalDiscountAvize = 0
loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere)
llOk = (loRez.nSucces >= 0) AND loRez.lArticole
DO S63Log WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ;
' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ;
IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)')
DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole'
IF !llOk
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ');'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Goleste
RETURN 0
ENDIF
oform = CREATEOBJECT('frm_facturare_articole')
lcClasa = 'frm_facturare_articole'
ENDIF
IF VARTYPE(oform) <> 'O'
DO Assert WITH .F., tcEticheta + ': Createobject ' + lcClasa
DO Goleste
RETURN 0
ENDIF
oform.WindowType = 0
oform.Show()
DOEVENTS FORCE
*-- traseul real: butonul, nu metoda. Mock-ul se reincarca imediat inainte, ca sa castige
*-- rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx (descoperirea S5b).
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
IF tlFormNou
DO Assert WITH LOWER(ALLTRIM(oform.but_incarca_articole.cAction)) == 'do_incarca_articole', ;
tcEticheta + ': butonul Incarca articole duce la do_incarca_articole'
oform.but_incarca_articole.Click()
ELSE
DO Assert WITH LOWER(ALLTRIM(oform.but_urmator_tot1.cAction)) == 'do_adauga_tot', ;
tcEticheta + ': butonul Adauga tot duce la do_adauga_tot'
DO Assert WITH oform.but_urmator_tot1.Visible, ;
tcEticheta + ': butonul Adauga tot e VIZIBIL pe v1 pentru tipul ' + TRANSFORM(tnTip) + ' (Init il aprinde)'
oform.but_urmator_tot1.Click()
ENDIF
DOEVENTS FORCE
lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)
lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)
DO S63Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact)
DO S63Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact)
IF lnFact = 0
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ');'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
DO Elibereaza WITH oform
DO Goleste
RETURN 0
ENDIF
DO S63Log WITH ' [pas] do_calculeaza_totaluri'
oform.do_calculeaza_totaluri()
DOEVENTS FORCE
DO S63Log WITH ' [pas] do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron)
lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act))
lnNract = poDate.nract
SET PROCEDURE TO (gcMock) ADDITIVE
gcMockApeluri = ''
DO S63Log WITH ' [pas] but_termin1.Click'
LOCAL lnIntrInainte, lnAvRetInainte
lnIntrInainte = gnIntrebariRetur
lnAvRetInainte = gnAvizReturDeschis
oform.but_termin1.Click()
DOEVENTS FORCE
DO S63Log WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ;
'; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte)
DO S63Log WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0))
DO S63Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']'
*-- poDate.nid_vanzare NU e o dovada de scriere: la esec ramane santinela 9999999999 pusa de
*-- pachetul Oracle. Singura dovada e randul din VANZARI, cautat pe SERIE_ACT + NRACT.
lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract)
IF lnIdVz < 0
lnIdVz = 0
ENDIF
DO S63Log WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz)
DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz)
IF lnIdVz > 0
gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');'
ELSE
gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
lcSerie = ''
lnNract = 0
ENDIF
DO Elibereaza WITH oform
DO Goleste
gcUltimaSerie = lcSerie
gnUltimulNract = lnNract
RETURN lnIdVz
ENDFUNC
*==================================================================================
* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei. TRY/CATCH e
* AICI, nu in EmiteS63 - VFP refuza RETURN in interiorul unui bloc TRY (eroarea 2060).
* Dupa o exceptie: ROLLBACK explicit (tranzactia poate ramane deschisa in mijlocul scrierii),
* dezalocarea numarului (altfel se arde) si eliberarea formularelor ramase.
FUNCTION EmiteProtejat
LPARAMETERS tnTip, tcCursorSursa, tlFormNou, tcEticheta
LOCAL lnRez, lnI
lnRez = 0
TRY
lnRez = EmiteS63(tnTip, tcCursorSursa, tlFormNou, tcEticheta)
CATCH TO loExcEm
DO S63Log WITH ' EXCEPTIE in ' + tcEticheta + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ;
' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ;
' [' + TRANSFORM(loExcEm.LineContents) + ']'
DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ;
TRANSFORM(loExcEm.ErrorNo) + ')'
lnRez = 0
gcUltimaSerie = ''
gnUltimulNract = 0
TRY
goExecutor.oExecute("ROLLBACK")
CATCH
ENDTRY
TRY
gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ;
TRANSFORM(poDate.nract) + ' (' + tcEticheta + ', dupa exceptie);'
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
CATCH
ENDTRY
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
DO CuratieCrs
DO Goleste
ENDTRY
RETURN lnRez
ENDFUNC
*==================================================================================
* Rutarea, structural: butonul viu de pe fiecare forma si gatarea cablarii pe tipurile 4/8/9.
PROCEDURE AsertiuniRutare
LOCAL lcTxt
gcCaz = '[RUTARE] '
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("caction = do_adauga_tot", lcTxt) = 1, ;
'un singur caction = do_adauga_tot in fisier (butonul viu e pe v1)'
DO Assert WITH OCCURS("caction = do_incarca_articole", lcTxt) = 1, ;
'un singur caction = do_incarca_articole in fisier (butonul viu e pe v2)'
DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt, ;
'cablarea din do_incarca_articole contine tipurile 4 (aviz) si 8, 9 (retur)'
DO Assert WITH !("Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9, 24)" $ lcTxt), ;
'tipul 24 (aviz retur) NU e cablat pe v2 - datoria D2, ii lipsesc trei Inlist'
ENDPROC
*==================================================================================
PROCEDURE Compara
LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
LOCAL nFail
gcCaz = '[CompDoc ' + tcTip + '] '
nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3 ' + 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 S63Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ;
' (surse diferite - fiecare divergenta se argumenteaza in raport)'
DO ComparaConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip
ENDPROC
* Campurile de CONFIGURATIE nu depind de sursa: trebuie sa fie identice v1/v2 chiar cu surse diferite.
PROCEDURE ComparaConfig
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, nvl(id_delegat,0) as id_delegat, nvl(tip_incasat,0) as tip_incasat ] + ;
[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)'
DO Inchide WITH 'crsCfg'
RETURN
ENDIF
LOCAL ARRAY laC1[12], laC2[12]
SELECT crsCfg
LOCATE FOR id_vanzare = nId1
SCATTER TO laC1
LOCATE FOR id_vanzare = nId2
SCATTER TO laC2
DO Inchide WITH 'crsCfg'
LOCAL ARRAY laNume[11]
laNume[1] = 'TIP'
laNume[2] = 'IN_VALUTA'
laNume[3] = 'ID_VALUTA'
laNume[4] = 'MULTIPLICATOR'
laNume[5] = 'DISCOUNT_EVIDENTIAT'
laNume[6] = 'TVA_INCASARE'
laNume[7] = 'TIP_FACTURA'
laNume[8] = 'TIP_SAFT'
laNume[9] = 'COEFICIENT_K'
laNume[10] = 'ID_DELEGAT'
laNume[11] = 'TIP_INCASAT'
LOCAL lnI
FOR lnI = 1 TO 11
DO Assert WITH CdocEgal(laC1[lnI + 1], laC2[lnI + 1]), ;
tcTip + ': ' + laNume[lnI] + ' identic (configuratie, nu sursa) v1=' + TRANSFORM(laC1[lnI + 1]) + ;
' v2=' + TRANSFORM(laC2[lnI + 1])
ENDFOR
ENDPROC
*==================================================================================
* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2
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 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 'crsfactura'
DO Inchide WITH 'crscursuri'
DO Inchide WITH 'crspolitici'
DO Inchide WITH 'crscontracte'
DO Inchide WITH 'crsgestiunidest'
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
* Valoarea sursei, din cursorul-sonda: o sursa cu valoare 0 declanseaza dialogul "Factura are
* totalul 0. Doriti sa continuati?" si ar produce un document fara continut de comparat.
* -1 = necunoscut (cursorul nu are campurile), deci nu se filtreaza.
FUNCTION ValoareSonda
LPARAMETERS tnLinii
LOCAL lnVal, lcPret, lcExpr
lnVal = -1
*-- cursor_avize / cursor_retur intorc coloana PRET, nu PRETFTVA: cu numele fixat pe pretftva
*-- valoarea ramanea -1 pe orice sursa, deci filtrul "valoare <> 0" nu respingea nimic
IF tnLinii > 0 AND USED('crsSonda') AND TYPE('crsSonda.cantitate') = 'N'
lcPret = ''
DO CASE
CASE TYPE('crsSonda.pretftva') = 'N'
lcPret = 'pretftva'
CASE TYPE('crsSonda.pret') = 'N'
lcPret = 'pret'
CASE TYPE('crsSonda.pretctva') = 'N'
lcPret = 'pretctva'
ENDCASE
IF !EMPTY(lcPret)
lcExpr = 'ABS(NVL(cantitate, 0) * NVL(' + lcPret + ', 0))'
SELECT crsSonda
SUM &lcExpr TO lnVal
ENDIF
ENDIF
RETURN lnVal
ENDFUNC
* "SSS 645" - forma in care do_cauta_avize / do_cauta_facturi compun poDate.descriere
FUNCTION NumarDoc
LPARAMETERS tcSerie, tnNumar
LOCAL lcS
lcS = ALLTRIM(NVL(tcSerie, ''))
RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0)))
ENDFUNC
PROCEDURE Assert
LPARAMETERS tlCond, tcMsg
IF tlCond
gnPass = gnPass + 1
DO S63Log WITH 'PASS: ' + gcCaz + tcMsg
ELSE
gnFail = gnFail + 1
DO S63Log WITH 'FAIL: ' + gcCaz + tcMsg
ENDIF
ENDPROC
PROCEDURE S63Log
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1)
ENDPROC
PROCEDURE S63Err
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
gnErr = gnErr + 1
DO S63Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE S63Final
LOCAL lnI
IF TYPE('_SCREEN.tmrS63') = 'O'
_SCREEN.tmrS63.Enabled = .F.
TRY
_SCREEN.RemoveObject('tmrS63')
CATCH
ENDTRY
ENDIF
*-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala =
*-- rulare atarnata), asa ca se inchid explicit inainte (capcana platita la S8)
FOR lnI = _SCREEN.FormCount TO 1 STEP -1
TRY
_SCREEN.Forms(lnI).Release()
CATCH
ENDTRY
ENDFOR
*-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si care
*-- e ARS (alocat si nescris). Raportul de sesiune se face pe asta, nu pe jurnalul din memorie.
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 S63Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):'
SELECT crsNrSSS
SCAN
DO S63Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip)
ENDSCAN
USE IN crsNrSSS
ENDIF
CATCH
ENDTRY
DO S63Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere
DO S63Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr)
DO S63Log WITH 'END ' + TTOC(DATETIME())
QUIT
ENDPROC
*==================================================================================
* driverS63: apasa automat pe formele modale care nu trec prin functia amessagebox -
* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release).
* Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje.
* Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2.
DEFINE CLASS driverS63 AS Custom
nUltimAlteDate = 0
lBusy = .F.
PROCEDURE Executa
IF This.lBusy
RETURN
ENDIF
This.lBusy = .T.
IF TYPE('_SCREEN.tmrS63') = 'O'
_SCREEN.tmrS63.Enabled = .F.
ENDIF
TRY
LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur
loMsgForm = NULL
loAlteDate = NULL
loAvizRetur = NULL
FOR lnI = 1 TO _SCREEN.FormCount
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
IF 'MESSAGEBOX_FORM' $ lcClasa
loMsgForm = _SCREEN.Forms(lnI)
ENDIF
IF lcClasa == 'FRM_ALTE_DATE'
loAlteDate = _SCREEN.Forms(lnI)
ENDIF
IF 'DATE_AVIZ_RETUR' $ lcClasa
loAvizRetur = _SCREEN.Forms(lnI)
ENDIF
IF !(lcClasa $ gcClaseVazute)
gcClaseVazute = gcClaseVazute + lcClasa + ';'
DO S63Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
ENDIF
ENDFOR
*-- plasa de siguranta: daca totusi se deschide FRM_DATE_AVIZ_RETUR (modal, nedrivabil),
*-- se elibereaza ca sa nu atarne rularea; cazul se marcheaza neconcludent in log
IF !ISNULL(loAvizRetur)
gnAvizReturDeschis = gnAvizReturDeschis + 1
DO S63Log WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)'
TRY
loAvizRetur.Release()
CATCH
ENDTRY
ENDIF
IF !ISNULL(loMsgForm)
TRY
LOCAL lcTextMsg
lcTextMsg = ''
TRY
lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value))
CATCH
ENDTRY
DO S63Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']'
IF 'avizul de retur' $ LOWER(lcTextMsg)
gnIntrebariRetur = gnIntrebariRetur + 1
ENDIF
DO CASE
*-- raspunsul NU e "Da" implicit: singura confirmare de pe acest traseu e
*-- "Doriti sa se inregistreze si avizul de retur?", iar un Da deschide
*-- FRM_DATE_AVIZ_RETUR - modal, nedrivabil headless (masurat: a atarnat rularea).
*-- Avizul de retur e al doilea document, in afara perimetrului S6-3.
CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ;
AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5)
DO S63Log WITH ' [driver msg] apas cmgBotones.cmdNo'
loMsgForm.cmgBotones.cmdNo.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
DO S63Log WITH ' [driver msg] apas cmgBotones.cmdYes'
loMsgForm.cmgBotones.cmdYes.Click()
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
DO S63Log WITH ' [driver msg] apas cmgBotones.cmdOk'
loMsgForm.cmgBotones.cmdOk.Click()
ENDCASE
CATCH TO loExcMsg
DO S63Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
ENDTRY
ELSE
IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1)
This.nUltimAlteDate = SECONDS()
TRY
DO S63Log 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 S63Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message
ENDTRY
ENDIF
ENDIF
CATCH TO loExcTop
DO S63Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message
FINALLY
IF TYPE('_SCREEN.tmrS63') = 'O'
_SCREEN.tmrS63.Enabled = .T.
ENDIF
This.lBusy = .F.
ENDTRY
ENDPROC
ENDDEFINE