From eb39446b606df5cedc0173c6da96c70c6b2f04e9 Mon Sep 17 00:00:00 2001
From: Andrea Zagli <azagli@libero.it>
Date: Sat, 23 Feb 2013 16:02:00 +0100
Subject: [PATCH] Pubblicazione dell'atto all'albo.

Implementazione ricerca atti nel registro dell'albo.
---
 data/messi/form/Makefile.am        |  3 +-
 data/messi/form/trovaregistro.form | 62 ++++++++++++++++++++++++
 data/messi/gui/messi.gui           | 22 +++++++--
 src/atti.c                         | 75 ++++++++++++++++++++++++++++++
 src/registro.c                     |  8 ++--
 src/trovaregistro.c                | 18 +++----
 6 files changed, 171 insertions(+), 17 deletions(-)
 create mode 100644 data/messi/form/trovaregistro.form

diff --git a/data/messi/form/Makefile.am b/data/messi/form/Makefile.am
index 7be77d0..14ee06f 100644
--- a/data/messi/form/Makefile.am
+++ b/data/messi/form/Makefile.am
@@ -4,6 +4,7 @@ form_DATA = \
              atto.form \
              attoallegato.form \
              tipoatto.form \
-             trovaatti.form
+             trovaatti.form \
+             trovaregistro.form
 
 EXTRA_DIST = $(form_DATA)
diff --git a/data/messi/form/trovaregistro.form b/data/messi/form/trovaregistro.form
new file mode 100644
index 0000000..6549621
--- /dev/null
+++ b/data/messi/form/trovaregistro.form
@@ -0,0 +1,62 @@
+<?xml version="1.0"?>
+<gtkform>
+
+	<widget type="entry" name="entry12" label="label23">
+		<field type="text" name="numero">
+		</field>
+	</widget>
+
+	<widget type="decoder" name="gtkformdecoder3" label="label18">
+		<decoder>
+			<sql>
+				SELECT descrizione FROM tipi_atto WHERE id = ##key0::gint
+			</sql>
+		</decoder>
+		<field type="integer" name="id_tipi_atto">
+		</field>
+	</widget>
+
+	<widget type="entry" name="entry15" label="label26">
+		<field type="text" name="oggetto">
+		</field>
+	</widget>
+
+	<widget type="decoder" name="gtkformdecoder5" label="label19">
+		<decoder>
+			<sql>
+				SELECT nome FROM uffici WHERE id = ##key0::gint
+			</sql>
+		</decoder>
+		<field type="integer" name="id_uffici">
+		</field>
+	</widget>
+
+	<widget type="entry" name="entry13" label="label24">
+		<field type="datetime" name="ricezione_da_data">
+			<datetime-type>date</datetime-type>
+			<display-format>%d/%m/%Y</display-format>
+		</field>
+	</widget>
+
+	<widget type="entry" name="entry14" label="label25">
+		<field type="datetime" name="ricezione_a_data">
+			<datetime-type>date</datetime-type>
+			<display-format>%d/%m/%Y</display-format>
+		</field>
+	</widget>
+
+	<widget type="entry" name="entry10" label="label20">
+		<field type="datetime" name="pubblicazione_da_data">
+			<datetime-type>date</datetime-type>
+			<display-format>%d/%m/%Y</display-format>
+		</field>
+	</widget>
+
+	<widget type="entry" name="entry11" label="label22">
+		<field type="datetime" name="pubblicazione_a_data">
+			<datetime-type>date</datetime-type>
+			<display-format>%d/%m/%Y</display-format>
+		</field>
+	</widget>
+
+</gtkform>
diff --git a/data/messi/gui/messi.gui b/data/messi/gui/messi.gui
index 8b00f47..1faae60 100644
--- a/data/messi/gui/messi.gui
+++ b/data/messi/gui/messi.gui
@@ -289,6 +289,20 @@
                 <property name="position">2</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkButton" id="button19">
+                <property name="label" translatable="yes">_Pubblica</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
             <child>
               <object class="GtkButton" id="button8">
                 <property name="label" translatable="yes">_Esporta</property>
@@ -300,7 +314,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">3</property>
+                <property name="position">4</property>
               </packing>
             </child>
             <child>
@@ -314,7 +328,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">4</property>
+                <property name="position">5</property>
               </packing>
             </child>
             <child>
@@ -328,7 +342,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">5</property>
+                <property name="position">6</property>
               </packing>
             </child>
             <child>
@@ -342,7 +356,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">6</property>
+                <property name="position">7</property>
               </packing>
             </child>
           </object>
diff --git a/src/atti.c b/src/atti.c
index 342add2..af5f480 100644
--- a/src/atti.c
+++ b/src/atti.c
@@ -58,6 +58,8 @@ static void atti_on_btn_modifica_clicked (GtkButton *button,
                       gpointer user_data);
 static void atti_on_btn_elimina_clicked (GtkButton *button,
                         gpointer user_data);
+static void atti_on_btn_pubblica_clicked (GtkButton *button,
+                        gpointer user_data);
 static void atti_on_trv_atti_row_activated (GtkTreeView *tree_view,
                                              GtkTreePath *tree_path,
                                              GtkTreeViewColumn *column,
@@ -183,6 +185,8 @@ Atti
 	                  "clicked", G_CALLBACK (atti_on_btn_modifica_clicked), (gpointer)a);
 	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button6"),
 	                  "clicked", G_CALLBACK (atti_on_btn_elimina_clicked), (gpointer)a);
+	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button19"),
+	                  "clicked", G_CALLBACK (atti_on_btn_pubblica_clicked), (gpointer)a);
 	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "treeview1"),
 	                  "row-activated", G_CALLBACK (atti_on_trv_atti_row_activated), (gpointer)a);
 
@@ -239,6 +243,8 @@ atti_carica (Atti *atti)
 	guint gival;
 	GDateTime *gdtval;
 
+	gboolean pubblicazione;
+
 	gchar *sql_where;
 	gchar *sql;
 
@@ -259,6 +265,8 @@ atti_carica (Atti *atti)
 
 	gtk_list_store_clear (priv->lstore_atti);
 
+	pubblicazione = FALSE;
+
 	sql_where = g_strdup ("");
 
 	if (priv->parametri_ricerca != NULL)
@@ -311,6 +319,7 @@ atti_carica (Atti *atti)
 			gval = (GValue *)g_hash_table_lookup (priv->parametri_ricerca, "pubblicazione_da_data");
 			if (gval != NULL && (gdtval = (GDateTime *)g_value_get_pointer (gval)) != NULL)
 				{
+					pubblicazione = TRUE;
 					sql_where = g_strconcat (sql_where, " AND a.pubblicazione_inizio_data >= '",
 					                         g_date_time_format (gdtval, "%F"),
 					                         "'",
@@ -319,6 +328,7 @@ atti_carica (Atti *atti)
 			gval = (GValue *)g_hash_table_lookup (priv->parametri_ricerca, "pubblicazione_a_data");
 			if (gval != NULL && (gdtval = (GDateTime *)g_value_get_pointer (gval)) != NULL)
 				{
+					pubblicazione = TRUE;
 					sql_where = g_strconcat (sql_where, " AND a.pubblicazione_fine_data <= '",
 					                         g_date_time_format (gdtval, "%F"),
 					                         "'",
@@ -326,6 +336,12 @@ atti_carica (Atti *atti)
 				}
 		}
 
+	if (!pubblicazione)
+		{
+			sql_where = g_strconcat (sql_where, " AND r.id IS NULL",
+			                         NULL);
+		}
+
 	sql = g_strdup_printf ("SELECT a.id, a.numero,"
 	                       " ta.descrizione AS tipo_atto,"
 	                       " a.oggetto,"
@@ -334,6 +350,7 @@ atti_carica (Atti *atti)
 	                       " a.pubblicazione_fine_data"
 	                       " FROM atti AS a"
 	                       " INNER JOIN tipi_atto AS ta ON a.id_tipi_atto = ta.id"
+	                       " LEFT JOIN registro AS r ON a.id = r.id_atti"
 	                       " WHERE a.status <> 'E'"
 	                       "%s"
 	                       " ORDER BY a.id",
@@ -586,6 +603,64 @@ atti_on_btn_elimina_clicked (GtkButton *button,
 		}
 }
 
+static void
+atti_on_btn_pubblica_clicked (GtkButton *button,
+                        gpointer user_data)
+{
+	GtkTreeIter iter;
+	gint id;
+
+	gchar *sql;
+	GdaDataModel *dm;
+	guint newid;
+
+	Atti *atti = (Atti *)user_data;
+	AttiPrivate *priv = ATTI_GET_PRIVATE (atti);
+
+	if (gtk_tree_selection_get_selected (priv->selection, NULL, &iter))
+		{
+			if (solipa_message_dialog (GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_main")),
+			                           GTK_MESSAGE_QUESTION,
+			                           GTK_BUTTONS_YES_NO,
+			                           "Sicuro di voler pubblicare l'atto selezionato?") == GTK_RESPONSE_YES)
+				{
+					gtk_tree_model_get (GTK_TREE_MODEL (priv->lstore_atti), &iter,
+					                    COL_ID, &id,
+					                    -1);
+
+					newid = 0;
+					sql = g_strdup_printf ("SELECT COALESCE(MAX(id), 0) FROM registro");
+					dm = gdaex_query (priv->commons->gdaex, sql);
+					g_free (sql);
+					if (dm != NULL)
+						{
+							if (gda_data_model_get_n_rows (dm) > 0)
+								{
+									newid = gdaex_data_model_get_value_integer_at (dm, 0, 0);
+								}
+							g_object_unref (dm);
+						}
+					newid++;
+
+					sql = g_strdup_printf ("INSERT INTO registro"
+					                       " (id, id_atti, azione, azione_data)"
+					                       " VALUES (%d, %d, 1, CURRENT_TIMESTAMP)",
+					                       newid, id);
+					gdaex_execute (priv->commons->gdaex, sql);
+					g_free (sql);
+
+					atti_carica (atti);
+				}
+		}
+	else
+		{
+			solipa_message_dialog (priv->selezione ? priv->widget : GTK_WIDGET (gtk_builder_get_object (priv->commons->gtkbuilder, "w_main")),
+			                       GTK_MESSAGE_WARNING,
+			                       GTK_BUTTONS_OK,
+			                       "Occorre prima selezionare un atto.");
+		}
+}
+
 static void
 atti_on_trv_atti_row_activated (GtkTreeView *tree_view,
                                              GtkTreePath *tree_path,
diff --git a/src/registro.c b/src/registro.c
index 8be69a0..bc02e59 100644
--- a/src/registro.c
+++ b/src/registro.c
@@ -85,6 +85,8 @@ enum
 	COL_ID_ATTI
 };
 
+gchar *azioni[] = {"Pubblicato", "Respinto", "Depubblicato", "Ratificato"};
+
 typedef struct _RegistroPrivate RegistroPrivate;
 struct _RegistroPrivate
 	{
@@ -330,7 +332,7 @@ registro_carica (Registro *registro)
 	                       " INNER JOIN tipi_atto AS ta ON a.id_tipi_atto = ta.id"
 	                       " WHERE a.status <> 'E'"
 	                       "%s"
-	                       " ORDER BY a.id",
+	                       " ORDER BY r.id DESC",
 	                       sql_where);
 	dm = gdaex_query (priv->commons->gdaex, sql);
 	g_free (sql_where);
@@ -369,7 +371,7 @@ registro_carica (Registro *registro)
 					                    COL_DATA_RICEZIONE, solipa_gdatetime_format (gdaex_data_model_get_field_value_gdatetime_at (dm, row, "ricezione_data"), "%d/%m/%Y"),
 					                    COL_DATA_INIZIO_PUBBLICAZIONE, solipa_gdatetime_format (gdaex_data_model_get_field_value_gdatetime_at (dm, row, "pubblicazione_inizio_data"), "%d/%m/%Y"),
 					                    COL_DATA_FINE_PUBBLICAZIONE, solipa_gdatetime_format (gdaex_data_model_get_field_value_gdatetime_at (dm, row, "pubblicazione_fine_data"), "%d/%m/%Y"),
-					                    COL_AZIONE, gdaex_data_model_get_field_value_stringify_at (dm, row, "azione"),
+					                    COL_AZIONE, azioni[gdaex_data_model_get_field_value_integer_at (dm, row, "azione") - 1],
 					                    COL_AZIONE_DATA, solipa_gdatetime_format (gdaex_data_model_get_field_value_gdatetime_at (dm, row, "azione_data"), "%d/%m/%Y %H.%M.%S"),
 					                    -1);
 
@@ -392,7 +394,7 @@ registro_apri (Registro *registro)
 			GtkWidget *w;
 
 			gtk_tree_model_get (GTK_TREE_MODEL (priv->lstore_registro), &iter,
-			                    COL_ID, &id,
+			                    COL_ID_ATTI, &id,
 			                    -1);
 
 			Atto *c = atto_new (priv->commons, id);
diff --git a/src/trovaregistro.c b/src/trovaregistro.c
index f99d85c..addd2ba 100644
--- a/src/trovaregistro.c
+++ b/src/trovaregistro.c
@@ -141,21 +141,21 @@ TrovaRegistro
 	g_signal_connect (priv->w,
 	                  "key-release-event", G_CALLBACK (trova_registro_on_key_release_event), (gpointer)a);
 
-	g_object_set (gtk_builder_get_object (priv->commons->gtkbuilder, "gtkformdecoder15"),
+	g_object_set (gtk_builder_get_object (priv->commons->gtkbuilder, "gtkformdecoder5"),
 	              "gdaex", priv->commons->organigramma_commons->gdaex,
 	              NULL);
 
-	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "gtkformdecoder4"),
+	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "gtkformdecoder3"),
 	                  "btn-browse-clicked", G_CALLBACK (trova_registro_on_btn_tipo_atto_clicked), (gpointer)a);
 
-	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "gtkformdecoder15"),
+	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "gtkformdecoder5"),
 	                  "btn-browse-clicked", G_CALLBACK (trova_registro_on_btn_ufficio_clicked), (gpointer)a);
 
-	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button20"),
+	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button11"),
 	                  "clicked", G_CALLBACK (trova_registro_on_btn_pulisci_clicked), (gpointer)a);
-	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button21"),
+	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button12"),
 	                  "clicked", G_CALLBACK (trova_registro_on_btn_annulla_clicked), (gpointer)a);
-	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button22"),
+	g_signal_connect (gtk_builder_get_object (priv->commons->gtkbuilder, "button18"),
 	                  "clicked", G_CALLBACK (trova_registro_on_btn_ok_clicked), (gpointer)a);
 
 	gtk_form_clear (priv->form);
@@ -216,7 +216,7 @@ trova_registro_on_tipo_atto_selezionato (gpointer instance, guint id, gpointer u
 	TrovaRegistro *a = (TrovaRegistro *)user_data;
 	TrovaRegistroPrivate *priv = TROVA_REGISTRO_GET_PRIVATE (a);
 
-	gtk_form_widget_set_value_stringify (gtk_form_get_form_widget_from_name (priv->form, "gtkformdecoder4"),
+	gtk_form_widget_set_value_stringify (gtk_form_get_form_widget_from_name (priv->form, "gtkformdecoder3"),
 	                                     g_strdup_printf ("%d", id));
 }
 
@@ -226,7 +226,7 @@ trova_registro_on_ufficio_selezionato (gpointer instance, guint id, gpointer use
 	TrovaRegistro *a = (TrovaRegistro *)user_data;
 	TrovaRegistroPrivate *priv = TROVA_REGISTRO_GET_PRIVATE (a);
 
-	gtk_form_widget_set_value_stringify (gtk_form_get_form_widget_from_name (priv->form, "gtkformdecoder15"),
+	gtk_form_widget_set_value_stringify (gtk_form_get_form_widget_from_name (priv->form, "gtkformdecoder5"),
 	                                     g_strdup_printf ("%d", id));
 }
 
@@ -258,7 +258,7 @@ trova_registro_on_key_release_event (GtkWidget   *widget,
 		{
 			TrovaRegistroPrivate *priv = TROVA_REGISTRO_GET_PRIVATE ((TrovaRegistro *)user_data);
 
-			gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button21")));
+			gtk_button_clicked (GTK_BUTTON (gtk_builder_get_object (priv->commons->gtkbuilder, "button12")));
 			return TRUE;
 		}
 
-- 
2.49.0