diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp index b50d4279e..006ab8e0e 100755 --- a/ca/ca3700.cpp +++ b/ca/ca3700.cpp @@ -142,14 +142,6 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event disable(F_PANDES1_FIN + k); } break; - case DLG_PREVIEW: - if (e == fe_button) - { - _print_mode = 'A'; - stop_run(K_ENTER); - return false; - } - break; case DLG_EXPORT: if (e == fe_button) { @@ -280,7 +272,7 @@ protected: bool valid_record(const TRelation& rel) const; virtual void set_custom_filter(TCursor& cur) const; - void crea_righe_da_rmovana(TLocalisamfile& tmp, TLog_report& log); + void crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log); void crea_righe_da_rdoc(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, TLog_report& log); void crea_trr(const TFilename& trr) const; void scrive_riga(TLocalisamfile& tmp, const TRectype& rmovana, const TRectype& movana, const TDocumento* doc, @@ -1162,7 +1154,8 @@ void TPrint_rendiconto_ca_recordset::scrive_riga_speciale(TLocalisamfile& tmp, c //scanning delle righe dei movimenti di analitica -void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, TLog_report& log) +void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, const TPrint_rendiconto_ca_mask& msk, + TLog_report& log) { TRelation rel_rmovana(LF_RMOVANA); rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG"); //aggiunge le testate x avere tipi mov e descr @@ -1179,16 +1172,28 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rmovana(TLocalisamfile& tmp, } TString filtro; + TDate dal, al; - if (_dadata.ok()) - filtro << "(ANSI(DATACOMP)>=" << _dadata.date2ansi() << ")"; - if (_adata.ok() && !_vitaintera) //se vitaintera non si può avere una data limite superiore - { - if (filtro.not_empty()) - filtro << "&&"; + //se siamo fortunati l'anno si può trovare così.. + int anno = msk.get_int(F_ANNO); + if (anno > 0) + { + TEsercizi_contabili esc; + esc.code2range(anno, dal, al); + } + if (_dadata.ok()) + dal = _dadata; + if (!_vitaintera) + { + if (_adata.ok()) + al = _adata; + } + else + al = TDate(); + + + filtro << "BETWEEN(DATACOMP," << dal.date2ansi() << ',' << al.date2ansi() << ')'; - filtro << "(ANSI(DATACOMP)<=" << _adata.date2ansi() << ")"; - } if (_codcosto.not_empty()) { @@ -1290,6 +1295,8 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con dardoc.put(RDOC_PROVV, 'D'); ardoc.put(RDOC_PROVV, 'D'); + TDate dal, al; + //se siamo fortunati l'anno si può trovare così.. int anno = msk.get_int(F_ANNO); if (anno > 0) @@ -1305,15 +1312,24 @@ void TPrint_rendiconto_ca_recordset::crea_righe_da_rdoc(TLocalisamfile& tmp, con anno = _dadata.year(); } - if (_dadata.ok()) - filtro_date << "(ANSI(33->DATADOC)>=" << _dadata.date2ansi() << ")"; - if (_adata.ok() && !_vitaintera) //se vitaintera non si può avere una data limite superiore - { - if (filtro_date.not_empty()) - filtro_date << "&&"; + if (anno > 0) + { + TEsercizi_contabili esc; + esc.code2range(anno, dal, al); + } + if (_dadata.ok()) + dal = _dadata; + if (!_vitaintera) + { + if (_adata.ok()) + al = _adata; + } + else + al = TDate(); - filtro_date << "(ANSI(33->DATADOC)<=" << _adata.date2ansi() << ")"; - } + + filtro_date << "BETWEEN(33->DATADOC," << dal.date2ansi() << ',' << al.date2ansi() << ')'; + TContabilizzazione_analitica cont_anal; //oggetto necessario per contabilizzare il documento in osservazione @@ -1596,7 +1612,7 @@ void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& //metodi per riempire il file da cui generare il report //dati estratti dalle righe movimenti di contabilita' analitica - crea_righe_da_rmovana(tmp, log); + crea_righe_da_rmovana(tmp, msk, log); //dati estratti dalle righe documenti crea_righe_da_rdoc(tmp, msk, log); @@ -1676,13 +1692,24 @@ void TPrint_rendiconto_ca::incrementa(TToken_string& riga, const int col, const void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int first_level, const TString& cod_cms_cdc, const real importi[5][4], real importi_totali[5][4]) { + const int posizione_importi = first_level == LF_COMMESSE ? 5 : 2; //crea una token string su cui mettere i valori dei record letti dal file .dbf TToken_string riga(512, '\t'); riga.add(cod_cms_cdc); //decodifica della commessa/cdc (non è ammessa una commessa "TOTALI" che lo incasina if (cod_cms_cdc != "TOTALI") - riga.add(cache().get(first_level, cod_cms_cdc, "DESCRIZ")); + { + const TRectype& rec = cache().get(first_level, cod_cms_cdc); + const TString& descrizione = rec.get("DESCRIZ"); + riga.add(descrizione); + if (first_level == LF_COMMESSE) + { + riga.add(rec.get(COMMESSE_DATAINIZIO)); + riga.add(rec.get(COMMESSE_DATAFINE)); + riga.add(rec.get(COMMESSE_DATAPROR)); + } + } //in base al valore di indbil e budget i valori degli importi vengono posizionati nel record for (int indbil = 1; indbil <= 4; indbil++) @@ -1690,10 +1717,10 @@ void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int firs int col = 0; switch (indbil) { - case 1: col = 16; break; //attività - case 2: col = 23; break; //passività - case 3: col = 2; break; //costi - case 4: col = 9; break; //ricavi + case 1: col = posizione_importi + 14; break; //attività + case 2: col = posizione_importi + 21; break; //passività + case 3: col = posizione_importi; break; //costi + case 4: col = posizione_importi + 7; break; //ricavi default: break; } @@ -1715,7 +1742,7 @@ void TPrint_rendiconto_ca::esporta_csv_row(ostream& file_to_date, const int firs riga.add(da_fatturare.string(), col + 6); } //scrive in excel mode - for (int i = 2; i < 30; i++) + for (int i = posizione_importi; i < posizione_importi + 28; i++) { const real r = riga.get(i); if (!r.is_zero()) @@ -1882,6 +1909,8 @@ void TPrint_rendiconto_ca::main_loop() file_xls.add("rendiconto.xls"); ofstream file_to_date(file_xls); + const int posizione_importi = first_level == LF_COMMESSE ? 5 : 2; + //intestazione primaria TToken_string intestazione_1(512, '\t'); //l'intestazione primaria dipende anche dalla configurazione dei livelli! @@ -1889,6 +1918,9 @@ void TPrint_rendiconto_ca::main_loop() { intestazione_1.add("Commessa"); intestazione_1.add("Descr. commessa"); + intestazione_1.add("Data inizio"); + intestazione_1.add("Data fine"); + intestazione_1.add("Data proroga"); recset_key = 2; //chiave del recordset per commessa } else //cdc-commessa @@ -1917,8 +1949,7 @@ void TPrint_rendiconto_ca::main_loop() //intestazione secondaria TToken_string intestazione_2(512, '\t'); //campi descrittivi iniziali vuoti (solo intestazione_1) - for (int k = 0; k < 2; k++) - intestazione_2.add(""); + intestazione_2.add(" ", posizione_importi - 1); for (int l = 0; l < 4; l++) { @@ -2002,13 +2033,8 @@ void TPrint_rendiconto_ca::main_loop() if (log.recordset()->items() > 0) log.preview(); - if (key == K_ENTER) //stampa o anteprima - { - if (mask.print_mode() == 'A') - book.preview(); - else - book.print(); - } + if (key == K_ENTER) + book.print_or_preview(); //stampa il book dei report } //while(true)... delete _msk; diff --git a/ca/ca3883.cpp b/ca/ca3883.cpp index d034e2dbf..bf53fa295 100755 --- a/ca/ca3883.cpp +++ b/ca/ca3883.cpp @@ -1,5 +1,7 @@ #include +#include "../ve/velib.h" + #include "calib01.h" #include "calib02.h" #include "ca3883.h" @@ -1317,6 +1319,115 @@ void TPrint_saldana_recordset::parse_rmovana(TAssoc_array* cms, const TDate& dat } +int TPrint_saldana_recordset::numerazioni_ordini(TString_array& num_ordini, TString_array& tip_ordini) const +{ + //i documenti che vanno presi in cosiderazione sono quelli che generano un IMPEGNATO secondo le auree regole del.. + //..nostro invincibile Adolf! + //quindi dapprima trova i TIPI ordine, poi le NUMERAZIONI che li contengono; alla fine passa entrambi gli array + num_ordini.destroy(); + tip_ordini.destroy(); + + //cominciamo con i tipi + TISAM_recordset tipi_recset("USE %TIP\nSELECT I1=3"); + for (bool ok = tipi_recset.move_first(); ok; ok = tipi_recset.move_next()) //giro sui vari tipi ordine + { + const TString4 tipo = tipi_recset.cursor()->curr().get("CODTAB"); + tip_ordini.add(tipo); + } + + //e adesso cerca le numerazioni che contengono tipi ordine + TISAM_recordset num_recset("USE %NUM"); + for (bool ok = num_recset.move_first(); ok; ok = num_recset.move_next()) //giro sui vari tipi numerazione + { + const TString4 codtab = num_recset.get("CODTAB").as_string(); + const TCodice_numerazione& numerazione = cached_numerazione(codtab); + for (int t = numerazione.ntipi_doc() - 1; t >= 0; t--) + { + const TString& tipo_doc = numerazione.tipo_doc(t); + if (tip_ordini.find(tipo_doc) >= 0) + { + num_ordini.add(codtab); + break; + } + } //for (int t = codnum.. + } //for (bool ok = num_recset... + + return num_ordini.items(); +} + + +//aggiorna l'arrayone cms con le righedoc non ancora contabilizzate +void TPrint_saldana_recordset::parse_rdoc(TAssoc_array* cms, const TDate& datainiesc) +{ + //solo le numerazioni con almeno un tipo documento ordine interessano + TString_array num_ordini, tip_ordini; + const int numerazioni_tipo_ordine = numerazioni_ordini(num_ordini, tip_ordini); + + for (int n = 0; n < numerazioni_tipo_ordine; n++) + { + TString4 codnum = num_ordini.row(n); + + //cerca tutte le righe documento che soddisfano i numerosi (fin troppo) parametri + //joina DOC perchè abbiamo un decisivo filtro sul range di date + TString query; + query << "USE RDOC KEY 3\n"; + + query << "SELECT (BETWEEN(DOC.DATADOC, #DATAINIES, #DATACALCOLO))"; + + //filtro su cdc/cms/fasi (fatto come per saldi e rmovana; purtroppo non si può metodizzare perchè in tutti i files.. + //..i nomi dei campi sono diversi! + switch (_tipostampa) + { + case 1: + case 4: + if (_fase.full()) + query << "&&(FASCMS=\"" << _fase << "\")\n"; + break; + case 2: + case 8: + if (_cdc.full()) + query << "&&(CODCOSTO=\"" << _cdc << "\")\n"; + break; + case 3: + if (_fase.full() || _cdc.full()) + { + if (_fase.full() && _cdc.full()) + query << "&&(FASCMS=\"" << _fase << "\")&&(CODCOSTO=\"" << _cdc << "\")\n"; + else + { + if (_fase.full()) + query << "&&(FASCMS=\"" << _fase << "\")\n"; + else + query << "&&(CODCOSTO=\"" << _cdc << "\")\n"; + } + } + break; + } + + query << "JOIN DOC INTO PROVV=='D' ANNO==ANNO CODNUM==CODNUM\nFROM PROVV='D' ANNO=#ANNO CODNUM=#CODNUM\nTO PROVV='D' ANNO=#ANNO CODNUM=#CODNUM"; + TISAM_recordset recset(query); + recset.set_var("#ANNO", (long)_datacalcolo.year()); + recset.set_var("#CODNUM", codnum); + recset.set_var("#DATAINIES", datainiesc); + recset.set_var("#DATACALCOLO", _datacalcolo); + + const TRecnotype recset_items = recset.items(); + + //simpatica progind per intrattenere l'utonto + TProgind pi(recset_items, "Scansione documenti...", true, true); + + for (bool ok = recset.move_first(); ok; ok = recset.move_next()) //giro sulle varie rdoc... + { + //aggiornamento progind intrattenitiva + pi.addstatus(1); + if (pi.iscancelled()) + break; + } + + } //for (int n = 0; n < numerazioni... + +} + //metodo principale di riempimento degli array da mandare in stampa void TPrint_saldana_recordset::create_lines_to_print(const TString& query) { @@ -1339,15 +1450,16 @@ void TPrint_saldana_recordset::create_lines_to_print(const TString& query) { if ((_datacalcolo < datafinesc) && !_vitaintera) { + // 2_a) calcolo dei saldi da righe movimenti analitici e quindi senza saldana parse_rmovana(cms, datainiesc, datafinesc); + + // 2_b) calcolo dei saldi da documenti non ancora contabilizzati e quindi senza movana e saldana + parse_rdoc(cms, datainiesc); } //if((_datacalcolo