prepare("DELETE FROM rentabilidad_productos WHERE reporte_id = ? AND product_id = ?"); $stmt->execute([$_GET['reporte_id'], $_GET['product_id']]); $_SESSION['message'] = '
Producto eliminado de este reporte.
'; } } catch (PDOException $e) { $_SESSION['message'] = '
Error de base de datos: ' . $e->getMessage() . '
'; } header('Location: rentabilidad.php'); exit; } $db = db(); $message = ''; // Manejar las acciones del formulario (POST requests) if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { try { switch ($_POST['action']) { case 'create_report': // 1. Crear el reporte $stmt = $db->prepare("INSERT INTO rentabilidad_reportes (fecha_inicio, fecha_fin) VALUES (CURDATE(), CURDATE())"); $stmt->execute(); $reporte_id = $db->lastInsertId(); // 2. Poblar el reporte con todos los productos existentes $products_stmt = $db->query("SELECT id FROM products"); $products_ids = $products_stmt->fetchAll(PDO::FETCH_COLUMN); $insert_sql = "INSERT INTO rentabilidad_productos (reporte_id, product_id) VALUES (:reporte_id, :product_id)"; $insert_stmt = $db->prepare($insert_sql); foreach ($products_ids as $product_id) { $insert_stmt->execute([':reporte_id' => $reporte_id, ':product_id' => $product_id]); } $_SESSION['message'] = '
Nuevo reporte creado y poblado con todos los productos.
'; break; case 'delete_report': if (isset($_POST['reporte_id'])) { $stmt = $db->prepare("DELETE FROM rentabilidad_reportes WHERE id = ?"); $stmt->execute([$_POST['reporte_id']]); // Los productos asociados se borran en cascada por la BD $_SESSION['message'] = '
Reporte eliminado correctamente.
'; } break; case 'save_report': if (isset($_POST['reporte_id']) && isset($_POST['fecha_inicio']) && isset($_POST['fecha_fin'])) { $reporte_id = $_POST['reporte_id']; $stmt = $db->prepare("UPDATE rentabilidad_reportes SET fecha_inicio = ?, fecha_fin = ? WHERE id = ?"); $stmt->execute([$_POST['fecha_inicio'], $_POST['fecha_fin'], $reporte_id]); if (isset($_POST['productos'])) { $sql = "INSERT INTO rentabilidad_productos (reporte_id, product_id, recaudo, recaudo_ct, unidades_vendidas, unidades_vendidas_ct, costo_producto, costo_ads, comision) VALUES (:reporte_id, :product_id, :recaudo, :recaudo_ct, :unidades_vendidas, :unidades_vendidas_ct, :costo_producto, :costo_ads, :comision) ON DUPLICATE KEY UPDATE recaudo = VALUES(recaudo), recaudo_ct = VALUES(recaudo_ct), unidades_vendidas = VALUES(unidades_vendidas), unidades_vendidas_ct = VALUES(unidades_vendidas_ct), costo_producto = VALUES(costo_producto), costo_ads = VALUES(costo_ads), comision = VALUES(comision)"; $stmt = $db->prepare($sql); foreach ($_POST['productos'] as $product_id => $data) { $stmt->execute([ ':reporte_id' => $reporte_id, ':product_id' => $product_id, ':recaudo' => $data['recaudo'] ?: 0, ':recaudo_ct' => $data['recaudo_ct'] ?: 0, ':unidades_vendidas' => $data['unidades_vendidas'] ?: 0, ':unidades_vendidas_ct' => $data['unidades_vendidas_ct'] ?: 0, ':costo_producto' => $data['costo_producto'] ?: 0, ':costo_ads' => $data['costo_ads'] ?: 0, ':comision' => $data['comision'] ?: 0, ]); } } $_SESSION['message'] = '
Reporte guardado correctamente.
'; } break; case 'remove_product': if (isset($_POST['reporte_id']) && isset($_POST['product_id'])) { $stmt = $db->prepare("DELETE FROM rentabilidad_productos WHERE reporte_id = ? AND product_id = ?"); $stmt->execute([$_POST['reporte_id'], $_POST['product_id']]); $_SESSION['message'] = '
Producto eliminado de este reporte.
'; } break; case 'add_product': if (isset($_POST['reporte_id']) && isset($_POST['product_id']) && !empty($_POST['product_id'])) { $stmt = $db->prepare("INSERT IGNORE INTO rentabilidad_productos (reporte_id, product_id) VALUES (?, ?)"); $stmt->execute([$_POST['reporte_id'], $_POST['product_id']]); $_SESSION['message'] = '
Producto añadido al reporte.
'; } break; } } catch (PDOException $e) { $_SESSION['message'] = '
Error de base de datos: ' . $e->getMessage() . '
'; } header('Location: rentabilidad.php'); exit; } if (isset($_SESSION['message'])) { $message = $_SESSION['message']; unset($_SESSION['message']); } // --- Carga de datos --- $master_products = []; try { $products_stmt = $db->query("SELECT id, nombre as name, costo FROM products ORDER BY name ASC"); $master_products = $products_stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $message .= '
Error al cargar productos.
'; } $reports = []; try { $reports_stmt = $db->query("SELECT * FROM rentabilidad_reportes ORDER BY fecha_inicio DESC, id DESC"); $reports = $reports_stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $message .= '
Error al cargar reportes.
'; } $report_data = []; try { $report_data_stmt = $db->query("SELECT * FROM rentabilidad_productos"); $report_data_flat = $report_data_stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($report_data_flat as $item) { $report_data[$item['reporte_id']][$item['product_id']] = $item; } } catch (PDOException $e) { $message .= '
Error al cargar datos de rentabilidad.
'; } $pageTitle = "Reportes de Rentabilidad"; include 'layout_header.php'; ?>

Gestión de Reportes

No hay reportes. ¡Crea uno para empezar!
Reporte de Rentabilidad
Registrado el:

Periodo del al
$product, 'utilidad' => $utilidad, 'recaudo' => $recaudo, 'recaudo_ct' => $recaudo_ct, 'unidades_vendidas' => $unidades_vendidas, 'unidades_vendidas_ct' => $unidades_vendidas_ct, 'costo_producto' => $costo_producto, 'costo_ads' => $costo_ads, 'comision' => $comision, ]; $total_recaudo_env += $recaudo; $total_recaudo_ct += $recaudo_ct; $total_unidades_env += $unidades_vendidas; $total_unidades_ct += $unidades_vendidas_ct; $total_costo_producto_sum += (intval($unidades_vendidas) + intval($unidades_vendidas_ct)) * floatval($costo_producto); $total_costo_ads += $costo_ads; $total_comision += $comision; $total_utilidad += $utilidad; } // Ordenar el array por utilidad de mayor a menor usort($products_with_utility, function($a, $b) { return $b['utilidad'] <=> $a['utilidad']; }); ?>
Producto Recaudo envios Recaudo Contraentrega Costo Producto Costo Ads Comisión Utilidad Acciones
Recaudo Env Unds Vendidas Env Recaudo CT Uds vendidas CT
S/
No hay productos en este reporte. Añade uno para empezar.
TOTALES S/ S/ S/ S/ S/ S/