ec475430c6
Files correlati : Ricompilazione Demo : [ ] Commento : Aggiunta traduzione agli effetti git-svn-id: svn://10.65.10.50/trunk@11153 c028cbd2-c16b-5b4b-a496-9718f37d4682
588 lines
15 KiB
C++
Executable File
588 lines
15 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <automask.h>
|
|
#include <currency.h>
|
|
#include <defmask.h>
|
|
#include <execp.h>
|
|
#include <progind.h>
|
|
#include <recarray.h>
|
|
#include <relation.h>
|
|
|
|
#include <clifo.h>
|
|
#include <cfven.h>
|
|
#include <scadenze.h>
|
|
#include "../cg/cgsaldac.h"
|
|
#include "../ef/ef0301.h"
|
|
|
|
#include "ef0.h"
|
|
#include "ef0A00a.h"
|
|
|
|
#include <clifo.h>
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Main Mask
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TPE_mask : public TAutomask
|
|
{
|
|
protected:
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
bool on_sheet_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
public:
|
|
bool calc_residual(const TRiga_scadenze& scad,
|
|
real& impres, real& imppag,
|
|
char& accsal, int& rdist, int& reff) const;
|
|
bool fill_rate();
|
|
void update_total();
|
|
|
|
TRectype& new_row_effetto(TDistinta& dist, char tipocf, long codcf,
|
|
int& rigadist, int& rigaeff) const;
|
|
void save_rate();
|
|
void print();
|
|
|
|
TPE_mask() : TAutomask("ef0A00a") { }
|
|
virtual ~TPE_mask() { }
|
|
};
|
|
|
|
// Calcola il residuo di una rata tenendo conto anche degli eventuali
|
|
// effetti non ancora contabilizzati
|
|
bool TPE_mask::calc_residual(const TRiga_scadenze& scad,
|
|
real& impres, real& imppag,
|
|
char& accsal, int& rdist, int& reff) const
|
|
{
|
|
TRelation rel(LF_REFFETTI);
|
|
rel.add(LF_EFFETTI, "NPROGTR==NPROGTR");
|
|
|
|
TRectype& filter = rel.curr();
|
|
const char* field[] = { SCAD_ANNO, SCAD_NUMPART, SCAD_NRIGA, SCAD_NRATA, NULL };
|
|
for (int i = 0; field[i]; i++)
|
|
filter.put(field[i], scad.get(field[i]));
|
|
TCursor cur(&rel, "", 2, &filter, &filter);
|
|
|
|
const char tipocf = scad.get_char(SCAD_TIPOCF);
|
|
const long codcf = scad.get_long(SCAD_SOTTOCONTO);
|
|
TString expr;
|
|
expr << '(' << LF_EFFETTI << "->EFFCONT!=\"X\")&&";
|
|
expr << '(' << LF_EFFETTI << "->TIPOCF==\"" << tipocf << "\")&&";
|
|
expr << '(' << LF_EFFETTI << "->CODCF==\"" << codcf << "\")";
|
|
cur.setfilter(expr, TRUE);
|
|
|
|
const long items = cur.items();
|
|
const bool valuta = scad.in_valuta();
|
|
|
|
impres = scad.residuo(TRUE).valore();
|
|
imppag = ZERO;
|
|
accsal = 'A';
|
|
rdist = reff = 0;
|
|
|
|
if (items > 0L)
|
|
{
|
|
cur.freeze();
|
|
const TRectype& riga = cur.curr();
|
|
const TRectype& effe = cur.curr(LF_EFFETTI);
|
|
for (cur = 0L; cur.pos() < items; ++cur)
|
|
{
|
|
if (effe.get(EFF_TIPODIST) == get(F_TIPODIST) &&
|
|
effe.get(EFF_NDIST) == get(F_DIST))
|
|
{
|
|
rdist = effe.get_int(EFF_NRIGADIST);
|
|
reff = riga.get_int(REFF_NRIGATR);
|
|
accsal = riga.get_char(REFF_ACCSAL);
|
|
imppag += riga.get_real(valuta ? REFF_IMPORTOVAL : REFF_IMPORTO);
|
|
}
|
|
else
|
|
{
|
|
if (riga.get_char(REFF_ACCSAL) == 'S')
|
|
{
|
|
impres = ZERO;
|
|
break;
|
|
}
|
|
impres -= riga.get_real(valuta ? REFF_IMPORTOVAL : REFF_IMPORTO);
|
|
}
|
|
}
|
|
}
|
|
|
|
return !impres.is_zero();
|
|
}
|
|
|
|
void TPE_mask::update_total()
|
|
{
|
|
real tot, val;
|
|
TSheet_field& s = sfield(F_SHEET);
|
|
const int postot = s.cid2index(F_IMPORTO);
|
|
FOR_EACH_SHEET_ROW_BACK(s, r, row)
|
|
tot += real(row->get(postot));
|
|
set(F_TOTAL, tot);
|
|
}
|
|
|
|
bool TPE_mask::fill_rate()
|
|
{
|
|
const long ndist = get_long(F_DIST);
|
|
const TDate dadata = get(F_DA_DATA);
|
|
const TDate adata = get(F_A_DATA);
|
|
const TString& codval = get(F_CODVAL);
|
|
TSheet_field& sheet = sfield(F_SHEET);
|
|
sheet.destroy();
|
|
|
|
TRelation rel(LF_PARTITE);
|
|
TRectype filter(LF_PARTITE);
|
|
filter.put(PART_TIPOCF, get(F_TIPOCF));
|
|
filter.put(PART_GRUPPO, 0);
|
|
filter.put(PART_CONTO, 0);
|
|
filter.put(PART_SOTTOCONTO, get(F_CLIFO));
|
|
|
|
TCursor partite(&rel, "", 1, &filter, &filter);
|
|
|
|
TString filtro;
|
|
filtro << "(CHIUSA!=\"X\")&&(CODVAL==\"" << codval << "\")";
|
|
partite.setfilter(filtro, TRUE);
|
|
|
|
long items = partite.items();
|
|
if (items == 0)
|
|
return FALSE;
|
|
|
|
TRectype& partita = partite.curr();
|
|
|
|
TProgind pi(items, TR("Caricamento partite aperte"), FALSE, TRUE);
|
|
if (items > 900) items = 900;
|
|
partite.freeze();
|
|
|
|
long last_cf = 0;
|
|
int last_year = 0;
|
|
TString16 last_game;
|
|
TString last_ragsoc;
|
|
|
|
for (partite = 0L; partite.pos() < items; ++partite)
|
|
{
|
|
pi.addstatus(1);
|
|
const long cur_cf = partita.get_long(PART_SOTTOCONTO);
|
|
const int cur_year = partita.get_int(PART_ANNO);
|
|
const TString& cur_game = partita.get(PART_NUMPART);
|
|
if (cur_cf == last_cf && cur_year == last_year && cur_game == last_game)
|
|
continue;
|
|
last_year = cur_year;
|
|
last_game = cur_game;
|
|
if (cur_cf != last_cf)
|
|
{
|
|
last_cf = cur_cf;
|
|
TString16 cod;
|
|
cod << get(F_TIPOCF) << '|' << last_cf;
|
|
last_ragsoc = cache().get(LF_CLIFO, cod, CLI_RAGSOC);
|
|
}
|
|
|
|
const TPartita game(partita);
|
|
const int last = game.last();
|
|
for (int riga = game.prima_fattura(); riga > 0 && riga <= last; riga++)
|
|
{
|
|
const TRiga_partite& rp = game.riga(riga);
|
|
if (rp.is_fattura())
|
|
{
|
|
for (int rata = 1; rata <= rp.rate(); rata++)
|
|
{
|
|
const TRiga_scadenze& rs = rp.rata(rata);
|
|
if (!rs.chiusa())
|
|
{
|
|
const TDate data = rs.get(SCAD_DATASCAD);
|
|
if (data >= dadata && (!adata.ok() || data <= adata))
|
|
{
|
|
real impres, imppag;
|
|
char accsal; int rigadist, rigaeff;
|
|
bool ok = calc_residual(rs, impres, imppag, accsal,
|
|
rigadist, rigaeff);
|
|
if (ok)
|
|
{
|
|
TToken_string& row = sheet.row(-1);
|
|
row.add(imppag.string());
|
|
row.add(accsal);
|
|
row.add(impres.string());
|
|
row.add(last_cf);
|
|
row.add(last_ragsoc);
|
|
row.add(game.anno());
|
|
row.add(game.numero());
|
|
row.add(riga);
|
|
row.add(rata);
|
|
row.add(data);
|
|
row.add(rigadist);
|
|
row.add(rigaeff);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sheet.force_update();
|
|
update_total();
|
|
|
|
const int righe = sheet.items();
|
|
const bool canedit = righe > 0;
|
|
enable(-5, canedit);
|
|
|
|
return canedit;
|
|
}
|
|
|
|
TRectype& TPE_mask::new_row_effetto(TDistinta& dist, char tipocf, long codcf,
|
|
int& rigadist, int& rigaeff ) const
|
|
{
|
|
TString16 codice; codice << tipocf << '|' << codcf;
|
|
const bool ragg = cache().get(LF_CFVEN, codice, CFV_RAGGEFF).not_empty();
|
|
|
|
TEffetto* neweff = NULL;
|
|
if (ragg)
|
|
{
|
|
for (int i = 0; i < dist.items(); i++)
|
|
{
|
|
TEffetto& eff = dist[i];
|
|
if (eff.get_char(EFF_TIPOCF) == tipocf &&
|
|
eff.get_long(EFF_CODCF) == codcf)
|
|
{
|
|
neweff = &eff;
|
|
rigadist = i+1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (neweff == NULL)
|
|
{
|
|
neweff = new TEffetto;
|
|
dist.righe().add(neweff);
|
|
rigadist = dist.items();
|
|
neweff->put(EFF_TIPOCF, tipocf);
|
|
neweff->put(EFF_CODCF, codcf);
|
|
neweff->put(EFF_TIPOCF, get(F_TIPOCF));
|
|
neweff->put(EFF_CODVAL, get(F_CODVAL));
|
|
neweff->put(EFF_CAMBIO, get(F_CAMBIO));
|
|
neweff->put(EFF_DATACAMBIO, get(F_DATADIST));
|
|
}
|
|
rigaeff = neweff->rows_r()+1;
|
|
return neweff->row_r(rigaeff, TRUE);
|
|
}
|
|
|
|
void TPE_mask::save_rate()
|
|
{
|
|
const TString& codval = get(F_CODVAL);
|
|
const real cambio = get(F_CAMBIO);
|
|
|
|
const char tipodist = get(F_TIPODIST)[0];
|
|
const long numdist = get_long(F_DIST);
|
|
TDistinta distinta(tipodist, numdist, _lock);
|
|
|
|
bool zeroes = FALSE; // Esistono righe effetto da cancellare
|
|
|
|
TSheet_field& sheet = sfield(F_SHEET);
|
|
FOR_EACH_SHEET_ROW(sheet, r, row)
|
|
{
|
|
real imp = row->get(sheet.cid2index(F_IMPORTO));
|
|
real impval;
|
|
if (codval.not_empty() && !imp.is_zero())
|
|
{
|
|
impval = imp;
|
|
TCurrency c(impval, codval, cambio);
|
|
c.change_to_firm_val();
|
|
imp = c.get_num();
|
|
}
|
|
char accsal = row->get_char(sheet.cid2index(F_ACCSAL));
|
|
int rigadist = row->get_int(sheet.cid2index(F_RIGADIST));
|
|
int rigaeff = row->get_int(sheet.cid2index(F_RIGAEFF));
|
|
if (rigaeff > 0 || accsal == 'S' || imp > ZERO)
|
|
{
|
|
if (rigaeff <= 0)
|
|
{
|
|
char tipocf = get(F_TIPOCF)[0];
|
|
long codcf = row->get_long(sheet.cid2index(F_CODCF));
|
|
|
|
TRectype& reff = new_row_effetto(distinta, tipocf, codcf, rigadist, rigaeff);
|
|
reff.put(REFF_ANNO, row->get(sheet.cid2index(F_ANNO)));
|
|
reff.put(REFF_NUMPART, row->get(sheet.cid2index(F_PARTITA)));
|
|
reff.put(REFF_NRIGA, row->get(sheet.cid2index(F_RIGA)));
|
|
reff.put(REFF_NRATA, row->get(sheet.cid2index(F_RATA)));
|
|
|
|
TToken_string key;
|
|
key.add(get(F_TIPOCF));
|
|
key.add("0|0");
|
|
key.add(row->get(sheet.cid2index(F_CODCF)));
|
|
key.add(row->get(sheet.cid2index(F_ANNO)));
|
|
key.add(row->get(sheet.cid2index(F_PARTITA)));
|
|
key.add(row->get(sheet.cid2index(F_RIGA)));
|
|
key.add(row->get(sheet.cid2index(F_RATA)));
|
|
const TRectype& scad = cache().get(LF_SCADENZE, key);
|
|
|
|
TString16 abi = scad.get(SCAD_CODABI);
|
|
TString16 cab = scad.get(SCAD_CODCAB);
|
|
if (atol(cab) == 0L)
|
|
{
|
|
key = get(F_TIPOCF);
|
|
key.add(row->get(sheet.cid2index(F_CODCF)));
|
|
const TRectype& clifo = cache().get(LF_CLIFO, key);
|
|
abi = clifo.get(CLI_CODABI);
|
|
cab = clifo.get(CLI_CODCAB);
|
|
}
|
|
|
|
TEffetto& eff = distinta[rigadist-1];
|
|
eff.put(EFF_DATASCAD, scad.get(SCAD_DATASCAD));
|
|
eff.put(EFF_CODABI, abi);
|
|
eff.put(EFF_CODCAB, cab);
|
|
}
|
|
|
|
TEffetto& eff = distinta[rigadist-1];
|
|
TRectype& reff = eff.row_r(rigaeff);
|
|
real oldimp = reff.get(REFF_IMPORTO);
|
|
real oldimpval = reff.get(REFF_IMPORTOVAL);
|
|
reff.put(REFF_IMPORTO, imp);
|
|
reff.put(REFF_IMPORTOVAL, impval);
|
|
reff.put(REFF_ACCSAL, accsal);
|
|
|
|
if (imp.is_zero() && accsal != 'S')
|
|
{
|
|
reff.put(REFF_ACCSAL, 'Z'); // Segna la riga come NULLA
|
|
zeroes = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ricalcola totali righe ed elimina le righe NULLE
|
|
for (int rd = distinta.items()-1; rd >= 0; rd--)
|
|
{
|
|
TEffetto& eff = distinta[rd];
|
|
real totimp, totimpval;
|
|
for (int i = eff.rows_r(); i > 0; i--)
|
|
{
|
|
const TRectype& reff = eff.row_r(i);
|
|
if (reff.get_char(REFF_ACCSAL) == 'Z')
|
|
eff.destroy_row_r(i, TRUE);
|
|
else
|
|
{
|
|
totimp += reff.get_real(EFF_IMPORTO);
|
|
totimpval += reff.get_real(EFF_IMPORTOVAL);
|
|
}
|
|
}
|
|
if (eff.rows_r() == 0)
|
|
distinta.righe().destroy(rd, TRUE);
|
|
else
|
|
{
|
|
eff.put(EFF_IMPORTO, totimp);
|
|
eff.put(EFF_IMPORTOVAL, totimpval);
|
|
eff.put(EFF_TIPOPAG, get(F_TIPOPAG));
|
|
}
|
|
}
|
|
|
|
TToken_string dati_dist;
|
|
dati_dist.add(tipodist);
|
|
dati_dist.add(numdist);
|
|
dati_dist.add(get(F_DATADIST));
|
|
dati_dist.add(get(F_ABI));
|
|
dati_dist.add(get(F_CAB));
|
|
distinta.write(FALSE, &dati_dist);
|
|
}
|
|
|
|
void TPE_mask::print()
|
|
{
|
|
TString16 cmd;
|
|
cmd << "ef0 -4 " << get(F_TIPODIST) << ' ' << get(F_DIST);
|
|
TExternal_app app(cmd);
|
|
app.run();
|
|
}
|
|
|
|
bool TPE_mask::on_sheet_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
TMask& m = o.mask();
|
|
switch (o.dlg())
|
|
{
|
|
case F_IMPORTO:
|
|
if (e == fe_modify)
|
|
{
|
|
if (m.get_real(F_IMPORTO) >= m.get_real(F_RESIDUO))
|
|
m.set(F_ACCSAL, "S");
|
|
}
|
|
break;
|
|
case F_PAGA:
|
|
if (e == fe_button)
|
|
{
|
|
TMask& m = o.mask();
|
|
if (m.get_real(F_IMPORTO).is_zero())
|
|
{
|
|
m.set(F_IMPORTO, m.get(F_RESIDUO));
|
|
m.set(F_ACCSAL, "S");
|
|
}
|
|
else
|
|
{
|
|
m.reset(F_IMPORTO);
|
|
m.reset(F_ACCSAL);
|
|
}
|
|
}
|
|
break;
|
|
case F_SHEET:
|
|
switch(e)
|
|
{
|
|
case se_query_add:
|
|
{
|
|
TOperable_field& baggio = (TOperable_field&)field(F_AGGIORNA);
|
|
if (baggio.active())
|
|
on_field_event(baggio, fe_button, 0);
|
|
}
|
|
return FALSE;
|
|
case se_notify_modify:
|
|
update_total();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TPE_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case DLG_NEWREC:
|
|
{
|
|
TLocalisamfile eff(LF_EFFETTI); eff.setkey(4);
|
|
TRectype& curr = eff.curr();
|
|
curr.put(EFF_TIPODIST, get(F_TIPODIST));
|
|
curr.put(EFF_NDIST, 99999L);
|
|
const int err = eff.read(_isgreat);
|
|
long n = 1L;
|
|
if (err != _isemptyfile)
|
|
{
|
|
if (err == NOERR)
|
|
eff.prev();
|
|
if (curr.get(EFF_TIPODIST) == get(F_TIPODIST))
|
|
n += curr.get_long(EFF_NDIST);
|
|
}
|
|
set(F_DIST, n);
|
|
}
|
|
break;
|
|
case F_DIST:
|
|
if (e == fe_modify)
|
|
{
|
|
TEdit_field& ef = (TEdit_field&)o;
|
|
bool ok = ef.check();
|
|
if (ok)
|
|
{
|
|
const TCursor& cur = *ef.browse()->cursor();
|
|
ok = cur.ok();
|
|
if (ok)
|
|
{
|
|
const TRectype& rec = cur.curr();
|
|
if (rec.get_bool(EFF_EFFCONT))
|
|
return error_box(FR("La distinta %s e' gia' stata contabilizzata,\n"
|
|
"per cui non e' possibile modificarla"), (const char*)ef.get());
|
|
}
|
|
}
|
|
enable(-3, !ok);
|
|
}
|
|
break;
|
|
case F_AGGIORNA:
|
|
if (e == fe_button)
|
|
{
|
|
if (!field(F_DIST).empty())
|
|
{
|
|
const bool full = fill_rate();
|
|
if (full)
|
|
{
|
|
disable(-3);
|
|
disable(-4);
|
|
}
|
|
}
|
|
else
|
|
return error_box(TR("E' necessario specificare un numero di distinta"));
|
|
}
|
|
break;
|
|
case F_CONTABILI:
|
|
if (e == fe_button)
|
|
{
|
|
TString16 cmd;
|
|
cmd << "ef0 -7 " << get(F_TIPODIST) << ' ' << get(F_DIST);
|
|
TExternal_app app(cmd);
|
|
app.run();
|
|
stop_run(K_ESC);
|
|
}
|
|
break;
|
|
case DLG_DELREC:
|
|
if (e == fe_button && yesno_box(FR("Confermate l'eliminazione della distinta %ld"),
|
|
get_long(F_DIST)))
|
|
{
|
|
TSheet_field& sheet = sfield(F_SHEET);
|
|
FOR_EACH_SHEET_ROW(sheet, r, row)
|
|
row->add("", 0);
|
|
save_rate();
|
|
}
|
|
break;
|
|
case DLG_SAVEREC:
|
|
if (e == fe_button)
|
|
{
|
|
if (check_fields())
|
|
{
|
|
save_rate();
|
|
fill_rate();
|
|
}
|
|
}
|
|
break;
|
|
case DLG_PRINT:
|
|
if (e == fe_button)
|
|
{
|
|
print();
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case F_SHEET:
|
|
return on_sheet_event(o, e, jolly);
|
|
default:
|
|
if (jolly > 0)
|
|
return on_sheet_event(o, e, jolly);
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Main Program
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TPagamento_effetti : public TSkeleton_application
|
|
{
|
|
TPE_mask* _mask;
|
|
|
|
public:
|
|
virtual void main_loop();
|
|
virtual void print();
|
|
};
|
|
|
|
void TPagamento_effetti::main_loop()
|
|
{
|
|
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_CFVEN,
|
|
LF_PARTITE, LF_SCADENZE, LF_PAGSCA,
|
|
LF_EFFETTI, LF_REFFETTI, LF_CESS, 0);
|
|
enable_menu_item(M_FILE_PRINT);
|
|
_mask = new TPE_mask;
|
|
do
|
|
{
|
|
_mask->reset(F_DIST);
|
|
_mask->enable(-3);
|
|
_mask->enable(-4);
|
|
_mask->disable(-5);
|
|
_mask->sfield(F_SHEET).destroy();
|
|
_mask->reset(F_TOTAL);
|
|
}
|
|
while (_mask->run() != K_QUIT);
|
|
|
|
delete _mask;
|
|
_mask = NULL;
|
|
}
|
|
|
|
void TPagamento_effetti::print()
|
|
{
|
|
if (_mask)
|
|
_mask->print();
|
|
}
|
|
|
|
int ef0A00(int argc, char* argv[])
|
|
{
|
|
TPagamento_effetti pe;
|
|
pe.run(argc, argv, TR("Distinte Pagamento"));
|
|
return 0;
|
|
}
|