Gestione prima nota con TRecord_array

Corretta contropartita fantasma della prima riga


git-svn-id: svn://10.65.10.50/trunk@1281 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-04-20 14:29:00 +00:00
parent 580a95fa86
commit d0483278e1
19 changed files with 5789 additions and 5801 deletions

View File

@ -257,7 +257,7 @@ bool TPrimanota_application::read_caus(const char* cod, int year)
m->show(F_ANNORIF, _is_saldaconto); // Mostra/nasconde anno e riferimento partita
m->show(F_NUMRIF, _is_saldaconto);
m->enable(F_ANNORIF, ins); // Dis/abilita anno e riferimento partita
m->enable(F_ANNORIF, ins); // Dis/abilita anno e riferimento partita
m->enable(F_NUMRIF, ins);
m->field(F_NUMRIF).set_justify(iva == iva_acquisti ? _num_for : _num_cli);
@ -312,12 +312,10 @@ bool TPrimanota_application::read_caus(const char* cod, int year)
if (iva == nessuna_iva)
{
char tipr = ' ';
if (_is_saldaconto)
{
// non si cagano gli importi totali
if (nriga < 8) continue;
if (nriga < 8) continue; // non si cagano gli importi totali
switch(nriga)
{
case 8:
@ -611,38 +609,28 @@ int TPrimanota_application::read(TMask& m)
_saldi.set_num_ulmov(m.get_long(F_NUMREG));
_saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
TToken_string riga(255);
for (int i = 0; i < _rel->cg_items(); i++)
{
const TRectype& r = _rel->cg(i);
riga.cut(0); // Vuota la riga
TToken_string& riga = cgs().row(i); // Vuota la riga
const char sezione = toupper(r.get_char("SEZIONE"));
const real im(r.get_real("IMPORTO"));
TImporto import(sezione, im);
TImporto import(r.get_char("SEZIONE"), r.get_real("IMPORTO"));
import.add_to(riga); // Dare/Avere 101-102
TBill conto; conto.get(r);
riga.add(conto.string(0x3)); // Conto 103-107
_saldi.aggiorna(conto, im, sezione, FALSE);
_saldi.aggiorna(conto, import, FALSE);
riga.add(""); // Codice descrizione 108
riga.add(r.get("DESCR")); // Descrizione riga 109
conto.set(r.get_int("GRUPPOC"), r.get_int("CONTOC"),
r.get_long("SOTTOCONTC"), r.get_char("TIPOCC"));
conto.get(r, TRUE);
riga.add(conto.string(0x3)); // Contropartita 110-114
riga.add(r.get("NUMGIO"));
const char tipo = r.get_char("ROWTYPE");
riga.add(tipo); // Tipo di riga 115
if (iva() == nessuna_iva && tipo > ' ')
error_box("Riga %d con tipo incompatibile con un movimento puramente contabile", i+1);
cgs().row(i) = riga;
disable_cgs_cells(i, tipo);
}
@ -663,7 +651,7 @@ int TPrimanota_application::read(TMask& m)
for (i = 0; i < _rel->iva_items(); i++)
{
TRectype& r = _rel->iva(i);
riga.cut(0);
TToken_string& riga = ivas().row(i);
real imponibile(r.get("IMPONIBILE"));
if (to_swap) imponibile = -imponibile;
@ -684,8 +672,6 @@ int TPrimanota_application::read(TMask& m)
TBill c; c.get(r);
c.add_to(riga, 4, 0x7); // Conto 105-110
ivas().row(i) = riga;
}
TString16 dt(m.get(F_DATAREG));
@ -709,10 +695,10 @@ void TPrimanota_application::mask2rel(const TMask& m)
_saldi.set_movprovv(m.get_bool(F_PROVVISORIO));
_saldi.set_movap(causale().apertura());
_saldi.set_anno_es(annoes);
_saldi.set_num_ulmov(m.get_long(F_NUMREG));
_saldi.set_num_ulmov(numreg);
_saldi.set_data_ulmov((TDate)m.get(F_DATAREG));
_rel->destroy_rows(); // Destroy all records
_rel->destroy_rows(numreg); // Destroy all records
cgs_pack(); // Destroy all null rows
TArray& rows = cgs().rows_array();
@ -726,7 +712,7 @@ void TPrimanota_application::mask2rel(const TMask& m)
TImporto n; n = row;
const TBill conto(row, 2, 0x3);
_saldi.aggiorna(conto, n.valore(), n.sezione(), TRUE);
_saldi.aggiorna(conto, n, TRUE);
TRectype &r = _rel->cg(i);
r.zero();
@ -875,6 +861,11 @@ int TPrimanota_application::write(const TMask& m)
genera_incasso(causimm);
}
}
else
{
if (_is_saldaconto)
_partite.write();
}
}
return err;
}
@ -889,8 +880,14 @@ int TPrimanota_application::rewrite(const TMask& m)
_saldi.registra();
check_saldi();
}
if (_is_saldaconto && iva() != nessuna_iva)
write_scadenze(m);
if (_is_saldaconto)
{
if (iva() != nessuna_iva)
write_scadenze(m);
else
_partite.rewrite();
}
return err;
}
@ -902,8 +899,12 @@ bool TPrimanota_application::remove()
{
_saldi.registra();
check_saldi();
if (_is_saldaconto && iva() == nessuna_iva)
{
// TBI _partite.remove();
}
}
// TBI eliminazione partita
return ok;
}
@ -1060,9 +1061,8 @@ void TPrimanota_application::genera_incasso(const char* causimm)
{
const TRectype& rec = inc.cg(r);
TBill c; c.get(rec);
const real im(rec.get("IMPORTO"));
const char sezione = rec.get_char("SEZIONE");
_saldi.aggiorna(c, im, sezione, TRUE);
const TImporto im(rec.get_char("SEZIONE"), rec.get_real("IMPORTO"));
_saldi.aggiorna(c, im, TRUE);
}
_saldi.registra();
check_saldi();

View File

@ -112,7 +112,7 @@ STRING F_TIPODOC 2
BEGIN
PROMPT 60 6 "Tipo documento "
FIELD TIPODOC
FLAGS "D"
FLAGS "DG"
MESSAGE COPY,K_TIPODOC
END
@ -341,7 +341,6 @@ END
STRING K_TIPODOC 2
BEGIN
PROMPT 60 6 "Tipo documento "
FIELD TIPODOC
FLAGS "D"
END

View File

@ -4,12 +4,18 @@ TOOLBAR "" 0 20 0 2
BUTTON DLG_OK 10 2
BEGIN
PROMPT -12 -1 ""
PROMPT -13 -1 ""
END
BUTTON DLG_DELREC 10 2
BEGIN
PROMPT -23 -1 "~Elimina"
MESSAGE EXIT,K_DEL
END
BUTTON DLG_CANCEL 10 2
BEGIN
PROMPT -22 -1 ""
PROMPT -33 -1 ""
END
ENDPAGE
@ -132,9 +138,11 @@ BEGIN
FIELD RITENUTE
END
BOOLEAN S_SALDOACC
LIST S_SALDOACC 1 12
BEGIN
PROMPT 2 9 "Saldo "
ITEM "A|Acconto"
ITEM "S|Saldo"
FIELD SALACC
END
@ -199,14 +207,14 @@ BEGIN
ITEM " |Conto"
ITEM "C|Cliente"
ITEM "F|Fornitore"
FIELD TIPOCF
FIELD TIPOC
FLAGS "H"
END
NUMBER S_GRUPPO 3
BEGIN
PROMPT 24 12 "Gruppo "
FIELD GRUPPO
FIELD GRUPPOC
CHECKTYPE REQUIRED
FLAGS "R"
END
@ -214,7 +222,7 @@ END
NUMBER S_CONTO 3
BEGIN
PROMPT 42 12 "Conto "
FIELD CONTO
FIELD CONTOC
CHECKTYPE REQUIRED
FLAGS "R"
END
@ -222,7 +230,7 @@ END
NUMBER S_SOTTOCONTO 6
BEGIN
PROMPT 57 12 "Sottoconto "
FIELD SOTTOCONTO
FIELD SOTTOCONTC
USE LF_PCON
INPUT GRUPPO S_GRUPPO
INPUT CONTO S_CONTO

View File

@ -1,7 +1,7 @@
#include <stdlib.h>
#include <applicat.h>
#include <tabutil.h>
#include <prefix.h>
#include <utility.h>
#include "cg2101.h"
@ -36,64 +36,46 @@ int date2esc(const TDate& d, int* prevesc)
///////////////////////////////////////////////////////////
TMovimentoPN::TMovimentoPN()
: TRelation(LF_MOV), _oldcg(0), _oldiva(0)
: TRelation(LF_MOV), _cg(LF_RMOV, "NUMRIG"), _iva(LF_RMOVIVA, "NUMRIG")
{
add(LF_RMOV, "NUMREG=NUMREG");
add(LF_RMOVIVA, "NUMREG=NUMREG");
}
void TMovimentoPN::destroy_rows()
{
_cg.destroy();
_iva.destroy();
void TMovimentoPN::destroy_rows(long num)
{
_cg.destroy_rows();
_cg.renum_key("NUMREG", num);
_iva.destroy_rows();
_iva.renum_key("NUMREG", num);
}
TRectype& TMovimentoPN::cg(int i)
{
TRectype* r = (TRectype*)_cg.objptr(i);
if (r == NULL)
{
r = new TRectype(LF_RMOV);
_cg.add(r, i);
}
return *r;
return _cg.row(i >= 0 ? i+1 : -1, TRUE);
}
TRectype& TMovimentoPN::iva(int i)
{
TRectype* r = (TRectype*)_iva.objptr(i);
if (r == NULL)
{
r = new TRectype(LF_RMOVIVA);
_iva.add(r, i);
}
return *r;
return _iva.row(i >= 0 ? i+1 : -1, TRUE);
}
int TMovimentoPN::read_mov_rows()
{
const TLocalisamfile& rm = lfile(LF_RMOV);
const TLocalisamfile& ri = lfile(LF_RMOVIVA);
position_rels();
{
const long numreg = lfile().get_long(MOV_NUMREG);
TRectype cgfilter(LF_RMOV);
cgfilter.zero();
cgfilter.put(RMV_NUMREG, numreg);
_cg.read(cgfilter);
TRectype ivafilter(LF_RMOVIVA);
ivafilter.zero();
ivafilter.put(RMI_NUMREG, numreg);
_iva.read(ivafilter);
destroy_rows();
for(bool ok = is_first_match(LF_RMOV); ok; ok = next_match(LF_RMOV))
{
const int row = rm.get_int(RMV_NUMRIG) - 1;
cg(row) = rm.curr();
}
_oldcg = cg_items();
for(ok = is_first_match(LF_RMOVIVA); ok; ok = next_match(LF_RMOVIVA))
{
const int row = ri.get_int(RMI_NUMRIG) - 1;
iva(row) = ri.curr();
}
_oldiva = iva_items();
return NOERR;
return _cg.rows();
}
@ -103,49 +85,18 @@ int TMovimentoPN::read(TIsamop op, TReclock lockop, TDate& atdate)
if (err == NOERR)
{
_olddate = file().get("DATAREG");
err = read_mov_rows();
read_mov_rows();
}
return err;
}
int TMovimentoPN::write_rec(bool re, const TRectype& rec, TLocalisamfile& f)
{
const bool scrivi = re ? (f.rewrite(rec) != NOERR) : TRUE;
if (scrivi)
f.write(rec);
#ifdef TRC
const long numreg = rec.get_long("NUMREG");
const int numrig = f.num() == LF_MOV ? 0 : rec.get_int("NUMRIG");
TRACE("write file=%d record=%ld nummov=%ld numrig=%d status=%d",
f.num(), f.recno(), numreg, numrig, f.status());
#endif
return f.status();
}
int TMovimentoPN::cancella(TLocalisamfile& f, int da, int a)
{
const long numreg = lfile().get_long(MOV_NUMREG);
for (int i = da; i <= a; i++)
{
f.put(MOV_NUMREG, numreg);
f.put(RMV_NUMRIG, i);
if (f.read(_isequal, _lock) == NOERR)
f.remove();
}
return f.status();
}
char TMovimentoPN::frequenza_versamenti(int year) const
{
static int last_year = 0;
static long last_firm = 0;
static char last_freq = ' ';
const long firm = main_app().get_firm();
const long firm = prefix().get_codditta();
if (firm != last_firm || year != last_year)
{
@ -161,8 +112,10 @@ char TMovimentoPN::frequenza_versamenti(int year) const
}
else
last_freq = lia.get_char("S7");
last_firm = firm;
CHECK(last_freq == 'M' || last_freq == 'T', "Frequenza versamenti IVA assurda");
last_firm = firm;
last_year = year;
}
return last_freq;
@ -207,38 +160,27 @@ bool TMovimentoPN::controlla_liquidazione(const TDate& data, bool reset) const
int TMovimentoPN::registra(bool re, bool force)
{
TLocalisamfile& m = lfile();
int err = re ? TRelation::rewrite(force) : TRelation::write(force);
if (err != NOERR)
return err;
const int err = write_rec(re, m.curr(), m);
if (err != NOERR) return err;
TLocalisamfile& rm = lfile(LF_RMOV);
TLocalisamfile& ri = lfile(LF_RMOVIVA);
const TRectype& m = lfile().curr();
const long numreg = m.get_long("NUMREG");
for (int i = 0 ; i < cg_items(); i++)
{
if (!re) cg(i).put("NUMREG", numreg);
const int err = write_rec(re, cg(i), rm);
if (!force && err != NOERR) return err;
}
if (i < _oldcg)
cancella(rm, i+1, _oldcg);
_oldcg = cg_items();
if (!re)
_cg.renum_key("NUMREG", numreg);
err = _cg.write(re);
if (err != NOERR)
return err;
const int annoiva = m.get_int("ANNOIVA");
const TString16 reg(m.get("REG"));
const TString16 reg(m.get_str("REG"));
TRegistro registro(reg, annoiva);
const bool att_mista = reg.empty() ? FALSE : registro.attivita_mista();
for (i = 0 ; i < iva_items(); i++)
for (int i = 0 ; i < iva_items(); i++)
{
TRectype& r = iva(i);
if (!re) r.put("NUMREG", numreg); // Force correct number
int tipoatt = 1;
if (att_mista)
{
@ -250,22 +192,23 @@ int TMovimentoPN::registra(bool re, bool force)
}
}
r.put("TIPOATT", tipoatt);
const int err = write_rec(re, r, ri);
if (!force && err != NOERR) return err;
}
if (i < _oldiva)
cancella(ri, i+1, _oldiva);
_oldiva = iva_items();
if (!re)
_iva.renum_key("NUMREG", numreg);
err = _iva.write(re);
if (err != NOERR)
return err;
// Aggiorna data registrazione e protocollo IVA sul registro
const TDate datareg(m.get("DATAREG"));
if (reg.not_empty())
{
const long protiva = m.get_long("PROTIVA");
const long uprotiva = m.get_long("UPROTIVA");
registro.update(max(protiva, uprotiva), datareg);
const long max = protiva > uprotiva ? protiva : uprotiva;
registro.update(max, datareg);
}
// Aggiorna flags di ricalcolo liquidazione
@ -301,12 +244,7 @@ int TMovimentoPN::registra(bool re, bool force)
int TMovimentoPN::write(bool force, TDate&)
{
const TRectype& r = lfile().curr();
_oldcg = _oldiva = 0;
int err = registra(FALSE, force);
return err;
return registra(FALSE, force);
}
@ -318,14 +256,14 @@ int TMovimentoPN::rewrite(bool force, TDate&)
int TMovimentoPN::remove(TDate&)
{
TLocalisamfile& m = lfile();
TLocalisamfile& rm = lfile(LF_RMOV);
TLocalisamfile& ri = lfile(LF_RMOVIVA);
int err = TRelation::remove();
if (err == NOERR)
err = _cg.remove();
cancella(rm, 1, _oldcg);
cancella(ri, 1, _oldiva);
m.remove();
_oldcg = _oldiva = 0;
return m.status();
if (err == NOERR)
err = _iva.remove();
return err;
}

View File

@ -13,15 +13,13 @@ class TMovimentoPN : public TRelation
// @END
// @DPRIV
TArray _cg, _iva;
int _oldcg, _oldiva;
TRecord_array _cg, _iva;
TDate _olddate;
// @END
protected:
// @FPROT
int write_rec(bool re, const TRectype&r, TLocalisamfile& f);
int cancella(TLocalisamfile& f, int da, int a);
int registra(bool re, bool force);
int read_mov_rows();
// @END
@ -40,9 +38,9 @@ public:
TRectype& cg(int i);
TRectype& iva(int i);
int cg_items() const { return _cg.items(); }
int iva_items() const { return _iva.items(); }
void destroy_rows();
int cg_items() const { return _cg.rows(); }
int iva_items() const { return _iva.rows(); }
void destroy_rows(long numreg);
int date2liq(const TDate& data) const; // Estrae dalla data il mese di liquidazione
char frequenza_versamenti(int year) const; // Ritorna 'M'ensile o 'T'rimestrale

View File

@ -1,7 +1,7 @@
#include <progind.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include <defmask.h>
#include "cg2100.h"
#include "cg2102.h"
@ -473,15 +473,15 @@ real TPrimanota_application::calcola_saldo() const
real sbilancio = abs(tdare)-abs(tavere);
switch (sbilancio.sign())
{
case 1:
case +1: // Il dare supera l'avere in valore assoluto
curr_mask().set(F_DARE, (tdare-tavere).string());
curr_mask().reset(F_AVERE);
break;
case -1:
case -1: // L'avere supera il dare in valore assoluto
curr_mask().reset(F_DARE);
curr_mask().set(F_AVERE, (tavere-tdare).string());
break;
default:
default: // Sbilancio nullo
curr_mask().reset(F_DARE);
curr_mask().reset(F_AVERE);
break;
@ -495,60 +495,58 @@ real TPrimanota_application::calcola_saldo() const
// Certified 90%
bool TPrimanota_application::cg_handler(TMask_field& f, KEY k)
{
if ((k == K_TAB && !f.mask().is_running()) || k == K_ENTER)
if (k == K_ENTER)
{
const real saldo = app().calcola_saldo();
if (k == K_ENTER)
if (saldo != ZERO)
{
if (saldo != ZERO)
{
const char* ss = saldo.string(".");
return f.error_box("Il movimento e' sbilanciato di %s lire.", ss);
}
const char* ss = saldo.string(".");
return f.error_box("Il movimento e' sbilanciato di %s lire.", ss);
}
TSheet_field& cg = app().cgs();
bool empty = TRUE;
const int max = cg.items();
for (int i = 0; i < max; i++)
TSheet_field& cg = app().cgs();
bool empty = TRUE;
const int max = cg.items();
for (int i = 0; i < max; i++)
{
TToken_string& r = cg.row(i);
if (!can_remove(r))
{
const TImporto im(app().get_cgs_imp(i));
if (!im.valore().is_zero())
{
const TBill c(cg.row(i), 3, 0x0);
if (!c.ok())
return f.error_box("Il conto della riga %d non e' completo", i+1);
const TBill co(cg.row(i), 10, 0x0);
if (!co.empty() && !co.ok())
return f.error_box("La contropartita della riga %d non e' completa", i+1);
empty = FALSE;
}
const TBill c(r, 3, 0x0);
if (!c.ok())
return f.error_box("Il conto della riga %d non e' completo", i+1);
const TBill co(r, 10, 0x0);
if (!co.empty() && !co.ok())
return f.error_box("La contropartita della riga %d non e' completa", i+1);
empty = FALSE;
}
if (empty)
return error_box("Il movimento non ha nessuna riga contabile con un importo");
}
}
if (empty)
return error_box("Il movimento non ha nessuna riga contabile con un importo");
}
return TRUE;
}
void TPrimanota_application::generazione_righe_cg(int r)
{
{
begin_wait();
TSheet_field& cg = cgs();
TToken_string& row = cg.row(r);
if (can_remove(row)) // Ignora righe senza importo
return;
TImporto importo; importo = row;
if (importo.is_zero())
return; // Ignora righe senza importo
const bool causale_ok = causale().codice()[0] > ' ';
if (r == 0 && cg.row(1).empty_items())
{
TBill contro(row, 9, 0x3); // Contropartita della prima riga
if (!contro.ok() && causale_ok)
if (causale_ok && !contro.ok())
{
causale().bill(2, contro); // Prendi contropartita dalla causale
if (contro.ok())
@ -572,12 +570,12 @@ void TPrimanota_application::generazione_righe_cg(int r)
int first_not_empty = 0;
for (int i = 0; i < r; i++)
{
TToken_string& r = cg.row(i);
if (r.get(0)[0] > ' ' || r.get()[0] > ' ')
TToken_string& row = cg.row(i);
if (!can_remove(row))
{
first_not_empty = i;
break;
}
}
}
TBill conto(row, 2, 0x3);
@ -639,33 +637,34 @@ void TPrimanota_application::generazione_righe_cg(int r)
}
}
}
end_wait();
}
bool TPrimanota_application::cg_notify(int r, KEY k)
{
TSheet_field& cg = app().cgs();
const char tipo = cg.row(r).right(1)[0];
{
switch(k)
{
case K_SPACE:
{
TSheet_field& cg = app().cgs();
const char tipo = row_type(cg.row(r));
cg.sheet_mask().enable(DLG_DELREC, tipo <= ' ');
break;
case K_ENTER:
if (app().iva() == nessuna_iva)
app().generazione_righe_cg(r);
app().calcola_saldo();
break;
case K_DEL:
if (tipo > ' ')
return error_box("La riga %d non puo' essere cancellata", r+1);
// if (app().is_saldaconto() && app().iva() == nessuna_iva)
// app().notify_cgline_deletion(r+1);
break;
default:
break;
}
break;
case K_ENTER:
if (app().iva() == nessuna_iva)
app().generazione_righe_cg(r);
app().calcola_saldo();
break;
case K_DEL:
if (app().is_saldaconto() && app().iva() == nessuna_iva)
app().notify_cgline_deletion(r+1);
break;
default:
break;
}
return TRUE;
}
@ -697,7 +696,7 @@ bool TPrimanota_application::descr_handler(TMask_field& f, KEY k)
// Scrivendo qualcosa in dare (101) cancella l'importo in avere (102) e viceversa
bool TPrimanota_application::dareavere_handler(TMask_field& f, KEY k)
{
if (k == K_TAB && f.focusdirty() && !f.get().empty())
if (k == K_TAB && f.focusdirty() && f.get().not_empty())
{
const int id = 203-f.dlg(); // Calcola id del campo da resettare
f.mask().reset(id);

View File

@ -215,9 +215,11 @@ protected:
int nuovo_pagamento(TPartita& partita, int rata, int rmov, TRectype& part);
bool edit_pagamento(TPartita& partita, TRectype& part);
static TPrimanota_application& app() { return (TPrimanota_application&)main_app(); }
bool notify_cgline_deletion(TPartita& partita, long nreg, int numrig);
bool notify_cgline_deletion(int numrig);
public:
static TPrimanota_application& app() { return (TPrimanota_application&)main_app(); }
TPrimanota_application();
};

View File

@ -370,9 +370,9 @@ void TPrimanota_application::write_scadenze(const TMask& m)
int nriga = 1;
int numrig = 1;
partita.put("ANNO", anno);
partita.put("NUMPART", numpart);
partita.put("NRIGA", nriga);
partita.put(PART_ANNO, anno);
partita.put(PART_NUMPART, numpart);
partita.put(PART_NRIGA, nriga);
bool fromscratch = FALSE, new_part = TRUE;
@ -381,7 +381,7 @@ void TPrimanota_application::write_scadenze(const TMask& m)
if (partita.read() == NOERR)
{
// se si e' specificato un codice pagamento diverso si rifa' da capo
if (pag.code() != partita.get("CODPAG"))
if (pag.code() != partita.get(PART_CODPAG))
fromscratch = TRUE;
new_part = FALSE;
}
@ -390,13 +390,13 @@ void TPrimanota_application::write_scadenze(const TMask& m)
if (new_part)
{
partita.zero();
partita.put("TIPOCF", tipocf);
partita.put("GRUPPO", gruppo);
partita.put("CONTO", conto);
partita.put("SOTTOCONTO", sottoconto);
partita.put("ANNO", anno);
partita.put("NUMPART", numpart);
partita.put("NRIGA", nriga);
partita.put(PART_TIPOCF, tipocf);
partita.put(PART_GRUPPO, gruppo);
partita.put(PART_CONTO, conto);
partita.put(PART_SOTTOCONTO, sottoconto);
partita.put(PART_ANNO, anno);
partita.put(PART_NUMPART, numpart);
partita.put(PART_NRIGA, nriga);
}
// put data on partita
@ -435,13 +435,13 @@ void TPrimanota_application::write_scadenze(const TMask& m)
{
new_scad = TRUE;
scadenza.zero();
scadenza.put("TIPOCF", tipocf);
scadenza.put("GRUPPO", gruppo);
scadenza.put("CONTO", conto);
scadenza.put("SOTTOCONTO", sottoconto);
scadenza.put("ANNO", anno);
scadenza.put("NUMPART", numpart);
scadenza.put("NRATA", i+1);
scadenza.put(SCAD_TIPOCF, tipocf);
scadenza.put(SCAD_GRUPPO, gruppo);
scadenza.put(SCAD_CONTO, conto);
scadenza.put(SCAD_SOTTOCONTO, sottoconto);
scadenza.put(SCAD_ANNO, anno);
scadenza.put(SCAD_NUMPART, numpart);
scadenza.put(SCAD_NRATA, i+1);
}
// set everything
scadenza.put("CODPAG", pag.code());
@ -459,9 +459,9 @@ void TPrimanota_application::write_scadenze(const TMask& m)
for (; !new_scad ; i++)
{
scadenza.zero();
scadenza.put("ANNO", anno);
scadenza.put("NUMPART", numpart);
scadenza.put("NRATA", i+1);
scadenza.put(SCAD_ANNO, anno);
scadenza.put(SCAD_NUMPART, numpart);
scadenza.put(SCAD_NRATA, i+1);
if (scadenza.read() == NOERR)
scadenza.remove();
@ -474,22 +474,16 @@ void TPrimanota_application::write_scadenze(const TMask& m)
// Sheet partite
///////////////////////////////////////////////////////////
HIDDEN int _riga;
HIDDEN TImporto _soldi, _max;
bool TPrimanota_application::edit_partite(int riga)
{
begin_wait();
const long curreg = curr_mask().get_long(F_NUMREG); // Numero registrazione
TToken_string& cgr = cgs().row(riga);
const TBill b(cgr, 2, 0x3); // Legge il conto della riga selezionata
_riga = riga; // Riga correntemente in gestione
_soldi = cgr; // Importo della riga selezionata
TString80 caption("Partite aperte del conto ");
if (!b.ok()) return FALSE;
begin_wait();
TString caption("Partite aperte del conto ");
caption << b.gruppo() << ' ' << b.conto() << ' ' << b.sottoconto();
TArray_sheet a(-1, -1, 0, 0, caption, "Anno|Numero@7|Descrizione@50|Importo@15R|Sezione", 0x8);
@ -498,7 +492,7 @@ bool TPrimanota_application::edit_partite(int riga)
partita.setkey(2); // Chiave per conto
partita.zero();
if (b.tipo() != ' ') // Ignora gruppo e conto dei clifo
if (b.tipo() > ' ') // Ignora gruppo e conto dei clifo
{
partita.put(PART_TIPOCF, b.tipo());
partita.put(PART_SOTTOCONTO, b.sottoconto());
@ -513,6 +507,8 @@ bool TPrimanota_application::edit_partite(int riga)
TString desc; // Descrizione prima partita del gruppo
TImporto saldo; // Saldo ultima parita
TToken_string r(80);
const long curreg = curr_mask().get_long(F_NUMREG); // Numero registrazione
for (int err = partita.read(_isgteq); err == NOERR && partita.curr() == recpar; err = partita.next())
{
@ -524,13 +520,6 @@ bool TPrimanota_application::edit_partite(int riga)
{
const TImporto i(partita.get_char(PART_SEZ), partita.get_real(PART_IMPORTO));
saldo += i; // ... incrementa totale
if (nreg == curreg)
{
const int numrig = partita.get_int(PART_NUMRIG);
if (numrig == (riga+1))
_soldi -= i;
}
}
else
{
@ -558,7 +547,7 @@ bool TPrimanota_application::edit_partite(int riga)
end_wait();
KEY k = a.items() > 0 ? K_ENTER : K_ESC; // Esce se non ci sono righe
KEY k = a.items() > 0 ? K_ENTER : K_ESC; // Esce se non ci sono righe
while (k == K_ENTER)
{
k = a.run();
@ -566,7 +555,7 @@ bool TPrimanota_application::edit_partite(int riga)
{
const int anno = a.row().get_int(0);
const TString16 num = a.row().get(1);
edit_scadenze(anno, num); // Edita pagamenti
edit_scadenze(anno, num); // Edita pagamenti
}
}
@ -582,7 +571,7 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int rata, int rmo
const int nriga = partita.righe();
CHECKD(nriga > 0, "Riga partita errata ", nriga);
part = partita.riga(nriga);
part = partita.riga(1);
// PART_ANNO viene preso dalla partita base
// PART_NUMPART viene preso dalla partita base
@ -591,8 +580,8 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int rata, int rmo
part.put(PART_TIPOMOV, causale().tipomov()); // Dati causale corrente
part.put(PART_CODCAUS, causale().codice());
part.put(PART_NREG, curr_mask().get(F_NUMREG)); // Numero operazione
part.put(PART_NUMRIG, rmov+1); // Riga su cui ho cliccato
part.put(PART_NREG, curr_mask().get(F_NUMREG)); // Numero operazione
part.put(PART_NUMRIG, rmov); // Riga su cui ho cliccato
// Copia dati movimento corrente
part.put(PART_DATAREG, curr_mask().get(F_DATAREG));
@ -643,19 +632,24 @@ int TPrimanota_application::nuovo_pagamento(TPartita& partita, int rata, int rmo
caus = 2; break;
}
// PART_TIPOC viene preso dalla partita base
// PART_GRUPPO viene preso dalla partita base
// PART_CONTO viene preso dalla partita base
// PART_SOTTOCONTO viene preso dalla partita base
TBill bill; causale().bill(caus, bill);
if (bill.empty()) causale().bill(caus = 1, bill);
bill.put(part);
bill.put(part, TRUE);
TBill b; b.get(partita.riga(1));
if (b.tipo() > ' ') // Se cliente o fornitore cerca sua banca
bill.get(partita.riga(1));
if (bill.tipo() > ' ') // Se cliente o fornitore cerca sua banca
{
TRelation cliforel(LF_CLIFO);
cliforel.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF");
TRectype& clifo = cliforel.lfile().curr();
clifo.put(CLI_TIPOCF, b.tipo());
clifo.put(CLI_CODCF, b.codclifo());
clifo.put(CLI_TIPOCF, bill.tipo());
clifo.put(CLI_CODCF, bill.codclifo());
const int err = cliforel.read();
CHECK(err == NOERR, "Chiss'e' fregato il clifo");
@ -699,17 +693,11 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num)
{
TString caption; caption.format("Pagamenti della partita %s dell'anno %d", num, anno);
TArray_sheet a(-1, -1, 0, 0, caption, "Rata|Data@10|Importo@15|Descrizione@50|Riga", 0x8);
TPartita* game = _partite.partita(anno, num);
if (game == NULL)
{
game = new TPartita(anno, num);
_partite.add(game);
}
TPartita& partita = *game;
TPartita& partita = _partite.partita(anno, num);
const long curreg = curr_mask().get_long(F_NUMREG); // Numero registrazione corrente
const int currig = cgs().selected()+1; // Numero riga corrente
TToken_string r(80); // Work string
KEY k = K_ENTER;
@ -749,7 +737,7 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num)
r.add(paga.get(PART_DESCR));
r.add(paga.get(PART_NRIGA));
nr = a.add(r);
if (paga.get_long(PART_NREG) != curreg || paga.get_int(PART_NUMRIG) != _riga+1)
if (paga.get_long(PART_NREG) != curreg || paga.get_int(PART_NUMRIG) != currig)
a.disable(nr);
}
}
@ -765,7 +753,7 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num)
TRectype part(LF_PARTITE);
if (nrig == 0) // Se ho cliccato su una scadenza ...
nrig = nuovo_pagamento(partita, rata, _riga, part);
nrig = nuovo_pagamento(partita, rata, currig, part);
else
part = partita.riga(nrig);
@ -777,41 +765,29 @@ bool TPrimanota_application::edit_scadenze(int anno, const char* num)
}
static bool importopag_handler(TMask_field& f, KEY k)
{
if (k == K_F8)
{
TMask& m = f.mask();
f.set(m.get(S_IMPORTO));
k = K_TAB;
}
if (f.to_check(k))
{
TMask& m = f.mask();
const real r(m.get(S_RESIDUO));
real i(f.get());
if (i > r)
const real tot(m.get(S_IMPORTO));
if (i > tot)
{
warning_box("Non e' possibile inserire un importo superiore al residuo");
i = r;
warning_box("Non e' possibile inserire un importo superiore a ", tot.string("."));
i = tot;
f.set(i.string());
}
if (i > _max.valore())
{
const TFixed_string val(_max.valore().string("."));
warning_box("La riga contabile ha un residuo di %s", (const char*)val);
f.set(val);
}
if (i == r)
{
m.set(S_SALDOACC, "X");
m.disable(S_SALDOACC);
}
else
m.enable(S_SALDOACC);
if (i == tot)
m.set(S_SALDOACC, "S");
}
else
if (k == K_F8)
{
const TString& val = f.mask().get(S_RESIDUO);
f.set(val);
}
return TRUE;
}
@ -847,49 +823,122 @@ bool TPrimanota_application::edit_pagamento(TPartita& p, TRectype& part)
m.set(S_IMPORTOVAL, scaden.get(SCAD_IMPORTOVAL)); // " in valuta
m.set(S_RATA, scaden.get(SCAD_NRATA));
const char sez = part.get_char(PART_SEZ); // Sezione importo e rituenute
const char controsez = sez == 'D' ? 'A' : 'D'; // Sezione opposta
// Memorizza importi prima di eventuali variazioni
const real importo(part.get(PART_IMPORTO));
const real ritenute(part.get(PART_RITENUTE));
const real old_importo(part.get(PART_IMPORTO));
const real old_ritenute(part.get(PART_RITENUTE));
const TBill old_conto(m.get_int(S_GRUPPO), m.get_int(S_CONTO), m.get_long(S_SOTTOCONTO));
const int old_riga = old_conto.ok() ? bill2pos(old_conto, 'I') : -1;
_max.set(_soldi.sezione(), _soldi.valore() + importo); // Importo massimo del campo S_IMPORTOPAG
const KEY key = m.run();
if (key == K_ENTER)
if (key == K_ENTER || key == K_DEL)
{
if (key == K_DEL)
{
m.reset(S_IMPORTOPAG);
m.reset(S_RITENUTE);
}
m.autosave(&rel);
part = partita.curr();
const char sez = _soldi.sezione() == 'D' ? 'A' : 'D';
if (old_riga >= 0)
sub_cgs_imp(old_riga, old_importo);
const real imp(m.get(S_IMPORTOPAG));
const TImporto impg(sez, imp-importo);
if (!impg.is_zero())
// Importo della contropartita
const TImporto new_importo(controsez, part.get_real(PART_IMPORTO));
if (!new_importo.is_zero())
{
_soldi += impg; // Sottrai soldi spesi qui
TBill conto(m.get_int(S_GRUPPO), m.get_int(S_CONTO), m.get_long(S_SOTTOCONTO));
TBill conto; conto.get(part);
const int riga = bill2pos(conto, 'I');
if (riga < 0)
set_cgs_row(riga, impg, conto, m.get(S_DESCAGG), 'I');
set_cgs_row(riga, new_importo, conto, part.get(PART_DESCR), 'I');
else
add_cgs_imp(riga, impg);
add_cgs_imp(riga, new_importo);
}
const real rit(m.get(S_RITENUTE));
const TImporto ritg(sez, rit-ritenute);
const real rit(part.get(PART_RITENUTE));
const TImporto grow_ritenute(controsez, rit-old_ritenute); // Variazione ritenute fiscali
if (!ritg.is_zero())
if (!grow_ritenute.is_zero())
{
const riga = type2pos('F');
if (riga < 0)
{
TBill conto_rit; causale().bill(11, conto_rit);
set_cgs_row(riga, ritg, conto_rit, "", 'F');
set_cgs_row(riga, grow_ritenute, conto_rit, "", 'F');
}
else add_cgs_imp(riga, ritg);
else add_cgs_imp(riga, grow_ritenute);
}
p.add_riga(part);
if (key == K_ENTER)
p.add_riga(part);
else
p.remove_riga(part);
}
return key == K_ENTER;
return key != K_ESC;
}
bool TPrimanota_application::notify_cgline_deletion(TPartita& partita, long nreg, int numrig)
{
bool found = FALSE;
const int riga_ritenute = type2pos('F');
for (int r = partita.righe(); r > 0; r--)
{
TRectype pag(partita.riga(r));
const long reg = pag.get_long(PART_NREG);
if (reg == nreg) // Se la registrazione corrisponde
{
const int num = pag.get_int(PART_NUMRIG);
if (num == numrig) // Se la riga corrisponde
{
const real ritenute = pag.get_real(PART_RITENUTE);
if (!ritenute.is_zero())
{
if (riga_ritenute >= 0)
sub_cgs_imp(riga_ritenute, ritenute);
else
error_box("Non esiste la riga delle ritenute di un pagamento della riga %d", numrig);
}
const real importo = pag.get_real(PART_IMPORTO);
if (!importo.is_zero())
{
TBill contro; contro.get(pag);
const int riga_contro = bill2pos(contro, 'I');
if (riga_contro >= 0)
sub_cgs_imp(riga_contro, importo);
else
error_box("Non esiste la riga dell'importo di un pagamento della riga %d", numrig);
}
partita.remove_riga(pag);
found = TRUE;
}
else
if (num > numrig) // Se la riga e' successiva
{
pag.put(PART_NUMRIG, num-1);
partita.add_riga(pag);
}
}
}
return found;
}
bool TPrimanota_application::notify_cgline_deletion(int numrig)
{
bool found = FALSE;
const long nreg = curr_mask().get_long(F_NUMREG);
_partite.add_reg_num(nreg, 0);
for (TPartita* game = _partite.first(); game; game = _partite.next())
found |= notify_cgline_deletion(*game, nreg, numrig);
return found;
}

View File

@ -22,7 +22,7 @@ END
STRING 109 50
BEGIN
PROMPT 14 2 ""
PROMPT 12 2 ""
USE %DPN KEY 2
INPUT S0 109
DISPLAY "Descrizione@50" S0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -97,8 +97,8 @@ public:
class TTab_conti : public TAssoc_array
{
public:
void aggiorna_conto(const TBill& tc, int anno_es, const real& importo,
char sezione, bool movap, bool provv, bool somma);
void aggiorna_conto(const TBill& tc, int anno_es, const TImporto& importo,
bool movap, bool provv, bool somma);
TConto* add(const TBill& c, int anno);
TConto* find(const TBill& c, int anno);
@ -108,7 +108,7 @@ public:
class TSaldo_agg : public TObject
{
TTab_conti _tab_conti;
TTab_conti _tab_conti;
bool _movap; // se e' mov. d'apertura (aggiorno SALDO e FLAGSALINI in
// saldi)
bool _provv;
@ -120,7 +120,7 @@ class TSaldo_agg : public TObject
public:
void clear_saldi(int year);
void registra();
void aggiorna (const TBill& tc, const real& importo, char sezione, bool somma=TRUE);
void aggiorna (const TBill& tc, const TImporto& importo, bool somma=TRUE);
void aggiorna (int gruppo, int conto, long sottoconto,
const real& importo, char sezione, bool somma=TRUE);

View File

@ -40,30 +40,36 @@ void TTab_conti::remove(const TBill& c, int anno)
}
void TTab_conti::aggiorna_conto(const TBill& tcon,
int anno_es, const real& importo, char sezione,
int anno_es, const TImporto& importo,
bool movap, bool provv, bool somma)
{
TConto* tc = find(tcon, anno_es);
if (tc == NULL)
tc = add(tcon, anno_es);
real i = somma ? importo : -importo;
const real i(somma ? importo.valore() : -importo.valore());
if (movap)
{
if (sezione == 'D') tc->saldo() += i;
else tc->saldo() -= i;
if (importo.sezione() == 'D')
tc->saldo() += i;
else
tc->saldo() -= i;
}
else
if (provv)
{
if (sezione == 'D') tc->darepro() += i;
else tc->averepro() += i;
if (importo.sezione() == 'D')
tc->darepro() += i;
else
tc->averepro() += i;
}
else
{
if (sezione == 'D') tc->dare() += i;
else tc->avere() += i;
if (importo.sezione() == 'D')
tc->dare() += i;
else
tc->avere() += i;
}
// rimuovo dalla tabella il conto se dare e avere vanno a zero
@ -83,15 +89,15 @@ TSaldo_agg::TSaldo_agg()
reset(); // pulizia dell'array dei conti
}
void TSaldo_agg::aggiorna(const TBill& tc, const real& importo, char sezione, bool somma)
{
_tab_conti.aggiorna_conto(tc, _anno_es, importo, sezione, _movap, _provv, somma);
void TSaldo_agg::aggiorna(const TBill& tc, const TImporto& imp, bool somma)
{
_tab_conti.aggiorna_conto(tc, _anno_es, imp, _movap, _provv, somma);
}
void TSaldo_agg::aggiorna(int gruppo, int conto, long sottoconto, const real& importo, char sezione, bool somma)
{
_tab_conti.aggiorna_conto(TBill(gruppo, conto, sottoconto), _anno_es, importo,
sezione, _movap, _provv, somma);
const TImporto imp(sezione, importo);
_tab_conti.aggiorna_conto(TBill(gruppo, conto, sottoconto), _anno_es, imp, _movap, _provv, somma);
}
void TSaldo_agg::reset()

View File

@ -81,36 +81,44 @@ const TBill& TBill::add_to(TToken_string& ts, int from, int mode)
}
const char* TBill::file2type(int num) const
{
const char* t = "TIPOC";
switch (num)
{
case LF_PARTITE:
case LF_SCADENZE:
t = "TIPOCF"; break;
default:
break;
}
return t;
const char* TBill::field_name(int n, bool contro) const
{
CHECKD(n >= 0 && n <= 3, "Invalid bill field", n);
const char* f;
if (contro)
switch(n)
{
case 0: f = "GRUPPOC"; break;
case 1: f = "CONTOC"; break;
case 2: f = "SOTTOCONTC"; break;
default:f = "TIPOCC"; break;
}
else
switch(n)
{
case 0: f = "GRUPPO"; break;
case 1: f = "CONTO"; break;
case 2: f = "SOTTOCONTO"; break;
default:f = "TIPOC"; break;
}
return f;
}
void TBill::put(TRectype& r) const
void TBill::put(TRectype& r, bool c) const
{
r.put(file2type(r.num()), tipo());
r.put("GRUPPO", gruppo());
r.put("CONTO", conto());
r.put("SOTTOCONTO", sottoconto());
r.put(field_name(0, c), gruppo());
r.put(field_name(1, c), conto());
r.put(field_name(2, c), sottoconto());
r.put(field_name(3, c), tipo());
}
bool TBill::get(const TRectype& r)
bool TBill::get(const TRectype& r, bool c)
{
set(r.get_int("GRUPPO"),
r.get_int("CONTO"),
r.get_long("SOTTOCONTO"),
r.get_char(file2type(r.num())));
set(r.get_int(field_name(0, c)),
r.get_int(field_name(1, c)),
r.get_long(field_name(2, c)),
r.get_char(field_name(3, c)));
if (r.num() == LF_RMOVIVA)
tipo_cr(r.get_int("TIPOCR"));
@ -285,83 +293,3 @@ const char* TBill::string(int mode)
}
///////////////////////////////////////////////////////////
// Importo
///////////////////////////////////////////////////////////
const TImporto& TImporto::add_to(TToken_string& s) const
{
const bool dare = sezione() == 'D';
const char* v = valore().string();
s.add(dare ? v : "", 0);
s.add(dare ? "" : v, 1);
return *this;
}
// Cerified 99%
// Ambigous section for ZERO
const TImporto& TImporto::operator =(TToken_string& sv)
{
_valore = real(sv.get(0));
if (_valore == ZERO)
{
_valore = real(sv.get());
_sezione = 'A';
}
else
_sezione = 'D';
return *this;
}
const TImporto& TImporto::set(char s, const real& v)
{
CHECKD(s == 'D' || s == 'A', "Sezione errata per importo: codice ", (int)s);
_sezione = s; _valore = v;
return *this;
}
const TImporto& TImporto::operator += (const TImporto& i)
{
if (_valore.is_zero())
_sezione = i._sezione;
if (_sezione == i._sezione)
_valore += i._valore;
else
_valore -= i._valore;
return *this;
}
const TImporto& TImporto::operator -= (const TImporto& i)
{
if (_valore.is_zero())
_sezione = i._sezione;
if (_sezione == i._sezione)
_valore -= i._valore;
else
_valore += i._valore;
return *this;
}
const TImporto& TImporto::swap_section()
{
_sezione = (_sezione == 'D') ? 'A' : 'D';
return *this;
}
const TImporto& TImporto::normalize()
{
if (_valore.sign() < 0)
{
_valore = -_valore;
swap_section();
}
return *this;
}

View File

@ -20,7 +20,7 @@ protected:
virtual const char* class_name() const { return "Conto"; }
const TBill& copy(const TBill& b);
const char* file2type(int logicnum) const;
const char* field_name(int n, bool contro) const;
public:
TBill(int g = 0, int c = 0, long s = 0L, char t = ' ', const char* d = NULL, int r = -1)
@ -56,39 +56,13 @@ public:
bool sospeso() const { return _sospeso; } // _sospeso e' letto nella read()
char sezione() const { return _sezione; }
void put(TRectype& r) const;
bool get(const TRectype& r);
void put(TRectype& r, bool contro = FALSE) const;
bool get(const TRectype& r, bool contro = FALSE);
const char* string(int mode = 0);
};
class TImporto : public TObject
{
char _sezione;
real _valore;
public:
char sezione() const { return _sezione; }
const real& valore() const { return _valore; }
bool is_zero() const { return _valore.is_zero(); }
const TImporto& operator=(const TImporto& i) { return set(i.sezione(), i.valore()); }
const TImporto& operator=(TToken_string& sv);
const TImporto& operator+=(const TImporto& i);
const TImporto& operator-=(const TImporto& i);
const TImporto& normalize();
const TImporto& swap_section();
const TImporto& set(char s, const real& v);
const TImporto& add_to(TToken_string& s) const;
TImporto(char s = 'D', const real& v = ZERO) { set(s, v); }
TImporto(const TImporto& i) : _sezione(i._sezione), _valore(i._valore) {}
};
enum TIndbil { ib_null, ib_attivita, ib_passivita, ib_costi, ib_ricavi, ib_conti_ordine };
class TConto : public TBill

View File

@ -994,7 +994,9 @@ TPartita::TPartita(int anno, const char* num)
}
int TPartita::add_riga(const TRectype& r)
{
{
CHECK(r.num() == LF_PARTITE, "Tipo record errato");
const char sez = r.get_char(PART_SEZ);
const real val = r.get_real(PART_IMPORTO);
const TImporto imp(sez, val);
@ -1025,6 +1027,13 @@ int TPartita::add_riga(const TRectype& r)
return _part.add_row(r);
}
void TPartita::remove_riga(TRectype& z)
{
z.zero(PART_IMPORTO);
add_riga(z);
_part.destroy_row(z, TRUE);
}
int TPartita::add_rata(const TRectype& r)
{
return _scad.add_row(r);
@ -1093,7 +1102,27 @@ bool TPartita::rata_pagata(int r) const
const bool pagata = importo.is_zero();
return pagata;
}
real TPartita::importo_speso(long nreg, int numrig) const
{
real imp;
for (int r = righe(); r > 0; r--)
{
const TRectype& pag = riga(r);
const long reg = pag.get_long(PART_NREG);
if (reg == nreg)
{
const int num = pag.get_int(PART_NUMRIG);
if (num == numrig)
imp += pag.get_real(PART_IMPORTO);
}
}
return imp;
}
///////////////////////////////////////////////////////////
// TPartite_array
///////////////////////////////////////////////////////////
@ -1106,31 +1135,90 @@ const TString& TPartite_array::key(int anno, const char* num)
}
// Certified 99%
void TPartite_array::add(TPartita* p)
{
const TString& k = key(p->anno(), p->numero());
TAssoc_array::add(k, p);
}
TPartita* TPartite_array::partita(int anno, const char* num)
TPartita* TPartite_array::find(int anno, const char* num, bool create)
{
const TString& k = key(anno, num);
TPartita* p = (TPartita*)objptr(k);
if (p == NULL && create)
{
p = new TPartita(anno, num);
if (p->ok())
add(k, p);
else
{
delete p;
p = NULL;
}
}
return p;
}
TPartita* TPartite_array::find(const TRectype& r, bool create)
{
const int anno = r.get_int(PART_ANNO);
const char* num = r.get_str(PART_NUMPART);
return find(anno, num, create);
}
TPartita& TPartite_array::partita(int anno, const char* num)
{
TPartita* game = find(anno, num, TRUE);
CHECKS(game, "Partita errata ", num);
return *game;
}
TPartita& TPartite_array::partita(const TRectype& r)
{
TPartita* game = find(r, TRUE);
CHECK(game, "Partita errata");
return *game;
}
bool TPartite_array::write(bool re)
{
int err = NOERR;
TPartita* game;
restart();
TPartita* p;
while ((p = (TPartita*)get()) != NULL)
while ((game = (TPartita*)get()) != NULL)
{
err = p->write(re);
err = game->write(re);
if (err != NOERR) // L'errore viene gia' segnalato dalla partita
break;
}
return err == NOERR;
}
// Aggiunge all'array tutte le partite che si riferiscono alla registrazione nreg
int TPartite_array::add_reg_num(long nreg, int numrig)
{
TRelation rel(LF_PARTITE);
TRectype& part = rel.lfile().curr();
// Costruzione filtro del cursore
part.zero();
part.put(PART_NREG, nreg);
if (numrig > 0)
part.put(PART_NUMRIG, numrig);
const TRectype filter(part);
TCursor cur(&rel, "", 3, &filter, &filter);
for (cur = 0; cur.ok(); ++cur)
partita(part); // Aggiungi partita se non esiste gia'
return (int)cur.items();
}
real TPartite_array::importo_speso(long nreg, int numrig)
{
real imp;
const int found = add_reg_num(nreg, numrig);
if (found)
for (TPartita* game = first(); game; game = next())
imp += game->importo_speso(nreg, numrig);
return imp;
}

View File

@ -163,6 +163,7 @@ public: // TObject
public:
int add_riga(const TRectype& r);
const TRectype& riga(int r) const { return _part.row(r); }
void remove_riga(TRectype& z);
int righe() const { return _part.rows(); }
bool rata_pagata(int r) const;
@ -180,6 +181,8 @@ public:
const TString& numero() const { return riga(1).get(PART_NUMPART); }
const TString& descrizione() const { return riga(1).get(PART_DESCR); }
const TImporto& totale() const { return _totale; }
real importo_speso(long numreg, int numrig) const;
TPartita(int anno, const char* num);
};
@ -187,22 +190,29 @@ public:
class TPartite_array : private TAssoc_array
{
TString16 _key;
TString16 _key; // Work string
protected:
const TString& key(int anno, const char* num);
const TString& key(int anno, const char* num); // Build key for TAssoc_array
TPartita* find(int anno, const char* numero, bool create);
TPartita* find(const TRectype& part, bool create);
public: // TAssoc_array
public: // TAssoc_array
virtual void destroy() { TAssoc_array::destroy(); }
public:
TPartita* partita(int anno, const char* numero);
void add(TPartita* p);
TPartita& partita(int anno, const char* numero);
TPartita& partita(const TRectype& r);
bool write(bool re = FALSE);
bool rewrite() { return write(TRUE); }
int add_reg_num(long numreg, int numrig);
real importo_speso(long numreg, int numrig);
TPartita* first() { restart(); return next(); }
TPartita* next() { return (TPartita*)get(); }
TPartite_array() {}
};