campo-sirio/m770/774100.cpp
alex 3e0ee48a95 Riportata la R9702 sulla R9703
git-svn-id: svn://10.65.10.50/trunk@5411 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-22 10:59:30 +00:00

546 lines
13 KiB
C++
Executable File

// 774100.cpp - Generazione quadro L
//
// 774 -0 S (livello di studio) oppure
// 774 -0 D (livello di ditta)
//
// Lista modifiche
//
// 21.12.95 Azzera solo i record con AP=anno dichiarazione (nf)
// 8.01.96 Scambiate nel quadrol la chiave 2 con la 1 (nf)
//
#include <applicat.h>
#include <mask.h>
#include <printapp.h>
#include <progind.h>
#include <relation.h>
#include <tabutil.h>
#include <utility.h>
#include <config.h>
#include <urldefid.h>
#include <execp.h>
#include "rpag.h"
#include "rver.h"
#include "scperc.h"
#include "quadrol.h"
#include "774100.h"
#include "77lib.h"
// inizializzato in TGenera::set()
// usato in filter_func()
HIDDEN TGenera* this_genera = NULL;
// Possibili esiti della dialog-box di configurazione parametri di gen.
HIDDEN const int UNCHANGED = 0;
HIDDEN const int CHANGED = 1;
HIDDEN const int ESCI = 2;
void TVersamenti::set (TSchedaP& sc, const long numvers)
{
_key.format("%4ld%c%4ld%4d%4ld", sc.codditta(),sc.tipoa(),sc.codanagr(),sc.nprog(),numvers);
add(_key);
}
bool TVersamenti::find (TSchedaP& sc, const long numvers)
{
_key.format("%4ld%c%4ld%4d%4ld", sc.codditta(),sc.tipoa(),sc.codanagr(),sc.nprog(),numvers);
return is_key(_key);
}
// Accetta un record solo se:
// l'anno della data-pagamento == annodic E
// il pagamento e' collegato ad un versamento (non importa quale)
bool filter_func (const TRelation* rel)
{
TDate datapag;
int anno,annod;
long nvers;
annod = this_genera->_annodic;
datapag = rel->lfile().get(PAG_DATAPAG);
nvers = rel->lfile().get_long(PAG_NUMVERS);
anno = datapag.year();
return anno == annod && nvers > 0L;
}
bool TGenera::causale1015(int causale)
{
TTable ca7("%CA7");
TString dep;
int artbil = 0;
ca7.zero();
dep = format("%02d", causale);
ca7.put("CODTAB", dep);
const bool ok = ca7.read() == NOERR;
if (!ok) ca7.zero();
_ab1015 = ca7.get_int("I3");
_ct1015 = ca7.get_int("I0");
_cq1015 = ca7.get ("S1");
return ok;
}
void TGenera::causale(int causale)
{
TTable ca7("%CA7");
TString dep;
_codqua = "";
ca7.zero();
dep = format("%02d", causale);
ca7.put("CODTAB", dep);
if (ca7.read() == NOERR)
{
_codqua = ca7.get ("S1");
_artbil = ca7.get_int("I3");
_codtrib = ca7.get_int("I0");
}
}
bool TGenera::set(const long codditta, TConfig* cnf, const char* section)
{
TString16 filt;
TRelation rel(LF_RPAG);
int causale;
bool ok_gen;
this_genera = this;
// controllo presenza causale 1015
causale = atoi(cnf->get("CoCa1015", section));
if (causale)
{
if (!causale1015(causale))
return warning_box("Manca la causale 1015 nella tabella causali");
}
else
return warning_box("Manca la causale 1015 nei parametri di studio");
// conferma di generazione
TString scritta(60);
scritta.format("Conferma generazione dei versamenti\n per la ditta %ld ?", codditta);
if (!yesno_box(scritta))
return TRUE;
// valorizzo anno dichiarazione e codice ditta per cui generare
_codditta = codditta;
_annodic = (int)cnf->get_long(ANNO_SEL, section);
// preparo cursore su righe di versamento
filt.format("CODDITTA=%ld", codditta);
TCursor cur(&rel,filt,1);
cur.set_filterfunction (filter_func);
// azzeramento versamenti quadro L
azzera_quadroL();
// generazione versamenti quadro L
// (se ritorna una richiesta di fine non prosegue con l'arrotondamento)
if (ok_gen = genera_riga(&cur))
arrotonda();
return ok_gen;
}
int TGenera::controllo_parametri()
{
TLocalisamfile base (LF_BASE);
base.setkey(1);
base.zero();
base.put("CODDITTA", _codditta);
const int rc = base.read();
if (rc == NOERR)
{
TString appname;
appname.format("776mod -4 %c",_liv);
TExternal_app a (appname);
a.run();
TMailbox m;
TMessage* msg = m.next_s("");
int subj;
// 1 => uscito con Registra
// 0 => uscito con Quit
if (msg != NULL)
{
subj = atoi(msg->body());
if (subj)
return CHANGED;
else
return ESCI;
}
}
#ifdef DBG
if (rc != NOERR)
return warning_box("Errore di lettura su base cod. %d", rc);
#endif
return UNCHANGED;
}
bool TGenera::azzera_quadroL()
{
TString16 filt;
TRelation* rl;
TCursor* cl;
filt.format("CODDITTA=%ld", _codditta);
rl = new TRelation(LF_QUAL);
cl = new TCursor(rl,filt,1);
TRecnotype cl_items = cl->items();
cl->freeze();
(*cl) = 0L;
TString scritta(60);
scritta.format("Azzeramento quadro L per la ditta %ld", _codditta);
TProgind progn(cl_items, scritta, FALSE, TRUE);
TLocalisamfile& fl = cl->file();
for (int i = 0; i < cl_items; i++, ++(*cl))
{
progn.addstatus(1);
TString quadro(2);
// solo quelli dell'anno dichiarazione
if (fl.get_int(QUL_QLAP) != _annodic)
continue;
// solo quelli di quadri C/D/DB/D1/E/E1/G
quadro = fl.get(QUL_QLCODQUA);
if (quadro != "C" && quadro != "D" && quadro != "DB" &&
quadro != "D1" && quadro != "E" && quadro != "E1" && quadro != "G")
continue;
// rimozione record
fl.remove();
}
return TRUE;
}
void TGenera::dati_rver(TLocalisamfile& rver,TSchedaP& sch, long numvers)
{
rver.zero();
rver.put(VER_CODDITTA, sch.codditta());
rver.put(VER_TIPOA, sch.tipoa());
rver.put(VER_CODANAGR, sch.codanagr());
rver.put(VER_NPROG, sch.nprog());
rver.put(VER_NRIGA, (long)numvers);
rver.read();
if (rver.bad())
rver.zero();
_ver1015 = rver.get_bool(VER_VERS1015);
_ritver = rver.get_real(VER_IMPVERS);
if (_ver1015)
{
//Prendo i dati su flags LF_BASE
TLocalisamfile base(LF_BASE);
base.setkey(1);
base.zero();
base.put("CODDITTA", _codditta);
if (base.read(_isequal) == NOERR)
{
_datavers = base.get_date("DATAVERS");
_mesepag = 12;
_luovers = base.get_char("LUOVERS");
_tipover = base.get_char("TIPOVERS");
_serie = base.get ("SERIE");
_numero = base.get ("NUMERO");
if (_tipover == DELEGA_BANCARIA)
{
_sNprog = _numero.mid(5);
_sNprog.trim();
_numero.cut(5);
}
else
_sNprog = "";
// riporto gli estremi sulla riga di versamento
// della scheda
rver.reread(_testandlock);
rver.put("DATAVERS", _datavers);
rver.put("TIPOVERS", _tipover);
rver.put("SERIE", _serie);
rver.put("NUMERO", _numero);
rver.put("PROGBANC",_sNprog);
rver.put("LUOVERS", _luovers);
rver.rewrite();
rver.reread(_unlock);
}
}
else
{
_datavers = rver.get_date(VER_DATAVERS);
_luovers = rver.get_char(VER_LUOVERS);
_tipover = rver.get_char(VER_TIPOVERS);
_serie = rver.get(VER_SERIE);
_numero = rver.get(VER_NUMERO);
_sNprog = rver.get(VER_PROGBANC);
_sNprog.trim();
if (_tipover == DELEGA_BANCARIA && _sNprog != "000000")
_numero << _sNprog;
}
}
void TGenera::dati_scperc(TSchedaP& sch)
{
TLocalisamfile scperc(LF_SCPERC);
int codtrib = 0;
scperc.setkey(1);
scperc.zero();
scperc.put(SPR_CODDITTA, sch.codditta());
scperc.put(SPR_TIPOA, sch.tipoa());
scperc.put(SPR_CODANAGR, sch.codanagr());
scperc.put(SPR_NPROG, sch.nprog());
if (scperc.read(_isequal) == NOERR)
_causale = scperc.get_int(SPR_CODCAUS);
}
void TGenera::arrotonda()
{
TString16 filt;
real importo = ZERO;
TRelation* rl;
TCursor* cl;
filt.format("CODDITTA=%ld", _codditta);
rl = new TRelation(LF_QUAL);
cl = new TCursor(rl,filt,1);
TRecnotype cl_items = cl->items();
cl->freeze();
(*cl) = 0L;
TString scritta(60);
scritta.format("Arrotondamento ritenute versate per la ditta %ld", _codditta);
TProgind progn(cl_items, scritta, FALSE, TRUE);
TLocalisamfile& fl = cl->file();
for (int i = 0; i < cl_items; i++, ++(*cl))
{
progn.addstatus(1);
importo = fl.get_real(QUL_QLRITVER);
importo = round_770(importo);
fl.put(QUL_QLRITVER, importo);
fl.rewrite();
}
}
bool TGenera::genera_riga(TCursor* cur)
{
TLocalisamfile ql (LF_QUAL);
TLocalisamfile rver(LF_RVER);
real riteff,ritver;
long numvers,codanagr,codp;
char tipoa,tipop;
int nprog,nprogp;
bool prima_volta = TRUE;
bool gia_fatto = FALSE;
TString perc,percp;
(*cur) = 0L;
TRecnotype items_rpag = cur->items();
TString scritta(60);
scritta.format("Generazione versamenti per la ditta %ld", _codditta);
TProgind progn(items_rpag, scritta, FALSE, TRUE);
riteff = ZERO;
ritver = ZERO;
_righe_gia_presenti = new TVersamenti;
_righe_gia_presenti->destroy();
tipop = 'Z';
codp = 99999;
nprogp = 9999;
TSchedaP scheda_prec;
for (int i = 0; i < items_rpag; i++, ++(*cur), progn.addstatus(1))
{
// Leggo i dati su RPAG
TDate datapag(cur->curr().get(PAG_DATAPAG));
_mesepag = datapag.month();;
_annopag = datapag.year();
riteff = cur->curr().get_real(PAG_RITENUTA);
numvers = cur->curr().get_long(PAG_NUMVERS);
tipoa = cur->curr().get_char(PAG_TIPOA);
codanagr = cur->curr().get_long(PAG_CODANAGR);
nprog = cur->curr().get_int (PAG_NPROG);
TSchedaP scheda_corr(_codditta, tipoa, codanagr, nprog);
dati_rver(rver,scheda_corr,numvers);
if (scheda_corr != scheda_prec)
{
dati_scperc(scheda_corr);
causale(_causale);
}
scheda_prec.set(_codditta,tipoa,codanagr,nprog);
// Se e' tributo1015 posso evitare di controllare il codice quadro
if (!_ver1015)
{
if (_codqua != "C" && _codqua != "D" && _codqua != "DB" &&
_codqua != "D1" && _codqua != "E" && _codqua != "E1" && _codqua != "G")
continue;
}
else
if (!gia_fatto)
{
gia_fatto = TRUE;
const int cp = controllo_parametri();
if (cp == CHANGED)
dati_rver(rver,scheda_corr,numvers);
else
if (cp == ESCI)
return FALSE; // ho premuto il bottone FINE
}
ql.setkey(1);
ql.zero();
ql.put(QUL_CODDITTA, _codditta);
ql.put(QUL_QLMP, _mesepag);
ql.put(QUL_QLAP, _annopag);
ql.put(QUL_QLDV, _datavers);
ql.put(QUL_QLLV, _luovers);
ql.put(QUL_QLTV, _tipover);
if (_ver1015)
{
ql.put(QUL_QLCT, _ct1015);
ql.put(QUL_QLAB, _ab1015);
ql.put(QUL_QLCODQUA, _cq1015);
}
else
{
ql.put(QUL_QLCT, _codtrib);
ql.put(QUL_QLAB, _artbil);
ql.put(QUL_QLCODQUA, _codqua);
}
ql.put(QUL_QLSERIE, _serie);
ql.put(QUL_QLNUMERO, _numero);
TRectype dep(ql.curr());
if (ql.read(_isequal, _lock) == NOERR)
{
_riteff = ql.get_real(QUL_QLRITEFF);
_riteff += riteff;
ql.put(QUL_QLRITEFF, _riteff);
if (!_righe_gia_presenti->find(scheda_corr,numvers))
{
ritver = ql.get_real(QUL_QLRITVER);
ritver += _ritver;
ql.put(QUL_QLRITVER, ritver);
}
ql.rewrite();
}
else
{
ql.zero();
ql.curr() = dep;
ql.put(QUL_QLRITEFF, riteff);
ql.put(QUL_QLRITVER, _ritver);
ql.write();
}
_righe_gia_presenti->set(scheda_corr,numvers);
}
return TRUE;
}
class TGenera_versamenti : public TApplication
{
char _liv;
TString16 _section;
TConfig* _cnf;
public:
TGenera* _genera;
TLocalisamfile *_rver, *_rpag, *_base, *_scperc, *_ql;
public:
virtual bool create();
virtual bool menu(MENU_TAG m);
virtual bool destroy();
TGenera& genera() { return *_genera; }
public:
TGenera_versamenti(char livello = 'S') : _liv(toupper(livello)) {}
~TGenera_versamenti() {}
};
TGenera_versamenti& app() { return (TGenera_versamenti&)main_app(); }
bool TGenera_versamenti::menu(MENU_TAG m)
{
long codditta, codditta_prec;
int i = 0;
TConfig cnf_user(CONFIG_USER);
if (m == BAR_ITEM(1))
{
codditta_prec = get_firm_770();
while ((codditta = cnf_user.get_long(DITTE_SEL, _section, i++)) != 0L)
{
set_firm_770(codditta);
if (!_genera->set(codditta, _cnf, _section))
break;
}
set_firm_770(codditta_prec);
return FALSE;
}
return FALSE;
}
bool TGenera_versamenti::create()
{
TApplication::create();
_rver = new TLocalisamfile(LF_RVER);
_rpag = new TLocalisamfile(LF_RPAG);
_scperc = new TLocalisamfile(LF_SCPERC);
_base = new TLocalisamfile(LF_BASE);
_ql = new TLocalisamfile(LF_QUAL);
_genera = new TGenera('s');
_cnf = new TConfig(CONFIG_STUDIO);
_section = name();
_section.cut(2);
dispatch_e_menu (BAR_ITEM(1));
return TRUE;
}
bool TGenera_versamenti::destroy()
{
delete _rver;
delete _rpag;
delete _scperc;
delete _base;
delete _ql;
delete _genera;
delete _cnf;
return TApplication::destroy();
}
int m74100 (int argc, char* argv[])
{
TGenera_versamenti a(*argv[2]);
a.run(argc, argv, "Generazione versamenti");
return 0;
}