diff --git a/assets/uploads/vouchers/6a109ee11f3a8-681.png b/assets/uploads/vouchers/6a109ee11f3a8-681.png new file mode 100644 index 00000000..c00f0aae Binary files /dev/null and b/assets/uploads/vouchers/6a109ee11f3a8-681.png differ diff --git a/assets/uploads/vouchers/6a10b27643e04-Screenshot_360.png b/assets/uploads/vouchers/6a10b27643e04-Screenshot_360.png new file mode 100644 index 00000000..9c59370f Binary files /dev/null and b/assets/uploads/vouchers/6a10b27643e04-Screenshot_360.png differ diff --git a/assets/uploads/vouchers/6a10bd6b64b32-Screenshot_361.png b/assets/uploads/vouchers/6a10bd6b64b32-Screenshot_361.png new file mode 100644 index 00000000..e0e3cade Binary files /dev/null and b/assets/uploads/vouchers/6a10bd6b64b32-Screenshot_361.png differ diff --git a/assets/uploads/vouchers/6a10c03da0bd2-Screenshot_362.png b/assets/uploads/vouchers/6a10c03da0bd2-Screenshot_362.png new file mode 100644 index 00000000..41dfc219 Binary files /dev/null and b/assets/uploads/vouchers/6a10c03da0bd2-Screenshot_362.png differ diff --git a/assets/uploads/vouchers/6a10c771451ab-Captura de pantalla 2026-05-22 161418.png b/assets/uploads/vouchers/6a10c771451ab-Captura de pantalla 2026-05-22 161418.png new file mode 100644 index 00000000..768091cd Binary files /dev/null and b/assets/uploads/vouchers/6a10c771451ab-Captura de pantalla 2026-05-22 161418.png differ diff --git a/assets/uploads/vouchers/6a10cc70091ff-Captura de pantalla 2026-05-22 163520.png b/assets/uploads/vouchers/6a10cc70091ff-Captura de pantalla 2026-05-22 163520.png new file mode 100644 index 00000000..d6ae0b09 Binary files /dev/null and b/assets/uploads/vouchers/6a10cc70091ff-Captura de pantalla 2026-05-22 163520.png differ diff --git a/assets/uploads/vouchers/6a10d6a4429ab-Captura de pantalla 2026-05-22 171657.png b/assets/uploads/vouchers/6a10d6a4429ab-Captura de pantalla 2026-05-22 171657.png new file mode 100644 index 00000000..ef9620e8 Binary files /dev/null and b/assets/uploads/vouchers/6a10d6a4429ab-Captura de pantalla 2026-05-22 171657.png differ diff --git a/assets/uploads/vouchers/6a10d6eb4dc1c-Captura de pantalla 2026-05-22 172033.png b/assets/uploads/vouchers/6a10d6eb4dc1c-Captura de pantalla 2026-05-22 172033.png new file mode 100644 index 00000000..e92cd681 Binary files /dev/null and b/assets/uploads/vouchers/6a10d6eb4dc1c-Captura de pantalla 2026-05-22 172033.png differ diff --git a/assets/uploads/vouchers/6a10d75c6fbbc-Captura de pantalla 2026-05-22 172148.png b/assets/uploads/vouchers/6a10d75c6fbbc-Captura de pantalla 2026-05-22 172148.png new file mode 100644 index 00000000..f1548467 Binary files /dev/null and b/assets/uploads/vouchers/6a10d75c6fbbc-Captura de pantalla 2026-05-22 172148.png differ diff --git a/dashboard_principal.php b/dashboard_principal.php index 6842a377..d5770b29 100644 --- a/dashboard_principal.php +++ b/dashboard_principal.php @@ -184,14 +184,42 @@ $stmtRetorno = $db->query("SELECT (COUNT(CASE WHEN estado = 'RETORNADO' THEN 1 E FROM pedidos p WHERE $date_condition"); $tasaRetorno = $stmtRetorno->fetchColumn() ?: 0; +// --- NUEVO: Obtener configuración de costos para utilidad neta --- +$stmtConfig = $db->query("SELECT clave, valor FROM configuracion_costos"); +$configCosts = $stmtConfig->fetchAll(PDO::FETCH_KEY_PAIR); +$costoEnvioAgencia = $configCosts['envio_agencia'] ?? 0; +$costoEnvioCE = $configCosts['envio_contraentrega'] ?? 0; +$comisionVentaFija = $configCosts['comision_venta'] ?? 0; +$publicidadDiaria = $configCosts['publicidad_diaria'] ?? 0; + // 11. Utilidad Total Estimada (Ajustado al periodo) +// Calculamos ingresos, costo de productos, comisiones y envíos diferenciados $stmtUtilidad = $db->query(" - SELECT SUM(p.monto_total - (COALESCE(pr.costo, 0) * p.cantidad)) as utilidad_total + SELECT + SUM(p.monto_total) as ingresos_brutos, + SUM(COALESCE(pr.costo, 0) * p.cantidad) as costo_productos_total, + SUM(CASE + WHEN p.agencia IN ('SHALOM', 'OLVA') THEN $costoEnvioAgencia + ELSE $costoEnvioCE + END) as costo_envio_total, + COUNT(p.id) * $comisionVentaFija as comision_total FROM pedidos p LEFT JOIN products pr ON p.producto = pr.nombre WHERE $date_condition AND p.estado != 'RETORNADO' "); -$utilidadTotal = $stmtUtilidad->fetchColumn() ?: 0; +$resUtilidad = $stmtUtilidad->fetch(PDO::FETCH_ASSOC); + +// Calcular cuántos días hay en el periodo para restar la publicidad diaria +$stmtDias = $db->query("SELECT COUNT(DISTINCT DATE(created_at)) FROM pedidos p WHERE $date_condition"); +$numDias = $stmtDias->fetchColumn() ?: 1; +$gastoPublicidadTotal = $numDias * $publicidadDiaria; + +$ingresosBrutos = $resUtilidad['ingresos_brutos'] ?: 0; +$costoProductos = $resUtilidad['costo_productos_total'] ?: 0; +$costoEnvioTotal = $resUtilidad['costo_envio_total'] ?: 0; +$comisionTotal = $resUtilidad['comision_total'] ?: 0; + +$utilidadTotal = $ingresosBrutos - $costoProductos - $costoEnvioTotal - $comisionTotal - $gastoPublicidadTotal; // 12. Datos Detallados por Canal (Provincia vs Contraentrega) $stmtDetalleCanal = $db->query("SELECT @@ -385,9 +413,34 @@ include 'layout_header.php';
Margen bruto del periodo
+