Add files via upload

This commit is contained in:
Fernando Méndez 2021-07-02 18:09:23 +02:00 committed by GitHub
parent 2b06f5758e
commit 3811fa2f17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
78 changed files with 10728 additions and 0 deletions

16
cinemas/index.php Normal file
View File

@ -0,0 +1,16 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Page-specific content:
$section = '<!-- Cinemas -->
<section id="cinemas">
<div class="row">
'.$template->print_cinemas().'
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,92 @@
<?php
require_once($prefix.'assets/php/form.php');
require_once($prefix.'assets/php/includes/user.php');
class FormContact extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "");
parent::__construct('formContact', $options);
}
protected function generaCamposFormulario($datos, $errores = array()) {
if(isset($_SESSION["user"])){ $nameValue = "value=".unserialize($_SESSION['user'])->getName().""; $emailValue = "value=".unserialize($_SESSION['user'])->getEmail().""; }
else { $nameValue = "placeholder='Nombre'"; $emailValue = "placeholder='Email'"; }
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'name', 'span', array('class' => 'error'));
$errorEmail = self::createMensajeError($errores, 'email', 'span', array('class' => 'error'));
$errorMessage = self::createMensajeError($errores, 'message', 'span', array('class' => 'error'));
// Se genera el HTML asociado a los campos del formulario y los mensajes de error.
$html = "<div class='row'>
<fieldset id='datos_personales'>
<legend>Datos personales</legend><pre>".$htmlErroresGlobales."</pre>
<div class='_name'>
<input type='text' name='name' id='name' ".$nameValue." required/><pre>".$errorNombre."</pre>
</div>
<div class='_email'>
<input type='email' name='email' id='email' ".$emailValue." required/><pre>".$errorEmail."</pre>
</div>
</fieldset>
<fieldset id='motivo'>
<legend>Motivo de la consulta</legend>
<div class='reason'>
<input type='radio' id='radio' name='reason' value='evaluation' checked>
<label for='evaluation'>Evaluación</label>
</div>
<div class='reason'>
<input type='radio' id='radio' name='reason' value='sugestions'>
<label for='sugestions'>Sugerencias</label>
</div>
<div class='reason'>
<input type='radio' id='radio' name='reason' value='critics'>
<label for='critics'>Críticas</label>
</div>
</fieldset>
<div class='message'><pre>".$errorMessage."</pre>
<textarea name='message' id='message' placeholder='Escribe aquí tu mensaje...'></textarea>
</div>
<div class='verify'>
<input type='checkbox' id='checkbox' name='terms' required>
<label for='terms'>Marque esta casilla para verificar que ha leído nuestros términos y condiciones del servicio.</label>
</div>
<div class='actions'>
<input type='submit' id='submit' value='Enviar mensaje' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos) {
$result = array();
$nombre = $this->test_input($datos['name']) ?? null;
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['name'] = "El nombre tiene que tener\n una longitud de más de\n 3 caracteres\n y menos de 15 caracteres.";
}
$email = $this->test_input($datos['email']) ?? null;
if ( empty($email) || !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $email) ) {
$result['email'] = "El email no es válido.";
}
$message = $this->test_input($datos['message']) ?? null;
if ( empty($message) || mb_strlen($message) < 1 || mb_strlen($message) > 250 ) {
$result['message'] = "El mensaje no puede estar vacío\ny no puede contener más de\n250 caracteres.";
}
if (count($result) === 0) {
$result = ROUTE_APP; // DE MOMENTO, NO HACE NADA :)
}
return $result;
}
}
?>

20
contacto/index.php Normal file
View File

@ -0,0 +1,20 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Contact form:
require_once('includes/formContact.php');
$form = new FormContact();
$htmlForm = $form->gestiona();
//Specific page content:
$section = '<!-- Contact Form -->
<section id="formulario">
<h4>Formulario</h4>
'.$htmlForm.'
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,47 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
//Specific page content:
$section = '<!-- Description -->
<section id="description">
<div class="code" id="resume">
<h1>Descripción</h1>
<hr />
<div class="blockquote">
<p>
CompluCine es un proyecto para la creación y desarrollo de una plataforma web que permita la compra de entradas
de cine, por fecha y hora, para cualquiera de los cines del grupo <a href="#FDI-Cines">FDI-Cines</a>
mostrar la cartelera disponible e incluya ofertas y promociones para los clientes.
</p>
<p>
Con este proyecto buscamos la creación de una aplicación web que
gestione la cartelera de un grupo de cines con una lista de películas variable,
unos horarios propios de cada cine por sesión y película, y con unos precios determinados.
</p>
<p>
Los usuarios podrán registrarse, comprar sus entradas para una
sesión, elegir asientos, precomprar sus snacks y ver ofertas y promociones.
</p>
</div>
</div>
<div class="code" id="FDI-Cines">
<h2>FDI-Cines</h2>
<hr />
<div class="blockquote">
<p>
Somos un <a href="../miembros/">grupo de estudiantes</a> de la asignatura de Sistemas Web
de la Facultad de Informática de la Universidad Complutense de Madrid.
</p>
<p>
CompluCine es un proyecto web universitario y en ningún momento pretende ofrecer una funcionalidad real.
Para más información acerca del proyecto, haz click <a href="../detalles/">aquí</a>.
</p>
</div>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

282
fdicines/bocetos/index.php Normal file
View File

@ -0,0 +1,282 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
//Specific page content:
$section = '<!-- Flow -->
<section id="flow">
<div class="code">
<h2>FLUJO DE NAVEGACIÓN</h2>
<hr>
<!-- User Flow -->
<div class="textbox">
<h2>Usuario</h2>
<p>
El Usuario puede tomar dos caminos a la hora de seleccionar la película, el cine, y la sesión a la que quiere asistir. La diferencia es puramente
de orden entre la elección de cine y de la película, a conveniencia del usuario; se procede a explicar ambos:
</p>
<p>
1. Selección de Cine -> Selección de Película -> Selección de Sesión -> Reserva de Butacas -> Checkout: Primero se selecciona el cine en la vista de selección
de cines en la que se encuentra un mapa y una lista con los cines de la cadena. Una vez seleccionado el cine se redirigirá al usuario a la vista de selección
de película, con el filtro del cine correspondiente activado, de forma que solo se muestren las películas disponibles en el cine seleccionado. En esa vista se
eligirá la película y la versión a ver (VO, 3D, 4DX, etc).
</p>
<p>
Una vez elegida la película, se redirigirá al usuario a la elección de sesión. Se mostrarán todas las sesiones disponibles y el usuario podrá elegir la sesión y
el número de entradas que quiere reservar, pudiendo ver el precio final de las mismas. Se le llevará a la vista de butacas en donde podrá elegir qué butacas reservar.
</p>
<p>
Una vez elegidas las butacas, el usuario procede a la página de pago, en donde rellenará los datos necesarios para pagar online. Terminada la compra con éxito, se
mostrará una pantalla de "Compra Realizada", dando al usuario la seguridad de que su reserva se ha registrado correctamente. Luego se le redirigirá a la pantalla de
inicio.
</p>
<p>
2. Selección de Película -> Selección de Cine -> Selección de Sesión -> Reserva de Butacas -> Checkout: Es idéntico al flujo anterior pero el usuario empieza eligiendo
la película, de forma que se le redirige a la vista de selección de cine, esta vez con un filtro, de forma que solo se muestran los cines que tengan sesiones activas
con la película seleccionada.
</p>
<p>
Una vez elegidos película y cine, el flujo es idéntico al anterior.
</p>
</div>
<!-- Manager Flow -->
<div class="textbox">
<h2>Gerente</h2>
<p>
El Gerente es el encargado de gestionar las sesiones y salas de cada cine. La forma de proceder es la misma que el administrador, con vistas equivalentes.
En el caso de la gestión de salas, se administrarán los asientos disponibles (por temas de Covid-19) y si está o no habilitada para su uso.
</p>
</div>
<!-- Admin Flow -->
<div class="textbox">
<h2>Administrador</h2>
<p>El Administrador es el encargado de gestionar las: películas, cines, promociones, otros administradores y gerentes de cada cine.</p>
<p>Para cada categoría tiene un panel en el que puede seleccionar, a partir de una lista, el elemento que quiere modificar, también hay otro panel al lado, en donde
puede modificar los datos de un elemento ya existente o crear uno nuevo introduciendo datos que no existan en la BD. También hay una opción de Eliminar en caso de que
quiera eliminar un elemento.</p>
<p>También cuenta con un botón de "Vista de Usuario", con el que puede navegar por la página con la vista que tendrá el usuario final.</p>
</div>
</div>
</section>
<!-- Sketches -->
<section id="sketches">
<hr />
<!-- template Sketches-->
<div class="code">
<h3>Pantallas Genéricas</h3>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/inicio.png" />
<div class="description">
<h3>Pantalla de inicio</h3>
<p>Pantalla de bienvenida al entrar en la web.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/registrarse_iniciar_sesion.png" />
<div class="description">
<h3>Pantalla de Registro / Inicio de sesión</h3>
<p>Pantalla para que un usuario nuevo se registre o, en caso de ya tener una cuenta de usuario, inicie sesión.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/menu_usuario.png" />
<div class="description">
<h3>Menú de usuario registrado</h3>
<p>Pantalla con todas las opciones disponibles, propias de un usuario registrado.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/peliculas.png" />
<div class="description">
<h3>Cartelera</h3>
<p>Pantalla con información sobre todas las películas disponibles en ese momento.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/cine.png" />
<div class="description">
<h3>Cines</h3>
<p>Pantalla con un mapa que indica la geolocalización de todos los cines de FDI-Cines.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/selector_horario.png" />
<div class="description">
<h3>Selección de Horario</h3>
<p>Pantalla que muestra los horarios disponibles por salas para un cine y película elegidos.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/mapa_asientos.png" />
<div class="description">
<h3>Mapa de los Asientos</h3>
<p>Pantalla con un mapa para selccionar los asientos que se quieren escoger. Los asientos ocupados no pondrán ser seleccionados.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/pagar.png" />
<div class="description">
<h3>Pagar</h3>
<p>Pantalla para realizar el pago, después de haber selecionado película, cine, sala, horario y butacas.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/compra_realizada.png" />
<div class="description">
<h3>Compra Realizada</h3>
<p>Pantalla de confirmación con los datos de compra.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/about_us.png" />
<div class="description">
<h3>Sobre nosotros</h3>
<p>Pantalla con información sobre FDI-Cines.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/contacto.png" />
<div class="description">
<h3>Formulario de Contacto</h3>
<p>Pantalla con un formulario para realizar una consulta a los administradores.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/terminos_y_condiciones.png" />
<div class="description">
<h3>Términos y Condiciones</h3>
<p>Pantalla con todos los términos y condiciones de uso del servicio.</p>
</div>
</div>
</div>
</div>
<!-- Manager Sketches-->
<div class="code">
<h3>Pantallas de Gerentes</h3>
</div>
<div class="row">
<div class="column side">
<div class="sketches">
<img src="../../img/bocetos/panel_inicio_gerente.png" />
<div class="description">
<h3>Panel de Incio Gerente</h3>
<p>Pantalla con las funciones exclusivas a las que puede acceder un Gerente.</p>
</div>
</div>
</div>
<div class="column middle">
<div class="sketches">
<img src="../../img/bocetos/gestionar_salas.png" />
<div class="description">
<h3>Gestionar salas</h3>
<p>Pantalla en la que los Gerentes pueden interactuar para añadir, modificar o eliminar la sala de un cine.</p>
</div>
</div>
</div>
<div class="column side">
<div class="sketches">
<img src="../../img/bocetos/gestionar_sesiones.png" />
<div class="description">
<h3>Gestionar Sesiones</h3>
<p>Pantalla en la que los Gerentes pueden interactuar para añadir, modificar o eliminar las sesiones de una película.</p>
</div>
</div>
</div>
</div>
<!-- Admin Sketches-->
<div class="code">
<h3>Pantallas de Administradores</h3>
</div>
<div class="row">
<div class="column left">
<div class="sketches">
<img src="../../img/bocetos/panel_inicio_admin.png" />
<div class="description">
<h3>Panel Inicio Administrador</h3>
<p>Pantalla con las funciones exclusivas a las que puede acceder un Administrador.</p>
</div>
</div>
</div>
<div class="column right">
<div class="sketches">
<img src="../../img/bocetos/gestionar_peliculas.png" />
<div class="description">
<h3>Gestionar Películas</h3>
<p>Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar las películas de la cartelera.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="column side">
<div class="sketches">
<img src="../../img/bocetos/gestionar_cines.png" />
<div class="description">
<h3>Gestionar Cines</h3>
<p>Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar los cines.</p>
</div>
</div>
</div>
<div class="column middle">
<div class="sketches">
<img src="../../img/bocetos/gestionar_promociones.png" />
<div class="description">
<h3>Gestionar Promociones</h3>
<p>Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar las promociones existentes.</p>
</div>
</div>
</div>
<div class="column side">
<div class="sketches">
<img src="../../img/bocetos/gestionar_admins_gerentes.png" />
<div class="description">
<h3>Gestionar Administradores y Gerentes</h3>
<p>Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar tanto otros Administradores como Gerentes.</p>
</div>
</div>
</div>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,94 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
//Specific page content:
$section = '<!-- Details -->
<section id="details">
<div class = "code">
<h1>Detalles</h1>
<hr/>
<div class ="blockquote">
<p>
Con este proyecto buscamos la creación de una aplicación web que
gestione la cartelera de un grupo de cines con una cartelera de películas variable, unos horarios propios de cada cine por sesión y película
y unos precios determinados.
</br>
Los usuarios podrán registrarse, comprar sus entradas para una
sesión, elegir asientos, precomprar sus snacks y ver ofertas y promociones.
</p>
</div>
</div>
</section>
<!-- User and Functionalities -->
<section id="user_functionalities">
<div class ="row">
<div class="column left">
<div class = "code details">
<h2>Tipos de usuario</h2>
<hr />
<div class="textbox">
<h2>Usuario No Registrado</h2>
<p>
Este tipo de usuario, puede interactuar con la web sin necesidad de estar registrado. Podrá realizar compras, ver horarios y cartelera, sin necesidad de realizar ningún registro.
No podrá usar ninguna de las promociones, pues estas estarán únicamente destinadas a los usuarios registrados.
</p>
</div>
<div class="textbox">
<h2>Usuario Registrado</h2>
<p>
Estos usuarios son aquellos que previamente han realizado un registro en la base de datos del sistema. Tendrán las mismas funcionalidades básicas
que un usuario no registrado y además, podrán acceder a ofertas y aplicar promociones y descuentos y ver el historial de sus compras.
Además, estos usuarios podrán cancelar una compra previamente hecha, pues estas se asociarían a su cuenta, algo que sería imposible
con un usuario no registrado.
</p>
</div>
<div class="textbox">
<h2>Gerente de Cine</h2>
<p>
Un administrador de rango bajo capaz de acceder a la vista de administradores, puede ver las peliculas que hay en la base de datos.
Este usuario está asociado a un cine, sobre el cual puede añadir sesiones con peliculas existentes y modificar la disposicion de butacas.
</p>
</div>
<div class="textbox">
<h2>Administrador</h2>
<p>
El administrador es capaz de ascender cuentas de usuario registradas a cuentas de gerente de cine. Ademas es el encargado de añadir nuevos cines y peliculas.
Para comprobar el correcto funcionamiento de la pagina podrá cambiar entre distintas vistas de usuario.
Las cuales le permitirán comprobar que cada usuario tiene acceso únicamente a sus funcionalidades y no a funcionalidades de otro rango superior.
</p>
</div>
</div>
</div>
<div class="column right">
<div class = "code details">
<h1>Funcionalidad</h1>
<hr />
<p>
La aplicación debe permitir la compra online de entradas para sesiones de cine, mostrando los cines y
horarios en los que se encuentra disponible la película seleccionada por el usuario dentro del catálogo disponible en ese momento (la cartelera).
Los usuarios podrán acceder a la compra de entradas buscando la película que desean ver y luego escogiendo un cine y horario determinado.
Además de una búsqueda específica, también se ofrecerá la posibilidad de visionar toda la cartelera, y escoger una película, horario y cine, de entre todas las posibilidades.
<p>
Una vez escogido todo, se mostrará una página en la que el usuario decidirá la o las butacas en las que se sentará. Se mostrarán butacas disponibles y butacas ocupadas (en caso de que las haya).
Antes de realizar la compra, los usuarios podrán aplicar promociones especificas que le permitan obtener algun snack en el cine o descuentos disponibles en la aplicación.
</p>
<p>
Por otro lado la aplicacion debe permitir a los gerentes y administradores visionar la lista y contenido de todas las peliculas que hay en cartelera,
siendo los administradores los encargados de modificarlas y añadir nuevas.
De igual forma, ambos podran ver todos los cines activos de la aplicacion, pero solo los administradores serán capaces de añadir o modificar cines existentes.
<p>
Cada cine tiene una cantidad de salas y sesiones con horarios específicos pora cada una de las películas.
Aunque ambos roles (administrador y gerente) pueden ver estas salas y horarios, es el gerente de cine el encargado de modificar las salas,
su disposición de butacas, modificar el horario de las sesiones y añadir nuevas sesiones, y crear promociones específicas para una sesión concreta o para el cine completo.
Todo esto unicamente para el cine con el cual esta relacionado.
</p>
</div>
</div>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

3
fdicines/index.php Normal file
View File

@ -0,0 +1,3 @@
<?php
header('Location: ./about_us/');
?>

144
fdicines/miembros/index.php Normal file
View File

@ -0,0 +1,144 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
$content = '<hr />
<section id="members_table">
<table>
<thead>
<tr>
<th>Nombre</th>
<th>Email</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#MEP">Marco Expósito Pérez</a></td>
<td><a href="mailto:marcoexp@ucm.es">marcoexp@ucm.es</a></td>
</tr>
<tr>
<td><a href="#FMT">Fernando Méndez Torrubiano</a></td>
<td><a href="mailto:fernmend@ucm.es">fernmend@ucm.es</a></td>
</tr>
<tr>
<td><a href="#DMG">Daniel Muñoz García</a></td>
<td><a href="mailto:danimu03@ucm.es">danimu03@ucm.es</a></td>
</tr>
<tr>
<td><a href="#IMT">Ioan Marian Tulai</a></td>
<td><a href="mailto:ioantula@ucm.es">ioantula@ucm.es</a></td>
</tr>
<tr>
<td><a href="#ORP">Óscar Ruiz de Pedro</a></td>
<td><a href="mailto:oscarrui@ucm.es">oscarrui@ucm.es</a></td>
</tr>
<tr>
<td><a href="#UND">Undefined</a></td>
<td><a href="">undefined@ucm.es</td>
</tr>
</tbody>
</table>
</section>';
//Specific page content:
$section = '<!-- Members -->
<section id="members">
<div class="row">
<div class="column side">
<!-- Marco Esposito -->
<section id="MEP">
<div class="zoom">
<div class="code">
<img src="../../img/us/mep.jpg" />
<p>~ Marco Expósito Pérez (marcoexp@ucm.es)</p>
<div class="blockquote bio">
<p>Aficionado a todo tipo de videojuegos, principalmente la saga Zelda. Tambien me gusta leer tanto literatura fantastica como mangas y veo anime asiduamente.</p>
<p>En verano suelo participar en campeonatos de pesca subacuatica y tambien me gusta bastante jugar al futbol federado, aunque hace un tiempillo ya que no hago.</p>
</div>
</div>
</div>
</section>
</div>
<div class="column middle">
<!-- Fernando Méndez -->
<section id="FMT">
<div class="zoom">
<div class="code">
<img src="../../img/us/fmt.jpg" />
<p>~ Fernando Méndez (fernmend@ucm.es)</p>
<div class="blockquote bio">
<p>Estudiante de Ingeniería de Computadores en la Universidad Complutense de Madrid.</p>
<p>Presidente de la asociación Diskobolo. Colaborador de la Oficina de Sotfware Libre de la UCM y coordinador del grupo de Hacking Ético de la FDI.</p>
</div>
</div>
</div>
</section>
</div>
<div class="column side">
<!-- Daniel Muñoz -->
<section id="DMG">
<div class="zoom">
<div class="code">
<img src="../../img/us/dmg.jpg" />
<p>~ Daniel Muñoz García (danimu03@ucm.es)</p>
<div class="blockquote bio">
<p>Estudiante del grado en ingeniería informática en la Universidad Complutense de Madrid. Aficionado a la ciberseguridad y las nuevas tecnologías.</p>
<p>Especializado en el diseño y gestión de bases de datos, tanto SQL como noSQL, y su desarrollo con distintos lenguajes como MongoDB o MySQL.</p>
</div>
</div>
</div>
</section>
</div>
</div>
<div class="row">
<div class="column side">
<!-- Ioan Marian -->
<section id="IMT">
<div class="zoom">
<div class="code">
<img src="../../img/us/imt.jpg" />
<p>~ Ioan Marian Tulai (ioantula@ucm.es)</p>
<div class="blockquote bio">
<p>Estudiante con mucha ilusion y ganas de trabajar especialista en hardware.</p>
<p>Alta experiencia programando en C, gran interés en aprender nuevos lenguajes de programación y aficionado a dibujar.</p>
</div>
</div>
</div>
</section>
</div>
<div class="column middle">
<!-- Óscar Ruiz -->
<section id="ORP">
<div class="zoom">
<div class="code">
<img src="../../img/us/orp.jpg" />
<p>~ Óscar Ruiz de Pedro (oscarrui@ucm.es)</p>
<div class="blockquote bio">
<p>Estudiante de ingeniería de computadores en la Universidad Complutense de Madrid.</p>
<p>Altas capacidades de programación en bajo nivel, me gustaría aprender más sobre el ámbito de la robótica.</p>
<p>Aficionado a todo tipo de videojuegos, impresión 3D, teatro y airsoft.</p>
</div>
</div>
</div>
</section>
</div>
<div class="column side">
<!-- Undefined -->
<section id="UND">
<div class="zoom">
<div class="code">
<img src="../../img/seat_grey.png" />
<p>~ Undefined (undefined@ucm.es)</p>
<div class="blockquote bio">
<p>Este miembro ha abandonado el grupo.</p>
</div>
</div>
</div>
</section>
</div>
</div>
</section>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,270 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
//Specific page content:
$section = '<!-- Planning -->
<section class="planning">
<div class="row">
<div class="column side">
<div class="code plan">
<h2>Tareas</h2>
<hr />
<div class="textbox">
<h2>Implementaciones Generales de la Web</h2>
<ul>
<li>Pantalla de Inicio (incluye promociones y estrenos) [Fer]</li>
<li>Cartelera Dinámica [Fer --> Marian && Daniel]</li>
<li>Selección Cines (mapa) [Fer]</li>
<li>Listado de Horarios [Fer]</li>
<li>Selección de butacas [Fer --> Marco && Óscar]</li>
<li>Pagar + opción para código promocional [Fer]</li>
<li>Sobre FDI-Cines (About us) [Fer ]</li>
<li>Formulario de Contacto [Fer]</li>
<li>Términos y Condiciones [Fer]</li>
</ul>
</div>
<div class="textbox">
<h2>Paneles de Usuario Registrado</h2>
<ul>
<li>Registrarse e Iniciar sesión [Fer]</li>
<li>Menú y panel de Usuario (Historial compras, cambiar contraseña, datos de pago y eliminar usuario) [Fer]</li>
</ul>
</div>
<div class="textbox">
<h2>Paneles de Gerente</h2>
<ul>
<li>Pantalla de inicio de gerente [Marco && Óscar]</li>
<li>Eliminar sesión de una película [Marco && Óscar]</li>
<li>Deshabilitar salas [Marco && Óscar]</li>
<li>Deshabilitar asientos en una sala [Marco && Óscar]</li>
</ul>
</div>
<div class="textbox">
<h2>Paneles de Administrador</h2>
<ul>
<li>Panel de inicio administrador (ver todas la funcionalidades de admin de un vistazo) [Daniel && Marian]</li>
<li>Ver como >> Usuario no registrado || Usuario registrado || (Gerente: Añadir si vamos bien de tiempo) [Daniel && Marian]</li>
<li>Panel añadir/editar/eliminar cine [Marian && Daniel]</li>
<li>Panel añadir/editar/eliminar películas a la cartelera [Marian && Daniel]</li>
<li>Panel añadir/editar/eliminar promociones [Marian && Daniel]</li>
<li>Panel añadir/editar/eliminar gerentes [Marian && Daniel]</li>
</ul>
</div>
</div>
</div>
<div class="column middle">
<div class="code plan">
<h2>Divisón del trabajo</h2>
<hr />
<div class="textbox">
<h2>Marco Expósito Pérez</h2>
<ul>
<li>Pantalla de inicio de gerente [Gerente]</li>
<li>Eliminar sesión de una película [Gerente]</li>
<li>Deshabilitar salas [Gerente]</li>
<li>Deshabilitar asientos en una sala [Gerente]</li>
<li>Selección de butacas [General (de apoyo)]</li>
</ul>
</div>
<div class="textbox">
<h2>Fernando Méndez Torrubiano</h2>
<ul>
<li>Pantalla de Inicio (incluye promociones y estrenos) [General]</li>
<li>Cartelera Dinámica [General]</li>
<li>Selección Cines (mapa) [General]</li>
<li>Listado de Horarios [General]</li>
<li>Selección de butacas [General]</li>
<li>Pagar + opción para código promocional [General]</li>
<li>Formulario de Contacto [General]</li>
<li>Registrarse e Iniciar sesión [Usuario Registrado]</li>
<li>Menú y panel de Usuario (Historial compras, cambiar contraseña, datos de pago y eliminar usuario) [Usuario Registrado]</li>
<li>Sobre FDI-Cines (About us) [General]</li>
<li>Términos y Condiciones [General]</li>
</ul>
</div>
<div class="textbox">
<h2>Daniel Muñoz García</h2>
<ul>
<li>Panel de inicio administrador (ver todas la funcionalidades de admin de un vistazo) [Administrador]</li>
<li>Ver como >> Usuario no registrado || Usuario registrado || (Gerente: Añadir si vamos bien de tiempo) [Administrador]</li>
<li>Panel añadir/editar/eliminar cine [Administrador]</li>
<li>Panel añadir/editar/eliminar películas a la cartelera [Administrador]</li>
<li>Panel añadir/editar/eliminar promociones [Administrador]</li>
<li>Panel añadir/editar/eliminar gerentes [Administrador]</li>
</ul>
</div>
<div class="textbox">
<h2>Ioan Marian Tulai</h2>
<ul>
<li>Panel de inicio administrador (ver todas la funcionalidades de admin de un vistazo) [Administrador]</li>
<li>Ver como >> Usuario no registrado | Usuario registrado | (Gerente: Añadir si vamos bien de tiempo) [Administrador]</li>
<li>Panel añadir/editar/eliminar cine [Administrador]</li>
<li>Panel añadir/editar/eliminar películas a la cartelera [Administrador]</li>
<li>Panel añadir/editar/eliminar promociones [Administrador]</li>
<li>Panel añadir/editar/eliminar gerentes [Administrador]</li>
</ul>
</div>
<div class="textbox">
<h2>Óscar Ruiz de Pedro</h2>
<ul>
<li>Pantalla de inicio de gerente [Gerente]</li>
<li>Eliminar sesión de una película [Gerente]</li>
<li>Deshabilitar salas [Gerente]</li>
<li>Deshabilitar asientos en una sala [Gerente]</li>
<li>Selección de butacas [General (de apoyo)]</li>
</ul>
</div>
</div>
</div>
<div class="column side">
<div class="code plan">
<h2>Plazos</h2>
<hr />
<div class="textbox">
<h2>Práctica 1 [HTML]</h2>
<div class="bar">100%</div>
<ul>
<li>Inicio</li>
<li>Detalles</li>
<li>Bocetos</li>
<li>Miembros</li>
<li>Planificación</li>
<li>Contacto</li>
</ul>
</div>
<div class="textbox">
<h2>Práctica 2 [HTML + PHP]</h2>
<div class="bar">100%</div>
<ul>
<li>Sobre FDI-Cines (About us) [Fer]</li>
<li>Formulario de Contacto [Fer]</li>
<li>Términos y Condiciones [Fer ]</li>
<li>Pantalla de inicio de gerente [Marco && Óscar]</li>
</ul>
<div class="bar seventyfive">75%</div>
<ul>
<li>Pantalla de Inicio (incluye promociones y estrenos) [Fer]</li>
<li>Listado de Horarios [Fer]</li>
</ul>
<div class="bar fifty">50%</div>
<ul>
<li>Menú y panel de Usuario (Historial compras, cambiar contraseña, datos de pago y eliminar usuario) [Fer]</li>
<li>Eliminar sesión de una película [Marco && Óscar]</li>
<li>Deshabilitar salas [Marco && Óscar]</li>
<li>Panel de inicio administrador (ver todas la funcionalidades de admin de un vistazo) [Daniel && Marian]</li>
<li>Panel añadir/editar/eliminar cine [Marian && Dani]</li>
<li>Panel añadir/editar/eliminar películas a la cartelera [Marian && Dani]</li>
</ul>
<div class="bar twentyfive">25%</div>
<ul>
<li>Registrarse && Iniciar sesión [Fer]</li>
<li>Deshabilitar asientos en una sala [Marco && Óscar]</li>
<li>Ver como >> Usuario no registrado | Usuario registrado | (Gerente: Añadir si vamos bien de tiempo) [Daniel && Marian]</li>
<li>Panel añadir/editar/eliminar promociones [Marian && Dani]</li>
<li>Panel añadir/editar/eliminar gerentes [Marian && Dani]</li>
</ul>
</div>
<div class="textbox">
<h2>Práctica 3 [HTML + PHP + CSS]</h2>
<div class="bar">100%</div>
<ul>
<li>Eliminar sesión de una película [Marco && Óscar]</li>
<li>Deshabilitar salas [Marco && Óscar]</li>
</ul>
<div class="bar seventyfive">75%</div>
<ul>
<li>Registrarse && Iniciar sesión [Fer]</li>
<li>Menú y panel de Usuario (Historial compras, cambiar contraseña, datos de pago y eliminar usuario) [Fer]</li>
<li>Panel de inicio administrador (ver todas la funcionalidades de admin de un vistazo) [Daniel && Marian]</li>
<li>Panel añadir/editar/eliminar cine [Marian && Dani]</li>
<li>Panel añadir/editar/eliminar películas a la cartelera [Marian && Dani]</li>
</ul>
<div class="bar fifty">50%</div>
<ul>
<li>Deshabilitar asientos en una sala [Marco && Óscar]</li>
<li>Ver como >> Usuario no registrado | Usuario registrado | (Gerente: Añadir si vamos bien de tiempo) [Daniel && Marian]</li>
<li>Panel añadir/editar/eliminar promociones [Marian && Dani]</li>
<li>Panel añadir/editar/eliminar gerentes [Marian && Dani]</li>
</ul>
</div>
<div class="textbox">
<h2>Entrega Final [HTML + PHP + CSS + JS]</h2>
<div class="bar">100%</div>
<ul>
<li>Todo el trabajo restante.</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- Timeline -->
<section id="timeline" class="timeline">
<h2>Línea Temporal</h2>
<hr />
<div class="image"><img src="../../img/linea_temporal.png" /></div>
</section>
<!-- Timeline Table -->
<section id="timeline table">
<h2>Hitos</h2>
<hr />
<table>
<thead>
<tr>
<th>Hito</th>
<th>Fecha estimada</th>
<th>Estado</th>
</tr>
</thead>
<tbody>
<tr>
<td>Práctica 0</td>
<td>4 de Marzo de 2021</td>
<td>ENTREGADO</td>
</tr>
<tr>
<td>Práctica 1</td>
<td>18 de Marzo de 2021</td>
<td>ENTREGADO</td>
</tr>
<tr>
<td>Práctica 2</td>
<td>15 de Abril de 2021</td>
<td>ENTREGADO</td>
</tr>
<tr>
<td>Práctica 3</td>
<td>14 de Mayo de 2021</td>
<td>ENTREGADO</td>
</tr>
<tr>
<td>Entrega Final</td>
<td>9 de Junio de 2021</td>
<td>ENTREGADO</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2"></td>
<td>100%</td>
</tr>
</tfoot>
</table>
</section>
<!-- Warning -->
<section id="warning">
<p>
*Esta planificación es orientativa y puede ir cambiando a lo largo del tiempo
en función de los requisitos de las prácticas y nuestra carga de trabajo.
</p>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>
<!DOCTYPE HTML>

View File

@ -0,0 +1,193 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
//Specific page content:
$section = '<!-- Section -->
<section id="terms_and_conditions">
<div class="code">
<p>
Todo usuario que desee acceder a la compra de entradas a través del servicio, primero debe leer y aceptar los Términos y Condiciones de compra que a continuación se detallan.
Una vez que inicie la navegación a través de esta web el internauta adquiere la condición de USUARIO, y una vez que cumplimente los pasos establecidos para la compra de
entradas de cine, tendrá la consideración de CLIENTE. En cumplimiento de lo dispuesto en el Real Decreto 1906/99 de diecisiete de diciembre, por la que se regula la
contratación electrónica con condiciones generales, y de la Ley de Ordenación del Comercio Minorista (Ley 7/1996 de 15 de Enero, modificada por la Ley 47/2002 de 19 de
Diciembre) en lo aplicable a lo dispuesto sobre las ventas a distancia en los artículos 38 y siguientes, FDI-Cines (en adelante la EMPRESA) informa:
</p><br />
<p>
Las presentes Condiciones Generales de Contratación suponen la regulación general de los servicios prestados por
la EMPRESA a través del portal complucine.sytes.net, constituyendo el marco jurídico que desarrolla la relación contractual. La EMPRESA ofrece como intermediario el
servicio de venta de entradas para cines, a través de la web https://complucine.sytes.net. Las presentes Condiciones Generales, están sujetas a lo dispuesto a la Ley 7/1988,
de 13 de abril, sobre Condiciones Generales de Contratación, a la Ley 26/1984, de 19 de julio, General para la Defensa de Consumidores y Usuarios, al Real Decreto 1906/1999,
de 17 de diciembre de 1999, por el que se regula la Contratación Telefónica o Electrónica con condiciones generales, la Ley Orgánica 15/1999, de 13 de diciembre, de Protección
de Datos de Carácter Personal, la Ley 7/1996, de 15 de enero de Ordenación del Comercio Minorista, y a la Ley 34/2002 de 11 de julio, de Servicios de la Sociedad de la
Información y de Comercio Electrónico. Los servicios ofrecidos por complucine.sytes.net podrán ser contratados por cualesquiera usuarios que residan en España o en otro
Estado miembro de la Unión Europea o del Espacio Económico Europeo y por aquellos usuarios que, residiendo en un Estado no perteneciente a la Unión Europea o al Espacio
Económico Europea, les sea de aplicación la legislación española. Este documento es accesible en todo momento en la web de la EMPRESA y puede ser impreso y almacenado
por el CLIENTE.
</p><br />
<!-- Lista de Condiciones -->
<ol>
<li>
OBJETO DEL CONTRATO El contrato tiene por objeto regular las condiciones generales de prestación de los servicios ofrecidos por la EMPRESA a través de
complucine.sytes.net. Los servicios que la EMPRESA presta actualmente y que son objeto de este contrato son por un lado,los servicios de información, de acceso gratuito,
y por otro el servicio de venta de entradas para salas de cine. El servicio de venta de entradas de cine es de carácter oneroso, y el precio de cada entrada está determinado
en cada momento en la web. El acceso a la información concerniente a los apartados cartelera, cines, estrenos y noticias es libre, no sujeto a pago alguno.
</li><br />
<li>
IDENTIFICACIÓN DE LAS PARTES CONTRATANTES. Las presentes condiciones generales de contratación del servicio ofrecido por la EMPRESA son suscritas, de una parte,
por la empresa identificada en este documento. Y, de otra parte, por el CLIENTE, cuyos datos introducidos para
realizar la compra de entradas o para realizar alguna sugerencia, a través del formulario establecido al efecto, son los que han sido consignados por él mismo.
Todos los datos incluidos en él han sido introducidos directamente por el cliente, por lo que la responsabilidad sobre la autenticidad de los mismos corresponde, directa
y exclusivamente, al CLIENTE. Para tener acceso al servicio de compra de entradas del portal, se requiere la cumplimentación de todos los datos no marcados como opcionales
solicitados para realizar la compra.
</li><br />
<li>
OBLIGACIONES RELATIVAS AL PROCEDIMIENTO DE COMPRA El CLIENTE es el único responsable de la veracidad de los datos introducidos por él mismo en el procedimiento
de compra, y acepta la obligación de facilitar datos veraces, exactos y completos. Si el CLIENTE incumple esta obligación, quedará bajo su responsabilidad el responder por
los posibles daños y perjuicios producidos a la EMPRESA o a un tercero. 4. CONDICIONES DEL SERVICIO Las presentes condiciones son de aplicación al servicio de venta de
entradas de cine ofrecido por la EMPRESA a través de la web complucine.sytes.net. Las condiciones comerciales de este servicio y las ofertas que eventualmente puedan
llevarse a cabo por la EMPRESA siempre aparecen en la mencionada página web por lo que pueden ser consultadas, archivadas o impresas. La EMPRESA se reserva el derecho de
modificar en cualquier momento las presentes Condiciones Generales de Uso así como cualesquiera otras condiciones generales o particulares, reglamentos de uso o avisos que
resulten de aplicación. La EMPRESA podrá modificar las Condiciones Generales notificándolo a los CLIENTES con antelación suficiente, con el fin de mejorar los servicios
y productos ofrecidos a través de complucine.sytes.net. Mediante la modificación de las Condiciones Generales expuestas en la página Web de www.compraentradas.com, se
entenderá por cumplido dicho deber de notificación. En todo caso, antes de utilizar los servicios o contratar productos, se pondrán consultar las Condiciones General es.
Asimismo se reserva el derecho a modificar en cualquier momento la presentación, configuración y localización del Sitio Web, así como los contenidos y las condiciones
requeridas para utilizar los mismos. El CLIENTE formalizará su compra de entradas de cine mediante el cumplimiento de todas las fases establecidas en el apartado COMPRA
DIRECTA y su envío telemático. 5. USO DEL SERVICIO Y RESPONSABILIDADES La EMPRESA no será responsable de los retrasos o fallos que se produjeran en el acceso,
funcionamiento y operatividad de la web, o en sus servicios y/o contenidos, así como tampoco de las interrupciones, suspensiones o el mal funcionamiento de la misma,
cuando tuvieren su origen en averías producidas por catástrofes naturales o situaciones de fuerza mayor , o de urgencia extrema, tales como huelgas, ataques o intrusiones
informáticas o cualquier otra situación de fuerza mayor o causa fortuita, así como por errores en las redes telemáticas de transferencia de datos. La EMPRESA no se hace
responsable de la fiabilidad, veracidad y exactitud de los contenidos ofrecidos en su web. El CLIENTE se compromete a cumplir con lo establecido en el AVISO LEGAL publicado
por la EMPRESA en la web complucine.sytes.net en cada momento. El CLIENTE reconoce y acepta que el acceso y uso del sitio web complucine.sytes.net y de los contenidos
incluidos en el mismo tiene lugar de forma libre y conscientemente, bajo su exclusiva responsabilidad. El CLIENTE se compromete a hacer un uso adecuado y lícito del Sitio
Web y de los contenidos, de conformidad con la legislación aplicable, las presentes Condiciones Generales de Uso, la moral y buenas costumbres generalmente aceptadas y
el orden público.
</li><br />
<li>
PROCEDIMIENTO DE COMPRA A través del apartado COMPRA DIRECTA el CLIENTE puede adquirir la/s entrada/s de cine telemáticamente. Los pasos a seguir son los
siguientes:
<ul>
<li>
OPCIONES PARA LA COMPRA Al pulsar sobre cualquier opción del sitio web, se cargarán las páginas que le permitirán, a través de una serie de menús,
seleccionar la película, cine, día y sesión a la que desea acudir. Cada menú se genera en función de la opción seleccionada en el menú anterior. Una vez completada la
selección podrá acceder al patio de butacas del cine y seleccionar las localidades que más le gusten.
</li>
<li>
SOLICITUD DE BUTACAS En el patio de butacas, las butacas en color verde representan los asientos que están disponibles. En las butacas ocupadas aparecerá el dibujo de una persona sentada. Para seleccionar
las localidades deseadas, pulse con el ratón sobre ellas; a medida que las pulse se pondrán de color blanco. Si se equivoca vuelva a pulsar sobre la butaca y volverá a
ponerse de color verde. Cuando termine de seleccionar las localidades pulse sobre el botón Solicitar y entrará en una página en la que se le pedirán los datos de la tarjeta
con la que desea pagar las entradas. NOTA: Las localidades han de seleccionarse juntas y en la misma fila. El máximo de localidades que se pueden solicitar es de 10.
</li>
<li>
ACEPTACIÓN DE LA PROPUESTA DEL CINE Una vez solicitadas las butacas, el cine respondera si aun siguen estando disponibles, en ese caso se procede al pago.
</li>
<li>
DATOS PARA EL PAGO En esta página debe introducirse un número de tarjeta y su caducidad; con la que abonar el importe de las entradas. Asimismo, también aparece un campo donde
opcionalmente-, se puede introducir un correo electrónico de contacto el cual es útil para informar al usuario en caso de que se suspendiera alguna sesión, se realizara
una reubicacion, etc. Tras introducir los datos para el pago, pulse sobre el botón Continuar.
</li>
<li>
CONFIRMACIÓN DE LA VENTA Si el proceso de compra se completa correctamente, le aparecerá una página de confirmación en la que se reflejan las características de las localidades adquiridas, así como un numero de referencia. El número de referencia
identifica su compra de forma única y será necesario en caso de que usted desee realizar alguna consulta. Dado que es un número de bastantes cifras si lo desea puede usted
sacar una copia en papel de dicha página pulsando sobre el botón imprimir o descargándolo en su ordenador.
</li>
<li>
DENEGACIÓN DE LA VENTA Por diversas razones como son: falta de comunicación con la entidad emisora de su tarjeta, pérdida temporal de la comunicación con el cine, etc.; puede que al sistema le resulte imposible realizar la compra.
En tal caso, le aparecerá una página indicándole tal circunstancia así como una referencia. Si desea realizar alguna consulta, utilice dicho número de referencia para que
podamos atenderle.
</li>
<li>
RECOGIDA DE ENTRADAS Cerca de las taquillas del cine, el CLIENTE encontrará un buzón instalado a tal efecto, en el que puede introducir la tarjeta
con la que realizó la compra y le emitirá sus entradas. Si tuviera alguna dificultad en localizar el buzón puede consultar al personal del cine. Si el CLIENTE tuviera algún
inconveniente a la hora de recoger las entradas, deberá asegurarse de haber introducido la tarjeta en la posición correcta, los buzones tienen un dibujo que muestra como.
Si por alguna razón el buzón no le dispensa las entradas, como por ejemplo que se haya quedado sin papel, deberá acudir a las taquillas con la tarjeta.
</li>
</ul>
</li><br />
<li>
IDIOMA La información y contenidos ofrecidos por la EMPRESA a través de la web complucine.sytes.net se ofrecen en idioma español. La EMPRESA no se hace
responsable de los daños o perjuicios que pudieran ocasionar al CLIENTE por la no comprensión de los mismos.
</li><br />
<li>
NORMAS RELATIVAS A LA FORMACIÓN Y VALIDEZ DEL CONTRATO EL CLIENTE entiende que la información contenida en la web, de información general sobre cartelera,
estrenos, cines, noticias, IVA, comisiones, así como las condiciones generales de contratación y perfeccionamiento del contrato, son bastantes y suficientes para la exclusión
de error en la formación del consentimiento. Las presentes condiciones generales de contratación, pasarán a formar parte del contrato en el momento de aceptación por parte
del CLIENTE, manifestada por medio de la cumplimentación y envío de los datos de compra introducidos en el apartado COMPRA DIRECTA. 9. VALIDEZ DEL PROCEDIMIENTO DE COMPRA
COMO PRUEBA DE ACEPTACIÓN Ambas partes declaran expresamente que la aceptación de la oferta de servicio de la EMPRESA por el CLIENTE se lleva a cabo a través del seguimiento
del procedimiento de compra descrito en el apartado COMPRA DIRECTA. El hecho de cumplimentar telemáticamente todos los pasos descritos para el proceso de compra de la/s
entrada/s por el CLIENTE supone la aceptación integra y expresa de las presentes condiciones generales. 10. PERFECCIÓN DEL CONTRATO El contrato quedará perfeccionado desde
la fecha en que el CLIENTE manifieste su conformidad con las presentes condiciones o, en su caso, las publicadas en el momento de realizar la compra, mediante la aportación
de los datos solicitados en el apartado DATOS PARA EL PAGO, de la sección COMPRA DIRECTA, y una vez que el CLIENTE confirme la compra efectuada.
</li><br />
<li>
PAGO La EMPRESA cobrará al CLIENTE por la prestación del servicio las tarifas vigentes en cada momento en la web y que aparecerán una vez seleccionada la película,
cine, día y sesión, apartado éste último, en el que aparecerá el precio correspondiente a la selección efectuada y los impuestos aplicables. Una vez seleccionada/s la/s
butaca/s, se abrirá la sección correspondiente al pago, con la petición de introducción de los datos de la tarjeta de crédito, en la cual se detallará el precio y la comisión
correspondiente a cada butaca.
</li><br />
<li>
DERECHO DE DESISTIMIENTO El CLIENTE debe asegurarse fehacientemente antes de tramitar la reserva de la exactitud y adecuación de los datos
introducidos, ya que no es posible la devolución de las entradas adquiridas una vez realizada la compra. No poder asistir al espectáculo o cometer un error al adquirir las
entradas no son motivos que permitan su devolución. Sólo podrán anularse entradas por posibles incidencias técnicas u operativas, imputables a la EMPRESA. El usuario no podrá
ejercitar el derecho de desistimiento o resolución previsto en el artículo 44 de la ley 47/2002 de 19 de diciembre de reforma de la Ley 7/1996, de 15 de enero, de Ordenación
del Comercio Minorista, al estar excluido en el artículo 45 b). Tampoco podrá ser ejercido por el usuario el derecho de Resolución previsto en el artículo 4 del R.D.
1906/19999, de 17 de diciembre, al estar excluido el ejercicio del mismo en el artículo 4.5. No obstante lo anterior, cuando el importe de una compra hubiese sido cargado
fraudulenta o indebidamente, utilizando el número de una tarjeta de pago, el titular de la misma podrá solicitar la anulación del cargo a la EMPRESA siempre y cuando se
acredite la previa presentación de denuncia por estos hechos. La devolución del importe de las mismas se realizará mediante reclamación por escrito, a la que deberán
acompañarse los documentos (denuncia) que acredite n la pérdida o robo de la tarjeta con la que se efectuó el pago. Sin embargo, si la compra hubiese sido efectivamente
realizada por el titular de la tarjeta y la exigencia de devolución no fuera consecuencia de haberse ejercido el derecho de desistimiento o de resolución reconocido en el
artículo 44 y, por tanto, hubiese exigido indebidamente la anulación del correspondiente cargo, aquel quedará obligado frente al vendedor al resarcimiento de los daños y
perjuicios ocasionados como consecuencia de dicha anulación. La EMPRESA pretende facilitar tanto a promotores como al público la adquisición de dichas entradas pero en ningún
momento la EMPRESA es la entidad promotora del espectáculo.
</li><br />
<li>
RECLAMACIONES Para cualquier aclaración sobre las presentes condición es generales o para realizar cualquier
reclamación relativa a su compra, el CLIENTE tiene a su disposición las direcciones especificadas al principio de este documento.
</li><br />
<li>
DURACIÓN Y TERMINACIÓN La prestación del servicio de la web complucine.sytes.net tiene una duración indefinida. No obstante,la EMPRESA está autorizada para
dar por terminada o suspender la prestación del servicio en cualquier momento, sin perjuicio de lo que se hubiere dispuesto al respecto en las correspondientes condiciones
generales. Cuando ello sea razonablemente posible, la EMPRESA advertirá previamente la terminación o suspensión de la prestación del servicio.
</li><br />
<li>
PROPIEDAD INTELECTUAL E INDUSTRIAL El CLIENTE acepta que todos los derechos de propiedad industrial e intelectual sobre los contenidos y cualesquiera otros
elementos insertados en la web complucine.sytes.net pertenecen a la EMPRESA. La EMPRESA es titular de los elementos que integran el diseño gráfico de su página web, los
menús, botones de navegación, el código HTML, los textos, imágenes, texturas, gráficos y cualquier otro contenido de la página web o, en cualquier caso, dispone de la
correspondiente autorización para la utilización de dichos elementos. El contenido de la web no podrá ser reproducido ni en todo ni en parte, ni transmitido, ni registrado
por ningún sistema de recuperación de información, en ninguna forma ni en ningún medio, a menos que se cuente con la autorización previa, por escrito, de la citada Entidad.
Asimismo queda prohibido suprimir, eludir o manipular el copyright y demás datos identificativos de los derechos de la EMPRESA, así como los dispositivos técnicos de
protección, o cualquiera mecanismos de información que pudieren contener los contenidos.
</li><br />
<li>
PROTECCIÓN DE DATOS DE CARÁCTER PERSONAL La EMPRESA ha adoptado las medidas y niveles de seguridad de protección de los datos personales exigidos por la Ley
Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal y sus reglamentos de desarrollo. Los datos personales recabados a través de
complucine.sytes.net son objeto de tratamiento automatizado y se incorporan a un fichero titularidad de la EMPRESA, que es a su vez la responsable del mencionado fichero.
La cumplimentación de los datos correspondientes a la compra de entradas o del formulario de sugerencias en el sitio web www.cinentradas.com implica el consentimiento expreso
del CLIENTE a la inclusión de sus datos de carácter personal en el referido fichero automatizado de la EMPRESA. El Cliente titular de los datos puede ejercitar gratuitamente
sus derechos de acceso, rectificación, cancelación y oposición con arreglo a lo previsto en la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter
Personal y demás normativa aplicable al efecto, mediante el envio de un correo electrónico a la dirección MARKETING@complucine.sytes.net, o bien mediante carta dirigida a la
dirección de la EMPRESA especificada al inicio de este documento. Ya sea por correo electrónico o postal, debera constar claramente la
identidad del titular de los datos de forma que permita reconocer la identidad del CLIENTE que ejercita cualquiera de los anteriores derechos, debiendo indicar asimismo la
dirección a la que EMPRESA deberá hacer llegar la respuesta.El citado fichero figura inscrito en el Registro General de la Agencia Española de Protección de Datos. La
finalidad de la recogida de datos no es otra que la de poder ofrecer al CLIENTE los servicios de venta de entradas, así como la de atender las sugerencias realizadas por
los mismos.
</li><br />
<li>
NULIDAD PARCIAL Si cualquier parte de estas condiciones de servicio fuera contraria a Derecho y, por tanto, inválida, ello no afectará a las otras disposiciones
conformes a Derecho. Las partes se comprometen a renegociar aquellas partes de las condiciones de servicio que resultaran nulas y a incorporarlas al resto de las condiciones
de servicio.
</li><br />
<li>
LEY APLICABLE Y JURISDICCIÓN COMPETENTE. El CLIENTE se somete, con renuncia expresa a cualquier otro fuero, a los juzgados y tribunales de la ciudad de
Madrid (España). Estas Condiciones Generales se rigen por la ley española. Ambas partes reconocen que la legislación aplicable al presente contrato, y a todas las relaciones
jurídicas dimanantes del mismo, será la española, por expresa aplicación de lo dispuesto en el artículo 1.262 del Código Civil, en relación a lo dispuesto en el Capítulo IV,
del Título Preliminar del mismo cuerpo legal.
</li><br />
</ol>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

42
index.php Normal file
View File

@ -0,0 +1,42 @@
<?php
//General Config File:
require_once(__DIR__.'/assets/php/config.php');
//Promotions:
include_once(__DIR__.'/assets/php/includes/promotion_dao.php');
$promotionsDAO = new Promotion_DAO("complucine");
$promotions = $promotionsDAO->allPromotionData();
foreach($promotions as $key=>$value){
$promotions_img[$key] = $value->getImg();
}
//Page-specific content:
$section = '<!-- Undercard -->
<section id="cartelera">
<div class="row">
<div class="code">
'.$template->print_fimls().'
</div>
</div>
</section>
<section id="promociones" class="row">
<div class="code">
<h2>Promociones</h2>
<section class="promotions">
<button id="retroceder">&#x23EA;</button>
<a href="promotions/" class="imagen"></a>
<button id="avanzar">&#x23E9;</button>
</section>
<section class="controls">
<button id="play">&#x25b6;</button>
<button id="stop" disabled>&#9208;</button>
</section>
</div>
</section>
';
$section.="<input type='hidden' id='promotions' value='".json_encode($promotions_img)."' />";
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,100 @@
<?php
include_once($prefix.'assets/php/includes/user_dao.php');
include_once($prefix.'assets/php/form.php');
class FormLogin extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
//Atributes:
private $user; // User who is going to log-in.
public function __construct() {
parent::__construct('formLogin');
}
protected function generaCamposFormulario($datos, $errores = array()){
$nombre = $datos['name'] ?? '';
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'name', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='nombre_usuario'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos Personales</legend>
<input type='text' name='name' id='name' value='' placeholder='Nombre de Usuario' required/><pre>".$errorNombre."</pre>
<input type='password' name='pass' id='pass' value='' placeholder='Contraseña' required/><pre>".$errorPassword."</pre>
</fieldset>
<div class='actions'>
<input type='submit' id='submit' value='Iniciar Sesión' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['name']) ?? null;
//$nombre = $datos['name'] ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['name'] = "El nombre tiene que tener\n una longitud de al menos\n 3 caracteres\n y menos de 15 caracteres.";
}
$password = $this->test_input($datos['pass']) ?? null;
//$password = $datos['pass'] ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
if (count($result) === 0) {
$bd = new UserDAO('complucine');
if($bd){
$this->user = $bd->selectUser($nombre, $password);
if ($this->user) {
$this->user->setPass(null);
$_SESSION["user"] = serialize($this->user);
$_SESSION["nombre"] = $this->user->getName();
$_SESSION["rol"] = $this->user->getRol();
$_SESSION["login"] = true;
$result = 'validate.php';
} else {
$result[] = "El usuario o el password\nno coinciden.";
}
} else {
$result[] = "Error al conectar con la BD.";
}
}
return $result;
}
//Returns validation response:
static public function getReply() {
if(isset($_SESSION["login"])){
$name = strtoupper($_SESSION['nombre']);
$reply = "<h1>Bienvenido {$name}</h1><hr />
<p>{$name}, has iniciado sesión correctamente.</p>
<p>Usa los botones para navegar</p>
<a href='../'><button>Inicio</button></a>
<a href='../panel_{$_SESSION["rol"]}'><button>Mi Panel</button></a>\n";
}
else if(!isset($_SESSION["login"])){
$reply = "<h1>ERROR</h1><hr />".
"<p>El usuario o contraseña no son válidos.</p>
<p>Vuelve a intetarlo o regístrate si no lo habías hecho previamente.</p>
<a href='./'><button>Iniciar Sesión</button></a>
<form method='post' action='./'><button name='register' id='register'>Registro</button></form>\n";
}
return $reply;
}
}
?>

74
login/index.php Normal file
View File

@ -0,0 +1,74 @@
<?php
/**
* USUARIOS DE PRUEBAS:
* user | userpass --> Usuario de pruebas 1.
* fernando | ferpass --> Usuario de pruebas 2.
* manager | managerpass --> Manager asociado al cine 1.
* manager2 | Manager2pass --> Manager asociado al cine 2.
* admin | adminpass --> Administrador de la aplicación.
*/
//General Config File:
require_once('../assets/php/config.php');
//Change the view of the "Login page" to "Registration page":
require('login_register_view.php');
$view = new LoginRegisterView();
$isLogin = $view->getIsLogin();
//Forms:
require('includes/formLogin.php');
require($prefix.'register/includes/formRegister.php');
$formLogin = new FormLogin();
$htmlFormLogin = $formLogin->gestiona();
$formRegister = new FormRegister();
$htmlFormRegister = $formRegister->gestiona();
if($isLogin){
$form = "<!-- Login -->
<div class='column left'>
<div class='code info'>
<h2>¿No tienes una cuenta?</h2>
<hr />
<p>Para crear una cuenta de usuario es necesario haber rellenado el formulario de registro previamente</p>
<p>Haz click en el botón para registrate.</p>
<form method='post'>
<button type='submit' name='register' id='_register'>Registrate</button>
</form>
</div>
</div>
<div class='column right'>
<h2>Iniciar Sesión</h2>
".$htmlFormLogin."
</div>"."\n";
} else {
$form = "<!-- Register -->
<div class='column left'>
<h2>Registro</h2>
".$htmlFormRegister."
</div>
<div class='column right'>
<div class='code info'>
<h2>¿Ya estás registrado?</h2>
<hr />
<p>Si dispones de una cuenta de usuario, no es necesario que rellenes este formulario nuevamente</p>
<p>Haz click en el botón para iniciar sesión.</p>
<form method='post'>
<button type='submit' name='login' id='_login'>Inicia Sesión</button>
</form>
</div>
</div>"."\n";
}
//Specific page content:
$section = '<!-- Login / Register -->
<section id="login_register">
<div class ="row">
'.$form.'
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,38 @@
<?php
class LoginRegisterView {
//Atributes:
private $isLogin;
private $login;
private $register;
//Constructor:
public function __construct() {
$this->setIsLogin(true);
if(array_key_exists('register', $_POST)){
$this->setIsLogin(false);
}
else if(array_key_exists('login', $_POST)){
$this->setIsLogin(true);
}
}
//Methods:
private function setIsLogin($set){
return $this->isLogin = $set;
}
public function getIsLogin(){
return $this->isLogin;
}
public function getLogin(){
return $this->login;
}
public function getRegister(){
return $this->register;
}
}
?>

27
login/validate.php Normal file
View File

@ -0,0 +1,27 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Login form validate:
require_once('./includes/formLogin.php');
$reply = FormLogin::getReply();
//Specific page content:
$section = '<!-- Reply -->
<section class="reply">
<div class ="row">
<div class="column side"></div>
<div class="column middle">
<div class="code info">
'.$reply.'
</div>
</div>
<div class="column side"></div>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

40
logout/index.php Normal file
View File

@ -0,0 +1,40 @@
<?php
header("refresh:4;url=../");
//General Config File:
require_once('../assets/php/config.php');
//Session:
//session_start(); /* Inicializada en config.php */
unset($_SESSION);
session_destroy();
if(!isset($_SESSION["nombre"])){
$reply = "<h1>Se ha cerrado la sesión</h1><hr />".
"<p>Serás redirigido al inicio en unos segundos.<br />
Haz clic <a href='{$prefix}'>aquí</a> si tu navegador no te redirige automáticamente.</p>\n";
}
else{
$reply = "<h1>Ha ocurrido un problema y no hemos podido finalizar la sesión</h1>".
"<p>Serás redirigido al inicio en unos segundos.<br />
Haz clic <a href='{$prefix}'>aquí</a> si tu navegador no te redirige automáticamente.</p>\n";
}
//Specific page content:
$section = '<!-- Reply -->
<section id="reply">
<div class ="row">
<div class="column side"></div>
<div class="column middle">
<div class="code info">
'.$reply.'
</div>
</div>
<div class="column side"></div>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,90 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/cinema_dao.php');
include_once('../assets/php/includes/cinema.php');
include_once('../assets/php/form.php');
class formAddCinema extends Form{
public function __construct(){
$op = array("action"=>"./?state=mc");
parent::__construct('formAddCinema',$op);
}
protected function generaCamposFormulario($datos,$errores=array()){
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorName = self::createMensajeError($errores,'namecinema','span',array('class'=>'error'));
$errorDirection = self::createMensajeError($errores,'direction','span',array('class'=>'error'));
$errrorPhone = self ::createMensajeError($errores,'phone',array('class'=>'error'));
$html = '<div class="row"></div>
<fieldset id = "cinema_form">'.$htmlErroresGlobales.'</pre>
<legend>Añadir cine</legend>
<input type="text" name="namecinema" id="namecinema" placeholder="Nombre" required/><pre>'.$errorName.'</pre>
<input type="text" name="direction" id="direction" placeholder="Direccion" required/><pre>'.$errorDirection.'</pre>
<input type="text" name="phone" id="phone" placeholder="Teléfono" required/><pre>'.$errrorPhone.'</pre>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Añadir cine" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div> ';
return $html;
}
//Process form:
public function procesaFormulario($datos) {
$result =array();
$name = $this->test_input($datos['namecinema'])??null;
if(empty($name)){
$result['namecinema']= "El nombre no es válido";
}
$direction = $this -> test_input($datos['direction']) ?? null;
if(empty($direction)){
$result['direction'] = "La dirección no es valida";
}
$phone = $this -> test_input($datos['phone']) ?? null;
if(empty($phone)){
$result['phone'] = "El teléfono no es valido";
}
if(count($result)===0){
$bd = new Cinema_DAO('complucine');
$exist = $bd -> GetCinema($name,$direction);
if(mysqli_num_rows($exist)!=0){
$result[] = "Ya existe un cine con ese nombre o dirección";
}
else{
$bd->createCinema(null,$name,$direction,$phone);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha añadido el cine correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mc'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mc';
}
$exist->free();
}
return $result;
}
}
?>

View File

@ -0,0 +1,151 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/film_dao.php');
include_once('../assets/php/includes/film.php');
include_once('../assets/php/form.php');
class formAddFilm extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
const EXTENSIONS = array('gif','jpg','jpe','jpeg','png');
public function __construct() {
$options = array("action" => "./?state=mf", 'enctype' => 'multipart/form-data');
parent::__construct('formAddFilm', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorTittle = self::createMensajeError($errores, 'tittle', 'span', array('class' => 'error'));
$errorDuration = self::createMensajeError($errores, 'duration', 'span', array('class' => 'error'));
$errorLanguage = self::createMensajeError($errores, 'language', 'span', array('class' => 'error'));
$errorDescription = self::createMensajeError($errores, 'description', 'span', array('class' => 'error'));
$errorImage = self::createMensajeError($errores, 'img', 'span', array('class' => 'error'));
$html = '<div class="row">
<fieldset id="film_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>AÑADIR PELÍCULA</legend>
<input type="text" name="tittle" id="tittle" placeholder="Título" required/><pre>'.$errorTittle.'</pre>
<input type="number" name="duration" id="duration" placeholder="Duración" required/><pre>'.$errorDuration.'</pre>
<input type="text" name="language" id="language" placeholder="Idioma" required/><pre>'.$errorLanguage.'</pre>
<input type="text" name="description" id="description" placeholder="Descripción" required/><pre>'.$errorDescription.'</pre>
<div class="file">Imagen promocional:<input type="file" name="archivo" id="file" placeholder="Imagen promocional" /></div><pre>'.$errorImage.'</pre>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Añadir pelicula" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>
</div>';
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$t = $this->test_input($datos['tittle']) ?? null;
$tittle = strtolower(str_replace(" ", "_", $t));
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $tittle)
if ( empty($tittle) ) {
$result['tittle'] = "El título no es válido";
}
$duration = $this->test_input($datos['duration']) ?? null;
//||!mb_ereg_match(self::HTML5_EMAIL_REGEXP, $duration)
if ( empty($duration) || $duration <0) {
$result['duration'] = "La duración no es válida";
}
$language = $this->test_input($datos['language']) ?? null;
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $language)
if ( empty($language) ) {
$result['language'] = "El idioma no es válido";
}
$description = $this->test_input($datos['description']) ?? null;
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $description)
if ( empty($language)) {
$result['language'] = "La descripcion no es válida";
}
if (count($result) === 0) {
$bd = new Film_DAO("complucine");
$exist = $bd-> GetFilm($tittle,$language);
if(mysqli_num_rows($exist) != 0){
$result[] = "Ya existe una nueva pelicula con el mismo titulo e idioma.";
}
else{
$ok = count($_FILES) == 1 && $_FILES['archivo']['error'] == UPLOAD_ERR_OK;
if ( $ok ) {
$archivo = $_FILES['archivo'];
$nombre = $_FILES['archivo']['name'];
//1.a) Valida el nombre del archivo
$ok = $this->check_file_uploaded_name($nombre) && $this->check_file_uploaded_length($nombre) ;
// 1.b) Sanitiza el nombre del archivo
//$ok = $this->sanitize_file_uploaded_name($nombre);
//
// 1.c) Utilizar un id de la base de datos como nombre de archivo
// 2. comprueba si la extensión está permitida
$ok = $ok && in_array(pathinfo($nombre, PATHINFO_EXTENSION), self::EXTENSIONS);
// 3. comprueba el tipo mime del archivo correspode a una imagen image
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['archivo']['tmp_name']);
$ok = preg_match('/image\/*./', $mimeType);
//finfo_close($finfo);
if ( $ok ) {
$tmp_name = $_FILES['archivo']['tmp_name'];
$nombreBd = strtolower(str_replace(" ", "_", $tittle)).".".pathinfo($nombre, PATHINFO_EXTENSION);
if ( !move_uploaded_file($tmp_name, "../img/films/{$nombreBd}") ) {
$result['img'] = 'Error al mover el archivo';
}
//if ( !copy("../img/tmp/{$nombre}", "/{$nombre}") ) {
// $result['img'] = 'Error al mover el archivo';
//}
//$nombreBd = str_replace("_", " ", $nombre);
$bd->createFilm(null, $tittle,$duration,$language,$description, $nombreBd); //Null hasta tener $nombre
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha añadido la pelicula correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mf'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mf';
}else {
$result['img'] = 'El archivo tiene un nombre o tipo no soportado';
}
} else {
$result['img'] = 'Error al subir el archivo.';
}
}
$exist->free();
}
return $result;
}
private function check_file_uploaded_name ($filename) {
return (bool) ((mb_ereg_match('/^[0-9A-Z-_\.]+$/i',$filename) === 1) ? true : false );
}
private function check_file_uploaded_length ($filename) {
return (bool) ((mb_strlen($filename,'UTF-8') < 250) ? true : false);
}
}
?>

View File

@ -0,0 +1,146 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/manager_dao.php');
include_once('../assets/php/includes/manager.php');
include_once('../assets/php/includes/cinema_dao.php');
include_once('../assets/php/includes/user_dao.php');
include_once('../assets/php/form.php');
class formAddManager extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "./?state=mg");
parent::__construct('formAddManager', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html = "";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
$errorIdCinema = self::createMensajeError($errores, 'idcinema', 'span', array('class' => 'error'));
$html .= '<h3>AÑADIR GERENTE</h3>
<fieldset id="film_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>Selecciona usuario.</legend><pre>'.$errorId.'</pre>'
.$this->showUsers().
'</fieldset>
<fieldset>
<legend>Selecciona cine.</legend><pre>'.$errorIdCinema.'</pre>'
.$this->showCinemas().
'</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Seleccionar" name="add_manager" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>
';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($datos['id']) ?? null;
if (is_null($id) ) {
$result['id'] = "ERROR. No existe un usuario con ese ID";
}
$idcinema = $this->test_input($datos['idcinema']) ?? null;
//||!mb_ereg_match(self::HTML5_EMAIL_REGEXP, $duration)
if (empty($idcinema)) {
$result['idcinema'] = "ERROR. No existe un cine con ese ID";
}
if (count($result) === 0) {
$bd = new Manager_DAO("complucine");
// check if already exist a manager with same name
$exist = $bd->GetManagerCinema($id, $idcinema);
if( mysqli_num_rows($exist) != 0){
$result[] = "Ya existe un manager asociado a este usuario y cine";
}
else{
$bd->createManager($id, $idcinema);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha añadido el gerente correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mg'><button>Cerrar Mensaje</button></a>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mg';
}
$exist->free();
}
return $result;
}
private function showUsers() {
$user = new UserDAO("complucine");
$users = $user->allUsersNotM();
$ids = array();
$usernames = array();
$emails = array();
$roles = array();
foreach($users as $key => $value){
$ids[$key] = $value->getId();
$usernames[$key] = $value->getName();
$emails[$key] = $value->getEmail();
$roles[$key] = $value->getRol();
}
$html='';
for($i = 0; $i < count($users); $i++){
$html .= '
<input type="radio" class="content-input" name="id" value="'.$ids[$i].'" id="'.$ids[$i].'"><label class="efe" for="'.$ids[$i].'"> '.$ids[$i].', '.$usernames[$i].
', '.$usernames[$key].
'
</label>
';
}
return $html;
}
private function showCinemas() {
$cine = new Cinema_DAO("complucine");
$cinemas = $cine->allCinemaData();
$ids = array();
$names = array();
$directions = array();
$phones = array();
foreach($cinemas as $key => $value){
$ids[$key] = $value->getId();
$names[$key] = $value->getName();
$directions[$key] = $value->getDirection();
$phones[$key] = $value->getPhone();
}
$html = '';
for($i = 0; $i < count($cinemas); $i++){
$html.= '
<input type="radio" class="content-input" name="idcinema" value="'.$ids[$i].'" id="'.$ids[$i].'"><label class="efe" for="'.$ids[$i].'"> '.$ids[$i].', '.$names[$i].'
</label>
';
}
return $html;
}
}
?>

View File

@ -0,0 +1,162 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/promotion_dao.php');
include_once('../assets/php/includes/promotion.php');
include_once('../assets/php/form.php');
class formAddPromotion extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
const EXTENSIONS = array('gif','jpg','jpe','jpeg','png');
public function __construct() {
$options = array("action" => "./?state=mp", 'enctype' => 'multipart/form-data');
parent::__construct('formAddPromotion', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorTittle = self::createMensajeError($errores, 'tittle', 'span', array('class' => 'error'));
$errorDescription = self::createMensajeError($errores, 'description', 'span', array('class' => 'error'));
$errorCode = self::createMensajeError($errores, 'code', 'span', array('class' => 'error'));
$errorActive = self::createMensajeError($errores, 'active', 'span', array('class' => 'error'));
//$errorImage = self::createMensajeError($errores, 'image', 'span', array('class' => 'error'));
$html = '<div class="row">
<h3>AÑADIR PROMOCIÓN</h3>
<fieldset id="promotion_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>AÑADIR PROMOCIÓN</legend>
<input type="text" name="tittle" id="tittle" placeholder="Título" required/><pre>'.$errorTittle.'</pre>
<input type="text" name="description" id="description" placeholder="Descripción" required/><pre>'.$errorDescription.'</pre>
<input type="text" name="code" id="code" placeholder="Codigo" required/><pre>'.$errorCode.'</pre>
<input type="text" name="active" id="active" placeholder="Activo (si/no)" required/><pre>'.$errorActive.'</pre>
<div class="file">Imagen promocional:<input type="file" name="archivo" id="file" placeholder="Imagen promocional" /></div>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Añadir promocion" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>
</div>';
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$t = $this->test_input($datos['tittle']) ?? null;
$tittle = strtolower(str_replace(" ", "_", $t));
if ( empty($tittle) ) {
$result['tittle'] = "El título no es válido";
}
$description = $this->test_input($datos['description']) ?? null;
if ( empty($description)) {
$result['description'] = "La descripcion no es válida";
}
$code = $this->test_input($datos['code']) ?? null;
if ( empty($code) ) {
$result['code'] = "El idioma no es válido";
}
$active = strtolower($this->test_input($datos['active'])) ?? null;
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $description)
if ( strcmp($active,"si") == 0 || strcmp($active,"no") == 0) {
if ( strcmp($active,"si") == 0 ) {
$boolean = 1;
}
else {
$boolean = 0;
}
}
else {
$result['active'] = "El valor activo debe ser si/no";
}
if (count($result) === 0) {
$bd = new Promotion_DAO("complucine");
$exist = $bd-> GetPromotion($code);
if(mysqli_num_rows($exist) != 0){
$result[] = "Ya existe una nueva promocion con el mismo codigo.";
}
else{
$ok = count($_FILES) == 1 && $_FILES['archivo']['error'] == UPLOAD_ERR_OK;
if ( $ok ) {
$archivo = $_FILES['archivo'];
$nombre = $_FILES['archivo']['name'];
//1.a) Valida el nombre del archivo
$ok = $this->check_file_uploaded_name($nombre) && $this->check_file_uploaded_length($nombre) ;
// 1.b) Sanitiza el nombre del archivo
//$ok = $this->sanitize_file_uploaded_name($nombre);
//
// 1.c) Utilizar un id de la base de datos como nombre de archivo
// 2. comprueba si la extensión está permitida
$ok = $ok && in_array(pathinfo($nombre, PATHINFO_EXTENSION), self::EXTENSIONS);
// 3. comprueba el tipo mime del archivo correspode a una imagen image
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['archivo']['tmp_name']);
$ok = preg_match('/image\/*./', $mimeType);
//finfo_close($finfo);
if ( $ok ) {
$tmp_name = $_FILES['archivo']['tmp_name'];
$nombreBd = strtolower(str_replace(" ", "_", $tittle)).".".pathinfo($nombre, PATHINFO_EXTENSION);
if ( !move_uploaded_file($tmp_name, "../img/promos/{$nombreBd}") ) {
$result['img'] = 'Error al mover el archivo';
}
//if ( !copy("../img/tmp/{$nombre}", "/{$nombre}") ) {
// $result['img'] = 'Error al mover el archivo';
//}
//$nombreBd = str_replace("_", " ", $nombre);
$bd->createPromotion(null, $tittle,$description,$code,$boolean, $nombreBd);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha añadido la promocion correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mp'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mp';
}else {
$result['img'] = 'El archivo tiene un nombre o tipo no soportado';
}
}
else {
$result['img'] = 'Error al subir el archivo.';
}
}
$exist->free();
}
return $result;
}
private function check_file_uploaded_name ($filename) {
return (bool) ((mb_ereg_match('/^[0-9A-Z-_\.]+$/i',$filename) === 1) ? true : false );
}
private function check_file_uploaded_length ($filename) {
return (bool) ((mb_strlen($filename,'UTF-8') < 250) ? true : false);
}
}
?>

View File

@ -0,0 +1,76 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/cinema_dao.php');
include_once('../assets/php/includes/cinema.php');
include_once('../assets/php/form.php');
class formDeleteCinema extends Form{
public function __construct(){
$op = array("action"=>"./?state=mc");
parent::__construct('formAddCinema',$op);
}
protected function generaCamposFormulario($datos,$errores=array()){
$html ="";
if (!isset($_SESSION['message'])) {
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
$html .= '
<fieldset id = "cinema_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>¿Estás seguro de que quieres eliminar este cine?</legend>
<input type="hidden" name="id" value='.$_POST['id'].'/><pre>'.$errorId.'</pre>
<p>Name: '.$_POST['name'].' </p>
<p>Dirección: '.$_POST['direction'].' </p>
<p>Teléfono: '.$_POST['phone'].' </p>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Eliminar" name="delete_cinema" class="primary" />
<input type="submit" id="submit" value="Cancelar" class="primary" />
</div>';
}
return $html;
}
//Process form:
public function procesaFormulario($datos) {
$result =array();
$id = $this->test_input($datos['id'])??null;
if(is_null($id)){
$result['id']= "El nombre no es válido";
}
if(count($result)===0){
$bd = new Cinema_DAO('complucine');
$exist = $bd -> existCinema($id);
if(mysqli_num_rows($exist)==1){
$bd->deleteCinema($id);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha eliminado el cine correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mc'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mc';
}
$exist->free();
}
else{
$result[] = "El cine seleccionado no existe.";
}
return $result;
}
}
?>

View File

@ -0,0 +1,88 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/film_dao.php');
include_once('../assets/php/includes/film.php');
include_once('../assets/php/form.php');
class formDeleteFilm extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "./?state=mf");
parent::__construct('formDeleteFilm', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html ="";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
//$errorTittle = self::createMensajeError($errores, 'tittle', 'span', array('class' => 'error'));
//$errorDuration = self::createMensajeError($errores, 'duration', 'span', array('class' => 'error'));
//$errorLanguage = self::createMensajeError($errores, 'language', 'span', array('class' => 'error'));
//$errorDescription = self::createMensajeError($errores, 'description', 'span', array('class' => 'error'));
//$errorImage = self::createMensajeError($errores, 'image', 'span', array('class' => 'error'));
$html .= '<div class="row">
<fieldset id="film_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>¿Estás seguro de que quieres eliminar esta pelicula?</legend>
<input type="hidden" name="id" value='.$_POST['id'].'/><pre>'.$errorId.'</pre>
<p>Id: '.$_POST['id'].' </p>
<p>Título: '.$_POST['tittle'].' </p>
<p>Duración: '.$_POST['duration'].' </p>
<p>Idioma: '.$_POST['language'].' </p>
<p>Descripción: '.$_POST['description'].' </p>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Eliminar" name="delete_film" class="primary" />
<input type="submit" id="submit" value="Cancelar" class="primary" />
</div>
</div>';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($datos['id']) ?? null;
if ( is_null($id)) {
$result['id'] = "La pelicula seleccionada no existe.";
}
if (count($result) === 0) {
$bd = new Film_DAO("complucine");
$exist = $bd-> existFilm($id);
if( mysqli_num_rows($exist) == 1){
$bd->deleteFilm($id);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha eliminado la pelicula correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mf'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mf';
}
else{
$result[] = "La pelicula seleccionada no existe.";
}
$exist->free();
}
return $result;
}
}
?>

View File

@ -0,0 +1,83 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/manager_dao.php');
include_once('../assets/php/includes/manager.php');
include_once('../assets/php/form.php');
class formDeleteManager extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "./?state=mg");
parent::__construct('formDeleteManager', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html ="";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
//$errorIdCinema = self::createMensajeError($errores, 'idcinema', 'span', array('class' => 'error'));
$html .= '<div class="row">
<h3>ELIMINAR GERENTE</h3>
<fieldset id="manager_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>¿Estás seguro de que quieres eliminar este gerente?</legend><pre>'.$errorId.'</pre>
<input type="hidden" name="id" value='.$_POST['id'].'/>
<p>Id: '.$_POST['id'].' </p>
<p>IdCinema: '.$_POST['idcinema'].' </p>
<p>Nombre: '.$_POST['username'].' </p>
<p>Email: '.$_POST['email'].' </p>
<p>Rol: '.$_POST['rol'].' </p>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Eliminar" name="delete_manager" class="primary" />
<input type="submit" id="submit" value="Cancelar" class="primary" />
</div>
</div>';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($datos['id']) ?? null;
if (is_null($id) ) {
$result['id'] = "ERROR. No existe un manager con ese ID";
}
if (count($result) === 0) {
$bd = new Manager_DAO('complucine');
$exist = $bd-> GetManager($id);
if( mysqli_num_rows($exist) == 1){
$bd->deleteManager($id);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha eliminado el gerente correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mg'><button>Cerrar Mensaje</button></a>
</div>
<div class='column side'></div>
</div>";
//$result = './?state=mg';
}
else{
$result[] = "ERROR. No existe un manager con ese ID";
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,90 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/promotion_dao.php');
include_once('../assets/php/includes/promotion.php');
include_once('../assets/php/form.php');
class formDeletePromotion extends Form{
//Constants:
public function __construct() {
$op = array("action" => "./?state=mp");
parent::__construct('formEditPromotion', $op);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html ="";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
//$errorTittle = self::createMensajeError($errores, 'tittle', 'span', array('class' => 'error'));
//$errorDescription = self::createMensajeError($errores, 'description', 'span', array('class' => 'error'));
//$errorCode = self::createMensajeError($errores, 'code', 'span', array('class' => 'error'));
//$errorActive = self::createMensajeError($errores, 'active', 'span', array('class' => 'error'));
//$errorImage = self::createMensajeError($errores, 'image', 'span', array('class' => 'error'));
$html .= '<div class="row">
<h3>ELIMINAR PROMOCIÓN</h3>
<fieldset id="promotion_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>¿Estás seguro de que quieres eliminar esta promocion?</legend>
<input type="hidden" name="id" value='.$_POST['id'].'/><pre>'.$errorId.'</pre>
<p>Id: '.$_POST['id'].' </p>
<p>Nombre: '.$_POST['tittle'].'</p>
<p>Description:'.$_POST['description'].'</p>
<p>Codigo: '.$_POST['code'].'</p>
<p>Activa: '.$_POST['active'].'</p>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Eliminar" name="delete_promotion" class="primary" />
<input type="submit" id="submit" value="Cancelar" class="primary" />
</div>
</div>
</div>';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($_POST['id']) ?? null;
if ( is_null($id)) {
$result['id'] = "La promoción seleccionada no existe.";
}
if (count($result) === 0) {
$bd = new Promotion_DAO("complucine");
$exist = $bd-> promotionData($id);
if(mysqli_num_rows($exist) == 1){
$bd->deletePromotion($id);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha eliminado la promocion correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mp'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mp';
}
else{
$result[] = "La promocion seleccionada no existe.";
}
$exist->free();
}
return $result;
}
}
?>

View File

@ -0,0 +1,101 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/cinema_dao.php');
include_once('../assets/php/includes/cinema.php');
include_once('../assets/php/form.php');
class formEditCinema extends Form{
public function __construct(){
$op = array("action"=>"./?state=mc");
parent::__construct('formAddCinema',$op);
}
protected function generaCamposFormulario($datos,$errores=array()){
$html ="";
if(!isset($_SESSION['message'])) {
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId= self::createMensajeError($errores,'id','span',array('class'=>'error'));
$errorName = self::createMensajeError($errores,'name','span',array('class'=>'error'));
$errorDirection = self::createMensajeError($errores,'direction','span',array('class'=>'error'));
$errrorPhone = self ::createMensajeError($errores,'phone',array('class'=>'error'));
$html .= '<div class="row">
<fieldset id="film_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>Datos de cine </legend>
<input type="hidden" name="id" value='.$_POST['id'].'/>
<input type="text" name="name" value="'.$_POST['name'].'" required/><pre>'.$errorName.'</pre>
<input type="text" name="direction" value="'.$_POST['direction'].'"required/><pre>'.$errorDirection.'</pre>
<input type="text" name="phone" value="'.$_POST['phone'].'"required/><pre>'.$errrorPhone.'</pre>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Editar" name="edit_cinema" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>
</div>
</div> ';
}
return $html;
}
//Process form:
public function procesaFormulario($datos) {
$result =array();
$id = $this->test_input($datos['id']) ?? null;
// if (is_null($id)) {
// $result['id'] = "El cine seleccionado no existe.";
//}
$name = $this->test_input($datos['name'])??null;
if(empty($name)){
$result['name']= "El nombre no es válido";
}
$direction = $this->test_input($datos['direction']) ?? null;
if(empty($direction)){
$result['direction'] = "La dirección no es valida";
}
$phone = $this -> test_input($datos['phone']) ?? null;
if(empty($phone)){
$result['phone'] = "El teléfono no es valido";
}
if(count($result)===0){
$bd = new Cinema_DAO('complucine');
$exist = $bd -> existCinema($id);
if(mysqli_num_rows($exist)==1){
$bd->editCinema($id,$name,$direction,$phone);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha editado el cine correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mc'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mc';
}
else{
$result[] = "El cine seleccionado no existe.";
}
$exist->free();
}
return $result;
}
}
?>

View File

@ -0,0 +1,180 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/film_dao.php');
include_once('../assets/php/includes/film.php');
include_once('../assets/php/form.php');
class formEditFilm extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
const EXTENSIONS = array('gif','jpg','jpe','jpeg','png');
public function __construct() {
$options = array("action" => "./?state=mf", 'enctype' => 'multipart/form-data');
parent::__construct('formEditFilm', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html ="";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
$errorTittle = self::createMensajeError($errores, 'tittle', 'span', array('class' => 'error'));
$errorDuration = self::createMensajeError($errores, 'duration', 'span', array('class' => 'error'));
$errorLanguage = self::createMensajeError($errores, 'language', 'span', array('class' => 'error'));
$errorDescription = self::createMensajeError($errores, 'description', 'span', array('class' => 'error'));
$errorImage = self::createMensajeError($errores, 'img', 'span', array('class' => 'error'));
$html .= '
<div class="row">
<fieldset id="film_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>Datos de pelicula</legend>
<input type="hidden" name="id" value='.$_POST['id'].'/>
<input type="text" name="tittle" value='.$_POST['tittle'].' required/><pre>'.$errorTittle.'</pre>
<input type="number" name="duration" id="duration" value='.$_POST['duration'].' required/><pre>'.$errorDuration.'</pre>
<input type="text" name="language" id="language" value="'.$_POST['language'].'" required/><pre>'.$errorLanguage.'</pre>
<input type="text" name="description" id="description" value="'.$_POST['description'].'"required/><pre>'.$errorDescription.'</pre>
<div class="file">Imagen promocional:<input type="file" name="archivo" id="file" placeholder="Imagen promocional" /></div><pre>'.$errorImage.'</pre>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Editar" name="edit_film" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>
</form>
</div>
<div class="column side"></div>
';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($datos['id']) ?? null;
if (is_null($id)) {
$result[] = "La pelicula seleccionada no existe.";
}
$t = $this->test_input($datos['tittle']) ?? null;
$tittle = strtolower(str_replace(" ", "_", $t));
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $tittle)
if ( empty($tittle) ) {
$result['tittle'] = "El título no es válido";
}
$duration = $this->test_input($datos['duration']) ?? null;
//||!mb_ereg_match(self::HTML5_EMAIL_REGEXP, $duration)
if ( empty($duration) || $duration <0) {
$result['duration'] = "La duración no es válida";
}
$language = $this->test_input($datos['language']) ?? null;
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $language)
if ( empty($language) ) {
$result['language'] = "El idioma no es válido";
}
$description = $this->test_input($datos['description']) ?? null;
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $description)
if ( empty($language)) {
$result['language'] = "La descripcion no es válida";
}
if (count($result) === 0) {
$bd = new Film_DAO("complucine");
$exist = $bd-> existFilm($id);
if( mysqli_num_rows($exist) == 1){
$ok = count($_FILES) == 1 && $_FILES['archivo']['error'] == UPLOAD_ERR_OK;
if ( $ok ) {
$archivo = $_FILES['archivo'];
$nombre = $_FILES['archivo']['name'];
//1.a) Valida el nombre del archivo
$ok = $this->check_file_uploaded_name($nombre) && $this->check_file_uploaded_length($nombre) ;
// 1.b) Sanitiza el nombre del archivo
//$ok = $this->sanitize_file_uploaded_name($nombre);
//
// 1.c) Utilizar un id de la base de datos como nombre de archivo
// 2. comprueba si la extensión está permitida
$ok = $ok && in_array(pathinfo($nombre, PATHINFO_EXTENSION), self::EXTENSIONS);
// 3. comprueba el tipo mime del archivo correspode a una imagen image
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['archivo']['tmp_name']);
$ok = preg_match('/image\/*./', $mimeType);
//finfo_close($finfo);
if ( $ok ) {
$tmp_name = $_FILES['archivo']['tmp_name'];
$nombreBd = strtolower(str_replace(" ", "_", $tittle)).".".pathinfo($nombre, PATHINFO_EXTENSION);
if ( !move_uploaded_file($tmp_name, "../img/films/{$nombreBd}") ) {
$result['img'] = 'Error al mover el archivo';
}
//if ( !copy("../img/tmp/{$nombre}", "/{$nombre}") ) {
// $result['img'] = 'Error al mover el archivo';
//}
//$nombreBd = str_replace("_", " ", $nombre);
$bd->editFilm($id, $tittle, $duration, $language, $description, $nombreBd);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha editado la pelicula correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mf'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mf';
}else {
$result['img'] = 'El archivo tiene un nombre o tipo no soportado';
}
} else {
$bd->editFilmNoImg($id, $tittle, $duration, $language, $description);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha editado la pelicula correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mf'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mf';
}
}
else{
$result[] = "La pelicula seleccionada no existe.";
}
$exist->free();
}
return $result;
}
private function check_file_uploaded_name ($filename) {
return (bool) ((mb_ereg_match('/^[0-9A-Z-_\.]+$/i',$filename) === 1) ? true : false );
}
private function check_file_uploaded_length ($filename) {
return (bool) ((mb_strlen($filename,'UTF-8') < 250) ? true : false);
}
}
?>

View File

@ -0,0 +1,113 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/manager_dao.php');
include_once('../assets/php/includes/manager.php');
include_once('../assets/php/includes/cinema_dao.php');
include_once('../assets/php/form.php');
class formEditManager extends Form{
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "./?state=mg");
parent::__construct('formEditManager', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html ="";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
$errorIdCinema = self::createMensajeError($errores, 'idcinema', 'span', array('class' => 'error'));
$html .= '
<h1>EDITAR GERENTE ID:'.$_POST['id'].'</h1>
<fieldset><pre>'.$htmlErroresGlobales.'</pre>
<legend>Selecciona cine.</legend><pre>'.$errorIdCinema.'</pre>
<input type="hidden" name="id" value='.$_POST['id'].'/><pre>'.$errorId.'</pre>'
.$this->showCinemas().
'</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Seleccionar" name="edit_manager" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($datos['id']) ?? null;
if (is_null($id) ) {
$result['id'] = "ERROR. No existe un usuario con ese ID";
}
$idcinema = $this->test_input($datos['idcinema']) ?? null;
//||!mb_ereg_match(self::HTML5_EMAIL_REGEXP, $duration)
if (is_null($idcinema)) {
$result['idcinema'] = "ERROR. No existe un cine con ese ID";
}
if (count($result) === 0) {
$bd = new Manager_DAO("complucine");
$exist = $bd-> GetManager($id);
if( mysqli_num_rows($exist) == 1){
$bd->editManager($id,$idcinema);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha editado el gerente correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mg'><button>Cerrar Mensaje</button></a>
</div>
<div class='column side'></div>
</div>";
//$result = './?state=mg';
}
else{
$result[] = "ERROR. No existe un cine con ese ID";
}
$exist->free();
}
return $result;
}
private function showCinemas() {
$cine = new Cinema_DAO("complucine");
$cinemas = $cine->allCinemaData();
$ids = array();
$names = array();
$directions = array();
$phones = array();
foreach($cinemas as $key => $value){
$ids[$key] = $value->getId();
$names[$key] = $value->getName();
$directions[$key] = $value->getDirection();
$phones[$key] = $value->getPhone();
}
$html = '';
for($i = 0; $i < count($cinemas); $i++){
$html.= '
<input type="radio" class="content-input" name="idcinema" value="'.$ids[$i].'" id="'.$ids[$i].'"><label class="efe" for="'.$ids[$i].'"> '.$ids[$i].', '.$names[$i].'
</label>
';
}
return $html;
}
}
?>

View File

@ -0,0 +1,183 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
include_once('../assets/php/includes/promotion_dao.php');
include_once('../assets/php/includes/promotion.php');
include_once('../assets/php/form.php');
class formEditPromotion extends Form{
//Constants:
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
const EXTENSIONS = array('gif','jpg','jpe','jpeg','png');
public function __construct() {
$options = array("action" => "./?state=mp", 'enctype' => 'multipart/form-data');
parent::__construct('formEditPromotion', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$html ="";
if (!isset($_SESSION['message'])) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorId = self::createMensajeError($errores, 'id', 'span', array('class' => 'error'));
$errorTittle = self::createMensajeError($errores, 'tittle', 'span', array('class' => 'error'));
$errorDescription = self::createMensajeError($errores, 'description', 'span', array('class' => 'error'));
$errorCode = self::createMensajeError($errores, 'code', 'span', array('class' => 'error'));
$errorActive = self::createMensajeError($errores, 'active', 'span', array('class' => 'error'));
$errorImg = self::createMensajeError($errores, 'img', 'span', array('class' => 'error'));
$html .= '<div class="row">
<h3>EDITAR PROMOCIÓN</h3>
<fieldset id="film_form"><pre>'.$htmlErroresGlobales.'</pre>
<legend>Datos de promocion</legend>
<input type="hidden" name="id" value='.$_POST['id'].'/>
<input type="text" name="tittle" id="tittle"value="'.$_POST['tittle'].'"required/><pre>'.$errorTittle.'</pre>
<input type="text" name="description" id="description" value="'.$_POST['description'].'" required/><pre>'.$errorDescription.'</pre>
<input type="text" name="code" id="code" value="'.$_POST['code'].'" required/><pre>'.$errorCode.'</pre>
<input type="text" name="active" id="active" value="'.$_POST['active'].'"required/><pre>'.$errorActive.'</pre>
<div class="file">Imagen promocional:<input type="file" name="archivo" id="file" placeholder="Imagen promocional" /><pre>'.$errorImg.'</pre></div>
</fieldset>
<div class="actions">
<input type="submit" id="submit" value="Editar promocion" name="edit_promotion" class="primary" />
<input type="reset" id="reset" value="Borrar" />
</div>
</div>
</div>';
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$id = $this->test_input($_POST['id']) ?? null;
if (is_null($id)) {
$result['id'] = "La promoción seleccionada no existe.";
}
$t = $this->test_input($datos['tittle']) ?? null;
$tittle = strtolower(str_replace(" ", "_", $t));
if ( empty($tittle) ) {
$result['tittle'] = "El título no es válido";
}
$description = $this->test_input($datos['description']) ?? null;
if ( empty($description)) {
$result['description'] = "La descripcion no es válida";
}
$code = $this->test_input($datos['code']) ?? null;
if ( empty($code) ) {
$result['code'] = "El idioma no es válido";
}
$active = strtolower($this->test_input($datos['active'])) ?? null;
//|| !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $description)
if ( strcmp($active,"si") == 0 || strcmp($active,"no") == 0) {
if ( strcmp($active,"si") == 0 ) {
$boolean = 1;
}
else {
$boolean = 0;
}
}
else {
$result['active'] = "El valor activo debe ser si/no";
}
if (count($result) === 0) {
$bd = new Promotion_DAO("complucine");
$exist = $bd-> promotionData($id);
if(mysqli_num_rows($exist) == 1){
$ok = count($_FILES) == 1 && $_FILES['archivo']['error'] == UPLOAD_ERR_OK;
if ( $ok ) {
$archivo = $_FILES['archivo'];
$nombre = $_FILES['archivo']['name'];
//1.a) Valida el nombre del archivo
$ok = $this->check_file_uploaded_name($nombre) && $this->check_file_uploaded_length($nombre) ;
// 1.b) Sanitiza el nombre del archivo
//$ok = $this->sanitize_file_uploaded_name($nombre);
//
// 1.c) Utilizar un id de la base de datos como nombre de archivo
// 2. comprueba si la extensión está permitida
$ok = $ok && in_array(pathinfo($nombre, PATHINFO_EXTENSION), self::EXTENSIONS);
// 3. comprueba el tipo mime del archivo correspode a una imagen image
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['archivo']['tmp_name']);
$ok = preg_match('/image\/*./', $mimeType);
//finfo_close($finfo);
if ( $ok ) {
$tmp_name = $_FILES['archivo']['tmp_name'];
$nombreBd = strtolower(str_replace(" ", "_", $tittle)).".".pathinfo($nombre, PATHINFO_EXTENSION);
if ( !move_uploaded_file($tmp_name, "../img/promos/{$nombreBd}") ) {
$result['img'] = 'Error al mover el archivo';
}
//if ( !copy("../img/tmp/{$nombre}", "/{$nombre}") ) {
// $result['img'] = 'Error al mover el archivo';
//}
//$nombreBd = str_replace("_", " ", $nombre);
$bd->editPromotion($id, $tittle,$description,$code,$boolean, $nombreBd);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha modificado la promocion correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mp'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mp';
}else {
$result['img'] = 'El archivo tiene un nombre o tipo no soportado';
}
} else {
$bd->editPromotionNoImg($id, $tittle,$description,$code,$boolean);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion realizada con exito </h1><hr />
<p> Se ha modificado la promocion correctamente en la base de datos.</p>
<a href='../panel_admin/index.php?state=mp'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
//$result = './?state=mp';
}
}
else{
$result[] = "La promocion seleccionada no existe.";
}
$exist->free();
}
return $result;
}
private function check_file_uploaded_name ($filename) {
return (bool) ((mb_ereg_match('/^[0-9A-Z-_\.]+$/i',$filename) === 1) ? true : false );
}
private function check_file_uploaded_length ($filename) {
return (bool) ((mb_strlen($filename,'UTF-8') < 250) ? true : false);
}
}
?>

110
panel_admin/index.php Normal file
View File

@ -0,0 +1,110 @@
<?php
//General Config File:
include_once('../assets/php/config.php');
require_once($prefix.'panel_admin/panelAdmin.php');
if(($_SESSION["login"]) && $_SESSION["rol"] == "admin"){
if(!isset($_GET["state"]))
$_GET["state"] =null;
switch($_GET["state"]){
case 'mc': if(isset($_POST['edit_cinema'])) {
$reply=AdminPanel::editCinema();
}
else if(isset($_POST['delete_cinema'])) {
$reply=AdminPanel::deleteCinema();
}
else {
if(isset($_GET["cinema"])){
if(isset($_GET["cinema"])){
if(isset($_GET["number"])) {
$reply = AdminPanel::showSessions($_GET["cinema"]);
}
else {
$reply = AdminPanel::showHalls($_GET["cinema"]);
}
}
}
else {
$reply=AdminPanel::addCinema();
$reply.= ($template->print_cinemas());
}
};
break;
case 'mf': if(isset($_POST['edit_film'])) {
$reply=AdminPanel::editFilm();
}
else if(isset($_POST['delete_film'])) {
$reply=AdminPanel::deleteFilm();
}
else {
$reply=AdminPanel::addFilm();
$reply.= $template->print_fimls();
};
break;
case 'mp':
if(isset($_POST['edit_promotion'])) {
$reply=AdminPanel::editPromotion();
}
else if(isset($_POST['delete_promotion'])) {
$reply=AdminPanel::deletePromotion();
}
else {
$reply=AdminPanel::addPromotion();
$reply.=AdminPanel::print_promotions();
};
break;
case 'mg': if(isset($_POST['edit_manager'])) {
$reply=AdminPanel::editManager();
}
else if(isset($_POST['delete_manager'])) {
$reply=AdminPanel::deleteManager();
}
else if(isset($_POST['add_manager'])) {
$reply=AdminPanel::addManager();
}
else {
$reply=AdminPanel::print_managers();
$reply.=AdminPanel::showAddBotton();
};
break;
case 'un':
$reply=AdminPanel::see_like_user();
break;
case 'ur':
$reply=AdminPanel::see_like_registed_user();
break;
case 'ag':
$reply=AdminPanel::see_like_manager();
break;
default:
$reply=AdminPanel:: panel();
break;
}
}
else{
$reply ='<div class="column side"></div>
<div class="column middle">
<div class="code info">
<h1>No tienes permiso de administrador.</h1><hr />
<p>Inicia Sesión con una cuenta de administtación.</p>
<a href="'.$prefix.'login/"><button>Iniciar Sesión</button></a>
</div>
</div>
<div class="column side"></div>'."\n";
}
$section = '<!-- Manager Admin -->
<section id="admin_panel">
<!-- Contents -->
<div class="row">
'.$reply.'
</div>
</section>';
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,505 @@
<?php
class AdminPanel {
private $state;
private $login;
private $prefix;
function __construct(){}
function getTemplate(){
return $this->template;
}
static function panel(){
include_once('../assets/php/includes/user.php');
$name = strtoupper(unserialize($_SESSION['user'])->getName());
$email = unserialize($_SESSION['user'])->getEmail();
$userPic = USER_PICS.strtolower($name).".jpg";
return $reply= '<div class="code info">
<h1>Bienvenido al Panel de Administrador.</h1>
<hr />
<img src='.$userPic.' alt="user_profile_picture"/>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<p>Administrador: '.$name.'</p>
<p>Email empresarial: '.$email.'</p>
</div>'."\n";
}
//Functions FILMS
static function addFilm(){
include_once('./includes/formAddFilm.php');
$formAF = new formAddFilm();
$htmlAForm = $formAF->gestiona();
return $reply= '<!-- Add film -->
<div class="column side"></div>
<div class="column middle">
'.$htmlAForm."\n";
}
static function deleteFilm() {
include_once('./includes/formDeleteFilm.php');
$formDF = new formDeleteFilm();
$htmlDForm = $formDF->gestiona();
return $reply= '<!-- Add film -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function editFilm() {
include_once('./includes/formEditFilm.php');
$formEF = new formEditFilm();
$htmlDForm = $formEF->gestiona();
return $reply= '<!-- Add film -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
//Functions Cinemas
static function addCinema(){
include_once('./includes/formAddCinema.php');
$formAC = new formAddCinema();
$htmlAForm = $formAC->gestiona();
return $reply= '<!-- Add cinema -->
<div class="column side"></div>
<div class="column middle">
'.$htmlAForm.'
</div>'."\n";
}
static function deleteCinema() {
include_once('./includes/formDeleteCinema.php');
$formDC = new formDeleteCinema();
$htmlDForm = $formDC->gestiona();
return $reply= '<!-- Delete cinema -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function editCinema() {
include_once('./includes/formEditCinema.php');
$formEC = new formEditCinema();
$htmlDForm = $formEC->gestiona();
return $reply= '<!-- Edit cinema -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function showHalls($idCinema) {
include_once('../assets/php/includes/hall.php');
include_once('../assets/php/includes/hall_dao.php');
$panel = '<div class="column side"></div>
<div class="column middle">';
$listhall = Hall::getListHalls($idCinema);
if(!$listhall){
$panel .= "<h2> No hay ninguna sala en este cine";
}else{
$panel .= '
<div class="row">
<ul class="tablelist col3">
<li class="title"> Sala </li>
<li class="title"> Asientos </li>
<li class="title"> Sesión </li>
';
$parity = "odd";
foreach($listhall as $hall){
$panel .='<div class="'.$parity.'">
<li> '. $hall->getNumber().'</li>
<li> '.$hall->getTotalSeats().' </li>
</a>
<a href="?state=mc&cinema='.$idCinema.'&number=1">
<li> Sesiones </li>
</a>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
}
$panel.='
</ul>';
}
$panel.='
</div>
<div class="column side"></div>';
return $panel;
}
static function showSessions($idCinema){
include_once('../assets/php/includes/hall.php');
include_once('../assets/php/includes/hall_dao.php');
include_once('../assets/php/includes/session_dao.php');
include_once('../assets/php/includes/session.php');
//Base filtering values
$date = $_POST['date'] ?? $_GET['date'] ?? date("Y-m-d");
$hall = $_POST['hall'] ?? $_GET['hall'] ?? "1";
//Session filter
$panel='<div class = "column left">
<form method="post" id="filter" action="?state=mc&cinema=1&number=1">
<input type="date" name="date" value="'.$date.'" min="2021-01-01" max="2031-12-31">
<select name="hall" class="button large">';
foreach(Hall::getListHalls($idCinema) as $hll){
if($hll->getNumber() == $hall){
$panel.= '
<option value="'. $hll->getNumber() .'"selected> Sala '. $hll->getNumber() .'</option> ';
}else{
$panel.= '
<option value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
}
$panel.='
</select>
<input type="submit" name="filter" value="Filtrar" class="button large"/>
</form>
</div>
';
//Session list
$panel .=' <div class = "column right">';
$sessions = Session::getListSessions($hall,$idCinema,$date);
if($sessions) {
$panel .='
<form method="post" action="./?state=edit_session">
<table class="alt">
<thead>
<tr>
<th>Hora</th>
<th>Pelicula</th>
<th>Formato</th>
<th>Precio</th>
</tr>
</thead>
<tbody>';
foreach($sessions as $session){
$film = Session::getThisSessionFilm($session->getIdfilm());
$panel .='
<tr>
<td> '.date("H:i", strtotime( $session->getStartTime())).' </td>
<td> '. str_replace('_', ' ', $film["tittle"]) .' </td>
<td> '.$session->getFormat().' </td>
<td> '.$session->getSeatPrice().' </td>
</tr>';
}
$panel.='
</tbody>
</table>
</form>';
} else {
$panel.=' <h3> No hay ninguna sesion </h3>';
}
$panel.='</div>';
return $panel;
}
//Functions MANAGERS
static function print_managers(){
include_once('../assets/php/includes/manager_dao.php');
include_once('../assets/php/includes/manager.php');
$manager = new Manager_DAO("complucine");
$managers = $manager->allManagersData();
$ids = array();
$idscinemas = array();
$usernames = array();
$email = array();
$rol = array();
if(!is_array($managers)){
$reply = "<h2> No hay ningun manager</h2>";
}
else{
foreach($managers as $key => $value){
$ids[$key] = $value->getId();
$idscinemas[$key] = $value->getIdcinema();
$usernames[$key] = $value->getUsername();
$email[$key] = $value->getEmail();
$rol[$key] = $value->getRoll();
}
$reply= "<div class='row'>
<ul class ='tablelist col7'>
<li class='title'>Id</li>
<li class='title'>IdCinema</li>
<li class='title'>Nombre</li>
<li class='title'>Email</li>
<li class='title'>Rol</li>
<li class='title'>Editar</li>
<li class='title'>Eliminar</li>
";
$parity = "odd";
for($i = 0; $i < count($managers); $i++){
$reply.= '
<div class="'.$parity.'">
<li>'. $ids[$i] .'</li>
<li>'. $idscinemas[$i] .'</li>
<li>'. $usernames[$i] .'</li>
<li>'. $email[$i] .'</li>
<li>'. $rol[$i] .'</li>
<li>
<form method="post" action="index.php?state=mg">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="idcinema" type="hidden" value="'.$idscinemas[$i].'">
<input type="submit" id="submit" value="Editar" name="edit_manager" class="primary" />
</form>
</li>
<li>
<form method="post" action="index.php?state=mg">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="idcinema" type="hidden" value="'.$idscinemas[$i].'">
<input name="username" type="hidden" value="'.$usernames[$i].'">
<input name="email" type="hidden" value="'.$email[$i].'">
<input name="rol" type="hidden" value="'.$rol[$i].'">
<input type="submit" id="submit" value="Eliminar" name="delete_manager" class="primary" />
</form>
</li>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
}
$reply.='</ul>
</div>
';
}
return $reply;
}
static function showAddBotton() {
return $reply = '<div class="column side"></div>
<div class="column middle">
<h2>Añadir gerente</h2>
<form method="post" action="index.php?state=mg">
<div class="actions">
<input type="submit" id="submit" value="Añadir gerente" name="add_manager" class="primary" />
</div>
</form>
</div>
<div class="column side"></div>
</div>
';
}
static function addManager(){
include_once('./includes/formAddManager.php');
$formAM = new formAddManager();
$htmlAForm = $formAM->gestiona();
return $reply= '<!-- ADD MANAGER -->
<div class="column side"></div>
<div class="column middle">
<h3>AÑADIR GERENTE</h3>
'.$htmlAForm.'
</div>
<div class="column side"></div>'."\n";
}
static function editManager(){
include_once('./includes/formEditManager.php');
$formEM = new formEditManager();
$htmlEForm = $formEM->gestiona();
return $reply= '<!-- EDIT MANAGER -->
<div class="column side"></div>
<div class="column middle">
'.$htmlEForm.'
</div>';
}
static function deleteManager(){
include_once('./includes/formDeleteManager.php');
$formDM = new formDeleteManager();
$htmlDForm = $formDM->gestiona();
return $reply= '<!-- DELETE MANAGER -->
<div class="column side"></div>
<div class="column middle">
<h3>ELIMINAR GERENTE</h3>
'.$htmlDForm.'
</div>
<div class="column side"></div>'."\n";
}
//Functions PROMOTIONS
static function addPromotion(){
include_once('./includes/formAddPromotion.php');
$formAP = new formAddPromotion();
$htmlAForm = $formAP->gestiona();
return $reply= '<!-- ADD PROMOTION -->
<div class="column side"></div>
<div class="column middle">
<h3>AÑADIR PROMOCIÓN</h3>
'.$htmlAForm.'
</div>';
}
static function editPromotion(){
include_once('./includes/formEditPromotion.php');
$formEP = new formEditPromotion();
$htmlEForm = $formEP->gestiona();
return $reply= '<!-- EDIT MANAGER -->
<div class="column side"></div>
<div class="column middle">
<h3>EDITAR PROMOCIÓN</h3>
'.$htmlEForm.'
</div>
<div class="column side"></div>'."\n";
}
static function deletePromotion(){
include_once('./includes/formDeletePromotion.php');
$formDP = new formDeletePromotion();
$htmlDForm = $formDP->gestiona();
return $reply= '<!-- DELETE MANAGER -->
<div class="column side"></div>
<div class="column middle">
<h3>ELIMINAR PROMOCIÓN</h3>
'.$htmlDForm.'
</div>'."\n";
}
static function print_promotions(){
$promo = new Promotion_DAO("complucine");
$promos = $promo->allPromotionData();
$ids = array();
$tittles = array();
$descriptions = array();
$codes = array();
$actives = array();
if(!is_array($promos)){
$reply = "<h2> No hay promociones </h2>";
}
else{
foreach($promos as $key => $value){
$ids[$key] = $value->getId();
$tittles[$key] = $value->getTittle();
$descriptions[$key] = $value->getDescription();
$codes[$key] = $value->getCode();
if ($value->getActive() == 0) {
$actives[$key] = "si";
}
else{
$actives[$key] = "no";
}
}
$reply= "<div class='row'>
<ul class='tablelist col7'>
<li class='title'>Id</li>
<li class='title'>Título</li>
<li class='title'>Descripcion</li>
<li class='title'>Código</li>
<li class='title'>Activo</li>
<li class='title'>Editar</li>
<li class='title'>Eliminar</li>
";
$parity ="odd";
for($i = 0; $i < count($promos); $i++){
$reply.= '
<li>'. $ids[$i] .'</li>
<li>'. $tittles[$i] .'</li>
<li>'. $descriptions[$i] .'</li>
<li>'. $codes[$i] .'</li>
<li>'. $actives[$i] .'</li>
<li>
<form method="post" action="index.php?state=mp">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="tittle" type="hidden" value="'.$tittles[$i].'">
<input name="description" type="hidden" value="'.$descriptions[$i].'">
<input name="code" type="hidden" value="'.$codes[$i].'">
<input name="active" type="hidden" value="'.$actives[$i].'">
<input type="submit" id="submit" value="Editar" name="edit_promotion" class="primary" />
</form>
<li>
<form method="post" action="index.php?state=mp">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="tittle" type="hidden" value="'.$tittles[$i].'">
<input name="description" type="hidden" value="'.$descriptions[$i].'">
<input name="code" type="hidden" value="'.$codes[$i].'">
<input name="active" type="hidden" value="'.$actives[$i].'">
<input type="submit" id="submit" value="Eliminar" name="delete_promotion" class="primary" />
</form>
</li>
</li>
</div>
';
$parity = ($parity=="odd")? "even":"odd";
}
$reply.='</ul>
</div>
';
}
return $reply ;
}
static function see_like_user(){
$_SESSION["lastRol"] = $_SESSION["rol"];
//unset($_SESSION["rol"]);
$_SESSION["rol"] = null;
//header("Location: {$_SERVER['PHP_SELF']}");
return $reply = "<div class=''>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario NO Registrado.</p>
<a href='../../'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
static function see_like_registed_user(){
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = "user";
//header("Location: {$_SERVER['PHP_SELF']}");
return $reply = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario Registrado.</p>
<a href='../../panel_user'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
static function see_like_manager(){
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = "manager";
//header("Location: {$_SERVER['PHP_SELF']}");
return $reply = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Gerente.</p>
<a href='../../panel_manager'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
}
?>

500
panel_admin/panelAdmin.php Normal file
View File

@ -0,0 +1,500 @@
<?php
class AdminPanel {
private $state;
private $login;
private $prefix;
function __construct(){}
function getTemplate(){
return $this->template;
}
static function panel(){
include_once('../assets/php/includes/user.php');
$name = strtoupper(unserialize($_SESSION['user'])->getName());
$email = unserialize($_SESSION['user'])->getEmail();
$userPic = USER_PICS.strtolower($name).".jpg";
return $reply= '<div class="code info">
<h1>Bienvenido al Panel de Administrador.</h1>
<hr />
<img src='.$userPic.' alt="user_profile_picture"/>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<p>Administrador: '.$name.'</p>
<p>Email empresarial: '.$email.'</p>
</div>'."\n";
}
//Functions FILMS
static function addFilm(){
include_once('./includes/formAddFilm.php');
$formAF = new formAddFilm();
$htmlAForm = $formAF->gestiona();
return $reply= '<!-- Add film -->
<div class="column side"></div>
<div class="column middle">
'.$htmlAForm."\n";
}
static function deleteFilm() {
include_once('./includes/formDeleteFilm.php');
$formDF = new formDeleteFilm();
$htmlDForm = $formDF->gestiona();
return $reply= '<!-- Add film -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function editFilm() {
include_once('./includes/formEditFilm.php');
$formEF = new formEditFilm();
$htmlDForm = $formEF->gestiona();
return $reply= '<!-- Add film -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
//Functions Cinemas
static function addCinema(){
include_once('./includes/formAddCinema.php');
$formAC = new formAddCinema();
$htmlAForm = $formAC->gestiona();
return $reply= '<!-- Add cinema -->
<div class="column side"></div>
<div class="column middle">
'.$htmlAForm.'
</div>'."\n";
}
static function deleteCinema() {
include_once('./includes/formDeleteCinema.php');
$formDC = new formDeleteCinema();
$htmlDForm = $formDC->gestiona();
return $reply= '<!-- Delete cinema -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function editCinema() {
include_once('./includes/formEditCinema.php');
$formEC = new formEditCinema();
$htmlDForm = $formEC->gestiona();
return $reply= '<!-- Edit cinema -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function showHalls($idCinema) {
include_once('../assets/php/includes/hall.php');
include_once('../assets/php/includes/hall_dao.php');
$panel = '<div class="column side"></div>
<div class="column middle">';
$listhall = Hall::getListHalls($idCinema);
if(!$listhall){
$panel .= "<h2> No hay ninguna sala en este cine";
}else{
$panel .= '
<div class="row">
<ul class="tablelist col3">
<li class="title"> Sala </li>
<li class="title"> Asientos </li>
<li class="title"> Sesión </li>
';
$parity = "odd";
foreach($listhall as $hall){
$panel .='<div class="'.$parity.'">
<li> '. $hall->getNumber().'</li>
<li> '.$hall->getTotalSeats().' </li>
</a>
<a href="?state=mc&cinema='.$idCinema.'&number=1">
<li> Sesiones </li>
</a>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
}
$panel.='
</ul>';
}
$panel.='
</div>
<div class="column side"></div>';
return $panel;
}
static function showSessions($idCinema){
include_once('../assets/php/includes/hall.php');
include_once('../assets/php/includes/hall_dao.php');
include_once('../assets/php/includes/session_dao.php');
include_once('../assets/php/includes/session.php');
//Base filtering values
$date = $_POST['date'] ?? $_GET['date'] ?? date("Y-m-d");
$hall = $_POST['hall'] ?? $_GET['hall'] ?? "1";
//Session filter
$panel='<div class = "column left">
<form method="post" id="filter" action="?state=mc&cinema=1&number=1">
<input type="date" name="date" value="'.$date.'" min="2021-01-01" max="2031-12-31">
<select name="hall" class="button large">';
foreach(Hall::getListHalls($idCinema) as $hll){
if($hll->getNumber() == $hall){
$panel.= '
<option value="'. $hll->getNumber() .'"selected> Sala '. $hll->getNumber() .'</option> ';
}else{
$panel.= '
<option value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
}
$panel.='
</select>
<input type="submit" name="filter" value="Filtrar" class="button large"/>
</form>
</div>
';
//Session list
$panel .=' <div class = "column right">';
$sessions = Session::getListSessions($hall,$idCinema,$date);
if($sessions) {
$panel .='
<form method="post" action="./?state=edit_session">
<table class="alt">
<thead>
<tr>
<th>Hora</th>
<th>Pelicula</th>
<th>Formato</th>
<th>Precio</th>
</tr>
</thead>
<tbody>';
foreach($sessions as $session){
$film = Session::getThisSessionFilm($session->getIdfilm());
$panel .='
<tr>
<td> '.date("H:i", strtotime( $session->getStartTime())).' </td>
<td> '. str_replace('_', ' ', $film["tittle"]) .' </td>
<td> '.$session->getFormat().' </td>
<td> '.$session->getSeatPrice().' </td>
</tr>';
}
$panel.='
</tbody>
</table>
</form>';
} else {
$panel.=' <h3> No hay ninguna sesion </h3>';
}
$panel.='</div>';
return $panel;
}
//Functions MANAGERS
static function print_managers(){
include_once('../assets/php/includes/manager_dao.php');
include_once('../assets/php/includes/manager.php');
$manager = new Manager_DAO("complucine");
$managers = $manager->allManagersData();
$ids = array();
$idscinemas = array();
$usernames = array();
$email = array();
$rol = array();
if(!is_array($managers)){
$reply = "<h2> No hay ningun manager</h2>";
}
else{
foreach($managers as $key => $value){
$ids[$key] = $value->getId();
$idscinemas[$key] = $value->getIdcinema();
$usernames[$key] = $value->getUsername();
$email[$key] = $value->getEmail();
$rol[$key] = $value->getRoll();
}
$reply= "<div class='row'>
<ul class ='tablelist col7'>
<li class='title'>Id</li>
<li class='title'>IdCinema</li>
<li class='title'>Nombre</li>
<li class='title'>Email</li>
<li class='title'>Rol</li>
<li class='title'>Editar</li>
<li class='title'>Eliminar</li>
";
$parity = "odd";
for($i = 0; $i < count($managers); $i++){
$reply.= '
<div class="'.$parity.'">
<li>'. $ids[$i] .'</li>
<li>'. $idscinemas[$i] .'</li>
<li>'. $usernames[$i] .'</li>
<li>'. $email[$i] .'</li>
<li>'. $rol[$i] .'</li>
<li>
<form method="post" action="index.php?state=mg">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="idcinema" type="hidden" value="'.$idscinemas[$i].'">
<input type="submit" id="submit" value="Editar" name="edit_manager" class="primary" />
</form>
</li>
<li>
<form method="post" action="index.php?state=mg">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="idcinema" type="hidden" value="'.$idscinemas[$i].'">
<input name="username" type="hidden" value="'.$usernames[$i].'">
<input name="email" type="hidden" value="'.$email[$i].'">
<input name="rol" type="hidden" value="'.$rol[$i].'">
<input type="submit" id="submit" value="Eliminar" name="delete_manager" class="primary" />
</form>
</li>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
}
$reply.='</ul>
</div>
';
}
return $reply;
}
static function showAddBotton() {
return $reply = '<div class="column side"></div>
<div class="column middle">
<h2>Añadir gerente</h2>
<form method="post" action="index.php?state=mg">
<div class="actions">
<input type="submit" id="submit" value="Añadir gerente" name="add_manager" class="primary" />
</div>
</form>
</div>
<div class="column side"></div>
</div>
';
}
static function addManager(){
include_once('./includes/formAddManager.php');
$formAM = new formAddManager();
$htmlAForm = $formAM->gestiona();
return $reply= '<!-- ADD MANAGER -->
<div class="column side"></div>
<div class="column middle">
'.$htmlAForm.'
</div>
<div class="column side"></div>'."\n";
}
static function editManager(){
include_once('./includes/formEditManager.php');
$formEM = new formEditManager();
$htmlEForm = $formEM->gestiona();
return $reply= '<!-- EDIT MANAGER -->
<div class="column side"></div>
<div class="column middle">
'.$htmlEForm.'
</div>';
}
static function deleteManager(){
include_once('./includes/formDeleteManager.php');
$formDM = new formDeleteManager();
$htmlDForm = $formDM->gestiona();
return $reply= '<!-- DELETE MANAGER -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>
<div class="column side"></div>'."\n";
}
//Functions PROMOTIONS
static function addPromotion(){
include_once('./includes/formAddPromotion.php');
$formAP = new formAddPromotion();
$htmlAForm = $formAP->gestiona();
return $reply= '<!-- ADD PROMOTION -->
<div class="column side"></div>
<div class="column middle">
'.$htmlAForm.'
</div>';
}
static function editPromotion(){
include_once('./includes/formEditPromotion.php');
$formEP = new formEditPromotion();
$htmlEForm = $formEP->gestiona();
return $reply= '<!-- EDIT MANAGER -->
<div class="column side"></div>
<div class="column middle">
'.$htmlEForm.'
</div>
<div class="column side"></div>'."\n";
}
static function deletePromotion(){
include_once('./includes/formDeletePromotion.php');
$formDP = new formDeletePromotion();
$htmlDForm = $formDP->gestiona();
return $reply= '<!-- DELETE MANAGER -->
<div class="column side"></div>
<div class="column middle">
'.$htmlDForm.'
</div>'."\n";
}
static function print_promotions(){
$promo = new Promotion_DAO("complucine");
$promos = $promo->allPromotionData();
$ids = array();
$tittles = array();
$descriptions = array();
$codes = array();
$actives = array();
if(!is_array($promos)){
$reply = "<h2> No hay promociones </h2>";
}
else{
foreach($promos as $key => $value){
$ids[$key] = $value->getId();
$tittles[$key] = $value->getTittle();
$descriptions[$key] = $value->getDescription();
$codes[$key] = $value->getCode();
if ($value->getActive() == 0) {
$actives[$key] = "no";
}
else{
$actives[$key] = "si";
}
}
$reply= "<div class='row'>
<ul class='tablelist col7'>
<li class='title'>Id</li>
<li class='title'>Título</li>
<li class='title'>Descripcion</li>
<li class='title'>Código</li>
<li class='title'>Activo</li>
<li class='title'>Editar</li>
<li class='title'>Eliminar</li>
";
$parity ="odd";
for($i = 0; $i < count($promos); $i++){
$reply.= '
<div class="'.$parity.'">
<li>'. $ids[$i] .'</li>
<li>'. $tittles[$i] .'</li>
<li>'. $descriptions[$i] .'</li>
<li>'. $codes[$i] .'</li>
<li>'. $actives[$i] .'</li>
<li>
<form method="post" action="index.php?state=mp">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="tittle" type="hidden" value="'.$tittles[$i].'">
<input name="description" type="hidden" value="'.$descriptions[$i].'">
<input name="code" type="hidden" value="'.$codes[$i].'">
<input name="active" type="hidden" value="'.$actives[$i].'">
<input type="submit" id="submit" value="Editar" name="edit_promotion" class="primary" />
</form>
<li>
<form method="post" action="index.php?state=mp">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="tittle" type="hidden" value="'.$tittles[$i].'">
<input name="description" type="hidden" value="'.$descriptions[$i].'">
<input name="code" type="hidden" value="'.$codes[$i].'">
<input name="active" type="hidden" value="'.$actives[$i].'">
<input type="submit" id="submit" value="Eliminar" name="delete_promotion" class="primary" />
</form>
</li>
</li>
</div>
';
$parity = ($parity=="odd")? "even":"odd";
}
$reply.='</ul>
</div>
';
}
return $reply ;
}
static function see_like_user(){
$_SESSION["lastRol"] = $_SESSION["rol"];
//unset($_SESSION["rol"]);
$_SESSION["rol"] = null;
//header("Location: {$_SERVER['PHP_SELF']}");
return $reply = "<div class=''>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario NO Registrado.</p>
<a href='../../'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
static function see_like_registed_user(){
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = "user";
//header("Location: {$_SERVER['PHP_SELF']}");
return $reply = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario Registrado.</p>
<a href='../../panel_user'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
static function see_like_manager(){
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = "manager";
//header("Location: {$_SERVER['PHP_SELF']}");
return $reply = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Gerente.</p>
<a href='../../panel_manager'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
}
?>

616
panel_manager/Evento.php Normal file
View File

@ -0,0 +1,616 @@
<?php
include_once($prefix.'assets/php/includes/session.php');
/**
* Representa un evento de calendario.
*/
class Evento implements \JsonSerializable
{
/**
* Busca todos los eventos de un usuario con id $userId.
*
* @param int $userId Id del usuario a buscar.
*
* @return array[Evento] Lista de eventos del usuario con id $userId.
*/
public static function buscaTodosEventos(int $userId, $idhall, $cinema)
{
if (!$userId) {
// throw new \BadMethodCallException('$userId no puede ser nulo.');
}
$result = [];
$sessions = Session::getListSessions($idhall,$cinema,null);
foreach($sessions as $s){
$e = new Evento();
$diccionario = self::session2dictionary($s);
$e = $e->asignaDesdeDiccionario($diccionario);
$result[] = $e;
}
return $result;
}
/**
* Busca un evento con id $idEvento.
*
* @param int $idEvento Id del evento a buscar.
*
* @return Evento Evento encontrado.
*/
public static function buscaPorId(int $idEvento, $idhall, $cinema)
{
if (!$idEvento) {
throw new \BadMethodCallException('$idEvento no puede ser nulo.');
}
$result = null;
$app = App::getSingleton();
$conn = $app->conexionBd();
$query = sprintf("SELECT E.id, E.title, E.userId, E.startDate AS start, E.endDate AS end FROM Eventos E WHERE E.id = %d", $idEvento);
$rs = $conn->query($query);
if ($rs && $rs->num_rows == 1) {
while($fila = $rs->fetch_assoc()) {
$result = new Evento();
$result->asignaDesdeDiccionario($fila);
}
$rs->free();
} else {
if ($conn->affected_rows == 0) {
throw new EventoNoEncontradoException("No se ha encontrado el evento: ".$idEvento);
}
throw new DataAccessException("Se esperaba 1 evento y se han obtenido: ".$rs->num_rows);
}
return $result;
}
/**
* Busca los eventos de un usuario con id $userId en el rango de fechas $start y $end (si se proporciona).
*
* @param int $userId Id del usuario para el que se buscarán los eventos.
* @param string $start Fecha a partir de la cual se buscarán eventos (@link MYSQL_DATE_TIME_FORMAT)
* @param string|null $end Fecha hasta la que se buscarán eventos (@link MYSQL_DATE_TIME_FORMAT)
*
* @return array[Evento] Lista de eventos encontrados.
*/
public static function buscaEntreFechas(int $userId, string $start, string $end = null, $idhall, $cinema)
{
if (!$userId) {
//throw new \BadMethodCallException('$userId no puede ser nulo.');
}
$startDate = \DateTime::createFromFormat(self::MYSQL_DATE_TIME_FORMAT, $start);
if (!$startDate) {
// throw new \BadMethodCallException('$diccionario[\'start\'] no sigue el formato válido: '.self::MYSQL_DATE_TIME_FORMAT);
}
$endDate = null;
if ($end) {
$endDate = \DateTime::createFromFormat(self::MYSQL_DATE_TIME_FORMAT, $end);
if (!$endDate) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no sigue el formato válido: '.self::MYSQL_DATE_TIME_FORMAT);
}
}
if ($endDate) {
}
$result = [];
$sessions = Session::getListSessionsBetween2Dates($idhall,$cinema,$startDate,$endDate);
foreach($sessions as $s){
$e = new Evento();
$diccionario = self::session2dictionary($s);
$e = $e->asignaDesdeDiccionario($diccionario);
$result[] = $e;
}
return $result;
}
/**
* Guarda o actualiza un evento $evento en la BD.
*
* @param Evento $evento Evento a guardar o actualizar.
*/
public static function guardaOActualiza(Evento $evento)
{
if (!$evento) {
throw new \BadMethodCallException('$evento no puede ser nulo.');
}
$result = false;
$app = App::getSingleton();
$conn = $app->conexionBd();
if (!$evento->id) {
$query = sprintf("INSERT INTO Eventos (userId, title, startDate, endDate) VALUES (%d, '%s', '%s', '%s')"
, $evento->userId
, $conn->real_escape_string($evento->title)
, $evento->start->format(self::MYSQL_DATE_TIME_FORMAT)
, $evento->end->format(self::MYSQL_DATE_TIME_FORMAT));
$result = $conn->query($query);
if ($result) {
$evento->id = $conn->insert_id;
$result = $evento;
} else {
throw new DataAccessException("No se ha podido guardar el evento");
}
} else {
$query = sprintf("UPDATE Eventos E SET userId=%d, title='%s', startDate='%s', endDate='%s' WHERE E.id = %d"
, $evento->userId
, $conn->real_escape_string($evento->title)
, $evento->start->format(self::MYSQL_DATE_TIME_FORMAT)
, $evento->end->format(self::MYSQL_DATE_TIME_FORMAT)
, $evento->id);
$result = $conn->query($query);
if ($result) {
$result = $evento;
} else {
throw new DataAccessException("Se han actualizado más de 1 fila cuando sólo se esperaba 1 actualización: ".$conn->affected_rows);
}
}
return $result;
}
/**
* Borra un evento id $idEvento.
*
* @param int $idEvento Id del evento a borrar.
*
*/
public static function borraPorId(int $idEvento)
{
if (!$idEvento) {
throw new \BadMethodCallException('$idEvento no puede ser nulo.');
}
$result = false;
$app = App::getSingleton();
$conn = $app->conexionBd();
$query = sprintf('DELETE FROM Eventos WHERE id=%d', $idEvento);
$result = $conn->query($query);
if ($result && $conn->affected_rows == 1) {
$result = true;
} else {
if ($conn->affected_rows == 0) {
throw new EventoNoEncontradoException("No se ha encontrado el evento: ".$idEvento);
}
throw new DataAccessException("Se esperaba borrar 1 fila y se han borrado: ".$conn->affected_rows);
}
return $result;
}
/**
* Crear un evento asociado a un usuario $userId y un título $title.
* El comienzo es la fecha y hora actual del sistema y el fin es una hora más tarde.
*
* @param int $userId Id del propietario del evento.
* @param string $title Título del evento.
*
*/
public static function creaSimple(int $userId, string $title)
{
$start = new \DateTime();
$end = $start->add(new \DateInterval('PT1H'));
return self::creaDetallado($userId, $title, $start, $end);
}
/**
* Crear un evento asociado a un usuario $userId, un título $title y una fecha y hora de comienzo.
* El fin es una hora más tarde de la hora de comienzo.
*
* @param int $userId Id del propietario del evento.
* @param string $title Título del evento.
* @param DateTime $start Fecha y horas de comienzo.
*/
public static function creaComenzandoEn(int $userId, string $title, \DateTime $start)
{
if (empty($start)) {
throw new \BadMethodCallException('$start debe ser un timestamp valido no nulo');
}
$end = $start->add(new \DateInterval('PT1H'));
return self::creaDetallado($userId, $title, $start, $end);
}
/**
* Crear un evento asociado a un usuario $userId, un título $title y una fecha y hora de comienzo y fin.
*
* @param int $userId Id del propietario del evento.
* @param string $title Título del evento.
* @param DateTime $start Fecha y horas de comienzo.
* @param DateTime $end Fecha y horas de fin.
*/
public static function creaDetallado(int $userId, string $title, \DateTime $start, \DateTime $end)
{
$e = new Evento();
$e->setUserId($userId);
$e->setTitle($title);
$e->setStart($start);
$e->setEnd($end);
}
/**
* Crear un evento un evento a partir de un diccionario PHP.
* Como por ejemplo array("userId" => (int)1, "title" => "Descripcion"
* , "start" => "2019-04-29 00:00:00", "end" => "2019-04-30 00:00:00")
*
* @param array $diccionario Array / map / diccionario PHP con los datos del evento a crear.
*
* @return Evento Devuelve el evento creado.
*/
public static function creaDesdeDicionario(array $diccionario)
{
$e = new Evento();
$e->asignaDesdeDiccionario($diccionario, ['userId', 'title', 'start', 'end']);
return $e;
}
/**
* Comprueba si $start y $end son fechas y además $start es anterior a $end.
*/
private static function compruebaConsistenciaFechas(\DateTime $start, \DateTime $end)
{
if (!$start) {
throw new \BadMethodCallException('$start no puede ser nula');
}
if (!$end) {
throw new \BadMethodCallException('$end no puede ser nula');
}
if ($start >= $end) {
throw new \BadMethodCallException('La fecha de comienzo $start '.$start->format("Y-m-d H:i:s").' no puede ser posterior a la de fin $end '.$end->format("Y-m-d H:i:s"));
}
}
/**
* @param int Longitud máxima del título de un evento.
*/
const TITLE_MAX_SIZE = 255;
/**
* @param string Formato de fecha y hora compatible con MySQL.
*/
const MYSQL_DATE_TIME_FORMAT= 'Y-m-d H:i:s';
/**
* @param array[string] Nombre de las propiedades de la clase.
*/
const PROPERTIES = ['id', 'userId', 'title', 'start', 'end', 'idfilm'];
//'idfilm','idhall','idcinema','date', 'start_time', 'seat_price', 'format', 'seats_full'];
private $id;
private $userId;
private $title;
private $start;
private $end;
private $idfilm;
/*
private $idhall;
private $idcinema;
private $date;
private $start_time;
private $seat_price;
private $format;
private $seats_full;*/
private function __construct()
{
}
public function getId()
{
return $this->id;
}
public function getUserId()
{
return $this->userId;
}
public function setUserId(int $userId)
{
if (is_null($userId)) {
throw new \BadMethodCallException('$userId no puede ser una cadena vacía o nulo');
}
$this->userId = $userId;
}
public function getTitle()
{
return $this->title;
}
public function setTitle(string $title)
{
if (is_null($title)) {
throw new \BadMethodCallException('$title no puede ser una cadena vacía o nulo');
}
if (mb_strlen($title) > self::TITLE_MAX_SIZE) {
throw new \BadMethodCallException('$title debe tener como longitud máxima: '.self::TITLE_MAX_SIZE);
}
$this->title = $title;
}
public function getStart()
{
return $this->start;
}
public function setStart(\DateTime $start)
{
if (empty($start)) {
throw new \BadMethodCallException('$start debe ser un timestamp valido no nulo');
}
if (! is_null($this->end) ) {
self::compruebaConsistenciaFechas($start, $this->end);
}
$this->start = $start;
}
public function getEnd()
{
if (empty($end)) {
throw new \BadMethodCallException('$end debe ser un timestamp valido no nulo');
}
return $this->end;
}
public function setEnd(\DateTime $end)
{
if (empty($end)) {
throw new \BadMethodCallException('$end debe ser un timestamp valido no nulo');
}
self::compruebaConsistenciaFechas($this->start, $end);
$this->end = $end;
}
public function __get($property)
{
if (property_exists($this, $property)) {
return $this->$property;
}
}
/**
* Método utilizado por la función de PHP json_encode para serializar un objeto que no tiene atributos públicos.
*
* @return Devuelve un objeto con propiedades públicas y que represente el estado de este evento.
*/
public function jsonSerialize()
{
$o = new \stdClass();
$o->id = $this->id;
$o->userId = $this->userId;
$o->title = $this->title;
$o->start = $this->start->format(self::MYSQL_DATE_TIME_FORMAT);
$o->end = $this->end->format(self::MYSQL_DATE_TIME_FORMAT);
return $o;
}
public static function session2dictionary($session){
$extraDurationBetweenFilms = 10;
$film = Session::getThisSessionFilm($session->getIdfilm());
$dur = $film["duration"]+$extraDurationBetweenFilms;
$tittle = str_replace('_', ' ', $film["tittle"]) ;
$start = $session->getDate()." ".$session->getStartTime();
$end = date('Y-m-d H:i:s', strtotime( $start . ' +'.$dur.' minute'));
$dictionary = array(
"id" => $session->getId(),
"userId" => "80",
"title" => $tittle,
"start" => $start,
"end" => $end,
"idfilm" => $session->getIdfilm(),
/*"idcinema" => $session->getIdcinema(),
"idhall" => $session->getIdhall(),
"date" => $session->getDate(),
"start_time" => $session->getStartTime(),
"seat_price" => $session->getSeatPrice(),
"format" => $session->getFormat(),
"seats_full" => $session->getSeatsFull(),*/
);
return $dictionary;
}
/**
* Actualiza este evento a partir de un diccionario PHP. No todas las propiedades tienen que actualizarse.
* Por ejemplo el array("title" => "Nueva descripcion", "end" => "2019-04-30 00:00:00") sólo actualiza las
* propiedades "title" y "end".
*
* @param array $diccionario Array / map / diccionario PHP con los datos del evento a actualizar.
* @param array[string] $propiedadesAIgnorar Nombre de propiedades que se ignorarán, y no se actualizarán, si se
* encuentran en $diccionario.
*
*/
public function actualizaDesdeDiccionario(array $diccionario, array $propiedadesAIgnorar = [])
{
$propiedadesAIgnorar[] = 'id';
foreach($propiedadesAIgnorar as $prop) {
if( isset($diccionario[$prop]) ) {
unset($diccionario[$prop]);
}
}
return $this->asignaDesdeDiccionario($diccionario);
}
/**
* Actualiza este evento a partir de un diccionario PHP. No todas las propiedades tienen que actualizarse, aunque son
* obligatorias las propiedades cuyo nombre se incluyan en $propiedadesRequeridas.
*
* @param array $diccionario Array / map / diccionario PHP con los datos del evento a actualizar.
* @param array[string] $propiedadesRequeridas Nombre de propiedades que se requieren actualizar. Si no existen en
* $diccionario, se lanza BadMethodCallException.
*
*/
protected function asignaDesdeDiccionario(array $diccionario, array $propiedadesRequeridas = [])
{
foreach($diccionario as $key => $val) {
if (!in_array($key, self::PROPERTIES)) {
throw new \BadMethodCallException('Propiedad no esperada en $diccionario: '.$key);
}
}
foreach($propiedadesRequeridas as $prop) {
if( ! isset($diccionario[$prop]) ) {
throw new \BadMethodCallException('El array $diccionario debe tener las propiedades: '.implode(',', $propiedadesRequeridas));
}
}
if (array_key_exists('id', $diccionario)) {
$id = $diccionario['id'];
if (empty($id)) {
throw new \BadMethodCallException('$diccionario[\'id\'] no puede ser una cadena vacía o nulo');
} else if (! ctype_digit($id)) {
throw new \BadMethodCallException('$diccionario[\'id\'] tiene que ser un número entero');
} else {
$this->id =(int)$id;
}
}
if (array_key_exists('userId', $diccionario)) {
$userId = $diccionario['userId'];
if (empty($userId)) {
throw new \BadMethodCallException('$diccionario[\'userId\'] no puede ser una cadena vacía o nulo');
} else if (!is_int($userId) && ! ctype_digit($userId)) {
throw new \BadMethodCallException('$diccionario[\'userId\'] tiene que ser un número entero: '.$userId);
} else {
$this->setUserId((int)$userId);
}
}
if (array_key_exists('title', $diccionario)) {
$title = $diccionario['title'];
if (is_null($title)) {
throw new \BadMethodCallException('$diccionario[\'title\'] no puede ser una cadena vacía o nulo');
} else {
$this->setTitle($title);
}
}
if (array_key_exists('start', $diccionario)) {
$start = $diccionario['start'];
if (empty($start)) {
throw new \BadMethodCallException('$diccionario[\'start\'] no puede ser una cadena vacía o nulo');
} else {
$startDate = \DateTime::createFromFormat(self::MYSQL_DATE_TIME_FORMAT, $start);
if (!$startDate) {
throw new \BadMethodCallException('$diccionario[\'start\']: '.$diccionario['start'].' no sigue el formato válido: '.self::MYSQL_DATE_TIME_FORMAT);
}
$this->start = $startDate;
}
}
if (array_key_exists('end', $diccionario)) {
$end = $diccionario['end'] ?? null;
if (empty($end)) {
throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$endDate = \DateTime::createFromFormat(self::MYSQL_DATE_TIME_FORMAT, $end);
if (!$endDate) {
throw new \BadMethodCallException('$diccionario[\'end\']: '.$diccionario['end'].' no sigue el formato válido: '.self::MYSQL_DATE_TIME_FORMAT);
}
$this->end = $endDate;
}
}
if (array_key_exists('idfilm', $diccionario)) {
$idfilm = $diccionario['idfilm'] ?? null;
if (empty($idfilm)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->idfilm = $idfilm;
}
}
/*
if (array_key_exists('idhall', $diccionario)) {
$idhall = $diccionario['idhall'] ?? null;
if (empty($idhall)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->idhall = $idhall;
}
}
if (array_key_exists('idcinema', $diccionario)) {
$idcinema = $diccionario['idcinema'] ?? null;
if (empty($idcinema)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->idcinema = $idcinema;
}
}
if (array_key_exists('date', $diccionario)) {
$date = $diccionario['date'] ?? null;
if (empty($date)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->date = $date;
}
}
if (array_key_exists('start_time', $diccionario)) {
$start_time = $diccionario['start_time'] ?? null;
if (empty($start_time)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->start_time = $start_time;
}
}
if (array_key_exists('seat_price', $diccionario)) {
$seat_price = $diccionario['seat_price'] ?? null;
if (empty($seat_price)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->seat_price = $seat_price;
}
}
if (array_key_exists('format', $diccionario)) {
$format = $diccionario['format'] ?? null;
if (empty($format)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->format = $format;
}
}
if (array_key_exists('seats_full', $diccionario)) {
$seats_full = $diccionario['seats_full'] ?? null;
if (empty($seats_full)) {
// throw new \BadMethodCallException('$diccionario[\'end\'] no puede ser una cadena vacía o nulo');
} else {
$this->seats_full = $seats_full;
}
}*/
self::compruebaConsistenciaFechas($this->start, $this->end);
return $this;
}
}

View File

@ -0,0 +1,138 @@
<?php
require_once('../assets/php/config.php');
require_once('./Evento.php');
// Procesamos la cabecera Content-Type
$contentType= $_SERVER['CONTENT_TYPE'] ?? 'application/json';
$contentType = strtolower(str_replace(' ', '', $contentType));
// Verificamos corresponde con uno de los tipos soportados
$acceptedContentTypes = array('application/json;charset=utf-8', 'application/json');
$found = false;
foreach ($acceptedContentTypes as $acceptedContentType) {
if (substr($contentType, 0, strlen($acceptedContentType)) === $acceptedContentType) {
$found=true;
break;
}
}
if (!$found) {
// throw new ContentTypeNoSoportadoException('Este servicio REST sólo soporta el content-type application/json');
}
$result = null;
/**
* Las API REST usan la semántica de los métoods HTTP para gestionar las diferentes peticiones:
* https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods
*/
switch($_SERVER['REQUEST_METHOD']) {
// Consulta de datos
case 'GET':
$hall = $_GET["hall"];
$cinema = $_SESSION["cinema"];
// Comprobamos si es una consulta de un evento concreto -> eventos.php?idEvento=XXXXX
$idEvento = filter_input(INPUT_GET, 'idEvento', FILTER_VALIDATE_INT);
if ($idEvento) {
$result = [];
$result[] = Evento::buscaPorId((int)$idEvento,$hall,$cinema);
} else {
// Comprobamos si es una lista de eventos entre dos fechas -> eventos.php?start=XXXXX&end=YYYYY
$start = filter_input(INPUT_GET, 'start', FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/\d{4}-((0[1-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))/")));
$end = filter_input(INPUT_GET, 'end', FILTER_VALIDATE_REGEXP, array("options" => array("default" => null, "regexp"=>"/\d{4}-((0[1-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))/")));
if ($start) {
$startDateTime = $start . ' 00:00:00';
$endDateTime = $end;
if ($end) {
$endDateTime = $end. ' 00:00:00';
}
$result = Evento::buscaEntreFechas(1, $startDateTime, $endDateTime, $hall,$cinema);
} else {
// Comprobamos si es una lista de eventos completa
$result = Evento::buscaTodosEventos(1, $hall,$cinema); // HACK: normalmente debería de ser App::getSingleton()->idUsuario();
}
}
// Generamos un array de eventos en formato JSON
$json = json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
http_response_code(200); // 200 OK
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . mb_strlen($json));
echo $json;
break;
// Añadir un nuevo evento
case 'POST':
// 1. Leemos el contenido que nos envían
$entityBody = file_get_contents('php://input');
// 2. Verificamos que nos envían un objeto
$dictionary = json_decode($entityBody);
if (!is_object($dictionary)) {
//throw new ParametroNoValidoException('El cuerpo de la petición no es valido');
}
// 3. Reprocesamos el cuerpo de la petición como un array PHP
$dictionary = json_decode($entityBody, true);
$dictionary['userId'] = 1;// HACK: normalmente debería de ser App::getSingleton()->idUsuario();
$e = Evento::creaDesdeDicionario($dictionary);
// 4. Guardamos el evento en BD
$result = Evento::guardaOActualiza($e);
// 5. Generamos un objecto como salida.
$json = json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
http_response_code(201); // 201 Created
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . mb_strlen($json));
echo $json;
break;
case 'PUT':
error_log("PUT");
// 1. Comprobamos si es una consulta de un evento concreto -> eventos.php?idEvento=XXXXX
$idEvento = filter_input(INPUT_GET, 'idEvento', FILTER_VALIDATE_INT);
// 2. Leemos el contenido que nos envían
$entityBody = file_get_contents('php://input');
// 3. Verificamos que nos envían un objeto
$dictionary = json_decode($entityBody);
if (!is_object($dictionary)) {
//throw new ParametroNoValidoException('El cuerpo de la petición no es valido');
}
// 4. Reprocesamos el cuerpo de la petición como un array PHP
$dictionary = json_decode($entityBody, true);
$e = Evento::buscaPorId($idEvento);
$e->actualizaDesdeDiccionario($dictionary, ['id', 'userId']);
$result = Evento::guardaOActualiza($e);
// 5. Generamos un objecto como salida.
$json = json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
http_response_code(200); // 200 OK
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . mb_strlen($json));
echo $json;
break;
case 'DELETE':
// 1. Comprobamos si es una consulta de un evento concreto -> eventos.php?idEvento=XXXXX
$idEvento = filter_input(INPUT_GET, 'idEvento', FILTER_VALIDATE_INT);
// 2. Borramos el evento
Evento::borraPorId($idEvento);
http_response_code(204); // 204 No content (como resultado)
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: 0');
break;
default:
//throw new MetodoNoSoportadoException($_SERVER['REQUEST_METHOD']. ' no está soportado');
break;
}

179
panel_manager/eventos.php Normal file
View File

@ -0,0 +1,179 @@
<?php
require_once('../assets/php/config.php');
require_once('./Evento.php');
include_once($prefix.'assets/php/includes/session.php');
// Procesamos la cabecera Content-Type
$contentType= $_SERVER['CONTENT_TYPE'] ?? 'application/json';
$contentType = strtolower(str_replace(' ', '', $contentType));
// Verificamos corresponde con uno de los tipos soportados
$acceptedContentTypes = array('application/json;charset=utf-8', 'application/json');
$found = false;
foreach ($acceptedContentTypes as $acceptedContentType) {
if (substr($contentType, 0, strlen($acceptedContentType)) === $acceptedContentType) {
$found=true;
break;
}
}
if (!$found) {
// throw new ContentTypeNoSoportadoException('Este servicio REST sólo soporta el content-type application/json');
}
$result = null;
/**
* Las API REST usan la semántica de los métoods HTTP para gestionar las diferentes peticiones:
* https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods
*/
switch($_SERVER['REQUEST_METHOD']) {
// Consulta de datos
case 'GET':
$hall = $_GET["hall"];
$cinema = $_SESSION["cinema"];
// Comprobamos si es una consulta de un evento concreto -> eventos.php?idEvento=XXXXX
$idEvento = filter_input(INPUT_GET, 'idEvento', FILTER_VALIDATE_INT);
if ($idEvento) {
$result = [];
$result[] = Evento::buscaPorId((int)$idEvento,$hall,$cinema);
} else {
// Comprobamos si es una lista de eventos entre dos fechas -> eventos.php?start=XXXXX&end=YYYYY
$start = filter_input(INPUT_GET, 'start', FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>"/\d{4}-((0[1-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))/")));
$end = filter_input(INPUT_GET, 'end', FILTER_VALIDATE_REGEXP, array("options" => array("default" => null, "regexp"=>"/\d{4}-((0[1-9])|(1[0-2]))-((0[1-9])|([1-2][0-9])|(3[0-1]))/")));
if ($start) {
$startDateTime = $start . ' 00:00:00';
$endDateTime = $end;
if ($end) {
$endDateTime = $end. ' 00:00:00';
}
$result = Evento::buscaEntreFechas(1, $startDateTime, $endDateTime, $hall,$cinema);
} else {
// Comprobamos si es una lista de eventos completa
$result = Evento::buscaTodosEventos(1, $hall,$cinema); // HACK: normalmente debería de ser App::getSingleton()->idUsuario();
}
}
// Generamos un array de eventos en formato JSON
$json = json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
http_response_code(200); // 200 OK
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . mb_strlen($json));
echo $json;
break;
// Añadir un nuevo evento
case 'POST':
$errors = [];
$data = [];
//Testing hacks
$correct_response = 'Operación completada';
$entityBody = file_get_contents('php://input');
$dictionary = json_decode($entityBody);
if (!is_object($dictionary))
$errors['global'] = 'El cuerpo de la petición no es valido';
$price = $dictionary->{"price"} ?? "";
$format = $dictionary->{"format"} ?? "";
$hall = $dictionary->{"hall"} ?? "";
$startDate = $dictionary->{"startDate"} ?? "";
$endDate = $dictionary->{"endDate"} ?? "";
$startHour = $dictionary->{"startHour"} ?? "";
$idfilm = $dictionary->{"idFilm"} ?? "";
if (empty($price) || $price <= 0 )
$errors['price'] = 'El precio no puede ser 0.';
if (empty($format))
$errors['format'] = 'El formato no puede estar vacio. Ej: 3D, 2D, voz original';
if (empty($hall) || $hall<=0 )
$errors['hall'] = 'La sala no puede ser 0 o menor';
if (empty($startDate))
$errors['startDate'] = 'Las sesiones tienen que empezar algun dia.';
else if (empty($endDate))
$errors['endDate'] = 'Las sesiones tienen que teminar algun dia.';
else {
$start = strtotime($startDate);
$end = strtotime($endDate);
$start = date('Y-m-d', $start);
$end = date('Y-m-d', $end);
if($start >= $end)
$errors['date'] = 'La fecha inicial no puede ser antes o el mismo dia que la final.';
}
if (empty($startHour))
$errors['startHour'] = 'Es necesario escoger el horario de la sesion.';
error_log("El valor de idfilm: ".$idfilm);
if (!is_numeric($idfilm) && $idfilm <= 0 )
$errors['idfilm'] = 'No se ha seleccionado una pelicula.';
while($startDate < $endDate && empty($errors)){
$msg = Session::create_session($_SESSION["cinema"], $hall, $startHour, $startDate, $idfilm, $price, $format);
if(strcmp($msg,$correct_response)!== 0)
$errors['price'] = $msg;
else
$data['message'] = $msg;
$startDate = date('Y-m-d H:i:s', strtotime( $startDate . ' +1 day'));
}
if (!empty($errors)) {
$data['success'] = false;
$data['errors'] = $errors;
} else {
$data['success'] = true;
}
echo json_encode($data);
break;
case 'PUT':
error_log("PUT");
// 1. Comprobamos si es una consulta de un evento concreto -> eventos.php?idEvento=XXXXX
$idEvento = filter_input(INPUT_GET, 'idEvento', FILTER_VALIDATE_INT);
// 2. Leemos el contenido que nos envían
$entityBody = file_get_contents('php://input');
// 3. Verificamos que nos envían un objeto
$dictionary = json_decode($entityBody);
if (!is_object($dictionary)) {
//throw new ParametroNoValidoException('El cuerpo de la petición no es valido');
}
// 4. Reprocesamos el cuerpo de la petición como un array PHP
$dictionary = json_decode($entityBody, true);
$e = Evento::buscaPorId($idEvento);
$e->actualizaDesdeDiccionario($dictionary, ['id', 'userId']);
$result = Evento::guardaOActualiza($e);
// 5. Generamos un objecto como salida.
$json = json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
http_response_code(200); // 200 OK
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . mb_strlen($json));
echo $json;
break;
case 'DELETE':
// 1. Comprobamos si es una consulta de un evento concreto -> eventos.php?idEvento=XXXXX
$idEvento = filter_input(INPUT_GET, 'idEvento', FILTER_VALIDATE_INT);
// 2. Borramos el evento
Evento::borraPorId($idEvento);
http_response_code(204); // 204 No content (como resultado)
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: 0');
break;
default:
//throw new MetodoNoSoportadoException($_SERVER['REQUEST_METHOD']. ' no está soportado');
break;
}

View File

@ -0,0 +1,258 @@
<?php
require_once('../assets/php/config.php');
include_once($prefix.'assets/php/includes/event.php');
include_once($prefix.'assets/php/includes/session.php');
$contentType= $_SERVER['CONTENT_TYPE'] ?? 'application/json';
$contentType = strtolower(str_replace(' ', '', $contentType));
// Verify the content type is supported
$acceptedContentTypes = array('application/json;charset=utf-8', 'application/json');
$found = false;
foreach ($acceptedContentTypes as $acceptedContentType) {
if (substr($contentType, 0, strlen($acceptedContentType)) === $acceptedContentType) {
$found=true;
break;
}
}
switch($_SERVER['REQUEST_METHOD']) {
// Get Events
case 'GET':
$hall = $_GET["hall"];
$cinema = $_SESSION["cinema"];
$start = $_GET["start"];
$end = $_GET["end"];
if ($start) {
$result = Event::searchEventsBetween2dates($start, $end, $hall,$cinema);
} else {
// Comprobamos si es una lista de eventos completa
$result = Event::searchAllEvents($hall,$cinema);
}
// Generamos un array de eventos en formato JSON
$json = json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
http_response_code(200); // 200 OK
header('Content-Type: application/json; charset=utf-8');
header('Content-Length: ' . mb_strlen($json));;
echo $json;
break;
// Add Session
case 'POST':
$errors = [];
$data = [];
//Correct reply to verify the session has been correctly added
$correct_response = 'Operación completada';
//Check if the body is ok
$entityBody = file_get_contents('php://input');
$dictionary = json_decode($entityBody);
if (!is_object($dictionary))
$errors['global'] = 'El cuerpo de la petición no es valido';
$price = $dictionary->{"price"} ?? "";
$format = $dictionary->{"format"} ?? "";
$hall = $dictionary->{"hall"} ?? "";
$startDate = $dictionary->{"startDate"} ?? "";
$endDate = $dictionary->{"endDate"} ?? "";
$startHour = $dictionary->{"startHour"} ?? "";
$idfilm = $dictionary->{"idFilm"} ?? "";
//Check errors in inputs
if (empty($price) || $price <= 0 )
$errors['price'] = 'El precio no puede ser 0.';
if (empty($format))
$errors['format'] = 'El formato no puede estar vacio. Ej: 3D, 2D, voz original';
if (empty($hall) || $hall<=0 )
$errors['hall'] = 'La sala no puede ser 0 o menor';
if (empty($startDate))
$errors['startDate'] = 'Las sesiones tienen que empezar algun dia.';
else if (empty($endDate))
$errors['endDate'] = 'Las sesiones tienen que teminar algun dia.';
else {
$start = strtotime($startDate);
$end = strtotime($endDate);
$start = date('Y-m-d', $start);
$end = date('Y-m-d', $end);
if($start > $end)
$errors['date'] = 'La fecha inicial no puede ser antes o el mismo dia que la final.';
}
if (empty($startHour))
$errors['startHour'] = 'Es necesario escoger el horario de la sesion.';
if (!is_numeric($idfilm) && $idfilm <= 0 )
$errors['idfilm'] = 'No se ha seleccionado una pelicula.';
//Create as many sessions as the diference between start and end date tell us. 1 session per day
while($startDate < $endDate && empty($errors)){
$msg = Session::create_session($_SESSION["cinema"], $hall, $startHour, $startDate, $idfilm, $price, $format);
if(strcmp($msg,$correct_response)!== 0)
$errors['global'] = $msg;
else
$data['message'] = $msg;
$startDate = date('Y-m-d H:i:s', strtotime( $startDate . ' +1 day'));
}
if (!empty($errors)) {
$data['success'] = false;
$data['errors'] = $errors;
} else {
$data['success'] = true;
}
echo json_encode($data);
break;
//Edit session
case 'PUT':
//Correct reply to verify the session has been correctly edited
$correct_response = 'Se ha editado la session con exito';
$errors = [];
$data = [];
//Check if the body is ok
$entityBody = file_get_contents('php://input');
$dictionary = json_decode($entityBody);
if (!is_object($dictionary))
$errors['global'] = 'El cuerpo de la petición no es valido';
//Check if the user is droping an event in a new date
if(isset($_GET["drop"]) && $_GET["drop"]){
$or_hall = $dictionary->{"idhall"} ?? "";
$or_date = $dictionary->{"startDate"} ?? "";
$or_start = $dictionary->{"startHour"} ?? "";
$price = $dictionary->{"price"} ?? "";
$idfilm = $dictionary->{"idfilm"} ?? "";
$format = $dictionary->{"format"} ?? "";
$new_date = $dictionary->{"newDate"} ?? "";
$msg = Session::edit_session($_SESSION["cinema"], $or_hall, $or_date, $or_start, $or_hall, $new_date, $new_date, $idfilm, $price, $format);
if(strcmp($msg,$correct_response)!== 0)
http_response_code(400);
else
http_response_code(200);
}else{
//Edit session from a form
$price = $dictionary->{"price"} ?? "";
$format = $dictionary->{"format"} ?? "";
$hall = $dictionary->{"hall"} ?? "";
$startDate = $dictionary->{"startDate"} ?? "";
$endDate = $dictionary->{"endDate"} ?? "";
$startHour = $dictionary->{"startHour"} ?? "";
$idfilm = $dictionary->{"idFilm"} ?? "";
$or_hall = $dictionary->{"og_hall"} ?? "";
$or_date = $dictionary->{"og_date"} ?? "";
$or_start = $dictionary->{"og_start"} ?? "";
//Check errors in inputs
if (empty($price) || $price <= 0 )
$errors['price'] = 'El precio no puede ser 0.';
if (empty($format))
$errors['format'] = 'El formato no puede estar vacio. Ej: 3D, 2D, voz original';
if (empty($hall) || $hall<=0 )
$errors['hall'] = 'La sala no puede ser 0 o menor';
if (empty($startDate))
$errors['startDate'] = 'Las sesiones tienen que empezar algun dia.';
else if (empty($endDate))
$errors['endDate'] = 'Las sesiones tienen que teminar algun dia.';
else {
$start = strtotime($startDate);
$end = strtotime($endDate);
$start = date('Y-m-d', $start);
$end = date('Y-m-d', $end);
if($start > $end)
$errors['date'] = 'La fecha inicial no puede ser antes o el mismo dia que la final.';
}
if (empty($startHour))
$errors['startHour'] = 'Es necesario escoger el horario de la sesion.';
if (!is_numeric($idfilm) && $idfilm <= 0 )
$errors['idfilm'] = 'No se ha seleccionado una pelicula.';
if(empty($errors)){
$msg = Session::edit_session($_SESSION["cinema"], $or_hall, $or_date, $or_start, $hall, $startHour, $startDate, $idfilm, $price, $format);
if(strcmp($msg,$correct_response)!== 0)
$errors['global'] = $msg;
else
$data['message'] = $msg;
}
if (!empty($errors)) {
$data['success'] = false;
$data['errors'] = $errors;
} else {
$data['success'] = true;
}
}
echo json_encode($data);
break;
//Delete a session
case 'DELETE':
$errors = [];
$data = [];
//Correct reply to verify the session has been correctly edited
$correct_response = 'Se ha eliminado la session con exito';
//Check if the body is ok
$entityBody = file_get_contents('php://input');
$dictionary = json_decode($entityBody);
if (!is_object($dictionary))
$errors['global'] = 'El cuerpo de la petición no es valido';
$or_hall = $dictionary->{"og_hall"} ?? "";
$or_date = $dictionary->{"og_date"} ?? "";
$or_start = $dictionary->{"og_start"} ?? "";
//Check errors in inputs
if(empty($or_hall))
$errors['global'] = 'El nº de sala a borrar no existe';
if(empty($or_date))
$errors['global'] = 'La fecha de donde borrar no existe';
if(empty($or_start))
$errors['global'] = 'La hora de donde borrar no existe';
if(empty($errors)){
$msg = Session::delete_session($_SESSION["cinema"], $or_hall, $or_start, $or_date);
if(strcmp($msg,$correct_response)!== 0)
$errors['global'] = $msg;
else
$data['message'] = $msg;
}
if (!empty($errors)) {
$data['success'] = false;
$data['errors'] = $errors;
} else {
$data['success'] = true;
}
echo json_encode($data);
break;
default:
break;
}

View File

@ -0,0 +1,95 @@
<?php
require_once($prefix.'assets/php/includes/film_dao.php');
class NewSessionForm {
public static function getForm(){
$films = new Film_DAO("complucine");
$filmslist = $films->allFilmData();
$form='
<div id="operation_msg" class="operation_msg"> </div>
<form id="new_session_form" name="new_session_form" action="eventos.php.php" method="POST">
<div id="global_group" class="form_group"></div>
<fieldset>
<legend>Datos</legend>
<div id="price_group" class="form_group">
<input type="number" step="0.01" id="price" name="price" value="" min="0" placeholder="Precio de la entrada" /> <br>
</div>
<div id="format_group" class="form_group">
<input type="text" id="format" name="format" value="" placeholder="Formato de pelicula" /> <br>
</div>
<div id="hall_group" class="form_group">
<select id="hall" name="hall" class="button large">>';
foreach(Hall::getListHalls($_SESSION["cinema"]) as $hll){
$form.= '
<option value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
$form.=' </select>
</div>
</fieldset>
<fieldset>
<legend>Horario</legend>
<div id="date_group" class="form_group">
<div class="two-inputs-line">
<label> Fecha inicio </label>
<label> Fecha final </label>
<input type="date" id="startDate" name="startDate" value=""/>
<input type="date" id="endDate" name="endDate" value=""/>
</div>
</div>
<div id="hour_group" class="form_group">
<div class="one-input-line">
<label> Hora sesion </label>
<input type="time" id="startHour" name="startHour" value=""/>
</div>
</div>
</fieldset>
<input type="reset" id="reset" value="Limpiar Campos" >
<input type="submit" id="submit" name="sumbit" class="primary" value="Crear" />
<div id="film_msg_group" class="form_group"> </div>
<div id="film_group" class="form_group">
<div class="code showtimes">
<input type="hidden" id="film_id" name="film_id" value=""/>
<h2 id="film_title"> titulo </h2>
<hr />
<div class="img_desc">
<div class="image"> <img src="../img/films/iron_man.jpg" alt="iron man" id="film_img" /> </div>
<div class="blockquote">
<p id="film_desc">"Un empresario millonario construye un traje blindado y lo usa para combatir el crimen y el terrorismo."</p>
</div>
</div>
<li id="film_dur"> Duración: duracion minutos</li>
<li id="film_lan"> Lenguaje: idioma </li>
</div>
<button type="button" class="button large" id="return"> Cambiar pelicula </button>
</div>
<div class="film_list" id="film_list">
<ul class="tablelist col3">';
$parity = "odd";
$i = 0;
foreach($filmslist as $film){
$form .='<div class="'.$parity.'">
<input type="hidden" value="'.$film->getId().'" id="id'.$i.'"/>
<input type="hidden" value="'.$film->getImg().'" id="img'.$i.'"/>
<input type="hidden" value="'.$film->getLanguage().'" id="lan'.$i.'"/>
<input type="hidden" value="'.$film->getDescription().'" id="desc'.$i.'"/>
<li value="'.$film->getTittle().'"id="title'.$i.'"> '. str_replace('_', ' ',$film->getTittle()).'</li>
<li id="dur'.$i.'"> '.$film->getDuration().' min</li>
<li> <button type="button" class="film_button" id="'.$i.'"> Seleccionar </button> </li>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
$i++;
}
$form.='
</ul>
</div>
</form>';
return $form;
}
}
?>

View File

@ -0,0 +1,103 @@
<?php
require_once($prefix.'assets/php/includes/film_dao.php');
class SessionForm {
public static function getForm(){
$films = new Film_DAO("complucine");
$filmslist = $films->allFilmData();
$form='
<div id="operation_msg" class="operation_msg"> </div>
<form id="session_form" name="session_form" action="eventos.php" method="POST">
<input type="hidden" id="film_id" name="film_id" value=""/>
<input type="hidden" id="original_hall" name="film_id" value=""/>
<input type="hidden" id="original_date" name="film_id" value=""/>
<input type="hidden" id="original_start_time" name="film_id" value=""/>
<div id="global_group" class="form_group"></div>
<fieldset>
<legend>Datos</legend>
<div id="price_group" class="form_group">
<input type="number" step="0.01" id="price" name="price" value="" min="0" placeholder="Precio de la entrada" /> <br>
</div>
<div id="format_group" class="form_group">
<input type="text" id="format" name="format" value="" placeholder="Formato de pelicula" /> <br>
</div>
<div id="hall_group" class="form_group">
<select id="hall" name="hall" class="button large">>';
foreach(Hall::getListHalls($_SESSION["cinema"]) as $hll){
$form.= '
<option value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
$form.=' </select>
</div>
</fieldset>
<fieldset>
<legend>Horario</legend>
<div id="date_group" class="form_group">
<div class="two-inputs-line">
<label> Fecha inicio </label>
<label> Fecha final </label>
<input type="date" id="startDate" name="startDate" value=""/>
<input type="date" id="endDate" name="endDate" value=""/>
</div>
</div>
<div id="hour_group" class="form_group">
<div class="one-input-line">
<label> Hora sesion </label>
<input type="time" id="startHour" name="startHour" value=""/>
</div>
</div>
</fieldset>
<input type="reset" id="reset" value="Limpiar Campos" >
<input type="submit" id="sumbit_new" name="sumbit_new" class="sumbit" value="Añadir" />
<div class="two-inputs-line" id="edit_inputs">
<input type="submit" id="sumbit_edit" name="sumbit_edit" class="sumbit" value="Editar" />
<input type="submit" id="submit_del" name="submit_del" class="black button" value="Borrar" />
</div>
<div id="film_msg_group" class="form_group"> </div>
<div id="film_group" class="form_group">
<div class="code showtimes">
<h2 id="film_title"> titulo </h2>
<hr />
<div class="img_desc">
<div class="image"> <img src="../img/films/iron_man.jpg" alt="iron man" id="film_img" /> </div>
<div class="blockquote">
<li id="film_dur"> Duración: duracion minutos</li>
<li id="film_lan"> Lenguaje: idioma </li>
</div>
</div>
</div>
<button type="button" class="button large" id="return"> Cambiar pelicula </button>
</div>
<div class="film_list" id="film_list">
<ul class="tablelist col3">';
$parity = "odd";
$i = 0;
foreach($filmslist as $film){
$form .='<div class="'.$parity.'">
<input type="hidden" value="'.$film->getId().'" id="id'.$i.'"/>
<input type="hidden" value="'.$film->getImg().'" id="img'.$i.'"/>
<input type="hidden" value="'.$film->getLanguage().'" id="lan'.$i.'"/>
<li value="'.$film->getTittle().'"id="title'.$i.'"> '. str_replace('_', ' ',$film->getTittle()).'</li>
<li id="dur'.$i.'"> '.$film->getDuration().' min</li>
<li> <button type="button" class="film_button" id="'.$i.'"> Seleccionar </button> </li>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
$i++;
}
$form.='
</ul>
</div>
</form>
';
return $form;
}
}
?>

View File

@ -0,0 +1,220 @@
<?php
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/seat.php');
include_once($prefix.'assets/php/form.php');
class FormHall extends Form {
private $option;
private $cinema;
private $og_hall;
//Constructor:
public function __construct($option, $cinema, $hall) {
$this->option = $option;
$this->cinema = $cinema;
if($hall)
$this->og_hall = $hall;
if($option == "edit_hall")
$options = array("action" => "./?state=".$option."&number=".$hall->getNumber()."&editing");
else
$options = array("action" => "./?state=".$option."&number=".$hall->getNumber()."");
parent::__construct('formHall',$options);
}
protected function generaCamposFormulario($data, $errores = array()){
//Prepare the data
$number = $data['number'] ?? $this->og_hall->getNumber() ?? "";
$rows = $data['rows'] ?? $this->og_hall->getNumRows() ?? "12";
$cols = $data['cols'] ?? $this->og_hall->getNumCol() ?? "8";
//Seats_map
$seats = 0;
$seats_map = array();
for($i = 1;$i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
$seats_map[$i][$j] = "-1";
}
}
$alltozero = $_POST["alltozero"] ?? 0;
//Show the original seats_map once u click restart or the first time u enter this form from manage_halls's form
if($this->option == "edit_hall" && !isset($_GET["editing"])){
$rows = $this->og_hall->getNumRows();
$cols = $this->og_hall->getNumCol();
$seat_list = Seat::getSeatsMap($this->og_hall->getNumber(), $this->cinema);
if($seat_list){
foreach($seat_list as $seat){
$seats_map[$seat->getNumRows()][$seat->getNumCol()] = $seat->getState();
if($seat->getState()>=0){
$seats++;
}
}
}
}//Show the checkbox seats_map updated and everything to selected if alltoone was pressed
else if(!$alltozero){
$alltoone = $_POST["alltoone"] ?? 0;
for($i = 1;$i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
if($alltoone || isset($data["checkbox".$i.$j])) {
$seats_map[$i][$j] = $data["checkbox".$i.$j] ?? "0";
$seats++;
if($seats_map[$i][$j] == "-1"){
$seats_map[$i][$j] = "0";
}
}else
$seats_map[$i][$j] = "-1";
}
}
}
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNumber = self::createMensajeError($errores, 'number', 'span', array('class' => 'error'));
$errorSeats = self::createMensajeError($errores, 'seats', 'span', array('class' => 'error'));
$errorRows = self::createMensajeError($errores, 'rows', 'span', array('class' => 'error'));
$errorCols = self::createMensajeError($errores, 'cols', 'span', array('class' => 'error'));
$html = '
<div class="column left">'.$htmlErroresGlobales.'
<fieldset>
<legend>Mapa de Asientos</legend>
'.$errorSeats.' '.$errorRows.' '.$errorCols.'
<label> Filas: </label> <input type="number" name="rows" min="1" id="rows" value="'.$rows.'" /> <br>
<label> Columnas: </label> <input type="number" name="cols" min="1" id="cols" value="'.$cols.'"/> <br>
<label> Asientos totales:'.$seats.' </label> <input type="hidden" name="seats" id="seats" value="'.$seats.'"readonly/> <br>
<input type="submit" name="filter" value="Actualizar mapa de la sala" class="button large" />
';
if($this->option == "edit_hall")
$html .= ' <input type="submit" id="restart" name="restart" value="Restaurar mapa original" class="black button" />';
$html .='
</fieldset><br>
'.$errorNumber.'
<label> Numero de sala: </label>
<input type="number" name="number" id="number" value="'.$number.'" placeholder="Numero de la Sala" /><br>
';
if($this->option == "new_hall")
$html .='<input type="submit" id="submit" name="sumbit" value="Crear Sala" class="primary" />
';
if($this->option == "edit_hall"){
$html .='<input type="submit" id="submit" name="sumbit" value="Editar Sala" class="primary" />
<input type="submit" id="submit" name="delete" onclick="return confirm(\'Seguro que quieres borrar esta sala?\')" value="Eliminar Sala" class="black button" />
';
}
if(!$errorCols && !$errorRows){
$html .='</div>
<div class="column right">
<input type="submit" name="alltoone" value="Activar todos los asientos" class="button large" />
<input type="submit" name="alltozero" value="Desactivar todos los asientos" class="button large" />
<h3 class="table_title"> Pantalla </h3>
<table class="seat">
<thead>
<tr>
<th> </th>
';
for($j = 1; $j<=$cols; $j++){
$html .= '<th>'.$j.'</th>
';
}
$html .= '</tr>
</thead>
<tbody>';
for($i = 1;$i<=$rows;$i++){
$html .= '
<tr>
<td>'.$i.'</td>
';
for($j=1; $j<=$cols; $j++){
if($seats_map[$i][$j]>=0){
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" checked> <label for="checkbox'.$i.$j.'"> </td>
';}
else {
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" > <label for="checkbox'.$i.$j.'"> </td>
';}
}
$html .='</tr>';
}
$html .= '
</tbody>
</table>
</div>';
} else
$html .='</div>';
return $html;
}
//Methods:
//Process form:
protected function procesaFormulario($datos){
$result = array();
$rows = $datos['rows'];
$cols = $datos['cols'];
//Prepare the seat_map
$seats_map = array();
$seats = 0;
for($i = 1;$i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
if(isset($datos["checkbox".$i.$j])){
$seats_map[$i][$j] = $datos["checkbox".$i.$j];
$seats++;
if($seats_map[$i][$j] == "-1"){
$seats_map[$i][$j] = "0";
}
}else{
$seats_map[$i][$j] = "-1";
}
}
}
if ($seats == 0 && isset($datos["sumbit"]) ) {
$result['seats'] = "<li> No puede haber 0 asientos disponibles. </li> <br>";
}
if ($rows <= 0) {
$result['rows'] = "<li> No puede haber 0 o menos filas. </li> <br>";
}
if ($cols <= 0) {
$result['cols'] = "<li> No puede haber 0 o menos columnas. </li> <br>";
}
$number = $datos['number'] ?? null;
if (empty($number) && isset($datos["sumbit"])) {
$result['number'] = "<li> El numero de sala tiene que ser mayor que 0. </li> <br>";
}
if(isset($datos["restart"])){
return $result = "./?state=".$this->option."&number=".$this->og_hall->getNumber()."";
}
if (count($result) === 0 && isset($datos["sumbit"]) ) {
if($this->option == "new_hall"){
$_SESSION['msg'] = Hall::create_hall($number, $this->cinema, $rows, $cols, $seats, $seats_map);
return $result = './?state=success';
}
if($this->option == "edit_hall"){
$_SESSION['msg'] = Hall::edit_hall($number,$this->cinema, $rows, $cols, $seats, $seats_map, $this->og_hall->getNumber());
return $result = './?state=success';
}
}
if (!isset($result['number']) && isset($datos["delete"]) ) {
if($this->option == "edit_hall"){
$_SESSION['msg'] = Hall::delete_hall($number, $this->cinema, $rows, $cols, $seats, $seats_map, $this->og_hall->getNumber());
return $result = './?state=success';
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,226 @@
<?php
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/seat.php');
include_once($prefix.'assets/php/form.php');
class FormHall extends Form {
private $option;
private $cinema;
private $og_hall;
//Constructor:
public function __construct($option, $cinema, $hall) {
$this->option = $option;
$this->cinema = $cinema;
if($hall)
$this->og_hall = $hall;
if($option == "edit_hall" && $hall)
$options = array("action" => "./?state=".$option."&number=".$hall->getNumber()."&editing=true");
else
$options = array("action" => "./?state=".$option."&editing=false");
parent::__construct('formHall',$options);
}
protected function generaCamposFormulario($data, $errores = array()){
//Prepare the data
$number = $data['number'] ?? $this->og_hall->getNumber() ?? "";
$rows = $data['rows'] ?? $this->og_hall->getNumRows() ?? "12";
$cols = $data['cols'] ?? $this->og_hall->getNumCol() ?? "8";
//Init Seats_map
$seats = 0;
$seats_map = array();
for($i = 1;$i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
$seats_map[$i][$j] = "-1";
}
}
$alltozero = $_POST["alltozero"] ?? 0;
//Show the original seats_map once u click restart or the first time u enter this form from manage_halls's form
if($this->option == "edit_hall" && !isset($_GET["editing"])){
$rows = $this->og_hall->getNumRows();
$cols = $this->og_hall->getNumCol();
$seat_list = Seat::getSeatsMap($this->og_hall->getNumber(), $this->cinema);
if($seat_list){
foreach($seat_list as $seat){
$seats_map[$seat->getNumRows()][$seat->getNumCol()] = $seat->getState();
if($seat->getState()>=0){
$seats++;
}
}
}
}//Show the checkbox seats_map updated and everything to selected if alltoone was pressed
else if(!$alltozero){
$alltoone = $_POST["alltoone"] ?? 0;
for($i = 1;$i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
if($alltoone || isset($data["checkbox".$i.$j])) {
$seats_map[$i][$j] = $data["checkbox".$i.$j] ?? "0";
$seats++;
if($seats_map[$i][$j] == "-1"){
$seats_map[$i][$j] = "0";
}
}else
$seats_map[$i][$j] = "-1";
}
}
}
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNumber = self::createMensajeError($errores, 'number', 'span', array('class' => 'error'));
$errorSeats = self::createMensajeError($errores, 'seats', 'span', array('class' => 'error'));
$errorRows = self::createMensajeError($errores, 'rows', 'span', array('class' => 'error'));
$errorCols = self::createMensajeError($errores, 'cols', 'span', array('class' => 'error'));
$html = '
<div class="column left">'.$htmlErroresGlobales.'
<fieldset>
<legend>Mapa de Asientos</legend>
'.$errorSeats.' '.$errorRows.' '.$errorCols.'
<label> Filas: </label> <input type="number" name="rows" min="1" id="rows" value="'.$rows.'" /> <br>
<label> Columnas: </label> <input type="number" name="cols" min="1" id="cols" value="'.$cols.'"/> <br>
<label> Asientos totales:'.$seats.' </label> <input type="hidden" name="seats" id="seats" value="'.$seats.'"readonly/> <br>
<input type="submit" name="filter" value="Actualizar mapa de la sala" class="button large" />
';
$html .='
</fieldset><br>
'.$errorNumber.'
<label> Numero de sala: </label>
<input type="number" name="number" id="number" value="'.$number.'" placeholder="Numero de la Sala" /><br>
';
if($this->option == "new_hall")
$html .='<input type="submit" id="submit" name="sumbit" value="Crear Sala" class="primary" />
';
if($this->option == "edit_hall"){
$html .='<input type="submit" id="submit" name="sumbit" value="Editar Sala" class="primary" />
<input type="submit" id="submit" name="delete" onclick="return confirm(\'Seguro que quieres borrar esta sala?\')" value="Eliminar Sala" class="black button" />
';
}
if(!$errorCols && !$errorRows){
$html .='</div>
<div class="column right">
<input type="submit" name="alltoone" value="Activar todos los asientos" class="button large" />
<input type="submit" name="alltozero" value="Desactivar todos los asientos" class="button large" />
<h3 class="table_title"> Pantalla </h3>
<table class="seat">
<thead>
<tr>
<th> </th>
';
for($j = 1; $j<=$cols; $j++){
$html .= '<th>'.$j.'</th>
';
}
$html .= '</tr>
</thead>
<tbody>';
for($i = 1;$i<=$rows;$i++){
$html .= '
<tr>
<td>'.$i.'</td>
';
for($j=1; $j<=$cols; $j++){
if($seats_map[$i][$j]>=0){
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" checked> <label for="checkbox'.$i.$j.'"> </td>
';}
else {
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" > <label for="checkbox'.$i.$j.'"> </td>
';}
}
$html .='</tr>';
}
$html .= '
</tbody>
</table>
</div>';
} else
$html .='</div>';
return $html;
}
//Process form:
protected function procesaFormulario($datos){
$result = array();
$rows = $datos['rows'];
$cols = $datos['cols'];
//Prepare the seat_map
$seats_map = array();
$seats = 0;
for($i = 1;$i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
if(isset($datos["checkbox".$i.$j])){
$seats_map[$i][$j] = $datos["checkbox".$i.$j];
$seats++;
if($seats_map[$i][$j] == "-1"){
$seats_map[$i][$j] = "0";
}
}else{
$seats_map[$i][$j] = "-1";
}
}
}
//Check input errors
if ($seats == 0 && isset($datos["sumbit"]) ) {
$result['seats'] = "<li> No puede haber 0 asientos disponibles. </li> <br>";
}
if ($rows <= 0) {
$result['rows'] = "<li> No puede haber 0 o menos filas. </li> <br>";
}
if ($cols <= 0) {
$result['cols'] = "<li> No puede haber 0 o menos columnas. </li> <br>";
}
$number = $datos['number'] ?? null;
if (empty($number) && isset($datos["sumbit"])) {
$result['number'] = "<li> El numero de sala tiene que ser mayor que 0. </li> <br>";
}
else if (count($result) === 0 && isset($datos["sumbit"]) ) {
if($this->option == "new_hall"){
$msg = Hall::create_hall($number, $this->cinema, $rows, $cols, $seats, $seats_map);
FormHall::prepare_message( $msg );
}
else if($this->option == "edit_hall"){
if($this->og_hall)
$msg = Hall::edit_hall($number,$this->cinema, $rows, $cols, $seats, $seats_map, $this->og_hall->getNumber());
else
$msg = "La sala que intentas editar ya no existe";
FormHall::prepare_message( $msg );
}
}
else if (!isset($result['number']) && isset($datos["delete"]) ) {
if($this->option == "edit_hall"){
$msg = Hall::delete_hall($number, $this->cinema, $rows, $cols, $seats, $seats_map, $this->og_hall->getNumber());
FormHall::prepare_message( $msg );
}
}
return $result;
}
public static function prepare_message( $msg ){
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> Operacion Completada </h1><hr />
<p>".$msg."</p>
<a href='./index.php?state=manage_halls'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
}
}
?>

View File

@ -0,0 +1,170 @@
<?php
require_once($prefix.'assets/php/includes/session_dao.php');
require_once($prefix.'assets/php/includes/session.php');
require_once($prefix.'assets/php/form.php');
//Receive data from froms and prepare the correct response
class FormSession extends Form {
private $option;
private $cinema;
private $formID;
//Constructor:
public function __construct($option, $cinema) {
$this->option = $option;
$this->cinema = $cinema;
$this->formID = 'formSession1';
$options = array("action" => "./?state=".$option);
parent::__construct('formSession',$options);
}
//TODO Edit session no funciona correctamente con el seleccionar una pelicula distinta, hay que guardar la id de la sesion de alguna forma y usarla o guardar en la sesion
protected function generaCamposFormulario($data, $errores = array()){
$hall = $data['hall'] ?? $_POST["hall"] ?? "";
$date = $data['date'] ?? $_POST["date"] ?? "";
$start = $data['start'] ?? $_POST["start"] ?? "";
$price = $data['price'] ?? $_POST["price"] ?? "";
$format = $data['format'] ?? $_POST["format"] ?? "";
$or_hall = $data["or_hall"] ?? $hall;
$or_date = $data["or_date"] ?? $date;
$or_start = $data["or_start"] ?? $start;
$film = $data['film'] ?? $_POST["film"] ?? "";
$tittle = $data['tittle'] ?? $_POST["tittle"] ?? "";
$duration = $data['duration'] ?? $_POST["duration"] ?? "";
$language = $data['language'] ?? $_POST["language"] ?? "";
$description = $data['description'] ?? $_POST["description"] ?? "";
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorPrice = self::createMensajeError($errores, 'price', 'span', array('class' => 'error'));
$errorFormat = self::createMensajeError($errores, 'format', 'span', array('class' => 'error'));
$errorDate = self::createMensajeError($errores, 'date', 'span', array('class' => 'error'));
$errorStart = self::createMensajeError($errores, 'start', 'span', array('class' => 'error'));
$html = '
<div class="column left">'.$htmlErroresGlobales.'
<fieldset>
<legend>Datos</legend>
'.$errorPrice.'
<input type="number" step="0.01" name="price" value="'.$price.'" min="0" placeholder="Precio de la entrada" /> <br>'
.$errorFormat.'
<input type="text" name="format" value="'.$format.'" placeholder="Formato de pelicula" /> <br>
<input type="hidden" name="film" value="'.$film.'"/>
<input type="hidden" name="option" value="'.$this->option.'"/>
<select name="hall" class="button large">';
foreach(Hall::getListHalls($this->cinema) as $hll){
if($hll->getNumber() == $hall){
$html.= '
<option value="'. $hll->getNumber() .'"selected> Sala '. $hll->getNumber() .'</option> ';
}else{
$html.= '
<option value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
}
$html.= '
</select>
<input type="hidden" name="or_hall" value="'.$or_hall.'"/>
</fieldset>
<fieldset>
<legend>Horario</legend>
'.$errorStart.'
<input type="time" name="start" value="'.$start.'" placeholder="Hora de inicio"/> <br>
<input type="hidden" name="or_start" value="'.$or_start.'"/>
'.$errorDate.'
<input type="date" name="date" value="'.$date.'" placeholder="Fecha de inicio" /> <br>
<input type="hidden" name="or_date" value="'.$or_date.'"/>
</fieldset>
';
if($film){
if($this->option == "new_session")
$html .= '<input type="number" name="repeat" value="" min="0" title="Añadir esta sesion durante los proximos X dias" min="0" max="31" placeholder="Añadir X dias"/> <br>
<input type="submit" id="submit" name="sumbit" class="primary" value="Crear" /> <br>';
if($this->option == "edit_session"){
$html .= '<input type="submit" id="submit" name="sumbit" class="primary" value="Editar" /><br>
<input type="submit" name="delete" class="black button" onclick="return confirm(\'Seguro que quieres borrar esta sesion?\')" value="Borrar" /><br>';
}
}
$html .= "
<input type='reset' id='reset' value='Limpiar Campos' >
</form>
</div>
<div class='column side'>";
if($film){
$html .= "<section id='".$tittle."'>
<div class='code showtimes'>
<div class='image'><img src='../img/films/".$tittle.".jpg' alt='".$tittle."' /></div>
<h2>".str_replace('_', ' ',$tittle)."</h2>
<hr />
<div class='blockquote'>
<p>".$description."</p>
</div>
<li>Duración: ".$duration." minutos</li>
<li>Duración: ".$language." minutos</li>
</div>
</section>
";
}
$html .= '<input type="submit" name="select_film" form="'.$this->formID.'" formaction="?state=select_film" class="button large" Value="Seleccionar una Pelicula" /><br>
</div>
';
return $html;
}
//Methods:
//Process form:
protected function procesaFormulario($data){
$result = array();
$film = $data['film'] ;
$hall = $data['hall'] ;
$date = $data['date'] ;
$start = $data['start'];
$price = $data['price'] ;
$format = $data['format'] ;
$repeat = $data['repeat'] ?? 0;
$or_hall = $data["or_hall"] ;
$or_date = $data["or_date"] ;
$or_start = $data["or_start"] ;
if (($price <= 0 || empty($price))&& isset($data["sumbit"]) ) {
$result['price'] = "<li> No puede haber 0 o menos euros. </li> <br>";
}
if ((empty($format))&& isset($data["sumbit"]) ) {
$result['format'] = "<li> El formato no puede estar vacio. </li> <br>";
}
if ((empty($date))&& isset($data["sumbit"]) ) {
$result['date'] = "<li> No hay una fecha seleccionada. </li> <br>";
}
if ((empty($start))&& isset($data["sumbit"]) ) {
$result['start'] = "<li> No hay una hora inicial seleccionada. </li> <br>";
}
if (count($result) === 0 && isset($data["sumbit"]) ) {
if($this->option == "new_session"){
$_SESSION['msg'] = Session::create_session($this->cinema, $hall, $start, $date, $film, $price, $format,$repeat);
$result = './?state=success';
}
if($this->option == "edit_session"){
$_SESSION['msg'] = Session::edit_session($this->cinema, $or_hall, $or_date, $or_start, $hall, $start, $date, $film, $price, $format);
$result = './?state=success';
}
}
if(!isset($result['hall']) && !isset($result['start']) && !isset($result['date']) && isset($data["delete"])) {
$_SESSION['msg'] = Session::delete_session($this->cinema, $or_hall, $or_start, $or_date);
$result = './?state=success';
}
return $result;
}
}
?>

View File

@ -0,0 +1,65 @@
<?php
//General Config File:
require_once('../../assets/php/config.php');
$prefix ="../../";
include_once('formHall.php');
include_once('formSession.php');
if(isset($_POST['new_hall'])){
$data = array("option" => "new_hall","number" => $_POST["number"],"cols" => $_POST["cols"],"rows" => $_POST["rows"], "cinema" => $_SESSION["cinema"], "seats" => 0);
//Check what checkboxs are seats or not
for($i = 1;$i<=$data["rows"];$i++){
for($j=1; $j<=$data["cols"]; $j++){
if(!empty($_POST['checkbox'.$i.$j.''])){
$data[$i][$j] = $_POST['checkbox'.$i.$j.''];
$data["seats"]++;
} else $data[$i][$j] = "-1";
}
}
FormHall::processesForm($data);
}
if(isset($_POST['edit_hall'])){
$data = array("option" => "edit_hall","number" => $_POST["number"],"cols" => $_POST["cols"],"rows" => $_POST["rows"], "cinema" => $_SESSION["cinema"],"seats" => 0);
//Check what checkboxs are seats or not
for($i = 1;$i<=$data["rows"];$i++){
for($j=1; $j<=$data["cols"]; $j++){
if(!empty($_POST['checkbox'.$i.$j.''])){
$data[$i][$j] = $_POST['checkbox'.$i.$j.''];
$data["seats"]++;
} else $data[$i][$j] = "-1";
}
}
FormHall::processesForm($data);
}
if(isset($_POST['delete_hall'])){
$data = array("option" => "delete_hall","number" => $_POST["number"], "cinema" => $_SESSION["cinema"]);
FormHall::processesForm($data);
}
if(isset($_POST['new_session'])){
$data = array("option" => "new_session","film" => $_POST["film"],"hall" => $_POST["hall"],"date" => $_POST["date"],"start" => $_POST["start"]
,"price" => $_POST["price"],"format" => $_POST["format"],"repeat" => $_POST["repeat"], "cinema" => $_SESSION["cinema"]);
FormSession::processesForm($data);
}
if(isset($_POST['edit_session'])){
$data = array("option" => "edit_session","film" => $_POST["film"],"hall" => $_POST["hall"],"date" => $_POST["date"],"start" => $_POST["start"]
,"price" => $_POST["price"],"format" => $_POST["format"],"repeat" => $_POST["repeat"], "cinema" => $_SESSION["cinema"]
, "origin_hall"=>$_SESSION["or_hall"],"origin_date"=> $_SESSION["or_date"],"origin_start"=> $_SESSION["or_start"]);
$_SESSION["or_hall"] = "";
$_SESSION["or_date"] = "";
$_SESSION["or_start"] = "";
FormSession::processesForm($data);
}
if(isset($_POST['delete_session'])){
$data = array("option" => "delete_session","cinema" => $_SESSION["cinema"], "hall"=> $_POST["origin_hall"]
,"date"=> $_POST["origin_date"],"start"=> $_POST["origin_start"]);
FormSession::processesForm($data);
}
?>

View File

@ -0,0 +1,197 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Controller file:
require_once('panel_manager.php');
require_once('../assets/php/includes/manager_dao.php');
require_once('../assets/php/includes/manager.php');
require_once('../assets/php/includes/user.php');
if($_SESSION["login"] && isset($_SESSION["lastRol"]) && ($_SESSION["lastRol"] === "admin" || $_SESSION["rol"] === "manager")) {
$manager = new Manager(null, null, null, null, null);
if(isset($_POST['changecinema']))$_SESSION['cinema'] = $_POST['cinema'];
$state = isset($_GET['state']) ? $_GET['state'] : '';
switch($state){
case "view_user":
$_SESSION["rol"] = null;
$panel .= "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario NO Registrado.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "view_ruser":
$_SESSION["rol"] = "user";
unset($_SESSION["cinema"]);
$panel .= "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario Registrado.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "manage_halls":
$panel = Manager_panel::manage_halls();
break;
case "new_hall":
$panel = Manager_panel::new_hall();
break;
case "edit_hall":
$panel = Manager_panel::edit_hall();
break;
case "manage_sessions":
$panel = Manager_panel::manage_sessions();
break;
case "new_session":
$panel = Manager_panel::new_session();
break;
case "edit_session":
$panel = Manager_panel::edit_session();
break;
case "select_film":
$panel = Manager_panel::select_film($template);
break;
case "calendar":
$panel = Manager_panel::calendar();
break;
case "success":
$panel = Manager_panel::success();
break;
default:
$panel = Manager_panel::welcomeAdmin($manager);
break;
}
}
else if($_SESSION["login"] && $_SESSION["rol"] === "manager"){
if(!isset($_SESSION['cinema'])){
$bd = new Manager_DAO('complucine');
if($bd){
$user = unserialize($_SESSION["user"]);
$manager = $bd->GetManager($user->getId());
$manager = $manager->fetch_assoc();
$_SESSION['cinema'] = $manager["idcinema"];
}
}
$state = isset($_GET['state']) ? $_GET['state'] : '';
switch($state){
case "view_user":
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = null;
unset($_SESSION["cinema"]);
$panel = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario NO Registrado.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "view_ruser":
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = "user";
unset($_SESSION["cinema"]);
$panel = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario Registrado.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "manage_halls":
$panel = Manager_panel::manage_halls();
break;
case "new_hall":
$panel = Manager_panel::new_hall();
break;
case "edit_hall":
$panel = Manager_panel::edit_hall();
break;
case "manage_sessions":
$panel = Manager_panel::manage_sessions();
break;
case "new_session":
$panel = Manager_panel::new_session();
break;
case "edit_session":
$panel = Manager_panel::edit_session();
break;
case "select_film":
$panel = Manager_panel::select_film($template);
break;
case "success":
$panel = Manager_panel::success();
break;
case "calendar":
$panel = Manager_panel::calendar();
break;
default:
$panel = Manager_panel::welcome();
break;
}
}
else{
$panel = '<div class="column side"></div>
<div class="column middle">
<div class="code info">
<h1>Debes iniciar sesión para ver el Panel de Manager.</h1><hr />
<p>Inicia Sesión con una cuenta de Gerente.</p>
<a href="'.$prefix.'login/" ><button class="button large">Iniciar Sesión</button></a>
</div>
</div>
<div class="column side"></div>'."\n";
}
//Specific page content:
$section = '<!-- Manager Panel -->
<link rel="stylesheet" href="../assets/css/manager.css">
<section id="manager_panel">
<!-- Contents -->
<div class="row">
'.$panel.'
</div>
</section>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.4.0/fullcalendar.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.4.0/fullcalendar.min.js"></script>
<script src="./sessioncalendar.js"></script>

159
panel_manager/index.php Normal file
View File

@ -0,0 +1,159 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Controller file:
require_once('panel_manager.php');
require_once('../assets/php/includes/manager_dao.php');
require_once('../assets/php/includes/manager.php');
require_once('../assets/php/includes/user.php');
if($_SESSION["login"] && isset($_SESSION["lastRol"]) && ($_SESSION["lastRol"] === "admin" || $_SESSION["rol"] === "manager")) {
$manager = new Manager(null, null, null, null, null);
if(isset($_POST['changecinema']))$_SESSION['cinema'] = $_POST['cinema'];
$state = isset($_GET['state']) ? $_GET['state'] : '';
switch($state){
case "view_user":
$_SESSION["rol"] = null;
$panel .= "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario NO Registrado.</p>
<a href='".$prefix."'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "view_ruser":
$_SESSION["rol"] = "user";
unset($_SESSION["cinema"]);
$panel .= "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario Registrado.</p>
<a href='".$prefix."'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "manage_halls":
$panel = Manager_panel::manage_halls();
break;
case "new_hall":
$panel = Manager_panel::new_hall();
break;
case "edit_hall":
$panel = Manager_panel::edit_hall();
break;
case "manage_sessions":
$panel = Manager_panel::calendar();
break;
default:
$panel = Manager_panel::welcomeAdmin($manager);
break;
}
}
else if($_SESSION["login"] && $_SESSION["rol"] === "manager"){
if(!isset($_SESSION['cinema'])){
$bd = new Manager_DAO('complucine');
if($bd){
$user = unserialize($_SESSION["user"]);
$manager = $bd->GetManager($user->getId());
$manager = $manager->fetch_assoc();
$_SESSION['cinema'] = $manager["idcinema"];
}
}
$state = isset($_GET['state']) ? $_GET['state'] : '';
switch($state){
case "view_user":
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = null;
unset($_SESSION["cinema"]);
$panel = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario NO Registrado.</p>
<a href='".$prefix."'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "view_ruser":
$_SESSION["lastRol"] = $_SESSION["rol"];
$_SESSION["rol"] = "user";
unset($_SESSION["cinema"]);
$panel = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1> ¡ATENCIÓN! </h1><hr />
<p>Está viendo la web como un Usuario Registrado.</p>
<a href='".$prefix."'><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
break;
case "manage_halls":
$panel = Manager_panel::manage_halls();
break;
case "new_hall":
$panel = Manager_panel::new_hall();
break;
case "edit_hall":
$panel = Manager_panel::edit_hall();
break;
case "manage_sessions":
$panel = Manager_panel::calendar();
break;
default:
$panel = Manager_panel::welcome();
break;
}
}
else{
$panel = '<div class="column side"></div>
<div class="column middle">
<div class="code info">
<h1>Debes iniciar sesión para ver el Panel de Manager.</h1><hr />
<p>Inicia Sesión con una cuenta de Gerente.</p>
<a href="'.$prefix.'login/" ><button class="button large">Iniciar Sesión</button></a>
</div>
</div>
<div class="column side"></div>'."\n";
}
//Specific page content:
$section = '<!-- Manager Panel -->
<link rel="stylesheet" href="../assets/css/manager.css">
<section id="manager_panel">
<!-- Contents -->
<div class="row">
'.$panel.'
</div>
</section>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,334 @@
<?php
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/session.php');
require_once($prefix.'assets/php/includes/manager.php');
require_once($prefix.'assets/php/includes/cinema_dao.php');
include_once('./includes/formHall.php');
include_once('./includes/formSession.php');
class Manager_panel {
function __construct(){}
static function welcome(){
$bd = new Cinema_DAO('complucine');
if($bd){
$cinema = $bd->cinemaData($_SESSION["cinema"]);
$c_name = $cinema->getName();
$c_dir = $cinema->getDirection();
}
$name = strtoupper($_SESSION["nombre"]);
$userPic = USER_PICS.strtolower($name).".jpg";
$panel= '<div class="code welcome">
<h1>Bienvenido '.$name.' a tu Panel de Manager.</h1>
<hr />
<img src='.$userPic.' alt="user_profile_picture"/>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<p>Usuario: '.$name.'</p> <br>
<p>Cine: '.$c_name.'</p>
<p>Dirección: '.$c_dir.'</p>
<a href="?state=calendar"> <p> Hack para entrar al calendario <p> </a>
</div>'."\n";
return $panel;
}
static function welcomeAdmin() {
$cinemaList = new Cinema_DAO('complucine');
$cinemas = $cinemaList->allCinemaData();
$bd = new Cinema_DAO('complucine');
$c_name = "Aun no se ha escogido un cine";
if($bd && $_SESSION["cinema"] ){
$cinema = $bd->cinemaData($_SESSION["cinema"]);
$c_name = $cinema->getName();
$cinema = $cinema->getId();
}
$name = strtoupper($_SESSION["nombre"]);
$userPic = USER_PICS.strtolower($name).".jpg";
$panel= '<div class="code welcome">
<h1>Bienvenido '.$name.' a tu Panel de Manager.</h1>
<hr />
<div class="column side"> </div>
<div class="column middle">
<img src='.$userPic.' alt="user_profile_picture"/>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<p>Usuario: '.$name.'</p> <br>
<h3>Como administrador puedes escoger el cine que gestionar</h3>
<p>Cine: '.$c_name.'</p>
<a href="?state=calendar"> <p> Hack para entrar al calendario <p> </a>
<form method="post" id="changecinema" action="index.php">
<select name="cinema" class="button large">
';
foreach($cinemas as $c){
if($c->getId() == $cinema){
$panel .= "<option value=\"". $c->getId() ." \"selected> " . $c->getName() ."</option>
";
}else{
$panel .= "<option value=\"". $c->getId() ." \"> " . $c->getName() . "</option>
";
}
}
$panel .= ' <input type="submit" id="submit" name="changecinema" value="Cambiar" class="primary" />
</select>
</form>
</div>
<div class="column side"> </div>
';
return $panel;
}
static function calendar(){
$formSession = new FormSession("new_session", $_SESSION["cinema"] );
$hall = $_POST['hall'] ?? $_GET['hall'] ?? "1";
$halls = Hall::getListHalls($_SESSION["cinema"]);
if($halls){
$panel ='
<div class="row">
<div class="column side"></div>
<div class="column middle">
<br>
<select id="hall_selector" class="button large">';
foreach(Hall::getListHalls($_SESSION["cinema"]) as $hll){
if($hll->getNumber() == $hall){
$panel.= '
<option data-feed="./eventos.php?hall='.$hll->getNumber().'" value="'. $hll->getNumber() .'"selected> Sala '. $hll->getNumber() .'</option> ';
}else{
$panel.= '
<option data-feed="./eventos.php?hall='.$hll->getNumber().'" value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
}
$panel.='
</select>
</div>
<div class="column side"></div>
</div>
<div class="row">
<div id="myModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span>
'.$formSession->gestiona().'
</div>
</div>
<div id="calendar"></div>
</div>';
}else{
$panel ='<div class="row">
<h3> No hay ninguna sala en este cine </h3>
<a href=."/?state=new_hall"> Añadir Sala </a>
</div>';
}
return $panel;
}
static function success(){
$panel = '<div class="code info">
<h1>Operacion completada.</h1>
<hr />
<p>'.$_SESSION['msg'].'</p>
</div>'."\n";
$_SESSION['msg'] = "";
return $panel;
}
static function manage_halls(){
$panel = '<div class="column side"></div>
<div class="column middle">';
$listhall = Hall::getListHalls($_SESSION["cinema"]);
if(!$listhall){
$panel .= "<h2> No hay ninguna sala en este cine";
}else{
$panel .= '
<ul class="tablelist col3">
<li class="title"> Sala </li>
<li class="title"> Asientos </li>
<li class="title"> Sesión </li>
';
$parity = "odd";
foreach($listhall as $hall){
$panel .='<div class="'.$parity.'">
<a class="h2long" href="?state=edit_hall&number='. $hall->getNumber().'">
<li> '. $hall->getNumber().'</li>
<li> '.$hall->getTotalSeats().' </li>
</a>
<a href="?state=calendar&hall='. $hall->getNumber().'">
<li> Sesiones </li>
</a>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
}
$panel.='
</ul>';
}
$panel.='
<form method="post" action="./?state=new_hall">
<input type="submit" name="new_hall" value="Añadir Sala" class="button large" />
</form>
</div>
<div class="column side"></div>';
return $panel;
}
static function new_hall(){
$formHall = new FormHall("new_hall",$_SESSION["cinema"],new Hall(null, null, null, null, null, null));
$panel = '<h1>Crear una sala.</h1><hr/></br>
'.$formHall->gestiona();
return $panel;
}
static function edit_hall(){
$hall = Hall::search_hall($_GET["number"], $_SESSION["cinema"]);
if($hall || isset($_POST["restart"]) || isset($_POST["filter"]) || isset($_POST["sumbit"]) ){
$formHall = new FormHall("edit_hall",$_SESSION["cinema"], $hall);
$panel = '<h1>Editar una sala.</h1><hr/></br>
'.$formHall->gestiona();
return $panel;
} else{
return Manager_panel::warning();
}
}
static function manage_sessions(){
//Base filtering values
$date = $_POST['date'] ?? $_GET['date'] ?? date("Y-m-d");
$hall = $_POST['hall'] ?? $_GET['hall'] ?? "1";
//Session filter
$panel='<div class = "column left">
<form method="post" id="filter" action="./?state=manage_sessions">
<input type="date" name="date" value="'.$date.'" min="2021-01-01" max="2031-12-31">
<select name="hall" class="button large">';
foreach(Hall::getListHalls($_SESSION["cinema"]) as $hll){
if($hll->getNumber() == $hall){
$panel.= '
<option value="'. $hll->getNumber() .'"selected> Sala '. $hll->getNumber() .'</option> ';
}else{
$panel.= '
<option value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
}
$panel.='
</select>
<input type="submit" name="filter" value="Filtrar" class="button large"/>
</form>
</div>
';
//Session list
$panel .=' <div class = "column right">';
$sessions = Session::getListSessions($hall,$_SESSION["cinema"],$date);
if($sessions) {
$panel .='
<form method="post" action="./?state=edit_session">
<table class="alt">
<thead>
<tr>
<th>Hora</th>
<th>Pelicula</th>
<th>Formato</th>
<th>Precio</th>
</tr>
</thead>
<tbody>';
foreach($sessions as $session){
$film = Session::getThisSessionFilm($session->getIdfilm());
$panel .='
<tr>
<td> '.date("H:i", strtotime( $session->getStartTime())).' </td>
<td> '. str_replace('_', ' ', $film["tittle"]) .' </td>
<td> '.$session->getFormat().' </td>
<td> '.$session->getSeatPrice().' </td>
<form method="post" action="./?state=edit_session">
<input name="film" type="hidden" value="'.$session->getIdfilm().'">
<input name="tittle" type="hidden" value="'.$film["tittle"].'">
<input name="duration" type="hidden" value="'.$film["duration"].'">
<input name="language" type="hidden" value="'.$film["language"].'">
<input name="description" type="hidden" value="'.$film["description"].'">
<input name="hall" type="hidden" value="'.$session->getIdhall().'">
<input name="date" type="hidden" value="'.$session->getDate().'">
<input name="start" type="hidden" value="'.$session->getStartTime().'">
<input name="price" type="hidden" value="'.$session->getSeatPrice().'">
<input name="format" type="hidden" value="'.$session->getFormat().'">
<td> <input type="submit" id="submit" name ="edit_session" value="Editar" class="primary" /> </td>
</form>
</tr>';
}
$panel.='
</tbody>
</table>
</form>';
} else {
$panel.=' <h3> No hay ninguna sesion </h3>';
}
$panel.='
<input type="submit" name="new_session" form="filter" value="Añadir" class="button large" formaction="./?state=new_session">
</div>';
return $panel;
}
static function new_session(){
$formSession = new FormSession("new_session", $_SESSION["cinema"] );
$panel = '<h1>Crear una sesion.</h1> <hr/> </br>
'.$formSession->gestiona();
return $panel;
}
static function edit_session(){
$formSession = new FormSession("edit_session", $_SESSION["cinema"] );
$panel = '<h1>Editar una sesion.</h1><hr/></br>
'.$formSession->gestiona();
return $panel;
}
//TODO: estado al modificar sesiones para la seleccion de peliculas usando el template->print films
static function select_film($template){
if(isset($_POST["select_film"]) && isset($_POST["option"])){
$_SESSION["option"] = $_POST["option"];
$panel = '<h1>Seleccionar Pelicula.</h1><hr /></br>';
$panel .= $template->print_fimls();
$_SESSION["option"] = "";
} else $panel = self::warning();
return $panel;
}
//Funcion que se envia cuando hay inconsistencia en el panel manager, principalmente por tocar cosas con la ulr
static function warning(){
$panel = '<div class="code info">
<h1>Ha habido un error.</h1>
<hr />
<p> >.< </p>
</div>'."\n";
return $panel;
}
}
?>

View File

@ -0,0 +1,223 @@
<?php
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/session.php');
require_once($prefix.'assets/php/includes/cinema_dao.php');
include_once('./includes/formHall.php');
include_once('./includes/SessionForm.php');
class Manager_panel {
function __construct(){}
static function welcome(){
$bd = new Cinema_DAO('complucine');
if($bd){
$cinema = $bd->cinemaData($_SESSION["cinema"]);
$c_name = $cinema->getName();
$c_dir = $cinema->getDirection();
}
$name = strtoupper($_SESSION["nombre"]);
$userPic = USER_PICS.strtolower($name).".jpg";
$panel= '<div class="code welcome">
<h1>Bienvenido '.$name.' a tu Panel de Manager.</h1>
<hr />
<img src='.$userPic.' alt="user_profile_picture"/>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<p>Usuario: '.$name.'</p> <br>
<p>Cine: '.$c_name.'</p>
<p>Dirección: '.$c_dir.'</p>
</div>'."\n";
return $panel;
}
// Admin welcome panel allows to change the cinema linked to the admin-like-manager
static function welcomeAdmin() {
$cinemaList = new Cinema_DAO('complucine');
$cinemas = $cinemaList->allCinemaData();
$bd = new Cinema_DAO('complucine');
$c_name = "Aun no se ha escogido un cine";
if($bd && $_SESSION["cinema"] ){
$cinema = $bd->cinemaData($_SESSION["cinema"]);
$c_name = $cinema->getName();
$cinema = $cinema->getId();
}
$name = strtoupper($_SESSION["nombre"]);
$userPic = USER_PICS.strtolower($name).".jpg";
$panel= '<div class="code welcome">
<h1>Bienvenido '.$name.' a tu Panel de Manager.</h1>
<hr />
<div class="column side"> </div>
<div class="column middle">
<img src='.$userPic.' alt="user_profile_picture"/>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<p>Usuario: '.$name.'</p> <br>
<h3>Como administrador puedes escoger el cine que gestionar</h3>
<p>Cine: '.$c_name.'</p>
<form method="post" id="changecinema" action="index.php">
<select name="cinema" class="button large">
';
foreach($cinemas as $c){
if($c->getId() == $cinema){
$panel .= "<option value=\"". $c->getId() ." \"selected> " . $c->getName() ."</option>
";
}else{
$panel .= "<option value=\"". $c->getId() ." \"> " . $c->getName() . "</option>
";
}
}
$panel .= ' <input type="submit" id="submit" name="changecinema" value="Cambiar" class="primary" />
</select>
</form>
</div>
<div class="column side"> </div>
';
return $panel;
}
//Manage the sessions using full calendar js events and a pop up form which is constantly edited with more js
static function calendar(){
if(isset($_SESSION["cinema"])){
$hall = $_POST['hall'] ?? $_GET['hall'] ?? "1";
$halls = Hall::getListHalls($_SESSION["cinema"]);
if($halls){
$panel ='
<div class="row">
<div class="column side"></div>
<div class="column middle">
<br>
<select id="hall_selector" class="button large">';
foreach(Hall::getListHalls($_SESSION["cinema"]) as $hll){
if($hll->getNumber() == $hall){
$panel.= '
<option data-feed="./eventsProcess.php?hall='.$hll->getNumber().'" value="'. $hll->getNumber() .'"selected> Sala '. $hll->getNumber() .'</option> ';
}else{
$panel.= '
<option data-feed="./eventsProcess.php?hall='.$hll->getNumber().'" value="'. $hll->getNumber() .'"> Sala '. $hll->getNumber() .'</option>';
}
}
$panel.='
</select>
</div>
<div class="column side"></div>
</div>
<div class="row fc-container">
<div id="calendar"></div>
<div id="myModal" class="modal">
<div class="modal-content">
<span class="close">&times;</span> <br> <br>
'.SessionForm::getForm().'
</div>
</div>
</div>';
}else{
$panel ='<div class="row">
<h3> No hay ninguna sala en este cine </h3>
<a href=."/?state=new_hall"> Añadir Sala </a>
</div>';
}
}else{
$panel = '<div class="code info">
<h1>Aun no se ha seleccionado un cine.</h1>
<hr />
<p> >.< </p>
<p> Selecciona un cine en el panel principal </p>
</div>'."\n";
}
return $panel;
}
static function manage_halls(){
if(isset($_SESSION["cinema"])){
$panel = '<div class="column side"></div>
<div class="column middle">';
$listhall = Hall::getListHalls($_SESSION["cinema"]);
if(!$listhall){
$panel .= "<h2> No hay ninguna sala en este cine";
}else{
$panel .= '
<ul class="tablelist col3">
<li class="title"> Sala </li>
<li class="title"> Asientos </li>
<li class="title"> Sesión </li>
';
$parity = "odd";
foreach($listhall as $hall){
$panel .='<div class="'.$parity.'">
<a class="h2long" href="?state=edit_hall&number='. $hall->getNumber().'">
<li> '. $hall->getNumber().'</li>
<li> '.$hall->getTotalSeats().' </li>
</a>
<a href="?state=manage_sessions&hall='. $hall->getNumber().'">
<li> Sesiones </li>
</a>
</div>
';
$parity = ($parity == "odd") ? "even" : "odd";
}
$panel.='
</ul>';
}
$panel.='
<form method="post" action="./?state=new_hall">
<input type="submit" name="new_hall" value="Añadir Sala" class="button large" />
</form>
</div>
<div class="column side"></div>';
}else{
$panel = '<div class="code info">
<h1>Aun no se ha seleccionado un cine.</h1>
<hr />
<p> >.< </p>
<p> Selecciona un cine en el panel principal </p>
</div>'."\n";
}
return $panel;
}
static function new_hall(){
$formHall = new FormHall("new_hall",$_SESSION["cinema"],new Hall(null, null, null, null, null, null));
$panel = '<h1>Crear una sala.</h1><hr/></br>
'.$formHall->gestiona();
return $panel;
}
static function edit_hall(){
$hall = Hall::search_hall($_GET["number"], $_SESSION["cinema"]);
if($hall || isset($_POST["restart"]) || isset($_POST["filter"]) || isset($_POST["sumbit"]) ){
$formHall = new FormHall("edit_hall",$_SESSION["cinema"], $hall);
$panel = '<h1>Editar una sala.</h1><hr/></br>
'.$formHall->gestiona();
return $panel;
} else{
return Manager_panel::warning();
}
}
//this function is used as an answer to wrong url parameters accesing a formhall edit. The formsession version has been replaced by other js error replys
static function warning(){
$panel = '<div class="code info">
<h1>Ha habido un error.</h1>
<hr />
<p> >.< </p>
</div>'."\n";
return $panel;
}
}
?>

View File

@ -0,0 +1,57 @@
<?php
$errors = [];
$data = [];
if (empty($_POST['price']) || $_POST['price'] <= 0 ) {
$errors['price'] = 'El precio no puede ser 0.';
}
if (empty($_POST['format'])) {
$errors['format'] = 'El formato no puede estar vacio. Ej: 3D, 2D, voz original';
}
if (empty($_POST['hall']) || $_POST['hall']<=0 ) {
$errors['hall'] = 'La sala no puede ser 0 o menor';
}
if (empty($_POST['startDate'])) {
$errors['startDate'] = 'Las sesiones tienen que empezar algun dia.';
}
if (empty($_POST['endDate'])) {
$errors['endDate'] = 'Las sesiones tienen que teminar algun dia.';
}
if (!empty($_POST['startDate']) && !empty($_POST['endDate'])) {
$start = strtotime($_POST['startDate']);
$end = strtotime($_POST['endDate']);
$start = date('Y-m-d', $start);
$end = date('Y-m-d', $end);
if($start >= $end){
$errors['date'] = 'La fecha inicial no puede ser antes o el mismo dia que la final.';
}
}
if (empty($_POST['startHour'])) {
$errors['startHour'] = 'Es necesario escoger el horario de la sesion.';
}
if (!empty($errors)){
error_log("creamos una sesion, wahoo");
Session::create_session("1", $_POST['hall'], $_POST['startHour'], $_POST['startDate'],
"1",$_POST['price'], $_POST['format'],"0");
$data['success'] = false;
$data['errors'] = $errors;
} else {
$data['success'] = true;
$data['message'] = 'Success!';
}
echo json_encode($data);

View File

@ -0,0 +1,138 @@
$(document).ready(function(){
var selectedFeed = $('#hall_selector').find(':selected').data('feed');
var modal = document.getElementById("myModal");
// Get the button that opens the modal
var btn = document.getElementById("myBtn");
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
var calendar = $('#calendar').fullCalendar({
editable:true,
header:{
left:'prev,next today',
center:'title',
right:'month,agendaWeek,agendaDay'
},
eventSources: [ selectedFeed ],
selectable:true,
selectHelper:true,
timeFormat: 'H:mm',
select: function(start, end, allDay)
{
modal.style.display = "block";
/*
var e = {
"date" : $.fullCalendar.formatDate(allDay,"Y-MM-DD"),
"start" : $.fullCalendar.formatDate(start, "HH:mm"),
"end" : $.fullCalendar.formatDate(end, "HH:mm")
};
$.ajax({
url:"eventos.php",
type:"POST",
contentType: 'application/json; charset=utf-8',
dataType: "json",
data:JSON.stringify(e),
success:function()
{
calendar.fullCalendar('refetchEvents');
alert("Added Successfully");
}
})*/
},
editable:true,
eventResize:function(event)
{
var e = {
"id" : event.id,
"userId": event.userId,
"start" : $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss"),
"end" : $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss"),
"title" : event.title
};
$.ajax({
url:"eventos.php?idEvento="+event.id,
type:"PUT",
contentType: 'application/json; charset=utf-8',
dataType:"json",
data:JSON.stringify(e),
success:function(){
calendar.fullCalendar('refetchEvents');
alert('Event Update');
}
})
},
eventDrop:function(event)
{
var e = {
"id" : event.id,
"userId": event.userId,
"start" : $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss"),
"end" : $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss"),
"title" : event.title
};
$.ajax({
url:"eventos.php?idEvento="+event.id,
contentType: 'application/json; charset=utf-8',
dataType: "json",
type:"PUT",
data:JSON.stringify(e),
success:function()
{
calendar.fullCalendar('refetchEvents');
alert("Event Updated");
}
});
},
eventClick:function(event)
{
if(confirm("Are you sure you want to remove it?"))
{
var id = event.id;
$.ajax({
url:"eventos.php?idEvento="+id,
contentType: 'application/json; charset=utf-8',
dataType: "json",
type:"DELETE",
success:function()
{
calendar.fullCalendar('refetchEvents');
alert("Event Removed");
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("Status: " + textStatus); alert("Error: " + errorThrown);
}
})
}
},
});
$('#hall_selector').change(onSelectChangeFeed);
function onSelectChangeFeed() {
var feed = $(this).find(':selected').data('feed');
$('#calendar').fullCalendar('removeEventSource', selectedFeed);
$('#calendar').fullCalendar('addEventSource', feed);
selectedFeed = feed;
};
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
modal.style.display = "none";
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
});

View File

@ -0,0 +1,172 @@
$(document).ready(function(){
var selectedFeed = $('#hall_selector').find(':selected').data('feed');
var modal = document.getElementById("myModal");
// Get the button that opens the modal
var btn = document.getElementById("myBtn");
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
var calendar = $('#calendar').fullCalendar({
editable:true,
header:{
left:'prev,next today',
center:'title',
right:'month,agendaWeek,agendaDay'
},
firstDay: 1,
fixedWeekCount: false,
eventSources: [ selectedFeed ],
selectable:true,
selectHelper:true,
timeFormat: 'H:mm',
select: function(start, end, allDay)
{
$(modal).fadeIn();
var x = document.getElementById("film_group");
x.style.display = "none";
x = document.getElementById("film_list");
x.style.display = "block";
document.getElementById("hall").value = document.getElementById("hall_selector").value;
document.getElementById("startDate").value = $.fullCalendar.formatDate( start, "Y-MM-DD" );
document.getElementById("endDate").value = $.fullCalendar.formatDate( end, "Y-MM-DD" );
/*
var e = {
"date" : $.fullCalendar.formatDate(allDay,"Y-MM-DD"),
"start" : $.fullCalendar.formatDate(start, "HH:mm"),
"end" : $.fullCalendar.formatDate(end, "HH:mm")
};
$.ajax({
url:"eventos.php",
type:"POST",
contentType: 'application/json; charset=utf-8',
dataType: "json",
data:JSON.stringify(e),
success:function()
{
calendar.fullCalendar('refetchEvents');
alert("Added Successfully");
}
})*/
},
editable:true,
eventResize:function(event)
{
var e = {
"id" : event.id,
"userId": event.userId,
"start" : $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss"),
"end" : $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss"),
"title" : event.title
};
$.ajax({
url:"eventos.php?idEvento="+event.id,
type:"PUT",
contentType: 'application/json; charset=utf-8',
dataType:"json",
data:JSON.stringify(e),
success:function(){
calendar.fullCalendar('refetchEvents');
alert('Event Update');
}
})
},
eventDrop:function(event)
{
var e = {
"id" : event.id,
"userId": event.userId,
"start" : $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss"),
"end" : $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss"),
"title" : event.title
};
$.ajax({
url:"eventos.php?idEvento="+event.id,
contentType: 'application/json; charset=utf-8',
dataType: "json",
type:"PUT",
data:JSON.stringify(e),
success:function()
{
calendar.fullCalendar('refetchEvents');
alert("Event Updated");
}
});
},
eventClick:function(event)
{
if(confirm("Are you sure you want to remove it?"))
{
var id = event.id;
$.ajax({
url:"eventos.php?idEvento="+id,
contentType: 'application/json; charset=utf-8',
dataType: "json",
type:"DELETE",
success:function()
{
calendar.fullCalendar('refetchEvents');
alert("Event Removed");
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert("Status: " + textStatus); alert("Error: " + errorThrown);
}
})
}
},
});
$('#hall_selector').change(onSelectChangeFeed);
function onSelectChangeFeed() {
var feed = $(this).find(':selected').data('feed');
$('#calendar').fullCalendar('removeEventSource', selectedFeed);
$('#calendar').fullCalendar('addEventSource', feed);
selectedFeed = feed;
};
// When the user clicks on <span> (x), close the modal
span.onclick = function() {
formout();
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
formout();
}
}
function formout(){
$(modal).fadeOut(100,function(){
var success = document.getElementById("success");
if(success){
calendar.fullCalendar('refetchEvents');
success.style.display = "none";
document.getElementById("new_session_form").style.display = "block";
document.getElementById("price").value = "";
document.getElementById("format").value = "";
document.getElementById("film_id").value = "";
document.getElementById("startHour").value ="";
}
});
}
});

View File

@ -0,0 +1,144 @@
$(document).ready(function () {
$("form#new_session_form").on('submit', function(e){
$(".form_group").removeClass("has_error");
$(".help_block").remove();
var formData = {
price: $("#price").val(),
format: $("#format").val(),
hall: $("#hall").val(),
startDate: $("#startDate").val(),
endDate: $("#endDate").val(),
startHour: $("#startHour").val(),
idFilm: $("#film_id").val(),
};
$.ajax({
type: "POST",
url:"eventos.php",
contentType: 'application/json; charset=utf-8',
dataType: "json",
data:JSON.stringify(formData),
encode: true,
}).done(function (data) {
console.log(data);
checkErrors(data,"new_session_form");
})
.fail(function (jqXHR, textStatus) {
$("form#new_session_form").html(
'<div class="alert alert-danger">Could not reach server, please try again later. '+textStatus+'</div>'
);
});
function checkErrors(data,formname) {
if (!data.success) {
if (data.errors.price) {
$("#price_group").addClass("has_error");
$("#price_group").append(
'<div class="help_block">' + data.errors.price + "</div>"
);
}
if (data.errors.format) {
$("#format_group").addClass("has_error");
$("#format_group").append(
'<div class="help_block">' + data.errors.format + "</div>"
);
}
if (data.errors.hall) {
$("#hall_group").addClass("has_error");
$("#hall_group").append(
'<div class="help_block">' + data.errors.hall + "</div>"
);
}
if (data.errors.startDate) {
$("#date_group").addClass("has_error");
$("#date_group").append(
'<div class="help_block">' + data.errors.startDate + "</div>"
);
}
if (data.errors.startDate) {
$("#date_group").addClass("has_error");
$("#date_group").append(
'<div class="help_block">' + data.errors.endDate + "</div>"
);
}
if (data.errors.date) {
$("#date_group").addClass("has_error");
$("#date_group").append(
'<div class="help_block">' + data.errors.date + "</div>"
);
}
if (data.errors.startHour) {
$("#hour_group").addClass("has_error");
$("#hour_group").append(
'<div class="help_block">' + data.errors.startHour + "</div>"
);
}
if (data.errors.idfilm) {
$("#film_msg_group").addClass("has_error");
$("#film_msg_group").append(
'<div class="help_block">' + data.errors.idfilm + "</div>"
);
}
if (data.errors.global) {
$("#global_group").addClass("has_error");
$("#global_group").append(
'<div class="help_block">' + data.errors.global + "</div>"
);
}
} else {
$("#operation_msg").addClass("has_no_error");
$("#operation_msg").append(
'<div class="alert alert-success" id="success">' + data.message + "</div>"
);
document.getElementById(formname).style.display = "none";
}
}
e.preventDefault();
});
$('.film_button').bind('click', function(e) {
var id = $(this).attr('id');
var x = document.getElementById("film_group");
x.style.display = "block";
var tittle = document.getElementById("title"+id);
document.getElementById("film_title").innerHTML = tittle.innerHTML;
var lan = document.getElementById("lan"+id);
document.getElementById("film_lan").innerHTML = lan.value;
var dur = document.getElementById("dur"+id);
document.getElementById("film_dur").innerHTML = dur.innerHTML;
var img = document.getElementById("img"+id);
document.getElementById("film_img").src = "../img/films/"+img.value;
var desc = document.getElementById("desc"+id);
document.getElementById("film_desc").innerHTML = desc.value;
var idf = document.getElementById("id"+id);
document.getElementById("film_id").value = idf.value;
x = document.getElementById("film_list")
x.style.display = "none";
});
$('#return').click( function() {
var x = document.getElementById("film_group");
x.style.display = "none";
x = document.getElementById("film_list");
x.style.display = "block";
});
});

1
panel_user/confirm.php Normal file
View File

@ -0,0 +1 @@
<?php echo"HOLA MUNDO"; ?>

View File

@ -0,0 +1,104 @@
<?php
require_once('../assets/php/form.php');
include_once('../assets/php/includes/user.php');
class FormChangeEmail extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "./?option=manage_profile");
parent::__construct('formChangeUserEmail', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$email = $datos['email'] ?? '';
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorEmail = self::createMensajeError($errores, 'new_email', 'span', array('class' => 'error'));
$errorEmail2 = self::createMensajeError($errores, 'remail', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='email_usuario'><pre>".$htmlErroresGlobales."</pre>
<legend>Nuevo email de usuario</legend>
<input type='text' name='new_email' id='new_email' value='' placeholder='Nuevo Email' required/><pre>".$errorEmail."</pre>
<span id='emailValid'>&#x2714;</span></span><span id='emailInvalid'>&#x274C;</span>
<input type='text' name='remail' id='remail' value='' placeholder='Repita el email' required/><pre>".$errorEmail2."</pre>
<input type='password' name='pass' id='pass' value='' placeholder='Contraseña' required/><pre>".$errorPassword."</pre>
</fieldset>
<div class='actions'>
<input type='submit' id='submit' value='Cambiar Email de Usuario' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$email = $this->test_input($datos['new_email']) ?? null;
if ( empty($email) || !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $email) ) {
$result['new_email'] = "El nuevo email no es válido.";
}
$email2 = $this->test_input($datos['remail']) ?? null;
if ( empty($email2) || strcmp($email, $email2) !== 0 ) {
$result['remail'] = "Los emails deben coincidir";
}
$password = $this->test_input($datos['pass']) ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
if (count($result) === 0) {
$bd = new UserDAO("complucine");
$user = $bd->selectUser(unserialize($_SESSION['user'])->getName(), $password);
if (!$user) {
$result[] = "El usuario no existe.";
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1>Ha ocurrido un probrema</h1><hr />
<p>No hemos podido actualizar su email de usuario.
Comprueba que la contraseña introducida sea correcta.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
} else {
$user = $bd->selectUserEmail($email);
if ($user->data_seek(0)){
$result[] = "El email ya está registrado.";
} else {
$bd->changeUserEmail(unserialize($_SESSION['user'])->getId(), $email);
$user = $bd->selectUser(unserialize($_SESSION['user'])->getName(), $password);
$_SESSION['user'] = serialize($user);
$_SESSION["nombre"] = $user->getName();
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1>Operacion realizada con exito</h1><hr />
<p>Se ha modificado su email correctamente.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
$result = './?option=manage_profile';
}
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,110 @@
<?php
require_once('../assets/php/form.php');
include_once('../assets/php/includes/user.php');
include_once('../assets/php/includes/user_dao.php');
class FormChangeName extends Form {
public function __construct() {
$options = array("action" => "./?option=manage_profile");
parent::__construct('formChangeUserName', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$nombre = $datos['nombreUsuario'] ?? '';
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'new_name', 'span', array('class' => 'error'));
$errorNombre2 = self::createMensajeError($errores, 'rename', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='nombre_usuario'><pre>".$htmlErroresGlobales."</pre>
<legend>Nuevo Nombre de usuario</legend>
<input type='text' name='new_name' id='new_name' value='' placeholder='Nuevo Nombre' required/><pre>".$errorNombre."</pre>
<span id='userValid'>&#x2714;</span><span id='userWarning'>&#x26a0;</span></span><span id='userInvalid'>&#x274C;</span>
<input type='text' name='rename' id='rename' value='' placeholder='Repita el nombre' required/><pre>".$errorNombre2."</pre>
<input type='password' name='pass' id='pass' value='' placeholder='Contraseña' required/><pre>".$errorPassword."</pre>
</fieldset>
<div class='actions'>
<input type='submit' id='submit' value='Cambiar Nombre de Usuario' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['new_name']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['new_name'] = "El nombre tiene que tener\n una longitud de al menos\n 3 caracteres\n y menos de 15 caracteres.";
}
$nombre2 = $this->test_input($datos['rename']) ?? null;
if ( empty($nombre2) || strcmp($nombre, $nombre2) !== 0 ) {
$result['rename'] = "Los nombres deben coincidir.";
}
$password = $this->test_input($datos['pass']) ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
if (count($result) === 0) {
$bd = new UserDAO("complucine");
$user = $bd->selectUser(unserialize($_SESSION['user'])->getName(), $password);
if (!$user) {
$result[] = "Ha ocurrido un problema\nal actualizar el nombre de usuario.";
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1>Ha ocurrido un probrema</h1><hr />
<p>No hemos podido actualizar su nombre de usuario.
Comprueba que la contraseña introducida sea correcta.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
} else {
$user = $bd->selectUserName($nombre);
if ($user->data_seek(0)){
$result[] = "El nombre de usuario ya existe.";
} else {
$bd->changeUserName(unserialize($_SESSION['user'])->getId(), $nombre);
$user = $bd->selectUser($nombre, $password);
$actual_img = "../img/users/".unserialize($_SESSION['user'])->getName().".jpg";
$new_img = "../img/users/".$nombre.".jpg";
copy($actual_img, $new_img);
unlink($actual_img);
$_SESSION['user'] = serialize($user);
$_SESSION["nombre"] = $user->getName();
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1>Operacion realizada con exito</h1><hr />
<p>Se ha modificado su nombre de usuario correctamente.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
$result = './?option=manage_profile';
}
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,95 @@
<?php
require_once('../assets/php/form.php');
include_once('../assets/php/includes/user.php');
class FormChangePass extends Form {
//Constants:
const HTML5_PASS_REGEXP = '^(?=\w*\d)(?=\w*[A-Z])(?=\w*[a-z])\S{4,16}$';
public function __construct() {
$options = array("action" => "./?option=manage_profile");
parent::__construct('formChangeUserPass', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorOldPass = self::createMensajeError($errores, 'old_pass', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'new_pass', 'span', array('class' => 'error'));
$errorPassword2 = self::createMensajeError($errores, 'repass', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='contraseña_usuario'><pre>".$htmlErroresGlobales."</pre>
<legend>Nueva Contraseña</legend>
<input type='password' name='old_pass' id='old_pass' value='' placeholder='Contraseña Actual' required/><pre>".$errorOldPass."</pre>
<input type='password' name='new_pass' id='new_pass' value='' placeholder='Nueva Contraseña' required/><pre>".$errorPassword."</pre>
<span id='passValid'>&#x2714;</span><span id='passWarning'>&#x26a0;</span></span><span id='passInvalid'>&#x274C;</span>
<input type='password' name='repass' id='repass' value='' placeholder='Repita la nueva contraseña' required/><pre>".$errorPassword2."</pre>
<span id='repassValid'>&#x2714;</span></span><span id='repassInvalid'>&#x274C;</span>
</fieldset>
<div class='actions'>
<input type='submit' id='submit' value='Cambiar Contraseña' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$old_pass = $this->test_input($datos['old_pass']) ?? null;
if ( empty($old_pass) || mb_strlen($old_pass) < 4 ) {
$result['old_pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
$password = $this->test_input($datos['new_pass']) ?? null;
if ( empty($password) || !mb_ereg_match(self::HTML5_PASS_REGEXP, $password) ) {
$result['new_pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres 1 mayúscula y 1 número.";
}
$password2 = $this->test_input($datos['repass']) ?? null;
if ( empty($password2) || strcmp($password, $password2) !== 0 ) {
$result['repass'] = "Los passwords deben coincidir.";
}
if (count($result) === 0) {
$bd = new UserDAO("complucine");
$user = $bd->selectUser(unserialize($_SESSION['user'])->getName(), $old_pass);
if (!$user) {
$result[] = "Ha ocurrido un problema\nal actualizar la contraseña.";
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1>Ha ocurrido un probrema</h1><hr />
<p>No hemos podido actualizar su contraseña de usuario.
Comprueba que la contraseña actual sea correcta.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
} else {
$bd->changeUserPass(unserialize($_SESSION['user'])->getId(), $password);
$_SESSION['message'] = "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<div class='code info'>
<h1>Operacion realizada con exito</h1><hr />
<p>Se ha modificado su contraseña de usuario correctamente.</p>
<a href=''><button>Cerrar Mensaje</button></a>
</div>
</div>
<div class='column side'></div>
</div>
";
$result = './?option=manage_profile';
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,99 @@
<?php
require_once('../assets/php/form.php');
include_once('../assets/php/includes/user.php');
include_once('../assets/php/includes/user_dao.php');
class FormDeleteAccount extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array("action" => "./?option=delete_user");
parent::__construct('formDeleteAccount', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
$nameValue = "value=".unserialize($_SESSION['user'])->getName()."";
$emailValue = "value=".unserialize($_SESSION['user'])->getEmail()."";
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'new_name', 'span', array('class' => 'error'));
$errorEmail = self::createMensajeError($errores, 'email', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error'));
$errorPassword2 = self::createMensajeError($errores, 'repass', 'span', array('class' => 'error'));
$errorVerify = self::createMensajeError($errores, 'verify', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='cuenta_usuario'><pre>".$htmlErroresGlobales."</pre><pre>".$errorVerify."</pre>
<legend>Datos de la cuenta</legend>
<input type='text' name='name' id='name' ".$nameValue." placeholder='Nombre de usuario' required/><pre>".$errorNombre."</pre>
<input type='text' name='email' id='email' ".$emailValue." placeholder='Email de usuario' required/><pre>".$errorEmail."</pre>
<input type='password' name='pass' id='new_pass' value='' placeholder='Contraseña' required/><pre>".$errorPassword."</pre>
<input type='password' name='repass' id='repass' value='' placeholder='Repita la contraseña' required/><pre>".$errorPassword2."</pre>
<span id='repassValid'>&#x2714;</span></span><span id='repassInvalid'>&#x274C;</span>
</fieldset>
<div class='verify'>
<input type='checkbox' id='checkbox' name='verify' required>
<label for='verify'>Al marcar esta casilla, verifica y entiende que esta acción no se puede deshacer.</label>
</div>
<div class='actions'>
<!-- <input type='submit' id='submit' value='Eliminar Cuenta de Usuario' class='primary' /> -->
<button class='danger' onclick='confirmDelete(event)'>Eliminar Usuario</button>
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['name']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['new_name'] = "El nombre tiene que tener\n una longitud de al menos\n 3 caracteres\n y menos de 15 caracteres.";
}
$email = $this->test_input($datos['email']) ?? null;
if ( empty($email) || !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $email) ) {
$result['email'] = "El email no es válido.";
}
$password = $this->test_input($datos['pass']) ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
$password2 = $this->test_input($datos['repass']) ?? null;
if ( empty($password2) || strcmp($password, $password2) !== 0 ) {
$result['repass'] = "Los passwords deben coincidir.";
}
$verify = $this->test_input($datos['verify']) ?? null;
if ( empty($verify) ) {
$result['verify'] = "Debe confirmar la casilla de verificación.";
}
if (count($result) === 0) {
$bd = new UserDAO("complucine");
$user = $bd->selectUser($nombre, $password);
if (!$user) {
$result[] = "El usuario o contraseña\nno son correctos.";
} else {
if( (unserialize($_SESSION['user'])->getId() === $user->getId()) && ($nombre === $user->getName())
&& ($email === $user->getEmail()) && ($bd->verifyPass($password, $user->getPass())) ){
$bd->deleteUserAccount($user->getId());
unset($_SESSION);
session_destroy();
$result = ROUTE_APP;
} else {
$result[] = "Los datos introducidos\nno son válidos.";
}
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,125 @@
<?php
require_once('../assets/php/form.php');
include_once('../assets/php/includes/user.php');
class FormUploadFiles extends Form {
const EXTENSIONS = array('gif','jpg','jpe','jpeg','png');
public function __construct() {
$options = array("enctype" => "multipart/form-data", "action" => "./?option=change_profile_pic");
parent::__construct('formUploadFiles', $options);
}
protected function generaCamposFormulario($datos, $errores = array()) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorFile = self::createMensajeError($errores, 'archivo', 'span', array('class' => 'error'));
foreach($datos as $key => $value){
$dats = $key." ".$value." ";
}
// Se genera el HTML asociado a los campos del formulario y los mensajes de error.
$html = '
<div class="file">
<input type="file" name="archivo" id="archivo" /><pre>'.$htmlErroresGlobales.'</pre>
</div>
<input type="submit" id="submit" value="Subir" class="primary" /><pre>'.$errorFile.'</pre>
';
return $html;
}
protected function procesaFormulario($datos) {
// Solo se pueden definir arrays como constantes en PHP >= 5.6
global $ALLOWED_EXTENSIONS;
$result = array();
$ok = count($_FILES) == 1 && $_FILES['archivo']['error'] == UPLOAD_ERR_OK;
if ( $ok ) {
$nombre = $_FILES['archivo']['name'];
//1.a) Valida el nombre del archivo
$ok = $this->check_file_uploaded_name($nombre) && $this->check_file_uploaded_length($nombre) ;
// 1.b) Sanitiza el nombre del archivo
//$ok = $this->sanitize_file_uploaded_name($nombre);
//
// 2. comprueba si la extensión está permitida
$ok = $ok && in_array(pathinfo($nombre, PATHINFO_EXTENSION), self::EXTENSIONS);
// 3. comprueba el tipo mime del archivo correspode a una imagen image
$finfo = new \finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['archivo']['tmp_name']);
$ok = preg_match('/image\/*./', $mimeType);
//finfo_close();
if ( $ok ) {
$tmp_name = $_FILES['archivo']['tmp_name'];
$new_name = strtolower(unserialize($_SESSION["user"])->getName()).".jpg";
if ( !move_uploaded_file($tmp_name, "../img/users/{$new_name}") ) {
$result['img'] = 'Error al mover el archivo';
}
$result = "./";
} else {
$result["errorFile"] = 'El archivo tiene un nombre o tipo no soportado';
}
} else {
$result[] = 'Error al subir el archivo.';
}
return $result;
}
/**
* Check $_FILES[][name]
*
* @param (string) $filename - Uploaded file name.
* @author Yousef Ismaeil Cliprz
* @See http://php.net/manual/es/function.move-uploaded-file.php#111412
*/
protected function check_file_uploaded_name($filename) {
return (bool) ((mb_ereg_match('/^[0-9A-Z-_\.]+$/i', $filename) === 1) ? true : false );
}
/**
* Sanitize $_FILES[][name]. Remove anything which isn't a word, whitespace, number
* or any of the following caracters -_~,;[]().
*
* If you don't need to handle multi-byte characters you can use preg_replace
* rather than mb_ereg_replace.
*
* @param (string) $filename - Uploaded file name.
* @author Sean Vieira
* @see http://stackoverflow.com/a/2021729
*/
protected function sanitize_file_uploaded_name($filename) {
/* Remove anything which isn't a word, whitespace, number
* or any of the following caracters -_~,;[]().
* If you don't need to handle multi-byte characters
* you can use preg_replace rather than mb_ereg_replace
* Thanks @Łukasz Rysiak!
*/
$newName = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $filename);
// Remove any runs of periods (thanks falstro!)
$newName = mb_ereg_replace("([\.]{2,})", '', $newName);
return $newName;
}
/**
* Check $_FILES[][name] length.
*
* @param (string) $filename - Uploaded file name.
* @author Yousef Ismaeil Cliprz.
* @See http://php.net/manual/es/function.move-uploaded-file.php#111412
*/
protected function check_file_uploaded_length ($filename) {
return (bool) ((mb_strlen($filename,'UTF-8') < 250) ? true : false);
}
}
?>

59
panel_user/index.php Normal file
View File

@ -0,0 +1,59 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Controller file:
include_once('panelUser.php');
if($_SESSION["login"] && $_SESSION["rol"] === "user"){
if(!isset($_GET["option"])) $_GET["option"] = null;
switch($_GET["option"]){
case "change_profile_pic":
$reply = UserPanel::changeUserPic();
break;
case "purchases":
$reply = UserPanel::purchases();
break;
case "payment":
$reply = UserPanel::payment();
break;
case "delete_user";
$reply = UserPanel::delete();
break;
default:
$reply = UserPanel::panel();
break;
}
}
else{
$reply = '<div class="column side"></div>
<div class="column middle">
<div class="code info">
<h1>Debes iniciar sesión para ver tu Panel de Usuario.</h1><hr />
<p>Inicia Sesión si estás registrado.</p>
<a href="'.$prefix.'login/"><button>Iniciar Sesión</button></a>
<p>Registrate si no lo habías hecho previamente.</p>
<form method="post" action="'.$prefix.'login/"><button name="register" id="_register">Registro</button></form>
</div>
</div>
<div class="column side"></div>'."\n";
}
//Specific page content:
$section = '<!-- User Panel -->
<section id="user_panel">
<div class="row">
<!-- Contents -->
<div class="row">
'.$reply.'
</div>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

188
panel_user/panelUser.php Normal file
View File

@ -0,0 +1,188 @@
<?php
require_once($prefix.'assets/php/includes/user.php');
class UserPanel {
//Atributes:
//Constructor:
function __construct(){}
//Methods:
//Welcome view.
static function panel(){
$name = strtoupper(unserialize($_SESSION['user'])->getName());
$email = unserialize($_SESSION['user'])->getEmail();
$userPic = USER_PICS.strtolower($name).".jpg";
$forms = self::manage();
return $reply = '<div class="code info">
<h1>Bienvenido '.$name.', a tu Panel de Usuario.</h1>
<hr />
<a href="./?option=change_profile_pic"><img src='.$userPic.' alt="user_profile_picture"/></a>
<h3>'.strftime("%A %e de %B de %Y | %H:%M").'</h3>
<br />
<p>Usuario: '.$name.'</p>
<p>Email: '.$email.'</p>
</div>'."\n".$forms;
}
//Manage the user account.
static function manage(){
require_once('./includes/formChangePass.php');
require_once('./includes/formChangeEmail.php');
require_once('./includes/formChangeName.php');
$formCN = new FormChangeName();
$htmlFormChangeName = $formCN->gestiona();
$formCP = new FormChangePass();
$htmlFormChangePass = $formCP->gestiona();
$formCE = new FormChangeEmail();
$htmlFormChangeEmail = $formCE->gestiona();
return $reply = '
<!-- Cambiar Información de la Usuario -->
<br /><h2>Cambiar información de la cuenta</h2><hr />
<!-- Change User Name -->
<div class="column side">
<h2>Cambiar nombre de usuario</h2>
'.$htmlFormChangeName.'
</div>
<!-- Change User Password -->
<div class="column middle">
<h2>Cambiar contraseña</h2>
'.$htmlFormChangePass.'
</div>
<!-- Change User Email -->
<div class="column side">
<h2>Cambiar email de usuario</h2>
'.$htmlFormChangeEmail.'
</div>'."\n";
}
//User purchase history.
static function changeUserPic(){
require_once('./includes/formUploadPic.php');
$formCP = new FormUploadFiles();
$htmlFormChangeUserPic = $formCP->gestiona();
$name = strtoupper(unserialize($_SESSION['user'])->getName());
$userPic = USER_PICS.strtolower($name).".jpg";
return $reply = '<!-- Form Change User Profile Picture -->
<div class="column side"></div>
<div class="column middle">
<div class="code info">
<h1>Cambiar imagen de perfil</h1><hr />
<img src='.$userPic.' alt="user_profile_picture"/>
'.$htmlFormChangeUserPic.'
</div>
</div>
<div class="column side"></div>'."\n";
}
//User purchase history.
static function purchases(){
require_once('../assets/php/includes/purchase_dao.php');
include_once('../assets/php/includes/cinema_dao.php');
include_once('../assets/php/includes/hall_dao.php');
include_once('../assets/php/includes/session_dao.php');
include_once('../assets/php/includes/film_dao.php');
$purchasesHTML = '';
$purchaseDAO = new PurchaseDAO("complucine");
$purchases = $purchaseDAO->allPurchasesData(unserialize($_SESSION['user'])->getId());
if($purchases){
$sessions = array();
$halls = array();
$cinemas = array();
$rows = array();
$columns = array();
$dates = array();
foreach($purchases as $key=>$value){
$sessions[$key] = $value->getSessionId();
$halls[$key] = $value->getHallId();
$cinemas[$key] = $value->getCinemaId();
$rows[$key] = $value->getRow();
$columns[$key] = $value->getColumn();
$dates[$key] = $value->getTime();
}
for($i = 0; $i < count($purchases); $i++){
$cinemaDAO = new Cinema_DAO("complucine");
$cinema = $cinemaDAO->cinemaData($cinemas[$i]);
$hallDAO = new HallDAO("complucine");
$hall = $hallDAO->HallData($halls[$i]);
$sessionDAO = new SessionDAO("complucine");
$session = $sessionDAO->sessionData($sessions[$i]);
$filmDAO = new Film_DAO("complucine");
$film = $filmDAO->FilmData($session->getIdfilm());
if($i%3 === 0 && $i !== 0){
if($i !== 0) $purchasesHTML .= '</div>
';
$purchasesHTML .= '<div class="column right">
';
} else {
if($i !== 0) $purchasesHTML .= '</div>
';
$purchasesHTML .= '<div class="column left">
';
}
$purchasesHTML .= '<h1>Compara realizada el: '.$dates[$i].'</h1><hr />
<div class="column left">
<p>Película: '.str_replace('_', ' ', strtoupper($film->getTittle())).'</p>
<p>Idioma: '.$film->getLanguage().'</p>
<p>Cine: '.$cinema->getName().'</p>
<p>Dirección: '.$cinema->getDirection().'</p>
</div>
<div class="column right">
<p>Sala: '.$hall->getNumber().'</p>
<p>Sesión: '.$sessions[$i].'</p>
<p>Asiento(Fila): '.$rows[$i].'</p>
<p>Asiento(Columna): '.$columns[$i].'</p>
</div>
';
}
}
return $reply = '<div class="code">
<h2>Historial de compras</h2><hr />
'.$purchasesHTML.'
</div>';
}
//User payment details
static function payment(){
return $reply = '<div class="code info">
<h2>Aquí los datos de pago</h2><hr />
</div>'."\n";
}
//Delete user account.
static function delete(){
require_once('./includes/formDeleteAccount.php');
$formDA = new FormDeleteAccount();
$htmlFormDeleteAccount = $formDA->gestiona();
return $reply = '<div class="code">
<h2>ELIMINAR CUENTA DE USUARIO</h2><hr />
<div class="column side"></div>
<!-- Delete User Form -->
<div class="column middle">
'.$htmlFormDeleteAccount.'
</div>
<div class="column side"></div>
</div>'."\n";
}
}
?>

16
promotions/index.php Normal file
View File

@ -0,0 +1,16 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Specific page content:
$section = '<!-- Promotions -->
<section class="row">
<section id="promociones">
'.$template->print_promotions().'
</section>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

153
purchase/_old.index.php Normal file
View File

@ -0,0 +1,153 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Get Film to purchase:
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
$TODAY = getdate();
$TODAY = "$TODAY[mday]"."-"."$TODAY[mon]"."-"."$TODAY[year]";
$pay = true;
$film = null;
$cinemas = [];
$sessions = [];
if(isset($_GET["film"])){
$filmDAO = new Film_DAO("complucine");
$film = $filmDAO->FilmData($_GET["film"]);
if($film){
$tittle = $film->getTittle();
$cinemas = $filmDAO->getCinemas($_GET["film"]);
if(!empty($cinemas)){
$cinemasNames = new ArrayIterator(array());
$cinemasIDs = new ArrayIterator(array());
foreach($cinemas as $key=>$value){
$cinemasIDs[$key] = $value->getId();
$cinemasNames[$key] = $value->getName();
}
$cinemasIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$cinemasIT->attachIterator($cinemasIDs, "cID");
$cinemasIT->attachIterator($cinemasNames, "NAME");
$cinemasListHTML = '<form action="confirm.php" method="post">
<select name="cinemas" id="cinemas">';
foreach($cinemasIT as $value){
if($value == reset($cinemasIT)){
$cinemasListHTML .= '<option value="'.$value["cID"].'" selected>'.$value["NAME"].'</option>';
} else {
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
}
$cinemasListHTML .= '</select>';
} else {
$cinemasListHTML = '<select name="cinemas"><option value="" selected>No hay cines disponibles para esta película.</option></select></form>';
}
$fiml_id = $film->getId();
$cinema_id = $value["cID"];
$sessionsDAO = new SessionDAO("complucine");
$sessions = $sessionsDAO->getSessions_Film_Cinema($fiml_id, $cinema_id);
if(!empty($sessions)){
$sessionsDates = new ArrayIterator(array());
$sessionsStarts = new ArrayIterator(array());
$sessionsHalls = new ArrayIterator(array());
$sessionsIDs = new ArrayIterator(array());
foreach($sessions as $key=>$value){
$sessionsIDs[$key] = $value->getId();
$sessionsDates[$key] = date_format(date_create($value->getDate()), 'j-n-Y');
$sessionsHalls[$key] = $value->getIdhall();
$sessionsStarts[$key] = $value->getStartTime();
}
$sessionsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$sessionsIT->attachIterator($sessionsIDs, "sID");
$sessionsIT->attachIterator($sessionsDates, "DATE");
$sessionsIT->attachIterator($sessionsHalls, "HALL");
$sessionsIT->attachIterator($sessionsStarts, "HOUR");
$count = 0;
$sessionsListHTML = '<select name="sessions" id="sessions">';
foreach ($sessionsIT as $value) {
if($TODAY <= $value["DATE"]){
if($value === reset($sessionsIT)){
$sessionsListHTML .= '<option value="'.$value["sID"].'" >Fecha: '.$value["DATE"].' | Hora: '.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
} else {
$sessionsListHTML .='<option value="'.$value["sID"].'">Fecha: '.$value["DATE"].' | Hora:'.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
}
$count++;
}
}
$sessionsListHTML .= '</select>';
if($count == 0) {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
//$session_id = $value["sID"];
//$hall_id = $value["HALL"];
//$date_ = $value["DATE"];
//$hour_ = $value["HOUR"];
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$reply = '<div class="column left">
<h2>Película seleccionada: '.str_replace('_', ' ', $tittle).'</h2><hr />
<div class="image"><img src="'.$prefix.'img/films/'.$tittle.'.jpg" alt="'.$tittle.'" /></div>
<p>Duración: '.$film->getDuration().' minutos</p>
<p>Idioma: '.$film->getLanguage().'</p>
</div>
<div class="column right">
<h2>Seleccione un Cine y una Sesión</h2><hr />
<h3>Cines</h3>
'.$cinemasListHTML.'
<h3>Sesiones</h3>
'.$sessionsListHTML.'
</div>
';
} else {
$reply = '<h1>No existe la película.</h1>';
$pay = false;
}
} else if(isset($_GET["cinema"])) {
$reply = '<h1>ESTAMOS TRABAJANDO EN ELLO</h1>';
$pay = false;
} else {
$reply = '<h1>No se ha encontrado película ni cine.</h1>';
$pay = false;
}
//Pay button:
if($pay){
$pay = '<input type="submit" id="submit" value="Pagar" />
</form>';
} else {
$pay = '</form>';
}
//Page-specific content:
$section = '<!-- Purchase -->
<section id="purchase">
<div class="row">
<section class="code purchase">
'.$reply.'
</section>
<section class="code purchase">
'.$pay.'
</section>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,19 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Purchase form:
require_once('includes/formPurchase.php');
$form = new FormPurchase();
$formHTML = $form->gestiona();
//Page-specific content:
$section = '<div class="code">
<h2>Completar la Compra</h2><hr />
<!-- Purchase Form -->
'.$formHTML.'
</div>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

19
purchase/confirm.php Normal file
View File

@ -0,0 +1,19 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Purchase form:
require_once('includes/formPurchase.php');
$form = new FormPurchase();
$formHTML = $form->gestiona();
//Page-specific content:
$section = '<div class="code pay">
<h2>Completar la Compra</h2><hr />
<!-- Purchase Form -->
'.$formHTML.'
</div>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,187 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/purchase_dao.php');
include_once($prefix.'assets/php/includes/purchase.php');
include_once($prefix.'assets/php/includes/user.php');
class FormPurchase extends Form {
//Atributes:
private $session; // Session of the film to be purchased.
private $cinema; // Cinema of the film to be purchased.
private $hall; // Hall of the film to be purchased.
private $seat; // Seat of the film to be purchased.
private $row; // Row of the seat.
private $years; // Actual year.
private $months; // Months of the year.
private $_TODAY; // Actual date.
public function __construct() {
parent::__construct('formPurchase');
$sessionDAO = new SessionDAO("complucine");
$this->session = $sessionDAO->sessionData($_POST["sessions"]);
$filmDAO = new Film_DAO("complucine");
$this->film = $filmDAO->FilmData($this->session->getIdfilm());
$cinemaDAO = new Cinema_DAO("complucine");
$this->cinema = $cinemaDAO->cinemaData($this->session->getIdcinema());
$hallDAO = new HallDAO("complucine");
$this->hall = $hallDAO->HallData($this->session->getIdhall());
$rows = $this->hall->getNumRows();
$cols = $this->hall->getNumCol();
for($i = 0; $i <= $rows; $i++){
for($j = 0; $j <= $cols; $j++){
$seat = $i.$j;
if(isset($_POST["checkbox".$seat])){ $this->seat = $seat; }
}
}
$TODAY = getdate();
$year = "$TODAY[year]";
$this->_TODAY = "$TODAY[year]-$TODAY[month]-$TODAY[mday] $TODAY[hours]:$TODAY[minutes]:$TODAY[seconds]";
$this->years = array();
for($i = $year; $i < $year+10; $i++) array_push($this->years, $i);
$this->months = array();
for($i = 1; $i <= 12; $i++) array_push($this->months, $i);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'card-holder', 'span', array('class' => 'error'));
$errorCardNumber = self::createMensajeError($errores, 'card-number-0', 'span', array('class' => 'error'));
$errorCVV = self::createMensajeError($errores, 'card-cvv', 'span', array('class' => 'error'));
$errorCardExpirationMonth = self::createMensajeError($errores, 'card-expiration-month', 'span', array('class' => 'error'));
$errorCardExpirationYear = self::createMensajeError($errores, 'card-expiration-year', 'span', array('class' => 'error'));
$monthsHTML = "";
foreach($this->months as $value){
$monthsHTML .= "<option>".$value."</option>";
}
$yearsHTML = "";
foreach($this->years as $value){
$yearsHTML .= "<option>".$value."</option>";
}
if($this->session->getSeatsFull()){
$html = "<div class='code info'>
<h2>La sesión está llena, no quedan asientos disponibles.</h2><hr />
<p>Vuelva atrás para selecionar otra sesión.</p>
</div>";
} else {
$html = "<div class='row'>
<fieldset id='datos_entrada'>
<legend>Resumen de la Compra</legend>
<img src='"."../img/films/".$this->film->getImg()."' alt='".$this->film->getTittle()."' />
<p>Película: ".str_replace('_', ' ', strtoupper($this->film->getTittle()))."</p>
<p>Cine: ".$this->cinema->getName()."</p>
<p>Sala: ".$this->session->getIdhall()."</p>
<p>Asiento: ".$this->seat."</p>
<p>Fecha: ".date_format(date_create($this->session->getDate()), 'd-m-Y')."</p>
<p>Hora: ".$this->session->getStartTime()."</p>
<p>Precio: ".$this->session->getSeatPrice()."</p>
</fieldset>
<fieldset id='pagar_entrada'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos Bancarios</legend>
<label for='card-holder'>Titular de la Tarjeta: <span id='cardNameValid'>&#x2714;</span><span id='cardNameInvalid'>&#x274C;</span></label><pre>".$errorNombre."</pre><br />
<input type='text' name='card-holder' id='card-holder' class='card-holder' placeholder='NOMBRE APELLIDO1 APELLIDO2' required />
<br />
<label for='card-number'>Número de Tarjeta: <span id='carNumberValid'>&#x2714;</span><span id='cardNumerInvalid'>&#x274C;</span></label><pre>".$errorCardNumber."</pre><br />
<input type='num' name='card-number-0' id='card-number-0' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-1' id='card-number-1' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-2' id='card-number-2' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-3' id='card-number-3' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<label for='card-cvv'>CVV: <span id='cvvValid'>&#x2714;</span><span id='cvvInvalid'>&#x274C;</span></label>
<input type='text' name='card-cvv' id='card-cvv' class='fieldset-cvv' maxlength='3' placeholder='XXX' required /><pre>".$errorCVV."</pre>
<br />
<label for='card-expiration'>Fecha de Expiración:</label><pre>".$errorCardExpirationMonth.$errorCardExpirationYear."</pre><br />
<select name='card-expiration-month' id='card-expiration-month' required>
".$monthsHTML."
</select>
<select name='card-expiration-year' id='card-expiration-year' required>
".$yearsHTML."
</select>
</fieldset>
<div class='actions'>
<input type='hidden' name='sessions' id='sessions' value='".$_POST["sessions"]."' />
<input type='submit' id='submit' value='Pagar' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['card-holder']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) ) {
$result['card-holder'] = "El nombre no puede estar vacío.";
}
for($i = 0; $i < 4; $i++){
$card_numer = $this->test_input($datos['card-number-'.$i]) ?? null;
if ( empty($card_numer) || mb_strlen($card_numer) < 4 ) {
$result['card-number-0'] = "La tarjeta debe tener 16 dígitos.";
}
}
$cvv = $this->test_input($datos['card-cvv']) ?? null;
if ( empty($cvv) || mb_strlen($cvv) < 3 ) {
$result['card-cvv'] = "El CVV debe tener 3 números.";
}
$month = $this->test_input($datos['card-expiration-month']) ?? null;
if ( empty($month) ) {
$result['card-expiration-month'] = "El mes de expiración no es correcto.";
}
$year = $this->test_input($datos['card-expiration-year']) ?? null;
if ( empty($year) ) {
$result['card-expiration-year'] = "El año de expiración no es correcto.";
}
if (count($result) === 0) {
if(isset($_SESSION["login"]) && $_SESSION["login"] == true){
$purchaseDAO = new PurchaseDAO("complucine");
if($purchaseDAO->createPurchase(unserialize($_SESSION["user"])->getId(), $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), rand(1, $this->hall->getNumRows()), rand(1, $this->hall->getNumCol()), date("Y-m-d H:i:s"))){
$purchase = new Purchase(unserialize($_SESSION["user"])->getId(), $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), rand(1, $this->hall->getNumRows()), rand(1, $this->hall->getNumCol()), strftime("%A %e de %B de %Y a las %H:%M"));
$_SESSION["purchase"] = serialize($purchase);
$_SESSION["film_purchase"] = serialize($this->film);
$result = "resume.php";
} else {
$result[] = "Error al realizar la compra.";
}
} else {
$purchase = new Purchase("null", $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), rand(1, $this->hall->getNumRows()), rand(1, $this->hall->getNumCol()), strftime("%A %e de %B de %Y a las %H:%M"));
$_SESSION["purchase"] = serialize($purchase);
$_SESSION["film_purchase"] = serialize($this->film);
$result = "resume.php";
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,230 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/purchase_dao.php');
include_once($prefix.'assets/php/includes/purchase.php');
include_once($prefix.'assets/php/includes/promotion_dao.php');
include_once($prefix.'assets/php/includes/user.php');
class FormPurchase extends Form {
//Atributes:
private $film; // Film to be purchased.
private $session; // Session of the film to be purchased.
private $cinema; // Cinema of the film to be purchased.
private $hall; // Hall of the film to be purchased.
private $seat; // Seat of the film to be purchased.
private $row; // Row of the seat.
private $col; // Column of the seat.
private $code; // Promotional code.
private $years; // Actual year.
private $months; // Months of the year.
private $_TODAY; // Actual date.
public function __construct() {
parent::__construct('formPurchase');
$sessionDAO = new SessionDAO("complucine");
$this->session = $sessionDAO->sessionData($_POST["sessions"]);
$filmDAO = new Film_DAO("complucine");
$this->film = $filmDAO->FilmData($this->session->getIdfilm());
$cinemaDAO = new Cinema_DAO("complucine");
$this->cinema = $cinemaDAO->cinemaData($this->session->getIdcinema());
$hallDAO = new HallDAO("complucine");
$this->hall = $hallDAO->HallData($this->session->getIdhall());
$this->seat = array();
$this->row = array();
$this->col = array();
$rows = $this->hall->getNumRows();
$cols = $this->hall->getNumCol();
for($i = 0; $i <= $rows; $i++){
for($j = 0; $j <= $cols; $j++){
$seat = $i.$j;
if(isset($_POST["checkbox".$seat])){
array_push($this->seat, $i."-".$j);
array_push($this->row, $i);
array_push($this->col, $j);
}
}
}
$promoDAO = new Promotion_DAO("complucine");
$this->code = intval(0);
if(isset($_POST["code"]) && $_POST["code"] !== ""){
if($promoDAO->GetPromotion($_POST["code"])->data_seek(0)){
$this->code = intval(2);
}
}
$TODAY = getdate();
$year = "$TODAY[year]";
$this->_TODAY = "$TODAY[year]-$TODAY[month]-$TODAY[mday] $TODAY[hours]:$TODAY[minutes]:$TODAY[seconds]";
$this->years = array();
for($i = $year; $i < $year+10; $i++) array_push($this->years, $i);
$this->months = array();
for($i = 1; $i <= 12; $i++) array_push($this->months, $i);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'card-holder', 'span', array('class' => 'error'));
$errorCardNumber = self::createMensajeError($errores, 'card-number-0', 'span', array('class' => 'error'));
$errorCVV = self::createMensajeError($errores, 'card-cvv', 'span', array('class' => 'error'));
$errorCardExpirationMonth = self::createMensajeError($errores, 'card-expiration-month', 'span', array('class' => 'error'));
$errorCardExpirationYear = self::createMensajeError($errores, 'card-expiration-year', 'span', array('class' => 'error'));
$monthsHTML = "";
foreach($this->months as $value){
$monthsHTML .= "<option>".$value."</option>";
}
$yearsHTML = "";
foreach($this->years as $value){
$yearsHTML .= "<option>".$value."</option>";
}
if($this->session->getSeatsFull()){
$html = "<div class='code info'>
<h2>La sesión está llena, no quedan asientos disponibles.</h2><hr />
<p>Vuelva atrás para selecionar otra sesión.</p>
</div>";
} else {
if(!empty($this->seat)){
$seats = "";
foreach($this->seat as $value){
$seats .= $value.", ";
}
$promo = "";
if($this->code > 0) $promo = "<pre>(Se ha aplicado un descuento por código promocional).</pre>";
$html = "<div class='row'>
<fieldset id='datos_entrada'>
<legend>Resumen de la Compra</legend>
<img src='"."../img/films/".$this->film->getImg()."' alt='".$this->film->getTittle()."' />
<p>Película: ".str_replace('_', ' ', strtoupper($this->film->getTittle()))."</p>
<p>Cine: ".$this->cinema->getName()."</p>
<p>Sala: ".$this->session->getIdhall()."</p>
<p>Asiento(s):".$seats."</p>
<p>Fecha: ".date_format(date_create($this->session->getDate()), 'd-m-Y')."</p>
<p>Hora: ".$this->session->getStartTime()."</p>
<p>Precio Total: ".intval($this->session->getSeatPrice()*count($this->seat)-$this->code)." (Precio por asiento: ".$this->session->getSeatPrice()." )</p>
<p>".$promo."</p>
</fieldset>
<fieldset id='pagar_entrada'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos Bancarios</legend>
<label for='card-holder'>Titular de la Tarjeta: <span id='cardNameValid'>&#x2714;</span><span id='cardNameInvalid'>&#x274C;</span></label><pre>".$errorNombre."</pre><br />
<input type='text' name='card-holder' id='card-holder' class='card-holder' placeholder='NOMBRE APELLIDO1 APELLIDO2' required />
<br />
<label for='card-number'>Número de Tarjeta: <span id='carNumberValid'>&#x2714;</span><span id='cardNumerInvalid'>&#x274C;</span></label><pre>".$errorCardNumber."</pre><br />
<input type='num' name='card-number-0' id='card-number-0' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-1' id='card-number-1' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-2' id='card-number-2' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-3' id='card-number-3' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<label for='card-cvv'>CVV: <span id='cvvValid'>&#x2714;</span><span id='cvvInvalid'>&#x274C;</span></label>
<input type='text' name='card-cvv' id='card-cvv' class='fieldset-cvv' maxlength='3' placeholder='XXX' required /><pre>".$errorCVV."</pre>
<br />
<label for='card-expiration'>Fecha de Expiración: <span id='dateValid'>&#x2714;</span><span id='dateInvalid'>&#x274C;</span></label><pre>".$errorCardExpirationMonth.$errorCardExpirationYear."</pre><br />
<select name='card-expiration-month' id='card-expiration-month' required>
".$monthsHTML."
</select>
<select name='card-expiration-year' id='card-expiration-year' required>
".$yearsHTML."
</select>
</fieldset>
<div class='actions'>
<input type='hidden' name='sessions' id='sessions' value='".$_POST["sessions"]."' />
<input type='hidden' name='row' id='row' value='".serialize($this->row)."' />
<input type='hidden' name='col' id='col' value='".serialize($this->col)."' />
<input type='submit' id='submit' value='Pagar' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
} else {
$html = "<div class='code info'>
<h2>No se ha seleccionado asiento(s).</h2>
<p>Vuelva atrás para selecionar una butaca.</p>
<button id='go-back'>Volver</button>
</div>";
}
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['card-holder']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) ) {
$result['card-holder'] = "El nombre no puede estar vacío.";
}
for($i = 0; $i < 4; $i++){
$card_numer = $this->test_input($datos['card-number-'.$i]) ?? null;
if ( empty($card_numer) || mb_strlen($card_numer) < 4 ) {
$result['card-number-0'] = "La tarjeta debe tener 16 dígitos.";
}
}
$cvv = $this->test_input($datos['card-cvv']) ?? null;
if ( empty($cvv) || mb_strlen($cvv) < 3 ) {
$result['card-cvv'] = "El CVV debe tener 3 números.";
}
$month = $this->test_input($datos['card-expiration-month']) ?? null;
//$TODAY = getdate();
//$actualMonth = "$TODAY[month]";
if ( empty($month) /*|| $month < $actualMonth*/) {
$result['card-expiration-month'] = "El mes de expiración no es correcto.";
}
$year = $this->test_input($datos['card-expiration-year']) ?? null;
if ( empty($year) ) {
$result['card-expiration-year'] = "El año de expiración no es correcto.";
}
if (count($result) === 0) {
if(isset($_SESSION["login"]) && $_SESSION["login"] == true){
$purchaseDAO = new PurchaseDAO("complucine");
$count = count(unserialize($datos["row"]));
$rows = unserialize($datos["row"]); $cols = unserialize($datos["col"]);
for($i = 0; $i < $count; $i++){
if($purchaseDAO->createPurchase(unserialize($_SESSION["user"])->getId(), $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), $rows[$i], $cols[$i], date("Y-m-d H:i:s"))){
$purchase = new Purchase(unserialize($_SESSION["user"])->getId(), $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), $datos["row"], $datos["col"], strftime("%A %e de %B de %Y a las %H:%M"));
$_SESSION["purchase"] = serialize($purchase);
$_SESSION["film_purchase"] = serialize($this->film);
$result = "resume.php";
} else {
$result[] = "Error al realizar la compra.";
}
}
} else {
$purchase = new Purchase("null", $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), $datos["row"], $datos["col"], strftime("%A %e de %B de %Y a las %H:%M"));
$_SESSION["purchase"] = serialize($purchase);
$_SESSION["film_purchase"] = serialize($this->film);
$result = "resume.php";
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,121 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
class FormPurchase extends Form {
//Atributes:
private $session; // Session of the film to be purchased.
private $cinema; // Cinema of the film to be purchased.
private $film; // Film to be purchased.
private $years; // Actual year.
private $months; // Months of the year.
public function __construct() {
parent::__construct('formPurchase');
$sessionDAO = new SessionDAO("complucine");
$this->session = $sessionDAO->sessionData($_POST["sessions"]);
$filmDAO = new Film_DAO("complucine");
$this->film = $filmDAO->FilmData($this->session->getIdfilm());
$cinemaDAO = new Cinema_DAO("complucine");
$this->cinema = $cinemaDAO->cinemaData($this->session->getIdcinema());
$TODAY = getdate();
$year = "$TODAY[year]";
$this->years = array();
for($i = $year; $i < $year+10; $i++) array_push($this->years, $i);
$this->months = array();
for($i = 1; $i <= 12; $i++) array_push($this->months, $i);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'name', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error'));
$monthsHTML = "";
foreach($this->months as $value){
$monthsHTML .= "<option>".$value."</option>";
}
$yearsHTML = "";
foreach($this->years as $value){
$yearsHTML .= "<option>".$value."</option>";
}
$html = "<div class='row'>
<fieldset id='datos_entrada'>
<legend>Resumen de la Compra</legend>
<p>Película: ".str_replace('_', ' ', strtoupper($this->film->getTittle()))."</p>
<p>Cine: ".$this->cinema->getName()."</p>
<p>Sala: ".$this->session->getIdhall()."</p>
<p>Fecha: ".date_format(date_create($this->session->getDate()), 'd-m-Y')."</p>
<p>Hora: ".$this->session->getStartTime()."</p>
<p>Precio: ".$this->session->getSeatPrice()."</p>
</fieldset>
<fieldset id='pagar_entrada'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos Bancarios</legend>
<label for='card-holder'>Titular de la Tarjeta:</label><br />
<input type='text' id='card-holder' class='card-holder' placeholder='NOMBRE APELLIDO1 APELLIDO2' required />
<br />
<label for='card-number'>Número de Tarjeta: </label><br />
<input type='num' id='card-number-0' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' id='card-number-1' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' id='card-number-2' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' id='card-number-3' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<label for='card-cvv'>CVV: </label>
<input type='text' id='card-cvv' class='fieldset-cvv' maxlength='3' placeholder='XXX' required />
<br />
<label for='card-expiration'>Fecha de Expiración:</label><br />
<select id='card-expiration-month' required>
".$monthsHTML."
</select>
<select id='card-expiration-year' required>
".$yearsHTML."
</select>
</fieldset>
<div class='actions'>
<input type='submit' id='submit' value='Pagar' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
//$nombre = $this->test_input($datos['name']) ?? null;
$nombre = $datos['name'] ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['name'] = "El nombre tiene que tener\n una longitud de al menos\n 3 caracteres\n y menos de 15 caracteres.";
}
//$password = $this->test_input($datos['pass']) ?? null;
$password = $datos['pass'] ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
if (count($result) === 0) {
$result[] = "La compra aun está en desarrollo. Vuelva en unos días.";
}
return $result;
}
}
?>

View File

@ -0,0 +1,232 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/seat_dao.php');
include_once($prefix.'assets/php/includes/seat.php');
include_once($prefix.'assets/php/includes/purchase_dao.php');
include_once($prefix.'assets/php/includes/purchase.php');
include_once($prefix.'assets/php/includes/promotion_dao.php');
include_once($prefix.'assets/php/includes/user.php');
class FormPurchase extends Form {
//Atributes:
private $film; // Film to be purchased.
private $session; // Session of the film to be purchased.
private $cinema; // Cinema of the film to be purchased.
private $hall; // Hall of the film to be purchased.
private $seat; // Seat of the film to be purchased.
private $row; // Row of the seat.
private $col; // Column of the seat.
private $code; // Promotional code.
private $years; // Actual year.
private $months; // Months of the year.
private $_TODAY; // Actual date.
public function __construct() {
parent::__construct('formPurchase');
$sessionDAO = new SessionDAO("complucine");
$this->session = $sessionDAO->sessionData($_POST["sessions"]);
$filmDAO = new Film_DAO("complucine");
$this->film = $filmDAO->FilmData($this->session->getIdfilm());
$cinemaDAO = new Cinema_DAO("complucine");
$this->cinema = $cinemaDAO->cinemaData($this->session->getIdcinema());
$hallDAO = new HallDAO("complucine");
$this->hall = $hallDAO->HallData($this->session->getIdhall());
$this->seat = array();
$this->row = array();
$this->col = array();
$rows = $this->hall->getNumRows();
$cols = $this->hall->getNumCol();
for($i = 0; $i <= $rows; $i++){
for($j = 0; $j <= $cols; $j++){
$seat = $i.$j;
if(isset($_POST["checkbox".$seat])){
array_push($this->seat, $i."-".$j);
array_push($this->row, $i);
array_push($this->col, $j);
}
}
}
$promoDAO = new Promotion_DAO("complucine");
$this->code = intval(0);
if(isset($_POST["code"]) && $_POST["code"] !== ""){
if($promoDAO->GetPromotion($_POST["code"])->data_seek(0)){
$this->code = intval(2);
}
}
$TODAY = getdate();
$year = "$TODAY[year]";
$this->_TODAY = "$TODAY[year]-$TODAY[month]-$TODAY[mday] $TODAY[hours]:$TODAY[minutes]:$TODAY[seconds]";
$this->years = array();
for($i = $year; $i < $year+10; $i++) array_push($this->years, $i);
$this->months = array();
for($i = 1; $i <= 12; $i++) array_push($this->months, $i);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'card-holder', 'span', array('class' => 'error'));
$errorCardNumber = self::createMensajeError($errores, 'card-number-0', 'span', array('class' => 'error'));
$errorCVV = self::createMensajeError($errores, 'card-cvv', 'span', array('class' => 'error'));
$errorCardExpirationMonth = self::createMensajeError($errores, 'card-expiration-month', 'span', array('class' => 'error'));
$errorCardExpirationYear = self::createMensajeError($errores, 'card-expiration-year', 'span', array('class' => 'error'));
$monthsHTML = "";
foreach($this->months as $value){
$monthsHTML .= "<option>".$value."</option>";
}
$yearsHTML = "";
foreach($this->years as $value){
$yearsHTML .= "<option>".$value."</option>";
}
if($this->session->getSeatsFull()){
$html = "<div class='code info'>
<h2>La sesión está llena, no quedan asientos disponibles.</h2><hr />
<p>Vuelva atrás para selecionar otra sesión.</p>
</div>";
} else {
if(!empty($this->seat)){
$seats = "";
foreach($this->seat as $value){
$seats .= $value.", ";
}
$promo = "";
if($this->code > 0) $promo = "<pre>(Se ha aplicado un descuento por código promocional).</pre>";
$html = "<div class='row'>
<fieldset id='datos_entrada'>
<legend>Resumen de la Compra</legend>
<img src='"."../img/films/".$this->film->getImg()."' alt='".$this->film->getTittle()."' />
<p>Película: ".str_replace('_', ' ', strtoupper($this->film->getTittle()))."</p>
<p>Cine: ".$this->cinema->getName()."</p>
<p>Sala: ".$this->session->getIdhall()."</p>
<p>Asiento(s):".$seats."</p>
<p>Fecha: ".date_format(date_create($this->session->getDate()), 'd-m-Y')."</p>
<p>Hora: ".$this->session->getStartTime()."</p>
<p>Precio Total: ".intval($this->session->getSeatPrice()*count($this->seat)-$this->code)." (Precio por asiento: ".$this->session->getSeatPrice()." )</p>
<p>".$promo."</p>
</fieldset>
<fieldset id='pagar_entrada'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos Bancarios</legend>
<label for='card-holder'>Titular de la Tarjeta: <span id='cardNameValid'>&#x2714;</span><span id='cardNameInvalid'>&#x274C;</span></label><pre>".$errorNombre."</pre><br />
<input type='text' name='card-holder' id='card-holder' class='card-holder' placeholder='NOMBRE APELLIDO1 APELLIDO2' required />
<br />
<label for='card-number'>Número de Tarjeta: <span id='carNumberValid'>&#x2714;</span><span id='cardNumerInvalid'>&#x274C;</span></label><pre>".$errorCardNumber."</pre><br />
<input type='num' name='card-number-0' id='card-number-0' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-1' id='card-number-1' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-2' id='card-number-2' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' name='card-number-3' id='card-number-3' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<label for='card-cvv'>CVV: <span id='cvvValid'>&#x2714;</span><span id='cvvInvalid'>&#x274C;</span></label>
<input type='text' name='card-cvv' id='card-cvv' class='fieldset-cvv' maxlength='3' placeholder='XXX' required /><pre>".$errorCVV."</pre>
<br />
<label for='card-expiration'>Fecha de Expiración: <span id='dateValid'>&#x2714;</span><span id='dateInvalid'>&#x274C;</span></label><pre>".$errorCardExpirationMonth.$errorCardExpirationYear."</pre><br />
<select name='card-expiration-month' id='card-expiration-month' required>
".$monthsHTML."
</select>
<select name='card-expiration-year' id='card-expiration-year' required>
".$yearsHTML."
</select>
</fieldset>
<div class='actions'>
<input type='hidden' name='sessions' id='sessions' value='".$_POST["sessions"]."' />
<input type='hidden' name='row' id='row' value='".serialize($this->row)."' />
<input type='hidden' name='col' id='col' value='".serialize($this->col)."' />
<input type='submit' id='submit' value='Pagar' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
} else {
$html = "<div class='code info'>
<h2>No se ha seleccionado asiento(s).</h2>
<p>Vuelva atrás para selecionar una butaca.</p>
<button id='go-back'>Volver</button>
</div>";
}
}
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['card-holder']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) ) {
$result['card-holder'] = "El nombre no puede estar vacío.";
}
for($i = 0; $i < 4; $i++){
$card_numer = $this->test_input($datos['card-number-'.$i]) ?? null;
if ( empty($card_numer) || mb_strlen($card_numer) < 4 ) {
$result['card-number-0'] = "La tarjeta debe tener 16 dígitos.";
}
}
$cvv = $this->test_input($datos['card-cvv']) ?? null;
if ( empty($cvv) || mb_strlen($cvv) < 3 ) {
$result['card-cvv'] = "El CVV debe tener 3 números.";
}
$month = $this->test_input($datos['card-expiration-month']) ?? null;
//$TODAY = getdate();
//$actualMonth = "$TODAY[month]";
if ( empty($month) /*|| $month < $actualMonth*/) {
$result['card-expiration-month'] = "El mes de expiración no es correcto.";
}
$year = $this->test_input($datos['card-expiration-year']) ?? null;
if ( empty($year) ) {
$result['card-expiration-year'] = "El año de expiración no es correcto.";
}
if (count($result) === 0) {
if(isset($_SESSION["login"]) && $_SESSION["login"] == true){
$purchaseDAO = new PurchaseDAO("complucine");
$count = count(unserialize($datos["row"]));
$rows = unserialize($datos["row"]); $cols = unserialize($datos["col"]);
for($i = 0; $i < $count; $i++){
if($purchaseDAO->createPurchase(unserialize($_SESSION["user"])->getId(), $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), $rows[$i], $cols[$i], date("Y-m-d H:i:s"))){
$purchase = new Purchase(unserialize($_SESSION["user"])->getId(), $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), $datos["row"], $datos["col"], strftime("%A %e de %B de %Y a las %H:%M"));
$_SESSION["purchase"] = serialize($purchase);
$_SESSION["film_purchase"] = serialize($this->film);
$result = "resume.php";
} else {
$result[] = "Error al realizar la compra.";
}
}
} else {
$purchase = new Purchase("null", $this->session->getId(), $this->session->getIdhall(), $this->cinema->getId(), $datos["row"], $datos["col"], strftime("%A %e de %B de %Y a las %H:%M"));
$_SESSION["purchase"] = serialize($purchase);
$_SESSION["film_purchase"] = serialize($this->film);
$result = "resume.php";
}
}
return $result;
}
}
?>

View File

@ -0,0 +1,269 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
class FormSelectCinemaSession extends Form {
//Atributes:
//private $session; // Session of the film to be purchased.
//private $cinema; // Cinema of the film to be purchased.
//private $hall; // Hall of the film to be purchased.
//private $film; // Film to be purchased.
private $_TODAY; // Actual date.
public function __construct() {
$options = array("action" => "selectSeat.php");
parent::__construct('formSelectCinemaSession', $options);
$TODAY = getdate();
$this->_TODAY = "$TODAY[mday]"."-"."$TODAY[mon]"."-"."$TODAY[year]";
}
protected function generaCamposFormulario($datos, $errores = array()){
$cinemas = [];
$sessions = [];
// Se generan los mensajes de error, si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorCinema = self::createMensajeError($errores, 'cinemas', 'span', array('class' => 'error'));
$errorFilm = self::createMensajeError($errores, 'films', 'span', array('class' => 'error'));
$errorSession = self::createMensajeError($errores, 'sessions', 'span', array('class' => 'error'));
$errorCode = self::createMensajeError($errores, 'code', 'span', array('class' => 'error'));
$pay = true;
if(isset($_GET["film"])){
$filmDAO = new Film_DAO("complucine");
$film = $filmDAO->FilmData($_GET["film"]);
if($film){
$tittle = $film->getTittle();
$image = $film->getImg();
$cinemas = $filmDAO->getCinemas($_GET["film"]);
$cinema_id = $_GET["cinema"];
if(!empty($cinemas)){
$cinemasNames = new ArrayIterator(array());
$cinemasIDs = new ArrayIterator(array());
foreach($cinemas as $key=>$value){
$cinemasIDs[$key] = $value->getId();
$cinemasNames[$key] = $value->getName();
}
$cinemasIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$cinemasIT->attachIterator($cinemasIDs, "cID");
$cinemasIT->attachIterator($cinemasNames, "NAME");
$cinemasListHTML = '<section id="select_cinema"><pre>'.$htmlErroresGlobales.'</pre>
<select name="cinemas" id="cinemas"><pre>'.$errorCinema.'</pre>';
if(!isset($cinema_id)){
$cinemasListHTML .= '<option value="" selected>Selecciona un cine</option>';
foreach($cinemasIT as $value){
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
} else {
foreach($cinemasIT as $value){
if($value["cID"] == $cinema_id){
$cinemasListHTML .= '<option value="'.$value["cID"].'" selected>'.$value["NAME"].'</option>';
} else {
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
}
}
$cinemasListHTML .= '</select>
</section>';
} else {
$cinemasListHTML = '<form><select name="cinemas"><option value="" selected>No hay cines disponibles para esta película.</option></select></form>';
}
$fiml_id = $film->getId();
if(isset($cinema_id)){
$sessionsDAO = new SessionDAO("complucine");
$sessions = $sessionsDAO->getSessions_Film_Cinema($fiml_id, $cinema_id);
if(!empty($sessions)){
$sessionsDates = new ArrayIterator(array());
$sessionsStarts = new ArrayIterator(array());
$sessionsHalls = new ArrayIterator(array());
$sessionsIDs = new ArrayIterator(array());
foreach($sessions as $key=>$value){
$sessionsIDs[$key] = $value->getId();
$sessionsDates[$key] = date_format(date_create($value->getDate()), 'j-n-Y');
$sessionsHalls[$key] = $value->getIdhall();
$sessionsStarts[$key] = $value->getStartTime();
}
$sessionsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$sessionsIT->attachIterator($sessionsIDs, "sID");
$sessionsIT->attachIterator($sessionsDates, "DATE");
$sessionsIT->attachIterator($sessionsHalls, "HALL");
$sessionsIT->attachIterator($sessionsStarts, "HOUR");
$count = 0;
$sessionsListHTML = '<select name="sessions" id="sessions"><pre>'.$errorSession.'</pre>';
foreach ($sessionsIT as $value) {
if(strtotime($this->_TODAY) <= strtotime($value["DATE"])){
if($value === reset($sessionsIT)){
$sessionsListHTML .= '<option value="'.$value["sID"].'" >Fecha: '.$value["DATE"].' | Hora: '.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
} else {
$sessionsListHTML .='<option value="'.$value["sID"].'">Fecha: '.$value["DATE"].' | Hora:'.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
}
$count++;
}
}
$sessionsListHTML .= '</select>';
if($count == 0) {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>Primero seleccione un cine.</option></select>';
$pay = false;
}
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$html = '<div class="column left">
<h2>Película seleccionada: '.str_replace('_', ' ', $tittle).'</h2><hr />
<div class="image"><img src="../img/films/'.$image.'" alt="'.$tittle.'" /></div>
<p>Duración: '.$film->getDuration().' minutos</p>
<p>Idioma: '.$film->getLanguage().'</p>
</div>
<div class="column right">
<h2>Seleccione un Cine y una Sesión</h2><hr />
<h3>Cines</h3>
'.$cinemasListHTML.'
<h3>Sesiones</h3>
'.$sessionsListHTML.'
<h3>Aplicar código promocional<span id="codeValid">&#x2714;</span><span id="codeInvalid">&#x274C;</span></h3>
<input type="text" name="code" id="code" value="" placeholder="Código pormocional" /><pre>'.$errorCode.'</pre>
</div>';
} else {
$html = '<h1>No existe la película.</h1>';
$pay = false;
}
} else if(isset($_GET["cinema"])) {
$pay = false;
$cinemaDAO = new Cinema_DAO("complucine");
$cinema = $cinemaDAO->cinemaData($_GET["cinema"]);
if($cinema){
$cinema_name = $cinema->getName();
$cinema_address = $cinema->getDirection();
$cinema_tlf = $cinema->getPhone();
$films = $cinemaDAO->getFilms($_GET["cinema"]);
$film_id = $_GET["film"];
if(!empty($films)){
$filmsNames = new ArrayIterator(array());
$filmsIDs = new ArrayIterator(array());
foreach($films as $key=>$value){
$filmsIDs[$key] = $value->getId();
$filmsNames[$key] = str_replace('_', ' ', $value->getTittle());
}
$filmsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$filmsIT->attachIterator($filmsIDs, "fID");
$filmsIT->attachIterator($filmsNames, "NAME");
$filmsListHTML = '<section id="select_film"><pre>'.$htmlErroresGlobales.'</pre>
<select name="films" id="films"><pre>'.$errorFilm.'</pre>';
if(!empty($films)){
$filmsListHTML .= '<option value="" selected>Selecciona una película</option>';
foreach($filmsIT as $value){
$filmsListHTML .='<option value="'.$value["fID"].'">'.$value["NAME"].'</option>';
}
} else {
foreach($filmsIT as $value){
if($value["cID"] == $film_id){
$filmsListHTML .= '<option value="'.$value["fID"].'" selected>'.$value["NAME"].'</option>';
} else {
$filmsListHTML .='<option value="'.$value["fID"].'">'.$value["NAME"].'</option>';
}
}
}
$filmsListHTML .= '</select>
</section>';
} else {
$filmsListHTML = '<select name="films"><option value="" selected>No hay películas disponibles para este cine.</option></select>';
}
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$html = '<div class="column left">
<h2>Cine seleccionado: '.$cinema_name.'</h2><hr />
<div class="image"><img src="../img/sala1.jpg" alt="'.$cinema_name.'" /></div>
<p>Dirección: '.$cinema_address.'</p>
<p>Teléfono: '.$cinema_tlf.'</p>
</div>
<div class="column right">
<h2>Seleccione una Película y una Sesión</h2><hr />
<h3>Películas</h3>
'.$filmsListHTML.'
<h3>Sesiones</h3>
<select>
<option value="" selected>Primero selecione una película.</option>
<select>
</div>';
} else {
$html = '<h1>No existe el cine.</h1>';
$pay = false;
}
} else {
$html = '<h1>No se ha encontrado película ni cine.</h1>';
$pay = false;
}
//Select seat button:
if($pay){
$pay = '<input type="submit" id="submit" value="Seleccionar Asiento" />';
}
return '
<section class="code purchase">
'.$html.'
</section>
<section class="code purchase">
'.$pay.'
</section>';
}
protected function procesaFormulario($datos){
$result = array();
$cinema = $this->test_input($datos['cinemas']) ?? null;
if ( empty($cinema) ) {
$result['cinemas'] = "Selecciona un cine.";
}
$films = $this->test_input($datos['films']) ?? null;
if ( empty($films) ) {
$result['films'] = "Selecciona una película.";
}
$session = $this->test_input($datos['sessions']) ?? null;
if ( empty($session) ) {
$result['sessions'] = "Selecciona una sesión.";
}
$code = $this->test_input($datos['code']) ?? null;
$avaliable = "../assets/php/common/checkPromo.php?code=".$code;
if ( !empty($code) && mb_strlen($code) != 8 && $avaliable === "avaliable") {
$result['code'] = "El código promocional no es válido.";
}
if (count($result) === 0) {
$result = "selectSeat.php";
}
return $result;
}
}
?>

View File

@ -0,0 +1,272 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
class FormSelectCinemaSession extends Form {
//Atributes:
//private $session; // Session of the film to be purchased.
//private $cinema; // Cinema of the film to be purchased.
//private $hall; // Hall of the film to be purchased.
//private $film; // Film to be purchased.
private $_TODAY; // Actual date.
public function __construct() {
$options = array("action" => "selectSeat.php");
parent::__construct('formSelectCinemaSession', $options);
$TODAY = getdate();
$this->_TODAY = "$TODAY[mday]"."-"."$TODAY[mon]"."-"."$TODAY[year]";
}
protected function generaCamposFormulario($datos, $errores = array()){
$cinemas = [];
$sessions = [];
// Se generan los mensajes de error, si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorCinema = self::createMensajeError($errores, 'cinemas', 'span', array('class' => 'error'));
$errorFilm = self::createMensajeError($errores, 'films', 'span', array('class' => 'error'));
$errorSession = self::createMensajeError($errores, 'sessions', 'span', array('class' => 'error'));
$errorCode = self::createMensajeError($errores, 'code', 'span', array('class' => 'error'));
$pay = true;
if(isset($_GET["film"])){
$filmDAO = new Film_DAO("complucine");
$film = $filmDAO->FilmData($_GET["film"]);
if($film){
$tittle = $film->getTittle();
$image = $film->getImg();
$cinemas = $filmDAO->getCinemas($_GET["film"]);
$cinema_id = $_GET["cinema"];
if(!empty($cinemas)){
$cinemasNames = new ArrayIterator(array());
$cinemasIDs = new ArrayIterator(array());
foreach($cinemas as $key=>$value){
$cinemasIDs[$key] = $value->getId();
$cinemasNames[$key] = $value->getName();
}
$cinemasIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$cinemasIT->attachIterator($cinemasIDs, "cID");
$cinemasIT->attachIterator($cinemasNames, "NAME");
$cinemasListHTML = '<section id="select_cinema"><pre>'.$htmlErroresGlobales.'</pre>
<select name="cinemas" id="cinemas"><pre>'.$errorCinema.'</pre>';
if(!isset($cinema_id)){
$cinemasListHTML .= '<option value="" selected>Selecciona un cine</option>';
foreach($cinemasIT as $value){
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
} else {
foreach($cinemasIT as $value){
if($value["cID"] == $cinema_id){
$cinemasListHTML .= '<option value="'.$value["cID"].'" selected>'.$value["NAME"].'</option>';
} else {
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
}
}
$cinemasListHTML .= '</select>
</section>';
} else {
$cinemasListHTML = '<select name="cinemas"><option value="" selected>No hay cines disponibles para esta película.</option></select>';
}
$fiml_id = $film->getId();
if(isset($cinema_id)){
$sessionsDAO = new SessionDAO("complucine");
$sessions = $sessionsDAO->getSessions_Film_Cinema($fiml_id, $cinema_id);
if(!empty($sessions)){
$sessionsDates = new ArrayIterator(array());
$sessionsStarts = new ArrayIterator(array());
$sessionsHalls = new ArrayIterator(array());
$sessionsIDs = new ArrayIterator(array());
foreach($sessions as $key=>$value){
$sessionsIDs[$key] = $value->getId();
$sessionsDates[$key] = date_format(date_create($value->getDate()), 'j-n-Y');
$sessionsHalls[$key] = $value->getIdhall();
$sessionsStarts[$key] = $value->getStartTime();
}
$sessionsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$sessionsIT->attachIterator($sessionsIDs, "sID");
$sessionsIT->attachIterator($sessionsDates, "DATE");
$sessionsIT->attachIterator($sessionsHalls, "HALL");
$sessionsIT->attachIterator($sessionsStarts, "HOUR");
$count = 0;
$sessionsListHTML = '<select name="sessions" id="sessions"><pre>'.$errorSession.'</pre>';
foreach ($sessionsIT as $value) {
if(strtotime($this->_TODAY) <= strtotime($value["DATE"])){
if($value === reset($sessionsIT)){
$sessionsListHTML .= '<option value="'.$value["sID"].'" >Fecha: '.$value["DATE"].' | Hora: '.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
} else {
$sessionsListHTML .='<option value="'.$value["sID"].'">Fecha: '.$value["DATE"].' | Hora:'.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
}
$count++;
}
}
$sessionsListHTML .= '</select>';
if($count == 0) {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>Primero seleccione un cine.</option></select>';
$pay = false;
}
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$html = '<div class="column left">
<h2>Película seleccionada: '.str_replace('_', ' ', $tittle).'</h2><hr />
<div class="image"><img src="../img/films/'.$image.'" alt="'.$tittle.'" /></div>
<p>Duración: '.$film->getDuration().' minutos</p>
<p>Idioma: '.$film->getLanguage().'</p>
</div>
<div class="column right">
<h2>Seleccione un Cine y una Sesión</h2><hr />
<h3>Cines</h3>
'.$cinemasListHTML.'
<h3>Sesiones</h3>
'.$sessionsListHTML.'
<h3><a href="../promotions/" target="_blank">Aplicar código promocional</a><span id="codeValid">&#x2714;</span><span id="codeInvalid">&#x274C;</span></h3>
<input type="text" name="code" id="code" value="" placeholder="Código pormocional" /><pre>'.$errorCode.'</pre>
</div>';
} else {
$html = '<h1>No existe la película.</h1>';
$pay = false;
}
} else if(isset($_GET["cinema"])) {
$pay = false;
$cinemaDAO = new Cinema_DAO("complucine");
$cinema = $cinemaDAO->cinemaData($_GET["cinema"]);
if($cinema){
$cinema_name = $cinema->getName();
$cinema_address = $cinema->getDirection();
$cinema_tlf = $cinema->getPhone();
$films = $cinemaDAO->getFilms($_GET["cinema"]);
$film_id = $_GET["film"];
if(!empty($films)){
$filmsNames = new ArrayIterator(array());
$filmsIDs = new ArrayIterator(array());
foreach($films as $key=>$value){
$filmsIDs[$key] = $value->getId();
$filmsNames[$key] = str_replace('_', ' ', $value->getTittle());
}
$filmsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$filmsIT->attachIterator($filmsIDs, "fID");
$filmsIT->attachIterator($filmsNames, "NAME");
$filmsListHTML = '<section id="select_film"><pre>'.$htmlErroresGlobales.'</pre>
<select name="films" id="films"><pre>'.$errorFilm.'</pre>';
if(!empty($films)){
$filmsListHTML .= '<option value="" selected>Selecciona una película</option>';
foreach($filmsIT as $value){
$filmsListHTML .='<option value="'.$value["fID"].'">'.$value["NAME"].'</option>';
}
} else {
foreach($filmsIT as $value){
if($value["cID"] == $film_id){
$filmsListHTML .= '<option value="'.$value["fID"].'" selected>'.$value["NAME"].'</option>';
} else {
$filmsListHTML .='<option value="'.$value["fID"].'">'.$value["NAME"].'</option>';
}
}
}
$filmsListHTML .= '</select>
</section>';
} else {
$filmsListHTML = '<select name="films"><option value="" selected>No hay películas disponibles para este cine.</option></select>';
}
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$html = '<div class="column left">
<h2>Cine seleccionado: '.$cinema_name.'</h2><hr />
<div class="image"><img src="../img/sala1.jpg" alt="'.$cinema_name.'" /></div>
<p>Dirección: '.$cinema_address.'</p>
<p>Teléfono: '.$cinema_tlf.'</p>
</div>
<div class="column right">
<h2>Seleccione una Película y una Sesión</h2><hr />
<h3>Películas</h3>
'.$filmsListHTML.'
<h3>Sesiones</h3>
<select>
<option value="" selected>Primero selecione una película.</option>
<select>
</div>';
} else {
$html = '<h1>No existe el cine.</h1>';
$pay = false;
}
} else {
$html = '<h1>No se ha encontrado película ni cine.</h1>
<button id="go-back">Volver</button>';
$pay = false;
}
//Select seat button:
if($pay){
$pay = '<input type="submit" id="submit" value="Seleccionar Asiento" />';
} else {
$pay = '<button id="go-back">Volver</button>';
}
return '
<section class="code purchase">
'.$html.'
</section>
<section class="code purchase">
'.$pay.'
</section>';
}
protected function procesaFormulario($datos){
$result = array();
$cinema = $this->test_input($datos['cinemas']) ?? null;
if ( empty($cinema) ) {
$result['cinemas'] = "Selecciona un cine.";
}
$films = $this->test_input($datos['films']) ?? null;
if ( empty($films) ) {
$result['films'] = "Selecciona una película.";
}
$session = $this->test_input($datos['sessions']) ?? null;
if ( empty($session) ) {
$result['sessions'] = "Selecciona una sesión.";
}
$code = $this->test_input($datos['code']) ?? null;
$avaliable = "../assets/php/common/checkPromo.php?code=".$code;
if ( !empty($code) && mb_strlen($code) != 8 && $avaliable === "avaliable") {
$result['code'] = "El código promocional no es válido.";
}
if (count($result) === 0) {
$result = "selectSeat.php";
}
return $result;
}
}
?>

View File

@ -0,0 +1,107 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/seat_dao.php');
include_once($prefix.'assets/php/includes/seat.php');
class FormSelectSeat extends Form {
//Atributes:
public function __construct() {
$options = array("action" => "confirm.php");
parent::__construct('formSelectSeat', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error, si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorSeat = self::createMensajeError($errores, 'seats', 'span', array('class' => 'error'));
$sessionDAO = new SessionDAO("complucine");
$session = $sessionDAO->sessionData($_POST["sessions"]);
$hallDAO = new HallDAO("complucine");
$hall = $hallDAO->HallData($session->getIdhall());
$seatDAO = new SeatDAO("complucine");
$seats = $seatDAO->getAllSeats($session->getIdhall(), $session->getIdcinema());
$rows = $hall->getNumRows();
$cols = $hall->getNumCol();
//$seats = $hall->getTotalSeats();
$seats_map = array();
for($i = 1; $i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
$seats_map[$i][$j] = $seats[$i]->getState();
}
}
$html ='<h2>Seleccionar un Asiento</h2><hr />
<h3 class="table_title">Pantalla</h3>
<table class="seat">
<thead>
<tr>
<th> </th>
';
for($j = 1; $j <= $cols; $j++){
$html .= '<th>'.$j.'</th>
';
}
$html .= '</tr>
</thead>
<tbody>';
for($i = 1; $i <= $rows; $i++){
$html .= '
<tr>
<td>'.$i.'</td>
';
for($j = 1; $j <= $cols; $j++){
if($seats_map[$i][$j] >= 0){
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" checked> <label for="checkbox'.$i.$j.'"> </td>
';}
else {
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" disabled> <label for="checkbox'.$i.$j.'"> </td>
';}
}
$html .='</tr>';
}
$html .= '
</tbody>
</table>';
//Pay button:
$pay = '<input type="hidden" name="sessions" id="sessions" value="'.$_POST["sessions"].'" />
<input type="submit" id="submit" value="Pagar" />';
return '
<section class="code purchase">
'.$html.'
</section>
<section class="code purchase">
'.$pay.'
</section>';
}
protected function procesaFormulario($datos){
$result = array();
if (count($result) === 0) {
$result = "confirm.php";
}
return $result;
}
}
?>

View File

@ -0,0 +1,108 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/hall_dao.php');
include_once($prefix.'assets/php/includes/hall.php');
include_once($prefix.'assets/php/includes/seat_dao.php');
include_once($prefix.'assets/php/includes/seat.php');
class FormSelectSeat extends Form {
//Atributes:
public function __construct() {
$options = array("action" => "confirm.php");
parent::__construct('formSelectSeat', $options);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error, si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorSeat = self::createMensajeError($errores, 'seats', 'span', array('class' => 'error'));
$sessionDAO = new SessionDAO("complucine");
$session = $sessionDAO->sessionData($_POST["sessions"]);
$hallDAO = new HallDAO("complucine");
$hall = $hallDAO->HallData($session->getIdhall());
$seatDAO = new SeatDAO("complucine");
$seats = $seatDAO->getAllSeats($session->getIdhall(), $session->getIdcinema());
$rows = $hall->getNumRows();
$cols = $hall->getNumCol();
//$seats = $hall->getTotalSeats();
$seats_map = array();
for($i = 1; $i <= $rows; $i++){
for($j = 1; $j <= $cols; $j++){
$seats_map[$i][$j] = $seats[$i]->getState();
}
}
$html ='<h2>Seleccionar un Asiento</h2><hr />
<h3 class="table_title">Pantalla</h3>
<table class="seat">
<thead>
<tr>
<th> </th>
';
for($j = 1; $j <= $cols; $j++){
$html .= '<th>'.$j.'</th>
';
}
$html .= '</tr>
</thead>
<tbody>';
for($i = 1; $i <= $rows; $i++){
$html .= '
<tr>
<td>'.$i.'</td>
';
for($j = 1; $j <= $cols; $j++){
if($seats_map[$i][$j] >= 0){
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" /> <label for="checkbox'.$i.$j.'"> </td> <!-- checked -->
';}
else {
$html .= '<td> <input type="checkbox" class="check_box" name="checkbox'.$i.$j.'" value="'.$seats_map[$i][$j].'" id="checkbox'.$i.$j.'" disabled /> <label for="checkbox'.$i.$j.'"> </td>
';}
}
$html .='</tr>';
}
$html .= '
</tbody>
</table>';
//Pay button:
$pay = '<input type="hidden" name="sessions" id="sessions" value="'.$_POST["sessions"].'" />
<input type="hidden" name="code" id="code" value="'.$_POST["code"].'" />
<input type="submit" id="submit" value="Pagar" />';
return '
<section class="code purchase">
'.$html.'
</section>
<section class="code purchase">
'.$pay.'
</section>';
}
protected function procesaFormulario($datos){
$result = array();
if (count($result) === 0) {
$result = "confirm.php";
}
return $result;
}
}
?>

View File

@ -0,0 +1,50 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
class FormSelectTicket extends Form {
public function __construct() {
parent::__construct('formSelectTicket');
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
//$errorNombre = self::createMensajeError($errores, 'name', 'span', array('class' => 'error'));
$html = "";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
//$nombre = $this->test_input($datos['name']) ?? null;
$nombre = $datos['name'] ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['name'] = "El nombre tiene que tener\n una longitud de al menos\n 3 caracteres\n y menos de 15 caracteres.";
}
//$password = $this->test_input($datos['pass']) ?? null;
$password = $datos['pass'] ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
if (count($result) === 0) {
$result[] = "La compra aun está en desarrollo. Vuelva en unos días.";
}
return $result;
}
}
?>

153
purchase/index copy.php Normal file
View File

@ -0,0 +1,153 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Get Film to purchase:
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
$TODAY = getdate();
$TODAY = "$TODAY[mday]"."-"."$TODAY[mon]"."-"."$TODAY[year]";
$pay = true;
$film = null;
$cinemas = [];
$sessions = [];
if(isset($_GET["film"])){
$filmDAO = new Film_DAO("complucine");
$film = $filmDAO->FilmData($_GET["film"]);
if($film){
$tittle = $film->getTittle();
$cinemas = $filmDAO->getCinemas($_GET["film"]);
if(!empty($cinemas)){
$cinemasNames = new ArrayIterator(array());
$cinemasIDs = new ArrayIterator(array());
foreach($cinemas as $key=>$value){
$cinemasIDs[$key] = $value->getId();
$cinemasNames[$key] = $value->getName();
}
$cinemasIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$cinemasIT->attachIterator($cinemasIDs, "cID");
$cinemasIT->attachIterator($cinemasNames, "NAME");
$cinemasListHTML = '<form action="confirm.php" method="post">
<select name="cinemas" id="cinemas">';
foreach($cinemasIT as $value){
if($value == reset($cinemasIT)){
$cinemasListHTML .= '<option value="'.$value["cID"].'" selected>'.$value["NAME"].'</option>';
} else {
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
}
$cinemasListHTML .= '</select>';
} else {
$cinemasListHTML = '<select name="cinemas"><option value="" selected>No hay cines disponibles para esta película.</option></select></form>';
}
$fiml_id = $film->getId();
$cinema_id = $value["cID"];
$sessionsDAO = new SessionDAO("complucine");
$sessions = $sessionsDAO->getSessions_Film_Cinema($fiml_id, $cinema_id);
if(!empty($sessions)){
$sessionsDates = new ArrayIterator(array());
$sessionsStarts = new ArrayIterator(array());
$sessionsHalls = new ArrayIterator(array());
$sessionsIDs = new ArrayIterator(array());
foreach($sessions as $key=>$value){
$sessionsIDs[$key] = $value->getId();
$sessionsDates[$key] = date_format(date_create($value->getDate()), 'j-n-Y');
$sessionsHalls[$key] = $value->getIdhall();
$sessionsStarts[$key] = $value->getStartTime();
}
$sessionsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$sessionsIT->attachIterator($sessionsIDs, "sID");
$sessionsIT->attachIterator($sessionsDates, "DATE");
$sessionsIT->attachIterator($sessionsHalls, "HALL");
$sessionsIT->attachIterator($sessionsStarts, "HOUR");
$count = 0;
$sessionsListHTML = '<select name="sessions" id="sessions">';
foreach ($sessionsIT as $value) {
if($TODAY <= $value["DATE"]){
if($value === reset($sessionsIT)){
$sessionsListHTML .= '<option value="'.$value["sID"].'" >Fecha: '.$value["DATE"].' | Hora: '.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
} else {
$sessionsListHTML .='<option value="'.$value["sID"].'">Fecha: '.$value["DATE"].' | Hora:'.$value["HOUR"].' | Sala: '.$value["HALL"].'</option>';
}
$count++;
}
}
$sessionsListHTML .= '</select>';
if($count == 0) {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
$pay = false;
}
//$session_id = $value["sID"];
//$hall_id = $value["HALL"];
//$date_ = $value["DATE"];
//$hour_ = $value["HOUR"];
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$reply = '<div class="column left">
<h2>Película seleccionada: '.str_replace('_', ' ', $tittle).'</h2><hr />
<div class="image"><img src="'.$prefix.'img/films/'.$tittle.'.jpg" alt="'.$tittle.'" /></div>
<p>Duración: '.$film->getDuration().' minutos</p>
<p>Idioma: '.$film->getLanguage().'</p>
</div>
<div class="column right">
<h2>Seleccione un Cine y una Sesión</h2><hr />
<h3>Cines</h3>
'.$cinemasListHTML.'
<h3>Sesiones</h3>
'.$sessionsListHTML.'
</div>
';
} else {
$reply = '<h1>No existe la película.</h1>';
$pay = false;
}
} else if(isset($_GET["cinema"])) {
$reply = '<h1>ESTAMOS TRABAJANDO EN ELLO</h1>';
$pay = false;
} else {
$reply = '<h1>No se ha encontrado película ni cine.</h1>';
$pay = false;
}
//Pay button:
if($pay){
$pay = '<input type="submit" id="submit" value="Pagar" />
</form>';
} else {
$pay = '</form>';
}
//Page-specific content:
$section = '<!-- Purchase -->
<section id="purchase">
<div class="row">
<section class="code purchase">
'.$reply.'
</section>
<section class="code purchase">
'.$pay.'
</section>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

23
purchase/index.php Normal file
View File

@ -0,0 +1,23 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Form Ticket to purchase:
require_once('includes/formSelectCinemaSession.php');
$form = new FormSelectCinemaSession();
$formHTML = $form->gestiona();
//Page-specific content:
$section = '<!-- Purchase -->
<section id="purchase">
<div class="row">
'.$formHTML.'
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
//TO-DO: añadir selección de butaca y elegir promociones y enviar con el POST.
?>

81
purchase/resume.php Normal file
View File

@ -0,0 +1,81 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Get purchase summary
include_once($prefix.'assets/php/includes/purchase.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
if(isset($_SESSION["purchase"]) && isset($_SESSION["film_purchase"])){
$purchase = unserialize($_SESSION["purchase"]);
$film_purchase = unserialize($_SESSION["film_purchase"]);
$sessionDAO = new SessionDAO("complucine");
$session = $sessionDAO->sessionData($purchase->getSessionId());
$cinemaDAO = new Cinema_DAO("complucine");
$cinema = $cinemaDAO->cinemaData($purchase->getCinemaId());
$seatsArray = array_combine(unserialize($purchase->getRow()), unserialize($purchase->getColumn()));
$seats = "";
for($i=0; $i < count(unserialize($purchase->getRow())); $i++){
$seats .= unserialize($purchase->getRow())[$i]."-".unserialize($purchase->getColumn())[$i].", ";
}
unset($_SESSION["purchase"]);
unset($_SESSION["film_purchase"]);
$reply = "<h2>Se ha realizado su compra con éxito, a continuación puede ver el resumen:</h2><hr />
<div class='column left'>
<img src='".$prefix."img/films/".$film_purchase->getImg()."' alt='".$film_purchase->getTittle()."' />
<p>Película: ".str_replace('_', ' ', strtoupper($film_purchase->getTittle()))."</p>
<p>Duración: ".$film_purchase->getDuration()." minutos</p>
<p>Idioma: ".$film_purchase->getLanguage()."</p>
<p>Precio: ".$session->getSeatPrice()*count(unserialize($purchase->getRow()))." </p>
</div>
<div class='column right'>
<p>Sesión (Fecha): ".$session->getDate()."</p>
<p>Sesión (Hora): ".$session->getStartTime()."</p>
<p>Cine: ".$cinema->getName()."</p>
<p>Sala: ".$purchase->getHallId()."</p>
<p>Asiento(s): ".$seats."</p>
<p>Fecha de la Compra: ".$purchase->getTime()."</p>
</div>
";
if(isset($_SESSION["login"]) && $_SESSION["login"] == true){
$actions = '<h3>Guarde esta información y enséñela para entrar al cine.</h3><hr />
<p>Se ha guardado la información de la compra en su panel de usuario.</p>
<button onclick="javascript:window.print()">Imprimir<//button>
<a href="'.$prefix.'panel_user/?option=purchases"><button>Mi Historial</button></a>
';
} else {
$actions = '<h3>Guarde esta información y enséñela para entrar al cine.</h3><hr />
<button onclick="javascript:window.print()">Imprimir<//button>
<!-- <button onclick="javascript:window.print()">Guardar<//button> -->
';
}
} else {
$reply = '<h2>No se han encontrado datos de compra<h2>';
$actions = '';
}
//Page-specific content:
$section = '<!-- Purchase Summary -->
<section id="purchase_summary">
<div class="row">
<section class="code">
'.$reply.'
</section>
<section class="code resume">
'.$actions.'
</section>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

18
purchase/selectSeat.php Normal file
View File

@ -0,0 +1,18 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Seats form:
require_once('includes/formSelectSeat.php');
$form = new FormSelectSeat();
$formHTML = $form->gestiona();
//Page-specific content:
$section = '<section class="row">
<!-- Seat Form -->
'.$formHTML.'
</div>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,147 @@
<?php
include_once($prefix.'assets/php/includes/user_dao.php');
include_once($prefix.'assets/php/form.php');
class FormRegister extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
const HTML5_PASS_REGEXP = '^(?=\w*\d)(?=\w*[A-Z])(?=\w*[a-z])\S{4,16}$';
//Atributes:
private $user; // User who is going to log-in.
//Constructor:
public function __construct() {
parent::__construct('formRegister');
}
//Methods:
protected function generaCamposFormulario($datos, $errores = array()){
//$nombre = $datos['new_name'] ?? '';
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'new_name', 'span', array('class' => 'error'));
$errorEmail = self::createMensajeError($errores, 'new_email', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'new_pass', 'span', array('class' => 'error'));
$errorPassword2 = self::createMensajeError($errores, 'repass', 'span', array('class' => 'error'));
$errorVerify = self::createMensajeError($errores, 'terms', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='datos_personales'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos personales</legend>
<input type='text' name='new_name' id='new_name' value='' placeholder='Nombre de Usuario' required/><pre>".$errorNombre."</pre>
<span id='userValid'>&#x2714;</span><span id='userWarning'>&#x26a0;</span></span><span id='userInvalid'>&#x274C;</span>
<input type='email' name='new_email' id='new_email' value='' placeholder='Email' required/><pre>".$errorEmail."</pre>
<span id='emailValid'>&#x2714;</span></span><span id='emailInvalid'>&#x274C;</span>
<input type='password' name='new_pass' id='new_pass' value='' placeholder='Contraseña' required/><pre>".$errorPassword."</pre>
<span id='passValid'>&#x2714;</span><span id='passWarning'>&#x26a0;</span></span><span id='passInvalid'>&#x274C;</span>
<input type='password' name='repass' id='repass' value='' placeholder='Repita la contraseña' required/><pre>".$errorPassword2."</pre>
<span id='repassValid'>&#x2714;</span></span><span id='repassInvalid'>&#x274C;</span>
</fieldset>
<div class='verify'><pre>".$errorVerify."</pre>
<input type='checkbox' id='checkbox' name='terms' required>
<label for='terms'><a href ='../fdicines/terms_conditions/' target='_blank'>Marque esta casilla para verificar que ha leído nuestros términos y condiciones del servicio.</a></label>
</div>
<div class='actions'>
<input type='submit' name='register' id='register' value='Registrarse' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['new_name']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['new_name'] = "El nombre tiene que tener\nuna longitud de al menos\n3 caracteres\ny menos de 15 caracteres.";
}
$email = $this->test_input($datos['new_email']) ?? null;
if ( empty($email) || !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $email) ) {
$result['new_email'] = "El email no es válido.";
}
$password = $this->test_input($datos['new_pass']) ?? null;
if ( empty($password) || !mb_ereg_match(self::HTML5_PASS_REGEXP, $password) ) {
$result['new_pass'] = "El password tiene que tener\nuna longitud de al menos\n 4 caracteres 1 mayúscula y 1 número.";
}
$password2 = $this->test_input($datos['repass']) ?? null;
if ( empty($password2) || strcmp($password, $password2) !== 0 ) {
$result['repass'] = "Los passwords deben coincidir";
}
$verify = $this->test_input($datos['terms']) ?? null;
if ( empty($verify) ) {
$result['terms'] = "Debe confirmar la casilla de\ntérminos y condiciones.";
}
if (count($result) === 0) {
$bd = new UserDAO('complucine');
if($bd){
$this->user = $bd->selectUserName($nombre);
if ($this->user->data_seek(0)) {
$result[] = "El usuario ya existe.";
}
else{
$this->user = $bd->selectUserEmail($email);
if ($this->user->data_seek(0)) {
$result[] = "El email ya está registrado.";
} else {
if($bd->createUser("", $nombre, $email, $password, "user")){
$this->user = $bd->selectUser($nombre, $password);
if ($this->user) {
$this->user->setPass(null);
$_SESSION["user"] = serialize($this->user);
$_SESSION["nombre"] = $this->user->getName();
$_SESSION["rol"] = $this->user->getRol();
$_SESSION["login"] = true;
$img = "../img/users/user.jpg"; //USER_PICS
$profile_img = "../img/users/".$nombre.".jpg";
copy($img, $profile_img);
$result = ROUTE_APP."register/register.php";
} else {
$result[] = "Ha ocurrido un error al iniciar la sesión\nPero el usuario se creó correctamente.";
}
} else {
$result[] = "Ha ocurrido un error al crear el usuario.";
}
}
}
} else {
$result[] = "Error al conectar con la BD.";
}
}
return $result;
}
//Returns validation response:
static public function getReply() {
if(isset($_SESSION["login"])){
$name = strtoupper($_SESSION['nombre']);
$reply = "<h1>Bienvenido {$_SESSION['nombre']}</h1><hr />
<p>{$name}, has creado tu cuenta de usuario correctamente.</p>
<p>Usa los botones para navegar</p>
<a href='../'><button>Inicio</button></a>
<a href='../../panel_{$_SESSION["rol"]}'><button>Mi Panel</button></a>\n";
}
else if(!isset($_SESSION["login"])){
$reply = "<h1>ERROR</h1><hr />
<p>Ha ocurrido un problema y no hemos podido completar el registro</p>
<p>Vuelve a intetarlo o inicia sesión si tienes una cuenta de usuario.</p>
<a href='../login/'><button>Iniciar Sesión</button></a>
<form method='post' action='../login/'><button name='register' id='_register'>Registro</button></form>\n";
}
return $reply;
}
}
?>

View File

@ -0,0 +1,148 @@
<?php
include_once($prefix.'assets/php/includes/user_dao.php');
include_once($prefix.'assets/php/form.php');
class FormRegister extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
const HTML5_PASS_REGEXP = '^(?=\w*\d)(?=\w*[A-Z])(?=\w*[a-z])\S{4,16}$';
private const _USER = "user";
//Atributes:
private $user; // User who is going to log-in.
//Constructor:
public function __construct() {
parent::__construct('formRegister');
}
//Methods:
protected function generaCamposFormulario($datos, $errores = array()){
//$nombre = $datos['new_name'] ?? '';
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'new_name', 'span', array('class' => 'error'));
$errorEmail = self::createMensajeError($errores, 'new_email', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'new_pass', 'span', array('class' => 'error'));
$errorPassword2 = self::createMensajeError($errores, 'repass', 'span', array('class' => 'error'));
$errorVerify = self::createMensajeError($errores, 'terms', 'span', array('class' => 'error'));
$html = "<div class='row'>
<fieldset id='datos_personales'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos personales</legend>
<input type='text' name='new_name' id='new_name' value='' placeholder='Nombre de Usuario' required/><pre>".$errorNombre."</pre>
<span id='userValid'>&#x2714;</span><span id='userWarning'>&#x26a0;</span></span><span id='userInvalid'>&#x274C;</span>
<input type='email' name='new_email' id='new_email' value='' placeholder='Email' required/><pre>".$errorEmail."</pre>
<span id='emailValid'>&#x2714;</span></span><span id='emailInvalid'>&#x274C;</span>
<input type='password' name='new_pass' id='new_pass' value='' placeholder='Contraseña' required/><pre>".$errorPassword."</pre>
<span id='passValid'>&#x2714;</span><span id='passWarning'>&#x26a0;</span></span><span id='passInvalid'>&#x274C;</span>
<input type='password' name='repass' id='repass' value='' placeholder='Repita la contraseña' required/><pre>".$errorPassword2."</pre>
<span id='repassValid'>&#x2714;</span></span><span id='repassInvalid'>&#x274C;</span>
</fieldset>
<div class='verify'><pre>".$errorVerify."</pre>
<input type='checkbox' id='checkbox' name='terms' required>
<label for='terms'><a href ='../fdicines/terms_conditions/' target='_blank'>Marque esta casilla para verificar que ha leído nuestros términos y condiciones del servicio.</a></label>
</div>
<div class='actions'>
<input type='submit' name='register' id='register' value='Registrarse' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
$nombre = $this->test_input($datos['new_name']) ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['new_name'] = "El nombre tiene que tener\nuna longitud de al menos\n3 caracteres\ny menos de 15 caracteres.";
}
$email = $this->test_input($datos['new_email']) ?? null;
if ( empty($email) || !mb_ereg_match(self::HTML5_EMAIL_REGEXP, $email) ) {
$result['new_email'] = "El email no es válido.";
}
$password = $this->test_input($datos['new_pass']) ?? null;
if ( empty($password) || !mb_ereg_match(self::HTML5_PASS_REGEXP, $password) ) {
$result['new_pass'] = "El password tiene que tener\nuna longitud de al menos\n 4 caracteres 1 mayúscula y 1 número.";
}
$password2 = $this->test_input($datos['repass']) ?? null;
if ( empty($password2) || strcmp($password, $password2) !== 0 ) {
$result['repass'] = "Los passwords deben coincidir";
}
$verify = $this->test_input($datos['terms']) ?? null;
if ( empty($verify) ) {
$result['terms'] = "Debe confirmar la casilla de\ntérminos y condiciones.";
}
if (count($result) === 0) {
$bd = new UserDAO('complucine');
if($bd){
$this->user = $bd->selectUserName($nombre);
if ($this->user->data_seek(0)) {
$result[] = "El usuario ya existe.";
}
else{
$this->user = $bd->selectUserEmail($email);
if ($this->user->data_seek(0)) {
$result[] = "El email ya está registrado.";
} else {
if($bd->createUser("", $nombre, $email, $password, self::_USER)){
$this->user = $bd->selectUser($nombre, $password);
if ($this->user) {
$this->user->setPass(null);
$_SESSION["user"] = serialize($this->user);
$_SESSION["nombre"] = $this->user->getName();
$_SESSION["rol"] = $this->user->getRol();
$_SESSION["login"] = true;
$img = "../img/tmp/user.jpg"; //TMP_DIR
$profile_img = "../img/users/".$nombre.".jpg";
copy($img, $profile_img);
$result = ROUTE_APP."register/register.php";
} else {
$result[] = "Ha ocurrido un error al iniciar la sesión\nPero el usuario se creó correctamente.";
}
} else {
$result[] = "Ha ocurrido un error al crear el usuario.";
}
}
}
} else {
$result[] = "Error al conectar con la BD.";
}
}
return $result;
}
//Returns validation response:
static public function getReply() {
if(isset($_SESSION["login"])){
$name = strtoupper($_SESSION['nombre']);
$reply = "<h1>Bienvenido {$_SESSION['nombre']}</h1><hr />
<p>{$name}, has creado tu cuenta de usuario correctamente.</p>
<p>Usa los botones para navegar</p>
<a href='../'><button>Inicio</button></a>
<a href='../../panel_{$_SESSION["rol"]}'><button>Mi Panel</button></a>\n";
}
else if(!isset($_SESSION["login"])){
$reply = "<h1>ERROR</h1><hr />
<p>Ha ocurrido un problema y no hemos podido completar el registro</p>
<p>Vuelve a intetarlo o inicia sesión si tienes una cuenta de usuario.</p>
<a href='../login/'><button>Iniciar Sesión</button></a>
<form method='post' action='../login/'><button name='register' id='_register'>Registro</button></form>\n";
}
return $reply;
}
}
?>

24
register/register.php Normal file
View File

@ -0,0 +1,24 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Login form validate:
require_once('./includes/formRegister.php');
$reply = FormRegister::getReply();
$section = '<!-- Reply -->
<section class="reply">
<div class ="row">
<div class="column side"></div>
<div class="column middle">
<div class="code info">
'.$reply.'
</div>
</div>
<div class="column side"></div>
</div>
</section>
';
require RAIZ_APP.'/HTMLtemplate.php';
?>

16
showtimes/index.php Normal file
View File

@ -0,0 +1,16 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Page-specific content:
$section = '<!-- Films -->
<section id="films_billboard">
<div class="row">
'.$template->print_fimls().'
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>