Corretta gestione partite in scrittura

git-svn-id: svn://10.65.10.50/trunk@2124 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-11-10 13:35:00 +00:00
parent 9d92a6707c
commit ea5ad0992b
8 changed files with 275 additions and 225 deletions

View File

@ -23,7 +23,6 @@ TPrimanota_application::TPrimanota_application()
memset(_msk, 0, sizeof(_msk)); memset(_msk, 0, sizeof(_msk));
} }
TMask* TPrimanota_application::load_mask(int n) TMask* TPrimanota_application::load_mask(int n)
{ {
if (n == 2 && _msk[0] != NULL) if (n == 2 && _msk[0] != NULL)
@ -255,7 +254,9 @@ 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_ANNORIF, _is_saldaconto); // Mostra/nasconde anno e riferimento partita
m->show(F_NUMRIF, _is_saldaconto); m->show(F_NUMRIF, _is_saldaconto);
m->field(F_NUMRIF).set_justify(iva == iva_acquisti ? _num_for : _num_cli); TEdit_field& numrif = m->efield(F_NUMRIF);
numrif.set_justify(iva == iva_acquisti ? _num_for : _num_cli);
numrif.set_trim(!numrif.right_justified());
const bool av = causale().reg().agenzia_viaggi(); const bool av = causale().reg().agenzia_viaggi();
m->show(F_DATA74TER, av); m->show(F_DATA74TER, av);
@ -557,14 +558,6 @@ void TPrimanota_application::init_insert_mode(TMask& m)
void TPrimanota_application::init_modify_mode(TMask& m) void TPrimanota_application::init_modify_mode(TMask& m)
{ {
init_mask(m); init_mask(m);
partite().destroy();
if (is_saldaconto())
{
const long numreg = m.get_long(F_NUMREG);
partite().add_numreg(numreg);
}
calcola_saldo(); // Verifica eventuali sbilanci contabili calcola_saldo(); // Verifica eventuali sbilanci contabili
} }
@ -674,6 +667,7 @@ int TPrimanota_application::read(TMask& m)
calcola_imp(); // Calcola totale imponibile ed imposte calcola_imp(); // Calcola totale imponibile ed imposte
partite().destroy();
const int tm = causale().tipomov(); const int tm = causale().tipomov();
if (tm != 0 && tm != 2) // Ci sono scadenze if (tm != 0 && tm != 2) // Ci sono scadenze
{ {

View File

@ -161,6 +161,7 @@ END
STRING 102 7 STRING 102 7
BEGIN BEGIN
PROMPT 1 3 "Partita " PROMPT 1 3 "Partita "
FLAGS "_"
END END
DATA 103 DATA 103

View File

@ -38,7 +38,7 @@ END
STRING S_NUM 7 STRING S_NUM 7
BEGIN BEGIN
PROMPT 15 1 "Numero " PROMPT 15 1 "Numero "
FLAGS "DR" FLAGS "D_"
FIELD NUMPART FIELD NUMPART
END END
@ -155,9 +155,10 @@ BEGIN
GROUP 2 GROUP 2
END END
LIST S_SALDOACC 1 12 RADIOBUTTON S_SALDOACC 1 24
BEGIN BEGIN
PROMPT 2 10 "Saldo/Acc." PROMPT 2 9 ""
FLAGS "Z"
ITEM "A|Acconto" ITEM "A|Acconto"
ITEM "S|Saldo" ITEM "S|Saldo"
FIELD ACCSAL FIELD ACCSAL

View File

@ -68,7 +68,7 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k)
mod = m_imp = TRUE; mod = m_imp = TRUE;
} }
if (newt != ts.get(4)) // modificato tipo pagamento if (newt != ts.get(4)) // modificato tipo pagamento
mod = m_tipo = TRUE; mod = m_tipo = m_ulc = TRUE;
if (newu != ts.get(5)) // modificata ulteriore classificazione if (newu != ts.get(5)) // modificata ulteriore classificazione
mod = m_ulc = TRUE; mod = m_ulc = TRUE;
@ -460,9 +460,9 @@ bool TPrimanota_application::read_scadenze(TMask& m)
void TPrimanota_application::write_scadenze(const TMask& m) void TPrimanota_application::write_scadenze(const TMask& m)
{ {
const int anno = m.get_int(F_ANNORIF);
const TString16 numpart(m.get(F_NUMRIF));
const long nreg = m.get_long(F_NUMREG); const long nreg = m.get_long(F_NUMREG);
const int anno = m.get_int(F_ANNORIF);
const TString numpart(m.get(F_NUMRIF));
TPartita* newgame = NULL; TPartita* newgame = NULL;
if (anno > 0 && numpart.not_empty()) if (anno > 0 && numpart.not_empty())

View File

@ -199,8 +199,12 @@ protected:
int nuova_riga(TPartita& partita) const; int nuova_riga(TPartita& partita) const;
int nuovo_pagamento(TPartita& partita, int nriga, int rata) const; int nuovo_pagamento(TPartita& partita, int nriga, int rata) const;
bool edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) const; bool edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) const;
bool same_number(const char* s1, const char* s2) const;
#ifdef __EXTRA__ #ifdef __EXTRA__
bool edit_fattura(TPartita& p, int nriga); bool edit_fattura(TPartita& p, int nriga);
void prima_nota(const long nreg);
#endif #endif
bool cerca_valuta(TValuta& val) const; bool cerca_valuta(TValuta& val) const;
@ -280,13 +284,16 @@ bool TGame_mask::numpart_handler(TMask_field& f, KEY k)
{ {
TToken_string& row = sheet.row(i); TToken_string& row = sheet.row(i);
if (anno == row.get_int(0)) // Se corrisponde l'anno e ... if (anno == row.get_int(0)) // Se corrisponde l'anno e ...
if (num == row.get()) // corrisponde il numero partita ... {
TString16 n = row.get(); n.trim();
if (num == n) // corrisponde il numero partita ...
{ {
sheet.select(i); // ... seleziona la partita sheet.select(i); // ... seleziona la partita
partite_notify(sheet, i, K_TAB); // ed esplodi le sue righe partite_notify(sheet, i, K_TAB); // ed esplodi le sue righe
break; break;
} }
} }
}
if (i >= sheet.items()) if (i >= sheet.items())
f.warning_box("Partita inesistente"); f.warning_box("Partita inesistente");
} }
@ -423,13 +430,16 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TString_array& scadenze = gm.scadenze().rows_array(); TString_array& scadenze = gm.scadenze().rows_array();
scadenze.destroy(); scadenze.destroy();
const TBill& zio = gm.conto(); // Conto cliente/fornitore
TToken_string& row = partite.row(r); TToken_string& row = partite.row(r);
const int anno = row.get_int(0); // Anno partita const int anno = row.get_int(0); // Anno partita
const TString16 num = row.get(); // Numero partita const TString16 num = row.get(); // Numero partita
gm.set(P_ANNO, anno); // Aggiorna campi di ricerca gm.set(P_ANNO, anno); // Aggiorna campi di ricerca
gm.set(P_NUMERO, num); gm.set(P_NUMERO, num);
if (anno > 0)
{
const TBill& zio = gm.conto(); // Conto cliente/fornitore
TPartita* game = app().partite().exist(zio, anno, num); // Cerca la partita tra quelle editate TPartita* game = app().partite().exist(zio, anno, num); // Cerca la partita tra quelle editate
const bool should_delete_game = (game == NULL); // Ricorda di fare delete const bool should_delete_game = (game == NULL); // Ricorda di fare delete
if (should_delete_game) // Se non c'era ... if (should_delete_game) // Se non c'era ...
@ -589,10 +599,12 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
add_importo(sp, tot_val.normalize(), TRUE); add_importo(sp, tot_val.normalize(), TRUE);
} }
gm.scadenze().force_update();
if (should_delete_game) if (should_delete_game)
delete game; delete game;
} }
gm.scadenze().force_update();
}
if (k == K_INS) if (k == K_INS)
{ {
gm.send_key(K_CTRL + 'N', 0, &partite); // Simula la pressione del tasto nuovo gm.send_key(K_CTRL + 'N', 0, &partite); // Simula la pressione del tasto nuovo
@ -622,6 +634,11 @@ int TGame_mask::nuova_riga(TPartita& partita) const
part.put(PART_NREG, _numreg); // Numero operazione part.put(PART_NREG, _numreg); // Numero operazione
part.put(PART_NUMRIG, _numrig); // Riga su cui ho cliccato part.put(PART_NUMRIG, _numrig); // Riga su cui ho cliccato
// Forza il gruppo/conto cliente corretto
part.put(PART_GRUPPOCL, conto().gruppo());
part.put(PART_CONTOCL, conto().conto());
// Setta il cambio corrente
const real cambio(get(P_CAMBIO)); const real cambio(get(P_CAMBIO));
part.put(PART_CAMBIO, cambio); part.put(PART_CAMBIO, cambio);
part.put(PART_CODVAL, get(P_VALUTA)); part.put(PART_CODVAL, get(P_VALUTA));
@ -745,7 +762,6 @@ int TGame_mask::nuovo_pagamento(TPartita& partita, int nriga, int rata) const
return nrigp; return nrigp;
} }
bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k) bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
{ {
if (k == K_SPACE) if (k == K_SPACE)
@ -773,6 +789,13 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
if (nrata != 0 && nrigp == 0) if (nrata != 0 && nrigp == 0)
{ {
#ifdef __EXTRA__
gm._tipomov = 3;
gm._descr = "";
gm._numdoc = "";
gm._datadoc = TDate(TODAY);
gm._sezione = game.riga(nriga).sezione() == 'D' ? 'A' : 'D';
#endif
nrigp = gm.nuovo_pagamento(game, nriga, nrata); nrigp = gm.nuovo_pagamento(game, nriga, nrata);
nreg = gm._numreg; nreg = gm._numreg;
} }
@ -793,38 +816,19 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
} }
} }
else else
{
#ifdef __EXTRA__
gm.prima_nota(nreg);
#else
return f.error_box("Modificare il movimento %ld", nreg); return f.error_box("Modificare il movimento %ld", nreg);
#endif
}
} }
else else
{ // Si vogliono editare le rate { // Si vogliono editare le rate
#ifdef __EXTRA__ #ifdef __EXTRA__
if (nreg > 0) if (nreg > 0)
{ gm.prima_nota(nreg);
bool can_run = TRUE;
if (gm._changed)
{
can_run = yesno_box("Salvare le parite modificate?");
if (can_run)
{
app().partite().rewrite();
gm._changed = FALSE; // Resetta flag di cambiato
}
}
if (can_run)
{
const char* pn = "cg2 -0";
TExternal_app prima_nota(pn);
TString16 numreg; numreg << "1|" << nreg;
TMessage msg(pn, MSG_LN, numreg);
msg.send(); // Messaggio di collegamento al movimento nreg
app().partite().destroy(); // Distrugge tutte le partite in memoria
prima_nota.run(); // Lancia la prima nota
const int anno = gm.get_int(P_ANNO);
const TString16 numero = gm.get(P_NUMERO);
gm.fill_partite(anno, numero); // Ripristina partite
}
}
else else
gm.edit_fattura(game, nriga); gm.edit_fattura(game, nriga);
#else #else
@ -989,6 +993,12 @@ int TGame_mask::update_partita(const TPartita& game, int prow)
else else
prow = partite().items()-1; prow = partite().items()-1;
if (prow == 0)
{
const char all = game.allineamento_richiesto();
field(P_NUMERO).set_justify(all == 'R');
}
return prow; return prow;
} }
@ -1029,6 +1039,13 @@ void TGame_mask::update_saldo_clifo()
r << conto().sottoconto(); r << conto().sottoconto();
} }
bool TGame_mask::same_number(const char* s1, const char* s2) const
{
TString t1(s1); t1.trim();
TString t2(s2); t2.trim();
return t1 == t2;
}
void TGame_mask::fill_partite(int annorif, const char* numrif) void TGame_mask::fill_partite(int annorif, const char* numrif)
{ {
const bool all = get(P_SHOWALL).not_empty(); const bool all = get(P_SHOWALL).not_empty();
@ -1043,7 +1060,8 @@ void TGame_mask::fill_partite(int annorif, const char* numrif)
for (TPartita* gioco = app().partite().first(); gioco != NULL; gioco = app().partite().next()) for (TPartita* gioco = app().partite().first(); gioco != NULL; gioco = app().partite().next())
{ {
const int added = update_partita(*gioco, -1); // Memorizza posizione di inserimento const int added = update_partita(*gioco, -1); // Memorizza posizione di inserimento
if (first_game < 0 && gioco->anno() == annorif && gioco->numero() == numrif) if (first_game < 0 && gioco->anno() == annorif &&
same_number(gioco->numero(), numrif))
first_game = added; first_game = added;
} }
@ -1074,7 +1092,8 @@ void TGame_mask::fill_partite(int annorif, const char* numrif)
if (all || !game.chiusa()) if (all || !game.chiusa())
added = update_partita(game, -1); added = update_partita(game, -1);
if (first_game < 0 && added >= 0 && anno == annorif && num == numrif) if (first_game < 0 && added >= 0 &&
anno == annorif && same_number(num, numrif))
first_game = added; first_game = added;
} }
partita.put(PART_NRIGA, 9999); // Forza lettura partita successiva nella prossima read partita.put(PART_NRIGA, 9999); // Forza lettura partita successiva nella prossima read
@ -1092,7 +1111,7 @@ void TGame_mask::fill_partite(int annorif, const char* numrif)
else else
{ {
scadenze().destroy(); scadenze().destroy();
scadenze().force_update(); // scadenze().force_update();
} }
app().end_wait(); app().end_wait();
} }

View File

@ -688,6 +688,8 @@ word TPagamento::recalc_rate(int row, bool is_perc_modified,
TToken_string& ss = (TToken_string&)srate[k]; TToken_string& ss = (TToken_string&)srate[k];
tt.add(typ,2); tt.add(typ,2);
ss.add(typ,2); ss.add(typ,2);
tt.add(ulc,5);
ss.add(ulc,5);
need_recalc = TRUE; need_recalc = TRUE;
// no error is possible // no error is possible
} }
@ -1384,7 +1386,6 @@ void TPagamento::set_sheet(TSheet_field& sf, int sscad)
ts.add(paid ? "X" : "", 11); // 11 - Pagaya ts.add(paid ? "X" : "", 11); // 11 - Pagaya
} }
// destroy remaining and don't avoid screen update forever and ever
for (int d = sf.items()-1; d >= i; d--) for (int d = sf.items()-1; d >= i; d--)
sf.destroy(d); sf.destroy(d);

View File

@ -527,10 +527,16 @@ int TRiga_partite::ultima_ratapagata() const
return r; return r;
} }
bool TRiga_partite::is_fattura() const
{
return get_int(PART_TIPOMOV) == 1;
}
int TRiga_partite::read(TBaseisamfile& f, word op) int TRiga_partite::read(TBaseisamfile& f, word op)
{ {
int err = TRectype::read(f, op); int err = TRectype::read(f, op);
if (err == NOERR && get_int(PART_TIPOMOV) == 1) if (err == NOERR && is_fattura())
{ {
TRiga_scadenze* s = new TRiga_scadenze(this); TRiga_scadenze* s = new TRiga_scadenze(this);
err = rows_array().read(s); // Deve esistere almento una scadenza err = rows_array().read(s); // Deve esistere almento una scadenza
@ -541,6 +547,24 @@ int TRiga_partite::read(TBaseisamfile& f, word op)
return err; return err;
} }
int TRiga_partite::write(TBaseisamfile& f) const
{
const int err = is_fattura() ? TTree_rectype::write(f) : TRectype::write(f);
return err;
}
int TRiga_partite::rewrite(TBaseisamfile& f) const
{
const int err = is_fattura() ? TTree_rectype::rewrite(f) : TRectype::rewrite(f);
return err;
}
int TRiga_partite::remove(TBaseisamfile& f) const
{
const int err = is_fattura() ? TTree_rectype::remove(f) : TRectype::remove(f);
return err;
}
int TRiga_partite::ultimo_pagamento(int r) const int TRiga_partite::ultimo_pagamento(int r) const
{ {
const TRiga_scadenze& s = rata(r); const TRiga_scadenze& s = rata(r);
@ -657,7 +681,14 @@ char TPartita::allineamento_richiesto() const
{ {
char all; char all;
if (_cli_align <= ' ' || _for_align <= ' ') if (_cli_align <= ' ' || _for_align <= ' ')
{
#ifdef DBG
warning_box("Questa applicazione usa le partite ma ignora i "
"parametri ditta relativi al loro allineamento: "
"continuiamo pure cosi', facciamoci del male!");
#endif
carica_allineamento(); carica_allineamento();
}
switch (conto().tipo()) switch (conto().tipo())
{ {
case 'C': all = _cli_align; break; case 'C': all = _cli_align; break;
@ -685,8 +716,6 @@ void TPartita::allinea(char all)
if (all <= ' ') if (all <= ' ')
all = allineamento_richiesto(); all = allineamento_richiesto();
if (_num.len() < NUMLEN)
{
if (all == 'R') if (all == 'R')
_num.right_just(NUMLEN); _num.right_just(NUMLEN);
else else
@ -697,7 +726,6 @@ void TPartita::allinea(char all)
_part.renum_key(PART_NUMPART, _num); _part.renum_key(PART_NUMPART, _num);
_unassigned.renum_key(PAGSCA_NUMPART, _num); _unassigned.renum_key(PAGSCA_NUMPART, _num);
} }
}
} }
@ -719,12 +747,10 @@ bool TPartita::read(const TBill& clifo, int year, const char* num)
part.put(PART_NUMPART, _num); part.put(PART_NUMPART, _num);
TRectype filter(part.curr()); TRectype filter(part.curr());
// Cerca la partita usando l'allineamento richiesto dall'utente
// Cerca la partita usando l'allineamento richiesto dai parametri ditta
if (part.read(_isgteq) == NOERR && part.curr() == filter) if (part.read(_isgteq) == NOERR && part.curr() == filter)
{ {
// Memorizza l'allineamento utilizzato per la lettura // Trovata!
_align = allineamento_corrente();
} }
else else
{ {
@ -737,13 +763,18 @@ bool TPartita::read(const TBill& clifo, int year, const char* num)
// Riprova a cercarla col nuovo allineamento // Riprova a cercarla col nuovo allineamento
filter.put(PART_NUMPART, _num); filter.put(PART_NUMPART, _num);
if (part.read(_isgteq) == NOERR && part.curr() == filter) if (part.read(_isgteq) == NOERR && part.curr() == filter)
_align = allineamento_corrente(); // Esiste: memorizzo l'allineamento {
// Esiste: memorizzo l'allineamento
}
else else
{
allinea(); // Non esite: e' una nuova partita! allinea(); // Non esite: e' una nuova partita!
} }
} }
}
else else
_num.trim(); _num.trim();
_align = allineamento_corrente();
TRiga_partite* partita = new TRiga_partite(this); // Record campione della partita TRiga_partite* partita = new TRiga_partite(this); // Record campione della partita
TString16 str; TString16 str;
@ -1111,6 +1142,13 @@ bool TPartita::chiusa(bool update)
{ {
bool chiusa = FALSE; bool chiusa = FALSE;
const int ultima = last();
if (ultima > 0)
{
const TRiga_partite& row = riga(ultima);
chiusa = row.get_bool(PART_CHIUSA);
}
if (update) if (update)
{ {
bool forse_chiusa = TRUE; bool forse_chiusa = TRUE;
@ -1141,15 +1179,6 @@ bool TPartita::chiusa(bool update)
} }
} }
} }
else
{
const int ultima = last();
if (ultima > 0)
{
const TRiga_partite& row = riga(ultima);
chiusa = row.get_bool(PART_CHIUSA);
}
}
return chiusa; return chiusa;
} }

View File

@ -154,6 +154,9 @@ protected:
public: // TTree_rectype public: // TTree_rectype
virtual TObject* dup() const { return new TRiga_partite(*this); } virtual TObject* dup() const { return new TRiga_partite(*this); }
virtual int read(TBaseisamfile& f, word op); virtual int read(TBaseisamfile& f, word op);
virtual int write(TBaseisamfile& f) const;
virtual int rewrite(TBaseisamfile& f) const;
virtual int remove(TBaseisamfile& f) const;
public: public:
int rate() const { return _recarr.rows(); } int rate() const { return _recarr.rows(); }
@ -161,6 +164,7 @@ public:
void elimina_rate(); void elimina_rate();
TRiga_scadenze& new_row(int r = 0); TRiga_scadenze& new_row(int r = 0);
bool is_fattura() const;
int ultima_ratapagata() const; int ultima_ratapagata() const;
int ultimo_pagamento(int rata) const; int ultimo_pagamento(int rata) const;
int rata_con_abbuoni_diffcam() const; int rata_con_abbuoni_diffcam() const;
@ -193,6 +197,10 @@ class TPartita : public TSortable
protected: protected:
const char* build_key(TString& key) const; const char* build_key(TString& key) const;
char allineamento_iniziale() const { return _align; }
char allineamento_corrente() const;
void allinea(char all = ' ');
public: // TObject public: // TObject
virtual bool ok() const { return _part.rows() > 0; } virtual bool ok() const { return _part.rows() > 0; }
virtual int compare(const TSortable& s) const; virtual int compare(const TSortable& s) const;
@ -251,10 +259,7 @@ public:
bool modifica_pagamento(const TRectype& new_pag); bool modifica_pagamento(const TRectype& new_pag);
static void carica_allineamento(); static void carica_allineamento();
char allineamento_iniziale() const { return _align; }
char allineamento_corrente() const;
char allineamento_richiesto() const; char allineamento_richiesto() const;
void allinea(char all = ' ');
TPartita(const TBill& clifo, int anno, const char* num); TPartita(const TBill& clifo, int anno, const char* num);
TPartita(const TRectype& part); TPartita(const TRectype& part);