Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información...

18
Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 1 de 18 Enunciado La trascripción que aparece a continuación corresponde a una entrevista con una emprendedora que quiere crear una empresa de gestión de alquileres de apartamentos turísticos. Pregunta: Bien, ¿qué necesita que haga el portal web a desarrollar? Respuesta: Bueno, por un lado permitir que los usuarios con alojamientos disponibles los puedan publicar y, por otro lado, que los usuarios que busquen alquilar un alojamiento los puedan buscar por una determinada zona (Costa de la Luz, Costa del Sol, etc.), ver las fotos y solicitar una reserva. P: Muy bien, empecemos por los apartamentos. R: Hablemos mejor de alojamientos, no todos son apartamentos, también hay casas rurales y otros tipos distintos. P: ¿Pero se tratan todos de la misma forma? R: Sí, para nosotros son iguales. P: Bien, pues dígame que información quiere guardar de los alojamientos. R: Pues la dirección, sus características y muchas fotos. P: ¿Cuáles son las características? R: Pues el número de dormitorios, el número de baños, la ocupación máxima y si tiene aire acondicionado, wifi, piscina y garaje. Y quien es el propietario, claro. Ah, y la zona turística en la que se encuentra, como le dije antes. P: Muy bien, y ¿qué información necesita de los usuarios? R: Bueno, de los usuarios necesito el DNI, nombre y apellidos, correo electrónico, una contraseña para acceder, una dirección y un teléfono de contacto. P: ¿Considera usuarios tanto a los propietarios como a los que solicitan reservas? R: Sí, porque los propietarios también pueden reservar. Simplemente, si un usuario es propietario, al entrar al portal podrá gestionar sus alojamientos y hacer reservas. Si no tiene alojamientos, sólo podrá hacer reservas. P: Muy bien, hábleme de las reservas. R: Bueno, una reserva la hace un usuario sobre un alojamiento, con una fecha de check-in y una fecha de check-out. P: ¿Check-in, check-out? R: Sí, entrada y salida, es como se suele hablar en este sector, ¿sabe? P: OK, fecha de check-in y fecha de check-out. R: Eso es, tenga en cuenta que el mismo día de check-out se puede hacer un check-in de otra reserva, pero no puede haber más solape de reservas que ese. P: ¿Me lo puede explicar? R: Sí claro, dos reservas de un mismo alojamiento no se pueden solapar salvo en el día de check-out de una y el de check-in de la siguiente. P: Lo entiendo, debemos controlar el solape de reservas. ¿Algo más sobre reservas? R: Bueno, si la reserva se confirma por parte del propietario y el usuario, me gustaría que el usuario pudiera añadir comentarios con una valoración. P: ¿Qué tipo de valoración? R: Por el momento me vale una de esas de estrellitas, de una a cinco estrellas, ¿sabe de qué le hablo? P: Sí, de acuerdo, una valoración de 1 a 5 que se visualiza como estrellas.

Transcript of Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información...

Page 1: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 1 de 18

Enunciado

La trascripción que aparece a continuación corresponde a una entrevista con una emprendedora que quiere crear una empresa de gestión de alquileres de apartamentos turísticos. Pregunta: Bien, ¿qué necesita que haga el portal web a desarrollar? Respuesta: Bueno, por un lado permitir que los usuarios con alojamientos disponibles los puedan publicar y, por otro lado, que los usuarios que busquen alquilar un alojamiento los puedan buscar por una determinada zona (Costa de la Luz, Costa del Sol, etc.), ver las fotos y solicitar una reserva. P: Muy bien, empecemos por los apartamentos. R: Hablemos mejor de alojamientos, no todos son apartamentos, también hay casas rurales y otros tipos distintos. P: ¿Pero se tratan todos de la misma forma? R: Sí, para nosotros son iguales. P: Bien, pues dígame que información quiere guardar de los alojamientos. R: Pues la dirección, sus características y muchas fotos. P: ¿Cuáles son las características? R: Pues el número de dormitorios, el número de baños, la ocupación máxima y si tiene aire acondicionado, wifi, piscina y garaje. Y quien es el propietario, claro. Ah, y la zona turística en la que se encuentra, como le dije antes. P: Muy bien, y ¿qué información necesita de los usuarios? R: Bueno, de los usuarios necesito el DNI, nombre y apellidos, correo electrónico, una contraseña para acceder, una dirección y un teléfono de contacto. P: ¿Considera usuarios tanto a los propietarios como a los que solicitan reservas? R: Sí, porque los propietarios también pueden reservar. Simplemente, si un usuario es propietario, al entrar al portal podrá gestionar sus alojamientos y hacer reservas. Si no tiene alojamientos, sólo podrá hacer reservas. P: Muy bien, hábleme de las reservas. R: Bueno, una reserva la hace un usuario sobre un alojamiento, con una fecha de check-in y una fecha de check-out. P: ¿Check-in, check-out? R: Sí, entrada y salida, es como se suele hablar en este sector, ¿sabe? P: OK, fecha de check-in y fecha de check-out. R: Eso es, tenga en cuenta que el mismo día de check-out se puede hacer un check-in de otra reserva, pero no puede haber más solape de reservas que ese. P: ¿Me lo puede explicar? R: Sí claro, dos reservas de un mismo alojamiento no se pueden solapar salvo en el día de check-out de una y el de check-in de la siguiente. P: Lo entiendo, debemos controlar el solape de reservas. ¿Algo más sobre reservas? R: Bueno, si la reserva se confirma por parte del propietario y el usuario, me gustaría que el usuario pudiera añadir comentarios con una valoración. P: ¿Qué tipo de valoración? R: Por el momento me vale una de esas de estrellitas, de una a cinco estrellas, ¿sabe de qué le hablo? P: Sí, de acuerdo, una valoración de 1 a 5 que se visualiza como estrellas.

Page 2: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 2 de 18

R: Eso es. P: ¿Más funcionalidades que necesite del portal? R: Quedan muchos más temas por tratar, como la disponibilidad, la gestión de los pagos, etc., pero para una primera versión creo que puede ser suficiente. P: De acuerdo, seguiremos avanzado más adelante.

Contenido 1. Introducción ................................................................................................................. 3

2. Glosario de términos .................................................................................................... 3

3. Catálogo de requisitos .................................................................................................. 4

3.1. Mapa de historias de usuario .................................................................................................. 4

3.2. Requisitos de información ....................................................................................................... 4

3.3. Reglas de negocio .................................................................................................................... 5

3.4. Requisitos funcionales ............................................................................................................. 5

3.5. Pruebas de aceptación de reglas de negocio .......................................................................... 6

4. Modelo conceptual ....................................................................................................... 7

4.1. Diagrama de clases UML ......................................................................................................... 7

4.2. Escenarios ................................................................................................................................ 8

4.3. Matriz de trazabilidad Requisitos/Artefactos del Modelo Conceptual ................................... 9

5. Modelo Tecnológico ..................................................................................................... 9

5.1. Modelo relacional en 3FN ....................................................................................................... 9

5.2. Matriz de trazabilidad Artefactos del Modelo Conceptual/Tecnológico .............................. 12

5.3. Esquema ORACLE .................................................................................................................. 13

Page 3: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 3 de 18

1. Introducción La empresa de gestión de alquileres de apartamentos turísticos tiene por objetivo crear un espacio común

entre los usuarios que ofertan alojamientos para alquilar y los demandantes de alquileres.

Al ser una empresa nueva creación no dispone de ningún software para llevar a cabo su trabajo.

En este documento se presenta un ejemplo ilustrativo de documentación de tres modelos del ciclo de vida

de desarrollo del software: Catálogo de Requisitos, Modelo Conceptual, Modelo Tecnológico.

2. Glosario de términos Término Descripción

Alojamiento Inmueble disponible para ser reservado.

Fecha de check-in Fecha inicial de la reserva.

Fecha de check-out Fecha final de la reserva.

Reserva Petición de un alojamiento concreto para un intervalo de fechas.

Catálogo

de Requisitos

Modelo

Conceptual

Modelo

Tecnológico

TRACE TRACE

Page 4: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 4 de 18

3. Catálogo de requisitos

3.1. Mapa de historias de usuario

Figura 1: Mapa de historias de usuario

3.2. Requisitos de información

RI-1.1: Información sobre alojamientos: Como: Gestor de la empresa. Quiero: Conocer las características del alojamiento como número de dormitorios, número de baños, ocupación máxima posible, disponibilidad de aire acondicionado, wifi, garaje y piscina. Además se guardará su propietario, zona donde está situado y una o más fotografías de dicho alojamiento de las que quiero conocer su localización (path) y tipo. Para que: Los usuarios, al hacer las reservas, puedan conocer sus características y filtrar por distintos criterios.

RI-3.1: Información sobre reservas: Quiero: Conocer el intervalo de fechas reservado (fecha de check-in y fecha de check-out), el alojamiento reservado y el usuario que hace la reserva. Así mismo, se almacenará la opinión de los usuarios y su valoración.

RI-7.1: Información sobre propietarios y usuarios: Quiero: Conocer el Dni, nombre, apellidos, correo, contraseña, dirección y teléfono de los usuarios.

Page 5: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 5 de 18

3.3. Reglas de negocio

RN-3.6: Fechas solapadas Quiero que: Para un mismo alojamiento, no pueda haber dos reservas con intervalos de fechas de

reservas solapadas, salvo la fecha de check-in y check-out.

RN-3.7: Duración reserva Quiero que: En cada reserva, la fecha de check-out sea al menos un día posterior a la fecha check-in.

RN-3.8: Propietario reserva Quiero que: Un usuario no pueda reservar un alojamiento del que es propietario.

3.4. Requisitos funcionales

RF-1.2: Consultas de alojamientos sin ocupar

Como: Gestor de la empresa. Quiero: Conocer los alojamientos que no están reservados para la fecha actual o para una fecha concreta. Para: Realizar labores de mantenimiento.

RF-1.3: Registrar nuevos alojamientos

Como: Gestor de la empresa, usuario propietario. Quiero: Poder registrar nuevos alojamientos junto con sus fotos, propietarios y zonas donde están ubicados. Para que: Puedan ser reservados.

RF-1.4: Añadir nuevas fotos

Como: Usuario propietario. Quiero: Poder añadir nuevas fotos de los alojamientos de los que soy propietario. Para: Dar a conocer mis alojamientos y aumentar las reservas.

RF-3.2: Consultas de Reservas Como: Gestor de la empresa Quiero: Poder consultar las reservas por diferentes criterios como fechas, zonas, propietarios, etc. Para: Conocer las preferencias de los usuarios

RF-3.3: Registrar nuevas reservas

Como: Gestor de la empresa Quiero: Facilitar la realización de reservas sobre alojamientos. Para: Mejorar y controlar mi negocio.

RF-3.4: Anular o cambiar una reserva Como: Usuario Quiero: Poder modificar o anular las reservas realizadas.

Page 6: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 6 de 18

RF-3.5: Hacer un comentario

Como: Gestor de la empresa, usuario Quiero: Guardar la opinión de los usuarios sobre los alojamientos reservados Para: Mejorar el servicio.

RF-6.1: Consultas de alojamientos más reservados

Como: Gestor de la empresa Quiero: Dado un intervalo de fechas, conocer los alojamientos que tienen más reservas Para: Saber qué alojamientos son más rentables.

RF-7.2: Registro de nuevos usuarios Como: Gestor de la empresa Quiero: Registrar propietarios y usuarios que consulten y/o realicen reservan sobre los alojamientos disponibles. Para: Facilitar el acceso de los usuarios al sistema.

3.5. Pruebas de aceptación de reglas de negocio

RN-3.6: Fechas solapadas

- Se registra una primera reserva para un intervalo dado.

- Se intenta registra una segunda reserva para un intervalo solapado con el anterior y da error.

- Se registra una nueva reserva para un intervalo que no solape y es correcto. RN-3.7: Duración de la reserva

- Se intenta registra una reserva con la misma fecha de salida y de entrada y da error. RN-3.8: Propietario reserva

- Se intenta registra una reserva sobre un alojamiento para el usuario propietario de dicho

alojamiento y da error.

Page 7: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 7 de 18

4. Modelo conceptual

4.1. Diagrama de clases UML

Figura 2: Modelo conceptual

Page 8: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 8 de 18

4.2. Escenarios

Figura 3: Escenario de dos alojamientos localizados en la misma zona junto con sus propietarios y fotos.

Figura 4: Escenario de dos alojamientos, uno de ellos con dos reservas y otro con una. Dos de las reservas son de un mismo usuario

Page 9: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 9 de 18

4.3. Matriz de trazabilidad Requisitos/Artefactos del Modelo Conceptual

Requisitos

Modelo Conceptual R

I-1

.1

RI-

3.1

RI-

7.1

RN

-3.6

RN

-3.7

RN

-3.8

RF-

1.2

RF-

1.3

RF-

1.4

RF-

3.2

RF-

3.3

RF-

3.4

RF-

3.5

RF-

6.1

RF-

7.2

Ele

me

nto

s M

od

elo

Co

nce

ptu

al

Cla

ses

Zona

Alojamiento

Usuario

Foto

Reserva

Comentario

Aso

ciac

ion

es

esPropietarioDe

seEncuentraEn

reserva

tieneReserva

tieneFoto

comenta

Re

stri

ccio

ne

s

RN-3.6

RN-3.7

RN-3.8

5. Modelo Tecnológico

5.1. Modelo relacional en 3FN

Las figuras 5 y 6 representan el esquema relacional derivado del esquema conceptual mediante

la aplicación de la heurísticas de transformación Conceptual (UML) Relacional (La Fig. 5, el

esquema relacional independiente del SGBD, y la Fig. 6 el esquema relacional propietario

generado con SQL Developer en el caso ORACLE). Se ponen como notas las reglas de negocio

que no pueden definirse estructuralmente y que requieren código adicional (cláusulas en

CREATE TABLE y Triggers) ORACLE.

Page 10: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 10 de 18

Tabla 1. Esquema relacional

PK AK FK Zonas (IdZona, nombre) IdZona nombre(*)

Usuarios ( IdUsuario, dni, nombre, apellidos, correo, contraseña, dirección, teléfono)

IdUsuario dni

Alojamientos (IdAlojamiento, dirección, num_dormitorios, num_baños, ocu_máxima, aire_acondicionado, wifi, piscina, garaje, IdZona, IdPropietario)

IdAlojamiento dirección IdZona/Zonas, IdPropietario/Usuarios

Fotos (IdFoto, pathf, tipo, IdAlojamiento ) IdFoto IdAlojamiento / Alojamientos

Reservas (IdReserva, fecha_check_in, fecha_check_out, IdAlojamiento, IdUsuario)

IdReserva IdAlojamiento / Alojamientos IdUsuario / Usuarios

Comentarios (IdComentario, texto, valoración, IdReserva) IdComentario IdReserva/ Reservas

(*) Es razonable asumir que los nombres serán únicos

Figura 5: Diagrama relacional (equivalente a la tabla 2)

Page 11: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 11 de 18

Figura 6: Diagrama relacional generado en Oracle SQL Developer (equivalente a la Fig. 5 y Tabla 2)

Page 12: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 12 de 18

5.2. Matriz de trazabilidad Artefactos del Modelo Conceptual/Tecnológico

Modelo Conceptual Modelo Relacional

Clase Asociación Restricción

Zon

a

Alo

jam

ien

to

Usu

ario

Foto

Re

serv

a

Co

me

nta

rio

esP

rop

ieta

rio

De

seEn

cuen

traE

n

rese

rva

tie

ne

Re

serv

a

tie

ne

Foto

com

en

ta

RN

-3.6

RN

-3.7

RN

-3.8

Tab

la

Zonas

Alojamientos

Usuarios

Fotos

Reservas

Comentarios

Ch

eck

Fechas_Reserva

Trig

ger ReservasPropietario

FechasReservas

Page 13: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 13 de 18

5.3. Esquema ORACLE

El código PL/SQL ORACLE se ha estructurado en cuatro scripts:

- 0-CleanUp.sql

o Crea el procedimiento Clean_Up que borra, en caso de que ya existan, las tablas y

secuencias.

- 1-Crea.sql

o Ejecuta el procedimiento anterior.

o Crea las tablas. Para cada tabla creada:

Crea una secuencia

Crea un trigger que utilizando la secuencia anterior generará clave primaria

de dicha tabla.

o Crea los triggers necesarios para especificar las reglas de negocio que no han podido

ser definidas como check en la creación de tablas:

Trigger para impedir que el usuario reserve sus alojamientos

Trigger para impedir fechas solapadas

o Crea los procedimientos:

Procedimiento para insertar reservas

Procedimiento para presentar los tres alojamientos con más reservas en un

intervalo de fechas dado.

- 2-Inserta.sql

o Poblado de tablas a partir de los datos presentados en los escenarios mediante:

Comando Insert

Procedimiento para insertar reservas

- 3-Consultas.sql

o Consultas sobre las tablas.

o Consulta en bloque anónimo

o Llamada al procedimiento para presentar los tres alojamientos con más reservas en

un intervalo de fechas dado.

Page 14: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 14 de 18

Script 0-CleanUp.sql:

CREATE OR REPLACE PROCEDURE Clean_Up

IS

BEGIN

-- Borrado de tablas

EXECUTE IMMEDIATE 'DROP TABLE Comentarios';

EXECUTE IMMEDIATE 'DROP TABLE Reservas';

EXECUTE IMMEDIATE 'DROP TABLE Fotos';

EXECUTE IMMEDIATE 'DROP TABLE Alojamientos';

EXECUTE IMMEDIATE 'DROP TABLE Usuarios';

EXECUTE IMMEDIATE 'DROP TABLE Zonas';

-- Borrado de secuencias

EXECUTE IMMEDIATE 'DROP SEQUENCE sec_com';

EXECUTE IMMEDIATE 'DROP SEQUENCE sec_res';

EXECUTE IMMEDIATE 'DROP SEQUENCE sec_fot';

EXECUTE IMMEDIATE 'DROP SEQUENCE sec_alo';

EXECUTE IMMEDIATE 'DROP SEQUENCE sec_usu';

EXECUTE IMMEDIATE 'DROP SEQUENCE sec_zon';

END;

/

Script 1-Crea.sql /* Borra tablas y secuencias */

EXECUTE Clean_Up;

/* Creación Tabla de Zonas */

CREATE TABLE Zonas (

IdZona SMALLINT PRIMARY KEY,

Nombre VARCHAR(30) NOT NULL );

-- Creación de secuencia para generar PK de tabla de Zonas

CREATE SEQUENCE sec_zon;

-- Creación de Trigger de secuencias para generar PK de tabla de Zonas

CREATE OR REPLACE TRIGGER zonas_PK

BEFORE INSERT ON zonas

FOR EACH ROW

BEGIN

SELECT sec_zon.nextval INTO :new.IdZona FROM dual;

END;

/

/* Creación Tabla de Usuarios */

CREATE TABLE Usuarios (

IdUsuario SMALLINT PRIMARY KEY,

Dni VARCHAR(9) NOT NULL,

Nombre VARCHAR(30) NOT NULL,

Apellidos VARCHAR(30) NOT NULL,

Correo VARCHAR(30) NOT NULL,

Contraseña VARCHAR(30) NOT NULL,

Direccion VARCHAR(30) NOT NULL,

Telefono VARCHAR(14) NOT NULL);

-- Creación de secuencia para generar PK de tabla de Usuarios

CREATE SEQUENCE sec_usu;

Page 15: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 15 de 18

-- Creación de Trigger de secuencias para generar PK de tabla de Usuarios

CREATE OR REPLACE TRIGGER usuarios_PK

BEFORE INSERT ON usuarios

FOR EACH ROW

BEGIN

SELECT sec_usu.nextval INTO :new.IdUsuario FROM dual;

END;

/

/* Creación Tabla de Alojamientos */

CREATE TABLE Alojamientos (

IdAlojamiento SMALLINT PRIMARY KEY,

Direccion VARCHAR(30) NOT NULL,

Num_Dormitorios SMALLINT NOT NULL,

Num_Baños SMALLINT NOT NULL,

Ocu_Maxima SMALLINT NOT NULL,

Aire_Acondicionado VARCHAR(1),

CHECK (UPPER(Aire_Acondicionado) IN ('S', 'N')),

Wifi VARCHAR(1), CHECK (UPPER(Wifi) IN ('S', 'N')),

Piscina VARCHAR(1), CHECK (UPPER(Piscina) IN ('S', 'N')),

Garaje VARCHAR(1), CHECK (UPPER(Garaje) IN ('S', 'N')),

IdZona SMALLINT NOT NULL,

IdPropietario SMALLINT NOT NULL,

FOREIGN KEY(IdZona) REFERENCES Zonas,

FOREIGN KEY(IdPropietario) REFERENCES Usuarios);

-- Creación de secuencia para generar PK de tabla de Alojamientos

CREATE SEQUENCE sec_alo;

-- Creación de Trigger de secuencias para generar PK de tabla de Alojamientos

CREATE OR REPLACE TRIGGER alojamientos_PK

BEFORE INSERT ON alojamientos

FOR EACH ROW

BEGIN

SELECT sec_alo.nextval INTO :new.IdAlojamiento FROM dual;

END;

/

/* Creación Tabla de Fotos */

CREATE TABLE Fotos (

IdFoto SMALLINT PRIMARY KEY,

Pathf VARCHAR(30) NOT NULL,

Tipo VARCHAR(5),

IdAlojamiento SMALLINT NOT NULL,

FOREIGN KEY(IdAlojamiento) REFERENCES Alojamientos);

-- Creación de secuencia para generar PK de tabla de Fotos

CREATE SEQUENCE sec_fot;

-- Creación de Trigger de secuencias para generar PK de tabla de Fotos

CREATE OR REPLACE TRIGGER fotos_PK

BEFORE INSERT ON fotos

FOR EACH ROW

BEGIN

SELECT sec_fot.nextval INTO :new.IdFoto FROM dual;

END;

/

/* Creación Tabla de Reservas */

CREATE TABLE Reservas (

IdReserva SMALLINT PRIMARY KEY,

Fecha_Check_In DATE NOT NULL ,

Fecha_Check_Out DATE NOT NULL,

CONSTRAINT Fechas_Reserva -- La reserva debe de ser de al menos un día

CHECK (fecha_check_out - fecha_check_in >=1),

IdAlojamiento SMALLINT NOT NULL,

IdUsuario SMALLINT NOT NULL,

FOREIGN KEY(IdAlojamiento) REFERENCES Alojamientos,

FOREIGN KEY(IdUsuario) REFERENCES Usuarios);

Page 16: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 16 de 18

-- Creación de secuencia para generar PK de tabla de Reservas

CREATE SEQUENCE sec_res;

-- Creación de Trigger de secuencias para generar PK de tabla de Reservas

CREATE OR REPLACE TRIGGER reservas_PK

BEFORE INSERT ON reservas

FOR EACH ROW

BEGIN

SELECT sec_res.nextval INTO :new.IdReserva FROM dual;

END;

/

/* Creación Tabla de Comentarios */

CREATE TABLE Comentarios (

IdComentario SMALLINT PRIMARY KEY,

Texto VARCHAR(30) NOT NULL,

Valoracion VARCHAR(5) NOT NULL,

IdReserva SMALLINT NOT NULL,

FOREIGN KEY(IdReserva) REFERENCES Reservas);

-- Creación de secuencia para generar PK de tabla de Comentarios

CREATE SEQUENCE sec_com;

-- Creación de Trigger de secuencias para generar PK de tabla de Comentarios

CREATE OR REPLACE TRIGGER comentarios_PK

BEFORE INSERT ON comentarios

FOR EACH ROW

BEGIN

SELECT sec_com.nextval INTO :new.IdComentario FROM dual;

END;

/

/* Triggers para impedir que el propietario reserve un alojamiento de su propiedad */

CREATE OR REPLACE TRIGGER ReservasPropietario

BEFORE INSERT OR UPDATE ON Reservas

FOR EACH ROW

DECLARE

V_propietario Integer;

BEGIN

SELECT idPropietario INTO V_propietario

FROM Alojamientos

WHERE IdAlojamiento = :NEW.IdAlojamiento;

IF (V_propietario = :NEW.IdUsuario) THEN

RAISE_APPLICATION_ERROR

(-20600,'El propietario no puede hacer reservas sobre sus alojamientos');

END IF;

END;

/

/* Triggers fechas de reservas solapadas */

CREATE OR REPLACE TRIGGER FechasReservas

BEFORE INSERT ON Reservas

FOR EACH ROW

DECLARE

V_Res Integer;

BEGIN

SELECT COUNT(*) INTO V_Res

FROM Reservas A

WHERE IdAlojamiento = :NEW.IdAlojamiento

AND (Fecha_Check_In, Fecha_Check_Out)

OVERLAPS (:NEW.Fecha_Check_In, :NEW.Fecha_Check_Out);

IF (V_Res >= 1) THEN

RAISE_APPLICATION_ERROR

(-20600,'Para dicho alojamiento ya existe una reserva concurrente');

END IF;

END;

/

Page 17: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 17 de 18

/* Procedimiento para crear reservas */

CREATE OR REPLACE PROCEDURE crear_reserva

(w_fecha_in IN reservas.fecha_check_in%TYPE,

w_fecha_out IN reservas.fecha_check_out%TYPE,

w_idAloja IN reservas.idalojamiento%TYPE,

w_idUsua IN reservas.idusuario%TYPE ) IS

BEGIN

INSERT INTO reservas (fecha_check_in, fecha_check_out, idalojamiento, idusuario)

VALUES (w_fecha_in, w_fecha_out, w_idAloja, w_idUsua);

COMMIT WORK;

END;

/

/* Procedimiento para presentar los tres alojamientos con más reservas en

un intervalo de fechas pasado como parámetro */

CREATE OR REPLACE PROCEDURE MasReservas (v_f1 IN VARCHAR, v_f2 IN VARCHAR )

IS

CURSOR c IS

SELECT idAlojamiento,count(*) AS cuenta FROM reservas

WHERE Fecha_Check_In BETWEEN TO_DATE(v_f1,'DD.MM.YYYY')

AND TO_DATE(v_f2,'DD.MM.YYYY')

GROUP BY idAlojamiento ORDER BY 2 DESC;

BEGIN

DBMS_OUTPUT.PUT_LINE('Los 3 alojamientos más reservas en el intervalo

de fechas solicitado (Fecha_Check_In en intervalo) ');

FOR fila IN c LOOP

EXIT WHEN C%ROWCOUNT >3;

DBMS_OUTPUT.PUT_LINE('El alojamiento '||fila.idAlojamiento||' ha sido rerservado '

||fila.cuenta ||' veces') ;

END LOOP;

END;

/

-- Para permitir visualizar mensajes en pantalla

SET SERVEROUTPUT ON

Script 2-Inserta.sql: /* Creacion de filas */

INSERT INTO zonas (nombre) VALUES ('Costa de la Luz');

INSERT INTO usuarios (dni, nombre, apellidos, correo, contraseña, direccion, telefono)

VALUES ('12345678X', 'Juan', 'Blanco', '[email protected]', 'blanco', 'Nueva 25', '(34)122334455');

INSERT INTO usuarios (dni, nombre, apellidos, correo, contraseña, direccion, telefono)

VALUES ('11111111A', 'Ines', 'Lopez', '[email protected]', 'lopez', 'Sierpes 5', '(34)222334455');

INSERT INTO usuarios (dni, nombre, apellidos, correo, contraseña, direccion, telefono)

VALUES ('22222222B', 'Ana', 'Gris', '[email protected]', 'gris', 'Mayor 2', '(34)654223344');

INSERT INTO alojamientos (direccion, num_dormitorios, num_baños, ocu_maxima, aire_acondicionado, wifi,

piscina, garaje, idzona, idpropietario) --Cuidado con las FK son secuencias

VALUES ('Avda. Mayor Nº1', 3, 2, 8, 'S', 'S', 'N', 'N', 1, 3);

INSERT INTO alojamientos (direccion, num_dormitorios, num_baños, ocu_maxima, aire_acondicionado, wifi,

piscina, garaje, idzona, idpropietario) --Cuidado con las FK son secuencias

VALUES ('Calle Blanca Nº2', 2, 2, 4, 'N', 'S', 'N', 'S', 1, 1);

INSERT INTO fotos (pathf, tipo, idalojamiento) VALUES ('C:\fotos\foto1.png', 'png', 1);

INSERT INTO fotos (pathf, tipo, idalojamiento) VALUES ('C:\fotos\foto2.png', 'png', 1);

-- Inserción de reservas mediante llamada al procedimiento crear_reservas

EXECUTE crear_reserva(TO_DATE('2017-12-20', 'YYYY-MM-DD'), TO_DATE('2017-12-23', 'YYYY-MM-DD'), 1, 2);

EXECUTE crear_reserva(TO_DATE('2017-12-23', 'YYYY-MM-DD'), TO_DATE('2018-1-2', 'YYYY-MM-DD'), 1, 1);

EXECUTE crear_reserva(TO_DATE('2017-12-24', 'YYYY-MM-DD'), TO_DATE('2018-1-2', 'YYYY-MM-DD'), 2, 2);

INSERT INTO comentarios (texto, valoracion, idreserva) VALUES ('Muy bien', '***', 1);

Page 18: Enunciado · Introducción a la Ingeniería del Software y a los Sistemas de Información Alojamientos octubre 2018 Página 5 de 18 3.3. Reglas de negocio RN-3.6: Fechas solapadas

Introducción a la Ingeniería del Software y a los Sistemas de Información

Alojamientos

octubre 2018

Página 18 de 18

Script 3-Consultas.sql

-- Reservas existentes

SELECT * FROM reservas;

-- Reservas ya terminadas

SELECT * FROM reservas

WHERE sysdate > Fecha_Check_Out;

-- Reservas correspondientes a alojamientos actualmente ocupados

SELECT * FROM reservas

WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out;

-- Dirección de los alojamientos actualmente ocupados

SELECT direccion FROM reservas NATURAL JOIN alojamientos

WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out ;

-- Dirección y zona de los alojamientos actualmente ocupados

SELECT direccion, nombre FROM reservas NATURAL JOIN alojamientos NATURAL JOIN zonas

WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out;

-- Direción de los alojamientos actualmente libres

SELECT idAlojamiento, direccion FROM alojamientos A

WHERE idAlojamiento NOT IN

(SELECT idalojamiento FROM reservas NATURAL JOIN alojamientos NATURAL JOIN zonas

WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out);

-- Alojamiento y número de reservas

SELECT idAlojamiento, count(*) FROM reservas GROUP BY idAlojamiento;

-- Alojamiento con más reservas

SELECT idAlojamiento FROM reservas

GROUP BY idAlojamiento

HAVING count(*) >= ALL (SELECT count(*) FROM reservas GROUP BY idAlojamiento);

-- Dirección del alojamiento con más reservas

SELECT direccion FROM reservas NATURAL JOIN alojamientos

GROUP BY idAlojamiento, direccion

HAVING count(*) >= ALL (SELECT count(*) FROM reservas GROUP BY idAlojamiento);

-- Bloque anónimo que presenta los tres alojamientos con más reservas

DECLARE

CURSOR c IS

SELECT idAlojamiento,count(*) AS cuenta FROM reservas

GROUP BY idAlojamiento ORDER BY 2 DESC;

BEGIN

DBMS_OUTPUT.PUT_LINE('Los 3 Alojamientos más solicitados');

FOR fila IN c LOOP

EXIT WHEN C%ROWCOUNT >3;

DBMS_OUTPUT.PUT_LINE('El alojamiento '||fila.idAlojamiento||' ha sido rerservado

'||fila.cuenta ||' veces') ;

END LOOP;

END;

/

/* Ejecución del procedimiento que presenta los tres alojamientos con más reservas en

un intervalo de fechas pasado como parámetro */

EXECUTE MasReservas ('1.12.2017','31.12.2017');