diff --git a/ci/ci1300.cpp b/ci/ci1300.cpp index 7b630bed8..530746a07 100755 --- a/ci/ci1300.cpp +++ b/ci/ci1300.cpp @@ -69,10 +69,13 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re { const int tipo_ordinamento = get_int(F_ORDINAMENTO); const char tipo_stampa = get(F_TIPOSTAMPA)[0]; - const bool split = get_bool(F_RIPARTISCI); const int anno = get_int(F_ANNO); const int mese = tipo_stampa == 'M' ? get_int(F_MESE) : 0; + //date del periodo + TDate inizio_periodo, fine_periodo; + ci_inizio_fine_periodo(tipo_stampa, anno, mese, inizio_periodo, fine_periodo); + //creare un assoc_array con chiave TToken_string cms-sede-fase(1) o sede-cms-fase(2) in base ai parametri.. //..indicati sulla maschera //se tipo_stampa = 'M'ensile: il contenuto dell'assoc_array sarà: tot_Prev - 31 valori giornalieri Consuntivi - tot_Consuntivo @@ -96,6 +99,7 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re for (int i = 0; i < 2; i++) { const TVariant tipo = i == 0 ? "P" : "C"; + const char tipo_ora = i == 0 ? 'P' : 'C'; //serve solo per rendere comprensibili gli if( che seguono rilore_recset.set_var("#TIPO", tipo); const long rilore_recset_items = rilore_recset.items(); @@ -106,48 +110,28 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re 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(); + TDate ini_rilore = rilore_recset.get(RILORE_DADATA).as_date(); + TDate fine_rilore = rilore_recset.get(RILORE_ADATA).as_date(); - if (i == 1) - { - if (anno != rilore_recset.get(RILORE_ANNO).as_int()) - continue; - if (tipo_stampa == 'M' && mese != rilore_recset.get(RILORE_MESE).as_int()) - continue; - } - //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) - dataini = ini_cms; - //se la commessa fosse tutta nel futuro o nel passato -> lascia perdere - const long giorni_lavorativi = split ? ci_calcola_giorni_lavorativi(dataini, datafine) : 1L; + //adatta le date alla commessa se quest'ultima è contenuta nell'intervallo (può essere più breve.. + //..dell'intervallo selezionato, oppure sovrapporsi solo parzialmente) + //se sta stampando per cdc -> fine_cms e ini_cms sono vuoti se non c'è la cms e non fa la trimmatura + TDate inizio_int, fine_int; + long giorni_lavorativi = ci_calcola_giorni_lavorativi_intersezione(ini_rilore, fine_rilore, inizio_periodo, fine_periodo, + inizio_int, fine_int); + //se i giorni lavorativi non ci sono è inutile procedere if (giorni_lavorativi <= 0) continue; - //metodo semidivino per calcolare, dati l'anno ed il il mese selezionati, la commessa corrente, le date inizio e fine,.. - //..quanti sono i giorni di lavoro lavorativi per suddividere la quantità di ore - TDate ini_lav, fine_lav; - long giorni_lavorativi_cms = ci_calcola_giorni_lavorativi_cms(anno, mese, ini_cms, fine_cms, dataini, datafine, ini_lav, fine_lav); + const long giorni_lavorativi_rilore = ci_calcola_giorni_lavorativi(ini_rilore, fine_rilore); - //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 && !split && i == 1) - giorni_lavorativi_cms = giorni_lavorativi; - if (giorni_lavorativi_cms > 0) + if (giorni_lavorativi_rilore > 0) { const real tot_ore = rilore_recset.get(RILORE_QTAORE).as_real(); - const real tot_ore_uso_risorsa_nel_periodo_per_cms = tot_ore * giorni_lavorativi_cms / giorni_lavorativi; + const real tot_ore_uso_risorsa_nel_periodo = tot_ore * giorni_lavorativi / giorni_lavorativi_rilore; + //crea la chiave per l'assoc_array TToken_string key; switch(tipo_ordinamento) @@ -171,43 +155,30 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re righe.add(key, record); } - if (i == 0) //'P'reventivo (aggiorna solo il totale) + if (tipo_ora == 'P') //'P'reventivo (aggiorna solo il totale) { real prev = record->get(0); - prev += tot_ore_uso_risorsa_nel_periodo_per_cms; + prev += tot_ore_uso_risorsa_nel_periodo; record->add(prev.string(), 0); } else //'C'onsuntivo (aggiorna tutte le caselle dei giorni lavorativi) { - if (split) + const real ore_al_giorno = tot_ore / giorni_lavorativi_rilore; + for (TDate data = inizio_int; data <= fine_int; ++data) { - const real ore_al_giorno = tot_ore / giorni_lavorativi; - for (TDate data = ini_lav; data <= fine_lav; ++data) + if (giorni_lavorativi_rilore == 1 || ci_is_ferial_day(data)) { - if (giorni_lavorativi == 1 || ci_is_ferial_day(data)) - { - const int index = tipo_stampa == 'M' ? data.day() : data.month(); - real prev = record->get(index); - prev += ore_al_giorno; - record->add(prev.string(), index); - real tot = record->get(32); - tot += ore_al_giorno; - record->add(tot.string(), 32); - } + const int index = tipo_stampa == 'M' ? data.day() : data.month(); + real prev = record->get(index); + prev += ore_al_giorno; + record->add(prev.string(), index); + real tot = record->get(32); + tot += ore_al_giorno; + record->add(tot.string(), 32); } - } - else - { - const int index = tipo_stampa == 'M' ? rilore_recset.get(RILORE_GIORNO).as_int() : rilore_recset.get(RILORE_MESE).as_int(); - real prev = record->get(index); - prev += tot_ore; - record->add(prev.string(), index); - real tot = record->get(32); - tot += tot_ore; - record->add(tot.string(), 32); - } - } - } //if (giorni_lavorativi_cms > 0).. + } //for (TDate data = inizio_int.. + } //if (tipo_ora == 'P').. + } //if (giorni_lavorativi_rilore > 0).. } //for (bool ok = rilore_recset.move_first();.. } //for (int i = 0; i < 2; i++)... @@ -221,7 +192,7 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report //Il tutto nel magico metodo che segue! - ci_fill_recset_from_ass(righe, rep, split); + ci_fill_recset_from_ass(righe, rep); //campo a mano per fare scattare la mask2report() rep.recordset()->set_var("#CODRIS", curr_risorsa, true); diff --git a/ci/ci1300a.h b/ci/ci1300a.h index ac553ba22..623cca24a 100755 --- a/ci/ci1300a.h +++ b/ci/ci1300a.h @@ -13,4 +13,3 @@ #define F_MESE 212 #define F_ORDINAMENTO 213 #define F_SHOW_FASI 214 -#define F_RIPARTISCI 215 \ No newline at end of file diff --git a/ci/ci1300a.uml b/ci/ci1300a.uml index c4c17a7ae..09d7e927e 100755 --- a/ci/ci1300a.uml +++ b/ci/ci1300a.uml @@ -171,11 +171,6 @@ BEGIN FIELD #ORDINAMENTO END -BOOLEAN F_RIPARTISCI -BEGIN - PROMPT 1 19 "Ripartisci il consuntivo sul periodo" -END - ENDPAGE ENDMASK \ No newline at end of file diff --git a/ci/ci1350.cpp b/ci/ci1350.cpp index cc7d5e017..98394674c 100755 --- a/ci/ci1350.cpp +++ b/ci/ci1350.cpp @@ -56,50 +56,40 @@ long ci_calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine) return num_giorni_lav; } - -long ci_calcola_giorni_lavorativi_cms(const int anno, const int mese, const TDate& ini_cms, const TDate& fine_cms, - const TDate& dataini, const TDate& datafine, TDate& inizio_lav, TDate& fine_lav) +void ci_inizio_fine_periodo(const char tipo_stampa, const int anno, const int mese, TDate& inizio_periodo, TDate& fine_periodo) { - //se mese > 0 -> stampa per mese dettagliata per giorno, sennò stampa per anno dettagliata per mese - TDate inizio, fine; - - if (mese > 0) + if (tipo_stampa == 'M') { - //date del mese TDate ini_mese(1, mese, anno); TDate fine_mese = ini_mese; fine_mese.set_end_month(); - inizio = ini_mese; - fine = fine_mese; + inizio_periodo = ini_mese; + fine_periodo = fine_mese; } else { TDate ini_anno(1, 1, anno); TDate fine_anno(31, 12, anno); - inizio = ini_anno; - fine = fine_anno; + inizio_periodo = ini_anno; + fine_periodo = fine_anno; } - - //se la commessa non "interseca" il periodo selezionato -> finisce qui - if (fine_cms < inizio || ini_cms > fine) - return 0; - //se le date limite lavorative non "intersecano" il periodo selezionato -> finisce qui - if (datafine < inizio || dataini > fine) - return 0; - - //se è arrivato fin qui -> c'è qualcosa da considerare - //vanno prese la massima data inizio e la minima data fine - inizio_lav = fnc_max(inizio, ini_cms); - fine_lav = fnc_min(fine, fine_cms); - - //e qui si parrà l'ultima stilla di nobilitate! deve eliminare i giorni festivi dal mucchio! - return ci_calcola_giorni_lavorativi(inizio_lav, fine_lav); } +long ci_calcola_giorni_lavorativi_intersezione(const TDate& ini_1, const TDate& fine_1, const TDate& ini_2, const TDate& fine_2, + TDate& ini_int, TDate& fine_int) +{ + if ((fine_1 < ini_2) || (ini_1 > fine_2)) + return 0L; + + ini_int = fnc_max(ini_1, ini_2); + fine_int = fnc_min(fine_1, fine_2); + + return ci_calcola_giorni_lavorativi(ini_int, fine_int); +} -void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep, bool split) +void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep) { //deve informarsi sul tipo di report che è in uso const TString& rep_class = rep.get_class(); @@ -140,37 +130,22 @@ void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep, bool split) //per avere una distribuzione di ore giornaliera che faccia ritornare il totale consuntivo.. //..indipendentemente da arrotondamenti e troncamenti, si ricorre al mitico TGeneric_distrib... - if (split) + TGeneric_distrib esso(totale_c, 1); + for (int j = 1; j <= 31; j++) { - TGeneric_distrib esso(totale_c, 1); - for (int j = 1; j <= 31; j++) - { - real ore = record_ass.get(j); - esso.add(ore); - } - // ridistribuzione delle ore per giorno nel recordset - TString4 name; - - for (int k = 1; k <= 31; k++) - { - const real ore_giorno = esso.get(); - name.format("G%02d", k); - recset->set(name, ore_giorno); - } + real ore = record_ass.get(j); + esso.add(ore); } - else + // ridistribuzione delle ore per giorno nel recordset + TString4 name; + + for (int k = 1; k <= 31; k++) { - TString4 name; - - for (int k = 1; k <= 31; k++) - { - real ore = record_ass.get(k); - name.format("G%02d", k); - recset->set(name, ore); - } + const real ore_giorno = esso.get(); + name.format("G%02d", k); + recset->set(name, ore_giorno); } - //2) chiavi delle righe //chiave della riga: dipende dal tipo di report e dai parametri di fordinamento TToken_string chiave = key; diff --git a/ci/ci1350.h b/ci/ci1350.h index 5d8d44329..c8bc57e50 100755 --- a/ci/ci1350.h +++ b/ci/ci1350.h @@ -20,12 +20,13 @@ public: // e per formattare e riempire i report corrispondenti /////////////////////////////////////////////////////////////////////////////////////// +void ci_inizio_fine_periodo(const char tipo_stampa, const int anno, const int mese, TDate& inizio_periodo, TDate& fine_periodo); bool ci_is_ferial_day(const TDate& data); long ci_calcola_giorni_lavorativi(const TDate& dataini, const TDate& datafine); -long ci_calcola_giorni_lavorativi_cms(const int anno, const int mese, const TDate& ini_cms, const TDate& fine_cms, - const TDate& dataini, const TDate& datafine, TDate& inizio_lav, TDate& fine_lav); +long ci_calcola_giorni_lavorativi_intersezione(const TDate& ini_1, const TDate& fine_1, const TDate& ini_2, const TDate& fine_2, + TDate& ini_int, TDate& fine_int); -void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep, bool split); +void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep); void format_report_month(const int anno, const int mese, TReport& rep); diff --git a/ci/ci1400.cpp b/ci/ci1400.cpp index 5a0edb786..7dfeab9b3 100755 --- a/ci/ci1400.cpp +++ b/ci/ci1400.cpp @@ -12,6 +12,42 @@ #include "ci1350.h" #include "ci1400a.h" +/////////////////////////////////////////////////////////// +// Recordset +/////////////////////////////////////////////////////////// +class TRil_ore_cms_recordset : public TISAM_recordset +{ + static TString_array _ignore_list; + static bool cms_cdc_ignore(const TRelation* rel); + +protected: + virtual void set_custom_filter(TCursor& cursor) const; + +public: + void ignore(const TString_array& list) { _ignore_list = list; } + TRil_ore_cms_recordset(const char* query) : TISAM_recordset(query) {} +}; + +TString_array TRil_ore_cms_recordset::_ignore_list; + +//cerca se la commessa sulla riga di rilore in questione è nella lista.. +//..delle commesse da ignorare +bool TRil_ore_cms_recordset::cms_cdc_ignore(const TRelation* rel) +{ + const TRectype& curr_rec = rel->curr(); + const TString& curr_codcms = curr_rec.get(RILORE_CODCMS); + return _ignore_list.find(curr_codcms) < 0; +} + + +void TRil_ore_cms_recordset::set_custom_filter(TCursor& cursor) const +{ + if (!_ignore_list.empty()) + { + cursor.set_filterfunction(cms_cdc_ignore); + } +} + /////////////////////////////////////////////////////////// // Report /////////////////////////////////////////////////////////// @@ -69,45 +105,20 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport& const TVariant tipo_cms_cdc = get(F_CMSOCDC); const bool per_commessa = tipo_cms_cdc.as_string() == "C"; const char tipo_stampa = get(F_TIPOSTAMPA)[0]; - const bool split = get_bool(F_RIPARTISCI); const int anno = get_int(F_ANNO); const int mese = tipo_stampa == 'M' ? get_int(F_MESE) : 0; //date del periodo - TDate inizio, fine; - - if (tipo_stampa == 'M') - { - TDate ini_mese(1, mese, anno); - TDate fine_mese = ini_mese; - fine_mese.set_end_month(); - inizio = ini_mese; - fine = fine_mese; - } - else - { - TDate ini_anno(1, 1, anno); - TDate fine_anno(31, 12, anno); - inizio = ini_anno; - fine = fine_anno; - } - - TDate ini_cms, fine_cms; + TDate inizio_periodo, fine_periodo; + ci_inizio_fine_periodo(tipo_stampa, anno, mese, inizio_periodo, fine_periodo); TAssoc_array righe; - //query sul file delle ore in chiave 4 o 5, in base alla scelta di Cdc(4) o Cms(5): TIPO+CODCOSTO+... o TIPO+CODCMS+... + //query sul file delle ore in chiave 4 o 6, in base alla scelta di Cdc(4) o Cms(5): TIPO+CODCOSTO+... o TIPO+CODCMS+... TString query; if (per_commessa) { - const TRectype& rec_cms = cache().get(LF_COMMESSE, curr_commessa); - const int durata_cms = ca_durata_commessa(rec_cms, ini_cms, fine_cms); - - //se la commessa non "interseca" il periodo selezionato -> finisce qui -// if (split && (fine_cms < inizio || ini_cms > fine)) -// return false; - query << "USE RILORE KEY 6"; query << "\nFROM TIPO=#TIPO CODCMS=#CODICE"; query << "\nTO TIPO=#TIPO CODCMS=#CODICE"; @@ -119,13 +130,21 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport& query << "\nTO TIPO=#TIPO CODCOSTO=#CODICE"; } - TISAM_recordset rilore_recset(query); - rilore_recset.set_var("#CODICE", curr_commessa); + TRil_ore_cms_recordset rilore_recset(query); + if (curr_commessa == "_ALTRE_") + { + rilore_recset.set_var("#CODICE", ""); + const TSheet_field& lista = sfield(F_RIGHE); + rilore_recset.ignore(lista.rows_array()); + } + else + rilore_recset.set_var("#CODICE", curr_commessa); //un giro con le ore a 'P'reventivo, uno con quelle a 'C'onsuntivo for (int i = 0; i < 2; i++) { const TVariant tipo = i == 0 ? "P" : "C"; + const char tipo_ora = i == 0 ? 'P' : 'C'; //serve solo per rendere comprensibili gli if( che seguono rilore_recset.set_var("#TIPO", tipo); const long rilore_recset_items = rilore_recset.items(); @@ -135,59 +154,27 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport& const TString16 risorsa = rilore_recset.get(RILORE_CODICE).as_string(); const char tipo_ris_att = rilore_recset.get(RILORE_TIPORA).as_string()[0]; - if (i == 1) - { - if (anno != rilore_recset.get(RILORE_ANNO).as_int()) - continue; - if (tipo_stampa == 'M' && mese != rilore_recset.get(RILORE_MESE).as_int()) - continue; - } //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(); - - //se esiste la commessa nel record e sta stampando per cdc, la commessa va tenuta in considerazione per.. - //..quanto riguarda l'intervallo di date - if (!per_commessa) - { - const TString& commessa = rilore_recset.get(RILORE_CODCMS).as_string(); - const TRectype& rec_cms = cache().get(LF_COMMESSE, commessa); - const int durata_cms = ca_durata_commessa(rec_cms, ini_cms, fine_cms); - //se la commessa non "interseca" il mese selezionato -> finisce qui -// if (fine_cms < inizio || ini_cms > fine) -// continue; - } + const TDate ini_rilore = rilore_recset.get(RILORE_DADATA).as_date(); + const TDate fine_rilore = rilore_recset.get(RILORE_ADATA).as_date(); //adatta le date alla commessa se quest'ultima è contenuta nell'intervallo (può essere più breve.. //..dell'intervallo selezionato, oppure sovrapporsi solo parzialmente) //se sta stampando per cdc -> fine_cms e ini_cms sono vuoti se non c'è la cms e non fa la trimmatura - if (fine_cms.ok() && fine_cms < datafine) - datafine = fine_cms; - if (ini_cms.ok() && ini_cms > dataini) - dataini = ini_cms; - //se la commessa fosse tutta nel futuro o nel passato -> lascia perdere - const long giorni_lavorativi = split ? ci_calcola_giorni_lavorativi(dataini, datafine) : 1L; + TDate inizio_int, fine_int; + long giorni_lavorativi = ci_calcola_giorni_lavorativi_intersezione(ini_rilore, fine_rilore, inizio_periodo, fine_periodo, + inizio_int, fine_int); + //se i giorni lavorativi non ci sono è inutile procedere if (giorni_lavorativi <= 0) continue; - TDate ini_lav, fine_lav; - long giorni_lavorativi_cms = 0L; - //se lavora su commessa -> le date ini_cms e fine_cms sono ok - if (ini_cms.ok() && fine_cms.ok()) - giorni_lavorativi_cms = ci_calcola_giorni_lavorativi_cms(anno, mese, ini_cms, fine_cms, dataini, datafine, ini_lav, fine_lav); - else //se ci fosse solo il cdc nel record di rilore, non avendo una durata -> i suoi giorni lavorativi coincidono con quelli del periodo - { - giorni_lavorativi_cms = ci_calcola_giorni_lavorativi(inizio, fine); - ini_lav = inizio; - fine_lav = fine; - } + const long giorni_lavorativi_rilore = ci_calcola_giorni_lavorativi(ini_rilore, fine_rilore); - if (giorni_lavorativi_cms == 0 && !split && i == 1) - giorni_lavorativi_cms = giorni_lavorativi; - if (giorni_lavorativi_cms > 0) + if (giorni_lavorativi_rilore > 0) { const real tot_ore = rilore_recset.get(RILORE_QTAORE).as_real(); - const real tot_ore_uso_risorsa_nel_periodo_per_cms = tot_ore * giorni_lavorativi_cms / giorni_lavorativi; + + const real tot_ore_uso_risorsa_nel_periodo = tot_ore * giorni_lavorativi / giorni_lavorativi_rilore; TToken_string key; key << tipo_ris_att; @@ -199,45 +186,34 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport& record = new TToken_string; righe.add(key, record); } - if (i == 0) //'P'reventivo (aggiorna solo il totale) + + if (tipo_ora == 'P') //'P'reventivo (aggiorna solo il totale) { real prev = record->get(0); - prev += tot_ore_uso_risorsa_nel_periodo_per_cms; + prev += tot_ore_uso_risorsa_nel_periodo; record->add(prev.string(), 0); } else //'C'onsuntivo (aggiorna tutte le caselle dei giorni lavorativi) { - if (split) + const real ore_al_giorno = tot_ore / giorni_lavorativi_rilore; + for (TDate data = inizio_int; data <= fine_int; ++data) { - const real ore_al_giorno = tot_ore / giorni_lavorativi; - for (TDate data = ini_lav; data <= fine_lav; ++data) + if (giorni_lavorativi_rilore == 1 || ci_is_ferial_day(data)) { - if (giorni_lavorativi == 1 || ci_is_ferial_day(data)) - { - const int index = tipo_stampa == 'M' ? data.day() : data.month(); - real prev = record->get(index); - prev += ore_al_giorno; - record->add(prev.string(), index); - real tot = record->get(32); - tot += ore_al_giorno; - record->add(tot.string(), 32); - } + const int index = tipo_stampa == 'M' ? data.day() : data.month(); + real prev = record->get(index); + prev += ore_al_giorno; + record->add(prev.string(), index); + real tot = record->get(32); + tot += ore_al_giorno; + record->add(tot.string(), 32); } - } - else - { - const int index = tipo_stampa == 'M' ? rilore_recset.get(RILORE_GIORNO).as_int() : rilore_recset.get(RILORE_MESE).as_int(); - real prev = record->get(index); - prev += tot_ore; - record->add(prev.string(), index); - real tot = record->get(32); - tot += tot_ore; - record->add(tot.string(), 32); - } - } //if(i==0).. + } //for (TDate... + } //if(tipo_ora == 'P'.. - } //if (giorni_lavorativi_cms > 0).. + } //if (giorni_lavorativi_rilore > 0).. } //for (bool ok = rilore_recset.move_first()... + } //for (int i = 0; i < 2; i++).. //setta un nuovo recset al report: se non lo facesse il recset sarebbe sempre il medesimo per ogni.. @@ -248,7 +224,7 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport& rep.mask2report(*this); //finita l'elaborazione che ha riempito l'assoc_array, asegna il medesimo ad un.. //..csv_recordset e poi sbatte quest'ultimo (ordinato) nel report - ci_fill_recset_from_ass(righe, rep, split); + ci_fill_recset_from_ass(righe, rep); //campo a mano per fare scattare la mask2report() rep.recordset()->set_var("#CODCMS", curr_commessa, true); @@ -294,28 +270,59 @@ void TRil_ore_cms_mask::elabora() const } TISAM_recordset recset_cms_cdc(query_cms_cdc); - recset_cms_cdc.set_var("#DACODICE", da_cms_cdc); - recset_cms_cdc.set_var("#ACODICE", a_cms_cdc); - const long recset_cms_cdc_items = recset_cms_cdc.items(); - TProgind pi(recset_cms_cdc_items, msg, true, true); - - //per ogni cms/cdc dell'elenco genera un report singolo che viene riempito nella elabora_commessa e.. - //..aggiunto al book per la stampa finale - for (bool ok = recset_cms_cdc.move_first(); ok; ok = recset_cms_cdc.move_next()) + //aggiunta Adolfica: lista di commesse da considerare separatamente più commessa borraccione.. + //..con tutte le altre + TSheet_field& lista = sfield(F_RIGHE); + const int lista_items = lista.items(); + if (lista_items > 0) { - if (!pi.addstatus(1)) - break; + TProgind pi_lista(lista_items, msg, true, true); - const TString80 curr_commessa = recset_cms_cdc.cursor()->curr().get(code_name); + FOR_EACH_SHEET_ROW(lista, r, riga) + { + if (!pi_lista.addstatus(1)) + break; - elabora_commessa(curr_commessa, rep); + const TString& curr_cms_cdc = riga->get(lista.cid2index(S_CODCMS)); + recset_cms_cdc.set_var("#DACODICE", curr_cms_cdc); + recset_cms_cdc.set_var("#ACODICE", curr_cms_cdc); + elabora_commessa(curr_cms_cdc, rep); + book.add(rep); + } + + elabora_commessa("_ALTRE_", rep); book.add(rep); + //e stampiamo questo book! + book.preview(); } + else //programma standard senza lista commesse + { + recset_cms_cdc.set_var("#DACODICE", da_cms_cdc); + recset_cms_cdc.set_var("#ACODICE", a_cms_cdc); + + const long recset_cms_cdc_items = recset_cms_cdc.items(); - //e alla fine stampa il book - book.preview(); + TProgind pi(recset_cms_cdc_items, msg, true, true); + + //per ogni cms/cdc dell'elenco genera un report singolo che viene riempito nella elabora_commessa e.. + //..aggiunto al book per la stampa finale + for (bool ok = recset_cms_cdc.move_first(); ok; ok = recset_cms_cdc.move_next()) + { + if (!pi.addstatus(1)) + break; + + const TString80 curr_commessa = recset_cms_cdc.cursor()->curr().get(code_name); + + elabora_commessa(curr_commessa, rep); + + book.add(rep); + } + + //e alla fine stampa il book + book.preview(); + } } /////////////////////////////////////////////////////////// diff --git a/ci/ci1400a.h b/ci/ci1400a.h index ba677eb96..f60528e10 100755 --- a/ci/ci1400a.h +++ b/ci/ci1400a.h @@ -11,4 +11,9 @@ #define F_TIPOSTAMPA 210 #define F_ANNO 211 #define F_MESE 212 -#define F_RIPARTISCI 213 \ No newline at end of file + +#define F_RIGHE 220 + +//campi riga sheet +#define S_CODCMS 101 +#define S_DESCRCMS 102 diff --git a/ci/ci1400a.uml b/ci/ci1400a.uml index 534e9398c..fac0245e2 100755 --- a/ci/ci1400a.uml +++ b/ci/ci1400a.uml @@ -153,12 +153,75 @@ BEGIN FIELD #MESE END -BOOLEAN F_RIPARTISCI +TEXT DLG_NULL BEGIN - PROMPT 1 9 "Ripartisci il consuntivo sul periodo" + PROMPT 1 10 "@bCommesse da considerare separatamente" + GROUP 1 END +SPREADSHEET F_RIGHE 78 -2 +BEGIN + PROMPT 1 11 "" + ITEM "Codice@20" + ITEM "Descrizione@50" + GROUP 1 +END +STRING DLG_PROFILE 50 +BEGIN + PROMPT 1 -1 "Profilo " + PSELECT +END + +ENDPAGE + +ENDMASK + +//maschera di riga dello sheet +PAGE "Riga commessa" -1 -1 40 6 + +STRING S_CODCMS 20 +BEGIN + PROMPT 1 1 "Codice " + USE LF_COMMESSE + INPUT CODCMS S_CODCMS + DISPLAY "Codice@20" CODCMS + DISPLAY "Descrizione@50" DESCRIZ + OUTPUT S_CODCMS CODCMS + OUTPUT S_DESCRCMS DESCRIZ + CHECKTYPE NORMAL +END + +STRING S_DESCRCMS 50 +BEGIN + PROMPT 1 2 "Descrizione " + USE LF_COMMESSE KEY 2 + INPUT DESCRIZ S_DESCRCMS + DISPLAY "Descrizione@50" DESCRIZ + DISPLAY "Codice@20" CODCMS + COPY OUTPUT S_CODCMS + CHECKTYPE NORMAL +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_USER 2 2 +BEGIN + PROMPT 2 1 "A~zzera" + PICTURE TOOL_CELLULAR +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 3 1 "" +END ENDPAGE diff --git a/ci/cilib.cpp b/ci/cilib.cpp index 147777c80..18f5bd756 100755 --- a/ci/cilib.cpp +++ b/ci/cilib.cpp @@ -732,9 +732,11 @@ int TRilevamento_ore::read(const char tipo, const int anno, const int mese, cons rilore.setkey(2); zero(); put(RILORE_TIPO, tipo); - put(RILORE_ANNO, anno); - put(RILORE_MESE, mese); - put(RILORE_GIORNO, giorno); + //put(RILORE_ANNO, anno); + //put(RILORE_MESE, mese); + //put(RILORE_GIORNO, giorno); + TDate dadata(giorno, mese, anno); + put(RILORE_DADATA, dadata); put(RILORE_TIPORA, tipora); put(RILORE_CODICE, codice); put(RILORE_TPORA, tpora);