Skip to content

Instantly share code, notes, and snippets.

@ebobby
Created December 2, 2019 00:16
Show Gist options
  • Select an option

  • Save ebobby/c85c06bd46f525bebb978bb0b740fc15 to your computer and use it in GitHub Desktop.

Select an option

Save ebobby/c85c06bd46f525bebb978bb0b740fc15 to your computer and use it in GitHub Desktop.
\documentclass[12pt, a4paper]{article}
\usepackage{graphicx}
\graphicspath{ {images/} }
\usepackage[spanish]{babel}
\usepackage{listings}
\lstset{basicstyle=\fontsize{10}{13}\selectfont\ttfamily}
\begin{document}
\begin{titlepage}
\begin{center}
\vspace{1.0cm}
{\huge\scshape{\textbf{Sistema de administración de barra de \textbf{Kraken
Gastropub}}} \par}
\vspace{1.2cm}
{\large Trabajo final: \textbf{Bases de Datos}\par}
\vfill
{\large\scshape Presentado Por: \par}
{\Large\scshape\textbf{Francisco Antonio Muñoz Soto} \par}
\vspace{2.5cm}
\small
{\scshape División de estudios de posgrado e investigación \par}
{\scshape Instituto Tecnológico de Hermosillo \par}
{\scshape Hermosillo, Sonora, México \par}
{\large \today\par}
\end{center}
\end{titlepage}
\tableofcontents
\newpage
\section{Descripción de la empresa}
\textit{Kraken Gastropub} es un restaurante-bar donde se fusiona la comida
americana tradicional y las mejores cervezas artesanales de la región. Se
encuentra localizado en la ciudad de Hermosillo, Sonora, México.
\newpage
\section{Requerimientos}
Se modela el proceso de recepción de barriles de cerveza artesanal en el
local, el cálculo de costos y precios y el control de inventario, es decir,
producto restante en el barril.
\subsection{Recepción}
La información que se tiene al momento de recibir un barril son: cantidad de
líquido, precio del barril y desglose de impuestos, las características de la
cerveza y la cervecería.
\bigskip
El sistema debe de recibir esta información y guardar en catálogos la cervecería
(nombre, dirección web, log) y la cerveza (estilo, nombre, abv, ibus,
descripción). Es posible recibir varias cervezas de la misma cervecería y
recibir la misma cerveza también, es decir, con los mismos atributos.
\bigskip
Utilizando la cantidad de líquido, el precio del barril y el desglose de
impuestos el sistema deberá calcular:
\begin{itemize}
\item Costo total, con impuestos.
\item Onzas recibidas en el barril.
\item Onzas totales de venta después de merma (configurable).
\item Costo por onza.
\item Precio de venta normal al público por onza.
\item Precio de venta promoción al público por onza.
\item Fecha de recepción del barril.
\end{itemize}
\subsection{Control de inventarios}
El sistema deberá permitir la captura de venta diaria por barril que consiste en
vasos vendidos, venta total y día de la venta. Con estos datos el sistema
calculará:
\begin{itemize}
\item Onzas vendidas.
\item Onzas vendidas en total.
\item Ventas totales del barril.
\item Ganancia del barril (venta - costo).
\item Onzas y vasos restantes.
\end{itemize}
Es posible que vasos restantes se haga negativo. Es decir, que se estima un
número determinado de vasos por la merma y el barril dio más.
\bigskip
El sistema también debe permitir marcar un barril como terminado lo cual cerrara
cualquier registro de venta y el despliegue del barril como activo en barra.
\newpage
\section{Propuesta}
\subsection{Diagrama E-R.}
\includegraphics{diagrama-er}
\subsection{Diagrama relacional}
\includegraphics[scale=0.70]{diagrama-relacional}
\subsection{Verificación de 3ra. forma normal}
La base de datos no se encuentra en tercera forma funcional (3NF) de manera
intencional.
\bigskip
Aunque se puede obtener los totales de venta por barril y de onzas vendidas
utilizando la tabla \textbf{keg\_sales}, estos datos se agregan y se redundan en
la tabla \textbf{kegs}.
\bigskip
Esto se debe a algunas de las consultas que deben realizarse. Se ocupan que sean
mas sencillas y más rápidas por los requerimientos de hardware del sistema.
\newpage
\section{Procesos}
\subsection{Barriles activos}
\begin{lstlisting}[language=SQL]
SELECT
k.id keg_id,
b.style beer_style,
br.name brewery_name,
ROUND(k.price_per_ounce, 2) ppo,
ROUND(k.price_per_ounce_promo, 2) ppop,
ROUND(current_sales, 2) sales,
ROUND(estimated_ounces - sold_ounces,2) lo
FROM kegs k
JOIN beers b ON b.id = k.beer_id
JOIN breweries br ON br.id = b.brewery_id
WHERE k.finished_at IS NULL;
keg_id | beer_style | ppo | ppop | sales | lo
---------+-------------------+------+------+---------+--------
311 | PALE ALE | 6.25 | 5.00 | 320.00 | 486.10
325 | coffe stout | 6.25 | 4.58 | 1322.50 | 324.10
327 | chocolate stout | 6.25 | 5.00 | 2340.05 | 144.10
328 | CALIFORNIA COMMON | 5.42 | 4.17 | 1095.00 | 261.65
330 | chocolate stout | 6.25 | 5.00 | 2396.24 | 120.10
332 | PALE ALE | 5.83 | 4.58 | 1757.50 | 228.10
333 | AMERICAN WHEAT | 6.25 | 5.00 | 1267.50 | 336.10
334 | mazapan stout | 5.83 | 4.17 | 2477.49 | 108.10
335 | irish red | 5.83 | 4.17 | 2080.00 | 186.10
336 | pilsner | 6.25 | 5.00 | 2396.24 | 150.10
337 | NEIPA | 7.50 | 5.83 | 1917.50 | 264.10
338 | imperial porter | 6.25 | 5.00 | 682.50 | 444.10
339 | NEIPA | 6.67 | 5.00 | 1477.50 | 312.10
\end{lstlisting}
\newpage
\subsection{Ventas por mes}
\begin{lstlisting}[language=SQL]
SELECT
EXTRACT(month from sold_at) AS month,
EXTRACT(year from sold_at) AS year,
ROUND(SUM(amount), 2) sales,
ROUND(SUM(ounces), 2) ounces
FROM keg_sales
GROUP by 1,2
ORDER by 2 DESC, 1 DESC;
month | year | sales | ounces
-------+------+----------+----------
6 | 2019 | 41121.22 | 7050.00
5 | 2019 | 75252.05 | 13272.00
4 | 2019 | 62197.37 | 11148.00
3 | 2019 | 73786.91 | 12924.00
2 | 2019 | 52051.62 | 9420.00
1 | 2019 | 71505.94 | 12786.00
12 | 2018 | 68706.69 | 12264.00
11 | 2018 | 77294.80 | 13878.00
10 | 2018 | 72428.05 | 13152.00
9 | 2018 | 71871.11 | 13974.00
8 | 2018 | 70039.85 | 12666.00
7 | 2018 | 70969.37 | 12270.00
6 | 2018 | 77031.99 | 14016.00
5 | 2018 | 4262.48 | 768.00
\end{lstlisting}
\newpage
\subsection{Ventas por cervecería}
\begin{lstlisting}[language=SQL]
SELECT
br.name,
ROUND(SUM(amount), 2) sales,
ROUND(SUM(ounces), 2) ounces
FROM keg_sales ks
JOIN kegs k ON k.id = ks.keg_id
JOIN beers b ON b.id = k.beer_id
JOIN breweries br ON br.id = b.brewery_id
GROUP BY br.id ORDER BY 2 DESC;
name | sales | ounces
--------------------------+-----------+----------
El Bandido Cerveceria | 184268.29 | 33888.00
Buqui Bichi Brewing | 129818.40 | 23130.00
Isla Negra Cerveceria | 109171.74 | 19986.00
GILA Cerveza Artesanal | 109142.12 | 18834.00
662 Cerveceria | 93280.46 | 15840.00
Cerveceria Venado | 66072.40 | 12078.00
SOHA Cerveza Artesanal | 54848.72 | 9462.00
Lucky Monkey Brewing Co. | 40240.21 | 7422.00
Cerveceria B55 | 38871.03 | 7206.00
Cerveceria Argova | 37304.50 | 6948.00
Cerveceria Velodromo | 22954.08 | 4260.00
Octopus Brewing | 2547.50 | 534.00
\end{lstlisting}
\newpage
\section{Requerimientos del sistema}
\subsection{Hardware}
Los requerimientos del sistema son mínimos en términos de hardware:
\begin{itemize}
\item 1GB memoria RAM
\item 1 vCPU
\item 20GB de almacenamiento
\end{itemize}
\bigskip
Para el propósito de correr la aplicación se utiliza un ``droplet'' en
Digital Ocean\footnote{https://www.digitalocean.com}. El costo del droplet es de
\$5 USD mensuales.
\subsection{Software}
\begin{itemize}
\item Ruby 2.5.1
\item Bundler 1.16.2
\item Nginx 1.10.3
\item PostgreSQL 10.11
\end{itemize}
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment