diff --git a/cg/cg2100.cpp b/cg/cg2100.cpp index 9d5afe9f7..9e820feb5 100755 --- a/cg/cg2100.cpp +++ b/cg/cg2100.cpp @@ -553,7 +553,7 @@ int TPrimanota_application::read(TMask& m) cgs().reset(); - if (_iva != nessuna_iva) + if (iva() != nessuna_iva) { ivas().reset(); @@ -593,7 +593,7 @@ int TPrimanota_application::read(TMask& m) TImporto import(sezione, im); import.add_to(riga); // Dare/Avere 101-102 - TConto conto; get_conto(r, conto); + TBill conto; get_conto(r, conto); riga.add(conto.string(0x3)); // Conto 103-107 _saldi.aggiorna(conto, im, sezione, FALSE); @@ -606,6 +606,9 @@ int TPrimanota_application::read(TMask& m) riga.add(r.get("NUMGIO")); const char tipo = r.get_char("ROWTYPE"); riga.add(tipo); // Tipo di riga 115 + + if (iva() == nessuna_iva && tipo > ' ') + error_box("Riga %d con tipo incompatibile con un movimento puramente contabile", i+1); cgs().row(i) = riga; disable_cgs_cells(i, tipo); @@ -691,9 +694,9 @@ void TPrimanota_application::mask2rel(const TMask& m) TToken_string& row = (TToken_string&)rows[i]; TImporto n; n = row; - const TConto conto(row, 2, 0x3); + const TBill conto(row, 2, 0x3); _saldi.aggiorna(conto, n.valore(), n.sezione(), TRUE); - + TRectype &r = _rel->cg(i); r.zero(); @@ -718,6 +721,7 @@ void TPrimanota_application::mask2rel(const TMask& m) r.put("ROWTYPE", row.get()); // Tipo riga } } + if (_iva == nessuna_iva) return; if (causale().corrispettivi()) @@ -766,9 +770,9 @@ void TPrimanota_application::mask2rel(const TMask& m) TRectype &r = _rel->iva(i); r.zero(); - r.put("ANNOES", annoes); + r.put("ANNOES", annoes); // Anno d'esercizio della testata (che ca$$ata!) r.put("NUMREG", numreg); - r.put("INTRA", intra); // Causale intra + r.put("INTRA", intra); // Causale intra (che ca$$ata!) r.put("NUMRIG", i+1); real imponibile(row.get(0)); @@ -792,6 +796,29 @@ void TPrimanota_application::mask2rel(const TMask& m) } +void TPrimanota_application::check_saldi() +{ + TString_array& rows = cgs().rows_array(); + const int anno = _rel->lfile().get_int("ANNOES"); + + for (int i = 0; i < rows.items(); i++) + { + TToken_string& row = (TToken_string&)rows[i]; + TBill conto(row, 2, 0x3); + conto.find(); + const char sez = conto.sezione(); + if (sez > ' ') + { + const TConto* c = _saldi.find(conto, anno); + if (c && !c->saldo_finale().is_zero() && c->saldo_finale().sezione() != sez) + warning_box("Il conto della riga %i ha un saldo finale in %s, " + "contrariamente a quanto indicato sul piano dei conti", + i+1, sez == 'A' ? "dare" : "avere"); + } + } +} + + int TPrimanota_application::write(const TMask& m) { const long numreg = m.get_long(F_NUMREG); @@ -802,6 +829,7 @@ int TPrimanota_application::write(const TMask& m) if (err == NOERR) { _saldi.registra(); + check_saldi(); if (iva() != nessuna_iva) { @@ -826,7 +854,10 @@ int TPrimanota_application::rewrite(const TMask& m) mask2rel(m); const int err = _rel->rewrite(TRUE); if (err == NOERR) + { _saldi.registra(); + check_saldi(); + } if (gestione_saldaconto() && causale().saldaconto()) write_scadenze(m); return err; @@ -837,7 +868,10 @@ bool TPrimanota_application::remove() { const bool ok = TRelation_application::remove(); if (ok) + { _saldi.registra(); + check_saldi(); + } // TBI eliminazione partita return ok; } @@ -994,12 +1028,13 @@ void TPrimanota_application::genera_incasso(const char* causimm) for (int r = 0; r < i; r++) { const TRectype& rec = inc.cg(r); - TConto c; get_conto(rec, c); + TBill c; get_conto(rec, c); const real im(rec.get("IMPORTO")); const char sezione = rec.get_char("SEZIONE"); _saldi.aggiorna(c, im, sezione, TRUE); } _saldi.registra(); + check_saldi(); } } } diff --git a/cg/cg2101.cpp b/cg/cg2101.cpp index 6c4e68a1a..51741ca52 100755 --- a/cg/cg2101.cpp +++ b/cg/cg2101.cpp @@ -280,9 +280,9 @@ int TMovimentoPN::registra(bool re, bool force) plm.setkey(1); for (int a = 1; a <= att; a++) { - TString16 chiave; - chiave << annoiva << registro.attivita() << a - << format("%02d", date2liq(datareg)); + TString16 chiave; + TString16 attivita(registro.attivita()); attivita.right_just(5, '0'); + chiave << annoiva << attivita << a << format("%02d", date2liq(datareg)); plm.put("CODTAB", chiave); if (plm.read() == NOERR) { diff --git a/cg/cg2103.cpp b/cg/cg2103.cpp index 7b9c9748d..b2986503e 100755 --- a/cg/cg2103.cpp +++ b/cg/cg2103.cpp @@ -167,21 +167,19 @@ bool TRegistro::read_att() bool TRegistro::agenzia_viaggi() { bool av = FALSE; - if (iva() == iva_vendite && read_att()) + if (iva() == iva_vendite) av = _att.get_bool("REG74TER"); return av; } const TString& TRegistro::tipo_attivita() { - read_att(); return _att.get("TIPOATT"); } const real& TRegistro::prorata() { - read_att(); return _prorata; } @@ -396,6 +394,7 @@ bool TCausale::ok() const return TRUE; } + char TCausale::sezione(int riga) const { const TRectype& r = row(riga); @@ -494,65 +493,3 @@ bool TCodiceIVA::read(const char* cod) } -/////////////////////////////////////////////////////////// -// Importo -/////////////////////////////////////////////////////////// - -const TImporto& TImporto::add_to(TToken_string& s) const -{ - const bool dare = sezione() == 'D'; - const char* v = valore().string(); - s.add(dare ? v : "", 0); - s.add(dare ? "" : v, 1); - return *this; -} - -// Cerified 99% -// Ambigous section for ZERO -const TImporto& TImporto::operator =(TToken_string& sv) -{ - _valore = real(sv.get(0)); - if (_valore == ZERO) - { - _valore = real(sv.get()); - _sezione = 'A'; - } - else - _sezione = 'D'; - return *this; -} - - -const TImporto& TImporto::set(char s, const real& v) -{ - CHECKD(s == 'D' || s == 'A', "Sezione errata per importo: codice ", (int)s); - _sezione = s; _valore = v; - return *this; -} - - -const TImporto& TImporto::operator += (const TImporto& i) -{ - if (_sezione == i._sezione) - _valore += i._valore; - else - _valore -= i._valore; - return *this; -} - - -const TImporto& TImporto::operator -= (const TImporto& i) -{ - if (_sezione == i._sezione) - _valore -= i._valore; - else - _valore += i._valore; - return *this; -} - -const TImporto& TImporto::swap_section() -{ - _sezione = (_sezione == 'D') ? 'A' : 'D'; - return *this; -} -