diff --git a/ha/hacnv200.cpp b/ha/hacnv200.cpp index a97a78a7c..2096fd650 100755 --- a/ha/hacnv200.cpp +++ b/ha/hacnv200.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -257,7 +258,7 @@ bool THardy_movimenti::test_moviva() totdoc_calc+=recset_righe.get("Imponibile").as_real(); totdoc_calc+=recset_righe.get("Imposta").as_real(); } - if (totdoc == ZERO) + if (totdoc == ZERO && totdoc_calc != ZERO) { _conf->set("SOLAIVA", " "); _conf->set(MOV_TOTDOC, totdoc_calc.string(0,2)); @@ -378,15 +379,19 @@ bool THardy_movimenti::scrivi_righe() const int gruppo_omaggi = sconto_omaggi.get_int(0); const int conto_omaggi = sconto_omaggi.get_int(1); const long sottoconto_omaggi = sconto_omaggi.get_long(2); + real saldo; // la sezione della riga 1 mi serve per verificare il segno e la sezione delle righe contabili TString16 causale = get_str("IdCausale"); causale << "|1"; const char sez_cau = (cache().get(LF_RCAUSALI, causale, RCA_SEZIONE)[0] == 'D' ? 'A' : 'D'); + bool has_iva_omaggio = false; // se è un movimento iva metto in atto il meccanismo di ricerca per assegnare le aliquote ai conti - if (_righeiva->items()>0) + if (_righeiva->items() > 0) { + for (int i = 0; !has_iva_omaggio && i<_righeiva->items(); i++) + has_iva_omaggio = _ivaoma->is_key(((TRectype*)_righeiva->objptr(i))->get(RMI_CODIVA)); // primo passo: scartare le righe contabili con gruppi non presenti nella lista GRUPPI_MOV for (int i=_righecont->items() - 1;i>=0;i--) { @@ -410,7 +415,27 @@ bool THardy_movimenti::scrivi_righe() else if (riga_omaggio) { - _righecont->destroy(i); + if (!has_iva_omaggio) + { + paragraph.format("%d,%d",LF_RMOVIVA, nrigai++); + _conf->set_paragraph(paragraph); // riga iva + rec2ini(*(TRectype*)_righeiva->objptr(0)); + // sostituisco codice iva e importo (-) e gruppo conto sottoconto + const char sezione = rec_rmov.get_char(RMV_SEZIONE); + real importo = rec_rmov.get_real(RMV_IMPORTO); + if (sezione != sez_cau) + importo = -importo; + saldo += importo; + _conf->set(RMI_CODIVA, iva_esente); // codice iva esente per quadrare il movimento + _conf->set(RMI_TIPODET, ""); + _conf->set(RMI_IMPONIBILE, importo.string(0,2)); // imponibile negativo + _conf->set(RMI_IMPOSTA, ""); // imposta zero + _conf->set(RMI_TIPOC, ""); + _conf->set(RMI_GRUPPO, sconto_omaggi.get(0)); + _conf->set(RMI_CONTO, sconto_omaggi.get(1)); + _conf->set(RMI_SOTTOCONTO, sconto_omaggi.get(2)); + } + _righecont->destroy(i); } else { @@ -586,6 +611,16 @@ bool THardy_movimenti::scrivi_righe() else _righecont->destroy(j, true); } + if (saldo != ZERO) + { + TString paragraph; + + paragraph.format("%d",LF_MOV); + + real totdoc(_conf->get(MOV_TOTDOC, paragraph)); + totdoc += saldo; + _conf->set(MOV_TOTDOC, totdoc.string(0,2), paragraph); + } //_righecont->destroy(); } // scrivo su ini le righe contabili rimaste (tutte se il mov non è iva) @@ -676,6 +711,14 @@ bool THardy_movimenti::trasferisci() paragraph.format("%d",LF_MOV); _conf->set_paragraph(paragraph); // testata movimento aggiorna_ini(*_conf, lista_campi); + TString codcaus = _conf->get(MOV_CODCAUS); + if (cache().get(LF_CAUSALI, codcaus, CAU_MOVAP) == "C") + { + const TDate d(_conf->get(MOV_DATAREG)); + const TDate datacomp(31, 12, d.year() - 1); + + _conf->set(MOV_DATACOMP, datacomp.string()); + } // verifica se è un mov. iva e nel caso aggiorna testata e array righe iva bool iva = test_moviva(); // legge righe contabili e aggiorna array righe cont.