diff --git a/assets/uploads/vouchers/69822ac9eb5a0-WhatsApp Image 2026-02-03 at 11.57.04 AM.jpeg b/assets/uploads/vouchers/69822ac9eb5a0-WhatsApp Image 2026-02-03 at 11.57.04 AM.jpeg new file mode 100644 index 0000000..3fb47f3 Binary files /dev/null and b/assets/uploads/vouchers/69822ac9eb5a0-WhatsApp Image 2026-02-03 at 11.57.04 AM.jpeg differ diff --git a/assets/uploads/vouchers/69823b317b647-WhatsApp Image 2026-02-01 at 1.36.00 PM.jpeg b/assets/uploads/vouchers/69823b317b647-WhatsApp Image 2026-02-01 at 1.36.00 PM.jpeg new file mode 100644 index 0000000..44083d2 Binary files /dev/null and b/assets/uploads/vouchers/69823b317b647-WhatsApp Image 2026-02-01 at 1.36.00 PM.jpeg differ diff --git a/assets/uploads/vouchers/69823c67cccb3-WhatsApp Image 2026-02-03 at 12.43.50 PM.jpeg b/assets/uploads/vouchers/69823c67cccb3-WhatsApp Image 2026-02-03 at 12.43.50 PM.jpeg new file mode 100644 index 0000000..a7b499f Binary files /dev/null and b/assets/uploads/vouchers/69823c67cccb3-WhatsApp Image 2026-02-03 at 12.43.50 PM.jpeg differ diff --git a/assets/uploads/vouchers/69823d8938121-WhatsApp Image 2026-02-02 at 10.08.55 AM.jpeg b/assets/uploads/vouchers/69823d8938121-WhatsApp Image 2026-02-02 at 10.08.55 AM.jpeg new file mode 100644 index 0000000..0a3362d Binary files /dev/null and b/assets/uploads/vouchers/69823d8938121-WhatsApp Image 2026-02-02 at 10.08.55 AM.jpeg differ diff --git a/assets/uploads/vouchers/69823dd5a11d1-WhatsApp Image 2026-02-03 at 1.04.05 PM.jpeg b/assets/uploads/vouchers/69823dd5a11d1-WhatsApp Image 2026-02-03 at 1.04.05 PM.jpeg new file mode 100644 index 0000000..e9f3a42 Binary files /dev/null and b/assets/uploads/vouchers/69823dd5a11d1-WhatsApp Image 2026-02-03 at 1.04.05 PM.jpeg differ diff --git a/assets/uploads/vouchers/69823e206847d-WhatsApp Image 2026-02-03 at 1.25.14 PM.jpeg b/assets/uploads/vouchers/69823e206847d-WhatsApp Image 2026-02-03 at 1.25.14 PM.jpeg new file mode 100644 index 0000000..9cd50ec Binary files /dev/null and b/assets/uploads/vouchers/69823e206847d-WhatsApp Image 2026-02-03 at 1.25.14 PM.jpeg differ diff --git a/assets/uploads/vouchers/6982417fab4e3-WhatsApp Image 2026-02-03 at 1.35.08 PM.jpeg b/assets/uploads/vouchers/6982417fab4e3-WhatsApp Image 2026-02-03 at 1.35.08 PM.jpeg new file mode 100644 index 0000000..a62c20d Binary files /dev/null and b/assets/uploads/vouchers/6982417fab4e3-WhatsApp Image 2026-02-03 at 1.35.08 PM.jpeg differ diff --git a/assets/uploads/vouchers/698241b1c0902-WhatsApp Image 2026-02-03 at 9.54.46 AM.jpeg b/assets/uploads/vouchers/698241b1c0902-WhatsApp Image 2026-02-03 at 9.54.46 AM.jpeg new file mode 100644 index 0000000..d7ff30d Binary files /dev/null and b/assets/uploads/vouchers/698241b1c0902-WhatsApp Image 2026-02-03 at 9.54.46 AM.jpeg differ diff --git a/assets/uploads/vouchers/698241dac1463-WhatsApp Image 2026-02-02 at 8.51.22 AM.jpeg b/assets/uploads/vouchers/698241dac1463-WhatsApp Image 2026-02-02 at 8.51.22 AM.jpeg new file mode 100644 index 0000000..3a85259 Binary files /dev/null and b/assets/uploads/vouchers/698241dac1463-WhatsApp Image 2026-02-02 at 8.51.22 AM.jpeg differ diff --git a/assets/uploads/vouchers/698241dc754ec-WhatsApp Image 2026-02-03 at 1.38.08 PM.jpeg b/assets/uploads/vouchers/698241dc754ec-WhatsApp Image 2026-02-03 at 1.38.08 PM.jpeg new file mode 100644 index 0000000..bb332ba Binary files /dev/null and b/assets/uploads/vouchers/698241dc754ec-WhatsApp Image 2026-02-03 at 1.38.08 PM.jpeg differ diff --git a/assets/uploads/vouchers/698242260478b-WhatsApp Image 2026-02-03 at 9.05.26 AM.jpeg b/assets/uploads/vouchers/698242260478b-WhatsApp Image 2026-02-03 at 9.05.26 AM.jpeg new file mode 100644 index 0000000..3766dc8 Binary files /dev/null and b/assets/uploads/vouchers/698242260478b-WhatsApp Image 2026-02-03 at 9.05.26 AM.jpeg differ diff --git a/assets/uploads/vouchers/69824251c8eb4-WhatsApp Image 2026-02-03 at 9.18.01 AM.jpeg b/assets/uploads/vouchers/69824251c8eb4-WhatsApp Image 2026-02-03 at 9.18.01 AM.jpeg new file mode 100644 index 0000000..c378ec3 Binary files /dev/null and b/assets/uploads/vouchers/69824251c8eb4-WhatsApp Image 2026-02-03 at 9.18.01 AM.jpeg differ diff --git a/assets/uploads/vouchers/698242913efc3-WhatsApp Image 2026-02-03 at 10.18.56 AM.jpeg b/assets/uploads/vouchers/698242913efc3-WhatsApp Image 2026-02-03 at 10.18.56 AM.jpeg new file mode 100644 index 0000000..4569c38 Binary files /dev/null and b/assets/uploads/vouchers/698242913efc3-WhatsApp Image 2026-02-03 at 10.18.56 AM.jpeg differ diff --git a/assets/uploads/vouchers/698242b1a3e1b-WhatsApp Image 2026-02-02 at 7.25.19 PM.jpeg b/assets/uploads/vouchers/698242b1a3e1b-WhatsApp Image 2026-02-02 at 7.25.19 PM.jpeg new file mode 100644 index 0000000..a62ec62 Binary files /dev/null and b/assets/uploads/vouchers/698242b1a3e1b-WhatsApp Image 2026-02-02 at 7.25.19 PM.jpeg differ diff --git a/assets/uploads/vouchers/698242e9bbe5d-WhatsApp Image 2026-02-03 at 10.47.06 AM.jpeg b/assets/uploads/vouchers/698242e9bbe5d-WhatsApp Image 2026-02-03 at 10.47.06 AM.jpeg new file mode 100644 index 0000000..3a582c2 Binary files /dev/null and b/assets/uploads/vouchers/698242e9bbe5d-WhatsApp Image 2026-02-03 at 10.47.06 AM.jpeg differ diff --git a/assets/uploads/vouchers/698244eee94b5-WhatsApp Image 2026-02-03 at 1.55.08 PM.jpeg b/assets/uploads/vouchers/698244eee94b5-WhatsApp Image 2026-02-03 at 1.55.08 PM.jpeg new file mode 100644 index 0000000..6f9a86b Binary files /dev/null and b/assets/uploads/vouchers/698244eee94b5-WhatsApp Image 2026-02-03 at 1.55.08 PM.jpeg differ diff --git a/assets/uploads/vouchers/698246de4d0cd-WhatsApp Image 2026-02-03 at 2.02.24 PM.jpeg b/assets/uploads/vouchers/698246de4d0cd-WhatsApp Image 2026-02-03 at 2.02.24 PM.jpeg new file mode 100644 index 0000000..e2506a0 Binary files /dev/null and b/assets/uploads/vouchers/698246de4d0cd-WhatsApp Image 2026-02-03 at 2.02.24 PM.jpeg differ diff --git a/assets/uploads/vouchers/6982478611c77-WhatsApp Image 2026-02-02 at 2.53.03 PM.jpeg b/assets/uploads/vouchers/6982478611c77-WhatsApp Image 2026-02-02 at 2.53.03 PM.jpeg new file mode 100644 index 0000000..23f0488 Binary files /dev/null and b/assets/uploads/vouchers/6982478611c77-WhatsApp Image 2026-02-02 at 2.53.03 PM.jpeg differ diff --git a/assets/uploads/vouchers/69824bc3c441b-WhatsApp Image 2026-02-02 at 2.03.16 PM.jpeg b/assets/uploads/vouchers/69824bc3c441b-WhatsApp Image 2026-02-02 at 2.03.16 PM.jpeg new file mode 100644 index 0000000..bce0350 Binary files /dev/null and b/assets/uploads/vouchers/69824bc3c441b-WhatsApp Image 2026-02-02 at 2.03.16 PM.jpeg differ diff --git a/assets/uploads/vouchers/69824eea968a0-WhatsApp Image 2026-02-02 at 1.24.58 PM.jpeg b/assets/uploads/vouchers/69824eea968a0-WhatsApp Image 2026-02-02 at 1.24.58 PM.jpeg new file mode 100644 index 0000000..578d800 Binary files /dev/null and b/assets/uploads/vouchers/69824eea968a0-WhatsApp Image 2026-02-02 at 1.24.58 PM.jpeg differ diff --git a/assets/uploads/vouchers/69824fb72ee70-WhatsApp Image 2026-02-03 at 2.39.04 PM.jpeg b/assets/uploads/vouchers/69824fb72ee70-WhatsApp Image 2026-02-03 at 2.39.04 PM.jpeg new file mode 100644 index 0000000..636151b Binary files /dev/null and b/assets/uploads/vouchers/69824fb72ee70-WhatsApp Image 2026-02-03 at 2.39.04 PM.jpeg differ diff --git a/assets/uploads/vouchers/698252902102f-WhatsApp Image 2026-02-02 at 10.46.44 AM.jpeg b/assets/uploads/vouchers/698252902102f-WhatsApp Image 2026-02-02 at 10.46.44 AM.jpeg new file mode 100644 index 0000000..8f01916 Binary files /dev/null and b/assets/uploads/vouchers/698252902102f-WhatsApp Image 2026-02-02 at 10.46.44 AM.jpeg differ diff --git a/assets/uploads/vouchers/698252c52cfea-WhatsApp Image 2026-02-02 at 7.01.43 AM.jpeg b/assets/uploads/vouchers/698252c52cfea-WhatsApp Image 2026-02-02 at 7.01.43 AM.jpeg new file mode 100644 index 0000000..d3809be Binary files /dev/null and b/assets/uploads/vouchers/698252c52cfea-WhatsApp Image 2026-02-02 at 7.01.43 AM.jpeg differ diff --git a/assets/uploads/vouchers/698255538903a-WhatsApp Image 2026-02-03 at 2.33.42 PM.jpeg b/assets/uploads/vouchers/698255538903a-WhatsApp Image 2026-02-03 at 2.33.42 PM.jpeg new file mode 100644 index 0000000..a79efa0 Binary files /dev/null and b/assets/uploads/vouchers/698255538903a-WhatsApp Image 2026-02-03 at 2.33.42 PM.jpeg differ diff --git a/assets/uploads/vouchers/69825a68dff45-WhatsApp Image 2026-02-03 at 2.29.48 PM.jpeg b/assets/uploads/vouchers/69825a68dff45-WhatsApp Image 2026-02-03 at 2.29.48 PM.jpeg new file mode 100644 index 0000000..0addae8 Binary files /dev/null and b/assets/uploads/vouchers/69825a68dff45-WhatsApp Image 2026-02-03 at 2.29.48 PM.jpeg differ diff --git a/assets/uploads/vouchers/6982634fc9575-WhatsApp Image 2026-02-03 at 3.59.41 PM.jpeg b/assets/uploads/vouchers/6982634fc9575-WhatsApp Image 2026-02-03 at 3.59.41 PM.jpeg new file mode 100644 index 0000000..c5b5eab Binary files /dev/null and b/assets/uploads/vouchers/6982634fc9575-WhatsApp Image 2026-02-03 at 3.59.41 PM.jpeg differ diff --git a/configuracion.php b/configuracion.php index 6f9edf9..9e42745 100644 --- a/configuracion.php +++ b/configuracion.php @@ -1,150 +1,74 @@ prepare('SELECT valor FROM configuracion WHERE clave = ?'); -$stmt_banner->execute(['banner_text']); -$banner_text = $stmt_banner->fetchColumn(); +// Asegurarse de que el usuario sea administrador +if ($_SESSION['user_role'] !== 'Administrador' && $_SESSION['user_role'] !== 'admin') { + echo "
Acceso denegado.
"; + require_once 'layout_footer.php'; + exit(); +} -// Fetch kanban columns -$kanban_columns = $db->query("SELECT id, nombre FROM kanban_columns ORDER BY id")->fetchAll(PDO::FETCH_ASSOC); +$conn = db(); -include 'layout_header.php'; +// Obtener la configuración actual +$query = "SELECT * FROM configuracion WHERE id = 1"; +$result = $conn->query($query); +$config = $result->fetch(PDO::FETCH_ASSOC); + +// Columnas disponibles +$available_columns = [ + 'new' => 'Nuevos', + 'reagendado' => 'Reagendado', + 'no_contactado' => 'No Contactado', + 'contactado' => 'Contactado', + 'agendado' => 'Agendado', + 'en_ruta' => 'En Ruta', + 'entregado' => 'Entregado', + 'no_entregado' => 'No Entregado', + 'reprogramado' => 'Reprogramado' +]; + +$visible_columns = $config ? json_decode($config['kanban_columns'], true) : []; + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $new_visible_columns = $_POST['columns'] ?? []; + $json_columns = json_encode($new_visible_columns); + + $update_query = "UPDATE configuracion SET kanban_columns = :kanban_columns WHERE id = 1"; + $stmt = $conn->prepare($update_query); + $stmt->bindParam(':kanban_columns', $json_columns); + + if ($stmt->execute()) { + echo "
Configuración guardada correctamente.
"; + $visible_columns = $new_visible_columns; + } else { + echo "
Error al guardar la configuración.
"; + } +} ?>
- -
- -
- - -
- -
- +

Configuración de Columnas del Kanban

+

Selecciona las columnas que deseas que sean visibles en el tablero Kanban.

-

Configuración General

- - -
-
-

Editar Banner del Kanban

-
-
-
-
- - - Este texto aparecerá en un banner deslizante en la parte superior del tablero Kanban. + +
+ $name): ?> +
+
+ > + +
- - +
-
- -
-
-

Editar Imagen de Cobertura

-
-
-
-

Imagen actual:

- - Banner de Cobertura - -

No hay ninguna imagen de cobertura cargada.

- -
-
-
- - - La imagen se guardará como .jpg y se mostrará en la sección de Cobertura. -
- -
-
-
- - -
-
-

Editar Imagen de Cobertura Xpress

-
-
-
-

Imagen actual:

- - Banner de Cobertura Xpress - -

No hay ninguna imagen de Cobertura Xpress cargada.

- -
-
-
- - - Esta imagen se mostrará en la sección de Cobertura Xpress. -
- -
-
-
- - -
-
-

Configuración de Columnas Kanban

-
-
- - - - - - - - - - - - - - - - - - - -
IDNombre de la ColumnaAcción
- - - - - Eliminar -
-
-
- -
- -
-
-
+ +
- + \ No newline at end of file diff --git a/db/migrations/053_add_c_pedidos_to_flujo_caja.sql b/db/migrations/053_add_c_pedidos_to_flujo_caja.sql new file mode 100644 index 0000000..fd726c6 --- /dev/null +++ b/db/migrations/053_add_c_pedidos_to_flujo_caja.sql @@ -0,0 +1 @@ +ALTER TABLE `flujo_caja` ADD `c_pedidos` VARCHAR(255) NULL AFTER `fecha`; \ No newline at end of file diff --git a/flujo_de_caja.php b/flujo_de_caja.php index f5dae5c..34649db 100644 --- a/flujo_de_caja.php +++ b/flujo_de_caja.php @@ -9,12 +9,21 @@ $start_date = "$year-$month-01"; $days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year); $end_date = "$year-$month-$days_in_month"; -$columns = [ +// Columns from DB that are editable +$db_columns = [ 'bcp_yape', 'b_nacion', 'interbank', 'bbva', 'otros_ingresos', 'tu1', 'tu2', 'tu3', 'fl1', 'fl2', 'fl3', - 'rc_envio', 'rc_contraent', 'sc' + 'rc_contraent', 'sc', 'c_pedidos' ]; +// Columns to display in the table body in order +$display_columns = [ + 'bcp_yape', 'b_nacion', 'interbank', 'bbva', 'otros_ingresos', + 'tu1', 'tu2', 'tu3', 'fl1', 'fl2', 'fl3', + 'rc_envio', 'rc_contraent' +]; + + // Fetch data from DB $flujo_data = []; try { @@ -33,26 +42,39 @@ try { $all_days_data = []; for ($day = 1; $day <= $days_in_month; $day++) { $date = date('Y-m-d', strtotime("$year-$month-$day")); - $all_days_data[$date] = isset($flujo_data[$date]) ? $flujo_data[$date] : array_fill_keys($columns, '0.00'); + if (isset($flujo_data[$date])) { + $all_days_data[$date] = $flujo_data[$date]; + } else { + // Initialize with 0.00 for all expected columns + $all_days_data[$date] = array_fill_keys($db_columns, '0.00'); + } } // Calculate totals -$totals = array_fill_keys($columns, 0); +$totals = array_fill_keys($display_columns, 0); +$totals['sc'] = 0; +$totals['c_pedidos'] = 0; $totals['total_ingresos'] = 0; $totals['total_inversion'] = 0; $totals['recaudo_final'] = 0; -foreach ($all_days_data as $day_data) { - $ingresos_dia = (float)$day_data['bcp_yape'] + (float)$day_data['b_nacion'] + (float)$day_data['interbank'] + (float)$day_data['bbva'] + (float)$day_data['otros_ingresos'] + (float)$day_data['rc_envio'] + (float)$day_data['rc_contraent']; - $inversion_dia = (float)$day_data['tu1'] + (float)$day_data['tu2'] + (float)$day_data['tu3'] + (float)$day_data['fl1'] + (float)$day_data['fl2'] + (float)$day_data['fl3']; +foreach ($all_days_data as $date => &$day_data) { + $rc_envio_dia = (float)($day_data['bcp_yape'] ?? 0) + (float)($day_data['b_nacion'] ?? 0) + (float)($day_data['interbank'] ?? 0) + (float)($day_data['bbva'] ?? 0) + (float)($day_data['otros_ingresos'] ?? 0); + $day_data['rc_envio'] = $rc_envio_dia; + + $ingresos_dia = $rc_envio_dia + (float)($day_data['rc_contraent'] ?? 0); + $inversion_dia = (float)($day_data['tu1'] ?? 0) + (float)($day_data['tu2'] ?? 0) + (float)($day_data['tu3'] ?? 0) + (float)($day_data['fl1'] ?? 0) + (float)($day_data['fl2'] ?? 0) + (float)($day_data['fl3'] ?? 0); - foreach ($columns as $col) { - $totals[$col] += (float)$day_data[$col]; + foreach ($display_columns as $col) { + $totals[$col] += (float)($day_data[$col] ?? 0); } + $totals['sc'] += (float)($day_data['sc'] ?? 0); + $totals['c_pedidos'] += (int)($day_data['c_pedidos'] ?? 0); $totals['total_ingresos'] += $ingresos_dia; $totals['total_inversion'] += $inversion_dia; $totals['recaudo_final'] += ($ingresos_dia - $inversion_dia); } +unset($day_data); ?> @@ -108,14 +130,15 @@ foreach ($all_days_data as $day_data) { Fecha + C.pedidos Ingresos Inversion Publicitaria RC ENVIO RC CONTRAENT - Sc Total Ingresos Total Inversion Publicitaria Recaudo final + Sc BCP/YAPE @@ -135,24 +158,32 @@ foreach ($all_days_data as $day_data) { $day_data): ?> - - + + + + + + + 0.00 0.00 0.00 + TOTAL - + + + @@ -169,7 +200,13 @@ document.addEventListener('DOMContentLoaded', function() { return parseFloat(cell.textContent.replace(/,/g, '')) || 0; }; - const ingresos = getVal('bcp_yape') + getVal('b_nacion') + getVal('interbank') + getVal('bbva') + getVal('otros_ingresos') + getVal('rc_envio') + getVal('rc_contraent'); + const rcEnvio = getVal('bcp_yape') + getVal('b_nacion') + getVal('interbank') + getVal('bbva') + getVal('otros_ingresos'); + const rcEnvioCell = row.querySelector('[data-column="rc_envio"]'); + if (rcEnvioCell) { + rcEnvioCell.textContent = rcEnvio.toFixed(2); + } + + const ingresos = rcEnvio + getVal('rc_contraent'); const totalInversion = getVal('tu1') + getVal('tu2') + getVal('tu3') + getVal('fl1') + getVal('fl2') + getVal('fl3'); const recaudoFinal = ingresos - totalInversion; @@ -180,16 +217,20 @@ document.addEventListener('DOMContentLoaded', function() { function updateGrandTotals() { const grandTotals = { - + + 'c_pedidos': 0, + 'sc': 0, 'total-ingresos': 0, 'total-inversion': 0, 'recaudo-final': 0 }; table.querySelectorAll('tbody tr').forEach(row => { - + grandTotals[''] += parseFloat(row.querySelector(`[data-column=""]`).textContent.replace(/,/g, '')) || 0; + grandTotals['c_pedidos'] += parseInt(row.querySelector(`[data-column="c_pedidos"]`).textContent.replace(/,/g, '')) || 0; + grandTotals['sc'] += parseFloat(row.querySelector(`[data-column="sc"]`).textContent.replace(/,/g, '')) || 0; grandTotals['total-ingresos'] += parseFloat(row.querySelector('.total-ingresos').textContent.replace(/,/g, '')) || 0; grandTotals['total-inversion'] += parseFloat(row.querySelector('.total-inversion').textContent.replace(/,/g, '')) || 0; grandTotals['recaudo-final'] += parseFloat(row.querySelector('.recaudo-final').textContent.replace(/,/g, '')) || 0; @@ -198,7 +239,11 @@ document.addEventListener('DOMContentLoaded', function() { for (const key in grandTotals) { const th = table.querySelector(`tfoot [data-total-column="${key}"]`); if (th) { - th.textContent = grandTotals[key].toFixed(2); + if (key === 'c_pedidos') { + th.textContent = grandTotals[key]; + } else { + th.textContent = grandTotals[key].toFixed(2); + } } } } @@ -222,12 +267,23 @@ document.addEventListener('DOMContentLoaded', function() { const row = cell.closest('tr'); const date = row.dataset.date; const column = cell.dataset.column; - let value = parseFloat(cell.textContent.replace(/,/g, '')); + let value; + + if (column === 'c_pedidos') { + value = parseInt(cell.textContent.replace(/,/g, '')); + } else { + value = parseFloat(cell.textContent.replace(/,/g, '')); + } if (isNaN(value)) { value = 0; } - cell.textContent = value.toFixed(2); + + if (column === 'c_pedidos') { + cell.textContent = value; + } else { + cell.textContent = value.toFixed(2); + } fetch('save_flujo_caja.php', { method: 'POST', @@ -258,4 +314,4 @@ document.addEventListener('DOMContentLoaded', function() { \ No newline at end of file +?> diff --git a/kanban.php b/kanban.php index 6a3b4ee..8449089 100644 --- a/kanban.php +++ b/kanban.php @@ -1,223 +1,146 @@ prepare('SELECT valor FROM configuracion WHERE clave = ?'); -$stmt_banner->execute(['banner_text']); -$banner_text = $stmt_banner->fetchColumn(); -if (empty($banner_text)) { - $banner_text = '¡Define tu frase motivacional en la sección de Información de Producto!'; -} +// Obtener la configuración de las columnas del Kanban +$stmt = $pdo->query("SELECT kanban_columns FROM configuracion WHERE id = 1"); +$config = $stmt->fetch(PDO::FETCH_ASSOC); -// Fetch Kanban columns -$stmt_columns = $pdo->query('SELECT id, nombre FROM kanban_columns ORDER BY orden ASC'); -$columns = $stmt_columns->fetchAll(PDO::FETCH_ASSOC); - -// If no columns exist, create default ones -if (empty($columns)) { - $default_columns = ['Backlog', 'En Proceso', 'Hecho']; - $stmt_insert = $pdo->prepare('INSERT INTO kanban_columns (nombre, orden) VALUES (?, ?)'); - foreach ($default_columns as $index => $name) { - $stmt_insert->execute([$name, $index + 1]); +$columns_to_display = []; +if ($config && !empty($config['kanban_columns'])) { + $column_ids = json_decode($config['kanban_columns'], true); + if (!empty($column_ids)) { + $placeholders = implode(',', array_fill(0, count($column_ids), '?')); + $stmt = $pdo->prepare("SELECT id, nombre FROM kanban_columns WHERE id IN ($placeholders)"); + $stmt->execute($column_ids); + $columns_to_display = $stmt->fetchAll(PDO::FETCH_ASSOC); } - // Re-fetch columns - $stmt_columns = $pdo->query('SELECT id, nombre FROM kanban_columns ORDER BY orden ASC'); - $columns = $stmt_columns->fetchAll(PDO::FETCH_ASSOC); } -// Fetch info cards and group them by column -$stmt_cards = $pdo->query(' - SELECT - ip.id, - ip.texto_informativo, - ip.imagen_url, - ip.column_id, - p.nombre as producto_nombre - FROM - info_productos ip - LEFT JOIN - products p ON ip.producto_id = p.id - ORDER BY - ip.id ASC -'); -$cards = $stmt_cards->fetchAll(PDO::FETCH_ASSOC); - - - - -$cards_by_column = []; -foreach ($cards as $card) { - $column_id = $card['column_id'] ?: 'unassigned'; - $cards_by_column[$column_id][] = $card; +if (empty($columns_to_display)) { + $stmt = $pdo->query("SELECT id, nombre FROM kanban_columns"); + $columns_to_display = $stmt->fetchAll(PDO::FETCH_ASSOC); } +// Obtener todos los productos de información +$stmt = $pdo->query("SELECT ip.*, p.nombre as producto_nombre FROM info_productos ip LEFT JOIN products p ON ip.product_id = p.id"); +$items = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$pageTitle = "Kanban de Productos"; +$pageDescription = "Tablero Kanban para visualizar la información de los productos."; + +include 'layout_header.php'; ?> - -
-
-

-
-
-
-

Tablero Kanban

-

Visualiza el flujo de trabajo de la información de tus productos.

+
+
+
+

+
+

-
- -
-
-
-
-
- - -
- - Imagen del producto - -
- -
- -

- -
+
+
+
+
+ +
+
+
- - -
-
- - - -
-
-
Sin Asignar
-
-
- - -
- - Imagen del producto - -
- -
- -

- +
+ + +
+
+ + Imagen del producto + +
+

+ + +
+
+ +
- +
+ + - \ No newline at end of file + diff --git a/layout_header.php b/layout_header.php index 036995e..98f66de 100644 --- a/layout_header.php +++ b/layout_header.php @@ -165,6 +165,12 @@ $navItems = [ 'icon' => 'fa-users', 'text' => 'Gestionar Usuarios', 'roles' => ['Administrador', 'admin'] + ], + 'configuracion' => [ + 'url' => 'configuracion.php', + 'icon' => 'fa-cog', + 'text' => 'Configuración', + 'roles' => ['Administrador', 'admin'] ] ]; diff --git a/save_flujo_caja.php b/save_flujo_caja.php index 120aedc..481b667 100644 --- a/save_flujo_caja.php +++ b/save_flujo_caja.php @@ -10,9 +10,9 @@ if ($data) { // Column name validation to prevent SQL injection $allowed_columns = [ - 'bcp_yape', 'b_nacion', 'interbank', 'bbva', 'otros_ingresos', + 'c_pedidos', 'bcp_yape', 'b_nacion', 'interbank', 'bbva', 'otros_ingresos', 'tu1', 'tu2', 'tu3', 'fl1', 'fl2', 'fl3', - 'rc_envio', 'rc_contraent', 'sc', 'total_inversion_publicitaria' + 'rc_contraent', 'sc', 'total_inversion_publicitaria' ]; if (in_array($columna, $allowed_columns)) {