diff --git a/build_linux_package.sh b/build_linux_package.sh index b036c4f..2309254 100755 --- a/build_linux_package.sh +++ b/build_linux_package.sh @@ -3,7 +3,7 @@ curdir=`pwd` rm -rf buildtmp mkdir buildtmp -LDFLAGS=-static-libstdc++ meson buildtmp -D bundle_libs=true --buildtype=release --prefix=/tmp/sernatur --libdir=lib --strip +LDFLAGS=-static-libstdc++ meson buildtmp -D bundle_libs=false -D valadocs_deps=false --buildtype=release --prefix=/tmp/sernatur --libdir=lib --strip ninja -C buildtmp install rm -rf buildtmp cp README.md /tmp/sernatur diff --git a/doc/Informe1.pdf b/doc/Informe1.pdf index 673e603..8205e9a 100644 Binary files a/doc/Informe1.pdf and b/doc/Informe1.pdf differ diff --git a/doc/Informe1.tex b/doc/Informe1.tex index 703a800..8c784df 100644 --- a/doc/Informe1.tex +++ b/doc/Informe1.tex @@ -6,8 +6,8 @@ \usepackage{adjustbox} \usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm,a4paper]{geometry} \usepackage{amsmath} - \usepackage{verbatim} + \usepackage{listings} \lstset{ basicstyle=\footnotesize\ttfamily, @@ -20,7 +20,7 @@ \renewcommand\maketitlehookd{\vfill\null} \usepackage{hyperref} -\hypersetup{pdftex,colorlinks=true,allcolors=black,bookmarks} +\hypersetup{colorlinks=true,allcolors=black} \usepackage{hypcap} \title{\textbf{Proyecto Semestral de Base de Datos\\Entrega 1}} @@ -37,6 +37,7 @@ \begin{document} \clearpage +\hypersetup{pageanchor=false} \begin{titlingpage} \maketitle \end{titlingpage} @@ -49,6 +50,7 @@ \tableofcontents \newpage +\hypersetup{pageanchor=true} \pagenumbering{arabic} \section{Introducción} El objetivo de este trabajo es modelar un sistema por el Servicio Nacional de Turismo(SERNATUR) con el propósito de almacenar y consultar a un base de datos de PostgreSQL con información sobre el turismo. @@ -62,85 +64,104 @@ El objetivo de este trabajo es modelar un sistema por el Servicio Nacional de Tu \newpage \section{Modelo Relacional} \begin{center} -En negrita se presenta las claves foráneas y las primarias en subrayado.\\ +En negrita se presenta las claves foráneas y las primarias en subrayado.\smallskip \end{center} -tour(\underline{id\_tour}, nombre\_tour, costo\_indiv, costo\_grupal, minima\_personas, \textbf{id\_ciudad})\\ -\newline -lugar(\underline{id\_lugar}, nombre\_lugar, valor\_entrada, nivel, \textbf{id\_ciudad})\\ -\newline -asociado(\textbf{id\_tour}, \textbf{id\_lugar}, fecha\_llegada, hora\_llegada, fecha\_salida, hora\_salida)\\ -\newline -turista(\underline{rut\_turista}, nombre\_turista, fecha\_nacimiento, \textbf{id\_contacto})\\ -\newline -contacto\_emergencia(\underline{id\_contacto}, telefono\_emergencia, nombre\_emergencia)\\ -\newline -enfermedad(\underline{id\_enfermedad}, descripcion\_enfermedad)\\ -\newline -tiene\_enfermedad(\textbf{rut\_turista}, \textbf{id\_enfermedad})\\ -\newline -compra(\textbf{id\_tour}, \textbf{rut\_turista}, valor)\\ -\newline -realiza(\textbf{id\_tour}, \textbf{rut\_turista})\\ -\newline -vehiculo(\underline{patente}, ano\_vehiculo, marca, capacidad, chofer)\\ -\newline -empresa(\underline{rut\_empresa}, nombre\_empresa, contacto, telefono)\\ -\newline -arrienda(\textbf{patente}, \textbf{rut\_empresa}, precio, fecha\_devolucion)\\ -\newline -ciudad(\underline{id\_ciudad}, nombre\_ciudad, \textbf{id\_region})\\ -\newline -region(\underline{id\_region}, nombre\_region)\\ -\newline -guia(\underline{rut\_guia}, nombre\_guia)\\ -\newline -especialidad(\underline{id\_especialidad}, descripcion\_especialidad)\\ -\newline -posee(\textbf{rut\_guia}, \textbf{id\_especialidad}, nivel\_especialidad)\\ -\newline -categoria(\underline{id\_categoria}, descripcion\_categoria)\\ -\newline -direccion(\textbf{rut\_guia}, \textbf{id\_ciudad}, calle, numero)\\ -\newline +tour(\underline{id\_tour}, nombre\_tour, costo\_indiv, costo\_grupal, minima\_personas, \textbf{id\_ciudad})\bigskip + +\noindent +lugar(\underline{id\_lugar}, nombre\_lugar, valor\_entrada, nivel, \textbf{id\_ciudad})\bigskip + +\noindent +asociado(\textbf{id\_tour}, \textbf{id\_lugar}, fecha\_llegada, hora\_llegada, fecha\_salida, hora\_salida)\bigskip + +\noindent +turista(\underline{rut\_turista}, nombre\_turista, fecha\_nacimiento, \textbf{id\_contacto})\bigskip + +\noindent +contacto\_emergencia(\underline{id\_contacto}, telefono\_emergencia, nombre\_emergencia)\bigskip + +\noindent +enfermedad(\underline{id\_enfermedad}, descripcion\_enfermedad)\bigskip + +\noindent +tiene\_enfermedad(\textbf{rut\_turista}, \textbf{id\_enfermedad})\bigskip + +\noindent +compra(\textbf{id\_tour}, \textbf{rut\_turista}, valor)\bigskip + +\noindent +realiza(\textbf{id\_tour}, \textbf{rut\_turista})\bigskip + +\noindent +vehiculo(\underline{patente}, ano\_vehiculo, marca, capacidad, chofer)\bigskip + +\noindent +empresa(\underline{rut\_empresa}, nombre\_empresa, contacto, telefono)\bigskip + +\noindent +arrienda(\textbf{patente}, \textbf{rut\_empresa}, precio, fecha\_devolucion)\bigskip + +\noindent +ciudad(\underline{id\_ciudad}, nombre\_ciudad, \textbf{id\_region})\bigskip + +\noindent +region(\underline{id\_region}, nombre\_region)\bigskip + +\noindent +guia(\underline{rut\_guia}, nombre\_guia)\bigskip + +\noindent +especialidad(\underline{id\_especialidad}, descripcion\_especialidad)\bigskip + +\noindent +posee(\textbf{rut\_guia}, \textbf{id\_especialidad}, nivel\_especialidad)\bigskip + +\noindent +categoria(\underline{id\_categoria}, descripcion\_categoria)\bigskip + +\noindent +direccion(\textbf{rut\_guia}, \textbf{id\_ciudad}, calle, numero)\bigskip + +\noindent participa(\textbf{id\_tour}, \textbf{rut\_guia}, \textbf{id\_categoria}) \newpage \section{Justificación de Modelo Relacional} -\textbf{\textit{tour}} adquiere la clave foránea \textbf{\textit{id\_ciudad}} debido que la relación entre las entidades \textbf{\textit{tour}} y \textbf{\textit{ciudad}} es de \textbf{\textit{n a 1}}.\\ +\textbf{\textit{tour}} adquiere la clave foránea \textbf{\textit{id\_ciudad}} debido que la relación entre las entidades \textbf{\textit{tour}} y \textbf{\textit{ciudad}} es de \textbf{\textit{n a 1}}.\bigskip -\textbf{\textit{lugar}} recibe como clave foránea \textbf{\textit{id\_ciudad}} dado por la relación \textbf{\textit{n a 1}} de las entidades \textbf{\textit{lugar}} y \textbf{\textit{ciudad}}.\\ +\textbf{\textit{lugar}} recibe como clave foránea \textbf{\textit{id\_ciudad}} dado por la relación \textbf{\textit{n a 1}} de las entidades \textbf{\textit{lugar}} y \textbf{\textit{ciudad}}.\bigskip -\textbf{\textit{asociado}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{id\_lugar}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{lugar}} es de \textbf{\textit{n a n}}.\\ +\textbf{\textit{asociado}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{id\_lugar}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{lugar}} es de \textbf{\textit{n a n}}.\bigskip -\textbf{\textit{turista}} adquiere la clave foránea \textbf{\textit{id\_contacto}} debido que la relación entre \textbf{\textit{turista}} y \textbf{\textit{contacto\_emergencia}} es \textbf{\textit{n a 1}}.\\ +\textbf{\textit{turista}} adquiere la clave foránea \textbf{\textit{id\_contacto}} debido que la relación entre \textbf{\textit{turista}} y \textbf{\textit{contacto\_emergencia}} es \textbf{\textit{n a 1}}.\bigskip -\textbf{\textit{tiene\_enfermedad}} es creado con las claves foráneas \textbf{\textit{rut\_turista}} y \textbf{\textit{id\_enfermedad}} dado que la relación es \textbf{\textit{n a n}} entre \textbf{\textit{turista}} y \textbf{\textit{enfermedad}}.\\ +\textbf{\textit{tiene\_enfermedad}} es creado con las claves foráneas \textbf{\textit{rut\_turista}} y \textbf{\textit{id\_enfermedad}} dado que la relación es \textbf{\textit{n a n}} entre \textbf{\textit{turista}} y \textbf{\textit{enfermedad}}.\bigskip -\textit{\textbf{compra}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{rut\_turista}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{turista}} es de \textbf{\textit{n a n}}.\\ +\textit{\textbf{compra}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{rut\_turista}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{turista}} es de \textbf{\textit{n a n}}.\bigskip -\textbf{\textit{realiza}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{rut\_turista}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{turista}} es de \textbf{\textit{n a n}}.\\ +\textbf{\textit{realiza}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{rut\_turista}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{turista}} es de \textbf{\textit{n a n}}.\bigskip -\textbf{\textit{arrienda}} es creado con las claves foráneas \textbf{\textit{patente}} y \textbf{\textit{rut\_empresa}} dado que la relación entre \textbf{\textit{vehiculo}} y \textbf{\textit{empresa}} es de \textbf{\textit{n a n}}.\\ +\textbf{\textit{arrienda}} es creado con las claves foráneas \textbf{\textit{patente}} y \textbf{\textit{rut\_empresa}} dado que la relación entre \textbf{\textit{vehiculo}} y \textbf{\textit{empresa}} es de \textbf{\textit{n a n}}.\bigskip -\textbf{\textit{ciudad}} adquiere la clave foránea \textbf{\textit{id\_region}} debido a la relación \textbf{\textit{n a 1}} entre las entidades \textbf{\textit{ciudad}} y \textbf{\textit{region}}.\\ +\textbf{\textit{ciudad}} adquiere la clave foránea \textbf{\textit{id\_region}} debido a la relación \textbf{\textit{n a 1}} entre las entidades \textbf{\textit{ciudad}} y \textbf{\textit{region}}.\bigskip -\textbf{\textit{posee}} es creado y recibe las claves foráneas \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_especialidad}} dado que la relación entre \textbf{\textit{guia}} y \textbf{\textit{especialidad}} es de \textbf{\textit{n a n}}.\\ +\textbf{\textit{posee}} es creado y recibe las claves foráneas \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_especialidad}} dado que la relación entre \textbf{\textit{guia}} y \textbf{\textit{especialidad}} es de \textbf{\textit{n a n}}.\bigskip -\textbf{\textit{direccion}} es creado con las claves foráneas \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_ciudad}} dado por la relación \textbf{\textit{n a n}} entre \textbf{\textit{ciudad}} y \textbf{\textit{guia}}.\\ +\textbf{\textit{direccion}} es creado con las claves foráneas \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_ciudad}} dado por la relación \textbf{\textit{n a n}} entre \textbf{\textit{ciudad}} y \textbf{\textit{guia}}.\bigskip -\textbf{\textit{participa}} es creado con 3 claves foráneas \textbf{\textit{id\_tour}}, \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_categoria}} dado que la relación es \textbf{\textit{n-arias}} entre \textbf{\textit{tour}}, \textbf{\textit{guia}} y \textbf{\textit{categoria}}.\\ +\textbf{\textit{participa}} es creado con 3 claves foráneas \textbf{\textit{id\_tour}}, \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_categoria}} dado que la relación es \textbf{\textit{n-arias}} entre \textbf{\textit{tour}}, \textbf{\textit{guia}} y \textbf{\textit{categoria}}.\bigskip \newpage \section{Script SQL} \subsection{Crear tablas} -\lstinputlisting{Informecreartablas.sql} +\lstinputlisting{Informe1_creartablas.sql} \newpage \subsection{Insertar duplas} -\lstinputlisting{Informeinsertarduplas.sql} +\lstinputlisting{Informe1_insertarduplas.sql} \end{document} diff --git a/doc/Informecreartablas.sql b/doc/Informe1_creartablas.sql similarity index 93% rename from doc/Informecreartablas.sql rename to doc/Informe1_creartablas.sql index 2a66d97..44596c8 100644 --- a/doc/Informecreartablas.sql +++ b/doc/Informe1_creartablas.sql @@ -52,13 +52,13 @@ CREATE TABLE ciudad(id_ciudad SMALLSERIAL UNIQUE, ); CREATE TABLE tour(id_tour SERIAL UNIQUE, - nombre_tour VARCHAR(50) NOT NULL, - costo_indiv INT NOT NULL CHECK (costo_indiv > costo_grupal), - costo_grupal INT NOT NULL CHECK (costo_grupal > 0), - minima_personas INT NOT NULL CHECK (minima_personas > 0), - id_ciudad SMALLINT, - PRIMARY KEY (id_tour), - FOREIGN KEY (id_ciudad) REFERENCES ciudad (id_ciudad) ON DELETE RESTRICT + nombre_tour VARCHAR(50) NOT NULL, + costo_indiv INT NOT NULL CHECK (costo_indiv > costo_grupal), + costo_grupal INT NOT NULL CHECK (costo_grupal > 0), + minima_personas INT NOT NULL CHECK (minima_personas > 0), + id_ciudad SMALLINT, + PRIMARY KEY (id_tour), + FOREIGN KEY (id_ciudad) REFERENCES ciudad (id_ciudad) ON DELETE RESTRICT ); CREATE TABLE lugar(id_lugar SMALLSERIAL UNIQUE, diff --git a/doc/Informeinsertarduplas.sql b/doc/Informe1_insertarduplas.sql similarity index 100% rename from doc/Informeinsertarduplas.sql rename to doc/Informe1_insertarduplas.sql diff --git a/doc/Informe1corregido.pdf b/doc/Informe1corregido.pdf new file mode 100644 index 0000000..a4817f3 Binary files /dev/null and b/doc/Informe1corregido.pdf differ diff --git a/doc/Informe1corregido.tex b/doc/Informe1corregido.tex new file mode 100644 index 0000000..a7df038 --- /dev/null +++ b/doc/Informe1corregido.tex @@ -0,0 +1,168 @@ +\documentclass[12pt]{article} + +\usepackage[utf8]{inputenc} +\usepackage[spanish]{babel} +\usepackage{array} +\usepackage{adjustbox} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm,a4paper]{geometry} +\usepackage{amsmath} +\usepackage{verbatim} + +\usepackage{listings} +\lstset{ + basicstyle=\footnotesize\ttfamily, + columns=flexible, + breaklines=true, + inputencoding=utf8, + extendedchars=true, + literate={á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 {ñ}{{\~n}}1 {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 {Ñ}{{\~N}}1 +} + +\usepackage{titling} +\renewcommand\maketitlehooka{\null\mbox{}\vfill} +\renewcommand\maketitlehookd{\vfill\null} + +\usepackage{hyperref} +\hypersetup{colorlinks=true,allcolors=black} +\usepackage{hypcap} + +\title{\textbf{Proyecto Semestral de Base de Datos\\Entrega 1 Corregido}} +\author{Christopher Cromer\\\\Profesora Valeria Beratto\\Sección 1} +\date{\today} + +\pretitle{% + \begin{center} + \LARGE + \includegraphics[width=4cm]{ubblogo.png}\\[\bigskipamount] + } + +\posttitle{\end{center}} + +\begin{document} +\clearpage +\hypersetup{pageanchor=false} +\begin{titlingpage} +\maketitle +\end{titlingpage} +\thispagestyle{empty} + +\newpage + +\clearpage +\thispagestyle{empty} +\tableofcontents + +\newpage +\hypersetup{pageanchor=true} +\pagenumbering{arabic} +\section{Introducción} +El objetivo de este trabajo es modelar un sistema por el Servicio Nacional de Turismo(SERNATUR) con el propósito de almacenar y consultar a un base de datos de PostgreSQL con información sobre el turismo. + +\newpage +\section{Modelo Entidad Relación} +\begin{center} +\includegraphics[width=0.96\textwidth,height=0.96\textheight,keepaspectratio]{MERcorregido.png} +\end{center} + +\newpage +\section{Modelo Relacional} +\begin{center} +En negrita se presenta las claves foráneas y las primarias en subrayado.\smallskip +\end{center} +tour(\underline{id\_tour}, nombre\_tour, costo\_indiv, costo\_grupal, minima\_personas, \textbf{id\_ciudad})\bigskip + +\noindent +lugar(\underline{id\_lugar}, nombre\_lugar, valor\_entrada, nivel, \textbf{id\_ciudad})\bigskip + +\noindent +asociado(\textbf{id\_tour}, \textbf{id\_lugar}, fecha\_llegada, hora\_llegada, fecha\_salida, hora\_salida)\bigskip + +\noindent +turista(\underline{rut\_turista}, nombre\_turista, fecha\_nacimiento, \textbf{id\_contacto})\bigskip + +\noindent +contacto\_emergencia(\underline{id\_contacto}, telefono\_emergencia, nombre\_emergencia)\bigskip + +\noindent +enfermedad(\underline{id\_enfermedad}, descripcion\_enfermedad)\bigskip + +\noindent +tiene\_enfermedad(\textbf{rut\_turista}, \textbf{id\_enfermedad})\bigskip + +\noindent +realiza(\textbf{id\_tour}, \textbf{rut\_turista}, \textbf{id\_descuento})\bigskip + +\noindent +vehiculo(\underline{patente}, ano\_vehiculo, marca, capacidad)\bigskip + +\noindent +requerir\_auto(\textbf{id\_tour}, \textbf{patente}, chofer\bigskip) + +\noindent +empresa(\underline{rut\_empresa}, nombre\_empresa, contacto, telefono)\bigskip + +\noindent +arrienda(\textbf{patente}, \textbf{rut\_empresa}, precio, fecha\_devolucion)\bigskip + +\noindent +ciudad(\underline{id\_ciudad}, nombre\_ciudad, \textbf{id\_region})\bigskip + +\noindent +region(\underline{id\_region}, nombre\_region)\bigskip + +\noindent +guia(\underline{rut\_guia}, nombre\_guia, calle, numero, \textbf{id\_ciudad})\bigskip + +\noindent +especialidad(\underline{id\_especialidad}, descripcion\_especialidad)\bigskip + +\noindent +posee(\textbf{rut\_guia}, \textbf{id\_especialidad}, nivel\_especialidad)\bigskip + +\noindent +categoria(\underline{id\_categoria}, descripcion\_categoria)\bigskip + +\noindent +participa(\textbf{id\_tour}, \textbf{rut\_guia}, \textbf{id\_categoria})\bigskip + +\noindent +descuento(\underline{id\_descuento}, descripcion\_descuento, porcentaje) + +\newpage +\section{Justificación de Modelo Relacional} +\textbf{\textit{tour}} adquiere la clave foránea \textbf{\textit{id\_ciudad}} debido que la relación entre las entidades \textbf{\textit{tour}} y \textbf{\textit{ciudad}} es de \textbf{\textit{n a 1}}.\bigskip + +\textbf{\textit{lugar}} recibe como clave foránea \textbf{\textit{id\_ciudad}} dado por la relación \textbf{\textit{n a 1}} de las entidades \textbf{\textit{lugar}} y \textbf{\textit{ciudad}}.\bigskip + +\textbf{\textit{asociado}} es creado con las claves foráneas \textbf{\textit{id\_tour}} y \textbf{\textit{id\_lugar}} dado que la relación entre \textbf{\textit{tour}} y \textbf{\textit{lugar}} es de \textbf{\textit{n a n}}.\bigskip + +\textbf{\textit{turista}} adquiere la clave foránea \textbf{\textit{id\_contacto}} debido que la relación entre \textbf{\textit{turista}} y \textbf{\textit{contacto\_emergencia}} es \textbf{\textit{n a 1}}.\bigskip + +\textbf{\textit{tiene\_enfermedad}} es creado con las claves foráneas \textbf{\textit{rut\_turista}} y \textbf{\textit{id\_enfermedad}} dado que la relación es \textbf{\textit{n a n}} entre \textbf{\textit{turista}} y \textbf{\textit{enfermedad}}.\bigskip + +\textbf{\textit{realiza}} es creado con las claves foráneas \textbf{\textit{id\_tour}}, \textbf{\textit{rut\_turista}} y \textbf{\textit{id\_descuento}} dado que la relación entre \textbf{\textit{tour}}, \textbf{\textit{turista}} y \textbf{\textit{descuento}} es de \textbf{\textit{n-aria}}.\bigskip + +\textbf{\textit{arrienda}} es creado con las claves foráneas \textbf{\textit{patente}} y \textbf{\textit{rut\_empresa}} dado que la relación entre \textbf{\textit{vehiculo}} y \textbf{\textit{empresa}} es de \textbf{\textit{n a n}}.\bigskip + +\textbf{\textit{ciudad}} adquiere la clave foránea \textbf{\textit{id\_region}} debido a la relación \textbf{\textit{n a 1}} entre las entidades \textbf{\textit{ciudad}} y \textbf{\textit{region}}.\bigskip + +\textbf{\textit{posee}} es creado y recibe las claves foráneas \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_especialidad}} dado que la relación entre \textbf{\textit{guia}} y \textbf{\textit{especialidad}} es de \textbf{\textit{n a n}}.\bigskip + +\textbf{\textit{participa}} es creado con 3 claves foráneas \textbf{\textit{id\_tour}}, \textbf{\textit{rut\_guia}} y \textbf{\textit{id\_categoria}} dado que la relación es \textbf{\textit{n-arias}} entre \textbf{\textit{tour}}, \textbf{\textit{guia}} y \textbf{\textit{categoria}}.\bigskip + +Las tablas restantes se crean bajo el principio de que toda entidad requiere una tabla. + +\newpage +\section{Script SQL} + +\subsection{Crear tablas} + +\lstinputlisting{Informe1corregido_creartablas.sql} + +\newpage +\subsection{Insertar duplas} + +\lstinputlisting{Informe1corregido_insertarduplas.sql} + +\end{document} + diff --git a/doc/Informe1corregido_creartablas.sql b/doc/Informe1corregido_creartablas.sql new file mode 100644 index 0000000..94f1887 --- /dev/null +++ b/doc/Informe1corregido_creartablas.sql @@ -0,0 +1,142 @@ +CREATE TABLE contacto_emergencia(id_contacto SERIAL UNIQUE, + telefono_emergencia BIGINT NOT NULL CHECK (telefono_emergencia > 99999999 AND telefono_emergencia < 100000000000), + nombre_emergencia VARCHAR(50) NOT NULL, + PRIMARY KEY (id_contacto) +); + +CREATE TABLE enfermedad(id_enfermedad SMALLSERIAL UNIQUE, + descripcion_enfermedad TEXT NOT NULL, + PRIMARY KEY (id_enfermedad) +); + +CREATE TABLE empresa(rut_empresa VARCHAR(9) NOT NULL UNIQUE, + nombre_empresa VARCHAR(50) NOT NULL, + contacto VARCHAR(50) NOT NULL, + telefono BIGINT NOT NULL CHECK (telefono > 99999999 AND telefono < 100000000000), + PRIMARY KEY (rut_empresa) +); + +CREATE TABLE especialidad(id_especialidad SMALLSERIAL UNIQUE, + descripcion_especialidad TEXT NOT NULL, + PRIMARY KEY (id_especialidad) +); + +CREATE TABLE categoria(id_categoria SMALLSERIAL UNIQUE, + descripcion_categoria TEXT NOT NULL, + PRIMARY KEY (id_categoria) +); + +CREATE TABLE vehiculo(patente VARCHAR(6) NOT NULL UNIQUE, + ano_vehiculo SMALLINT NOT NULL, + marca VARCHAR(20) NOT NULL, + capacidad SMALLINT NOT NULL, + PRIMARY KEY (patente) +); + +CREATE TABLE region(id_region SMALLSERIAL UNIQUE, + nombre_region VARCHAR(20) NOT NULL, + PRIMARY KEY (id_region) +); + +CREATE TABLE ciudad(id_ciudad SMALLSERIAL UNIQUE, + nombre_ciudad VARCHAR(20) NOT NULL, + id_region SMALLINT, + PRIMARY KEY (id_ciudad), + FOREIGN KEY (id_region) REFERENCES region (id_region) ON DELETE CASCADE +); + +CREATE TABLE guia(rut_guia VARCHAR(9) NOT NULL UNIQUE, + nombre_guia VARCHAR(50) NOT NULL, + calle VARCHAR(20) NOT NULL, + numero SMALLINT NOT NULL, + id_ciudad SMALLINT, + PRIMARY KEY (rut_guia), + FOREIGN KEY (id_ciudad) REFERENCES ciudad (id_ciudad) ON DELETE CASCADE +); + +CREATE TABLE tour(id_tour SERIAL UNIQUE, + nombre_tour VARCHAR(50) NOT NULL, + costo_indiv INT NOT NULL CHECK (costo_indiv > costo_grupal), + costo_grupal INT NOT NULL CHECK (costo_grupal > 0), + minima_personas INT NOT NULL CHECK (minima_personas > 0), + id_ciudad SMALLINT, + PRIMARY KEY (id_tour), + FOREIGN KEY (id_ciudad) REFERENCES ciudad (id_ciudad) ON DELETE CASCADE +); + +CREATE TABLE lugar(id_lugar SMALLSERIAL UNIQUE, + nombre_lugar VARCHAR(50) NOT NULL, + valor_entrada INT NOT NULL CHECK (valor_entrada >= 0), + nivel SMALLINT NOT NULL CHECK (nivel >= 0), + id_ciudad SMALLINT, + PRIMARY KEY (id_lugar), + FOREIGN KEY (id_ciudad) REFERENCES ciudad (id_ciudad) ON DELETE CASCADE +); + +CREATE TABLE turista(rut_turista VARCHAR(9) NOT NULL UNIQUE, + nombre_turista VARCHAR(50) NOT NULL, + fecha_nacimento DATE NOT NULL, + id_contacto INT, + PRIMARY KEY (rut_turista), + FOREIGN KEY (id_contacto) REFERENCES contacto_emergencia (id_contacto) ON DELETE CASCADE +); + +CREATE TABLE tiene_enfermedad(rut_turista VARCHAR(9) NOT NULL, + id_enfermedad SMALLINT NOT NULL, + FOREIGN KEY (rut_turista) REFERENCES turista (rut_turista) ON DELETE CASCADE, + FOREIGN KEY (id_enfermedad) REFERENCES enfermedad (id_enfermedad) ON DELETE CASCADE +); + +CREATE TABLE descuento(id_descuento SMALLSERIAL UNIQUE, + descripcion_descuento TEXT NOT NULL, + porcentaje DECIMAL(3,2) NOT NULL CHECK (porcentaje BETWEEN 0 AND 1), + PRIMARY KEY (id_descuento) +); + +CREATE TABLE realiza(id_tour INT NOT NULL, + rut_turista VARCHAR(9) NOT NULL, + id_descuento SMALLINT NOT NULL, + FOREIGN KEY (id_tour) REFERENCES tour (id_tour) ON DELETE CASCADE, + FOREIGN KEY (rut_turista) REFERENCES turista (rut_turista) ON DELETE CASCADE, + FOREIGN KEY (id_descuento) REFERENCES descuento (id_descuento) ON DELETE CASCADE +); + +CREATE TABLE arrienda(patente VARCHAR(6) NOT NULL, + rut_empresa VARCHAR(9) NOT NULL, + precio INT NOT NULL CHECK (precio > 0), + fecha_devolucion DATE NOT NULL, + FOREIGN KEY (patente) REFERENCES vehiculo (patente) ON DELETE CASCADE, + FOREIGN KEY (rut_empresa) REFERENCES empresa (rut_empresa) ON DELETE CASCADE +); + +CREATE TABLE posee(rut_guia VARCHAR(9) NOT NULL, + id_especialidad SMALLINT NOT NULL, + nivel_especialidad SMALLINT NOT NULL CHECK (nivel_especialidad >= 0), + FOREIGN KEY (rut_guia) REFERENCES guia (rut_guia) ON DELETE CASCADE, + FOREIGN KEY (id_especialidad) REFERENCES especialidad (id_especialidad) ON DELETE CASCADE +); + +CREATE TABLE participa(id_tour INT NOT NULL, + rut_guia VARCHAR(9) NOT NULL, + id_categoria SMALLINT NOT NULL, + FOREIGN KEY (id_tour) REFERENCES tour (id_tour) ON DELETE CASCADE, + FOREIGN KEY (rut_guia) REFERENCES guia (rut_guia) ON DELETE CASCADE, + FOREIGN KEY (id_categoria) REFERENCES categoria (id_categoria) ON DELETE CASCADE +); + +CREATE TABLE asociado(id_tour INT NOT NULL, + id_lugar SMALLINT NOT NULL, + fecha_llegada DATE, + hora_llegada TIME, + fecha_salida DATE, + hora_salida TIME, + FOREIGN KEY (id_tour) REFERENCES tour (id_tour) ON DELETE CASCADE, + FOREIGN KEY (id_lugar) REFERENCES lugar (id_lugar) ON DELETE CASCADE +); + +CREATE TABLE requerir_auto(id_tour INT NOT NULL, + patente VARCHAR(6) NOT NULL, + chofer VARCHAR(50) NOT NULL, + FOREIGN KEY (id_tour) REFERENCES tour (id_tour) ON DELETE CASCADE, + FOREIGN KEY (patente) REFERENCES vehiculo (patente) ON DELETE CASCADE +); diff --git a/doc/Informe1corregido_insertarduplas.sql b/doc/Informe1corregido_insertarduplas.sql new file mode 100644 index 0000000..ad69b04 --- /dev/null +++ b/doc/Informe1corregido_insertarduplas.sql @@ -0,0 +1,97 @@ +INSERT INTO contacto_emergencia (telefono_emergencia, nombre_emergencia) VALUES ('56912345678', 'Chris Cromer'); +INSERT INTO contacto_emergencia (telefono_emergencia, nombre_emergencia) VALUES ('56913334578', 'John Cromer'); +INSERT INTO contacto_emergencia (telefono_emergencia, nombre_emergencia) VALUES ('56913984347', 'Tammy Cromer'); + +INSERT INTO enfermedad (descripcion_enfermedad) VALUES ('Heart Disease'); +INSERT INTO enfermedad (descripcion_enfermedad) VALUES ('Diabetes'); +INSERT INTO enfermedad (descripcion_enfermedad) VALUES ('Lung Cancer'); + +INSERT INTO empresa (rut_empresa, nombre_empresa, contacto, telefono) VALUES ('566034578', 'Hurtz', 'John Jacob', '56948904446'); +INSERT INTO empresa (rut_empresa, nombre_empresa, contacto, telefono) VALUES ('56404537k', 'Rent-a-Car', 'Jim Smith', '56948904446'); +INSERT INTO empresa (rut_empresa, nombre_empresa, contacto, telefono) VALUES ('566003458', 'Car Rentals Dot Com', 'Tony Stark', '56948904446'); + +INSERT INTO especialidad (descripcion_especialidad) VALUES ('Climbing'); +INSERT INTO especialidad (descripcion_especialidad) VALUES ('History'); +INSERT INTO especialidad (descripcion_especialidad) VALUES ('Astronomy'); +INSERT INTO especialidad (descripcion_especialidad) VALUES ('Public Speaking'); + +INSERT INTO categoria (descripcion_categoria) VALUES ('Coordinador'); +INSERT INTO categoria (descripcion_categoria) VALUES ('Speaker'); +INSERT INTO categoria (descripcion_categoria) VALUES ('Expert'); + +INSERT INTO vehiculo (patente, ano_vehiculo, marca, capacidad) VALUES ('as45fe', 2017, 'Chevy', 4); +INSERT INTO vehiculo (patente, ano_vehiculo, marca, capacidad) VALUES ('lj58bv', 2002, 'Mazda', 20); +INSERT INTO vehiculo (patente, ano_vehiculo, marca, capacidad) VALUES ('49fd38', 2001, 'Subaru', 10); +INSERT INTO vehiculo (patente, ano_vehiculo, marca, capacidad) VALUES ('tasdf8', 2001, 'Toyota', 10); + +INSERT INTO region (nombre_region) VALUES ('Florida'); +INSERT INTO region (nombre_region) VALUES ('Alabama'); +INSERT INTO region (nombre_region) VALUES ('Arizona'); + +INSERT INTO ciudad (nombre_ciudad, id_region) VALUES ('Pensacola', 1); +INSERT INTO ciudad (nombre_ciudad, id_region) VALUES ('Montgomery', 2); +INSERT INTO ciudad (nombre_ciudad, id_region) VALUES ('Pheonix', 3); + +INSERT INTO guia (rut_guia, nombre_guia, calle, numero, id_ciudad) VALUES ('266304578', 'John Smith', 'Edison Dr.', 214, 1); +INSERT INTO guia (rut_guia, nombre_guia, calle, numero, id_ciudad) VALUES ('26640457k', 'Jack Offer', 'Jackson Ave.', 1023, 2); +INSERT INTO guia (rut_guia, nombre_guia, calle, numero, id_ciudad) VALUES ('26644457k', 'Mike Toga', 'Madison Way', 342, 3); + +INSERT INTO tour (nombre_tour, costo_indiv, costo_grupal, minima_personas, id_ciudad) VALUES ('Los Rios', 200000, 150000, 1, 1); +INSERT INTO tour (nombre_tour, costo_indiv, costo_grupal, minima_personas, id_ciudad) VALUES ('Valle de la Luna', 300000, 120000, 10, 2); +INSERT INTO tour (nombre_tour, costo_indiv, costo_grupal, minima_personas, id_ciudad) VALUES ('Peru', 400000, 110000, 20, 3); +INSERT INTO tour (nombre_tour, costo_indiv, costo_grupal, minima_personas, id_ciudad) VALUES ('San Pedro', 400000, 110000, 20, 3); + +INSERT INTO lugar (nombre_lugar, valor_entrada, nivel, id_ciudad) VALUES ('El Bio Bio', 0, 3, 1); +INSERT INTO lugar (nombre_lugar, valor_entrada, nivel, id_ciudad) VALUES ('Lago San Pedro', 10000, 3, 2); +INSERT INTO lugar (nombre_lugar, valor_entrada, nivel, id_ciudad) VALUES ('Atacama', 30000, 0, 3); +INSERT INTO lugar (nombre_lugar, valor_entrada, nivel, id_ciudad) VALUES ('Kilamanjaro', 30000, 5, 3); + +INSERT INTO turista (rut_turista, nombre_turista, fecha_nacimento, id_contacto) VALUES ('226634572', 'Jack Asserton', '1985-02-23', 1); +INSERT INTO turista (rut_turista, nombre_turista, fecha_nacimento, id_contacto) VALUES ('194333573', 'Tommy Gunner', '1990-06-02', 2); +INSERT INTO turista (rut_turista, nombre_turista, fecha_nacimento, id_contacto) VALUES ('17398380k', 'Jimmy Johnson', '1955-01-01', 3); +INSERT INTO turista (rut_turista, nombre_turista, fecha_nacimento, id_contacto) VALUES ('232322226', 'Jimmy Olson', '1985-04-03', 1); + +INSERT INTO tiene_enfermedad (rut_turista, id_enfermedad) VALUES ('226634572', 1); +INSERT INTO tiene_enfermedad (rut_turista, id_enfermedad) VALUES ('194333573', 2); +INSERT INTO tiene_enfermedad (rut_turista, id_enfermedad) VALUES ('17398380k', 3); + +INSERT INTO descuento (descripcion_descuento, porcentaje) VALUES ('0-15 años', 0.20) +INSERT INTO descuento (descripcion_descuento, porcentaje) VALUES ('16-50 años', 0.00) +INSERT INTO descuento (descripcion_descuento, porcentaje) VALUES ('51', 0.10) +INSERT INTO descuento (descripcion_descuento, porcentaje) VALUES ('66 en adelante', 0.30) + +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (2, '232322226', 2); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (3, '17398380k', 2); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (3, '194333573', 2); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (1, '226634572', 2); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (4, '17398380k', 1); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (2, '194333573', 2); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (4, '194333573', 1); +INSERT INTO realiza (id_tour, rut_turista, id_descuento) VALUES (4, '226634572', 3); + +INSERT INTO arrienda (patente, rut_empresa, precio, fecha_devolucion) VALUES ('as45fe', '566034578', 120000, '2018-11-29'); +INSERT INTO arrienda (patente, rut_empresa, precio, fecha_devolucion) VALUES ('lj58bv', '56404537k', 100000, '2018-11-29'); +INSERT INTO arrienda (patente, rut_empresa, precio, fecha_devolucion) VALUES ('49fd38', '566003458', 150000, '2018-11-29'); + +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('266304578', 1, 0); +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('26640457k', 2, 3); +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('26644457k', 3, 5); +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('266304578', 2, 5); +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('266304578', 3, 5); +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('266304578', 4, 5); +INSERT INTO posee (rut_guia, id_especialidad, nivel_especialidad) VALUES ('26640457k', 1, 5); + +INSERT INTO participa (id_tour, rut_guia, id_categoria) VALUES (1, '26640457k', 1); +INSERT INTO participa (id_tour, rut_guia, id_categoria) VALUES (2, '266304578', 1); +INSERT INTO participa (id_tour, rut_guia, id_categoria) VALUES (2, '26640457k', 1); +INSERT INTO participa (id_tour, rut_guia, id_categoria) VALUES (3, '26644457k', 1); + +INSERT INTO asociado (id_tour, id_lugar, fecha_llegada, hora_llegada, fecha_salida, hora_salida) VALUES (1, 1, '2018-01-10', '04:15', '2018-01-10', '05:15'); +INSERT INTO asociado (id_tour, id_lugar, fecha_llegada, hora_llegada, fecha_salida, hora_salida) VALUES (2, 2, '2018-02-22', '09:35', '2018-02-22', '10:35'); +INSERT INTO asociado (id_tour, id_lugar, fecha_llegada, hora_llegada, fecha_salida, hora_salida) VALUES (3, 3, '2018-03-30', '16:40', '2018-03-30', '19:10'); +INSERT INTO asociado (id_tour, id_lugar, fecha_llegada, hora_llegada, fecha_salida, hora_salida) VALUES (4, 3, '2018-10-15', '12:40', '2018-10-15', '13:10'); +INSERT INTO asociado (id_tour, id_lugar, fecha_llegada, hora_llegada, fecha_salida, hora_salida) VALUES (2, 4, '2018-10-15', '12:40', '2018-10-15', '13:10'); + +INSERT INTO requerir_auto (id_tour, patente, chofer) VALUES (1, 'as45fe', 'Luke Hobbs'); +INSERT INTO requerir_auto (id_tour, patente, chofer) VALUES (1, 'lj58bv', 'Dominic Toretto'); +INSERT INTO requerir_auto (id_tour, patente, chofer) VALUES (1, '49fd38', 'Roman Pearce'); diff --git a/doc/Informe2.pdf b/doc/Informe2.pdf new file mode 100644 index 0000000..04a9008 Binary files /dev/null and b/doc/Informe2.pdf differ diff --git a/doc/Informe2.tex b/doc/Informe2.tex new file mode 100644 index 0000000..ec538d7 --- /dev/null +++ b/doc/Informe2.tex @@ -0,0 +1,122 @@ +\documentclass[12pt]{article} + +\usepackage[utf8]{inputenc} +\usepackage[spanish]{babel} +\usepackage{array} +\usepackage{adjustbox} +\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm,a4paper]{geometry} +\usepackage{amsmath} +\usepackage{verbatim} + +\usepackage{listings} +\lstset{ + basicstyle=\footnotesize\ttfamily, + columns=flexible, + breaklines=true, + inputencoding=utf8, + extendedchars=true, + literate={á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 {ñ}{{\~n}}1 {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 {Ñ}{{\~N}}1 +} + +\usepackage{titling} +\renewcommand\maketitlehooka{\null\mbox{}\vfill} +\renewcommand\maketitlehookd{\vfill\null} + +\usepackage{hyperref} +\hypersetup{colorlinks=true,allcolors=black} +\usepackage{hypcap} + +\title{\textbf{Proyecto Semestral de Base de Datos\\Entrega 2}} +\author{Christopher Cromer\\\\Profesora Valeria Beratto\\Sección 1} +\date{\today} + +\pretitle{% + \begin{center} + \LARGE + \includegraphics[width=4cm]{ubblogo.png}\\[\bigskipamount] + } + +\posttitle{\end{center}} + +\begin{document} +\clearpage +\hypersetup{pageanchor=false} +\begin{titlingpage} +\maketitle +\end{titlingpage} +\thispagestyle{empty} + +\newpage + +\clearpage +\thispagestyle{empty} +\tableofcontents + +\newpage +\hypersetup{pageanchor=true} +\pagenumbering{arabic} +\section{Introducción} +El objetivo de este trabajo es modelar un sistema por el Servicio Nacional de Turismo(SERNATUR) con el propósito de almacenar y consultar a un base de datos de PostgreSQL con información sobre el turismo. + +\newpage +\section{Consultas} + +\subsection{Vista \texorpdfstring{$Q_1$}{Lg}} +\lstinputlisting{Informe2_vistaQ1.sql} + +\subsubsection{Resultado de \texorpdfstring{$Q_1$}{Lg}} + +\begin{center} + \includegraphics[keepaspectratio]{Informe2_Q1.png} +\end{center} + +\subsection{Vistas \texorpdfstring{$Q_2$}{Lg}} +\lstinputlisting{Informe2_vistaQ2.sql} + +\subsubsection{Resultado de \texorpdfstring{$Q_2$}{Lg}} + +\begin{center} + \includegraphics[keepaspectratio]{Informe2_Q2.png} +\end{center} + +\subsection{Vistas \texorpdfstring{$Q_3$}{Lg}} +\lstinputlisting{Informe2_vistaQ3.sql} + +\subsubsection{Resultado de \texorpdfstring{$Q_3$}{Lg}} + +\begin{center} + \includegraphics[keepaspectratio]{Informe2_Q3.png} +\end{center} + +\subsection{Vistas \texorpdfstring{$Q_4$}{Lg}} +\lstinputlisting{Informe2_vistaQ4.sql} + +\subsubsection{Resultado de \texorpdfstring{$Q_4$}{Lg}} + +\begin{center} + \includegraphics[keepaspectratio]{Informe2_Q4.png} +\end{center} + +\subsection{Vistas \texorpdfstring{$Q_5$}{Lg}} +\lstinputlisting{Informe2_vistaQ5.sql} + +\subsubsection{Resultado de \texorpdfstring{$Q_5$}{Lg}} + +\begin{center} + \includegraphics[keepaspectratio]{Informe2_Q5.png} +\end{center} + +\newpage +\section{Script SQL} + +\subsection{Crear tablas} + +\lstinputlisting{Informe1corregido_creartablas.sql} + +\newpage +\subsection{Insertar duplas} + +\lstinputlisting{Informe1corregido_insertarduplas.sql} + +\end{document} + diff --git a/doc/Informe2_Q1.png b/doc/Informe2_Q1.png new file mode 100644 index 0000000..17df4a2 Binary files /dev/null and b/doc/Informe2_Q1.png differ diff --git a/doc/Informe2_Q2.png b/doc/Informe2_Q2.png new file mode 100644 index 0000000..12022e8 Binary files /dev/null and b/doc/Informe2_Q2.png differ diff --git a/doc/Informe2_Q3.png b/doc/Informe2_Q3.png new file mode 100644 index 0000000..e3ed6e2 Binary files /dev/null and b/doc/Informe2_Q3.png differ diff --git a/doc/Informe2_Q4.png b/doc/Informe2_Q4.png new file mode 100644 index 0000000..b998151 Binary files /dev/null and b/doc/Informe2_Q4.png differ diff --git a/doc/Informe2_Q5.png b/doc/Informe2_Q5.png new file mode 100644 index 0000000..a6c4a29 Binary files /dev/null and b/doc/Informe2_Q5.png differ diff --git a/doc/Informe2_vistaQ1.sql b/doc/Informe2_vistaQ1.sql new file mode 100644 index 0000000..b09c27b --- /dev/null +++ b/doc/Informe2_vistaQ1.sql @@ -0,0 +1,18 @@ +CREATE VIEW REGIONES_SINDESCUENTO(nombreRegion, cantidad) +AS ( + SELECT nombre_region, COUNT(R2.rut_turista) + FROM region R + JOIN ciudad C ON (C.id_region = R.id_region) + JOIN tour T ON (T.id_ciudad = C.id_ciudad) + JOIN realiza R2 ON (R2.id_tour = T.id_tour) + WHERE ( + EXISTS(SELECT fecha_llegada + FROM asociado + WHERE (id_tour = T.id_tour AND fecha_llegada BETWEEN '2018-11-01' AND '2018-11-30') + ) AND + R2.id_descuento = 2 + ) + GROUP BY (R.nombre_region) +); + +SELECT nombreRegion, cantidad FROM REGIONES_SINDESCUENTO ORDER BY cantidad DESC; diff --git a/doc/Informe2_vistaQ2.sql b/doc/Informe2_vistaQ2.sql new file mode 100644 index 0000000..b1b63ce --- /dev/null +++ b/doc/Informe2_vistaQ2.sql @@ -0,0 +1,33 @@ +CREATE VIEW VALORES_TOURS(idT, nombreT, TotalVentas) +AS ( + SELECT T.id_tour, T.nombre_tour, + ((CASE + WHEN T.minima_personas <= (SELECT COUNT(rut_turista) FROM realiza WHERE (id_tour = T.id_tour)) + THEN (SELECT costo_grupal FROM tour WHERE (id_tour = T.id_tour)) + ELSE (SELECT costo_indiv FROM tour WHERE (id_tour = T.id_tour)) + END) * COUNT(rut_turista)) AS cantidad + FROM tour T + JOIN realiza R ON (T.id_tour = R.id_tour) + GROUP BY (T.id_tour) +); + +CREATE VIEW TOUR_DESCUENTOS(idT, nombreT, TotalDescuentos) +AS ( + SELECT T.id_tour, T.nombre_tour, + SUM(DISTINCT (SELECT porcentaje FROM descuento WHERE (id_descuento = R.id_descuento)) * + (SELECT COUNT(rut_turista) FROM realiza WHERE (id_tour = R.id_tour AND id_descuento = R.id_descuento)) * + (CASE + WHEN T.minima_personas <= (SELECT COUNT(rut_turista) FROM realiza WHERE (id_tour = T.id_tour)) + THEN (SELECT costo_grupal FROM tour WHERE (id_tour = T.id_tour)) + ELSE (SELECT costo_indiv FROM tour WHERE (id_tour = T.id_tour)) + END)) AS test + FROM tour T + JOIN realiza R ON (T.id_tour = R.id_tour) + WHERE (R.id_descuento != 2) + GROUP BY (T.id_tour) +); + +SELECT V.nombreT, (V.TotalVentas - COALESCE(MAX(T.TotalDescuentos), 0)) AS ValorTotalRecibido +FROM VALORES_TOURS V +FULL JOIN TOUR_DESCUENTOS T ON (T.idT = V.idT) +GROUP BY (V.nombreT, V.TotalVentas); diff --git a/doc/Informe2_vistaQ3.sql b/doc/Informe2_vistaQ3.sql new file mode 100644 index 0000000..c6cab50 --- /dev/null +++ b/doc/Informe2_vistaQ3.sql @@ -0,0 +1,19 @@ +CREATE VIEW TOTAL_COORDINADORES(idT, nombreT, TotalCoordinadores) +AS ( + SELECT T.id_tour, T.nombre_tour, COUNT(DISTINCT P.rut_guia) + FROM participa P + JOIN tour T ON (T.id_tour = P.id_tour) + JOIN guia G ON (G.rut_guia = P.rut_guia) + JOIN categoria C ON (C.id_categoria = P.id_categoria) + JOIN posee P2 ON (G.rut_guia = P2.rut_guia) + JOIN asociado A ON (A.id_tour = T.id_tour) + JOIN lugar L ON (L.id_lugar = A.id_lugar) + WHERE ( + C.descripcion_categoria = 'Coordinador' AND + L.nivel = 3 AND + (SELECT COUNT(rut_guia) FROM posee WHERE (rut_guia = G.rut_guia)) > 3 + ) + GROUP BY (T.id_tour) +); + +SELECT nombreT, TotalCoordinadores FROM TOTAL_COORDINADORES ORDER BY TotalCoordinadores DESC; diff --git a/doc/Informe2_vistaQ4.sql b/doc/Informe2_vistaQ4.sql new file mode 100644 index 0000000..0ea5a34 --- /dev/null +++ b/doc/Informe2_vistaQ4.sql @@ -0,0 +1,22 @@ +CREATE VIEW TOTAL_TURISTAS(idT, nombreT, TotalTuristas) +AS ( + SELECT T.id_tour, T.nombre_tour, COUNT(R.rut_turista) + FROM tour T + JOIN realiza R ON (T.id_tour = R.id_tour) + JOIN asociado A ON (T.id_tour = A.id_tour) + JOIN lugar l ON (A.id_lugar = L.id_lugar) + WHERE ( + L.nivel >= 5 AND + (A.fecha_llegada BETWEEN '2018-10-01' AND '2018-10-31') AND + NOT EXISTS ( + SELECT id_enfermedad + FROM tiene_enfermedad T2 + WHERE (T2.rut_turista = R.rut_turista AND + (T2.id_enfermedad = 1 OR T2.id_enfermedad = 3) + ) + ) + ) + GROUP BY (T.id_tour) +); + +SELECT nombreT, TotalTuristas FROM TOTAL_TURISTAS ORDER BY TotalTuristas DESC; diff --git a/doc/Informe2_vistaQ5.sql b/doc/Informe2_vistaQ5.sql new file mode 100644 index 0000000..63e1b0a --- /dev/null +++ b/doc/Informe2_vistaQ5.sql @@ -0,0 +1,17 @@ +CREATE VIEW TOTAL_ARRIENDOS(TotalArriendo) +AS (SELECT COUNT(A.patente) + FROM arrienda A + JOIN requerir_auto R ON (R.patente = A.patente) + JOIN tour T ON (T.id_tour = R.id_tour) + JOIN asociado A2 ON (T.id_tour = A2.id_tour) + WHERE (A2.fecha_llegada BETWEEN '2018-01-01' AND '2018-02-28') +); + +CREATE VIEW TOTAL_VEHICULOS(TotalVeh) +AS (SELECT COUNT(patente) + FROM vehiculo +); + +SELECT + (cast(T1.totalarriendo AS DECIMAL(3,2)) / cast(T2.totalveh AS DECIMAL(3,2))) AS porcentaje +FROM total_arriendos AS T1, total_vehiculos AS T2; diff --git a/doc/MERcorregido.dia b/doc/MERcorregido.dia new file mode 100644 index 0000000..6d6fdb8 Binary files /dev/null and b/doc/MERcorregido.dia differ diff --git a/doc/MERcorregido.png b/doc/MERcorregido.png new file mode 100644 index 0000000..d853a84 Binary files /dev/null and b/doc/MERcorregido.png differ diff --git a/doc/meson.build b/doc/meson.build index 433baad..69437f1 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -31,6 +31,9 @@ if docs_enabled endif install_data('trabajoSemestral(E1).pdf', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) +install_data('trabajoSemestral(E2).pdf', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) +install_data('Informe1.pdf', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) install_data('MER.dia', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) +install_data('MER.png', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) install_data('../LICENSE', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) install_data('../README.md', install_dir: join_paths(get_option('datadir'), 'doc', meson.project_name())) diff --git a/doc/trabajoSemestral(E2).pdf b/doc/trabajoSemestral(E2).pdf new file mode 100644 index 0000000..4005208 Binary files /dev/null and b/doc/trabajoSemestral(E2).pdf differ diff --git a/src/sernatur-window.vala b/src/sernatur-window.vala index 95d4e41..00d35cc 100644 --- a/src/sernatur-window.vala +++ b/src/sernatur-window.vala @@ -40,6 +40,8 @@ namespace Sernatur { return; } + // TODO: if config file does not exist, then fallback to gsettings schemas + Config config = Config(); if (!config.read_file ("/etc/sernatur/sernatur.conf")) { stderr.printf ("%s\n", config.error_message ());