531 lines
19 KiB
Plaintext
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
|