#include #include #include #include #include #include "cg2100.h" #include "cg2102.h" /////////////////////////////////////////////////////////// // Maschere per colori /////////////////////////////////////////////////////////// class TRow_mask : public TMask { public: virtual void update(); TRow_mask(); virtual ~TRow_mask() { } }; class TColor_mask : public TVariable_mask { HIDDEN TRow_mask* _sheet_mask; HIDDEN TMask* get_mask(int, TMask&) { return _sheet_mask; } protected: static bool color_handler(TMask_field& f, KEY k); static bool reset_handler(TMask_field& f, KEY k); public: void get_cur_colors(COLOR& back, COLOR& fore) const; void set_cur_colors(COLOR back, COLOR fore); TColor_mask(); virtual ~TColor_mask(); }; /////////////////////////////////////////////////////////// // TRow_mask /////////////////////////////////////////////////////////// TRow_mask* TColor_mask::_sheet_mask = NULL; TRow_mask::TRow_mask() : TMask("cg2100k", 1) { } void TRow_mask::update() { TSheet_field* s = get_sheet(); TColor_mask& m = (TColor_mask&)s->mask(); COLOR back, fore; m.get_cur_colors(back, fore); _pixmap = TRUE; set_pen(COLOR_BLACK); RCT rct; field(100).get_rect(rct); set_brush(back); frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0); field(99).get_rect(rct); set_brush(fore); frame(rct.left, 2*rct.top - rct.bottom - CHARY/2, rct.right, rct.top - CHARY/2, 0); _pixmap = FALSE; } /////////////////////////////////////////////////////////// // TColor_mask /////////////////////////////////////////////////////////// void TColor_mask::get_cur_colors(COLOR& back, COLOR& fore) const { TSheet_field& s = (TSheet_field&)fld(0); TToken_string& row = s.row(s.selected()); const char tipo = row[5]; app().type2colors(tipo, back, fore); } void TColor_mask::set_cur_colors(COLOR back, COLOR fore) { TSheet_field& s = (TSheet_field&)fld(0); int cur = s.selected(); TToken_string& row = s.row(cur); const char tipo = row[5]; app().set_type_colors(tipo, back, fore); s.set_back_and_fore_color(back, fore, cur); s.force_update(cur); } bool TColor_mask::color_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { TMask& m = f.mask(); TColor_mask& cm = (TColor_mask&)m.get_sheet()->mask(); COLOR back, fore; cm.get_cur_colors(back, fore); const bool use_back = f.dlg() == 100; const COLOR col = choose_color(use_back ? back : fore, m.win()); if (col != COLOR_INVALID) { if (use_back) back = col; else fore = col; cm.set_cur_colors(back, fore); cm._sheet_mask->update(); m.set_focus(); } } return TRUE; } bool TColor_mask::reset_handler(TMask_field& f, KEY k) { if (k == K_SPACE && f.yesno_box(TR("Si desidera azzerare tutti i colori?"))) { app().reset_colors(); TSheet_field& s = f.mask().sfield(101); s.set_back_and_fore_color(NORMAL_BACK_COLOR, NORMAL_COLOR, -1); s.force_update(); } return TRUE; } TColor_mask::TColor_mask() : TVariable_mask("cg2100k") { set_handler(102, reset_handler); CHECK(_sheet_mask == NULL, "One color at time, please"); _sheet_mask = new TRow_mask; _sheet_mask->set_handler(99, color_handler); _sheet_mask->set_handler(100, color_handler); TVariable_sheet_field& s = (TVariable_sheet_field&)fld(0); s.set_getmask(get_mask); const char* const tipi = "TFSIDNAPRCGLKX"; const char* const desc[] = { TR("Tot. doc./sdo partite"), TR("Ritenute fiscali"), TR("Ritenute sociali"), TR("Generata (Imponibile)"), TR("IVA detraibile"), TR("IVA non detraibile"), TR("Abbuoni attivi"), TR("Abbuoni passivi"), TR("Ritenute professionali"), TR("Differenza cambi"), TR("Spese"), TR("Contropartita spese"), TR("Riga Cliente/Fornitore"), TR("Riga Collegata") }; TPrimanota_application& a = app(); int row = 0; int d = 0; for (const char* c = tipi; *c; c++, d++) { COLOR back, fore; a.type2colors(*c, back, fore); TToken_string& riga = s.row(-1); riga << TR("Riga ") << *c << " - " << desc[d]; s.set_back_and_fore_color(back, fore, row++); } } TColor_mask::~TColor_mask() { delete _sheet_mask; _sheet_mask = NULL; } /////////////////////////////////////////////////////////// // Gestione righe colorate /////////////////////////////////////////////////////////// void TPrimanota_application::load_colors() { TConfig conf(CONFIG_USER, "cg2"); TAssoc_array& colori = (TAssoc_array&)conf.list_variables(); for (THash_object* o = colori.get_hashobj(); o; o = colori.get_hashobj()) { const TString& key = o->key(); if (key.len() == 7 && key.compare("Color", 5, TRUE) == 0) { const COLOR col = conf.get_color(key); TString* strcol = new TString(15); strcol->format("%ld", col); _colori.add(key.mid(5), strcol); } } } void TPrimanota_application::save_colors() { TConfig conf(CONFIG_USER, "cg2"); TString16 tmp; for (THash_object* o = _colori.get_hashobj(); o; o = _colori.get_hashobj()) { tmp = "Color"; tmp << o->key(); const COLOR col = atol((TString&)o->obj()); bool should_delete = FALSE; if (tmp[5] == 'B') should_delete = (col == NORMAL_BACK_COLOR); else should_delete = (col == NORMAL_COLOR); if (should_delete) conf.remove(tmp); else conf.set_color(tmp, col); } } COLOR TPrimanota_application::type2color(char tipor, char tipoc) { COLOR col; if (tipor > ' ') { const char key[3] = { tipoc, tipor, '\0' }; TString* colstr = (TString*)_colori.objptr(key); if (colstr == NULL) { colstr = new TString(8); if (tipor == 'X') colstr->format("%ld", tipoc == 'B' ? FOCUS_BACK_COLOR : FOCUS_COLOR); else colstr->format("%ld", tipoc == 'B' ? NORMAL_BACK_COLOR : NORMAL_COLOR); _colori.add(key, colstr); } col = atol(*colstr); } else { col = tipoc == 'B' ? NORMAL_BACK_COLOR : NORMAL_COLOR; } return col; } void TPrimanota_application::set_type_color(char tipor, char tipoc, COLOR col) { if (tipor > ' ') { const char key[3] = { tipoc, tipor, '\0' }; TString* colstr = (TString*)_colori.objptr(key); if (colstr == NULL) { colstr = new TString(8); _colori.add(key, colstr); } colstr->format("%ld", col); } } void TPrimanota_application::type2colors(char tipor, COLOR& back, COLOR& fore) { back = type2color(tipor, 'B'); fore = type2color(tipor, 'F'); } void TPrimanota_application::set_type_colors(char tipor, COLOR back, COLOR fore) { set_type_color(tipor, 'B', back); set_type_color(tipor, 'F', fore); } void TPrimanota_application::reset_colors() { _colori.destroy(); } void TPrimanota_application::set_colors() { disable_menu_item(M_FONT); TColor_mask colors; if (colors.run() == K_ENTER) app().save_colors(); else app().load_colors(); enable_menu_item(M_FONT); } /////////////////////////////////////////////////////////// // Gestione cambiamento prorata /////////////////////////////////////////////////////////// bool TPrimanota_application::test_prorata() { if (iva() != iva_acquisti || !cgs().shown() || _as400) return true; bool esistono_righe_senza_tipo_detrazione = false; const TString_array& righe_iva = ivas().rows_array(); for (int r = 0; r < righe_iva.items(); r++) { const TToken_string& row = righe_iva.row(r); real imp_det, iva_det, imp_ind, iva_ind; get_importi_iva(row, imp_det, iva_det, imp_ind, iva_ind); if (!iva_det.is_zero()) { esistono_righe_senza_tipo_detrazione = true; break; } } bool ok = true; if (esistono_righe_senza_tipo_detrazione) { int annodoc = _msk[2]->get_date(F_DATADOC).year(); if (annodoc < 1900) annodoc = _msk[2]->get_int(F_ANNOIVA); const bool prorata100 = causale().reg().prorata100(annodoc); const bool esiste_riga_iva_detraibile = type2pos('D') >= 0; if (prorata100) ok = !esiste_riga_iva_detraibile; else ok = esiste_riga_iva_detraibile; } return ok; } bool TPrimanota_application::aggiusta_prorata() { TWait_cursor hourglass; if (test_prorata()) return FALSE; TRegistro& reg = causale().reg(); int annodoc = _msk[2]->get_date(F_DATADOC).year(); if (annodoc < 1900) annodoc = _msk[2]->get_int(F_ANNOIVA); const real prorata_attuale = reg.prorata(annodoc); const real vecchio_prorata = prorata_attuale < 100.0 ? 100.0 : 0.0; TSheet_field& iva_sheet = ivas(); TString_array& righe_iva = iva_sheet.rows_array(); TToken_string oldrow(128); for (int i = 0; i < righe_iva.items(); i++) { TToken_string& r = righe_iva.row(i); if (!r.empty_items()) { oldrow = r; // Memorizza riga iva reg.set_prorata(annodoc, vecchio_prorata); iva_notify(iva_sheet, i, K_SPACE); r.add("", 0); r.add("", 3); // Simula l'azzeramento degli importi iva_notify(iva_sheet, i, K_ENTER); // Simula uscita dalla riga reg.set_prorata(annodoc, prorata_attuale); iva_notify(iva_sheet, i, K_SPACE); r = oldrow; // Simula riscrittura importi iva_notify(iva_sheet, i, K_ENTER); // Simula uscita dalla riga } else break; } return TRUE; } bool TPrimanota_application::prorata_handler(TMask_field& f, KEY k) { if (k == K_SPACE) { if (app().aggiusta_prorata()) f.hide(); } return TRUE; }