// 770100.cpp - Scheda percipienti #include #include #include #include #include #include "scperc.h" #include "rver.h" #include "rpag.h" #include "perc.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", "DATAPAG|COMPENSO|IMPCPA|IMPONIBILE|PERC|RITENUTA|SPESA|SOMREGCONV|NETTO|SOMNSRIT|AMMLORDO|QUOTAPROV|IMPNETTO|COMNETTO|NUMVERS", }; // 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", (long) codditta); _rpag->put("TIPOA", tipoa); _rpag->put("CODANAGR", (long) 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); 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]; TString16 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); 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 bool trovato = FALSE; 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)); } } m.set(F_NPROG, trovato ? nprog : nprog+1); return variazione ? trovato : TRUE; } 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(); TString16 codanagr(f.get()); if (codanagr.not_empty()) { if (!app().esiste_perc(f.mask(), codanagr)) return f.warning_box("Percipiente non valido"); setta_nprog(m, variazione, codanagr); } // faccio a mano decodifica del percipiente // perchè l'automatismo non funziona long tmp_codanagr = atol(codanagr); TString16 tmp_tipoa = f.mask().get(F_TIPOA); TString80 tmp_ragsoc = app().get_ragsoc(tmp_tipoa, tmp_codanagr); f.mask().set(F_RAGSOCPER, tmp_ragsoc); f.mask().set(F_RAGSOCCOM, tmp_ragsoc); } 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, "Selezione Pagamenti", "@1|Data@11|Compenso@16|Ritenuta@16|", 0,NULL_WIN,5); set_search_field(F_CODANAGRPERC); // simulo una chiamata da contabilità // (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("F"); // s.add(30010); // s.add(1); // s.add("1"); // s.add("01-01-1996"); // 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("Creo 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()); 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); } 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"); // 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ò è necessario per attivare lo sheet corretto quando // si esce/entra dalle singole schede TSheet_field& pags = pag_sheet_enabled(m,TRUE); pags.destroy(); for (int 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; irewrite(); 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(); for (int i = 0; i < rows.items(); 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à dei dati semplicemente // registrando la scheda) 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); } // 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 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; 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; }