#include "cg5500.h" #include #include #include #include #include #include #include #include #include #include #include "cg5500a.h" const char* Visliq_app::itoname(int m) { const char* mn; if (m == 13) return "Annuale"; if (_freqviva == "M") return itom(m); switch(m) { case 3: mn = "1 Trimestre"; break; case 6: mn = "2 Trimestre"; break; case 9: mn = "3 Trimestre"; break; case 12: mn = "4 Trimestre"; break; } return mn; } void Visliq_app::set_freqviva() { if (look_lia()) _freqviva = _lia->get("S7"); else { TLocalisamfile ditte(LF_NDITTE,TRUE); ditte.zero(); ditte.put("CODDITTA", get_firm()); ditte.read(); _freqviva = ditte.get("FREQVIVA"); } } bool Visliq_app::create() { TApplication::create(); _firm = get_firm(); TDate oggi(TODAY); _year = oggi.year(); _nditte = new TRelation(LF_NDITTE); _ditte = new TArray_sheet(-1, -1, 0, 0, "Selezione Ditte", "Cod.@5|Ragione Sociale@50|Vers."); _del = new TTable("%DEL"); _lia = new TTable("%LIA"); _lim = new TTable("LIM"); _del_r = &(_del->curr()); _lim_r = &(_lim->curr()); _del_ditta = new TRecfield(*_del_r,"CODTAB",0,4); _del_anno = new TRecfield(*_del_r,"CODTAB",5,8); _del_mese = new TRecfield(*_del_r,"CODTAB",9,10); _del_tipo = new TRecfield(*_del_r,"CODTAB",11,11); _lim_anno = new TRecfield(*_lim_r,"CODTAB",0,3); _lim_mese = new TRecfield(*_lim_r,"CODTAB",4,6); begin_wait(); build_nomiditte(); build_ditte_sheet(); end_wait(); dispatch_e_menu(BAR_ITEM(1)); return TRUE; } bool Visliq_app::destroy() { delete _lim_mese; delete _lim_anno; delete _del_tipo; delete _del_mese; delete _del_ditta; delete _lim_r; delete _del_r; delete _lim; delete _del; delete _ditte; delete _nditte; return TApplication::destroy(); } bool Visliq_app::ch_year_handler(TMask_field& f, KEY key) { if (key == K_TAB && f.focusdirty()) { app().begin_wait(); app().set_year(f.get()); app().build_nomiditte(); app().build_ditte_sheet(); app().reset_fields(); app().end_wait(); } return TRUE; } void Visliq_app::build_ditte_sheet() { // build sheet _ditte->destroy(); for (int i = 0; i < _nomiditte.items(); i++) { TToken_string* d = new TToken_string(64); *d = (TToken_string&)_nomiditte[i]; const char vers = d->get_char(2); bool selectable = vers == '?'; const long pos = _ditte->add(d); if (selectable) _ditte->disable(pos); } } void Visliq_app::reset_fields() { _mask->field(F_CODDITTA).set(""); _mask->field(F_RAGSOC).set(""); } void Visliq_app::build_nomiditte() { _nomiditte.destroy(); // ricostruire _nomiditte e rifare build_ditte_sheet TLocalisamfile& dt = _nditte->lfile(); TString fr(2); TTable lia("%LIA"); for (dt.first(); !dt.eof(); dt.next()) { // check no archivi fr = "??"; bool good = prefhndl->exist(dt.get_long("CODDITTA")); if (good) { // check no parametri liquidazione lia.put("CODTAB", format("%05ld%d",dt.get_long("CODDITTA"),_year)); if (lia.read() != NOERR) good = FALSE; else fr = lia.get("S7"); } TToken_string* d = new TToken_string(64); // add record d->add(dt.get("CODDITTA")); d->add(dt.get("RAGSOC")); d->add(fr); _nomiditte.add(d); } } void Visliq_app::set_mask_freq(TMask& m) { if (_freqviva == "M") { m.show(F_MONTHS); m.hide(F_TRIMS); } else { m.hide(F_MONTHS); m.show(F_TRIMS); } } bool Visliq_app::sheet_action(int r, KEY k) { // non si possono cancellare o aggiungere righe return (k != K_DEL && k != K_INS); } bool Visliq_app::vers_action(int r, KEY k) { // non si possono cancellare o aggiungere righe return (k != K_DEL && k != K_INS); } const char* Visliq_app::link_handler(TMask& m, int n, const char* txt, bool doubleclick) { // con click visualizza, con double click modifica TString st(txt); bool iscred = FALSE; static int group; int firstfoc; if (group != 0) m.hide(group); if (st.find("rimborso") != -1) { group = -1; firstfoc = F_RIMBORSO; } else if (st.find("debito") != -1 || st.find("credito") != -1) { group = -2; firstfoc = F_RETTIFICA; } else if (st.find("acconto") != -1) { group = -3; firstfoc = F_ACCONTO; } else if (st.find("Versamenti") != -1) { group = -4; firstfoc = F_DELDATE; } m.show(group); m.enable(group); if (doubleclick) m.field(firstfoc).set_focus(); return NULL; } bool Visliq_app::menu(MENU_TAG m) { if (m == BAR_ITEM(1)) return vis_liq(); return TApplication::menu(m); } // handlers bool Visliq_app::set_ditta(TMask_field& f, KEY k) { bool found = TRUE; if (k == K_TAB && f.focusdirty()) { found = FALSE; TString ditta = f.get(); TArray_sheet* sh = app().get_ditte_sheet(); for (int i = 0; i < sh->items(); i++) { TToken_string& row = sh->row(i); if (ditta == row.get(0)) { if (sh->enabled(i)) { f.mask().field(F_CODDITTA).set(row.get(0)); f.mask().field(F_RAGSOC).set(row.get(1)); app().set_freqviva(row.get(2)); app().set_mask_freq(f.mask()); found = TRUE; } else { f.reset(); beep(); } break; } } } return found; } bool Visliq_app::set_ragsoc(TMask_field& f, KEY k) { bool found = TRUE; if (k == K_TAB && f.focusdirty()) { found = FALSE; TString ditta = f.get(); TArray_sheet* sh = app().get_ditte_sheet(); for (int i = 0; i < sh->items(); i++) { TToken_string& row = sh->row(i); TString ts(row.get(1)); if (ts.find(ditta) != -1) { if (sh->enabled(i)) { f.mask().field(F_CODDITTA).set(row.get(0)); f.mask().field(F_RAGSOC).set(row.get(1)); app().set_freqviva(row.get(2)); app().set_mask_freq(f.mask()); found = TRUE; break; } } } } return found; } bool Visliq_app::sel_mese_sh1 (TMask_field& f, KEY k) { if (k != K_SPACE) return TRUE; TMask& m = *(app().get_main_mask()); TSheet_field& sh = (TSheet_field&)m.field(F_VISLIQ1); int month = sh.selected()+1; TToken_string& tt = sh.row(sh.selected()); if (sh.items() == 4) month *= 3; app().vis_one(month); app().look_lim(month); app().update_sheet_row(tt); TMask& sm = sh.sheet_mask(); sm.field(103).set(tt.get(2)); sm.field(104).set(tt.get(3)); sm.field(105).set(tt.get(4)); sm.field(106).set(tt.get(5)); sm.field(107).set(tt.get(6)); sh.force_update(); return TRUE; } bool Visliq_app::sel_mese_sh2 (TMask_field& f, KEY k) { if (k != K_SPACE) return TRUE; TMask& m = *(app().get_main_mask()); TSheet_field& sh = (TSheet_field&)m.field(F_VISLIQ2); int month = sh.selected()+1; if (sh.items() == 4) month *= 3; app().vis_one(month); return TRUE; } void Visliq_app::update_sheet_row(TToken_string& t) { t.add(abs(_lim->get_real("R0")).string(),2); t.add((_lim->get_real("R0")).sign() >= 0 ? "D" : "C", 3); t.add((_lim->get_real("R1")).string(),4); t.add(abs(_lim->get_real("R5")).string(),5); t.add((_lim->get_real("R5")).sign() >= 0 ? "D" : "C", 6); } bool Visliq_app::vis_liq() { long ditta = get_firm(); set_freqviva(); KEY k; TMask m("cg5500a"); _mask = &m; m.set_handler(F_CODDITTA, set_ditta); m.set_handler(F_RAGSOC, set_ragsoc); m.set_handler(F_YEAR, ch_year_handler); set_mask_freq(m); _year = m.get_int(F_YEAR); while ((k = m.run()) != K_ESC) { if (k == DLG_SELECT) { if (_ditte->run() == K_ENTER) { TToken_string& row = _ditte->row(_ditte->selected()); m.field(F_CODDITTA).set(row.get(0)); m.field(F_RAGSOC).set(row.get(1)); set_freqviva(row.get(2)); set_mask_freq(m); } } else if (k == K_ENTER) { long dtt = m.get_long(F_CODDITTA); set_firm(dtt); int month = m.get_int(_freqviva == "M" ? F_MONTHS : F_TRIMS); if (month == 0) vis_all(); else vis_one(month); _mask = &m; } } set_firm(ditta); return FALSE; } bool Visliq_app::vis_all() { if (!look_lia()) return FALSE; // mask diverse per trimestrale e annuale TMask m(_freqviva == "M" ? "cg5500b" : "cg5500c"); TString abi(5); TString cab(5); TString cnc(5); _mask = &m; TSheet_field& sh = (TSheet_field&)m.field(F_VISLIQ1); TSheet_field& sv = (TSheet_field&)m.field(F_VISLIQ2); _liq_sheet = &sh; _vers_sheet = &sv; // disabilita aggiunta/eliminazione righe sh.set_notify(sheet_action); // qui occorre modificare le deleghe sv.set_notify(vers_action); sh.sheet_mask().set_handler(101,sel_mese_sh1); sv.sheet_mask().set_handler(101,sel_mese_sh2); m.field(F_CREDPREC).set(_lia->get_real("R0").string()); // set sheet for (int i = 1; i <= 12; i++) { if (!is_month_ok(i)) continue; if (!look_lim(i)) { sh.row(i-1) = *(new TToken_string("||||||")); sh.disable_cell(i-1, -1); continue; } TToken_string* tt = new TToken_string(80); tt->add(""); // questo e' il bottone tt->add(itoname(i)); tt->add(abs(_lim->get_real("R0")).string()); tt->add(_lim->get_real("R0").sign() < 0 ? "C" : (_lim->get_real("R1").sign() > 0 && _lim->get_real("R0").is_zero() ? "C" : "D")); tt->add(_lim->get_real("R1").string()); tt->add(abs(_lim->get_real("R5")).string()); tt->add(_lim->get_real("R5").sign() < 0 ? "C" : "D"); sh.row(i-1) = (*tt); } // calcola versamenti real versamenti[13]; TDate date[13]; TToken_string banche[13]; for (_del->first(); !_del->eof(); _del->next()) { if (atol(*_del_ditta) != get_firm() || atoi(*_del_anno) != _year) continue; // uso solo deleghe normali (tipo == 1) e acconti (tipo == 7) int tipod = atoi(*_del_tipo); if (tipod != 1 && tipod != 7) continue; // somma versamenti nel mese adeguato int m = atoi(*_del_mese); if (m >= 12) m = tipod == 7 ? 12 : 13; versamenti[m-1] += _del->get_real("R0") + _del->get_real("R1"); date[m-1] = _del->get_date("D0"); banche[m-1].add(_del->get("S7"),0); banche[m-1].add(_del->get("S8"),1); banche[m-1].add(_del->get("S9"),2); } TString nomemese(26); for (i = 1; i <= 13; i++) { if (!is_month_ok(i)) continue; TToken_string* tt = new TToken_string(80); nomemese = itoname(i == 13 ? 12 : i); if (i == 12) nomemese << " acconto"; if (i == 13) nomemese << " saldo"; tt->add(""); // questo e' il bottone tt->add(nomemese); // mese tt->add(date[i-1].string()); // data vers. tt->add(banche[i-1].get(0)); // azienda tt->add(banche[i-1].get(1)); // dipendenza tt->add(banche[i-1].get(2)); // concessionaria tt->add(versamenti[i-1].string());// versamenti sv.row(i-1) = (*tt); } sh.enable_column(0, FALSE); sv.enable_column(0, FALSE); // save initial rows _vers_rows = sv.rows_array(); _liq_rows = sh.rows_array(); KEY k = m.run(); bool save = k == K_SAVE; bool asked = save; if (k != K_ESC) { if (m.field(F_CREDPREC).dirty()) { real r(m.get(F_CREDPREC)); if (!asked && !save) { save = yesno_box("Modifiche non registrate: salvare?"); asked = TRUE; } if (save) { _lia->put("R0",r); _lia->rewrite(); if (look_lim(1)) { _lim->put("B0",""); _lim->rewrite(); } } } // check modifiche liquidazione for (int i = 0; i < _liq_rows.items(); i++) { // compare sheet row with previous TToken_string& tt = sh.row(i); TToken_string& ot = (TToken_string&)_liq_rows[i]; real rmb1(tt.get(4)), rmb2(ot.get(4)), rtt1(tt.get(5)), rtt2(ot.get(5)); char deb1 = tt.get_char(6), deb2 = ot.get_char(6); bool modified = (rmb1 != rmb2 || rtt1 != rtt2 || deb1 != deb2); if (modified) { if (!asked && !save) { save = yesno_box("Modifiche non registrate: salvare?"); asked = TRUE; } if (save) { int month = i + 1; if (sh.items() == 4) month *= 3; look_lim(month); _lim->put("R1", rmb1); if (deb1 == 'C') rtt1 = -rtt1; _lim->put("R5", rtt1); _lim->put("S7", deb1); _lim->put("B0", ""); _lim->rewrite(); } } } // check modifiche versamenti for (i = 0; i < _vers_rows.items(); i++) { // compare sheet row with previous TToken_string& tt = sv.row(i); TToken_string& ot = (TToken_string&)_vers_rows[i]; TDate d1(tt.get(2)), d2(ot.get(2)); TString abi1(tt.get(3)), abi2(ot.get(3)), cab1(tt.get(4)), cab2(ot.get(4)), con1(tt.get(5)), con2(ot.get(5)); real imp1(tt.get(6)), imp2(ot.get(6)); bool modified = (d1 != d2 || abi1 != abi2 || cab1 != cab2 || con1 != con2 || imp1 != imp2); if (modified) { if (!asked && !save) { save = yesno_box("Modifiche non registrate: salvare?"); asked = TRUE; } if (save) { int mult = sv.items() == 4 ? 3 : 1; int month = 12; if (i < 11) month = (i+1) * mult; int type = i == 11 ? 7 : 1; look_del(month, type, TRUE); _del->put("D0", d1); _del->put("S7", abi1); _del->put("S8", cab1); _del->put("S9", con1); _del->put("R0", imp1); _del->put("R1", ""); // azzeriamo l'eventuale interesse _del->rewrite(); } } } } _mask = NULL; return TRUE; } bool Visliq_app::vis_one(int m) { begin_wait(); TMask msk("cg5500d"); bool recorded = FALSE; TString nomem("Liquidazione IVA "); nomem << itoname(m); nomem << " " << _year; // ricalcolo liquidazione TMessage msg; TFilename f; f.temp("prliq"); TToken_string body(36); body.add(_year); body.add(m); body.add(get_firm()); body.add("V"); // visualizzazione: no ff alla fine, zeri stampati body.add(""); body.add(f); TMessage msg("cg4 -2", "RCL", body); msg.send(); TBrowsefile_field& brw = (TBrowsefile_field&)msk.field(F_VISFLQ); brw.set_link_handler(link_handler); brw.enable_link("Modifica: ", 'r'); look_lim(m); real rimborso = _lim->get_real("R1"); real rettifica = _lim->get_real("R5"); TString desc1(_lim->get("S0")); TString desc2(_lim->get("S1")); real acconto; if (m == 12) { look_lia(); acconto = _lia->get_real("R4"); } msk.field(F_YEAR).set(nomem); msk.field(F_RIMBORSO).set(rimborso.string()); if (rettifica.sign() < 0) { msk.field(F_RETTIFICA).set(abs(rettifica).string()); msk.field(F_DEBCRE).set("C"); } else { msk.field(F_RETTIFICA).set(rettifica.string()); msk.field(F_DEBCRE).set("D"); } msk.field(F_DESCR1).set(desc1); msk.field(F_DESCR2).set(desc1); msk.field(F_ACCONTO).set(acconto.string()); long line; TExternal_app liq("cg4 -2"); { end_wait(); TProgind(10l,"Estrazione liquidazione: prego attendere", FALSE,FALSE); liq.run(); if (liq.error()) { beep(); return FALSE; } begin_wait(); line = brw.set_text(f, "CALCOLO LIQUIDAZIONE D'IMPOSTA"); brw.goto_pos(brw.lines()-16l, 9); real risultato = _lim->get_real("R0"); risultato += (rimborso + rettifica - acconto); TViswin* vsw = brw.vis_win(); long ll, ll2, lvers = -1; int x; int isdebt = risultato.sign(); long lrivr = vsw->search("Versamenti effettuati",x,line,TRUE); long lrisd = vsw->search("RISULTATO", x, line, TRUE); // RISULTATO a debito long lrisc = vsw->search("RISULTATO", x, lrisd+1l, TRUE); // credito if (risultato.sign()) lvers = vsw->search(isdebt < 0 ? "CREDITO ATTUALE" : "IVA DA VERSARE", x, line, TRUE); if (lvers == -1l) lvers = vsw->search("IVA A DEBITO DA NON VERSARE", x, line, TRUE); real risc(real::ita2eng(brw.get_text(lrisc,58,15))); real risd(real::ita2eng(brw.get_text(lrisd,75,15))); real vers = 0.0; TDate date(TODAY); TString cab(5), abi(5), con(5); bool is_delega = FALSE, was_delega = FALSE; if (is_delega = look_del(m,1)) { vers = _del->get_real("R0") + _del->get_real("R1"); date = _del->get_date("D0"); abi = _del->get("S7"); cab = _del->get("S8"); con = _del->get("S9"); } msk.field(F_DELDATE).set(date.string()); msk.field(F_DELIMP).set(vers.string()); msk.field(F_DELABI).set(abi); msk.field(F_DELCAB).set(cab); msk.field(F_DELCON).set(con); if (lrisd == -1l || lrisc == -1l) return FALSE; if (lvers == -1l) lvers = lrisc+1l; bool write_lia = FALSE, write_lim = FALSE, write_del = FALSE; end_wait(); for(;;) { KEY k = msk.run(); if (k == K_INS || k == K_SAVE) { real n_acconto (msk.get(F_ACCONTO)); real n_rimborso (msk.get(F_RIMBORSO)); real n_rettifica(msk.get(F_RETTIFICA)); real n_delimp(msk.get(F_DELIMP)); TString n_desc1 (msk.get(F_DESCR1)); TString n_desc2 (msk.get(F_DESCR2)); if (msk.field(F_RETTIFICA).dirty() || msk.field(F_DEBCRE).dirty()) { ll = vsw->search("Rettifiche IVA a credito",x,line,TRUE); ll2 = vsw->search("Rettifiche IVA a debito", x,line,TRUE); if (ll != -1 && ll2 != -1) { if (msk.get(F_DEBCRE) == "D") { vsw->replace(ll2, n_rettifica.string("###.###.###.###"), 75); vsw->replace(ll, " ", 58); } else { vsw->replace(ll, n_rettifica.string("###.###.###.### "), 58); vsw->replace(ll2, " ", 75); } risultato -= rettifica; // vecchia rettifica // scorporo vecchia if (rettifica.sign() > 0) risd -= rettifica; else risc += rettifica; // incorporo nuova if (msk.get(F_DEBCRE) == "C") { risc += n_rettifica; n_rettifica = -n_rettifica; } else { risd += n_rettifica; } risultato += n_rettifica; vsw->replace(lrisc, risc.string("###.###.###.###"), 58); vsw->replace(lrisd, risd.string("###.###.###.###"), 75); _lim->put("R5", n_rettifica); _lim->put("S7", msk.get(F_DEBCRE)); _lim->put("R0", risultato); set_risultato(vsw, lvers, risultato); // altro giro, altro regalo rettifica = n_rettifica; } write_lim = TRUE; } if (msk.field(F_ACCONTO).dirty()) { ll = vsw->search("Versamento acconto dicembre",x,line,TRUE); if (ll != -1) vsw->replace(ll, n_acconto.string("###.###.###.###"), 58); write_lia = TRUE; risultato += acconto; risultato -= n_acconto; risc -= acconto; risc += n_acconto; _lia->put("R4", n_acconto); _lim->put("R0", risultato); vsw->replace(lrisc, risc.string("###.###.###.###"), 58); set_risultato(vsw, lvers, risultato); } if (msk.field(F_RIMBORSO).dirty()) { ll = vsw->search("Iva chiesta a rimborso",x,line,TRUE); if (ll != -1) vsw->replace(ll, n_rimborso.string("###.###.###.###"), 75); write_lim = TRUE; risultato -= rimborso; risultato += n_rimborso; risd -= rimborso; risd += n_rimborso; _lim->put("R1", n_rimborso); _lim->put("R0", risultato); vsw->replace(lrisd, risd.string("###.###.###.###"), 75); set_risultato(vsw, lvers, risultato); } if (msk.field(F_DESCR1).dirty()) { _lim->put("S0", n_desc1); write_lim = TRUE; } if (msk.field(F_DESCR2).dirty()) { _lim->put("S1", n_desc2); write_lim = TRUE; } // delegations if (msk.field(F_DELDATE).dirty()) { if (!is_delega) { was_delega = look_del(m,1,TRUE); is_delega = TRUE; } _del->put("D0",msk.get(F_DELDATE)); write_del = TRUE; } if (msk.field(F_DELIMP).dirty()) { if (!is_delega) { was_delega = look_del(m,1,TRUE); is_delega = TRUE; } if (lrivr != -1) vsw->replace(lrivr, n_delimp.string("###.###.###.###"), 58); // per ora non modifichiamo nulla // in quanto non entrano in liquidazione // risultato += vers; // risultato -= n_delimp; // risc -= vers; // risc += n_delimp; // vsw->replace(lrisc, risc.string("###.###.###.###"), 58); // set_risultato(vsw, lvers, risultato); _del->put("R0", n_delimp); _del->put("R1", ""); write_del = TRUE; } if (msk.field(F_DELABI).dirty()) { if (!is_delega) { was_delega = look_del(m,1,TRUE); is_delega = TRUE; } _del->put("S7",msk.get(F_DELABI)); write_del = TRUE; } if (msk.field(F_DELCAB).dirty()) { if (!is_delega) { was_delega = look_del(m,1,TRUE); is_delega = TRUE; } _del->put("S8",msk.get(F_DELCAB)); write_del = TRUE; } if (msk.field(F_DELCON).dirty()) { if (!is_delega) { was_delega = look_del(m,1,TRUE); is_delega = TRUE; } _del->put("S9",msk.get(F_DELCON)); write_del = TRUE; } // end delegations if (write_lia && k == K_SAVE) _lia->rewrite(); if (write_del && k == K_SAVE) { if (!is_delega && !was_delega) _del->write(); else _del->rewrite(); } if ((write_lim || write_lia) && k == K_SAVE) { _lim->put("B0", ""); _lim->rewrite(); } if (k == K_SAVE) recorded = TRUE; if (write_lim || write_lia) vsw->refresh(); } else if (k == K_QUIT) { if ((write_lim || write_lia) && !recorded) { KEY kk = yesnocancel_box("Modifiche non registrate: salvare?"); if (kk == K_NO) break; else if (kk == K_YES) { if (write_lia) { _lia->rewrite(); _lim->put("B0", ""); _lim->rewrite(); } break; } } else break; } else if (k == K_ESC) break; } } remove(f); return recorded; } void Visliq_app::set_risultato(TViswin* vsw, long line, real& r) { TString256 ln; ln.spaces(); // does not gestisc interessi e riporti debito < 50000 if (r.sign() < 0) { ln.overwrite("CREDITO ATTUALE", 23); ln.overwrite(abs(r).string("###.###.###.###"), 58); } else if (r.sign() > 0) { ln.overwrite("IVA DA VERSARE", 23); ln.overwrite(r.string("###.###.###.###"), 75); } vsw->replace(line, ln, 0); } int cg5500(int argc, char* argv[]) { Visliq_app app; app.run(argc, argv, "Visualizzazione Liquidazione"); return 0; }