diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index 16336b543..73cdad913 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -34,18 +34,19 @@ void TMotore_application::init_query_mode( TMask& m ) void TMotore_application::init_insert_mode( TMask& m ) { - const TString16 codnum(m.get(F_CODNUM)); + const TString4 codnum(m.get(F_CODNUM)); const int anno = m.get_int(F_ANNO); const char provv = m.get(F_PROVV)[0]; const long numdoc = m.get_long(F_NDOC); TDocumento_mask& dm = (TDocumento_mask&)m; TDocumento& curdo = dm.doc(); + const TTipo_documento& tp = (const TTipo_documento&)curdo.tipo(); curdo.read(provv, anno, codnum, numdoc); curdo.set_tipo(m.get(F_TIPODOC)); - const char stato = curdo.tipo().stato_finale_inserimento(); + const char stato = tp.stato_finale_inserimento(); curdo.stato(stato); _codnum = codnum; @@ -79,16 +80,14 @@ void TMotore_application::init_insert_mode( TMask& m ) m.fld(pos).dirty(); } m.disable(DLG_PRINT); - + pos = m.id2pos(F_CAUSMAG); - if (pos >= 0) { - m.fld(pos).set(curdo.tipo().caus_mov()); + m.fld(pos).set(tp.caus_mov()); m.fld(pos).dirty(); } - TTipo_documento& tp = (TTipo_documento&) curdo.tipo(); tp.set_defaults(m); m.disable(DLG_ELABORA); @@ -171,7 +170,7 @@ TMask* TMotore_application::get_mask( int mode ) case MODE_INS: case MODE_MOD: { - const TString16 tipodoc(_msk->get(F_TIPODOC)); + const TString4 tipodoc(_msk->get(F_TIPODOC)); _docmsk = (TDocumento_mask*)_doc_masks.objptr(tipodoc); if (_docmsk == NULL) diff --git a/ve/velib.h b/ve/velib.h index 503f637f6..501a55ac6 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -261,7 +261,7 @@ public: // Funzioni che effettuano la cache di importanti valori contenuti nel profilo const char tipocf(); - void set_defaults(TMask& m); + void set_defaults(TMask& m) const; const TString_array& keys_descrs(); const TString_array& sheet_columns(); const TString_array& handlers(); @@ -549,8 +549,11 @@ public: real & iva() { return _iva;}; real & iva_spese() { return _iva_spese;}; real & iva_sconto() { return _iva_sconto;}; + const real & iva_sconto() const { return _iva_sconto;}; real & sconto_perc() { return _sconto_perc; } + const real& sconto_perc() const { return _sconto_perc; } real & sconto_imp () { return _sconto_imp; } + const real & sconto_imp () const { return _sconto_imp; } const TCodiceIVA & cod_iva() const { return _codiva;} byte tipo(){ return _tipo;}// Tipo (Vedi opzioni per la selzione di filtro nella validate()) TRiepilogo_iva& operator = (const TRiepilogo_iva & a) {return copy(a);} diff --git a/ve/velib03.cpp b/ve/velib03.cpp index b339ddef2..35f70d460 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -1137,10 +1137,10 @@ int TDocumento::remove(TBaseisamfile& f) const } if (_has_provv && tipo().provvigioni()) { - TString agente(get(DOC_CODAG)); - const int anno = TDocumento::anno(); - TString codnum(numerazione()); - const long ndoc = numero(); + const TString8 agente(get(DOC_CODAG)); + const int anno = TDocumento::anno(); + const TString4 codnum(numerazione()); + const long ndoc = numero(); // Legge le provvigioni per questo documento _provv_agente->read(agente, anno,codnum,ndoc); @@ -1152,12 +1152,9 @@ int TDocumento::remove(TBaseisamfile& f) const int TDocumento::decimals(bool price) const { - const TString16 codval = get(DOC_CODVAL); - int ndec; - if (price) - ndec = TPrice(ZERO, codval).decimals(); - else - ndec = TCurrency(ZERO, codval).decimals(); + const TString& codval = get(DOC_CODVAL); + const TExchange exc(codval); + const int ndec = exc.decimals(price); return ndec; } @@ -1726,8 +1723,14 @@ void TDocumento::update_tabella_iva() { const real imposta(ci.imposta(i, ndec)); + TGeneric_distrib iva(imposta, ndec); + iva.add(tot_sconti_imp); + iva.add(tot_sconti_perc); + imponibile += imposta; - ri->sconto_imp() += imposta; + ri->sconto_imp() += iva.get(); + ri->sconto_perc() += iva.get(); + tot_doc += imposta; } else @@ -1793,19 +1796,16 @@ void TDocumento::update_tabella_iva() if (doc_al_lordo) { table.restart(); - for (TRiepilogo_iva* ri = (TRiepilogo_iva *) table.get(); ri != NULL; - ri = (TRiepilogo_iva *) table.get()) + for (TRiepilogo_iva* ri = (TRiepilogo_iva*)table.get(); ri != NULL; ri = (TRiepilogo_iva*)table.get()) { - const TCodiceIVA & iva = ri->cod_iva(); + const TCodiceIVA& iva = ri->cod_iva(); ri->iva() = iva.scorpora(ri->imp(), ndec); ri->iva_spese() = iva.scorpora(ri->imp_spese(), ndec); iva.scorpora(ri->imp_spese_row(), ndec); - real i = ri->sconto_perc() + ri->sconto_imp(); - - ri->iva_sconto() = iva.scorpora(i, ndec); - ri->sconto_imp() -= ri->iva_sconto(); + ri->iva_sconto() = iva.scorpora(ri->sconto_imp(), ndec); + ri->iva_sconto() += iva.scorpora(ri->sconto_perc(), ndec); } } } diff --git a/ve/velib03a.cpp b/ve/velib03a.cpp index a0e0722b1..29fb52646 100755 --- a/ve/velib03a.cpp +++ b/ve/velib03a.cpp @@ -171,28 +171,26 @@ const TString_array& TTipo_documento::handlers() return _handlers; } -void TTipo_documento::set_defaults(TMask& m) +void TTipo_documento::set_defaults(TMask& m) const { - const int items = _defaults.items(); - - if (items == 0) // Carica lo string_array con i defaults + if (_defaults.items() == 0) // Carica lo string_array con i defaults { - TString16 chiave; + TString4 chiave; TFilename pn; profile_name(pn); TConfig prof(pn, "DEFAULT"); const int ndefaults = prof.get_int("NDEFAULTS"); for(int i = 1; i <= ndefaults; i++) { chiave.format("%d", i); - _defaults.add(prof.get(chiave)); + ((TTipo_documento*)this)->_defaults.add(prof.get(chiave)); } } - - for (int i = 0; i < items; i++) // Setta i campi della maschera + // Setta i campi della maschera + FOR_EACH_ARRAY_ROW(_defaults, i, tt) { - TToken_string& tt = (TToken_string&)_defaults[i]; - const int ncampo = tt.get_int(0); - m.set(ncampo, tt.get(1), TRUE ); + const short ncampo = tt->get_int(0); + if (m.id2pos(ncampo) >= 0) + m.set(ncampo, tt->get(), TRUE); } } diff --git a/ve/velib04b.cpp b/ve/velib04b.cpp index 20c37f95a..dadec354b 100755 --- a/ve/velib04b.cpp +++ b/ve/velib04b.cpp @@ -786,13 +786,13 @@ error_type TIVA_array::add(const TRiga_documento & r, const TBill& conto, const if (rec.get("S7") == "NR") { detr = 9; - pind = 100.0; + pind = CENTO; } } } - real impres = (impon * pind) / 100.0; - real ivares = (imposta * pind) / 100.0; + real impres = (impon * pind) / CENTO; + real ivares = (imposta * pind) / CENTO; impres.round(ndec); ivares.round(ndec); @@ -804,7 +804,7 @@ error_type TIVA_array::add(const TRiga_documento & r, const TBill& conto, const // una riga IVA con lo stesso imponibile ma di segno opposto, con un cod. IVA // speciale per lo storno, proveniente da configurazione - if (pind < 100.0) + if (pind < CENTO) { key.format("%d|%-4s|%c|%3d|%3d|%6ld|%s|%s|%d",ord,(const char*)cod,tipo,gr,co,so, (const char *)codcms, (const char *)fascms, 0); TRectype * iva = (TRectype *) objptr(key); @@ -1199,17 +1199,18 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc) // Istanzia la causale del documento corrente... const TTipo_documento& tipo = doc.tipo(); - TString16 codcaus(tipo.causale()); + TString4 codcaus = tipo.causale(); - TToken_string key; - key.add(doc.get(DOC_TIPOCF)); - key.add(doc.get(DOC_CODCF)); - - const TRectype & cfven = cache().get(LF_CFVEN, key); - const TString16 caus_cli(cfven.get(CFV_CODCAUS)); - - if (caus_cli.not_empty()) - codcaus = caus_cli; + if (!doc.is_nota_credito()) // Non usare la causale del cliente per le NC! + { + TToken_string key; + key.add(doc.get(DOC_TIPOCF)); + key.add(doc.get(DOC_CODCF)); + const TRectype& cfven = cache().get(LF_CFVEN, key); + const TString& caus_cli = cfven.get(CFV_CODCAUS); + if (caus_cli.not_empty()) + codcaus = caus_cli; // La causale del cliente prevale su quella del tipo documento + } _caus = new TCausale(codcaus,data_reg.year()); _righe_iva->set_caus(_caus); @@ -1536,7 +1537,7 @@ error_type TContabilizzazione::compile_head_mov_re(TDocumento& doc) // Istanzia la causale del documento corrente... const TTipo_documento& tipo = doc.tipo(); - const TString16 codcaus(tipo.causale()); + const TString4 codcaus(tipo.causale()); _caus = new TCausale(codcaus, data_reg.year()); _righe_iva->set_caus(_caus); @@ -1852,8 +1853,8 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec) // Aggiorna le righe di sconto (importo o a percentuale) error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc) { - TAssoc_array aa(doc.tabella_iva()); // no reference - TRiepilogo_iva * riep; + TAssoc_array aa = doc.tabella_iva(); // no reference + const TRiepilogo_iva* riep; TString16 cod; // Codice IVA corrente real sconto; const int ndec = doc.decimals(); @@ -1876,11 +1877,11 @@ error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc) //I conti per aggiustare l'iva vengono fatti in adjust_iva_rows() const bool perc = i == 0; TBill& conto = perc ? _sco_perc_bill : _sco_imp_bill; - sconto = perc ? -riep->sconto_perc() : -riep->sconto_imp(); + sconto = perc ? -riep->sconto_perc() : -riep->sconto_imp(); if (sconto != ZERO) { - TRiga_documento r(&doc, "07"); // il tipo riga 02 spese a valore - r.put(RDOC_QTA, "1.00"); + TRiga_documento r(&doc, "07"); // il tipo riga 07 sconti + r.put(RDOC_QTA, UNO); r.put(RDOC_PREZZO, sconto); r.put(RDOC_CODIVA, cod); _righe_iva->add(r, conto, ndec); @@ -1890,9 +1891,8 @@ error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc) if (!_totali_lordi.is_key(cod)) _totali_lordi.add(cod, new real); real& rl = (real&) _totali_lordi[cod]; - real iva = r.imposta(FALSE); - iva.round(ndec); - rl += sconto + iva; + rl -= sconto; + rl -= -riep->iva_sconto(); // Giochi strani sui segni :-) } } } @@ -1919,14 +1919,14 @@ error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc) const bool calcolo_lordo = doc.tipo().calcolo_lordo(); real imponibile; const int ndec = TCurrency::get_firm_dec(); // Numero di decimali della valuta di ditta - const TString16 codval(doc.get(DOC_CODVAL)); + const TString4 codval(doc.get(DOC_CODVAL)); const real cambio = doc.cambio(); const exchange_type et = doc.get_bool(DOC_CONTROEURO) ? _exchange_contro : _exchange_base; // Scorre tutti gli elementi della tabella IVA del documento (elementi per codice iva) for (riep = (TRiepilogo_iva*) aa.first_item(); riep != NULL; riep = (TRiepilogo_iva*) aa.succ_item()) { const TCodiceIVA & cod = riep->cod_iva(); // Codice IVA - const TString8 codiva(cod.codice()); + const TString4 codiva(cod.codice()); real iva_g; if (calcolo_lordo) { @@ -2212,7 +2212,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) const char tipo = r.tipo().tipo(); // Le righe omaggio senza addebito IVA vanno saltate const bool riga_omaggio = r.get_bool(RDOC_ADDIVA) && tipo == 'O'; - if ((tipo != 'D' && tipo != 'C') || riga_omaggio) + if ((tipo != RIGA_DESCRIZIONI && tipo != RIGA_SCONTI) || riga_omaggio) { search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro if (good()) @@ -2222,9 +2222,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc) codiva2 = r.get(RDOC_CODIVA); // Save... for (int j=0; j < MAX_IVA_SLICES; j++) { - real perc = tabella_ripartizione.row(j).get(0); - - perc /= 100.0; + const real perc = real(tabella_ripartizione.row(j).get(0)) / CENTO; codiva1 = tabella_ripartizione.row(j).get(1); if (perc == ZERO || codiva1.trim().empty()) continue; @@ -2860,7 +2858,7 @@ error_type TContabilizzazione::write_all_re(TDocumento& doc, TMovimentoPN_VE & m error_type TContabilizzazione::compile_head_anticipo(TDocumento& doc) { TString descr; - TString16 codcaus = doc.tipo().caus_anticipo(); + const TString4 codcaus = doc.tipo().caus_anticipo(); TDate datareg(_movimento->lfile().get_date(MOV_DATAREG)); if (!_caus->read(codcaus,datareg.year()))