Compare commits

..

64 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
f591cb5f2f Allow admins to select a doctor's appointments 2020-06-25 20:01:41 +02:00
270e4ec03d Add appointment calendar queries 2020-06-25 17:59:56 +02:00
095f22f60f Remove redundant fullcalendar cruft 2020-06-23 01:04:59 +02:00
befa3b116b Reformat PHP code via php-cs-fixer 2020-06-22 23:01:17 +02:00
ea9f92d2df Restrict calendar setup to the own doctor 2020-06-22 02:18:45 +02:00
35d2b70ab6 Add calendar configuration for each doctor 2020-06-22 01:50:08 +02:00
229b03a3c9 Add log out functionality 2020-06-21 21:40:25 +02:00
6f3d570285 Add default calendar values 2020-06-21 20:38:32 +02:00
e5c6e2d6a2 Move search bar to the top 2020-06-21 20:38:22 +02:00
554baf39ff Start the web server inside the src directory 2020-06-21 19:36:38 +02:00
222194f1f1 Include navbar in all files and flatten directory 2020-06-20 15:09:23 +02:00
7106239d88 Execute PHP internal web-server on nix-shell 2020-06-18 15:59:21 +02:00
ac456c2328 Add project summary 2020-06-18 15:11:36 +02:00
b796f6bf47 Add log in functionality 2020-06-18 14:48:12 +02:00
1b80190b11 Add home page and navigation bar 2020-06-18 13:25:47 +02:00
cfdf2e8ebc Implement report CRUD functionalities 2020-06-18 12:24:13 +02:00
0127b3014f Add appointment management with a calendar 2020-06-18 10:35:01 +02:00
be7b5d2718 Add holiday CRUD operations 2020-06-18 09:04:44 +02:00
095b639794 Add user creation form validation 2020-06-18 08:12:23 +02:00
77e604d385 Add patient creation form validation 2020-06-18 08:06:39 +02:00
322a464eb7 Add national ID document validation 2020-06-18 07:35:57 +02:00
68b528b960 Implement dynamic dependent location select boxes 2020-06-17 22:02:27 +02:00
61e1f18f42 Add reports and appointments to the patients list 2020-06-17 12:10:21 +02:00
a390660a19 Hide back button if not in search mode 2020-06-17 08:45:18 +02:00
fb430dd8cc Implement CRUD operations for patients 2020-06-17 08:42:53 +02:00
da6c518d59 Add back button in user page 2020-06-17 05:39:19 +02:00
67417b0bfc Implement user searching 2020-06-17 05:34:36 +02:00
e77f29b393 Remove arguments on database connection function 2020-06-17 04:33:48 +02:00
e6b26d963b Implement update and delete user 2020-06-17 04:10:09 +02:00
219f440b26 Move user creation from to a separate file 2020-06-17 01:02:47 +02:00
29c6d7bb6d List users from database 2020-06-16 22:50:35 +02:00
bb1b2f077b Add user creation functionality 2020-06-16 18:56:54 +02:00
26cdb78296 Fix PDO insert statements 2020-06-16 18:56:35 +02:00
57 changed files with 14147 additions and 188 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,10 +0,0 @@
* MDIS
This project consists of an Information System for a Medical Institution.
** Technologies
- PHP
- MariaDB
- Nginx
- Docker

View File

@@ -1,4 +1,4 @@
CREATE DATABASE IF NOT EXISTS practica CHARACTER SET utf8;
CREATE DATABASE IF NOT EXISTS practica CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS practica IDENTIFIED BY 'practica';
@@ -8,33 +8,44 @@ GRANT ALL PRIVILEGES ON practica.* TO practica@localhost;
USE practica;
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,
apellido VARCHAR(50) NOT NULL,
fecha_de_nacimiento DATE NOT NULL,
documento_identificativo VARCHAR(50) PRIMARY KEY,
documento_identificativo VARCHAR(50) UNIQUE NOT NULL,
tipo_documento VARCHAR(10) NOT NULL,
direccion VARCHAR(255) NOT NULL,
localidad VARCHAR(100) NOT NULL,
provincia VARCHAR(50) NOT NULL,
pais VARCHAR(100) NOT NULL
localidad SMALLINT(6) UNSIGNED,
provincia SMALLINT(6),
pais VARCHAR(100) NOT NULL,
FOREIGN KEY (localidad)
REFERENCES municipios(id_municipio),
FOREIGN KEY (provincia)
REFERENCES provincias(id_provincia)
);
CREATE TABLE IF NOT EXISTS rol(
codigo INT PRIMARY KEY,
nombre VARCHAR(25) NOT NULL
);
CREATE TABLE IF NOT EXISTS usuario(
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
usuario VARCHAR(50) PRIMARY KEY,
usuario VARCHAR(50) UNIQUE,
contraseña VARCHAR(100) NOT NULL,
rol INT NOT NULL,
especialidad VARCHAR(50),
correo VARCHAR(100) NOT NULL,
fecha_alta TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
fecha_baja TIMESTAMP,
fecha_baja TIMESTAMP NULL,
FOREIGN KEY (rol)
REFERENCES rol(codigo)
);
@@ -44,53 +55,59 @@ CREATE TABLE IF NOT EXISTS festivo (
id INT PRIMARY KEY AUTO_INCREMENT,
fecha_festivo DATE NOT NULL,
tipo_festivo VARCHAR(15) NOT NULL,
medico VARCHAR(50),
medico INT DEFAULT NULL,
FOREIGN KEY (medico)
REFERENCES usuario(usuario)
REFERENCES usuario(id)
);
CREATE TABLE IF NOT EXISTS calendario (
id INT NOT NULL AUTO_INCREMENT,
id INT AUTO_INCREMENT,
hora_inicio_mañana TIME,
hora_fin_mañana TIME,
hora_inicio_tarde TIME,
hora_fin_tarde TIME,
horario VARCHAR(15) NOT NULL,
sabado_habil BOOLEAN,
domingo_habil BOOLEAN,
sabado_habil BOOLEAN DEFAULT FALSE,
domingo_habil BOOLEAN DEFAULT FALSE,
duracion_cita_por_defecto INT,
medico VARCHAR(50),
medico INT,
PRIMARY KEY (id, medico),
FOREIGN KEY (medico)
REFERENCES usuario(usuario)
REFERENCES usuario(id)
);
CREATE TABLE IF NOT EXISTS cita(
id INT NOT NULL AUTO_INCREMENT,
id INT AUTO_INCREMENT,
fecha DATE NOT NULL,
hora TIME NOT NULL,
duracion INT,
medico VARCHAR(50) NOT NULL,
medico INT NOT NULL,
observaciones VARCHAR(255),
paciente VARCHAR(50),
paciente INT NOT NULL,
PRIMARY KEY (id, medico),
FOREIGN KEY (medico)
REFERENCES usuario(usuario),
REFERENCES usuario(id),
FOREIGN KEY (paciente)
REFERENCES paciente(documento_identificativo)
REFERENCES paciente(id)
);
CREATE TABLE IF NOT EXISTS informe(
id INT NOT NULL AUTO_INCREMENT,
id INT AUTO_INCREMENT,
fecha DATE NOT NULL,
hora TIME NOT NULL,
paciente VARCHAR(50) NOT NULL,
paciente INT NOT NULL,
titulo VARCHAR(100) NOT NULL,
contenido VARCHAR(255) NOT NULL,
medico VARCHAR(50) NOT NULL,
medico INT NOT NULL,
PRIMARY KEY (id, paciente),
FOREIGN KEY (medico)
REFERENCES usuario(usuario),
REFERENCES usuario(id),
FOREIGN KEY (paciente)
REFERENCES paciente(documento_identificativo)
REFERENCES paciente(id)
);
INSERT INTO rol (codigo, nombre) VALUES (1, "administrativo");
INSERT INTO rol (codigo, nombre) VALUES (2, "medico");
INSERT INTO usuario (nombre, usuario, contraseña, correo, rol) VALUES ("Sysadmin", "admin", "chimba", "admin@example.com", 1);
INSERT INTO usuario (nombre, usuario, contraseña, correo, rol) VALUES ("Nabil", "nabil", "menisco","doctor@example.com", 2);

8144
database/municipios.sql Executable file

File diff suppressed because it is too large Load Diff

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');

75
database/provincias.sql Executable file
View File

@@ -0,0 +1,75 @@
# ------------------------------------------------------------
# Listado de provincias españolas 2012.
#
# Datos extraídos del INE (Instituo Nacional de Estadística).
#
# El campo id_provincia debería coincidir con los dos primeros dígitos del código postal
# de la provincia. Los que tienen un dígito, añadir el 0 delante.
#
# Ejemplo:
# Dado un código postal 08031, tomamos los dos primeros dígitos (08) y vemos que pertenence a prov. Barcelona,
# Similarmente el código postal 44652 => 44 => província de Teruel
#
# Albert Lombarte
# Twitter: @alombarte
# ------------------------------------------------------------
CREATE TABLE `provincias` (
`id_provincia` smallint(6) PRIMARY KEY,
`provincia` varchar(30) DEFAULT NULL
) ENGINE=InnoDB;
INSERT INTO `provincias` (`id_provincia`, `provincia`)
VALUES
(2,'Albacete'),
(3,'Alicante/Alacant'),
(4,'Almería'),
(1,'Araba/Álava'),
(33,'Asturias'),
(5,'Ávila'),
(6,'Badajoz'),
(7,'Balears, Illes'),
(8,'Barcelona'),
(48,'Bizkaia'),
(9,'Burgos'),
(10,'Cáceres'),
(11,'Cádiz'),
(39,'Cantabria'),
(12,'Castellón/Castelló'),
(51,'Ceuta'),
(13,'Ciudad Real'),
(14,'Córdoba'),
(15,'Coruña, A'),
(16,'Cuenca'),
(20,'Gipuzkoa'),
(17,'Girona'),
(18,'Granada'),
(19,'Guadalajara'),
(21,'Huelva'),
(22,'Huesca'),
(23,'Jaén'),
(24,'León'),
(27,'Lugo'),
(25,'Lleida'),
(28,'Madrid'),
(29,'Málaga'),
(52,'Melilla'),
(30,'Murcia'),
(31,'Navarra'),
(32,'Ourense'),
(34,'Palencia'),
(35,'Palmas, Las'),
(36,'Pontevedra'),
(26,'Rioja, La'),
(37,'Salamanca'),
(38,'Santa Cruz de Tenerife'),
(40,'Segovia'),
(41,'Sevilla'),
(42,'Soria'),
(43,'Tarragona'),
(44,'Teruel'),
(45,'Toledo'),
(46,'Valencia/València'),
(47,'Valladolid'),
(49,'Zamora'),
(50,'Zaragoza');

113
docs/Project.org Normal file
View File

@@ -0,0 +1,113 @@
#+TITLE: MDIS
#+SUBTITLE: Programación Web
#+AUTHOR: Amin Kasrou Aouam
#+DATE: 2020-07-16
#+PANDOC_OPTIONS: template:~/.pandoc/templates/eisvogel.latex
#+PANDOC_OPTIONS: listings:t
#+PANDOC_OPTIONS: toc:t
#+PANDOC_METADATA: lang=es
#+PANDOC_METADATA: titlepage:t
#+PANDOC_METADATA: listings-no-page-break:t
#+PANDOC_METADATA: toc-own-page:t
#+PANDOC_METADATA: table-use-row-colors:t
#+PANDOC_METADATA: logo:/home/coolneng/Photos/Logos/UGR.png
* MDIS
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
** Tecnologías
- PHP
- MySQL
- Javascript
- Fullcalendar
- Jquery
- JqueryUI
- Nix
** Arquitectura
#+CAPTION: Arquitectura del sistema
[[./assets/F1.png]]
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.
** 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 define el entorno de desarrollo:
#+BEGIN_SRC nix
{ pkgs ? import <nixpkgs> { } }:
with pkgs;
mkShell {
# Definición de los paquetes
buildInputs = [ php74 php74Extensions.pdo_mysql mysql57 ];
# Comandos que se ejecutan al entrar en la nix-shell
shellHook = ''
pkill mysql
rm -rf .mysql && mkdir .mysql
mysqld --datadir="$(pwd)/.mysql" --socket="$(pwd)/.mysql/mysql.sock" --initialize-insecure
mysqld --datadir="$(pwd)/.mysql" --socket="$(pwd)/.mysql/mysql.sock" --skip-networking &
sleep 1
mysql --socket="$(pwd)/.mysql/mysql.sock" -u root < $(pwd)/database/db.sql
alias mysql='mysql --socket="$(pwd)/.mysql/mysql.sock" -u root'
php -S localhost:8000
'';
}
#+END_SRC
Como podemos ver, /Nix/ nos permite:
- Instalar las dependencias necesarias, en el ámbito de una shell
- Ejecutar una base de datos temporal
- Inicializar la base de datos
- Lanzar el servidor web interno de PHP (se podría reemplazar por Apache/Nginx/...)
El único comando que tenemos que ejecutar es:
#+BEGIN_SRC shell
nix-shell
#+END_SRC
Y ya dispondremos de un sistema funcional, y accesible en la URL *localhost:8000*.

BIN
docs/Project.pdf Normal file

Binary file not shown.

BIN
docs/assets/F1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -1,27 +0,0 @@
<!doctype html>
<html class="no-js" lang="es">
<head>
<meta charset="utf-8">
<title>MDIS</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto"/>
</head>
<body>
<header>
<nav>
<ul class="navbar-left">
<li class="list"><a href="">Home</a></li>
<li class="list"><a href="">Calendar</a></li>
<li class="list"><a href="">Appointments</a></li>
</ul>
<ul class="navbar-right">
<li class="list"><a href="">Login</a></li>
</ul>
</nav>
</header>
<footer>
</footer>
</body>
</html>

View File

@@ -1,81 +0,0 @@
* {
font-family: Roboto, Mono;
font-size: 14px;
}
table{
width: 50%;
margin: 30px auto;
border-collapse: collapse;
text-align: left;
}
tr {
border-bottom: 1px solid #cbcbcb;
}
th, td{
border: none;
height: 30px;
padding: 2px;
}
tr:hover {
background: #F5F5F5;
}
form {
width: 45%;
margin: 50px auto;
text-align: left;
padding: 20px;
border: 1px solid #bbbbbb;
border-radius: 5px;
}
.input-group {
margin: 10px 0px 10px 0px;
}
.input-group label {
display: block;
text-align: left;
margin: 3px;
}
.input-group input {
height: 30px;
width: 93%;
padding: 5px 10px;
font-size: 16px;
border-radius: 5px;
border: 1px solid gray;
}
.btn {
padding: 10px;
font-size: 15px;
color: white;
background: #5F9EA0;
border: none;
border-radius: 5px;
}
.edit_btn {
text-decoration: none;
padding: 2px 5px;
background: #2E8B57;
color: white;
border-radius: 3px;
}
.del_btn {
text-decoration: none;
padding: 2px 5px;
color: white;
border-radius: 3px;
background: #800000;
}
.msg {
margin: 30px auto;
padding: 10px;
border-radius: 5px;
color: #3c763d;
background: #dff0d8;
border: 1px solid #3c763d;
width: 50%;
text-align: center;
}

View File

@@ -16,5 +16,8 @@ mkShell {
mysql --socket="$(pwd)/.mysql/mysql.sock" -u root < $(pwd)/database/db.sql
alias mysql='mysql --socket="$(pwd)/.mysql/mysql.sock" -u root'
cd src
php -S localhost:8000
'';
}

16
src/ajax.js Normal file
View File

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

13
src/ajax.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
include 'database.php';
if ($_POST['id']) {
$pdo = connectDatabase();
$cities = fetchCities($pdo, $_POST['id']);
foreach ($cities as $row) {
echo '"<option value="'.$row[0].'">'.$row[4].'</option>';
}
closeDatabase($pdo);
}

90
src/appointment.php Normal file
View File

@@ -0,0 +1,90 @@
<?php session_start(); ?>
<html class="no-js" lang="es">
<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"/>
<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>
<script src="static/fullcalendar.min.js"></script>
<script src="calendar.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
<?php
include 'appointment_management.php';
$pdo = connectDatabase();
$patients = listPatients($pdo);
$calendar_settings = fetchCalendarSettings($pdo, $doctor);
$time_ranges = computeTimeRanges($pdo);
?>
<?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>
</form>
<?php endif; ?>
<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();
}

71
src/calendar.js Normal file
View File

@@ -0,0 +1,71 @@
$(document).ready(function() {
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
});
}
});
});

54
src/calendar.php Normal file
View File

@@ -0,0 +1,54 @@
<?php session_start(); ?>
<html class="no-js" lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de festivos</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'; ?>
<div>
<form method="post" action="calendar_management.php">
<div class="search-group">
<a href="holiday_create_form.php" class="create_btn" >Añadir festivo</a>
<a href="calendar_setup_form.php" class="create_btn" >Configurar calendario</a>
</div>
</form>
</div>
<table>
<thead>
<tr>
<th>Fecha</th>
<th>Tipo</th>
<th>Medico</th>
<th colspan="2">Acciones</th>
</tr>
</thead>
<?php
include 'database.php';
$pdo = connectDatabase();
$list = fetchHolidays($pdo);
foreach ($list as $row) :
?>
<tr>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td>
<a href="holiday_edit_form.php?edit=<?php echo $row[0]; ?>" class="edit_btn">Editar</a>
</td>
<td>
<a href="calendar_management.php?delete=<?php echo $row[0]; ?>" class="del_btn">Borrar</a>
</td>
</tr>
<?php endforeach ?>
<?php closeDatabase($pdo); ?>
</table>
</body>
</html>

View File

@@ -0,0 +1,88 @@
<?php
include'database.php';
function holidayCreation()
{
$data = $_POST;
$pdo = connectDatabase();
createHoliday($pdo, $data);
closeDatabase($pdo);
header('location: calendar.php');
}
function holidayModification()
{
$data = $_POST;
$id = $_POST["id"];
$pdo = connectDatabase();
editHoliday($pdo, $data, $id);
closeDatabase($pdo);
header('location: calendar.php');
}
function holidayDeletion()
{
$id = $_GET["delete"];
$pdo = connectDatabase();
deleteHoliday($pdo, $id);
closeDatabase($pdo);
header('location: calendar.php');
}
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);
header('location: calendar.php');
}
if (isset($_POST["create"])) {
holidayCreation();
}
if (isset($_POST["edit"])) {
holidayModification();
}
if (isset($_GET["delete"])) {
holidayDeletion();
}
if (isset($_POST["configure"])) {
calendarConfig();
}

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

@@ -0,0 +1,69 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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();
$doctors = listDoctors($pdo);
closeDatabase($pdo);
?>
<form name="create_form" method="post" action="calendar_management.php">
<?php
if ($_SESSION["user_type"] == 2):
$pdo = connectDatabase();
$user = finduser($pdo, $_SESSION["user"]);
closeDatabase($pdo);
?>
<input type="hidden" id="medico" name="medico" value="<?php echo $user[0][4]; ?>">
<?php else: ?>
<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>
<?php endif; ?>
<div class="input-group">
<label>Hora inicio mañana</label>
<input type="time" name="hora_inicio_mañana" value="">
</div>
<div class="input-group">
<label>Hora fin mañana</label>
<input type="time" name="hora_fin_mañana" value="">
</div>
<div class="input-group">
<label>Hora inicio tarde</label>
<input type="time" name="hora_inicio_tarde" value="">
</div>
<div class="input-group">
<label>Hora fin tarde</label>
<input type="time" name="hora_fin_tarde" value="">
</div>
<div class="input-group">
<label>Sábado hábil</label>
<input type="checkbox" name="sabado_habil" value="1">
</div>
<div class="input-group">
<label>Domingo hábil</label>
<input type="checkbox" name="domingo_habil" value="1">
</div>
<div class="input-group">
<label>Duración de cita por defecto</label>
<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>
</div>
</form>
</body>

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

@@ -1,95 +1,448 @@
<?php
function connectDatabase(str $user, str $pass, str $db) {
$unix_socket = '.mysql/mysql.sock';
function connectDatabase()
{
$connection = 'unix_socket';
$host = '../.mysql/mysql.sock';
$charset = 'utf8mb4';
$dsn = "mysql:unix_socket=$unix_socket;dbname=$db;charset=$charset";
$pdo = new PDO($dsn, $user, $pass);
$db = 'practica';
$dsn = "mysql:$connection=$host;dbname=$db;charset=$charset";
$pdo = new PDO($dsn, "practica", "practica");
return $pdo;
}
function closeDatabase($pdo) {
function closeDatabase($pdo)
{
$pdo = null;
}
function displayResults($query) {
while($row = $query->fetch()){
echo $row . "\n";
}
}
function listRows($pdo, $table) {
function listRows($pdo, $table)
{
$query = "SELECT * FROM ?";
$result = $pdo->prepare($query)->execute([$table]);
displayResults($query);
return $result;
}
function findRows($pdo, str $table, str $attr, str $param) {
$query = "SELECT * FROM ? WHERE ? = ?";
$result = $pdo->prepare($query)->execute([$table, $attr, $param]);
displayResults($query);
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 createPatient($pdo, $data) {
$query = "INSERT INTO paciente (nombre, apellido, fecha_de_nacimiento, documento_identificativo, tipo_documento, direccion, localidad, provincia, pais) VALUES (? ? ? ? ? ? ? ? ?)";
$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"]]);
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"]]);
return "Paciente creado con éxito";
}
function editPatient($pdo, str $attr, str $param, str $id) {
$query = "UPDATE paciente SET ? = ? WHERE documento_identificativo = ?";
$pdo->prepare($query)->execute([$attr, $param, $id]);
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"],
$data["localidad"], $data["provincia"], $data["pais"], $id]);
return "Paciente modificado con éxito";
}
function deletePatient($pdo, str $id) {
function deletePatient($pdo, string $id)
{
$check = "SELECT * FROM informes where paciente = ?";
$result = $pdo->prepare($check)->execute([$id]);
if($result->columnCount() == 0){
$statement = "DELETE FROM paciente where document_identificado = ?";
$result = $pdo->prepare($check);
$result->execute([$id]);
if ($result->columnCount() == 0) {
$statement = "DELETE FROM paciente where id=?";
$pdo->prepare($statement)->execute([$id]);
return "El paciente se ha eliminado correctamente";
}
return "No se puede eliminar el paciente dado que tiene citas";
}
function createHoliday($pdo, $data) {
$query = "INSERT INTO festivo (fecha_festivo, tipo_festivo, medico) VALUES (? ? ?)";
function createHoliday($pdo, $data)
{
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 {
$query = "INSERT INTO festivo (fecha_festivo, tipo_festivo) VALUES (?,?)";
$pdo->prepare($query)->execute([$data["fecha_festivo"], $data["tipo_festivo"]]);
}
return "Festivo creado con éxito";
}
function editHoliday($pdo, $attr, $param, $id) {
$query = "UPDATE festivo SET ? = ? WHERE id = ?";
$pdo->prepare($query)->execute([$attr, $param, $id]);
function editHoliday($pdo, $data, $id)
{
$query = "UPDATE festivo SET fecha_festivo=?, tipo_festivo=?, medico=? WHERE id=?";
$pdo->prepare($query)->execute([$data["fecha_festivo"], $data["tipo_festivo"], $data["medico"], $id]);
return "Festivo modificado con éxito";
}
function deleteHoliday($pdo, str $id) {
$statement = "DELETE FROM festivo where id = ?";
function deleteHoliday($pdo, $id)
{
$statement = "DELETE FROM festivo where id=?";
$pdo->prepare($statement)->execute([$id]);
return "Festivo borrado con éxito";
}
function createUser($pdo, $data) {
$query = "INSERT INTO usuario (nombre, usuario, contraseña, rol, correo) VALUES (? ? ? ? ?)";
function createUser($pdo, $data)
{
$query = "INSERT INTO usuario (nombre, usuario, contraseña, rol, correo) VALUES (?,?,?,?,?)";
$pdo->prepare($query)->execute([$data["nombre"], $data["usuario"], $data["contraseña"], $data["rol"], $data["correo"]]);
return "Usuario creado con éxito";
}
function editUser($pdo, $attr, $param, $id) {
$query = "UPDATE usuario SET ? = ? WHERE usuario = ?";
$pdo->prepare($query)->execute([$attr, $param, $id]);
function editUser($pdo, $data, $id)
{
$query = "UPDATE usuario SET nombre=?, usuario=?, contraseña=?, rol=?, correo=? WHERE id=?";
$result = $pdo->prepare($query);
$result->execute([$data["nombre"], $data["usuario"], $data["contraseña"], $data["rol"], $data["correo"], $id]);
return "Usuario modificado con éxito";
}
function deactivateUser($pdo, str $id) {
editUser($pdo, "fecha_baja", "CURRENT_TIMESTAMP", $id);
function deactivateUser($pdo, $data, $id)
{
$query = "UPDATE usuario SET fecha_baja=now() WHERE id=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
return "Usuario desactivado con éxito";
}
function listAppointments($pdo, str $doctor) {
findRows($pdo, "cita", "medico", $doctor);
function listUsers($pdo)
{
$query = "SELECT usuario.nombre, usuario.usuario, rol.nombre, usuario.correo, usuario.id, fecha_baja FROM usuario
INNER JOIN rol ON usuario.rol = rol.codigo";
$result = $pdo->query($query)->fetchAll();
return $result;
}
?>
function fetchUserData($pdo, string $id)
{
$query = "SELECT * FROM usuario WHERE id=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
$data = $result->fetch();
return $data;
}
function findUser($pdo, $input)
{
$input = "%$input%";
$query = "SELECT usuario.nombre, usuario.usuario, rol.nombre, usuario.correo, usuario.id, fecha_baja
FROM usuario, rol WHERE usuario.rol=rol.codigo AND (usuario.nombre LIKE ? OR usuario.usuario LIKE ? OR usuario.correo LIKE ?)";
$result = $pdo->prepare($query);
$result->execute([$input, $input, $input]);
$data = $result->fetchAll();
return $data;
}
function listPatients($pdo)
{
$query = "SELECT paciente.id, paciente.nombre, paciente.apellido, paciente.fecha_de_nacimiento, paciente.documento_identificativo,
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 ORDER BY paciente.id";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
return $data;
}
function fetchPatientData($pdo, string $id)
{
$query = "SELECT * FROM paciente WHERE id=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
$data = $result->fetch();
return $data;
}
function findPatient($pdo, $input)
{
$input = "%$input%";
$query = "SELECT * FROM paciente WHERE nombre LIKE ? OR apellido LIKE ? OR documento_identificativo LIKE ?";
$result = $pdo->prepare($query);
$result->execute([$input, $input, $input]);
$data = $result->fetchAll();
return $data;
}
function fetchCities($pdo, $id)
{
$query = "SELECT * FROM municipios WHERE id_provincia=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
$data = $result->fetchAll();
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";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
return $data;
}
function fetchHolidays($pdo)
{
$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();
return $data;
}
function listDoctors($pdo)
{
$query = "SELECT * FROM usuario where rol=2";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
return $data;
}
function fetchHolidayData($pdo, string $id)
{
$query = "SELECT * FROM festivo WHERE id=?";
$result = $pdo->prepare($query);
$result->execute([$id]);
$data = $result->fetch();
return $data;
}
function listReports($pdo)
{
$query = "SELECT informe.id, informe.titulo, informe.fecha, informe.hora, paciente.apellido,
usuario.nombre FROM informe INNER JOIN paciente ON paciente.id = informe.paciente
INNER JOIN usuario ON usuario.id = informe.medico";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
return $data;
}
function createReport($pdo, $data)
{
$query = "INSERT INTO informe
(fecha, hora, paciente, titulo, contenido, medico)
VALUES (?,?,?,?,?,?)";
$pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["paciente"],
$data["titulo"], $data["contenido"], $data["medico"]]);
return "Informe creado con éxito";
}
function editReport($pdo, $data, $id)
{
$query = "UPDATE informe SET fecha=?, hora=?, paciente=?, titulo=?, contenido=?, medico=? WHERE id=?";
$pdo->prepare($query)->execute([$data["fecha"], $data["hora"], $data["paciente"],
$data["titulo"], $data["contenido"], $data["medico"], $id]);
return "Informe modificado con éxito";
}
function deleteReport($pdo, $id)
{
$statement = "DELETE FROM informe where id=?";
$pdo->prepare($statement)->execute([$id]);
return "Informe borrado con éxito";
}
function fetchPatients($pdo)
{
$query = "SELECT id, apellido from paciente";
$result = $pdo->prepare($query);
$result->execute();
$data = $result->fetchAll();
return $data;
}
function fetchReportData($pdo, string $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();
return $data;
}
function fetchLoginData($pdo, $data)
{
$query = "SELECT usuario, contraseña, rol FROM usuario WHERE usuario=? AND fecha_baja IS NULL";
$result = $pdo->prepare($query);
$result->execute([$data["usuario"]]);
$data = $result->fetch();
return $data;
}
function checkExistingCalendar($pdo, $data)
{
$query = "SELECT * from calendario WHERE medico=?";
$result = $pdo->prepare($query);
$result->execute([$data["medico"]]);
$data = $result->fetch();
return $data;
}
function configureCalendar($pdo, $data)
{
$existing = checkExistingCalendar($pdo, $data);
if (!$existing) {
$query = "INSERT INTO calendario
(hora_inicio_mañana, hora_fin_mañana, hora_inicio_tarde, hora_fin_tarde,
horario, sabado_habil, domingo_habil, duracion_cita_por_defecto, medico)
VALUES (?,?,?,?,?,?,?,?,?)";
$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"]]);
} 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=? 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"]]);
}
return "Calendario configurado con éxito";
}
function fetchCalendarEvents($pdo, $doctor)
{
$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(PDO::FETCH_ASSOC);
return $data;
}
function fetchCalendarSettings($pdo, $doctor)
{
$query = "SELECT * from calendario WHERE medico=?";
$result = $pdo->prepare($query);
$result->execute([$doctor]);
$data = $result->fetch(PDO::FETCH_ASSOC);
if (empty($data[8])) {
$data[8] = 60;
}
return $data;
}
function fetchDoctorHolidays($pdo, $doctor)
{
$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(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;
}

View File

@@ -0,0 +1,43 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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();
$doctors = listDoctors($pdo);
?>
<form name="create_form" method="post" action="calendar_management.php">
<div class="input-group">
<label>Fecha</label>
<input type="date" name="fecha_festivo" value="">
</div>
<div class="select-input">
<label>Tipo</label>
<select id="tipo_festivo" name="tipo_festivo">
<option value="mañana">mañana</option>
<option value="tarde">tarde</option>
<option value="completo">completo</option>
</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">
<button class="btn" type="submit" name="create" >Guardar</button>
</div>
</form>
</body>

45
src/holiday_edit_form.php Normal file
View File

@@ -0,0 +1,45 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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 = fetchHolidayData($pdo, $_GET["edit"]);
?>
<form method="post" action="user_management.php">
<div class="input-group">
<label>Fecha</label>
<input type="date" name="fecha_festivo" value="<?php echo $data[1]; ?>">
</div>
<div class="select-input">
<label>Tipo</label>
<select id="tipo_festivo" name="tipo_festivo">
<option value="mañana">mañana</option>
<option value="tarde">tarde</option>
<option value="completo">completo</option>
</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">
<button class="btn" type="submit" name="edit" >Editar</button>
</div>
<input type="hidden" name="id" value="<?php echo $_GET["edit"]; ?>">
</form>
<?php closeDatabase($pdo); ?>
</body>

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);

20
src/index.php Normal file
View File

@@ -0,0 +1,20 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>MDIS</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'; ?>
<main>
<section class="hero">
<div class="hero-inner">
<h1>MDIS</h1>
<h2>MDIS es un sistema de información que permite gestionar una consulta médica.</h2>
</div>
</section>
<main>
</body>

28
src/login.php Normal file
View File

@@ -0,0 +1,28 @@
<?php session_start(); ?>
<html class="no-js" lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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" />
<script src="validate_user.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
</body>
<form name="login_form" method="post" action="user_management.php" onsubmit="return validateLogin();">
<div class="input-group">
<label>usuario</label>
<input type="text" name="usuario" value="">
</div>
<div class="input-group">
<label>contraseña</label>
<input type="password" name="contraseña" value="">
</div>
<div class="input-group">
<button class="btn" type="submit" name="login">Iniciar sesión</button>
</div>
</form>
</html>

22
src/navbar.php Normal file
View File

@@ -0,0 +1,22 @@
<?php session_start(); ?>
<header>
<nav>
<ul class="navbar-left">
<li class="list"><a href="index.php">Página principal</a></li>
<?php if (isset($_SESSION["user"])): ?>
<li class="list"><a href="user.php">Usuarios</a></li>
<li class="list"><a href="patient.php">Pacientes</a></li>
<li class="list"><a href="appointment.php">Citas</a></li>
<li class="list"><a href="calendar.php">Calendario</a></li>
<?php endif; ?>
<?php if ($_SESSION["user_type"] == 2): ?>
<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">Cerrar sesión</a></li>
<?php else: ?>
<li class="list"><a href="login.php">Iniciar sesión</a></li>
<?php endif; ?>
</ul>
</nav>
</header>

80
src/patient.php Normal file
View File

@@ -0,0 +1,80 @@
<?php session_start(); ?>
<html class="no-js" lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de pacientes</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'; ?>
<div>
<form method="post" action="patient_management.php">
<div class="search-group">
<input type="text" name="search_box" value="">
<button class="create_btn" type="submit" name="search" >Buscar</button>
<a href="patient_create_form.php" class="create_btn" >Crear</a>
</div>
</form>
</div>
<table>
<thead>
<tr>
<th>Nombre</th>
<th>Apellido</th>
<th>Fecha de nacimiento</th>
<th>Documento identificativo</th>
<th>Tipo de documento</th>
<th>Dirección</th>
<th>Pais</th>
<th>Provincia</th>
<th>Localidad</th>
<th>Citas</th>
<th>Informes</th>
<th colspan="2">Acciones</th>
</tr>
</thead>
<?php
include 'database.php';
$pdo = connectDatabase();
if (isset($_GET["search"])) {
$list = findPatient($pdo, $_GET["search"]);
} else {
$list = listPatients($pdo);
}
foreach ($list as $row) :
?>
<tr>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td><?php echo $row[4]; ?></td>
<td><?php echo $row[5]; ?></td>
<td><?php echo $row[6]; ?></td>
<td><?php echo $row[7]; ?></td>
<td><?php echo $row[8]; ?></td>
<td><?php echo $row[9]; ?></td>
<td><?php echo $row[10]; ?></td>
<td><?php echo $row[11]; ?></td>
<td>
<a href="patient_edit_form.php?edit=<?php echo $row[0]; ?>" class="edit_btn">Editar</a>
</td>
<td>
<a href="patient_management.php?delete=<?php echo $row[0]; ?>" class="del_btn">Borrar</a>
</td>
</tr>
<?php endforeach ?>
<?php closeDatabase($pdo); ?>
</table>
<?php if (isset($_GET["search"])): ?>
<div style="text-align: right; margin-top: 40px;">
<a href="patient.php" class="back_btn">Atrás</a>
</div>
<?php endif ?>
</body>
</html>

View File

@@ -0,0 +1,82 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de pacientes</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" />
<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'; ?>
<?php
include 'database.php';
$pdo = connectDatabase();
$countries = fetchCountries($pdo);
$regions = fetchRegions($pdo);
?>
<form name="create_form" method="post" action="patient_management.php" onsubmit="return validatePatient();">
<div class="input-group">
<label>Nombre</label>
<input type="text" name="nombre" value="">
</div>
<div class="input-group">
<label>Apellido</label>
<input type="text" name="apellido" value="">
</div>
<div class="input-group">
<label>fecha_de_nacimiento</label>
<input type="date" name="fecha_de_nacimiento" value="">
</div>
<div class="input-group">
<label>documento_identificativo</label>
<input type="text" name="documento_identificativo" value="">
</div>
<div class="select-input">
<label>tipo_documento</label>
<select id="tipo_documento" name="tipo_documento">
<option value="DNI">DNI</option>
<option value="NIE">NIE</option>
</select>
</div>
<div class="input-group">
<label>direccion</label>
<input type="text" name="direccion" value="">
</div>
<div class="input-group">
<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>
<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>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>
</div>
</form>
<?php closeDatabase($pdo); ?>
</body>

84
src/patient_edit_form.php Normal file
View File

@@ -0,0 +1,84 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de pacientes</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" />
<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'; ?>
<?php
include 'database.php';
$pdo = connectDatabase();
$data = fetchPatientData($pdo, $_GET["edit"]);
$countries = fetchCountries($pdo);
$regions = fetchRegions($pdo);
?>
<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]; ?>">
</div>
<div class="input-group">
<label>Apellido</label>
<input type="text" name="apellido" value="<?php echo $data[2]; ?>">
</div>
<div class="input-group">
<label>fecha_de_nacimiento</label>
<input type="password" name="fecha_de_nacimiento" value="<?php echo $data[3]; ?>">
</div>
<div class="input-group">
<label>documento_identificativo</label>
<input type="text" name="documento_identificativo" value="<?php echo $data[4]; ?>">
</div>
<div class="select-input">
<label>tipo_documento</label>
<select id="tipo_documento" name="tipo_documento">
<option value="DNI">DNI</option>
<option value="NIE">NIE</option>
</select>
</div>
<div class="input-group">
<label>direccion</label>
<input type="text" name="direccion" value="<?php echo $data[6]; ?>">
</div>
<div class="input-group">
<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>
<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>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>
</div>
<input type="hidden" name="id" value="<?php echo $_GET["edit"]; ?>">
</form>
<?php closeDatabase($pdo); ?>
</body>

View File

@@ -0,0 +1,57 @@
<?php
include'database.php';
function patientCreation()
{
$data = $_POST;
$pdo = connectDatabase();
createPatient($pdo, $data);
closeDatabase($pdo);
header('location: patient.php');
}
function patientModification()
{
$data = $_POST;
$id = $_POST["id"];
$pdo = connectDatabase();
editPatient($pdo, $data, $id);
closeDatabase($pdo);
header('location: patient.php');
}
function patientDeletion()
{
$id = $_GET["delete"];
$pdo = connectDatabase();
deletePatient($pdo, $id);
closeDatabase($pdo);
header('location: patient.php');
}
function patientFind()
{
$data = $_POST;
$pdo = connectDatabase();
findPatient($pdo, $data);
closeDatabase($pdo);
$search = $data["search_box"];
header("location: patient.php?search=$search");
}
if (isset($_POST["create"])) {
patientCreation();
}
if (isset($_POST["edit"])) {
patientModification();
}
if (isset($_GET["delete"])) {
patientDeletion();
}
if (isset($_POST["search"])) {
patientFind();
}

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();
}

65
src/report.php Normal file
View File

@@ -0,0 +1,65 @@
<?php session_start(); ?>
<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" />
<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'; ?>
<div>
<form method="post" action="report_management.php">
<div class="search-group">
<a href="report_create_form.php" class="create_btn" >Crear</a>
</div>
</form>
</div>
<table>
<thead>
<tr>
<th>Titulo</th>
<th>Fecha</th>
<th>Hora</th>
<th>Paciente</th>
<th>Médico</th>
<th colspan="3">Acciones</th>
</tr>
</thead>
<?php
include 'database.php';
$pdo = connectDatabase();
$list = listReports($pdo);
foreach ($list as $row) :
?>
<tr>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td><?php echo $row[4]; ?></td>
<td><?php echo $row[5]; ?></td>
<td>
<a href="report_edit_form.php?edit=<?php echo $row[0]; ?>" class="edit_btn">Editar</a>
</td>
<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); ?>
</table>
</body>
</html>

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

@@ -0,0 +1,51 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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" />
<script src="validate_report.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
<?php
include 'database.php';
$pdo = connectDatabase();
$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">
<label>Titulo</label>
<input type="text" name="titulo" value="">
</div>
<div class="input-group">
<label>fecha</label>
<input type="date" name="fecha" value="">
</div>
<div class="input-group">
<label>hora</label>
<input type="time" name="hora" 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[1]; ?></option>
<?php endforeach ?>
</select>
</div>
<div class="input-group">
<label>contenido</label>
<input type="text" name="contenido" value="">
</div>
<div class="input-group">
<button class="btn" type="submit" name="create" >Guardar</button>
</div>
<input type="hidden" id="medico" name="medico" value="<?php echo $user[0][4]; ?>">
</form>
<?php closeDatabase($pdo); ?>
</body>

59
src/report_edit_form.php Normal file
View File

@@ -0,0 +1,59 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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 = fetchReportData($pdo, $_GET["edit"]);
$list = listPatients($pdo);
?>
<form name="create_form" method="post" action="report_management.php">
<div class="input-group">
<label>Titulo</label>
<input type="text" name="titulo" value="<?php echo $data[4]; ?>">
</div>
<div class="input-group">
<label>fecha</label>
<input type="date" name="fecha" value="<?php echo $data[1]; ?>">
</div>
<div class="input-group">
<label>hora</label>
<input type="time" name="hora" value="<?php echo $data[2]; ?>">
</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>
<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="<?php echo $data[4]; ?>">
</div>
<div class="input-group">
<button class="btn" type="submit" name="edit" >Editar</button>
</div>
<input type="hidden" name="id" value="<?php echo $_GET["edit"]; ?>">
<input type="button" value="Imprimir" onClick="window.print()">
</form>
<?php closeDatabase($pdo); ?>
</body>

48
src/report_management.php Normal file
View File

@@ -0,0 +1,48 @@
<?php
include'database.php';
function reportCreation()
{
$data = $_POST;
$pdo = connectDatabase();
createReport($pdo, $data);
closeDatabase($pdo);
header('location: report.php');
}
function reportModification()
{
$data = $_POST;
$id = $_POST["id"];
$pdo = connectDatabase();
editReport($pdo, $data, $id);
closeDatabase($pdo);
header('location: report.php');
}
function reportDeletion()
{
$id = $_GET["delete"];
$pdo = connectDatabase();
deleteReport($pdo, $id);
closeDatabase($pdo);
header('location: report.php');
}
if (isset($_POST["create"])) {
reportCreation();
}
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

1413
src/static/fullcalendar.css Normal file

File diff suppressed because it is too large Load Diff

10
src/static/fullcalendar.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
src/static/jquery-3.5.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

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

File diff suppressed because it is too large Load Diff

13
src/static/jquery-ui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

7
src/static/moment.min.js vendored Normal file

File diff suppressed because one or more lines are too long

161
src/static/style.css Normal file
View File

@@ -0,0 +1,161 @@
* {
font-family: Roboto, Mono;
font-size: 14px;
}
table{
width: 50%;
margin: 30px auto;
border-collapse: collapse;
text-align: left;
}
tr {
border-bottom: 1px solid #cbcbcb;
}
th, td{
border: none;
height: 30px;
padding: 2px;
}
tr:hover {
background: #F5F5F5;
}
form {
width: 45%;
margin: 50px auto;
text-align: left;
padding: 20px;
border: 1px solid #bbbbbb;
border-radius: 5px;
}
.input-group {
margin: 10px 0px 10px 0px;
}
.input-group label {
display: block;
text-align: left;
margin: 3px;
}
.input-group input {
height: 30px;
width: 93%;
padding: 5px 10px;
font-size: 16px;
border-radius: 5px;
border: 1px solid gray;
}
.search-group input {
height: 30px;
width: 93%;
font-size: 14px;
}
.btn {
padding: 10px;
font-size: 15px;
color: white;
background: #5F9EA0;
border: none;
border-radius: 5px;
}
.create_btn {
text-decoration: none;
padding: 2px 5px;
background: #5F9EA0;
color: white;
border-radius: 3px;
}
.back_btn {
text-decoration: none;
padding: 2px 5px;
background: #88B8E7;
color: white;
border-radius: 3px;
margin: 400px;
}
.edit_btn {
text-decoration: none;
padding: 2px 5px;
background: #0d841f;
color: white;
border-radius: 3px;
}
.del_btn {
text-decoration: none;
padding: 2px 5px;
color: white;
border-radius: 3px;
background: #800000;
}
header {
background: #5F9EA0;
position: fixed;
top: 0;
left: 0;
right: 0;
height: 40px;
display: flex;
align-items: center;
box-shadow: 0 0 25px 0 black;
}
header * {
display: inline;
}
header li {
margin: 20px;
}
header li a {
color: black;
text-decoration: none;
}
main {
background: white;
}
.hero {
width: 100vw;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
color: white;
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;
background-attachment: fixed;
}
.hero h1 {
font-size: 5em;
margin-top: 0;
margin-bottom: 0.5em;
}
.success {
background: #cdf3cd;
padding: 10px 60px;
border: #c3e6c3 1px solid;
display: inline-block;
}
#calendar {
max-width: 600px;
margin: auto;
margin-top: 60px;
}

68
src/user.php Normal file
View File

@@ -0,0 +1,68 @@
<?php session_start(); ?>
<html class="no-js" lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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'; ?>
<div>
<form method="post" action="user_management.php">
<div class="search-group">
<input type="text" name="search_box" value="">
<button class="create_btn" type="submit" name="search" >Buscar</button>
<a href="user_create_form.php" class="create_btn" >Crear</a>
</div>
</form>
</div>
<table>
<thead>
<tr>
<th>Nombre</th>
<th>Usuario</th>
<th>Rol</th>
<th>Correo</th>
<th colspan="2">Acciones</th>
</tr>
</thead>
<?php
include 'database.php';
$pdo = connectDatabase();
if (isset($_GET["search"])) {
$list = findUser($pdo, $_GET["search"]);
} else {
$list = listUsers($pdo);
}
foreach ($list as $row) :
if (!$row[5]):
?>
<tr>
<td><?php echo $row[0]; ?></td>
<td><?php echo $row[1]; ?></td>
<td><?php echo $row[2]; ?></td>
<td><?php echo $row[3]; ?></td>
<td>
<a href="user_edit_form.php?edit=<?php echo $row[4]; ?>" class="edit_btn">Editar</a>
</td>
<td>
<a href="user_management.php?delete=<?php echo $row[4]; ?>" class="del_btn">Borrar</a>
</td>
</tr>
<?php endif ?>
<?php endforeach ?>
<?php closeDatabase($pdo); ?>
</table>
<?php if (isset($_GET["search"])): ?>
<div style="text-align: right; margin-top: 20px;">
<a href="user.php" class="back_btn">Atrás</a>
</div>
<?php endif ?>
</body>
</html>

41
src/user_create_form.php Normal file
View File

@@ -0,0 +1,41 @@
<?php session_start(); ?>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Gestión de usuarios</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" />
<script src="validate_user.js"></script>
</head>
<body>
<?php include 'navbar.php'; ?>
<form name="create_form" method="post" action="user_management.php" onsubmit="return validateUser();">
<div class="input-group">
<label>Nombre</label>
<input type="text" name="nombre" value="">
</div>
<div class="input-group">
<label>usuario</label>
<input type="text" name="usuario" value="">
</div>
<div class="input-group">
<label>contraseña</label>
<input type="password" name="contraseña" value="">
</div>
<div class="select-input">
<label>rol</label>
<select id="rol" name="rol">
<option value="1">administrativo</option>
<option value="2">médico</option>
</select>
</div>
<div class="input-group">
<label>correo</label>
<input type="text" name="correo" value="">
</div>
<div class="input-group">
<button class="btn" type="submit" name="create" >Guardar</button>
</div>
</form>
</body>

48
src/user_edit_form.php Normal file
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 usuarios</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 = fetchUserData($pdo, $_GET["edit"]);
?>
<form method="post" action="user_management.php">
<div class="input-group">
<label>Nombre</label>
<input type="text" name="nombre" value="<?php echo $data[1]; ?>">
</div>
<div class="input-group">
<label>usuario</label>
<input type="text" name="usuario" value="<?php echo $data[2]; ?>">
</div>
<div class="input-group">
<label>contraseña</label>
<input type="password" name="contraseña" value="<?php echo $data[3]; ?>">
</div>
<div class="select-input">
<label>rol</label>
<select id="rol" name="rol">
<option value="1">administrativo</option>
<option value="2">médico</option>
</select>
</div>
<div class="input-group">
<label>correo</label>
<input type="text" name="correo" value="<?php echo $data[6]; ?>">
</div>
<div class="input-group">
<button class="btn" type="submit" name="edit" >Editar</button>
</div>
<input type="hidden" name="id" value="<?php echo $_GET["edit"]; ?>">
</form>
<?php closeDatabase($pdo); ?>
</body>

92
src/user_management.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
include'database.php';
session_start();
function userCreation()
{
$data = $_POST;
$pdo = connectDatabase();
createUser($pdo, $data);
closeDatabase($pdo);
header('location: user.php');
}
function userModification()
{
$data = $_POST;
$id = $_POST["id"];
$pdo = connectDatabase();
editUser($pdo, $data, $id);
closeDatabase($pdo);
header('location: user.php');
}
function userDeletion()
{
$id = $_GET["delete"];
$pdo = connectDatabase();
deactivateUser($pdo, $data, $id);
closeDatabase($pdo);
header('location: user.php');
}
function userFind()
{
$data = $_POST;
$pdo = connectDatabase();
findUser($pdo, $data);
closeDatabase($pdo);
$search = $data["search_box"];
header("location: user.php?search=$search");
}
function userLogin()
{
$location = 'login.php';
$data = $_POST;
$pdo = connectDatabase();
$db_data = fetchLoginData($pdo, $data);
closeDatabase($pdo);
if ($data["usuario"] == $db_data["usuario"] && $data["contraseña"] == $db_data["contraseña"]) {
$_SESSION["user"] = $db_data["usuario"];
$_SESSION["user_type"] = $db_data["rol"];
$location = 'index.php';
}
header("location: $location");
}
function userLogout()
{
if (isset($_SESSION["user"])) {
session_unset();
session_destroy();
}
header("location: index.php");
}
if (isset($_POST["create"])) {
userCreation();
}
if (isset($_POST["edit"])) {
userModification();
}
if (isset($_GET["delete"])) {
userDeletion();
}
if (isset($_POST["search"])) {
userFind();
}
if (isset($_POST["login"])) {
userLogin();
}
if (isset($_GET["logout"])) {
userLogout();
}

68
src/validate_patient.js Normal file
View File

@@ -0,0 +1,68 @@
function checkDNI(dni) {
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);
number = number.replace('X', 0);
number = number.replace('Y', 1);
number = number.replace('Z', 2);
let = dni.substr(dni.length - 1, 1);
number = number % 23;
letter = 'TRWAGMYFPDXBNJZSQVHLCKET';
letter = letter.substring(number, number + 1);
if (letter !=
let) {
return false;
} else {
return true;
}
return false;
}
}
function validateString(input) {
if (input == "") {
return false;
}
return true;
}
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)) {
alert("El DNI/NIE no es correcto");
return false;
}
if (!validateString(name.value)) {
alert("Introduce el nombre");
return false;
}
if (!validateString(last_name.value)) {
alert("Introduce el apellido");
return false;
}
if (!validateString(address.value)) {
alert("Introduce la dirección");
return false;
}
if (!validateString(country.value)) {
alert("Introduce el país");
return false;
}
return true;
}

22
src/validate_report.js Normal file
View File

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

63
src/validate_user.js Normal file
View File

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