diff --git a/ci/ci1300.cpp b/ci/ci1300.cpp index 9df6e0715..849efabdd 100755 --- a/ci/ci1300.cpp +++ b/ci/ci1300.cpp @@ -13,6 +13,35 @@ #include "rilore.h" #include "ci1300a.h" +#define _last_column 32; +/////////////////////////////////////////////////////////// +// Recordset +/////////////////////////////////////////////////////////// +class TRil_ore_recordset : public TCSV_recordset +{ +public: + TRil_ore_recordset(); +}; + +TRil_ore_recordset::TRil_ore_recordset() +: TCSV_recordset("CSV(\"|\")") +{ +} + + +/////////////////////////////////////////////////////////// +// Report +/////////////////////////////////////////////////////////// + +class TRil_ore_report : public TReport +{ +protected: + virtual bool use_mask() { return false; } + +public: + TRil_ore_report() { load("ci1300a"); } +}; + /////////////////////////////////////////////////////////// // Maschera @@ -22,6 +51,8 @@ class TRil_ore_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + + bool is_ferial_day(const TDate& data) const; long calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine) const; long calcola_giorni_lavorativi_cms(const TDate& ini_cms, const TDate& fine_cms, const TDate& dataini, const TDate& datafine, @@ -44,6 +75,13 @@ bool TRil_ore_mask::on_field_event(TOperable_field& o, TField_event e, long joll return true; } + +bool TRil_ore_mask::is_ferial_day(const TDate& data) const +{ + return data.wday() < 6 && !data.is_holiday(); +} + + long TRil_ore_mask::calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine) const { long num_giorni_lav = datafine - dataini + 1; @@ -52,13 +90,14 @@ long TRil_ore_mask::calcola_giorni_lavorativi(const TDate& dataini, const TDate& { for (TDate data = dataini; data <= datafine; ++data) { - if (data.is_holiday()) + if (!is_ferial_day(data)) num_giorni_lav--; } } return num_giorni_lav; } + long TRil_ore_mask::calcola_giorni_lavorativi_cms(const TDate& ini_cms, const TDate& fine_cms, const TDate& dataini, const TDate& datafine, TDate& inizio_lav, TDate& fine_lav) const @@ -115,23 +154,24 @@ void TRil_ore_mask::elabora_risorsa(const TString& curr_risorsa, TReport& rep) c const long rilore_recset_items = rilore_recset.items(); - TString msg; - msg << "Scansione " << curr_risorsa << ".."; - for (bool ok = rilore_recset.move_first(); ok; ok = rilore_recset.move_next()) { - const TString& codcosto = rilore_recset.get(RILORE_CODCOSTO).as_string(); - const TString& codcms = rilore_recset.get(RILORE_CODCMS).as_string(); - const TString& codfase = rilore_recset.get(RILORE_CODFASE).as_string(); + const TString80 codcosto = rilore_recset.get(RILORE_CODCOSTO).as_string(); + const TString80 codcms = rilore_recset.get(RILORE_CODCMS).as_string(); + const TString16 codfase = rilore_recset.get(RILORE_CODFASE).as_string(); + + //panegirico allucinante per riproporzionare le ore in base al mese, alla commessa, alle feste ecc. in modo da.. + //..ottenere alla fine il numero di giorni lavorativi buoni per la commessa nel mese scelto //date limite commessa const TRectype& rec_cms = cache().get(LF_COMMESSE, codcms); TDate ini_cms, fine_cms; const int durata_cms = ca_durata_commessa(rec_cms, ini_cms, fine_cms); - + //date limite qta ore sul record del file LF_RILORE TDate dataini = rilore_recset.get(RILORE_DADATA).as_date(); TDate datafine = rilore_recset.get(RILORE_ADATA).as_date(); - //adatta le date alla commessa se quest'ultima è contenuta nell'intervallo + //adatta le date alla commessa se quest'ultima è contenuta nell'intervallo (può essere più breve.. + //..dell'intervallo selezionato, oppure sovrapporsi solo parzialmente) if (fine_cms < datafine) datafine = fine_cms; if (ini_cms > dataini) @@ -146,7 +186,8 @@ void TRil_ore_mask::elabora_risorsa(const TString& curr_risorsa, TReport& rep) c TDate ini_lav, fine_lav; const long giorni_lavorativi_cms = calcola_giorni_lavorativi_cms(ini_cms, fine_cms, dataini, datafine, ini_lav, fine_lav); - //adesso deve riproporzionare il monte ore sul record sul mese selezionato + //adesso deve riproporzionare il monte ore sul record sul mese selezionato (fa tutto il lavoro se ci sono giorni.. + //..lavorativi sulla commessa in questione) if (giorni_lavorativi_cms > 0) { const real tot_ore = rilore_recset.get(RILORE_QTAORE).as_real(); @@ -180,34 +221,117 @@ void TRil_ore_mask::elabora_risorsa(const TString& curr_risorsa, TReport& rep) c { real prev = record->get(0); prev += tot_ore_uso_risorsa_nel_mese_per_cms; - record->add(prev, 0); + record->add(prev.string(), 0); } else //'C'onsuntivo (aggiorna tutte le caselle dei giorni lavorativi) { const real ore_al_giorno = tot_ore / giorni_lavorativi; - for (TData data = ini_lav; data <= fine_lav; ++data) + for (TDate data = ini_lav; data <= fine_lav; ++data) { - if (!data.is_holday()) + if (giorni_lavorativi == 1 || is_ferial_day(data)) { real prev = record->get(data.day()); prev += ore_al_giorno; - record->add(prev, data.day()); + record->add(prev.string(), data.day()); + real tot = record->get(32); + tot += ore_al_giorno; + record->add(tot.string(), 32); } } } - } //if (giorni_lavorativi_cms > 0).. } //for (bool ok = rilore_recset.move_first();.. - } + } //for (int i = 0; i < 2; i++)... //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report + TRil_ore_recordset* righe_da_stampare = new TRil_ore_recordset; + + FOR_EACH_ASSOC_OBJECT(righe, obj, key, itm) + { +#ifdef DBG + TString cazzo_key = key; + if (cazzo_key.find("4.10.146.2/2010") >= 0) + int cazzone = 1; +#endif + + TToken_string& record_ass = (TToken_string&)*itm; + real totale_c = record_ass.get(32); + totale_c.round(1); + TGeneric_distrib esso(totale_c, 1); + + for (int j = 1; j <= 31; j++) + { + real ore = record_ass.get(j); + esso.add(ore); + } + + //chiave della riga (Cms-CdC-Fase o CdC-Cms-Fase) + TToken_string linea; + linea = key; + linea.replace('|', ' '); + + // Totale preventivo + real totale_p = record_ass.get(0); + totale_p.round(1); + linea.add(totale_p.string()); + + // Totale consuntivo + for (int k = 1; k <= 31; k++) + { + const real ore_giorno = esso.get(); + const char* str_ore = ore_giorno.string(); + linea.add(str_ore, k+1); + } + + linea.add(totale_c.string()); + + //aggiunge la riga tokenstringata al csv_recordset + righe_da_stampare->new_rec(linea); + } + //ordina il recordset per chiave + righe_da_stampare->sort(); + +#ifdef DBG + righe_da_stampare->save_as_text("C:/temp/cazzone.txt"); +#endif + + //setta il recordset ordinato al report + rep.set_recordset(righe_da_stampare); + } void TRil_ore_mask::elabora() const { TReport_book book; + TRil_ore_report rep; + + //maggico giro per formattare la testata del calendario di pagina nel report + const int anno = get_int(F_ANNO); + const int mese = get_int(F_MESE); + const TDate primo_del_mese(1, mese, anno); + TDate ultimo_del_mese = primo_del_mese; + ultimo_del_mese.set_end_month(); + + TString16 code; + + for (TDate giorno = primo_del_mese; giorno <= ultimo_del_mese; ++giorno) + { + code.format("H0.%d", giorno.day() + 100); + TReport_field* rep_field = rep.field(code); + + if (rep_field != NULL) + { + if (!is_ferial_day(giorno)) + rep_field->set_back_color(COLOR_LTGRAY); + + code = itow(giorno.wday()); + code.cut(3); + code << '\n' << giorno.day(); + rep_field->set(code); + } + } //query sulla tabella interessata (risorse o attrezzature) TString16 da_ris_att, a_ris_att; @@ -246,55 +370,15 @@ void TRil_ore_mask::elabora() const const TString& curr_risorsa = recset_ris_att.cursor()->curr().get("CODTAB"); - TReport rep; - rep.load("ca1300a"); - elabora_risorsa(curr_risorsa, rep); book.add(rep); } + + //e alla fine stampa il book + book.preview(); } -/////////////////////////////////////////////////////////// -// Recordset -/////////////////////////////////////////////////////////// - -class TRil_ore_recordset : public TCSV_recordset -{ -protected: - -public: - TRil_ore_recordset(const TMask& mask); - - //virtual const TVariant& get(const char* column_name) const; - //virtual const TVariant& get(unsigned int column) const { return TCSV_recordset::get(column); } -}; - -TRil_ore_recordset::TRil_ore_recordset(const TMask& mask) -: TCSV_recordset("CSV(\"\t\")") //tab separated -{ - FOR_EACH_MASK_FIELD(mask, i, field) - { - const TFieldref* f = field->field(); - if (f != NULL) - { - const TString& name = f->name(); - set_var(name, field->get(), true); - } - } -} - -/////////////////////////////////////////////////////////// -// Report -/////////////////////////////////////////////////////////// - -class TRil_ore_report : public TReport -{ -protected: -virtual bool use_mask() { return false; } -public: - TRil_ore_report() {} -}; /////////////////////////////////////////////////////////// // Applicazione diff --git a/ci/ci1300a.rep b/ci/ci1300a.rep new file mode 100755 index 000000000..0d90730c8 --- /dev/null +++ b/ci/ci1300a.rep @@ -0,0 +1,78 @@ + + + Rilevazione ore mensili per Risorsa + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + A + + + B + + + + C + + + D + + + + E + + + F + + + + G + + + H + + + I + + + AH + +
+
+
+ \ No newline at end of file