<?php

use Mike42\Escpos\Printer;
use Mike42\Escpos\EscposImage;
use Mike42\Escpos\PrintConnectors\FilePrintConnector;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
require_once(__DIR__ . '/../extensiones/fpdf/fpdf.php');

class ControladorVentas{

	/*=============================================
	MOSTRAR VENTAS
	=============================================*/

	static public function ctrMostrarVentas($item, $valor){

		$tabla = "ventas";

		$respuesta = ModeloVentas::mdlMostrarVentas($tabla, $item, $valor);
 
		return $respuesta;

	}

	/*=============================================
	CREAR VENTA
	=============================================*/

	static public function ctrCrearVenta(){

		if(isset($_POST["nuevaVenta"])){

			/*=============================================
			ACTUALIZAR LAS COMPRAS DEL CLIENTE Y REDUCIR EL STOCK Y AUMENTAR LAS VENTAS DE LOS PRODUCTOS
			=============================================*/

			if($_POST["listaProductos"] == ""){

					echo'<script>

				swal({
					  type: "error",
					  title: "La venta no se ha ejecuta si no hay productos",
					  showConfirmButton: true,
					  confirmButtonText: "Cerrar"
					  }).then(function(result){
								if (result.value) {

								window.location = "ventas";

								}
							})

				</script>';

				return;
			}


			$listaProductos = json_decode($_POST["listaProductos"], true);

			$totalProductosComprados = array();

			foreach ($listaProductos as $key => $value) {

			   array_push($totalProductosComprados, $value["cantidad"]);
				
			   $tablaProductos = "productos";

			    $item = "id";
			    $valor = $value["id"];
			    $orden = "id";

			    $traerProducto = ModeloProductos::mdlMostrarProductos($tablaProductos, $item, $valor, $orden);

				$item1a = "ventas";
				$valor1a = $value["cantidad"] + $traerProducto["ventas"];

			    $nuevasVentas = ModeloProductos::mdlActualizarProducto($tablaProductos, $item1a, $valor1a, $valor);

				$item1b = "stock";
                                $valor1b = $traerProducto["stock"] - $value["cantidad"]; // ✅ Resta directamente el stock actual

				$nuevoStock = ModeloProductos::mdlActualizarProducto($tablaProductos, $item1b, $valor1b, $valor);

			}

			$tablaClientes = "clientes";

			$item = "id";
			$valor = $_POST["seleccionarCliente"];

			$traerCliente = ModeloClientes::mdlMostrarClientes($tablaClientes, $item, $valor);

			$item1a = "compras";
				
			$valor1a = array_sum($totalProductosComprados) + $traerCliente["compras"];

			$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item1a, $valor1a, $valor);

			$item1b = "ultima_compra";

			date_default_timezone_set('America/Bogota');

			$fecha = date('Y-m-d');
			$hora = date('H:i:s');
			$valor1b = $fecha.' '.$hora;

			$fechaCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item1b, $valor1b, $valor);

			/*=============================================
			GUARDAR LA VENTA
			=============================================*/	

			$tabla = "ventas";

			$datos = array("id_vendedor"=>$_POST["idVendedor"],
						   "id_cliente"=>$_POST["seleccionarCliente"],
						   "codigo"=>$_POST["nuevaVenta"],
						   "productos"=>$_POST["listaProductos"],
						   "impuesto"=>$_POST["nuevoPrecioImpuesto"],
						   "neto"=>$_POST["nuevoPrecioNeto"],
						   "total"=>$_POST["totalVenta"],
						   "metodo_pago"=>$_POST["listaMetodoPago"]);

			$respuesta = ModeloVentas::mdlIngresarVenta($tabla, $datos);

			if($respuesta == "ok"){

				// $impresora = "epson20";

				// $conector = new WindowsPrintConnector($impresora);

				// $imprimir = new Printer($conector);

				// $imprimir -> text("Hola Mundo"."\n");

				// $imprimir -> cut();

				// $imprimir -> close();

				/**$impresora = "epson20";

				$conector = new WindowsPrintConnector($impresora);

				$printer = new Printer($conector);

				$printer -> setJustification(Printer::JUSTIFY_CENTER);

				$printer -> text(date("Y-m-d H:i:s")."\n");//Fecha de la factura

				$printer -> feed(1); //Alimentamos el papel 1 vez*/

				/**$printer -> text("Inventory QWERY"."\n");//Nombre de la empresa

				$printer -> text("NIT: 71.759.963-9"."\n");//Nit de la empresa

				$printer -> text("Dirección: Calle 44B 92-11"."\n");//Dirección de la empresa

				$printer -> text("Teléfono: 300 786 52 49"."\n");//Teléfono de la empresa

				$printer -> text("FACTURA N.".$_POST["nuevaVenta"]."\n");//Número de factura

				$printer -> feed(1); //Alimentamos el papel 1 vez*/

				/**$printer -> text("Cliente: ".$traerCliente["nombre"]."\n");//Nombre del cliente

				$tablaVendedor = "usuarios";
				$item = "id";
				$valor = $_POST["idVendedor"];

				$traerVendedor = ModeloUsuarios::mdlMostrarUsuarios($tablaVendedor, $item, $valor);

				$printer -> text("Vendedor: ".$traerVendedor["nombre"]."\n");//Nombre del vendedor

				$printer -> feed(1); //Alimentamos el papel 1 vez*/

				/**foreach ($listaProductos as $key => $value) {

					$printer->setJustification(Printer::JUSTIFY_LEFT);

					$printer->text($value["descripcion"]."\n");//Nombre del producto

					$printer->setJustification(Printer::JUSTIFY_RIGHT);

					$printer->text("$ ".number_format($value["precio"],2)." Und x ".$value["cantidad"]." = $ ".number_format($value["total"],2)."\n");

				}

				$printer -> feed(1); //Alimentamos el papel 1 vez*/			
				
				/**$printer->text("NETO: $ ".number_format($_POST["nuevoPrecioNeto"],2)."\n"); //ahora va el neto

				$printer->text("IMPUESTO: $ ".number_format($_POST["nuevoPrecioImpuesto"],2)."\n"); //ahora va el impuesto

				$printer->text("--------\n");

				$printer->text("TOTAL: $ ".number_format($_POST["totalVenta"],2)."\n"); //ahora va el total

				$printer -> feed(1); //Alimentamos el papel 1 vez*/	

				/**$printer->text("Muchas gracias por su compra"); //Podemos poner también un pie de página

				$printer -> feed(3); //Alimentamos el papel 3 veces*/

				/**$printer -> cut(); //Cortamos el papel, si la impresora tiene la opción

				$printer -> pulse(); //Por medio de la impresora mandamos un pulso, es útil cuando hay cajón moneder

				$printer -> close();*/

	
				echo'<script>

				localStorage.removeItem("rango");

				swal({
					  type: "success",
					  title: "La venta ha sido guardada correctamente",
					  showConfirmButton: true,
					  confirmButtonText: "Cerrar"
					  }).then(function(result){
								if (result.value) {

								window.location = "ventas";

								}
							})

				</script>';

			}

		}

	}

	/*=============================================
	EDITAR VENTA
	=============================================*/

	static public function ctrEditarVenta(){

		if(isset($_POST["editarVenta"])){

			/*=============================================
			FORMATEAR TABLA DE PRODUCTOS Y LA DE CLIENTES
			=============================================*/
			$tabla = "ventas";

			$item = "codigo";
			$valor = $_POST["editarVenta"];

			$traerVenta = ModeloVentas::mdlMostrarVentas($tabla, $item, $valor);

			/*=============================================
			REVISAR SI VIENE PRODUCTOS EDITADOS
			=============================================*/

			if($_POST["listaProductos"] == ""){

				$listaProductos = $traerVenta["productos"];
				$cambioProducto = false;


			}else{

				$listaProductos = $_POST["listaProductos"];
				$cambioProducto = true;
			}

			if($cambioProducto){

				$productos =  json_decode($traerVenta["productos"], true);

				$totalProductosComprados = array();

				foreach ($productos as $key => $value) {

					array_push($totalProductosComprados, $value["cantidad"]);
					
					$tablaProductos = "productos";

					$item = "id";
					$valor = $value["id"];
					$orden = "id";

					$traerProducto = ModeloProductos::mdlMostrarProductos($tablaProductos, $item, $valor, $orden);

					$item1a = "ventas";
					$valor1a = $traerProducto["ventas"] - $value["cantidad"];

					$nuevasVentas = ModeloProductos::mdlActualizarProducto($tablaProductos, $item1a, $valor1a, $valor);

					$item1b = "stock";
					$valor1b = $value["cantidad"] + $traerProducto["stock"];

					$nuevoStock = ModeloProductos::mdlActualizarProducto($tablaProductos, $item1b, $valor1b, $valor);

				}

				$tablaClientes = "clientes";

				$itemCliente = "id";
				$valorCliente = $_POST["seleccionarCliente"];

				$traerCliente = ModeloClientes::mdlMostrarClientes($tablaClientes, $itemCliente, $valorCliente);

				$item1a = "compras";
				$valor1a = $traerCliente["compras"] - array_sum($totalProductosComprados);		

				$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item1a, $valor1a, $valorCliente);

				/*=============================================
				ACTUALIZAR LAS COMPRAS DEL CLIENTE Y REDUCIR EL STOCK Y AUMENTAR LAS VENTAS DE LOS PRODUCTOS
				=============================================*/

				$listaProductos_2 = json_decode($listaProductos, true);

				$totalProductosComprados_2 = array();

				foreach ($listaProductos_2 as $key => $value) {

					array_push($totalProductosComprados_2, $value["cantidad"]);
					
					$tablaProductos_2 = "productos";

					$item_2 = "id";
					$valor_2 = $value["id"];
					$orden = "id";

					$traerProducto_2 = ModeloProductos::mdlMostrarProductos($tablaProductos_2, $item_2, $valor_2, $orden);

					$item1a_2 = "ventas";
					$valor1a_2 = $value["cantidad"] + $traerProducto_2["ventas"];

					$nuevasVentas_2 = ModeloProductos::mdlActualizarProducto($tablaProductos_2, $item1a_2, $valor1a_2, $valor_2);

					$item1b_2 = "stock";
					$valor1b_2 = $value["stock"];

					$nuevoStock_2 = ModeloProductos::mdlActualizarProducto($tablaProductos_2, $item1b_2, $valor1b_2, $valor_2);

				}

				$tablaClientes_2 = "clientes";

				$item_2 = "id";
				$valor_2 = $_POST["seleccionarCliente"];

				$traerCliente_2 = ModeloClientes::mdlMostrarClientes($tablaClientes_2, $item_2, $valor_2);

				$item1a_2 = "compras";

				$valor1a_2 = array_sum($totalProductosComprados_2) + $traerCliente_2["compras"];

				$comprasCliente_2 = ModeloClientes::mdlActualizarCliente($tablaClientes_2, $item1a_2, $valor1a_2, $valor_2);

				$item1b_2 = "ultima_compra";

				date_default_timezone_set('America/Bogota');

				$fecha = date('Y-m-d');
				$hora = date('H:i:s');
				$valor1b_2 = $fecha.' '.$hora;

				$fechaCliente_2 = ModeloClientes::mdlActualizarCliente($tablaClientes_2, $item1b_2, $valor1b_2, $valor_2);

			}

			/*=============================================
			GUARDAR CAMBIOS DE LA VENTA
			=============================================*/	

			$datos = array("id_vendedor"=>$_POST["idVendedor"],
						   "id_cliente"=>$_POST["seleccionarCliente"],
						   "codigo"=>$_POST["editarVenta"],
						   "productos"=>$listaProductos,
						   "impuesto"=>$_POST["nuevoPrecioImpuesto"],
						   "neto"=>$_POST["nuevoPrecioNeto"],
						   "total"=>$_POST["totalVenta"],
						   "metodo_pago"=>$_POST["listaMetodoPago"]);


			$respuesta = ModeloVentas::mdlEditarVenta($tabla, $datos);

			if($respuesta == "ok"){
                            
                            // ⚡ Obtener la venta recién editada (y con su nueva fecha del timestamp)
                            $ventaActualizada = ModeloVentas::mdlMostrarVentas("ventas", "codigo", $_POST["editarVenta"]);
                            $fechaVenta = $ventaActualizada["fecha"]; // Usamos esta fecha
                            
                            // =============================================
                            // ACTUALIZAR TRANSACCIÓN RELACIONADA A LA VENTA
                            // =============================================
                            $transaccion = ModeloTransacciones::mdlObtenerTransaccionPorVenta($traerVenta["id"]); // obtenemos id_transaccion usando id_venta

                            if ($transaccion) {

                                    $metodo = explode('-', strtoupper($_POST["listaMetodoPago"]))[0]; // en caso que venga QR-XXXX

                                    $datosTransaccion = array(
                                            "id_transaccion" => $transaccion["id_transaccion"],
                                            "monto" => $_POST["totalVenta"],
                                            "fecha" => $fechaVenta, // ← aquí usamos la misma fecha exacta que la de la venta
                                            "descripcion" => "Venta de productos",
                                            "referencia" => $_POST["editarVenta"],
                                            "metodo_pago" => $metodo,
                                            "id_tipo_transaccion" => 1 // Ingreso
                                    );

                                    ModeloTransacciones::mdlEditarTransacciones("transacciones", $datosTransaccion);
                            }


				echo'<script>

				localStorage.removeItem("rango");

				swal({
					  type: "success",
					  title: "La venta ha sido editada correctamente",
					  showConfirmButton: true,
					  confirmButtonText: "Cerrar"
					  }).then((result) => {
								if (result.value) {

								window.location = "ventas";

								}
							})

				</script>';

			}

		}

	}


	/*=============================================
	ELIMINAR VENTA
	=============================================*/

	static public function ctrEliminarVenta(){

		if(isset($_GET["idVenta"])){

			$tabla = "ventas";

			$item = "id";
			$valor = $_GET["idVenta"];

			$traerVenta = ModeloVentas::mdlMostrarVentas($tabla, $item, $valor);

			/*=============================================
			ACTUALIZAR FECHA ÚLTIMA COMPRA
			=============================================*/

			$tablaClientes = "clientes";

			$itemVentas = null;
			$valorVentas = null;

			$traerVentas = ModeloVentas::mdlMostrarVentas($tabla, $itemVentas, $valorVentas);

			$guardarFechas = array();

			foreach ($traerVentas as $key => $value) {
				
				if($value["id_cliente"] == $traerVenta["id_cliente"]){

					array_push($guardarFechas, $value["fecha"]);

				}

			}

			if(count($guardarFechas) > 1){

				if($traerVenta["fecha"] > $guardarFechas[count($guardarFechas)-2]){

					$item = "ultima_compra";
					$valor = $guardarFechas[count($guardarFechas)-2];
					$valorIdCliente = $traerVenta["id_cliente"];

					$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item, $valor, $valorIdCliente);

				}else{

					$item = "ultima_compra";
					$valor = $guardarFechas[count($guardarFechas)-1];
					$valorIdCliente = $traerVenta["id_cliente"];

					$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item, $valor, $valorIdCliente);

				}


			}else{

				$item = "ultima_compra";
				$valor = "0000-00-00 00:00:00";
				$valorIdCliente = $traerVenta["id_cliente"];

				$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item, $valor, $valorIdCliente);

			}

			/*=============================================
			FORMATEAR TABLA DE PRODUCTOS Y LA DE CLIENTES
			=============================================*/

			$productos =  json_decode($traerVenta["productos"], true);

			$totalProductosComprados = array();

			foreach ($productos as $key => $value) {

				array_push($totalProductosComprados, $value["cantidad"]);
				
				$tablaProductos = "productos";

				$item = "id";
				$valor = $value["id"];
				$orden = "id";

				$traerProducto = ModeloProductos::mdlMostrarProductos($tablaProductos, $item, $valor, $orden);

				$item1a = "ventas";
				$valor1a = $traerProducto["ventas"] - $value["cantidad"];

				$nuevasVentas = ModeloProductos::mdlActualizarProducto($tablaProductos, $item1a, $valor1a, $valor);

				$item1b = "stock";
				$valor1b = $value["cantidad"] + $traerProducto["stock"];

				$nuevoStock = ModeloProductos::mdlActualizarProducto($tablaProductos, $item1b, $valor1b, $valor);

			}

			$tablaClientes = "clientes";

			$itemCliente = "id";
			$valorCliente = $traerVenta["id_cliente"];

			$traerCliente = ModeloClientes::mdlMostrarClientes($tablaClientes, $itemCliente, $valorCliente);

			$item1a = "compras";
			$valor1a = $traerCliente["compras"] - array_sum($totalProductosComprados);

			$comprasCliente = ModeloClientes::mdlActualizarCliente($tablaClientes, $item1a, $valor1a, $valorCliente);
                        
                        /*=============================================
                        ELIMINAR TRANSACCIÓN ASOCIADA A LA VENTA
                        =============================================*/

                        $tablaTransacciones = "transacciones";
                        $itemTransaccion = "id_venta";
                        $valorTransaccion = $_GET["idVenta"];
                        $respuestaTransaccion = ModeloTransacciones::mdlEliminarTransaccionPorVenta("transacciones", $_GET["idVenta"]);

                        if ($respuestaTransaccion !== "ok") {
                            echo '<script>
                                swal({
                                    type: "error",
                                    title: "Error al eliminar la transacción relacionada",
                                    text: "No se eliminó la venta para evitar inconsistencias.",
                                    showConfirmButton: true,
                                    confirmButtonText: "Cerrar"
                                }).then(function(result){
                                    if (result.value) {
                                        window.location = "ventas";
                                    }
                                });
                            </script>';
                            return;
                        }

                        // Si la transacción fue eliminada correctamente, entonces sí eliminamos la venta
                        $respuestaVenta = ModeloVentas::mdlEliminarVenta("ventas", $_GET["idVenta"]);

                        if ($respuestaVenta == "ok") {
                            echo '<script>
                                swal({
                                    type: "success",
                                    title: "La venta y su transacción fueron eliminadas correctamente",
                                    showConfirmButton: true,
                                    confirmButtonText: "Cerrar"
                                }).then(function(result){
                                    if (result.value) {
                                        window.location = "ventas";
                                    }
                                });
                            </script>';
                        }
		}

	}

	/*=============================================
	RANGO FECHAS
	=============================================*/	

	static public function ctrRangoFechasVentas($fechaInicial, $fechaFinal){

		$tabla = "ventas";

		$respuesta = ModeloVentas::mdlRangoFechasVentas($tabla, $fechaInicial, $fechaFinal);

		return $respuesta;
		
	}

	/*=============================================
	DESCARGAR EXCEL
	=============================================*/

	public function ctrDescargarReporte(){

		if(isset($_GET["reporte"])){

			$tabla = "ventas";

			if(isset($_GET["fechaInicial"]) && isset($_GET["fechaFinal"])){

				$ventas = ModeloVentas::mdlRangoFechasVentas($tabla, $_GET["fechaInicial"], $_GET["fechaFinal"]);

			}else{

				$item = null;
				$valor = null;

				$ventas = ModeloVentas::mdlMostrarVentas($tabla, $item, $valor);

			}


			/*=============================================
			CREAMOS EL ARCHIVO DE EXCEL
			=============================================*/

			$Name = $_GET["reporte"].'.xls';

			header('Expires: 0');
			header('Cache-control: private');
			header("Content-type: application/vnd.ms-excel"); // Archivo de Excel
			header("Cache-Control: cache, must-revalidate"); 
			header('Content-Description: File Transfer');
			header('Last-Modified: '.date('D, d M Y H:i:s'));
			header("Pragma: public"); 
			header('Content-Disposition:; filename="'.$Name.'"');
			header("Content-Transfer-Encoding: binary");
		
			echo utf8_decode("<table border='0'> 

					<tr> 
					<td style='font-weight:bold; border:1px solid #eee;'>CÓDIGO</td> 
					<td style='font-weight:bold; border:1px solid #eee;'>CLIENTE</td>
					<td style='font-weight:bold; border:1px solid #eee;'>VENDEDOR</td>
					<td style='font-weight:bold; border:1px solid #eee;'>CANTIDAD</td>
					<td style='font-weight:bold; border:1px solid #eee;'>PRODUCTOS</td>
					<td style='font-weight:bold; border:1px solid #eee;'>IMPUESTO</td>
					<td style='font-weight:bold; border:1px solid #eee;'>NETO</td>		
					<td style='font-weight:bold; border:1px solid #eee;'>TOTAL</td>		
					<td style='font-weight:bold; border:1px solid #eee;'>METODO DE PAGO</td	
					<td style='font-weight:bold; border:1px solid #eee;'>FECHA</td>		
					</tr>");

			foreach ($ventas as $row => $item){

				$cliente = ControladorClientes::ctrMostrarClientes("id", $item["id_cliente"]);
				$vendedor = ControladorUsuarios::ctrMostrarUsuarios("id", $item["id_vendedor"]);

			 echo utf8_decode("<tr>
			 			<td style='border:1px solid #eee;'>".$item["codigo"]."</td> 
			 			<td style='border:1px solid #eee;'>".$cliente["nombre"]."</td>
			 			<td style='border:1px solid #eee;'>".$vendedor["nombre"]."</td>
			 			<td style='border:1px solid #eee;'>");

			 	$productos =  json_decode($item["productos"], true);

			 	foreach ($productos as $key => $valueProductos) {
			 			
			 			echo utf8_decode($valueProductos["cantidad"]."<br>");
			 		}

			 	echo utf8_decode("</td><td style='border:1px solid #eee;'>");	

		 		foreach ($productos as $key => $valueProductos) {
			 			
		 			echo utf8_decode($valueProductos["descripcion"]."<br>");
		 		
		 		}

		 		echo utf8_decode("</td>
					<td style='border:1px solid #eee;'>$ ".number_format($item["impuesto"],2)."</td>
					<td style='border:1px solid #eee;'>$ ".number_format($item["neto"],2)."</td>	
					<td style='border:1px solid #eee;'>$ ".number_format($item["total"],2)."</td>
					<td style='border:1px solid #eee;'>".$item["metodo_pago"]."</td>
					<td style='border:1px solid #eee;'>".substr($item["fecha"],0,10)."</td>		
		 			</tr>");


			}


			echo "</table>";

		}

	}
        
        /*=============================================
	DESCARGAR EXCEL
	=============================================*/
        
        // Incluir la librería FPDF


public function ctrDescargarReportePdf(){

    if(isset($_GET["reporte"])){

        $tabla = "ventas";

        if(isset($_GET["fechaInicial"]) && isset($_GET["fechaFinal"])){

            $ventas = ModeloVentas::mdlRangoFechasVentas($tabla, $_GET["fechaInicial"], $_GET["fechaFinal"]);
            $fechaInicio = $_GET["fechaInicial"];
            $fechaFin = $_GET["fechaFinal"];

        }else{

            $item = null;
            $valor = null;

            $ventas = ModeloVentas::mdlMostrarVentas($tabla, $item, $valor);
            $fechaInicio = "Sin fecha ini";
            $fechaFin = "Sin fecha fin";
        }

        /*=============================================
        CREAMOS EL ARCHIVO PDF
        =============================================*/

        $Name = $_GET["reporte"].'.pdf';

        // Crear una instancia de FPDF con orientación horizontal
        $pdf = new FPDF('L', 'mm', 'A4'); // 'L' para Landscape, 'mm' para milímetros, 'A4' es el tamaño de página
        $pdf->SetMargins(10, 10, 10); // Márgenes izquierdo, superior, derecho
        $pdf->AddPage(); // Agregar página al PDF

        // Establecer fuente para el título
        $pdf->SetFont('Arial', 'B', 16);
        $pdf->Cell(0, 10, 'Reporte de ventas Santeria Urkupina', 0, 1, 'C');
        
        // Establecer fuente para el subtítulo
        $pdf->SetFont('Arial', '', 12);
        $pdf->Cell(0, 10, 'Periodo: '.$fechaInicio.' - '.$fechaFin, 0, 1, 'C');
        
        // Dejar una línea de separación antes de la tabla
        $pdf->Ln(10); // Espacio entre el título y la tabla

        // Establecer fuente para los encabezados de las celdas
        $pdf->SetFont('Arial', 'B', 10);

        // Agregar el encabezado de la tabla
        $pdf->Cell(20, 10, 'CODIGO', 1, 0, 'C');
        $pdf->Cell(40, 10, 'CLIENTE', 1, 0, 'C');
        //$pdf->Cell(40, 10, 'VENDEDOR', 1, 0, 'C');
        $pdf->Cell(30, 10, 'CANTIDAD', 1, 0, 'C');
        $pdf->Cell(95, 10, 'PRODUCTOS', 1, 0, 'C');
        //$pdf->Cell(30, 10, 'IMPUESTO', 1, 0, 'C');
        //$pdf->Cell(30, 10, 'NETO', 1, 0, 'C');
        $pdf->Cell(30, 10, 'TOTAL', 1, 0, 'C');
        $pdf->Cell(30, 10, 'PAGO', 1, 0, 'C');
        $pdf->Cell(30, 10, 'FECHA', 1, 1, 'C'); // Salto de línea

        // Establecer el formato para las filas
        $pdf->SetFont('Arial', '', 8);

        // Variable para la suma total
        $totalGeneral = 0;

        foreach ($ventas as $row => $item){

            $cliente = ControladorClientes::ctrMostrarClientes("id", $item["id_cliente"]);
            $vendedor = ControladorUsuarios::ctrMostrarUsuarios("id", $item["id_vendedor"]);

            // Imprimir los datos de cada venta
            $pdf->Cell(20, 10, $item["codigo"], 1, 0, 'C');
            $pdf->Cell(40, 10, $cliente["nombre"], 1, 0, 'C');
            //$pdf->Cell(40, 10, $vendedor["nombre"], 1, 0, 'C');

            // Productos (en caso de haber más de uno, los concatenamos)
            $productos = json_decode($item["productos"], true);
            $cantidad = '';
            $descripcion = '';
            foreach ($productos as $key => $valueProductos) {
                $cantidad .= $valueProductos["cantidad"]."\n";
                $descripcion .= $valueProductos["descripcion"]."\n";
            }

            $pdf->Cell(30, 10,$cantidad, 1, 0, 'C');
            $pdf->Cell(95, 10, $descripcion, 1, 0, 'C');
            //$pdf->Cell(30, 10, "$ ".number_format($item["impuesto"], 2), 1, 0, 'C');
            //$pdf->Cell(30, 10, "$ ".number_format($item["neto"], 2), 1, 0, 'C');
            $pdf->Cell(30, 10, "Bs. ".number_format($item["total"], 2), 1, 0, 'C');
            $pdf->Cell(30, 10, $item["metodo_pago"], 1, 0, 'C');
            $pdf->Cell(30, 10, substr($item["fecha"], 0, 10), 1, 1, 'C');

            // Acumular el total
            $totalGeneral += $item["total"];
        }

        // Agregar el "TOTAL GENERAL" justo debajo de la columna "TOTAL"
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->Cell(185, 10, 'TOTAL GENERAL', 1, 0, 'R'); // Alineado a la derecha
        $pdf->Cell(90, 10, "Bs. ".number_format($totalGeneral, 2), 1, 1, 'C'); // Total en la misma columna

        // Enviar el archivo PDF al navegador para descargar
        $pdf->Output('D', $Name); // 'D' indica que el archivo se descargará
    }
}








	/*=============================================
	SUMA TOTAL VENTAS
	=============================================*/

	public static function ctrSumaTotalVentas(){

		$tabla = "ventas";

		$respuesta = ModeloVentas::mdlSumaTotalVentas($tabla);

		return $respuesta;

	}

	/*=============================================
	DESCARGAR XML
	=============================================*/

	static public function ctrDescargarXML(){

		if(isset($_GET["xml"])){


			$tabla = "ventas";
			$item = "codigo";
			$valor = $_GET["xml"];

			$ventas = ModeloVentas::mdlMostrarVentas($tabla, $item, $valor);

			// PRODUCTOS

			$listaProductos = json_decode($ventas["productos"], true);

			// CLIENTE

			$tablaClientes = "clientes";
			$item = "id";
			$valor = $ventas["id_cliente"];

			$traerCliente = ModeloClientes::mdlMostrarClientes($tablaClientes, $item, $valor);

			// VENDEDOR

			$tablaVendedor = "usuarios";
			$item = "id";
			$valor = $ventas["id_vendedor"];

			$traerVendedor = ModeloUsuarios::mdlMostrarUsuarios($tablaVendedor, $item, $valor);

			//http://php.net/manual/es/book.xmlwriter.php

			$objetoXML = new XMLWriter();

			$objetoXML->openURI($_GET["xml"].".xml"); //Creación del archivo XML

			$objetoXML->setIndent(true); //recibe un valor booleano para establecer si los distintos niveles de nodos XML deben quedar indentados o no.

			$objetoXML->setIndentString("\t"); // carácter \t, que corresponde a una tabulación

			$objetoXML->startDocument('1.0', 'utf-8');// Inicio del documento
			
			// $objetoXML->startElement("etiquetaPrincipal");// Inicio del nodo raíz

			// $objetoXML->writeAttribute("atributoEtiquetaPPal", "valor atributo etiqueta PPal"); // Atributo etiqueta principal

			// 	$objetoXML->startElement("etiquetaInterna");// Inicio del nodo hijo

			// 		$objetoXML->writeAttribute("atributoEtiquetaInterna", "valor atributo etiqueta Interna"); // Atributo etiqueta interna

			// 		$objetoXML->text("Texto interno");// Inicio del nodo hijo
			
			// 	$objetoXML->endElement(); // Final del nodo hijo
			
			// $objetoXML->endElement(); // Final del nodo raíz


			$objetoXML->writeRaw('<fe:Invoice xmlns:fe="http://www.dian.gov.co/contratos/facturaelectronica/v1" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:clm54217="urn:un:unece:uncefact:codelist:specification:54217:2001" xmlns:clm66411="urn:un:unece:uncefact:codelist:specification:66411:2001" xmlns:clmIANAMIMEMediaType="urn:un:unece:uncefact:codelist:specification:IANAMIMEMediaType:2003" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:sts="http://www.dian.gov.co/contratos/facturaelectronica/v1/Structures" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dian.gov.co/contratos/facturaelectronica/v1 ../xsd/DIAN_UBL.xsd urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2 ../../ubl2/common/UnqualifiedDataTypeSchemaModule-2.0.xsd urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2 ../../ubl2/common/UBL-QualifiedDatatypes-2.0.xsd">');

			$objetoXML->writeRaw('<ext:UBLExtensions>');

			foreach ($listaProductos as $key => $value) {
				
				$objetoXML->text($value["descripcion"].", ");
			
			}

			

			$objetoXML->writeRaw('</ext:UBLExtensions>');

			$objetoXML->writeRaw('</fe:Invoice>');

			$objetoXML->endDocument(); // Final del documento

			return true;	
		}

	}
        
    /*=============================================
    SECCION DE REPORTES MENSUAL POR AÑO
    =============================================*/
        
        static public function ctrMostrarReporteMensual($anio) {

            $tabla = "transacciones";

            $respuesta = ModeloTransacciones::mdlReporteMensualPorAnio($tabla, $anio);

            return $respuesta;
        }
    
        static public function ctrResumenFinancieroAnual($anio) {

        $tabla = "transacciones";
        return ModeloTransacciones::mdlResumenFinancieroAnual($tabla, $anio);
    }

    //Limbert
    // Controlador para generar reporte de ventas por recibo
    public function ctrDescargarReporteVentasPorRecibo($fechaInicial = null, $fechaFinal = null) {
        // Crear instancia de FPDF
        $pdf = new FPDF('P', 'mm', 'A4');
        $pdf->AddPage();

        // Título con fondo azul
        $pdf->SetFillColor(0, 123, 255);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->SetFont('Arial', 'B', 16);
        $pdf->Cell(0, 10, 'Reporte de Ventas General', 0, 1, 'C', true);
        $pdf->Ln(4);

        // Mostrar fecha y hora de generación + empresa (nombre ficticio, ajusta si tienes variable)
        $pdf->SetTextColor(0, 0, 0);
        $pdf->SetFont('Arial', '', 10);
        $pdf->Cell(0, 8, "Santeria Urkupina", 0, 1, 'C');
        $pdf->Cell(0, 8, "Generado el " . date("d/m/Y H:i:s") . " ", 0, 1, 'C');
        $pdf->Ln(2);

        // Mostrar rango de fechas si corresponde
        if ($fechaInicial && $fechaFinal) {
            $pdf->SetFont('Arial', 'B', 10);
            $pdf->Cell(0, 8, 'Desde: ' . $fechaInicial . '  Hasta: ' . $fechaFinal, 0, 1, 'C');
            $pdf->Ln(4);
        }

        // Encabezado de tabla
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetFillColor(230, 230, 230); // gris claro
        $pdf->SetTextColor(0, 0, 0);
        $pdf->Cell(25, 8, 'Factura', 1, 0, 'C', 1);
        $pdf->Cell(30, 8, 'Fecha', 1, 0, 'C', 1);
        $pdf->Cell(45, 8, 'Cliente', 1, 0, 'C', 1);
        $pdf->Cell(45, 8, 'Vendedor', 1, 0, 'C', 1);
        $pdf->Cell(35, 8, 'Total', 1, 1, 'C', 1);

        // Obtener datos
        $ventas = ModeloVentas::mdlMostrarVentas('ventas', null, null, $fechaInicial, $fechaFinal);
        $totalVentas = 0;

        // Contenido
        $pdf->SetFont('Arial', '', 10);
        foreach ($ventas as $venta) {
            $cliente = ModeloClientes::mdlMostrarClientes("clientes", "id", $venta['id_cliente']);
            $vendedor = ModeloUsuarios::mdlMostrarUsuarios("usuarios", "id", $venta['id_vendedor']);
            $fechaFormateada = date("d/m/Y", strtotime($venta['fecha']));

            $pdf->Cell(25, 8, $venta['codigo'], 1, 0, 'C');
            $pdf->Cell(30, 8, $fechaFormateada, 1, 0, 'C');
            $pdf->Cell(45, 8, $cliente['nombre'], 1, 0, 'L');
            $pdf->Cell(45, 8, $vendedor['nombre'], 1, 0, 'L');
            $pdf->Cell(35, 8, 'Bs ' . number_format($venta['total'], 2), 1, 1, 'R');

            $totalVentas += $venta['total'];
        }

        // Total
        $pdf->Ln(4);
        $pdf->SetFont('Arial', 'B', 12);
        $pdf->SetFillColor(200, 200, 200); // gris
        $pdf->Cell(145, 8, 'Total de Ventas', 1, 0, 'R', 1);
        $pdf->Cell(35, 8, 'Bs ' . number_format($totalVentas, 2), 1, 1, 'R', 1);

        // Salida PDF
        header('Content-Type: application/pdf');
        header('Content-Disposition: inline; filename="Reporte_Ventas_Por_Recibo.pdf"');
        $pdf->Output('I', 'Reporte_Ventas_Por_Recibo.pdf');

    }

    
        // Controlador para generar reporte de productos agrupados
        public function ctrDescargarReporteProductosAgrupados($fechaInicial = null, $fechaFinal = null) {
        $pdf = new FPDF('P', 'mm', 'A4');
        $pdf->AddPage();

        // Título en recuadro azul
        $pdf->SetFillColor(0, 123, 255);
        $pdf->SetTextColor(255, 255, 255);
        $pdf->SetFont('Arial', 'B', 14);
        $pdf->Cell(0, 10, 'Reporte de Productos Agrupados por Venta', 0, 1, 'C', true);
        $pdf->Ln(2);

        // Empresa y fecha de creación
        $pdf->SetTextColor(0, 0, 0);
        $pdf->SetFont('Arial', '', 10);
        $pdf->Cell(0, 6, 'Empresa: Santeria Urkupina', 0, 1, 'C');
        $pdf->Cell(0, 6, 'Fecha de generacion: ' . date('d/m/Y'), 0, 1, 'C');

        if ($fechaInicial && $fechaFinal) {
            $pdf->Cell(0, 6, 'Rango de fechas: ' . $fechaInicial . ' hasta ' . $fechaFinal, 0, 1, 'C');
        }
        $pdf->Ln(3);

        // Encabezado de la tabla
        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetFillColor(200, 200, 200);
        $pdf->Cell(20, 8, 'ID', 1, 0, 'C', true);
        $pdf->Cell(70, 8, 'Producto', 1, 0, 'C', true);
        $pdf->Cell(25, 8, 'Cantidad', 1, 0, 'C', true);
        $pdf->Cell(35, 8, 'Precio Unit.', 1, 0, 'C', true);
        $pdf->Cell(40, 8, 'Total Producto', 1, 1, 'C', true);

        $productos = ModeloVentas::mdlMostrarProductosAgrupados('ventas', $fechaInicial, $fechaFinal);
        $pdf->SetFont('Arial', '', 10);

        $totalProductos = 0;

        foreach ($productos as $productoId => $producto) {
            $pdf->Cell(20, 8, $productoId, 1, 0, 'C');
            $pdf->Cell(70, 8, $producto['descripcion'], 1, 0, 'L');
            $pdf->Cell(25, 8, $producto['cantidad'], 1, 0, 'C');
            $pdf->Cell(35, 8, 'Bs ' . number_format($producto['precio'], 2), 1, 0, 'R');
            $pdf->Cell(40, 8, 'Bs ' . number_format($producto['total'], 2), 1, 1, 'R');

            $totalProductos += $producto['total'];
        }

        // Total general
        $pdf->SetFont('Arial', 'B', 11);
        $pdf->SetFillColor(200, 200, 200);
        $pdf->Cell(150, 8, 'Total de Productos', 1, 0, 'R', true);
        $pdf->Cell(40, 8, 'Bs ' . number_format($totalProductos, 2), 1, 1, 'R', true);

        $pdf->Output('I', 'Reporte_Productos_Agrupados.pdf');
    }




}