Compare commits

..

1 Commits

Author SHA1 Message Date
74d2d356d9 Delete appointment from dialog 2020-07-13 19:12:22 +02:00
27 changed files with 162 additions and 864 deletions

View File

@@ -1,48 +0,0 @@
# MDIS
This project consists of an Information System for a Medical Institution.
## Technologies
- PHP
- MySQL
- Javascript
- Fullcalendar
- Jquery
- JqueryUI
## Requirements
- Nix
## Installation
1. Install Nix (compatible with MacOS and Linux):
``` {.shell}
curl -L https://nixos.org/nix/install | sh
```
There are alternative installation methods, if you don\'t want to pipe
curl to sh
2. Clone the repository:
``` {.shell}
git clone https://coolneng.duckdns.org/gitea/coolneng/MDIS
```
3. Change the working directory to the project:
``` {.shell}
cd MDIS
```
4. Enter the nix-shell:
``` {.shell}
nix-shell
```
The website can be accessed via **localhost:8000**

9
README.org Normal file
View File

@@ -0,0 +1,9 @@
* MDIS
This project consists of an Information System for a Medical Institution.
** Technologies
- PHP
- Javascript (AJAX)
- MySQL

View File

@@ -1,7 +1,7 @@
#+TITLE: MDIS #+TITLE: MDIS
#+SUBTITLE: Programación Web #+SUBTITLE: Programación Web
#+AUTHOR: Amin Kasrou Aouam #+AUTHOR: Amin Kasrou Aouam
#+DATE: 2020-07-16 #+DATE: 2020-06-18
#+PANDOC_OPTIONS: template:~/.pandoc/templates/eisvogel.latex #+PANDOC_OPTIONS: template:~/.pandoc/templates/eisvogel.latex
#+PANDOC_OPTIONS: listings:t #+PANDOC_OPTIONS: listings:t
#+PANDOC_OPTIONS: toc:t #+PANDOC_OPTIONS: toc:t
@@ -13,13 +13,12 @@
#+PANDOC_METADATA: logo:/home/coolneng/Photos/Logos/UGR.png #+PANDOC_METADATA: logo:/home/coolneng/Photos/Logos/UGR.png
* MDIS * MDIS
MDIS es un sistema de información que permite la gestión de una consulta médica. MDIS es una sistema de información que permite la gestión de una consulta médica.
** Funcionalidades ** Funcionalidades
- Gestión de Usuarios - Gestión de Usuarios
- Gestión de Pacientes - Gestión de Pacientes
- Gestión de Calendario
- Gestión de Citas - Gestión de Citas
- Gestión de Vacaciones - Gestión de Vacaciones
- Gestión de Informes - Gestión de Informes
@@ -28,10 +27,7 @@ MDIS es un sistema de información que permite la gestión de una consulta médi
- PHP - PHP
- MySQL - MySQL
- Javascript - Javascript (Jquery)
- Fullcalendar
- Jquery
- JqueryUI
- Nix - Nix
** Arquitectura ** Arquitectura
@@ -41,34 +37,13 @@ MDIS es un sistema de información que permite la gestión de una consulta médi
Es un sistema web clásico, con la característica de que las consultas a la base de datos se realizan mediante /PDO/, para evitar vulnerabilidades del tipo /inyección de SQL/. Es un sistema web clásico, con la característica de que las consultas a la base de datos se realizan mediante /PDO/, para evitar vulnerabilidades del tipo /inyección de SQL/.
Las operaciones que conllevan una inserción o transformación de datos se realizan en los archivos que terminan en *=_management.php=*, además de ésto, no hacemos ninguna consulta /SQL/ fuera del archivo *database.php*, lo que nos permite separar la lógica interna de la presentación. Además de ésto, no hacemos ninguna consulta /SQL/ fuera del archivo database.php, lo que nos permite separar la lógica interna de la presentación.
** Estructura del proyecto
La segmentación de los diferentes archivos de un proyecto es un aspecto que facilita mucho la búsqueda en un proyecto. La estructura de directorios es la siguiente:
- database: archivos SQL para la creación de la base de datos.
- docs: memoria del proyecto.
- src: código fuente (PHP y Javascript).
- src/static: bibliotecas de javascript, CSS y fotos.
** Dependencias
El apartado de la gestión de citas se ha realizado utilizando la biblioteca [[https://fullcalendar.io/][FullCalendar]] de Javascript. La conexión entre el /backend/ y el /frontend/ se realiza mediante intercambio de JSON, la implementación se encuentra en los archivos que terminan en *=_feed.php=*.
A partir de los elementos de la base de datos, formateados y transformados, obtenemos las citas, los festivos y la configuración del calendario de cada doctor. Finalmente, personalizamos el comportamiento del calendario según estos datos.
Los elementos del calendario también requieren de [[https://jqueryui.com/][JqueryUI]], para darle un toque más moderno a los distintos componentes.
La impresión de los informes en formato PDF es posible gracias a [[https://github.com/MrRio/jsPDF][jsPDF]], biblioteca simple y que produce documentos con un diseño cuidado.
Por último, hacemos uso de la función /$.ajax()/ de [[https://jquery.com][Jquery]] para realizar peticiones /GET/ síncronas, dado que ciertos componentes de FullCalendar no pueden ser ejecutados como funciones asíncronas.
** Despliegue ** Despliegue
El desarrollo y despliegue del sistema se han hecho gracias a /Nix/, un gestor de paquetes que permite entornos de desarrollo y despliegue reproducibles. El desarrollo y despliegue del sistema se han hecho gracias a /Nix/, un gestor de paquetes que permite entornos de desarrollo y despliegue reproducibles.
A continuación mostramos el código que define el entorno de desarrollo: A continuación mostramos el código que defino el entorno:
#+BEGIN_SRC nix #+BEGIN_SRC nix
{ pkgs ? import <nixpkgs> { } }: { pkgs ? import <nixpkgs> { } }:

Binary file not shown.

View File

@@ -1,5 +1,7 @@
$(document).ready(function() { $(document).ready(function()
$("#provincia").change(function() { {
$("#provincia").change(function()
{
var id_provincia = $(this).val(); var id_provincia = $(this).val();
var post_id = 'id='+ id_provincia; var post_id = 'id='+ id_provincia;
@@ -8,7 +10,8 @@ $(document).ready(function() {
url: "ajax.php", url: "ajax.php",
data: post_id, data: post_id,
cache: false, cache: false,
success: function(response) { success: function(response)
{
$("#localidad").html(response); $("#localidad").html(response);
} }
}); });

View File

@@ -23,7 +23,6 @@
$pdo = connectDatabase(); $pdo = connectDatabase();
$patients = listPatients($pdo); $patients = listPatients($pdo);
$calendar_settings = fetchCalendarSettings($pdo, $doctor); $calendar_settings = fetchCalendarSettings($pdo, $doctor);
$time_ranges = computeTimeRanges($pdo);
?> ?>
<?php if($_SESSION["user_type"] == 1 and !isset($_GET["medico"])): ?> <?php if($_SESSION["user_type"] == 1 and !isset($_GET["medico"])): ?>
<form name="select_doctor" method="get" action="appointment.php"> <form name="select_doctor" method="get" action="appointment.php">
@@ -43,12 +42,7 @@
<form name="add_appointment" method="post" action="appointment_management.php"> <form name="add_appointment" method="post" action="appointment_management.php">
<div class="input-group"> <div class="input-group">
<label for="hora">Hora</label> <label for="hora">Hora</label>
<select id="hora" name="hora"> <input type="time" name="hora" value="">
<option>Seleccione una hora</option>
<?php foreach ($time_ranges as $row) : ?>
<option><?php echo $row; ?></option>
<?php endforeach ?>
</select>
</div> </div>
<div class="input-group"> <div class="input-group">
<label for="duracion">Duración</label> <label for="duracion">Duración</label>
@@ -82,7 +76,7 @@
<div id="event-end"/></div> <div id="event-end"/></div>
<form method="post" action="appointment_management.php"> <form method="post" action="appointment_management.php">
<input type="hidden" name="event_id" id="event_id"> <input type="hidden" name="event_id" id="event_id">
<button class="create_btn" type="submit" name="edit_form">Editar</button> <button class="create_btn" type="submit" name="edit">Editar</button>
<button class="del_btn" type="submit" name="delete">Borrar</button> <button class="del_btn" type="submit" name="delete">Borrar</button>
</form> </form>
</div> </div>

View File

@@ -1,48 +0,0 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de citas</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="static/style.css" type="text/css" media="screen" />
</head>
<body>
<?php include 'navbar.php'; ?>
<?php
include 'database.php';
$pdo = connectDatabase();
$data = fetchAppointmentData($pdo, $_GET["event_id"]);
$patients = fetchPatients($pdo);
?>
<form name="edit_appointment" method="post" action="appointment_management.php">
<div class="input-group">
<label for="fecha">Fecha</label>
<input type="date" name="fecha" value="<?php echo $data[1]; ?>">
</div>
<div class="input-group">
<label for="hora">Hora</label>
<input type="time" name="hora" value="<?php echo $data[2]; ?>">
</div>
<div class="input-group">
<label for="duracion">Duración</label>
<input type="number" name="duracion" value="<?php echo $data[3]; ?>" step="30">
</div>
<div class="input-group">
<label for="observaciones">Observaciones</label>
<input type="text" name="observaciones" value="<?php echo $data[4]; ?>">
</div>
<div class="input-group">
<select id="paciente" name="paciente">
<option>Seleccione un paciente</option>
<?php foreach ($patients as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[1]; ?></option>
<?php endforeach ?>
</select>
</div>
<button class="create_btn" type="submit" name="edit">Editar</button>
<input type="hidden" name="id" value="<?php echo $_GET["event_id"]; ?>">
</form>
<?php closeDatabase($pdo); ?>
</body>

View File

@@ -1,8 +1,7 @@
<?php <?php
include 'appointment_management.php'; include 'appointment_management.php';
function computeEndTime(&$data) function computeEndTime(&$data){
{
foreach($data as &$row){ foreach($data as &$row){
$time = new DateTime($row["hora"]); $time = new DateTime($row["hora"]);
$time->modify("+{$row["duracion"]} minutes"); $time->modify("+{$row["duracion"]} minutes");
@@ -12,8 +11,7 @@ function computeEndTime(&$data)
} }
function formatArray($data) function renameArray($data){
{
computeEndTime($data); computeEndTime($data);
$events = array(); $events = array();
foreach($data as $row){ foreach($data as $row){
@@ -24,14 +22,12 @@ function formatArray($data)
"description" => $row["observaciones"], "description" => $row["observaciones"],
"patient" => $row["documento_identificativo"], "patient" => $row["documento_identificativo"],
"end" => $row["fecha"] . " " . $row["end"], "end" => $row["fecha"] . " " . $row["end"],
"overlap" => false,
); );
} }
return $events; return $events;
} }
function fetchDatabase() function fetchDatabase(){
{
$pdo = connectDatabase(); $pdo = connectDatabase();
$data = listEvents($pdo); $data = listEvents($pdo);
closeDatabase($pdo); closeDatabase($pdo);
@@ -40,5 +36,7 @@ function fetchDatabase()
$result = fetchDatabase(); $result = fetchDatabase();
$events = formatArray($result); $events = renameArray($result);
echo json_encode($events); echo json_encode($events);
?>

View File

@@ -3,8 +3,7 @@ include'database.php';
session_start(); session_start();
function fetchDoctor($pdo) function fetchDoctor($pdo){
{
if($_SESSION["user_type"] == 2){ if($_SESSION["user_type"] == 2){
$user = finduser($pdo, $_SESSION["user"]); $user = finduser($pdo, $_SESSION["user"]);
return $user[0][4]; return $user[0][4];
@@ -13,32 +12,21 @@ function fetchDoctor($pdo)
} }
function listEvents($pdo) function listEvents($pdo){
{
$doctor = fetchDoctor($pdo); $doctor = fetchDoctor($pdo);
$events = fetchCalendarEvents($pdo, $doctor); $events = fetchCalendarEvents($pdo, $doctor);
return $events; return $events;
} }
function listHolidays($pdo) function listHolidays($pdo){
{
$doctor = fetchDoctor($pdo); $doctor = fetchDoctor($pdo);
$holidays = fetchDoctorHolidays($pdo, $doctor); $holidays = fetchDoctorHolidays($pdo, $doctor);
return $holidays; return json_encode($holidays);
} }
function listCalendarSettings($pdo) function appointmentCreation(){
{
$doctor = fetchDoctor($pdo);
$calendar_settings = fetchCalendarSettings($pdo, $doctor);
return $calendar_settings;
}
function appointmentCreation()
{
$data = $_POST; $data = $_POST;
$pdo = connectDatabase(); $pdo = connectDatabase();
createAppointment($pdo, $data); createAppointment($pdo, $data);
@@ -47,8 +35,7 @@ function appointmentCreation()
} }
function appointmentModification() function appointmentModification(){
{
$data = $_POST; $data = $_POST;
$pdo = connectDatabase(); $pdo = connectDatabase();
editAppointment($pdo, $data); editAppointment($pdo, $data);
@@ -57,8 +44,7 @@ function appointmentModification()
} }
function appointmentDeletion() function appointmentDeletion(){
{
$id = $_POST["event_id"]; $id = $_POST["event_id"];
$pdo = connectDatabase(); $pdo = connectDatabase();
deleteAppointment($pdo, $id); deleteAppointment($pdo, $id);
@@ -67,60 +53,10 @@ function appointmentDeletion()
} }
function getFloorCeiling($pdo)
{
$data = listCalendarSettings($pdo);
if ($data["horario"] == "completo") {
$start = $data["hora_inicio_mañana"];
$end = $data["hora_fin_tarde"];
} elseif ($data["horario"] == "mañana") {
$start = $data["hora_inicio_mañana"];
$end = $data["hora_fin_mañana"];
} else {
$start = $data["hora_inicio_tarde"];
$end = $data["hora_fin_tarde"];
}
$range[] = array(
"start" => $start,
"end" => $end,
);
return $range[0];
}
function getTimeDiff()
{
$current = time();
$addTime = strtotime("+30 mins", $current);
$diff = $addTime - $current;
return $diff;
}
function computeTimeRanges($pdo)
{
$range = getFloorCeiling($pdo);
$diff = getTimeDiff();
$start = strtotime($range["start"]);
$end = strtotime($range["end"]);
$time_range = array();
while ($start < $end) {
$time_range[] = date('G:i:s', $start);
$start += $diff;
}
return $time_range;
}
if(isset($_POST["create"])){ if(isset($_POST["create"])){
appointmentCreation(); appointmentCreation();
} }
if (isset($_POST["edit_form"])) {
$event_id = $_POST["event_id"];
header("location: appointment_edit_form.php?event_id=$event_id");
}
if(isset($_POST["edit"])){ if(isset($_POST["edit"])){
appointmentModification(); appointmentModification();
} }

View File

@@ -1,58 +1,26 @@
$(document).ready(function() { $(document).ready(function() {
var queryString = window.location.search; var queryString = window.location.search;
var calendar = $('#calendar').fullCalendar({ var calendar = $('#calendar').fullCalendar({
selectable: true,
editable: false, editable: true,
header: { header: {
left: 'prev,next,today', left: 'prev,next,today',
center: 'title',
right: 'month,agendaWeek,agendaDay' right: 'month,agendaWeek,agendaDay'
}, },
eventSources: [ events: "appointment_feed.php" + queryString,
"appointment_feed.php" + queryString,
"holiday_feed.php" + queryString
],
select: function(start, end) { selectable: true,
$("#dialog-form").dialog({
modal: true, selectHelper: true,
width: 450
}); select: function(start, end, allDay) {
$("#dialog-form").dialog({ modal: true, width:450});
var date = $.fullCalendar.formatDate(start, 'YYYY-MM-DD'); var date = $.fullCalendar.formatDate(start, 'YYYY-MM-DD');
$("#fecha").val(date); $("#fecha").val(date);
}, },
selectAllow: function(selectInfo) {
var daysOff = null;
var holidays = null;
$.ajax({
url: 'holiday_feed.php' + queryString,
async: false,
dataType: 'json',
success: function(json) {
holidays = json;
}
});
$.ajax({
url: 'calendar_settings_feed.php' + queryString,
async: false,
dataType: 'json',
success: function(json) {
daysOff = json;
}
});
var date = selectInfo.start._d;
var formatted_date = date.toISOString().substr(0, 10);
var foundHoliday = holidays.find(el => el.start === formatted_date);
var foundDayOff = daysOff.find(el => el === date.getDay());
if (foundDayOff == null && foundHoliday == null) {
return true;
}
return false;
},
eventClick: function(event) { eventClick: function(event) {
var start = $.fullCalendar.formatDate(event.start, 'HH:mm'); var start = $.fullCalendar.formatDate(event.start, 'HH:mm');
var end = $.fullCalendar.formatDate(event.end, 'HH:mm'); var end = $.fullCalendar.formatDate(event.end, 'HH:mm');
@@ -61,10 +29,7 @@
$("#event-description").html("<b>Observaciones: </b>" + event.description); $("#event-description").html("<b>Observaciones: </b>" + event.description);
$("#event-start").html("<b>Comienzo: </b>" + start); $("#event-start").html("<b>Comienzo: </b>" + start);
$("#event-end").html("<b>Fin: </b>" + end); $("#event-end").html("<b>Fin: </b>" + end);
$("#event-info").dialog({ $("#event-info").dialog({title: event.title, width:450});
title: event.title,
width: 450
});
} }
}); });

View File

@@ -30,40 +30,9 @@ function holidayDeletion()
} }
function setWorkingHours(&$data)
{
if (isset($data["hora_inicio_mañana"], $data["hora_fin_mañana"], $data["hora_inicio_tarde"], $data["hora_fin_tarde"])) {
$data["horario"] = "completo";
} elseif (isset($data["hora_inicio_mañana"], $data["hora_fin_mañana"])) {
$data["horario"] = "mañana";
} elseif (isset($data["hora_inicio_tarde"], $data["hora_fin_tarde"])) {
$data["horario"] = "tarde";
}
}
function setUncheckedBoxes(&$data)
{
if (!isset($data["sabado_habil"])) {
$data["sabado_habil"] = 0;
}
if (!isset($data["domingo_habil"])) {
$data["domingo_habil"] = 0;
}
}
function sanitizeInputs(&$data)
{
setWorkingHours($data);
setUncheckedBoxes($data);
}
function calendarConfig() function calendarConfig()
{ {
$data = $_POST; $data = $_POST;
sanitizeInputs($data);
$pdo = connectDatabase(); $pdo = connectDatabase();
configureCalendar($pdo, $data); configureCalendar($pdo, $data);
closeDatabase($pdo); closeDatabase($pdo);

View File

@@ -1,28 +0,0 @@
<?php
include 'appointment_management.php';
function formatArray($data)
{
$settings = array();
if (!$data["sabado_habil"]) {
array_push($settings, 6);
}
if (!$data["domingo_habil"]) {
array_push($settings, 0);
}
return $settings;
}
function fetchDatabase()
{
$pdo = connectDatabase();
$data = listCalendarSettings($pdo);
closeDatabase($pdo);
return $data;
}
$result = fetchDatabase();
$events = formatArray($result);
echo json_encode($events);

View File

@@ -50,6 +50,14 @@
<label>Hora fin tarde</label> <label>Hora fin tarde</label>
<input type="time" name="hora_fin_tarde" value=""> <input type="time" name="hora_fin_tarde" value="">
</div> </div>
<div class="select-input">
<label>Horario</label>
<select id="horario" name="horario">
<option value="mañana">mañana</option>
<option value="tarde">tarde</option>
<option value="completo">completo</option>
</select>
</div>
<div class="input-group"> <div class="input-group">
<label>Sábado hábil</label> <label>Sábado hábil</label>
<input type="checkbox" name="sabado_habil" value="1"> <input type="checkbox" name="sabado_habil" value="1">
@@ -60,7 +68,7 @@
</div> </div>
<div class="input-group"> <div class="input-group">
<label>Duración de cita por defecto</label> <label>Duración de cita por defecto</label>
<input type="number" name="duracion_cita_por_defecto" value="60" step="30"> <input type="number" name="duracion_cita_por_defecto" value="">
</div> </div>
<div class="input-group"> <div class="input-group">
<button class="btn" type="submit" name="configure" >Guardar</button> <button class="btn" type="submit" name="configure" >Guardar</button>

View File

@@ -2,17 +2,15 @@ function changeInputType() {
country = document.getElementById("pais").value; country = document.getElementById("pais").value;
region = document.getElementById("provincia"); region = document.getElementById("provincia");
city = document.getElementById("localidad"); city = document.getElementById("localidad");
region_input = document.getElementById("provincia2");
city_input = document.getElementById("localidad2");
if(country == 73){ if(country == 73){
region.hidden = false; region.hidden = false;
city.hidden = false; city.hidden = false;
region_input.type = "hidden";
city_input.type = "hidden";
} else { } else {
region.hidden = true; region.hidden = true;
city.hidden = true; city.hidden = true;
region_input = document.getElementById("provincia2");
city_input = document.getElementById("localidad2");
region_input.type = "text"; region_input.type = "text";
city_input.type = "text"; city_input.type = "text";
} }

View File

@@ -23,8 +23,7 @@ function listRows($pdo, $table)
return $result; return $result;
} }
function fetchLatestRegion($pdo) function fetchLatestRegion($pdo){
{
$query = "SELECT id_provincia FROM provincias ORDER BY id_provincia DESC LIMIT 1;"; $query = "SELECT id_provincia FROM provincias ORDER BY id_provincia DESC LIMIT 1;";
$result = $pdo->prepare($query); $result = $pdo->prepare($query);
$result->execute(); $result->execute();
@@ -32,8 +31,7 @@ function fetchLatestRegion($pdo)
return $data; return $data;
} }
function fetchLatestCity($pdo) function fetchLatestCity($pdo){
{
$query = "SELECT id_municipio FROM municipios ORDER BY id_municipio DESC LIMIT 1;"; $query = "SELECT id_municipio FROM municipios ORDER BY id_municipio DESC LIMIT 1;";
$result = $pdo->prepare($query); $result = $pdo->prepare($query);
$result->execute(); $result->execute();
@@ -41,8 +39,7 @@ function fetchLatestCity($pdo)
return $data; return $data;
} }
function createRegion($pdo, $data) function createRegion($pdo, $data){
{
$query = "INSERT INTO provincias (id_provincia, provincia) VALUES (?,?)"; $query = "INSERT INTO provincias (id_provincia, provincia) VALUES (?,?)";
$row = fetchLatestRegion($pdo); $row = fetchLatestRegion($pdo);
$last_region = $row["id_provincia"]; $last_region = $row["id_provincia"];
@@ -51,8 +48,7 @@ function createRegion($pdo, $data)
return $index; return $index;
} }
function createCity($pdo, $data, $region) function createCity($pdo, $data, $region){
{
$query = "INSERT INTO municipios (id_provincia, cod_municipio, DC, nombre) VALUES (?,?,?,?)"; $query = "INSERT INTO municipios (id_provincia, cod_municipio, DC, nombre) VALUES (?,?,?,?)";
$pdo->prepare($query)->execute([$region, 999, 999, $data["localidad2"]]); $pdo->prepare($query)->execute([$region, 999, 999, $data["localidad2"]]);
$city = fetchLatestCity($pdo); $city = fetchLatestCity($pdo);
@@ -323,9 +319,7 @@ function fetchPatients($pdo)
function fetchReportData($pdo, string $id) function fetchReportData($pdo, string $id)
{ {
$query = "SELECT informe.id, titulo, fecha, hora, paciente , contenido, usuario FROM informe $query = "SELECT * FROM informe WHERE id=?";
INNER JOIN usuario ON informe.medico = usuario.id
WHERE informe.id=?";
$result = $pdo->prepare($query); $result = $pdo->prepare($query);
$result->execute([$id]); $result->execute([$id]);
$data = $result->fetch(); $data = $result->fetch();
@@ -365,10 +359,10 @@ function configureCalendar($pdo, $data)
} else { } else {
$query = "UPDATE calendario SET hora_inicio_mañana=?, hora_fin_mañana=?, $query = "UPDATE calendario SET hora_inicio_mañana=?, hora_fin_mañana=?,
hora_inicio_tarde=?, hora_fin_tarde=?, horario=?, sabado_habil=?, domingo_habil=?, hora_inicio_tarde=?, hora_fin_tarde=?, horario=?, sabado_habil=?, domingo_habil=?,
duracion_cita_por_defecto=? WHERE medico=?"; duracion_cita_por_defecto=?, medico=? WHERE medico=?";
$pdo->prepare($query)->execute([$data["hora_inicio_mañana"], $data["hora_fin_mañana"], $data["hora_inicio_tarde"], $pdo->prepare($query)->execute([$data["hora_inicio_mañana"], $data["hora_fin_mañana"], $data["hora_inicio_tarde"],
$data["hora_fin_tarde"], $data["horario"], $data["sabado_habil"], $data["domingo_habil"], $data["hora_fin_tarde"], $data["horario"], $data["sabado_habil"], $data["domingo_habil"],
$data["duracion_cita_por_defecto"], $data["medico"]]); $data["duracion_cita_por_defecto"], $data["medico"], $data["medico"]]);
} }
return "Calendario configurado con éxito"; return "Calendario configurado con éxito";
} }
@@ -376,7 +370,7 @@ function configureCalendar($pdo, $data)
function fetchCalendarEvents($pdo, $doctor) function fetchCalendarEvents($pdo, $doctor)
{ {
$query = "SELECT cita.id, fecha, hora, duracion, medico, observaciones, nombre, apellido, documento_identificativo FROM cita $query = "SELECT cita.id, fecha, hora, duracion, medico, observaciones, nombre, apellido, documento_identificativo from cita
INNER JOIN paciente ON cita.paciente = paciente.id INNER JOIN paciente ON cita.paciente = paciente.id
WHERE medico=?"; WHERE medico=?";
$result = $pdo->prepare($query); $result = $pdo->prepare($query);
@@ -401,9 +395,7 @@ function fetchCalendarSettings($pdo, $doctor)
function fetchDoctorHolidays($pdo, $doctor) function fetchDoctorHolidays($pdo, $doctor)
{ {
$query = "SELECT festivo.id, fecha_festivo, tipo_festivo, medico, nombre FROM festivo $query = "SELECT * FROM festivo WHERE medico IS NULL OR medico=?";
INNER JOIN usuario ON festivo.medico = usuario.id;
WHERE medico IS NULL OR medico=?";
$result = $pdo->prepare($query); $result = $pdo->prepare($query);
$result->execute([$doctor]); $result->execute([$doctor]);
$data = $result->fetchAll(PDO::FETCH_ASSOC); $data = $result->fetchAll(PDO::FETCH_ASSOC);
@@ -411,8 +403,7 @@ function fetchDoctorHolidays($pdo, $doctor)
} }
function createAppointment($pdo, $data) function createAppointment($pdo, $data){
{
$query = "INSERT INTO cita (fecha, hora, duracion, medico, observaciones, paciente) VALUES (?,?,?,?,?,?)"; $query = "INSERT INTO cita (fecha, hora, duracion, medico, observaciones, paciente) VALUES (?,?,?,?,?,?)";
$pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["duracion"], $pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["duracion"],
$data["doctor"], $data["observaciones"], $data["paciente"]]); $data["doctor"], $data["observaciones"], $data["paciente"]]);
@@ -420,29 +411,16 @@ function createAppointment($pdo, $data)
} }
function editAppointment($pdo, $data) function editAppointment($pdo, $data){
{ $query = "UPDATE cita SET (fecha, hora, duracion, medico, observaciones, paciente) VALUES (?,?,?,?,?,?)";
$query = "UPDATE cita SET fecha=?, hora=?, duracion=?, observaciones=?, paciente=?
WHERE id=?";
$pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["duracion"], $pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["duracion"],
$data["observaciones"], $data["paciente"], $data["id"]]); $data["doctor"], $data["observaciones"], $data["paciente"]]);
return "Cita modificada con éxito"; return "Cita modificada con éxito";
} }
function deleteAppointment($pdo, $id) function deleteAppointment($pdo, $id){
{
$statement = "DELETE FROM cita WHERE id=?"; $statement = "DELETE FROM cita WHERE id=?";
$pdo->prepare($statement)->execute([$id]); $pdo->prepare($statement)->execute([$id]);
return "Cita borrada con éxito"; return "Cita borrada con éxito";
} }
function fetchAppointmentData($pdo, $id)
{
$query = "SELECT id, fecha, hora, duracion, observaciones FROM cita WHERE id=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
$data = $result->fetch();
return $data;
}

View File

@@ -1,32 +0,0 @@
<?php
include 'appointment_management.php';
function formatArray($data)
{
$events = array();
foreach ($data as $row) {
$events[] = array(
"id" => $row["id"],
"start" => $row["fecha_festivo"],
"description" => $row["tipo_festivo"],
"doctor" => $row["nombre"],
"rendering" => "background",
"color" => "#ffa6a3",
);
}
return $events;
}
function fetchDatabase()
{
$pdo = connectDatabase();
$data = listHolidays($pdo);
closeDatabase($pdo);
return $data;
}
$result = fetchDatabase();
$events = formatArray($result);
echo json_encode($events);

View File

@@ -13,9 +13,9 @@
<li class="list"><a href="report.php">Informes</a></li> <li class="list"><a href="report.php">Informes</a></li>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["user"])): ?> <?php if (isset($_SESSION["user"])): ?>
<li class="list"><a href="user_management.php?logout=1">Cerrar sesión</a></li> <li class="list"><a href="user_management.php?logout=1">Log out</a></li>
<?php else: ?> <?php else: ?>
<li class="list"><a href="login.php">Iniciar sesión</a></li> <li class="list"><a href="login.php">Login</a></li>
<?php endif; ?> <?php endif; ?>
</ul> </ul>
</nav> </nav>

View File

@@ -1,48 +0,0 @@
function printExternalHTML(url) {
var printWindow = window.open(url, 'Print', 'left=200, top=200, width=950, height=500, toolbar=0, resizable=0');
printWindow.addEventListener('load', function() {
if (Boolean(printWindow.chrome)) {
printWindow.print();
setTimeout(function() {
printWindow.close();
}, 500);
} else {
printWindow.print();
printWindow.close();
}
}, true);
}
function getHTML(url) {
html = null;
$.ajax({
url: url,
async: false,
success: function(data) {
console.log(data);
html = data;
}
});
return html;
}
function printExternalPDF(url) {
var html = getHTML(url);
var pdf = new jsPDF();
margins = {
top: 80,
bottom: 60,
left: 40,
width: 522
};
pdf.fromHTML(
html,
margins.left,
margins.top, {
'width': margins.width
}
),
pdf.save();
}

View File

@@ -7,9 +7,6 @@
<meta name="description" content=""> <meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="static/style.css" type="text/css" media="screen" /> <link rel="stylesheet" href="static/style.css" type="text/css" media="screen" />
<script src="static/jquery-3.5.1.min.js"></script>
<script src="static/jspdf.min.js"></script>
<script src="print_page.js"></script>
</head> </head>
<body> <body>
<?php include 'navbar.php'; ?> <?php include 'navbar.php'; ?>
@@ -28,13 +25,14 @@
<th>Hora</th> <th>Hora</th>
<th>Paciente</th> <th>Paciente</th>
<th>Médico</th> <th>Médico</th>
<th colspan="3">Acciones</th> <th colspan="2">Acciones</th>
</tr> </tr>
</thead> </thead>
<?php <?php
include 'database.php'; include 'database.php';
$pdo = connectDatabase(); $pdo = connectDatabase();
$list = listReports($pdo); $list = listReports($pdo);
foreach ($list as $row) : foreach ($list as $row) :
@@ -51,12 +49,6 @@
<td> <td>
<a href="report_management.php?delete=<?php echo $row[0]; ?>" class="del_btn">Borrar</a> <a href="report_management.php?delete=<?php echo $row[0]; ?>" class="del_btn">Borrar</a>
</td> </td>
<td>
<input type="button" value="HTML" class="create_btn" onClick="printExternalHTML('report_content.php?id=<?php echo $row[0]; ?>')">
</td>
<td>
<input type="button" value="PDF" class="create_btn" onClick="printExternalPDF('report_content.php?id=<?php echo $row[0]; ?>')">
</td>
</tr> </tr>
<?php endforeach ?> <?php endforeach ?>
<?php closeDatabase($pdo); ?> <?php closeDatabase($pdo); ?>

View File

@@ -1,38 +0,0 @@
<html class="no-js" lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de informes</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="static/style.css" type="text/css" media="screen" />
</head>
<body>
<table>
<thead>
<tr>
<th>Titulo</th>
<th>Fecha</th>
<th>Hora</th>
<th>Paciente</th>
<th>Contenido</th>
<th>Médico</th>
</tr>
</thead>
<?php
include 'database.php';
$pdo = connectDatabase();
$data = fetchReportData($pdo, $_GET["id"]);
?>
<tr>
<td><?php echo $data[1]; ?></td>
<td><?php echo $data[2]; ?></td>
<td><?php echo $data[3]; ?></td>
<td><?php echo $data[4]; ?></td>
<td><?php echo $data[5]; ?></td>
<td><?php echo $data[6]; ?></td>
</tr>
<?php closeDatabase($pdo); ?>
</table>
</body>

View File

@@ -14,8 +14,8 @@
include 'database.php'; include 'database.php';
$pdo = connectDatabase(); $pdo = connectDatabase();
$doctors = listDoctors($pdo);
$patients = fetchPatients($pdo); $patients = fetchPatients($pdo);
$user = finduser($pdo, $_SESSION["user"]);
?> ?>
<form name="create_form" method="post" action="report_management.php" onsubmit="return validateReport();"> <form name="create_form" method="post" action="report_management.php" onsubmit="return validateReport();">
<div class="input-group"> <div class="input-group">
@@ -38,6 +38,14 @@
<?php endforeach ?> <?php endforeach ?>
</select> </select>
</div> </div>
<div class="input-group">
<select id="medico" name="medico">
<option>Seleccione un médico</option>
<?php foreach ($doctors as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[1]; ?></option>
<?php endforeach ?>
</select>
</div>
<div class="input-group"> <div class="input-group">
<label>contenido</label> <label>contenido</label>
<input type="text" name="contenido" value=""> <input type="text" name="contenido" value="">
@@ -45,7 +53,7 @@
<div class="input-group"> <div class="input-group">
<button class="btn" type="submit" name="create" >Guardar</button> <button class="btn" type="submit" name="create" >Guardar</button>
</div> </div>
<input type="hidden" id="medico" name="medico" value="<?php echo $user[0][4]; ?>"> <input type="button" value="Imprimir" onClick="window.print()">
</form> </form>
<?php closeDatabase($pdo); ?> <?php closeDatabase($pdo); ?>
</body> </body>

View File

@@ -1,7 +1,6 @@
<?php <?php
include'database.php'; include'database.php';
function reportCreation() function reportCreation()
{ {
$data = $_POST; $data = $_POST;
@@ -11,7 +10,6 @@ function reportCreation()
header('location: report.php'); header('location: report.php');
} }
function reportModification() function reportModification()
{ {
$data = $_POST; $data = $_POST;
@@ -22,7 +20,6 @@ function reportModification()
header('location: report.php'); header('location: report.php');
} }
function reportDeletion() function reportDeletion()
{ {
$id = $_GET["delete"]; $id = $_GET["delete"];
@@ -32,7 +29,6 @@ function reportDeletion()
header('location: report.php'); header('location: report.php');
} }
if (isset($_POST["create"])) { if (isset($_POST["create"])) {
reportCreation(); reportCreation();
} }
@@ -42,7 +38,6 @@ if (isset($_POST["edit"])) {
reportModification(); reportModification();
} }
if (isset($_GET["delete"])) { if (isset($_GET["delete"])) {
reportDeletion(); reportDeletion();
} }

File diff suppressed because one or more lines are too long

View File

@@ -81,7 +81,7 @@ form {
.edit_btn { .edit_btn {
text-decoration: none; text-decoration: none;
padding: 2px 5px; padding: 2px 5px;
background: #0d841f; background: #2E8B57;
color: white; color: white;
border-radius: 3px; border-radius: 3px;
} }

View File

@@ -1,6 +1,5 @@
function checkDNI(dni) { function checkDNI(dni) {
var number, var number, let, letter;
let, letter;
var regex = /^[XYZ]?\d{5,8}[A-Z]$/; var regex = /^[XYZ]?\d{5,8}[A-Z]$/;
dni = dni.toUpperCase(); dni = dni.toUpperCase();
@@ -14,8 +13,7 @@ function checkDNI(dni) {
number = number % 23; number = number % 23;
letter = 'TRWAGMYFPDXBNJZSQVHLCKET'; letter = 'TRWAGMYFPDXBNJZSQVHLCKET';
letter = letter.substring(number, number+1); letter = letter.substring(number, number+1);
if (letter != if (letter != let) {
let) {
return false; return false;
}else{ }else{
return true; return true;