Borderoul tine per factura ce mai are de completat si daca are articole de gestiune (camp gest, coloana si filtru), coada contabilizeaza in serie facturile bifate si incheie cu un rezumat, iar contul de furnizor/client se alege din planul de conturi. Cheia normalizata de articol, rezolvarea automata a partenerului si anularea in bloc intra tot aici. Pozitia in lista se pastreaza peste reaplicarea filtrului. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aroafxp4z8bmM5oVECZRXY
509 lines
18 KiB
Plaintext
509 lines
18 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: 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
|
|
|
|
*!* 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
|