<?php
namespace app\controllers;

use Yii;
use Exception;
use yii\web\Controller;
use app\models\Reporte;
use app\models\Pedido;
use yii\filters\VerbFilter;
use OpenSpout\Writer\XLSX\Writer;
use OpenSpout\Writer\Common\Creator\Style\StyleBuilder;
use OpenSpout\Common\Entity\Row;
use OpenSpout\Common\Entity\Cell;
use OpenSpout\Common\Entity\Style\Style;
use OpenSpout\Common\Entity\Style\CellAlignment;
use OpenSpout\Common\Entity\Style\CellVerticalAlignment;
use OpenSpout\Common\Entity\Style\Color;

class ReporteController extends Controller
{

	public function behaviors()
	{
		return [
			'verbs' => [
				'class' => VerbFilter::className(),
				'actions' => [
					'delete' => ['POST'],
				],
			],
		];
	}

	public function actionInventario()
	{
		$model = new Reporte();
		$model->finicio = date('d-m-Y');
		$model->ffin = date('d-m-Y');
		return $this->render('inventario', [
			'model' => $model
		]);            
    }

    public function actionInventarioAjax(){
        $finicio = $_POST['finicio'];
        $ffin = $_POST['ffin'];
        $start = $_POST['start'];
		$length = $_POST['length'];

        $where = ' WHERE i.id > 0 ';
        if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.fecha_registro BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
        $select = "SELECT u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,CASE WHEN i.reposicion = 1 THEN 'Si' ELSE 'No' END as reposicion,
				CASE WHEN i.tipo_pago = 1 THEN 'Pago Contado' WHEN i.tipo_pago = 2 THEN 'Pago Credito' ELSE '' END as tipo_pago,i.fecha_registro
                FROM inventario i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo 
                INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk ";
        $selectCount = "SELECT count(*) FROM inventario i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo ";

        $limit = " LIMIT $length OFFSET $start ";
		$order = " ORDER BY i.fecha_registro DESC";

		$query = $select . $where . $order . $limit;
		$queryTotal = $selectCount . $where;

		$resultado = Yii::$app->db->createCommand($query)->queryAll();
		$total = Yii::$app->db->createCommand($queryTotal)->queryScalar();		

        $j = 0;
		$data = [];
        foreach ($resultado as $val) {
			$data[$j]['id'] = $val['id'];            
            $data[$j]['usr_pk'] = $val['usr_pk'];
			$data[$j]['usr_nombre'] = $val['usr_nombre'];
            $data[$j]['cli_codigo'] = $val['cli_codigo'];
            $data[$j]['cli_nombre'] = $val['cli_nombre'];
            $data[$j]['reposicion'] = $val['reposicion'];
			$data[$j]['tipo_pago'] = $val['tipo_pago'];
            $data[$j]['fecha_registro'] = $val['fecha_registro'];
			$j++;
		}
		$json_data = array(
			"draw"            => intval($_POST['draw']),
			"recordsTotal"    => intval($total),
			"recordsFiltered" => intval($total),
			"data"            => $data
		);
		return json_encode($json_data);
    }

	public function actionInventarioDetalle()
	{
		$id = $_GET['id'];
		$data = Yii::$app->db->createCommand("SELECT d.id,d.pro_codigo,d.exhibidor,d.consumido,d.cantidad,p.nombre,i.foto1,i.foto2,i.foto3 
                    FROM inventario_detalle d 
                    INNER JOIN producto p ON d.pro_codigo = p.codigo
					INNER JOIN inventario i ON d.inventario_id = i.id
                    WHERE inventario_id =:id ")
			->bindValue(':id', $id)
			->queryAll();
		return $this->renderPartial('inventario-detalle', array(
			'data' => $data
		));
	}

	public function actionPedido()
	{
		$model = new Reporte();
		$model->finicio = date('d-m-Y');
		$model->ffin = date('d-m-Y');
		return $this->render('pedido', [
			'model' => $model
		]);            
    }	

    public function actionPedidoAjax(){
        $finicio = $_POST['finicio'];
        $ffin = $_POST['ffin'];
		$tipo = $_POST['tipo'];
        $start = $_POST['start'];
		$length = $_POST['length'];

        $where = ' WHERE i.id > 0 ';
        if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.fecha_registro BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
		if($tipo != ''){
			if($tipo == '1'){
				$where.= " AND i.condicion IS NOT NULL ";
			}
			if($tipo == '2'){
				$where.= " AND i.condicion IS NULL ";
			}
		}

        $select = "SELECT i.total,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,
				CASE WHEN i.condicion = 0 THEN 'Contado' 
					WHEN i.condicion = 1 THEN 'Crédito'
					WHEN i.condicion = 2 THEN 'Consignación'
				ELSE '' END as condicion,
				i.fecha_registro,i.observacion 
                FROM pedido i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo 
                INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk ";
        $selectCount = "SELECT count(*) FROM pedido i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo ";

        $limit = " LIMIT $length OFFSET $start ";
		$order = " ORDER BY i.fecha_registro DESC";

		$query = $select . $where . $order . $limit;
		$queryTotal = $selectCount . $where;

		$resultado = Yii::$app->db->createCommand($query)->queryAll();
		$total = Yii::$app->db->createCommand($queryTotal)->queryScalar();		

        $j = 0;
		$data = [];
        foreach ($resultado as $val) {
			$data[$j]['id'] = $val['id'];            
            $data[$j]['usr_pk'] = $val['usr_pk'];
			$data[$j]['usr_nombre'] = $val['usr_nombre'];
            $data[$j]['cli_codigo'] = $val['cli_codigo'];
            $data[$j]['cli_nombre'] = $val['cli_nombre'];
            $data[$j]['condicion'] = $val['condicion'];
			$data[$j]['total'] = $val['total'];
            $data[$j]['fecha_registro'] = $val['fecha_registro'];
			$data[$j]['observacion'] = $val['observacion'];
			$j++;
		}
		$json_data = array(
			"draw"            => intval($_POST['draw']),
			"recordsTotal"    => intval($total),
			"recordsFiltered" => intval($total),
			"data"            => $data
		);
		return json_encode($json_data);
    }
	
	public function actionPedidoDetalle()
	{
		$id = $_GET['id'];
		$data = Yii::$app->db->createCommand("SELECT d.id,d.pro_codigo,d.exhibidor,d.consumido,d.cantidad,p.nombre ,d.precio_unitario
                    FROM pedido_detalle d 
                    INNER JOIN producto p ON d.pro_codigo = p.codigo
                    WHERE pedido_id =:id ")
			->bindValue(':id', $id)
			->queryAll();
		$pedido = Pedido::findOne(['id'=>$id]);		
		$foto='';
		if($pedido && isset($pedido->foto)){
			$foto = $pedido->foto;
		}
		return $this->renderPartial('pedido-detalle', array(
			'data' => $data,
			'foto' => $foto
		));
	}
	
	public function actionExportInventario() {
		$finicio = $_GET['finicio'] ?? null;
		$ffin = $_GET['ffin'] ?? null;
	
		$where = ' WHERE i.id > 0 ';
		if (!empty($finicio) && !empty($ffin)) {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			if ($beginDate && $endDate) {
				$where .= " AND i.fecha_registro BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' 
							AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
			}
		}
	
		$select = "SELECT u.usr_pk, i.id, c.codigo AS cli_codigo, c.nombre AS cli_nombre, u.usr_nombre,
						  CASE WHEN i.reposicion = 1 THEN 'Si' ELSE 'No' END AS reposicion,
						  CASE WHEN i.tipo_pago = 1 THEN 'Pago Contado' WHEN i.tipo_pago = 2 THEN 'Pago Credito' ELSE '' END as tipo_pago,
						  i.fecha_registro, i.comentario, i.latitud, i.longitud, 
						  d.pro_codigo, d.exhibidor, d.consumido
				   FROM inventario i 
				   INNER JOIN inventario_detalle d ON i.id = d.inventario_id
				   INNER JOIN cliente c ON i.cli_codigo = c.codigo 
				   INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk ";
	
		$order = " ORDER BY i.fecha_registro DESC";
		$query = $select . $where . $order;
		$resultado = Yii::$app->db->createCommand($query)->queryAll();				
	
		// Crear el escritor de Excel
		$writer = new Writer();
		$writer->openToBrowser('inventario.xlsx');
	
		// Estilo para encabezado
		$style = new Style();
		$style->setFontBold();
		$style->setFontSize(12);
		$style->setFontColor(Color::WHITE);
		$style->setShouldWrapText();
		$style->setCellAlignment(CellAlignment::CENTER);
		$style->setCellVerticalAlignment(CellVerticalAlignment::BOTTOM);
		$style->setBackgroundColor(Color::BLUE);

	
		// Encabezados de la tabla
		$headers = [
			'Id', 'Cod.Vendedor', 'Nom.Vendedor', 'Cod.Cliente', 'Nom.Cliente',
			'Reposicion','Tipo Pago', 'Comentario', 'Producto', 'Exhibidor', 'Consumido', 
			'Latitud', 'Longitud', 'F.Registro'
		];
	
		// Agregar encabezado con estilo
		$writer->addRow(Row::fromValues($headers, $style));
	
		// Agregar datos
		foreach ($resultado as $val) {			
			$values = [
				$val['id'], $val['usr_pk'], $val['usr_nombre'], $val['cli_codigo'], $val['cli_nombre'],
				$val['reposicion'], $val['tipo_pago'], $val['comentario'], $val['pro_codigo'], $val['exhibidor'], $val['consumido'],
				$val['latitud'], $val['longitud'], $val['fecha_registro']
			];			 
			$writer->addRow(Row::fromValues($values));
		}
	
		// Cerrar el writer
		$writer->close();
		exit();
	}

	public function actionExportPedido(){
		$finicio = $_GET['finicio'];
		$ffin = $_GET['ffin'];
		$tipo = $_GET['tipo'];
	
		$where = ' WHERE i.id > 0 ';
		if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.fecha_registro BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
		if($tipo != ''){
			if($tipo == '1'){
				$where.= " AND i.condicion IS NOT NULL ";
			}
			if($tipo == '2'){
				$where.= " AND i.condicion IS NULL ";
			}
		}
	
		$select = "SELECT i.total,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,
					CASE WHEN i.condicion = 0 THEN 'Contado' 
						 WHEN i.condicion = 1 THEN 'Crédito'
						 WHEN i.condicion = 2 THEN 'Consignación'
					ELSE '' END as condicion,
					i.fecha_registro,i.id,i.latitud,i.longitud,d.pro_codigo,d.cantidad,d.precio_unitario,(d.cantidad*d.precio_unitario) as subtotal,i.observacion
					FROM pedido i 
					LEFT JOIN pedido_detalle d ON i.id = d.pedido_id
					INNER JOIN cliente c ON i.cli_codigo = c.codigo 
					INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk ";
	
		$order = " ORDER BY i.fecha_registro DESC";
		$query = $select . $where . $order;
		$resultado = Yii::$app->db->createCommand($query)->queryAll();				
	
		// Crear el escritor de Excel
		$writer = new Writer();
		$writer->openToBrowser('pedido.xlsx');
	
		// Estilo para el encabezado
		$style = new Style();
		$style->setFontBold();
		$style->setFontSize(12);
		$style->setFontColor(Color::WHITE);
		$style->setShouldWrapText();
		$style->setCellAlignment(CellAlignment::CENTER);
		$style->setCellVerticalAlignment(CellVerticalAlignment::BOTTOM);
		$style->setBackgroundColor(Color::BLUE);

	
		// Encabezados de la tabla
		$headers = [
			'Id', 'Cod.Vendedor', 'Nom.Vendedor', 'Cod.Cliente', 'Nom.Cliente',
			'Condición', 'Total', 'Producto', 'Cantidad', 'P.Unitario',		
			'Subtotal', 'Latitud', 'Longitud', 'F.Registro', 'Comentario'
		];
	
		// Agregar encabezado con estilo
		$headerRow = Row::fromValues($headers, $style);
		$writer->addRow($headerRow);
	
		// Agregar datos
		foreach ($resultado as $val) {			
			$values = [
				$val['id'], $val['usr_pk'], $val['usr_nombre'], $val['cli_codigo'], $val['cli_nombre'],
				$val['condicion'], $val['total'], $val['pro_codigo'], $val['cantidad'], $val['precio_unitario'],
				$val['subtotal'], $val['latitud'], $val['longitud'], $val['fecha_registro'], $val['observacion']
			];			 
			$writer->addRow(Row::fromValues($values));
		}
	
		// Cerrar el writer
		$writer->close();
		exit();
	}

	public function actionDevolucion()
	{
		$model = new Reporte();
		$model->finicio = date('d-m-Y');
		$model->ffin = date('d-m-Y');
		return $this->render('devolucion', [
			'model' => $model
		]);            
    }	

    public function actionDevolucionAjax(){
        $finicio = $_POST['finicio'];
        $ffin = $_POST['ffin'];
        $start = $_POST['start'];
		$length = $_POST['length'];

        $where = ' WHERE i.id > 0 ';
        if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.fecha_registro BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}

        $select = "SELECT i.total,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,				
				i.fecha_registro,i.observacion,
				m.nombre as motivo
                FROM devolucion i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo 
                INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk 
				INNER JOIN motivo m ON i.motivo_id = m.id
				";
        $selectCount = "SELECT count(*) FROM devolucion i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo ";

        $limit = " LIMIT $length OFFSET $start ";
		$order = " ORDER BY i.fecha_registro DESC";

		$query = $select . $where . $order . $limit;
		$queryTotal = $selectCount . $where;

		$resultado = Yii::$app->db->createCommand($query)->queryAll();
		$total = Yii::$app->db->createCommand($queryTotal)->queryScalar();		

        $j = 0;
		$data = [];
        foreach ($resultado as $val) {
			$data[$j]['id'] = $val['id'];            
            $data[$j]['usr_pk'] = $val['usr_pk'];
			$data[$j]['usr_nombre'] = $val['usr_nombre'];
            $data[$j]['cli_codigo'] = $val['cli_codigo'];
            $data[$j]['cli_nombre'] = $val['cli_nombre'];
            $data[$j]['motivo'] = $val['motivo'];
			$data[$j]['total'] = $val['total'];
            $data[$j]['fecha_registro'] = $val['fecha_registro'];
			$data[$j]['observacion'] = $val['observacion'];
			$j++;
		}
		$json_data = array(
			"draw"            => intval($_POST['draw']),
			"recordsTotal"    => intval($total),
			"recordsFiltered" => intval($total),
			"data"            => $data
		);
		return json_encode($json_data);
    }	

	public function actionDevolucionDetalle()
	{
		$id = $_GET['id'];
		$data = Yii::$app->db->createCommand("SELECT d.id,d.pro_codigo,d.cantidad,p.nombre ,d.precio_unitario
                    FROM devolucion_detalle d 
                    INNER JOIN producto p ON d.pro_codigo = p.codigo
                    WHERE devolucion_id =:id ")
			->bindValue(':id', $id)
			->queryAll();
		return $this->renderPartial('devolucion-detalle', array(
			'data' => $data
		));
	}
	
	public function actionExportDevolucion(){
		$finicio = $_GET['finicio'];
		$ffin = $_GET['ffin'];
	
		$where = ' WHERE i.id > 0 ';
		if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.fecha_registro BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}

	
		$select = "SELECT i.total,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,					
					i.fecha_registro,i.id,i.latitud,i.longitud,d.pro_codigo,d.cantidad,d.precio_unitario,(d.cantidad*d.precio_unitario) as subtotal,i.observacion,
					m.nombre as motivo
					FROM devolucion i 
					LEFT JOIN devolucion_detalle d ON i.id = d.devolucion_id
					INNER JOIN cliente c ON i.cli_codigo = c.codigo 
					INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk 
					INNER JOIN motivo m ON i.motivo_id = m.id
					";
	
		$order = " ORDER BY i.fecha_registro DESC";
		$query = $select . $where . $order;
		$resultado = Yii::$app->db->createCommand($query)->queryAll();				
	
		// Crear el escritor de Excel
		$writer = new Writer();
		$writer->openToBrowser('devolucion.xlsx');
	
		// Estilo para el encabezado
		$style = new Style();
		$style->setFontBold();
		$style->setFontSize(12);
		$style->setFontColor(Color::WHITE);
		$style->setShouldWrapText();
		$style->setCellAlignment(CellAlignment::CENTER);
		$style->setCellVerticalAlignment(CellVerticalAlignment::BOTTOM);
		$style->setBackgroundColor(Color::BLUE);

	
		// Encabezados de la tabla
		$headers = [
			'Id', 'Cod.Vendedor', 'Nom.Vendedor', 'Cod.Cliente', 'Nom.Cliente',
			'Motivo', 'Total', 'Producto', 'Cantidad', 'P.Unitario',		
			'Subtotal', 'Latitud', 'Longitud', 'F.Registro', 'Comentario'
		];
	
		// Agregar encabezado con estilo
		$headerRow = Row::fromValues($headers, $style);
		$writer->addRow($headerRow);
	
		// Agregar datos
		foreach ($resultado as $val) {			
			$values = [
				$val['id'], $val['usr_pk'], $val['usr_nombre'], $val['cli_codigo'], $val['cli_nombre'],
				$val['motivo'], $val['total'], $val['pro_codigo'], $val['cantidad'], $val['precio_unitario'],
				$val['subtotal'], $val['latitud'], $val['longitud'], $val['fecha_registro'], $val['observacion']
			];			 
			$writer->addRow(Row::fromValues($values));
		}
	
		// Cerrar el writer
		$writer->close();
		exit();
	}	


	public function actionDeuda()
	{
		$model = new Reporte();
		$model->finicio = date('d-m-Y');
		$model->ffin = date('d-m-Y');
		return $this->render('deuda', [
			'model' => $model
		]);            
    }

	public function actionDeudaAjax(){
		$finicio = $_POST['finicio'];
		$ffin = $_POST['ffin'];
		$tipo = $_POST['tipo'];
		$start = $_POST['start'];
		$length = $_POST['length'];

		$where = ' WHERE i.id > 0 ';
		if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.created_at BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
		if($tipo != ''){
			$where.= " AND i.tipo_deuda = ".$tipo;
		}

		$select = "SELECT i.monto_total,i.saldo_pendiente,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,
				CASE WHEN i.tipo_deuda = 1 THEN 'Crédito'
					WHEN i.tipo_deuda = 2 THEN 'Consignación'
				ELSE '' END as tipo_deuda,
				i.created_at as fecha_registro,i.observaciones,i.pedido_id,
				i.fecha_vencimiento,
				CASE 
					WHEN i.fecha_vencimiento IS NULL THEN NULL
					ELSE DATEDIFF(CURDATE(), i.fecha_vencimiento)
				END as dias_vencimiento,
				CASE 
					WHEN i.fecha_vencimiento IS NULL AND estado = 1 THEN 'Sin fecha'
					WHEN i.fecha_vencimiento IS NULL AND estado = 2 THEN 'Pagado'
					WHEN i.fecha_vencimiento < CURDATE() THEN 'Vencida'
					WHEN i.fecha_vencimiento = CURDATE() THEN 'Vence Hoy'
					ELSE 'Vigente'
				END as estado_vencimiento
				FROM deuda_cliente i 
				INNER JOIN cliente c ON i.cli_codigo = c.codigo 
				INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk ";
		$selectCount = "SELECT count(*) FROM deuda_cliente i 
				INNER JOIN cliente c ON i.cli_codigo = c.codigo ";

		$limit = " LIMIT $length OFFSET $start ";
		$order = " ORDER BY i.created_at DESC";

		$query = $select . $where . $order . $limit;
		$queryTotal = $selectCount . $where;

		$resultado = Yii::$app->db->createCommand($query)->queryAll();
		$total = Yii::$app->db->createCommand($queryTotal)->queryScalar();		

		$j = 0;
		$data = [];
		foreach ($resultado as $val) {
			$data[$j]['id'] = $val['id'];            
			$data[$j]['usr_pk'] = $val['usr_pk'];
			$data[$j]['pedido_id'] = $val['pedido_id'];
			$data[$j]['usr_nombre'] = $val['usr_nombre'];
			$data[$j]['cli_codigo'] = $val['cli_codigo'];
			$data[$j]['cli_nombre'] = $val['cli_nombre'];
			$data[$j]['tipo_deuda'] = $val['tipo_deuda'];
			$data[$j]['monto_total'] = $val['monto_total'];
			$data[$j]['saldo_pendiente'] = $val['saldo_pendiente'];
			$data[$j]['fecha_registro'] = $val['fecha_registro'];
			$data[$j]['observaciones'] = $val['observaciones'];
			
			// Nuevos campos para vencimiento
			$data[$j]['fecha_vencimiento'] = $val['fecha_vencimiento'];
			$data[$j]['estado_vencimiento'] = $val['estado_vencimiento'];
			
			// Formatear días de vencimiento
			if ($val['estado_vencimiento'] == 'Vencida' && $val['dias_vencimiento'] !== null) {
				$data[$j]['dias_vencimiento'] = abs($val['dias_vencimiento']) . ' días';
			} elseif ($val['estado_vencimiento'] == 'Vence Hoy') {
				$data[$j]['dias_vencimiento'] = 'Hoy';
			} elseif ($val['estado_vencimiento'] == 'Vigente' && $val['dias_vencimiento'] !== null) {
				$diasRestantes = abs($val['dias_vencimiento']);
				$data[$j]['dias_vencimiento'] = $diasRestantes . ' días restantes';
			} else {
				// Manejar casos donde fecha_vencimiento es null o no válida
				$data[$j]['dias_vencimiento'] = 'Sin fecha';
			}
			
			$j++;
		}
		$json_data = array(
			"draw"            => intval($_POST['draw']),
			"recordsTotal"    => intval($total),
			"recordsFiltered" => intval($total),
			"data"            => $data
		);
		return json_encode($json_data);
	}

	public function actionExportDeuda(){
		$finicio = $_GET['finicio'];
		$ffin = $_GET['ffin'];
		$tipo = $_GET['tipo'];

		$where = ' WHERE i.id > 0 ';
		if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.created_at BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
		if($tipo != ''){
			$where.= " AND i.tipo_deuda = ".$tipo;
		}

		$select = "SELECT i.monto_total,i.saldo_pendiente,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,
					CASE WHEN i.tipo_deuda = 1 THEN 'Crédito'
						WHEN i.tipo_deuda = 2 THEN 'Consignación'
					ELSE '' END as tipo_deuda,
					i.created_at as fecha_registro,i.id,i.latitud,i.longitud,i.observaciones,
					i.fecha_vencimiento,
					CASE 
						WHEN i.fecha_vencimiento IS NULL THEN NULL
						ELSE DATEDIFF(CURDATE(), i.fecha_vencimiento)
					END as dias_vencimiento,
					CASE 
						WHEN i.fecha_vencimiento IS NULL AND estado = 1 THEN 'Sin fecha'
						WHEN i.fecha_vencimiento IS NULL AND estado = 2 THEN 'Pagado'
						WHEN i.fecha_vencimiento < CURDATE() THEN 'Vencida'
						WHEN i.fecha_vencimiento = CURDATE() THEN 'Vence Hoy'
						ELSE 'Vigente'
					END as estado_vencimiento
					FROM deuda_cliente i 					
					INNER JOIN cliente c ON i.cli_codigo = c.codigo 
					INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk ";

		$order = " ORDER BY i.created_at DESC";
		$query = $select . $where . $order;
		$resultado = Yii::$app->db->createCommand($query)->queryAll();				

		// Crear el escritor de Excel
		$writer = new Writer();
		$writer->openToBrowser('deuda_cliente.xlsx');

		// Estilo para el encabezado
		$style = new Style();
		$style->setFontBold();
		$style->setFontSize(12);
		$style->setFontColor(Color::WHITE);
		$style->setShouldWrapText();
		$style->setCellAlignment(CellAlignment::CENTER);
		$style->setCellVerticalAlignment(CellVerticalAlignment::BOTTOM);
		$style->setBackgroundColor(Color::BLUE);

		// Estilo para fechas
		$dateStyle = new Style();
		$dateStyle->setFormat('dd/mm/yyyy');

		// Estilo para deudas vencidas
		$vencidaStyle = new Style();
		$vencidaStyle->setBackgroundColor(Color::DARK_BLUE);
		$vencidaStyle->setFontColor(Color::RED);

		// Estilo para deudas que vencen hoy
		$venceHoyStyle = new Style();
		$venceHoyStyle->setBackgroundColor(Color::YELLOW); // Fondo amarillo claro
		$venceHoyStyle->setFontColor(Color::BLACK);

		// Encabezados de la tabla
		$headers = [
			'Id', 'Cod.Vendedor', 'Nom.Vendedor', 'Cod.Cliente', 'Nom.Cliente',
			'Tipo Deuda', 'Monto Total','Saldo Pendiente', 'F.Registro', 'F.Vencimiento', 
			'Estado', 'Días', 'Latitud', 'Longitud', 'Comentario'
		];

		// Agregar encabezado con estilo
		$headerRow = Row::fromValues($headers, $style);
		$writer->addRow($headerRow);

		// Agregar datos
		foreach ($resultado as $val) {
			// Formatear fecha de vencimiento
			$fechaVencimiento = null;
			if (!empty($val['fecha_vencimiento'])) {
				$fechaVencimiento = new \DateTime($val['fecha_vencimiento']);
			}

			// Formatear días de vencimiento
			$diasVencimiento = '';
			if ($val['estado_vencimiento'] == 'Vencida' && $val['dias_vencimiento'] !== null) {
				$diasVencimiento = abs($val['dias_vencimiento']) . ' días';
			} elseif ($val['estado_vencimiento'] == 'Vence Hoy') {
				$diasVencimiento = 'Hoy';
			} elseif ($val['estado_vencimiento'] == 'Vigente' && $val['dias_vencimiento'] !== null) {
				$diasRestantes = abs($val['dias_vencimiento']);
				$diasVencimiento = $diasRestantes . ' días restantes';
			} else {
				$diasVencimiento = 'Sin fecha';
			}

			// Determinar el estilo de la fila según el estado
			$rowStyle = null;
			if ($val['estado_vencimiento'] == 'Vencida') {
				$rowStyle = $vencidaStyle;
			} elseif ($val['estado_vencimiento'] == 'Vence Hoy') {
				$rowStyle = $venceHoyStyle;
			}

			$values = [
				$val['id'], 
				$val['usr_pk'], 
				$val['usr_nombre'], 
				$val['cli_codigo'], 
				$val['cli_nombre'],
				$val['tipo_deuda'], 
				floatval($val['monto_total']), 
				floatval($val['saldo_pendiente']), 
				$val['fecha_registro'], 
				$fechaVencimiento, // Fecha como objeto DateTime
				$val['estado_vencimiento'],
				$diasVencimiento,
				$val['latitud'], 
				$val['longitud'], 
				$val['observaciones']
			];

			// Crear celdas individuales para aplicar estilos específicos
			$cells = [];
			foreach ($values as $index => $value) {
				if ($index === 9 && $value instanceof \DateTime) { // Fecha de vencimiento
					$cells[] = Cell::fromValue($value, $dateStyle);
				} elseif ($index === 10 || $index === 11) { // Estado y días
					$cells[] = Cell::fromValue($value, $rowStyle);
				} else {
					$cells[] = Cell::fromValue($value, $rowStyle);
				}
			}

			$row = new Row($cells);
			$writer->addRow($row);
		}

		// Cerrar el writer
		$writer->close();
		exit();
	}
	
	public function actionPago()
	{
		$model = new Reporte();
		$model->finicio = date('d-m-Y');
		$model->ffin = date('d-m-Y');
		return $this->render('pago', [
			'model' => $model
		]);            
    }	

    public function actionPagoAjax(){
        $finicio = $_POST['finicio'];
        $ffin = $_POST['ffin'];
		$tipo = $_POST['tipo'];
        $start = $_POST['start'];
		$length = $_POST['length'];

        $where = ' WHERE i.id > 0 ';
        if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.created_at BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
		if($tipo != ''){
			$where .= " AND i.tipo_pago = '".$tipo."' ";
		}

        $select = "SELECT i.deuda_id,i.monto_pago,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,				
				i.created_at as fecha_registro,i.observacion,
				CASE WHEN i.tipo_pago = '1' THEN 'Pago Total'
				WHEN i.tipo_pago = '2' THEN 'Pago Parcial'
				END as tipo_pago,
				m.descripcion as medio_pago
                FROM pago i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo 
                INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk 
				INNER JOIN medio_pago m ON i.metodo_pago = m.id
				";
        $selectCount = "SELECT count(*) FROM pago i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo ";

        $limit = " LIMIT $length OFFSET $start ";
		$order = " ORDER BY i.created_at DESC";

		$query = $select . $where . $order . $limit;
		$queryTotal = $selectCount . $where;

		$resultado = Yii::$app->db->createCommand($query)->queryAll();
		$total = Yii::$app->db->createCommand($queryTotal)->queryScalar();		

        $j = 0;
		$data = [];
        foreach ($resultado as $val) {
			$data[$j]['id'] = $val['id'];        
			$data[$j]['deuda_id'] = $val['deuda_id'];            
            $data[$j]['usr_pk'] = $val['usr_pk'];
			$data[$j]['usr_nombre'] = $val['usr_nombre'];
            $data[$j]['cli_codigo'] = $val['cli_codigo'];
            $data[$j]['cli_nombre'] = $val['cli_nombre'];
			$data[$j]['monto_pago'] = $val['monto_pago'];
            $data[$j]['fecha_registro'] = $val['fecha_registro'];
			$data[$j]['tipo_pago'] = $val['tipo_pago'];
			$data[$j]['observacion'] = $val['observacion'];
			$data[$j]['medio_pago'] = $val['medio_pago'];
			$j++;
		}
		$json_data = array(
			"draw"            => intval($_POST['draw']),
			"recordsTotal"    => intval($total),
			"recordsFiltered" => intval($total),
			"data"            => $data
		);
		return json_encode($json_data);
    }	

	public function actionExportPago(){
		$finicio = $_GET['finicio'];
		$ffin = $_GET['ffin'];
		$tipo = $_GET['tipo'];
	
		$where = ' WHERE i.id > 0 ';
		if ($finicio != '' && $ffin != '') {
			$beginDate = \DateTime::createFromFormat('d-m-Y', $finicio);
			$endDate = \DateTime::createFromFormat('d-m-Y', $ffin);
			$where .= " AND i.created_at BETWEEN '" . $beginDate->format('Y-m-d') . " 00:00:00' AND '" . $endDate->format('Y-m-d') . " 23:59:59' ";
		}
		if($tipo != ''){
			$where .= " AND i.tipo_pago = '".$tipo."' ";
		}
	
        $select = "SELECT i.deuda_id,i.monto_pago,u.usr_pk,i.id,c.codigo as cli_codigo,c.nombre as cli_nombre,u.usr_nombre,				
				i.created_at as fecha_registro,i.observacion,
				CASE WHEN i.tipo_pago = '1' THEN 'Pago Total'
				WHEN i.tipo_pago = '2' THEN 'Pago Parcial'
				END as tipo_pago, i.latitud, i.longitud,
				m.descripcion as medio_pago
                FROM pago i 
                INNER JOIN cliente c ON i.cli_codigo = c.codigo 
                INNER JOIN tbl_usuario u ON i.ven_codigo = u.usr_pk  
				INNER JOIN medio_pago m ON i.metodo_pago = m.id
				";
	
		$order = " ORDER BY i.created_at DESC";
		$query = $select . $where . $order;
		$resultado = Yii::$app->db->createCommand($query)->queryAll();				
	
		// Crear el escritor de Excel
		$writer = new Writer();
		$writer->openToBrowser('pagos_cliente.xlsx');
	
		// Estilo para el encabezado
		$style = new Style();
		$style->setFontBold();
		$style->setFontSize(12);
		$style->setFontColor(Color::WHITE);
		$style->setShouldWrapText();
		$style->setCellAlignment(CellAlignment::CENTER);
		$style->setCellVerticalAlignment(CellVerticalAlignment::BOTTOM);
		$style->setBackgroundColor(Color::BLUE);

	
		// Encabezados de la tabla
		$headers = [
			'Id','Deuda Id', 'Cod.Vendedor', 'Nom.Vendedor', 'Cod.Cliente', 'Nom.Cliente',
			'Tipo Pago','Medio Pago', 'Monto','Latitud', 'Longitud', 'F.Registro', 'Comentario'
		];
	
		// Agregar encabezado con estilo
		$headerRow = Row::fromValues($headers, $style);
		$writer->addRow($headerRow);
	
		// Agregar datos
		foreach ($resultado as $val) {			
			$values = [
				$val['id'], $val['deuda_id'], $val['usr_pk'], $val['usr_nombre'], $val['cli_codigo'], $val['cli_nombre'],
				$val['tipo_pago'],$val['medio_pago'], floatval($val['monto_pago']), $val['latitud'], $val['longitud'], $val['fecha_registro'], $val['observacion']
			];			 
			$writer->addRow(Row::fromValues($values));
		}
	
		// Cerrar el writer
		$writer->close();
		exit();
	}	


}