diff --git a/ha/hacnv100a.ini b/ha/hacnv100a.ini index 1af1ca431..13b8a4f84 100755 --- a/ha/hacnv100a.ini +++ b/ha/hacnv100a.ini @@ -570,7 +570,7 @@ NAVP = CLI_GRUPPO = 4 CLI_CONTO = 101 FOR_GRUPPO = 5 -FOR_CONTO = 600 +FOR_CONTO = 601 GRUPPI_MOV = 7|8 // parametri generali della maschera (dns user password) diff --git a/ha/hacnv200.cpp b/ha/hacnv200.cpp index 661b9bcf0..4e36c0611 100755 --- a/ha/hacnv200.cpp +++ b/ha/hacnv200.cpp @@ -15,6 +15,7 @@ #include #include #include +#include const char* const APPNAME = TR("Conversione movimenti"); @@ -30,7 +31,7 @@ class THardy_movimenti : public THardy_transfer long _kmovcont; // movimento contabile in esame TArray* _righeiva; // array dele righe iva hardy TArray* _righecont; // array delle righe contabili hardy - + TAssoc_array* _ivaind; // array dei codici iva con % di indetraibilità protected: bool scrivi_righe(); @@ -40,7 +41,8 @@ protected: bool test_moviva(); void conto2campo(const TString& hd_tipoc, const TString& hd_key, TString4& tipoc, int& gr, int& co, long& so); void rec2ini(const TRectype& rec); - void recset2rec(TODBC_recordset& recset, TRectype& rec, const TString_array& lista_campi); + void recset2rec(const TODBC_recordset& recset, TRectype& rec, const TString_array& lista_campi); + real get_imponibile(const TRectype& rec); public: virtual bool trasferisci(); @@ -48,7 +50,7 @@ public: }; // carica il record campo con il record hardy in base alla configurazione -void THardy_movimenti::recset2rec(TODBC_recordset& recset, TRectype& rec, const TString_array& lista_campi) +void THardy_movimenti::recset2rec(const TODBC_recordset& recset, TRectype& rec, const TString_array& lista_campi) { TString campo_dest, campo_orig, valore, str; FOR_EACH_ARRAY_ROW(lista_campi,i,row) @@ -317,6 +319,29 @@ bool THardy_movimenti::scrivi_righecont() return true; } +// calcola imponibile della riga iva passata: +// 1. se è una riga con iva indetraibile verifico il conto 4 sulla causale +// se il conto c'è, l'imponibile è imponibile della riga +// se il conto non c'è calcolo iva indetraibile utilizzando la % e la sommo all'imponibile +// 2. se è una riga con iva normale, l'imponibile è imponibliie della riga +real THardy_movimenti::get_imponibile(const TRectype& rec) +{ + real imponibile = rec.get_real(RMI_IMPONIBILE); + const char* codiva = rec.get(RMI_CODIVA); + if (_ivaind->is_key(codiva)) + { + TString16 causale = get_str("IdCausale"); + causale << "|4"; + const TString& gruppo = cache().get(LF_RCAUSALI, causale, RCA_GRUPPO); + if (gruppo.blank()) + { + real& perc = (real&)_ivaind->find(codiva); + imponibile = imponibile+(imponibile*perc)/100; + } + } + return imponibile; +} + // gestisce tutto il procedimento di scrittura su ini delle righe iva e contabili bool THardy_movimenti::scrivi_righe() { @@ -341,7 +366,9 @@ bool THardy_movimenti::scrivi_righe() for (int i=0;i<_righeiva->items();i++) { TRectype& rec_rmoviva = *(TRectype*)_righeiva->objptr(i); - real imponibile = rec_rmoviva.get_real(RMI_IMPONIBILE); + real imponibile = get_imponibile(rec_rmoviva); + + //real imponibile = rec_rmoviva.get_real(RMI_IMPONIBILE); for (int j=0;j<_righecont->items();j++) { TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j); @@ -392,7 +419,7 @@ bool THardy_movimenti::scrivi_righe() _conf->set_paragraph(paragraph); // riga iva rec2ini(rec_rmoviva); } - _righeiva->destroy(i, true); + //_righeiva->destroy(i, true); } _righecont->destroy(); } @@ -406,7 +433,24 @@ bool THardy_movimenti::trasferisci() { // creazione array delle aliquote iva con % indetraibilitaà // leggere la tabella hardy AliquoteIVA + _ivaind->destroy(); + TString query_iva; + query_iva << query_header(); + query_iva << "SELECT * " + "FROM dbo.AliquoteIVA "; + TODBC_recordset recset_iva(query_iva); + for (bool ok=recset_iva.move_first();ok;ok=recset_iva.move_next()) + { + const char* codiva = recset_iva.get("IdIva").as_string(); + real ind = recset_iva.get("Indetraibilita").as_real(); + if (ind != ZERO) + { + real* oggetto = new real(); + _ivaind->add(codiva, (TObject*)oggetto); + } + } + // query su testate movimenti TString16 dastr, astr; dastr.format("%4d-%2d-%2d", _dadata.year(), _dadata.month(), _dadata.day()); astr.format("%4d-%2d-%2d", _adata.year(), _adata.month(), _adata.day()); @@ -494,6 +538,7 @@ THardy_movimenti::THardy_movimenti(const int anno, const TDate dadata, const TDa { _righeiva = new TArray; _righecont = new TArray; + _ivaind = new TAssoc_array; } ///////////////////////////////////////////////////////////