campo-sirio/m770/770100.cpp
luca 4e24441a11 Patch level :10.0 992
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
0001852: 207705 - SRM - data competenza pagamento
Descrizione è richiesto che la data di competenza sulla scheda percipiente venga sempre compilata in automatico con la data del pagamento. Il dato deve rimanere modificabile dall'utente. Questo dovrebbe risolvere il problema delle stampe che attualmente selezionano per data competenza e sembrano non funzionare .


git-svn-id: svn://10.65.10.50/branches/R_10_00@22057 c028cbd2-c16b-5b4b-a496-9718f37d4682
2011-05-03 11:15:28 +00:00

2333 lines
67 KiB
C++
Executable File
Raw Blame History

// 770100.cpp - Scheda percipienti
#include <tabutil.h>
#include <mailbox.h>
#include <defmask.h>
#include "scperc.h"
#include "rver.h"
#include "rpag.h"
#include "perc.h"
#include "../cg/cgsaldac.h"
#include <partite.h>
#include <scadenze.h>
#include <pagsca.h>
// per dinamica non riprendere #include "../ve/velib.h"
#include "770101.h"
#include "770102.h"
#include "770100a.h"
#include "770.h"
#include "77lib.h"
// Token_string pilota per relazione tra l'informazione e la
// sua posizione nello sheet, ogni riga individua uno sheet diverso
const char* PILOT_SHEET[] = {
"DATAPAG|COMPENSO|SPESA|IMPONIBILE|PERC|RITENUTA|SOMREGCONV|ALQIMP10|CTSSNPERC|CTSSNCOMP|COD10|NETTO|SOMNSRIT|AMMLORDO|QUOTAPROV|IMPNETTO|COMNETTO|NUMVERS|NUMREG",
"DATAPAG|COMPENSO|IMPCPA|IMPONIBILE|PERC|RITENUTA|SPESA|SOMREGCONV|NETTO|SOMNSRIT|AMMLORDO|QUOTAPROV|IMPNETTO|COMNETTO|NUMVERS|NUMREG",
};
// Items per causale quadro SC
const char* ITEMS_SC[] = {
"A|A", "B|B", "C|C", "D|D", "E|E", "F|F", "G|G", "H|H", "I|I",
"K|K", "L|L", "M|M", "N|N", "P|P", "Q|Q", "R|R", "S|S", "T|T", NULL };
// Items per causale quadro SE
const char* ITEMS_SE[] = {
"A|A", "B|B", "C|C", "D|D", "E|E", "F|F", "G|G", "T|T", NULL };
// Items per causale quadro SF
const char* ITEMS_SF[] = {
"A|A", "B|B", "C|C", "D|D", "E|E", "F|F", "G|G", "H|H", "I|I",
"L|L", "M|M", "N|N", "P|P", "Q|Q", "R|R", "S|S", "T|T", NULL };
// Items per causale quadro SG
const char* ITEMS_SG[] = {
"A|A", "B|B", "C|C", "D|D", "E|E", NULL };
// Items per causale quadro LA
const char* ITEMS_LA[] = {
"A|A", "B|B", "C|C", "D|D", "E|E", "F|F", "G|G", "H|H", "I|I", "L|L", "M|M",
"N|N", "P|P", "Q|Q", "R|R", "S|S", "T|T", "U|U", "V|V", "W|W", "Z|Z", NULL };
HIDDEN TString80 __tmp;
TSchedaPercipienti::TSchedaPercipienti(): _rel(NULL), _flag_cg(false)
{
_from_modify = false;
_soggnres = false;
memset(_msk, 0, sizeof(_msk));
}
void TSchedaPercipienti::update_lasts(TMask& m)
{
if (m.mode() == MODE_MOD)
{
const long codditta = m.get_long(F_CODDITTA);
const char tipoa = m.get(F_TIPOA)[0];
const long codanagr = m.get_long(F_CODANAGR);
const int nprog = m.get_int(F_NPROG);
// Determino ultimo numero di riga usato nei PAGAMENTI
_rpag->zero();
_rpag->put("CODDITTA", codditta);
_rpag->put("TIPOA", tipoa);
_rpag->put("CODANAGR", codanagr);
_rpag->put("NPROG", nprog);
TRectype dep(_rpag->curr());
long nriga = 0L;
for (_rpag->read(); !_rpag->eof(); _rpag->next())
{
if (_rpag->curr() > dep) break;
nriga = _rpag->get_long("NRIGA");
}
_lastpag = nriga;
// Determino ultimo numero di riga usato nei VERSAMENTI
_rver->zero();
_rver->put("CODDITTA", (long) codditta);
_rver->put("TIPOA", tipoa);
_rver->put("CODANAGR", (long) codanagr);
_rver->put("NPROG", nprog);
TRectype dep2(_rver->curr());
long nrigav = 0L;
for (_rver->read(); !_rver->eof(); _rver->next())
{
if (_rver->curr() > dep2) break;
nrigav = _rver->get_long("NRIGA");
}
_lastvers = nrigav;
}
else
_lastpag = _lastvers = 0L;
}
bool TSchedaPercipienti::changing_mask(int mode)
{
if ((mode == MODE_MOD) && (_mode == MODE_INS))
return false;
else
return _mode != mode;
}
TMask* TSchedaPercipienti::get_mask(int mode)
{
const int m = (mode == MODE_QUERY) ? 0 : 1;
_mode = mode;
return load_mask(m);
}
TMask* TSchedaPercipienti::load_mask(int n)
{
if (_msk[n] != NULL)
return _msk[n];
TFilename name("770100"); name << char(n == 0 ? 'a' : 'b');
TMask* m = new TMask(name);
switch (n)
{
case 0:
m->set_handler(F_NPROG, nprog_handler);
m->set_handler(F_CODDITTA, codditta_handler);
m->set_handler(F_CODANAGRCOM, codanagr_handler);
m->set_handler(F_CODANAGRPERC, codanagr_handler);
m->set_handler(F_AGGPAG, aggpag_handler);
break;
case 1:
{
m->disable(DLG_FINDREC);
m->set_handler(F_DATADOC, check_handler);
m->set_handler(F_CODCAUS, check_causale);
m->set_handler(F_SPESE, check_spese);
m->set_handler(F_COMPENS, check_compensi);
m->set_handler(F_MESECOMP, check_competenza);
////////////////////////////////////////////////////////////////////////
// Handler versamenti
////////////////////////////////////////////////////////////////////////
TSheet_field& vers = (TSheet_field&) m->field(F_VERSAMENTI);
vers.set_notify(vers_notify);
vers.sheet_mask().set_handler(F_VERS_1015, vers1015_handler);
vers.sheet_mask().set_handler(DLG_SELPAG, pag_select);
vers.sheet_mask().set_handler(DLG_AZZERA, ver_azzera);
vers.sheet_mask().set_handler(F_TIPOVERS, tipo_hndl);
vers.sheet_mask().set_handler(F_LUOVERS, luo_hndl);
vers.sheet_mask().set_handler(F_ABI, abicab_hndl);
vers.sheet_mask().set_handler(F_CAB, abicab_hndl);
}
break;
default:
CHECKD(0, "Che strano genere di maschera e' la ", n);
break;
}
return _msk[n] = m;
}
// Ricerca e output dell'ultimo nprog del percipiente scelto
bool TSchedaPercipienti::setta_nprog(TMask& m, const bool variazione, const char* codanag)
{
long nprog = 0L;
const char tipoa = m.get(F_TIPOA)[0];
TString8 codanagr(codanag ? codanag : m.get(F_CODANAGR));
const long codditta = app().tipo_coll()==nessuno ? get_firm_770() : app().get_firm();
// Scrivi nprog solo se il percipiente ESISTE sull'arkivio
if (!app().esiste_perc(m, codanagr))
return true;
// istanza e inizializza chiave file schede
TLocalisamfile scperc(LF_SCPERC);
bool trovato = false;
const long numreg = app().coll_numreg();
if (numreg > 0L)
{
scperc.setkey(3);
scperc.put(SPR_CODDITTA, prefix().get_codditta());
scperc.put(SPR_NUMREG, numreg);
if (scperc.read(_isgteq) == NOERR && scperc.get_long(SPR_NUMREG) == numreg)
{
nprog = scperc.get_int(SPR_NPROG);
trovato = true;
}
scperc.setkey(1);
}
if (!trovato)
{
scperc.zero();
scperc.put("CODDITTA", codditta);
scperc.put("TIPOA", tipoa);
scperc.put("CODANAGR", codanagr);
// istanza record di confronto
TRectype rec(scperc.curr());
// cerca ultimo progressivo usato
// e per tipo collegamento variazione
// individuo eventuale scheda coincidente
for (scperc.read(_isgteq); scperc.good() && scperc.curr() == rec && !trovato; scperc.next())
{
nprog = scperc.get_long("NPROG");
if (variazione)
{
TString16 numdoc,datadoc;
numdoc = scperc.get("NUMDOC");
numdoc.trim();
datadoc = scperc.get("DATADOC");
trovato = ((numdoc == app()._coll._numdoc) && (datadoc == app()._coll._datadoc));
}
}
}
if (!trovato)
nprog = nprog++;
m.set(F_NPROG, nprog);
return trovato;
}
bool TSchedaPercipienti::codditta_handler(TMask_field& f, KEY k)
{
if (k == K_TAB && !(f.mask().is_running()) )
{
TString16 codditta;
// Se chiamata dalla contabilita' prendo ditta con get_firm
if (app().tipo_coll() == nessuno)
codditta << get_firm_770();
else
codditta << app().get_firm();
if (codditta != "0")
{
f.set(codditta);
f.check();
}
}
return TRUE;
}
bool TSchedaPercipienti::codanagr_handler(TMask_field& f, KEY k)
{
if (k == K_TAB)
{
TMask& m = f.mask();
const bool variazione = app().coll_variazione();
TString8 codanagr(f.get());
if (codanagr.not_empty())
{
if (!app().esiste_perc(m, codanagr))
return f.warning_box("Percipiente non valido");
setta_nprog(m, variazione, codanagr);
}
// faccio a mano decodifica del percipiente
// perch<63> l'automatismo non funziona
long tmp_codanagr = atol(codanagr);
TString4 tmp_tipoa = m.get(F_TIPOA);
TString80 tmp_ragsoc = app().get_ragsoc(tmp_tipoa, tmp_codanagr);
m.set(F_RAGSOCPER, tmp_ragsoc);
m.set(F_RAGSOCCOM, tmp_ragsoc);
}
return true;
}
void TSchedaPercipienti::calcola_riga_pag(TRectype & rec,
const real h_PercAssImp,
const real h_PercCassaPrev,
const real h_PercRitenuta,
const real h_PercInps,
const real h_PercAssImpInps,
const real h_PercCommitInps)
{
const int fdec = TCurrency::get_firm_dec();
real compenso = rec.get_real(PAG_COMPENSO);
real impcpa = (compenso * h_PercCassaPrev) / (CENTO + h_PercCassaPrev); impcpa.round(fdec); // calcolo CPA
rec.put(PAG_IMPCPA, impcpa);
real imponibile = ((compenso - impcpa) * h_PercAssImp) / CENTO; imponibile.round(fdec); // calcolo imponibile
rec.put(PAG_IMPONIBILE, imponibile);
real ritlorda = (imponibile * h_PercRitenuta) / CENTO; ritlorda.round(fdec); // calcolo ritenuta lorda
rec.put(PAG_RITLORDA, ritlorda);
const real detfamil = rec.get_real(PAG_DETFAMIL);
const real detlavdip = rec.get_real(PAG_DETLAVDIP);
const real totdet = detfamil + detlavdip;
const real ritenuta = totdet > ritlorda ? ZERO : ritlorda - totdet;
rec.put(PAG_RITENUTA, ritenuta);
real ctssncomp = (((compenso * h_PercAssImpInps) / CENTO) * h_PercInps) / CENTO; ctssncomp.round(fdec); // calcolo contributo Inps complessivo
rec.put(PAG_INPSCOMP, ctssncomp);
real ctssnperc = (h_PercCommitInps == ZERO) ? ctssncomp - ((ctssncomp * 2) / 3) : ctssncomp - ((ctssncomp * h_PercCommitInps) / CENTO); ctssnperc.round(fdec); // calcolo contributo Inps del percipiente
rec.put(PAG_INPSPERC, ctssnperc);
real utpagati = rec.get_real(PAG_UTPAGATI);
if (abs(utpagati) > abs(imponibile))
utpagati = imponibile;
real ritutpag = rec.get_real(PAG_RITUTPAG);
if (abs(ritutpag) > abs(ritenuta))
ritutpag = ritenuta;
rec.put(PAG_UTSPETT, imponibile - utpagati); // ? da verificare calcolo utili spettanti
rec.put(PAG_RITUTPAG, ritenuta - ritutpag); // ? da verificare calcolo ritenute utili spettanti
const real spesa = rec.get(PAG_SPESA);
const real netto = compenso + spesa - ritenuta - ctssnperc; // calcolo compenso netto
rec.put(PAG_NETTO, netto);
const real somregconv = rec.get_real(PAG_SOMREGCONV);
const real somnsrit = compenso - imponibile + spesa - impcpa - somregconv ; // calcolo somme non soggette a ritenuta
rec.put(PAG_SOMNSRIT, somnsrit);
real controbb = rec.get_real(PAG_SOMREGCONV);
const real ammlordo = imponibile + somnsrit + controbb + somregconv; // calcolo ammontare lordo
rec.put(PAG_AMMLORDO, ammlordo);
const real quotaprov = somnsrit - spesa; // calcolo quota provvigioni
rec.put(PAG_QUOTAPROV, quotaprov);
const real impnetto = imponibile - ritenuta; // calcolo imponibile al netto delle ritenute
rec.put(PAG_IMPNETTO, impnetto);
const real comnetto = compenso - ritenuta; // calcolo compenso al netto delle ritenute
rec.put(PAG_COMNETTO, comnetto);
}
void TSchedaPercipienti::agg_pagamenti(const TRectype & sch)
{
const long numreg = sch.get_long(SCH_NUMREG);
if (numreg > 0)
{
TPartite_array partarr;
partarr.add_numreg(numreg);
if (partarr.items() > 0)
{
TSchedaPE sc;
bool pag_udated = false;
sc.lfile().curr() = sch;
sc.read(_isequal, _lock);
const real totrit = sc.lfile().get_real(SCH_TOTRIT);
const real totale = sc.lfile().get_real(SCH_TOTALE) - totrit;
const real spese = sc.lfile().get_real(SCH_SPESE);
const real iva = sc.lfile().get_real(SCH_IVA);
const real compenso = sc.lfile().get_real(SCH_COMPENSO);
real spperc = spese / totale; spperc.round(8);
real ivaperc = iva / totale; ivaperc.round(8);
TString16 codcau(sc.lfile().get("CODCAUS"));
const TRectype cau = cache().get("%CA7", codcau);
// leggo valori tabella causali per calcolo
const real h_PercAssImp = cau.get_real("R4");
const real h_PercCassaPrev = cau.get_real("R5");
const real h_PercRitenuta = cau.get_real("R0");
const real h_PercInps = cau.get_real("R1");
const real h_PercAssImpInps = cau.get_real("R2");
const real h_PercCommitInps = cau.get_real("R3");
for (TPartita * p = partarr.first(); p != NULL; p =partarr.next())
{
const int row = p->prima_fattura(numreg);
if (row >= 0)
{
TRiga_partite & rigapart = p->riga(row);
int nrate = rigapart.rate();
TDate datapag;
for (int r = 1; r <= nrate; r++)
{
TRiga_scadenze & ratapart = rigapart.rata(r);
TImporto tot[10];
long numregp[10] = {0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};
int lastsch = 0;
const int rows = sc.pag_items();
for (int rowp = ratapart.last(); rowp > 0; rowp = ratapart.pred(rowp))
{
const TRectype& pag = ratapart.row(rowp); // Riga pagamento
const TRiga_partite& sum = p->riga(rowp); // Riga partite
const char sez = sum.sezione();
TImporto imppag(sez, pag.get_real(PAGSCA_IMPORTO));
const long num = sum.get_long(PART_NREG);
if(lastsch == 0 && numregp[0] == 0L)
{
numregp[lastsch] = num;
tot[lastsch].reset();
}
if(num != numregp[lastsch])
{
numregp[++lastsch] = num;
tot[lastsch].reset();
}
if (lastsch > 9)
{
message_box("Attenzione! Troppi pagamenti diversi per la registrazione %ld.", numreg);
break;
}
bool found = false;
imppag += TImporto(sez, pag.get_real(PAGSCA_RITENUTE));
imppag += TImporto(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC));
real abbuoni = pag.get_real(PAGSCA_ABBUONI);
real abb = pag.get_real(PAGSCA_ABBUONI);
if (!abb.is_zero())
imppag += TImporto(sez, abb);
for (int i = 0; !found &&i < rows; i++)
{
TRectype & pagrec = sc.pag(i);
const long numsch = pagrec.get_long(PAG_NUMREG);
found = num == numsch;
if (numsch == 0L && !found)
{
TDate data(sum.get_date(PART_DATADOC));
if (!data.ok())
data = sum.get_date(PART_DATAREG);
if (!data.ok())
data = sum.get_date(PART_DATAPAG);
const TDate datasch(pagrec.get(PAG_DATAPAG));
if (data == datasch)
{
pagrec.put(PAG_NUMREG, num);
found = true;
}
else
{
imppag.normalize('D');
real spesep = imppag.valore() * spperc;
real ivap = imppag.valore() * ivaperc;
spesep.round(TCurrency::get_firm_dec());
if (abs(spesep) > abs(spese))
spesep = spese;
ivap.round(TCurrency::get_firm_dec());
if (abs(ivap) > abs(iva))
ivap = iva;
real compensop = imppag.valore() - spesep - ivap;
compensop += compensop * h_PercRitenuta;
compensop.round(TCurrency::get_firm_dec());
if (abs(compensop) > abs(compenso))
compensop = compenso;
if (compensop == pagrec.get_real(PAG_COMPENSO))
{
pagrec.put(PAG_NUMREG, num);
found = true;
}
}
}
}
if (!found)
{
tot[lastsch] += imppag;
if (!datapag.ok())
datapag = sum.get_date(PART_DATADOC);
if (!datapag.ok())
datapag = sum.get_date(PART_DATAREG);
if (!datapag.ok())
datapag = sum.get_date(PART_DATAPAG);
}
}
for (int j = 0; j < 10 && numregp[j] > 0L; j++)
{
tot[j].normalize('D');
if (tot[j].valore() == ZERO)
break;
TRectype & pagrec = sc.pag(rows);
pagrec.put(PAG_CODDITTA, sc.lfile().get(SCH_CODDITTA));
pagrec.put(PAG_TIPOA, sc.lfile().get(SCH_TIPOA));
pagrec.put(PAG_CODANAGR, sc.lfile().get(SCH_CODANAGR));
pagrec.put(PAG_NPROG, sc.lfile().get(SCH_NPROG));
pagrec.put(PAG_NRIGA, rows + 1);
pagrec.put(PAG_NUMVERS, -1);
real spesepag = tot[j].valore() * spperc;
real ivapag = tot[j].valore() * ivaperc;
spesepag.round(TCurrency::get_firm_dec());
if (abs(spesepag) > abs(spese))
spesepag = spese;
ivapag.round(TCurrency::get_firm_dec());
if (abs(ivapag) > abs(iva))
ivapag = iva;
real compensopag = tot[j].valore() - spesepag - ivapag;
compensopag += compensopag * h_PercRitenuta;
compensopag.round(TCurrency::get_firm_dec());
if (abs(compensopag) > abs(compenso))
compensopag = compenso;
pagrec.put(PAG_COMPENSO, compensopag);
pagrec.put(PAG_SPESA, spesepag);
pagrec.put(PAG_DATAPAG, datapag);
sc.lfile().put(SCH_ANNOC, datapag.year());
sc.lfile().put(SCH_MESEC, datapag.month());
pagrec.put(PAG_PERC, h_PercRitenuta); // percentuale ritenuta acconto
pagrec.put(PAG_ALQIMP10, h_PercAssImpInps);// percentuale 10% INPS
pagrec.put(PAG_NUMREG, numregp[j]);
pagrec.put(PAG_COD10, "C");
calcola_riga_pag(pagrec, h_PercAssImp, h_PercCassaPrev, h_PercRitenuta, h_PercInps, h_PercAssImpInps, h_PercCommitInps);
}
}
}
}
sc.rewrite();
}
}
}
bool schede(const TRelation& rel, void* pJolly)
{
const TRectype & sch = rel.lfile().curr();
TSchedaPercipienti * schper = (TSchedaPercipienti *) pJolly;
schper->agg_pagamenti(sch);
return true;
}
bool TSchedaPercipienti::aggpag_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TLocalisamfile fsch(LF_SCPERC);
TRectype from(fsch.curr());
TLocalisamfile mov(LF_MOV);
from.put("CODDITTA", prefix().get_codditta());
TRectype to(from);
TCursor c(new TRelation(LF_SCPERC), "", 1, &from, &to);
c.scan(schede, &app(), "Aggiornamento schede");
}
return true;
}
bool TSchedaPercipienti::esiste_perc(TMask& m, const char* codanag)
{
const char tipoa = m.get(F_TIPOA)[0];
TString16 codanagr(codanag ? codanag : m.get(F_CODANAGR));
// Controllo che l'anagrafica esista
TLocalisamfile anag(LF_ANAG);
anag.zero();
anag.put("TIPOA", tipoa);
anag.put("CODANAGR", codanagr);
const bool esiste_anagr = anag.read() == NOERR;
// memorizzo flag soggetto non residente nel dato membro usato
// nei controlli
if (esiste_anagr)
_soggnres = anag.get_bool("SOGGNRES");
return esiste_anagr;
}
// Passa al modo inserimento/modifica.
bool TSchedaPercipienti::nprog_handler(TMask_field& f, KEY key)
{
if (!f.mask().is_running())
return TRUE;
if (key == K_CTRL+K_TAB)
{
f.set_dirty();
return TRUE;
}
const int nprog = atoi(f.get());
if (key == K_ENTER)
if (app()._flag_cg)
{
app()._flag_cg = FALSE; // avoid recursion
if (nprog==0 || !app().esiste_perc(f.mask()))
return FALSE;
}
return TRUE;
}
bool TSchedaPercipienti::user_create()
{
_per = new TLocalisamfile(LF_PERC);
_rel = new TSchedaPE;
_rver = new TLocalisamfile(LF_RVER);
_rpag = new TLocalisamfile(LF_RPAG);
_pags = new TNikArray_sheet(-1, -1, -4, -4, TR("Selezione Pagamenti"),
HR("@1|Data@11|Compenso@16|Ritenuta@16|"),
0,NULL_WIN,5);
set_search_field(F_CODANAGRPERC);
// simulo una chiamata da contabilit<69> (lo lascio per eventuali prove)
/* real totdocla = 1000000;
real spesela = ZERO;
real compensola = 1000000;
real impostela = ZERO;
real ritenutela = ZERO;
TToken_string s(80);
s.add(pagamento);
s.add("M");
s.add("G");
s.add(805);
s.add(15633);
s.add("7");
s.add("04-01-2010");
s.add(totdocla.string());
s.add(spesela.string());
s.add(compensola.string());
s.add(impostela.string());
s.add(ritenutela.string());
const char* name = "770 -0";
TMessage mla(name, "LINK770", s);
mla.send(); */
// Collegamento da contabilita'
TMailbox m;
TMessage* msg = m.next_s("LINK770");
if (msg != NULL)
{
if ( !_coll.read(msg->body()) )
{
NFCHECK("Errore nei parametri passati");
return FALSE;
}
const long ditta_cg = get_firm();
if (!exist_dichiar_770(ditta_cg))
if (yesno_box(FR("Creare la dichiarazione per la ditta %ld"), ditta_cg))
if (!enter_dichiar_770(ditta_cg))
{
NFCHECK("Creazione dichiarazione fallita!");
return FALSE;
}
}
load_mask(0);
return true;
}
bool TSchedaPercipienti::user_destroy()
{
if (_msk[1] != NULL) delete _msk[1];
if (_msk[0] != NULL) delete _msk[0];
delete _rel; delete _per; delete _rver;
delete _rpag; delete _pags;
return TRUE;
}
//
// COMPILA_TESTATA
//
// Usata nel collegamento da cg
//
void TSchedaPercipienti::compila_testata(TMask& m)
{
m.set(F_DATADOC, _coll._datadoc);
m.set(F_NUMDOC, _coll._numdoc);
m.set(F_IVA, _coll._imposte.string());
m.set(F_SPESE, _coll._spese.string());
m.set(F_COMPENS, _coll._compenso.string());
m.set(F_NUMREG, _coll._numreg);
switch (tipo_coll())
{
case occasionale:
m.set(F_COMPENS, _coll._compenso.string());
m.set(F_TOTDOC, _coll._compenso.string());
break;
case fattura:
m.set(F_TOTDOC, _coll._totdoc.string());
m.set(F_TOTRIT, _coll._ritenute.string());
break;
default:
break;
}
}
bool TSchedaPercipienti::coll_variazione() const
{
return _coll._immissione == 'M' || tipo_coll() == pagamento ||
tipo_coll() == pagamento_piu_perc;
}
TString80 TSchedaPercipienti::get_ragsoc(const char* tipoa, const long codanagr)
{
TLocalisamfile anag(LF_ANAG);
anag.zero();
anag.setkey(1);
anag.put("TIPOA", tipoa);
anag.put("CODANAGR", codanagr);
const int rc = anag.read();
if (rc != NOERR)
anag.zero();
return anag.get("RAGSOC");
}
void TSchedaPercipienti::init_modify_mode(TMask& m)
{
_from_modify = TRUE;
_codanagr = m.get_long(F_CODANAGR);
_tipoa = m.get(F_TIPOA);
_ragsoc = get_ragsoc(_tipoa, _codanagr);
// inizilizza maschera
init_mask(m, false);
}
void TSchedaPercipienti::init_insert_mode(TMask& m)
{
init_mask(m);
}
void TSchedaPercipienti::on_config_change()
{
TConfig conf(CONFIG_STUDIO);
_anno_dic = (int)conf.get_long(ANNO_SEL, NULL);
}
void TSchedaPercipienti::init_query_mode(TMask& m)
{
m.set(F_ANNODIC, _anno_dic);
// Controllo se chiamata dalla contabilita'
if (tipo_coll() != nessuno)
{
const bool variazione = coll_variazione();
_flag_cg = TRUE;
TString16 tipo("");
tipo << _coll._tipo;
m.set(F_TIPOA, tipo);
if (_coll._codanagr != 0L)
{
m.set(F_CODANAGR, _coll._codanagr);
m.set(F_CODANAGRPERC, _coll._codanagr);
m.set(F_CODANAGRCOM, _coll._codanagr);
}
switch (tipo_coll())
{
case fattura:
setta_nprog(m, variazione);
m.send_key(K_AUTO_ENTER,0);
return;
break;
case pagamento:
if (coll_datanum())
{
if (setta_nprog(m, variazione))
m.send_key(K_AUTO_ENTER,0);
}
return;
break;
case occasionale:
m.send_key(K_AUTO_ENTER, 0);
return;
break;
default:
break;
}
}
if (_from_modify)
{
m.set(F_TIPOA, _tipoa);
m.set(F_CODANAGR, _codanagr);
m.set(F_CODANAGRPERC, _codanagr);
m.set(F_CODANAGRCOM, _codanagr);
m.set(F_RAGSOCPER, _ragsoc);
m.set(F_RAGSOCCOM, _ragsoc);
}
else
{
m.hide(-1); // group 1 Scelta ANAGR
m.show(-2); // group 3 Ricerca su DATI PER
}
_from_modify = FALSE;
// forza il ricalcolo dell'ultimo numero disponibile
TString16 dummy(m.get(F_NPROG));
if (dummy.not_empty())
setta_nprog(m);
}
void TSchedaPercipienti::init_query_insert_mode(TMask& m)
{
m.set(F_ANNODIC, _anno_dic);
// Se vengo da modifica mantieni la selezione precedente
if (_from_modify)
{
m.set(F_TIPOA, _tipoa);
m.set(F_CODANAGR, _codanagr);
m.set(F_CODANAGRPERC, _codanagr);
m.set(F_CODANAGRCOM, _codanagr);
m.set(F_RAGSOCPER, _ragsoc);
m.set(F_RAGSOCCOM, _ragsoc);
}
else
{
m.hide(-2); // group 3 Nasconde ricerca su PERC
m.show(-1); // group 1 Ricerca su ANAGR
}
}
void TSchedaPercipienti::rec2row(TToken_string& r, TRectype& rec, int row)
{
TString16 dver, dpag, serie, numero, rite;
TString16 comp, impo, perc, spesa, netto;
TString16 nrigavers, numpag, progrbanca;
TString SsnPerc, SsnCompl;
r = "";
if (rec.num() == LF_RVER)
{
char v1015 = rec.get_bool("VERS1015") ? 'X' : ' ';
dver = rec.get("DATAVERS");
char tv = rec.get_char("TIPOVERS");
char lv = rec.get_char("LUOVERS");
serie = rec.get("SERIE");
numero = rec.get("NUMERO");
rite = rec.get("RITENUTA");
progrbanca = rec.get("PROGBANC");
nrigavers = rec.get("NRIGA");
if (rite.empty()) rite = " ";
if (progrbanca.empty()) progrbanca = " ";
if (nrigavers.empty()) nrigavers = " ";
if (serie.empty()) serie = " ";
if (numero.empty()) numero = " ";
r.add(v1015, 0);
r.add(dver,1);
r.add(lv == '\0' ? ' ' : lv);
r.add(tv == '\0' ? ' ' : tv);
r.add(serie);
r.add(numero);
r.add(progrbanca);
r.add(rite);
r.add(nrigavers);
if (v1015 == 'X')
disable_vers_cells(row);
else
enable_vers_cells(row);
}
if (rec.num() == LF_RPAG)
{
// istanza struttura pagamento
Pag_struct s;
// compilo campi struttura
s.datapag = rec.get_date("DATAPAG");
s.imponibile = rec.get_real("IMPONIBILE");
s.perc = rec.get_real("PERC");
s.ritenuta = rec.get_real("RITENUTA");
s.compenso = rec.get_real("COMPENSO");
s.netto = rec.get_real("NETTO");
s.numvers = rec.get_long("NUMVERS");
s.spesa = rec.get_real("SPESA");
s.ctssnperc = rec.get_real("CTSSNPERC");
s.ctssncomp = rec.get_real("CTSSNCOMP");
s.ritlorda = rec.get_real("RITLORDA");
s.controbb = rec.get_real("CONTROBB");
s.detfamil = rec.get_real("DETFAMIL");
s.detlavdip = rec.get_real("DETLAVDIP");
s.totdet = rec.get_real("TOTDET");
s.giolavdip = rec.get_int("GIOLAVDIP");
s.impcpa = rec.get_real("IMPCPA");
s.somregconv = rec.get_real("SOMREGCONV");
s.alqimp10 = rec.get_real("ALQIMP10");
s.cod10 = rec.get("COD10");
s.utpagati = rec.get_real("UTPAGATI");
s.utspett = rec.get_real("UTSPETT");
s.ritutpag = rec.get_real("RITUTPAG");
s.ritutspe = rec.get_real("RITUTSPE");
s.nquote = rec.get_real("NQUOTE");
s.somnsrit = rec.get_real("SOMNSRIT");
s.ammlordo = rec.get_real("AMMLORDO");
s.quotaprov = rec.get_real("QUOTAPROV");
s.impnetto = rec.get_real("IMPNETTO");
s.comnetto = rec.get_real("COMNETTO");
s.numreg = rec.get_long(PAG_NUMREG);
// compilo riga di sheet
from_struct_to_sheet(s, r);
}
}
int TSchedaPercipienti::read(TMask& m)
{
m.autoload(*_rel);
// reperische sheet attivo forzando l'abilitazione in base al quadro
// ci<63> <20> necessario per attivare lo sheet corretto quando
// si esce/entra dalle singole schede
TSheet_field& pags = pag_sheet_enabled(m,TRUE);
pags.destroy();
int r;
for (r = 0; r < _rel->pag_items(); r++)
rec2row(pags.row(r), _rel->pag(r), r);
TSheet_field& vers = (TSheet_field&)m.field(F_VERSAMENTI);
vers.destroy();
for (r = 0; r < _rel->ver_items(); r++)
rec2row(vers.row(r), _rel->ver(r), r);
return 0;
}
void TSchedaPercipienti::enable_vers_cells(int r, bool enable)
{
TSheet_field& ver = vers();
// calcolo numero di colonne utili (scartando l'ultima)
int num_col = ver.row(r).items() - 1;
// abilito/disabilito celle
for (int i=1; i<num_col; i++)
enable ? ver.enable_cell(r,i) : ver.disable_cell(r,i);
}
void TSchedaPercipienti::new_row(TSheet_field& ver_pag, int r, bool vers)
{
TToken_string& riga = ver_pag.row(r);
if (vers)
riga.add(++_lastvers, COLONNE_SIGNIFICATIVE_SPREADSHEET_VERSAMENTI);
else
riga.add(-1, num_sheet_column() - 1);
}
//
// FILL_SHEET
//
// Determino QUI un progressivo unico per i pagamenti e i versamenti
// (NUMVERS e NUMPAG: vedi new_row())
void TSchedaPercipienti::fill_sheet(TMask& m)
{
// leggo codice quadro
TString16 qua(m.get(F_CODQUA));
TSheet_field& pags = pag_sheet_enabled(m);
int r;
for (r = pags.items(); r < 16; r++)
new_row(pags, r, FALSE);
TSheet_field& vers = (TSheet_field&)m.field(F_VERSAMENTI);
for (r = vers.items(); r < 16; r++)
new_row(vers, r, TRUE);
}
bool TSchedaPercipienti::scrivi_dati_per(TRectype& rec)
{
TLocalisamfile dati_per(LF_PERC);
const long codditta = rec.get_long("CODDITTA");
char tipoa = rec.get_char("TIPOA");
const long codanagr = rec.get_long("CODANAGR");
dati_per.zero();
dati_per.put("CODDITTA", codditta);
dati_per.put("TIPOA", tipoa);
dati_per.put("CODANAGR", codanagr);
const bool preesistente = (dati_per.read() == NOERR);
if (!preesistente)
{
dati_per.zero();
dati_per.put("CODDITTA", codditta);
dati_per.put("TIPOA", tipoa);
dati_per.put("CODANAGR", codanagr);
dati_per.write();
}
return preesistente;
}
int TSchedaPercipienti::rewrite(const TMask& m)
{
mask2rel(m);
const int err = _rel->rewrite();
scrivi_dati_per(_rel->curr());
return err;
}
int TSchedaPercipienti::write(const TMask& m)
{
mask2rel(m);
const int err = _rel->write();
scrivi_dati_per(_rel->curr());
return err;
}
bool TSchedaPercipienti::check_compensi(TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
const bool forzatura = f.mask().get_bool(F_FORCED);
real doc_compenso(f.get());
if (app()._tot_compenso > doc_compenso)
{
f.warning_box("Il totale dei compensi non puo' superare\n"
"il compenso indicato nel documento");
return forzatura;
}
}
return TRUE;
}
bool TSchedaPercipienti::check_spese(TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
const bool forzatura = f.mask().get_bool(F_FORCED);
real doc_spese(f.get());
if (app()._tot_spese > doc_spese)
{
f.warning_box ("Il totale delle spese non puo' superare\n"
"la spesa indicata nel documento");
return forzatura;
}
}
return TRUE;
}
bool TSchedaPercipienti::check_competenza(TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
const bool forzatura = f.mask().get_bool(F_FORCED);
int anno_competenza(f.mask().get_int(F_ANNOCOMP));
int mese_competenza(f.mask().get_int(F_MESECOMP));
if (anno_competenza && !mese_competenza)
{
f.warning_box ("Indicare anche il mese di competenza");
return forzatura;
}
if (!anno_competenza && mese_competenza)
{
f.warning_box ("Indicare anche l'anno competenza");
return forzatura;
}
}
return TRUE;
}
//
// Calcola:
//
// totale compensi
// totale spese
// totale netti pagati
//
// - NB -
// FUNZIONA SOLO SE PASSA PRIMA DI QUA!
//
bool TSchedaPercipienti::check_handler(TMask_field& f, KEY k)
{
if (k == K_ENTER)
{
TMask& m = f.mask();
const bool forzatura = m.get_bool(F_FORCED);
int i;
TArray& rpag = app().pags().rows_array();
app()._tot_compenso = ZERO;
app()._tot_spese = ZERO;
app()._tot_rit = ZERO;
// Calcolo totale compensi, totale spese e totale ritenute
for (i = 0; i < rpag.items(); i++)
{
TToken_string& row = (TToken_string&)rpag[i];
if (app().my_empty_items(row, FALSE)) continue;
real compenso = ZERO;
real spese = ZERO;
real ritenuta = ZERO;
real netto = ZERO;
int pos;
if ((pos = app().token_pos("COMPENSO")) != -1)
compenso = row.get(pos);
if ((pos = app().token_pos("SPESA")) != -1)
spese = row.get(pos);
if ((pos = app().token_pos("RITENUTA")) != -1)
ritenuta = row.get(pos);
app()._tot_compenso += compenso;
app()._tot_spese += spese;
app()._tot_rit += ritenuta;
}
TArray& rver = app().vers().rows_array();
app()._tot_vers = ZERO;
// Calcola totale versato
for (i = 0; i < rver.items(); i++)
{
TToken_string& row = (TToken_string&)rver[i];
if (app().my_empty_items(row, TRUE))
continue;
real versato (row.get(7));
app()._tot_vers += versato;
}
const int fdec = TCurrency::get_firm_dec();
app()._tot_rit.round(fdec);
app()._tot_vers.round(fdec);
// memorizzo i totali ritenute pagate/versate
m.set(F_RITOPE, app()._tot_rit);
m.set(F_RITVER, app()._tot_vers);
const real diff = abs(app()._tot_vers - app()._tot_rit);
if (app()._tot_vers != ZERO && diff > ZERO)
{
const bool in_euro = is_euro_value("");
const real THRESOLD = in_euro ? 0.50 : 500.0;
const bool war = in_euro ? (diff >= THRESOLD) : (diff > THRESOLD);
if (war)
{
f.warning_box("La differenza tra il totale dei versamenti "
"ed il totale delle ritenute non puo' superare %s %s",
THRESOLD.string(), in_euro ? "Euro" : "Lire");
return forzatura;
}
}
}
return TRUE;
}
// Trasferisce i dati dalla maschera alla relazione
void TSchedaPercipienti::mask2rel(const TMask& m)
{
// Assicurati che siano calcolate le ritenute
if (_tot_rit.is_zero() || _tot_vers.is_zero())
{
TMask_field& datadoc = m.field(F_DATADOC);
check_handler(datadoc, K_ENTER);
}
_rel->lfile().zero();
m.autosave(*_rel);
// leggo chiave scheda
const long codditta = m.get_long(F_CODDITTA);
const char tipoa = m.get(F_TIPOA)[0];
const long codanagr = m.get_long(F_CODANAGR);
const int nprogr = m.get_int(F_NPROG);
// leggo valori tabella causali per calcolo
const real h_PercAssImp = m.get_real(F_QUOTAIMP);
const real h_PercCassaPrev = m.get_real(F_CASSA_PREV);
const real h_PercRitenuta = m.get_real(F_PERRIT);
const bool h_FlagInps = m.get_bool(F_FLAG_INPS);
const real h_PercInps = m.get_real(F_PERC_INPS);
const real h_PercAssImpInps = m.get_real(F_PERC_ASS_INPS);
const real h_PercCommitInps = m.get_real(F_PERC_COMMIT_INPS);
// istanza struttura di comodo per calcolo riga pagamenti
Pag_struct c;
_rel->destroy_rows(); // Destroy all records
pag_pack(); // Destroy all null rows
// salva pagamenti
TArray& rows = pags().rows_array();
const int pag_rows = rows.items();
//se trova vuoti i campi mese o anno di competenza vi copia i valori della data sulla riga
//controlla che ci sia l'enter di uscita dalla riga, che il campo data sia pieno
//03/05/2011
if (pag_rows > 0)
{
TRectype& scperc_rec = _rel->curr(LF_SCPERC);
if (scperc_rec.get_int(SPR_MESEC) <= 0 || scperc_rec.get_int(SPR_ANNOC) <= 0)
{
const TDate datapag = pags().cell(0, 0);
scperc_rec.put(SPR_MESEC, datapag.month());
scperc_rec.put(SPR_ANNOC, datapag.year());
}
}
int i;
for (i = 0; i < pag_rows; i++)
{
TToken_string& row = (TToken_string&)rows[i];
TRectype &r = _rel->pag(i);
long nriga = i + 1;
// compilo campi chiave
r.zero();
r.put("CODDITTA", codditta);
r.put("TIPOA", tipoa);
r.put("CODANAGR", codanagr);
r.put("NPROG", nprogr);
r.put("NRIGA", nriga);
// compilo struttura rigo di pagamento
Pag_struct s;
from_sheet_to_struct(row, s);
// ricalcolo riga pagamento
// (per ottenere la congruit<69> dei dati semplicemente
// registrando la scheda)
c.numreg = s.numreg;
calcola_riga_pag(s,
c,
FALSE,
h_PercAssImp,
h_PercCassaPrev,
h_PercRitenuta,
h_PercInps,
h_PercAssImpInps,
h_PercCommitInps);
// compilo restanti campi
r.put("DATAPAG", s.datapag);
r.put("IMPONIBILE",s.imponibile);
r.put("PERC", s.perc);
r.put("RITENUTA", s.ritenuta);
r.put("COMPENSO", s.compenso);
r.put("NETTO",s.netto);
r.put("NUMVERS", s.numvers);
r.put("SPESA", s.spesa);
r.put("CTSSNPERC", s.ctssnperc);
r.put("CTSSNCOMP", s.ctssncomp);
r.put("RITLORDA", s.ritlorda);
r.put("CONTROBB", s.controbb);
r.put("DETFAMIL", s.detfamil);
r.put("DETLAVDIP", s.detlavdip);
r.put("TOTDET", s.totdet);
r.put("GIOLAVDIP", s.giolavdip);
r.put("IMPCPA", s.impcpa);
r.put("SOMREGCONV", s.somregconv);
r.put("ALQIMP10", s.alqimp10);
r.put("COD10", s.cod10);
r.put("UTPAGATI", s.utpagati);
r.put("UTSPETT", s.utspett);
r.put("RITUTPAG", s.ritutpag);
r.put("RITUTSPE", s.ritutspe);
r.put("NQUOTE", s.nquote);
r.put("SOMNSRIT", s.somnsrit);
r.put("AMMLORDO", s.ammlordo);
r.put("QUOTAPROV", s.quotaprov);
r.put("IMPNETTO", s.impnetto);
r.put("COMNETTO", s.comnetto);
r.put(PAG_NUMREG, s.numreg);
}
// salva versamenti
rows = vers().rows_array();
for (i = 0; i < rows.items(); i++)
{
TToken_string& row = (TToken_string&)rows[i];
TRectype &r = _rel->ver(i);
if (my_empty_items(row, TRUE))
continue; // non salvare righe vuote
long nriga = i+1;
r.zero();
r.put("CODDITTA", codditta);
r.put("TIPOA", tipoa);
r.put("CODANAGR", codanagr);
r.put("NPROG", nprogr);
r.put("NRIGA", nriga);
// LEGGO SPREADSHEET VERSAMENTI
const bool vers1015 = (row.get_char(0) == 'X');
TString16 datav = row.get(1);
const TDate dataver(datav);
const char luogo = row.get_char(2);
const char tipo = row.get_char(3);
const TString16 serie(row.get(4));
const TString16 numero(row.get(5));
const long ProgBanca(row.get_long(6));
const real ritenuta (row.get(7));
const int numvers (row.get_int(8));
r.put("VERS1015",vers1015);
r.put("DATAVERS",dataver);
r.put("LUOVERS", luogo);
r.put("TIPOVERS",tipo);
r.put("SERIE", serie);
r.put("NUMERO", numero);
r.put("PROGBANC",ProgBanca);
r.put("RITENUTA",ritenuta);
}
}
TMask& TSchedaPercipienti::TheMask() const
{
if (_msk[1] == NULL)
error_box("Maschera di inserimento/modifica non ancora istanziata!");
return *(_msk[1]);
}
TSheet_field& TSchedaPercipienti::pag_sheet_enabled(TMask& m, bool force_enable) const
{
TSheet_field* s = NULL;
// istanza reference sheet a disposizione
TSheet_field& s_C = (TSheet_field&)m.field(F_PAGAMENTI_C);
TSheet_field& s_E = (TSheet_field&)m.field(F_PAGAMENTI_C);
TSheet_field& s_F = (TSheet_field&)m.field(F_PAGAMENTI_D);
TSheet_field& s_G = (TSheet_field&)m.field(F_PAGAMENTI_D);
// forza la disabilitazione di tutti se richiesta
// l'abilitazionein base al quadro
if (force_enable)
{
s_C.hide();
s_E.hide();
s_F.hide();
s_G.hide();
}
// valorizzo reference sheet abilitato
if (s_C.shown())
s = &s_C;
if (s_E.shown())
s = &s_E;
if (s_F.shown())
s = &s_F;
if (s_G.shown())
s = &s_G;
// se nessuno abilitato forzo l'abilitazione in base al quadro
// questo si rende necessario per il primo che invoca questo
// metodo, in quanto gli sheet sono hide alla partenza
if (s == NULL)
{
// reperisco codice quadro della scheda
TString16 codcau(_rel->lfile().get("CODCAUS"));
TTable cau("%ca7");
cau.zero();
cau.put("CODTAB", codcau);
TString16 qua = "C";
if (cau.read() == NOERR)
qua = cau.get("S1");
// abilito sheet
s = &(enable_pag_sheet(m, qua));
// aggancio handler
set_pag_handler(*s);
}
return *s;
}
bool TSchedaPercipienti::activate_pag_sheet(TMask& m)
{
// reperisco sheet attivo da cui copiare, la Token_string pilota
// e il numero di colonne
TSheet_field& prev_s = pag_sheet_enabled(m);
TToken_string prev_pilot(pilot_sheet());
int prev_col = num_sheet_column() + 1;
// leggo codice quadro
TString16 qua(m.get(F_CODQUA));
// abilito sheet
TSheet_field& curr_s = enable_pag_sheet(m, qua);
// reperisco la Token_string pilota dallo sheet attivo
TToken_string curr_pilot(pilot_sheet());
// copia dallo sheet disattivato a quello attivato solo se non coincidono,
// preoccupandosi di spostare le colonne al posto giusto
if (prev_s.dlg() != curr_s.dlg())
{
curr_s.destroy();
for (int i=0; i<prev_s.items(); i++)
{
TToken_string curr_row;
for (int j=0; j<prev_col; j++)
{
// trovo posizione token nello sheet attivo
TString prev_token(prev_pilot.get(j));
int pos = token_pos((const char*)prev_token);
// copio solo se <20> presente nello sheet attivo
if (pos != -1)
{
TString prev_val(prev_s.row(i).get(j));
curr_row.add(prev_val, pos);
}
}
curr_s.row(i) = curr_row;
}
}
// ricalcolo tutte le righe pagamento
const real h_PercAssImp = m.get_real(F_QUOTAIMP);
const real h_PercCassaPrev = m.get_real(F_CASSA_PREV);
const real h_PercRitenuta = m.get_real(F_PERRIT);
const bool h_FlagInps = m.get_bool(F_FLAG_INPS);
const real h_PercInps = m.get_real(F_PERC_INPS);
const real h_PercAssImpInps = m.get_real(F_PERC_ASS_INPS);
const real h_PercCommitInps = m.get_real(F_PERC_COMMIT_INPS);
// istanza strutture per calcolo
Pag_struct c;
Pag_struct s;
// elaboro le righe di pagamento
for (int r = 0; r < curr_s.items(); r++)
{
TToken_string& t = curr_s.row(r);
if (!my_empty_items(t, FALSE))
{
from_sheet_to_struct(t, s);
calcola_riga_pag(s,
c,
TRUE,
h_PercAssImp,
h_PercCassaPrev,
h_PercRitenuta,
h_PercInps,
h_PercAssImpInps,
h_PercCommitInps);
from_struct_to_sheet(s, t);
}
}
// aggancio handler pagamenti
set_pag_handler(curr_s);
// forzo ridisegno dello sheet a video
curr_s.force_update();
return TRUE;
}
int TSchedaPercipienti::num_sheet_column() const
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// ritorno il numero di colonne ignorando l'ultima
// che <20> ad uso interno
return columns.items()-1;
}
int TSchedaPercipienti::token_pos(const char* t) const
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// ritorno la posizione del token richiesto
return columns.get_pos(t);
}
int TSchedaPercipienti::token_dlg(const char* t) const
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// ritorno l'identificatore del token richiesto
int dlg = columns.get_pos(t);
if (dlg != -1)
dlg += 101;
return dlg;
}
const char* TSchedaPercipienti::pilot_sheet() const
{
// reperisco sheet attivo
TSheet_field& s = pag_sheet_enabled(TheMask());
// individuo la testata giusta
char* columns;
int dlg = s.dlg();
switch(dlg)
{
case F_PAGAMENTI_C : columns = (char*)PILOT_SHEET[0]; break;
case F_PAGAMENTI_D : columns = (char*)PILOT_SHEET[1]; break;
// esistevano nel vecchio caso
// case F_PAGAMENTI_DB : columns = (char*)PILOT_SHEET[2]; break;
// case F_PAGAMENTI_G : columns = (char*)PILOT_SHEET[3]; break;
default : break;
}
// ritorno la Token_string pilota
return columns;
}
Pag_struct& TSchedaPercipienti::from_sheet_to_struct(TToken_string& t, Pag_struct& s)
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// azzero struttura
clear_struct(s);
// posizione dell'informazione all'interno della Token_string
int pos;
// set data pagamento
if ((pos = token_pos("DATAPAG")) != -1)
{
TString16 datap = t.get(pos);
s.datapag = datap;
}
// set imponibile
if ((pos = token_pos("IMPONIBILE")) != -1)
s.imponibile = t.get(pos);
// set percentuale ritenuta
if ((pos = token_pos("PERC")) != -1)
s.perc = t.get(pos);
// set ritenuta
if ((pos = token_pos("RITENUTA")) != -1)
s.ritenuta = t.get(pos);
// set compenso
if ((pos = token_pos("COMPENSO")) != -1)
s.compenso = t.get(pos);
// set compenso netto
if ((pos = token_pos("NETTO")) != -1)
s.netto = t.get(pos);
// set numero versamento collegato
if ((pos = token_pos("NUMVERS")) != -1)
s.numvers = t.get_long(pos);
// set spesa
if ((pos = token_pos("SPESA")) != -1)
s.spesa = t.get(pos);
// set contr.10% percipiente
if ((pos = token_pos("CTSSNPERC")) != -1)
s.ctssnperc = t.get(pos);
// set contr.10% complessivo
if ((pos = token_pos("CTSSNCOMP")) != -1)
s.ctssncomp = t.get(pos);
// set ritenuta lorda
if ((pos = token_pos("RITLORDA")) != -1)
s.ritlorda = t.get(pos);
// set contributi obbligatori
if ((pos = token_pos("CONTROBB")) != -1)
s.controbb = t.get(pos);
// set detrazioni famigliari
if ((pos = token_pos("DETFAMIL")) != -1)
s.detfamil = t.get(pos);
// set detrazioni lavoro dipendente
if ((pos = token_pos("DETLAVDIP")) != -1)
s.detlavdip = t.get(pos);
// set totale detrazioni
if ((pos = token_pos("TOTDET")) != -1)
s.totdet = t.get(pos);
// set giorni lavoro dipendente
if ((pos = token_pos("GIOLAVDIP")) != -1)
s.giolavdip = t.get_int(pos);
// set importo CPA
if ((pos = token_pos("IMPCPA")) != -1)
s.impcpa = t.get(pos);
// set somme regime convenzionale
if ((pos = token_pos("SOMREGCONV")) != -1)
s.somregconv = t.get(pos);
// set percentuale contributo 10%
if ((pos = token_pos("ALQIMP10")) != -1)
s.alqimp10 = t.get(pos);
// set codice contributo 10%
if ((pos = token_pos("COD10")) != -1)
s.cod10 = t.get(pos);
// set utili pagati
if ((pos = token_pos("UTPAGATI")) != -1)
s.utpagati = t.get(pos);
// set utili spettanti
if ((pos = token_pos("UTSPETT")) != -1)
s.utspett = t.get(pos);
// set ritenuta utili pagati
if ((pos = token_pos("RITUTPAG")) != -1)
s.ritutpag = t.get(pos);
// set ritenuta utili spettanti
if ((pos = token_pos("RITUTSPE")) != -1)
s.ritutspe = t.get(pos);
// set numero quote
if ((pos = token_pos("NQUOTE")) != -1)
s.nquote = t.get(pos);
// set somme non sogg.ritenuta
if ((pos = token_pos("SOMNSRIT")) != -1)
s.somnsrit = t.get(pos);
// set ammontare lordo
if ((pos = token_pos("AMMLORDO")) != -1)
s.ammlordo = t.get(pos);
// set quota provvigioni
if ((pos = token_pos("QUOTAPROV")) != -1)
s.quotaprov = t.get(pos);
// set imponibile al netto ritenute
if ((pos = token_pos("IMPNETTO")) != -1)
s.impnetto = t.get(pos);
// set compenso al netto ritenute
if ((pos = token_pos("COMNETTO")) != -1)
s.comnetto = t.get(pos);
// set numero versamento collegato
if ((pos = token_pos("NUMVERS")) != -1)
s.numvers = t.get_long(pos);
// set numero registrazione
if ((pos = token_pos(PAG_NUMREG)) != -1)
s.numreg = t.get_long(pos);
return s;
}
void TSchedaPercipienti::from_struct_to_sheet(Pag_struct& s, TToken_string& t)
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// posizione dell'informazione all'interno della Token_string
int pos;
// set data pagamento
if ((pos = token_pos("DATAPAG")) != -1)
t.add(s.datapag, pos);
// set imponibile
if ((pos = token_pos("IMPONIBILE")) != -1)
t.add(s.imponibile.string(), pos);
// set percentuale ritenuta
if ((pos = token_pos("PERC")) != -1)
t.add(s.perc.string(), pos);
// set ritenuta
if ((pos = token_pos("RITENUTA")) != -1)
t.add(s.ritenuta.string(), pos);
// set compenso
if ((pos = token_pos("COMPENSO")) != -1)
t.add(s.compenso.string(), pos);
// set compenso netto
if ((pos = token_pos("NETTO")) != -1)
t.add(s.netto.string(), pos);
// set numero versamento collegato
if ((pos = token_pos("NUMVERS")) != -1)
t.add(s.numvers, pos);
// set spesa
if ((pos = token_pos("SPESA")) != -1)
t.add(s.spesa.string(), pos);
// set contr.10% percipiente
if ((pos = token_pos("CTSSNPERC")) != -1)
t.add(s.ctssnperc.string(), pos);
// set contr.10% complessivo
if ((pos = token_pos("CTSSNCOMP")) != -1)
t.add(s.ctssncomp.string(), pos);
// set ritenuta lorda
if ((pos = token_pos("RITLORDA")) != -1)
t.add(s.ritlorda.string(), pos);
// set contributi obbligatori
if ((pos = token_pos("CONTROBB")) != -1)
t.add(s.controbb.string(), pos);
// set detrazioni famigliari
if ((pos = token_pos("DETFAMIL")) != -1)
t.add(s.detfamil.string(), pos);
// set detrazioni lavoro dipendente
if ((pos = token_pos("DETLAVDIP")) != -1)
t.add(s.detlavdip.string(), pos);
// set totale detrazioni
if ((pos = token_pos("TOTDET")) != -1)
t.add(s.totdet.string(), pos);
// set giorni lavoro dipendente
if ((pos = token_pos("GIOLAVDIP")) != -1)
t.add(s.giolavdip, pos);
// set importo CPA
if ((pos = token_pos("IMPCPA")) != -1)
t.add(s.impcpa.string(), pos);
// set somme regime convenzionale
if ((pos = token_pos("SOMREGCONV")) != -1)
t.add(s.somregconv.string(), pos);
// set percentuale contributo 10%
if ((pos = token_pos("ALQIMP10")) != -1)
t.add(s.alqimp10.string(), pos);
// set codice contributo 10%
if ((pos = token_pos("COD10")) != -1)
t.add(s.cod10, pos);
// set utili pagati
if ((pos = token_pos("UTPAGATI")) != -1)
t.add(s.utpagati.string(), pos);
// set utili spettanti
if ((pos = token_pos("UTSPETT")) != -1)
t.add(s.utspett.string(), pos);
// set ritenuta utili pagati
if ((pos = token_pos("RITUTPAG")) != -1)
t.add(s.ritutpag.string(), pos);
// set ritenuta utili spettanti
if ((pos = token_pos("RITUTSPE")) != -1)
t.add(s.ritutspe.string(), pos);
// set numero quote
if ((pos = token_pos("NQUOTE")) != -1)
t.add(s.nquote.string(), pos);
// set somme non sogg.ritenuta
if ((pos = token_pos("SOMNSRIT")) != -1)
t.add(s.somnsrit.string(), pos);
// set ammontare lordo
if ((pos = token_pos("AMMLORDO")) != -1)
t.add(s.ammlordo.string(), pos);
// set quota provvigioni
if ((pos = token_pos("QUOTAPROV")) != -1)
t.add(s.quotaprov.string(), pos);
// set imponibile al netto ritenute
if ((pos = token_pos("IMPNETTO")) != -1)
t.add(s.impnetto.string(), pos);
// set compenso al netto ritenute
if ((pos = token_pos("COMNETTO")) != -1)
t.add(s.comnetto.string(), pos);
// set numero versamento collegato
if ((pos = token_pos("NUMVERS")) != -1)
t.add(s.numvers, pos);
// set numero registrazione
if ((pos = token_pos(PAG_NUMREG)) != -1)
t.add(s.numreg, pos);
}
Pag_struct& TSchedaPercipienti::from_mask_to_struct(TMask& m, Pag_struct& s)
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// azzero struttura
clear_struct(s);
// identificatore del token all'interno della maschera
int dlg;
// set data pagamento
if ((dlg = token_dlg("DATAPAG")) != -1)
s.datapag = m.get_date(dlg);
// set imponibile
if ((dlg = token_dlg("IMPONIBILE")) != -1)
s.imponibile = m.get_real(dlg);
// set percentuale ritenuta
if ((dlg = token_dlg("PERC")) != -1)
s.perc = m.get_real(dlg);
// set ritenuta
if ((dlg = token_dlg("RITENUTA")) != -1)
s.ritenuta = m.get_real(dlg);
// set compenso
if ((dlg = token_dlg("COMPENSO")) != -1)
s.compenso = m.get_real(dlg);
// set compenso netto
if ((dlg = token_dlg("NETTO")) != -1)
s.netto = m.get_real(dlg);
// set spesa
if ((dlg = token_dlg("SPESA")) != -1)
s.spesa = m.get_real(dlg);
// set contr.10% percipiente
if ((dlg = token_dlg("CTSSNPERC")) != -1)
s.ctssnperc = m.get_real(dlg);
// set contr.10% complessivo
if ((dlg = token_dlg("CTSSNCOMP")) != -1)
s.ctssncomp = m.get_real(dlg);
// set ritenuta lorda
if ((dlg = token_dlg("RITLORDA")) != -1)
s.ritlorda = m.get_real(dlg);
// set contributi obbligatori
if ((dlg = token_dlg("CONTROBB")) != -1)
s.controbb = m.get_real(dlg);
// set detrazioni famigliari
if ((dlg = token_dlg("DETFAMIL")) != -1)
s.detfamil = m.get_real(dlg);
// set detrazioni lavoro dipendente
if ((dlg = token_dlg("DETLAVDIP")) != -1)
s.detlavdip = m.get_real(dlg);
// set totale detrazioni
if ((dlg = token_dlg("TOTDET")) != -1)
s.totdet = m.get_real(dlg);
// set giorni lavoro dipendente
if ((dlg = token_dlg("GIOLAVDIP")) != -1)
s.giolavdip = m.get_int(dlg);
// set importo CPA
if ((dlg = token_dlg("IMPCPA")) != -1)
s.impcpa = m.get_real(dlg);
// set somme regime convenzionale
if ((dlg = token_dlg("SOMREGCONV")) != -1)
s.somregconv = m.get_real(dlg);
// set percentuale contributo 10%
if ((dlg = token_dlg("ALQIMP10")) != -1)
s.alqimp10 = m.get_real(dlg);
// set codice contributo 10%
if ((dlg = token_dlg("COD10")) != -1)
s.cod10 = m.get(dlg);
// set utili pagati
if ((dlg = token_dlg("UTPAGATI")) != -1)
s.utpagati = m.get_real(dlg);
// set utili spettanti
if ((dlg = token_dlg("UTSPETT")) != -1)
s.utspett = m.get_real(dlg);
// set ritenuta utili pagati
if ((dlg = token_dlg("RITUTPAG")) != -1)
s.ritutpag = m.get_real(dlg);
// set ritenuta utili spettanti
if ((dlg = token_dlg("RITUTSPE")) != -1)
s.ritutspe = m.get_real(dlg);
// set numero quote
if ((dlg = token_dlg("NQUOTE")) != -1)
s.nquote = m.get_real(dlg);
// set somme non sogg.ritenuta
if ((dlg = token_dlg("SOMNSRIT")) != -1)
s.somnsrit = m.get_real(dlg);
// set ammontare lordo
if ((dlg = token_dlg("AMMLORDO")) != -1)
s.ammlordo = m.get_real(dlg);
// set quota provvigioni
if ((dlg = token_dlg("QUOTAPROV")) != -1)
s.quotaprov = m.get_real(dlg);
// set imponibile al netto ritenute
if ((dlg = token_dlg("IMPNETTO")) != -1)
s.impnetto = m.get_real(dlg);
// set compenso al netto ritenute
if ((dlg = token_dlg("COMNETTO")) != -1)
s.comnetto = m.get_real(dlg);
// set numero versamento collegato
if ((dlg = token_dlg("NUMVERS")) != -1)
s.numvers = m.get_long(dlg);
return s;
}
void TSchedaPercipienti::from_struct_to_mask(Pag_struct& s, TMask& m)
{
// reperisco la Token_string pilota
TToken_string columns(pilot_sheet());
// identificatore del token all'interno della maschera
int dlg;
// set data pagamento
if ((dlg = token_dlg("DATAPAG")) != -1)
m.set(dlg, s.datapag);
// set imponibile
if ((dlg = token_dlg("IMPONIBILE")) != -1)
m.set(dlg, s.imponibile);
// set percentuale ritenuta
if ((dlg = token_dlg("PERC")) != -1)
m.set(dlg, s.perc);
// set ritenuta
if ((dlg = token_dlg("RITENUTA")) != -1)
m.set(dlg, s.ritenuta);
// set compenso
if ((dlg = token_dlg("COMPENSO")) != -1)
m.set(dlg, s.compenso);
// set compenso netto
if ((dlg = token_dlg("NETTO")) != -1)
m.set(dlg, s.netto);
// set spesa
if ((dlg = token_dlg("SPESA")) != -1)
m.set(dlg, s.spesa);
// set contr.10% percipiente
if ((dlg = token_dlg("CTSSNPERC")) != -1)
m.set(dlg, s.ctssnperc);
// set contr.10% complessivo
if ((dlg = token_dlg("CTSSNCOMP")) != -1)
m.set(dlg, s.ctssncomp);
// set ritenuta lorda
if ((dlg = token_dlg("RITLORDA")) != -1)
m.set(dlg, s.ritlorda);
// set contributi obbligatori
if ((dlg = token_dlg("CONTROBB")) != -1)
m.set(dlg, s.controbb);
// set detrazioni famigliari
if ((dlg = token_dlg("DETFAMIL")) != -1)
m.set(dlg, s.detfamil);
// set detrazioni lavoro dipendente
if ((dlg = token_dlg("DETLAVDIP")) != -1)
m.set(dlg, s.detlavdip);
// set totale detrazioni
if ((dlg = token_dlg("TOTDET")) != -1)
m.set(dlg, s.totdet);
// set giorni lavoro dipendente
if ((dlg = token_dlg("GIOLAVDIP")) != -1)
m.set(dlg, s.giolavdip);
// set importo CPA
if ((dlg = token_dlg("IMPCPA")) != -1)
m.set(dlg, s.impcpa);
// set somme regime convenzionale
if ((dlg = token_dlg("SOMREGCONV")) != -1)
m.set(dlg, s.somregconv);
// set percentuale contributo 10%
if ((dlg = token_dlg("ALQIMP10")) != -1)
m.set(dlg, s.alqimp10);
// set codice contributo 10%
if ((dlg = token_dlg("COD10")) != -1)
m.set(dlg, s.cod10);
// set utili pagati
if ((dlg = token_dlg("UTPAGATI")) != -1)
m.set(dlg, s.utpagati);
// set utili spettanti
if ((dlg = token_dlg("UTSPETT")) != -1)
m.set(dlg, s.utspett);
// set ritenuta utili pagati
if ((dlg = token_dlg("RITUTPAG")) != -1)
m.set(dlg, s.ritutpag);
// set ritenuta utili spettanti
if ((dlg = token_dlg("RITUTSPE")) != -1)
m.set(dlg, s.ritutspe);
// set numero quote
if ((dlg = token_dlg("NQUOTE")) != -1)
m.set(dlg, s.nquote);
// set somme non sogg.ritenuta
if ((dlg = token_dlg("SOMNSRIT")) != -1)
m.set(dlg, s.somnsrit);
// set ammontare lordo
if ((dlg = token_dlg("AMMLORDO")) != -1)
m.set(dlg, s.ammlordo);
// set quota provvigioni
if ((dlg = token_dlg("QUOTAPROV")) != -1)
m.set(dlg, s.quotaprov);
// set imponibile al netto ritenute
if ((dlg = token_dlg("IMPNETTO")) != -1)
m.set(dlg, s.impnetto);
// set compenso al netto ritenute
if ((dlg = token_dlg("COMNETTO")) != -1)
m.set(dlg, s.comnetto);
// set numero versamento collegato
if ((dlg = token_dlg("NUMVERS")) != -1)
m.set(dlg, s.numvers);
}
Pag_struct& TSchedaPercipienti::clear_struct(Pag_struct& s)
{
s.datapag = NULLDATE;
s.imponibile = ZERO;
s.perc = ZERO;
s.ritenuta = ZERO;
s.compenso = ZERO;
s.netto = ZERO;
s.numvers = -1L;
s.spesa = ZERO;
s.ctssnperc = ZERO;
s.ctssncomp = ZERO;
s.ritlorda = ZERO;
s.controbb = ZERO;
s.detfamil = ZERO;
s.detlavdip = ZERO;
s.totdet = ZERO;
s.giolavdip = 0;
s.impcpa = ZERO;
s.somregconv = ZERO;
s.alqimp10 = ZERO;
s.cod10 = "";
s.utpagati = ZERO;
s.utspett = ZERO;
s.ritutpag = ZERO;
s.ritutspe = ZERO;
s.nquote = ZERO;
s.somnsrit = ZERO;
s.ammlordo = ZERO;
s.quotaprov = ZERO;
s.impnetto = ZERO;
s.comnetto = ZERO;
return s;
}
Pag_struct& TSchedaPercipienti::calcola_riga_pag(Pag_struct& s,
Pag_struct& c,
bool force,
const real h_PercAssImp,
const real h_PercCassaPrev,
const real h_PercRitenuta,
const real h_PercInps,
const real h_PercAssImpInps,
const real h_PercCommitInps)
{
const int fdec = TCurrency::get_firm_dec();
// azzera struttura di valori calcolati
clear_struct(c);
// calcolo CPA
c.impcpa = (s.compenso * h_PercCassaPrev) / (100.00 + h_PercCassaPrev);
c.impcpa.round(fdec);
if (s.impcpa == ZERO || force)
s.impcpa = c.impcpa;
// calcolo imponibile
c.imponibile = ((s.compenso - s.impcpa) * h_PercAssImp) / 100.00;
c.imponibile.round(fdec);
if (s.imponibile == ZERO || force)
s.imponibile = c.imponibile;
// percentuale ritenuta acconto
if (s.perc == ZERO || force)
s.perc = h_PercRitenuta;
// calcolo ritenuta lorda
c.ritlorda = (s.imponibile * s.perc) / 100.00;
c.ritlorda.round(fdec);
s.ritlorda = c.ritlorda;
// calcolo totale detrazioni
c.totdet = s.detfamil + s.detlavdip;
if (abs(c.totdet) > abs(s.ritlorda))
c.totdet = s.ritlorda;
s.totdet = c.totdet;
// calcolo ritenuta
c.ritenuta = s.ritlorda - s.totdet;
if (s.ritenuta == ZERO || force)
s.ritenuta = c.ritenuta;
// percentuale assoggettamento Inps
if (s.alqimp10 == ZERO || force)
s.alqimp10 = h_PercAssImpInps;
// calcolo contributo Inps complessivo
c.ctssncomp = (((s.compenso * s.alqimp10) / 100.00) * h_PercInps) / 100.00;
c.ctssncomp.round(fdec);
if (s.ctssncomp == ZERO || force)
s.ctssncomp = c.ctssncomp;
// calcolo contributo Inps del percipiente
if (h_PercCommitInps == ZERO)
c.ctssnperc = s.ctssncomp - ((s.ctssncomp * 2) / 3);
else
c.ctssnperc = s.ctssncomp - ((s.ctssncomp * h_PercCommitInps) / 100.00);
c.ctssnperc.round(fdec);
if (s.ctssnperc == ZERO || force)
s.ctssnperc = c.ctssnperc;
// calcolo utili pagati
if (abs(s.utpagati) > abs(s.imponibile))
s.utpagati = s.imponibile;
// calcolo ritenute utili pagati
c.ritutpag = (s.utpagati * s.perc) / 100.00;
c.ritutpag.round(fdec);
if (s.ritutpag == ZERO || force)
s.ritutpag = c.ritutpag;
if (abs(s.ritutpag) > abs(s.ritenuta))
s.ritutpag = s.ritenuta;
// calcolo utili spettanti
s.utspett = s.imponibile - s.utpagati;
// calcolo ritenute utili spettanti
s.ritutspe = s.ritenuta - s.ritutpag;
// calcolo compenso netto
s.netto = s.compenso + s.spesa - s.ritenuta - s.ctssnperc;
// calcolo somme non soggette a ritenuta
s.somnsrit = s.compenso - s.imponibile + s.spesa - s.impcpa - s.somregconv;
// calcolo ammontare lordo
s.ammlordo = s.imponibile + s.somnsrit + s.controbb + s.somregconv;
// calcolo quota provvigioni
s.quotaprov = s.somnsrit - s.spesa;
// calcolo imponibile al netto delle ritenute
s.impnetto = s.imponibile - s.ritenuta;
// calcolo compenso al netto delle ritenute
s.comnetto = s.compenso - s.ritenuta;
s.numreg = c.numreg;
return s;
}
TSheet_field& TSchedaPercipienti::enable_pag_sheet(TMask& m, const TString& quadro) const
{
TSheet_field* s = NULL;
TSheet_field& s_C = (TSheet_field&)m.field(F_PAGAMENTI_C);
if (quadro == "SC" || quadro == "SE")
{
s_C.show();
s = &s_C;
}
else s_C.hide();
TSheet_field& s_F = (TSheet_field&)m.field(F_PAGAMENTI_D);
if (quadro == "SF" || quadro == "SG")
{
s_F.show();
s = &s_F;
}
else s_F.hide();
// abilito sheet di default nel caso il quadro non fosse uno dei previsti
if (s == NULL)
{
s_C.show();
s = &s_C;
}
return *s;
}
void TSchedaPercipienti::set_pag_handler(TSheet_field& s) const
{
// aggancio handler notify dei pagamenti
s.set_notify(pags_notify);
// aggancio handler data pagamento
int dlg = token_dlg("DATAPAG");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler imponibile
dlg = token_dlg("IMPONIBILE");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler percentuale ritenuta
dlg = token_dlg("PERC");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler ritenuta
dlg = token_dlg("RITENUTA");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler compensi
dlg = token_dlg("COMPENSO");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler spesa
dlg = token_dlg("SPESA");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler contributo Inps percipiente
dlg = token_dlg("CTSSNPERC");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler contributo Inps complessivo
dlg = token_dlg("CTSSNCOMP");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler contributi obbligatori
dlg = token_dlg("CONTROBB");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler detrazioni familiari a carico
dlg = token_dlg("DETFAMIL");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler contributo Inps complessivo
dlg = token_dlg("DETLAVDIP");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler CPA
dlg = token_dlg("IMPCPA");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler contributo Inps complessivo
dlg = token_dlg("SOMREGCONV");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler percentuale assogg.imponibile Inps
dlg = token_dlg("ALQIMP10");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler utili pagati
dlg = token_dlg("UTPAGATI");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler ritenute utili pagati
dlg = token_dlg("RITUTPAG");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler numero quote
dlg = token_dlg("NQUOTE");
if (dlg != -1) s.sheet_mask().set_handler(dlg, pag_standard_handler);
// aggancio handler button azzera
s.sheet_mask().set_handler(DLG_AZZERAPAG, pag_azzera);
}
void TSchedaPercipienti::build_causqua_items(TMask& m, const TString& quadro) const
{
// reference al campo causale quadro
TEdit_field& f_causqua = m.efield(F_CAUSQUA);
// refernce allo sheet del campo causale quadro
TString_array& Items = f_causqua.sheet()->rows_array();
// rimuovo tutti gli items
Items.destroy();
// genero i nuovi items
if (quadro == "SC")
for (int i=0; ITEMS_SC[i]; i++)
Items.add(ITEMS_SC[i]);
if (quadro == "SE")
for (int i=0; ITEMS_SE[i]; i++)
Items.add(ITEMS_SE[i]);
if (quadro == "SF")
for (int i=0; ITEMS_SF[i]; i++)
Items.add(ITEMS_SF[i]);
if (quadro == "SG")
for (int i=0; ITEMS_SG[i]; i++)
Items.add(ITEMS_SG[i]);
if (quadro == "LA")
for (int i=0; ITEMS_LA[i]; i++)
Items.add(ITEMS_LA[i]);
}
int SchedaPerc (int argc, char* argv[])
{
TSchedaPercipienti a;
a.run(argc, argv, "Scheda Percipienti");
return 0;
}