#include #include #include "../ve/velib.h" #include "ef0.h" #include "ef0100.h" #include "ef0101.h" #include #include #include "../cg/cfban.h" #include "tabutil.h" #include "utility.h" class TEffetti_mask : public TIBAN_mask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); bool on_sheet_event(TOperable_field& o, TField_event e, long jolly); void calcola_totali(); public: TEffetti_mask() : TIBAN_mask("ef0100a", F_IBAN_STATO, F_IBAN_CHECK, F_BBAN_CIN, F_CODABI, F_CODCAB, F_BBAN_CONTO, F_IBAN, F_BBAN) {} }; /////////////////////////////////////////////////////////////// // Classe per la gestione di effetti con metodi standard di: // // inserimento, modifica, cancellazione. // /////////////////////////////////////////////////////////////// class TVariazione_effetti: public TRelation_application { TMask *_msk; TEffetto *_effetto; TRelation *_rel; protected: virtual void init_query_mode(TMask&); virtual void init_insert_mode(TMask&); virtual bool get_next_key(TToken_string& key); virtual void init_modify_mode(TMask&); TSheet_field& cess_sheet() const; TSheet_field& righe_sheet() const; void common_f(const TMask& m); virtual int read(TMask& m); virtual int rewrite(const TMask& m); virtual int write(const TMask& m); virtual bool remove(); bool user_create(); bool user_destroy(); virtual TMask* get_mask(int mode) {return _msk;} virtual bool changing_mask(int mode) {return false;} virtual void ini2mask(TConfig& ini, TMask& m, bool query); public: virtual bool protected_record(TRectype&); virtual TRelation* get_relation() const {return _rel;} TVariazione_effetti(): _msk(nullptr), _effetto(nullptr), _rel(nullptr) {} virtual ~TVariazione_effetti() = default; }; // restituisce un riferimento all' applicazione inline TVariazione_effetti& app() { return (TVariazione_effetti&)main_app(); } // quando si va in query mode resetta i due campi della maschera // relativi ai totali void TVariazione_effetti::init_query_mode(TMask&) { _msk->reset(F_TOTIMP); _msk->reset(F_TOTIMPVAL); _msk->enable(F_TIPOCF); } bool TVariazione_effetti::protected_record(TRectype& rec) { return rec.get("TIPODIST").not_empty() || rec.get("NDIST").not_empty() || rec.get("NRIGADIST").not_empty(); } // quando si va in insert mode resetta i due campi della maschera relativi // ai totali, inserisce una riga vuota nello sheet e setta il flag dirty // dello sheet per forzare l'utente all'inserimento di una riga void TVariazione_effetti::init_insert_mode(TMask&) { TToken_string riga("|||||||||"); righe_sheet().row(0) = riga; righe_sheet().set_dirty(); _msk->enable(F_TIPOCF); } void TVariazione_effetti::ini2mask(TConfig& ini, TMask& m, bool query) { TRelation_application::ini2mask(ini, m, query); TToken_string & row = righe_sheet().row(0); row.add(ini.get(REFF_IMPORTO), righe_sheet().cid2index(F_IMPEFF)); row.add(ini.get(REFF_IMPORTOVAL), righe_sheet().cid2index(F_IMPEFFVAL)); row.add(ini.get(REFF_NFATT), righe_sheet().cid2index(F_NUMFATT)); row.add(ini.get(REFF_ANNO), righe_sheet().cid2index(F_ANNO)); row.add(ini.get(REFF_NUMPART), righe_sheet().cid2index(F_NUMPART)); row.add(ini.get(REFF_NRATA), righe_sheet().cid2index(F_NUMRATA)); row.add(ini.get(REFF_ACCSAL), righe_sheet().cid2index(F_ACCSAL)); } void TVariazione_effetti::init_modify_mode(TMask& m) { m.disable(F_TIPOCF); m.efield(F_IBAN_STATO).validate(K_TAB); } // ritorna il prossimo numero valido di chiave bool TVariazione_effetti::get_next_key(TToken_string& key) { TLocalisamfile& effetti = _rel->lfile(); long nprogtr = 1L; if ( !effetti.empty() ) { effetti.zero(); effetti.setkey(1); effetti.last(); if ( effetti.good() ) nprogtr += effetti.get_long(EFF_NPROGTR); } key.format("%d|%ld",F_NPROGTR,nprogtr); return true; } // ritorna un riferimento allo sheet dei cessionari TSheet_field& TVariazione_effetti::cess_sheet() const { return _msk->sfield(F_SHEET_EFF); } // ritorna un riferimento allo sheet delle righe TSheet_field& TVariazione_effetti::righe_sheet() const { return _msk->sfield(F_SHEET_RIGHE); } // metodo che permette di scivere su file i dati inseriti nella maschera; // comune alla write e alla rewrite void TVariazione_effetti::common_f(const TMask& m) { const long nprogtr = m.get_long(F_NPROGTR); m.autosave(*_rel); _effetto->head() = _rel->curr(); TSheet_field& shcess = cess_sheet(); TSheet_field& shrighe = righe_sheet(); int items = shcess.items(); _effetto->destroy_rows_c(); int ii = 1; int i; // scarico tutte le righe dei cessionari dallo sheet sul file for (i = 0; i < items; i++) { TToken_string& row = shcess.row(i); if ( row.items()== 0 ) continue; // salta le righe vuote TRectype& rec = _effetto->row_c(ii, true); row.restart(); rec.zero(); rec.put(CES_NPROGTR, nprogtr); rec.put(CES_NRIGA, ii); rec.put(CES_RAGSOC, row.get()); rec.put(CES_LOCALITA, row.get()); rec.put(CES_STATO, row.get_int()); rec.put(CES_COM, row.get()); ii++; } items = shrighe.items(); _effetto->destroy_rows_r(); ii = 1; // scarico tutte le righe dell'effetto dallo sheet sul file for (i = 0; i < items; i++) { TToken_string& row = shrighe.row(i); real imp_eff(row.get(shrighe.cid2index(F_IMPEFF))); if (imp_eff == ZERO) continue; // salta le righe con importo nullo row.restart(); TRectype& rec = _effetto->row_r(ii, true); rec.zero(); rec.put(REFF_NPROGTR, nprogtr); rec.put(REFF_NRIGATR, ii); rec.put(REFF_IMPORTO, row.get()); rec.put(REFF_IMPORTOVAL, row.get()); rec.put(REFF_CODNUM, row.get()); rec.put(REFF_PROVV, row.get()[0]); rec.put(REFF_ANNODOC, row.get_int()); rec.put(REFF_NFATT, row.get()); rec.put(REFF_DATAFATT, row.get()); rec.put(REFF_IMPFATT, row.get()); rec.put(REFF_IMPFATTVAL, row.get()); rec.put(REFF_ANNO, row.get_int()); rec.put(REFF_NUMPART, row.get()); rec.put(REFF_NRIGA, row.get_int()); rec.put(REFF_NRATA, row.get_int()); rec.put(REFF_ACCSAL, row.get()); ii++; } _effetto->renum(_effetto->numero()); } // carica nella maschera i dati dai files int TVariazione_effetti::read(TMask& m) { m.autoload(*_rel); int err = _rel->status(); if (err == NOERR) { TLocalisamfile& f = _rel->lfile(LF_EFFETTI); // legge l'effetto dal record corrente della relazione err = _effetto->read(f, _rel->curr()); if (err == NOERR) { TString16 codcom(3); TToken_string riga(80); TSheet_field& shcess = cess_sheet(); shcess.reset(); TSheet_field& shrighe = righe_sheet(); shrighe.reset(); int items = _effetto->rows_c(); // m.set(F_IBAN, _rel->curr().get(EFF_IBAN), 0x3); // carica tutti i cessionari nello sheet dal file for (int i = 1; i <= items; i++) { const TRectype& rec = _effetto->row_c(i); riga.cut(0); riga.add(rec.get(CES_RAGSOC)); riga.add(rec.get(CES_LOCALITA)); // per caricare nello sheet dei cessionari la denominazione // del comune di cui si conosce il codice codcom = rec.get(CES_STATO); codcom << '|' << rec.get(CES_COM); riga.add(codcom); const TRectype& com = cache().get(LF_COMUNI, codcom); riga.add(com.get(COM_DENCOM)); shcess.row(i-1)=riga; } items = _effetto->rows_r(); for (int i = 1; i <= items; i++) { const TRectype& rec = _effetto->row_r(i); riga.cut(0); riga.add(rec.get(REFF_IMPORTO)); riga.add(rec.get(REFF_IMPORTOVAL)); riga.add(rec.get(REFF_CODNUM)); riga.add(rec.get(REFF_PROVV)); riga.add(rec.get(REFF_ANNODOC)); riga.add(rec.get(REFF_NFATT)); riga.add(rec.get(REFF_DATAFATT)); riga.add(rec.get(REFF_IMPFATT)); riga.add(rec.get(REFF_IMPFATTVAL)); riga.add(rec.get(REFF_ANNO)); riga.add(rec.get(REFF_NUMPART)); riga.add(rec.get(REFF_NRIGA)); riga.add(rec.get(REFF_NRATA)); riga.add(rec.get(REFF_ACCSAL)); shrighe.row(i - 1) = riga; shrighe.check_row(i - 1); } } } return err; } // riscrive effetto int TVariazione_effetti::rewrite(const TMask& m) { common_f(m);// scarica i dati dalla maschera TLocalisamfile& f = _rel->lfile(LF_EFFETTI); return _effetto->rewrite(f); } // scrive i dati su file int TVariazione_effetti::write(const TMask& m) { common_f(m);// scarica i dati dalla maschera TLocalisamfile& f = _rel->lfile(LF_EFFETTI); int err = _effetto->write(f); if (err == NOERR) _rel->read();// rilegge per posizionare correttamente la relazione return err; } // rimuove l'effetto bool TVariazione_effetti::remove() { TLocalisamfile& f = _rel->lfile(LF_EFFETTI); int err = _effetto->remove(f); return err == NOERR; } // crea la relap bool TVariazione_effetti::user_create() { open_files(LF_TAB, LF_TABCOM, LF_EFFETTI, LF_REFFETTI, LF_CESS, LF_COMUNI, LF_DOC, LF_RIGHEDOC, LF_CLIFO, LF_CFVEN, LF_OCCAS, 0); _rel = new TRelation(LF_EFFETTI); _effetto = new TEffetto; _msk = new TEffetti_mask ; righe_sheet().set_append(true); return true; } // distrugge la relap bool TVariazione_effetti::user_destroy() { delete _msk; delete _effetto; delete _rel; return true; } void TEffetti_mask::calcola_totali() { TSheet_field& sf = sfield(F_SHEET_RIGHE); int items = sf.items(); real impeff, impeffval; // scandisco tutte le righe dello sheet e ne prendo gli importi // (in lire ed in valuta) e li sommo al totale for (int i = 0; i < items; i++) { impeff += sf.get_real_row_cell(i, F_IMPEFF); impeffval += sf.get_real_row_cell(i, F_IMPEFFVAL); } set(F_TOTIMP, impeff); set(F_TOTIMPVAL, impeffval); } bool TEffetti_mask::on_sheet_event(TOperable_field& o, TField_event e, long jolly) { TMask& m = o.mask(); short id = o.dlg(); switch (id) { case F_NUMFATT: if (e == fe_modify || !is_running()) { TEdit_field & ef = (TEdit_field &)o; CheckType c = ef.check_type(); ef.check_type(CHECK_REQUIRED); const bool ok = ef.check(); ef.check_type(c); m.enable(F_DATAFATT, !ok); m.enable(F_IMPFATT, !ok); m.enable(F_IMPFATTVAL, !ok && is_true_value(get(F_CODVAL))); if (is_running() && ok && e == fe_modify) { const TDocumento d(ef.browse()->cursor()->curr()); const real imp = d.totale_doc(); m.set(F_DATAFATT, d.get(DOC_DATADOC)); if (d.in_valuta()) { const TString16 codval = d.get(DOC_CODVAL); TCurrency val(imp, codval, d.get_real(DOC_CAMBIO)); val.change_to_firm_val(); const real& lit = val.get_num(); m.set(F_IMPFATT, lit); m.set(F_IMPFATTVAL, imp); } else { m.set(F_IMPFATT, imp); m.reset(F_IMPFATTVAL); } } } break; case F_SHEET_RIGHE: switch (e) { case se_leave: if (sfield(F_SHEET_RIGHE).focusdirty()) calcola_totali(); return true; case se_query_del: if (sfield(F_SHEET_RIGHE).items() == 1) return error_box(TR("IMPOSSIBILE CANCELLARE: L'effetto deve contenere almeno una riga!")); return true; break; default: break; } default: break; } return true; } bool TEffetti_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { const short id = o.dlg(); switch (id) { case F_CODCF: if (e == fe_modify) { const char tipocf = get(F_TIPOCF)[0]; const long codcf = get_long(F_CODCF); TCli_for & cf = (TCli_for &)cached_clifor(tipocf, codcf); const TString & iban = cf.get_iban(); if (iban.full()) set(F_IBAN, iban, 0x3); TToken_string& banp = cf.get_ban_pres(); if (banp.full()) { set(F_CODABIP, banp.get()); set(F_CODCABP, banp.get()); set(F_PROG, banp.get()); efield(F_PROG).validate(K_TAB); } } return true; break; case F_CODVAL: if (e == fe_init || e == fe_modify) { // se non c'e valuta o se è lire disabilitato i campi collegati const bool valuta = is_true_value(o.get()); TSheet_field& sf = sfield(F_SHEET_RIGHE); enable(-1, valuta); if (!valuta) { reset(-1); reset(F_TOTIMPVAL); for (int i = sf.items() - 1; i >= 0; i--) { TToken_string& row = sf.row(i); sf.set_row_cell(F_IMPEFFVAL, ZERO, i); sf.set_row_cell(F_IMPFATTVAL, ZERO, i); } } sf.enable_column(F_IMPEFFVAL, valuta); sf.enable_column(F_IMPFATTVAL, valuta); if (o.focusdirty()) sf.force_update(); } return true; break; case F_DATASCAD: if (e == fe_close) { const TDate datascad = get_date(F_DATASCAD); TSheet_field& sf = sfield(F_SHEET_RIGHE); FOR_EACH_SHEET_ROW(sf, r, row) { TDate datafat = row->get(F_DATAFATT - FIRST_FIELD); if (datascad < datafat) return error_box(FR("La data fattura della riga %d è successiva alla data di scadenza"), r + 1); } } return true; break; case F_MANDATO: if (e == fe_modify && !o.empty()) efield(F_IBAN).on_hit(); return true; break; case F_CAMBIO: if (e == fe_modify) { const TString& valuta = get(F_CODVAL); if (is_true_value(valuta)) { const real cambio = get_real(F_CAMBIO); TSheet_field& sf = sfield(F_SHEET_RIGHE); int items = sf.items(); // scandisco tutte le righe dello sheet e modifico gli importi in lire for (int i = 0; i < items; i++) { TCurrency val(sf.get_real_row_cell(i, F_IMPEFFVAL), valuta, cambio); val.change_to_firm_val(); sf.set_row_cell(F_IMPEFF, val.get_num(), i); } if (o.focusdirty()) sf.force_update(); } } return true; break; case F_EFFCONT: if (e == fe_init || e == fe_modify) { const bool da_contab = !get_bool(F_EFFCONT); TSheet_field& sf = sfield(F_SHEET_RIGHE); sf.enable_column(F_ANNO, da_contab); sf.enable_column(F_NUMPART, da_contab); sf.enable_column(F_NUMRIGA, da_contab); sf.enable_column(F_NUMRATA, da_contab); sf.enable_column(F_ACCSAL, da_contab); sf.force_update(); } return true; break; case F_IMPEFFVAL: case F_IMPEFF: if (e == fe_modify) sfield(F_SHEET_RIGHE).set_focusdirty(); break; case F_IBAN_STATO: if (mode() == MODE_MOD && e == fe_init) { TRelation * rel = app().get_relation(); if (rel != nullptr) { TRectype & rec = rel->lfile().curr(); if (rec.get(EFF_IBAN).empty()) { set(F_CODABI, rec.get(EFF_CODABI)); set(F_CODCAB, rec.get(EFF_CODCAB)); return true; } } } case F_SHEET_RIGHE: return on_sheet_event(o, e, jolly); default: if (jolly > 0) return on_sheet_event(o, e, jolly); break; } return TIBAN_mask::on_field_event(o, e, jolly); } /* bool TVariazione_effetti::iban_handler(TMask_field& f, KEY k) { if (f.to_check(k, true)) { TMask& m = f.mask(); const TString & iban = f.get(); m.set(F_IBAN_STATO, iban.left(2), 0x3); set_iban_fields(iban, m, F_BBAN, F_IBAN_STATO, F_IBAN_CHECK, F_BBAN_CIN, F_CODABI, F_CODCAB, F_BBAN_CONTO, -1, 0); } return true; } bool TVariazione_effetti::iso_handler(TMask_field& f, KEY k) { if (f.initial_check(k) || f.running_check(k)) { static TString __last_iso; TMask &m = f.mask(); const TString & iso = f.get(); const bool italy = iso.blank() || iso == "IT"; m.show(F_BBAN, !italy); m.show(F_BBAN_CONTO, italy); if (f.running_check(k)) { if (iso != __last_iso) { const TString iban = m.get(F_IBAN); set_iban_fields(iban.blank() || iban.left(2) != iso ? iso : iban, m, F_BBAN, F_IBAN_STATO, F_IBAN_CHECK, F_BBAN_CIN, F_CODABI, F_CODCAB, F_BBAN_CONTO, -1, 0); } __last_iso = iso; } else { enable_iban_fields(m, F_BBAN, F_BBAN_CIN, F_CODABI, F_CODCAB, F_BBAN_CONTO, -1, italy, 0); __last_iso = "INV"; } } return true; } per documenti */ int ef0100(int argc, char* argv[]) { TVariazione_effetti a ; a.run(argc, argv, TR("Effetti")); return 0; }