Compare commits

...

31 Commits

Author SHA1 Message Date
79cc26b7e5 Hide text input when country is Spain 2020-07-16 05:17:07 +02:00
997de5c4bf Convert readme to markdown 2020-07-16 04:07:46 +02:00
6e314bc2a0 Add directory structure section to summary 2020-07-16 04:02:49 +02:00
e4c64900d8 Add description of dependencies in the summary 2020-07-16 03:53:06 +02:00
0b91047625 Beautify javascript code 2020-07-16 03:32:09 +02:00
b0238cc9b0 Improve PHP formatting 2020-07-16 03:19:08 +02:00
6bc9db9117 Clean up unused appointment functions 2020-07-16 03:11:40 +02:00
5fab7775d4 Print report content as PDF 2020-07-15 23:44:44 +02:00
1993b0d27e Print report content as HTML 2020-07-15 22:08:40 +02:00
393a508136 Change time input to dropdown 2020-07-15 20:26:06 +02:00
92cb51ae60 Disable appointment selection for days off 2020-07-15 18:58:41 +02:00
88c06ce169 Disable appointment selection for holidays 2020-07-15 16:52:10 +02:00
d3e6b5a549 Display holidays from JSON feed 2020-07-14 21:36:43 +02:00
5e0285d608 Implement appointment modification 2020-07-14 14:48:35 +02:00
b9bf92ea55 Translate log in and log out 2020-07-14 00:27:15 +02:00
77a4a5987e Delete appointment from calendar 2020-07-13 19:12:46 +02:00
a772b300df Show appointment information on click 2020-07-13 19:03:06 +02:00
646f97fa79 Get chosen doctor appointments as admin 2020-07-13 17:28:42 +02:00
d5ea8bec33 Implement appointment fetch and insertion 2020-07-12 20:08:42 +02:00
a6262a5b38 Add appointment modification and deletion queries 2020-07-10 23:36:48 +02:00
2e2e0b67f0 Fix appointment insertion in database 2020-07-10 13:27:48 +02:00
3eab99b0f6 Aggregate appointments and reports in patient list 2020-07-10 13:07:17 +02:00
6169388fef Update patient edit form region and city dialogs 2020-07-10 11:27:00 +02:00
01902f3757 Add input for region and city for other countries 2020-07-09 22:24:25 +02:00
c0764276e1 Fix appointment database insertion 2020-07-08 21:23:13 +02:00
d013659e74 Read appointments from JSON feed 2020-07-08 14:43:22 +02:00
9858920b11 Send doctor ID as hidden input in appointments 2020-07-08 14:10:14 +02:00
1ee89ef1f5 Hide appointment creation form on page load 2020-06-26 13:39:30 +02:00
21213f993d Create appointment dialog on click 2020-06-26 12:19:51 +02:00
b93df4005b Move the database logic to appointment_management 2020-06-25 21:15:52 +02:00
63b1b72e88 Change background image on the main page 2020-06-25 21:15:05 +02:00
36 changed files with 2713 additions and 322 deletions

48
README.md Normal file
View File

@@ -0,0 +1,48 @@
# 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**

View File

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

View File

@@ -12,6 +12,8 @@ source database/provincias.sql;
source database/municipios.sql;
source database/paises.sql;
CREATE TABLE IF NOT EXISTS paciente (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
@@ -67,7 +69,7 @@ CREATE TABLE IF NOT EXISTS calendario (
horario VARCHAR(15) NOT NULL,
sabado_habil BOOLEAN DEFAULT FALSE,
domingo_habil BOOLEAN DEFAULT FALSE,
duracion_cita_por_defecto INT DEFAULT 60,
duracion_cita_por_defecto INT,
medico INT,
PRIMARY KEY (id, medico),
FOREIGN KEY (medico)

247
database/paises.sql Normal file
View File

@@ -0,0 +1,247 @@
CREATE TABLE `paises` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`iso` char(2) DEFAULT NULL,
`nombre` varchar(80) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
INSERT INTO `paises` VALUES(1, 'AF', 'Afganistán');
INSERT INTO `paises` VALUES(2, 'AX', 'Islas Gland');
INSERT INTO `paises` VALUES(3, 'AL', 'Albania');
INSERT INTO `paises` VALUES(4, 'DE', 'Alemania');
INSERT INTO `paises` VALUES(5, 'AD', 'Andorra');
INSERT INTO `paises` VALUES(6, 'AO', 'Angola');
INSERT INTO `paises` VALUES(7, 'AI', 'Anguilla');
INSERT INTO `paises` VALUES(8, 'AQ', 'Antártida');
INSERT INTO `paises` VALUES(9, 'AG', 'Antigua y Barbuda');
INSERT INTO `paises` VALUES(10, 'AN', 'Antillas Holandesas');
INSERT INTO `paises` VALUES(11, 'SA', 'Arabia Saudí');
INSERT INTO `paises` VALUES(12, 'DZ', 'Argelia');
INSERT INTO `paises` VALUES(13, 'AR', 'Argentina');
INSERT INTO `paises` VALUES(14, 'AM', 'Armenia');
INSERT INTO `paises` VALUES(15, 'AW', 'Aruba');
INSERT INTO `paises` VALUES(16, 'AU', 'Australia');
INSERT INTO `paises` VALUES(17, 'AT', 'Austria');
INSERT INTO `paises` VALUES(18, 'AZ', 'Azerbaiyán');
INSERT INTO `paises` VALUES(19, 'BS', 'Bahamas');
INSERT INTO `paises` VALUES(20, 'BH', 'Bahréin');
INSERT INTO `paises` VALUES(21, 'BD', 'Bangladesh');
INSERT INTO `paises` VALUES(22, 'BB', 'Barbados');
INSERT INTO `paises` VALUES(23, 'BY', 'Bielorrusia');
INSERT INTO `paises` VALUES(24, 'BE', 'Bélgica');
INSERT INTO `paises` VALUES(25, 'BZ', 'Belice');
INSERT INTO `paises` VALUES(26, 'BJ', 'Benin');
INSERT INTO `paises` VALUES(27, 'BM', 'Bermudas');
INSERT INTO `paises` VALUES(28, 'BT', 'Bhután');
INSERT INTO `paises` VALUES(29, 'BO', 'Bolivia');
INSERT INTO `paises` VALUES(30, 'BA', 'Bosnia y Herzegovina');
INSERT INTO `paises` VALUES(31, 'BW', 'Botsuana');
INSERT INTO `paises` VALUES(32, 'BV', 'Isla Bouvet');
INSERT INTO `paises` VALUES(33, 'BR', 'Brasil');
INSERT INTO `paises` VALUES(34, 'BN', 'Brunéi');
INSERT INTO `paises` VALUES(35, 'BG', 'Bulgaria');
INSERT INTO `paises` VALUES(36, 'BF', 'Burkina Faso');
INSERT INTO `paises` VALUES(37, 'BI', 'Burundi');
INSERT INTO `paises` VALUES(38, 'CV', 'Cabo Verde');
INSERT INTO `paises` VALUES(39, 'KY', 'Islas Caimán');
INSERT INTO `paises` VALUES(40, 'KH', 'Camboya');
INSERT INTO `paises` VALUES(41, 'CM', 'Camerún');
INSERT INTO `paises` VALUES(42, 'CA', 'Canadá');
INSERT INTO `paises` VALUES(43, 'CF', 'República Centroafricana');
INSERT INTO `paises` VALUES(44, 'TD', 'Chad');
INSERT INTO `paises` VALUES(45, 'CZ', 'República Checa');
INSERT INTO `paises` VALUES(46, 'CL', 'Chile');
INSERT INTO `paises` VALUES(47, 'CN', 'China');
INSERT INTO `paises` VALUES(48, 'CY', 'Chipre');
INSERT INTO `paises` VALUES(49, 'CX', 'Isla de Navidad');
INSERT INTO `paises` VALUES(50, 'VA', 'Ciudad del Vaticano');
INSERT INTO `paises` VALUES(51, 'CC', 'Islas Cocos');
INSERT INTO `paises` VALUES(52, 'CO', 'Colombia');
INSERT INTO `paises` VALUES(53, 'KM', 'Comoras');
INSERT INTO `paises` VALUES(54, 'CD', 'República Democrática del Congo');
INSERT INTO `paises` VALUES(55, 'CG', 'Congo');
INSERT INTO `paises` VALUES(56, 'CK', 'Islas Cook');
INSERT INTO `paises` VALUES(57, 'KP', 'Corea del Norte');
INSERT INTO `paises` VALUES(58, 'KR', 'Corea del Sur');
INSERT INTO `paises` VALUES(59, 'CI', 'Costa de Marfil');
INSERT INTO `paises` VALUES(60, 'CR', 'Costa Rica');
INSERT INTO `paises` VALUES(61, 'HR', 'Croacia');
INSERT INTO `paises` VALUES(62, 'CU', 'Cuba');
INSERT INTO `paises` VALUES(63, 'DK', 'Dinamarca');
INSERT INTO `paises` VALUES(64, 'DM', 'Dominica');
INSERT INTO `paises` VALUES(65, 'DO', 'República Dominicana');
INSERT INTO `paises` VALUES(66, 'EC', 'Ecuador');
INSERT INTO `paises` VALUES(67, 'EG', 'Egipto');
INSERT INTO `paises` VALUES(68, 'SV', 'El Salvador');
INSERT INTO `paises` VALUES(69, 'AE', 'Emiratos Árabes Unidos');
INSERT INTO `paises` VALUES(70, 'ER', 'Eritrea');
INSERT INTO `paises` VALUES(71, 'SK', 'Eslovaquia');
INSERT INTO `paises` VALUES(72, 'SI', 'Eslovenia');
INSERT INTO `paises` VALUES(73, 'ES', 'España');
INSERT INTO `paises` VALUES(74, 'UM', 'Islas ultramarinas de Estados Unidos');
INSERT INTO `paises` VALUES(75, 'US', 'Estados Unidos');
INSERT INTO `paises` VALUES(76, 'EE', 'Estonia');
INSERT INTO `paises` VALUES(77, 'ET', 'Etiopía');
INSERT INTO `paises` VALUES(78, 'FO', 'Islas Feroe');
INSERT INTO `paises` VALUES(79, 'PH', 'Filipinas');
INSERT INTO `paises` VALUES(80, 'FI', 'Finlandia');
INSERT INTO `paises` VALUES(81, 'FJ', 'Fiyi');
INSERT INTO `paises` VALUES(82, 'FR', 'Francia');
INSERT INTO `paises` VALUES(83, 'GA', 'Gabón');
INSERT INTO `paises` VALUES(84, 'GM', 'Gambia');
INSERT INTO `paises` VALUES(85, 'GE', 'Georgia');
INSERT INTO `paises` VALUES(86, 'GS', 'Islas Georgias del Sur y Sandwich del Sur');
INSERT INTO `paises` VALUES(87, 'GH', 'Ghana');
INSERT INTO `paises` VALUES(88, 'GI', 'Gibraltar');
INSERT INTO `paises` VALUES(89, 'GD', 'Granada');
INSERT INTO `paises` VALUES(90, 'GR', 'Grecia');
INSERT INTO `paises` VALUES(91, 'GL', 'Groenlandia');
INSERT INTO `paises` VALUES(92, 'GP', 'Guadalupe');
INSERT INTO `paises` VALUES(93, 'GU', 'Guam');
INSERT INTO `paises` VALUES(94, 'GT', 'Guatemala');
INSERT INTO `paises` VALUES(95, 'GF', 'Guayana Francesa');
INSERT INTO `paises` VALUES(96, 'GN', 'Guinea');
INSERT INTO `paises` VALUES(97, 'GQ', 'Guinea Ecuatorial');
INSERT INTO `paises` VALUES(98, 'GW', 'Guinea-Bissau');
INSERT INTO `paises` VALUES(99, 'GY', 'Guyana');
INSERT INTO `paises` VALUES(100, 'HT', 'Haití');
INSERT INTO `paises` VALUES(101, 'HM', 'Islas Heard y McDonald');
INSERT INTO `paises` VALUES(102, 'HN', 'Honduras');
INSERT INTO `paises` VALUES(103, 'HK', 'Hong Kong');
INSERT INTO `paises` VALUES(104, 'HU', 'Hungría');
INSERT INTO `paises` VALUES(105, 'IN', 'India');
INSERT INTO `paises` VALUES(106, 'ID', 'Indonesia');
INSERT INTO `paises` VALUES(107, 'IR', 'Irán');
INSERT INTO `paises` VALUES(108, 'IQ', 'Iraq');
INSERT INTO `paises` VALUES(109, 'IE', 'Irlanda');
INSERT INTO `paises` VALUES(110, 'IS', 'Islandia');
INSERT INTO `paises` VALUES(111, 'IL', 'Israel');
INSERT INTO `paises` VALUES(112, 'IT', 'Italia');
INSERT INTO `paises` VALUES(113, 'JM', 'Jamaica');
INSERT INTO `paises` VALUES(114, 'JP', 'Japón');
INSERT INTO `paises` VALUES(115, 'JO', 'Jordania');
INSERT INTO `paises` VALUES(116, 'KZ', 'Kazajstán');
INSERT INTO `paises` VALUES(117, 'KE', 'Kenia');
INSERT INTO `paises` VALUES(118, 'KG', 'Kirguistán');
INSERT INTO `paises` VALUES(119, 'KI', 'Kiribati');
INSERT INTO `paises` VALUES(120, 'KW', 'Kuwait');
INSERT INTO `paises` VALUES(121, 'LA', 'Laos');
INSERT INTO `paises` VALUES(122, 'LS', 'Lesotho');
INSERT INTO `paises` VALUES(123, 'LV', 'Letonia');
INSERT INTO `paises` VALUES(124, 'LB', 'Líbano');
INSERT INTO `paises` VALUES(125, 'LR', 'Liberia');
INSERT INTO `paises` VALUES(126, 'LY', 'Libia');
INSERT INTO `paises` VALUES(127, 'LI', 'Liechtenstein');
INSERT INTO `paises` VALUES(128, 'LT', 'Lituania');
INSERT INTO `paises` VALUES(129, 'LU', 'Luxemburgo');
INSERT INTO `paises` VALUES(130, 'MO', 'Macao');
INSERT INTO `paises` VALUES(131, 'MK', 'ARY Macedonia');
INSERT INTO `paises` VALUES(132, 'MG', 'Madagascar');
INSERT INTO `paises` VALUES(133, 'MY', 'Malasia');
INSERT INTO `paises` VALUES(134, 'MW', 'Malawi');
INSERT INTO `paises` VALUES(135, 'MV', 'Maldivas');
INSERT INTO `paises` VALUES(136, 'ML', 'Malí');
INSERT INTO `paises` VALUES(137, 'MT', 'Malta');
INSERT INTO `paises` VALUES(138, 'FK', 'Islas Malvinas');
INSERT INTO `paises` VALUES(139, 'MP', 'Islas Marianas del Norte');
INSERT INTO `paises` VALUES(140, 'MA', 'Marruecos');
INSERT INTO `paises` VALUES(141, 'MH', 'Islas Marshall');
INSERT INTO `paises` VALUES(142, 'MQ', 'Martinica');
INSERT INTO `paises` VALUES(143, 'MU', 'Mauricio');
INSERT INTO `paises` VALUES(144, 'MR', 'Mauritania');
INSERT INTO `paises` VALUES(145, 'YT', 'Mayotte');
INSERT INTO `paises` VALUES(146, 'MX', 'México');
INSERT INTO `paises` VALUES(147, 'FM', 'Micronesia');
INSERT INTO `paises` VALUES(148, 'MD', 'Moldavia');
INSERT INTO `paises` VALUES(149, 'MC', 'Mónaco');
INSERT INTO `paises` VALUES(150, 'MN', 'Mongolia');
INSERT INTO `paises` VALUES(151, 'MS', 'Montserrat');
INSERT INTO `paises` VALUES(152, 'MZ', 'Mozambique');
INSERT INTO `paises` VALUES(153, 'MM', 'Myanmar');
INSERT INTO `paises` VALUES(154, 'NA', 'Namibia');
INSERT INTO `paises` VALUES(155, 'NR', 'Nauru');
INSERT INTO `paises` VALUES(156, 'NP', 'Nepal');
INSERT INTO `paises` VALUES(157, 'NI', 'Nicaragua');
INSERT INTO `paises` VALUES(158, 'NE', 'Níger');
INSERT INTO `paises` VALUES(159, 'NG', 'Nigeria');
INSERT INTO `paises` VALUES(160, 'NU', 'Niue');
INSERT INTO `paises` VALUES(161, 'NF', 'Isla Norfolk');
INSERT INTO `paises` VALUES(162, 'NO', 'Noruega');
INSERT INTO `paises` VALUES(163, 'NC', 'Nueva Caledonia');
INSERT INTO `paises` VALUES(164, 'NZ', 'Nueva Zelanda');
INSERT INTO `paises` VALUES(165, 'OM', 'Omán');
INSERT INTO `paises` VALUES(166, 'NL', 'Países Bajos');
INSERT INTO `paises` VALUES(167, 'PK', 'Pakistán');
INSERT INTO `paises` VALUES(168, 'PW', 'Palau');
INSERT INTO `paises` VALUES(169, 'PS', 'Palestina');
INSERT INTO `paises` VALUES(170, 'PA', 'Panamá');
INSERT INTO `paises` VALUES(171, 'PG', 'Papúa Nueva Guinea');
INSERT INTO `paises` VALUES(172, 'PY', 'Paraguay');
INSERT INTO `paises` VALUES(173, 'PE', 'Perú');
INSERT INTO `paises` VALUES(174, 'PN', 'Islas Pitcairn');
INSERT INTO `paises` VALUES(175, 'PF', 'Polinesia Francesa');
INSERT INTO `paises` VALUES(176, 'PL', 'Polonia');
INSERT INTO `paises` VALUES(177, 'PT', 'Portugal');
INSERT INTO `paises` VALUES(178, 'PR', 'Puerto Rico');
INSERT INTO `paises` VALUES(179, 'QA', 'Qatar');
INSERT INTO `paises` VALUES(180, 'GB', 'Reino Unido');
INSERT INTO `paises` VALUES(181, 'RE', 'Reunión');
INSERT INTO `paises` VALUES(182, 'RW', 'Ruanda');
INSERT INTO `paises` VALUES(183, 'RO', 'Rumania');
INSERT INTO `paises` VALUES(184, 'RU', 'Rusia');
INSERT INTO `paises` VALUES(185, 'EH', 'Sahara Occidental');
INSERT INTO `paises` VALUES(186, 'SB', 'Islas Salomón');
INSERT INTO `paises` VALUES(187, 'WS', 'Samoa');
INSERT INTO `paises` VALUES(188, 'AS', 'Samoa Americana');
INSERT INTO `paises` VALUES(189, 'KN', 'San Cristóbal y Nevis');
INSERT INTO `paises` VALUES(190, 'SM', 'San Marino');
INSERT INTO `paises` VALUES(191, 'PM', 'San Pedro y Miquelón');
INSERT INTO `paises` VALUES(192, 'VC', 'San Vicente y las Granadinas');
INSERT INTO `paises` VALUES(193, 'SH', 'Santa Helena');
INSERT INTO `paises` VALUES(194, 'LC', 'Santa Lucía');
INSERT INTO `paises` VALUES(195, 'ST', 'Santo Tomé y Príncipe');
INSERT INTO `paises` VALUES(196, 'SN', 'Senegal');
INSERT INTO `paises` VALUES(197, 'CS', 'Serbia y Montenegro');
INSERT INTO `paises` VALUES(198, 'SC', 'Seychelles');
INSERT INTO `paises` VALUES(199, 'SL', 'Sierra Leona');
INSERT INTO `paises` VALUES(200, 'SG', 'Singapur');
INSERT INTO `paises` VALUES(201, 'SY', 'Siria');
INSERT INTO `paises` VALUES(202, 'SO', 'Somalia');
INSERT INTO `paises` VALUES(203, 'LK', 'Sri Lanka');
INSERT INTO `paises` VALUES(204, 'SZ', 'Suazilandia');
INSERT INTO `paises` VALUES(205, 'ZA', 'Sudáfrica');
INSERT INTO `paises` VALUES(206, 'SD', 'Sudán');
INSERT INTO `paises` VALUES(207, 'SE', 'Suecia');
INSERT INTO `paises` VALUES(208, 'CH', 'Suiza');
INSERT INTO `paises` VALUES(209, 'SR', 'Surinam');
INSERT INTO `paises` VALUES(210, 'SJ', 'Svalbard y Jan Mayen');
INSERT INTO `paises` VALUES(211, 'TH', 'Tailandia');
INSERT INTO `paises` VALUES(212, 'TW', 'Taiwán');
INSERT INTO `paises` VALUES(213, 'TZ', 'Tanzania');
INSERT INTO `paises` VALUES(214, 'TJ', 'Tayikistán');
INSERT INTO `paises` VALUES(215, 'IO', 'Territorio Británico del Océano Índico');
INSERT INTO `paises` VALUES(216, 'TF', 'Territorios Australes Franceses');
INSERT INTO `paises` VALUES(217, 'TL', 'Timor Oriental');
INSERT INTO `paises` VALUES(218, 'TG', 'Togo');
INSERT INTO `paises` VALUES(219, 'TK', 'Tokelau');
INSERT INTO `paises` VALUES(220, 'TO', 'Tonga');
INSERT INTO `paises` VALUES(221, 'TT', 'Trinidad y Tobago');
INSERT INTO `paises` VALUES(222, 'TN', 'Túnez');
INSERT INTO `paises` VALUES(223, 'TC', 'Islas Turcas y Caicos');
INSERT INTO `paises` VALUES(224, 'TM', 'Turkmenistán');
INSERT INTO `paises` VALUES(225, 'TR', 'Turquía');
INSERT INTO `paises` VALUES(226, 'TV', 'Tuvalu');
INSERT INTO `paises` VALUES(227, 'UA', 'Ucrania');
INSERT INTO `paises` VALUES(228, 'UG', 'Uganda');
INSERT INTO `paises` VALUES(229, 'UY', 'Uruguay');
INSERT INTO `paises` VALUES(230, 'UZ', 'Uzbekistán');
INSERT INTO `paises` VALUES(231, 'VU', 'Vanuatu');
INSERT INTO `paises` VALUES(232, 'VE', 'Venezuela');
INSERT INTO `paises` VALUES(233, 'VN', 'Vietnam');
INSERT INTO `paises` VALUES(234, 'VG', 'Islas Vírgenes Británicas');
INSERT INTO `paises` VALUES(235, 'VI', 'Islas Vírgenes de los Estados Unidos');
INSERT INTO `paises` VALUES(236, 'WF', 'Wallis y Futuna');
INSERT INTO `paises` VALUES(237, 'YE', 'Yemen');
INSERT INTO `paises` VALUES(238, 'DJ', 'Yibuti');
INSERT INTO `paises` VALUES(239, 'ZM', 'Zambia');
INSERT INTO `paises` VALUES(240, 'ZW', 'Zimbabue');

View File

@@ -1,7 +1,7 @@
#+TITLE: MDIS
#+SUBTITLE: Programación Web
#+AUTHOR: Amin Kasrou Aouam
#+DATE: 2020-06-18
#+DATE: 2020-07-16
#+PANDOC_OPTIONS: template:~/.pandoc/templates/eisvogel.latex
#+PANDOC_OPTIONS: listings:t
#+PANDOC_OPTIONS: toc:t
@@ -13,12 +13,13 @@
#+PANDOC_METADATA: logo:/home/coolneng/Photos/Logos/UGR.png
* MDIS
MDIS es una sistema de información que permite la gestión de una consulta médica.
MDIS es un sistema de información que permite la gestión de una consulta médica.
** Funcionalidades
- Gestión de Usuarios
- Gestión de Pacientes
- Gestión de Calendario
- Gestión de Citas
- Gestión de Vacaciones
- Gestión de Informes
@@ -27,7 +28,10 @@ MDIS es una sistema de información que permite la gestión de una consulta méd
- PHP
- MySQL
- Javascript (Jquery)
- Javascript
- Fullcalendar
- Jquery
- JqueryUI
- Nix
** Arquitectura
@@ -37,13 +41,34 @@ MDIS es una sistema de información que permite la gestión de una consulta méd
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/.
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.
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.
** 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
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 defino el entorno:
A continuación mostramos el código que define el entorno de desarrollo:
#+BEGIN_SRC nix
{ pkgs ? import <nixpkgs> { } }:

Binary file not shown.

View File

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

View File

@@ -8,6 +8,7 @@
<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/fullcalendar.css" type="text/css" media="screen"/>
<link rel="stylesheet" href="static/jquery-ui.css" type="text/css" media="screen"/>
<script src="static/jquery-3.5.1.min.js"></script>
<script src="static/jquery-ui.min.js"></script>
<script src="static/moment.min.js"></script>
@@ -17,35 +18,73 @@
<body>
<?php include 'navbar.php'; ?>
<?php
include 'database.php';
include 'appointment_management.php';
$pdo = connectDatabase();
$patients = listPatients($pdo);
$calendar_settings = fetchCalendarSettings($pdo, $doctor);
$time_ranges = computeTimeRanges($pdo);
?>
<?php if($_SESSION["user_type"] == 2): ?>
$user = finduser($pdo, $_SESSION["user"]);
$events = fetchCalendarEvents($pdo, $user[0][4]);
$holidays = fetchDoctorHolidays($pdo, $user[0][4]);
$calendar_settings = fetchCalendarSettings($pdo, $user[0][4]);
<?php else: ?>
<form name="select_doctor" method="get">
<?php if ($_SESSION["user_type"] == 1 and !isset($_GET["medico"])): ?>
<form name="select_doctor" method="get" action="appointment.php">
<?php $doctors = listDoctors($pdo); ?>
<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>
<button class="create_btn" type="submit" name="select">Seleccionar</button>
</div>
<?php
$events = fetchCalendarEvents($pdo, $_GET["medico"]);
$holidays = fetchDoctorHolidays($pdo, $_GET["medico"]);
$calendar_settings = fetchCalendarSettings($pdo, $_GET["medico"]);
?>
<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>
<button class="create_btn" type="submit" name="select">Seleccionar</button>
</div>
</form>
<?php endif; ?>
<?php closeDatabase($pdo); ?>
<div id="dialog-form" title="Añadir cita" style="display:none;">
<form name="add_appointment" method="post" action="appointment_management.php">
<div class="input-group">
<label for="hora">Hora</label>
<select id="hora" name="hora">
<option>Seleccione una hora</option>
<?php foreach ($time_ranges as $row) : ?>
<option><?php echo $row; ?></option>
<?php endforeach ?>
</select>
</div>
<div class="input-group">
<label for="duracion">Duración</label>
<input type="number" name="duracion" value="<?php echo $calendar_settings[8]; ?>" step="30">
</div>
<div class="input-group">
<label for="observaciones">Observaciones</label>
<input type="text" name="observaciones" value="">
</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[2]; ?></option>
<?php endforeach ?>
</select>
</div>
<button class="create_btn" type="submit" name="create" >Añadir cita</button>
<?php $doctor = fetchDoctor($pdo); ?>
<input type="hidden" name="doctor" value="<?php echo $doctor; ?>">
<input type="hidden" name="fecha" id="fecha">
</form>
<?php closeDatabase($pdo); ?>
</div>
<div class="response"></div>
<div id="calendar"></div>
<div id="event-info" style="display:none;">
<div id="event-patient"/></div>
<div id="event-description"/></div>
<div id="event-start"/></div>
<div id="event-end"/></div>
<form method="post" action="appointment_management.php">
<input type="hidden" name="event_id" id="event_id">
<button class="create_btn" type="submit" name="edit_form">Editar</button>
<button class="del_btn" type="submit" name="delete">Borrar</button>
</form>
</div>
</body>
</html>

View File

@@ -0,0 +1,48 @@
<?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>

44
src/appointment_feed.php Normal file
View File

@@ -0,0 +1,44 @@
<?php
include 'appointment_management.php';
function computeEndTime(&$data)
{
foreach ($data as &$row) {
$time = new DateTime($row["hora"]);
$time->modify("+{$row["duracion"]} minutes");
$time_string = $time->format('H:i:s');
$row += ["end" => $time_string];
}
}
function formatArray($data)
{
computeEndTime($data);
$events = array();
foreach ($data as $row) {
$events[] = array(
"id" => $row["id"],
"title" => $row["apellido"] . ", " . $row["nombre"],
"start" => $row["fecha"] . " " . $row["hora"],
"description" => $row["observaciones"],
"patient" => $row["documento_identificativo"],
"end" => $row["fecha"] . " " . $row["end"],
"overlap" => false,
);
}
return $events;
}
function fetchDatabase()
{
$pdo = connectDatabase();
$data = listEvents($pdo);
closeDatabase($pdo);
return $data;
}
$result = fetchDatabase();
$events = formatArray($result);
echo json_encode($events);

View File

@@ -0,0 +1,130 @@
<?php
include'database.php';
session_start();
function fetchDoctor($pdo)
{
if ($_SESSION["user_type"] == 2) {
$user = finduser($pdo, $_SESSION["user"]);
return $user[0][4];
}
return $_GET["medico"];
}
function listEvents($pdo)
{
$doctor = fetchDoctor($pdo);
$events = fetchCalendarEvents($pdo, $doctor);
return $events;
}
function listHolidays($pdo)
{
$doctor = fetchDoctor($pdo);
$holidays = fetchDoctorHolidays($pdo, $doctor);
return $holidays;
}
function listCalendarSettings($pdo)
{
$doctor = fetchDoctor($pdo);
$calendar_settings = fetchCalendarSettings($pdo, $doctor);
return $calendar_settings;
}
function appointmentCreation()
{
$data = $_POST;
$pdo = connectDatabase();
createAppointment($pdo, $data);
closeDatabase($pdo);
header('location: appointment.php');
}
function appointmentModification()
{
$data = $_POST;
$pdo = connectDatabase();
editAppointment($pdo, $data);
closeDatabase($pdo);
header('location: appointment.php');
}
function appointmentDeletion()
{
$id = $_POST["event_id"];
$pdo = connectDatabase();
deleteAppointment($pdo, $id);
closeDatabase($pdo);
header('location: appointment.php');
}
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"])) {
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"])) {
appointmentModification();
}
if (isset($_POST["delete"])) {
appointmentDeletion();
}

View File

@@ -1,182 +1,71 @@
$(document).ready(function() {
var date = new Date();
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
var calendar = $('#calendar').fullCalendar({
editable: true,
header: {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
events: "events.php",
eventRender: function(event, element, view) {
if (event.allDay === 'true') {
event.allDay = true;
} else {
event.allDay = false;
}
},
selectable: true,
selectHelper: true,
select: function(start, end, allDay) {
var title = prompt('Event Title:');
if (title) {
var start = $.fullCalendar.formatDate(start, "Y-MM-DD HH:mm:ss");
var end = $.fullCalendar.formatDate(end, "Y-MM-DD HH:mm:ss");
$.ajax({
url: 'add_events.php',
data: 'title='+ title+'&start='+ start +'&end='+ end,
type: "POST",
success: function(json) {
alert('Added Successfully');
}
});
calendar.fullCalendar('renderEvent',
{
title: title,
start: start,
end: end,
allDay: allDay
},
true
);
}
calendar.fullCalendar('unselect');
},
editable: true,
eventDrop: function(event, delta) {
var start = $.fullCalendar.formatDate(event.start, "Y-MM-DD HH:mm:ss");
var end = $.fullCalendar.formatDate(event.end, "Y-MM-DD HH:mm:ss");
$.ajax({
url: 'update_events.php',
data: 'title='+ event.title+'&start='+ start +'&end='+ end +'&id='+ event.id ,
type: "POST",
success: function(json) {
alert("Updated Successfully");
}
});
},
eventClick: function(event) {
var decision = confirm("Do you really want to do that?");
if (decision) {
$.ajax({
type: "POST",
url: "delete_event.php",
data: "&id=" + event.id,
success: function(json) {
$('#calendar').fullCalendar('removeEvents', event.id);
alert("Updated Successfully");}
});
}
},
eventResize: function(event) {
var start = $.fullCalendar.formatDate(event.start, "yyyy-MM-dd HH:mm:ss");
var end = $.fullCalendar.formatDate(event.end, "yyyy-MM-dd HH:mm:ss");
$.ajax({
url: 'update_events.php',
data: 'title='+ event.title+'&start='+ start +'&end='+ end +'&id='+ event.id ,
type: "POST",
success: function(json) {
alert("Updated Successfully");
}
});
}
});
});
var queryString = window.location.search;
var calendar = $('#calendar').fullCalendar({
selectable: true,
editable: false,
header: {
left: 'prev,next,today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
},
eventSources: [
"appointment_feed.php" + queryString,
"holiday_feed.php" + queryString
],
select: function(start, end) {
$("#dialog-form").dialog({
modal: true,
width: 450
});
var date = $.fullCalendar.formatDate(start, 'YYYY-MM-DD');
$("#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) {
var start = $.fullCalendar.formatDate(event.start, 'HH:mm');
var end = $.fullCalendar.formatDate(event.end, 'HH:mm');
$("#event_id").val(event.id);
$("#event-patient").html("<b>DNI/NIE: </b>" + event.patient);
$("#event-description").html("<b>Observaciones: </b>" + event.description);
$("#event-start").html("<b>Comienzo: </b>" + start);
$("#event-end").html("<b>Fin: </b>" + end);
$("#event-info").dialog({
title: event.title,
width: 450
});
}
});
});

View File

@@ -32,7 +32,7 @@
$pdo = connectDatabase();
$list = listHolidays($pdo);
$list = fetchHolidays($pdo);
foreach ($list as $row) :
?>

View File

@@ -30,9 +30,40 @@ 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()
{
$data = $_POST;
sanitizeInputs($data);
$pdo = connectDatabase();
configureCalendar($pdo, $data);
closeDatabase($pdo);

View File

@@ -0,0 +1,28 @@
<?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,14 +50,6 @@
<label>Hora fin tarde</label>
<input type="time" name="hora_fin_tarde" value="">
</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">
<label>Sábado hábil</label>
<input type="checkbox" name="sabado_habil" value="1">
@@ -68,7 +60,7 @@
</div>
<div class="input-group">
<label>Duración de cita por defecto</label>
<input type="number" name="duracion_cita_por_defecto" value="">
<input type="number" name="duracion_cita_por_defecto" value="60" step="30">
</div>
<div class="input-group">
<button class="btn" type="submit" name="configure" >Guardar</button>

19
src/change_input_type.js Normal file
View File

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

View File

@@ -23,11 +23,53 @@ function listRows($pdo, $table)
return $result;
}
function fetchLatestRegion($pdo)
{
$query = "SELECT id_provincia FROM provincias ORDER BY id_provincia DESC LIMIT 1;";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetch();
return $data;
}
function fetchLatestCity($pdo)
{
$query = "SELECT id_municipio FROM municipios ORDER BY id_municipio DESC LIMIT 1;";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetch();
return $data;
}
function createRegion($pdo, $data)
{
$query = "INSERT INTO provincias (id_provincia, provincia) VALUES (?,?)";
$row = fetchLatestRegion($pdo);
$last_region = $row["id_provincia"];
$index = $last_region + 1;
$pdo->prepare($query)->execute([$index, $data["provincia2"]]);
return $index;
}
function createCity($pdo, $data, $region)
{
$query = "INSERT INTO municipios (id_provincia, cod_municipio, DC, nombre) VALUES (?,?,?,?)";
$pdo->prepare($query)->execute([$region, 999, 999, $data["localidad2"]]);
$city = fetchLatestCity($pdo);
return $city["id_municipio"];
}
function createPatient($pdo, $data)
{
$query = "INSERT INTO paciente
(nombre, apellido, fecha_de_nacimiento, documento_identificativo, tipo_documento, direccion, localidad, provincia, pais)
VALUES (?,?,?,?,?,?,?,?,?)";
if ($data["provincia"] == "empty" and $data["localidad"] == "empty") {
$region = createRegion($pdo, $data);
$city = createCity($pdo, $data, $region);
$data["provincia"] = $region;
$data["localidad"] = $city;
}
$pdo->prepare($query)->execute([$data["nombre"], $data["apellido"], $data["fecha_de_nacimiento"],
$data["documento_identificativo"], $data["tipo_documento"], $data["direccion"],
$data["localidad"], $data["provincia"], $data["pais"]]);
@@ -38,6 +80,12 @@ function editPatient($pdo, $data, $id)
{
$query = "UPDATE paciente SET nombre=?, apellido=?, fecha_de_nacimiento=?, documento_identificativo=?,
tipo_documento=?, direccion=?, localidad=?, provincia=?, pais=? WHERE id=?";
if ($data["provincia"] == "empty" and $data["localidad"] == "empty") {
$region = createRegion($pdo, $data);
$city = createCity($pdo, $data, $region);
$data["provincia"] = $region;
$data["localidad"] = $city;
}
$result = $pdo->prepare($query);
$result->execute([$data["nombre"], $data["apellido"], $data["fecha_de_nacimiento"],
$data["documento_identificativo"], $data["tipo_documento"], $data["direccion"],
@@ -60,7 +108,7 @@ function deletePatient($pdo, string $id)
function createHoliday($pdo, $data)
{
if (empty($data["medico"])) {
if (!empty($data["medico"])) {
$query = "INSERT INTO festivo (fecha_festivo, tipo_festivo, medico) VALUES (?,?,?)";
$pdo->prepare($query)->execute([$data["fecha_festivo"], $data["tipo_festivo"], $data["medico"]]);
} else {
@@ -138,11 +186,14 @@ function findUser($pdo, $input)
function listPatients($pdo)
{
$query = "SELECT paciente.id, paciente.nombre, paciente.apellido, paciente.fecha_de_nacimiento, paciente.documento_identificativo,
paciente.tipo_documento, paciente.direccion, municipios.nombre, provincias.provincia, paciente.pais, cita.id, informe.titulo
FROM paciente INNER JOIN municipios ON paciente.localidad = municipios.id_municipio
paciente.tipo_documento, paciente.direccion, paises.nombre, provincias.provincia, municipios.nombre,
GROUP_CONCAT(DISTINCT cita.id), GROUP_CONCAT(DISTINCT informe.titulo)
FROM paciente
INNER JOIN paises ON paciente.pais = paises.id
INNER JOIN provincias ON paciente.provincia = provincias.id_provincia
INNER JOIN municipios ON paciente.localidad = municipios.id_municipio
LEFT JOIN cita ON paciente.id=cita.paciente LEFT JOIN informe ON paciente.id=informe.paciente
GROUP BY paciente.id, cita.id, informe.titulo";
GROUP BY paciente.id ORDER BY paciente.id";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
@@ -178,6 +229,16 @@ function fetchCities($pdo, $id)
return $data;
}
function fetchCountries($pdo)
{
$query = "SELECT * FROM paises";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
return $data;
}
function fetchRegions($pdo)
{
$query = "SELECT * FROM provincias";
@@ -187,9 +248,10 @@ function fetchRegions($pdo)
return $data;
}
function listHolidays($pdo)
function fetchHolidays($pdo)
{
$query = "SELECT * FROM festivo";
$query = "SELECT festivo.id, festivo.fecha_festivo, festivo.tipo_festivo, usuario.nombre
FROM festivo LEFT JOIN usuario ON festivo.medico = usuario.id";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
@@ -261,7 +323,9 @@ function fetchPatients($pdo)
function fetchReportData($pdo, string $id)
{
$query = "SELECT * FROM informe WHERE id=?";
$query = "SELECT informe.id, titulo, fecha, hora, paciente , contenido, usuario FROM informe
INNER JOIN usuario ON informe.medico = usuario.id
WHERE informe.id=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
$data = $result->fetch();
@@ -301,10 +365,10 @@ function configureCalendar($pdo, $data)
} else {
$query = "UPDATE calendario SET hora_inicio_mañana=?, hora_fin_mañana=?,
hora_inicio_tarde=?, hora_fin_tarde=?, horario=?, sabado_habil=?, domingo_habil=?,
duracion_cita_por_defecto=?, medico=? WHERE medico=?";
duracion_cita_por_defecto=? WHERE medico=?";
$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["duracion_cita_por_defecto"], $data["medico"], $data["medico"]]);
$data["duracion_cita_por_defecto"], $data["medico"]]);
}
return "Calendario configurado con éxito";
}
@@ -312,10 +376,12 @@ function configureCalendar($pdo, $data)
function fetchCalendarEvents($pdo, $doctor)
{
$query = "SELECT * from cita WHERE medico=?";
$query = "SELECT cita.id, fecha, hora, duracion, medico, observaciones, nombre, apellido, documento_identificativo FROM cita
INNER JOIN paciente ON cita.paciente = paciente.id
WHERE medico=?";
$result = $pdo->prepare($query);
$result->execute([$doctor]);
$data = $result->fetchAll();
$data = $result->fetchAll(PDO::FETCH_ASSOC);
return $data;
}
@@ -325,16 +391,58 @@ function fetchCalendarSettings($pdo, $doctor)
$query = "SELECT * from calendario WHERE medico=?";
$result = $pdo->prepare($query);
$result->execute([$doctor]);
$data = $result->fetch();
$data = $result->fetch(PDO::FETCH_ASSOC);
if (empty($data[8])) {
$data[8] = 60;
}
return $data;
}
function fetchDoctorHolidays($pdo, $doctor)
{
$query = "SELECT * FROM festivo WHERE medico IS NULL OR medico=?";
$query = "SELECT festivo.id, fecha_festivo, tipo_festivo, medico, nombre FROM festivo
INNER JOIN usuario ON festivo.medico = usuario.id;
WHERE medico IS NULL OR medico=?";
$result = $pdo->prepare($query);
$result->execute([$doctor]);
$data = $result->fetchAll();
$data = $result->fetchAll(PDO::FETCH_ASSOC);
return $data;
}
function createAppointment($pdo, $data)
{
$query = "INSERT INTO cita (fecha, hora, duracion, medico, observaciones, paciente) VALUES (?,?,?,?,?,?)";
$pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["duracion"],
$data["doctor"], $data["observaciones"], $data["paciente"]]);
return "Cita creada con éxito";
}
function editAppointment($pdo, $data)
{
$query = "UPDATE cita SET fecha=?, hora=?, duracion=?, observaciones=?, paciente=?
WHERE id=?";
$pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["duracion"],
$data["observaciones"], $data["paciente"], $data["id"]]);
return "Cita modificada con éxito";
}
function deleteAppointment($pdo, $id)
{
$statement = "DELETE FROM cita WHERE id=?";
$pdo->prepare($statement)->execute([$id]);
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;
}

32
src/holiday_feed.php Normal file
View File

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

View File

@@ -28,9 +28,9 @@
<th>Documento identificativo</th>
<th>Tipo de documento</th>
<th>Dirección</th>
<th>Pais</th>
<th>Provincia</th>
<th>Localidad</th>
<th>Pais</th>
<th>Citas</th>
<th>Informes</th>
<th colspan="2">Acciones</th>

View File

@@ -9,6 +9,7 @@
<script src="static/jquery-3.5.1.min.js"></script>
<script src="ajax.js"></script>
<script src="validate_patient.js"></script>
<script src="change_input_type.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
@@ -16,6 +17,7 @@
include 'database.php';
$pdo = connectDatabase();
$countries = fetchCountries($pdo);
$regions = fetchRegions($pdo);
?>
<form name="create_form" method="post" action="patient_management.php" onsubmit="return validatePatient();">
@@ -47,22 +49,30 @@
<input type="text" name="direccion" value="">
</div>
<div class="input-group">
<label>provincia</label>
<select id="provincia" name="provincia">
<?php foreach ($regions as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[1]; ?></option>
<label>pais</label>
<select id="pais" name="pais" onchange="changeInputType();">
<option>Selecciona el país</option>
<?php foreach ($countries as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[2]; ?></option>
<?php endforeach ?>
</select>
</div>
<div class="input-group">
<label>localidad</label>
<select id="localidad" name="localidad">
<option>Selecciona la localidad</option>
<label>provincia</label>
<select id="provincia" name="provincia">
<option value="empty">Selecciona la provincia</option>
<?php foreach ($regions as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[1]; ?></option>
<?php endforeach ?>
</select>
<input type="hidden" id="provincia2" name="provincia2" value="">
</div>
<div class="input-group">
<label>pais</label>
<input type="text" name="pais" value="">
<label>localidad</label>
<select id="localidad" name="localidad">
<option value="empty">Selecciona la localidad</option>
</select>
<input type="hidden" id="localidad2" name="localidad2" value="">
</div>
<div class="input-group">
<button class="btn" type="submit" name="create">Guardar</button>

View File

@@ -6,6 +6,10 @@
<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" />
<script src="static/jquery-3.5.1.min.js"></script>
<script src="ajax.js"></script>
<script src="validate_patient.js"></script>
<script src="change_input_type.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
@@ -14,8 +18,10 @@
$pdo = connectDatabase();
$data = fetchPatientData($pdo, $_GET["edit"]);
$countries = fetchCountries($pdo);
$regions = fetchRegions($pdo);
?>
<form method="post" action="patient_management.php">
<form method="post" action="patient_management.php" onsubmit="return validatePatient();">
<div class="input-group">
<label>Nombre</label>
<input type="text" name="nombre" value="<?php echo $data[1]; ?>">
@@ -44,16 +50,30 @@
<input type="text" name="direccion" value="<?php echo $data[6]; ?>">
</div>
<div class="input-group">
<label>localidad</label>
<input type="text" name="localidad" value="<?php echo $data[7]; ?>">
<label>pais</label>
<select id="pais" name="pais" onchange="changeInputType();">
<option>Selecciona el país</option>
<?php foreach ($countries as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[2]; ?></option>
<?php endforeach ?>
</select>
</div>
<div class="input-group">
<label>provincia</label>
<input type="text" name="provincia" value="<?php echo $data[8]; ?>">
<select id="provincia" name="provincia">
<option value="empty">Selecciona la provincia</option>
<?php foreach ($regions as $row) : ?>
<option value="<?php echo $row[0]; ?>"><?php echo $row[1]; ?></option>
<?php endforeach ?>
</select>
<input type="hidden" id="provincia2" name="provincia2" value="">
</div>
<div class="input-group">
<label>pais</label>
<input type="text" name="pais" value="<?php echo $data[9]; ?>">
<label>localidad</label>
<select id="localidad" name="localidad">
<option value="empty">Selecciona la localidad</option>
</select>
<input type="hidden" id="localidad2" name="localidad2" value="">
</div>
<div class="input-group">
<button class="btn" type="submit" name="edit" >Editar</button>

48
src/print_page.js Normal file
View File

@@ -0,0 +1,48 @@
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,6 +7,9 @@
<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" />
<script src="static/jquery-3.5.1.min.js"></script>
<script src="static/jspdf.min.js"></script>
<script src="print_page.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
@@ -25,14 +28,13 @@
<th>Hora</th>
<th>Paciente</th>
<th>Médico</th>
<th colspan="2">Acciones</th>
<th colspan="3">Acciones</th>
</tr>
</thead>
<?php
include 'database.php';
$pdo = connectDatabase();
$list = listReports($pdo);
foreach ($list as $row) :
@@ -49,6 +51,12 @@
<td>
<a href="report_management.php?delete=<?php echo $row[0]; ?>" class="del_btn">Borrar</a>
</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>
<?php endforeach ?>
<?php closeDatabase($pdo); ?>

38
src/report_content.php Normal file
View File

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

View File

@@ -14,6 +14,7 @@
$pdo = connectDatabase();
$data = fetchReportData($pdo, $_GET["edit"]);
$list = listPatients($pdo);
?>
<form name="create_form" method="post" action="report_management.php">
<div class="input-group">

View File

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

BIN
src/static/cover.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

1311
src/static/jquery-ui.css vendored Normal file

File diff suppressed because it is too large Load Diff

286
src/static/jspdf.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -81,7 +81,7 @@ form {
.edit_btn {
text-decoration: none;
padding: 2px 5px;
background: #2E8B57;
background: #0d841f;
color: white;
border-radius: 3px;
}
@@ -134,7 +134,7 @@ main {
text-align: center;
color: white;
background-image: linear-gradient(rgba(0, 0, 0, 0.5),rgba(0, 0, 0, 0.5)), url('https://www.pepperconstruction.com/sites/default/files/images/pmc1.jpg');
background-image: linear-gradient(rgba(0, 0, 0, 0.5),rgba(0, 0, 0, 0.5)), url('cover.jpg');
background-size: cover;
background-position: center center;
background-repeat: no-repeat;
@@ -155,7 +155,7 @@ main {
}
#calendar {
max-width: 700px;
max-width: 600px;
margin: auto;
margin-top: 60px;
}

View File

@@ -1,66 +1,68 @@
function checkDNI(dni) {
var number, let, letter;
var number,
let, letter;
var regex = /^[XYZ]?\d{5,8}[A-Z]$/;
dni = dni.toUpperCase();
if(regex.test(dni) === true){
number = dni.substr(0,dni.length-1);
if (regex.test(dni) === true) {
number = dni.substr(0, dni.length - 1);
number = number.replace('X', 0);
number = number.replace('Y', 1);
number = number.replace('Z', 2);
let = dni.substr(dni.length-1, 1);
let = dni.substr(dni.length - 1, 1);
number = number % 23;
letter = 'TRWAGMYFPDXBNJZSQVHLCKET';
letter = letter.substring(number, number+1);
if (letter != let) {
letter = letter.substring(number, number + 1);
if (letter !=
let) {
return false;
}else{
} else {
return true;
}
return false;
}
}
function validateString(input){
if(input == ""){
function validateString(input) {
if (input == "") {
return false;
}
return true;
}
function validatePatient(){
function validatePatient() {
var name = document.forms["create_form"]["nombre"];
var last_name = document.forms["create_form"]["apellido"];
var dni = document.forms["create_form"]["documento_identificativo"];
var address = document.forms["create_form"]["direccion"];
var country = document.forms["create_form"]["pais"];
if(!checkDNI(dni.value)){
if (!checkDNI(dni.value)) {
alert("El DNI/NIE no es correcto");
return false;
}
if(!validateString(name.value)){
if (!validateString(name.value)) {
alert("Introduce el nombre");
return false;
}
if(!validateString(last_name.value)){
if (!validateString(last_name.value)) {
alert("Introduce el apellido");
return false;
}
if(!validateString(address.value)){
if (!validateString(address.value)) {
alert("Introduce la dirección");
return false;
}
if(!validateString(country.value)){
if (!validateString(country.value)) {
alert("Introduce el país");
return false;
}
return true;
}
}

View File

@@ -1,22 +1,22 @@
function validateString(input){
if(input == ""){
function validateString(input) {
if (input == "") {
return false;
}
return true;
}
function validateReport(){
function validateReport() {
var title = document.forms["create_form"]["titulo"];
var content = document.forms["create_form"]["contenido"];
if(!validateString(title.value)){
if (!validateString(title.value)) {
alert("Introduce el título");
return false;
}
if(!validateString(content.value)){
if (!validateString(content.value)) {
alert("Introduce el contenido");
return false;
}
return true;
}
}

View File

@@ -1,63 +1,63 @@
function validateString(input){
if(input == ""){
function validateString(input) {
if (input == "") {
return false;
}
return true;
}
function validateEmail(input){
function validateEmail(input) {
var emailID = input;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 )) {
if (atpos < 1 || (dotpos - atpos < 2)) {
return false;
}
return true;
}
function validateUser(){
function validateUser() {
var name = document.forms["create_form"]["nombre"];
var user = document.forms["create_form"]["usuario"];
var password = document.forms["create_form"]["contraseña"];
var email = document.forms["create_form"]["correo"];
if(!validateString(name.value)){
if (!validateString(name.value)) {
alert("Introduce el nombre");
return false;
}
if(!validateString(user.value)){
if (!validateString(user.value)) {
alert("Introduce el usuario");
return false;
}
if(!validateString(password.value)){
if (!validateString(password.value)) {
alert("Introduce la contraseña");
return false;
}
if(!validateEmail(email.value)){
if (!validateEmail(email.value)) {
alert("El correo proporcionado es incorrecto");
return false;
}
return true;
}
function validateLogin(){
function validateLogin() {
var user = document.forms["login_form"]["usuario"];
var password = document.forms["login_form"]["contraseña"];
if(!validateString(user.value)){
if (!validateString(user.value)) {
alert("Introduce el usuario");
return false;
}
if(!validateString(password.value)){
if (!validateString(password.value)) {
alert("Introduce la contraseña");
return false;
}
return true;
}
}