#include #include #include #include #include #include #include "pd6342500a.h" #include "../ca/calib01.h" #include "../ca/calib02.h" #include "../ca/commesse.h" #include "../ca/fasi.h" #include "../ca/pconana.h" #include "../ca/saldana.h" #include "../ve/velib.h" #define FIRST_ROW 5 #define FIRST_COL 2 #define CHAR_RANGE ('Z' - 'A' + 1) #define ROW2SHEET(r) (FIRST_ROW + r) const COLOR header_back[] = {COLOR_CADETBLUE, COLOR_GREEN, COLOR_BLUE, COLOR_GREY, COLOR_SALMON, COLOR_YELLOW} ; static const char * col2string(int col) { TString & tmp = get_tmp_string(4); int c2 = col + FIRST_COL; int c1 = c2 / CHAR_RANGE - 1; if (c1 >= 0) { tmp << (char) (c1 + 'A'); c2 %= CHAR_RANGE; } tmp << (char) (c2 + 'A'); return tmp; } static const char * stringify(TString & s) { s.insert("\""); s << '"'; return s; } bool _english_excel = false; static const TString& sum_formula(int ci, int ri, int cf, int rf) { TString& tmp = get_tmp_string(); tmp << '=' << (_english_excel ? "SUM" : "SOMMA") << '(' << col2string(ci) << ROW2SHEET(ri) << ':' << col2string(cf) << ROW2SHEET(rf) << ')'; return tmp; } class TBilancio_recset : public TCSV_recordset { int dett_length; int tot_lenght; TBit_array _tot_rows; TBit_array _tot_rows_ind; TBit_array _tot_gen; TRecnotype _tot_fin; int _group[200]; public: TBit_array & tot_rows() { return _tot_rows;} TBit_array & tot_gen() { return _tot_gen;} virtual bool get_attr(int column, TAttributes & attr, bool header = false) const; TBilancio_recset(const TMask & m); }; bool TBilancio_recset::get_attr(int column, TAttributes & attr, bool header) const { const TRecnotype rowno = current_row(); if ((rowno == 0L || header)) { if (column > 1) { COLOR bkg = COLOR_RED; if ((unsigned int)column < columns() - 1) { const int header_colors = sizeof(header_back) / sizeof(header_back[0]); bkg = header_back[_group[column-2] % header_colors]; } COLOR frg = (grayed_color(bkg)&0xFF)>0x80 ? COLOR_BLACK : COLOR_WHITE; attr.set_background(bkg); attr.set_foreground(frg); return true; } else return false; } else if (_tot_rows[rowno] || _tot_rows_ind[rowno]) { attr.set_background(COLOR_CADETBLUE); attr.set_foreground(COLOR_BLACK); return true; } else if (_tot_gen[rowno]) { attr.set_background(COLOR_YELLOW); attr.set_foreground(COLOR_BLACK); return true; } else if (_tot_fin == rowno) { attr.set_background(COLOR_RED); attr.set_foreground(COLOR_BLACK); return true; } return TCSV_recordset::get_attr(column, attr); } TBilancio_recset::TBilancio_recset(const TMask & m) : TCSV_recordset("CSV(;)\n") { set_separator(';'); _english_excel = m.get_bool(F_INGLESE); TString esercizio = m.get(F_ANNO); const TDate al = m.get_date(F_ADATA); const TDate & dal = esercizi().esercizio(m.get_int(F_ANNO)).inizio(); word tipo = _saldanal_consuntivo ; if (!al.ok()) tipo |= _saldanal_ultima_imm; TAssoc_array kcol; TString_array colkeys; TAssoc_array krow; TString_array rowkeys; TToken_string key; TString codcms; TString codfase; TString colname(30); TString conto; TString last_conto; const TMultilevel_code_info& info = ca_multilevel_code_info(LF_PCONANA); TString query; query << "USE " << LF_SALDANA < "\n"; query << "FROM " << SALDANA_ANNO << "=" << stringify(esercizio) << "\n"; query << "TO " << SALDANA_ANNO << "=" << stringify(esercizio); TISAM_recordset recset(query); const int tot_length = info.len(0) + info.len(1); const int dett_length = tot_length + info.len(2); for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { const TString & cms = recset.get(SALDANA_COMMESSA).as_string(); if (cms.full()) { key = cms; const TString & fsc = recset.get(SALDANA_FASE).as_string(); if (fsc.full()) { key.add(fsc); if (kcol.objptr(key) == NULL) kcol.add(key, key); } } const TString & bill = recset.get(SALDANA_CONTO).as_string(); if (bill.full() && krow.objptr(bill) == NULL) krow.add(bill, bill); } kcol.get_keys(colkeys); colkeys.sort(); krow.get_keys(rowkeys); rowkeys.sort(); destroy_column(); const int ncols = colkeys.items(); create_column("Conto"); create_column("Descrizione"); TToken_string cmskey = colkeys.row(0); TString last_cms = cmskey.get(0); int group = 0; for (int i = 0; i < ncols; i++) { cmskey = colkeys.row(i); TString cms = cmskey.get(0); if (last_cms != cms) { last_cms = cms; group++; } _group[i] = group; colname = cmskey; colname.replace('|', '-'); create_column(colname, _realfld); } create_column("Totale", _realfld); TRecnotype sheet_row = new_rec(""); TString descr; for (int c = 0; c < ncols; c++) { cmskey = colkeys.row(c); const TString cms = cmskey.get(0); const TString fase = cmskey.get(); descr.cut(0); descr << cache().get(LF_COMMESSE, cms, COMMESSE_DESCRIZ); descr << "-" << cache().get(LF_FASI, cmskey, FASI_DESCRIZ); set(c + 2, descr); } set(ncols + 2, " "); long start_rec = -1; const int nrows = rowkeys.items(); TProgind p(nrows * 2, TR("Calcolo Saldi")); TAnal_bill bill; for (int r = 0; r < nrows; r++) { if (!p.addstatus(1)) break; conto = rowkeys.row(r); conto = conto.left(dett_length); bill.set_conto(conto); if (conto.left(tot_length) != last_conto.left(tot_length)) { if (start_rec != -1) { sheet_row = new_rec(); set(0, last_conto.left(tot_length)); set(1, cache().get(LF_PCONANA, last_conto.left(tot_length), PCONANA_DESCR)); for (int i = 0; i < ncols - 1; i++) set(i+2, sum_formula(i, start_rec, i, sheet_row-1)); set(ncols+2, sum_formula(0, sheet_row, ncols-1, sheet_row)); _tot_rows.set(sheet_row); new_rec(); } start_rec = sheet_row + 1; last_conto = conto; } sheet_row = new_rec(); set(0, conto); set(1, cache().get(LF_PCONANA, conto, PCONANA_DESCR)); for (int c = 0; c < ncols; c++) { TToken_string & colkey = colkeys.row(c); bill.set_commessa(colkey.get(0)); bill.set_fase(colkey.get()); const TSaldanal & saldo = ca_saldo(bill, dal, al, tipo); TImporto imp = saldo._ini; imp += saldo._dare; imp += saldo._avere; imp -= saldo._iniind; imp -= saldo._dareind; imp -= saldo._avereind; if (!imp.is_zero()) { imp.normalize('A'); set(c + 2, imp.valore()); } } set(ncols + 2, sum_formula(0, sheet_row, ncols-1, sheet_row)); } if (start_rec != -1) { sheet_row = new_rec(); set(0, last_conto.left(tot_length)); set(1, cache().get(LF_PCONANA, last_conto.left(tot_length), PCONANA_DESCR)); for (int i = 0; i < ncols - 1; i++) set(i + 2, sum_formula(i, start_rec, i, sheet_row-1)); set(ncols + 2, sum_formula(0, sheet_row, ncols-1, sheet_row)); _tot_rows.set(sheet_row); new_rec(); } sheet_row = new_rec() ; set(1, "Totale Diretti"); TString expr; for (int c = 0; c < ncols; c++) { expr.cut(0); for (int j = _tot_rows.first_one(); j <= _tot_rows.last_one(); j++) if (_tot_rows[j]) expr << ((j == _tot_rows.first_one()) ? '=' : '+') << col2string(c) << ROW2SHEET(j); set(c + 2, expr); set(ncols + 2, sum_formula(0, sheet_row, ncols - 1,sheet_row)); } _tot_gen.set(sheet_row); new_rec(); start_rec = -1; last_conto.cut(0); for (int r = 0; r < nrows; r++) { if (!p.addstatus(1L)) break; conto = rowkeys.row(r); conto = conto.left(dett_length); bill.set_conto(conto); if (conto.left(tot_length) != last_conto.left(tot_length)) { if (start_rec != -1) { sheet_row = new_rec(); set(0, last_conto.left(tot_length)); set(1, cache().get(LF_PCONANA, last_conto.left(tot_length), PCONANA_DESCR)); for (int i = 0; i < ncols - 1; i++) set(i + 2, sum_formula(i, start_rec, i,sheet_row-1)); set(ncols + 2, sum_formula(0, sheet_row, ncols - 1,sheet_row)); _tot_rows_ind.set(sheet_row); new_rec(); } start_rec = sheet_row + 1; last_conto = conto; } sheet_row = new_rec(); set(0, conto); set(1, cache().get(LF_PCONANA, conto, PCONANA_DESCR)); for (int c = 0; c < ncols; c++) { TToken_string & colkey = colkeys.row(c); bill.set_commessa(colkey.get(0)); bill.set_fase(colkey.get()); const TSaldanal & saldo = ca_saldo(bill, dal, al, tipo); TImporto imp = saldo._iniind; imp += saldo._dareind; imp += saldo._avereind; if (!imp.is_zero()) { imp.normalize('A'); set(c + 2, imp.valore()); } } set(ncols + 2, sum_formula(0, sheet_row, ncols - 1,sheet_row)); } if (start_rec != -1) { sheet_row = new_rec(); set(0, last_conto.left(tot_length)); set(1, cache().get(LF_PCONANA, last_conto.left(tot_length), PCONANA_DESCR)); for (int i = 0; i < ncols - 1; i++) set(i + 2, sum_formula(i, start_rec, i,sheet_row-1)); set(ncols + 2, sum_formula(0, sheet_row, ncols - 1,sheet_row)); _tot_rows_ind.set(sheet_row); new_rec(); } sheet_row = new_rec(); set(1, "Totale Indiretti"); for (int c = 0; c < ncols; c++) { TString expr; for (int j = _tot_rows_ind.first_one(); j <= _tot_rows_ind.last_one(); j++) if (_tot_rows_ind[j]) expr << ((j == _tot_rows_ind.first_one()) ? '=' : '+') << col2string(c) << ROW2SHEET(j); set(c + 2, expr); } set(ncols + 2, sum_formula(0, sheet_row, ncols - 1,sheet_row)); _tot_gen.set(sheet_row); new_rec(); sheet_row = new_rec(); set(1, "Totale"); for (int c = 0; c < ncols; c++) { TString expr; for (int j = _tot_gen.first_one(); j <= _tot_gen.last_one(); j++) if (_tot_gen[j]) expr << ((j == _tot_gen.first_one()) ? '=' : '+') << col2string(c) << ROW2SHEET(j); set(c + 2, expr); } set(ncols + 2, sum_formula(0, sheet_row, ncols - 1,sheet_row)); _tot_fin = sheet_row; } /////////////////////////////////////////////////////////// // TSaldi_ana_msk /////////////////////////////////////////////////////////// class TSaldi_ana_msk: public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: TSaldi_ana_msk() : TAutomask("pd6342500a") {} }; bool TSaldi_ana_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch(o.dlg()) { case DLG_FINDREC: default: break; } return true; } /////////////////////////////////////////////////////////// // TSaldi_ana_app /////////////////////////////////////////////////////////// class TSaldi_ana_app: public TSkeleton_application { protected: virtual bool check_autorization() const {return false;} virtual const char * extra_modules() const {return "ca";} virtual void main_loop(); }; void TSaldi_ana_app::main_loop() { TSaldi_ana_msk m; bool running = true; while(m.run() == K_ENTER) { TBilancio_recset b(m); TFilename fname(m.get(F_PATH)); fname.add(m.get(F_NAME)); if (fname.full()) { b.save_as(fname, fmt_unknown); xvt_sys_goto_url(fname, "open"); } } } int pd6342500(int argc, char* argv[]) { TSaldi_ana_app app; app.run(argc, argv, TR("Saldi Analitici")); return 0; }