<?php

require_once "conexion.php";

class ModeloVentas{

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

	static public function mdlMostrarVentas($tabla, $item, $valor){

		if($item != null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item ORDER BY id ASC");

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_INT);

			$stmt -> execute();

			return $stmt -> fetch();

		}else{
			

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

	static public function mdlMostrarDetalleVentas($tabla, $item, $valor){

		if($item != null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item ORDER BY id ASC");

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{
			

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

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

	static public function mdlMostrarVentasCliente($tabla, $item, $valor){

		if($item != null){

			$stmt = Conexion::conectar()->prepare("SELECT v.codigo_externo, c.ruc_dni, c.razon_social, e.nombre, v.metodo_pago, v.total, v.fecha FROM ventas v INNER JOIN clientes c ON v.id_cliente = c.id INNER JOIN usuario u ON v.id_vendedor = u.id INNER JOIN empleado e ON u.id_empleado= e.id WHERE v.id_cliente=53 and v.estado = 0;");

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{
			

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

	/*=============================================
	MOSTRAR UTILIDAD
	=============================================*/

	static public function mdlMostrarUtilidad($tabla, $item, $valor){

		if($item != null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item ORDER BY id ASC");

			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_STR);

			$stmt -> execute();

			return $stmt -> fetch();

		}else{
			

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

	/*=============================================
		 nuevo
	=============================================*/

	static public function mdlVentasCorrectas($tabla, $fechaInicial, $fechaFinal){

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT v.fecha as Mes1, SUM(v.total) as Total FROM $tabla v WHERE YEAR(v.fecha) = '2024' AND v.fecha like '%$fechaActual%' GROUP BY Mes1 ORDER BY Mes1 DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT v.fecha as Mes1, SUM(v.total) as Total FROM $tabla v WHERE YEAR(v.fecha) = '2024' AND v.fecha like '%$fechaFinal%' GROUP BY Mes1 ORDER BY Mes1 DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT v.fecha as Mes1, SUM(v.total) as Total FROM $tabla v WHERE YEAR(v.fecha) = '2024' AND (v.fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') GROUP BY Mes1 ORDER BY Mes1 DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT v.fecha as Mes1, SUM(v.total) as Total FROM $tabla v WHERE YEAR(v.fecha) = '2024' AND (v.fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') GROUP BY Mes1 ORDER BY Mes1 DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}



	/*=============================================
	REGISTRO DE VENTA
	=============================================*/

	static public function mdlIngresarVenta($tabla, $datos, $listaProductos){

	try {

		$pdo = Conexion::conectar();
		$pdo->beginTransaction();

		$sql =  Conexion::conectar()->prepare("SELECT codigo FROM $tabla ORDER BY id DESC LIMIT 1");
		$sql -> execute();
		$resultado= $sql -> fetch();
		$codigo =$resultado ? $resultado['codigo'] + 1 : 10001;


		$stmt=$pdo->prepare("INSERT INTO $tabla(codigo, id_cliente, id_vendedor, impuesto, neto, total, estado, fecha, sucursal_id) VALUES (:codigo, :id_cliente, :id_vendedor, :impuesto, :neto, :total, :estado, :fecha, :sucursal_id)");

		 $stmt->execute([
            ":codigo" => $codigo,
            ":id_cliente" => $datos["id_cliente"],
            ":id_vendedor" => $datos["id_vendedor"],
            ":impuesto" => $datos["impuesto"],
            ":neto" => $datos["neto"],
            ":total" => $datos["total"],
            ":estado" => $datos["estado"],
            ":fecha" => $datos["fecha"],
			":sucursal_id" => $datos["sucursal_id"]
  
        ]);

		

		$idVenta = $pdo->lastInsertId();

		// Insertar detalle de venta y movimientos
        foreach ($listaProductos as $producto) {
            // Insertar detalle
            $stmtDetalle = $pdo->prepare("INSERT INTO detalle_ventas (
                venta_id, producto_id, cantidad, precio_unitario
            ) VALUES (
                :venta_id, :producto_id, :cantidad, :precio_unitario
            )");

            $stmtDetalle->execute([
                ":venta_id" => $idVenta,
                ":producto_id" => $producto["id"],
                ":cantidad" => $producto["cantidad"],
                ":precio_unitario" => $producto["precio"]
            ]);

            // Insertar movimiento de salida
            $stmtMov = $pdo->prepare("INSERT INTO inventario_movimientos (
                producto_id, sucursal_id, tipo, cantidad, referencia
            ) VALUES (
                :producto_id, :sucursal_id, 'salida', :cantidad, :referencia
            )");

            $stmtMov->execute([
                ":producto_id" => $producto["id"],
                ":sucursal_id" => $datos["sucursal_id"],
                ":cantidad" => $producto["cantidad"],
                ":referencia" => "Venta #$codigo"
            ]);
        }

        $pdo->commit();
        return "ok";

    } catch (Exception $e) {
        $pdo->rollBack();
        return "error: " . $e->getMessage();
    }


	}


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

	static public function mdlEditarVenta($tabla, $datos, $listaProductos){
		try {
        $pdo = Conexion::conectar();
        $pdo->beginTransaction();

        // 1. Obtener venta actual
        $stmtVenta = $pdo->prepare("SELECT id, id_cliente, total FROM $tabla WHERE codigo = :codigo");
        $stmtVenta->execute([":codigo" => $datos["codigo"]]);
        $ventaActual = $stmtVenta->fetch();
        $venta_id = $ventaActual["id"];
    

        // 2. Revertir acumuladores anteriores
        $stmtDetalle = $pdo->prepare("SELECT producto_id, cantidad FROM detalle_ventas WHERE venta_id = ?");
        $stmtDetalle->execute([$venta_id]);
        $detalleAnterior = $stmtDetalle->fetchAll();

        foreach ($detalleAnterior as $producto) {
            // Revertir stock
            $pdo->prepare("UPDATE stock_sucursal
                SET stock_fisico = stock_fisico + :cantidad
                WHERE producto_id = :producto_id AND sucursal_id = :sucursal_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["producto_id"],
                ":sucursal_id" => $datos["sucursal_id"]
            ]);

            // Revertir ventas
            $pdo->prepare("UPDATE productos
                SET ventas = ventas - :cantidad
                WHERE id = :producto_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["producto_id"]
            ]);
        }


        // 3. Actualizar venta principal
        $stmt = $pdo->prepare("UPDATE $tabla SET
            id_cliente = :id_cliente,
            id_vendedor = :id_vendedor,
            impuesto = :impuesto,
            neto = :neto,
            total = :total,
            fecha = :fecha
        WHERE codigo = :codigo");

        $stmt->execute([
            ":id_cliente" => $datos["id_cliente"],
            ":id_vendedor" => $datos["id_vendedor"],
            ":impuesto" => $datos["impuesto"],
            ":neto" => $datos["neto"],
            ":total" => $datos["total"],
            ":fecha" => $datos["fecha"],
            ":codigo" => $datos["codigo"]
        ]);

        // 4. Eliminar detalle y movimientos anteriores
        $pdo->prepare("DELETE FROM detalle_ventas WHERE venta_id = ?")->execute([$venta_id]);
        $pdo->prepare("DELETE FROM inventario_movimientos WHERE referencia = ?")->execute(["Venta #" . $datos["codigo"]]);

        // 5. Insertar nuevos detalles y movimientos
        foreach ($listaProductos as $producto) {
            // Insertar detalle
            $pdo->prepare("INSERT INTO detalle_ventas (
                venta_id, producto_id, cantidad, precio_unitario
            ) VALUES (?, ?, ?, ?)")->execute([
                $venta_id,
                $producto["id"],
                $producto["cantidad"],
                $producto["precio"]
            ]);

            // Insertar movimiento
            $pdo->prepare("INSERT INTO inventario_movimientos (
                producto_id, sucursal_id, tipo, cantidad, referencia
            ) VALUES (?, ?, 'salida', ?, ?)")->execute([
                $producto["id"],
                $datos["sucursal_id"],
                $producto["cantidad"],
                "Venta #" . $datos["codigo"]
            ]);

            // Actualizar stock
            $pdo->prepare("UPDATE stock_sucursal
                SET stock_fisico = stock_fisico - :cantidad
                WHERE producto_id = :producto_id AND sucursal_id = :sucursal_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["id"],
                ":sucursal_id" => $datos["sucursal_id"]
            ]);

            // Actualizar ventas
            $pdo->prepare("UPDATE productos
                SET ventas = ventas + :cantidad
                WHERE id = :producto_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["id"]
            ]);
        }

        $pdo->commit();
        return "ok";

    } catch (Exception $e) {
        $pdo->rollBack();
        return "error: " . $e->getMessage();
    }

	

	}

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

	static public function mdlEliminarVenta($venta_id, $codigo, $sucursal_id){

		 try {
        $pdo = Conexion::conectar();
        $pdo->beginTransaction();

        // Obtener venta
        $stmtVenta = $pdo->prepare("SELECT id_cliente, total FROM ventas WHERE id = ?");
        $stmtVenta->execute([$venta_id]);
        $venta = $stmtVenta->fetch();

        // Obtener detalle
        $stmtDetalle = $pdo->prepare("SELECT producto_id, cantidad FROM detalle_ventas WHERE venta_id = ?");
        $stmtDetalle->execute([$venta_id]);
        $productos = $stmtDetalle->fetchAll();

        foreach ($productos as $producto) {
            // Revertir stock
            $pdo->prepare("UPDATE stock_sucursal
                SET stock_fisico = stock_fisico + :cantidad
                WHERE producto_id = :producto_id AND sucursal_id = :sucursal_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["producto_id"],
                ":sucursal_id" => $sucursal_id
            ]);

            // Revertir ventas
            $pdo->prepare("UPDATE productos
                SET ventas = ventas - :cantidad
                WHERE id = :producto_id")->execute([
                ":cantidad" => $producto["cantidad"],
                ":producto_id" => $producto["producto_id"]
            ]);
        }

        // Revertir compras del cliente
        $pdo->prepare("UPDATE clientes
            SET total_compras = total_compras - :monto
            WHERE id = :cliente_id")->execute([
            ":monto" => $venta["total"],
            ":cliente_id" => $venta["id_cliente"]
        ]);

        // Eliminar registros
		$pdo->prepare("UPDATE ventas SET estado = 1 WHERE id = ?")->execute([$venta_id]);

        $pdo->prepare("DELETE FROM inventario_movimientos WHERE referencia = ?")->execute(["Venta #$codigo"]);
        $pdo->prepare("DELETE FROM utilidad WHERE codigo_venta = ?")->execute([$codigo]);

        $pdo->commit();
        return "ok";

    } catch (Exception $e) {
        $pdo->rollBack();
        return "error: " . $e->getMessage();
    }


	}


	  /*=============================================
	Eliminar utilidad
	=============================================*/

	static public function mdlEliminarUtilidad($tabla, $datos){

		$stmt = Conexion::conectar()->prepare("DELETE FROM $tabla WHERE codigo_venta = :codigo_venta");

		$stmt -> bindParam(":codigo_venta", $datos, PDO::PARAM_INT);

		if($stmt -> execute()){

			return "ok";
		
		}else{

			return "error";	

		}

		$stmt -> close();

		$stmt = null;

	}

	/*=============================================
	RANGO FECHAS PARA EL ADMINISTRADOR PARA EL LISTADO DE LAS VENTAS
	=============================================*/	

	static public function mdlRangoFechasVentas($tabla, $fechaInicial, $fechaFinal){
		
		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha like '%$fechaActual%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	static public function mdlRangoFechasTasaPedidos($tabla, $fechaInicial, $fechaFinal){
		
		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m');


		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT v.fecha as Mes, sum(case when v.estado = 0 then 1 else 0 end) correcto, COUNT(v.id) as total FROM $tabla v WHERE v.fecha like '%$fechaActual%' GROUP BY Mes ORDER BY Mes ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT  v.fecha as Mes, sum(case when v.estado = 0 then 1 else 0 end) correcto, COUNT(v.id) as total FROM $tabla v WHERE v.fecha like '%$fechaFinal%' GROUP BY Mes ORDER BY Mes ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT  v.fecha as Mes, sum(case when v.estado = 0 then 1 else 0 end) correcto, COUNT(v.id) as total FROM $tabla v WHERE v.fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' GROUP BY Mes ORDER BY Mes ASC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT  v.fecha as Mes, sum(case when v.estado = 0 then 1 else 0 end) correcto, COUNT(v.id) as total FROM $tabla v WHERE v.fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' GROUP BY Mes ORDER BY Mes ASC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}


	/*=============================================
	RANGO FECHAS PARA EL ADMINISTRADOR PARA EL LISTADO DE LAS VENTAS con su utilidad mensual
	=============================================*/	

	static public function mdlRangoFechasUtilidad($tabla, $fechaInicial, $fechaFinal){
		
		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m');
		if($fechaInicial == null && $fechaFinal == null){
			$stmt = Conexion::conectar()->prepare("SELECT v.codigo, v.id_vendedor, v.id_cliente, v.fecha, v.total, u.utilidad FROM $tabla v INNER JOIN utilidad u ON v.codigo = u.codigo_venta WHERE v.fecha LIKE '%$fechaActual%' ORDER BY v.id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	

		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT  v.codigo, v.id_vendedor, v.id_cliente, v.fecha, v.total, u.utilidad FROM $tabla v INNER JOIN utilidad u ON v.codigo = u.codigo_venta WHERE v.fecha LIKE '%$fechaFinal%' ORDER BY v.id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();
		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT v.codigo, v.id_vendedor, v.id_cliente, v.fecha, v.total, u.utilidad FROM $tabla v INNER JOIN utilidad u ON v.codigo = u.codigo_venta WHERE v.fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY v.id DESC");
			}else{

				$stmt = Conexion::conectar()->prepare("SELECT  v.codigo, v.id_vendedor, v.id_cliente, v.fecha, v.total, u.utilidad FROM $tabla v INNER JOIN utilidad u ON v.codigo = u.codigo_venta WHERE v.fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY v.id DESC");

			}
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	/*=============================================
	RANGO FECHAS PARA EL ADMINISTRADOR PARA EL REPORTE DE VENTAS GLOBALES
	=============================================*/	

	static public function mdlRangoFechasVentas3($tabla, $fechaInicial, $fechaFinal){
		

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE metodo_pago <> 'ANULADO' ORDER BY  id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE metodo_pago <> 'ANULADO' AND fecha like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE metodo_pago <> 'ANULADO' AND ( fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE metodo_pago <> 'ANULADO' AND ( fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	static public function mdlRangoFechasUtilidadMes($tabla, $fechaInicial, $fechaFinal){
		

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT v.*, u.utilidad FROM $tabla v INNER JOIN utilidad u on v.codigo = u.codigo_venta WHERE metodo_pago <> 'ANULADO' ORDER BY  id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT v.* , u.utilidad FROM $tabla v INNER JOIN utilidad u on v.codigo = u.codigo_venta WHERE metodo_pago <> 'ANULADO' AND fecha like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT v.*, u.utilidad FROM $tabla v INNER JOIN utilidad u on v.codigo = u.codigo_venta WHERE metodo_pago <> 'ANULADO' AND ( fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT v.*, u.utilidad FROM $tabla v INNER JOIN utilidad u on v.codigo = u.codigo_venta WHERE metodo_pago <> 'ANULADO' AND ( fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	/*=============================================
	RANGO FECHAS PARA EL ADMINISTRADOR PARA EL REPORTE DE VENTAS GLOBALES
	=============================================*/	

	static public function mdlRangoFechasVentas5($tabla, $fechaInicial, $fechaFinal){
		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE estado <> 1 AND fecha like '%$fechaActual%' ORDER BY  id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE estado <> 1 AND fecha like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE estado <> 1 AND ( fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE estado <> 1 AND ( fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	/*=============================================
	RANGO FECHAS PARA EL ADMINISTRADOR PARA LAS CAJA DE VENTAS DE HOY
	=============================================*/	

	static public function mdlRangoFechasVentas2($tabla, $fechaInicial, $fechaFinal){

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m-d');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha like '%$fechaActual%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha like '%$fechaFinal%' ORDER BY id DESC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	/*=============================================
	RANGO FECHAS PARA EL VENDEDOR AUN NO SE USA ESTA FUNCION
	=============================================*/	

	static public function mdlRangoFechasVentas1($tabla, $fechaInicial, $fechaFinal, $item , $valor){

		if($fechaInicial == null  && $item != null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item ORDER BY id DESC");
			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_INT);

			$stmt -> execute();

			return $stmt -> fetchAll();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE fecha like '%$fechaFinal%' AND $item = :$item ORDER BY id DESC");
			$stmt -> bindParam(":".$item, $valor, PDO::PARAM_INT);

			$stmt -> execute();

			return $stmt -> fetchAll();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");
				$stmt -> bindParam(":".$item, $valor, PDO::PARAM_INT);

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");
				$stmt -> bindParam(":".$item, $valor, PDO::PARAM_INT);

			}
		
			$stmt -> execute();

			return $stmt -> fetchAll();

		}

	}

	/*=============================================
	CONSULTAR VENTAS PENDIENTES
	=============================================*/	

	static public function mdlConsultarVentas($tabla){

		$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE metodo_pago = 'PENDIENTE' AND estado=0");

		$stmt -> execute();

		return $stmt -> fetchAll();	

		$stmt -> close();

		$stmt = null;

	}

	static public function mdlConsultarDetalleVentas($tabla, $venta_id){

		$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE venta_id = ?");

		$stmt -> execute([$venta_id]);

		return $stmt -> fetchAll();	

		$stmt -> close();

		$stmt = null;

	}


	/*=============================================
	SUMAR EL TOTAL DE VENTAS
	=============================================*/

	static public function mdlSumaTotalVentas($tabla, $fechaInicial, $fechaFinal){	

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m-d');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla WHERE estado <> 1 AND fecha like '%$fechaActual%'");

			$stmt -> execute();

			return $stmt -> fetch();	


		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla WHERE estado <> 1 AND fecha like '%$fechaFinal%'");

			$stmt -> execute();

			return $stmt -> fetch();

		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla WHERE estado <> 1 AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}else{


				$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla WHERE estado <> 1 AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ORDER BY id DESC");

			}
		
			$stmt -> execute();

			return $stmt -> fetch();

		}

	}

	/*=============================================
	SUMAR EL TOTAL DE VENTAS PENDIENTES
	=============================================*/

	static public function mdlSumaTotalVentasPendientes($tabla){	

		$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla WHERE metodo_pago='PENDIENTE'");

		$stmt -> execute();

		return $stmt -> fetch();

		$stmt -> close();

		$stmt = null;

	}

	/*=============================================
	SUMAR EL TOTAL DE VENTAS COBRADAS AL CONTADO HOY
	=============================================*/

	static public function mdlSumaTotalIngresosDiario($tabla,$fechaInicial, $fechaFinal){	

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m-d');

		if($fechaInicial == null && $fechaFinal == null){

		$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='EFECTIVO' AND fecha LIKE '%$fechaActual%'");

		$stmt -> execute();

		return $stmt -> fetch();

		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='EFECTIVO' AND fecha LIKE '%$fechaFinal%'");

			$stmt -> execute();

			return $stmt -> fetch();
		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='EFECTIVO' AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ");
				
			}else{


				$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='EFECTIVO' AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno')");
				
			}
		
			$stmt -> execute();

			return $stmt -> fetch();

		}			
	}

		/*=============================================
	SUMAR EL TOTAL DE VENTAS COBRADAS AL CONTADO HOY
	=============================================*/

	static public function mdlSumaTotalIngresostarjetaDebito($tabla,$fechaInicial, $fechaFinal){	

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m-d');

		if($fechaInicial == null && $fechaFinal == null){

		$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='TARJETA DEBITO' AND fecha LIKE '%$fechaActual%'");

		$stmt -> execute();

		return $stmt -> fetch();

		}else if($fechaInicial == $fechaFinal){

			$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='TARJETA DEBITO' AND fecha LIKE '%$fechaFinal%'");

			$stmt -> execute();

			return $stmt -> fetch();
		}else{

			$fechaActual = new DateTime();
			$fechaActual ->add(new DateInterval("P1D"));
			$fechaActualMasUno = $fechaActual->format("Y-m-d");

			$fechaFinal2 = new DateTime($fechaFinal);
			$fechaFinal2 ->add(new DateInterval("P1D"));
			$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");

			if($fechaFinalMasUno == $fechaActualMasUno){

				$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='TARJETA DEBITO' AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno') ");
				
			}else{


				$stmt = Conexion::conectar()->prepare("SELECT SUM(total) as total FROM $tabla v INNER JOIN pagos p ON v.codigo = p.codigo_venta WHERE p.forma_pago='TARJETA DEBITO' AND (fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno')");
				
			}
		
			$stmt -> execute();

			return $stmt -> fetch();

		}			
	}
	/*=============================================
	SUMAR EL TOTAL DE VENTAS COBRADAS DE HOY
	=============================================*/

	static public function mdlSumaTotalCreditosCobrados($tabla,$fechaInicial, $fechaFinal){	

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m-d');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT SUM(total_pagado) as total FROM $tabla WHERE fecha_pago like '%$fechaActual%'");
	
			$stmt -> execute();
	
			return $stmt -> fetch();
	
			}else if($fechaInicial == $fechaFinal){
	
				$stmt = Conexion::conectar()->prepare("SELECT SUM(total_pagado) as total FROM $tabla WHERE fecha_pago like '%$fechaFinal%'");
	
				$stmt -> execute();
	
				return $stmt -> fetch();
			}else{
	
				$fechaActual = new DateTime();
				$fechaActual ->add(new DateInterval("P1D"));
				$fechaActualMasUno = $fechaActual->format("Y-m-d");
	
				$fechaFinal2 = new DateTime($fechaFinal);
				$fechaFinal2 ->add(new DateInterval("P1D"));
				$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");
	
				if($fechaFinalMasUno == $fechaActualMasUno){
	
					$stmt = Conexion::conectar()->prepare("SELECT SUM(total_pagado) as total FROM $tabla WHERE fecha_pago BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ");
					
				}else{
	
	
					$stmt = Conexion::conectar()->prepare("SELECT SUM(total_pagado) as total FROM $tabla WHERE fecha_pago BETWEEN '$fechaInicial' AND '$fechaFinalMasUno'");
					
				}
			
				$stmt -> execute();
	
				return $stmt -> fetch();
	
			}	

	}

	/*=============================================
	SUMAR EL TOTAL DE UTILIDADES POR FECHA
	=============================================*/

	static public function mdlSumaTotalUtilidades($tabla,$fechaInicial, $fechaFinal){	

		date_default_timezone_set("America/Lima");
        $fechaActual = date('Y-m-d');

		if($fechaInicial == null && $fechaFinal == null){

			$stmt = Conexion::conectar()->prepare("SELECT SUM(utilidad) as utilidad FROM $tabla WHERE fecha like '%$fechaActual%'");
	
			$stmt -> execute();
	
			return $stmt -> fetch();
	
			}else if($fechaInicial == $fechaFinal){
	
				$stmt = Conexion::conectar()->prepare("SELECT SUM(utilidad) as utilidad FROM $tabla WHERE fecha like '%$fechaFinal%'");
	
				$stmt -> execute();
	
				return $stmt -> fetch();
			}else{
	
				$fechaActual = new DateTime();
				$fechaActual ->add(new DateInterval("P1D"));
				$fechaActualMasUno = $fechaActual->format("Y-m-d");
	
				$fechaFinal2 = new DateTime($fechaFinal);
				$fechaFinal2 ->add(new DateInterval("P1D"));
				$fechaFinalMasUno = $fechaFinal2->format("Y-m-d");
	
				if($fechaFinalMasUno == $fechaActualMasUno){
	
					$stmt = Conexion::conectar()->prepare("SELECT SUM(utilidad) as utilidad FROM $tabla WHERE fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno' ");
					
				}else{
	
	
					$stmt = Conexion::conectar()->prepare("SELECT SUM(utilidad) as utilidad FROM $tabla WHERE fecha BETWEEN '$fechaInicial' AND '$fechaFinalMasUno'");
					
				}
			
				$stmt -> execute();
	
				return $stmt -> fetch();
	
			}	

	}

	/*=============================================
	REGISTRO DE CREDITO
	=============================================*/

	static public function mdlIngresarCredito($tabla, $datos){

		$stmt = Conexion::conectar()->prepare("INSERT INTO $tabla(id_venta, total_pagado, id_usuario, metodo_pago) VALUES (:id_venta, :total_pagado, :id_usuario, :metodo_pago)");

		$stmt->bindParam(":id_venta", $datos["id_venta"], PDO::PARAM_INT);
		$stmt->bindParam(":total_pagado", $datos["total_pagado"], PDO::PARAM_STR);
		$stmt->bindParam(":id_usuario", $datos["id_usuario"], PDO::PARAM_INT);
		$stmt->bindParam(":metodo_pago", $datos["metodo_pago"], PDO::PARAM_STR);
		
		if($stmt->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$stmt->close();
		$stmt = null;

	}

	/*=============================================
	EDITAR VENTA DEL VENDEDOR
	=============================================*/

	static public function mdlEditarVenta1($tabla, $item, $item2, $item3, $item4, $item5, $valor1, $valor2, $valor3, $valor4, $valor5, $valor6){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET $item = :$item, $item2 = :$item2, $item3 = :$item3, $item4 = :$item4, $item5 = :$item5 WHERE codigo = :codigo");

		$stmt -> bindParam(":".$item, $valor1, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item2, $valor3, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item3, $valor4, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item4, $valor5, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item5, $valor6, PDO::PARAM_STR);
		$stmt -> bindParam(":codigo", $valor2, PDO::PARAM_STR);

		if($stmt->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$stmt->close();
		$stmt = null;

	}

	/*=============================================
	EDITAR VENTA DEL VENDEDOR PERO CONTADO
	=============================================*/

	static public function mdlEditarVenta2($tabla, $item, $item2, $item3, $item4, $valor1, $valor2, $valor3, $valor4, $valor5){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET $item = :$item, $item2 = :$item2, $item3 = :$item3, $item4 = :$item4 WHERE codigo = :codigo");

		$stmt -> bindParam(":".$item, $valor1, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item2, $valor3, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item3, $valor4, PDO::PARAM_STR);
		$stmt -> bindParam(":".$item4, $valor5, PDO::PARAM_STR);
		$stmt -> bindParam(":codigo", $valor2, PDO::PARAM_STR);

		if($stmt->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$stmt->close();
		$stmt = null;

	}

	 /*=============================================
	Ingresar Utilidad
	=============================================*/

	static public function mdlIngresarUtilidad($tabla, $datos){

		$stmt = Conexion::conectar();
		$stmt->beginTransaction();

		$tablaVentas = "ventas";
		$sql =  Conexion::conectar()->prepare("SELECT codigo FROM $tablaVentas ORDER BY id DESC LIMIT 1");
		$sql -> execute();
		$resultado= $sql -> fetch();
		$codigo =$resultado ? $resultado['codigo'] + 1 : 10001;


		$sentencia = $stmt ->prepare("INSERT INTO $tabla(codigo_venta, utilidad, costo, fecha) VALUES (:codigo_venta, :utilidad, :costo, :fecha)");
		$sentencia->bindParam(":codigo_venta", $codigo, PDO::PARAM_INT);
		$sentencia->bindParam(":utilidad", $datos["utilidad"], PDO::PARAM_STR);
		$sentencia->bindParam(":costo", $datos["costo"], PDO::PARAM_STR);
		$sentencia->bindParam(":fecha", $datos["fecha"], PDO::PARAM_STR);
	
		$stmt ->commit();

		if($sentencia->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$sentencia->close();
		$sentencia = null;

	}

		/*=============================================
	MOSTRAR VENTAS LISTAS PARA ENVIARSE Y CREAR LA GUIA
	=============================================*/

	static public function mdlMostrarVentasRemision($tabla, $item, $valor){

		if($item != null){

			$stmt = Conexion::conectar()->prepare("SELECT v.*, c.razon_social FROM ventas v INNER JOIN clientes c ON v.id_cliente = c.id WHERE  v.estado_guia = 0");

			$stmt -> execute();

			return $stmt -> fetch();

		}else{
			

			$stmt = Conexion::conectar()->prepare("SELECT v.*, c.razon_social FROM ventas v INNER JOIN clientes c ON v.id_cliente = c.id WHERE v.estado_guia = 0");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

	static public function mdlMostrarVentas1($tabla, $item, $valor){

		if($item != null){

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE codigo = $valor ORDER BY id ASC");

			$stmt -> execute();

			return $stmt -> fetch();

		}else{
			

			$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id ASC");

			$stmt -> execute();

			return $stmt -> fetchAll();

		}
		
		$stmt -> close();

		$stmt = null;

	}

	static public function mdlEditarEstado1($tabla, $item2, $valor1, $valor2){

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET $item2 = :$item2 WHERE codigo = :codigo");

		$stmt -> bindParam(":".$item2, $valor1, PDO::PARAM_INT);
		$stmt -> bindParam(":codigo", $valor2, PDO::PARAM_INT);

		if($stmt->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$stmt->close();
		$stmt = null;

	}


	static public function mdlIngresarPagos($tabla, $datos){

		$stmt = Conexion::conectar()->prepare("INSERT INTO $tabla(codigo_venta, forma_pago, tipo_pago) VALUES (:codigo_venta, :forma_pago, :tipo_pago)");

		$stmt->bindParam(":codigo_venta", $datos["codigo_venta"], PDO::PARAM_INT);
		$stmt->bindParam(":forma_pago", $datos["forma_pago"], PDO::PARAM_STR);
		$stmt->bindParam(":tipo_pago", $datos["tipo_pago"], PDO::PARAM_STR);
		
		if($stmt->execute()){

			return "ok";

		}else{

			return "error";
		
		}

		$stmt->close();
		$stmt = null;
	}



}