Files
comun/programe/coada_contabilizare_ef.prg
2026-09-29 17:35:13 +03:00

531 lines
19 KiB
Plaintext

* coada_contabilizare_ef.prg
*!* 08.09.2026
*!* marius.mutu
*!* coada ghidata de contabilizare eFactura: eligibilitate calculata dinainte (CIF ambiguu in ROA
*!* sau linii cu lipsuri de completat blocheaza lotul, partener negasit sau inactiv doar
*!* atentioneaza - se rezolva la contabilizare), rutare automata contabilitate/gestiune dupa
*!* liniile facturii, antet de progres si raport final, contor local pe cursorul bifat.
DEFINE CLASS CoadaContabilizareEF AS Custom
*!* Plafon de facturi bifate pe o rulare a cozii
nPlafon = 50
*!* Calculeaza eligibilitatea fiecarui rand din cursorul de facturi (id, id_fact, cod_fiscal,
*!* numar_act, eligibil_lot, motiv_lot, ales trebuie sa existe deja in alias). Randurile neeligibile sunt
*!* debifate; cele eligibile pot primi in motiv_lot un text de atentionare (partener nou sau
*!* inactiv), fara sa blocheze. O singura interogare Oracle (parteneri grupati dupa codul fiscal
*!* normalizat, activi si inactivi), fara interogari per rand.
PROCEDURE MarcheazaEligibilitate
LPARAMETERS tcAlias, tlLunaInchisa
LOCAL lcSelect, lcSql, llSucces, lcAlias, lcCf, lnActivi, lnInactivi, lcMotiv, lcAtentionare
lcSelect = SELECT()
lcAlias = m.tcAlias
lcSql = "select cf_bare," + ;
" sum(case when inactiv = 0 then 1 else 0 end) as n_activi," + ;
" sum(case when inactiv <> 0 then 1 else 0 end) as n_inactivi" + ;
" from (select inactiv," + ;
" case when replace(upper(cod_fiscal),' ','') like 'RO%'" + ;
" then substr(replace(upper(cod_fiscal),' ',''), 3)" + ;
" else replace(upper(cod_fiscal),' ','') end as cf_bare" + ;
" from nom_parteneri where sters = 0) t" + ;
" group by cf_bare"
llSucces = goExecutor.oExecuta(m.lcSql, 'cCoadaParteneri')
IF !m.llSucces
SELECT (m.lcSelect)
RETURN .F.
ENDIF
SELECT cCoadaParteneri
INDEX ON cf_bare TAG cf_bare
SELECT (m.lcAlias)
SCAN
lcCf = ALLTRIM(STRTRAN(UPPER(NVL(cod_fiscal,'')),' ',''))
IF LEFT(m.lcCf, 2) == 'RO'
lcCf = SUBSTR(m.lcCf, 3)
ENDIF
lnActivi = 0
lnInactivi = 0
IF !EMPTY(m.lcCf) AND SEEK(m.lcCf, 'cCoadaParteneri', 'cf_bare')
lnActivi = NVL(cCoadaParteneri.n_activi, 0)
lnInactivi = NVL(cCoadaParteneri.n_inactivi, 0)
ENDIF
lcMotiv = This.EligibilRand(id_fact, m.lcCf, m.lnActivi, m.lnInactivi, m.tlLunaInchisa, numar_act)
lcAtentionare = IIF(EMPTY(m.lcMotiv), This.TextAtentionarePartener(m.lnActivi, m.lnInactivi), '')
REPLACE eligibil_lot WITH IIF(EMPTY(m.lcMotiv), 1, 0), ;
motiv_lot WITH IIF(EMPTY(m.lcMotiv), m.lcAtentionare, m.lcMotiv) IN (m.lcAlias)
IF !EMPTY(m.lcMotiv)
REPLACE ales WITH 0 IN (m.lcAlias)
ENDIF
ENDSCAN
USE IN (SELECT('cCoadaParteneri'))
SELECT (m.lcSelect)
RETURN .T.
ENDPROC
*!* Motivul pentru care un document nu poate intra in coada, sau sir gol daca e eligibil.
*!* tnActivi/tnInactivi = cati parteneri are ROA pe codul fiscal (ambele variante RO); un CIF
*!* negasit sau gasit doar inactiv nu mai blocheaza - partenerul se creeaza sau se foloseste
*!* inactiv la contabilizare (RezolvarePartenerEF), doar atentioneaza (TextAtentionarePartener).
PROCEDURE EligibilRand
LPARAMETERS tnIdFact, tcCodFiscal, tnActivi, tnInactivi, tlLunaInchisa, tcNumarAct
IF m.tlLunaInchisa
RETURN 'luna este inchisa'
ENDIF
IF !EMPTY(NVL(m.tnIdFact, 0))
RETURN 'factura este deja importata in contabilitate'
ENDIF
IF EMPTY(ALLTRIM(NVL(m.tcCodFiscal, '')))
RETURN 'eFactura nu are cod fiscal, nu se poate identifica partenerul'
ENDIF
IF NVL(m.tnActivi, 0) > 1 OR (NVL(m.tnActivi, 0) = 0 AND NVL(m.tnInactivi, 0) > 1)
RETURN 'CIF ambiguu in ROA, alegeti partenerul manual'
ENDIF
IF EMPTY(This.NrActDinNumarAct(m.tcNumarAct))
RETURN 'numarul documentului nu se poate deduce din ' + ALLTRIM(NVL(m.tcNumarAct, '')) + ', completati-l manual'
ENDIF
RETURN ''
ENDPROC
*!* Text de atentionare pentru un rand eligibil (nu blocheaza), cand partenerul nu e o
*!* potrivire activa simpla: gol daca exista exact un partener activ pe CIF
PROCEDURE TextAtentionarePartener
LPARAMETERS tnActivi, tnInactivi
IF NVL(m.tnActivi, 0) = 0 AND NVL(m.tnInactivi, 0) = 0
RETURN 'partener nou in ROA, se creeaza automat la contabilizare'
ENDIF
IF NVL(m.tnActivi, 0) = 0 AND NVL(m.tnInactivi, 0) = 1
RETURN 'partenerul gasit este inactiv in ROA'
ENDIF
RETURN ''
ENDPROC
*!* Numarul de document dedus din numarul eFacturii: ultimele 14 cifre din primul grup de cifre
*!* de la dreapta ('ZZT-A1-C' -> 1, 'F1234' -> 1234, 'FACTURA' -> 0). 0 inseamna ca nu s-a putut deduce.
PROCEDURE NrActDinNumarAct
LPARAMETERS tcNumarAct
LOCAL lcText, lcCifre, lnI, llInGrup
lcText = ALLTRIM(NVL(m.tcNumarAct, ''))
lcCifre = ''
llInGrup = .F.
FOR lnI = LEN(m.lcText) TO 1 STEP -1
IF ISDIGIT(SUBSTR(m.lcText, m.lnI, 1))
lcCifre = SUBSTR(m.lcText, m.lnI, 1) + m.lcCifre
llInGrup = .T.
ELSE
IF m.llInGrup
EXIT
ENDIF
ENDIF
ENDFOR
RETURN INT(VAL(RIGHT(m.lcCifre, 14)))
ENDPROC
*!* Textul lipsurilor facturii al carei cursor de linii e deschis (tcAliasDetalii), calculat
*!* local (cont/gestiune) plus o interogare pe vplcont_ANALITIC per cont distinct fara acont
*!* (doar daca tcAliasDetalii are coloana acont), cu TextDeCompletat.
*!* tnGestiuneImplicita = optiunea EFACTURA_ID_GESTIUNE_P, citita de apelant
PROCEDURE LipsuriDetalii
LPARAMETERS tcAliasDetalii, tnGestiuneImplicita
LOCAL lcSelect, lnRecno, lnArticole, lnGestiuni, lnAnalitic, llAreAcont, lcListaCont, lcSql, lcContx
lcSelect = SELECT()
lnArticole = 0
lnGestiuni = 0
lnAnalitic = 0
llAreAcont = (TYPE(m.tcAliasDetalii + '.acont') <> 'U')
IF m.llAreAcont
lcListaCont = cursor2listac(m.tcAliasDetalii, 'cont', ',', "!EMPTY(NVL(cont,'')) AND EMPTY(NVL(acont,''))")
IF !EMPTY(m.lcListaCont)
lcSql = "select distinct cont from vplcont_ANALITIC where inactiv = 0 and an = ?gnAn and cont in (" + m.lcListaCont + ")"
llAreAcont = goExecutor.oExecuta(m.lcSql, 'cCoadaAnaliticLipsuri')
ELSE
llAreAcont = .F.
ENDIF
ENDIF
SELECT (m.tcAliasDetalii)
lnRecno = RECNO()
SCAN
IF EMPTY(ALLTRIM(NVL(cont, '')))
lnArticole = lnArticole + 1
ENDIF
IF NVL(in_stoc, 0) = 1 AND EMPTY(NVL(id_gestiune, 0)) AND EMPTY(NVL(m.tnGestiuneImplicita, 0))
lnGestiuni = lnGestiuni + 1
ENDIF
IF m.llAreAcont AND !EMPTY(ALLTRIM(NVL(cont, ''))) AND EMPTY(ALLTRIM(NVL(acont, '')))
lcContx = ALLTRIM(cont)
SELECT cCoadaAnaliticLipsuri
LOCATE FOR cont = m.lcContx
IF FOUND()
lnAnalitic = lnAnalitic + 1
ENDIF
SELECT (m.tcAliasDetalii)
ENDIF
ENDSCAN
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
IF USED('cCoadaAnaliticLipsuri')
USE IN cCoadaAnaliticLipsuri
ENDIF
SELECT (m.lcSelect)
RETURN This.TextDeCompletat(m.lnArticole, m.lnGestiuni, m.lnAnalitic)
ENDPROC
*!* Compune textul scurt din numarul de linii fara cont, fara gestiune si fara analitic, pentru
*!* coloana de grid
PROCEDURE TextDeCompletat
LPARAMETERS tnArticole, tnGestiuni, tnAnalitic
LOCAL lcCont, lcGest, lcAnalitic, lcText
lcCont = IIF(NVL(m.tnArticole, 0) = 0, '', ALLTRIM(STR(m.tnArticole)) + ' cont')
lcGest = IIF(NVL(m.tnGestiuni, 0) = 0, '', ALLTRIM(STR(m.tnGestiuni)) + ' gest.')
lcAnalitic = IIF(NVL(m.tnAnalitic, 0) = 0, '', ALLTRIM(STR(m.tnAnalitic)) + ' analitic')
lcText = m.lcCont
IF !EMPTY(m.lcGest)
lcText = IIF(EMPTY(m.lcText), m.lcGest, m.lcText + ' ' + m.lcGest)
ENDIF
IF !EMPTY(m.lcAnalitic)
lcText = IIF(EMPTY(m.lcText), m.lcAnalitic, m.lcText + ' ' + m.lcAnalitic)
ENDIF
RETURN m.lcText
ENDPROC
*!* Aplica pe tot cursorul de facturi lipsurile calculate in lot de RecunoastereArticolEF.LipsuriLista
*!* (tcAliasLipsuri, indexat pe id_efactura). Numarul de conturi lipsa e fara_cont_orice cand
*!* tlCompleteazaCont, altfel fara_cont_catalog; devine 0 daca tcContImplicit e nevid (umple toate
*!* liniile neconditionat, ca la completeazadetaliifactura:12040). Numarul de gestiuni lipsa devine 0
*!* daca tnGestiuneImplicita e nevida (:12041, neconditionat de tlCompleteazaGestiune); altfel, cand
*!* tlCompleteazaGestiune e oprit propunerea per linie a cascadei nu se aplica niciodata (:12010/:12028
*!* cer flagul), deci raman lipsa toate liniile stocabile (stoc_total), nu doar cele fara propunere
*!* (stoc_fara_gestiune). Numarul de analitice lipsa e fara_analitic, neconditionat de tlCompleteazaCont/
*!* tcContImplicit (linii care deja au un cont din cascada, indiferent de completarea implicita).
*!* O factura absenta din tcAliasLipsuri (fara linii) nu are nimic de completat.
*!* Regula de rand: identica cu ActualizeazaLipsuriRandCurent (anaf_efactura.vc2) - lipsuri nevide pe
*!* rand inca eligibil blocheaza si debifeaza; lipsuri vide pe rand blocat DIN acest motiv il redeschid,
*!* fara sa atinga alte motive puse de MarcheazaEligibilitate. Pastreaza pozitia in tcAliasFacturi
PROCEDURE AplicaLipsuriLista
LPARAMETERS tcAliasFacturi, tcAliasLipsuri, tcContImplicit, tnGestiuneImplicita, tlCompleteazaCont, tlCompleteazaGestiune
LOCAL lcSelect, lnRecno, llGasit, lnArticole, lnGestiuni, lnAnalitic, lcLipsuri, llEraLipsuri
IF !USED(m.tcAliasFacturi) OR !USED(m.tcAliasLipsuri)
RETURN .F.
ENDIF
lcSelect = SELECT()
SELECT (m.tcAliasFacturi)
lnRecno = RECNO()
SCAN
llGasit = SEEK(id, m.tcAliasLipsuri, 'idefact')
lnArticole = 0
lnGestiuni = 0
lnAnalitic = 0
IF m.llGasit
IF m.tlCompleteazaCont
lnArticole = EVALUATE(m.tcAliasLipsuri + '.fara_cont_orice')
ELSE
lnArticole = EVALUATE(m.tcAliasLipsuri + '.fara_cont_catalog')
ENDIF
IF EMPTY(NVL(m.tnGestiuneImplicita, 0))
IF m.tlCompleteazaGestiune
lnGestiuni = EVALUATE(m.tcAliasLipsuri + '.stoc_fara_gestiune')
ELSE
lnGestiuni = EVALUATE(m.tcAliasLipsuri + '.stoc_total')
ENDIF
ENDIF
lnAnalitic = EVALUATE(m.tcAliasLipsuri + '.fara_analitic')
ENDIF
IF !EMPTY(ALLTRIM(NVL(m.tcContImplicit, '')))
lnArticole = 0
ENDIF
SELECT (m.tcAliasFacturi)
lcLipsuri = This.TextDeCompletat(m.lnArticole, m.lnGestiuni, m.lnAnalitic)
llEraLipsuri = (LEFT(ALLTRIM(NVL(motiv_lot,'')), 13) == 'de completat:')
REPLACE de_completat WITH m.lcLipsuri IN (m.tcAliasFacturi)
REPLACE gest WITH IIF(m.llGasit AND EVALUATE(m.tcAliasLipsuri + '.stoc_total') > 0, 'G', '') IN (m.tcAliasFacturi)
IF !EMPTY(m.lcLipsuri)
IF NVL(eligibil_lot,1) = 1
REPLACE eligibil_lot WITH 0, ales WITH 0, motiv_lot WITH 'de completat: ' + m.lcLipsuri IN (m.tcAliasFacturi)
ENDIF
ELSE
IF NVL(eligibil_lot,1) = 0 AND m.llEraLipsuri
REPLACE eligibil_lot WITH 1, motiv_lot WITH '' IN (m.tcAliasFacturi)
ENDIF
ENDIF
ENDSCAN
TRY
GO m.lnRecno IN (m.tcAliasFacturi)
CATCH
GO TOP IN (m.tcAliasFacturi)
ENDTRY
SELECT (m.lcSelect)
RETURN .T.
ENDPROC
*!* Decide ruta documentului dupa liniile lui deja completate: 1 = Import contabilitate
*!* (ImportGeneral, doar note), 2 = Import gestiune (ImportModifica, note + rulaje), daca
*!* exista cel putin o linie de articol gestionabil (in_stoc = 1)
PROCEDURE Ruta
LPARAMETERS tcAliasDetalii
LOCAL lcSelect, lnGestionabile, lnRecno
lcSelect = SELECT()
lnGestionabile = 0
SELECT (m.tcAliasDetalii)
lnRecno = RECNO()
COUNT FOR NVL(in_stoc, 0) = 1 TO lnGestionabile
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
SELECT (m.lcSelect)
RETURN IIF(m.lnGestionabile > 0, 2, 1)
ENDPROC
*!* Cate randuri ajung efectiv in rulaje: articol ROA, gestiune (proprie sau implicita) si cont completate
PROCEDURE NrRanduriGestiune
LPARAMETERS tcAliasDetalii, tnGestiuneImplicita
LOCAL lcSelect, llGestImplicita, lnRanduri, lnRecno
lcSelect = SELECT()
lnRanduri = 0
llGestImplicita = !EMPTY(NVL(m.tnGestiuneImplicita, 0))
SELECT (m.tcAliasDetalii)
lnRecno = RECNO()
COUNT FOR NVL(in_stoc, 0) = 1 AND !EMPTY(NVL(id_articol, 0)) AND ;
(m.llGestImplicita OR !EMPTY(NVL(id_gestiune, 0))) AND ;
!EMPTY(ALLTRIM(NVL(cont, ''))) TO lnRanduri
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
SELECT (m.lcSelect)
RETURN m.lnRanduri
ENDPROC
*!* Textul antetului permanent afisat cat ruleaza coada
PROCEDURE AntetProgres
LPARAMETERS tnCurent, tnTotal, tcFurnizor, tcNrAct, tnSuma
LOCAL lcSuma
lcSuma = ALLTRIM(TRANSFORM(NVL(m.tnSuma, 0), '999,999,999.99'))
RETURN 'Factura ' + ALLTRIM(STR(m.tnCurent)) + ' din ' + ALLTRIM(STR(m.tnTotal)) + ' - ' + ;
ALLTRIM(NVL(m.tcFurnizor, '')) + ' - ' + ALLTRIM(NVL(m.tcNrAct, '')) + ' - ' + m.lcSuma + ' lei' + ;
' (ESC opreste coada dupa documentul curent)'
ENDPROC
*!* Mesajul de refuz cand numarul de facturi bifate eligibile depaseste plafonul
PROCEDURE MesajPlafon
LPARAMETERS tnTotal
RETURN 'Sunt bifate ' + ALLTRIM(STR(m.tnTotal)) + ' facturi eligibile, peste plafonul de ' + ;
ALLTRIM(STR(This.nPlafon)) + ' facturi pe o rulare a cozii.' + CHR(13) + ;
'Debifati o parte din facturi si porniti coada din nou.'
ENDPROC
*!* Mesajul de confirmare inainte de a porni coada pe N facturi
PROCEDURE MesajConfirmare
LPARAMETERS tnTotal
RETURN 'Se vor contabiliza ' + ALLTRIM(STR(m.tnTotal)) + ' facturi, una dupa alta.' + CHR(13) + ;
'Fiecare document va fi aratat pentru confirmare inainte de scriere.' + CHR(13) + ;
'Se poate opri coada cu ESC intre facturi sau la intrebarea de dupa un document nereusit. Continuati?'
ENDPROC
*!* Linia de raport cand operatorul a oprit coada, cu numarul de facturi ramase neprocesate
*!* tcCauza: cum s-a oprit coada; implicit ESC, apasat intre doua documente
PROCEDURE MesajOprire
LPARAMETERS tnRamase, tcCauza
RETURN 'operatorul a oprit coada ' + IIF(EMPTY(NVL(m.tcCauza, '')), 'cu ESC', ALLTRIM(m.tcCauza)) + ;
' - ' + ALLTRIM(STR(m.tnRamase)) + ' facturi bifate raman neprocesate'
ENDPROC
*!* Intrebarea pusa operatorului dupa un document nereusit, singura cale de a opri lotul cat
*!* timp un formular modal de introducere consuma tastatura (ESC nu ajunge la bucla cozii)
PROCEDURE MesajContinuare
LPARAMETERS tcMotiv, tnRamase
RETURN 'Documentul nu a fost creat: ' + ALLTRIM(NVL(m.tcMotiv, '')) + CHR(13) + CHR(10) + CHR(13) + CHR(10) + ;
'Continuati cu celelalte ' + ALLTRIM(STR(m.tnRamase)) + ' facturi bifate?'
ENDPROC
PROCEDURE CreeazaRaport
IF USED('crsCoadaRaport')
USE IN crsCoadaRaport
ENDIF
CREATE CURSOR crsCoadaRaport (id_efactura N(20), numar_act V(30), furnizor V(200), stare V(10), motiv V(200))
ENDPROC
PROCEDURE AdaugaRaport
LPARAMETERS tnIdEfactura, tcNumarAct, tcFurnizor, tcStare, tcMotiv
LOCAL lcSelect
IF !USED('crsCoadaRaport')
RETURN .F.
ENDIF
lcSelect = SELECT()
INSERT INTO crsCoadaRaport (id_efactura, numar_act, furnizor, stare, motiv) ;
VALUES (m.tnIdEfactura, ALLTRIM(NVL(m.tcNumarAct, '')), ALLTRIM(NVL(m.tcFurnizor, '')), m.tcStare, NVL(m.tcMotiv, ''))
SELECT (m.lcSelect)
RETURN .T.
ENDPROC
*!* Raport final pe document, ramane deschis dupa ce coada s-a terminat
PROCEDURE AfiseazaRaport
IF !USED('crsCoadaRaport')
RETURN .F.
ENDIF
AMESSAGEBOX(This.MesajRaport(), 0+64, _screen.Caption)
RETURN .T.
ENDPROC
*!* Textul rezumatului cozii, compus pe crsCoadaRaport (randuri OK/SARIT/ESEC pe documente,
*!* randul OPRIT cu id_efactura=0 e marcaj de intrerupere, nu document). Plafon 15 documente
*!* listate la problemele SARIT/ESEC, apoi un rand "... si inca N."
PROCEDURE MesajRaport
LOCAL lcSelect, lnOk, lnSarit, lnEsec, lnListate, lcOprit, laLinii[200], lnL, lcText, lnI
IF !USED('crsCoadaRaport')
RETURN ''
ENDIF
lcSelect = SELECT()
SELECT crsCoadaRaport
lnOk = 0
lnSarit = 0
lnEsec = 0
lnListate = 0
lcOprit = ''
lnL = 0
SCAN
DO CASE
CASE ALLTRIM(stare) == 'OK'
lnOk = lnOk + 1
CASE ALLTRIM(stare) == 'SARIT' OR ALLTRIM(stare) == 'ESEC'
IF ALLTRIM(stare) == 'SARIT'
lnSarit = lnSarit + 1
ELSE
lnEsec = lnEsec + 1
ENDIF
IF lnListate < 15
lnL = lnL + 1
laLinii[m.lnL] = ALLTRIM(NVL(numar_act,'')) + ' / ' + ALLTRIM(NVL(furnizor,''))
IF !EMPTY(ALLTRIM(NVL(motiv,'')))
lnL = lnL + 1
laLinii[m.lnL] = ' ' + ALLTRIM(NVL(motiv,''))
ENDIF
lnListate = lnListate + 1
ENDIF
CASE ALLTRIM(stare) == 'OPRIT'
lcOprit = ALLTRIM(NVL(motiv,''))
ENDCASE
ENDSCAN
SELECT (m.lcSelect)
lcText = 'Coada de contabilizare - ' + ALLTRIM(STR(m.lnOk + m.lnSarit + m.lnEsec)) + ' facturi' + CHR(13) + CHR(10) + CHR(13) + CHR(10) + ;
'Contabilizate : ' + ALLTRIM(STR(m.lnOk)) + CHR(13) + CHR(10) + ;
'Sarite : ' + ALLTRIM(STR(m.lnSarit)) + CHR(13) + CHR(10) + ;
'Nereusite : ' + ALLTRIM(STR(m.lnEsec))
IF m.lnSarit + m.lnEsec > 0
lcText = m.lcText + CHR(13) + CHR(10) + CHR(13) + CHR(10) + 'Nu s-au contabilizat:'
FOR lnI = 1 TO m.lnL
lcText = m.lcText + CHR(13) + CHR(10) + laLinii[m.lnI]
ENDFOR
IF m.lnSarit + m.lnEsec > m.lnListate
lcText = m.lcText + CHR(13) + CHR(10) + '... si inca ' + ALLTRIM(STR(m.lnSarit + m.lnEsec - m.lnListate)) + '.'
ENDIF
ENDIF
IF !EMPTY(m.lcOprit)
lcText = m.lcText + CHR(13) + CHR(10) + CHR(13) + CHR(10) + m.lcOprit
ENDIF
RETURN m.lcText
ENDPROC
*!* Contoare pentru bara de lot, calculate local pe cursorul deja incarcat (fara interogare
*!* Oracle): total bifate si suma lor, cate intra in Import N bifate (eligibile, neimportate),
*!* cate in Anuleaza N documente (deja au document), cate raman doar pentru import individual
*!* (bifate, neeligibile lot, neimportate inca); nGata/nTotal = "gata de import: N din M" pe tot
*!* cursorul afisat, indiferent de bifa (eligibile si neimportate / toate randurile)
PROCEDURE ContorBifate
LPARAMETERS tcAlias
LOCAL lcSelect, lnRecno, loContor
lcSelect = SELECT()
loContor = CREATEOBJECT('Empty')
ADDPROPERTY(loContor, 'nBifate', 0)
ADDPROPERTY(loContor, 'nSuma', 0)
ADDPROPERTY(loContor, 'nIndividual', 0)
ADDPROPERTY(loContor, 'nImport', 0)
ADDPROPERTY(loContor, 'nAnulare', 0)
ADDPROPERTY(loContor, 'nGata', 0)
ADDPROPERTY(loContor, 'nTotal', 0)
ADDPROPERTY(loContor, 'nGestiune', 0)
SELECT (m.tcAlias)
lnRecno = RECNO()
loContor.nTotal = RECCOUNT()
SCAN FOR NVL(eligibil_lot,1) = 1 AND NVL(id_fact,0) = 0
loContor.nGata = loContor.nGata + 1
ENDSCAN
SELECT (m.tcAlias)
SCAN FOR !EMPTY(NVL(gest,''))
loContor.nGestiune = loContor.nGestiune + 1
ENDSCAN
SELECT (m.tcAlias)
SCAN FOR ales = 1
loContor.nBifate = loContor.nBifate + 1
loContor.nSuma = loContor.nSuma + NVL(total_cu_tva, 0)
IF NVL(id_fact, 0) <> 0
loContor.nAnulare = loContor.nAnulare + 1
ELSE
IF NVL(eligibil_lot, 1) = 1
loContor.nImport = loContor.nImport + 1
ELSE
loContor.nIndividual = loContor.nIndividual + 1
ENDIF
ENDIF
ENDSCAN
TRY
GO m.lnRecno
CATCH
GO TOP
ENDTRY
SELECT (m.lcSelect)
RETURN loContor
ENDPROC
ENDDEFINE
*!* Culoarea celulei de analitic (grid detalii eFactura): rosu daca contul cere analitic activ si acont e gol,
*!* apoi tiparul existent ISTORIC/APROX/alb; foloseste cursorul cAnaliticCerut deschis de forma, daca exista.
PROCEDURE CuloareAnaliticLipsaEF
LPARAMETERS tcCont, tcAcont, tcSursaCont
IF !EMPTY(NVL(m.tcCont,'')) AND EMPTY(NVL(m.tcAcont,'')) AND USED('cAnaliticCerut') AND INDEXSEEK(m.tcCont,.F.,'cAnaliticCerut','cont')
RETURN RGB(255,205,205)
ENDIF
IF NVL(m.tcSursaCont,'') == 'ISTORIC'
RETURN RGB(255,228,196)
ENDIF
IF NVL(m.tcSursaCont,'') == 'APROX'
RETURN RGB(255,255,240)
ENDIF
RETURN RGB(255,255,255)
ENDPROC