Gestione saldaconto

git-svn-id: svn://10.65.10.50/trunk@1741 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-08-28 07:50:28 +00:00
parent 77c46f0582
commit 4f13e4ddb2
4 changed files with 167 additions and 43 deletions

View File

@ -235,6 +235,7 @@ bool TPrimanota_application::read_caus(const char* cod, int year)
m->efield(F_NUMDOC).check_type(nob ? CHECK_REQUIRED : CHECK_NORMAL); // Num. doc. obbligatorio
m->efield(F_DATADOC).check_type(dob ? CHECK_REQUIRED : CHECK_NORMAL); // Data doc. obbligatoria
m->enable(F_PROVVISORIO, !_is_saldaconto); // Il saldaconto vieta i movimenti provvisori
if (iva == nessuna_iva)
{

View File

@ -26,9 +26,13 @@ protected:
static bool edit_scadenza_handler(TMask_field& f, KEY k);
void add_importo(TToken_string& s, const TImporto& i) const;
TImporto get_importo(TToken_string& s, int pos) const;
void fill_partite(bool all) const;
real aggiorna_residuo();
void update_partita(const TPartita& game, int prow, bool all) const;
void update_partita(const TPartita& game, int prow) const;
void update_saldo_clifo() const;
public:
TSheet_field& partite() const { return (TSheet_field&)field(P_PARTITE); }
@ -144,7 +148,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TGame_mask& gm = (TGame_mask&)partite.mask();
gm._riga_partite = r;
TSheet_field& scadenze = gm.scadenze();
TString_array& scadenze = gm.scadenze().rows_array();
scadenze.destroy();
const TBill& zio = gm.conto(); // Conto cliente/fornitore
@ -166,7 +170,8 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
for (int ra = 1; ra <= riga.rate(); ra++)
{
const TRiga_scadenze& scad = riga.rata(ra);
TToken_string& row = scadenze.row(-1);
TToken_string& row = scadenze.row(scadenze.add(""));
row.add(ri);
row.add(ra);
row.add(riga.get(PART_DATADOC));
@ -180,12 +185,13 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
row.add(riga.get(PART_PROTIVA));
const int lastp = scad.last();
const bool in_valuta = scad.in_valuta();
for (int pa = scad.first(); pa <= lastp; pa = scad.succ(pa))
{
const TRiga_partite& rigp = game->riga(pa);
const TRectype& pag = scad.row(pa);
TToken_string& row = scadenze.row(-1);
TToken_string& row = scadenze.row(scadenze.add(""));
row.add(ri);
row.add(ra);
row.add(rigp.get(PART_DATADOC));
@ -193,15 +199,29 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
row.add(rigp.get(PART_DATAREG));
row.add(scad.get(SCAD_DATASCAD));
row.add(pag.get_real(SCAD_IMPORTO).string());
row.add(pag.get_real(SCAD_IMPORTOVAL).string(0, 2));
row.add(in_valuta ? pag.get_real(SCAD_IMPORTOVAL).string(0, 2) : "");
row.add(rigp.get(PART_DESCR));
row.add(rigp.get(PART_NUMDOC));
row.add("");
row.add(pa);
}
TToken_string& sal = scadenze.row(scadenze.add(""));
sal.add(ri);
sal.add(ra);
sal.add("");
sal.add("");
sal.add("");
sal.add("");
sal.add(scad.residuo(FALSE).string());
sal.add(in_valuta ? scad.residuo(TRUE).string(0, 2) : "");
sal.add("Saldo della rata "); sal << ra;
sal.add("");
sal.add("");
}
}
scadenze.force_update();
gm.scadenze().force_update();
if (should_delete_game)
delete game;
}
@ -248,7 +268,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
if (dirty)
{
gm.update_partita(game, gm._riga_partite, TRUE);
gm.update_partita(game, gm._riga_partite);
partite_notify(gm.partite(), gm._riga_partite, K_TAB);
gm.aggiorna_residuo();
}
@ -268,29 +288,74 @@ void TGame_mask::add_importo(TToken_string& s, const TImporto& i) const
}
}
void TGame_mask::update_partita(const TPartita& game, int prow, bool all) const
TImporto TGame_mask::get_importo(TToken_string& s, int pos) const
{
const TFixed_string imp(s.get(pos));
const real i(imp);
const char sez = imp.right(1)[0];
return TImporto(sez, i);
}
void TGame_mask::update_partita(const TPartita& game, int prow) const
{
TImporto saldo, doc, pag, imp;
game.calcola_saldo(saldo, doc, pag, imp);
if (all || !saldo.is_zero())
{
int riga_fatt = game.prima_fattura();
if (riga_fatt < 1) riga_fatt = game.first(); // E' un anticipo
const TRiga_partite& riga = game.riga(riga_fatt);
TToken_string &r = partite().row(prow); // Stringa di lavoro per lo sheet
r.cut(0);
r.add(riga.get(PART_ANNO));
r.add(riga.get(PART_NUMPART));
r.add(riga.get(PART_DATADOC));
r.add(riga.get(PART_NUMDOC));
add_importo(r, saldo);
add_importo(r, doc);
add_importo(r, pag);
add_importo(r, imp);
r.add(riga.get(PART_DESCR));
int riga_fatt = game.prima_fattura();
if (riga_fatt <= 0) riga_fatt = game.first(); // E' un anticipo
const TRiga_partite& riga = game.riga(riga_fatt);
TToken_string &r = partite().row(prow); // Stringa di lavoro per lo sheet
r.cut(0);
r.add(riga.get(PART_ANNO));
r.add(riga.get(PART_NUMPART));
r.add(riga.get(PART_DATADOC));
r.add(riga.get(PART_NUMDOC));
add_importo(r, saldo);
add_importo(r, doc);
add_importo(r, pag);
add_importo(r, imp);
r.add(riga.get(PART_DESCR));
if (prow >= 0)
update_saldo_clifo();
}
void TGame_mask::update_saldo_clifo() const
{
TString_array& s = partite().rows_array();
TImporto sal, doc, pag, imp;
for (int i = 0; i < s.items(); i++)
{
TToken_string& r = s.row(i);
if (r.get_int(0) > 0)
{
sal += get_importo(r, 4);
doc += get_importo(r, -1);
pag += get_importo(r, -1);
imp += get_importo(r, -1);
}
else
break;
}
TToken_string& r = s.row(s.add("", i));
r.add("");
r.add("");
r.add(TDate(TODAY).string());
r.add("");
add_importo(r, sal);
add_importo(r, doc);
add_importo(r, pag);
add_importo(r, imp);
r.add("Saldo ");
if (get(P_TIPOC)[0] == 'C')
r << "cliente";
else
r << "fornitore";
}
void TGame_mask::fill_partite(bool all) const
@ -308,7 +373,8 @@ void TGame_mask::fill_partite(bool all) const
partita.put(PART_SOTTOCONTO, conto().sottoconto());
}
else conto().put(partita.curr()); // Scrive completamente i conti normali
const long nreg = app().curr_mask().get_long(F_NUMREG);
const TRectype filter(partita.curr()); // Record campione
for (int err = partita.read(_isgteq);
@ -328,13 +394,15 @@ void TGame_mask::fill_partite(bool all) const
should_delete_game = TRUE;
}
update_partita(*game, -1, all);
if (all || (!game->chiusa() || game->mov2rig(nreg, 0) > 0))
update_partita(*game, -1);
if (should_delete_game)
delete game;
partita.put(PART_NRIGA, 9999); // Forza lettura partita successiva nella prossima read
}
update_saldo_clifo();
partite().force_update();
if (a.items() > 0)

View File

@ -37,9 +37,9 @@ void TTree_rectype::copy_key_to_row(TRectype& row) const
RecDes* recd = rec_des(); // Descrizione del record della testata
row.zero();
for (int i = 0; i < recd->Ky[numkey].NkFields; i++)
const KeyDes& kd = recd->Ky[numkey];
for (int i = recd->Ky[numkey].NkFields-1; i >= 0; i--)
{
const KeyDes& kd = recd->Ky[numkey];
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const char* name = rf.Name;
@ -253,7 +253,7 @@ TImporto TRiga_scadenze::calcola_differenza_cambio(bool update)
real TRiga_scadenze::residuo(bool val) const
{
TImporto residuo(importo_da_pagare(val));
residuo -= importo_pagato(val);
residuo += importo_pagato(val); // Somma con sezione opposta
return residuo.valore();
}
@ -335,7 +335,20 @@ TRiga_partite::TRiga_partite(const TRiga_partite& r)
{
CHECK(_partita, "Partita nulla");
}
TRiga_scadenze& TRiga_partite::new_row(int r)
{
if (r <= 0) r = last()+1;
if (_recarr.rows() == 0)
{
TRiga_scadenze* scad = new TRiga_scadenze(this);
copy_key_to_row(*scad);
_recarr.set_key(scad); // Altrimenti le righe sarebbero dei TRectype!
}
return (TRiga_scadenze&)_recarr.row(r, TRUE);
}
int TRiga_partite::read(TBaseisamfile& f, word op)
{
@ -345,10 +358,6 @@ int TRiga_partite::read(TBaseisamfile& f, word op)
TRiga_scadenze* s = new TRiga_scadenze(this);
copy_key_to_row(*s);
err = _recarr.read(s); // Deve esistere almento una scadenza
#ifdef DBG
if (_recarr.rows() == 0)
yesnofatal_box("Riga di fattura senza nessuna scadenza");
#endif
}
else
_recarr.destroy_rows();
@ -436,8 +445,8 @@ bool TPartita::read(const TBill& clifo, int anno, const char* num)
unas.put(PART_SOTTOCONTO, partita->get(PART_SOTTOCONTO));
unas.put(PART_ANNO, partita->get(PART_ANNO));
unas.put(PART_NUMPART, partita->get(PART_NUMPART));
unas.put(PART_NRIGA, 0); // Numeri magici di non assegamento
unas.put(SCAD_NRATA, 0);
unas.put(PART_NRIGA, (int)UNASSIGNED);
unas.put(SCAD_NRATA, (int)UNASSIGNED);
_unassigned.read(unas);
return ok();
@ -462,8 +471,20 @@ bool TPartita::remove()
{
_part.destroy_rows();
return rewrite();
}
// Crea un nuova riga partite e gli copia la chiave principale e il conto cliente/fornitore
TRiga_partite& TPartita::nuova_riga()
{
TRiga_partite& nuova = (TRiga_partite&)_part.row(last()+1, TRUE);
const TRiga_partite& prima = riga(first());
nuova.put(PART_GRUPPOCL, prima.get(PART_GRUPPOCL));
nuova.put(PART_CONTOCL, prima.get(PART_CONTOCL));
return nuova;
}
TImporto TPartita::importo_speso(long nreg, int numrig, bool extra) const
{
TImporto imp;
@ -529,8 +550,11 @@ int TPartita::mov2rig(long numreg, int rm) const
for (int r = last(); r > 0; r = pred(r))
{
const TRiga_partite& row = riga(r);
if (row.get_long(PART_NREG) == numreg && row.get_int(PART_NUMRIG) == rm)
return r;
if (row.get_long(PART_NREG) == numreg)
{
if (rm <= 0 || row.get_int(PART_NUMRIG) == rm)
return r;
}
}
return -1;
}
@ -619,10 +643,34 @@ bool TPartita::utilizzata(int nrigp) const
return TRUE;
}
}
}
return FALSE;
}
return _unassigned.exist(nrigp);
}
bool TPartita::remove_unassigned(long nreg)
{
bool found = FALSE;
for (int u = _unassigned.last_row(); u > 0; u = _unassigned.pred_row(u))
{
const TRectype& pag = _unassigned.row(u);
const int nrigp = pag.get_int(PAGSCA_NRIGP);
TRiga_partite& sum = riga(nrigp);
if (sum.get_long(PART_NREG) == nreg)
{
TRectype zero(pag); zero.zero();
sum.update(pag, zero, PART_IMPORTO);
sum.update(pag, zero, PART_IMPORTOVAL);
sum.update(pag, zero, PART_RITENUTE);
_unassigned.destroy_row(u);
found = TRUE;
}
}
return found;
}
bool TPartita::modifica_pagamento(const TRectype& new_pag,
char& old_ap, TImporto& old_abb, TImporto& old_diffcam,
char& new_ap, TImporto& new_abb, TImporto& new_diffcam)
@ -774,7 +822,10 @@ int TPartite_array::add_reg_num(long nreg, int numrig)
TCursor cur(&rel, "", 2, &filter, &filter);
for (cur = 0; cur.ok(); ++cur)
partita(part); // Aggiungi partita se non esiste gia'
{
TPartita& p = partita(part); // Aggiungi partita se non esiste gia'
p.remove_unassigned(nreg); // Togli righe non assegnate
}
return (int)cur.items();
}

View File

@ -107,6 +107,7 @@ public: // TTree_rectype
public:
int rate() const { return _recarr.rows(); }
TRiga_scadenze& rata(int r) const { return (TRiga_scadenze&)_recarr.row(r); }
TRiga_scadenze& new_row(int r = -1);
int ultimo_pagamento(int rata) const;
char sezione() const { return get_char("SEZ"); }
@ -120,6 +121,8 @@ public:
class TPartita : public TObject
{
enum { UNASSIGNED = 9999 };
TRecord_array _part;
TRecord_array _unassigned;
@ -128,7 +131,7 @@ public: // TObject
public:
TRiga_partite& riga(int r) const { return (TRiga_partite&)_part.row(r); }
TRiga_partite& nuova_riga() { return (TRiga_partite&)_part.row(last()+1, TRUE); }
TRiga_partite& nuova_riga();
int succ(int r) const { return _part.succ_row(r); }
int pred(int r) const { return _part.pred_row(r); }
@ -147,6 +150,7 @@ public:
int primo_pagamento(long nreg = -1l) const;
bool utilizzata(int r) const; // Controlla se esistono pagamenti sommati alla riga r
bool remove_unassigned(long nreg);
bool chiusa(bool update = FALSE);