diff --git a/data/ui/main.window.ui b/data/ui/main.window.ui index c13caf1..3dc6642 100644 --- a/data/ui/main.window.ui +++ b/data/ui/main.window.ui @@ -68,28 +68,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND False Tourists - - - True - False - - - True - False - Illnesses - - - - - - True - False - Participate - - - - - diff --git a/data/ui/meson.build b/data/ui/meson.build index ed925dc..d76ae89 100644 --- a/data/ui/meson.build +++ b/data/ui/meson.build @@ -11,6 +11,12 @@ tour_gresource = gnome.compile_resources('tour_gresource', c_name: meson.project_name() + '_resource_tour', export: true, install_header: true) +tourist_gresource = gnome.compile_resources('tourist_gresource', + 'tourist.gresource.xml', + source_dir: '.', + c_name: meson.project_name() + '_resource_tourist', + export: true, + install_header: true) place_gresource = gnome.compile_resources('place_gresource', 'place.gresource.xml', source_dir: '.', diff --git a/data/ui/tour.place.editor.ui b/data/ui/tour.place.editor.ui index 29cd23e..359c8f6 100644 --- a/data/ui/tour.place.editor.ui +++ b/data/ui/tour.place.editor.ui @@ -1,5 +1,5 @@ - + + + + 1 + 31 + 1 + 1 + 10 + + + 1900 + 2019 + 2019 + 1 + 10 + + + diff --git a/data/ui/tourist.gresource.xml b/data/ui/tourist.gresource.xml new file mode 100644 index 0000000..5fc0990 --- /dev/null +++ b/data/ui/tourist.gresource.xml @@ -0,0 +1,22 @@ + + + + + tourist.list.ui + tourist.editor.ui + tourist.illnesses.ui + tourist.illness.editor.ui + + diff --git a/data/ui/tourist.illness.editor.ui b/data/ui/tourist.illness.editor.ui new file mode 100644 index 0000000..1918d38 --- /dev/null +++ b/data/ui/tourist.illness.editor.ui @@ -0,0 +1,129 @@ + + + + + + diff --git a/data/ui/tourist.illnesses.ui b/data/ui/tourist.illnesses.ui new file mode 100644 index 0000000..cfcad6d --- /dev/null +++ b/data/ui/tourist.illnesses.ui @@ -0,0 +1,149 @@ + + + + + + + diff --git a/data/ui/tourist.list.ui b/data/ui/tourist.list.ui new file mode 100644 index 0000000..102a159 --- /dev/null +++ b/data/ui/tourist.list.ui @@ -0,0 +1,193 @@ + + + + + + + diff --git a/lib/db/ciudad.vala b/lib/db/ciudad.vala index 5179fe1..22bf49a 100644 --- a/lib/db/ciudad.vala +++ b/lib/db/ciudad.vala @@ -94,7 +94,7 @@ namespace LibSernatur { * @return Returns a list of Ciudad * @throws PostgresError If there is a problem with with escaping strings */ - public static List get_all_ciudades_in_region(Connection conn, uint region_id) throws PostgresError { + public static List get_all_ciudades_in_region (Connection conn, uint region_id) throws PostgresError { var res = conn.db.exec (Query.get_query (conn, Query.Type.SELECT_ALL_CITIES_BY_REGION, region_id)); if (res.get_status () != ExecStatus.TUPLES_OK) { #if DEBUG diff --git a/lib/db/enfermedad.vala b/lib/db/enfermedad.vala index 394258f..a231b15 100644 --- a/lib/db/enfermedad.vala +++ b/lib/db/enfermedad.vala @@ -44,8 +44,9 @@ namespace LibSernatur { * Get all tuples and fields from database * @param conn The database connection to use * @return Returns a list of Enfermedad + * @throws PostgresError If there is a problem with with escaping strings */ - public static List get_all_enfermedades (Connection conn) { + public static List get_all_enfermedades (Connection conn) throws PostgresError { var res = conn.db.exec (" SELECT id_enfermedad, descripcion_enfermedad FROM enfermedad "); diff --git a/lib/db/tiene_enfermedad.vala b/lib/db/tiene_enfermedad.vala index 902c397..152e9c2 100644 --- a/lib/db/tiene_enfermedad.vala +++ b/lib/db/tiene_enfermedad.vala @@ -94,6 +94,112 @@ JOIN enfermedad E ON (TE.id_enfermedad = E.id_enfermedad) } return list; } + + /** + * Get all tuples and fields from database that are connected with a certain RUN + * @param conn The database connection to use + * @param run The RUN to search for + * @return Returns a list of TieneEnfermedad + * @throws PostgresError If there is a problem with with escaping strings + */ + public static List get_all_tiene_enfermedades_by_run (Connection conn, string run) throws PostgresError { + var res = conn.db.exec (" +SELECT T.rut_turista, T.nombre_turista, T.fecha_nacimento, +C.id_contacto, C.telefono_emergencia, C.nombre_emergencia, +E.id_enfermedad, E.descripcion_enfermedad +FROM tiene_enfermedad TE +JOIN turista T ON (TE.rut_turista = T.rut_turista) +LEFT JOIN contacto_emergencia C ON (T.id_contacto = C.id_contacto) +JOIN enfermedad E ON (TE.id_enfermedad = E.id_enfermedad) +WHERE (TE.rut_turista = '" + conn.escape (run) + "') + "); + if (res.get_status () != ExecStatus.TUPLES_OK) { + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + return new List (); + #endif + } + + var wra = new ResultWrapper (res); + List list = new List (); + int n = res.get_n_tuples (); + for (int i = 0; i < n; i++) { + try { + var tiene_enfermedad = new TieneEnfermedad ( + new Turista (wra.get_string_n (i, "rut_turista"), + wra.get_string_n (i, "nombre_turista"), + wra.get_string_n (i, "fecha_nacimento"), + new ContactoEmergencia (wra.get_int_n (i, "id_contacto"), + wra.get_int_n (i, "telefono_emergencia"), + wra.get_string_n (i, "nombre_emergencia") + ) + ), + new Enfermedad (wra.get_int_n (i, "id_enfermedad"), + wra.get_string_n (i, "descripcion_enfermedad") + ) + ); + list.append (tiene_enfermedad); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + } + return list; + } + + /** + * Insert an illness in the database + * @param conn The database connection + * @param tiene_enfermedad The illness to insert + * @throws PostgresError Thrown if there is a problem with escaping strings + */ + public static void insert_illness (Connection conn, TieneEnfermedad tiene_enfermedad) throws PostgresError { + var res = conn.db.exec (" +INSERT INTO tiene_enfermedad +(rut_turista, id_enfermedad) +VALUES +( +'" + conn.escape (tiene_enfermedad.turista.rut_turista) + "', +" + tiene_enfermedad.enfermedad.id_enfermedad.to_string () + " +) + "); + if (res.get_status () != ExecStatus.COMMAND_OK) { + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + #endif + } + } + + /** + * Delete an illness in the database + * @param conn The database connection + * @param tiene_enfermedad The illness to delete + * @throws PostgresError Thrown if there is a problem with escaping strings + */ + public static void delete_illness (Connection conn, TieneEnfermedad tiene_enfermedad) throws PostgresError { + var res = conn.db.exec (" +DELETE FROM tiene_enfermedad +WHERE ( +rut_turista = '" + conn.escape (tiene_enfermedad.turista.rut_turista) + "' AND +id_enfermedad = " + tiene_enfermedad.enfermedad.id_enfermedad.to_string () + " +) + "); + if (res.get_status () != ExecStatus.COMMAND_OK) { + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + #endif + } + } } } } diff --git a/lib/db/tour.vala b/lib/db/tour.vala index d14cea6..73717be 100644 --- a/lib/db/tour.vala +++ b/lib/db/tour.vala @@ -71,7 +71,7 @@ namespace LibSernatur { * @throws PostgresError If there is a problem with with escaping strings */ public static List get_all_tours (Connection conn) throws PostgresError { - var res = conn.db.exec (Query.get_query (conn, Query.Type.SELECT_ALL_TOURS, null)); + var res = conn.db.exec (Query.get_query (conn, Query.Type.SELECT_ALL_TOURS)); if (res.get_status () != ExecStatus.TUPLES_OK) { #if DEBUG error (conn.db.get_error_message ()); diff --git a/lib/db/turista.vala b/lib/db/turista.vala index 58c1df7..028018a 100644 --- a/lib/db/turista.vala +++ b/lib/db/turista.vala @@ -22,15 +22,15 @@ namespace LibSernatur { */ public class Turista : Object { /** - * The RUT of the tourist + * The RUT of the touristist */ public string rut_turista { get; set; default = ""; } /** - * The tourist name + * The touristist name */ public string nombre_turista { get; set; default = ""; } /** - * The birth date of the tourist + * The birth date of the touristist */ public string fecha_nacimento { get; set; default = ""; } /** @@ -40,9 +40,9 @@ namespace LibSernatur { /** * Initilize the Turista class - * @param rut_turista The RUT of the tourist - * @param nombre_turista The tourist name - * @param fecha_nacimento The birth date of the tourist + * @param rut_turista The RUT of the touristist + * @param nombre_turista The touristist name + * @param fecha_nacimento The birth date of the touristist * @param contacto_emergencia The emergency contact */ public Turista (string rut_turista = "", string nombre_turista = "", string fecha_nacimento = "", ContactoEmergencia? contacto_emergencia = null) { @@ -56,14 +56,10 @@ namespace LibSernatur { * Get all tuples and fields from database * @param conn The database connection to use * @return Returns a list of Turista + * @throws PostgresError If there is a problem with with escaping strings */ - public static List get_all_turistas (Connection conn) { - var res = conn.db.exec (" -SELECT T.rut_turista, T.nombre_turista, T.fecha_nacimento, -C.id_contacto, C.telefono_emergencia, C.nombre_emergencia -FROM turista T -JOIN contacto_emergencia C ON (T.id_contacto = C.id_contacto) - "); + public static List get_all_turistas (Connection conn) throws PostgresError { + var res = conn.db.exec (Query.get_query (conn, Query.Type.SELECT_ALL_TOURISTS)); if (res.get_status () != ExecStatus.TUPLES_OK) { #if DEBUG error (conn.db.get_error_message ()); @@ -98,6 +94,114 @@ JOIN contacto_emergencia C ON (T.id_contacto = C.id_contacto) } return list; } + + /** + * Get a single tuple and field from database + * @param conn The database connection to use + * @return Returns a Turista + * @throws PostgresError If there is a problem with with escaping strings + */ + public static Turista? get_turista_by_run (Connection conn, string run) throws PostgresError { + var res = conn.db.exec (Query.get_query (conn, Query.Type.SELECT_TOURIST_BY_RUN, run)); + if (res.get_status () != ExecStatus.TUPLES_OK) { + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + return null; + #endif + } + + var wra = new ResultWrapper (res); + Turista turista = null; + int n = res.get_n_tuples (); + for (int i = 0; i < n; i++) { + try { + turista = new Turista (wra.get_string_n (i, "rut_turista"), + wra.get_string_n (i, "nombre_turista"), + wra.get_string_n (i, "fecha_nacimento"), + new ContactoEmergencia (wra.get_int_n (i, "id_contacto"), + wra.get_int_n (i, "telefono_emergencia"), + wra.get_string_n (i, "nombre_emergencia") + ) + ); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + } + return turista; + } + + /** + * Update a tourist in the database + * @param conn The database connection + * @param tourist The tourist to update + * @throws PostgresError Thrown if there is a problem with escaping strings + * @throws DBError Thrown if an invalid value is passed + */ + public static void update_tourist (Connection conn, Turista tourist, string original_run) throws PostgresError, DBError { + if (tourist.rut_turista.strip () == "") { + throw new DBError.INVALID_VALUE (_ ("The RUN of the tourist is invalid!")); + } + var res = conn.db.exec (Query.get_query (conn, Query.Type.UPDATE_TOURIST, tourist, original_run)); + if (res.get_status () != ExecStatus.COMMAND_OK) { + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + #endif + } + } + + /** + * Insert a tourist in the database + * @param conn The database connection + * @param tourist The tourist to insert + * @throws PostgresError Thrown if there is a problem with escaping strings + * @throws DBError Thrown if an invalid value is passed + */ + public static void insert_tourist (Connection conn, Turista tourist) throws PostgresError, DBError { + if (tourist.rut_turista.strip () == "") { + throw new DBError.INVALID_VALUE (_ ("The RUN of the tourist is invalid!")); + } + var res = conn.db.exec (Query.get_query (conn, Query.Type.INSERT_TOURIST, tourist)); + if (res.get_status () != ExecStatus.COMMAND_OK) { + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + #endif + } + } + + /** + * Delete a tourist in the database + * @param conn The database connection + * @param tourist The tourist to delete + * @throws PostgresError Thrown if there is a problem with escaping strings + * @throws DBError Thrown if an invalid value is passed + */ + public static void delete_tourist (Connection conn, Turista tourist) throws PostgresError, DBError { + if (tourist.rut_turista.strip () == "") { + throw new DBError.INVALID_VALUE (_ ("The RUN of the tourist is invalid!")); + } + var res = conn.db.exec (Query.get_query (conn, Query.Type.DELETE_TOURIST, tourist)); + if (res.get_status () != ExecStatus.COMMAND_OK) { + if (res.get_error_field (FieldCode.SQLSTATE) == "23503") { + throw new DBError.FOREIGN_KEY_CONSTAINT (res.get_error_field (FieldCode.MESSAGE_PRIMARY)); + } + #if DEBUG + error (conn.db.get_error_message ()); + #else + warning (conn.db.get_error_message ()); + #endif + } + } } } } diff --git a/lib/misc.vala b/lib/misc.vala index e54e001..2ac765e 100644 --- a/lib/misc.vala +++ b/lib/misc.vala @@ -180,7 +180,7 @@ namespace LibSernatur { throw new InvalidRut.INVALID (_ ("The RUT %s has an invalid character!"), rut); } } - catch (Error e) { + catch (RegexError e) { #if DEBUG error (e.message); #else @@ -202,7 +202,7 @@ namespace LibSernatur { } pretty(); } - catch (Error e) { + catch (RegexError e) { #if DEBUG error (e.message); #else diff --git a/lib/queries.vala b/lib/queries.vala index eeb1e1d..7b3cda3 100644 --- a/lib/queries.vala +++ b/lib/queries.vala @@ -39,10 +39,24 @@ namespace LibSernatur { SELECT_VEHICLE_REQUIRED_BY_TOUR, INSERT_VEHICLE_REQUIRED, UPDATE_VEHICLE_REQUIRED, - DELETE_VEHICLE_REQUIRED + DELETE_VEHICLE_REQUIRED, + SELECT_ALL_TOURISTS, + SELECT_TOURIST_BY_RUN, + INSERT_TOURIST, + UPDATE_TOURIST, + DELETE_TOURIST } - public static string get_query (Connection conn, Type type, T? t = null) throws PostgresError { + /** + * Return a query to be run + * @param conn The connection which is used for escaping strings + * @param type Which type of query is required + * @param t Generic variable whose use depends on the query + * @param t2 Generic variable whose use depends on the query + * @return Returns a string which contains a query + * @throws PostgresError Thrown if escaping strings fails + */ + public static string get_query (Connection conn, Type type, T? t = null, T? t2 = null) throws PostgresError { switch (type) { case SELECT_ALL_CITIES: return " @@ -247,7 +261,7 @@ id_tour = " + tour.id_tour.to_string () + " case INSERT_VEHICLE_REQUIRED: RequerirAuto requerir_auto = (RequerirAuto) t; - return " + return " INSERT INTO requerir_auto (id_tour, patente, chofer) VALUES @@ -259,7 +273,7 @@ VALUES case UPDATE_VEHICLE_REQUIRED: RequerirAuto requerir_auto = (RequerirAuto) t; - return " + return " UPDATE requerir_auto SET patente = '" + conn.escape (requerir_auto.vehiculo.patente) + "', chofer = '" + conn.escape (requerir_auto.chofer) + "' @@ -267,10 +281,55 @@ WHERE id_tour = " + requerir_auto.tour.id_tour.to_string (); case DELETE_VEHICLE_REQUIRED: Tour tour = (Tour) t; - return " + return " DELETE FROM requerir_auto WHERE ( id_tour = " + tour.id_tour.to_string () + " +)"; + + case SELECT_ALL_TOURISTS: + return " +SELECT T.rut_turista, T.nombre_turista, T.fecha_nacimento, +C.id_contacto, C.telefono_emergencia, C.nombre_emergencia +FROM turista T +LEFT JOIN contacto_emergencia C ON (T.id_contacto = C.id_contacto)"; + + case SELECT_TOURIST_BY_RUN: + string run = (string) t; + return " +SELECT T.rut_turista, T.nombre_turista, T.fecha_nacimento, +C.id_contacto, C.telefono_emergencia, C.nombre_emergencia +FROM turista T +LEFT JOIN contacto_emergencia C ON (T.id_contacto = C.id_contacto) +WHERE rut_turista = '" + conn.escape (run) + "'"; + + case INSERT_TOURIST: + Turista turista = (Turista) t; + return " +INSERT INTO turista +(rut_turista, nombre_turista, fecha_nacimento) +VALUES +( +'" + conn.escape (turista.rut_turista) + "'', +'" + conn.escape (turista.nombre_turista) + "', +'" + conn.escape (turista.fecha_nacimento) + "' +)"; + + case UPDATE_TOURIST: + Turista turista = (Turista) t; + return " +UPDATE turista SET +rut_turista = '" + conn.escape (turista.rut_turista) + "', +nombre_turista = '" + conn.escape (turista.nombre_turista) + "', +fecha_nacimento = '" + conn.escape (turista.fecha_nacimento) + "' +WHERE rut_turista = '" + conn.escape ((string) t2) + "'"; + + case DELETE_TOURIST: + Turista turista = (Turista) t; + return " +DELETE FROM turista +WHERE ( +rut_turista = '" + conn.escape (turista.rut_turista) + "' )"; default: diff --git a/po/POTFILES b/po/POTFILES index eab1743..f25eda1 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -6,12 +6,18 @@ lib/db/ciudad.vala lib/db/lugar.vala lib/db/region.vala lib/db/tour.vala +lib/db/requerir_auto.vala +lib/db/turista.vala src/sernatur.vala src/main_window.vala src/tour_list.vala src/tour_editor.vala src/tour_places.vala src/tour_assign_vehicle.vala +src/tourist_list.vala +src/tourist_editor.vala +src/tourist_illnesses.vala +src/tourist_illness_editor.vala src/query_window.vala data/ui/main.window.ui data/ui/main.splash.ui @@ -20,6 +26,10 @@ data/ui/tour.editor.ui data/ui/tour.places.ui data/ui/tour.place.editor.ui data/ui/tour.assign.vehicle.ui +data/ui/tourist.list.ui +data/ui/tourist.editor.ui +data/ui/tourist.illnesses.ui +data/ui/tourist.illness.editor.ui data/ui/place.editor.ui data/ui/query.window.ui data/ui/query.tree.ui diff --git a/po/es.po b/po/es.po index 51bef8d..93b8c41 100644 --- a/po/es.po +++ b/po/es.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: sernatur\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-20 17:47-0300\n" -"PO-Revision-Date: 2019-01-20 17:51-0300\n" +"POT-Creation-Date: 2019-01-21 00:47-0300\n" +"PO-Revision-Date: 2019-01-21 00:57-0300\n" "Last-Translator: Chris Cromer \n" "Language-Team: none\n" "Language: es\n" @@ -45,7 +45,7 @@ msgid "The verifier %C is invalid!" msgstr "El verificador %C es invalido!" #: lib/db/asociado.vala:121 lib/db/tour.vala:123 lib/db/tour.vala:145 -#: lib/db/tour.vala:180 +#: lib/db/tour.vala:180 lib/db/requerir_auto.vala:196 msgid "The id of the tour is invalid!" msgstr "El id del tour es invalido!" @@ -69,6 +69,14 @@ msgstr "El id del lugar es invalida!" msgid "The id of the region is invalid!" msgstr "El id de la región es invalida!" +#: lib/db/requerir_auto.vala:154 lib/db/requerir_auto.vala:175 +msgid "The id of the tour or the license plate for the vehicle is invalid!" +msgstr "El id del tour o del patente es invalido!" + +#: lib/db/turista.vala:149 lib/db/turista.vala:170 lib/db/turista.vala:191 +msgid "The RUN of the tourist is invalid!" +msgstr "El RUN de la turista es invalido!" + #: src/sernatur.vala:87 #, c-format msgid "Error: %s\n" @@ -85,14 +93,16 @@ msgstr "" msgid "SERNATUR version: " msgstr "Versión de SERNATUR: " -#: src/main_window.vala:216 +#: src/main_window.vala:227 msgid "Error: Could not connect to the database!" msgstr "Error: No se puede conectar al base de datos!" -#: src/main_window.vala:228 src/tour_list.vala:233 src/tour_editor.vala:231 +#: src/main_window.vala:239 src/tour_list.vala:233 src/tour_editor.vala:231 #: src/tour_editor.vala:248 src/tour_editor.vala:280 src/tour_editor.vala:297 #: src/tour_editor.vala:329 src/tour_editor.vala:346 -#: src/tour_assign_vehicle.vala:99 +#: src/tour_assign_vehicle.vala:99 src/tourist_list.vala:206 +#: src/tourist_editor.vala:99 src/tourist_editor.vala:112 +#: src/tourist_editor.vala:128 src/tourist_editor.vala:141 msgid "Error" msgstr "Error" @@ -148,23 +158,66 @@ msgstr "Error: El nombre del chofer no puede estar en blanco!" msgid "Unassigned" msgstr "Sin asignar" -#: src/query_window.vala:290 data/ui/main.window.ui:127 +#: src/tourist_list.vala:164 +msgid "Are you sure you wish to delete this tourist?" +msgstr "¿Usted está seguro que quiere borrar esta turista?" + +#: src/tourist_list.vala:171 +msgid "Are you sure you wish to delete these tourists?" +msgstr "¿Usted está seguro que quiere borrar estas turistas?" + +#: src/tourist_list.vala:202 +#, c-format +msgid "" +"Error: Could not delete tourist \"%s\" because there is still information " +"associated with them!" +msgstr "" +"Error: No se puede borrar la turista \"%s\" porque hay información asociado " +"con la turista!" + +#: src/tourist_editor.vala:95 +msgid "Error: Tourist name cannot be left blank!" +msgstr "Error: El nombre de la turista no puede estar en blanco!" + +#: src/tourist_editor.vala:108 +msgid "Error: Tourist RUN cannot be left blank!" +msgstr "Error: El RUN de la turista no puede estar en blanco!" + +#: src/tourist_editor.vala:124 +msgid "Error: The RUN entered is invalid!" +msgstr "Error: El RUN ingresado es invalido!" + +#: src/tourist_editor.vala:137 +#, c-format +msgid "Error: A tourist with the RUN \"%s\" already exists!" +msgstr "Error: Una turista con el RUN \"%s\" ya existe!" + +#: src/tourist_illnesses.vala:129 +msgid "Are you sure you wish to delete this illness from this tourist?" +msgstr "¿Usted está seguro que quiere borrar este enfermedad de la turista?" + +#: src/tourist_illnesses.vala:136 +msgid "Are you sure you wish to delete these illnesses from this tourist?" +msgstr "" +"¿Usted está seguro que quiere borrar estos enfermedades de esta turista?" + +#: src/query_window.vala:290 data/ui/main.window.ui:105 msgid "(Q1) Regions with discounts" msgstr "(Q1) Regiones sin descuentos" -#: src/query_window.vala:303 data/ui/main.window.ui:135 +#: src/query_window.vala:303 data/ui/main.window.ui:113 msgid "(Q2) Tour values" msgstr "(Q2) Valores tour" -#: src/query_window.vala:316 data/ui/main.window.ui:143 +#: src/query_window.vala:316 data/ui/main.window.ui:121 msgid "(Q3) Coordinator total" msgstr "(Q3) Total de coordinadores" -#: src/query_window.vala:329 data/ui/main.window.ui:151 +#: src/query_window.vala:329 data/ui/main.window.ui:129 msgid "(Q4) Tourist total" msgstr "(Q4) Total de turistas" -#: src/query_window.vala:342 data/ui/main.window.ui:159 +#: src/query_window.vala:342 data/ui/main.window.ui:137 msgid "(Q5) Vehicle total" msgstr "(Q5) Total de vehículos" @@ -180,23 +233,15 @@ msgstr "Tours" msgid "Staff" msgstr "Empleados" -#: data/ui/main.window.ui:69 +#: data/ui/main.window.ui:69 data/ui/tourist.list.ui:23 msgid "Tourists" msgstr "Turistas" -#: data/ui/main.window.ui:79 -msgid "Illnesses" -msgstr "Enfermedades" - -#: data/ui/main.window.ui:87 -msgid "Participate" -msgstr "Participar" - -#: data/ui/main.window.ui:105 +#: data/ui/main.window.ui:83 msgid "Quit" msgstr "Salir" -#: data/ui/main.window.ui:117 +#: data/ui/main.window.ui:95 msgid "_Views" msgstr "_Vistas" @@ -231,7 +276,7 @@ msgstr "Ciudad" msgid "Region" msgstr "Región" -#: data/ui/tour.list.ui:170 +#: data/ui/tour.list.ui:170 data/ui/tourist.list.ui:128 msgid "Edit" msgstr "Editar" @@ -240,6 +285,7 @@ msgid "Edit selected tour." msgstr "Editar el tour seleccionado." #: data/ui/tour.list.ui:185 data/ui/tour.places.ui:212 +#: data/ui/tourist.list.ui:143 msgid "New" msgstr "Nuevo" @@ -247,7 +293,8 @@ msgstr "Nuevo" msgid "Create a new tour." msgstr "Crear un tour nuevo." -#: data/ui/tour.list.ui:199 +#: data/ui/tour.list.ui:199 data/ui/tourist.list.ui:157 +#: data/ui/tourist.illnesses.ui:128 msgid "Delete" msgstr "Borrar" @@ -256,11 +303,14 @@ msgid "Delete selected tour." msgstr "Borrar el tour seleccionado." #: data/ui/tour.list.ui:214 data/ui/tour.places.ui:198 -#: data/ui/query.window.ui:66 +#: data/ui/tourist.list.ui:172 data/ui/tourist.illnesses.ui:114 +#: data/ui/tourist.illness.editor.ui:73 data/ui/query.window.ui:66 msgid "Close" msgstr "Cerrar" #: data/ui/tour.list.ui:218 data/ui/tour.places.ui:202 +#: data/ui/tourist.list.ui:176 data/ui/tourist.illnesses.ui:118 +#: data/ui/tourist.illness.editor.ui:77 msgid "Close this window." msgstr "Cerrar esta ventana." @@ -277,7 +327,8 @@ msgid "Create a new city by typing here." msgstr "Crear una nueva ciudad con escribir aquí." #: data/ui/tour.editor.ui:286 data/ui/tour.place.editor.ui:149 -#: data/ui/tour.assign.vehicle.ui:67 data/ui/place.editor.ui:250 +#: data/ui/tour.assign.vehicle.ui:67 data/ui/tourist.editor.ui:131 +#: data/ui/place.editor.ui:250 msgid "Cancel" msgstr "Cancelar" @@ -302,7 +353,8 @@ msgid "Assign a vehicle to this tour." msgstr "Asignar un vehículo a este tour." #: data/ui/tour.editor.ui:343 data/ui/tour.place.editor.ui:168 -#: data/ui/tour.assign.vehicle.ui:86 data/ui/place.editor.ui:269 +#: data/ui/tour.assign.vehicle.ui:86 data/ui/tourist.editor.ui:169 +#: data/ui/place.editor.ui:269 msgid "Save" msgstr "Guardar" @@ -338,7 +390,8 @@ msgstr "Fecha de Salida" msgid "Departure Time" msgstr "Hora de Salida" -#: data/ui/tour.places.ui:184 +#: data/ui/tour.places.ui:184 data/ui/tourist.illnesses.ui:100 +#: data/ui/tourist.illness.editor.ui:92 msgid "Add" msgstr "Agregar" @@ -370,67 +423,83 @@ msgstr "Salida" msgid "Cancel the modification of this place." msgstr "Cancelar la modificación de este lugar." -#: data/ui/tour.place.editor.ui:172 data/ui/place.editor.ui:273 +#: data/ui/tour.place.editor.ui:172 data/ui/tourist.illness.editor.ui:96 +#: data/ui/place.editor.ui:273 msgid "Save this place." msgstr "Guardar este lugar." #: data/ui/tour.place.editor.ui:270 data/ui/tour.place.editor.ui:440 +#: data/ui/tourist.editor.ui:223 msgid "Year" msgstr "Año" #: data/ui/tour.place.editor.ui:286 data/ui/tour.place.editor.ui:456 +#: data/ui/tourist.editor.ui:239 msgid "Month" msgstr "Mes" #: data/ui/tour.place.editor.ui:298 data/ui/tour.place.editor.ui:472 +#: data/ui/tourist.editor.ui:251 msgid "Day" msgstr "Día" #: data/ui/tour.place.editor.ui:341 data/ui/tour.place.editor.ui:517 +#: data/ui/tourist.editor.ui:294 msgid "January" msgstr "Enero" #: data/ui/tour.place.editor.ui:342 data/ui/tour.place.editor.ui:518 +#: data/ui/tourist.editor.ui:295 msgid "February" msgstr "Febraro" #: data/ui/tour.place.editor.ui:343 data/ui/tour.place.editor.ui:519 +#: data/ui/tourist.editor.ui:296 msgid "March" msgstr "Marzo" #: data/ui/tour.place.editor.ui:344 data/ui/tour.place.editor.ui:520 +#: data/ui/tourist.editor.ui:297 msgid "April" msgstr "Abril" #: data/ui/tour.place.editor.ui:345 data/ui/tour.place.editor.ui:521 +#: data/ui/tourist.editor.ui:298 msgid "May" msgstr "Mayo" #: data/ui/tour.place.editor.ui:346 data/ui/tour.place.editor.ui:522 +#: data/ui/tourist.editor.ui:299 msgid "June" msgstr "Junio" #: data/ui/tour.place.editor.ui:347 data/ui/tour.place.editor.ui:523 +#: data/ui/tourist.editor.ui:300 msgid "July" msgstr "Julio" #: data/ui/tour.place.editor.ui:348 data/ui/tour.place.editor.ui:524 +#: data/ui/tourist.editor.ui:301 msgid "August" msgstr "Agosto" #: data/ui/tour.place.editor.ui:349 data/ui/tour.place.editor.ui:525 +#: data/ui/tourist.editor.ui:302 msgid "September" msgstr "Septiembre" #: data/ui/tour.place.editor.ui:350 data/ui/tour.place.editor.ui:526 +#: data/ui/tourist.editor.ui:303 msgid "October" msgstr "Octubre" #: data/ui/tour.place.editor.ui:351 data/ui/tour.place.editor.ui:527 +#: data/ui/tourist.editor.ui:304 msgid "November" msgstr "Noviembre" #: data/ui/tour.place.editor.ui:352 data/ui/tour.place.editor.ui:528 +#: data/ui/tourist.editor.ui:305 msgid "December" msgstr "Diciembre" @@ -450,6 +519,66 @@ msgstr "Conductor" msgid "The licence plate, make, year, and capacity of the vehicle." msgstr "La patente, marca, año y capacidad del vehículo." +#: data/ui/tourist.list.ui:68 data/ui/tourist.editor.ui:60 +msgid "RUN" +msgstr "RUN" + +#: data/ui/tourist.list.ui:82 data/ui/tourist.editor.ui:93 +msgid "Name" +msgstr "Nombre" + +#: data/ui/tourist.list.ui:96 data/ui/tourist.editor.ui:201 +msgid "Birthdate" +msgstr "Fecha de nacimiento" + +#: data/ui/tourist.list.ui:133 +msgid "Edit selected tourist." +msgstr "Editar la turista seleccionada." + +#: data/ui/tourist.list.ui:147 +msgid "Create a new tourist." +msgstr "Crear una turista nueva." + +#: data/ui/tourist.list.ui:162 +msgid "Delete selected tourist." +msgstr "Borrar la turista seleccionada." + +#: data/ui/tourist.editor.ui:36 +msgid "Tourist Editor" +msgstr "Editor de Turista" + +#: data/ui/tourist.editor.ui:135 +msgid "Cancel the modification of this tourist." +msgstr "Cancelar la modificación de esta turista." + +#: data/ui/tourist.editor.ui:150 data/ui/tourist.illnesses.ui:23 +msgid "Illnesses" +msgstr "Enfermedades" + +#: data/ui/tourist.editor.ui:154 +msgid "Add or edit illnesses." +msgstr "Agregar o editar enfermedades." + +#: data/ui/tourist.editor.ui:173 +msgid "Save this tourist." +msgstr "Guardar esta turista." + +#: data/ui/tourist.illnesses.ui:68 data/ui/tourist.illness.editor.ui:53 +msgid "Illness" +msgstr "Enfermedad" + +#: data/ui/tourist.illnesses.ui:104 +msgid "Add new illnesses." +msgstr "Agregar nuevo enfermedades." + +#: data/ui/tourist.illnesses.ui:132 +msgid "Delete illnesses." +msgstr "Borrar enfermedades." + +#: data/ui/tourist.illness.editor.ui:22 +msgid "Add Illness" +msgstr "Agregar Enfermedad" + #: data/ui/place.editor.ui:27 msgid "Place Editor" msgstr "Editor de Lugar" diff --git a/po/es_CL.po b/po/es_CL.po index 9ecec68..0d9d3be 100644 --- a/po/es_CL.po +++ b/po/es_CL.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: sernatur\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-20 17:47-0300\n" -"PO-Revision-Date: 2019-01-20 17:54-0300\n" +"POT-Creation-Date: 2019-01-21 00:47-0300\n" +"PO-Revision-Date: 2019-01-21 00:57-0300\n" "Last-Translator: Chris Cromer \n" "Language-Team: none\n" "Language: es\n" @@ -45,7 +45,7 @@ msgid "The verifier %C is invalid!" msgstr "La wea %C es invalido!" #: lib/db/asociado.vala:121 lib/db/tour.vala:123 lib/db/tour.vala:145 -#: lib/db/tour.vala:180 +#: lib/db/tour.vala:180 lib/db/requerir_auto.vala:196 msgid "The id of the tour is invalid!" msgstr "El id de la wea es invalida!" @@ -69,6 +69,14 @@ msgstr "El id de la wea es invalida!" msgid "The id of the region is invalid!" msgstr "El id de la wea es invalida!" +#: lib/db/requerir_auto.vala:154 lib/db/requerir_auto.vala:175 +msgid "The id of the tour or the license plate for the vehicle is invalid!" +msgstr "El id del tour o del patente es invalido!" + +#: lib/db/turista.vala:149 lib/db/turista.vala:170 lib/db/turista.vala:191 +msgid "The RUN of the tourist is invalid!" +msgstr "El RUN de la turista es invalido!" + #: src/sernatur.vala:87 #, c-format msgid "Error: %s\n" @@ -85,14 +93,16 @@ msgstr "" msgid "SERNATUR version: " msgstr "Versión de SERNATUR: " -#: src/main_window.vala:216 +#: src/main_window.vala:227 msgid "Error: Could not connect to the database!" msgstr "Puta la wea: No se puede conectar al base de datos!" -#: src/main_window.vala:228 src/tour_list.vala:233 src/tour_editor.vala:231 +#: src/main_window.vala:239 src/tour_list.vala:233 src/tour_editor.vala:231 #: src/tour_editor.vala:248 src/tour_editor.vala:280 src/tour_editor.vala:297 #: src/tour_editor.vala:329 src/tour_editor.vala:346 -#: src/tour_assign_vehicle.vala:99 +#: src/tour_assign_vehicle.vala:99 src/tourist_list.vala:206 +#: src/tourist_editor.vala:99 src/tourist_editor.vala:112 +#: src/tourist_editor.vala:128 src/tourist_editor.vala:141 msgid "Error" msgstr "Puta la wea" @@ -148,23 +158,66 @@ msgstr "Error: El nombre del weon no puede estar en blanco!" msgid "Unassigned" msgstr "Ninguna wea" -#: src/query_window.vala:290 data/ui/main.window.ui:127 +#: src/tourist_list.vala:164 +msgid "Are you sure you wish to delete this tourist?" +msgstr "¿Usted está seguro que quiere borrar esta turista?" + +#: src/tourist_list.vala:171 +msgid "Are you sure you wish to delete these tourists?" +msgstr "¿Usted está seguro que quiere borrar estas turistas?" + +#: src/tourist_list.vala:202 +#, c-format +msgid "" +"Error: Could not delete tourist \"%s\" because there is still information " +"associated with them!" +msgstr "" +"Error: No se puede borrar la turista \"%s\" porque hay información asociado " +"con la turista!" + +#: src/tourist_editor.vala:95 +msgid "Error: Tourist name cannot be left blank!" +msgstr "Error: El nombre de la turista no puede estar en blanco!" + +#: src/tourist_editor.vala:108 +msgid "Error: Tourist RUN cannot be left blank!" +msgstr "Error: El RUN de la turista no puede estar en blanco!" + +#: src/tourist_editor.vala:124 +msgid "Error: The RUN entered is invalid!" +msgstr "Error: El RUN ingresado es invalido!" + +#: src/tourist_editor.vala:137 +#, c-format +msgid "Error: A tourist with the RUN \"%s\" already exists!" +msgstr "Error: Una turista con el RUN \"%s\" ya existe!" + +#: src/tourist_illnesses.vala:129 +msgid "Are you sure you wish to delete this illness from this tourist?" +msgstr "¿Usted está seguro que quiere borrar este enfermedad de la turista?" + +#: src/tourist_illnesses.vala:136 +msgid "Are you sure you wish to delete these illnesses from this tourist?" +msgstr "" +"¿Usted está seguro que quiere borrar estos enfermedades de esta turista?" + +#: src/query_window.vala:290 data/ui/main.window.ui:105 msgid "(Q1) Regions with discounts" msgstr "(Q1) Regiones sin descuentos" -#: src/query_window.vala:303 data/ui/main.window.ui:135 +#: src/query_window.vala:303 data/ui/main.window.ui:113 msgid "(Q2) Tour values" msgstr "(Q2) Valores tour" -#: src/query_window.vala:316 data/ui/main.window.ui:143 +#: src/query_window.vala:316 data/ui/main.window.ui:121 msgid "(Q3) Coordinator total" msgstr "(Q3) Total de coordinadores" -#: src/query_window.vala:329 data/ui/main.window.ui:151 +#: src/query_window.vala:329 data/ui/main.window.ui:129 msgid "(Q4) Tourist total" msgstr "(Q4) Total de turistas" -#: src/query_window.vala:342 data/ui/main.window.ui:159 +#: src/query_window.vala:342 data/ui/main.window.ui:137 msgid "(Q5) Vehicle total" msgstr "(Q5) Total de vehículos" @@ -180,23 +233,15 @@ msgstr "Tours" msgid "Staff" msgstr "Weones flojos" -#: data/ui/main.window.ui:69 +#: data/ui/main.window.ui:69 data/ui/tourist.list.ui:23 msgid "Tourists" msgstr "Weones visitores" -#: data/ui/main.window.ui:79 -msgid "Illnesses" -msgstr "Enfermedades" - -#: data/ui/main.window.ui:87 -msgid "Participate" -msgstr "Participar" - -#: data/ui/main.window.ui:105 +#: data/ui/main.window.ui:83 msgid "Quit" msgstr "Salir de la wea" -#: data/ui/main.window.ui:117 +#: data/ui/main.window.ui:95 msgid "_Views" msgstr "_Vistas" @@ -231,7 +276,7 @@ msgstr "Ciudad" msgid "Region" msgstr "Región" -#: data/ui/tour.list.ui:170 +#: data/ui/tour.list.ui:170 data/ui/tourist.list.ui:128 msgid "Edit" msgstr "Editar la wea" @@ -240,6 +285,7 @@ msgid "Edit selected tour." msgstr "Editar la wea seleccionado." #: data/ui/tour.list.ui:185 data/ui/tour.places.ui:212 +#: data/ui/tourist.list.ui:143 msgid "New" msgstr "Nueva wea" @@ -247,7 +293,8 @@ msgstr "Nueva wea" msgid "Create a new tour." msgstr "Crear una wea nueva." -#: data/ui/tour.list.ui:199 +#: data/ui/tour.list.ui:199 data/ui/tourist.list.ui:157 +#: data/ui/tourist.illnesses.ui:128 msgid "Delete" msgstr "Borrar la wea" @@ -256,11 +303,14 @@ msgid "Delete selected tour." msgstr "Borrar la wea seleccionado." #: data/ui/tour.list.ui:214 data/ui/tour.places.ui:198 -#: data/ui/query.window.ui:66 +#: data/ui/tourist.list.ui:172 data/ui/tourist.illnesses.ui:114 +#: data/ui/tourist.illness.editor.ui:73 data/ui/query.window.ui:66 msgid "Close" msgstr "Cerrar la wea" #: data/ui/tour.list.ui:218 data/ui/tour.places.ui:202 +#: data/ui/tourist.list.ui:176 data/ui/tourist.illnesses.ui:118 +#: data/ui/tourist.illness.editor.ui:77 msgid "Close this window." msgstr "Cerrar la wea." @@ -277,7 +327,8 @@ msgid "Create a new city by typing here." msgstr "Crear una nueva wea con escribir aquí." #: data/ui/tour.editor.ui:286 data/ui/tour.place.editor.ui:149 -#: data/ui/tour.assign.vehicle.ui:67 data/ui/place.editor.ui:250 +#: data/ui/tour.assign.vehicle.ui:67 data/ui/tourist.editor.ui:131 +#: data/ui/place.editor.ui:250 msgid "Cancel" msgstr "Cancelar la wea" @@ -302,7 +353,8 @@ msgid "Assign a vehicle to this tour." msgstr "Asignar un vehículo a esta wea." #: data/ui/tour.editor.ui:343 data/ui/tour.place.editor.ui:168 -#: data/ui/tour.assign.vehicle.ui:86 data/ui/place.editor.ui:269 +#: data/ui/tour.assign.vehicle.ui:86 data/ui/tourist.editor.ui:169 +#: data/ui/place.editor.ui:269 msgid "Save" msgstr "Guardar la wea" @@ -338,7 +390,8 @@ msgstr "Fecha de Salida" msgid "Departure Time" msgstr "Hora de Salida" -#: data/ui/tour.places.ui:184 +#: data/ui/tour.places.ui:184 data/ui/tourist.illnesses.ui:100 +#: data/ui/tourist.illness.editor.ui:92 msgid "Add" msgstr "Agregar una wea" @@ -370,67 +423,83 @@ msgstr "Salida" msgid "Cancel the modification of this place." msgstr "Cancelar la modificación de esta wea." -#: data/ui/tour.place.editor.ui:172 data/ui/place.editor.ui:273 +#: data/ui/tour.place.editor.ui:172 data/ui/tourist.illness.editor.ui:96 +#: data/ui/place.editor.ui:273 msgid "Save this place." msgstr "Guardar esta wea." #: data/ui/tour.place.editor.ui:270 data/ui/tour.place.editor.ui:440 +#: data/ui/tourist.editor.ui:223 msgid "Year" msgstr "Año" #: data/ui/tour.place.editor.ui:286 data/ui/tour.place.editor.ui:456 +#: data/ui/tourist.editor.ui:239 msgid "Month" msgstr "Mes" #: data/ui/tour.place.editor.ui:298 data/ui/tour.place.editor.ui:472 +#: data/ui/tourist.editor.ui:251 msgid "Day" msgstr "Día" #: data/ui/tour.place.editor.ui:341 data/ui/tour.place.editor.ui:517 +#: data/ui/tourist.editor.ui:294 msgid "January" msgstr "Enero" #: data/ui/tour.place.editor.ui:342 data/ui/tour.place.editor.ui:518 +#: data/ui/tourist.editor.ui:295 msgid "February" msgstr "Febraro" #: data/ui/tour.place.editor.ui:343 data/ui/tour.place.editor.ui:519 +#: data/ui/tourist.editor.ui:296 msgid "March" msgstr "Marzo" #: data/ui/tour.place.editor.ui:344 data/ui/tour.place.editor.ui:520 +#: data/ui/tourist.editor.ui:297 msgid "April" msgstr "Abril" #: data/ui/tour.place.editor.ui:345 data/ui/tour.place.editor.ui:521 +#: data/ui/tourist.editor.ui:298 msgid "May" msgstr "Mayo" #: data/ui/tour.place.editor.ui:346 data/ui/tour.place.editor.ui:522 +#: data/ui/tourist.editor.ui:299 msgid "June" msgstr "Junio" #: data/ui/tour.place.editor.ui:347 data/ui/tour.place.editor.ui:523 +#: data/ui/tourist.editor.ui:300 msgid "July" msgstr "Julio" #: data/ui/tour.place.editor.ui:348 data/ui/tour.place.editor.ui:524 +#: data/ui/tourist.editor.ui:301 msgid "August" msgstr "Agosto" #: data/ui/tour.place.editor.ui:349 data/ui/tour.place.editor.ui:525 +#: data/ui/tourist.editor.ui:302 msgid "September" msgstr "Septiembre" #: data/ui/tour.place.editor.ui:350 data/ui/tour.place.editor.ui:526 +#: data/ui/tourist.editor.ui:303 msgid "October" msgstr "Octubre" #: data/ui/tour.place.editor.ui:351 data/ui/tour.place.editor.ui:527 +#: data/ui/tourist.editor.ui:304 msgid "November" msgstr "Noviembre" #: data/ui/tour.place.editor.ui:352 data/ui/tour.place.editor.ui:528 +#: data/ui/tourist.editor.ui:305 msgid "December" msgstr "Diciembre" @@ -450,6 +519,66 @@ msgstr "Conductor" msgid "The licence plate, make, year, and capacity of the vehicle." msgstr "La patente, marca, año y capacidad de la wea." +#: data/ui/tourist.list.ui:68 data/ui/tourist.editor.ui:60 +msgid "RUN" +msgstr "RUN" + +#: data/ui/tourist.list.ui:82 data/ui/tourist.editor.ui:93 +msgid "Name" +msgstr "Nombre" + +#: data/ui/tourist.list.ui:96 data/ui/tourist.editor.ui:201 +msgid "Birthdate" +msgstr "Fecha de nacimiento" + +#: data/ui/tourist.list.ui:133 +msgid "Edit selected tourist." +msgstr "Editar la turista seleccionada." + +#: data/ui/tourist.list.ui:147 +msgid "Create a new tourist." +msgstr "Crear una turista nueva." + +#: data/ui/tourist.list.ui:162 +msgid "Delete selected tourist." +msgstr "Borrar la turista seleccionada." + +#: data/ui/tourist.editor.ui:36 +msgid "Tourist Editor" +msgstr "Editor de Turista" + +#: data/ui/tourist.editor.ui:135 +msgid "Cancel the modification of this tourist." +msgstr "Cancelar la modificación de esta turista." + +#: data/ui/tourist.editor.ui:150 data/ui/tourist.illnesses.ui:23 +msgid "Illnesses" +msgstr "Enfermedades" + +#: data/ui/tourist.editor.ui:154 +msgid "Add or edit illnesses." +msgstr "Agregar o editar enfermedades." + +#: data/ui/tourist.editor.ui:173 +msgid "Save this tourist." +msgstr "Guardar esta turista." + +#: data/ui/tourist.illnesses.ui:68 data/ui/tourist.illness.editor.ui:53 +msgid "Illness" +msgstr "Enfermedad" + +#: data/ui/tourist.illnesses.ui:104 +msgid "Add new illnesses." +msgstr "Agregar nuevo enfermedades." + +#: data/ui/tourist.illnesses.ui:132 +msgid "Delete illnesses." +msgstr "Borrar enfermedades." + +#: data/ui/tourist.illness.editor.ui:22 +msgid "Add Illness" +msgstr "Agregar Enfermedad" + #: data/ui/place.editor.ui:27 msgid "Place Editor" msgstr "Editor de la Wea" diff --git a/po/sernatur.pot b/po/sernatur.pot index 4c93153..ca17821 100644 --- a/po/sernatur.pot +++ b/po/sernatur.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: sernatur\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-20 17:47-0300\n" +"POT-Creation-Date: 2019-01-21 00:47-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,7 +42,7 @@ msgid "The verifier %C is invalid!" msgstr "" #: lib/db/asociado.vala:121 lib/db/tour.vala:123 lib/db/tour.vala:145 -#: lib/db/tour.vala:180 +#: lib/db/tour.vala:180 lib/db/requerir_auto.vala:196 msgid "The id of the tour is invalid!" msgstr "" @@ -66,6 +66,14 @@ msgstr "" msgid "The id of the region is invalid!" msgstr "" +#: lib/db/requerir_auto.vala:154 lib/db/requerir_auto.vala:175 +msgid "The id of the tour or the license plate for the vehicle is invalid!" +msgstr "" + +#: lib/db/turista.vala:149 lib/db/turista.vala:170 lib/db/turista.vala:191 +msgid "The RUN of the tourist is invalid!" +msgstr "" + #: src/sernatur.vala:87 #, c-format msgid "Error: %s\n" @@ -80,14 +88,16 @@ msgstr "" msgid "SERNATUR version: " msgstr "" -#: src/main_window.vala:216 +#: src/main_window.vala:227 msgid "Error: Could not connect to the database!" msgstr "" -#: src/main_window.vala:228 src/tour_list.vala:233 src/tour_editor.vala:231 +#: src/main_window.vala:239 src/tour_list.vala:233 src/tour_editor.vala:231 #: src/tour_editor.vala:248 src/tour_editor.vala:280 src/tour_editor.vala:297 #: src/tour_editor.vala:329 src/tour_editor.vala:346 -#: src/tour_assign_vehicle.vala:99 +#: src/tour_assign_vehicle.vala:99 src/tourist_list.vala:206 +#: src/tourist_editor.vala:99 src/tourist_editor.vala:112 +#: src/tourist_editor.vala:128 src/tourist_editor.vala:141 msgid "Error" msgstr "" @@ -141,23 +151,63 @@ msgstr "" msgid "Unassigned" msgstr "" -#: src/query_window.vala:290 data/ui/main.window.ui:127 +#: src/tourist_list.vala:164 +msgid "Are you sure you wish to delete this tourist?" +msgstr "" + +#: src/tourist_list.vala:171 +msgid "Are you sure you wish to delete these tourists?" +msgstr "" + +#: src/tourist_list.vala:202 +#, c-format +msgid "" +"Error: Could not delete tourist \"%s\" because there is still information " +"associated with them!" +msgstr "" + +#: src/tourist_editor.vala:95 +msgid "Error: Tourist name cannot be left blank!" +msgstr "" + +#: src/tourist_editor.vala:108 +msgid "Error: Tourist RUN cannot be left blank!" +msgstr "" + +#: src/tourist_editor.vala:124 +msgid "Error: The RUN entered is invalid!" +msgstr "" + +#: src/tourist_editor.vala:137 +#, c-format +msgid "Error: A tourist with the RUN \"%s\" already exists!" +msgstr "" + +#: src/tourist_illnesses.vala:129 +msgid "Are you sure you wish to delete this illness from this tourist?" +msgstr "" + +#: src/tourist_illnesses.vala:136 +msgid "Are you sure you wish to delete these illnesses from this tourist?" +msgstr "" + +#: src/query_window.vala:290 data/ui/main.window.ui:105 msgid "(Q1) Regions with discounts" msgstr "" -#: src/query_window.vala:303 data/ui/main.window.ui:135 +#: src/query_window.vala:303 data/ui/main.window.ui:113 msgid "(Q2) Tour values" msgstr "" -#: src/query_window.vala:316 data/ui/main.window.ui:143 +#: src/query_window.vala:316 data/ui/main.window.ui:121 msgid "(Q3) Coordinator total" msgstr "" -#: src/query_window.vala:329 data/ui/main.window.ui:151 +#: src/query_window.vala:329 data/ui/main.window.ui:129 msgid "(Q4) Tourist total" msgstr "" -#: src/query_window.vala:342 data/ui/main.window.ui:159 +#: src/query_window.vala:342 data/ui/main.window.ui:137 msgid "(Q5) Vehicle total" msgstr "" @@ -173,23 +223,15 @@ msgstr "" msgid "Staff" msgstr "" -#: data/ui/main.window.ui:69 +#: data/ui/main.window.ui:69 data/ui/tourist.list.ui:23 msgid "Tourists" msgstr "" -#: data/ui/main.window.ui:79 -msgid "Illnesses" -msgstr "" - -#: data/ui/main.window.ui:87 -msgid "Participate" -msgstr "" - -#: data/ui/main.window.ui:105 +#: data/ui/main.window.ui:83 msgid "Quit" msgstr "" -#: data/ui/main.window.ui:117 +#: data/ui/main.window.ui:95 msgid "_Views" msgstr "" @@ -224,7 +266,7 @@ msgstr "" msgid "Region" msgstr "" -#: data/ui/tour.list.ui:170 +#: data/ui/tour.list.ui:170 data/ui/tourist.list.ui:128 msgid "Edit" msgstr "" @@ -233,6 +275,7 @@ msgid "Edit selected tour." msgstr "" #: data/ui/tour.list.ui:185 data/ui/tour.places.ui:212 +#: data/ui/tourist.list.ui:143 msgid "New" msgstr "" @@ -240,7 +283,8 @@ msgstr "" msgid "Create a new tour." msgstr "" -#: data/ui/tour.list.ui:199 +#: data/ui/tour.list.ui:199 data/ui/tourist.list.ui:157 +#: data/ui/tourist.illnesses.ui:128 msgid "Delete" msgstr "" @@ -249,11 +293,14 @@ msgid "Delete selected tour." msgstr "" #: data/ui/tour.list.ui:214 data/ui/tour.places.ui:198 -#: data/ui/query.window.ui:66 +#: data/ui/tourist.list.ui:172 data/ui/tourist.illnesses.ui:114 +#: data/ui/tourist.illness.editor.ui:73 data/ui/query.window.ui:66 msgid "Close" msgstr "" #: data/ui/tour.list.ui:218 data/ui/tour.places.ui:202 +#: data/ui/tourist.list.ui:176 data/ui/tourist.illnesses.ui:118 +#: data/ui/tourist.illness.editor.ui:77 msgid "Close this window." msgstr "" @@ -270,7 +317,8 @@ msgid "Create a new city by typing here." msgstr "" #: data/ui/tour.editor.ui:286 data/ui/tour.place.editor.ui:149 -#: data/ui/tour.assign.vehicle.ui:67 data/ui/place.editor.ui:250 +#: data/ui/tour.assign.vehicle.ui:67 data/ui/tourist.editor.ui:131 +#: data/ui/place.editor.ui:250 msgid "Cancel" msgstr "" @@ -295,7 +343,8 @@ msgid "Assign a vehicle to this tour." msgstr "" #: data/ui/tour.editor.ui:343 data/ui/tour.place.editor.ui:168 -#: data/ui/tour.assign.vehicle.ui:86 data/ui/place.editor.ui:269 +#: data/ui/tour.assign.vehicle.ui:86 data/ui/tourist.editor.ui:169 +#: data/ui/place.editor.ui:269 msgid "Save" msgstr "" @@ -331,7 +380,8 @@ msgstr "" msgid "Departure Time" msgstr "" -#: data/ui/tour.places.ui:184 +#: data/ui/tour.places.ui:184 data/ui/tourist.illnesses.ui:100 +#: data/ui/tourist.illness.editor.ui:92 msgid "Add" msgstr "" @@ -363,67 +413,83 @@ msgstr "" msgid "Cancel the modification of this place." msgstr "" -#: data/ui/tour.place.editor.ui:172 data/ui/place.editor.ui:273 +#: data/ui/tour.place.editor.ui:172 data/ui/tourist.illness.editor.ui:96 +#: data/ui/place.editor.ui:273 msgid "Save this place." msgstr "" #: data/ui/tour.place.editor.ui:270 data/ui/tour.place.editor.ui:440 +#: data/ui/tourist.editor.ui:223 msgid "Year" msgstr "" #: data/ui/tour.place.editor.ui:286 data/ui/tour.place.editor.ui:456 +#: data/ui/tourist.editor.ui:239 msgid "Month" msgstr "" #: data/ui/tour.place.editor.ui:298 data/ui/tour.place.editor.ui:472 +#: data/ui/tourist.editor.ui:251 msgid "Day" msgstr "" #: data/ui/tour.place.editor.ui:341 data/ui/tour.place.editor.ui:517 +#: data/ui/tourist.editor.ui:294 msgid "January" msgstr "" #: data/ui/tour.place.editor.ui:342 data/ui/tour.place.editor.ui:518 +#: data/ui/tourist.editor.ui:295 msgid "February" msgstr "" #: data/ui/tour.place.editor.ui:343 data/ui/tour.place.editor.ui:519 +#: data/ui/tourist.editor.ui:296 msgid "March" msgstr "" #: data/ui/tour.place.editor.ui:344 data/ui/tour.place.editor.ui:520 +#: data/ui/tourist.editor.ui:297 msgid "April" msgstr "" #: data/ui/tour.place.editor.ui:345 data/ui/tour.place.editor.ui:521 +#: data/ui/tourist.editor.ui:298 msgid "May" msgstr "" #: data/ui/tour.place.editor.ui:346 data/ui/tour.place.editor.ui:522 +#: data/ui/tourist.editor.ui:299 msgid "June" msgstr "" #: data/ui/tour.place.editor.ui:347 data/ui/tour.place.editor.ui:523 +#: data/ui/tourist.editor.ui:300 msgid "July" msgstr "" #: data/ui/tour.place.editor.ui:348 data/ui/tour.place.editor.ui:524 +#: data/ui/tourist.editor.ui:301 msgid "August" msgstr "" #: data/ui/tour.place.editor.ui:349 data/ui/tour.place.editor.ui:525 +#: data/ui/tourist.editor.ui:302 msgid "September" msgstr "" #: data/ui/tour.place.editor.ui:350 data/ui/tour.place.editor.ui:526 +#: data/ui/tourist.editor.ui:303 msgid "October" msgstr "" #: data/ui/tour.place.editor.ui:351 data/ui/tour.place.editor.ui:527 +#: data/ui/tourist.editor.ui:304 msgid "November" msgstr "" #: data/ui/tour.place.editor.ui:352 data/ui/tour.place.editor.ui:528 +#: data/ui/tourist.editor.ui:305 msgid "December" msgstr "" @@ -443,6 +509,66 @@ msgstr "" msgid "The licence plate, make, year, and capacity of the vehicle." msgstr "" +#: data/ui/tourist.list.ui:68 data/ui/tourist.editor.ui:60 +msgid "RUN" +msgstr "" + +#: data/ui/tourist.list.ui:82 data/ui/tourist.editor.ui:93 +msgid "Name" +msgstr "" + +#: data/ui/tourist.list.ui:96 data/ui/tourist.editor.ui:201 +msgid "Birthdate" +msgstr "" + +#: data/ui/tourist.list.ui:133 +msgid "Edit selected tourist." +msgstr "" + +#: data/ui/tourist.list.ui:147 +msgid "Create a new tourist." +msgstr "" + +#: data/ui/tourist.list.ui:162 +msgid "Delete selected tourist." +msgstr "" + +#: data/ui/tourist.editor.ui:36 +msgid "Tourist Editor" +msgstr "" + +#: data/ui/tourist.editor.ui:135 +msgid "Cancel the modification of this tourist." +msgstr "" + +#: data/ui/tourist.editor.ui:150 data/ui/tourist.illnesses.ui:23 +msgid "Illnesses" +msgstr "" + +#: data/ui/tourist.editor.ui:154 +msgid "Add or edit illnesses." +msgstr "" + +#: data/ui/tourist.editor.ui:173 +msgid "Save this tourist." +msgstr "" + +#: data/ui/tourist.illnesses.ui:68 data/ui/tourist.illness.editor.ui:53 +msgid "Illness" +msgstr "" + +#: data/ui/tourist.illnesses.ui:104 +msgid "Add new illnesses." +msgstr "" + +#: data/ui/tourist.illnesses.ui:132 +msgid "Delete illnesses." +msgstr "" + +#: data/ui/tourist.illness.editor.ui:22 +msgid "Add Illness" +msgstr "" + #: data/ui/place.editor.ui:27 msgid "Place Editor" msgstr "" diff --git a/src/main_window.vala b/src/main_window.vala index 47c270e..49e4d5d 100644 --- a/src/main_window.vala +++ b/src/main_window.vala @@ -38,6 +38,11 @@ namespace Sernatur { */ [GtkChild] private Gtk.MenuItem tours; + /** + * The tourists menu item + */ + [GtkChild] + private Gtk.MenuItem tourists; /** * The Q1 menu item */ @@ -130,6 +135,12 @@ namespace Sernatur { tour_list.initialize (); tour_list.show_all (); } + if (menu_item == tourists) { + var tourist_list = new TouristList (application, conn); + tourist_list.set_transient_for (this); // Set this window as the parent of the new window + tourist_list.initialize (); + tourist_list.show_all (); + } else if (menu_item == q1) { var query_window = new QueryWindow (application, conn, Query.Q1); query_window.set_transient_for (this); // Set this window as the parent of the new window diff --git a/src/meson.build b/src/meson.build index 1f3fbe0..3480cc9 100644 --- a/src/meson.build +++ b/src/meson.build @@ -21,6 +21,10 @@ vala_sources = files( 'tour_places.vala', 'tour_place_editor.vala', 'tour_assign_vehicle.vala', + 'tourist_list.vala', + 'tourist_editor.vala', + 'tourist_illnesses.vala', + 'tourist_illness_editor.vala', 'place_editor.vala', 'queries.vala', 'query_window.vala') @@ -28,6 +32,7 @@ vala_sources = files( sources = vala_sources sources += main_gresource sources += tour_gresource +sources += tourist_gresource sources += place_gresource sources += query_gresource sources += config_data_file @@ -35,6 +40,7 @@ sources += config_data_file vala_args = ['--vapidir=' + join_paths(meson.source_root(), 'vapi')] vala_args += ['--gresources=' + join_paths(meson.source_root(), 'data/ui/main.gresource.xml')] vala_args += ['--gresources=' + join_paths(meson.source_root(), 'data/ui/tour.gresource.xml')] +vala_args += ['--gresources=' + join_paths(meson.source_root(), 'data/ui/tourist.gresource.xml')] vala_args += ['--gresources=' + join_paths(meson.source_root(), 'data/ui/place.gresource.xml')] vala_args += ['--gresources=' + join_paths(meson.source_root(), 'data/ui/query.gresource.xml')] diff --git a/src/tour_places.vala b/src/tour_places.vala index 8450edb..e549b8b 100644 --- a/src/tour_places.vala +++ b/src/tour_places.vala @@ -17,7 +17,7 @@ namespace Sernatur { using LibSernatur.DB; /** - * The tour list window class + * The tour place window class */ [GtkTemplate (ui = "/cl/cromer/ubb/sernatur/tour.places.ui")] public class TourPlaces : Gtk.ApplicationWindow { diff --git a/src/tourist_editor.vala b/src/tourist_editor.vala new file mode 100644 index 0000000..4a31978 --- /dev/null +++ b/src/tourist_editor.vala @@ -0,0 +1,322 @@ +/* + * Copyright 2018-2019 Chris Cromer + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Sernatur { + using LibSernatur.DB; + using LibSernatur.Misc; + + /** + * The tourist editor window class + */ + [GtkTemplate (ui = "/cl/cromer/ubb/sernatur/tourist.editor.ui")] + public class TouristEditor : Gtk.ApplicationWindow { + /** + * The open database connection + */ + private Connection conn; + /** + * The tourist to edit + */ + private Turista tourist; + /** + * The tourist run + */ + [GtkChild] + private Gtk.Entry run; + /** + * The tourist name + */ + [GtkChild] + private Gtk.Entry tourist_name; + /** + * The birth year + */ + [GtkChild] + private Gtk.SpinButton year; + /** + * The birth day + */ + [GtkChild] + private Gtk.SpinButton day; + /** + * The birth month + */ + [GtkChild] + private Gtk.ComboBoxText month; + /** + * The save button + */ + [GtkChild] + private Gtk.Button save; + /** + * The illnesses button + */ + [GtkChild] + private Gtk.Button illnesses; + /** + * The cancel button + */ + [GtkChild] + private Gtk.Button cancel; + /** + * A list of associated places, this is only used in the case of a new tourist + */ + //private List list_asociado = null; + /** + * A saved copy of the original RUN + */ + private string original_run; + /** + * This signal is called when a tourist is saved + */ + public signal void save_tourist (); + + /** + * Validate the tourist data before trying to insert it into the database + * @return Returns true if the data is valid + */ + private bool validate_tourist_data () { + if (tourist.nombre_turista.strip () == "") { + var msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + _ ("Error: Tourist name cannot be left blank!")); + msg.response.connect ((response_id) => { + msg.destroy (); + }); + msg.set_title (_ ("Error")); + msg.run (); + return false; + } + if (tourist.rut_turista.strip () == "") { + var msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + _ ("Error: Tourist RUN cannot be left blank!")); + msg.response.connect ((response_id) => { + msg.destroy (); + }); + msg.set_title (_ ("Error")); + msg.run (); + return false; + } + try { + new Rut (tourist.rut_turista.strip ()); + } + catch (Error e) { + var msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + _ ("Error: The RUN entered is invalid!")); + msg.response.connect ((response_id) => { + msg.destroy (); + }); + msg.set_title (_ ("Error")); + msg.run (); + return false; + } + if (tourist_exists () && tourist.rut_turista != original_run) { + var msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + _ ("Error: A tourist with the RUN \"%s\" already exists!"), tourist.rut_turista); + msg.response.connect ((response_id) => { + msg.destroy (); + }); + msg.set_title (_ ("Error")); + msg.run (); + return false; + } + return true; + } + + private bool tourist_exists () { + try { + tourist.rut_turista = new Rut (run.get_text ().strip ()).get_clean_rut (); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + try { + Turista turista = Turista.get_turista_by_run (conn, tourist.rut_turista); + if (turista == null) { + return false; + } + else { + return true; + } + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + return false; + #endif + } + } + + /** + * This callback is called when a button is clicked + * @param button The button that was clicked + */ + [GtkCallback] + public void on_clicked_button (Gtk.Button button) { + if (button == save) { + if (update_tourist_instance () && validate_tourist_data ()) { + if (!tourist_exists () && original_run == null) { + try { + Turista.insert_tourist (conn, tourist); + /*if (list_asociado != null) { + // Not enough time + // Insert all the pending illnesses + list_asociado.foreach ((entry) => { + try { + //Asociado.insert_asociado (conn, entry); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + }); + }*/ + save_tourist (); // Signal the parent to update itself + this.close (); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + } + else { + try { + Turista.update_tourist (conn, tourist, original_run); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + finally { + save_tourist (); // Signal the parent to update itself + this.close (); + } + } + } + } + else if (button == illnesses) { + var tourist_illnesses = new TouristIllnesses (application, conn, tourist); + tourist_illnesses.set_transient_for (this); // Set this window as the parent of the new window + tourist_illnesses.initialize (); + tourist_illnesses.show_all (); + //tourist_illnesses.save_places.connect (on_save_places); + } + else if (button == cancel) { + this.close (); + } + } + + /** + * Called when some associated places are saved and a tourist id doesn't exist yet + * @param tourist_places The TouristPlaces instance that called this signal + * @param list_asociado The list of new associations + */ + /*private void on_save_places (TouristPlaces tourist_places, List list_asociado) { + this.list_asociado = list_asociado.copy (); + places.sensitive = false; + }*/ + + /** + * Called when a vehcile is assigned to the tourist, and the tourist is not in the database yet + * @param tourist_assign_vehicle The TouristAssignVehicle instance that called this signal + * @param requerir_auto The vehicle to assign to this tourist + */ + /*private void on_save_vehicle (TouristAssignVehicle tourist_assign_vehicle, RequerirAuto? requerir_auto) { + if (requerir_auto != null) { + this.requerir_auto = requerir_auto; + vehicle.sensitive = false; + } + }*/ + + /** + * Update the the tourist object with new info from the editor + * @return Returns false if the information is not valid + */ + private bool update_tourist_instance () { + tourist.rut_turista = run.get_text ().strip (); + tourist.nombre_turista = tourist_name.get_text ().strip (); + tourist.fecha_nacimento = year.get_value ().to_string () + "-" + + (month.get_active () + 1).to_string () + "-" + + day.get_value ().to_string (); + return true; + } + + /** + * Initialize the tourist editor class + * @param application The application used to make the GLib object + * @param conn The database connection to use + * @param tourist The tourist to edit + */ + public TouristEditor (Gtk.Application application, Connection conn, Turista? tourist) { + Object (application: application); + this.conn = conn; + this.tourist = tourist; + } + + /** + * Initialize what is needed for this window + */ + public void initialize () { + if (tourist != null) { + original_run = tourist.rut_turista; + try { + run.set_text (new Rut (tourist.rut_turista).get_rut ()); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + tourist_name.set_text (tourist.nombre_turista); + + string[] birth_date = tourist.fecha_nacimento.split ("-", 3); + year.set_value (double.parse (birth_date[0])); + month.set_active (int.parse (birth_date[1]) - 1); + day.set_value (double.parse (birth_date[2])); + } + else { + illnesses.destroy (); + tourist = new Turista (); + } + } + } +} diff --git a/src/tourist_illness_editor.vala b/src/tourist_illness_editor.vala new file mode 100644 index 0000000..cfcd2c7 --- /dev/null +++ b/src/tourist_illness_editor.vala @@ -0,0 +1,180 @@ +/* + * Copyright 2018-2019 Chris Cromer + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Sernatur { + using LibSernatur.DB; + + /** + * The tourist add illness window class + */ + [GtkTemplate (ui = "/cl/cromer/ubb/sernatur/tourist.illness.editor.ui")] + public class TouristIllnessEditor : Gtk.ApplicationWindow { + /** + * The open database connection + */ + private Connection conn; + /** + * The place data stored in the list store + */ + private enum Column { + /** + * The illness description + */ + ILLNESS_DESCRIPTION, + /** + * The illness object + */ + ILLNESS, + /** + * The number of colums in this enum + */ + N_COLUMNS + } + /** + * The add illness button + */ + [GtkChild] + private Gtk.Button add_illness; + /** + * The close button + */ + [GtkChild] + private Gtk.Button close_illness; + /** + * The illness + */ + [GtkChild] + private Gtk.ComboBoxText illness; + /** + * A list of the illnesses from the database + */ + private List illnesses; + /** + * The list that stores the illnesses for the combo box + */ + private Gtk.ListStore illness_list_store; + /** + * This signal is called when an illness is saved + */ + public signal void save_illness (); + /** + * The illness to be added + */ + private TieneEnfermedad tiene_enfermedad; + + /** + * This callback is called when a button is clicked + * @param button The button that was clicked + */ + [GtkCallback] + public void on_clicked_button (Gtk.Button button) { + if (button == add_illness) { + // Insert is all that is needed + update_illness_instance (); + try { + TieneEnfermedad.insert_illness (conn, tiene_enfermedad); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + save_illness (); // Signal the parent to update itself + this.close (); + } + else if (button == close_illness) { + this.close (); + } + } + + /** + * Update the the illness object with new info from the editor + */ + private void update_illness_instance () { + Enfermedad enfermedad; + Gtk.TreeIter iter; + illness.get_active_iter (out iter); + illness_list_store.get (iter, + Column.ILLNESS, out enfermedad); + tiene_enfermedad.enfermedad = enfermedad; + } + + /** + * Initialize the tour illness editor class + * @param application The application used to make the GLib object + * @param conn The database connection to use + * @param tiene_enfermedad The place to edit + */ + public TouristIllnessEditor (Gtk.Application application, Connection conn, TieneEnfermedad tiene_enfermedad) { + Object (application: application); + this.conn = conn; + this.tiene_enfermedad = tiene_enfermedad; + } + + /** + * Initialize what is needed for this window + */ + public void initialize () { + try { + illnesses = Enfermedad.get_all_enfermedades (conn); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + + illnesses.sort_with_data ((a, b) => { + return strcmp (a.descripcion_enfermedad, b.descripcion_enfermedad); + }); + + illness_list_store = new Gtk.ListStore (Column.N_COLUMNS, + typeof (string), + typeof (Enfermedad)); + + illness.set_model (illness_list_store); + + try { + var has_illness_list = TieneEnfermedad.get_all_tiene_enfermedades_by_run (conn, tiene_enfermedad.turista.rut_turista); + illnesses.foreach ((entry) => { + var can_add = true; + has_illness_list.foreach ((entry2) => { + if (entry.id_enfermedad == entry2.enfermedad.id_enfermedad) { + can_add = false; + } + }); + if (can_add) { + Gtk.TreeIter iter; + illness_list_store.append (out iter); + illness_list_store.set (iter, + Column.ILLNESS_DESCRIPTION, entry.descripcion_enfermedad, + Column.ILLNESS, entry); + } + }); + illness.set_active (0); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + } + } +} diff --git a/src/tourist_illnesses.vala b/src/tourist_illnesses.vala new file mode 100644 index 0000000..487b201 --- /dev/null +++ b/src/tourist_illnesses.vala @@ -0,0 +1,297 @@ +/* + * Copyright 2018-2019 Chris Cromer + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Sernatur { + using LibSernatur.Misc; + using LibSernatur.DB; + + /** + * The tourist illness window class + */ + [GtkTemplate (ui = "/cl/cromer/ubb/sernatur/tourist.illnesses.ui")] + public class TouristIllnesses : Gtk.ApplicationWindow { + /** + * The open database connection + */ + private Connection conn; + /** + * The tourist to edit + */ + private Turista tourist; + /** + * The columns of the tree view + */ + private enum Column { + /** + * The illness description + */ + ILLNESS_DESCRIPTION, + /** + * The illness object + */ + ILLNESS, + /** + * The number of colums in this enum + */ + N_COLUMNS + } + /** + * The list that stores the contents in the tree view + */ + private Gtk.ListStore list_store; + /** + * The list of illnesses + */ + private List illness_list; + /** + * The tree view widget + */ + [GtkChild] + private Gtk.TreeView illness_tree; + /** + * The illness column + */ + [GtkChild] + private Gtk.TreeViewColumn illness; + /** + * The add button + */ + [GtkChild] + private Gtk.Button add_illness; + /** + * The close button + */ + [GtkChild] + private Gtk.Button close_illness; + /** + * The delete button + */ + [GtkChild] + private Gtk.Button delete_illness; + /** + * The row selection + */ + [GtkChild] + private Gtk.TreeSelection selection; + /** + * The associated tours to save if the user decides to save the tour + */ + private List new_illness_list = new List (); + + /** + * This callback is called when the user clicks on a row + * @param selection The selection object + */ + [GtkCallback] + private void on_changed_selection(Gtk.TreeSelection selection) { + if (selection.count_selected_rows () == 1) { + delete_illness.sensitive =true; + } + else if (selection.count_selected_rows () > 1) { + delete_illness.sensitive = true; + } + else { + delete_illness.sensitive = false; + } + } + + /** + * This callback is run when the user clicks on a button + * @param button The button that was clicked + */ + [GtkCallback] + private void on_clicked_button (Gtk.Button button) { + if (button == add_illness) { + var illness_editor = new TouristIllnessEditor (application, conn, new TieneEnfermedad (tourist)); + illness_editor.set_transient_for (this); // Set this window as the parent of the new window + illness_editor.initialize (); + illness_editor.show_all (); + illness_editor.save_illness.connect (on_save_tourist_illness); + } + else if (button == delete_illness) { + Gtk.MessageDialog msg; + if (selection.count_selected_rows () == 1) { + msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.YES_NO, + _ ("Are you sure you wish to delete this illness from this tourist?")); + } + else { + msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.YES_NO, + _ ("Are you sure you wish to delete these illnesses from this tourist?")); + } + msg.response.connect ((response_id) => { + switch (response_id) { + case Gtk.ResponseType.YES: + Gtk.TreeModel model; + var path = selection.get_selected_rows (out model); + path.foreach ((entry) => { + var tree_row_reference = new Gtk.TreeRowReference (model, entry); + Gtk.TreeIter iter; + list_store.get_iter (out iter, tree_row_reference.get_path ()); + TieneEnfermedad has_illness; + model.get (iter, + Column.ILLNESS, out has_illness); + try { + TieneEnfermedad.delete_illness (conn, has_illness); + } + catch (PostgresError e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + }); + delete_illness.sensitive = false; + reset_columns (); + + list_store.clear (); + + update_list_store (); + break; + } + msg.destroy (); + }); + msg.show (); + } + else if (button == close_illness) { + this.close (); + } + } + + /** + * This callback is run when the user clicks on a column to reorder the rows + * @param column The column that was clicked + */ + [GtkCallback] + private void on_clicked_column (Gtk.TreeViewColumn column) { + delete_illness.sensitive = false; + if (column == illness) { + if (!illness.sort_indicator) { + reset_columns (); + illness.sort_indicator = true; + } + + if (illness.sort_order == Gtk.SortType.ASCENDING) { + illness.sort_order = Gtk.SortType.DESCENDING; + } + else { + illness.sort_order = Gtk.SortType.ASCENDING; + } + + illness_list.sort_with_data ((a, b) => { + if (illness.sort_order == Gtk.SortType.ASCENDING) { + return strcmp (a.enfermedad.descripcion_enfermedad, b.enfermedad.descripcion_enfermedad); + } + else { + return strcmp (b.enfermedad.descripcion_enfermedad, a.enfermedad.descripcion_enfermedad); + } + }); + } + + list_store.clear (); + illness_list.foreach ((entry) => { + Gtk.TreeIter iter; + list_store.append (out iter); + list_store.set (iter, + Column.ILLNESS_DESCRIPTION, entry.enfermedad.descripcion_enfermedad, + Column.ILLNESS, entry); + }); + new_illness_list.foreach ((entry) => { + Gtk.TreeIter iter; + list_store.append (out iter); + list_store.set (iter, + Column.ILLNESS_DESCRIPTION, entry.enfermedad.descripcion_enfermedad, + Column.ILLNESS, entry); + }); + } + + /** + * Reset the sort indicator and order of all the columns + */ + private void reset_columns () { + illness.sort_indicator = false; + illness.sort_order = Gtk.SortType.DESCENDING; + } + + /** + * Called when a illness is saved + * @param illness_editor The editor that saved the illness + */ + public void on_save_tourist_illness (TouristIllnessEditor illness_editor) { + reset_columns (); + + list_store.clear (); + update_list_store (); + } + + /** + * Update the list store with the data from the database + */ + private void update_list_store () { + try { + illness_list = TieneEnfermedad.get_all_tiene_enfermedades_by_run (conn, tourist.rut_turista); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + + illness_list.foreach ((entry) => { + Gtk.TreeIter iter; + list_store.append (out iter); + list_store.set (iter, + Column.ILLNESS_DESCRIPTION, entry.enfermedad.descripcion_enfermedad, + Column.ILLNESS, entry); + }); + } + + /** + * Initialize the tour list class + * @param application The application used to make the GLib object + * @param conn The database connection to use + * @param tourist The tourist which is the parent of this window + */ + public TouristIllnesses (Gtk.Application application, Connection conn, Turista? tourist) { + Object (application: application); + this.conn = conn; + this.tourist = tourist; + + this.set_visible (true); // This fixes: Gtk-CRITICAL **: 23:58:22.139: gtk_box_gadget_distribute: assertion 'size >= 0' failed in GtkScrollbar + } + + /** + * Initialize what is needed for this window + */ + public void initialize () { + list_store = new Gtk.ListStore (Column.N_COLUMNS, + typeof (string), + typeof (TieneEnfermedad)); + + if (tourist != null) { + update_list_store (); + } + + illness_tree.set_model (list_store); + } + } +} diff --git a/src/tourist_list.vala b/src/tourist_list.vala new file mode 100644 index 0000000..2ebecee --- /dev/null +++ b/src/tourist_list.vala @@ -0,0 +1,420 @@ +/* + * Copyright 2018-2019 Chris Cromer + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Sernatur { + using LibSernatur.Misc; + using LibSernatur.DB; + + /** + * The tourist list window class + */ + [GtkTemplate (ui = "/cl/cromer/ubb/sernatur/tourist.list.ui")] + public class TouristList : Gtk.ApplicationWindow { + /** + * The open database connection + */ + private Connection conn; + /** + * The columns of the tree view + */ + private enum Column { + /** + * The tourist's run + */ + RUN, + /** + * The tourist's name + */ + NAME, + /** + * The tourist's birthdate + */ + BIRTHDATE, + /** + * The tourist object + */ + TOURIST, + /** + * The number of colums in this enum + */ + N_COLUMNS + } + /** + * The list that stores the contents in the tree view + */ + private Gtk.ListStore list_store; + /** + * The list of tourists + */ + private List tourist_list; + /** + * The tree view widget + */ + [GtkChild] + private Gtk.TreeView tourist_tree; + /** + * Thew new tourist button + */ + [GtkChild] + private Gtk.Button new_tourist; + /** + * The edit tourist button + */ + [GtkChild] + private Gtk.Button edit_tourist; + /** + * The delete tourist button + */ + [GtkChild] + private Gtk.Button delete_tourist; + /** + * The close tourist button + */ + [GtkChild] + private Gtk.Button close_tourist; + /** + * The tourist's RUN + */ + [GtkChild] + private Gtk.TreeViewColumn run; + /** + * The tourist's name + */ + [GtkChild] + private Gtk.TreeViewColumn tourist_name; + /** + * The birthdate + */ + [GtkChild] + private Gtk.TreeViewColumn birthdate; + /** + * The row selection + */ + [GtkChild] + private Gtk.TreeSelection selection; + + /** + * This callback is called when the user clicks on a row + * @param selection The selection object + */ + [GtkCallback] + private void on_changed_selection(Gtk.TreeSelection selection) { + if (selection.count_selected_rows () == 1) { + edit_tourist.sensitive = true; + delete_tourist.sensitive =true; + } + else if (selection.count_selected_rows () > 1) { + edit_tourist.sensitive = false; + delete_tourist.sensitive = true; + } + else { + edit_tourist.sensitive = false; + delete_tourist.sensitive = false; + } + } + + /** + * This callback is run when the user clicks on a button + * @param button The button that was clicked + */ + [GtkCallback] + private void on_clicked_button (Gtk.Button button) { + if (button == new_tourist) { + var tourist_editor = new TouristEditor (application, conn, null); + tourist_editor.set_transient_for (this); // Set this window as the parent of the new window + tourist_editor.initialize (); + tourist_editor.show_all (); + tourist_editor.save_tourist.connect (on_save); + } + else if (button == edit_tourist) { + Gtk.TreeModel model; + var path = selection.get_selected_rows (out model); + path.foreach ((entry) => { + var tree_row_reference = new Gtk.TreeRowReference (model, entry); + Gtk.TreeIter iter; + list_store.get_iter (out iter, tree_row_reference.get_path ()); + Turista tourist; + model.get (iter, + Column.TOURIST, out tourist); + var tourist_editor = new TouristEditor (application, conn, tourist); + tourist_editor.set_transient_for (this); // Set this window as the parent of the new window + tourist_editor.initialize (); + tourist_editor.show_all (); + tourist_editor.save_tourist.connect (on_save); + }); + } + else if (button == delete_tourist) { + Gtk.MessageDialog msg; + if (selection.count_selected_rows () == 1) { + msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.YES_NO, + _ ("Are you sure you wish to delete this tourist?")); + } + else { + msg = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.YES_NO, + _ ("Are you sure you wish to delete these tourists?")); + } + msg.response.connect ((response_id) => { + switch (response_id) { + case Gtk.ResponseType.YES: + Gtk.TreeModel model; + var path = selection.get_selected_rows (out model); + path.foreach ((entry) => { + var tree_row_reference = new Gtk.TreeRowReference (model, entry); + Gtk.TreeIter iter; + list_store.get_iter (out iter, tree_row_reference.get_path ()); + Turista tourist; + model.get (iter, + Column.TOURIST, out tourist); + try { + Turista.delete_tourist (conn, tourist); + } + catch (PostgresError e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + catch (DBError e) { + if (e.code == 1) { + warning (e.message); + var msg2 = new Gtk.MessageDialog (this, + Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, + Gtk.ButtonsType.CLOSE, + _ ("Error: Could not delete tourist \"%s\" because there is still information associated with them!"), tourist.nombre_turista); + msg2.response.connect ((response_id) => { + msg2.destroy (); + }); + msg2.set_title (_ ("Error")); + msg2.run (); + } + else { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + } + }); + edit_tourist.sensitive = false; + delete_tourist.sensitive = false; + reset_columns (); + + list_store.clear (); + + update_list_store (); + break; + } + msg.destroy (); + }); + msg.show (); + } + else if (button == close_tourist) { + this.close (); + } + } + + /** + * Called when a new or old tourist is saved + * @param tourist_editor The editor that saved the tourist + */ + public void on_save(TouristEditor tourist_editor) { + edit_tourist.sensitive = false; + delete_tourist.sensitive = false; + reset_columns (); + + list_store.clear (); + + update_list_store (); + } + + /** + * This callback is run when the user clicks on a column to reorder the rows + * @param column The column that was clicked + */ + [GtkCallback] + private void on_clicked_column (Gtk.TreeViewColumn column) { + edit_tourist.sensitive = false; + delete_tourist.sensitive = false; + if (column == run) { + if (!run.sort_indicator) { + reset_columns (); + run.sort_indicator = true; + } + + if (run.sort_order == Gtk.SortType.ASCENDING) { + run.sort_order = Gtk.SortType.DESCENDING; + } + else { + run.sort_order = Gtk.SortType.ASCENDING; + } + + tourist_list.sort_with_data ((a, b) => { + if (run.sort_order == Gtk.SortType.ASCENDING) { + return strcmp (a.rut_turista, b.rut_turista); + } + else { + return strcmp (b.rut_turista, a.rut_turista); + } + }); + } + else if (column == tourist_name) { + if (!tourist_name.sort_indicator) { + reset_columns (); + tourist_name.sort_indicator = true; + } + + if (tourist_name.sort_order == Gtk.SortType.ASCENDING) { + tourist_name.sort_order = Gtk.SortType.DESCENDING; + } + else { + tourist_name.sort_order = Gtk.SortType.ASCENDING; + } + + tourist_list.sort_with_data ((a, b) => { + if (tourist_name.sort_order == Gtk.SortType.ASCENDING) { + return strcmp (a.nombre_turista, b.nombre_turista); + } + else { + return strcmp (b.nombre_turista, a.nombre_turista); + } + }); + } + else if (column == birthdate) { + if (!birthdate.sort_indicator) { + reset_columns (); + birthdate.sort_indicator = true; + } + + if (birthdate.sort_order == Gtk.SortType.ASCENDING) { + birthdate.sort_order = Gtk.SortType.DESCENDING; + } + else { + birthdate.sort_order = Gtk.SortType.ASCENDING; + } + + tourist_list.sort_with_data ((a, b) => { + if (birthdate.sort_order == Gtk.SortType.ASCENDING) { + return strcmp (a.fecha_nacimento, b.fecha_nacimento); + } + else { + return strcmp (b.fecha_nacimento, a.fecha_nacimento); + } + }); + } + + list_store.clear (); + tourist_list.foreach ((entry) => { + Gtk.TreeIter iter; + list_store.append (out iter); + try { + list_store.set (iter, + Column.RUN, new Rut (entry.rut_turista).get_rut (), + Column.NAME, entry.nombre_turista, + Column.BIRTHDATE, entry.fecha_nacimento, + Column.TOURIST, entry); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + }); + } + + /** + * Reset the sort indicator and order of all the columns + */ + private void reset_columns () { + run.sort_indicator = false; + run.sort_order = Gtk.SortType.DESCENDING; + tourist_name.sort_indicator = false; + tourist_name.sort_order = Gtk.SortType.DESCENDING; + birthdate.sort_indicator = false; + birthdate.sort_order = Gtk.SortType.DESCENDING; + } + + /** + * Update the list store with the data from the database + */ + private void update_list_store () { + try { + tourist_list = Turista.get_all_turistas (conn); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + + tourist_list.foreach ((entry) => { + Gtk.TreeIter iter; + list_store.append (out iter); + try { + list_store.set (iter, + Column.RUN, new Rut (entry.rut_turista).get_rut (), + Column.NAME, entry.nombre_turista, + Column.BIRTHDATE, entry.fecha_nacimento, + Column.TOURIST, entry); + } + catch (Error e) { + #if DEBUG + error (e.message); + #else + warning (e.message); + #endif + } + }); + } + + /** + * Initialize the tourist list class + * @param application The application used to make the GLib object + * @param conn The database connection to use + */ + public TouristList (Gtk.Application application, Connection conn) { + Object (application: application); + this.conn = conn; + + this.set_visible (true); // This fixes: Gtk-CRITICAL **: 23:58:22.139: gtk_box_gadget_distribute: assertion 'size >= 0' failed in GtkScrollbar + } + + /** + * Initialize what is needed for this window + */ + public void initialize () { + list_store = new Gtk.ListStore (Column.N_COLUMNS, + typeof (string), + typeof (string), + typeof (string), + typeof (Turista)); + + update_list_store (); + + tourist_tree.set_model (list_store); + } + } +}