497 lines
16 KiB
PHP
497 lines
16 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../helpers/session.php';
|
|
require_once __DIR__ . '/../../config/database.php';
|
|
require_once __DIR__ . '/../helpers/env.php';
|
|
|
|
function guardar() {
|
|
if (!($_SESSION['usuario_id'] ?? false)) {
|
|
die("⚠️ No autorizado.");
|
|
}
|
|
|
|
$conn = getConnection();
|
|
|
|
// Capturar campos del formulario
|
|
$clave = $_POST['clave'];
|
|
$nombre = $_POST['nombre'];
|
|
$rfc = $_POST['rfc'];
|
|
$curp = $_POST['curp'] ?? null;
|
|
$dom = $_POST['domicilio'];
|
|
$pais = $_POST['pais'];
|
|
$entidad = $_POST['entidad'];
|
|
$ciudad = $_POST['ciudad'];
|
|
$tel = $_POST['telefono'];
|
|
$caat = $_POST['caat'];
|
|
$usr_id = $_SESSION['usuario_id'];
|
|
|
|
// INSERT incluyendo id_usuario
|
|
$sql = "INSERT INTO dbo.transportistas
|
|
(clave_identificador, nombre, rfc, curp, domicilio, pais,
|
|
entidad_federativa, ciudad, telefono, caat, id_usuario)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
$params = [
|
|
$clave, $nombre, $rfc, $curp, $dom,
|
|
$pais, $entidad, $ciudad, $tel, $caat,
|
|
$usr_id
|
|
];
|
|
|
|
$stmt = sqlsrv_query($conn, $sql, $params);
|
|
if ($stmt === false) {
|
|
die("❌ Error al guardar transportista: " . print_r(sqlsrv_errors(), true));
|
|
}
|
|
|
|
// Redirigir de vuelta a la lista o mostrar mensaje…
|
|
header("Location: /IMPORTADORES/transportistas/lista?success=1");
|
|
exit;
|
|
}
|
|
|
|
function alta() {
|
|
$conn = getConnection();
|
|
// 1) Cargar países
|
|
$sql = "SELECT id_pais, nombre FROM paises ORDER BY nombre";
|
|
$stmt = sqlsrv_query($conn, $sql);
|
|
$paises = [];
|
|
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
|
$paises[] = $row;
|
|
}
|
|
|
|
include __DIR__ . '/../../views/transportistas/alta.php';
|
|
}
|
|
|
|
// AJAX: devuelve los estados de un país dado
|
|
function estados() {
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
$pais = $_GET['pais'] ?? '';
|
|
$conn = getConnection();
|
|
$sql = "SELECT id_estado, nombre FROM estados WHERE pais_id = ? ORDER BY nombre";
|
|
$stmt = sqlsrv_query($conn, $sql, [$pais]);
|
|
$out = [];
|
|
while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
|
$out[] = $r;
|
|
}
|
|
echo json_encode($out);
|
|
exit;
|
|
}
|
|
|
|
// AJAX: devuelve las ciudades de un estado dado
|
|
function ciudades() {
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
$estado = $_GET['estado'] ?? '';
|
|
$conn = getConnection();
|
|
$sql = "SELECT id_ciudad, nombre FROM ciudades WHERE estado_id = ? ORDER BY nombre";
|
|
$stmt = sqlsrv_query($conn, $sql, [$estado]);
|
|
$out = [];
|
|
while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
|
$out[] = $r;
|
|
}
|
|
echo json_encode($out);
|
|
exit;
|
|
}
|
|
|
|
function lista()
|
|
{
|
|
include __DIR__ . '/../../views/transportistas/lista.php';
|
|
}
|
|
|
|
/** Descarga la plantilla CSV para carga masiva **/
|
|
function template() {
|
|
$file = __DIR__ . '/../../public/downloads/transportistas_template.csv';
|
|
if (!file_exists($file)) {
|
|
http_response_code(404);
|
|
echo "❌ Plantilla no encontrada.";
|
|
exit;
|
|
}
|
|
header('Content-Type: text/csv; charset=UTF-8');
|
|
header('Content-Disposition: attachment; filename="transportistas_template.csv"');
|
|
readfile($file);
|
|
exit;
|
|
}
|
|
|
|
/** Procesa la carga masiva desde un CSV **/
|
|
function importar() {
|
|
// 1) Verificar sesión
|
|
if (!($_SESSION['usuario_id'] ?? false)) {
|
|
die("⚠️ No autorizado.");
|
|
}
|
|
$usr_id = $_SESSION['usuario_id'];
|
|
|
|
// 2) Validar archivo subido
|
|
if (!isset($_FILES['archivo_csv']) || $_FILES['archivo_csv']['error'] !== UPLOAD_ERR_OK) {
|
|
die("❌ Debes subir un archivo CSV válido.");
|
|
}
|
|
$ext = pathinfo($_FILES['archivo_csv']['name'], PATHINFO_EXTENSION);
|
|
if (strtolower($ext) !== 'csv') {
|
|
die("❌ Solo se permiten archivos .csv");
|
|
}
|
|
|
|
// 3) Abrir y leer CSV
|
|
$fh = fopen($_FILES['archivo_csv']['tmp_name'], 'r');
|
|
if (!$fh) {
|
|
die("❌ No se pudo abrir el archivo.");
|
|
}
|
|
|
|
// 4) Encabezados esperados
|
|
$header = fgetcsv($fh, 1000, ',');
|
|
$expected = [
|
|
'clave_identificador','nombre','rfc','curp',
|
|
'telefono','caat','pais_id','estado_id',
|
|
'ciudad_id','domicilio'
|
|
];
|
|
if ($header === false || array_map('trim', $header) !== $expected) {
|
|
fclose($fh);
|
|
die("❌ Encabezado de CSV inválido. Debe contener: " . implode(',', $expected));
|
|
}
|
|
|
|
$conn = getConnection();
|
|
$errors = [];
|
|
$rowNum = 1;
|
|
|
|
while (($row = fgetcsv($fh, 2000, ',')) !== false) {
|
|
$rowNum++;
|
|
// asegurarse de tener todas las columnas
|
|
if (count($row) < count($expected)) {
|
|
$errors[] = "Fila $rowNum: faltan columnas.";
|
|
continue;
|
|
}
|
|
// mapear valores y trim
|
|
list($clave,$nombre,$rfc,$curp,$tel,$caat,$pais_id,$estado_id,$ciudad_id,$dom) = array_map('trim', $row);
|
|
|
|
// validar obligatorios
|
|
if ($clave==='' || $nombre==='' || $rfc==='' || $tel==='' || $caat===''
|
|
|| $pais_id==='' || $estado_id==='' || $ciudad_id==='' || $dom==='') {
|
|
$errors[] = "Fila $rowNum: faltan datos obligatorios.";
|
|
continue;
|
|
}
|
|
|
|
// Convertir IDs a nombres
|
|
$pais_nombre = '';
|
|
$estado_nombre = '';
|
|
$ciudad_nombre = '';
|
|
|
|
// Consultar nombre del país
|
|
$sql = "SELECT nombre FROM dbo.paises WHERE id_pais = ?";
|
|
$stmt = sqlsrv_query($conn, $sql, [$pais_id]);
|
|
if ($row_pais = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
|
$pais_nombre = $row_pais['nombre'];
|
|
} else {
|
|
$errors[] = "Fila $rowNum: país con ID $pais_id no encontrado.";
|
|
continue;
|
|
}
|
|
|
|
// Consultar nombre del estado
|
|
$sql = "SELECT nombre FROM dbo.estados WHERE id_estado = ?";
|
|
$stmt = sqlsrv_query($conn, $sql, [$estado_id]);
|
|
if ($row_estado = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
|
$estado_nombre = $row_estado['nombre'];
|
|
} else {
|
|
$errors[] = "Fila $rowNum: estado con ID $estado_id no encontrado.";
|
|
continue;
|
|
}
|
|
|
|
// Consultar nombre de la ciudad
|
|
$sql = "SELECT nombre FROM dbo.ciudades WHERE id_ciudad = ?";
|
|
$stmt = sqlsrv_query($conn, $sql, [$ciudad_id]);
|
|
if ($row_ciudad = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
|
$ciudad_nombre = $row_ciudad['nombre'];
|
|
} else {
|
|
$errors[] = "Fila $rowNum: ciudad con ID $ciudad_id no encontrada.";
|
|
continue;
|
|
}
|
|
|
|
// 5) Insertar en BD con nombres
|
|
$sql = "INSERT INTO dbo.transportistas
|
|
(clave_identificador, nombre, rfc, curp, telefono, caat,
|
|
pais, entidad_federativa, ciudad, domicilio, id_usuario)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
$params = [
|
|
$clave, $nombre, $rfc, $curp, $tel,
|
|
$caat, $pais_nombre, $estado_nombre, $ciudad_nombre, $dom,
|
|
$usr_id
|
|
];
|
|
$stmt = sqlsrv_query($conn, $sql, $params);
|
|
if ($stmt === false) {
|
|
$errors[] = "Fila $rowNum: error al guardar → " . print_r(sqlsrv_errors(), true);
|
|
}
|
|
}
|
|
fclose($fh);
|
|
|
|
// 6) Redirigir con resultado
|
|
if (count($errors) > 0) {
|
|
$_SESSION['import_errors'] = $errors;
|
|
header('Location: /IMPORTADORES/transportistas/bulk_upload?status=error');
|
|
} else {
|
|
$_SESSION['import_success'] = true;
|
|
header('Location: /IMPORTADORES/transportistas/bulk_upload?status=ok');
|
|
}
|
|
exit;
|
|
}
|
|
|
|
function bulk_upload() {
|
|
|
|
include __DIR__ . '/../../views/transportistas/bulk_upload.php';
|
|
}
|
|
|
|
function ajax_lista() {
|
|
// 1) Autorización
|
|
if (!($_SESSION['usuario_id'] ?? false)) {
|
|
http_response_code(403);
|
|
echo json_encode([]);
|
|
exit;
|
|
}
|
|
$usr = $_SESSION['usuario_id'];
|
|
|
|
$conn = getConnection();
|
|
|
|
// 2) Parámetros de DataTables
|
|
$draw = intval($_GET['draw'] ?? 0);
|
|
$start = intval($_GET['start'] ?? 0);
|
|
$length = intval($_GET['length'] ?? 10);
|
|
$search = $_GET['search']['value'] ?? '';
|
|
|
|
// Mapeo columnas - ahora incluimos el nombre de la ciudad
|
|
$cols = ['t.id_transportista','t.clave_identificador','t.nombre','t.rfc','c.nombre','t.creado_en'];
|
|
$orderColIdx = intval($_GET['order'][0]['column'] ?? 5);
|
|
$orderDir = strtoupper($_GET['order'][0]['dir'] ?? 'ASC') === 'DESC' ? 'DESC' : 'ASC';
|
|
$orderCol = in_array($orderColIdx, range(0,5)) ? $cols[$orderColIdx] : 't.creado_en';
|
|
|
|
// 3) Total registros sin filtro
|
|
$sqlTotal = "SELECT COUNT(*) AS total FROM dbo.transportistas WHERE id_usuario = ? AND activo = 1";
|
|
$stmt = sqlsrv_query($conn, $sqlTotal, [$usr]);
|
|
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
|
|
$recordsTotal = (int)$row['total'];
|
|
|
|
// 4) Construir condiciones de filtro
|
|
$where = "t.id_usuario = ? AND t.activo = 1 ";
|
|
$params = [$usr];
|
|
|
|
if ($search !== '') {
|
|
// Ahora buscamos en campos de transportista Y en el nombre de la ciudad
|
|
$where .= " AND (
|
|
t.clave_identificador LIKE ? OR
|
|
t.nombre LIKE ? OR
|
|
t.rfc LIKE ? OR
|
|
t.curp LIKE ? OR
|
|
t.telefono LIKE ? OR
|
|
t.caat LIKE ? OR
|
|
c.nombre LIKE ? OR
|
|
p.nombre LIKE ? OR
|
|
e.nombre LIKE ?
|
|
)";
|
|
$like = "%{$search}%";
|
|
// Agregamos el parámetro para cada campo de búsqueda
|
|
$params = array_merge($params, array_fill(0, 9, $like));
|
|
}
|
|
|
|
// 5) Total registros filtrados (CON JOIN)
|
|
$sqlFiltered = "
|
|
SELECT COUNT(*) AS total
|
|
FROM dbo.transportistas t
|
|
LEFT JOIN dbo.ciudades c ON t.ciudad = c.id_ciudad
|
|
LEFT JOIN dbo.estados e ON c.estado_id = e.id_estado
|
|
LEFT JOIN dbo.paises p ON e.pais_id = p.id_pais
|
|
WHERE $where
|
|
";
|
|
$stmtF = sqlsrv_query($conn, $sqlFiltered, $params);
|
|
$rowF = sqlsrv_fetch_array($stmtF, SQLSRV_FETCH_ASSOC);
|
|
$recordsFiltered = (int)$rowF['total'];
|
|
|
|
// 6) Datos de la página con JOIN completo
|
|
$sqlData = "
|
|
SELECT t.id_transportista,
|
|
t.clave_identificador,
|
|
t.nombre,
|
|
t.rfc,
|
|
COALESCE(c.nombre, 'Ciudad no encontrada') as ciudad_nombre,
|
|
COALESCE(e.nombre, '') as estado_nombre,
|
|
COALESCE(p.nombre, '') as pais_nombre,
|
|
t.creado_en
|
|
FROM dbo.transportistas t
|
|
LEFT JOIN dbo.ciudades c ON t.ciudad = c.id_ciudad
|
|
LEFT JOIN dbo.estados e ON c.estado_id = e.id_estado
|
|
LEFT JOIN dbo.paises p ON e.pais_id = p.id_pais
|
|
WHERE $where
|
|
ORDER BY $orderCol $orderDir
|
|
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
|
|
";
|
|
// agregar offset/limit al final
|
|
$params[] = $start;
|
|
$params[] = $length;
|
|
$stmtD = sqlsrv_query($conn, $sqlData, $params);
|
|
|
|
$data = [];
|
|
while ($r = sqlsrv_fetch_array($stmtD, SQLSRV_FETCH_ASSOC)) {
|
|
$data[] = [
|
|
$r['id_transportista'],
|
|
$r['clave_identificador'],
|
|
$r['nombre'],
|
|
$r['rfc'],
|
|
$r['ciudad_nombre'], // Ahora muestra el nombre real de la ciudad
|
|
$r['creado_en'] instanceof DateTime
|
|
? $r['creado_en']->format('Y-m-d H:i')
|
|
: ''
|
|
];
|
|
}
|
|
|
|
// 7) Devolver JSON
|
|
header('Content-Type: application/json; charset=UTF-8');
|
|
echo json_encode([
|
|
"draw" => $draw,
|
|
"recordsTotal" => $recordsTotal,
|
|
"recordsFiltered" => $recordsFiltered,
|
|
"data" => $data
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
function editar() {
|
|
// 1) Verificar sesión
|
|
if (!($_SESSION['usuario_id'] ?? false)) {
|
|
header('Location: /IMPORTADORES/login');
|
|
exit;
|
|
}
|
|
$usr = $_SESSION['usuario_id'];
|
|
|
|
// 2) Obtener el ID y validarlo
|
|
$id = $_GET['id'] ?? null;
|
|
if (!$id || !is_numeric($id)) {
|
|
die("❌ ID de transportista inválido.");
|
|
}
|
|
|
|
$conn = getConnection();
|
|
|
|
// 3) Consultar el transportista (pertenece al usuario)
|
|
$sql = "SELECT * FROM dbo.transportistas
|
|
WHERE id_transportista = ? AND id_usuario = ?";
|
|
$stmt = sqlsrv_query($conn, $sql, [$id, $usr]);
|
|
$t = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
|
|
if (!$t) {
|
|
die("❌ Transportista no encontrado o no autorizado.");
|
|
}
|
|
|
|
// 4) Cargar listas de países, estados y ciudades
|
|
// --- Países ---
|
|
$paises = [];
|
|
$rs = sqlsrv_query($conn, "SELECT id_pais, nombre FROM dbo.paises ORDER BY nombre");
|
|
while ($r = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) {
|
|
$paises[] = $r;
|
|
}
|
|
|
|
// --- Estados para el país actual ---
|
|
$estados = [];
|
|
$rs = sqlsrv_query($conn, "SELECT id_estado, nombre FROM dbo.estados WHERE pais_id = ? ORDER BY nombre", [$t['pais']]);
|
|
while ($r = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) {
|
|
$estados[] = $r;
|
|
}
|
|
|
|
// --- Ciudades para el estado actual ---
|
|
$ciudades = [];
|
|
$rs = sqlsrv_query($conn, "SELECT id_ciudad, nombre FROM dbo.ciudades WHERE estado_id = ? ORDER BY nombre", [$t['entidad_federativa']]);
|
|
while ($r = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) {
|
|
$ciudades[] = $r;
|
|
}
|
|
|
|
// 5) Renderizar la vista
|
|
include __DIR__ . '/../../views/transportistas/editar.php';
|
|
}
|
|
|
|
/** Procesa el POST de actualización **/
|
|
function actualizar()
|
|
{
|
|
if (!($_SESSION['usuario_id'] ?? false)) {
|
|
die("⚠️ No autorizado.");
|
|
}
|
|
$usr = $_SESSION['usuario_id'];
|
|
|
|
// 1) Capturar y validar datos
|
|
$id = $_POST['id_transportista'] ?? null;
|
|
$clave = trim($_POST['clave'] ?? '');
|
|
$nombre= trim($_POST['nombre'] ?? '');
|
|
$rfc = trim($_POST['rfc'] ?? '');
|
|
$curp = trim($_POST['curp'] ?? '');
|
|
$tel = trim($_POST['telefono'] ?? '');
|
|
$caat = trim($_POST['caat'] ?? '');
|
|
$pais = $_POST['pais'] ?? '';
|
|
$estado= $_POST['entidad'] ?? '';
|
|
$ciudad= $_POST['ciudad'] ?? '';
|
|
$dom = trim($_POST['domicilio'] ?? '');
|
|
|
|
if (!$id || !is_numeric($id)
|
|
|| $clave===''||$nombre===''||$rfc===''||$tel===''||$caat===''
|
|
|| $pais===''||$estado===''||$ciudad===''||$dom===''
|
|
) {
|
|
die("❌ Faltan datos obligatorios.");
|
|
}
|
|
|
|
$conn = getConnection();
|
|
|
|
// 2) Verificar que exista y pertenezca al usuario
|
|
$sqlChk = "SELECT COUNT(*) AS cnt
|
|
FROM dbo.transportistas
|
|
WHERE id_transportista = ? AND id_usuario = ?";
|
|
$stmtChk = sqlsrv_query($conn, $sqlChk, [$id, $usr]);
|
|
$rowChk = sqlsrv_fetch_array($stmtChk, SQLSRV_FETCH_ASSOC);
|
|
if ($rowChk['cnt'] == 0) {
|
|
die("❌ Transportista no encontrado o no autorizado.");
|
|
}
|
|
|
|
// 3) Ejecutar UPDATE
|
|
$sqlUpd = "UPDATE dbo.transportistas SET
|
|
clave_identificador = ?,
|
|
nombre = ?,
|
|
rfc = ?,
|
|
curp = ?,
|
|
telefono = ?,
|
|
caat = ?,
|
|
pais = ?,
|
|
entidad_federativa = ?,
|
|
ciudad = ?,
|
|
domicilio = ?
|
|
WHERE id_transportista = ?";
|
|
$params = [
|
|
$clave, $nombre, $rfc, $curp, $tel,
|
|
$caat, $pais, $estado, $ciudad, $dom,
|
|
$id
|
|
];
|
|
$stmtUpd = sqlsrv_query($conn, $sqlUpd, $params);
|
|
if ($stmtUpd === false) {
|
|
die("❌ Error al actualizar: " . print_r(sqlsrv_errors(), true));
|
|
}
|
|
|
|
// 4) Redirigir con éxito
|
|
header("Location: /IMPORTADORES/transportistas/lista?edit=ok");
|
|
exit;
|
|
}
|
|
|
|
function eliminar() {
|
|
if (!($_SESSION['usuario_id'] ?? false)) {
|
|
header('Location: /IMPORTADORES/login');
|
|
exit;
|
|
}
|
|
$usr = $_SESSION['usuario_id'];
|
|
$id = $_GET['id'] ?? null;
|
|
if (!$id || !is_numeric($id)) {
|
|
die("❌ ID inválido.");
|
|
}
|
|
|
|
$conn = getConnection();
|
|
|
|
// Verificar que el transportista exista y pertenezca al usuario
|
|
$sqlChk = "SELECT COUNT(*) AS cnt
|
|
FROM dbo.transportistas
|
|
WHERE id_transportista = ? AND id_usuario = ?";
|
|
$stmtChk = sqlsrv_query($conn, $sqlChk, [$id, $usr]);
|
|
$rowChk = sqlsrv_fetch_array($stmtChk, SQLSRV_FETCH_ASSOC);
|
|
if ($rowChk['cnt'] == 0) {
|
|
die("❌ Transportista no encontrado o no autorizado.");
|
|
}
|
|
|
|
// ELIMINACIÓN REAL - DELETE en lugar de UPDATE
|
|
$sqlDel = "UPDATE dbo.transportistas SET activo = 0 WHERE id_transportista = ?";
|
|
$stmtDel = sqlsrv_query($conn, $sqlDel, [$id]);
|
|
if ($stmtDel === false) {
|
|
die("❌ Error al eliminar: " . print_r(sqlsrv_errors(), true));
|
|
}
|
|
|
|
// Redirigir con parámetro para SweetAlert
|
|
header("Location: /IMPORTADORES/transportistas/lista?deleted=ok");
|
|
exit;
|
|
} |