#include #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) 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; } 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) { if ((unsigned int) column >= columns() - 1) attr.set_background(COLOR_RED); else attr.set_background(header_back[_group[column - 2] % 6]); attr.set_foreground(COLOR_WHITE); 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(';'); 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 | _saldanal_consuntivo_indiretto; 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; int nrows = rowkeys.items(); TProgind p(nrows * 2, "Calcolo Saldi"); TAnal_bill bill; for (int r = 0; r < nrows; r++) { p.addstatus(1L); 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, format("=SUM(%s%d:%s%d)", col2string(i), ROW2SHEET(start_rec), col2string(i), ROW2SHEET(sheet_row - 1))); set(ncols + 2, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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.normalize('A'); set(c + 2, imp.valore()); } set(ncols + 2, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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, format("=SUM(%s%d:%s%d)", col2string(i), ROW2SHEET(start_rec), col2string(i), ROW2SHEET(sheet_row - 1))); set(ncols + 2, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(sheet_row))); _tot_rows.set(sheet_row); new_rec(); } sheet_row = new_rec() ; set(1, "Totale Diretti"); for (int c = 0; c < ncols; c++) { TString expr; 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, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(sheet_row))); } _tot_gen.set(sheet_row); new_rec(); start_rec = -1; last_conto.cut(0); for (int r = 0; r < nrows; r++) { p.addstatus(1L); 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, format("=SUM(%s%d:%s%d)", col2string(i), ROW2SHEET(start_rec), col2string(i), ROW2SHEET(sheet_row - 1))); set(ncols + 2, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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._ini; imp += saldo._dare; imp += saldo._avere; imp.normalize('A'); set(c + 2, imp.valore()); } set(ncols + 2, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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, format("=SUM(%s%d:%s%d)", col2string(i), ROW2SHEET(start_rec), col2string(i), ROW2SHEET(sheet_row - 1))); set(ncols + 2, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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, format("=SUM(%s%d:%s%d)", col2string(0), ROW2SHEET(sheet_row), col2string(ncols - 1), ROW2SHEET(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); } } int pd6342500(int argc, char* argv[]) { TSaldi_ana_app app; app.run(argc, argv, TR("Saldi Analitici")); return 0; }