File "AnexoController.php"

Full Path: C:/wamp64/www/AVIDOTAPP/controllers/AnexoController.php
File size: 7.1 KB
MIME-type: text/x-php
Charset: utf-8

<?php
class AnexoController {

    // Directorio donde se guardan los anexos (relativo a la raíz del proyecto).
    const DIR_ANEXOS = 'uploads/anexos/';
    const DIR_DOCS   = 'uploads/docs/';

    public function __construct() {
        // Crear directorios si no existen
        foreach ([self::DIR_ANEXOS, self::DIR_DOCS] as $dir) {
            if (!file_exists($dir)) {
                mkdir($dir, 0777, true);
            }
        }
    }

    // ─────────────────────────────────────────────────────────────
    // FORMULARIO DE CARGA
    // URL: index.php?controller=Anexo&action=index
    // Equivale a: anexarDocumento/subefoto.PHP
    // ─────────────────────────────────────────────────────────────
    public function index() {
        $this->verificarSesion();
        $msg_ok  = $_SESSION['anexo_ok']  ?? '';
        $msg_err = $_SESSION['anexo_err'] ?? '';
        unset($_SESSION['anexo_ok'], $_SESSION['anexo_err']);
        include 'views/anexos/subir.php';
    }

    // ─────────────────────────────────────────────────────────────
    // PROCESAR UPLOAD
    // URL: index.php?controller=Anexo&action=upload  (POST)
    // Equivale a: anexarDocumento/upload.php
    // ─────────────────────────────────────────────────────────────
    public function upload() {
        $this->verificarSesion();

        if (!isset($_FILES['archivo']) || empty($_FILES['archivo']['name'][0])) {
            $_SESSION['anexo_err'] = 'No se seleccionó ningún archivo.';
            header('Location: index.php?controller=Anexo&action=index');
            exit();
        }

        $subidos  = [];
        $errores  = [];
        $total    = count($_FILES['archivo']['tmp_name']);

        for ($i = 0; $i < $total; $i++) {
            if (empty($_FILES['archivo']['name'][$i])) continue;

            $nombre_original = $_FILES['archivo']['name'][$i];
            $tmp             = $_FILES['archivo']['tmp_name'][$i];
            $error_code      = $_FILES['archivo']['error'][$i];

            if ($error_code !== UPLOAD_ERR_OK) {
                $errores[] = "Error al cargar: $nombre_original";
                continue;
            }

            // Sanitizar nombre: solo letras, números, guion, punto
            $nombre_limpio = preg_replace('/[^a-zA-Z0-9._\-]/', '_', $nombre_original);
            $nombre_limpio = basename($nombre_limpio);

            // Evitar sobreescritura: agregar timestamp si ya existe
            if (file_exists(self::DIR_ANEXOS . $nombre_limpio)) {
                $info = pathinfo($nombre_limpio);
                $nombre_limpio = $info['filename'] . '_' . time() . '.' . ($info['extension'] ?? '');
            }

            $destino_anexos = self::DIR_ANEXOS . $nombre_limpio;
            $destino_docs   = self::DIR_DOCS   . $nombre_limpio;

            if (move_uploaded_file($tmp, $destino_anexos)) {
                // Copia también a docs/ (comportamiento original)
                copy($destino_anexos, $destino_docs);
                $subidos[] = $nombre_limpio;
            } else {
                $errores[] = "No se pudo guardar: $nombre_original";
            }
        }

        if (!empty($subidos)) {
            $_SESSION['anexo_ok'] = count($subidos) . ' archivo(s) cargado(s) correctamente: ' . implode(', ', $subidos);
        }
        if (!empty($errores)) {
            $_SESSION['anexo_err'] = implode('<br>', $errores);
        }

        header('Location: index.php?controller=Anexo&action=index');
        exit();
    }

    // ─────────────────────────────────────────────────────────────
    // VISUALIZAR ANEXOS
    // URL: index.php?controller=Anexo&action=visualizar
    // Equivale a: anexarDocumento/VisualizarAnexos.php
    // ─────────────────────────────────────────────────────────────
    public function visualizar() {
        $this->verificarSesion();

        $page        = isset($_GET['page'])   ? max(1, intval($_GET['page']))   : 1;
        $itemsPerPage = 30;
        $dateFilter  = $_GET['date']   ?? '';
        $searchTerm  = $_GET['search'] ?? '';
        $directorio  = self::DIR_ANEXOS;

        $allFiles = [];

        if (file_exists($directorio)) {
            $archivos = array_diff(scandir($directorio), ['.', '..']);

            foreach ($archivos as $archivo) {
                $ruta = $directorio . $archivo;
                if (!is_file($ruta)) continue;
                $fileDate = date('Y-m-d', filemtime($ruta));

                if ($dateFilter && $fileDate !== $dateFilter)                  continue;
                if ($searchTerm && stripos($archivo, $searchTerm) === false)   continue;

                $allFiles[] = [
                    'name' => $archivo,
                    'path' => $ruta,
                    'date' => $fileDate,
                    'time' => filemtime($ruta),
                ];
            }

            usort($allFiles, fn($a, $b) => $b['time'] - $a['time']);
        }

        $totalDocuments   = count($allFiles);
        $totalPages       = (int)ceil($totalDocuments / $itemsPerPage);
        $offset           = ($page - 1) * $itemsPerPage;
        $currentPageFiles = array_slice($allFiles, $offset, $itemsPerPage);

        include 'views/anexos/visualizar.php';
    }

    // ─────────────────────────────────────────────────────────────
    // ELIMINAR ARCHIVO
    // URL: index.php?controller=Anexo&action=eliminar&archivo=X
    // ─────────────────────────────────────────────────────────────
    public function eliminar() {
        $this->verificarSesion();
        $archivo = basename($_GET['archivo'] ?? '');

        if ($archivo && file_exists(self::DIR_ANEXOS . $archivo)) {
            unlink(self::DIR_ANEXOS . $archivo);
            // Borrar copia en docs/ si existe
            if (file_exists(self::DIR_DOCS . $archivo)) unlink(self::DIR_DOCS . $archivo);
            $_SESSION['anexo_ok'] = "Archivo '$archivo' eliminado.";
        } else {
            $_SESSION['anexo_err'] = 'No se encontró el archivo.';
        }

        header('Location: index.php?controller=Anexo&action=visualizar');
        exit();
    }

    private function verificarSesion() {
        if (!isset($_SESSION['DIGITA']) || empty($_SESSION['DIGITA'])) {
            header('Location: index.php');
            exit();
        }
    }
}
?>