Autosave: 20260203-014257

This commit is contained in:
Flatlogic Bot 2026-02-03 01:43:03 +00:00
parent 2c74cd9d4c
commit bdc6e40a34
1501 changed files with 7619 additions and 174 deletions

View File

@ -1,18 +1,3 @@
DirectoryIndex index.php index.html
Options -Indexes
Options -MultiViews
RewriteEngine On
# 0) Serve existing files/directories as-is
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# 1) Internal map: /page or /page/ -> /page.php (if such PHP file exists)
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
# 2) Optional: strip trailing slash for non-directories (keeps .php links working)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R=301,L]
DirectoryIndex index.php
php_value auto_prepend_file "db/config.php"

31
add_cobertura.php Normal file
View File

@ -0,0 +1,31 @@
<?php
session_start();
header('Content-Type: application/json');
if (!isset($_SESSION['user_id'])) {
echo json_encode(['success' => false, 'error' => 'No autorizado']);
exit;
}
require_once 'db/config.php';
$titulo = isset($_POST['titulo']) ? trim($_POST['titulo']) : '';
$texto = isset($_POST['texto']) ? trim($_POST['texto']) : '';
if (empty($titulo)) {
echo json_encode(['success' => false, 'error' => 'El título no puede estar vacío.']);
exit;
}
try {
$db = db();
$stmt = $db->prepare("INSERT INTO cobertura (titulo, texto) VALUES (?, ?)");
if ($stmt->execute([$titulo, $texto])) {
echo json_encode(['success' => true, 'id' => $db->lastInsertId()]);
} else {
echo json_encode(['success' => false, 'error' => 'No se pudo guardar en la base de datos.']);
}
} catch (PDOException $e) {
echo json_encode(['success' => false, 'error' => 'Error de base de datos: ' . $e->getMessage()]);
}

32
add_cobertura_xpress.php Normal file
View File

@ -0,0 +1,32 @@
<?php
session_start();
header('Content-Type: application/json');
if (!isset($_SESSION['user_id'])) {
echo json_encode(['success' => false, 'error' => 'No autorizado']);
exit;
}
require_once 'db/config.php';
$titulo = isset($_POST['titulo']) ? trim($_POST['titulo']) : '';
$texto = isset($_POST['texto']) ? trim($_POST['texto']) : '';
if (empty($titulo) && empty($texto)) {
echo json_encode(['success' => false, 'error' => 'Los campos no pueden estar vacíos.']);
exit;
}
try {
$db = db();
$stmt = $db->prepare("INSERT INTO cobertura_xpress (titulo, texto) VALUES (?, ?)");
if ($stmt->execute([$titulo, $texto])) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'error' => 'No se pudo guardar en la base de datos.']);
}
} catch (PDOException $e) {
echo json_encode(['success' => false, 'error' => 'Error de base de datos: ' . $e->getMessage()]);
}
?>

21
add_column.php Normal file
View File

@ -0,0 +1,21 @@
<?php
require_once 'db/config.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nombre = trim($_POST['nombre']);
if (!empty($nombre)) {
$pdo = db();
// Find the current max order value
$stmt_max_order = $pdo->query('SELECT MAX(orden) AS max_orden FROM kanban_columns');
$max_orden = $stmt_max_order->fetchColumn();
$new_orden = $max_orden + 1;
$stmt = $pdo->prepare('INSERT INTO kanban_columns (nombre, orden) VALUES (?, ?)');
$stmt->execute([$nombre, $new_orden]);
}
}
header('Location: kanban.php');
exit;

218
assets/css/style.css Normal file
View File

@ -0,0 +1,218 @@
/* General Body Styles */
body {
background-color: #f4f7f6;
font-family: 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
display: flex;
color: #333;
}
/* Sidebar Styles */
.sidebar {
width: 260px;
height: 100vh;
position: fixed;
top: 0;
left: 0;
background: linear-gradient(145deg, #2c3e50, #34495e);
color: #ecf0f1;
padding-top: 20px;
box-shadow: 2px 0 15px rgba(0,0,0,0.1);
}
.sidebar .navbar-brand {
padding: 1rem 1.5rem;
color: #fff;
font-weight: bold;
text-align: center;
font-size: 1.5rem;
}
.sidebar .nav-link {
padding: 12px 25px;
text-decoration: none;
font-size: 1rem;
color: #bdc3c7;
display: block;
transition: all 0.3s ease;
}
.sidebar .nav-link i {
margin-right: 15px;
width: 20px; /* Align icons */
text-align: center;
}
.sidebar .nav-link:hover, .sidebar .nav-link.active {
background-color: #4a627a;
color: #fff;
border-left: 4px solid #3498db;
padding-left: 21px;
}
.sidebar .nav-item.mt-auto {
position: absolute;
bottom: 20px;
width: 100%;
}
/* Content Area Styles */
.content {
margin-left: 260px;
padding: 30px;
width: calc(100% - 260px);
overflow-y: auto;
}
h1, .h1 {
color: #333 !important; /* Color oscuro para los títulos */
}
/* Card Styles */
.card {
border: none;
border-radius: 10px;
box-shadow: 0 4px 12px rgba(0,0,0,0.08);
margin-bottom: 20px;
}
.card-header {
background-color: #fff;
border-bottom: 1px solid #e0e0e0;
padding: 1rem 1.5rem;
font-weight: 600;
}
.card-title {
margin: 0;
font-size: 1.2rem;
}
/* Button Styles */
.btn-primary {
background-color: #3498db;
border-color: #3498db;
transition: background-color 0.3s;
}
.btn-primary:hover {
background-color: #2980b9;
border-color: #2980b9;
}
.btn-info {
background-color: #1abc9c;
border-color: #1abc9c;
}
.btn-info:hover {
background-color: #16a085;
border-color: #16a085;
}
/* Table Styles */
.table {
margin-bottom: 0;
}
.table thead th {
background-color: #f8f9fa;
border-bottom-width: 1px;
font-weight: 600;
}
.table-striped tbody tr:nth-of-type(odd) {
background-color: rgba(0,0,0,0.02);
}
.badge {
font-size: 0.85rem;
padding: 0.5em 0.9em;
}
/* Form Styles */
.form-label {
font-weight: 500;
}
.form-control, .form-select {
border-radius: 5px;
}
.form-control:focus, .form-select:focus {
border-color: #3498db;
box-shadow: 0 0 0 0.2rem rgba(52, 152, 219, 0.25);
}
/* Payment Verification Status Styles */
.badge.estado-pago-pendiente {
background-color: #fcf8e3 !important;
color: #8a6d3b !important;
padding: 8px 12px;
border-radius: 4px;
font-weight: 500;
}
.badge.estado-pago-verificado {
background-color: #2E8B57 !important;
color: #fff !important;
padding: 8px 12px;
border-radius: 4px;
font-weight: 500;
}
/* Style for the select element inside the badge */
.form-select-pago {
background-color: transparent;
border: none;
color: inherit; /* Inherit text color from parent badge */
font-weight: inherit; /* Inherit font weight */
padding: 0;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.form-select-pago:focus {
box-shadow: none;
}
/* Make the select options have a standard background */
.form-select-pago option {
background-color: #fff;
color: #333;
}
/* Custom Search Table Styles */
.custom-search-table {
border-collapse: separate;
border-spacing: 0;
width: 100%;
}
.custom-search-table thead th {
background-color: #e9ecef; /* A light grey for the header */
color: #495057;
font-weight: 600;
text-align: left;
padding: 12px 15px;
border-bottom: 2px solid #dee2e6;
}
.custom-search-table tbody td {
padding: 12px 15px;
border-bottom: 1px solid #ecf0f1; /* Light border for rows */
color: #555;
}
.custom-search-table tbody tr:last-child td {
border-bottom: none; /* No border for the last row */
}
.custom-search-table tbody tr:hover {
background-color: #f8f9fa; /* Subtle hover effect */
}
/* Add rounded corners to the container of the table */
.table-responsive {
border-radius: 8px;
overflow: hidden; /* This is important to make border-radius work on tables */
border: 1px solid #dee2e6;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 KiB

Some files were not shown because too many files have changed in this diff Show More