Corretta gestione cambio

git-svn-id: svn://10.65.10.50/trunk@2580 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-02-07 11:51:14 +00:00
parent b20b78d978
commit 66f71504ff
9 changed files with 130 additions and 121 deletions

View File

@ -716,6 +716,7 @@ int TPrimanota_application::read(TMask& m)
if (is_fattura()) // Ci dovrebbero essere delle scadenze if (is_fattura()) // Ci dovrebbero essere delle scadenze
{ {
pags().reset(); // Azzera sheet rate
if (!read_scadenze(m)) // Se non esiste fattura if (!read_scadenze(m)) // Se non esiste fattura
{ {
const TString dd(m.get(F_DATADOC)); const TString dd(m.get(F_DATADOC));

View File

@ -112,8 +112,8 @@ BEGIN
ITEM "Num. doc." ITEM "Num. doc."
ITEM "Prot. IVA" ITEM "Prot. IVA"
ITEM "Tipo" ITEM "Tipo"
ITEM "Pagamento" ITEM "Riga pag."
ITEM "Bloccata" ITEM "Blocc."
FLAGS "D" FLAGS "D"
END END

View File

@ -602,7 +602,7 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
return FALSE; return FALSE;
} }
} }
if (strchr("ACGKP", tipo) != NULL) if (strchr("ACGKPT", tipo) != NULL)
{ {
saldaconto += importo; saldaconto += importo;
if (in_valuta) if (in_valuta)
@ -616,7 +616,7 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
return f.error_box("Il movimento non ha nessuna riga contabile con un importo"); return f.error_box("Il movimento non ha nessuna riga contabile con un importo");
if (paga) if (paga || nota)
{ {
const char sez(a.causale().sezione(2)); const char sez(a.causale().sezione(2));
const TImporto totdoc(sez, m.get_real(F_TOTALE)); const TImporto totdoc(sez, m.get_real(F_TOTALE));
@ -2393,10 +2393,6 @@ bool TPrimanota_application::activate_numrif(bool init_pag)
const TString16 dt(m.get(F_DATADOC)); const TString16 dt(m.get(F_DATADOC));
set_pagamento(NULL, dt); // Reset pagamento set_pagamento(NULL, dt); // Reset pagamento
set_totale_pagamento(); set_totale_pagamento();
TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET);
pagamento().set_sheet(ps); // Aggiorna lo sheet
pag_rows() = ps.rows_array(); // copia sheet
} }
else else
set_scadenze(m); // Inizializza pagamento set_scadenze(m); // Inizializza pagamento

View File

@ -486,8 +486,7 @@ bool TPrimanota_application::cambio_handler(TMask_field& f, KEY key)
if (a.is_fattura()) if (a.is_fattura())
{ {
TPagamento& pag = a.pagamento(); TPagamento& pag = a.pagamento();
const real ex(f.get()); // pag.set_cambio(m, m.get_bool(FS_RECALC)); // Aggiorna cambio sul pagamento
pag.set_cambio(ex, m.get_bool(FS_RECALC)); // Aggiorna cambio sul pagamento
update = TRUE; update = TRUE;
TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET); TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET);
@ -629,12 +628,12 @@ bool TPrimanota_application::ratalit_handler(TMask_field& f, KEY key)
{ {
if (key == K_F8 || (key == K_TAB && f.get().empty())) if (key == K_F8 || (key == K_TAB && f.get().empty()))
{ {
TPagamento& pag = app().pagamento(); const TPagamento& pag = app().pagamento();
if (pag.in_valuta()) if (pag.in_valuta())
{ {
TValuta v("VAL", TDate(), pag.cambio()); const TValuta v(app().curr_mask(), FS_VALUTA, FS_DATACAMBIO, FS_CAMBIO);
const real other(f.mask().get(103)); const real other(f.mask().get(103));
TString16 s(v.val2lit(other).string()); const char* s = v.val2lit(other).string();
f.set(s); f.set(s);
} }
} }
@ -648,7 +647,7 @@ bool TPrimanota_application::rataval_handler(TMask_field& f, KEY key)
TPagamento& pag = app().pagamento(); TPagamento& pag = app().pagamento();
if (pag.in_valuta()) if (pag.in_valuta())
{ {
TValuta v("VAL", TDate(), pag.cambio()); const TValuta v(app().curr_mask(), FS_VALUTA, FS_DATACAMBIO, FS_CAMBIO);
const real other(f.mask().get(102)); const real other(f.mask().get(102));
TString16 s(v.lit2val(other).string()); TString16 s(v.lit2val(other).string());
f.set(s); f.set(s);
@ -689,27 +688,32 @@ void TPrimanota_application::set_pagamento(const char* c, const char* d)
void TPrimanota_application::set_totale_pagamento() void TPrimanota_application::set_totale_pagamento()
{ {
real imponibile, imposta;
const real spese(0.0);
const TMask& m = curr_mask(); const TMask& m = curr_mask();
TPagamento& pag = pagamento(); TPagamento& pag = pagamento();
real cambio = m.get_real(SK_CAMBIO);
if (!cambio.is_zero()) const real imposta = m.get_real(F_IMPOSTE);
const real imponibile = m.get_real(F_TOTALE) - imposta;
const real spese = ZERO;
const TValuta cambio(m, SK_VALUTA, SK_DATACAMBIO, SK_CAMBIO);
if (cambio.in_valuta())
{ {
imposta = m.get_real(F_IMPOSTE); const real imposval = cambio.val2lit(imposta);
real imposval = imposta/cambio; imposval.round(3); const real imponval = m.get_real(SK_TOTDOCVAL) - imposval;
real imponval = m.get_real(SK_TOTDOCVAL) - imposval; pag.set_total_valuta(imponval, imposval, spese, cambio.cambio(),
imponibile = m.get_real(F_TOTALE) - imposta; imponibile, imposta, spese);
pag.set_total_valuta(imponval, imposval, spese, cambio, imponibile, imposta, spese);
} }
else else
{ {
imposta = m.get_real(F_IMPOSTE);
imponibile = m.get_real(F_TOTALE) - imposta;
pag.set_total(imponibile, imposta, spese); pag.set_total(imponibile, imposta, spese);
} }
if (m.is_running())
{
TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET);
pagamento().set_sheet(ps); // Aggiorna lo sheet
pag_rows() = ps.rows_array(); // copia sheet
}
} }
void TPrimanota_application::set_scadenze(TMask& m) void TPrimanota_application::set_scadenze(TMask& m)
@ -1183,6 +1187,7 @@ bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg
{ {
bool found = FALSE; bool found = FALSE;
// Al primo "giro" elimino i pagamenti dalla rate
for (int p = partita.last(); p > 0; p = partita.pred(p)) for (int p = partita.last(); p > 0; p = partita.pred(p))
{ {
TRiga_partite& part = partita.riga(p); TRiga_partite& part = partita.riga(p);
@ -1209,13 +1214,9 @@ bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg
} }
} }
} }
else
{
if (numrig > 0 && part.get_long(PART_NREG) == nreg && part.get_int(PART_NUMRIG) > numrig)
part.put(PART_NUMRIG, numrig-1);
}
} }
// Alla fine del "giro" elimino i pagamenti non assegnati
TRecord_array& unas = partita.unassigned(); TRecord_array& unas = partita.unassigned();
for (int u = unas.last_row(); u > 0; u = unas.pred_row(u)) for (int u = unas.last_row(); u > 0; u = unas.pred_row(u))
{ {
@ -1234,6 +1235,24 @@ bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg
} }
} }
// Al secondo "giro" decremento NRIGP dalle righe di pagamento
if (numrig > 0)
{
for (p = partita.last(); p > 0; p = partita.pred(p))
{
TRiga_partite& part = partita.riga(p);
if (!part.is_fattura())
{
if (part.get_long(PART_NREG) == nreg)
{
const int nr = part.get_int(PART_NUMRIG);
if (nr > numrig)
part.put(PART_NUMRIG, nr-1);
}
}
}
}
return found; return found;
} }

View File

@ -1473,7 +1473,7 @@ void TGame_mask::fill_partite()
const TRectype filter(curpar); // Record campione const TRectype filter(curpar); // Record campione
for (int err = partita.read(_isgteq); for (int err = partita.read(_isgreat);
err == NOERR && curpar == filter; err == NOERR && curpar == filter;
err = partita.read(_isgreat)) err = partita.read(_isgreat))
{ {

View File

@ -4,6 +4,7 @@ DATE 101
BEGIN BEGIN
PROMPT 1 1 "Scadenza " PROMPT 1 1 "Scadenza "
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
WARNING "La data di scadenza e' obbligatoria"
END END
NUMBER 102 15 NUMBER 102 15

View File

@ -2,13 +2,14 @@
#include <utility.h> #include <utility.h>
#include "pagament.h" #include "pagament.h"
#include "cg2100.h"
#include <mov.h> #include <mov.h>
#include <partite.h> #include <partite.h>
#include <scadenze.h> #include <scadenze.h>
#include <pagsca.h> #include <pagsca.h>
// se settato, si usa per rate nuove l'intervallo rate default (letto da // se settato, si usa per rate nuove l'intervallo rate default (letto da tab. pagamenti)
// tab. pagamenti)
#define USE_DEFAULT_INT_RATE 1 #define USE_DEFAULT_INT_RATE 1
inline void swap(int& x, int& y) {int tmp = x; x = y; y = tmp; } inline void swap(int& x, int& y) {int tmp = x; x = y; y = tmp; }
@ -430,82 +431,65 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
_dirty = TRUE; _dirty = TRUE;
} }
void TPagamento::set_cambio(const real& cambio, bool recalc_lit) void TPagamento::set_cambio(const TMask& m, bool recalc_lit)
{ {
const int first = _tpr < 4 ? 0 : 1; const int first = _tpr < 4 ? 0 : 1;
const bool era_valuta = in_valuta(); const bool era_valuta = in_valuta();
if (cambio.sign() <= 0) _cambio = m.get_real(SK_CAMBIO);
if (_cambio.sign() <= 0)
_cambio = 1.0; _cambio = 1.0;
else
_cambio = cambio;
const bool in_valuta = _cambio != 1.0; const bool in_val = m.get(SK_VALUTA).not_empty();
real imp; // Importo di parcheggio real imp; // Importo di parcheggio
if (era_valuta) if (era_valuta)
{ {
for (int i = _rate.items()-1; i >= 0; i--) if (in_val) // Da valuta a valuta
{
TToken_string& row = (TToken_string&)_rate[i];
if (in_valuta)
{ {
if (recalc_lit) if (recalc_lit)
adjust_perc_imp(TRUE, _rdiff, FALSE);
}
else // Da valuta a lire
{ {
imp = tval_rata(i) * _cambio; imp.round(0); _firstr = _secndr = ZERO;
row.add(imp.string(), 7); for (int i = _rate.items()-1; i >= 0; i--)
} set_imprata(i, ZERO, TRUE);
}
else row.add("", 7);
}
if (!in_valuta)
{
real imponibile = _imponval * _cambio; imponibile.round(_roundlit);
real imposta = _imposval * _cambio; imposta.round(_roundlit);
real spese = _speseval * _cambio; spese.round(_roundlit);
set_total(imponibile, imposta, spese);
} }
} }
else else
{ {
if (in_valuta) if (in_val) // Da lire a valuta
{ {
for (int i = _rate.items()-1; i >= 0; i--) real imponibile = m.get(SK_TOTDOCVAL);
{
TToken_string& row = (TToken_string&)_rate[i];
imp = tlit_rata(i);
imp /= cambio; imp.round(_roundval);
row.add(imp.string() , 4);
}
real imponibile = _imponlit / _cambio; imponibile.round(_roundval);
real imposta = _imposlit / _cambio; imposta.round(_roundval); real imposta = _imposlit / _cambio; imposta.round(_roundval);
real spese = _speselit / _cambio; spese.round(_roundval); real spese = _speselit / _cambio; spese.round(_roundval);
set_total(imponibile, imposta, spese, TRUE); init_total(imponibile, imposta, spese, TRUE);
adjust_perc_imp(TRUE, _rdiff, TRUE);
} }
} }
// if (in_valuta) adjust_importo_lire(0);
} }
//void TPagamento::adjust_importo_lire(int start) /*
//{ void TPagamento::adjust_importo_lire(int start)
// if (!in_valuta()) return; {
// const int first = _tpr < 4 ? 0 : 1; if (!in_valuta()) return;
// if (start == 0) start = first; const int first = _tpr < 4 ? 0 : 1;
// if (start == 0) start = first;
// real totlit;
// real implit = importo_da_dividere(FALSE) + importo_da_non_dividere(FALSE); real totlit;
// for (int i = 0; i < n_rate(); i++) real implit = importo_da_dividere(FALSE) + importo_da_non_dividere(FALSE);
// totlit += tlit_rata(i); for (int i = 0; i < n_rate(); i++)
// real residuo = implit - totlit; totlit += tlit_rata(i);
// if (!residuo.is_zero()) real residuo = implit - totlit;
// { if (!residuo.is_zero())
// real rs = tlit_rata(start) + residuo; {
// rata(start).add(rs.string(), 7); real rs = tlit_rata(start) + residuo;
// } rata(start).add(rs.string(), 7);
//} }
}
*/
void TPagamento::next_scad(TDate& d, int scad, bool mcomm, int rata) void TPagamento::next_scad(TDate& d, int scad, bool mcomm, int rata)
{ {
@ -1724,32 +1708,37 @@ const real& TPagamento::importo_da_non_dividere(bool v) const
else return v ? _firstr : _firstl; else return v ? _firstr : _firstl;
} }
void TPagamento::set_total(const real& ib, const real& im, const real& sp)
{
_in_valuta = FALSE;
_cambio = 1.0;
_firstr = _secndr = ZERO; // Azzera importi in valuta
init_total(ib, im, sp, FALSE); // setta regolarmente totali in lire
}
void TPagamento::set_total_valuta(const real& ib, const real& im, const real& sp, const real& c, void TPagamento::set_total_valuta(const real& ib, const real& im, const real& sp, const real& c,
const real& ibl, const real& iml, const real& spl) const real& ibl, const real& iml, const real& spl)
{ {
const bool era_valuta = _in_valuta;
_in_valuta = TRUE; _in_valuta = TRUE;
_cambio = c; _cambio = c;
if (_cambio.sign() <= 0) if (_cambio.sign() <= 0)
_cambio = real(1.0); _cambio = real(1.0);
// setta regolarmente totali in lire // setta regolarmente totali in lire
set_total(ibl, iml, spl); init_total(ibl, iml, spl, FALSE);
// ripeti tutto con la valuta // ripeti tutto con la valuta
set_total(ib, im, sp, TRUE); init_total(ib, im, sp, TRUE);
if (!era_valuta && _in_valuta)
adjust_perc_imp(TRUE, _rdiff, TRUE);
} }
void TPagamento::init_total(const real& ib, const real& im, const real& sp, bool valuta)
bool TPagamento::in_valuta() const
{ {
return _inited ? const int round = valuta ? _roundval : _roundlit;
(!(_firstr.is_zero() && _secndr.is_zero()) && !_firstl.is_zero()) :
FALSE;
}
void TPagamento::set_total(const real& ib, const real& im, const real& sp, bool valuta)
{
int round = valuta ? _roundval : _roundlit;
real& ibp = valuta ? _imponval : _imponlit; real& ibp = valuta ? _imponval : _imponlit;
real& imp = valuta ? _imposval : _imposlit; real& imp = valuta ? _imposval : _imposlit;
real& spp = valuta ? _speseval : _speselit; real& spp = valuta ? _speseval : _speselit;
@ -1828,7 +1817,7 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad)
{ {
TToken_string& ts = sf.row(i); TToken_string& ts = sf.row(i);
ts.add((const char*)data_rata(i), 0); // 0 - Data scadenza ts.add(data_rata(i), 0); // 0 - Data scadenza
if (in_valuta()) if (in_valuta())
{ {
ts.add(tlit_rata(i).string(), 1); // 1 - Importo in lire ts.add(tlit_rata(i).string(), 1); // 1 - Importo in lire
@ -1934,7 +1923,8 @@ void TPagamento::adjust_fixed_scad()
TPagamento::TPagamento(const char* codtab, const char* data) : _slicerlit(0.0,0), TPagamento::TPagamento(const char* codtab, const char* data) : _slicerlit(0.0,0),
_slicerval(0.0,0), _new(FALSE), _mcomm(FALSE), _imponlit(0.0), _imposlit(0.0), _slicerval(0.0,0), _new(FALSE), _mcomm(FALSE), _imponlit(0.0), _imposlit(0.0),
_speselit(0.0), _cambio(1.0), _code(codtab), _dirty(FALSE), _inited(FALSE), _speselit(0.0), _cambio(1.0), _in_valuta(FALSE),
_code(codtab), _dirty(FALSE), _inited(FALSE),
_def_tpr(1), _def_ulc(""), _roundval(3), _int_rate(30), _tpr(0), _rdiff(FALSE), _def_tpr(1), _def_ulc(""), _roundval(3), _int_rate(30), _tpr(0), _rdiff(FALSE),
_was_tpr4(FALSE), _roundlit(0), _imponval(0.0), _imposval(0.0), _speseval(0.0) _was_tpr4(FALSE), _roundlit(0), _imponval(0.0), _imposval(0.0), _speseval(0.0)
{ {

View File

@ -85,6 +85,8 @@ protected:
word change_value_uguali_prossima(int rata, real value, bool is_perc, bool v); word change_value_uguali_prossima(int rata, real value, bool is_perc, bool v);
word change_value_uguali_possible(int rata, real value, bool is_perc, bool v); word change_value_uguali_possible(int rata, real value, bool is_perc, bool v);
void init_total(const real& ib, const real& im, const real& sp, bool valuta);
// aggiusta parametri diversi da importo se si sono aggiunte rate // aggiusta parametri diversi da importo se si sono aggiunte rate
void adjust_parameters(bool mcomm); void adjust_parameters(bool mcomm);
// riaggiusta le percentuali o gli importi rispetto al dato modificato // riaggiusta le percentuali o gli importi rispetto al dato modificato
@ -160,9 +162,9 @@ public:
void set_inizio_scadenza(char v) { _inscad = v; } void set_inizio_scadenza(char v) { _inscad = v; }
void set_code(const char* c) { _code = c; } void set_code(const char* c) { _code = c; }
void set_roundval(int n) { _roundval = n; } void set_roundval(int n) { _roundval = n; }
void set_cambio(const real& ex, bool recalc_lit); void set_cambio(const TMask& m, bool recalc_lit);
bool in_valuta() const; bool in_valuta() const { return _in_valuta; }
const real& cambio() const { return _cambio; } const real& cambio() const { return _cambio; }
// check consistency: returns word with errors flagged, 0 if ok // check consistency: returns word with errors flagged, 0 if ok
@ -207,7 +209,7 @@ public:
void set_imprata(int i, const real& r, bool val); void set_imprata(int i, const real& r, bool val);
// only one of these must be called // only one of these must be called
void set_total(const real& ib, const real& im, const real& sp, bool valuta = FALSE); void set_total(const real& ib, const real& im, const real& sp);
void set_total_valuta(const real& ib, const real& im, const real& sp, const real& cambio, void set_total_valuta(const real& ib, const real& im, const real& sp, const real& cambio,
const real& ibl, const real& iml, const real& spl); const real& ibl, const real& iml, const real& spl);

View File

@ -1673,18 +1673,18 @@ int TPartite_array::add_numreg(long nreg)
{ {
if (nreg != _numreg) if (nreg != _numreg)
{ {
TRelation rel(LF_PARTITE); TLocalisamfile rel(LF_PARTITE);
TRectype& part = rel.curr(); rel.setkey(2); // Chiave per NREG
// Costruzione cursore filtrato TRectype& part = rel.curr();
part.zero(); part.zero();
part.put(PART_NREG, nreg); part.put(PART_NREG, nreg);
const TRectype filter(part); for (int err = rel.read(_isgreat);
TCursor cur(&rel, "", 2, &filter, &filter); err == NOERR && part.get_long(PART_NREG) == nreg;
err = rel.next())
for (cur = 0; cur.ok(); ++cur) {
partita(part); // Aggiungi partita se non esiste gia' partita(part); // Aggiungi partita se non esiste gia'
}
_numreg = nreg; _numreg = nreg;
} }