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
1009 lines
43 KiB
Plaintext
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
|