Pagament and corrections and recalcuation of scadenzs reorganized

but not over yet


git-svn-id: svn://10.65.10.50/trunk@1804 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1995-09-11 10:53:00 +00:00
parent 187f24e587
commit 4f5f83485f
7 changed files with 319 additions and 76 deletions

View File

@ -96,6 +96,7 @@ TMask* TPrimanota_application::load_mask(int n)
TSheet_field& ps = (TSheet_field&)m->field(FS_RATESHEET);
ps.set_notify(pag_notify);
m->set_handler(FS_RESET, reset_handler);
m->set_handler(FS_NRATE, nrate_handler);
}
_iva_showed = FALSE;
case 1:

View File

@ -113,6 +113,7 @@ class TPrimanota_application : public TRelation_application
static bool cg_conto_handler(TMask_field& f, KEY key);
static bool codpag_handler(TMask_field& f, KEY key);
static bool reset_handler(TMask_field& f, KEY key);
static bool nrate_handler(TMask_field& f, KEY key);
static bool iva_notify(TSheet_field& s, int r, KEY key);
static bool iva_handler(TMask_field& f, KEY key);

View File

@ -4,6 +4,7 @@
// --------------------------------------------------------------------------
#include <sheet.h>
#include <utility.h>
#include "pagament.h"
#include "saldacon.h"
@ -98,6 +99,7 @@ bool TPrimanota_application::pag_notify(TSheet_field&, int r, KEY k)
rdiff, mcomm, need_recalc);
// see if rdiff changed
msk->set(FS_RDIFFER, pag.rate_differenziate() ? "1" : "2");
msk->set(FS_NRATE, format("%d", pag.n_rate()));
}
if (!recalc)
{
@ -147,7 +149,7 @@ bool TPrimanota_application::codpag_handler(TMask_field& f, KEY key)
if (key == K_TAB && f.focusdirty() && m.is_running() && app().is_saldaconto())
{
const TString16 dt(m.get(F_DATAREG));
const TString16 dt(m.get(F_DATADOC));
app().set_pagamento(f.get(), dt);
app().set_scadenze(m);
}
@ -166,6 +168,24 @@ bool TPrimanota_application::reset_handler(TMask_field& f, KEY key)
return TRUE;
}
bool TPrimanota_application::nrate_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
TSheet_field& ps = (TSheet_field&)m.field(FS_RATESHEET);
if (key == K_TAB && m.is_running() && app().is_saldaconto())
{
if (app().pagamento() != NULL)
{
app().pagamento()->set_numero_rate(atoi(f.get()), /*TBI*/-1);
if (app().pagamento()->dirty())
app().pagamento()->set_sheet(ps);
}
else f.set("");
}
return TRUE;
}
bool TPrimanota_application::numrif_handler(TMask_field& f, KEY key)
{
@ -223,7 +243,7 @@ bool TPrimanota_application::numrif_handler(TMask_field& f, KEY key)
else
{
f.mask().enable_page(2);
app().set_pagamento(codpag, f.mask().get(F_DATAREG));
app().set_pagamento(codpag, f.mask().get(F_DATADOC));
app().set_scadenze(f.mask());
}
}
@ -323,7 +343,8 @@ void TPrimanota_application::set_scadenze(TMask& m)
m.set(FS_TIPOPR, pag.desc_tpr());
m.set(FS_MCOMM, pag.mese_commerciale() ? "X" : "");
m.set(FS_RECALC, "X", TRUE);
pag.set_total(imponibile, imposta, spese);
pag.set_rate_auto();
bool new_part = TRUE;
@ -332,7 +353,8 @@ void TPrimanota_application::set_scadenze(TMask& m)
// prepara lo sheet
pag.set_sheet(ps);
_pag_rows = ps.rows_array();
_pag_rows = ps.rows_array();
m.set(FS_NRATE, pag.n_rate());
// se la prima rata e' fissa non si tocca
if (pag.tipo_prima_rata() > 3)
@ -529,6 +551,7 @@ void TPrimanota_application::write_scadenze(const TMask& m)
int numrig = 1; // TBC
int row = part.prima_fattura(nreg);
// TBC controllo aggiunta su partita se ridefinita a culo
TRiga_partite& partita = row == -1 ? part.nuova_riga() : part.riga(row);
TPagamento& pag = *pagamento();

View File

@ -9,3 +9,4 @@
#define FS_TIPOPR 509
#define FS_MCOMM 510
#define FS_RESET 511
#define FS_NRATE 512

View File

@ -30,34 +30,40 @@ END
RADIOBUTTON FS_RDIFFER 31
BEGIN
PROMPT 1 4 "Opzioni ricalcolo rate"
ITEM "1|Differenziate"
ITEM "2|Uguali"
ITEM "3|Uguali dall'ultima modificata"
ITEM "4|Uguali finche' possibile"
ITEM "1|Differenziate" MESSAGE DISABLE,FS_NRATE
ITEM "2|Uguali (obbligate dalla 2a)" MESSAGE ENABLE,FS_NRATE
ITEM "3|Uguali dall'ultima modificata" MESSAGE DISABLE,FS_NRATE
ITEM "4|Uguali finche' possibile" MESSAGE DISABLE,FS_NRATE
END
NUMBER FS_NRATE 3 0
BEGIN
PROMPT 36 8 "Numero di rate "
END
BOOLEAN FS_RECALC
BEGIN
PROMPT 53 5 "Ricalcolo automatico"
MESSAGE TRUE ENABLE,FS_RDIFFER|ENABLE,FS_MCOMM
MESSAGE FALSE DISABLE,FS_RDIFFER|DISABLE,FS_MCOMM
PROMPT 58 7 "Ricalcolo automatico"
MESSAGE TRUE ENABLE,FS_RDIFFER|ENABLE,FS_MCOMM|K_SPACE,FS_RDIFFER
MESSAGE FALSE DISABLE,FS_RDIFFER|DISABLE,FS_MCOMM|DISABLE,FS_NRATE
HELP "Attiva/disattiva il ricalcolo automatico delle scadenze"
END
BOOLEAN FS_MCOMM
BEGIN
PROMPT 53 6 "Mese commerciale"
PROMPT 36 7 "Mese commerciale"
END
STRING FS_NAMEPAG 27
BEGIN
PROMPT 36 7 "Pagamento "
PROMPT 36 5 "Pagamento "
FLAGS "D"
END
STRING FS_TIPOPR 27
BEGIN
PROMPT 36 8 "Tipo prima rata "
PROMPT 36 6 "Tipo prima rata "
FLAGS "D"
END

View File

@ -1,4 +1,5 @@
#include <utility.h>
#include <relapp.h>
#include "pagament.h"
@ -126,7 +127,7 @@ void TPagamento::set_tipo_prima_rata(int v, int sscad)
_dirty = TRUE;
}
void TPagamento::set_numero_rate(int n, int sscad)
void TPagamento::set_numero_rate(int n, int sscad, int rdiff)
{
_dirty = FALSE;
if (n == 0 || n == n_rate()) return;
@ -136,8 +137,66 @@ void TPagamento::set_numero_rate(int n, int sscad)
int nr = n_rate();
int first = _tpr < 4 ? 0 : 1;
real sum = 0.0;
int i = 0;
if (_inited || (!_inited && rdiff == 1)) // se e' inited rdiff e' 2 per forza
{
real tot = _inited ? (_tpr < 4 ? _firstr : _secndr) : real(100.0);
if (n == 1)
{
if (_inited) set_imprata(first, tot);
set_percrata(first, real(100.0));
if (_inited && _tpr > 0 && _tpr < 4)
set_imprata(first, tpay_rata(first) + _secndr);
i = first + 1; // per rimozione successiva
}
else
{
if (nr == first + 1)
{
// suddividi equamente e riaggiusta la percentuale di conseguenza
real div = tot / real(n);
real perc = real(100.0)*(div/tot);
for (i = first; i < n; i++)
{
if (i > 0)
add_rata(perc, (sscad == -1 ? scad_rata(0) : sscad), tipo_rata(0));
if (_inited) set_imprata (i, div);
set_percrata(i, perc);
}
if (_inited && _tpr > 0 && _tpr < 4)
set_imprata(0, tpay_rata(0) + _secndr);
}
else if (nr > first + 1)
{
// dalla prima nota e' abilitato solo se rdiff == 2
// e' selezionato UGUALI: devo: lasciare la prima
// rata com'e' (a meno che non ce ne sia una sola) e
// suddividere il resto dell'importo tra le altre
real rfirst = _inited ? tpay_rata(first) : perc_rata(first);
if (_inited && _tpr > 0 && _tpr < 4) rfirst -= _secndr;
real rest = tot - rfirst;
const real div = rest / real(n - 1);
real perc = real(100.0)*(div/tot);
for (i = first+1; i < n; i++)
{
if (i >= nr)
add_rata(perc, (sscad == -1 ? (i < nr ? scad_rata(i) : scad_rata(nr-1)) : sscad),
tipo_rata(nr-1));
if (_inited) set_imprata (i, div);
set_percrata(i, perc);
}
}
}
}
for (int i = first; sum < real(100.0); i++)
else
{
for (i = first; sum < real(100.0); i++)
{
if ((real(100.0) - sum) < p)
p = real(100.0) - sum;
@ -158,7 +217,8 @@ void TPagamento::set_numero_rate(int n, int sscad)
i == 0 ? (i < nr ? scad_rata(0) : 0):
(sscad == -1 ? (i < nr ? scad_rata(i) : scad_rata(nr-1)) : sscad),
(i < nr ? tipo_rata(i) : tipo_rata(nr-1)));
}
}
}
// erase remaining
for (; i < nr; i++)
_rate.add(NULL,i);
@ -186,8 +246,8 @@ void TPagamento::next_scad(TDate& d, int scad, bool mcomm, int rata)
// la palla del febbraio & c.
if (rata > 1)
{
TDate oldd(data_rata(rata-2));
if (oldd.day() > dy) dy = oldd.day();
TDate oldd(data_rata(rata-2));
if (oldd.day() > dy) dy = oldd.day();
}
d.set_day(1); // il giorno 1 ce l'hanno tutti
@ -196,14 +256,14 @@ void TPagamento::next_scad(TDate& d, int scad, bool mcomm, int rata)
d.set_end_month();
if (!last && dy < d.day())
d.set_day(dy);
d.set_day(dy);
}
else
{
d += scad;
d += scad;
}
// riaggiusta la minchia se ci sono scadenze fissate
// riaggiusta se ci sono scadenze fissate
if (_fixd[0] != 0 || _fixd[1] != 0 || _fixd[2] != 0)
{
for (int i = 0; i < 3; i++)
@ -323,6 +383,14 @@ void TPagamento::set_imprata(int i, real r)
tt.add((const char*)d, 3);
tt.add(r.string(), 4);
}
void TPagamento::set_percrata(int i, real r)
{
TToken_string& tt = (TToken_string&)_rate[i];
TDate d = _inizio;
tt.add(r.string(), 1);
}
TToken_string& TPagamento::set_rata(int index, const real& howmuch,
const TDate& date, int type,const char* ulc, bool pagato)
@ -374,13 +442,13 @@ word TPagamento::validate() const
int first = _tpr < 4 ? 0 : 1;
real toshare(_tpr < 4 ? _firstr : _secndr);
TDistrib ds(toshare,0);
// TDistrib ds(toshare,0);
// check percentages & prepare slicer
for (int i = first; i < n_rate(); i++)
{
real p(perc_rata(i));
ds.add(p);
// ds.add(p);
r += p;
}
@ -390,15 +458,17 @@ word TPagamento::validate() const
if (_inited)
{
ds.init(toshare);
// RIMOSSO in quanto con rate uguali non si usa la percentuale,
// per evitare merdaglia
// ds.init(toshare);
// check importi rate consistenti con la percentuale
for (int i = first; i < n_rate(); i++)
{
real r1(tpay_rata(i));
real r2(ds.get());
if (r1 != r2)
{ res |= P_IMPNC; break; }
}
// for (int i = first; i < n_rate(); i++)
// {
// real r1(tpay_rata(i));
// real r2(ds.get());
// if (r1 != r2)
// { res |= P_IMPNC; break; }
// }
// check errori date scadenze (se istanziate)
TDate d(data_rata(0));
@ -426,6 +496,10 @@ void TPagamento::strerr(word err, TString& s)
s << "\n Le scadenze non sono consecutive";
if (err & P_INIZIO)
s << "\n La prima rata e' antecedente alla data movimento";
if (err & P_NEG)
s << "\n L'importo dato e' inferiore al minimo possibile";
if (err & P_TROP)
s << "\n L'importo dato e' superiore al massimo possibile";
}
const char* TPagamento::desc_tpr() const
@ -457,7 +531,7 @@ const char* TPagamento::desc_tipo(int i) const
case 5: o = "Paghero'"; break;
case 6: o = "Lettera di credito"; break;
case 7: o = "Tratta accettata"; break;
case 8: o = "Rapporti interbancari diretti"; break;
case 8: o = "Rapporti interban. diretti"; break;
case 9: o = "Bonifici"; break;
case 10: o = "Altro pagamento"; break;
}
@ -488,7 +562,6 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
int first = _tpr < 4 ? 0 : 1;
TArray srate(_rate); // rate come erano
if (srate.items() > 1)
{
// calcola defaults per tipo pagamento e scadenza
@ -502,7 +575,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
if (new_value != NULL)
{
newv = new_value;
rmax = is_perc_modified? (real) 100.0 : (_tpr < 4 ? _firstr : _secndr);
rmax = is_perc_modified? real(100.0) : (_tpr < 4 ? _firstr : _secndr);
if (newv > rmax) return P_RSUM;
}
@ -514,11 +587,20 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
{
if (typ != NULL)
{
TToken_string& tt = rata(row);
TToken_string& ss = (TToken_string&)srate[row];
tt.add(typ,2);
ss.add(typ,2);
// no error is possible
for (int k = 0; k < srate.items(); k++)
{
// deve farlo per tutte dalla 1 in poi se rdiff == 2,
// soltanto per row diversamente
if ((rdiff == 2 && row > 0 && k > 0) || k == row)
{
TToken_string& tt = rata(k);
TToken_string& ss = (TToken_string&)srate[k];
tt.add(typ,2);
ss.add(typ,2);
need_recalc = TRUE;
// no error is possible
}
}
}
if (scad != NULL)
@ -591,7 +673,15 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// *** 10/8/95: se uguali e non e' multiplo intero lo teniamo cosi' e poi
// *** aggiungiamo alla prima rata utile
// if (rdiff == 2 && !((rmax % newv.integer()) == ZERO))
// rdiff = 1;
// rdiff = 1;
// *** 5/9/85: UGUALI (2) significa la seguente menata: se c'e' una sola rata
// *** uguale al totale importo, come prima; diversamente, la prima rata
// *** va mantenuta uguale comunque sia, e occorre ridefinire le restanti in
// *** modo che siano uguali. In questo caso deve far fede il NUMERO di RATE
// *** indicato, che in prima nota non c'e' e va quindi inserito (porcoddio).
// si registrano rate UGUALI soltanto se specificato UGUALI
// il che non e' sorprendente, ma coi tempi che corrono...
_rdiff = (rdiff == 1 || rdiff == 3 || rdiff == 4);
// procedi
@ -600,14 +690,14 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// cancella tutte le rate successive, aggiungi un'unica rata
// con il resto dell'importo
if (row < (srate.items()-1))
{
TToken_string& trt = rata(row+1);
trt.add(remainder.string(), is_perc_modified ? 1 : 4);
for(int j = row+2; j < srate.items(); j++)
_rate.add(NULL,j);
}
{
TToken_string& trt = rata(row+1);
trt.add(remainder.string(), is_perc_modified ? 1 : 4);
for(int j = row+2; j < srate.items(); j++)
_rate.add(NULL,j);
}
else
{
{
// l'importante e' esagerare
for(int j = row+1; j < srate.items(); j++)
_rate.add(NULL,j);
@ -621,7 +711,7 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
next_scad(dd,oldscad,mcomm,row);
trt.add(dd.string(),3);
}
}
}
}
else // rate non differenziate (dall'inizio o da row)
{
@ -639,12 +729,96 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
// cancelliamo tutto, va'
for (int j = frs; j < srate.items(); j++)
_rate.add(NULL,j);
if (rdiff != 4)
_rate.add(NULL,j);
if (rdiff == 2 && srate.items() > 1)
{
// HERE
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 :
((_tpr > 0 && _tpr) < 4 ? _secndr : ZERO);
real nimp(new_value);
// se ho modificato la prima, divido il resto nelle successive
// lasciando costante il numero rate
if (row == first)
{
if (!delta.is_zero()) nimp -= delta;
// inferiore al minimo
if (nimp.sign() < 0) { _rate = srate; return P_NEG; }
real remainder = tot - nimp;
real div = remainder / real(n - 1);
div.round(is_perc_modified ? 3 : _round);
nimp = tot - (div * real(n-1));
for (int k = first; k < n; k++)
{
TToken_string& trt = (TToken_string&)srate[k];
if (_inited) dd = trt.get(3);
type = atoi(trt.get(2));
nscd = k == 0 ? 0 : atoi(trt.get(0));
if (type == 0) type = 1;
if (k > 0 && nscd == 0) nscd = oldscad;
if (_inited && dd == lastdate && k > 0)
next_scad(dd,nscd,mcomm,k);
set_rata(k, is_perc_modified ? (k == first ? nimp : div) : ZERO,
nscd, type);
if (!is_perc_modified)
set_imprata (k, k == first ? (nimp + delta) : div);
}
}
else
{
// se ho modificato la seconda o oltre, faccio tutte uguali dalla
// seconda in poi; la prima resta com'e' se possibile, mentre se
// c'e' un resto glielo sommo.
// Dunque: prendo la prima, calcolo il resto, divido per quella nuova,
// se resto lo sommo alla prima, e faccio quante rate servono
TToken_string& trt = (TToken_string&)srate[first];
real rfirst(is_perc_modified ? trt.get(1) : trt.get(4));
if (!delta.is_zero()) rfirst -= delta;
real rest = tot - rfirst;
real div = rest / nimp;
if (div < real(1.0)) { _rate = srate; return P_TROP; }
int nr = (int)div.integer() + (_tpr > 4 ? 2 : 1);
real reminder = rest - (nimp * real(nr -1));
rfirst += reminder;
for (int k = first; k < nr; k++)
{
nscd = oldscad;
type = _def_tpr;
TString16 ulc(_def_ulc);
if (srate.items() > k)
{
TToken_string& trt = (TToken_string&)srate[k];
if (_inited) dd = trt.get(3);
type = atoi(trt.get(2));
nscd = atoi(trt.get(0));
ulc = trt.get(5);
}
if (type == 0) type = 1;
if (_inited && dd == lastdate && k > 0)
next_scad(dd,nscd,mcomm,k);
set_rata(k, is_perc_modified ? (k == first ? rfirst : nimp) : ZERO,
nscd, type, ulc);
if (!is_perc_modified)
set_imprata (k, k == first ? (rfirst + delta) : nimp);
}
}
}
else if (rdiff != 4)
for (j = frs; sum < mx; j++)
{
// TBI: qui mod se rdiff == 2
// se c'e' la vecchia rata si tengono i parametri
// altrimenti si calcolano
if (j < srate.items())
@ -746,23 +920,45 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
for (int j = first; j < _rate.items(); j++)
{
real rvl = is_perc_modified ? perc_rata(j) : tpay_rata(j);
// togli pezxo di troppo
if (!is_perc_modified && j == first && _tpr > 0 && _tpr < 4)
rvl -= _secndr;
real zpx = rvl/rmax; // percentuale
dt.add(zpx);
}
for (j = first; j < _rate.items(); j++)
{
TToken_string& tr = rata(j);
real rvl = dt.get();
tr.add(rvl.string(), is_perc_modified ? 4 : 1);
{
real rfirst(0.0);
TToken_string& tr = rata(j);
real rvl = dt.get();
if (j == first)
{
rfirst = rvl;
if (rdiff == 2)
{
real reminder = toshare - rfirst;
real rdiv = reminder / real(_rate.items() - (1+first));
rdiv.round( is_perc_modified ? _round : 3);
rfirst += reminder - (rdiv * real(_rate.items() - (1+first)));
rvl = rdiv;
}
}
if (is_perc_modified && j == first && _tpr > 0 && _tpr < 4)
rfirst += _secndr;
tr.add((j == first ? rfirst.string() : rvl.string()), is_perc_modified ? 4 : 1);
}
// se e' il caso aggiungi l'importo fisso sulla prima rata
if (_inited && _tpr > 0 && _tpr < 4)
{
TToken_string& tr = rata(0);
real tot = tpay_rata(0) + _firstr;
tr.add(tot.string(), 4);
}
// if (_inited && _tpr > 0 && _tpr < 4)
// {
// TToken_string& tr = rata(0);
// real tot = tpay_rata(0) + _secndr;
// tr.add(tot.string(), 4);
// }
}
@ -771,7 +967,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
} // new_value != NULL
}
else // i != row modified
{
{
if (rdiff == 2) continue;
if (i > 0 && !((perc_rata(i-1) == perc_rata(i))))
{
if (rdiff == 2) rdiff = 1;
@ -873,7 +1070,8 @@ int TPagamento::write(TTable& r)
// Scrive soltanto le righe di pagamento; si assume sia stata chiamata da una
// relapp, che ha scritto il file principale
TString s(16); int err = NOERR;
TString s(16); int err = NOERR;
for (int i = 0; err == NOERR && i < n_rate(); i++)
{
r.zero(); s.format("%s%3d",(const char*)_code, i);
@ -890,6 +1088,7 @@ int TPagamento::write(TTable& r)
int TPagamento::rewrite(TTable& r)
{
TString s(16); int err = NOERR;
for (int i = 0; err == NOERR && i < n_rate(); i++)
{
r.zero(); s.format("%s%3d",(const char*)_code, i);
@ -937,6 +1136,7 @@ void TPagamento::set_rate_auto()
real toslice = _firstr;
if (n_rate() == 0 || !_inited || (_tpr > 3 && n_rate() == 1)) return;
if (_tpr > 3) // ripartisci _firstr su tutte le rate
{
first = 1;
@ -954,8 +1154,16 @@ void TPagamento::set_rate_auto()
if (!_rdiff)
{
int rut = _tpr > 3 ? n_rate() - 1 : n_rate();
ro = toslice/real(rut); ro.trunc(_round);
r1 = ro + (toslice - (ro*real(rut)));
// usa la percentuale per la prima rata
r1 = (toslice * perc_rata(first))/real(100.0);
r1.round(_round);
real reminder = toslice - r1;
if (!reminder.is_zero())
{
ro = reminder/real(rut-1); ro.trunc(_round);
r1 = (toslice - (ro*real(rut-1)));
}
}
for (int i = first; i < n_rate(); i++)
@ -965,7 +1173,7 @@ void TPagamento::set_rate_auto()
// se e' nei primi tre casi, si somma l'importo da non dividere alla
// prima rata
if (_tpr > 0 && _tpr < 4)
set_imprata(0, tpay_rata(0) + _firstr);
set_imprata(0, tpay_rata(0) + _secndr);
}
@ -985,16 +1193,16 @@ void TPagamento::set_total(const real& imponibile, const real& imposta, const re
_secndr = 0.0;
break;
case 1:
_firstr = _imposta;
_secndr = _imponibile + _spese;
_secndr = _imposta;
_firstr = _imponibile + _spese;
break;
case 2:
_firstr = _spese;
_secndr = _imposta + _imponibile;
_secndr = _spese;
_firstr = _imposta + _imponibile;
break;
case 3:
_firstr = _imposta + _spese;
_secndr = _imponibile;
_secndr = _imposta + _spese;
_firstr = _imponibile;
break;
case 4:
_firstr = _spese + _imponibile;

View File

@ -19,6 +19,8 @@ const word P_RSUM = 0x0001; // percentages do not sum up to 100
const word P_IMPNC = 0x0002; // inconsistenza percentuali / importi
const word P_SCAD = 0x0004; // scadenze non consecutive
const word P_INIZIO = 0x0008; // data 1a rata < data inizio pagamenti
const word P_NEG = 0x0010; // importo specificato < minimo possibile
const word P_TROP = 0x0020; // importo specificato > massimo possibile
class TPagamento : public TObject
{
@ -93,7 +95,8 @@ public:
void set_mese_commerciale(bool v, int& sscad);
void set_rate_differenziate(int v);
void set_tipo_prima_rata(int v, int sscad = -1);
void set_numero_rate(int n, int sscad = -1);
void set_percrata(int n, real r);
void set_numero_rate(int n, int sscad = -1, int rdiff = 1);
void set_inizio_scadenza(char v) { _inscad = v; }
void set_code(const char* c) { _code = c; }