From 362458365c38ba307771f31f4926bd839e19a7fa Mon Sep 17 00:00:00 2001
From: alex <alex@c028cbd2-c16b-5b4b-a496-9718f37d4682>
Date: Thu, 21 Apr 2011 15:21:00 +0000
Subject: [PATCH] Patch level         : 10.982 Files correlati     :  ci1exe
 Ricompilazione Demo : [ ] Commento            :

Imlementate le  stampa della rilevazione senza ripartizione


git-svn-id: svn://10.65.10.50/branches/R_10_00@22017 c028cbd2-c16b-5b4b-a496-9718f37d4682
---
 ci/ci1300.cpp  | 50 +++++++++++++++++++----------
 ci/ci1300a.h   |  3 +-
 ci/ci1300a.uml |  7 +++++
 ci/ci1350.cpp  | 45 +++++++++++++++++---------
 ci/ci1350.h    |  2 +-
 ci/ci1400.cpp  | 85 +++++++++++++++++++++++++++++---------------------
 ci/ci1400a.h   |  1 +
 ci/ci1400a.uml |  7 +++++
 8 files changed, 131 insertions(+), 69 deletions(-)

diff --git a/ci/ci1300.cpp b/ci/ci1300.cpp
index ee9994440..40ed76a05 100755
--- a/ci/ci1300.cpp
+++ b/ci/ci1300.cpp
@@ -69,6 +69,7 @@ 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);
 
   //creare un assoc_array con chiave TToken_string cms-sede-fase(1) o sede-cms-fase(2) in base ai parametri..
   //..indicati sulla maschera
@@ -120,7 +121,7 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re
       if (ini_cms > dataini)
         dataini = ini_cms;
       //se la commessa fosse tutta nel futuro o nel passato -> lascia perdere
-      const long giorni_lavorativi = ci_calcola_giorni_lavorativi(dataini, datafine);
+			const long giorni_lavorativi = split ? ci_calcola_giorni_lavorativi(dataini, datafine)  : 1L;
       if (giorni_lavorativi <= 0)
         continue;
 
@@ -129,10 +130,12 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re
       TDate ini_lav, fine_lav;
       const int anno = get_int(F_ANNO);
       const int mese = tipo_stampa == 'M' ? get_int(F_MESE) : 0;
-      const long giorni_lavorativi_cms = ci_calcola_giorni_lavorativi_cms(anno, mese, ini_cms, fine_cms, dataini, datafine, 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);
 
       //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)
       {
         const real tot_ore = rilore_recset.get(RILORE_QTAORE).as_real();
@@ -169,20 +172,33 @@ void TRil_ore_ris_mask::elabora_risorsa(const TString& curr_risorsa, TReport& re
         }
         else  //'C'onsuntivo (aggiorna tutte le caselle dei giorni lavorativi)
         {
-          const real ore_al_giorno = tot_ore / giorni_lavorativi;
-          for (TDate data = ini_lav; data <= fine_lav; ++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);
-            }
-          }
+					if (split)
+					{
+						const real ore_al_giorno = tot_ore / giorni_lavorativi;
+						for (TDate data = ini_lav; data <= fine_lav; ++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);
+							}
+						}
+					}
+					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 (bool ok = rilore_recset.move_first();..
@@ -194,7 +210,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);
+  ci_fill_recset_from_ass(righe, rep, split);
   //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 85c5555ce..ac553ba22 100755
--- a/ci/ci1300a.h
+++ b/ci/ci1300a.h
@@ -12,4 +12,5 @@
 #define F_ANNO          211
 #define F_MESE          212
 #define F_ORDINAMENTO   213
-#define F_SHOW_FASI     214
\ No newline at end of file
+#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 d73f69ee7..c4c17a7ae 100755
--- a/ci/ci1300a.uml
+++ b/ci/ci1300a.uml
@@ -32,6 +32,7 @@ BEGIN
   OUTPUT F_DA_CODRIS CODTAB
   OUTPUT F_DA_DESRIS S0
   CHECKTYPE NORMAL
+  FLAGS "U"
   GROUP 1
 END
 
@@ -108,6 +109,7 @@ BEGIN
   DISPLAY "Descrizione@50" S0
   OUTPUT F_A_CODATT CODTAB
   OUTPUT F_A_DESATT S0
+  FLAGS "U"
   CHECKTYPE NORMAL
   GROUP 2
 END
@@ -169,6 +171,11 @@ 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 aa29ff7e1..67dcd88b6 100755
--- a/ci/ci1350.cpp
+++ b/ci/ci1350.cpp
@@ -99,7 +99,7 @@ long ci_calcola_giorni_lavorativi_cms(const int anno, const int mese, const TDat
 
 
 
-void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep)
+void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep, bool split)
 {
   //deve informarsi sul tipo di report che � in uso
   const TString& rep_class = rep.get_class();
@@ -141,20 +141,35 @@ void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep)
 
     //per avere una distribuzione di ore giornaliera che faccia ritornare il totale consuntivo..
     //..indipendentemente da arrotondamenti e troncamenti, si ricorre al mitico TGeneric_distrib...
-    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);
-    }
+		if (split)
+		{
+			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);
+			}
+		}
+		else
+		{
+			TString4 name;
+
+			for (int k = 1; k <= 31; k++)
+			{
+				real ore = record_ass.get(k);
+				name.format("G%02d", k);
+				recset->set(name, ore);
+			}
+		}
 
 
     //2)  chiavi delle righe
diff --git a/ci/ci1350.h b/ci/ci1350.h
index 4928b17a7..5d8d44329 100755
--- a/ci/ci1350.h
+++ b/ci/ci1350.h
@@ -25,7 +25,7 @@ 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);
 
-void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep);
+void ci_fill_recset_from_ass(TAssoc_array& ass, TReport& rep, bool split);
 
 void format_report_month(const int anno, const int mese, TReport& rep);
 
diff --git a/ci/ci1400.cpp b/ci/ci1400.cpp
index 53697ee61..336cd643b 100755
--- a/ci/ci1400.cpp
+++ b/ci/ci1400.cpp
@@ -69,6 +69,7 @@ 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);
 
   //date del periodo
   const int anno = get_int(F_ANNO);
@@ -105,8 +106,8 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport&
     const int durata_cms = ca_durata_commessa(rec_cms, ini_cms, fine_cms);
 
     //se la commessa non "interseca" il periodo selezionato -> finisce qui
-    if (fine_cms < inizio || ini_cms > fine)
-      return false;
+//    if (split && (fine_cms < inizio || ini_cms > fine))
+//      return false;
 
     query << "USE RILORE KEY 5";
     query << "\nFROM TIPO=#TIPO CODCMS=#CODICE";
@@ -141,26 +142,25 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport&
 
       //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);
+			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;
+			}
 
-        //se la commessa non "interseca" il mese selezionato -> finisce qui
-        if (fine_cms < inizio || ini_cms > fine)
-          continue;
-      }
-
-      //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;
+			//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 = ci_calcola_giorni_lavorativi(dataini, datafine);
+			const long giorni_lavorativi = split ? ci_calcola_giorni_lavorativi(dataini, datafine) : 1L;
       if (giorni_lavorativi <= 0)
         continue;
 
@@ -176,6 +176,8 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport&
         fine_lav = fine;
       }
 
+			if (giorni_lavorativi_cms == 0 && !split && i == 1)
+				giorni_lavorativi_cms = giorni_lavorativi;
       if (giorni_lavorativi_cms > 0)
       {
         const real tot_ore = rilore_recset.get(RILORE_QTAORE).as_real();
@@ -199,20 +201,33 @@ bool TRil_ore_cms_mask::elabora_commessa(const TString& curr_commessa, TReport&
         }
         else  //'C'onsuntivo (aggiorna tutte le caselle dei giorni lavorativi)
         {
-          const real ore_al_giorno = tot_ore / giorni_lavorativi;
-          for (TDate data = ini_lav; data <= fine_lav; ++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);
-            }
-          }
+					if (split)
+					{
+						const real ore_al_giorno = tot_ore / giorni_lavorativi;
+						for (TDate data = ini_lav; data <= fine_lav; ++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);
+							}
+						}
+					}
+					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)..
 
       } //if (giorni_lavorativi_cms > 0)..
@@ -223,7 +238,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);
+  ci_fill_recset_from_ass(righe, rep, split);
   //campo a mano per fare scattare la mask2report()
   rep.recordset()->set_var("#CODCMS", curr_commessa, true);
 
diff --git a/ci/ci1400a.h b/ci/ci1400a.h
index 2361ad519..ba677eb96 100755
--- a/ci/ci1400a.h
+++ b/ci/ci1400a.h
@@ -11,3 +11,4 @@
 #define F_TIPOSTAMPA    210
 #define F_ANNO          211
 #define F_MESE          212
+#define F_RIPARTISCI		213
\ No newline at end of file
diff --git a/ci/ci1400a.uml b/ci/ci1400a.uml
index 587ec78a6..1fdca79c7 100755
--- a/ci/ci1400a.uml
+++ b/ci/ci1400a.uml
@@ -153,6 +153,13 @@ BEGIN
   FIELD #MESE
 END
 
+BOOLEAN F_RIPARTISCI
+BEGIN
+	PROMPT 1 8 "Ripartisci il consuntivo sul periodo"
+END
+
+
+
 ENDPAGE
 
 ENDMASK
\ No newline at end of file