Corretta gestione cambio
git-svn-id: svn://10.65.10.50/trunk@2580 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
b20b78d978
commit
66f71504ff
@ -715,7 +715,8 @@ int TPrimanota_application::read(TMask& m)
|
||||
calcola_imp(); // Calcola totale imponibile ed imposte
|
||||
|
||||
if (is_fattura()) // Ci dovrebbero essere delle scadenze
|
||||
{
|
||||
{
|
||||
pags().reset(); // Azzera sheet rate
|
||||
if (!read_scadenze(m)) // Se non esiste fattura
|
||||
{
|
||||
const TString dd(m.get(F_DATADOC));
|
||||
|
@ -112,8 +112,8 @@ BEGIN
|
||||
ITEM "Num. doc."
|
||||
ITEM "Prot. IVA"
|
||||
ITEM "Tipo"
|
||||
ITEM "Pagamento"
|
||||
ITEM "Bloccata"
|
||||
ITEM "Riga pag."
|
||||
ITEM "Blocc."
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
|
@ -602,7 +602,7 @@ bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
if (strchr("ACGKP", tipo) != NULL)
|
||||
if (strchr("ACGKPT", tipo) != NULL)
|
||||
{
|
||||
saldaconto += importo;
|
||||
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");
|
||||
|
||||
|
||||
if (paga)
|
||||
if (paga || nota)
|
||||
{
|
||||
const char sez(a.causale().sezione(2));
|
||||
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));
|
||||
set_pagamento(NULL, dt); // Reset 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
|
||||
set_scadenze(m); // Inizializza pagamento
|
||||
|
@ -486,8 +486,7 @@ bool TPrimanota_application::cambio_handler(TMask_field& f, KEY key)
|
||||
if (a.is_fattura())
|
||||
{
|
||||
TPagamento& pag = a.pagamento();
|
||||
const real ex(f.get());
|
||||
pag.set_cambio(ex, m.get_bool(FS_RECALC)); // Aggiorna cambio sul pagamento
|
||||
// pag.set_cambio(m, m.get_bool(FS_RECALC)); // Aggiorna cambio sul pagamento
|
||||
update = TRUE;
|
||||
|
||||
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()))
|
||||
{
|
||||
TPagamento& pag = app().pagamento();
|
||||
const TPagamento& pag = app().pagamento();
|
||||
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));
|
||||
TString16 s(v.val2lit(other).string());
|
||||
const char* s = v.val2lit(other).string();
|
||||
f.set(s);
|
||||
}
|
||||
}
|
||||
@ -648,7 +647,7 @@ bool TPrimanota_application::rataval_handler(TMask_field& f, KEY key)
|
||||
TPagamento& pag = app().pagamento();
|
||||
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));
|
||||
TString16 s(v.lit2val(other).string());
|
||||
f.set(s);
|
||||
@ -689,27 +688,32 @@ void TPrimanota_application::set_pagamento(const char* c, const char* d)
|
||||
|
||||
void TPrimanota_application::set_totale_pagamento()
|
||||
{
|
||||
real imponibile, imposta;
|
||||
const real spese(0.0);
|
||||
|
||||
const TMask& m = curr_mask();
|
||||
TPagamento& pag = pagamento();
|
||||
real cambio = m.get_real(SK_CAMBIO);
|
||||
|
||||
if (!cambio.is_zero())
|
||||
{
|
||||
imposta = m.get_real(F_IMPOSTE);
|
||||
real imposval = imposta/cambio; imposval.round(3);
|
||||
real imponval = m.get_real(SK_TOTDOCVAL) - imposval;
|
||||
imponibile = m.get_real(F_TOTALE) - imposta;
|
||||
pag.set_total_valuta(imponval, imposval, spese, cambio, imponibile, imposta, spese);
|
||||
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())
|
||||
{
|
||||
const real imposval = cambio.val2lit(imposta);
|
||||
const real imponval = m.get_real(SK_TOTDOCVAL) - imposval;
|
||||
pag.set_total_valuta(imponval, imposval, spese, cambio.cambio(),
|
||||
imponibile, imposta, spese);
|
||||
}
|
||||
else
|
||||
{
|
||||
imposta = m.get_real(F_IMPOSTE);
|
||||
imponibile = m.get_real(F_TOTALE) - imposta;
|
||||
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)
|
||||
@ -1182,7 +1186,8 @@ bool TPrimanota_application::notify_edit_pagamento(TPartita& p, TRectype& new_pa
|
||||
bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg, int numrig)
|
||||
{
|
||||
bool found = FALSE;
|
||||
|
||||
|
||||
// Al primo "giro" elimino i pagamenti dalla rate
|
||||
for (int p = partita.last(); p > 0; p = partita.pred(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();
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1473,7 +1473,7 @@ void TGame_mask::fill_partite()
|
||||
|
||||
const TRectype filter(curpar); // Record campione
|
||||
|
||||
for (int err = partita.read(_isgteq);
|
||||
for (int err = partita.read(_isgreat);
|
||||
err == NOERR && curpar == filter;
|
||||
err = partita.read(_isgreat))
|
||||
{
|
||||
|
@ -4,6 +4,7 @@ DATE 101
|
||||
BEGIN
|
||||
PROMPT 1 1 "Scadenza "
|
||||
CHECKTYPE REQUIRED
|
||||
WARNING "La data di scadenza e' obbligatoria"
|
||||
END
|
||||
|
||||
NUMBER 102 15
|
||||
|
136
cg/pagament.cpp
136
cg/pagament.cpp
@ -2,13 +2,14 @@
|
||||
#include <utility.h>
|
||||
#include "pagament.h"
|
||||
|
||||
#include "cg2100.h"
|
||||
|
||||
#include <mov.h>
|
||||
#include <partite.h>
|
||||
#include <scadenze.h>
|
||||
#include <pagsca.h>
|
||||
|
||||
// se settato, si usa per rate nuove l'intervallo rate default (letto da
|
||||
// tab. pagamenti)
|
||||
// se settato, si usa per rate nuove l'intervallo rate default (letto da tab. pagamenti)
|
||||
#define USE_DEFAULT_INT_RATE 1
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 bool era_valuta = in_valuta();
|
||||
|
||||
if (cambio.sign() <= 0)
|
||||
|
||||
_cambio = m.get_real(SK_CAMBIO);
|
||||
if (_cambio.sign() <= 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
|
||||
|
||||
if (era_valuta)
|
||||
{
|
||||
for (int i = _rate.items()-1; i >= 0; i--)
|
||||
{
|
||||
TToken_string& row = (TToken_string&)_rate[i];
|
||||
if (in_valuta)
|
||||
{
|
||||
if (recalc_lit)
|
||||
{
|
||||
imp = tval_rata(i) * _cambio; imp.round(0);
|
||||
row.add(imp.string(), 7);
|
||||
}
|
||||
}
|
||||
else row.add("", 7);
|
||||
}
|
||||
|
||||
if (!in_valuta)
|
||||
{
|
||||
if (in_val) // Da valuta a 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);
|
||||
if (recalc_lit)
|
||||
adjust_perc_imp(TRUE, _rdiff, FALSE);
|
||||
}
|
||||
else // Da valuta a lire
|
||||
{
|
||||
_firstr = _secndr = ZERO;
|
||||
for (int i = _rate.items()-1; i >= 0; i--)
|
||||
set_imprata(i, ZERO, TRUE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (in_valuta)
|
||||
if (in_val) // Da lire a valuta
|
||||
{
|
||||
for (int i = _rate.items()-1; i >= 0; i--)
|
||||
{
|
||||
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 imponibile = m.get(SK_TOTDOCVAL);
|
||||
real imposta = _imposlit / _cambio; imposta.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)
|
||||
//{
|
||||
// if (!in_valuta()) return;
|
||||
// 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);
|
||||
// for (int i = 0; i < n_rate(); i++)
|
||||
// totlit += tlit_rata(i);
|
||||
// real residuo = implit - totlit;
|
||||
// if (!residuo.is_zero())
|
||||
// {
|
||||
// real rs = tlit_rata(start) + residuo;
|
||||
// rata(start).add(rs.string(), 7);
|
||||
// }
|
||||
//}
|
||||
|
||||
/*
|
||||
void TPagamento::adjust_importo_lire(int start)
|
||||
{
|
||||
if (!in_valuta()) return;
|
||||
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);
|
||||
for (int i = 0; i < n_rate(); i++)
|
||||
totlit += tlit_rata(i);
|
||||
real residuo = implit - totlit;
|
||||
if (!residuo.is_zero())
|
||||
{
|
||||
real rs = tlit_rata(start) + residuo;
|
||||
rata(start).add(rs.string(), 7);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void TPagamento::next_scad(TDate& d, int scad, bool mcomm, int rata)
|
||||
{
|
||||
@ -1723,33 +1707,38 @@ const real& TPagamento::importo_da_non_dividere(bool v) const
|
||||
if (_tpr < 4) return v ? _secndr : _secndl;
|
||||
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,
|
||||
const real& ibl, const real& iml, const real& spl)
|
||||
{
|
||||
const bool era_valuta = _in_valuta;
|
||||
|
||||
_in_valuta = TRUE;
|
||||
_cambio = c;
|
||||
if (_cambio.sign() <= 0)
|
||||
_cambio = real(1.0);
|
||||
|
||||
// setta regolarmente totali in lire
|
||||
set_total(ibl, iml, spl);
|
||||
init_total(ibl, iml, spl, FALSE);
|
||||
// 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);
|
||||
}
|
||||
|
||||
|
||||
bool TPagamento::in_valuta() const
|
||||
{
|
||||
return _inited ?
|
||||
(!(_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)
|
||||
void TPagamento::init_total(const real& ib, const real& im, const real& sp, bool valuta)
|
||||
{
|
||||
int round = valuta ? _roundval : _roundlit;
|
||||
const int round = valuta ? _roundval : _roundlit;
|
||||
real& ibp = valuta ? _imponval : _imponlit;
|
||||
real& imp = valuta ? _imposval : _imposlit;
|
||||
real& spp = valuta ? _speseval : _speselit;
|
||||
@ -1828,7 +1817,7 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad)
|
||||
{
|
||||
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())
|
||||
{
|
||||
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),
|
||||
_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),
|
||||
_was_tpr4(FALSE), _roundlit(0), _imponval(0.0), _imposval(0.0), _speseval(0.0)
|
||||
{
|
||||
|
@ -85,6 +85,8 @@ protected:
|
||||
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);
|
||||
|
||||
void init_total(const real& ib, const real& im, const real& sp, bool valuta);
|
||||
|
||||
// aggiusta parametri diversi da importo se si sono aggiunte rate
|
||||
void adjust_parameters(bool mcomm);
|
||||
// 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_code(const char* c) { _code = c; }
|
||||
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; }
|
||||
|
||||
// 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);
|
||||
|
||||
// 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,
|
||||
const real& ibl, const real& iml, const real& spl);
|
||||
|
||||
|
@ -1673,18 +1673,18 @@ int TPartite_array::add_numreg(long nreg)
|
||||
{
|
||||
if (nreg != _numreg)
|
||||
{
|
||||
TRelation rel(LF_PARTITE);
|
||||
TLocalisamfile rel(LF_PARTITE);
|
||||
rel.setkey(2); // Chiave per NREG
|
||||
|
||||
TRectype& part = rel.curr();
|
||||
|
||||
// Costruzione cursore filtrato
|
||||
part.zero();
|
||||
part.zero();
|
||||
part.put(PART_NREG, nreg);
|
||||
const TRectype filter(part);
|
||||
TCursor cur(&rel, "", 2, &filter, &filter);
|
||||
|
||||
for (cur = 0; cur.ok(); ++cur)
|
||||
for (int err = rel.read(_isgreat);
|
||||
err == NOERR && part.get_long(PART_NREG) == nreg;
|
||||
err = rel.next())
|
||||
{
|
||||
partita(part); // Aggiungi partita se non esiste gia'
|
||||
|
||||
}
|
||||
_numreg = nreg;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user