<?php

class Estadistica_Model extends Model {

	public function __construct() {
		parent::__construct();
	}

    public function Caja()
    {
        try
        {      
            return $this->db->selectAll("SELECT id_apc,id_caja,id_turno,desc_caja,desc_turno FROM v_caja_aper WHERE estado = 'a'");
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }

    private function obtenerRangoFechas($data = array(), $legacyMonthKey = null)
    {
        $inicio = null;
        $fin = null;

        if (!empty($data['fecha_ini']) && !empty($data['fecha_fin'])) {
            $inicio = DateTime::createFromFormat('Y-m-d', $data['fecha_ini']);
            $fin = DateTime::createFromFormat('Y-m-d', $data['fecha_fin']);
        } elseif ($legacyMonthKey !== null && !empty($data[$legacyMonthKey])) {
            $mes = DateTime::createFromFormat('!Y-m', $data[$legacyMonthKey]);
            if ($mes instanceof DateTime) {
                $inicio = clone $mes;
                $inicio->modify('first day of this month');
                $fin = clone $mes;
                $fin->modify('last day of this month');
            }
        }

        if (!($inicio instanceof DateTime)) {
            $inicio = new DateTime('first day of this month');
        }

        if (!($fin instanceof DateTime)) {
            $fin = new DateTime();
        }

        $inicio->setTime(0, 0, 0);
        $fin->setTime(23, 59, 59);

        if ($inicio > $fin) {
            $tmp = $inicio;
            $inicio = $fin;
            $fin = $tmp;
            $inicio->setTime(0, 0, 0);
            $fin->setTime(23, 59, 59);
        }

        return array(
            'inicio_obj' => $inicio,
            'fin_obj' => $fin,
            'inicio_sql' => $inicio->format('Y-m-d H:i:s'),
            'fin_sql' => $fin->format('Y-m-d H:i:s'),
            'inicio' => $inicio->format('Y-m-d'),
            'fin' => $fin->format('Y-m-d'),
        );
    }

    private function nombreMesCorto($mes)
    {
        $meses = array(
            1 => 'Ene',
            2 => 'Feb',
            3 => 'Mar',
            4 => 'Abr',
            5 => 'May',
            6 => 'Jun',
            7 => 'Jul',
            8 => 'Ago',
            9 => 'Set',
            10 => 'Oct',
            11 => 'Nov',
            12 => 'Dic',
        );

        return isset($meses[(int)$mes]) ? $meses[(int)$mes] : '';
    }

    private function construirPeriodosMensuales(DateTime $inicio, DateTime $fin)
    {
        $cursor = clone $inicio;
        $cursor->modify('first day of this month');
        $limite = clone $fin;
        $limite->modify('first day of this month');

        $periodos = array();
        $labels = array();

        while ($cursor <= $limite) {
            $periodos[] = $cursor->format('Y-m');
            $labels[] = $this->nombreMesCorto($cursor->format('n')) . ' ' . $cursor->format('Y');
            $cursor->modify('+1 month');
        }

        return array('periodos' => $periodos, 'labels' => $labels);
    }

    private function construirUltimosMeses(DateTime $fin, $cantidad = 12)
    {
        $cursor = clone $fin;
        $cursor->modify('first day of this month');
        $cursor->modify('-' . max(((int)$cantidad - 1), 0) . ' months');

        $periodos = array();
        $labels = array();

        for ($i = 0; $i < (int)$cantidad; $i++) {
            $periodos[] = $cursor->format('Y-m');
            $labels[] = $this->nombreMesCorto($cursor->format('n')) . ' ' . $cursor->format('Y');
            $cursor->modify('+1 month');
        }

        return array('periodos' => $periodos, 'labels' => $labels);
    }

    private function construirPeriodosDiarios(DateTime $inicio, DateTime $fin)
    {
        $cursor = clone $inicio;
        $labels = array();
        $periodos = array();

        while ($cursor <= $fin) {
            $periodos[] = $cursor->format('Y-m-d');
            $labels[] = $cursor->format('d/m');
            $cursor->modify('+1 day');
        }

        return array('periodos' => $periodos, 'labels' => $labels);
    }

    private function indexarTotalesPorPeriodo($rows)
    {
        $indexado = array();
        foreach ($rows as $row) {
            $indexado[$row['periodo']] = (float)$row['total'];
        }
        return $indexado;
    }

    private function obtenerGraficoMozos($inicioSql, $finSql)
    {
        $stm = $this->db->prepare("
            SELECT
                ve.id_usu,
                COALESCE(NULLIF(TRIM(ve.nombres), ''), 'Sin mozo') AS nombres,
                COUNT(ve.id_venta) AS numero_ventas,
                IFNULL(SUM(ve.total), 0) AS total_ventas
            FROM v_estadistica AS ve
            WHERE ve.id_tipo_pedido = 1
              AND ve.fecha_venta BETWEEN ? AND ?
            GROUP BY ve.id_usu, COALESCE(NULLIF(TRIM(ve.nombres), ''), 'Sin mozo')
            ORDER BY numero_ventas DESC, total_ventas DESC, nombres ASC
        ");
        $stm->execute(array($inicioSql, $finSql));
        return $stm->fetchAll(PDO::FETCH_ASSOC);
    }

    private function obtenerGraficoComprasVentas($inicioSql, $finSql, DateTime $inicioObj, DateTime $finObj)
    {
        $periodos = $this->construirPeriodosMensuales($inicioObj, $finObj);

        $ventasStm = $this->db->prepare("
            SELECT
                DATE_FORMAT(fecha_venta, '%Y-%m') AS periodo,
                IFNULL(SUM(total), 0) AS total
            FROM v_estadistica
            WHERE fecha_venta BETWEEN ? AND ?
            GROUP BY DATE_FORMAT(fecha_venta, '%Y-%m')
            ORDER BY periodo ASC
        ");
        $ventasStm->execute(array($inicioSql, $finSql));
        $ventasIndex = $this->indexarTotalesPorPeriodo($ventasStm->fetchAll(PDO::FETCH_ASSOC));

        $comprasStm = $this->db->prepare("
            SELECT
                DATE_FORMAT(fecha_c, '%Y-%m') AS periodo,
                IFNULL(SUM(total), 0) AS total
            FROM tm_compra
            WHERE fecha_c BETWEEN ? AND ?
            GROUP BY DATE_FORMAT(fecha_c, '%Y-%m')
            ORDER BY periodo ASC
        ");
        $comprasStm->execute(array($inicioSql, $finSql));
        $comprasIndex = $this->indexarTotalesPorPeriodo($comprasStm->fetchAll(PDO::FETCH_ASSOC));

        $ventas = array();
        $compras = array();

        foreach ($periodos['periodos'] as $periodo) {
            $ventas[] = isset($ventasIndex[$periodo]) ? $ventasIndex[$periodo] : 0;
            $compras[] = isset($comprasIndex[$periodo]) ? $comprasIndex[$periodo] : 0;
        }

        return array(
            'labels' => $periodos['labels'],
            'ventas' => $ventas,
            'compras' => $compras,
        );
    }

    private function obtenerGraficoVentasPorDia($inicioSql, $finSql, DateTime $inicioObj, DateTime $finObj)
    {
        $stm = $this->db->prepare("
            SELECT
                WEEKDAY(fec_ven) AS periodo,
                COUNT(*) AS operaciones,
                IFNULL(SUM(total), 0) AS total
            FROM v_ventas_con
            WHERE fec_ven BETWEEN ? AND ?
              AND estado = 'a'
            GROUP BY WEEKDAY(fec_ven)
            ORDER BY periodo ASC
        ");
        $stm->execute(array($inicioSql, $finSql));
        $rows = $stm->fetchAll(PDO::FETCH_ASSOC);

        $labels = array('Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado', 'Domingo');
        $ventas = array_fill(0, 7, 0);
        $operaciones = array_fill(0, 7, 0);

        foreach ($rows as $row) {
            $indice = (int)$row['periodo'];
            if ($indice >= 0 && $indice <= 6) {
                $ventas[$indice] = (float)$row['total'];
                $operaciones[$indice] = (int)$row['operaciones'];
            }
        }

        return array(
            'labels' => $labels,
            'ventas' => $ventas,
            'operaciones' => $operaciones,
        );
    }

    private function obtenerGraficoVentasPorFecha($inicioSql, $finSql, DateTime $inicioObj, DateTime $finObj)
    {
        $periodos = $this->construirPeriodosDiarios($inicioObj, $finObj);

        $stm = $this->db->prepare("
            SELECT
                DATE(fec_ven) AS periodo,
                COUNT(*) AS operaciones,
                IFNULL(SUM(total), 0) AS total
            FROM v_ventas_con
            WHERE fec_ven BETWEEN ? AND ?
              AND estado = 'a'
            GROUP BY DATE(fec_ven)
            ORDER BY periodo ASC
        ");
        $stm->execute(array($inicioSql, $finSql));
        $rows = $stm->fetchAll(PDO::FETCH_ASSOC);

        $ventasIndex = array();
        $operacionesIndex = array();
        foreach ($rows as $row) {
            $ventasIndex[$row['periodo']] = (float)$row['total'];
            $operacionesIndex[$row['periodo']] = (int)$row['operaciones'];
        }

        $ventas = array();
        $operaciones = array();
        foreach ($periodos['periodos'] as $periodo) {
            $ventas[] = isset($ventasIndex[$periodo]) ? $ventasIndex[$periodo] : 0;
            $operaciones[] = isset($operacionesIndex[$periodo]) ? $operacionesIndex[$periodo] : 0;
        }

        return array(
            'labels' => $periodos['labels'],
            'ventas' => $ventas,
            'operaciones' => $operaciones,
        );
    }

    private function obtenerGraficoTipoDocumento($inicioSql, $finSql)
    {
        $stm = $this->db->prepare("
            SELECT
                COALESCE(NULLIF(TRIM(desc_td), ''), 'Sin documento') AS documento,
                COUNT(*) AS operaciones,
                IFNULL(SUM(total), 0) AS total
            FROM v_ventas_con
            WHERE fec_ven BETWEEN ? AND ?
              AND estado = 'a'
            GROUP BY id_tdoc, COALESCE(NULLIF(TRIM(desc_td), ''), 'Sin documento')
            ORDER BY total DESC, documento ASC
        ");
        $stm->execute(array($inicioSql, $finSql));
        return $stm->fetchAll(PDO::FETCH_ASSOC);
    }

    private function obtenerGraficoMedioPago($inicioSql, $finSql)
    {
        $stm = $this->db->prepare("
            SELECT
                IFNULL(SUM(pago_efe), 0) AS efectivo,
                IFNULL(SUM(pago_tar), 0) AS tarjeta,
                IFNULL(SUM(pago_yape), 0) AS yape,
                IFNULL(SUM(pago_plin), 0) AS plin,
                IFNULL(SUM(pago_tran), 0) AS transferencia,
                IFNULL(SUM(CASE WHEN pago_efe > 0 THEN 1 ELSE 0 END), 0) AS efectivo_ops,
                IFNULL(SUM(CASE WHEN pago_tar > 0 THEN 1 ELSE 0 END), 0) AS tarjeta_ops,
                IFNULL(SUM(CASE WHEN pago_yape > 0 THEN 1 ELSE 0 END), 0) AS yape_ops,
                IFNULL(SUM(CASE WHEN pago_plin > 0 THEN 1 ELSE 0 END), 0) AS plin_ops,
                IFNULL(SUM(CASE WHEN pago_tran > 0 THEN 1 ELSE 0 END), 0) AS transferencia_ops
            FROM v_ventas_con
            WHERE fec_ven BETWEEN ? AND ?
              AND estado = 'a'
        ");
        $stm->execute(array($inicioSql, $finSql));
        $row = $stm->fetch(PDO::FETCH_ASSOC);

        if (!$row) {
            return array();
        }

        $ventas = array();
        $operaciones = array();
        $labels = array('Efectivo', 'Tarjeta', 'Yape', 'Plin', 'Transferencia');
        $campos = array(
            'efectivo' => 'efectivo_ops',
            'tarjeta' => 'tarjeta_ops',
            'yape' => 'yape_ops',
            'plin' => 'plin_ops',
            'transferencia' => 'transferencia_ops',
        );

        foreach (array_keys($campos) as $campo) {
            $ventas[] = isset($row[$campo]) ? (float)$row[$campo] : 0;
            $operaciones[] = isset($row[$campos[$campo]]) ? (int)$row[$campos[$campo]] : 0;
        }

        return array(
            'labels' => $labels,
            'ventas' => $ventas,
            'operaciones' => $operaciones,
        );
    }

    private function obtenerGraficoVentasPorMes($inicioSql, $finSql, DateTime $inicioObj, DateTime $finObj)
    {
        $periodos = $this->construirUltimosMeses($finObj, 12);
        $inicioConsulta = clone $finObj;
        $inicioConsulta->modify('first day of this month');
        $inicioConsulta->modify('-11 months');
        $inicioConsulta->setTime(0, 0, 0);

        $stm = $this->db->prepare("
            SELECT
                DATE_FORMAT(fecha_venta, '%Y-%m') AS periodo,
                IFNULL(SUM(total), 0) AS total
            FROM v_estadistica
            WHERE fecha_venta BETWEEN ? AND ?
            GROUP BY DATE_FORMAT(fecha_venta, '%Y-%m')
            ORDER BY periodo ASC
        ");
        $stm->execute(array($inicioConsulta->format('Y-m-d H:i:s'), $finSql));
        $ventasIndex = $this->indexarTotalesPorPeriodo($stm->fetchAll(PDO::FETCH_ASSOC));

        $ventas = array();
        foreach ($periodos['periodos'] as $periodo) {
            $ventas[] = isset($ventasIndex[$periodo]) ? $ventasIndex[$periodo] : 0;
        }

        return array(
            'labels' => $periodos['labels'],
            'ventas' => $ventas,
        );
    }

    private function obtenerGraficoCanal($inicioSql, $finSql)
    {
        $stm = $this->db->prepare("
            SELECT
                IFNULL(SUM(IF(id_tipo_pedido = 1, total, 0)), 0) AS mesa,
                IFNULL(SUM(IF(id_tipo_pedido = 2, total, 0)), 0) AS llevar,
                IFNULL(SUM(IF(id_tipo_pedido = 3, total, 0)), 0) AS delivery
            FROM v_estadistica
            WHERE fecha_venta BETWEEN ? AND ?
        ");
        $stm->execute(array($inicioSql, $finSql));
        $data = $stm->fetch(PDO::FETCH_ASSOC);

        return $data ? $data : array('mesa' => 0, 'llevar' => 0, 'delivery' => 0);
    }

    private function obtenerGraficoDelivery($inicioSql, $finSql)
    {
        $stm = $this->db->prepare("
            SELECT
                COALESCE(
                    vr.desc_repartidor,
                    CASE
                        WHEN ve.id_repartidor IS NULL OR ve.id_repartidor = 0 THEN 'Sin repartidor'
                        ELSE CONCAT('Canal ', ve.id_repartidor)
                    END
                ) AS repartidor,
                COUNT(DISTINCT ve.id_pedido) AS pedidos,
                IFNULL(SUM(ve.total), 0) AS total
            FROM v_estadistica AS ve
            LEFT JOIN v_repartidores AS vr
                ON ve.id_repartidor = vr.id_repartidor
            WHERE ve.id_tipo_pedido = 3
              AND ve.fecha_venta BETWEEN ? AND ?
            GROUP BY repartidor
            ORDER BY pedidos DESC, total DESC, repartidor ASC
        ");
        $stm->execute(array($inicioSql, $finSql));
        return $stm->fetchAll(PDO::FETCH_ASSOC);
    }

    private function obtenerGraficoDeliveryPorFecha($inicioSql, $finSql, DateTime $inicioObj, DateTime $finObj)
    {
        $periodos = $this->construirPeriodosDiarios($inicioObj, $finObj);

        $stm = $this->db->prepare("
            SELECT
                DATE(fecha_venta) AS periodo,
                COUNT(DISTINCT id_pedido) AS pedidos,
                IFNULL(SUM(total), 0) AS total
            FROM v_estadistica
            WHERE id_tipo_pedido = 3
              AND fecha_venta BETWEEN ? AND ?
            GROUP BY DATE(fecha_venta)
            ORDER BY periodo ASC
        ");
        $stm->execute(array($inicioSql, $finSql));
        $rows = $stm->fetchAll(PDO::FETCH_ASSOC);

        $pedidosIndex = array();
        $ventasIndex = array();
        foreach ($rows as $row) {
            $pedidosIndex[$row['periodo']] = (int)$row['pedidos'];
            $ventasIndex[$row['periodo']] = (float)$row['total'];
        }

        $pedidos = array();
        $ventas = array();
        foreach ($periodos['periodos'] as $periodo) {
            $pedidos[] = isset($pedidosIndex[$periodo]) ? $pedidosIndex[$periodo] : 0;
            $ventas[] = isset($ventasIndex[$periodo]) ? $ventasIndex[$periodo] : 0;
        }

        return array(
            'labels' => $periodos['labels'],
            'pedidos' => $pedidos,
            'ventas' => $ventas,
        );
    }

    private function obtenerTopProductos($inicioSql, $finSql, $idTipoProducto)
    {
        $stm = $this->db->prepare("
            SELECT
                CONCAT(
                    vp.pro_nom,
                    CASE
                        WHEN NULLIF(TRIM(vp.pro_pre), '') IS NULL THEN ''
                        ELSE CONCAT(' - ', vp.pro_pre)
                    END
                ) AS producto,
                IFNULL(SUM(dv.cantidad), 0) AS cantidad,
                IFNULL(SUM(dv.cantidad * dv.precio), 0) AS total
            FROM tm_detalle_venta AS dv
            INNER JOIN tm_venta AS v
                ON dv.id_venta = v.id_venta
            INNER JOIN v_productos AS vp
                ON dv.id_prod = vp.id_pres
            WHERE v.estado = 'a'
              AND v.fecha_venta BETWEEN ? AND ?
              AND vp.id_tipo = ?
            GROUP BY dv.id_prod, vp.pro_nom, vp.pro_pre
            ORDER BY cantidad DESC, total DESC, producto ASC
            LIMIT 10
        ");
        $stm->execute(array($inicioSql, $finSql, $idTipoProducto));
        return $stm->fetchAll(PDO::FETCH_ASSOC);
    }

    private function obtenerTopClientes($inicioSql, $finSql)
    {
        $stm = $this->db->prepare("
            SELECT
                COALESCE(NULLIF(TRIM(vc.nombre), ''), 'Sin cliente') AS cliente,
                COUNT(v.id_ven) AS operaciones,
                IFNULL(SUM(v.pago_efe + v.pago_tar + v.pago_yape + v.pago_plin + v.pago_tran), 0) AS total,
                IFNULL(AVG(v.pago_efe + v.pago_tar + v.pago_yape + v.pago_plin + v.pago_tran), 0) AS ticket_promedio
            FROM v_ventas_con AS v
            LEFT JOIN v_clientes AS vc
                ON v.id_cli = vc.id_cliente
            WHERE v.estado = 'a'
              AND v.fec_ven BETWEEN ? AND ?
            GROUP BY v.id_cli, COALESCE(NULLIF(TRIM(vc.nombre), ''), 'Sin cliente')
            ORDER BY total DESC, operaciones DESC, cliente ASC
            LIMIT 10
        ");
        $stm->execute(array($inicioSql, $finSql));
        return $stm->fetchAll(PDO::FETCH_ASSOC);
    }
	
	public function estadistica_datos($data = array())
    {
        try
        {
            $rango = $this->obtenerRangoFechas($data);

            $payload = array(
                'rango' => array(
                    'inicio' => $rango['inicio'],
                    'fin' => $rango['fin'],
                ),
                'grafico1' => $this->obtenerGraficoMozos($rango['inicio_sql'], $rango['fin_sql']),
                'grafico2' => $this->obtenerGraficoComprasVentas($rango['inicio_sql'], $rango['fin_sql'], $rango['inicio_obj'], $rango['fin_obj']),
                'grafico3' => $this->obtenerGraficoVentasPorDia($rango['inicio_sql'], $rango['fin_sql'], $rango['inicio_obj'], $rango['fin_obj']),
                'grafico4' => $this->obtenerGraficoVentasPorMes($rango['inicio_sql'], $rango['fin_sql'], $rango['inicio_obj'], $rango['fin_obj']),
                'grafico5' => $this->obtenerGraficoCanal($rango['inicio_sql'], $rango['fin_sql']),
                'grafico6' => $this->obtenerGraficoDelivery($rango['inicio_sql'], $rango['fin_sql']),
                'grafico7' => $this->obtenerGraficoTipoDocumento($rango['inicio_sql'], $rango['fin_sql']),
                'grafico8' => $this->obtenerGraficoMedioPago($rango['inicio_sql'], $rango['fin_sql']),
                'grafico9' => $this->obtenerGraficoVentasPorFecha($rango['inicio_sql'], $rango['fin_sql'], $rango['inicio_obj'], $rango['fin_obj']),
                'grafico10' => $this->obtenerGraficoDeliveryPorFecha($rango['inicio_sql'], $rango['fin_sql'], $rango['inicio_obj'], $rango['fin_obj']),
                'grafico11' => $this->obtenerTopProductos($rango['inicio_sql'], $rango['fin_sql'], 1),
                'grafico12' => $this->obtenerTopProductos($rango['inicio_sql'], $rango['fin_sql'], 2),
                'grafico13' => $this->obtenerTopClientes($rango['inicio_sql'], $rango['fin_sql']),
            );

            echo json_encode($payload);
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }

    public function estadistica_datos_new()
    {
        $mes = date('m',strtotime($_POST['mmes']));
        $anio = date('Y',strtotime($_POST['mmes']));
        $sql_grafico1 = $this->db->prepare("SELECT v_estadistica.id_usu, 
            v_estadistica.nombres, 
            COUNT(v_estadistica.id_venta) AS numero_ventas, 
            SUM(v_estadistica.total) AS total_ventas
            FROM v_estadistica WHERE MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ? AND id_tipo_pedido = 1 GROUP BY id_usu ORDER BY numero_ventas ASC, total_ventas ASC;");
        $sql_grafico1->execute(array($mes,$anio));
        $grafico1 = $sql_grafico1->fetchAll(PDO::FETCH_OBJ);

        $mes = $_POST['mes'];
        $anio = $_POST['anio'];
        $m1 = $mes;
        $a1 = $anio;
        if ($m1 == 1) { $m2 = 12;$a2 = $a1-1; } else { $m2 = $m1-1;$a2 = $a1; }
        if ($m2 == 1) { $m3 = 12;$a3 = $a2-1; } else { $m3 = $m2-1;$a3 = $a2; }
        if ($m3 == 1) { $m4 = 12;$a4 = $a3-1; } else { $m4 = $m3-1;$a4 = $a3; }
        if ($m4 == 1) { $m5 = 12;$a5 = $a4-1; } else { $m5 = $m4-1;$a5 = $a4; }
        if ($m5 == 1) { $m6 = 12;$a6 = $a5-1; } else { $m6 = $m5-1;$a6 = $a5; }
        if ($m6 == 1) { $m7 = 12;$a7 = $a6-1; } else { $m7 = $m6-1;$a7 = $a6; }
        if ($m7 == 1) { $m8 = 12;$a8 = $a7-1; } else { $m8 = $m7-1;$a8 = $a7; }
        if ($m8 == 1) { $m9 = 12;$a9 = $a8-1; } else { $m9 = $m8-1;$a9 = $a8; }
        if ($m9 == 1) { $m10 = 12;$a10 = $a9-1; } else { $m10 = $m9-1;$a10 = $a9; }
        if ($m10 == 1) { $m11 = 12;$a11 = $a10-1; } else { $m11 = $m10-1;$a11 = $a10; }
        if ($m11 == 1) { $m12 = 12;$a12 = $a11-1; } else { $m12 = $m11-1;$a12 = $a11; }
        $sql_grafico2 = $this->db->prepare("SELECT
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_1,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_2,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_3,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_4
            FROM v_estadistica
            ORDER BY fecha_venta ASC;");
        $sql_grafico2->execute(array($m1, $a1, $m2, $a2, $m3, $a3, $m4, $a4));
        $grafico2->{'Ventas'} = $sql_grafico2->fetch(PDO::FETCH_ASSOC);
        
        $sql_grafico21 = $this->db->prepare("SELECT
            SUM(IF(MONTH(fecha_c) = ? AND YEAR(fecha_c) = ?,  total, 0)) AS compra_1,
            SUM(IF(MONTH(fecha_c) = ? AND YEAR(fecha_c) = ?,  total, 0)) AS compra_2,
            SUM(IF(MONTH(fecha_c) = ? AND YEAR(fecha_c) = ?,  total, 0)) AS compra_3,
            SUM(IF(MONTH(fecha_c) = ? AND YEAR(fecha_c) = ?,  total, 0)) AS compra_4
            FROM tm_compra ORDER BY fecha_c ASC;");
        $sql_grafico21->execute(array($m1, $a1, $m2, $a2, $m3, $a3, $m4, $a4));
        $grafico2->{'Compras'} = $sql_grafico21->fetch(PDO::FETCH_ASSOC);

        $arrayParam =  array(
            $_POST['d1'].' 00:00:00',
            $_POST['d1'].' 23:59:59',
            $_POST['d2'].' 00:00:00',
            $_POST['d2'].' 23:59:59',
            $_POST['d3'].' 00:00:00',
            $_POST['d3'].' 23:59:59',
            $_POST['d4'].' 00:00:00',
            $_POST['d4'].' 23:59:59',
            $_POST['d5'].' 00:00:00',
            $_POST['d5'].' 23:59:59',
            $_POST['d6'].' 00:00:00',
            $_POST['d6'].' 23:59:59',
            $_POST['d7'].' 00:00:00',
            $_POST['d7'].' 23:59:59',
        );
        
        $sql_grafico3 = $this->db->prepare("SELECT SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia1, 
        SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia2, 
        SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia3, 
        SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia4, 
        SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia5, 
        SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia6, 
        SUM( IF( fecha_venta BETWEEN ? AND ?,  total, 0 ) ) AS dia7 
        FROM v_estadistica ORDER BY fecha_venta ASC;");
        $sql_grafico3->execute($arrayParam);
        $grafico3 = $sql_grafico3->fetch(PDO::FETCH_ASSOC);

        $sql_grafico4 = $this->db->prepare("SELECT
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_1,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_2,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_3,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_4,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_5,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_6,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_7,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_8,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_9,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_10,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_11,
            SUM(IF(MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?,  total, 0)) AS venta_12
            FROM v_estadistica
            ORDER BY fecha_venta ASC;");
        $sql_grafico4->execute(array($m1, $a1, $m2, $a2, $m3, $a3, $m4, $a4, $m5, $a5, $m6, $a6, $m7, $a7, $m8, $a8, $m9, $a9, $m10, $a10, $m11, $a11, $m12, $a12));
        $grafico4 = $sql_grafico4->fetch(PDO::FETCH_ASSOC);

        $mes_tipo = date('m',strtotime($_POST['tmes']));
        $anio_tipo = date('Y',strtotime($_POST['tmes']));
        $sql_grafico5 = $this->db->prepare("SELECT
            SUM(IF(id_tipo_pedido = 1,  total, 0)) AS mesa,
            SUM(IF(id_tipo_pedido = 2,  total, 0)) AS llevar,
            SUM(IF(id_tipo_pedido = 3,  total, 0)) AS delivery
            FROM v_estadistica
            WHERE MONTH(fecha_venta) = ? AND YEAR(fecha_venta) = ?
            ORDER BY fecha_venta ASC;");
        $sql_grafico5->execute(array($mes_tipo, $anio_tipo));
        $grafico5 = $sql_grafico5->fetch(PDO::FETCH_ASSOC);

        $data = array("grafico1" => $grafico1, "grafico2" => $grafico2, "grafico3" => $grafico3, "grafico4" => $grafico4, "grafico5" => $grafico5);
        $json = json_encode($data);
        echo $json;
    }

	public function estadistica_g1($data = array())
    {
        try
        {
            $rango = $this->obtenerRangoFechas($data, 'mmes');
            echo json_encode(array(
                'data' => $this->obtenerGraficoMozos($rango['inicio_sql'], $rango['fin_sql']),
                'rango' => array(
                    'inicio' => $rango['inicio'],
                    'fin' => $rango['fin'],
                ),
            ));
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }

	public function estadistica_g5($data = array())
    {
        try
        {
            $rango = $this->obtenerRangoFechas($data, 'tmes');
            echo json_encode(array(
                'data' => $this->obtenerGraficoCanal($rango['inicio_sql'], $rango['fin_sql']),
                'rango' => array(
                    'inicio' => $rango['inicio'],
                    'fin' => $rango['fin'],
                ),
            ));
        }
        catch(Exception $e)
        {
            die($e->getMessage());
        }
    }
}
