#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
This commit is contained in:
807
utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg
Normal file
807
utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg
Normal file
@@ -0,0 +1,807 @@
|
||||
* test_s3b_emitere_paritate_2.prg
|
||||
* Continuare a test_s3b_emitere_reala.prg (docs\raport_s3b_emitere_reala.md) si a notei care l-a
|
||||
* corectat (docs\nota_verificare_emitere_reala.md): acolo singura combinatie care a scris REAL in
|
||||
* VANZARI a fost tnTip=22 (AVIZ) + tip incasare 1 (Fara incasare) - orice incasare reala pe AVIZ
|
||||
* (tip 2/3/4) intorcea poDate.nid_vanzare=9999999999 (sentinela), fara rand nou in VANZARI.
|
||||
*
|
||||
* CAUZA GASITA (verificata direct in sursa PL/SQL, PACK_FACTURARE PACKAGE BODY, MARIUSM_AUTO):
|
||||
* - scrie_factura2 (linia ~4886) apeleaza contabilizeaza_articol() pentru fiecare linie, care la
|
||||
* randul ei alege contul de debit dupa pack_facturare.ntip (linia ~6266):
|
||||
* WHEN ntip <= 20 OR ntip IN (nTipFacturaHotel,nTipFacturaRestaurant,nTipNotaPlata,
|
||||
* nTipVanzareRetail,48,49,51,52) THEN V_SCD := scd_articol -- 4111, cont client normal
|
||||
* WHEN ntip IN (28,29) THEN V_SCD := '461' -- aviz catre clienti debitori
|
||||
* ELSE V_SCD := '418' -- aviz, cont DIFERIT
|
||||
* AVIZ (ntip=22) cade pe ramura ELSE -> cont 418, nu 4111.
|
||||
* - scrie_incasari() posteaza incasarea pe contul standard de creanta client (4111-style), asteptat
|
||||
* de pack_contafin.verifica_note_contabile(1) sa se stinga cu nota de vanzare a documentului.
|
||||
* Cand documentul insusi a postat pe 418 (nu 4111), cele doua note nu se compenseaza -> notele nu
|
||||
* se balanseaza -> scrie_factura2 (linia ~5064) ia ramura "IF verifica_note_contabile(1)>0":
|
||||
* V_ID_VANZARE:=NULL, deschide V_CURSOR_VERIFICARE in loc sa finalizeze. In VFP
|
||||
* (ofacturare.vc2:14404/20126), asta declanseaza "Do Form verificare" (real, modal) - inlocuit
|
||||
* aici cu acelasi stub_verificare deja folosit ("gnButon=1" in Init). Chiar cu stub-ul confirmand,
|
||||
* poDate.nid_vanzare a ramas la valoarea implicita din clasa (ofacturare_comun.prg:186,
|
||||
* nid_vanzare=9999999999) - document NESCRIS.
|
||||
* - FACTURA normala (ntip<=20, deci Tip=1) intra pe ramura ntip<=20 -> cont 4111, acelasi cont pe
|
||||
* care il asteapta scrie_incasari() -> notele se balanseaza -> scrie_factura2 finalizeaza direct,
|
||||
* fara sa mai treaca prin verificare.
|
||||
*
|
||||
* FIX DE TEST (nu de productie): sursa articolelor ramane cursor_preturi cu tnTip=22 (singura care
|
||||
* intoarce randuri reale in acest mediu, RAJA id_part=463 - probe_emitere_reala.prg), dar poDate.Tip
|
||||
* se suprascrie pe 1 (FACTURA) DUPA ce crsfactura e deja populat (do_adauga_tot/do_calculeaza_totaluri)
|
||||
* si INAINTE de do_scrie_articole()/do_termin() - exact acelasi tipar deja folosit in productie pentru
|
||||
* bonul fiscal de magazin ("hacuiesc Tip = 43 ... apoi pun tipul la loc", ofacturare.vc2:14247-14259):
|
||||
* acolo poDate.Tip controleaza ce se scrie in VANZARI_DETALII_TEMP.TIP (deci pack_facturare.ntip),
|
||||
* independent de sursa preturilor. poDate.nIdTipDoc NU se suprascrie (ramane 5=FACTURA, valoarea
|
||||
* implicita din clasa, deja dovedita ca aloca numere reale in test_s3b_paritate_emitere.prg) - deci
|
||||
* seria/numerotarea documentului e cea de FACTURA, consistenta cu Tip=1.
|
||||
*
|
||||
* Verificat, nu presupus: pentru fiecare document se citeste randul din VANZARI dupa scriere (nu doar
|
||||
* raspunsul VFP) si se compara MAX(ID_VANZARE)/COUNT(*) inainte/dupa fiecare rulare.
|
||||
*
|
||||
* SECVENTIAL: intai toate 4 tipurile de incasare pe formularul VECHI (frm_alte_date, prin driverul pe
|
||||
* Timer, mecanism identic cu test_s3b_emitere_reala.prg), apoi (intr-un bloc separat, cu Release()
|
||||
* complet inainte) o incercare pe formularul NOU (frm_facturare_articole2) - cunoscut ca hangs la
|
||||
* CREATEOBJECT pe coloana Gestiune a grilei (docs\raport_s3b_emitere_reala.md sectiunea 3); daca se
|
||||
* manifesta din nou, ramane documentat aici, nu ocolit tacit.
|
||||
*
|
||||
* CONSUMA DATE REALE: fiecare document scris ramane in VANZARI (client 463, RAJA); tipurile 2/3/4
|
||||
* aloca si numere reale de chitanta/bon fiscal/pos (seriile 16/3/26). Niciun rollback, nicio stergere.
|
||||
*
|
||||
* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_paritate_2.prg"
|
||||
* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_paritate_2.log
|
||||
*
|
||||
* 26.08.2026: blocaj "Do Form verificare" pe formularul REAL (bucla messagebox REZULTATE VERIFICARI +
|
||||
* CATCH 103). Cauza: test_init_env_auto_roafacturare.prg:81 "SET PATH TO &lcPath ADDITIVE" are lcPath
|
||||
* terminat in backslash, care inghite cuvantul ADDITIVE (ultimul element devine "COMUNROA\ ADDITIVE")
|
||||
* si INLOCUIESTE path-ul, stergand stub_verificare de pe prima pozitie - asa ca verificare.scx se
|
||||
* rezolva la COMUN\FERESTRE (real). Fix test: re-asertare "SET PATH TO stub;" + SET('PATH') dupa
|
||||
* test_init_env + in driver eliberare DIRECTA (Release) a _FRMBASE in loc de do_termin, cu garda
|
||||
* glVerifTratatAD (plasa de siguranta anti-bucla).
|
||||
|
||||
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
|
||||
gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_paritate_2.log"
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog)
|
||||
gnPass = 0
|
||||
gnFail = 0
|
||||
|
||||
ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
ON SHUTDOWN QUIT
|
||||
|
||||
TRY
|
||||
LOCAL lcAppPathLocal, lcSql
|
||||
lcAppPathLocal = "D:\ROA\ROAFACTURARE\"
|
||||
|
||||
*-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE) - vezi 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 S3bLog WITH 'EROARE: conectare Oracle esuata'
|
||||
DO S3bFinal
|
||||
ENDIF
|
||||
DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle)
|
||||
|
||||
*-- goLog scrie fiecare SQL trimis prin oExecute/oExecuta, dar numai daca fisierul exista deja
|
||||
PUBLIC gcSqlTrace
|
||||
gcSqlTrace = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\sql_trace_2.log"
|
||||
STRTOFILE("", gcSqlTrace)
|
||||
IF TYPE('goLog') = 'O'
|
||||
goLog.cLogFile = gcSqlTrace
|
||||
ENDIF
|
||||
IF TYPE('poLog') = 'O'
|
||||
poLog.cLogFile = gcSqlTrace
|
||||
ENDIF
|
||||
|
||||
*-- fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log
|
||||
SQLSETPROP(gnHandle, "QueryTimeOut", 45)
|
||||
IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle
|
||||
SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45)
|
||||
ENDIF
|
||||
|
||||
SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE
|
||||
SET CLASSLIB TO gridextras.vcx ADDITIVE
|
||||
SET CLASSLIB TO _cb_base.vcx ADDITIVE
|
||||
DO S3bLog WITH 'SET CLASSLIB suplimentar OK'
|
||||
|
||||
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
||||
DO S3bLog WITH 'mock_amessagebox OK'
|
||||
|
||||
*-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract
|
||||
SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE
|
||||
|
||||
IF !actualizeaza_optiuni_program()
|
||||
DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()'
|
||||
DO S3bFinal
|
||||
ENDIF
|
||||
gnScadereStoc = 0
|
||||
gnModTotFact = 0
|
||||
gnFactSeturi = 0
|
||||
gnListareAvizBonFiscal = 0
|
||||
gnid_part_casa = 0
|
||||
gnIdUtil = 8
|
||||
*-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26)
|
||||
gnIdSucursala = 167
|
||||
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
|
||||
goExecutor.oExecuta(lcSql)
|
||||
DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala)
|
||||
|
||||
*-- test_init_env:81 "SET PATH TO &lcPath ADDITIVE" (lcPath cu backslash final) inghite cuvantul
|
||||
*-- ADDITIVE si INLOCUIESTE path-ul, stergand stub_verificare - re-asertare: stub PRIMUL + restul
|
||||
SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare;" + SET('PATH')
|
||||
DO S3bLog WITH 'stub_verificare re-asertat PRIMUL in SET PATH'
|
||||
|
||||
PUBLIC gcMockUltimMesaj, gnMockUltimTip
|
||||
gcMockUltimMesaj = ''
|
||||
gnMockUltimTip = 0
|
||||
|
||||
*----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) -----
|
||||
PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute, gnDrvDeadline, glVerifTratatAD
|
||||
glDlgTratatAD = .F.
|
||||
gnTipIncasareCerut = 1
|
||||
gnNrIncasareCapturat = 0
|
||||
gcClaseVazute = ';'
|
||||
gnDrvDeadline = SECONDS() + 20
|
||||
glVerifTratatAD = .F.
|
||||
goDriverAD = CREATEOBJECT('driverAlteDateAD')
|
||||
_SCREEN.AddObject('tmrDrvAD', 'Timer')
|
||||
_SCREEN.tmrDrvAD.Interval = 200
|
||||
BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa')
|
||||
_SCREEN.tmrDrvAD.Enabled = .T.
|
||||
_SCREEN.Caption = 'S3b - emitere paritate 2 (FACTURA, Tip=1)'
|
||||
DO S3bLog WITH 'driver+timer pregatiti'
|
||||
|
||||
DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ;
|
||||
' tip26=' + TRANSFORM(RanduriSerii(26)) + ' tip5(factura)=' + TRANSFORM(RanduriSerii(5))
|
||||
|
||||
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE VANZARI INAINTE ====='
|
||||
DO LogStareVanzari
|
||||
|
||||
CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ;
|
||||
serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ;
|
||||
tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2), ;
|
||||
pret_det N(18,4))
|
||||
|
||||
LOCAL laNumeTip[4]
|
||||
laNumeTip[1] = 'Fara incasare'
|
||||
laNumeTip[2] = 'Chitanta'
|
||||
laNumeTip[3] = 'Bon fiscal'
|
||||
laNumeTip[4] = 'POS Card'
|
||||
|
||||
LOCAL lnTip, lnIdVz
|
||||
|
||||
*-- FORMA VECHE, toate patru tipurile
|
||||
FOR lnTip = 1 TO 4
|
||||
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE ====='
|
||||
lnIdVz = CreeazaDocumentIncasare(lnTip, .F.)
|
||||
DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz
|
||||
ENDFOR
|
||||
|
||||
*-- FORMA NOUA, toate patru tipurile - separat, ca un hang/crash pe una sa nu piarda dovada
|
||||
*-- celorlalte (log-ul e scris incremental, STRTOFILE cu append, la fiecare pas). TRY/CATCH per
|
||||
*-- tip, ca o eroare neasteptata (necunoscuta inca pe calea noua) sa nu opreasca tot scriptul
|
||||
*-- inainte de comparatie si de starea finala VANZARI.
|
||||
FOR lnTip = 1 TO 4
|
||||
DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA ====='
|
||||
TRY
|
||||
lnIdVz = CreeazaDocumentIncasare(lnTip, .T.)
|
||||
DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz
|
||||
CATCH TO loExcNou
|
||||
DO S3bLog WITH ' CATCH forma noua tip=' + TRANSFORM(lnTip) + ' ErrorNo=' + TRANSFORM(loExcNou.ErrorNo) + ;
|
||||
' Message=' + loExcNou.Message + ' Proc=' + loExcNou.Procedure + ' Line=' + TRANSFORM(loExcNou.LineNo)
|
||||
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
|
||||
TRY
|
||||
goFrmS3b.Release()
|
||||
CATCH
|
||||
ENDTRY
|
||||
ENDIF
|
||||
goFrmS3b = NULL
|
||||
DO InregistreazaRezultat WITH lnTip, 'nou', 0
|
||||
ENDTRY
|
||||
ENDFOR
|
||||
|
||||
DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP ====='
|
||||
DO ComparaRezultate
|
||||
|
||||
DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE VANZARI DUPA ====='
|
||||
DO LogStareVanzari
|
||||
|
||||
_SCREEN.tmrDrvAD.Enabled = .F.
|
||||
DO S3bFinal
|
||||
|
||||
CATCH TO loExc
|
||||
DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']'
|
||||
DO S3bFinal
|
||||
ENDTRY
|
||||
|
||||
QUIT
|
||||
|
||||
*==================================================================================
|
||||
PROCEDURE S3bLog
|
||||
LPARAMETERS tcMsg
|
||||
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE S3bErr
|
||||
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
|
||||
DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE S3bFinal
|
||||
DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail)
|
||||
DO S3bLog WITH 'END ' + TTOC(DATETIME())
|
||||
QUIT
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE Assert
|
||||
LPARAMETERS tlCond, tcMsg
|
||||
IF tlCond
|
||||
gnPass = gnPass + 1
|
||||
DO S3bLog WITH 'PASS: ' + tcMsg
|
||||
ELSE
|
||||
gnFail = gnFail + 1
|
||||
DO S3bLog WITH 'FAIL: ' + tcMsg
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce
|
||||
FUNCTION RanduriSerii
|
||||
LPARAMETERS tnIdTipDoc
|
||||
LOCAL lnOk, lnRanduri, lcSql
|
||||
LOCAL ARRAY laErr[1]
|
||||
PRIVATE pnIdTipDoc, pnRezultat
|
||||
pnIdTipDoc = tnIdTipDoc
|
||||
pnRezultat = 0
|
||||
lnRanduri = -1
|
||||
lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}"
|
||||
lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl")
|
||||
IF lnOk > 0
|
||||
lnRanduri = RECCOUNT("crsprobapl")
|
||||
USE IN (SELECT("crsprobapl"))
|
||||
ELSE
|
||||
AERROR(laErr)
|
||||
DO S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2])
|
||||
ENDIF
|
||||
RETURN lnRanduri
|
||||
ENDFUNC
|
||||
|
||||
PROCEDURE LogStareVanzari
|
||||
LOCAL lnQ
|
||||
lnQ = goExecutor.oExecute([select max(id_vanzare) as maxid, count(*) as cnt from vanzari], 'crsMaxVz')
|
||||
IF lnQ > 0
|
||||
DO S3bLog WITH ' MAX(ID_VANZARE)=' + TRANSFORM(crsMaxVz.maxid) + ' COUNT(*)=' + TRANSFORM(crsMaxVz.cnt)
|
||||
USE IN crsMaxVz
|
||||
ELSE
|
||||
DO S3bLog WITH ' EROARE citire stare VANZARI: ' + goExecutor.oPrelucrareEroare()
|
||||
ENDIF
|
||||
lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ;
|
||||
[from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc')
|
||||
IF lnQ > 0
|
||||
SELECT crsMaxInc
|
||||
SCAN
|
||||
DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr)
|
||||
ENDSCAN
|
||||
USE IN crsMaxInc
|
||||
ELSE
|
||||
DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare()
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate
|
||||
PROCEDURE InregistreazaRezultat
|
||||
LPARAMETERS tnTip, tcForma, tnIdVz
|
||||
IF tnIdVz <= 0
|
||||
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI'
|
||||
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0)
|
||||
RETURN
|
||||
ENDIF
|
||||
LOCAL lnQ
|
||||
lnQ = goExecutor.oExecute([select id_vanzare, tip, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ;
|
||||
[nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ;
|
||||
[nvl(serie_incasat,'') as serie_incasat, total_cu_tva, ] + ;
|
||||
[(select max(nvl(d.pret,0)) from vanzari_detalii d where d.id_vanzare = v.id_vanzare ] + ;
|
||||
[and nvl(d.sters,0) = 0) as pret_det from vanzari v where v.id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1')
|
||||
IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1
|
||||
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz)
|
||||
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz)
|
||||
RETURN
|
||||
ENDIF
|
||||
SELECT crsVz1
|
||||
INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ;
|
||||
nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva, pret_det) ;
|
||||
VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ;
|
||||
gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva, ;
|
||||
NVL(crsVz1.pret_det,0))
|
||||
DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' vanzari.tip=' + TRANSFORM(crsVz1.tip) + ;
|
||||
' cod=' + TRANSFORM(crsVz1.cod) + ' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ;
|
||||
' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ;
|
||||
' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ;
|
||||
' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva) + ' pret_det=' + TRANSFORM(NVL(crsVz1.pret_det,0))
|
||||
USE IN crsVz1
|
||||
|
||||
DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ;
|
||||
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ;
|
||||
') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')'
|
||||
DO Assert WITH crsRezultate.pret_det > 0, ;
|
||||
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI_DETALII.PRET nenul (' + ;
|
||||
TRANSFORM(crsRezultate.pret_det) + ') - linia are pret, nu doar cantitate'
|
||||
DO Assert WITH crsRezultate.total_cu_tva > 0, ;
|
||||
'[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.TOTAL_CU_TVA nenul (' + ;
|
||||
TRANSFORM(crsRezultate.total_cu_tva) + ') - documentul are valoare, nu doar rand'
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE ComparaRezultate
|
||||
LOCAL lnTip, lnRVechi, lnRNou
|
||||
FOR lnTip = 1 TO 4
|
||||
SELECT crsRezultate
|
||||
LOCATE FOR tip_incasare = lnTip AND ALLTRIM(forma) == 'vechi'
|
||||
IF !FOUND()
|
||||
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate'
|
||||
LOOP
|
||||
ENDIF
|
||||
lnRVechi = RECNO()
|
||||
LOCATE FOR tip_incasare = lnTip AND ALLTRIM(forma) == 'nou'
|
||||
IF !FOUND()
|
||||
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate'
|
||||
LOOP
|
||||
ENDIF
|
||||
lnRNou = RECNO()
|
||||
|
||||
LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou
|
||||
GO lnRVechi IN crsRezultate
|
||||
lnIdVechi = crsRezultate.id_vanzare
|
||||
lnTipIncVechi = crsRezultate.tip_incasat
|
||||
lnSumaVechi = crsRezultate.suma_incasat
|
||||
lcSerieVechi = crsRezultate.serie_incasat
|
||||
GO lnRNou IN crsRezultate
|
||||
lnIdNou = crsRezultate.id_vanzare
|
||||
lnTipIncNou = crsRezultate.tip_incasat
|
||||
lnSumaNou = crsRezultate.suma_incasat
|
||||
lcSerieNou = crsRezultate.serie_incasat
|
||||
|
||||
IF lnIdVechi <= 0 OR lnIdNou <= 0
|
||||
DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ;
|
||||
TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')'
|
||||
LOOP
|
||||
ENDIF
|
||||
|
||||
DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ;
|
||||
TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')'
|
||||
DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ;
|
||||
TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')'
|
||||
DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ;
|
||||
ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])'
|
||||
ENDFOR
|
||||
ENDPROC
|
||||
|
||||
*==================================================================================
|
||||
* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie, clasificat FACTURA
|
||||
* (poDate.Tip=1 de la Init, NU suprascris ulterior - varianta anterioara, cu suprascriere tarzie,
|
||||
* a rupt txtDataScadenta pe calea veche si opt_incasat pe calea noua, vezi antetul fisierului si
|
||||
* docs\raport_s3b_emitere_reala_2.md). Sursa articolelor ramane insa cursor_preturi cu pnTipPreturi=22
|
||||
* (AVIZ din lista de preturi - singura combinatie cu date reale in acest mediu,
|
||||
* probe_emitere_reala.prg): parametrul de tip trimis la cursor_preturi e o variabila separata,
|
||||
* NU poDate.tip, ca structura/continutul cursorului nu depinde de valoarea trimisa (doar eligibilitatea
|
||||
* articolelor pentru acel tip de lista) - poDate.tip ramane 1 (FACTURA) neschimbat pe tot fluxul.
|
||||
* Intoarce poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log).
|
||||
FUNCTION CreeazaDocumentIncasare
|
||||
LPARAMETERS tnTipIncasare, tlFormNou
|
||||
|
||||
PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTipPreturi
|
||||
LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat
|
||||
LOCAL lcSerieAlocata, lnNractAlocat
|
||||
lnIdVanzareRezultat = 0
|
||||
lcSerieAlocata = ''
|
||||
lnNractAlocat = 0
|
||||
gnNrIncasareCapturat = 0
|
||||
|
||||
*-- poDate.Tip = 1 (FACTURA) de la Init - ntip<=20, contul de client normal (4111), consistent pe
|
||||
*-- tot fluxul (vezi antetul fisierului). Sursa preturilor (pnTipPreturi=22) ramane separata.
|
||||
tnTip = 1
|
||||
pnTipPreturi = 22
|
||||
tnIdClient = 463
|
||||
tnIdDelegat = 256
|
||||
|
||||
update_jtva_coloane([JV], [jtva_coloane_temp])
|
||||
update_saft_taxtable()
|
||||
|
||||
lnIdSet = 25000 + pnTipPreturi - 1 + gnScadereStoc * 10
|
||||
poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip)
|
||||
poGeneratorNumere = CREATEOBJECT("oGeneratorNumere")
|
||||
poDateGestiuneDest = CREATEOBJECT("oDateGestiune")
|
||||
|
||||
gnIdUtil = 8
|
||||
poGeneratorNumere.ResetNumere()
|
||||
poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc)
|
||||
|
||||
poDate.id_client = tnIdClient
|
||||
poDate.id_delegat = tnIdDelegat
|
||||
poDate.zi_curs = {^2026-08-10}
|
||||
|
||||
IF poDate.rezultat_serii = 3
|
||||
poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc)
|
||||
ENDIF
|
||||
poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL)
|
||||
poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract)
|
||||
gnIdUtil = -3
|
||||
lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, [])))
|
||||
lnNractAlocat = poDate.nract
|
||||
DO S3bLog WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' poDate.nract=' + TRANSFORM(poDate.nract) + ;
|
||||
' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']'
|
||||
|
||||
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
|
||||
|
||||
lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?pnTipPreturi,?poDate.id_valuta,] + ;
|
||||
[?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}]
|
||||
|
||||
lcCursor = [crsarticole]
|
||||
lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor)
|
||||
IF lnSucces < 0
|
||||
DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare()
|
||||
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
|
||||
DO S3bCurataJtva
|
||||
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
|
||||
RETURN 0
|
||||
ENDIF
|
||||
|
||||
IF RECCOUNT(lcCursor) = 0
|
||||
DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document'
|
||||
poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc)
|
||||
DO S3bCurataJtva
|
||||
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
|
||||
RETURN 0
|
||||
ENDIF
|
||||
DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor))
|
||||
|
||||
*-- articolul sursa (SERVICII PER BUC, lista de proba) are pretul 0 in acest mediu - cu
|
||||
*-- poDate.totalctva=0, validarea reala (ofacturare.vc2 "Suma incasata nu poate fi mai mare
|
||||
*-- decat valoarea facturii") respinge orice incasare nenula, iar fara nicio incasare
|
||||
*-- lcListaIncasare iese gol (nu 'NULL') -> SQL Oracle malformat. Fortam un pret real de test,
|
||||
*-- ca actualizeaza_tipincasare (codul real de productie) sa preumple poDate.incasat/incasatCARD
|
||||
*-- = poDate.totalctva pe cont propriu, exact ca la un document real cu suma de incasat.
|
||||
*-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole
|
||||
*-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret,
|
||||
*-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul.
|
||||
SELECT (lcCursor)
|
||||
REPLACE ALL cantitate WITH 1, ;
|
||||
pret_val WITH IIF(tip_valuta = 1, 100, 0), ;
|
||||
pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100)
|
||||
=TABLEUPDATE(.T., .T., lcCursor)
|
||||
GO TOP
|
||||
DO S3bLog WITH ' crsarticole dupa REPLACE: pret=' + TRANSFORM(pret) + ' cantitate=' + TRANSFORM(cantitate) + ;
|
||||
' pret_val=' + TRANSFORM(pret_val) + ' tip_valuta=' + TRANSFORM(tip_valuta) + ' curs=' + TRANSFORM(NVL(curs,0)) + ;
|
||||
' proc_tvav=' + TRANSFORM(proc_tvav) + ' preturi_cu_tva=' + TRANSFORM(preturi_cu_tva) + ' modificabil=' + TRANSFORM(modificabil)
|
||||
|
||||
creeaza_facturacrs([crsfactura])
|
||||
|
||||
*-- Construim crsfactura DIRECT din crsarticole, cu prelucreaza_facturacrs (ofacturare_comun.prg:1803)
|
||||
*-- - procedura reala care calculeaza pretctva/valctva/valftva/valtva/valdiminuatctva etc. Ocolim
|
||||
*-- complet do_adauga_tot()/do_adauga_articol(), care citesc Thisform.grd_articole - grila NU se
|
||||
*-- materializeaza sub vfp9.exe -A -T (capcana cunoscuta), deci randul adaugat prin ea iese gol
|
||||
*-- (cantitate=0/pret=NULL) indiferent ce e in crsarticole - verificat cu log dedicat intr-o
|
||||
*-- rulare anterioara. do_calculeaza_totaluri() (ambele clase, verificat in sursa) citeste STRICT
|
||||
*-- din crsfactura (Sum(valdiminuatctva) etc.), fara nicio dependenta de grid - deci populand
|
||||
*-- crsfactura corect pe alta cale, restul fluxului (do_calculeaza_totaluri, do_termin,
|
||||
*-- do_scrie_articole -> SELECT crsfactura SCAN) functioneaza neschimbat.
|
||||
LOCAL lnCotaTva, lnIdJtvaColoana, lnSelAnterior
|
||||
SELECT (lcCursor)
|
||||
lnCotaTva = ROUND((proc_tvav - 1) * 100, 0)
|
||||
lnIdJtvaColoana = 0
|
||||
IF USED('jtva_coloane')
|
||||
lnSelAnterior = SELECT()
|
||||
SELECT jtva_coloane
|
||||
LOCATE FOR cota_tva = lnCotaTva
|
||||
IF FOUND()
|
||||
lnIdJtvaColoana = id_jtva_coloana
|
||||
ENDIF
|
||||
SELECT (lnSelAnterior)
|
||||
ENDIF
|
||||
DO S3bLog WITH ' lookup jtva_coloane: cota_tva=' + TRANSFORM(lnCotaTva) + ' -> id_jtva_coloana=' + TRANSFORM(lnIdJtvaColoana)
|
||||
|
||||
SELECT id_articol, id_pol, 1 AS id_vanzare_det, CAST('' AS M) AS explicatie, denumire, lot, serie, codmat, ;
|
||||
m.lnIdJtvaColoana AS id_jtva_coloana, CAST(NULL AS N(20)) AS id_jtva_coloana_ex, CAST(NULL AS N(6)) AS taxcode, ;
|
||||
codmat AS codmatf, codbare, 0 AS pret_achizitie, cantitate, proc_tvav, um, ;
|
||||
preturi_cu_tva AS pret_cu_tva, pret, discount_unitar, pret_val, discount_unitar_val, ;
|
||||
CAST(NULL AS N(20)) AS id_vanzare_set, CAST(NULL AS N(20)) AS id_gestiune, CAST(NULL AS N(20)) AS id_ctr, ;
|
||||
CAST('' AS C(100)) AS numar_contract, id_valuta, tip_valuta, curs, multiplicator, nume_val ;
|
||||
FROM (lcCursor) INTO CURSOR crssursaprelucrare READWRITE
|
||||
|
||||
DO prelucreaza_facturacrs WITH 'crssursaprelucrare', 'crsfactura', 0, 0, 0
|
||||
SELECT (lcCursor)
|
||||
LOCAL lnIdPolCrs
|
||||
lnIdPolCrs = NVL(id_pol, 0)
|
||||
SELECT crsfactura
|
||||
REPLACE ALL id_pol WITH lnIdPolCrs
|
||||
USE IN crssursaprelucrare
|
||||
DO S3bLog WITH ' crsfactura dupa prelucreaza_facturacrs: Reccount=' + TRANSFORM(RECCOUNT('crsfactura'))
|
||||
IF RECCOUNT('crsfactura') > 0
|
||||
SELECT crsfactura
|
||||
GO TOP
|
||||
DO S3bLog WITH ' crsfactura linia 1: pret_achizitie=' + TRANSFORM(pret_achizitie) + ' cantitate=' + TRANSFORM(cantitate) + ;
|
||||
' pretctva=' + TRANSFORM(pretctva) + ' valctva=' + TRANSFORM(valctva) + ' valdiminuatctva=' + TRANSFORM(valdiminuatctva) + ;
|
||||
' proc_tvav=' + TRANSFORM(proc_Tvav) + ' cu_tva=' + TRANSFORM(cu_tva) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1))
|
||||
ENDIF
|
||||
|
||||
IF poDate.in_valuta = 1
|
||||
SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri
|
||||
SELECT crscursuri
|
||||
poDate.Curs = Curs
|
||||
poDate.multiplicator = multiplicator
|
||||
ELSE
|
||||
citeste_cursuri_zi(poDate.zi_curs)
|
||||
IF RECCOUNT('crscursuri') = 0
|
||||
USE IN crscursuri
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U'
|
||||
CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100))
|
||||
SELECT crspolitici
|
||||
INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '<TOATE>')
|
||||
INSERT INTO crspolitici(id_pol, nume_lista_preturi) ;
|
||||
SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi
|
||||
ENDIF
|
||||
|
||||
*-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou
|
||||
PUBLIC goFrmS3b
|
||||
IF tlFormNou
|
||||
goFrmS3b = CREATEOBJECT('frm_facturare_articole2')
|
||||
ELSE
|
||||
goFrmS3b = CREATEOBJECT('frm_facturare_articole')
|
||||
ENDIF
|
||||
DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b)
|
||||
goFrmS3b.WindowType = 0
|
||||
goFrmS3b.Show()
|
||||
DOEVENTS FORCE
|
||||
DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')'
|
||||
|
||||
*-- crsfactura e deja populat direct (prelucreaza_facturacrs, mai sus) - NU mai chemam
|
||||
*-- goFrmS3b.do_adauga_tot()/do_adauga_articol(), care citesc Thisform.grd_articole (nematerializat
|
||||
*-- headless pe formularul vechi, si inexistent ca proprietate pe formularul nou - vezi antetul).
|
||||
goFrmS3b.do_calculeaza_totaluri()
|
||||
DOEVENTS FORCE
|
||||
*-- poDate.totalctva se seteaza abia in inainte_de_do_termin; totalul calculat sta in ntotalron
|
||||
DO S3bLog WITH ' dupa do_calculeaza_totaluri: ntotalron=' + TRANSFORM(goFrmS3b.ntotalron) + ;
|
||||
' nbazaron=' + TRANSFORM(goFrmS3b.nbazaron) + ' ntvaron=' + TRANSFORM(goFrmS3b.ntvaron) + ;
|
||||
' (poDate.totalctva inca ' + TRANSFORM(poDate.totalctva) + ')'
|
||||
|
||||
*-- poDate.Tip a fost 1 (FACTURA) inca de la Init - vezi antetul functiei. Doar diagnostic aici:
|
||||
*-- confirma ca .datascad s-a completat singur (tnTip=1<21 la Init, ofacturare_comun.prg:246).
|
||||
DO S3bLog WITH ' poDate.Tip=' + TRANSFORM(poDate.Tip) + ' poDate.datascad=' + TRANSFORM(NVL(poDate.datascad,{})) + ' inainte de do_termin()'
|
||||
|
||||
LOCAL lnScris
|
||||
IF tlFormNou
|
||||
*-- opt_incasat e inline pe formular - fara al doilea modal
|
||||
*-- actualizeaza_tipincasare pune incasat=poDate.totalctva; totalul se umple abia in inainte_de_do_termin, deci il pre-seteaza aici
|
||||
poDate.totalctva = goFrmS3b.ntotalron
|
||||
goFrmS3b.seteaza_mod_incasare(tnTipIncasare)
|
||||
gnNrIncasareCapturat = poDate.nr_incasare
|
||||
DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ;
|
||||
' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
|
||||
lnScris = goFrmS3b.do_termin()
|
||||
ELSE
|
||||
*-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD. Deadline de
|
||||
*-- gardian, verificat in Executa: daca modalul nu se rezolva in 20s (mesaj necunoscut,
|
||||
*-- ActiveControl invalid etc.), Executa il forteaza sa se elibereze in loc sa agate rularea
|
||||
*-- pe ecranul lui Marius (asa cum s-a intamplat o data, PID 9312, vezi handoff).
|
||||
glDlgTratatAD = .F.
|
||||
glVerifTratatAD = .F.
|
||||
gnTipIncasareCerut = tnTipIncasare
|
||||
gnDrvDeadline = SECONDS() + 20
|
||||
lnScris = goFrmS3b.do_termin()
|
||||
LOCAL lnWait
|
||||
lnWait = 0
|
||||
*-- INKEY(0.1) proceseaza evenimente SI asteapta real ~100ms, spre deosebire de un
|
||||
*-- DOEVENTS FORCE gol (care revine aproape instant) - altfel 250 de iteratii s-ar termina
|
||||
*-- in sub-o-secunda, mult inainte ca gardianul din Executa (20s) sa apuce sa actioneze.
|
||||
DO WHILE !glDlgTratatAD AND lnWait < 250
|
||||
=INKEY(0.1)
|
||||
DOEVENTS FORCE
|
||||
lnWait = lnWait + 1
|
||||
ENDDO
|
||||
IF !glDlgTratatAD
|
||||
DO S3bLog WITH ' ATENTIE: glDlgTratatAD tot .F. dupa asteptare - posibil modal ramas deschis'
|
||||
ENDIF
|
||||
ENDIF
|
||||
DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0))
|
||||
|
||||
*-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare
|
||||
*-- ramane santinela 9999999999 la esec: singura dovada e randul din VANZARI, pe serie_act + nract.
|
||||
lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat)
|
||||
IF lnIdVanzareRezultat < 0
|
||||
lnIdVanzareRezultat = 0
|
||||
ENDIF
|
||||
DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ;
|
||||
' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat)
|
||||
|
||||
IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b)
|
||||
goFrmS3b.Release()
|
||||
ENDIF
|
||||
goFrmS3b = NULL
|
||||
|
||||
IF USED('crspolitici')
|
||||
USE IN crspolitici
|
||||
ENDIF
|
||||
IF USED('crscursuri')
|
||||
USE IN crscursuri
|
||||
ENDIF
|
||||
IF USED('crsfactura')
|
||||
USE IN crsfactura
|
||||
ENDIF
|
||||
IF USED('crsarticole')
|
||||
USE IN crsarticole
|
||||
ENDIF
|
||||
IF USED('jtva_coloane')
|
||||
USE IN jtva_coloane
|
||||
ENDIF
|
||||
IF USED('jtva_coloane_temp')
|
||||
USE IN jtva_coloane_temp
|
||||
ENDIF
|
||||
|
||||
RELEASE poDate, poGeneratorNumere, poDateGestiuneDest
|
||||
RETURN lnIdVanzareRezultat
|
||||
ENDFUNC
|
||||
|
||||
PROCEDURE S3bCurataJtva
|
||||
IF USED('jtva_coloane')
|
||||
USE IN jtva_coloane
|
||||
ENDIF
|
||||
IF USED('jtva_coloane_temp')
|
||||
USE IN jtva_coloane_temp
|
||||
ENDIF
|
||||
ENDPROC
|
||||
|
||||
*==================================================================================
|
||||
*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la
|
||||
* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - identic cu test_s3b_emitere_reala.prg.
|
||||
DEFINE CLASS driverAlteDateAD AS Custom
|
||||
PROCEDURE Executa
|
||||
LOCAL lnI, loForm, llGasit, loMsgForm, loCautaAlfaForm, loFormVerif
|
||||
*-- gardian: daca modalul nu s-a rezolvat in gnDrvDeadline secunde, il eliberam fortat in loc
|
||||
*-- sa lasam do_termin() agatat pe ecran (asa cum s-a intamplat o data, PID 9312).
|
||||
IF !glDlgTratatAD AND SECONDS() > gnDrvDeadline
|
||||
DO S3bLog WITH ' [diag timer] GARDIAN: deadline depasit, eliberez fortat formele deschise'
|
||||
*-- eliberare pe Forms(1) repetat (nu FOR pe index crescator), ca sterile modificarile
|
||||
*-- de FormCount la fiecare Release() sa nu sara peste elemente
|
||||
LOCAL lnGardCicluri
|
||||
lnGardCicluri = 0
|
||||
DO WHILE _SCREEN.FormCount > 0 AND lnGardCicluri < 20
|
||||
TRY
|
||||
DO S3bLog WITH ' [diag timer] GARDIAN: eliberez ' + UPPER(_SCREEN.Forms(1).Class)
|
||||
_SCREEN.Forms(1).Release()
|
||||
CATCH TO loExcGard
|
||||
DO S3bLog WITH ' [diag timer] GARDIAN: CATCH la Release ' + TRANSFORM(loExcGard.ErrorNo) + ' ' + loExcGard.Message
|
||||
EXIT
|
||||
ENDTRY
|
||||
lnGardCicluri = lnGardCicluri + 1
|
||||
ENDDO
|
||||
glDlgTratatAD = .T.
|
||||
RETURN
|
||||
ENDIF
|
||||
llGasit = .F.
|
||||
loMsgForm = NULL
|
||||
loCautaAlfaForm = NULL
|
||||
loFormVerif = NULL
|
||||
FOR lnI = 1 TO _SCREEN.FormCount
|
||||
LOCAL lcClasa
|
||||
lcClasa = UPPER(_SCREEN.Forms(lnI).Class)
|
||||
IF lcClasa == 'FRM_ALTE_DATE'
|
||||
loForm = _SCREEN.Forms(lnI)
|
||||
llGasit = .T.
|
||||
ENDIF
|
||||
IF 'MESSAGEBOX_FORM' $ lcClasa
|
||||
loMsgForm = _SCREEN.Forms(lnI)
|
||||
ENDIF
|
||||
IF lcClasa == 'CAUTA_ALFA_FORM'
|
||||
loCautaAlfaForm = _SCREEN.Forms(lnI)
|
||||
ENDIF
|
||||
IF '_FRMBASE' $ lcClasa
|
||||
loFormVerif = _SCREEN.Forms(lnI)
|
||||
ENDIF
|
||||
IF !(lcClasa $ gcClaseVazute)
|
||||
gcClaseVazute = gcClaseVazute + lcClasa + ';'
|
||||
DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']'
|
||||
ENDIF
|
||||
ENDFOR
|
||||
*-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) -
|
||||
*-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da". Textul se logheaza
|
||||
*-- de fiecare data (nu doar la primul din clasa) - mesajele difera de la un popup la altul.
|
||||
IF !ISNULL(loMsgForm)
|
||||
TRY
|
||||
IF PEMSTATUS(loMsgForm, 'edtMensaje', 5)
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form text=[' + TRANSFORM(loMsgForm.edtMensaje.Value) + ;
|
||||
'] caption=[' + TRANSFORM(loMsgForm.Caption) + ']'
|
||||
ENDIF
|
||||
CATCH TO loExcTxt
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH la citire text ' + TRANSFORM(loExcTxt.ErrorNo) + ' ' + loExcTxt.Message
|
||||
ENDTRY
|
||||
TRY
|
||||
DO CASE
|
||||
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5)
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes'
|
||||
loMsgForm.cmgBotones.cmdYes.Click()
|
||||
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5)
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk'
|
||||
loMsgForm.cmgBotones.cmdOk.Click()
|
||||
CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdCancel', 5)
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form: buton necunoscut (nici Yes, nici Ok) - apas cmgBotones.cmdCancel ca sa nu ramana blocat'
|
||||
loMsgForm.cmgBotones.cmdCancel.Click()
|
||||
OTHERWISE
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form: NICIUN buton recunoscut (Yes/Ok/Cancel) - raman blocat pana la gardian (' + ;
|
||||
TRANSFORM(gnDrvDeadline - SECONDS()) + 's ramase)'
|
||||
ENDCASE
|
||||
CATCH TO loExcMsg
|
||||
DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message
|
||||
ENDTRY
|
||||
ENDIF
|
||||
*-- cautare partener analitic (POS Card): se inchide fara selectie prin do_termin, inainte de
|
||||
*-- garda glDlgTratatAD ca sa fie tratat si dupa ce FRM_ALTE_DATE a fost deja rezolvat
|
||||
IF !ISNULL(loCautaAlfaForm)
|
||||
TRY
|
||||
DO S3bLog WITH ' [diag timer] forma cauta_alfa: Caption=[' + TRANSFORM(loCautaAlfaForm.Caption) + '] - apas do_termin()'
|
||||
loCautaAlfaForm.do_termin()
|
||||
CATCH TO loExcCautaAlfa
|
||||
DO S3bLog WITH ' [diag timer] forma cauta_alfa: CATCH ' + TRANSFORM(loExcCautaAlfa.ErrorNo) + ' ' + loExcCautaAlfa.Message
|
||||
TRY
|
||||
IF TYPE('loCautaAlfaForm') = 'O' AND !ISNULL(loCautaAlfaForm)
|
||||
loCautaAlfaForm.Release()
|
||||
ENDIF
|
||||
CATCH
|
||||
ENDTRY
|
||||
ENDTRY
|
||||
ENDIF
|
||||
*-- formularul real verificare (SCX _frmbase12, raportat _FRMBASE) - modal din scrie_factura2,
|
||||
*-- inainte de garda glDlgTratatAD; plasa de siguranta: eliberare DIRECTA (Release) - do_termin()
|
||||
*-- re-ruleaza verificarea si arunca bucla pe messagebox "REZULTATE VERIFICARI" + CATCH 103
|
||||
IF !ISNULL(loFormVerif) AND !glVerifTratatAD
|
||||
gnButon = 1
|
||||
glVerifTratatAD = .T.
|
||||
TRY
|
||||
DO S3bLog WITH ' [diag timer] forma _FRMBASE (verificare): eliberare directa (Release), gnButon=1'
|
||||
loFormVerif.Release()
|
||||
CATCH TO loExcVerif
|
||||
DO S3bLog WITH ' [diag timer] forma _FRMBASE: CATCH Release ' + TRANSFORM(loExcVerif.ErrorNo) + ' ' + loExcVerif.Message
|
||||
ENDTRY
|
||||
ENDIF
|
||||
IF glDlgTratatAD OR !llGasit
|
||||
RETURN
|
||||
ENDIF
|
||||
*-- loForm.ActiveControl arunca eroarea 1924 "ACTIVECONTROL is not an object" cand formularul
|
||||
*-- nu are (inca) niciun control cu focus - varianta anterioara o citea fara sa o foloseasca
|
||||
*-- si asta a cauzat exact blocajul raportat (PID 9312). Nu o mai citim deloc.
|
||||
TRY
|
||||
loForm.opt_incasat.Value = gnTipIncasareCerut
|
||||
gnNrIncasareCapturat = poDate.nr_incasare
|
||||
DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ;
|
||||
' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ;
|
||||
' incasatCARD=' + TRANSFORM(poDate.incasatCARD)
|
||||
loForm.do_termin()
|
||||
glDlgTratatAD = .T.
|
||||
CATCH TO loExcDrv
|
||||
DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ;
|
||||
' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo)
|
||||
*-- daca formularul a ramas deschis dupa CATCH, il eliberam - altfel do_termin() de mai
|
||||
*-- sus (cel apelat pe goFrmS3b, care asteapta modalul) ramane agatat la nesfarsit
|
||||
TRY
|
||||
IF TYPE('loForm') = 'O' AND !ISNULL(loForm)
|
||||
loForm.Release()
|
||||
ENDIF
|
||||
CATCH
|
||||
ENDTRY
|
||||
glDlgTratatAD = .T.
|
||||
ENDTRY
|
||||
ENDPROC
|
||||
ENDDEFINE
|
||||
Reference in New Issue
Block a user