Patch level : 4.0 874

Files correlati     :  ve0.exe ve6.exe
Ricompilazione Demo : [ ]
Commento     :

Contabilizzazione con il nuovo campo TIPODETR


git-svn-id: svn://10.65.10.50/trunk@16077 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2008-02-01 06:39:03 +00:00
parent 0a72e7fbad
commit 27b55778b9
10 changed files with 289 additions and 338 deletions

View File

@ -384,88 +384,22 @@ bool TConti_array::remove_iva(bool det)
} }
real TMovimentoPN::indetraibile_al(const TString& codind, const TCausale& caus, int annodoc) const real TMovimentoPN::indetraibile_al(const TString& codind, const TCausale& caus, int annodoc) const
{ {
real perc; int tipodet;
if (caus.iva() == iva_acquisti) // Vendite sempre detraibili return ::indetraibile_al(codind, caus, annodoc, tipodet);
{
// Se prorata = 100% e' indetraibile
const bool prorata100 = caus.reg().prorata100(annodoc);
if (prorata100)
perc = CENTO;
else
{
if (codind.full())
{
const TRectype& rec = cache().get("%DET", codind);
if (rec.empty())
{
if (strchr("139", codind[0]) != NULL) // Clausola di salvaguardia
perc = CENTO;
}
else
{
if (rec.get_int("I0") > 0)
perc = rec.get_real("R0");
}
}
}
}
return perc;
} }
int TMovimentoPN::analizza_riga_IVA(const real& imptot, const real& ivatot, const TCausale& caus, int TMovimentoPN::analizza_riga_IVA(const real& imptot, const real& ivatot, const TCausale& caus,
int annodoc, const TString& codiva, const TString& codind, int annodoc, const TString& codiva, const TString& codind,
real& imp_det, real& iva_det, real& imp_ind, real& iva_ind) const real& imp_det, real& iva_det, real& imp_ind, real& iva_ind) const
{ {
int flag = 0;
const real perc_ind = indetraibile_al(codind, caus, annodoc); const real perc_ind = indetraibile_al(codind, caus, annodoc);
if (perc_ind <= ZERO) const bool corrispettivo = caus.corrispettivi();
{ TBill billind; caus.bill(RIGA_IVA_NON_DETRAIBILE, billind);
flag = 1; const bool iva_ind_al_costo = !billind.ok();
imp_det = imptot; return analizza_IVA(imptot, ivatot, perc_ind, corrispettivo, iva_ind_al_costo,
iva_det = ivatot; codiva, imp_det, iva_det, imp_ind, iva_ind);
if (iva_det.is_zero() && caus.corrispettivi())
{
const TCodiceIVA iva(codiva);
iva_det = iva.scorpora(imp_det);
}
imp_ind = iva_ind = ZERO;
}
else
{
if (perc_ind >= CENTO)
{
flag = 2;
imp_ind = imptot;
iva_ind = ivatot;
imp_det = iva_det = ZERO;
}
else
{
flag = 3;
const int decimali = TCurrency::get_firm_dec();
imp_ind = imptot * perc_ind / CENTO; imp_ind.round(decimali);
imp_det = imptot - imp_ind;
const TCodiceIVA iva(codiva);
iva_ind = iva.imposta(imp_ind, decimali);
iva_det = ivatot - iva_ind;
}
if (!iva_ind.is_zero())
{
TBill billind; caus.bill(RIGA_IVA_NON_DETRAIBILE, billind);
if (!billind.ok())
{
imp_ind += iva_ind;
iva_ind = ZERO;
}
}
}
return flag;
} }
// Aggiusta i row types se sono andati persi o non sono stati convertiti // Aggiusta i row types se sono andati persi o non sono stati convertiti

View File

@ -5,6 +5,10 @@
#include "cg2103.h" #include "cg2103.h"
#endif #endif
#ifndef __CGLIB03_H
#include "cglib03.h"
#endif
#ifndef __RECARRAY_H #ifndef __RECARRAY_H
#include <recarray.h> #include <recarray.h>
#endif #endif
@ -25,6 +29,7 @@
#include <rmoviva.h> #include <rmoviva.h>
#endif #endif
class TMovimentoPN : public TRelation class TMovimentoPN : public TRelation
{ {
// class TMovimentoPN : public TRelation // class TMovimentoPN : public TRelation
@ -41,10 +46,10 @@ protected:
int registra(bool re, bool force); int registra(bool re, bool force);
int read_mov_rows(); int read_mov_rows();
real indetraibile_al(const TString& codind, const TCausale& caus, int annodoc) const;
// @END // @END
public: public:
real indetraibile_al(const TString& codind, const TCausale& caus, int annodoc) const;
// @FPUB // @FPUB
virtual int next(TReclock lockop = _nolock) { return (file().next(lockop) || read_mov_rows()); } virtual int next(TReclock lockop = _nolock) { return (file().next(lockop) || read_mov_rows()); }
virtual int prev(TReclock lockop = _nolock) { return (file().prev(lockop) || read_mov_rows()); } virtual int prev(TReclock lockop = _nolock) { return (file().prev(lockop) || read_mov_rows()); }

View File

@ -1,10 +1,119 @@
#include "cg2103.h"
#include "cglib03.h" #include "cglib03.h"
#include <diction.h> #include <diction.h>
#include <recarray.h> #include <recarray.h>
#include <mov.h>
#include <rmoviva.h> #include <rmoviva.h>
static int codind2tipodet(const TString & codind, real& perc)
{
int tipodet = 0;
perc = ZERO;
if (codind.full())
{
const TRectype& rec = cache().get("%DET", codind);
if (rec.empty())
{
if (strchr("139", codind[0]) != NULL) // Clausola di salvaguardia
{
tipodet = codind[0]-'0';
perc = CENTO;
}
}
else
{
tipodet = rec.get_int("I0");
if (tipodet > 0)
perc = rec.get_real("R0");
}
}
return tipodet;
}
real indetraibile_al(const TString& codind, const TCausale& caus, int annodoc, int & tipodet)
{
real perc;
tipodet = 0;
if (caus.iva() == iva_acquisti) // Vendite sempre detraibili
{
// Se prorata = 100% e' indetraibile
const bool prorata100 = caus.reg().prorata100(annodoc);
if (prorata100)
{
perc = CENTO;
tipodet = 9;
}
else
tipodet = codind2tipodet(codind, perc);
}
return perc;
}
int analizza_IVA(const real& imptot, const real& ivatot, const real perc_ind,
const bool corrispettivo, const bool iva_ind_al_costo, const TString& codiva,
real& imp_det, real& iva_det, real& imp_ind, real& iva_ind)
{
int flag = 0;
if (perc_ind <= ZERO)
{
flag = 1;
imp_det = imptot;
iva_det = ivatot;
if (iva_det.is_zero() && corrispettivo)
{
const TCodiceIVA iva(codiva);
iva_det = iva.scorpora(imp_det);
}
imp_ind = iva_ind = ZERO;
}
else
{
if (perc_ind >= CENTO)
{
flag = 2;
imp_ind = imptot;
iva_ind = ivatot;
imp_det = iva_det = ZERO;
}
else
{
flag = 3;
const int decimali = TCurrency::get_firm_dec();
imp_ind = imptot * perc_ind / CENTO; imp_ind.round(decimali);
imp_det = imptot - imp_ind;
const TCodiceIVA iva(codiva);
iva_ind = iva.imposta(imp_ind, decimali);
iva_det = ivatot - iva_ind;
}
if (!iva_ind.is_zero() && iva_ind_al_costo)
{
imp_ind += iva_ind;
iva_ind = ZERO;
}
}
return flag;
}
// Anticamente TIPODET conteneva in tipo di indetraibilita,
// ora invece trattasi di un codice di indetraibilita'
// associato ad un motivo ed una percentuale di indetraibilita'
int get_tipodet_from_rmi(const TRectype& rmi, const TRectype& mov,real& percind)
{
const TCausale c(mov.get(MOV_CODCAUS));
const int annodoc = mov.get_date(MOV_DATAREG).year();
int tipodet;
percind = indetraibile_al(rmi.get(RMI_TIPODET), c, annodoc, tipodet);
return tipodet;
}
/////////////////////////////////// ///////////////////////////////////
// classe TInteressi_IVA_table // // classe TInteressi_IVA_table //
// per la lettura versamenti e // // per la lettura versamenti e //
@ -259,36 +368,3 @@ TIva_round::TIva_round()
_decimals = _def_decimals; _decimals = _def_decimals;
} }
int codind2tipodet(const char codind, real& perc)
{
int tipodet = 0;
perc = ZERO;
if (isalnum(codind))
{
const char strind[2] = { codind, '\0' };
const TRectype& rec = cache().get("%DET", strind);
if (rec.empty())
{
if (strchr("139", codind) != NULL) // Clausola di salvaguardia
{
tipodet = codind-'0';
perc = CENTO;
}
}
else
{
tipodet = rec.get_int("I0");
if (tipodet > 0)
perc = rec.get_real("R0");
}
}
return tipodet;
}
// Anticamente TIPODET conteneva in tipo di indetraibilita,
// ora invece trattasi di un codice di indetraibilita'
// associato ad un motivo ed una percentuale di indetraibilita'
int get_tipodet_from_rmi(const TRectype& rmi, real& percind)
{
return codind2tipodet(rmi.get_char(RMI_TIPODET), percind);
}

View File

@ -3,6 +3,10 @@
#ifndef __CGLIB03_H #ifndef __CGLIB03_H
#define __CGLIB03_H #define __CGLIB03_H
#ifndef __CG2103_H
#include "cg2103.h"
#endif
#ifndef __TABUTIL_H #ifndef __TABUTIL_H
#include <tabutil.h> #include <tabutil.h>
#endif #endif
@ -146,7 +150,12 @@ public: // High level functions (common usage)
TIva_round(); TIva_round();
}; };
int codind2tipodet(char codind, real& percind); real indetraibile_al(const TString& codind, const TCausale& caus, int annodoc,
int get_tipodet_from_rmi(const TRectype& rmi, real& percind); int& tipodet);
int analizza_IVA(const real& imptot, const real& ivatot, const real perc_ind,
const bool corrispettivo, const bool iva_ind_al_costo, const TString& codiva,
real& imp_det, real& iva_det, real& imp_ind, real& iva_ind);
int get_tipodet_from_rmi(const TRectype& rmi, const TRectype& mv, real& percind);
#endif #endif

View File

@ -426,8 +426,6 @@ public:
const int decr_perc_prezzo() const { return _decrp;} const int decr_perc_prezzo() const { return _decrp;}
bool formfeed() const { return get_bool("B0"); } bool formfeed() const { return get_bool("B0"); }
int detraibilita() const { return get_int("I0"); }
real perc_indetraibilita() const { return get_real("R0"); }
TFormula_documento* first_formula() { return succ_formula(true); } TFormula_documento* first_formula() { return succ_formula(true); }
TFormula_documento* succ_formula(bool restart = FALSE); TFormula_documento* succ_formula(bool restart = FALSE);
@ -907,4 +905,4 @@ public:
virtual ~TDocumento_mask(); virtual ~TDocumento_mask();
}; };
#endif #endif

View File

@ -1,5 +1,6 @@
#include <dongle.h> #include <dongle.h>
#include <modaut.h> #include <modaut.h>
#include <tabutil.h>
#include <utility.h> #include <utility.h>
#include "../cg/cg2103.h" #include "../cg/cg2103.h"
@ -1047,6 +1048,23 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const
rm.put(RMOVMAG_TIPORIGA, (char) riga_dadocumento); rm.put(RMOVMAG_TIPORIGA, (char) riga_dadocumento);
} }
} }
const TString & indetr = r.get(RDOC_TIPODET);
if (indetr.full())
{
const TRectype & det = cache().get("%DET", indetr);
if (!det.empty() && !det.get_bool("FPC"))
{
TTable tab("%DET");
tab.curr() = det;
tab.curr().put("FPC", "X");
tab.rewrite();
}
}
} }
mov.rewrite(m); mov.rewrite(m);
} }
@ -2656,4 +2674,4 @@ int TDocumento::tipo_riclassificato() const
tipo_riclassificato = TTipo_documento::_fattura; tipo_riclassificato = TTipo_documento::_fattura;
} }
return tipo_riclassificato; return tipo_riclassificato;
} }

View File

@ -136,16 +136,22 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno,
{ {
const TString4 tipodoc = head.get(DOC_TIPODOC); const TString4 tipodoc = head.get(DOC_TIPODOC);
const TString4 statodoc = head.get(DOC_STATO); const TString4 statodoc = head.get(DOC_STATO);
bool match = FALSE; bool match = false;
for (int i = tipidoc.items()-1; i>=0; i--) for (int i = tipidoc.items()-1; i>=0; i--)
{ {
if (tipodoc == tipidoc.get(i)) const TString & tipo = tipidoc.get(i);
if (statodoc == statidoc.get(i))
if (tipo.blank() || tipodoc == tipo)
{
const TString & stato = statidoc.get(i);
if (stato.blank() || statodoc == stato)
{ {
match = TRUE; match = true;
break; break;
} }
}
} }
if (match) if (match)

View File

@ -493,8 +493,8 @@ class TContabilizzazione_analitica : public TElaborazione // velib04f
bool _usepdcc; bool _usepdcc;
protected: protected:
bool find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti); bool find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti, int annoes);
bool find_conti(const TRiga_documento& riga, TString_array& conti); bool find_conti(const TRiga_documento& riga, TString_array& conti, int annoes);
void init(); void init();
const TCausale& doc2caus(const TDocumento& doc); const TCausale& doc2caus(const TDocumento& doc);

View File

@ -62,20 +62,6 @@ TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type)
return importo; return importo;
} }
bool TMovimentoPN_VE::detraibile(TRectype& rec) const
{
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
if (_caus->iva() == iva_vendite)
return true;
if (rec.get_int(RMI_TIPODET) != 0)
return false;
const int annodoc = curr().get_date(MOV_DATADOC).year();
const bool prorata100 = _caus->reg().prorata100(annodoc);
return !prorata100; // Se prorata = 100% e' indetraibile
}
int TMovimentoPN_VE::bill2pos(const TBill& conto, char tipo) int TMovimentoPN_VE::bill2pos(const TBill& conto, char tipo)
{ {
const int items = cg_items(); const int items = cg_items();
@ -205,154 +191,121 @@ int TMovimentoPN_VE::insert_cg_rec(int n, const TImporto& imp, TBill& conto,
return set_cg_rec(n, imp, conto, desc, tipo); return set_cg_rec(n, imp, conto, desc, tipo);
} }
void TMovimentoPN_VE::create_row(int i, const TString & descr_cr)
{
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
TRectype& cur = iva(i);
real oldimp = cur.get_real(RMI_IMPONIBILE);
real oldiva = cur.get_real(RMI_IMPOSTA);
if (oldiva.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ...
{
const TString4 zanicchi(cur.get(RMI_CODIVA)); // Codice IVA
const TCodiceIVA i(zanicchi);
oldiva = i.scorpora(oldimp); // ... scorpora imposta dall'imponibile
}
const char tipod = detraibile(cur) ? 'D' : 'N';
if (type2pos(tipod) < 0 && !oldiva.is_zero())
{
const int ri = tipod == 'D' ? RIGA_IVA_DETRAIBILE : RIGA_IVA_NON_DETRAIBILE;
TBill c; _caus->bill(ri, c);
if (c.ok())
{
const TString80 d(_caus->desc_agg(ri));
set_cg_rec(-1, real2imp(ZERO, 'I'), c, d, tipod);
}
else
if (ri == RIGA_IVA_NON_DETRAIBILE) // Se non esiste il conto IVA indetraibile ...
{ // ... somma imponibile e imposta
oldimp += oldiva;
oldiva = 0.0;
}
}
const TBill oldconto(cur);
if (oldconto.ok())
{
if (bill2pos(oldconto, 'I') < 0)
{
const TString80 d(_caus->desc_agg(2));
set_cg_rec(-1, real2imp(ZERO, 'I'), oldconto, d.empty() ? descr_cr: d, 'I');
}
}
}
void TMovimentoPN_VE::enter_row(int i, const TString & descr_cr) void TMovimentoPN_VE::enter_row(int i, const TString & descr_cr)
{ {
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!"); CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
TRectype& cur = iva(i); TRectype& cur = iva(i);
real imponibile = cur.get_real(RMI_IMPONIBILE); real imponibile = cur.get_real(RMI_IMPONIBILE);
real imposta = cur.get_real(RMI_IMPOSTA); real imposta = cur.get_real(RMI_IMPOSTA);
const int anno = lfile().curr().get_date(MOV_DATAREG).year();
const TString4 tipodet = cur.get(RMI_TIPODET);
const TString4 zanicchi(cur.get(RMI_CODIVA)); // Codice IVA
if (imposta.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ... if (imposta.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ...
{ {
const TString4 zanicchi(cur.get(RMI_CODIVA));
const TCodiceIVA i(zanicchi); const TCodiceIVA i(zanicchi);
imposta = i.scorpora(imponibile); // ... scorpora imposta dall'imponibile imposta = i.scorpora(imponibile); // ... scorpora imposta dall'imponibile
} }
const TBill conto(cur);
int newpos = bill2pos(conto, 'I'); // Riga in cui andra' l'imponibile
const bool detrarre = detraibile(cur); // Determina se IVA detraibile
// Calcola riga causale col conto opportuno // Calcola riga causale col conto opportuno
const int ri = detrarre ? RIGA_IVA_DETRAIBILE : RIGA_IVA_NON_DETRAIBILE; real imp, impind, iva, ivaind;
TBill contoiva; _caus->bill(ri, contoiva); int flag = analizza_riga_IVA(imponibile, imposta, *_caus, anno, zanicchi, tipodet, imp, iva, impind, ivaind);
const TBill conto(cur);
if (ri == RIGA_IVA_NON_DETRAIBILE && !contoiva.ok()) // Se non c'e' il conto IVA indetraibile ... TBill contoivaind;
{ // ... somma imponibile e imposta
imponibile += imposta; _caus->bill(RIGA_IVA_NON_DETRAIBILE, contoivaind);
imposta = 0.0; imponibile = imp + impind;
} if (conto.ok() && !imponibile.is_zero()) // Se c'e' imponibile ...
{ // crea una nuova riga contabile
// Aggiorna conto sulla riga contabile // Aggiorna conto sulla riga contabile
if (newpos < 0) // conto non esistente: da inserire const TImporto val(real2imp(imponibile, 'I'));
{ const int newpos = bill2pos(conto, 'I'); // Riga in cui andra' l'imponibile
const TImporto val(real2imp(imponibile, 'I'));
if (conto.ok() && !val.is_zero()) // Se c'e' imponibile ... if (newpos < 0) // conto non esistente: da inserire
{ // crea una nuova riga contabile {
const TString d(_caus->desc_agg(2)); const TString d(_caus->desc_agg(2));
set_cg_rec(-1, val, conto, d.empty() ? descr_cr : d, 'I'); set_cg_rec(-1, val, conto, d.empty() ? descr_cr : d, 'I');
} }
else
add_cg_rec(newpos, val);
cur.put(RMI_RIGAIMP, newpos+1); // Aggiorna riferimento alla riga contabile
} }
else
{
TImporto val(real2imp(imponibile, 'I'));
add_cg_rec(newpos, val);
}
cur.put(RMI_RIGAIMP, newpos+1); // Aggiorna riferimento alla riga contabile
// Aggiorna conto IVA sulla riga contabile // Aggiorna conto IVA sulla riga contabile
const char tipod = detrarre ? 'D' : 'N'; if (!iva.is_zero()) // Se c'e' imposta ...
int newposiva = type2pos(tipod); {
int newposiva = type2pos('D');
const TImporto val(real2imp(iva, 'I'));
if (newposiva < 0) if (newposiva < 0)
{ {
if (!imposta.is_zero()) // Se c'e' imposta ... const TString80 d(_caus->desc_agg(RIGA_IVA_DETRAIBILE));
{ // ... crea nuova riga per l'IVA TBill contoiva;
const TImporto val(real2imp(imposta, 'I'));
const TString80 d(_caus->desc_agg(ri)); _caus->bill(RIGA_IVA_DETRAIBILE, contoiva);
newposiva = set_cg_rec(-1, val, contoiva, d, tipod); if (contoiva.ok())
} newposiva = set_cg_rec(-1, val, contoiva, d, 'D');
} }
else else
{ add_cg_rec(newposiva, val);
const TImporto val(real2imp(imposta, 'I')); }
add_cg_rec(newposiva, val);
} if (!ivaind.is_zero()) // Se c'e' imposta ...
{
int newposiva = type2pos('N');
const TImporto val(real2imp(ivaind, 'I'));
TBill contoivaind;
_caus->bill(RIGA_IVA_NON_DETRAIBILE, contoivaind);
if (newposiva < 0)
{
const TString80 d(_caus->desc_agg(RIGA_IVA_NON_DETRAIBILE));
newposiva = set_cg_rec(-1, val, contoivaind, d, 'N');
}
else
add_cg_rec(newposiva, val);
}
} }
void TMovimentoPN_VE::add_row_re(int i) void TMovimentoPN_VE::add_row_re(int i)
{ {
TRectype& cur = iva(i); TRectype& cur = iva(i);
real oldimp = cur.get_real(RMI_IMPONIBILE); real imponibile = cur.get_real(RMI_IMPONIBILE);
real oldiva = cur.get_real(RMI_IMPOSTA); real imposta = cur.get_real(RMI_IMPOSTA);
const int anno = lfile().curr().get_date(MOV_DATAREG).year();
const char tipod = detraibile(cur) ? 'D' : 'N'; const TString4 tipodet = cur.get(RMI_TIPODET);
const TString4 zanicchi(cur.get(RMI_CODIVA)); // Codice IVA
real imp, impind, iva, ivaind;
TBill c; analizza_riga_IVA(imponibile, imposta, *_caus, anno, zanicchi, tipodet, imp, iva, impind, ivaind);
if (tipod == 'N' && !oldiva.is_zero()) imponibile = imp + impind;
if (!ivaind.is_zero())
{ {
_caus->bill(RIGA_IVA_NON_DETRAIBILE, c); TBill contoivaind;
if (c.ok())
{ _caus->bill(RIGA_IVA_NON_DETRAIBILE, contoivaind);
int ivapos = bill2pos(c, 'I'); const TImporto val(real2imp(ivaind, 'I'));
if (ivapos < 0) int ivapos = bill2pos(contoivaind, 'I');
ivapos= set_cg_rec(-1, real2imp(ZERO, 'I'), c, "", 'I');
if (ivapos < 0)
const TImporto val(real2imp(oldiva, 'I')); set_cg_rec(-1, val, contoivaind, "", 'I');
add_cg_rec(ivapos, val);
}
else else
oldimp += oldiva; add_cg_rec(ivapos, val);
} }
const int gr = cur.get_int(RMI_GRUPPO); const TBill conto(cur);
const int co = cur.get_int(RMI_CONTO); int newpos = bill2pos(conto, ' '); // Riga in cui andra' l'imponibile
const long so = cur.get_long(RMI_SOTTOCONTO);
c.set(gr,co,so); if (conto.ok() && !imponibile.is_zero())
if (c.ok())
{ {
int poscg = bill2pos(c, ' '); const TImporto val(real2imp(imponibile, 'I'));
if (poscg < 0)
poscg = set_cg_rec(-1, real2imp(ZERO, 'I'), c, _caus->desc_agg(2), ' '); if (newpos < 0)
set_cg_rec(-1, val, conto, _caus->desc_agg(2), ' ');
const TImporto val(real2imp(oldimp, 'I')); else
add_cg_rec(poscg, val); add_cg_rec(newpos, val);
} }
} }
@ -481,10 +434,7 @@ int TMovimentoPN_VE::recalc_cg_rows(const TString & descr_cr, TCausale & caus)
set_caus(&caus); set_caus(&caus);
for (int i=0; i<righe; i++) for (int i=0; i<righe; i++)
{
create_row(i, descr_cr);
enter_row(i, descr_cr); enter_row(i, descr_cr);
}
bool ok = true; bool ok = true;
if (_caus->intra() && _caus->iva() == iva_acquisti) if (_caus->intra() && _caus->iva() == iva_acquisti)
{ {
@ -633,7 +583,6 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i
TBill c(conto); TBill c(conto);
int ord = 0; int ord = 0;
int detr = 0; int detr = 0;
real pind = ZERO;
real impon; real impon;
const bool sconto_lordo = t.tipo() != RIGA_SCONTI && _contsclor && _sco_perc_bill.ok(); const bool sconto_lordo = t.tipo() != RIGA_SCONTI && _contsclor && _sco_perc_bill.ok();
const int firmdec = TCurrency::get_firm_dec(); const int firmdec = TCurrency::get_firm_dec();
@ -723,18 +672,6 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i
real imposta = tiva.imposta(impon, ndec); real imposta = tiva.imposta(impon, ndec);
if (_caus->iva() == iva_acquisti || _caus->iva() == nessuna_iva)
{
detr = t.detraibilita();
pind = t.perc_indetraibilita();
}
real impres = (impon * pind) / CENTO;
real ivares = (imposta * pind) / CENTO;
impres.round(firmdec); // was ndec
ivares.round(firmdec); // was ndec
// Le righe di sconto ad importo o percentuale vanno saltate // Le righe di sconto ad importo o percentuale vanno saltate
// Casistica sulle righe omaggio: // Casistica sulle righe omaggio:
// quelle che non hanno addebito IVA devono venire scartate, quelle che hanno // quelle che non hanno addebito IVA devono venire scartate, quelle che hanno
@ -742,60 +679,32 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i
// una riga IVA con lo stesso imponibile ma di segno opposto, con un cod. IVA // una riga IVA con lo stesso imponibile ma di segno opposto, con un cod. IVA
// speciale per lo storno, proveniente da configurazione // speciale per lo storno, proveniente da configurazione
if (pind < CENTO) const TString4 tipodet(r.get(RDOC_TIPODET));
{
key.format("%d|%-4s|%c|%3d|%3d|%6ld|%d",
ord,(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), 0);
TRectype * iva = (TRectype *) objptr(key);
if (iva == NULL)
{
iva = new TRectype(LF_RMOVIVA);
iva->put(RMI_CODIVA,cod);
iva->put(RMI_TIPOCR,c.tipo_cr());
iva->put(RMI_INTRA, _caus->intra());
iva->put(RMI_TIPOC, c.tipo());
iva->put(RMI_GRUPPO, c.gruppo());
iva->put(RMI_CONTO, c.conto());
iva->put(RMI_SOTTOCONTO, c.sottoconto());
TAssoc_array::add(key, iva, true);
}
real val = iva->get_real(RMI_IMPONIBILE);
val += (impon - impres); key.format("%d|%-4s|%c|%3d|%3d|%6ld|%s",
iva->put(RMI_IMPONIBILE,val); ord,(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), (const char *) tipodet);
val = iva->get_real(RMI_IMPOSTA); TRectype * iva = (TRectype *) objptr(key);
val += (imposta - ivares);
iva->put(RMI_IMPOSTA, val);
} if (iva == NULL)
if (pind > ZERO)
{ {
key.format("%d|%-4s|%c|%3d|%3d|%6ld|%d",ord, iva = new TRectype(LF_RMOVIVA);
(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), detr); iva->put(RMI_CODIVA,cod);
TRectype * iva = (TRectype *) objptr(key); iva->put(RMI_TIPOCR,c.tipo_cr());
iva->put(RMI_INTRA, _caus->intra());
if (iva == NULL) iva->put(RMI_TIPOC, c.tipo());
{ iva->put(RMI_GRUPPO, c.gruppo());
iva = new TRectype(LF_RMOVIVA); iva->put(RMI_CONTO, c.conto());
iva->put(RMI_CODIVA,cod); iva->put(RMI_SOTTOCONTO, c.sottoconto());
iva->put(RMI_TIPOCR,c.tipo_cr()); TAssoc_array::add(key, iva, true);
iva->put(RMI_INTRA, _caus->intra());
iva->put(RMI_TIPOC, c.tipo());
iva->put(RMI_GRUPPO, c.gruppo());
iva->put(RMI_CONTO, c.conto());
iva->put(RMI_SOTTOCONTO, c.sottoconto());
iva->put(RMI_TIPODET, detr);
TAssoc_array::add(key, iva, true);
}
real val = iva->get_real(RMI_IMPONIBILE);
val += impres;
iva->put(RMI_IMPONIBILE,val);
val = iva->get_real(RMI_IMPOSTA);
val += ivares;
iva->put(RMI_IMPOSTA, val);
} }
real val = iva->get_real(RMI_IMPONIBILE);
val += impon;
iva->put(RMI_IMPONIBILE, val);
iva->put(RMI_TIPODET, tipodet);
val = iva->get_real(RMI_IMPOSTA);
val += imposta;
iva->put(RMI_IMPOSTA, val);
if (ord != 5) if (ord != 5)
{ {
if (sconto_lordo) // Se e' settato il flag di contabilizzare anche gli sconti merce if (sconto_lordo) // Se e' settato il flag di contabilizzare anche gli sconti merce

View File

@ -7,6 +7,7 @@
#include "../ca/movana.h" #include "../ca/movana.h"
#include "../ca/rmovana.h" #include "../ca/rmovana.h"
#include "../ca/rrip.h" #include "../ca/rrip.h"
#include "../cg/cg2101.h"
#include "../cg/cg2103.h" #include "../cg/cg2103.h"
#include "../mg/anamag.h" #include "../mg/anamag.h"
@ -59,16 +60,16 @@ const TCausale& TCache_causali::causale(const TDocumento& doc, const TString & f
} }
if (codcaus.blank()) if (codcaus.blank())
{ {
// Cerca il codice causale sul cliente // Cerca il codice causale sul cliente
const char* const fld = doc.is_nota_credito() ? CFV_CODCAUSNC : CFV_CODCAUS; const char* const fld = doc.is_nota_credito() ? CFV_CODCAUSNC : CFV_CODCAUS;
key.format("%c|%ld", doc.get_char(DOC_TIPOCF), doc.get_long(DOC_CODCF)); key.format("%c|%ld", doc.get_char(DOC_TIPOCF), doc.get_long(DOC_CODCF));
codcaus = cache().get(LF_CFVEN, key, fld); codcaus = cache().get(LF_CFVEN, key, fld);
if (codcaus.blank()) // Se non lo trova guarda sul tipo documento if (codcaus.blank()) // Se non lo trova guarda sul tipo documento
{ {
const TTipo_documento& tipo = doc.tipo(); const TTipo_documento& tipo = doc.tipo();
codcaus = tipo.causale(); codcaus = tipo.causale();
} }
} }
//Assegna l'anno della causale //Assegna l'anno della causale
@ -326,12 +327,12 @@ bool TContabilizzazione_analitica::search_costo_ricavo(const TRiga_documento& r,
return conto.ok() && conto.find(); return conto.ok() && conto.find();
} }
bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti) bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_documento& riga, const TBill & bill, TString_array& conti, int annoes)
{ {
const TString80 riga_cos = riga.codice_costo(); const TString80 riga_cos = riga.codice_costo();
const TString80 riga_cms = riga.codice_commessa(); const TString80 riga_cms = riga.codice_commessa();
const TString16 riga_fsc = riga.fase_commessa(); const TString16 riga_fsc = riga.fase_commessa();
const int annoes = riga.get_int(RDOC_ANNO); // const int annoes = riga.get_int(RDOC_ANNO);
const bool riga_any = riga_cos.full() || riga_cms.full() || riga_fsc.full(); const bool riga_any = riga_cos.full() || riga_cms.full() || riga_fsc.full();
TToken_string conto; TToken_string conto;
@ -374,7 +375,7 @@ bool TContabilizzazione_analitica::find_conti_iva_indetraibile(const TRiga_docum
return !conti.empty(); return !conti.empty();
} }
bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti) bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TString_array& conti, int annoes)
{ {
bool bArcticleFound = false; bool bArcticleFound = false;
@ -431,7 +432,7 @@ bool TContabilizzazione_analitica::find_conti(const TRiga_documento& riga, TStri
const TString80 riga_cos = riga.codice_costo(); const TString80 riga_cos = riga.codice_costo();
const TString80 riga_cms = riga.codice_commessa(); const TString80 riga_cms = riga.codice_commessa();
const TString16 riga_fsc = riga.fase_commessa(); const TString16 riga_fsc = riga.fase_commessa();
const int annoes = riga.get_int(RDOC_ANNO); // const int annoes = riga.get_int(RDOC_ANNO);
const bool riga_any = riga_cos.not_empty() || riga_cms.not_empty() || riga_fsc.not_empty(); const bool riga_any = riga_cos.not_empty() || riga_cms.not_empty() || riga_fsc.not_empty();
if (contanal.blank()) // Non ho trovato il conto in anagrafica ... if (contanal.blank()) // Non ho trovato il conto in anagrafica ...
@ -591,15 +592,10 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
if (tiva != iva_vendite && !riga.is_sconto()) if (tiva != iva_vendite && !riga.is_sconto())
{ {
real pind = ZERO; const TString4 tipodet = riga.get(RDOC_TIPODET);
if (tiva != nessuna_iva) int td;
{ const real pind = indetraibile_al(tipodet, caus, datareg.year(), td);
const int annodoc = doc.get_date(DOC_DATADOC).year();
if (caus.reg().prorata100(annodoc))
pind = CENTO;
}
if (pind == ZERO)
pind = riga.tipo().perc_indetraibilita();
if (pind > ZERO) if (pind > ZERO)
{ {
const real ivaind = (riga.imposta(false) * pind) / CENTO; const real ivaind = (riga.imposta(false) * pind) / CENTO;
@ -608,7 +604,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
if (bill.is_analitico()) if (bill.is_analitico())
{ {
TString_array conti_ind; TString_array conti_ind;
if (find_conti_iva_indetraibile(riga, bill, conti_ind)) //qui if (find_conti_iva_indetraibile(riga, bill, conti_ind,annoes)) //qui
{ {
TGeneric_distrib esso(ivaind, decimals); TGeneric_distrib esso(ivaind, decimals);
@ -642,7 +638,7 @@ bool TContabilizzazione_analitica::elabora(TDocumento& doc, long numreg_cg, TVis
continue; continue;
TString_array conti; TString_array conti;
const bool ok = find_conti(riga, conti); const bool ok = find_conti(riga, conti, annoes);
if (!ok) if (!ok)
{ {
if (viswin != NULL) if (viswin != NULL)