Corretta gestione partie e residui

git-svn-id: svn://10.65.10.50/trunk@2582 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-02-08 15:46:39 +00:00
parent 968abc211d
commit d8eeddba98
11 changed files with 80 additions and 112 deletions

View File

@ -733,6 +733,8 @@ void TPrimanota_application::mask2rel(const TMask& m)
{
m.autosave(_rel);
TRectype& rec = _rel->curr(); // Record della testata
const long numreg = m.get_long(F_NUMREG);
const TDate datareg(m.get(F_DATAREG));
const int annoes = m.get_int(F_ANNOES);
@ -742,6 +744,17 @@ void TPrimanota_application::mask2rel(const TMask& m)
_saldi.set_anno_es(annoes);
_saldi.set_num_ulmov(numreg);
_saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
const int tm = causale().tipomov();
char s[2];
if (tm > 0)
{
s[0] = tm+'0';
s[1] = '\0';
}
else
s[0] = '\0';
rec.put(MOV_TIPOMOV, s); // Tolto dalla maschera (su file e' alfanumerico)!
_rel->destroy_rows(numreg); // Destroy all records
cgs_pack(); // Destroy all null rows
@ -788,8 +801,6 @@ void TPrimanota_application::mask2rel(const TMask& m)
if (_iva == nessuna_iva) return;
TRectype& rec = _rel->curr(); // Record della testata
if (causale().corrispettivi())
{
rec.put("TIPO", "");

View File

@ -39,7 +39,6 @@
#define F_ANNORIF 124
#define F_NUMRIF 125
#define F_PROVVISORIO 129
#define F_TIPOMOV 130
#define F_OCCASEDIT 131
#define F_SOLAIVA 132
#define F_CORRLIRE 133

View File

@ -82,7 +82,7 @@ END
STRING F_CODREG 3
BEGIN
PROMPT 57 4 "Registro IVA "
FLAGS "DGUZ"
FLAGS "DUZ"
FIELD REG
END
@ -101,7 +101,6 @@ BEGIN
OUTPUT F_DESCRCAUS DESCR
OUTPUT F_CODREG REG
OUTPUT F_TIPODOC TIPODOC
OUTPUT F_TIPOMOV TIPOMOV
MESSAGE COPY,H_CODCAUS
CHECKTYPE REQUIRED
ADD RUN cg0 -4
@ -137,13 +136,6 @@ BEGIN
FLAGS "D"
END
NUMBER F_TIPOMOV 1
BEGIN
PROMPT 32 6 "Tipo movimento "
FIELD TIPOMOV
FLAGS "H"
END
STRING F_NUMDOC 7
BEGIN
PROMPT 57 6 "Documento n. "

View File

@ -514,14 +514,15 @@ HIDDEN bool imptot_error(const TImporto& imptot, const TImporto& impsal, bool va
const TMask& m = a.curr_mask();
TString msg(255);
msg << "Il totale documento " << (val ? "in valuta" : "inserito")
<< " e' " << imptot.valore().string(pic) << ' ' << imptot.sezione() << ",\n";
msg << "Il totale documento ";
if (val)
msg << "in valuta " << m.get(SK_VALUTA);
else
msg << "inserito";
msg << " e' " << imptot.valore().string(pic) << ' ' << imptot.sezione() << ",\n";
msg << "i pagamenti e le spese ammontano a "
<< impsal.valore().string(pic) << ' ' << impsal.sezione() << ",\n";
msg << "per cui il residuo e' " << residuo.valore().string(pic);
if (val)
msg << ' ' << m.get(SK_VALUTA);
msg << '.';
msg << "per cui il residuo e' " << residuo.valore().string(pic) << '.';
if (m.edit_mode() && impsal.is_zero())
{

View File

@ -477,25 +477,14 @@ bool TPrimanota_application::cambio_handler(TMask_field& f, KEY key)
TMask& m = f.mask();
TPrimanota_application& a = app();
bool update = FALSE; // Devo ricopiarmi a pagina 3?
bool update = a.is_fattura(); // Devo ricopiarmi a pagina 3?
if (f.focusdirty())
{
// Forza il ricalcolo del totale in lire se necessario
a.gioca_cambi(m.insert_mode() ? 0x1 : 0x0);
if (a.is_fattura())
{
TPagamento& pag = a.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);
pag.set_sheet(ps);
a.pag_rows() = ps.rows_array();
}
}
else
update = a.is_fattura() && !m.is_running();
update &= !m.is_running();
if (update)
m.set(FS_CAMBIO, f.get()); // Copia a pagina 3

View File

@ -33,7 +33,7 @@ class TGame_mask : public TMask
tipo_movimento _tipomov; // Dati per la creazione di un nuovo movimento
char _sezione;
TDate _datadoc;
TDate _datad;
TString _codpag, _descr, _numdoc;
TDecoder _causali; // Decodificatore delle causali
@ -54,7 +54,7 @@ protected:
void fill_partite();
real aggiorna_residuo();
void aggiorna_residuo();
int update_partita(const TPartita& game, int prow);
void update_saldo_clifo();
@ -563,34 +563,35 @@ bool TGame_mask::cambio_handler(TMask_field& f, KEY k)
///////////////////////////////////////////////////////////
// Aggiorna il campo con il residuo da spendere sui pagamenti
real TGame_mask::aggiorna_residuo()
void TGame_mask::aggiorna_residuo()
{
#ifdef __EXTRA__
return ZERO;
#else
_importo = app().get_cgs_imp(_numrig-1); // Importo sulla riga contabile
_residuo = _importo;
_residuo -= app().partite().importo_speso(_numreg, _numrig); // Residuo della riga
TPartite_array& giochi = app().partite();
const TImporto speso = giochi.importo_speso(_numreg, _numrig);
_residuo -= speso; // Residuo della riga
const char sez = calcola_sezione(); // Sezione di riferimento
_residuo.normalize(sez);
const real& res = _residuo.valore();
set(P_RESIDUO, res);
set(P_RESIDUO, _residuo.valore());
if (field(P_CAMBIO).enabled())
{
const TValuta cambio(*this, P_VALUTA, P_DATACAMBIO, P_CAMBIO);
if (cambio.in_valuta())
{
_resval = _importo; cambio.lit2val(_resval);
_resval -= app().partite().importo_speso(_numreg, _numrig, TRUE); // Residuo della riga
_resval.normalize(sez);
set(P_RESIDUOVAL, _resval.valore());
}
const TValuta cambio(*this, P_VALUTA, P_DATACAMBIO, P_CAMBIO);
if (cambio.in_valuta())
{
// Importo della riga contabile senza differenza cambi
_resval = _importo;
const TImporto diffcam = giochi.importo_speso(_numreg, _numrig, FALSE, 0x4);
_resval -= diffcam;
cambio.lit2val(_resval);
const TImporto spesoval = giochi.importo_speso(_numreg, _numrig, TRUE);
_resval -= spesoval; // Residuo della riga
_resval.normalize(sez);
set(P_RESIDUOVAL, _resval.valore());
}
return res;
#endif
}
@ -678,7 +679,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
gm.set(P_ANNO, anno); // Aggiorna campi di ricerca
gm.set(P_NUMERO, num);
TString prima_valuta; // Codice prima valuta
TString prima_valuta; // Codice prima valuta
if (anno > 0)
{
@ -1084,8 +1085,10 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
const TBill& bill = gm.conto();
const int anno = gm.get_int(P_ANNO);
const TString16 numero = gm.get(P_NUMERO);
TPartita& game = app().partite().partita(bill, anno, numero);
TPartite_array& giochi = app().partite();
TPartita* was = giochi.exist(bill, anno, numero); // Controlla esistenza nell'array
TPartita& game = was ? *was : giochi.partita(bill, anno, numero);
long nreg = m.get_long(108); // Numero registrazione
const int nrata = m.get_int(102); // Rata selezionata (puo' essere 0)
@ -1094,7 +1097,10 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
if (nrata != 0 && nrigp == 0)
{
if (m.get_bool(114))
{
if (was == NULL) giochi.destroy(game);
return f.error_box("La rata %d e' bloccata.", nrata);
}
const TValuta parval(game.riga(nriga));
const TValuta curval(gm, P_VALUTA, P_DATACAMBIO, P_CAMBIO);
@ -1102,6 +1108,8 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
{
TString c = parval.codice();
if (c.empty()) c = "lire";
if (was == NULL) giochi.destroy(game);
return f.error_box("La fattura deve essere pagata in %s.", (const char*)c);
}
@ -1124,7 +1132,8 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
{
cambiato = gm.edit_pagamento(game, nriga, nrata, nrigp);
if (cambiato)
{
{
// Se ho cancellato il pagamento chiudo la maschera
if (m.is_running() && !game.esiste(nriga, nrata, nrigp))
m.stop_run(K_FORCE_CLOSE);
}
@ -1134,6 +1143,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
#ifdef __EXTRA__
gm.prima_nota(nreg);
#else
if (was == NULL) giochi.destroy(game);
return f.error_box("Modificare il movimento %ld", nreg);
#endif
}
@ -1148,6 +1158,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
#else
if (nreg != gm._numreg || nrata == 0)
{
if (was == NULL) giochi.destroy(game);
if (nreg == 0)
f.error_box("Utilizzare la gestione extra-contabile");
else
@ -1182,7 +1193,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
// Se la partita e' presente anche su file non posso cancellarla:
// altrimenti non verra' rimossa alla registrazione!
if (!game.is_on_file())
app().partite().destroy(game);
giochi.destroy(game);
if (on_sheet)
gm.fill_partite();
}
@ -1453,8 +1464,14 @@ void TGame_mask::fill_partite()
if (gioco->ok())
{
const TBill& k = gioco->conto();
const bool u = (k.tipo() > ' ' && k.sottoconto() == conto().sottoconto()) ||
k == conto();
bool u = (k.tipo() > ' ' && k.sottoconto() == conto().sottoconto()) || k == conto();
#ifdef DBG
if (u && !all && gioco->chiusa() && gioco->mov2rig(_numreg, _numrig) <= 0)
u = error_box("Tentativo di visualizzare partita %d %s!",
gioco->anno(), (const char*)gioco->numero());
#endif
if (u)
update_partita(*gioco, -1);
}

View File

@ -52,6 +52,7 @@ NUMBER FS_NRATE 3
BEGIN
PROMPT 36 6 "Numero di rate "
CHECKTYPE REQUIRED
FLAGS "U"
END
STRING FS_VALUTA 3

View File

@ -185,7 +185,7 @@ void TPagamento::set_tipo_prima_rata(int v, int sscad)
void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
{
if (n == 0) return;
if (n <= 0) return;
_dirty = FALSE;
const int nr = n_rate();
@ -427,49 +427,9 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
}
adjust_fixed_scad();
_dirty = TRUE;
}
void TPagamento::set_cambio(const TMask& m, bool recalc_lit)
{
const int first = _tpr < 4 ? 0 : 1;
const bool era_valuta = in_valuta();
_cambio = m.get_real(SK_CAMBIO);
if (_cambio.sign() <= 0)
_cambio = 1.0;
const bool in_val = m.get(SK_VALUTA).not_empty();
real imp; // Importo di parcheggio
if (era_valuta)
{
if (in_val) // Da valuta a valuta
{
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_val) // Da lire a valuta
{
real imponibile = m.get(SK_TOTDOCVAL);
real imposta = _imposlit / _cambio; imposta.round(_roundval);
real spese = _speselit / _cambio; spese.round(_roundval);
init_total(imponibile, imposta, spese, TRUE);
adjust_perc_imp(TRUE, _rdiff, TRUE);
}
}
}
/*
void TPagamento::adjust_importo_lire(int start)

View File

@ -162,7 +162,6 @@ 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 TMask& m, bool recalc_lit);
bool in_valuta() const { return _in_valuta; }
const real& cambio() const { return _cambio; }

View File

@ -1125,7 +1125,7 @@ bool TPartita::esiste(int nriga, int nrata, int nrigp) const
}
// Ritorna l'importo in lire speso su di una riga contabile
TImporto TPartita::importo_speso(long nreg, int numrig, bool valuta) const
TImporto TPartita::importo_speso(long nreg, int numrig, bool valuta, int mode) const
{
TImporto imp;
@ -1133,7 +1133,7 @@ TImporto TPartita::importo_speso(long nreg, int numrig, bool valuta) const
{
const TRiga_partite& row = riga(r);
if (nreg == row.get_long(PART_NREG) && numrig == row.get_int(PART_NUMRIG))
imp += row.importo(valuta);
imp += row.importo(valuta, mode);
}
return imp;
@ -1673,18 +1673,17 @@ int TPartite_array::add_numreg(long nreg)
{
if (nreg != _numreg)
{
TLocalisamfile rel(LF_PARTITE);
rel.setkey(2); // Chiave per NREG
TRelation rel(LF_PARTITE);
TRectype& part = rel.curr();
part.zero();
part.put(PART_NREG, nreg);
for (int err = rel.read(_isgreat);
err == NOERR && part.get_long(PART_NREG) == nreg;
err = rel.next())
{
// Uso un cursore per evitare conflitti di lettura con l'oggetta partita
TCursor cur(&rel, "", 2, &part, &part);
for (cur = 0; cur.ok(); ++cur)
partita(part); // Aggiungi partita se non esiste gia'
}
_numreg = nreg;
}
@ -1702,12 +1701,12 @@ bool TPartite_array::utilizzata(long numreg, int numrig)
return ok;
}
TImporto TPartite_array::importo_speso(long nreg, int numrig, bool valuta)
TImporto TPartite_array::importo_speso(long nreg, int numrig, bool valuta, int mode)
{
TImporto imp;
add_numreg(nreg);
for (TPartita* game = first(); game; game = next())
imp += game->importo_speso(nreg, numrig, valuta);
imp += game->importo_speso(nreg, numrig, valuta, mode);
imp.normalize();
return imp;
}

View File

@ -286,7 +286,7 @@ public:
const TString& numero() const { return _num; }
const TString& descrizione() const;
TImporto importo_speso(long numreg, int numrig, bool valuta) const;
TImporto importo_speso(long numreg, int numrig, bool valuta, int mode = 0xF) const;
void update_reg(long nreg, const TRectype& mov, const TRecord_array& cg);
void calcola_saldo(TImporto& saldo, TImporto& doc, TImporto& pag, TImporto& imp) const;
TImporto calcola_saldo(bool valuta) const;
@ -336,7 +336,7 @@ public:
bool rewrite() { return write(TRUE); }
int add_numreg(long numreg); // Carica tutte le partite relative alla registrazione numreg
TImporto importo_speso(long numreg, int numrig, bool valuta = FALSE);
TImporto importo_speso(long numreg, int numrig, bool valuta = FALSE, int mode = 0xF);
void update_reg(const TRectype& mov, const TRecord_array& cg, long old_reg = 0);
// Controlla se esistono righe di pagamento relative alla riga numrig