diff --git a/ha/hacnv100a.ini b/ha/hacnv100a.ini index 13b8a4f84..6c6b34274 100755 --- a/ha/hacnv100a.ini +++ b/ha/hacnv100a.ini @@ -482,7 +482,7 @@ DATACOMP = DATADOC = DataDocumento DATA74TER = MESELIQ = -NUMDOC = NumDocumento +NUMDOC = _STREXPR,LEFT(NumDocumento; 7) //TIPODOC = *** conversione FlTipoDocumento CODCAUS = IdCausale DESCR = Descrizione1 @@ -572,6 +572,7 @@ CLI_CONTO = 101 FOR_GRUPPO = 5 FOR_CONTO = 601 GRUPPI_MOV = 7|8 +IVA_ESENTE = 999 // parametri generali della maschera (dns user password) [Main] diff --git a/ha/hacnv200.cpp b/ha/hacnv200.cpp index 4e36c0611..ffc781d2f 100755 --- a/ha/hacnv200.cpp +++ b/ha/hacnv200.cpp @@ -32,6 +32,7 @@ class THardy_movimenti : public THardy_transfer TArray* _righeiva; // array dele righe iva hardy TArray* _righecont; // array delle righe contabili hardy TAssoc_array* _ivaind; // array dei codici iva con % di indetraibilità + TAssoc_array* _ivaoma; // array dei codici iva per gli omaggi protected: bool scrivi_righe(); @@ -349,6 +350,7 @@ bool THardy_movimenti::scrivi_righe() TString paragraph; int nrigai = 1; // contatore righe iva TConfig& ini = config(); + TString8 ivaesente = ini.get("IVA_ESENTE", "Mastri"); TToken_string gruppi_mov = ini.get("GRUPPI_MOV", "Mastri"); // se è un movimento iva metto in atto il meccanismo di ricerca per assegnare le aliquote ai conti if (_righeiva->items()>0) @@ -358,9 +360,10 @@ bool THardy_movimenti::scrivi_righe() { TRectype& rec_rmov = *(TRectype*)_righecont->objptr(i); const char* gruppo = rec_rmov.get(RMV_GRUPPO); - if (!gruppi_mov.find(gruppo)) - _righecont->destroy(i, true); + if ((gruppi_mov.find(gruppo))<0) + _righecont->destroy(i); } + _righecont->pack(); // secondo passo: per ogni riga iva cerco importo uguale in righe contabili, // se lo trovo assegno quel codice iva al conto contabile trovato e cancello la riga iva e la riga contabile for (int i=0;i<_righeiva->items();i++) @@ -368,7 +371,6 @@ bool THardy_movimenti::scrivi_righe() TRectype& rec_rmoviva = *(TRectype*)_righeiva->objptr(i); 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); @@ -382,44 +384,60 @@ bool THardy_movimenti::scrivi_righe() paragraph.format("%d,%d",LF_RMOVIVA, nrigai++); _conf->set_paragraph(paragraph); // riga iva rec2ini(rec_rmoviva); + const char* codiva = rec_rmoviva.get(RMI_CODIVA); + // se iva utilizzata per gli omaggi, devo fare un'altra riga iva identica ma con importo avere con iva esente + if (_ivaoma->is_key(codiva)) + { + paragraph.format("%d,%d",LF_RMOVIVA, nrigai++); + _conf->set_paragraph(paragraph); // riga iva + rec2ini(rec_rmoviva); + // sostituisco codice iva e importo (-) + importo = -importo; + _conf->set(RMI_CODIVA, ivaesente); // codice iva esente per quadrare il movimento + _conf->set(RMI_IMPONIBILE, importo.string(0,2)); // imponibile negativo + _conf->set(RMI_IMPOSTA, ""); // imposta zero + } _righecont->destroy(j, true); - _righeiva->destroy(i, true); - i = _righeiva->items(); j = _righecont->items(); + // _righeiva->destroy(i); + rec_rmoviva.zero(); } } } + _righecont->pack(); // terzo passo: per ogni riga iva rimasta distribuisco importo su tutti i conti rimasti in righe cont. for (int i=0;i<_righeiva->items();i++) { TRectype& rec_rmoviva = *(TRectype*)_righeiva->objptr(i); - real imponibile = rec_rmoviva.get_real(RMI_IMPONIBILE); - real imposta = rec_rmoviva.get_real(RMI_IMPOSTA); - TGeneric_distrib dimponibile(imponibile, ndec); - TGeneric_distrib dimposta(imposta, ndec); - for (int j=0;j<_righecont->items();j++) + if (!rec_rmoviva.empty()) { - TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j); - real importo = rec_rmov.get_real(RMV_IMPORTO); - dimponibile.add(importo); - dimposta.add(importo); + real imponibile = rec_rmoviva.get_real(RMI_IMPONIBILE); + real imposta = rec_rmoviva.get_real(RMI_IMPOSTA); + TGeneric_distrib dimponibile(imponibile, ndec); + TGeneric_distrib dimposta(imposta, ndec); + for (int j=0;j<_righecont->items();j++) + { + TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j); + real importo = rec_rmov.get_real(RMV_IMPORTO); + dimponibile.add(importo); + dimposta.add(importo); + } + for (int j=0;j<_righecont->items();j++) + { + TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j); + real importo = dimponibile.get(); + real imposta = dimposta.get(); + rec_rmoviva.put(RMI_TIPOC, rec_rmov.get(RMV_TIPOC)); + rec_rmoviva.put(RMI_GRUPPO, rec_rmov.get(RMV_GRUPPO)); + rec_rmoviva.put(RMI_CONTO, rec_rmov.get(RMV_CONTO)); + rec_rmoviva.put(RMI_SOTTOCONTO, rec_rmov.get(RMV_SOTTOCONTO)); + rec_rmoviva.put(RMI_IMPONIBILE, importo); + rec_rmoviva.put(RMI_IMPOSTA, imposta); + paragraph.format("%d,%d",LF_RMOVIVA, nrigai++); + _conf->set_paragraph(paragraph); // riga iva + rec2ini(rec_rmoviva); + } } - for (int j=0;j<_righecont->items();j++) - { - TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j); - real importo = dimponibile.get(); - real imposta = dimposta.get(); - rec_rmoviva.put(RMI_TIPOC, rec_rmov.get(RMV_TIPOC)); - rec_rmoviva.put(RMI_GRUPPO, rec_rmov.get(RMV_GRUPPO)); - rec_rmoviva.put(RMI_CONTO, rec_rmov.get(RMV_CONTO)); - rec_rmoviva.put(RMI_SOTTOCONTO, rec_rmov.get(RMV_SOTTOCONTO)); - rec_rmoviva.put(RMI_IMPONIBILE, importo); - rec_rmoviva.put(RMI_IMPOSTA, imposta); - paragraph.format("%d,%d",LF_RMOVIVA, nrigai++); - _conf->set_paragraph(paragraph); // riga iva - rec2ini(rec_rmoviva); - } - //_righeiva->destroy(i, true); } _righecont->destroy(); } @@ -431,9 +449,10 @@ bool THardy_movimenti::scrivi_righe() // procedura principale di conversione bool THardy_movimenti::trasferisci() { - // creazione array delle aliquote iva con % indetraibilitaà + // creazione array delle aliquote iva con % indetraibilità e degli omaggi // leggere la tabella hardy AliquoteIVA _ivaind->destroy(); + _ivaoma->destroy(); TString query_iva; query_iva << query_header(); query_iva << "SELECT * " @@ -443,11 +462,17 @@ bool THardy_movimenti::trasferisci() { const char* codiva = recset_iva.get("IdIva").as_string(); real ind = recset_iva.get("Indetraibilita").as_real(); + const int flomaggio = recset_iva.get("FlOmaggio").as_int(); if (ind != ZERO) { real* oggetto = new real(); _ivaind->add(codiva, (TObject*)oggetto); } + if (flomaggio > 0) + { + real* oggetto = new real(); + _ivaoma->add(codiva, (TObject*)oggetto); + } } // query su testate movimenti @@ -510,17 +535,19 @@ bool THardy_movimenti::trasferisci() test_movcont(); // scrive RMOV e /o RMOVIVA a partire da array righe letti da db hardy bool ok = scrivi_righe(); +#ifdef DBG TString msg; if (ok) - msg << (iva ? TR("Movimento iva "): TR("Movimento contabile ")) << _kmovcont << " generato nel file " << temp; + msg << (iva ? TR("Movimento iva "): TR("Movimento contabile ")) << _kmovcont << TR(" generato nel file ") << temp; else { ntran--; if (temp.exist()) temp.fremove(); - msg << (iva ? TR("Il movimento iva "): TR("Il movimento contabile ")) << _kmovcont << " ha generato un errore, non è stato convertito "; + msg << (iva ? TR("Il movimento iva "): TR("Il movimento contabile ")) << _kmovcont << TR(" ha generato un errore, non è stato convertito "); } log(msg); +#endif } if (_conf != NULL) delete _conf; @@ -530,7 +557,16 @@ bool THardy_movimenti::trasferisci() app << "cg2 -0 -i" << outdir << "/ha*.ini"; TExternal_app primanota(app); primanota.run(true); + TString msg; + msg << TR("Importazione completata"); + log(msg); } + else + { + TString msg; + msg << TR("Importazione annullata"); + log(msg); + } return true; } @@ -539,6 +575,7 @@ THardy_movimenti::THardy_movimenti(const int anno, const TDate dadata, const TDa _righeiva = new TArray; _righecont = new TArray; _ivaind = new TAssoc_array; + _ivaoma = new TAssoc_array; } ///////////////////////////////////////////////////////////