diff --git a/cg/cg7200.cpp b/cg/cg7200.cpp index c789985e6..80c68b4bf 100755 --- a/cg/cg7200.cpp +++ b/cg/cg7200.cpp @@ -281,12 +281,12 @@ protected: int cerca_pagamento(const TBill& bill) const; int cerca_costo(const TBill& bill) const; bool test_swap(TCausale& caus, bool ritsoc) const; - real calcola_pagamento(TRectype& curpag_rec); + real calcola_pagamento(TRectype& curpag_rec, real& iva_indetraibile); bool sottrai_iva(TMovimentoPN& pn, const TRectype& rigaiva); void stringa_grcosot(TRecord_text& recrighe, const TString& zio); long calcola_fattura_originale(long nreg) const; bool calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec, - real& imponibile, real& totdoc, real& totpagato) const; + real& imponibile, real& totdoc, real& totpagato, real& iva_indetraibile) const; public: const real get_importo() {return _importo;} @@ -956,7 +956,7 @@ void TInvioP::lettura_conti(TAssoc_array& assoc, const char tipoconto) } } -bool TInvioP::calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec, real& imponibile, real& totdoc, real& totpagato) const +bool TInvioP::calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec, real& imponibile, real& totdoc, real& totpagato, real& iva_indetraibile) const { totpagato = pag_rec.get_real(PAGSCA_IMPORTO); @@ -1017,7 +1017,12 @@ bool TInvioP::calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec imponibile += importo; if (tipodet.full()) + { + //serve per i casi speciali con fdr in regime fidcale diverso da quello.. + //..della fattura + iva_indetraibile += iva; imponibile += iva; + } else imposta += iva; } @@ -1054,7 +1059,7 @@ bool TInvioP::calcola_imponibile_totdoc(const long nreg, const TRectype& pag_rec return ok; } -real TInvioP::calcola_pagamento(TRectype& curpag_rec) +real TInvioP::calcola_pagamento(TRectype& curpag_rec, real& iva_indetraibile) { //deve costruirsi la riga di partita che riguarda il documento di origine //per prima cosa crea tale riga a partire dal pagamento, che ha una chiave lunghissima... @@ -1075,29 +1080,37 @@ real TInvioP::calcola_pagamento(TRectype& curpag_rec) //dichiariamo una serie di simpatici real utilizzati in seguito real totdoc,imponibile,totpagato; - if (calcola_imponibile_totdoc(nreg, curpag_rec, imponibile, totdoc, totpagato)) + if (calcola_imponibile_totdoc(nreg, curpag_rec, imponibile, totdoc, totpagato, iva_indetraibile)) { const real percentuale = totpagato /totdoc; + //cerca se esiste una fattura da ricevere anteriore alla fattura da pagare const long fdr = calcola_fattura_originale(nreg); + //se la trova deve tenerne conto in quanto la presente fattura (nreg) potrebbe pagare solo.. + //..una parte della fdr originale if (fdr != nreg) { - real imponibile_fdr, totdoc_fdr, totpagato_fdr; - if (calcola_imponibile_totdoc(fdr, curpag_rec, imponibile_fdr, totdoc_fdr, totpagato_fdr)) + real imponibile_fdr, totdoc_fdr, totpagato_fdr, iva_indetraibile_fdr; + //riutilizza la calcola_imponibile_totdoc per l'fdr;si fa notare che in questo caso gli.. + //..ultimi due parametri del metodo sono del tutto inutili + if (calcola_imponibile_totdoc(fdr, curpag_rec, imponibile_fdr, totdoc_fdr, totpagato_fdr, iva_indetraibile_fdr)) { const real rapporto_pagati = totdoc / totdoc_fdr; + const real rapporto_imponibili = imponibile_fdr / imponibile; //la fattura con totdoc paga una parte di una precedente fdr con totdoc maggiore! //in questo caso totpagato e' quello della fattura e deve uscire senza ricalcolare.. - //..percentuali e cazzi vari + //..percentuali e cazzi vari (funziona ststisticamente!) if (rapporto_pagati >= 0.7) imponibile = imponibile_fdr; } } //if(fdr!=nreg.. + else //se non esiste una fdr eventuali ive indetraibili non sussistono + iva_indetraibile = ZERO; //calcolo finale del pagato totpagato = imponibile * percentuale; totpagato.round(2); - } + } //if(calcola_imponibile_totdoc(nreg,... return totpagato; } @@ -1187,17 +1200,20 @@ bool TInvioP::i_proforma_pagamenti() const tipo_movimento tipomov = (tipo_movimento)cur_rec.get_int(MOV_TIPOMOV); if (tipomov == tm_pagamento || tipomov == tm_nota_credito || tipomov == tm_pagamento_insoluto) { + //attraverso le partite,noto il MOV_NUMREG,riesce a collegarsi al pagamento in LF_PAGSCA TRelation relpart(LF_PARTITE); TRectype da(LF_PARTITE); da.put(PART_NREG, cur_rec.get(MOV_NUMREG)); TCursor curpart(&relpart, "", 2, &da, &da); const long curpart_items = curpart.items(); + //se trova la partita relativa al numreg... if (curpart_items != 0) { curpart.freeze(); TRectype& curpart_rec = curpart.curr(); TRelation relpag(LF_PAGSCA); TRectype da(LF_PAGSCA); + //..collega i pagamenti filtrando con i parametri estratti dalle partite for (curpart = 0; curpart.pos() < curpart_items; ++(curpart)) { da.put(PAGSCA_TIPOC, curpart_rec.get(PART_TIPOCF)); @@ -1211,6 +1227,10 @@ bool TInvioP::i_proforma_pagamenti() filtro.format("NRIGP == %d", nrigapart); TCursor curpag(&relpag, filtro, 1, &da, &da); const long curpag_items = curpag.items(); + + real iva_indet = ZERO; //valore dell'eventuale iva indetraibile + + //se trova i pagamenti,che sono alla fin fine cio' che cerca... if (curpag_items != 0) { TAssoc_array pagame; @@ -1230,13 +1250,14 @@ bool TInvioP::i_proforma_pagamenti() pi->_accsal = 'A'; pagame.add(indice, pi); } - const real importo_pagato = calcola_pagamento(curpag_rec); //aggiunta nuova!!! + //ricava l'importo del pagamento e lo aggiunge al memorizzatore + const real importo_pagato = calcola_pagamento(curpag_rec, iva_indet); pi->_somma += importo_pagato; if (curpag_rec.get_char(PAGSCA_ACCSAL) == 'S') pi->_accsal = 'S'; } - // scrivo i record risultanti + // scrive i record risultanti for (TPay_info* pi = (TPay_info*)pagame.first_item(); pi != NULL; pi = (TPay_info*)pagame.succ_item()) { TToken_string keypart; @@ -1252,11 +1273,23 @@ bool TInvioP::i_proforma_pagamenti() _nregcosto = calcola_fattura_originale(nregfatt); _importo = pi->_somma; _accsal = pi->_accsal; - + //..e finalmente scrive 'sta minchia di riga TRecord_text recpag; recpag.set_type("G"); trasfilepag->autoload(recpag, curpag); trasfilepag->write(recpag); + + //se ha una riga di iva indetraibile dovuta al cambio regime fiscale 2005->2006.. + //..deve aggiungere una ulteriore riga!! + if (iva_indet > ZERO) + { + _nregcosto = nregfatt; + _importo = iva_indet; + _accsal = 'S'; + recpag.set_type("G"); + trasfilepag->autoload(recpag, curpag); + trasfilepag->write(recpag); + } } }//if curpag_items..