diff --git a/migrations/20260703_medicos.sql b/migrations/20260703_medicos.sql new file mode 100644 index 0000000..f66bd0a --- /dev/null +++ b/migrations/20260703_medicos.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS medicos ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + codigo VARCHAR(20) NOT NULL UNIQUE, + nombres VARCHAR(100) NOT NULL, + apellidos VARCHAR(100) NOT NULL, + cod_especialidad VARCHAR(50) DEFAULT NULL, + docidmedico VARCHAR(30) DEFAULT NULL, + activo TINYINT(1) NOT NULL DEFAULT 1, + creado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + actualizado_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/modules/medicos/api/delete.php b/modules/medicos/api/delete.php new file mode 100644 index 0000000..99735de --- /dev/null +++ b/modules/medicos/api/delete.php @@ -0,0 +1,24 @@ +false,'error'=>'No autorizado']); exit; } + +header('Content-Type: application/json'); + +if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + echo json_encode(['ok'=>false,'error'=>'Método no permitido']); exit; +} + +$datos = json_decode(file_get_contents('php://input'), true) ?? []; +$id = !empty($datos['id']) ? (int)$datos['id'] : 0; + +if (!$id) { echo json_encode(['ok'=>false,'error'=>'ID inválido.']); exit; } + +$pdo = Database::getInstance()->getConnection(); +$stmt = $pdo->prepare("DELETE FROM medicos WHERE id = ?"); +$stmt->execute([$id]); + +if ($stmt->rowCount()) { + echo json_encode(['ok'=>true,'mensaje'=>'Médico eliminado.']); +} else { + echo json_encode(['ok'=>false,'error'=>'Médico no encontrado.']); +} diff --git a/modules/medicos/api/list.php b/modules/medicos/api/list.php new file mode 100644 index 0000000..e38f836 --- /dev/null +++ b/modules/medicos/api/list.php @@ -0,0 +1,26 @@ +false,'error'=>'No autorizado']); exit; } + +header('Content-Type: application/json'); + +$pdo = Database::getInstance()->getConnection(); +$buscar = trim($_GET['q'] ?? ''); + +if ($buscar !== '') { + $like = '%' . $buscar . '%'; + $stmt = $pdo->prepare( + "SELECT id, codigo, nombres, apellidos, cod_especialidad, docidmedico, activo + FROM medicos + WHERE nombres LIKE ? OR apellidos LIKE ? OR codigo LIKE ? OR docidmedico LIKE ? + ORDER BY apellidos, nombres" + ); + $stmt->execute([$like, $like, $like, $like]); +} else { + $stmt = $pdo->query( + "SELECT id, codigo, nombres, apellidos, cod_especialidad, docidmedico, activo + FROM medicos ORDER BY apellidos, nombres" + ); +} + +echo json_encode(['ok' => true, 'data' => $stmt->fetchAll(PDO::FETCH_ASSOC)]); diff --git a/modules/medicos/api/save.php b/modules/medicos/api/save.php new file mode 100644 index 0000000..86bd32d --- /dev/null +++ b/modules/medicos/api/save.php @@ -0,0 +1,46 @@ +false,'error'=>'No autorizado']); exit; } + +header('Content-Type: application/json'); + +if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + echo json_encode(['ok'=>false,'error'=>'Método no permitido']); exit; +} + +$datos = json_decode(file_get_contents('php://input'), true) ?? []; +$id = !empty($datos['id']) ? (int) $datos['id'] : null; +$codigo = strtoupper(trim($datos['codigo'] ?? '')); +$nombres = trim($datos['nombres'] ?? ''); +$apellidos = trim($datos['apellidos'] ?? ''); +$especialidad = trim($datos['cod_especialidad'] ?? ''); +$docid = trim($datos['docidmedico'] ?? ''); + +if (!$codigo) { echo json_encode(['ok'=>false,'error'=>'El código es obligatorio.']); exit; } +if (!$nombres) { echo json_encode(['ok'=>false,'error'=>'Los nombres son obligatorios.']); exit; } +if (!$apellidos) { echo json_encode(['ok'=>false,'error'=>'Los apellidos son obligatorios.']); exit; } + +$pdo = Database::getInstance()->getConnection(); + +if ($id) { + // Editar + $stmt = $pdo->prepare( + "UPDATE medicos SET codigo=?, nombres=?, apellidos=?, cod_especialidad=?, docidmedico=? + WHERE id=?" + ); + $stmt->execute([$codigo, $nombres, $apellidos, $especialidad ?: null, $docid ?: null, $id]); + echo json_encode(['ok'=>true,'mensaje'=>'Médico actualizado correctamente.']); +} else { + // Crear — verificar código único + $existe = $pdo->prepare("SELECT id FROM medicos WHERE codigo = ?"); + $existe->execute([$codigo]); + if ($existe->fetch()) { + echo json_encode(['ok'=>false,'error'=>"El código '$codigo' ya existe."]); exit; + } + $stmt = $pdo->prepare( + "INSERT INTO medicos (codigo, nombres, apellidos, cod_especialidad, docidmedico) + VALUES (?, ?, ?, ?, ?)" + ); + $stmt->execute([$codigo, $nombres, $apellidos, $especialidad ?: null, $docid ?: null]); + echo json_encode(['ok'=>true,'id'=>(int)$pdo->lastInsertId(),'mensaje'=>'Médico creado correctamente.']); +} diff --git a/modules/medicos/module.php b/modules/medicos/module.php new file mode 100644 index 0000000..aa2b8bf --- /dev/null +++ b/modules/medicos/module.php @@ -0,0 +1,14 @@ + 'medicos', + 'name' => 'Médicos', + 'icon' => 'fas fa-user-md', + 'category' => 'clinico', + 'route' => '/erp.php?m=medicos&v=index', + 'is_active' => true, + 'sort_order' => 51, + 'oleada' => 0, + 'description' => 'Gestión del catálogo de médicos', + 'links' => [ + ['name' => 'Médicos', 'icon' => 'fas fa-user-md', 'route' => '/erp.php?m=medicos&v=index'], + ], +]; diff --git a/modules/medicos/views/index.php b/modules/medicos/views/index.php new file mode 100644 index 0000000..4264017 --- /dev/null +++ b/modules/medicos/views/index.php @@ -0,0 +1,271 @@ + + + + + +
+
+
+ + +
+
+ + + + + + + + + + + + + + +
CódigoNombresApellidosEspecialidadDoc. ID
Cargando…
+
+
+
+ + + + + + + + +