* 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: 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