Gestione importo scaduto
git-svn-id: svn://10.65.10.50/trunk@2260 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
1852d5b2f7
commit
a084716017
130
sc/sc2100.cpp
130
sc/sc2100.cpp
@ -57,30 +57,34 @@ TEC_form* TEC_form::_form = NULL;
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
// TEC_row
|
// TEC_row
|
||||||
|
// Rappresenta una singola riga di stampa
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
class TEC_row : public TSortable
|
class TEC_row : public TSortable
|
||||||
{
|
{
|
||||||
TDate _data;
|
TDate _data; // Data scadenza o pagamento
|
||||||
int _riga;
|
int _riga; // Riga della fattura
|
||||||
int _rata;
|
int _rata; // Numero rata o progrssivo
|
||||||
|
|
||||||
TString _causale;
|
TString _causale; // Codice causale
|
||||||
TString _descrizione;
|
TString _descrizione; // Sua descrizione
|
||||||
|
|
||||||
TDate _data_doc;
|
TDate _data_doc; // Data del documento
|
||||||
TString _num_doc;
|
TString _num_doc; // Numero documento
|
||||||
long _num_prot;
|
long _num_prot; // Protocollo IVA
|
||||||
TImporto _importo;
|
TImporto _importo; // Importo in valuta
|
||||||
TImporto _importo_lire;
|
TImporto _importo_lire; // Importo in lire
|
||||||
real _scaduto;
|
real _scaduto; // Importo scaduto
|
||||||
real _totale;
|
real _totale; // Totale documento
|
||||||
TValuta _valuta;
|
TValuta _valuta; // Codice valuta, data cambio e cambio
|
||||||
|
|
||||||
protected: // TSortable
|
protected: // TSortable
|
||||||
virtual int compare(const TSortable& s) const;
|
virtual int compare(const TSortable& s) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
int riga() const { return _riga; }
|
||||||
|
int rata() const { return _rata; }
|
||||||
|
|
||||||
void descrizione(const char* s) { _descrizione = s; }
|
void descrizione(const char* s) { _descrizione = s; }
|
||||||
void scaduto(const real& s) { _scaduto = s; }
|
void scaduto(const real& s) { _scaduto = s; }
|
||||||
|
|
||||||
@ -118,7 +122,7 @@ TEC_row::TEC_row(const char* desc, const TImporto& imp)
|
|||||||
_importo = imp; _importo.normalize();
|
_importo = imp; _importo.normalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Le righe dell'estratto conto sono ordinate per data, riga partita, numero rata,
|
// Le righe dell'estratto conto sono ordinate per data, riga partita, numero rata o
|
||||||
// posizione iniziale nell'array (in caso di uguaglianza di tutto il resto)
|
// posizione iniziale nell'array (in caso di uguaglianza di tutto il resto)
|
||||||
int TEC_row::compare(const TSortable& s) const
|
int TEC_row::compare(const TSortable& s) const
|
||||||
{
|
{
|
||||||
@ -196,14 +200,21 @@ void TEC_row::print_on(TPrint_section& body)
|
|||||||
|
|
||||||
class TEC_array : public TArray
|
class TEC_array : public TArray
|
||||||
{
|
{
|
||||||
const TEC_form* _form;
|
TArray _scaduto; // Array di importi scaduti
|
||||||
|
|
||||||
|
const TEC_form* _form; // Form che contiene l'array di righe
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TEC_row& new_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata = 0);
|
TEC_row& new_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata = 0);
|
||||||
void add_row(const TRiga_partite& row);
|
void add_row(const TRiga_partite& row);
|
||||||
|
|
||||||
const TEC_form& form() const { return *_form; }
|
const TEC_form& form() const { return *_form; }
|
||||||
void calcola_scaduto(const TRiga_scadenze& rata, real& scaduto) const;
|
real calcola_scaduto(const TRiga_scadenze& rata, bool valuta);
|
||||||
|
|
||||||
|
TImporto* importo_riga_scaduto_ptr(int n) const { return (TImporto*)_scaduto.objptr(n); }
|
||||||
|
TImporto& importo_riga_scaduto(int n);
|
||||||
|
|
||||||
|
TImporto importo(const TPartita& game, const TRectype& pag, bool valuta) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TEC_row& row(int r) const { return (TEC_row&)operator[](r); }
|
TEC_row& row(int r) const { return (TEC_row&)operator[](r); }
|
||||||
@ -212,28 +223,81 @@ public:
|
|||||||
virtual ~TEC_array() {}
|
virtual ~TEC_array() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TEC_array::calcola_scaduto(const TRiga_scadenze& rata, real& scaduto) const
|
// Calcola l'importo su di una riga di pagamento
|
||||||
|
TImporto TEC_array::importo(const TPartita& game, const TRectype& pag, bool valuta) const
|
||||||
|
{
|
||||||
|
const int nriga = pag.get_int(PAGSCA_NRIGA);
|
||||||
|
const TRiga_partite& fat = game.riga(nriga);
|
||||||
|
const bool fat_val = fat.in_valuta();
|
||||||
|
|
||||||
|
const int nrigp = pag.get_int(PAGSCA_NRIGP);
|
||||||
|
const TRiga_partite& sum = game.riga(nrigp);
|
||||||
|
const char sez = sum.sezione();
|
||||||
|
|
||||||
|
const char* const field = valuta && fat_val ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO;
|
||||||
|
TImporto imp(sez, pag.get_real(PAGSCA_IMPORTO));
|
||||||
|
|
||||||
|
if (!fat_val)
|
||||||
|
imp.valore() += pag.get_real(PAGSCA_RITENUTE);
|
||||||
|
|
||||||
|
if (pag.get_char(PAGSCA_ACCSAL) == 'S')
|
||||||
|
{
|
||||||
|
real abb(pag.get(PAGSCA_ABBUONI));
|
||||||
|
if (!valuta && fat_val)
|
||||||
|
{
|
||||||
|
const TValuta val(sum);
|
||||||
|
val.val2lit(abb);
|
||||||
|
abb += pag.get_real(PAGSCA_DIFFCAM);
|
||||||
|
}
|
||||||
|
imp.valore() += abb;
|
||||||
|
}
|
||||||
|
|
||||||
|
return imp;
|
||||||
|
}
|
||||||
|
|
||||||
|
TImporto& TEC_array::importo_riga_scaduto(int n)
|
||||||
|
{
|
||||||
|
TImporto* imp = importo_riga_scaduto_ptr(n);
|
||||||
|
if (imp == NULL)
|
||||||
|
{
|
||||||
|
imp = new TImporto;
|
||||||
|
_scaduto.add(imp);
|
||||||
|
}
|
||||||
|
return *imp;
|
||||||
|
}
|
||||||
|
|
||||||
|
real TEC_array::calcola_scaduto(const TRiga_scadenze& rata, bool valuta)
|
||||||
{
|
{
|
||||||
const TPartita& game = rata.partita();
|
const TPartita& game = rata.partita();
|
||||||
TImporto imp_scaduto = rata.importo(TRUE);
|
|
||||||
|
|
||||||
const char* const field = rata.in_valuta() ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO;
|
TImporto scaduto_rata = rata.importo(TRUE);
|
||||||
TImporto imp;
|
|
||||||
|
|
||||||
for (int p = rata.last(); p > 0; p = rata.pred(p))
|
int riga_corrente_scaduto = 0;
|
||||||
|
|
||||||
|
const int lastp = rata.last(); // Ultimo pagamento sulla rata corrente
|
||||||
|
for (int p = rata.first(); p <= lastp; p = rata.succ(p)) // Qui bisogna andare in avanti!
|
||||||
{
|
{
|
||||||
const TRectype& pag = rata.row(p);
|
const TRectype& pag = rata.row(p);
|
||||||
const TRiga_partite& sum = game.riga(pag.get_int(PAGSCA_NRIGP));
|
const TRiga_partite& sum = game.riga(pag.get_int(PAGSCA_NRIGP));
|
||||||
const tipo_movimento tm = sum.tipo();
|
const tipo_movimento tm = sum.tipo();
|
||||||
if (tm != tm_insoluto && tm != tm_pagamento_insoluto)
|
const TImporto imp = importo(game, pag, valuta);
|
||||||
|
if (tm == tm_insoluto && tm == tm_pagamento_insoluto)
|
||||||
{
|
{
|
||||||
imp.set(sum.sezione(), pag.get_real(field));
|
if (tm == tm_insoluto)
|
||||||
imp_scaduto += imp;
|
riga_corrente_scaduto = pag.get_int(PAGSCA_NRIGP);
|
||||||
|
else
|
||||||
|
CHECKD(riga_corrente_scaduto > 0, "Pagamento insoluto senza insoluto ", p);
|
||||||
|
importo_riga_scaduto(riga_corrente_scaduto) += imp;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scaduto_rata += imp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A';
|
const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A';
|
||||||
imp_scaduto.normalize(sezione);
|
scaduto_rata.normalize(sezione);
|
||||||
scaduto = imp_scaduto.valore();
|
return scaduto_rata.valore();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEC_row& TEC_array::new_row(const TRiga_partite& row, const TDate& data,
|
TEC_row& TEC_array::new_row(const TRiga_partite& row, const TDate& data,
|
||||||
@ -298,6 +362,19 @@ TEC_array::TEC_array(const TPartita& game, const TEC_form* f)
|
|||||||
{
|
{
|
||||||
for (int r = game.last(); r > 0; r = game.pred(r))
|
for (int r = game.last(); r > 0; r = game.pred(r))
|
||||||
add_row(game.riga(r));
|
add_row(game.riga(r));
|
||||||
|
|
||||||
|
const char sezione = game.conto().tipo() == 'C' ? 'D' : 'A';
|
||||||
|
for (r = items()-1; r >= 0; r--)
|
||||||
|
{
|
||||||
|
TEC_row& s = row(r);
|
||||||
|
TImporto* imp = importo_riga_scaduto_ptr(s.riga());
|
||||||
|
if (imp != NULL)
|
||||||
|
{
|
||||||
|
imp->normalize(sezione);
|
||||||
|
s.scaduto(imp->valore());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sort();
|
sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,6 +394,7 @@ void TEC_form::ec_header_handler(TPrinter& pr)
|
|||||||
pr.setheaderline(j, head.row(j));
|
pr.setheaderline(j, head.row(j));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Confronta due valute alfabeticamente
|
||||||
static int val_compare(const void* o1, const void* o2)
|
static int val_compare(const void* o1, const void* o2)
|
||||||
{
|
{
|
||||||
const THash_object* h1 = (const THash_object*)o1;
|
const THash_object* h1 = (const THash_object*)o1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user