Patch level : 2.0 666

Files correlati     : ve0.exe ve6.exe
Ricompilazione Demo : [ ]
Commento            :

GF20114
Il paragrafo [DEFAULTS] dei profili dei documenti contiene la lista dei
valori di default da assegnare a certi campi della maschera di immissione.
Tale paragrafo nella versione a 32 bit viene completamente ignorato, mentre
nella precedente versione funzionava "quasi" sempre.

GF20115
Se si cerca di contabilizzare una fattura di vendita con calcolo al lordo e
con sconti "di testa",
la procedura tenta di generare un movimento sbilanciato e quindi fallisce.
Il problema sembra essere nel fatto che il totale documento e' corretto,
mentre imponibile e iva non tengono conto dello sconto.
Se si utilizzano gli sconti "di riga" o si toglie il calcolo al lordo, tutto
funziona bene.

GF20116
Nell'eventualità avessimo una causale contabile definita sull'anagrafica di
un nostro cliente/fornit bisogna fare in modo che se stiamo contabilizzando
una nota di credito la causale utilizzata non sia quella prevista in anagrafica,
ma bensì quella prevista nella tipologia del documento sul quale naturalmente
ci sarà la spunta di nota di credito/debito (questa appunto può essere la discriminante)


git-svn-id: svn://10.65.10.50/trunk@11704 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-01-12 08:48:58 +00:00
parent 2a9f280e2e
commit 9ecc861e7b
5 changed files with 65 additions and 67 deletions

View File

@ -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)

View File

@ -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);}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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()))