diff --git a/assets/css/highContrast.css b/assets/css/highContrast.css new file mode 100644 index 0000000..4162e58 --- /dev/null +++ b/assets/css/highContrast.css @@ -0,0 +1,613 @@ +/* Basic */ +* { + box-sizing: border-box; + margin: 0px; + } + + /* Headers */ + h1, h2, h3, h4 { + color: #d3ebff; + text-transform: uppercase; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + vertical-align: baseline; + text-align: center; + } + + h2 { + font-size: 95%; + } + + h3 { + font-size: 85%; + } + + h4 { + font-size: 75%; + } + + /* Buttons */ + button, .button.large { + display: inline-block; + margin: 10px; + width: 150px; + height: 30px; + padding: 5px 10px; + background-color :#1f2c3d; + border: 1px solid #dadada; + text-align: center; + color :#dadada; + font-weight: bold; + position: relative; + } + .button.large { + width: 95%; + } + button:hover, .button:hover { + cursor: pointer; + background-color:#dadada; + color:#1f2c3d; + border-color: #1f2c3d; + } + + /* Header */ + .header { + background-color: #1f2c3d; + color: #dadada; + padding: 15px; + text-align: left; + font-size: 18px; + } + .header img { + width: 13px; + } + /* Header Menu */ + .menu { + margin-top: 10px; + text-align: right; + font-size: 15px; + } + .menu nav a{ + text-decoration: none; + color: inherit; + font-size: 15px; + } + .menu nav li{ + display: inline-block; + width: 150px; + height: 30px; + padding: 5px 10px; + background-color :#1f2c3d; + border: 1px solid #dadada; + text-align: center; + color :#dadada; + position: relative; + } + .menu nav li:hover{ + background-color:#dadada; + color:#1f2c3d; + border-color: #1f2c3d; + } + .menu nav li>ul{ + display: none; + } + .menu nav li:hover>ul{ + display: block; + position: absolute; + top: 29px; + right: -1px; + } + /* Sub Header */ + .header.sub { + margin-bottom: 20px; + padding: 5px; + display: flex; + flex-direction: row; + text-align: center; + justify-content: center; + font-size: 20px; + } + .header.sub .menu { + margin-top: 0px; + text-align: center; + font-size: 15px; + } + /* Responsive layout */ + @media (max-width: 850px) { + .header.sub .menu nav li:hover>ul{ + display: block; + position: relative; + top: 5px; + left: -51px; + } + } + + + /* Paragraphs */ + p { + padding: 0; + border: 0; + } + + a { + color: #dadada; + text-decoration: none; + } + a:hover{ + color:rgb(138, 150, 32); + } + + /* Body */ + body { + font-family: Arial, Helvetica, sans-serif; + background-color: #00020f; + color: #dadada; + } + + /* Table */ + table { + border-collapse: collapse; + border-spacing: 0; + margin: 0 0 2em 0; + width: 100%; + text-align: left; + font-size: 15px; + } + table a{ + color: #dadada; + } + table tbody tr { + color: #dadada; + border: solid 1px #dadada; + border-left: 0; + border-right: 0; + } + table tbody tr:nth-child(2n + 1) { + background-color: rgba(255, 255, 255, 0.25); + } + table td { + padding: 0.75em 0.75em; + } + table th { + color: #dadada; + font-size: 0.9em; + font-weight: 600; + padding: 0.85em 0.85em 0.85em 0.85em; + } + table thead, table tfoot { + border-bottom: solid 2px #dadada; + } + table.alt { + border-collapse: separate; + } + table.alt tbody tr td { + border: solid 1px #dadada; + border-left-width: 0; + border-top-width: 0; + } + + table.alt tbody tr td:first-child { + border-left-width: 1px; + } + + table.alt tbody tr:first-child td { + border-top-width: 1px; + } + + table.alt thead, table.alt tfoot { + border-top: 0; + } + + + /* Main */ + main { + padding: 30px; + text-align: center; + font-size: 35px; + } + main h1, h2, h3, h4 { + color: #dadada; + } + main img { + width: 40%; + } + + /* Create three unequal columns that floats next to each other */ + .column { + float: left; + padding: 10px; + } + + /* Left and right column */ + .column.side { + width: 33.33%; + } + + /* Middle column */ + .column.middle { + width: 33.33%; + } + + .column.middle .image img, .column.side .image img{ + border-radius: 4px; + border: 0; + position: relative; + border-radius: 4px; + display: block; + margin: 0 0 3rem 0; + width: 100%; + } + + /* Left column */ + .column.left { + width: 50%; + } + + /* Right column */ + .column.right { + float: right; + width: 50%; + } + + /* Clear floats after the columns */ + .row:after { + content: ""; + display: table; + clear: both; + } + + /* Responsive layout: makes the three columns stack on top of each other instead of next to each other */ + @media (max-width: 1000px) { + .column.side, .column.middle, .column.left, .column.right{ + width: 100%; + } + } + + /* Zoom */ + .zoom { + transition: transform .2s; + } + .zoom:hover { + transform: scale(1.05); + } + + /* Code & Blockquote */ + .code { + background: #1f2c3d; + border-radius: 3px; + font-size: 0.9em; + margin: 10px; + display: block; + line-height: 1.75em; + padding: 1em 1.5em; + overflow-x: auto; + overflow-y: auto; + } + .code h1, .code h2{ + color: #dadada; + } + .code h3, .code h4 { + color: #d3ebff; + } + .code p { + color: #dadada; + } + .code a { + text-decoration: underline; + } + .code ul, .code ol, .code li{ + color: #dadada; + } + .code img{ + /* width: 80px; height: 80px; */ + width: 25%; + } + .code fieldset{ + margin: 1px; + border-color: #dadada; + border-style: groove; + } + .code fieldset legend { + text-transform: uppercase; + font-weight: bold; + font-size: 90%; + color: #d3ebff; + } + .code label{ + color: #d3ebff; + } + .code.details{ + height: 750px; + } + .code.plan { + height: 1150px; + } + .code.info{ + text-align: center; + height: 250px; + } + .code.showtimes{ + height: 600px; + } + + + /* BlockQuotes */ + .blockquote { + border-left: solid 4px #dadada; + margin: 0 0 2em 0; + margin-top: 10px; + padding: 0.5em 0 0.5em 2em; + } + .blockquote.bio { + height: 250px; + } + + /* Sketches */ + .sketches { + text-align: center; + display: block; + line-height: 1.25em; + padding: 1em 1em; + overflow-x: auto; + background: #1f2c3d; + border-radius: 3px; + height: 680px; + } + .sketches h1, .sketches h2, .sketches h3, .sketches h4, .sketches p { + color: #dadada; + } + .sketches img { + width: 550px; + height: 550px; + } + .sketches .description { + color: #00020f; + } + /* Responsive layout */ + @media (max-width: 1500px) { + .column.side .sketches, .column.middle .sketches { + width: 100%; + height: 500px; + } + .column.side .sketches img, .column.middle .sketches img { + width: 100%; + height: 75%; + } + } + @media (max-width: 1150px) { + .sketches img { + width: 100%; + height: 75%; + } + } + + /* Text Box */ + .textbox { + color: #d3ebff; + padding: 15px 15px 10px 15px; + margin: 10px 0 10px; + overflow: hidden; + border-radius: 25px 0px 25px 0px; + border: 2px solid #d3ebff; + } + .textbox h1, .textbox h2, .textbox h3 { + color: #d3ebff; + text-align: left; + } + + /* Galery */ + .galery { + box-sizing: border-box; + } + .galery .columna { + margin-top: 10px; + float: left; + width: 50%; + padding-right: 10px; + } + .galery .fila::after { + content: ""; + clear: both; + display: table; + } + .galery .image img { + width: 100%; + } + .galery .image.main img { + width: 100%; + } + + + /* Percentage bar */ + .bar { + height: 15px; + line-height: 15px; + font-size: 13px; + font-weight: bold; + width: 100%; + color: #dadada; + background-color: #00020f; + text-align: right; + } + .bar.seventyfive { + width: 75%; + } + .bar.fifty { + width: 50%; + } + .bar.twentyfive { + width: 25%; + } + + /* Timeline Image */ + .timeline h2 { + padding-top: 50px; + } + .timeline img{ + width: 100%; + text-align: center; + padding-bottom: 50px; + padding-left: 15px; + padding-right: 15px; + } + + /* Sidebars */ + .sidebar.left { + padding: 5px; + margin-top: 10px; + margin-bottom: 10px; + float: left; + width: 300px; + height: 370PX; + color: #00020f; + background-color: #1f2c3d; + } + .sidebar.left a { + color: #00020f; + font-weight: bold; + text-decoration: none; + } + .sidebar.left a:hover { + color: #00020f; + text-decoration: underline; + } + /* Responsibe sidebar */ + @media (max-width: 1000px) { + .sidebar.left { + width: 100%; + height: 100%; + } + } + + + /* Form */ + form { + margin: auto; + width: 65%; + } + + form h1, h2, h3, h4 { + color: #dadada; + } + + label { + color: #dadada; + text-align: center; + font-weight: bold; + } + + input, textarea { + width: 100%; + height: 27px; + border: 1px solid #dadada; + padding: 10px; + margin-top: 5px; + font-size: 15px; + } + + textarea { + width: 100%; + height: 150px; + } + + legend { + color: #dadada; + } + + #radio, #checkbox { + width: auto; + height: 15px; + cursor: pointer; + } + + .verify { + font-size: 11px; + } + .verify a { + color: #dadada; + } + .verify a:hover { + color: rgb(138, 150, 32); + } + + #submit, #register { + width: 100%; + height: 35px; + border: 1px solid #dadada; + padding: 5px; + margin-top: 5px; + font-size: 15px; + font-weight: bold; + box-shadow: 2px 2px #1f2c3d; + filter: brightness(105%); + cursor: pointer; + } + #submit:hover, #register:hover { + color: #dadada; + background-color: #1f2c3d; + } + + #reset { + width: 100%; + height: 30px; + border: 1px solid #dadada; + background-color: #00020f; + color: #dadada; + padding: 5px; + margin-top: 5px; + font-size: 12px; + font-weight: bold; + box-shadow: 2px 2px #1f2c3d; + cursor: pointer; + } + #reset:hover { + border:#000000; + background-color: #791515; + } + .file{ + margin-top: 10px; + } + .file input{ + height: 110%; + } + + /* Preformatted Text */ + pre { + font-weight: bold; + } + + fieldset pre { + color: red; + } + + /* Footer */ + footer { + text-align: left; + background-color: #1f2c3d; + color: #dadada; + padding: 20px; + margin-top: 100px; + width: 100%; + height: 80px; + } + .footer { + text-align: right; + } + footer button { + display: inline-block; + margin: 1px; + width: 115px; + height: 25px; + padding: 0px 0px; + text-align: center; + font-weight: bold; + position: relative; + } + @media (max-width: 500px) { + footer { + width: 100%; + height: 100%; + } + } \ No newline at end of file diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..3fd8018 --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,606 @@ +/* Basic */ +* { + box-sizing: border-box; + margin: 0px; +} + +/* Headers */ +h1, h2, h3, h4 { + color: #363636; + text-transform: uppercase; + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + vertical-align: baseline; + text-align: center; +} + +h2 { + font-size: 95%; +} + +h3 { + font-size: 85%; +} + +h4 { + font-size: 75%; +} + +/* Buttons */ +button, .button.large { + display: inline-block; + margin: 10px; + width: 150px; + height: 30px; + padding: 5px 10px; + background-color :#1f2c3d; + border: 1px solid #d3ebff; + text-align: center; + color :#d3ebff; + font-weight: bold; + position: relative; +} +.button.large { + width: 95%; +} +button:hover, .button:hover { + cursor: pointer; + background-color:#d3ebff; + color:#1f2c3d; + border-color: #1f2c3d; +} + +/* Header */ +.header { + background-color: #1f2c3d; + color: #dadada; + padding: 15px; + text-align: left; + font-size: 18px; +} +.header img { + width: 13px; +} +/* Header Menu */ +.menu { + margin-top: 10px; + text-align: right; + font-size: 15px; +} +.menu nav a{ + text-decoration: none; + color: inherit; + font-size: 15px; +} +.menu nav li{ + display: inline-block; + width: 150px; + height: 30px; + padding: 5px 10px; + background-color :#1f2c3d; + border: 1px solid #d3ebff; + text-align: center; + color :#d3ebff; + position: relative; +} +.menu nav li:hover{ + background-color:#d3ebff; + color:#1f2c3d; + border-color: #1f2c3d; +} +.menu nav li>ul{ + display: none; +} +.menu nav li:hover>ul{ + display: block; + position: absolute; + top: 29px; + right: -1px; +} +/* Sub Header */ +.header.sub { + margin-bottom: 20px; + padding: 5px; + display: flex; + flex-direction: row; + text-align: center; + justify-content: center; + font-size: 20px; +} +.header.sub .menu { + margin-top: 0px; + text-align: center; + font-size: 15px; +} +/* Responsive layout */ +@media (max-width: 850px) { + .header.sub .menu nav li:hover>ul{ + display: block; + position: relative; + top: 5px; + left: -51px; + } +} + + +/* Paragraphs */ +p { + padding: 0; + border: 0; +} + +a { + color: #dadada; + text-decoration: none; +} +a:hover{ + color:rgb(138, 150, 32); +} + +/* Body */ +body { + font-family: Arial, Helvetica, sans-serif; + background-color: #d3ebff; + color: #000000; +} + +/* Table */ +table { + border-collapse: collapse; + border-spacing: 0; + margin: 0 0 2em 0; + width: 100%; + text-align: left; + font-size: 15px; +} +table a{ + color: #1f2c3d; +} + table tbody tr { + border: solid 1px #1f2c3d; + border-left: 0; + border-right: 0; + } + table tbody tr:nth-child(2n + 1) { + background-color: rgba(144, 144, 144, 0.25); + } + table td { + padding: 0.75em 0.75em; + } + table th { + color: #1f2c3d; + font-size: 0.9em; + font-weight: 600; + padding: 0.85em 0.85em 0.85em 0.85em; + } + table thead, table tfoot { + border-bottom: solid 2px #1f2c3d; + } + table.alt { + border-collapse: separate; + } + table.alt tbody tr td { + border: solid 1px #1f2c3d; + border-left-width: 0; + border-top-width: 0; + } + + table.alt tbody tr td:first-child { + border-left-width: 1px; + } + + table.alt tbody tr:first-child td { + border-top-width: 1px; + } + + table.alt thead, table.alt tfoot { + border-top: 0; + } + + +/* Main */ +main { + padding: 30px; + text-align: center; + font-size: 35px; +} +main h1, h2, h3, h4 { + color: #363636; +} +main img { + width: 40%; +} + +/* Create three unequal columns that floats next to each other */ +.column { + float: left; + padding: 10px; +} + +/* Left and right column */ +.column.side { + width: 33.33%; +} + +/* Middle column */ +.column.middle { + width: 33.33%; +} + +.column.middle .image img, .column.side .image img{ + border-radius: 4px; + border: 0; + position: relative; + border-radius: 4px; + display: block; + margin: 0 0 3rem 0; + width: 100%; +} + +/* Left column */ +.column.left { + width: 50%; +} + +/* Right column */ +.column.right { + float: right; + width: 50%; +} + +/* Clear floats after the columns */ +.row:after { + content: ""; + display: table; + clear: both; +} + +/* Responsive layout: makes the three columns stack on top of each other instead of next to each other */ +@media (max-width: 1000px) { + .column.side, .column.middle, .column.left, .column.right{ + width: 100%; + } +} + +/* Zoom */ +.zoom { + transition: transform .2s; +} +.zoom:hover { + transform: scale(1.05); +} + +/* Code & Blockquote */ +.code { + background: #1f2c3d; + border-radius: 3px; + font-size: 0.9em; + margin: 10px; + display: block; + line-height: 1.75em; + padding: 1em 1.5em; + overflow-x: auto; + overflow-y: auto; +} +.code h1, .code h2{ + color: #dadada; +} +.code h3, .code h4 { + color: #d3ebff; +} +.code p { + color: #dadada; +} +.code a { + text-decoration: underline; +} +.code ul, .code ol, .code li { + color: #dadada; +} +.code img{ + /* width: 80px; height: 80px; */ + width: 25%; +} +.code fieldset{ + margin: 1px; + border-color: #dadada; + border-style: groove; +} +.code fieldset legend { + text-transform: uppercase; + font-weight: bold; + font-size: 90%; + color: #d3ebff; +} +.code label{ + color: #d3ebff; +} +.code.details{ + height: 750px; +} +.code.plan { + height: 1150px; +} +.code.info{ + text-align: center; + height: 250px; +} +.code.showtimes{ + height: 600px; +} + + +/* BlockQuotes */ +.blockquote { + border-left: solid 4px #dadada; + margin: 0 0 2em 0; + margin-top: 10px; + padding: 0.5em 0 0.5em 2em; +} +.blockquote.bio { + height: 250px; +} + +/* Sketches */ +.sketches { + text-align: center; + display: block; + line-height: 1.25em; + padding: 1em 1em; + overflow-x: auto; + background: #1f2c3d; + border-radius: 3px; + height: 680px; +} +.sketches h1, .sketches h2, .sketches h3, .sketches h4, .sketches p { + color: #dadada; +} +.sketches img { + width: 550px; + height: 550px; +} +.sketches .description { + color: #d3ebff; +} +/* Responsive layout */ +@media (max-width: 1500px) { + .column.side .sketches, .column.middle .sketches { + width: 100%; + height: 500px; + } + .column.side .sketches img, .column.middle .sketches img { + width: 100%; + height: 75%; + } +} +@media (max-width: 1150px) { + .sketches img { + width: 100%; + height: 75%; + } +} + +/* Text Box */ +.textbox { + color: #d3ebff; + padding: 15px 15px 10px 15px; + margin: 10px 0 10px; + overflow: hidden; + border-radius: 25px 0px 25px 0px; + border: 2px solid #d3ebff; +} +.textbox h1, .textbox h2, .textbox h3 { + color: #d3ebff; + text-align: left; +} + +/* Galery */ +.galery { + box-sizing: border-box; +} +.galery .columna { + margin-top: 10px; + float: left; + width: 50%; + padding-right: 10px; +} +.galery .fila::after { + content: ""; + clear: both; + display: table; +} +.galery .image img { + width: 100%; +} +.galery .image.main img { + width: 100%; +} + + +/* Percentage bar */ +.bar { + height: 15px; + line-height: 15px; + font-size: 13px; + font-weight: bold; + width: 100%; + color: #00020f; + background-color: #d3ebff; + text-align: right; +} +.bar.seventyfive { + width: 75%; +} +.bar.fifty { + width: 50%; +} +.bar.twentyfive { + width: 25%; +} + +/* Timeline Image */ +.timeline h2 { + padding-top: 50px; +} +.timeline img{ + width: 100%; + text-align: center; + padding-bottom: 50px; + padding-left: 15px; + padding-right: 15px; +} + +/* Sidebars */ +.sidebar.left { + padding: 5px; + margin-top: 10px; + margin-bottom: 10px; + float: left; + width: 300px; + height: 370PX; + color: #d3ebff; + background-color: #1f2c3d; +} +.sidebar.left a { + color: #d3ebff; + font-weight: bold; + text-decoration: none; +} +.sidebar.left a:hover { + color: #d3ebff; + text-decoration: underline; +} +/* Responsibe sidebar */ +@media (max-width: 1000px) { + .sidebar.left { + width: 100%; + height: 100%; + } +} + + +/* Form */ +form { + margin: auto; + width: 65%; +} + +form h1, h2, h3, h4 { + color: #363636; +} + +label { + text-align: center; + font-weight: bold; +} + +input, textarea { + width: 100%; + height: 27px; + border: 1px solid #000000; + padding: 10px; + margin-top: 5px; + font-size: 15px; +} + +textarea { + width: 100%; + height: 150px; +} + +#radio, #checkbox { + width: auto; + height: 15px; + cursor: pointer; +} + +.verify { + font-size: 11px; +} +.verify a { + color: #1f2c3d; +} +.verify a:hover { + color: rgb(138, 150, 32); +} + +#submit, #register { + width: 100%; + height: 35px; + border: 1px solid #000000; + padding: 5px; + margin-top: 5px; + font-size: 15px; + font-weight: bold; + box-shadow: 2px 2px #1f2c3d; + filter: brightness(105%); + cursor: pointer; +} +#submit:hover, #register:hover { + background-color: #d3ebff; +} + +#reset { + width: 100%; + height: 30px; + border: 1px solid #dadada; + background-color: #00020f; + color: #dadada; + padding: 5px; + margin-top: 5px; + font-size: 12px; + font-weight: bold; + box-shadow: 2px 2px #1f2c3d; + cursor: pointer; +} +#reset:hover { + border:#000000; + background-color: #791515; +} +.file{ + margin-top: 10px; +} +.file input{ + height: 110%; +} + +/* Preformatted Text */ +pre { + font-weight: bold; +} + +fieldset pre { + color: red; +} + +/* Footer */ +footer { + text-align: left; + background-color: #1f2c3d; + color: #dadada; + padding: 20px; + margin-top: 100px; + width: 100%; + height: 80px; +} +.footer { + text-align: right; +} +footer button { + display: inline-block; + margin: 1px; + width: 115px; + height: 25px; + padding: 0px 0px; + text-align: center; + font-weight: bold; + position: relative; +} +@media (max-width: 500px) { + footer { + width: 100%; + height: 100%; + } +} \ No newline at end of file diff --git a/assets/css/manager.css b/assets/css/manager.css new file mode 100644 index 0000000..0e6cfb0 --- /dev/null +++ b/assets/css/manager.css @@ -0,0 +1,68 @@ +h3.table_title{ + text-align: center; + margin-bottom: 1em; +} + +table.seat { + border: solid 10px #1f2c3d; + text-align: center; + background-color: rgba(215, 215, 215, 1); +} + +table.seat tbody tr:nth-child(2n + 1) { + background-color: rgba(204, 255, 204, 0); +} + +table.seat th{ + font-size: 0.9em; + padding: 0.30em 0.30em 0.30em 0.30em; + border-bottom: solid 2px #1f2c3d; +} + +table.seat th:first-child { + border-right: solid 2px #1f2c3d; +} + +table.seat td { + padding: 0.35em 0.35em; +} + +table.seat td:first-child { + font-size: 0.9em; + padding: 0.30em 0.30em 0.30em 0.30em; + font-weight: 600; + border-right: solid 2px #1f2c3d; +} + +.check_box { + display:none; +} + +.check_box+label{ + background:url('../../img/seat_red.png') no-repeat; + height: 16px; + width: 16px; + display:inline-block; +} + +.check_box:checked+label{ + background:url('../../img/seat_green.png') no-repeat; +} + +.black.button { + width: 100%; + height: 30px; + border: 1px solid #dadada; + background-color: #00020f; + color: #dadada; + padding: 5px; + margin-top: 5px; + font-size: 12px; + font-weight: bold; + box-shadow: 2px 2px #1f2c3d; + cursor: pointer; +} +.black.button:hover { + border:#000000; + background-color: #791515; +} \ No newline at end of file diff --git a/assets/index.php b/assets/index.php new file mode 100644 index 0000000..b6c0681 --- /dev/null +++ b/assets/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/assets/js/cambiarCSS.js b/assets/js/cambiarCSS.js new file mode 100644 index 0000000..404ca62 --- /dev/null +++ b/assets/js/cambiarCSS.js @@ -0,0 +1,3 @@ +function cambiarCSS(nuevo){ + document.getElementById('estilo').setAttribute('href', nuevo); +} \ No newline at end of file diff --git a/assets/mysql/complucine.sql b/assets/mysql/complucine.sql new file mode 100644 index 0000000..e89a9eb --- /dev/null +++ b/assets/mysql/complucine.sql @@ -0,0 +1,598 @@ +-- phpMyAdmin SQL Dump +-- version 4.6.6deb5 +-- https://www.phpmyadmin.net/ +-- +-- Servidor: localhost:3306 +-- Tiempo de generación: 14-05-2021 a las 11:28:23 +-- Versión del servidor: 10.0.28-MariaDB-2+b1 +-- Versión de PHP: 7.3.27-1~deb10u1 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Base de datos: `complucine` +-- + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `admin` +-- + +CREATE TABLE `admin` ( + `id` int(15) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `cinema` +-- + +CREATE TABLE `cinema` ( + `id` int(15) UNSIGNED NOT NULL, + `name` varchar(10) NOT NULL, + `direction` varchar(120) NOT NULL, + `phone` varchar(10) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `cinema` +-- + +INSERT INTO `cinema` (`id`, `name`, `direction`, `phone`) VALUES +(1, 'Cinema 1st', 'Calle de ejemplo 111', '77777777'), +(3, 'Cinema 2st', 'Calle falsa 123', '123456789'); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `film` +-- + +CREATE TABLE `film` ( + `id` int(15) UNSIGNED NOT NULL, + `tittle` varchar(60) NOT NULL, + `duration` int(3) UNSIGNED NOT NULL, + `language` varchar(30) NOT NULL, + `description` text NOT NULL, + `img` varchar(60) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `film` +-- + +INSERT INTO `film` (`id`, `tittle`, `duration`, `language`, `description`, `img`) VALUES +(1, 'iron_man', 120, 'spanish', 'Un empresario millonario construye un traje blindado y lo usa para combatir el crimen y el terrorismo.', ''), +(2, 'iron_man_2', 120, 'spanish', 'Con el mundo ahora consciente de que él es Iron Man, el millonario inventor Tony Stark debe forjar nuevas alianzas y confrontar a un enemigo nuevo y poderoso.', ''), +(3, 'iron_man_3', 120, 'spanish', 'El descarado y brillante Tony Stark, tras ver destruido todo su universo personal, debe encontrar y enfrentarse a un enemigo cuyo poder no conoce límites. Este viaje pondrá a prueba su entereza una y otra vez, y le obligará a confiar en su ingenio.', ''), +(4, 'capitan_america_el_primer_vengador', 120, 'spanish', 'Tras tres meses de someterse a un programa de entrenamiento físico y táctico, encomiendan a Steve Rogers su primera misión como Capitán América. Armado con un escudo indestructible, emprende la guerra contra la perversa organización HYDRA.', ''), +(5, 'capitan_america_el_soldado_de_invierno', 120, 'spanish', 'Capitán América, Viuda Negra y un nuevo aliado, Falcon, se enfrentan a un enemigo inesperado mientras intentan exponer una conspiración que pone en riesgo al mundo.', ''), +(6, 'capitan_america_civil_war', 180, 'spanish', 'Después de que otro incidente internacional, en el que se ven envueltos los Vengadores, produzca daños colaterales, la presión política obliga a poner en marcha un sistema para depurar responsabilidades.', ''), +(7, 'marvel_avengers', 120, 'spanish', 'El director de la Agencia SHIELD decide reclutar a un equipo para salvar al mundo de un desastre casi seguro cuando un enemigo inesperado surge como una gran amenaza para la seguridad mundial.', ''), +(8, 'avengers_age_of_ultron', 120, 'spanish', 'Los Vengadores se reúnen de nuevo y juntan sus fuerzas con las de los recién llegados Quicksilver y Bruja Escarlata para luchar contra un robot maquiavélico llamado Ultrón, el cual Tony Stark creó con el fin de defender la paz, pero resultó defectuoso y ahora pretende exterminar a toda la humanidad.', ''), +(9, 'avengers_inifinity_war', 180, 'spanish', 'Los superhéroes se alían para vencer al poderoso Thanos, el peor enemigo al que se han enfrentado. Si Thanos logra reunir las seis gemas del infinito: poder, tiempo, alma, realidad, mente y espacio, nadie podrá detenerlo.', ''), +(10, 'avengers_end_game', 180, 'spanish', 'Los Vengadores restantes deben encontrar una manera de recuperar a sus aliados para un enfrentamiento épico con Thanos, el malvado que diezmó el planeta y el universo.', ''); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `hall` +-- + +CREATE TABLE `hall` ( + `number` int(15) UNSIGNED NOT NULL, + `idcinema` int(15) UNSIGNED NOT NULL, + `numrows` int(3) NOT NULL, + `numcolumns` int(3) NOT NULL, + `total_seats` int(3) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `hall` +-- + +INSERT INTO `hall` (`number`, `idcinema`, `numrows`, `numcolumns`, `total_seats`) VALUES +(1, 1, 12, 8, 60), +(2, 1, 14, 8, 97); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `manager` +-- + +CREATE TABLE `manager` ( + `id` int(15) UNSIGNED NOT NULL, + `idcinema` int(15) UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `manager` +-- + +INSERT INTO `manager` (`id`, `idcinema`) VALUES +(1, 1); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `promotion` +-- + +CREATE TABLE `promotion` ( + `id` int(15) UNSIGNED NOT NULL, + `tittle` varchar(30) NOT NULL, + `description` text NOT NULL, + `code` varchar(15) NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `promotion` +-- + +INSERT INTO `promotion` (`id`, `tittle`, `description`, `code`, `active`) VALUES +(1, '3x2', 'en entradas', '000001A', 0), +(2, 'Promocion de ejemplo', 'Esto es un ejemplo', '1234', 0); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `purchase` +-- + +CREATE TABLE `purchase` ( + `iduser` int(15) UNSIGNED NOT NULL, + `idsession` int(15) UNSIGNED NOT NULL, + `idhall` int(15) UNSIGNED NOT NULL, + `idcinema` int(15) UNSIGNED NOT NULL, + `numrow` int(3) UNSIGNED NOT NULL, + `numcolum` int(3) UNSIGNED NOT NULL, + `time_purchase` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `seat` +-- + +CREATE TABLE `seat` ( + `idhall` int(15) UNSIGNED NOT NULL, + `idcinema` int(15) UNSIGNED NOT NULL, + `numrow` int(3) UNSIGNED NOT NULL, + `numcolum` int(3) UNSIGNED NOT NULL, + `active` tinyint(1) NOT NULL DEFAULT '1' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `seat` +-- + +INSERT INTO `seat` (`idhall`, `idcinema`, `numrow`, `numcolum`, `active`) VALUES +(1, 1, 1, 1, 0), +(1, 1, 1, 2, 0), +(1, 1, 1, 3, 0), +(1, 1, 1, 4, -1), +(1, 1, 1, 5, -1), +(1, 1, 1, 6, 0), +(1, 1, 1, 7, 0), +(1, 1, 1, 8, 0), +(1, 1, 2, 1, 0), +(1, 1, 2, 2, 0), +(1, 1, 2, 3, 0), +(1, 1, 2, 4, -1), +(1, 1, 2, 5, -1), +(1, 1, 2, 6, 0), +(1, 1, 2, 7, 0), +(1, 1, 2, 8, 0), +(1, 1, 3, 1, 0), +(1, 1, 3, 2, 0), +(1, 1, 3, 3, 0), +(1, 1, 3, 4, -1), +(1, 1, 3, 5, -1), +(1, 1, 3, 6, 0), +(1, 1, 3, 7, 0), +(1, 1, 3, 8, 0), +(1, 1, 4, 1, -1), +(1, 1, 4, 2, -1), +(1, 1, 4, 3, -1), +(1, 1, 4, 4, -1), +(1, 1, 4, 5, -1), +(1, 1, 4, 6, -1), +(1, 1, 4, 7, -1), +(1, 1, 4, 8, -1), +(1, 1, 5, 1, -1), +(1, 1, 5, 2, -1), +(1, 1, 5, 3, -1), +(1, 1, 5, 4, -1), +(1, 1, 5, 5, -1), +(1, 1, 5, 6, -1), +(1, 1, 5, 7, -1), +(1, 1, 5, 8, -1), +(1, 1, 6, 1, 0), +(1, 1, 6, 2, 0), +(1, 1, 6, 3, 0), +(1, 1, 6, 4, -1), +(1, 1, 6, 5, -1), +(1, 1, 6, 6, 0), +(1, 1, 6, 7, 0), +(1, 1, 6, 8, 0), +(1, 1, 7, 1, 0), +(1, 1, 7, 2, 0), +(1, 1, 7, 3, 0), +(1, 1, 7, 4, -1), +(1, 1, 7, 5, -1), +(1, 1, 7, 6, 0), +(1, 1, 7, 7, 0), +(1, 1, 7, 8, 0), +(1, 1, 8, 1, 0), +(1, 1, 8, 2, 0), +(1, 1, 8, 3, 0), +(1, 1, 8, 4, -1), +(1, 1, 8, 5, -1), +(1, 1, 8, 6, 0), +(1, 1, 8, 7, 0), +(1, 1, 8, 8, 0), +(1, 1, 9, 1, 0), +(1, 1, 9, 2, 0), +(1, 1, 9, 3, 0), +(1, 1, 9, 4, -1), +(1, 1, 9, 5, -1), +(1, 1, 9, 6, 0), +(1, 1, 9, 7, 0), +(1, 1, 9, 8, 0), +(1, 1, 10, 1, 0), +(1, 1, 10, 2, 0), +(1, 1, 10, 3, 0), +(1, 1, 10, 4, -1), +(1, 1, 10, 5, -1), +(1, 1, 10, 6, 0), +(1, 1, 10, 7, 0), +(1, 1, 10, 8, 0), +(1, 1, 11, 1, 0), +(1, 1, 11, 2, 0), +(1, 1, 11, 3, 0), +(1, 1, 11, 4, -1), +(1, 1, 11, 5, -1), +(1, 1, 11, 6, 0), +(1, 1, 11, 7, 0), +(1, 1, 11, 8, 0), +(1, 1, 12, 1, 0), +(1, 1, 12, 2, 0), +(1, 1, 12, 3, 0), +(1, 1, 12, 4, -1), +(1, 1, 12, 5, -1), +(1, 1, 12, 6, 0), +(1, 1, 12, 7, 0), +(1, 1, 12, 8, 0), +(2, 1, 1, 1, 1), +(2, 1, 1, 2, 1), +(2, 1, 1, 3, 1), +(2, 1, 1, 4, 1), +(2, 1, 1, 5, 1), +(2, 1, 1, 6, 1), +(2, 1, 1, 7, 1), +(2, 1, 1, 8, 1), +(2, 1, 2, 1, 1), +(2, 1, 2, 2, 1), +(2, 1, 2, 3, 1), +(2, 1, 2, 4, 1), +(2, 1, 2, 5, 1), +(2, 1, 2, 6, 1), +(2, 1, 2, 7, 1), +(2, 1, 2, 8, 1), +(2, 1, 3, 1, 1), +(2, 1, 3, 2, -1), +(2, 1, 3, 3, -1), +(2, 1, 3, 4, -1), +(2, 1, 3, 5, 1), +(2, 1, 3, 6, 1), +(2, 1, 3, 7, 1), +(2, 1, 3, 8, 1), +(2, 1, 4, 1, 1), +(2, 1, 4, 2, -1), +(2, 1, 4, 3, -1), +(2, 1, 4, 4, -1), +(2, 1, 4, 5, 1), +(2, 1, 4, 6, 1), +(2, 1, 4, 7, 1), +(2, 1, 4, 8, 1), +(2, 1, 5, 1, 1), +(2, 1, 5, 2, -1), +(2, 1, 5, 3, -1), +(2, 1, 5, 4, -1), +(2, 1, 5, 5, 1), +(2, 1, 5, 6, 1), +(2, 1, 5, 7, 1), +(2, 1, 5, 8, 1), +(2, 1, 6, 1, 1), +(2, 1, 6, 2, 1), +(2, 1, 6, 3, 1), +(2, 1, 6, 4, 1), +(2, 1, 6, 5, 1), +(2, 1, 6, 6, 1), +(2, 1, 6, 7, 1), +(2, 1, 6, 8, 1), +(2, 1, 7, 1, 1), +(2, 1, 7, 2, 1), +(2, 1, 7, 3, 1), +(2, 1, 7, 4, 1), +(2, 1, 7, 5, -1), +(2, 1, 7, 6, -1), +(2, 1, 7, 7, 1), +(2, 1, 7, 8, 1), +(2, 1, 8, 1, 1), +(2, 1, 8, 2, 1), +(2, 1, 8, 3, 1), +(2, 1, 8, 4, 1), +(2, 1, 8, 5, -1), +(2, 1, 8, 6, -1), +(2, 1, 8, 7, 1), +(2, 1, 8, 8, 1), +(2, 1, 9, 1, 1), +(2, 1, 9, 2, 1), +(2, 1, 9, 3, 1), +(2, 1, 9, 4, 1), +(2, 1, 9, 5, -1), +(2, 1, 9, 6, -1), +(2, 1, 9, 7, 1), +(2, 1, 9, 8, 1), +(2, 1, 10, 1, 1), +(2, 1, 10, 2, 1), +(2, 1, 10, 3, 1), +(2, 1, 10, 4, 1), +(2, 1, 10, 5, 1), +(2, 1, 10, 6, 1), +(2, 1, 10, 7, 1), +(2, 1, 10, 8, 1), +(2, 1, 11, 1, 1), +(2, 1, 11, 2, 1), +(2, 1, 11, 3, 1), +(2, 1, 11, 4, 1), +(2, 1, 11, 5, 1), +(2, 1, 11, 6, 1), +(2, 1, 11, 7, 1), +(2, 1, 11, 8, 1), +(2, 1, 12, 1, 1), +(2, 1, 12, 2, 1), +(2, 1, 12, 3, 1), +(2, 1, 12, 4, 1), +(2, 1, 12, 5, 1), +(2, 1, 12, 6, 1), +(2, 1, 12, 7, 1), +(2, 1, 12, 8, 1), +(2, 1, 13, 1, 1), +(2, 1, 13, 2, 1), +(2, 1, 13, 3, 1), +(2, 1, 13, 4, 1), +(2, 1, 13, 5, 1), +(2, 1, 13, 6, 1), +(2, 1, 13, 7, 1), +(2, 1, 13, 8, 1), +(2, 1, 14, 1, 1), +(2, 1, 14, 2, 1), +(2, 1, 14, 3, 1), +(2, 1, 14, 4, 1), +(2, 1, 14, 5, 1), +(2, 1, 14, 6, 1), +(2, 1, 14, 7, 1), +(2, 1, 14, 8, 1); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `session` +-- + +CREATE TABLE `session` ( + `id` int(15) UNSIGNED NOT NULL, + `idfilm` int(15) UNSIGNED NOT NULL, + `idhall` int(15) UNSIGNED NOT NULL, + `idcinema` int(15) UNSIGNED NOT NULL, + `date` date NOT NULL, + `start_time` time NOT NULL, + `seat_price` float NOT NULL, + `format` varchar(20) NOT NULL, + `seats_full` int(3) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Volcado de datos para la tabla `session` +-- + +INSERT INTO `session` (`id`, `idfilm`, `idhall`, `idcinema`, `date`, `start_time`, `seat_price`, `format`, `seats_full`) VALUES +(19, 1, 2, 1, '2021-05-14', '19:00:00', 12, '2d', 0), +(20, 1, 2, 1, '2021-05-15', '19:00:00', 12, '2d', 0); + +-- -------------------------------------------------------- + +-- +-- Estructura de tabla para la tabla `users` +-- + +CREATE TABLE `users` ( + `id` int(15) UNSIGNED NOT NULL, + `username` varchar(10) NOT NULL, + `email` varchar(30) NOT NULL, + `passwd` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `rol` varchar(7) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Usuarios'; + +-- +-- Volcado de datos para la tabla `users` +-- + +INSERT INTO `users` (`id`, `username`, `email`, `passwd`, `rol`) VALUES +(0, 'admin', 'admin@complucine.sytes.net', 'shDBCKnEbWZFc', 'admin'), +(1, 'manager', 'manager@complucine.sytes.net', 'shTS9RK/eJPoQ', 'manager'), +(2, 'user', 'user@complucine.sytes.net', 'shO5etd.DYKWg', 'user'), +(7, 'fernando', 'fer@complucine.sytes.net', '$2y$10$/3yjEh4d7AOY3RyNjXIIkO5H2hg7/kiHiToJa92tCBPd7s3UPtB.G', 'user'), +(63, 'user2', 'user2@ucm.es', '$2y$10$Alopov4Z1HPW9i9PqQ/APedPoU.N/zc3XlRfIfSkwPCQCKI.qTp5u', 'user'); + +-- +-- Índices para tablas volcadas +-- + +-- +-- Indices de la tabla `admin` +-- +ALTER TABLE `admin` + ADD KEY `PK_A_USER` (`id`); + +-- +-- Indices de la tabla `cinema` +-- +ALTER TABLE `cinema` + ADD PRIMARY KEY (`id`); + +-- +-- Indices de la tabla `film` +-- +ALTER TABLE `film` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `U_TITTLE_LANGUAGE` (`tittle`,`language`); + +-- +-- Indices de la tabla `hall` +-- +ALTER TABLE `hall` + ADD PRIMARY KEY (`number`,`idcinema`), + ADD KEY `FK_CINEMA` (`idcinema`); + +-- +-- Indices de la tabla `manager` +-- +ALTER TABLE `manager` + ADD KEY `PK_M_USER` (`id`), + ADD KEY `PK_M_CINEMA` (`idcinema`); + +-- +-- Indices de la tabla `promotion` +-- +ALTER TABLE `promotion` + ADD PRIMARY KEY (`id`); + +-- +-- Indices de la tabla `purchase` +-- +ALTER TABLE `purchase` + ADD KEY `PK_P_SEAT` (`idhall`,`numrow`,`numcolum`), + ADD KEY `FK_P_SESSION` (`idsession`), + ADD KEY `FK_P_USER` (`iduser`), + ADD KEY `FK_P_SEAT` (`idhall`,`idcinema`,`numrow`,`numcolum`); + +-- +-- Indices de la tabla `seat` +-- +ALTER TABLE `seat` + ADD PRIMARY KEY (`idhall`,`numrow`,`numcolum`), + ADD KEY `FK_HALL` (`idhall`,`idcinema`); + +-- +-- Indices de la tabla `session` +-- +ALTER TABLE `session` + ADD PRIMARY KEY (`id`), + ADD KEY `FK_FILM` (`idfilm`), + ADD KEY `FK_HALL_` (`idhall`,`idcinema`); + +-- +-- Indices de la tabla `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `email` (`email`), + ADD UNIQUE KEY `username_2` (`username`), + ADD KEY `username` (`username`); + +-- +-- AUTO_INCREMENT de las tablas volcadas +-- + +-- +-- AUTO_INCREMENT de la tabla `cinema` +-- +ALTER TABLE `cinema` + MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; +-- +-- AUTO_INCREMENT de la tabla `film` +-- +ALTER TABLE `film` + MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; +-- +-- AUTO_INCREMENT de la tabla `hall` +-- +ALTER TABLE `hall` + MODIFY `number` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; +-- +-- AUTO_INCREMENT de la tabla `promotion` +-- +ALTER TABLE `promotion` + MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; +-- +-- AUTO_INCREMENT de la tabla `session` +-- +ALTER TABLE `session` + MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21; +-- +-- AUTO_INCREMENT de la tabla `users` +-- +ALTER TABLE `users` + MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=65; +-- +-- Restricciones para tablas volcadas +-- + +-- +-- Filtros para la tabla `admin` +-- +ALTER TABLE `admin` + ADD CONSTRAINT `PK_A_USER` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Filtros para la tabla `hall` +-- +ALTER TABLE `hall` + ADD CONSTRAINT `FK_CINEMA` FOREIGN KEY (`idcinema`) REFERENCES `cinema` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Filtros para la tabla `manager` +-- +ALTER TABLE `manager` + ADD CONSTRAINT `PK_M_CINEMA` FOREIGN KEY (`idcinema`) REFERENCES `cinema` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `PK_M_USER` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Filtros para la tabla `purchase` +-- +ALTER TABLE `purchase` + ADD CONSTRAINT `FK_P_SEAT` FOREIGN KEY (`idhall`,`idcinema`,`numrow`,`numcolum`) REFERENCES `seat` (`idhall`, `idcinema`, `numrow`, `numcolum`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `FK_P_SESSION` FOREIGN KEY (`idsession`) REFERENCES `session` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `FK_P_USER` FOREIGN KEY (`iduser`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Filtros para la tabla `seat` +-- +ALTER TABLE `seat` + ADD CONSTRAINT `FK_HALL` FOREIGN KEY (`idhall`,`idcinema`) REFERENCES `hall` (`number`, `idcinema`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Filtros para la tabla `session` +-- +ALTER TABLE `session` + ADD CONSTRAINT `FK_FILM` FOREIGN KEY (`idfilm`) REFERENCES `film` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `FK_HALL_` FOREIGN KEY (`idhall`,`idcinema`) REFERENCES `hall` (`number`, `idcinema`) ON DELETE CASCADE ON UPDATE CASCADE; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/assets/php/HTMLtemplate.php b/assets/php/HTMLtemplate.php new file mode 100644 index 0000000..9c7a654 --- /dev/null +++ b/assets/php/HTMLtemplate.php @@ -0,0 +1,34 @@ + + + + + print_head(); + ?> +
+ + print_header(); + ?> + + + print_main($content); + ?> + + + print_section($section); + ?> + + + print_footer(); + ?> + + + \ No newline at end of file diff --git a/assets/php/aplication.php b/assets/php/aplication.php new file mode 100644 index 0000000..63b7697 --- /dev/null +++ b/assets/php/aplication.php @@ -0,0 +1,138 @@ +Aplicacion. + * + * @return Applicacion Obtiene la única instancia de laAplicacion
+ */
+ public static function getSingleton() {
+ if ( !self::$instancia instanceof self) {
+ self::$instancia = new self;
+ }
+ return self::$instancia;
+ }
+
+ /**
+ * @var array Almacena los datos de configuración de la BD
+ */
+ private $bdDatosConexion;
+
+ /**
+ * Almacena si la Aplicacion ya ha sido inicializada.
+ *
+ * @var boolean
+ */
+ private $inicializada = false;
+
+ /**
+ * @var \mysqli Conexión de BD.
+ */
+ private $conn;
+
+ /**
+ * Evita que se pueda instanciar la clase directamente.
+ */
+ private function __construct() {}
+
+ /**
+ * Evita que se pueda utilizar el operador clone.
+ */
+ public function __clone() {
+ throw new \Exception('No tiene sentido el clonado.');
+ }
+
+
+ /**
+ * Evita que se pueda utilizar serialize().
+ */
+ public function __sleep() {
+ throw new \Exception('No tiene sentido el serializar el objeto.');
+ }
+
+ /**
+ * Evita que se pueda utilizar unserialize().
+ */
+ public function __wakeup() {
+ throw new \Exception('No tiene sentido el deserializar el objeto.');
+ }
+
+ /**
+ * Inicializa la aplicación.
+ *
+ * @param array $bdDatosConexion datos de configuración de la BD
+ */
+ public function init($bdDatosConexion) {
+ if ( ! $this->inicializada ) {
+ $this->bdDatosConexion = $bdDatosConexion;
+ if ( $this->is_session_started() === FALSE ) session_start();
+ $this->inicializada = true;
+ }
+ }
+
+ /**
+ * Inicia la sesión, si esta no se había iniciado.
+ */
+ protected function is_session_started(){
+ if ( php_sapi_name() !== 'cli' ) {
+ if ( version_compare(phpversion(), '5.4.0', '>=') ) {
+ return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
+ } else {
+ return session_id() === '' ? FALSE : TRUE;
+ }
+ }
+ return FALSE;
+ }
+
+ /**
+ * Cierre de la aplicación.
+ */
+ public function shutdown() {
+ $this->compruebaInstanciaInicializada();
+ if ($this->conn !== null) {
+ $this->conn->close();
+ }
+ }
+
+ /**
+ * Comprueba si la aplicación está inicializada. Si no lo está muestra un mensaje y termina la ejecución.
+ */
+ private function compruebaInstanciaInicializada() {
+ if (! $this->inicializada ) {
+ echo "ERROR 403: app_not_configured.";
+ exit();
+ }
+ }
+
+ /**
+ * Devuelve una conexión a la BD. Se encarga de que exista como mucho una conexión a la BD por petición.
+ *
+ * @return \mysqli Conexión a MySQL.
+ */
+ public function conexionBd() {
+ $this->compruebaInstanciaInicializada();
+ if (! $this->conn ) {
+ $bdHost = $this->bdDatosConexion['host'];
+ $bdUser = $this->bdDatosConexion['user'];
+ $bdPass = $this->bdDatosConexion['pass'];
+ $bd = $this->bdDatosConexion['bd'];
+
+ $this->conn = new \mysqli($bdHost, $bdUser, $bdPass, $bd);
+ if ( $this->conn->connect_errno ) {
+ echo "Error de conexión a la BD: (" . $this->conn->connect_errno . ") " . utf8_encode($this->conn->connect_error);
+ exit();
+ }
+ if ( ! $this->conn->set_charset("utf8mb4")) {
+ echo "Error al configurar la codificación de la BD: (" . $this->conn->errno . ") " . utf8_encode($this->conn->error);
+ exit();
+ }
+ }
+ return $this->conn;
+ }
+}
\ No newline at end of file
diff --git a/assets/php/common/cinema.php b/assets/php/common/cinema.php
new file mode 100644
index 0000000..e23c70f
--- /dev/null
+++ b/assets/php/common/cinema.php
@@ -0,0 +1,32 @@
+_id = $id;
+ $this->_name = $name;
+ $this->_direction = $direction;
+ $this->_phone = $phone;
+ }
+
+ //Methods:
+
+ //Getters && Setters:
+ public function setId($id){ $this->_id = $id; }
+ public function getId(){ return $this->_id; }
+ public function setName($name){ $this->_name = $name; }
+ public function getName(){ return $this->_name; }
+ public function setDirection($direction){ $this->_direction = $direction; }
+ public function getDirection(){ return $this->_direction; }
+ public function setPhone($phone){$this->_phone = $phone; }
+ public function getPhone(){ return $this->_phone; }
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/cinema_dao.php b/assets/php/common/cinema_dao.php
new file mode 100644
index 0000000..4da8133
--- /dev/null
+++ b/assets/php/common/cinema_dao.php
@@ -0,0 +1,77 @@
+mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+
+ //Returns a query to get All the films.
+ public function allCinemaData(){
+ $sql = sprintf( "SELECT * FROM cinema ");
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ while($fila=$resul->fetch_assoc()){
+ $films[] = $this->loadCinema($fila["id"], $fila["name"], $fila["direction"], $fila["phone"]);
+ }
+ $resul->free();
+ return $films;
+ }
+
+ //Returns a film data .
+ public function GetCinema($name,$direction){
+ $sql = sprintf( "SELECT * FROM cinema WHERE cinema.name = '%s'AND cinema.direction='%s'", $name,$direction );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Returns a film data .
+ public function cinemaData($id){
+ $sql = sprintf( "SELECT * FROM cinema WHERE cinema.id = '%d'", $id);
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Deleted film by "id".
+ public function deleteCinema($id){
+ $sql = sprintf( "DELETE FROM cinema WHERE cinema.id = '%d' ;",$id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Edit a film.
+ public function editCinema($id, $name, $direction, $phone){
+ $sql = sprintf( "UPDATE cinema SET name = '%s' , direction = '%s', phone ='%s'
+ WHERE cinema.id = '%d';",
+ $name, $direction, $phone, $id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Create a new film Data Transfer Object.
+ public function loadCinema($id, $name, $direction, $phone){
+ return new Cinema($id, $name, $direction, $phone);
+ }
+
+ }
+
+?>
diff --git a/assets/php/common/film.php b/assets/php/common/film.php
new file mode 100644
index 0000000..f34a40d
--- /dev/null
+++ b/assets/php/common/film.php
@@ -0,0 +1,39 @@
+_id = $id;
+ $this->_tittle = $tittle;
+ $this->_duration = $duration;
+ $this->_language = $language;
+ $this->_description = $description;
+ $this->_img = $img;
+ }
+
+ //Methods:
+
+ //Getters && Setters:
+ public function setId($id){ $this->_id = $id; }
+ public function getId(){ return $this->_id; }
+ public function setTittle($tittle) {$this->_tittle = $tittle; }
+ public function getTittle(){return $this->_tittle;}
+ public function setDuration($duration){$this->_duration = $duration; }
+ public function getDuration() {return $this->_duration;}
+ public function setLanguage($language) {$this->_language = $language; }
+ public function getLanguage(){return $this->_language;}
+ public function setDescription($description){ $this->_description = $description;}
+ public function getDescription(){return $this->_description;}
+ public function setImg($img){ $this->_img = $img;}
+ public function getImg(){return $this->_img;}
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/film_dao.php b/assets/php/common/film_dao.php
new file mode 100644
index 0000000..646848c
--- /dev/null
+++ b/assets/php/common/film_dao.php
@@ -0,0 +1,100 @@
+mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+ //Returns a film data .
+ public function GetFilm($tittle,$language){
+ $sql = sprintf( "SELECT * FROM film WHERE film.tittle = '%s'AND film.language='%s'", $tittle,$language );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Returns a query to get the film's data.
+ public function FilmData($id){
+ $sql = sprintf( "SELECT * FROM film WHERE id = '%d'", $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Returns a query to get All the films.
+ public function allFilmData(){
+ $sql = sprintf( "SELECT * FROM film ");
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ while($fila=$resul->fetch_assoc()){
+ $films[] = $this->loadFilm($fila["id"], $fila["tittle"], $fila["duration"], $fila["language"], $fila["description"], $fila["img"]);
+ }
+ $resul->free();
+ return $films;
+ }
+
+
+ //Returns a query to get all films tittles.
+ public function tittleFilmData(){
+ $sql = sprintf( "SELECT DISTINCT tittle FROM film ");
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Returns a query to get all films descriptions.
+ public function descriptionFilmData(){
+ $sql = sprintf( "SELECT description FROM film ");
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ /*
+ public function addFilm($films) {
+ $resul = mysqli_query($this->mysqli, $this->createFilm($film.getId(), $film.getTittle(), $film.getDuration(), $film.getLanguage(), $film.getDescription())) or die ('Error into query database');
+ return $resul;
+ }
+ */
+
+ //Deleted film by "id".
+ public function deleteFilm($id){
+ $sql = sprintf( "DELETE FROM film WHERE film.id = '%d' ;",$id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Edit a film.
+ public function editFilm($id, $tittle, $duration, $language,$description,$img){
+ $sql = sprintf( "UPDATE film SET tittle = '%s' , duration = '%d', language ='%s' , description ='%s', img ='%s'
+ WHERE film.id = '%d';",
+ $tittle, $duration, $language, $description, $img, $id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Create a new film Data Transfer Object.
+ public function loadFilm($id, $tittle, $duration, $language,$description, $img){
+ return new Film( $id, $tittle, $duration, $language,$description, $img);
+ }
+
+ }
+
+?>
diff --git a/assets/php/common/hall.php b/assets/php/common/hall.php
new file mode 100644
index 0000000..bc22af9
--- /dev/null
+++ b/assets/php/common/hall.php
@@ -0,0 +1,103 @@
+_number = $number;
+ $this->_idcinema = $idcinema;
+ $this->_numRows = $numRows;
+ $this->_numCol = $numCol;
+ $this->_total_seats = $total_seats;
+ $_seats_map = array();
+ $_seats_map = $seats_map;
+ }
+
+ //Methods:
+ public static function getListHalls($cinema){
+ $bd = new HallDAO('complucine');
+ if($bd )
+ return $bd->getAllHalls($cinema);
+ }
+
+ public static function create_hall($number, $cinema, $rows, $cols, $seats, $seats_map){
+ $bd = new HallDAO('complucine');
+ if($bd ){
+ if(!$bd->searchHall($number, $cinema)){
+ $bd->createHall($number, $cinema, $rows, $cols, $seats, $seats_map);
+ Seat::createSeats($number, $cinema, $rows, $cols, $seats_map);
+ return "Se ha creado la sala con exito";
+ } else {
+ return "Esta sala ya existe";
+ }
+ } else { return "Error al conectarse a la base de datos"; }
+ }
+
+ public static function edit_hall($number, $cinema, $rows, $cols, $seats, $seats_map, $og_number){
+ $bd = new HallDAO('complucine');
+ if($bd ){
+ if($bd->searchHall($og_number, $cinema)){
+ if($og_number == $number){
+ Seat::deleteAllSeats($number, $cinema);
+ $bd->editHall($number, $cinema, $rows, $cols, $seats, $og_number);
+ Seat::createSeats($number, $cinema, $rows, $cols, $seats_map);
+ return "Se ha editado la sala con exito";
+ }else{
+ if(!$bd->searchHall($number, $cinema)){
+ Seat::deleteAllSeats($og_number, $cinema);
+ $bd->editHall($number, $cinema, $rows, $cols, $seats, $og_number);
+ Seat::createSeats($number, $cinema, $rows, $cols, $seats_map);
+ return "Se ha editado la sala con exito";
+ }else
+ return "El nuevo numero de sala ya existe en otra sala";
+ }
+ } else {
+ return "La sala a editar no existe";
+ }
+ } else { return "Error al conectarse a la base de datos"; }
+ }
+
+ public static function delete_hall($number, $cinema, $rows, $cols, $seats, $seats_map, $og_number){
+ $bd = new HallDAO('complucine');
+ if($bd ){
+ if($bd->searchHall($og_number, $cinema)){
+ $bd->deleteHall($og_number, $cinema);
+ Seat::deleteAllSeats($og_number, $cinema);
+ return "La sala se ha eliminado correctamente";
+ } else {
+ return "La sala a borrar no existe";
+ }
+ } else { return "Error al conectarse a la base de datos"; }
+ }
+
+ //Getters && Setters:
+ public function setNumber($number){ $this->_number = $number; }
+ public function getNumber(){ return $this->_number; }
+
+ public function setIdcinema($idcinema){ $this->_idcinema = $idcinema; }
+ public function getIdcinema(){ return $this->_idcinema; }
+
+ public function setNumRows($numRows){ $this->_numRows = $numRows; }
+ public function getNumRows(){ return $this->_numRows; }
+
+ public function setNumCol($numCol){ $this->_numCol = $numCol; }
+ public function getNumCol(){ return $this->_numCol; }
+
+ public function setTotalSeats($totalSeat){ $this->_total_seats = $totalSeat; }
+ public function getTotalSeats(){ return $this->_total_seats; }
+
+ public function setSeatsmap($seats_map){ $this->_seats_map = $seats_map; }
+ public function getSeatsmap(){ return $this->_seats_map; }
+
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/hall_dao.php b/assets/php/common/hall_dao.php
new file mode 100644
index 0000000..a6d123e
--- /dev/null
+++ b/assets/php/common/hall_dao.php
@@ -0,0 +1,96 @@
+mysqli, $sql) or die ('Error BD createhall');
+
+ return $sql;
+ }
+
+ //Returns a query to get the halls data.
+ public function getAllHalls($cinema){
+ $sql = sprintf( "SELECT * FROM hall WHERE
+ idcinema = '%s'",
+ $cinema);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ $hall = null;
+ while($fila=mysqli_fetch_array($resul)){
+ $hall[] = $this->loadHall($fila["number"], $fila["idcinema"], $fila["numrows"], $fila["numcolumns"], $fila["total_seats"], null);
+ }
+
+ mysqli_free_result($resul);
+
+ return $hall;
+ }
+
+ public function searchHall($number, $cinema){
+
+ $sql = sprintf( "SELECT * FROM hall WHERE
+ number = '%s' AND idcinema = '%s'",
+ $number, $cinema);
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ $hall = false;
+
+ if($resul){
+ if($resul->num_rows == 1){
+ $fila = $resul->fetch_assoc();
+ $hall = $this->loadHall($fila["number"], $fila["idcinema"], $fila["numrows"], $fila["numcolumns"], $fila["total_seats"], null);
+ }
+ $resul->free();
+ }
+
+ return $hall;
+ }
+
+
+
+ //Create a new Hall Data Transfer Object.
+ public function loadHall($number, $idcinema, $numrows, $numcolumns, $total_seats, $seats_map){
+ return new Hall($number, $idcinema, $numrows, $numcolumns, $total_seats, $seats_map);
+ }
+
+ //Edit Hall.
+ public function editHall($number, $cinema, $rows, $cols, $seats, $og_number){
+
+ $sql = sprintf( "UPDATE `hall`
+ SET `number` = '%d' ,`numrows` = '%d' , `numcolumns` = '%d' , `total_seats` = %d
+ WHERE `hall`.`number` = '%d' AND `hall`.`idcinema` = '%d';",
+ $number, $rows, $cols, $seats, $og_number, $cinema );
+
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Delete Hall.
+ public function deleteHall($number, $cinema){
+
+ $sql = sprintf( "DELETE FROM `hall` WHERE `hall`.`number` = '%d' AND `hall`.`idcinema` = '%d';",$number, $cinema);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ }
+
+?>
\ No newline at end of file
diff --git a/assets/php/common/manager.php b/assets/php/common/manager.php
new file mode 100644
index 0000000..ccde476
--- /dev/null
+++ b/assets/php/common/manager.php
@@ -0,0 +1,35 @@
+_id = $id;
+ $this->_idcinema = $idcinema;
+ $this->_username = $username;
+ $this->_email = $email;
+ $this->_roll = $roll;
+ }
+
+ //Methods:
+
+ //Getters && Setters:
+ public function setId($id){ $this->_id = $id; }
+ public function getId(){ return $this->_id; }
+ public function setIdcinema($idcinema){ $this->_idcinema = $idcinema; }
+ public function getIdcinema(){ return $this->_idcinema; }
+ public function setUsername($username){$this->_username = $username; }
+ public function getUsername(){ return $this->_username;}
+ public function setEmail($email){$this->_email = $email;}
+ public function getEmail(){return $this->_email;}
+ public function setRoll($roll){$this->_roll = $roll;}
+ public function getRoll(){return $this->_roll;}
+
+ }
+?>
diff --git a/assets/php/common/manager_dao.php b/assets/php/common/manager_dao.php
new file mode 100644
index 0000000..014022e
--- /dev/null
+++ b/assets/php/common/manager_dao.php
@@ -0,0 +1,77 @@
+mysqli, $sql) or die ('Error into query database');
+
+ while($fila=$resul->fetch_assoc()){
+ $managers[] = $this->loadManager($fila["id"], $fila["idcinema"], $fila["username"], $fila["email"], $fila["rol"]);
+ }
+ $resul->free();
+ return $managers;
+ }
+
+ //Returns a manager data .
+ public function GetManager($id){
+ $sql = sprintf( "SELECT * FROM `manager` WHERE manager.id = '%d'", $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Returns a manager data .
+ public function GetManagerCinema($id, $idcinema){
+ $sql = sprintf( "SELECT * FROM `manager` WHERE manager.id = '%d' AND manager.idcinema ='%d'", $id, $idcinema );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Create a new Session.
+ public function createManager($id, $idcinema){
+ $sql = sprintf( "INSERT INTO `manager`( `id`, `idcinema`)
+ VALUES ( '%d', '%d')",
+ $id, $idcinema);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+
+ //Deleted manager by "id".
+ public function deleteManager($id){
+ $sql = sprintf( "DELETE FROM `manager` WHERE manager.id = '%d' ;",$id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Edit manager.
+ public function editManager($id, $idcinema){
+ $sql = sprintf( "UPDATE `manager` SET manager.idcinema = '%d'
+ WHERE manager.id = '%d';",
+ $idcinema, $id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Create a new Manager Data Transfer Object.
+ public function loadManager($id, $idcinema, $username, $email, $rol){
+ return new Manager($id, $idcinema, $username, $email, $rol);
+ }
+
+ }
+
+?>
diff --git a/assets/php/common/promotion.php b/assets/php/common/promotion.php
new file mode 100644
index 0000000..0abe64c
--- /dev/null
+++ b/assets/php/common/promotion.php
@@ -0,0 +1,36 @@
+_id = $id;
+ $this->_tittle = $tittle;
+ $this->_description = $description;
+ $this->_code = $code;
+ $this->_active = $active;
+ }
+
+ //Methods:
+
+ //Getters && Setters:
+ public function setId($id){ $this->_id = $id; }
+ public function getId(){ return $this->_id; }
+ public function setTittle($tittle){ $this->_tittle = $tittle; }
+ public function getTittle(){ return $this->_tittle; }
+ public function setDescription($description){ $this->_description = $description;}
+ public function getDescription(){return $this->_description;}
+ public function setCode($code){ $this->_code = $code;}
+ public function getCode(){return $this->_code;}
+ public function setActive($active){ $this->_active = $active;}
+ public function getActive(){return $this->_active;}
+
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/promotion_dao.php b/assets/php/common/promotion_dao.php
new file mode 100644
index 0000000..02525bd
--- /dev/null
+++ b/assets/php/common/promotion_dao.php
@@ -0,0 +1,77 @@
+mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+
+ //Returns a query to get All the films.
+ public function allPromotionData(){
+ $sql = sprintf( "SELECT * FROM promotion ");
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ while($fila=$resul->fetch_assoc()){
+ $promotions[] = $this->loadPromotion($fila["id"], $fila["tittle"], $fila["description"], $fila["code"], $fila["active"]);
+ }
+ $resul->free();
+ return $promotions;
+ }
+
+ //Returns a film data .
+ public function GetPromotion($code){
+ $sql = sprintf( "SELECT * FROM promotion WHERE promotion.code = '%s'", $code );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Returns a film data .
+ public function promotionData($id){
+ $sql = sprintf( "SELECT * FROM promotion WHERE promotion.id = '%d'", $id);
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+ return $resul;
+ }
+
+ //Deleted film by "id".
+ public function deletePromotion($id){
+ $sql = sprintf( "DELETE FROM promotion WHERE promotion.id = '%d' ;",$id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Edit a film.
+ public function editPromotion($id, $tittle, $description, $code, $active){
+ $sql = sprintf( "UPDATE promotion SET tittle = '%s' , description = '%s', code ='%s' , active ='%s'
+ WHERE promotion.id = '%d';",
+ $tittle, $description, $code, $active, $id);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Create a new film Data Transfer Object.
+ public function loadPromotion($id, $tittle, $description, $code, $active){
+ return new Promotion($id, $tittle, $description, $code, $active);
+ }
+
+ }
+
+?>
diff --git a/assets/php/common/seat.php b/assets/php/common/seat.php
new file mode 100644
index 0000000..5dd1a4e
--- /dev/null
+++ b/assets/php/common/seat.php
@@ -0,0 +1,63 @@
+_number = $idhall;
+ $this->_idcinema = $idcinema;
+ $this->_numRow = $numRow;
+ $this->_numCol = $numCol;
+ $this->_state = $state;
+ }
+
+ static public function createSeats($hall, $cinema, $rows, $cols, $seats_map){
+ $bd = new SeatDAO('complucine');
+
+ for($i = 1;$i <= $rows;$i++){
+ for($j = 1; $j <= $cols;$j++){
+ $bd->createSeat($hall, $cinema, $i, $j, $seats_map[$i][$j]);
+ }
+ }
+ }
+
+ static public function getSeatsMap($number, $cinema){
+ $bd = new SeatDAO('complucine');
+ if($bd )
+ return $bd->getAllSeats($number, $cinema);
+ }
+
+ static public function deleteAllSeats($number, $cinema){
+ $bd = new SeatDAO('complucine');
+ if($bd)
+ return $bd->deletemapSeats($number, $cinema);
+ }
+
+ //Getters && Setters:
+ public function setNumber($number){ $this->_number = $number; }
+ public function getNumber(){ return $this->_number; }
+
+ public function setIdcinema($idcinema){ $this->_idcinema = $idcinema; }
+ public function getIdcinema(){ return $this->_idcinema; }
+
+ public function setNumRows($numRow){ $this->_numRow = $numRow; }
+ public function getNumRows(){ return $this->_numRow; }
+
+ public function setNumCol($numCol){ $this->_numCol = $numCol; }
+ public function getNumCol(){ return $this->_numCol; }
+
+ public function setState($state){ $this->_state = $state; }
+ public function getState(){ return $this->_state; }
+
+
+
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/seat_dao.php b/assets/php/common/seat_dao.php
new file mode 100644
index 0000000..52c8d29
--- /dev/null
+++ b/assets/php/common/seat_dao.php
@@ -0,0 +1,58 @@
+mysqli, $sql) or die ('Error BD createSeat');
+
+ return $sql;
+ }
+
+ public function getAllSeats($number, $cinema){
+
+ $sql = sprintf( "SELECT * FROM seat WHERE
+ idhall = '%s' AND idcinema = '%s'",
+ $number, $cinema);
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ $seat_map = null;
+ while($fila=mysqli_fetch_array($resul)){
+ $seat_map[] = $this->loadSeat($fila["idhall"], $fila["idcinema"], $fila["numrow"], $fila["numcolum"], $fila["active"]);
+ }
+
+ mysqli_free_result($resul);
+
+ return $seat_map;
+ }
+
+ public function deletemapSeats($hall, $cinema){
+ $sql = sprintf( "DELETE FROM `seat` WHERE
+ idcinema = '%s' AND idhall = '%s'",
+ $cinema, $hall);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ public function loadSeat($idhall, $idcinema, $numRow, $numCol, $state){
+ return new Seat($idhall, $idcinema, $numRow, $numCol, $state);
+ }
+
+ }
+
+?>
\ No newline at end of file
diff --git a/assets/php/common/session.php b/assets/php/common/session.php
new file mode 100644
index 0000000..275fafa
--- /dev/null
+++ b/assets/php/common/session.php
@@ -0,0 +1,118 @@
+_id = $id;
+ $this->_idfilm = $idfilm;
+ $this->_idhall = $idhall;
+ $this->_idcinema = $idcinema;
+ $this->_date = $date;
+ $this->_startTime = $startTime;
+ $this->_seatPrice = $seatPrice;
+ $this->_format = $format;
+ $this->_seats_full = $seats_full;
+ }
+
+ public static function getListSessions($hall,$cinema,$date){
+ $bd = new SessionDAO('complucine');
+ if($bd ) {
+ return $bd->getAllSessions($hall, $cinema, $date);
+ }
+ }
+
+ public static function create_session($cinema, $hall, $start, $date, $film, $price, $format,$repeat){
+ $bd = new SessionDAO('complucine');
+ if($bd ){
+ if(!$bd->searchSession($cinema, $hall, $start, $date)){
+ $bd->createSession(null,$film, $hall, $cinema, $date, $start, $price, $format);
+
+ if($repeat > "0") {
+ $repeats = $repeat;
+ $repeat = $repeat - 1;
+ $date = date('Y-m-d', strtotime( $date . ' +1 day') );
+ self::create_session($cinema, $hall, $start, $date, $film, $price, $format,$repeat);
+ return "Se han creado las ".$repeat ." sesiones con exito";
+ }
+
+ else
+ return "Se ha creado la session con exito";
+ } else
+ return "Esta session ya existe";
+
+ } else return "Error al conectarse a la base de datos";
+ }
+
+ public static function edit_session($cinema, $or_hall, $or_date, $or_start, $hall, $start, $date, $film, $price, $format){
+ $bd = new SessionDAO('complucine');
+ if($bd ){
+ if($bd->searchSession($cinema, $or_hall, $or_start, $or_date)){
+ if(!$bd->searchSession($cinema,$hall,$start,$date)){
+ $origin = array("cinema" => $cinema,"hall" => $or_hall,"start" => $or_start,"date" => $or_date);
+ $bd->editSession($film, $hall, $cinema, $date, $start, $price, $format,$origin);
+ return "Se ha editado la session con exito";
+ }else
+ return "Ya existe una sesion con los parametros nuevos";
+ } else
+ return "Esta session no existe";
+
+ } else return "Error al conectarse a la base de datos";
+ }
+
+ public static function delete_session($cinema, $hall, $start, $date){
+ $bd = new SessionDAO('complucine');
+ if($bd ){
+ if($bd->searchSession($cinema, $hall, $start, $date)){
+ $bd->deleteSession($hall, $cinema, $date, $start);
+ return "Se ha eliminado la session con exito";
+ } else
+ return "Esta session no existe";
+
+ } else return "Error al conectarse a la base de datos";
+ }
+
+ //Esto deberia estar en film.php? seguramente
+ public static function getThisSessionFilm($idfilm){
+ $bd = new SessionDAO('complucine');
+ if($bd ) {
+ return $bd->filmTittle($idfilm);
+ }
+ }
+
+ public function setId($id){ $this->_id = $id; }
+ public function getId(){ return $this->_id; }
+
+ public function setIdfilm($idfilm){ $this->_idfilm = $idfilm; }
+ public function getIdfilm(){ return $this->_idfilm; }
+
+ public function setIdhall($idhall){ $this->_idhall = $idhall; }
+ public function getIdhall(){ return $this->_idhall; }
+
+ public function setIdcinema($cinema){ $this->_idcinema = $idcinema; }
+ public function getIdcinema(){ return $this->_idcinema; }
+
+ public function setDate($date){ $this->_date = $date; }
+ public function getDate(){ return $this->_date; }
+
+ public function setStartTime($startTime){ $this->_startTime = $startTime; }
+ public function getStartTime(){ return $this->_startTime; }
+
+ public function setSeatPrice($seatPrice){ $this->_seatPrice = $seatPrice; }
+ public function getSeatPrice(){ return $this->_seatPrice; }
+
+ public function setFormat($format){ $this->_format = $format; }
+ public function getFormat(){ return $this->_format; }
+
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/session_dao.php b/assets/php/common/session_dao.php
new file mode 100644
index 0000000..df86869
--- /dev/null
+++ b/assets/php/common/session_dao.php
@@ -0,0 +1,114 @@
+mysqli->real_escape_string($format);
+ $date = date('Y-m-d', strtotime( $date ) );
+ $startTime = date('H:i:s', strtotime( $startTime ) );
+
+ $sql = sprintf( "INSERT INTO `session` (`id`, `idfilm`, `idhall`, `idcinema`, `date`, `start_time`, `seat_price`, `format`, `seats_full`)
+ VALUES ('%d', '%d', '%d', '%d', '%s', '%s', '%d', '%s', '%d')",
+ $id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, "0");
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $sql;
+ }
+
+ //Returns a query to get the session's data.
+ public function sessionData($id){
+ $sql = sprintf( "SELECT * FROM `session` WHERE id = '%d'", $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database en sessionData con la id '. $id);
+
+ $resul = mysqli_fetch_array($resul);
+
+ return $resul;
+ }
+
+ public function filmTittle($idfilm){
+ $sql = sprintf("SELECT * FROM film JOIN session ON film.id = session.idfilm WHERE session.idfilm = '%d' ", $idfilm );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database en sessionData con la id '. $idfilm);
+
+ $resul = mysqli_fetch_array($resul);
+
+ return $resul;
+ }
+
+ //Returns a session
+ public function searchSession($cinema, $hall, $startTime, $date){
+ $date = date('Y-m-d', strtotime( $date ) );
+ $startTime = date('H:i:s', strtotime( $startTime ) );
+
+ $sql = sprintf( "SELECT * FROM session WHERE
+ idcinema = '%s' AND idhall = '%s' AND date = '%s' AND start_time = '%s'",
+ $cinema, $hall, $date, $startTime);
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ $session = mysqli_fetch_array($resul);
+
+ mysqli_free_result($resul);
+
+ return $session;
+ }
+ //Returns a query to get all the session's data.
+ public function getAllSessions($hall, $cinema, $date){
+ $date = date('Y-m-d', strtotime( $date ) );
+
+ $sql = sprintf( "SELECT * FROM session WHERE
+ idcinema = '%s' AND idhall = '%s' AND date = '%s' ORDER BY start_time ASC;",
+ $cinema, $hall, $date);
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ $sessions = null;
+
+ while($fila=mysqli_fetch_array($resul)){
+ $sessions[] = $this->loadSession($fila["id"], $fila["idfilm"], $fila["idhall"], $fila["idcinema"], $fila["date"], $fila["start_time"], $fila["seat_price"], $fila["format"], $fila["seats_full"]);
+ }
+ mysqli_free_result($resul);
+
+ return $sessions;
+ }
+
+ public function editSession($idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $origin){
+ $format = $this->mysqli->real_escape_string($format);
+ $date = date('Y-m-d', strtotime( $date ) );
+ $startTime = date('H:i:s', strtotime( $startTime ) );
+
+ $sql = sprintf( "UPDATE `session`
+ SET `idfilm` = '%d' , `idhall` = '%d', `idcinema` = '%d', `date` = '%s',
+ `start_time` = '%s', `seat_price` = '%d', `format` = '%s'
+ WHERE
+ idcinema = '%s' AND idhall = '%s' AND date = '%s' AND start_time = '%s'",
+ $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $origin["cinema"],$origin["hall"],$origin["date"],$origin["start"]);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ public function deleteSession($hall, $cinema, $date, $startTime){
+
+ $sql = sprintf( "DELETE FROM `session` WHERE
+ idcinema = '%s' AND idhall = '%s' AND date = '%s' AND start_time = '%s'",
+ $cinema, $hall, $date, $startTime);
+
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Create a new Session Data Transfer Object.
+ public function loadSession( $id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $seats_full){
+ return new Session( $id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $seats_full);
+ }
+
+ }
+
+?>
diff --git a/assets/php/common/user.php b/assets/php/common/user.php
new file mode 100644
index 0000000..1fc9927
--- /dev/null
+++ b/assets/php/common/user.php
@@ -0,0 +1,36 @@
+ Será eliminado en la siguiente práctica para usar el modelo relacional de nuestra BD.
+
+ //Constructor:
+ function __construct($id, $username, $email, $password, $rol){
+ $this->_id = $id;
+ $this->_username = $username;
+ $this->_email = $email;
+ $this->_password = $password;
+ $this->_rol = $rol;
+ }
+
+ //Methods:
+
+ //Getters && Setters:
+ public function setId($id){ $this->_id = $id; }
+ public function getId(){ return $this->_id; }
+ public function setName($username){ $this->_username = $username; }
+ public function getName(){ return $this->_username; }
+ public function setEmail($email){ $this->_email = $email; }
+ public function getEmail(){ return $this->_email; }
+ public function setPass($passwd){ $this->_password = $passwd; }
+ public function getPass(){ return $this->_password; }
+ public function setRol($rol){ $this->_rol = $rol; }
+ public function getRol(){ return $this->_rol; }
+
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/common/user_dao.php b/assets/php/common/user_dao.php
new file mode 100644
index 0000000..69ead83
--- /dev/null
+++ b/assets/php/common/user_dao.php
@@ -0,0 +1,155 @@
+mysqli, $sql) or die ('Error into query database');
+
+ while($fila=$resul->fetch_assoc()){
+ $users[] = $this->loadUser($fila['id'], $fila['username'], $fila['email'], $fila['passwd'], $fila['rol']);
+ }
+ $resul->free();
+ return $users;
+ }
+
+ //Create a new User.
+ public function createUser($id, $username, $email, $password, $rol){
+ $password = $this->encryptPass($password);
+
+ $sql = sprintf( "INSERT INTO users( id, username, email, passwd, rol)
+ VALUES ( '%s', '%s', '%s', '%s', '%s')",
+ $id, $username, $email, $password, $rol );
+
+ $resul = mysqli_query($this->mysqli, $sql);
+
+ return $resul;
+ }
+
+ //Returns a query to check if the user name exists.
+ public function selectUser($username, $password){
+ $username = $this->mysqli->real_escape_string($username);
+ $password = $this->mysqli->real_escape_string($password);
+
+ $sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
+ $resul = mysqli_query($this->mysqli, $sql);
+
+ $resul->data_seek(0);
+ $user = null;
+ while ($fila = $resul->fetch_assoc()) {
+ if($username === $fila['username'] && $this->verifyPass($password, $fila['passwd'])){
+ $user = $this->loadUser($fila['id'], $fila['username'], $fila['email'], $fila['passwd'], $fila['rol']);
+ }
+ }
+
+ //mysqli_free_result($selectUser);
+ $resul->free();
+
+ return $user;
+ }
+
+ //Returns a query to get the user's data.
+ public function userData($id){
+ $id = $this->mysqli->real_escape_string($id);
+
+ $sql = sprintf( "SELECT * FROM users WHERE id = '%d'", $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Search a user by name.
+ public function selectUserName($username){
+ $username = $this->mysqli->real_escape_string($username);
+
+ $sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
+ $resul = mysqli_query($this->mysqli, $sql);
+
+ return $resul;
+ }
+
+ //Change username by id.
+ public function changeUserName($id, $username){
+ $id = $this->mysqli->real_escape_string($id);
+ $username = $this->mysqli->real_escape_string($username);
+
+ $sql = sprintf( "UPDATE users SET username = '%s' WHERE id = '%d'", $username, $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+
+ }
+
+ //Change userpass by id.
+ public function changeUserPass($id, $password){
+ $id = $this->mysqli->real_escape_string($id);
+ $password = $this->mysqli->real_escape_string($password);
+ $password = $this->encryptPass($password);
+
+ $sql = sprintf( "UPDATE users SET passwd = '%s' WHERE id = '%d'", $password, $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+
+ }
+
+ //Change user email by id.
+ public function changeUserEmail($id, $email){
+ $id = $this->mysqli->real_escape_string($id);
+ $email = $this->mysqli->real_escape_string($email);
+
+ $sql = sprintf( "UPDATE users SET email = '%s' WHERE id = '%d'", $email, $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+
+ }
+
+ //Delete user account by id.
+ public function deleteUserAccount($id){
+ $id = $this->mysqli->real_escape_string($id);
+
+ $sql = sprintf( "DELETE FROM users WHERE id = '%d'", $id );
+ $resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
+
+ return $resul;
+ }
+
+ //Create a new User Data Transfer Object.
+ public function loadUser($id, $username, $email, $password, $rol){
+ return new User($id, $username, $email, $password, $rol);
+ }
+
+ }
+
+?>
\ No newline at end of file
diff --git a/assets/php/config.php b/assets/php/config.php
new file mode 100644
index 0000000..709e1be
--- /dev/null
+++ b/assets/php/config.php
@@ -0,0 +1,55 @@
+get_prefix();
+
+ /**
+ * Initialize the application:
+ */
+ include_once($prefix.'assets/php/dao.php');
+ require_once('aplication.php');
+ $app = Aplicacion::getSingleton();
+ $app->init(array('host'=>BD_HOST, 'bd'=>BD_NAME, 'user'=>BD_USER, 'pass'=>BD_PASS));
+
+ /**
+ * @see http://php.net/manual/en/function.register-shutdown-function.php
+ * @see http://php.net/manual/en/language.types.callable.php
+ */
+ register_shutdown_function(array($app, 'shutdown'));
+
+ //Depuración (BORRAR):
+ ini_set('display_errors', 1);
+ ini_set('display_startup_errors', 1);
+ error_reporting(E_ALL);
+?>
diff --git a/assets/php/dao.php b/assets/php/dao.php
new file mode 100644
index 0000000..d47e566
--- /dev/null
+++ b/assets/php/dao.php
@@ -0,0 +1,24 @@
+mysqli = $app->conexionBd();
+ }
+
+ //Destructor (Ya no es necesdario):
+ /*
+ public function __destruct(){
+ $this->mysqli->close();
+ }
+ */
+
+ }
+?>
\ No newline at end of file
diff --git a/assets/php/form.php b/assets/php/form.php
new file mode 100644
index 0000000..3839d47
--- /dev/null
+++ b/assets/php/form.php
@@ -0,0 +1,386 @@
+$tipoFormulario.$formId.
+ */
+ private $formId;
+
+ /**
+ * @var string Valor del parámetro enctype del formulario.
+ */
+ private $enctype;
+
+ /**
+ * @var string Valor del atributo "class" de la etiqueta <form> asociada al formulario. Si este parámetro incluye la cadena "nocsrf" no se generá el token CSRF para este formulario.
+ */
+ private $classAtt;
+
+ /**
+ * @var string Parámetro de la petición utilizado para comprobar que el usuario ha enviado el formulario..
+ */
+ private $tipoFormulario;
+
+ /**
+ * @var string URL asociada al atributo "action" de la etiqueta <form> del fomrulario y que procesará el
+ * envío del formulario.
+ */
+ private $action;
+ private $printed;
+
+ /**
+ * @var bool Almacena si la interacción con el formulario va a realizarse a través de AJAX true
o
+ * false
en otro caso.
+ */
+ private $ajax;
+
+ /**
+ * Crea un nuevo formulario.
+ *
+ * Posibles opciones:
+ * Opción | + *Valor por defecto | + *Descripción | + *
---|---|---|
action | + *$_SERVER['PHP_SELF'] |
+ * URL asociada al atributo "action" de la etiqueta <form> del fomrulario y que procesará el envío del formulario. | + *
class | + *"" | + *Valor del atributo "class" de la etiqueta <form> asociada al formulario. Si este parámetro incluye la cadena + * "nocsrf" no se generá el token CSRF para este formulario. | + *
enctype | + *"" | + *Valor del parámetro enctype del formulario. | + *
ajax | + *false |
+ * Configura si el formulario se gestionará a través de AJAX. | + *
$tipoFormulario.$formId
.
+ *
+ * @param array $opciones (ver más arriba).
+ */
+ public function __construct($tipoFormulario, $opciones = array(), $formId = 1)
+ {
+ $this->tipoFormulario = $tipoFormulario;
+ $this->formId = $tipoFormulario.$formId;
+
+ $opcionesPorDefecto = array( 'ajax' => false, 'action' => null, 'class' => null, 'enctype' => null );
+ $opciones = array_merge($opcionesPorDefecto, $opciones);
+
+ $this->ajax = $opciones['ajax'];
+ $this->action = $opciones['action'];
+ $this->classAtt = $opciones['class'];
+ $this->enctype = $opciones['enctype'];
+
+ if ( !$this->action ) {
+ $this->action = htmlentities($_SERVER['PHP_SELF']);
+ }
+ }
+
+ /**
+ * Se encarga de orquestar todo el proceso de gestión de un formulario.
+ *
+ * El proceso es el siguiente:
+ * string
en {@see Form::procesaFormulario()}
+ * que será la URL a la que se rederigirá al usuario. Se redirige al usuario y se termina la ejecución del script.array
con entradas (campo, mensaje) con errores específicos para un campo o (entero, mensaje) si el mensaje
+ * es un mensaje que afecta globalmente al formulario. Se vuelve a generar el formulario pasándole el array de errores.$datosIniciales
y los errores al procesar
+ * el formulario en $errores
+ *
+ * @param string[] $datosIniciales Datos iniciales para los campos del formulario (normalmente $_POST
).
+ *
+ * @param string[] $errores (opcional)Lista / Tabla asociativa de errores asociados al formulario.
+ *
+ * @return string HTML asociado a los campos del formulario.
+ */
+ protected function generaCamposFormulario($datosIniciales, $errores = array())
+ {
+ return '';
+ }
+
+ /**
+ * Procesa los datos del formulario.
+ *
+ * @param string[] $datos Datos enviado por el usuario (normalmente $_POST
).
+ *
+ * @return string|string[] Devuelve el resultado del procesamiento del formulario, normalmente una URL a la que
+ * se desea que se redirija al usuario, o un array con los errores que ha habido durante el procesamiento del formulario.
+ */
+ protected function procesaFormulario($datos)
+ {
+ return array();
+ }
+
+ /**
+ * Función que verifica si el usuario ha enviado el formulario.
+ *
+ * Comprueba si existe el parámetro $formId
en $params
.
+ *
+ * @param string[] $params Array que contiene los datos recibidos en el envío formulario.
+ *
+ * @return boolean Devuelve true
si $formId
existe como clave en $params
+ */
+ private function formularioEnviado(&$params)
+ {
+ return isset($params['action']) && $params['action'] == $this->tipoFormulario;
+ }
+
+ /**
+ * Función que genera el HTML necesario para el formulario.
+ *
+ * @param string[] $datos (opcional) Array con los valores por defecto de los campos del formulario.
+ *
+ * @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
+ *
+ * @return string HTML asociado al formulario.
+ */
+ private function generaFormulario(&$datos = array(), &$errores = array())
+ {
+ $htmlCamposFormularios = $this->generaCamposFormulario($datos, $errores);
+
+ $classAtt='';
+ if ( $this->classAtt ) {
+ $classAtt = " class=\"{$this->classAtt}\"";
+ }
+
+ $enctypeAtt='';
+ if ( $this->enctype ) {
+ $enctypeAtt = " enctype=\"{$this->enctype}\"";
+ }
+
+ // Se genera el token CSRF si el usuario no solicita explícitamente lo contrario.
+ $tokenCSRF = '';
+ if ( ! $this->classAtt || strpos($this->classAtt, 'nocsrf') === false ) {
+ $tokenValue = $this->csrfguard_GenerateToken($this->tipoFormulario);
+ $tokenCSRF = "";
+ }
+
+ /* <<< Permite definir cadena en múltiples líneas.
+ * Revisa https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
+ */
+ $htmlForm = "";
+ return $htmlForm;
+ }
+
+ /**
+ * Genera la lista de mensajes de errores globales (no asociada a un campo) a incluir en el formulario.
+ *
+ * @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
+ *
+ * @param string $classAtt (opcional) Valor del atributo class de la lista de errores.
+ *
+ * @return string El HTML asociado a los mensajes de error.
+ */
+ protected static function generaListaErroresGlobales($errores = array(), $classAtt='')
+ {
+ $html='';
+ $clavesErroresGenerales = array_filter(array_keys($errores), function ($elem) {
+ return is_numeric($elem);
+ });
+
+ $numErrores = count($clavesErroresGenerales);
+ if ($numErrores > 0) {
+ $html = "$idError
dentro del array $errores
.
+ *
+ * @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
+ * @param string $idError (opcional) Clave dentro de $errores
del error a mostrar.
+ * @param string $htmlElement (opcional) Etiqueta HTML a crear para mostrar el error.
+ * @param array $atts (opcional) Tabla asociativa con los atributos a añadir a la etiqueta que mostrará el error.
+ */
+ protected static function createMensajeError($errores=array(), $idError='', $htmlElement='span', $atts = array())
+ {
+ $html = '';
+ if (isset($errores[$idError])) {
+ $att = '';
+ foreach($atts as $key => $value) {
+ $att .= "$key=$value";
+ }
+ $html = " <$htmlElement $att>{$errores[$idError]}$htmlElement>";
+ }
+
+ return $html;
+ }
+
+ /**
+ * Método para eliminar los tokens CSRF almecenados en la petición anterior que no hayan sido utilizados en la actual.
+ */
+ public static function limpiaCsrfTokens()
+ {
+ foreach(array_keys($_SESSION) as $key) {
+ if (strpos($key, self::CSRF_PARAM) === 0) {
+ unset($_SESSION[$key]);
+ }
+ }
+ }
+
+ private function csrfguard_GenerateToken($formParameter)
+ {
+ if ( ! session_id() ) {
+ throw new \Exception('La sesión del usuario no está definida.');
+ }
+
+ $paramSession = self::CSRF_PARAM.'_'.$formParameter;
+ if (isset($_SESSION[$paramSession])) {
+ $token = $_SESSION[$paramSession];
+ } else {
+ if ( function_exists('hash_algos') && in_array('sha512', hash_algos()) ) {
+ $token = hash('sha512', mt_rand(0, mt_getrandmax()));
+ } else {
+ $token=' ';
+ for ($i=0;$i<128;++$i) {
+ $r=mt_rand(0,35);
+ if ($r<26){
+ $c=chr(ord('a')+$r);
+ } else{
+ $c=chr(ord('0')+$r-26);
+ }
+ $token.=$c;
+ }
+ }
+
+ $_SESSION[$paramSession]=$token;
+ }
+ return $token;
+ }
+
+ private function csrfguard_ValidateToken($formParameter, $tokenRecibido)
+ {
+ if ( ! session_id() ) {
+ throw new \Exception('La sesión del usuario no está definida.');
+ }
+
+ $result = TRUE;
+
+ $paramSession = self::CSRF_PARAM.'_'.$formParameter;
+ if ( isset($_SESSION[$paramSession]) ) {
+ if ( $_SESSION[$paramSession] !== $tokenRecibido ) {
+ $result = array();
+ $result[] = 'Has enviado el formulario dos veces';
+ }
+ $_SESSION[$paramSession] = ' ';
+ unset($_SESSION[$paramSession]);
+ } else {
+ $result = array();
+ $result[] = 'Formulario no válido';
+ }
+ return $result;
+ }
+
+ //Test some form input.
+ protected function test_input($input){
+ return htmlspecialchars(trim(strip_tags($input)));
+ }
+
+}
diff --git a/assets/php/template.php b/assets/php/template.php
new file mode 100644
index 0000000..000a596
--- /dev/null
+++ b/assets/php/template.php
@@ -0,0 +1,516 @@
+page = $_SERVER['PHP_SELF']; //Page that instantiates the template.
+ $this->prefix = '../'; //Default prefix.
+
+ $this->set_page_prefix(); //Assigns the name and prefix of the page.
+
+ $this->session = 'Iniciar Sesión'; //Default, the session has not started.
+ $this->session_route = 'login/'; //Default, the session has not started.
+ $this->panel = ''; //Default, the session has not started.
+ $this->user_route = 'panel_user/'; //Default, the type of client is user.
+ }
+
+ //Methods:
+
+ //Assigns the name and prefix of the page:
+ private function set_page_prefix() {
+ switch(true){
+ case strpos($this->page, 'panel_user'): $this->page = 'Panel de Usuario'; break;
+ case strpos($this->page, 'panel_manager'): $this->page = 'Panel de Gerente'; break;
+ case strpos($this->page, 'panel_admin'): $this->page = 'Panel de Administrador'; break;
+ case strpos($this->page, 'login'): $this->page = 'Acceso'; break;
+ case strpos($this->page, 'logout'): $this->page = 'Cerrar Sesión'; break;
+ case strpos($this->page, 'register'): $this->page = 'Registro de Usuario'; break;
+ case strpos($this->page, 'showtimes'): $this->page = 'Cartelera'; break;
+ case strpos($this->page, 'cinemas'): $this->page = 'Nuestros Cines'; break;
+ case strpos($this->page, 'about_us'): $this->page = 'Sobre FDI-Cines'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'terms'): $this->page = 'Términos y Condiciones'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'detalles'): $this->page = 'Detalles'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'bocetos'): $this->page = 'Bocetos'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'miembros'): $this->page = 'Miembros'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'planificacion'): $this->page = 'Planificación'; $this->prefix = '../../'; break;
+ case strpos($this->page, 'contacto'): $this->page = 'Contacto'; break;
+ default: $this->page = 'FDI-Cines'; $this->prefix = './'; break;
+ }
+ }
+
+ //Returns page name:
+ function get_page(){
+ return $this->page;
+ }
+
+ //Returns page prefix:
+ function get_prefix(){
+ return $this->prefix;
+ }
+
+ //Print generic Head:
+ function print_head(){
+ $page = $this->page;
+ $prefix = $this->prefix;
+
+ echo"
+ ".$descriptions[$i]."
+Id | +Nombre | +Direccion | +Telefono | +||
---|---|---|---|---|---|
'. $ids[$i] .' | +'. $names[$i] .' | +'. $directions[$i] .' | +'. $phones[$i] .' | ++ + | ++ + | +
+ 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 FDI-Cines + mostrar la cartelera disponible e incluya ofertas y promociones para los clientes. +
++ 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. +
++ Los usuarios podrán registrarse, comprar sus entradas para una + sesión, elegir asientos, precomprar sus snacks y ver ofertas y promociones. +
++ Somos un grupo de estudiantes de la asignatura de Sistemas Web + de la Facultad de Informática de la Universidad Complutense de Madrid. +
++ 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 aquí. +
++ 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: +
++ 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). +
++ 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. +
++ 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. +
++ 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. +
++ Una vez elegidos película y cine, el flujo es idéntico al anterior. +
++ 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. +
+El Administrador es el encargado de gestionar las: películas, cines, promociones, otros administradores y gerentes de cada cine.
+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.
+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.
+Pantalla de bienvenida al entrar en la web.
+Pantalla para que un usuario nuevo se registre o, en caso de ya tener una cuenta de usuario, inicie sesión.
+Pantalla con todas las opciones disponibles, propias de un usuario registrado.
+Pantalla con información sobre todas las películas disponibles en ese momento.
+Pantalla con un mapa que indica la geolocalización de todos los cines de FDI-Cines.
+Pantalla que muestra los horarios disponibles por salas para un cine y película elegidos.
+Pantalla con un mapa para selccionar los asientos que se quieren escoger. Los asientos ocupados no pondrán ser seleccionados.
+Pantalla para realizar el pago, después de haber selecionado película, cine, sala, horario y butacas.
+Pantalla de confirmación con los datos de compra.
+Pantalla con información sobre FDI-Cines.
+Pantalla con un formulario para realizar una consulta a los administradores.
+Pantalla con todos los términos y condiciones de uso del servicio.
+Pantalla con las funciones exclusivas a las que puede acceder un Gerente.
+Pantalla en la que los Gerentes pueden interactuar para añadir, modificar o eliminar la sala de un cine.
+Pantalla en la que los Gerentes pueden interactuar para añadir, modificar o eliminar las sesiones de una película.
+Pantalla con las funciones exclusivas a las que puede acceder un Administrador.
+Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar las películas de la cartelera.
+Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar los cines.
+Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar las promociones existentes.
+Pantalla en la que los Administradores pueden interactuar para añadir, modificar o eliminar tanto otros Administradores como Gerentes.
++ 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. + + Los usuarios podrán registrarse, comprar sus entradas para una + sesión, elegir asientos, precomprar sus snacks y ver ofertas y promociones. +
++ 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. +
++ 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. +
++ 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. +
++ 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. +
++ 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. +
+ 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. +
++ 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. +
+ 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. +
+Nombre | +|
---|---|
Marco Expósito Pérez | +marcoexp@ucm.es | +
Fernando Méndez Torrubiano | +fernmend@ucm.es | +
Daniel Muñoz García | +danimu03@ucm.es | +
Ioan Marian Tulai | +ioantula@ucm.es | +
Óscar Ruiz de Pedro | +oscarrui@ucm.es | +
Adrian Real del Noval | +adrireal@ucm.es | +
~ Marco Expósito Pérez (marcoexp@ucm.es)
+Aficionado a todo tipo de videojuegos, principalmente la saga Zelda. Tambien me gusta leer tanto literatura fantastica como mangas y veo anime asiduamente.
+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.
+~ Fernando Méndez (fernmend@ucm.es)
+Estudiante de Ingeniería de Computadores en la Universidad Complutense de Madrid.
+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.
+~ Daniel Muñoz García (danimu03@ucm.es)
+Estudiante del grado en ingeniería informática en la Universidad Complutense de Madrid. Aficionado a la ciberseguridad y las nuevas tecnologías.
+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.
+~ Ioan Marian Tulai (ioantula@ucm.es)
+Estudiante con mucha ilusion y ganas de trabajar especialista en hardware.
+Alta experiencia programando en C, gran interés en aprender nuevos lenguajes de programación y aficionado a dibujar.
+~ Óscar Ruiz de Pedro (oscarrui@ucm.es)
+Estudiante de ingeniería de computadores en la Universidad Complutense de Madrid.
+Altas capacidades de programación en bajo nivel, me gustaría aprender más sobre el ámbito de la robótica.
+Aficionado a todo tipo de videojuegos, impresión 3D, teatro y airsoft.
+~ Adrian Real del Noval (adrireal@ucm.es)
+Estudiante de 3er año de Ingeniería de Computadores en la Universidad Complutense de Madrid.
+Las áreas en las que tiene mayor interés son la electrónica, las GPUs, y los sistemas empotrados.
+Hito | +Fecha estimada | +Estado | +
---|---|---|
Práctica 0 | +4 de Marzo de 2021 | +ENTREGADO | +
Práctica 1 | +18 de Marzo de 2021 | +ENTREGADO | +
Práctica 2 | +15 de Abril de 2021 | +ENTREGADO | +
Práctica 3 | +14 de Mayo de 2021 | +ENTREGADO | +
Entrega Final | +9 de Junio de 2021 | +EN PROCESO | +
+ *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. +
++ 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: +
+ 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. +
{$name}, has iniciado sesión correctamente.
+Usa los botones para navegar
+ + \n"; + } + else if(!isset($_SESSION["login"])){ + $reply = "El usuario o contraseña no son válidos.
+Vuelve a intetarlo o regístrate si no lo habías hecho previamente.
+ + \n"; + } + + return $reply; + } +} +?> \ No newline at end of file diff --git a/login/index.php b/login/index.php new file mode 100644 index 0000000..dc00623 --- /dev/null +++ b/login/index.php @@ -0,0 +1,73 @@ +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 = " +Para crear una cuenta de usuario es necesario haber rellenado el formulario de registro previamente
+Haz click en el botón para registrate.
+ +Si dispones de una cuenta de usuario, no es necesario que rellenes este formulario nuevamente
+Haz click en el botón para iniciar sesión.
+ +Serás redirigido al inicio en unos segundos.
+ Haz clic aquí si tu navegador no te redirige automáticamente.
Serás redirigido al inicio en unos segundos.
+ Haz clic aquí si tu navegador no te redirige automáticamente.
Id | +IdCinema | +Nombre | +Rol | +|||
---|---|---|---|---|---|---|
'. $ids[$i] .' | +'. $idscinemas[$i] .' | +'. $usernames[$i] .' | +'. $email[$i] .' | +'. $rol[$i] .' | ++ + | ++ + | +
Id | +Título | +Descripcion | +Código | +Activo | +||
---|---|---|---|---|---|---|
'. $ids[$i] .' | +'. $tittles[$i] .' | +'. $descriptions[$i] .' | +'. $codes[$i] .' | +'. $actives[$i] .' | ++ + | ++ + | +
+ '; + for($j = 1; $j<=$cols; $j++){ + $html .= ' | '.$j.' | + '; + } + $html .= '|
---|---|---|
'.$i.' | + '; + for($j=1; $j<=$cols; $j++){ + if($seats_map[$i][$j]>=0){ + $html .= '+ ';} + else { + $html .= ' | + ';} + } + $html .=' |
Usuario: '.$name.'
+Cine: '.$cinema.'
+Espero que estes pasando un buen dia
+'.$_SESSION['msg'].'
+Numero | +Filas | +Columnas | +Asientos Disponibles | +
---|---|---|---|
'. $hall->getNumber().' | +'. $hall->getNumRows().' | +'. $hall->getNumCol().' | +'.$hall->getTotalSeats().' | + +
No uses la url para toquitear cosas >.<
+".$htmlErroresGlobales."+ +
".$errorEmail."+
".$errorEmail2."+
".$errorPassword."+
".$htmlErroresGlobales."+ +
".$errorNombre."+
".$errorNombre2."+
".$errorPassword."+
".$htmlErroresGlobales."+ +
".$errorOldPass."+
".$errorPassword."+
".$errorPassword2."+
".$htmlErroresGlobales."+ +
".$errorNombre."+
".$errorEmail."+
".$errorPassword."+
".$errorPassword2."+
Usuario: '.$name.'
+Email: '.$email.'
+".$htmlErroresGlobales."+ +
".$errorNombre."+
".$errorEmail."+
".$errorPassword."+
".$errorPassword2."+
{$name}, has creado tu cuenta de usuario correctamente.
+Usa los botones para navegar
+ + \n"; + } + else if(!isset($_SESSION["login"])){ + $reply = "Ha ocurrido un problema y no hemos podido completar el registro
+Vuelve a intetarlo o inicia sesión si tienes una cuenta de usuario.
+ +