Corretta gestione modifica rata in prima nota

git-svn-id: svn://10.65.10.50/trunk@1942 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-10-12 15:02:46 +00:00
parent a57f4d2b69
commit 919e99206f
9 changed files with 1459 additions and 1412 deletions

View File

@ -552,6 +552,11 @@ void TPrimanota_application::init_modify_mode(TMask& m)
{ {
const long numreg = m.get_long(F_NUMREG); const long numreg = m.get_long(F_NUMREG);
partite().add_numreg(numreg); partite().add_numreg(numreg);
if (iva() != nessuna_iva)
{
const TPartita* game = partite().first();
m.enable(DLG_DELREC, game == NULL || !game->esistono_abbuoni_diffcam());
}
} }
calcola_saldo(); // Verifica eventuali sbilanci contabili calcola_saldo(); // Verifica eventuali sbilanci contabili

View File

@ -1864,14 +1864,14 @@ bool TPrimanota_application::totdocval_handler(TMask_field& f, KEY key)
if (totale.is_zero()) if (totale.is_zero())
{ {
totval *= cambio; totval *= cambio;
m.set(F_TOTALE, totval.string()); m.set(F_TOTALE, totval.string(), TRUE);
} }
else else
{ {
if (cambio.is_zero()) if (cambio.is_zero())
{ {
totale /= totval; totale /= totval;
m.set(S_CAMBIO, totale.string()); m.set(S_CAMBIO, totale.string(), TRUE);
} }
} }
} }

View File

@ -162,6 +162,10 @@ bool TPrimanota_application::cambio_handler(TMask_field& f, KEY key)
{ {
const real ex(f.get()); const real ex(f.get());
pag->set_cambio(ex); pag->set_cambio(ex);
TSheet_field& ps = app().pags();
pag->set_sheet(ps);
ps.force_update();
} }
} }
return TRUE; return TRUE;
@ -292,11 +296,14 @@ bool TPrimanota_application::read_scadenze(TMask& m)
const real spese(0.0); const real spese(0.0);
TPagamento& pag = *pagamento(); TPagamento& pag = *pagamento();
bool in_valuta = FALSE;
if (cambio.sign() > 0) if (cambio.sign() > 0)
{ {
pag.set_cambio(cambio); pag.set_cambio(cambio);
imponibile = real(m.get(S_TOTDOCVAL)); imponibile = real(m.get(S_TOTDOCVAL));
imposta = ZERO; imposta = ZERO;
in_valuta = TRUE;
} }
else else
{ {
@ -335,16 +342,20 @@ bool TPrimanota_application::read_scadenze(TMask& m)
// se invece la maschera contiene importi diversi da quelli // se invece la maschera contiene importi diversi da quelli
// registrati si passa la palla al culano/a // registrati si passa la palla al culano/a
// TBC controllo se imponibile deve contenere le spese // TBC controllo se imponibile deve contenere le spese
else if ((imponibile + imposta) != partita.get_real(PART_IMPORTO) || else
imposta != partita.get_real(PART_IMPOSTA) ||
spese != partita.get_real(PART_SPESE))
{ {
fromscratch = !yesno_box("Gli importi totali delle scadenze sono stati modificati rispetto" if ((imponibile + imposta) != partita.get_real(in_valuta ? PART_IMPORTOVAL : PART_IMPORTO) ||
" all'ultima registrazione. Si desidera mantenere" imposta != partita.get_real(PART_IMPOSTA) ||
" comunque la rateazione precedente"); spese != partita.get_real(PART_SPESE))
// nel qual caso, of course, si disabilitano gli automatismi {
if(!fromscratch) m.field(FS_RECALC).set(""); fromscratch = !yesno_box("Gli importi totali delle scadenze sono stati modificati rispetto"
" all'ultima registrazione. Si desidera mantenere"
" comunque la rateazione precedente");
// nel qual caso, of course, si disabilitano gli automatismi
if(!fromscratch) m.field(FS_RECALC).set("");
}
} }
if (fromscratch) if (fromscratch)
{ {
pag.set_rate_auto(); pag.set_rate_auto();
@ -382,6 +393,12 @@ bool TPrimanota_application::read_scadenze(TMask& m)
m.set(FS_AGENTE, scadenza.get(SCAD_CODAG)); m.set(FS_AGENTE, scadenza.get(SCAD_CODAG));
} }
} }
m.set(FS_RDIFFER, pag.rate_differenziate() ? "1" : "2");
m.set(FS_NAMEPAG, pag.name());
m.set(FS_TIPOPR, pag.desc_tpr());
m.set(FS_MCOMM, pag.mese_commerciale() ? "X" : "");
m.set(FS_RECALC, "X", TRUE);
m.set(FS_NRATE, pag.n_rate());
} //else } //else
} }
else else
@ -400,14 +417,10 @@ bool TPrimanota_application::read_scadenze(TMask& m)
m.disable(-2); // Disabilita fornitore m.disable(-2); // Disabilita fornitore
m.disable(-3); // Disabilita cambio m.disable(-3); // Disabilita cambio
m.disable(F_CODPAG); // Disabilita codice pagamento m.disable(F_CODPAG); // Disabilita codice pagamento
// m.disable(F_ANNORIF); // Disabilita anno partita
// m.disable(F_NUMRIF); // Disabilita numero partita
m.disable(FS_RESET); // Disabilita tasto di reset m.disable(FS_RESET); // Disabilita tasto di reset
m.set(FS_RECALC, "", TRUE); // Disabilita ricalcolo automatico m.set(FS_RECALC, "", TRUE); // Disabilita ricalcolo automatico
m.disable(FS_RECALC); m.disable(FS_RECALC);
} }
else
m.set(FS_RECALC, "X");
return TRUE; return TRUE;
} }

View File

@ -490,7 +490,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
if (!diff.is_zero()) if (!diff.is_zero())
{ {
TToken_string& rdiff = scadenze.row(scadenze.add("")); TToken_string& rdiff = scadenze.row(scadenze.add(""));
rdiff.add("Differenza cambio rata ", 4); rdiff << ra; rdiff.add("Differ. cambio rata ", 4); rdiff << ra;
add_importo(rdiff, diff.normalize()); add_importo(rdiff, diff.normalize());
} }
} }
@ -550,7 +550,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
if (lastrow > 0) if (lastrow > 0)
{ {
TToken_string& sp = scadenze.row(scadenze.add("")); TToken_string& sp = scadenze.row(scadenze.add(""));
sp.add("Saldo partita ", 4); sp << anno << ' ' << num; sp.add("Saldo ", 4); sp << anno << ' ' << num;
add_importo(sp, tot_lit.normalize()); add_importo(sp, tot_lit.normalize());
add_importo(sp, tot_val.normalize(), 2); add_importo(sp, tot_val.normalize(), 2);
} }

View File

@ -9,7 +9,6 @@ NUMBER 102 15
BEGIN BEGIN
PROMPT 1 3 "Importo " PROMPT 1 3 "Importo "
PICTURE "." PICTURE "."
FLAGS "R"
END END
BOOLEAN 111 BOOLEAN 111
@ -22,14 +21,12 @@ NUMBER 103 15 2
BEGIN BEGIN
PROMPT 1 4 "Importo valuta " PROMPT 1 4 "Importo valuta "
PICTURE ".2" PICTURE ".2"
FLAGS "R"
END END
NUMBER 104 8 3 NUMBER 104 6 2
BEGIN BEGIN
PROMPT 1 2 "Percentuale " PROMPT 1 2 "Percentuale "
PICTURE ".3" PICTURE ".2"
FLAGS "R"
END END
NUMBER 105 2 0 NUMBER 105 2 0

View File

@ -36,7 +36,7 @@ BEGIN
ITEM "4|Uguali finche' possibile" MESSAGE DISABLE,FS_NRATE ITEM "4|Uguali finche' possibile" MESSAGE DISABLE,FS_NRATE
END END
NUMBER FS_NRATE 3 0 NUMBER FS_NRATE 3
BEGIN BEGIN
PROMPT 36 6 "Numero di rate " PROMPT 36 6 "Numero di rate "
END END
@ -142,7 +142,7 @@ BEGIN
USE AGE USE AGE
INPUT CODTAB FS_AGENTE INPUT CODTAB FS_AGENTE
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
DISPLAY "Descrizione @50" S0 DISPLAY "Descrizione@50" S0
OUTPUT FS_AGENTE CODTAB OUTPUT FS_AGENTE CODTAB
OUTPUT FS_DESCAGENTE S0 OUTPUT FS_DESCAGENTE S0
CHECKTYPE NORMAL CHECKTYPE NORMAL
@ -153,7 +153,7 @@ BEGIN
PROMPT 27 10 "" PROMPT 27 10 ""
USE AGE KEY 2 USE AGE KEY 2
INPUT S0 FS_DESCAGENTE INPUT S0 FS_DESCAGENTE
DISPLAY "Descrizione @50" S0 DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
COPY OUTPUT FS_AGENTE COPY OUTPUT FS_AGENTE
CHECKTYPE NORMAL CHECKTYPE NORMAL
@ -165,7 +165,7 @@ BEGIN
ITEM "Scadenza@10" ITEM "Scadenza@10"
ITEM "Importo@15" ITEM "Importo@15"
ITEM "In Valuta@15" ITEM "In Valuta@15"
ITEM "Percentuale@12" ITEM "%@6"
ITEM "Tipo" ITEM "Tipo"
ITEM "Pagamento@32" ITEM "Pagamento@32"
ITEM "Ns.ABI" ITEM "Ns.ABI"

View File

@ -130,7 +130,7 @@ void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
_dirty = FALSE; _dirty = FALSE;
if (n == 0 || n == n_rate()) return; if (n == 0 || n == n_rate()) return;
real p = real(100) / real(n); real p = real(100) / real(n);
p.round(2); p.round(2);
int nr = n_rate(); int nr = n_rate();
int first = _tpr < 4 ? 0 : 1; int first = _tpr < 4 ? 0 : 1;
@ -348,7 +348,7 @@ void TPagamento::remove_rata(int i)
TToken_string& TPagamento::add_rata(real perc, int day, int type, const char* ulc) TToken_string& TPagamento::add_rata(real perc, int day, int type, const char* ulc)
{ {
TToken_string* tt = new TToken_string(16); TToken_string* tt = new TToken_string(64);
tt->add(day); // scadenza tt->add(day); // scadenza
tt->add(perc.string()); // percentuale tt->add(perc.string()); // percentuale
@ -437,13 +437,13 @@ TToken_string& TPagamento::set_rata(int index, const real& howmuch, const real&
if (nwr) tt = new TToken_string(64); if (nwr) tt = new TToken_string(64);
TDate oldd = index > 0 ? data_rata(index -1) : _inizio; const TDate oldd = index > 0 ? data_rata(index -1) : _inizio;
int day = date - oldd; const long day = date - oldd;
real toshare(_tpr < 4 ? _firstr : _secndr); const real toshare(_tpr < 4 ? _firstr : _secndr);
real hm = howmuch; real hm = howmuch;
if (index == first && _tpr > 0 && _tpr < 4) if (index == first && _tpr > 0 && _tpr < 4)
hm -= _secndr; hm -= _secndr;
real perc = (_tpr > 3 && index == 0) ? ZERO : hm/toshare; real perc = (_tpr > 3 && index == 0) ? ZERO : hm/toshare;
perc *= real(100.0); perc *= real(100.0);
@ -608,6 +608,13 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// calcola defaults per tipo pagamento e scadenza // calcola defaults per tipo pagamento e scadenza
// nel caso di rate nuove // nel caso di rate nuove
oldscad = scad_rata(1); oldscad = scad_rata(1);
if (_mcomm)
{
int mesi = oldscad / 30;
if (mesi == 0) mesi = 1;
oldscad = 30 * mesi;
}
} }
if (oldscad <= 0) oldscad = 30; if (oldscad <= 0) oldscad = 30;
@ -765,19 +772,17 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
int type = oldtype; int type = oldtype;
int nscd = oldscad; int nscd = oldscad;
int frs = (rdiff == 3 || rdiff == 4) ? row+1 : first; const int frs = (rdiff == 3 || rdiff == 4) ? row+1 : first;
real mx = (rdiff == 3 || rdiff == 4) ? remainder : rmax; const real mx = (rdiff == 3 || rdiff == 4) ? remainder : rmax;
// cancelliamo tutto, va' // cancelliamo tutto, va'
for (int j = frs; j < srate.items(); j++) for (int j = srate.items()-1; j >= frs; j--) _rate.destroy(j);
_rate.destroy(j);
if (rdiff == 2 && srate.items() > 1) const int n = srate.items(); // questo rimane per forza costante
if (rdiff == 2 && n > 1)
{ {
// HERE // HERE
real tot = is_perc_modified ? real(100.0) : (_tpr < 4 ? _firstr : _secndr);
int n = srate.items(); // questo rimane per forza costante
real tot = is_perc_modified ? real(100.0) : (_tpr < 4 ? _firstr : _secndr);
real delta = is_perc_modified ? ZERO : real delta = is_perc_modified ? ZERO :
((_tpr > 0 && _tpr) < 4 ? _secndr : ZERO); ((_tpr > 0 && _tpr) < 4 ? _secndr : ZERO);
real nimp(new_value); real nimp(new_value);
@ -791,7 +796,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (nimp.sign() < 0) { _rate = srate; return P_NEG; } if (nimp.sign() < 0) { _rate = srate; return P_NEG; }
real remainder = tot - nimp; real remainder = tot - nimp;
real div = remainder / real(n - 1); real div = remainder / real(n - 1);
div.round(is_perc_modified ? 3 : _round); div.round(is_perc_modified ? 2 : _round);
nimp = tot - (div * real(n-1)); nimp = tot - (div * real(n-1));
for (int k = first; k < n; k++) for (int k = first; k < n; k++)
@ -806,7 +811,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
next_scad(dd,nscd,mcomm,k); next_scad(dd,nscd,mcomm,k);
set_rata(k, is_perc_modified ? (k == first ? nimp : div) : ZERO, set_rata(k, is_perc_modified ? (k == first ? nimp : div) : ZERO,
nscd, type); nscd, type, NULL, NULL, _inited ? dd.string() : NULL);
if (!is_perc_modified) if (!is_perc_modified)
set_imprata (k, k == first ? (nimp + delta) : div); set_imprata (k, k == first ? (nimp + delta) : div);
} }
@ -981,7 +986,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
{ {
real reminder = toshare - rfirst; real reminder = toshare - rfirst;
real rdiv = reminder / real(_rate.items() - (1+first)); real rdiv = reminder / real(_rate.items() - (1+first));
rdiv.round( is_perc_modified ? _round : 3); rdiv.round( is_perc_modified ? _round : 2);
rfirst += reminder - (rdiv * real(_rate.items() - (1+first))); rfirst += reminder - (rdiv * real(_rate.items() - (1+first)));
rvl = rdiv; rvl = rdiv;
} }
@ -991,6 +996,14 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
rfirst += _secndr; rfirst += _secndr;
tr.add((j == first ? rfirst.string() : rvl.string()), is_perc_modified ? 4 : 1); tr.add((j == first ? rfirst.string() : rvl.string()), is_perc_modified ? 4 : 1);
if (_cambio != 1.0)
{
real implit(tpay_rata(j));
implit *= _cambio;
implit.round();
tr.add(implit.string(), 7);
}
} }
// se e' il caso aggiungi l'importo fisso sulla prima rata // se e' il caso aggiungi l'importo fisso sulla prima rata
@ -1283,8 +1296,6 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad)
const bool in_valuta = _cambio != 1.0; const bool in_valuta = _cambio != 1.0;
// si istanzia uno sheet di primanota // si istanzia uno sheet di primanota
// sf.destroy();
for (int i = 0; i < n_rate(); i++) for (int i = 0; i < n_rate(); i++)
{ {
TToken_string& ts = sf.row(i); TToken_string& ts = sf.row(i);

View File

@ -877,6 +877,19 @@ bool TPartita::utilizzata(int nrigp) const
return _unassigned.exist(nrigp); return _unassigned.exist(nrigp);
} }
bool TPartita::esistono_abbuoni_diffcam() const
{
for (int r = last(); r > 0; r = pred(r))
{
const TRiga_partite& row = riga(r);
if (!row.get_real(PART_ABBUONI).is_zero() || !row.get_real(PART_DIFFCAM).is_zero())
return TRUE;
}
return FALSE;
}
bool TPartita::modifica_pagamento(const TRectype& new_pag, const TValuta& valuta, bool TPartita::modifica_pagamento(const TRectype& new_pag, const TValuta& valuta,
char& old_ap, TImporto& old_abb, TImporto& old_diffcam, char& old_ap, TImporto& old_abb, TImporto& old_diffcam,
char& new_ap, TImporto& new_abb, TImporto& new_diffcam) char& new_ap, TImporto& new_abb, TImporto& new_diffcam)
@ -1094,7 +1107,14 @@ void TPartita::scollega_pagamenti(int r, int s)
pag.put(PAGSCA_ACCSAL, 'A'); pag.put(PAGSCA_ACCSAL, 'A');
pag.put(PAGSCA_NRIGA, (int)TPartita::UNASSIGNED); pag.put(PAGSCA_NRIGA, (int)TPartita::UNASSIGNED);
pag.put(PAGSCA_NRATA, (int)TPartita::UNASSIGNED); pag.put(PAGSCA_NRATA, (int)TPartita::UNASSIGNED);
_unassigned.add_row(pag); if (_unassigned.exist(j))
{
TRectype& unas = _unassigned.row(j, FALSE);
somma(pag, unas, PAGSCA_IMPORTO);
somma(pag, unas, PAGSCA_IMPORTOVAL);
}
else
_unassigned.add_row(pag);
sc.rows_array().destroy_row(j); sc.rows_array().destroy_row(j);
} }
} }

View File

@ -202,6 +202,7 @@ public:
TRectype& pagamento(int nriga, int nrata, int nrigp); TRectype& pagamento(int nriga, int nrata, int nrigp);
bool rata_chiusa(int nriga, int nrata) const; bool rata_chiusa(int nriga, int nrata) const;
bool esiste(int nriga, int nrata = 0, int nrigp = 0) const; bool esiste(int nriga, int nrata = 0, int nrigp = 0) const;
bool esistono_abbuoni_diffcam() const;
// assegna riga e figli ad altra partita // assegna riga e figli ad altra partita
void sposta_riga(int r, TPartita& part); void sposta_riga(int r, TPartita& part);