<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once('../config/Conexion.php');

Class Retorno
{
  //Implementando nuestro constructor
  public function __construct()
  {

  }
public function insertar($idtecnico, $idusuario, $fecha_hora, $descripcion, $idmovimiento_materiales, $idarticulo, $codigo, $marca, $cantidad, $mac,  $estadomaterial, $precio_venta, $precio_compra, $idaveria, $estado , $cantidadusado, $cantidaddevuelto, $cantidadsalida,$idalmacen)
{
    global $conexion; // Para usar la conexión global

    $hoy = date("Y-m-d H:i:s");

    try {
        // Iniciar transacción
        $conexion->begin_transaction();

        // Insertar en la tabla `retorno`
        $sql = "INSERT INTO retorno (fecharetorno, idtecnico, idusuario, descripcion) 
                VALUES ('$fecha_hora', '$idtecnico', '$idusuario', '$descripcion')";
        $idretorno = ejecutarConsulta_retornarID($sql);

        $num_elementos = 0;

        // Insertar en la tabla `retorno`
        while ($num_elementos < count($idarticulo)) {
            $sql_detalle = "INSERT INTO inventario_retorno (idalmacen, idarticulo, codigo, marca, cantidad,  mac,  idtecnico,  fecharetorno,  idusuario, estadomaterial, estadomovimiento, precio_venta, idretorno, descripcion)
                            VALUES (
                                '$idalmacen[$num_elementos]',
                                '$idarticulo[$num_elementos]', 
                                '$codigo[$num_elementos]', 
                                '$marca[$num_elementos]', 
                                '$cantidad[$num_elementos]',                                 
                                '$mac[$num_elementos]', 
                                '$idtecnico', 
                                '$fecha_hora', 
                                '$idusuario', 
                                '$estadomaterial[$num_elementos]', 
                                '3', 
                                '$precio_venta[$num_elementos]', 
                                '$idretorno',
                                '$descripcion'
                            )";
            if (!ejecutarConsulta($sql_detalle)) {
                throw new Exception("Error al insertar");
            }
            $num_elementos++;
        }

        $num_elementos1 = 0;
        // Actualizar en la tabla `movimiento_materiales`
        while ($num_elementos1 < count($idarticulo)) {
            if($estado[$num_elementos1]== '1'){
                $sql_detalle1 = "UPDATE movimiento_materiales 
                SET cantidaddevuelto = cantidaddevuelto + '$cantidad[$num_elementos1]',estadomovimiento='4',estadofinal='1' 
                WHERE idarticulo = '$idarticulo[$num_elementos1]' 
                AND codigo = '$codigo[$num_elementos1]' and idtecnico='$idtecnico' and idalmacen='$idalmacen[$num_elementos1]' and idmovimiento_materiales='$idmovimiento_materiales[$num_elementos1]'";
            }else{
                if($cantidadusado[$num_elementos1] + $cantidaddevuelto[$num_elementos1] + $cantidad[$num_elementos1] == $cantidadsalida[$num_elementos1]){
                    $sql_detalle1 = "UPDATE movimiento_materiales 
                    SET cantidaddevuelto = cantidaddevuelto + '$cantidad[$num_elementos1]',estado='1', estadofinal='1' 
                    WHERE idarticulo = '$idarticulo[$num_elementos1]' 
                    AND codigo = '$codigo[$num_elementos1]' and idtecnico='$idtecnico' and idalmacen='$idalmacen[$num_elementos1]' and idmovimiento_materiales='$idmovimiento_materiales[$num_elementos1]' ";
                }else{
                    $sql_detalle1 = "UPDATE movimiento_materiales 
                    SET cantidaddevuelto = cantidaddevuelto + '$cantidad[$num_elementos1]' 
                    WHERE idarticulo = '$idarticulo[$num_elementos1]' 
                    AND codigo = '$codigo[$num_elementos1]' and idtecnico='$idtecnico' and idalmacen='$idalmacen[$num_elementos1]' and idmovimiento_materiales='$idmovimiento_materiales[$num_elementos1]'";
                }
            }
            
            if (!ejecutarConsulta($sql_detalle1)) {
                throw new Exception("Error al actualizar inventario_ingreso");
            }
            $num_elementos1++;
        }

                $num_elementos2 = 0;
                $agrupado = [];

                // Agrupar datos por idarticulo, codigo e idalmacen
                while ($num_elementos2 < count($idarticulo)) {
                    $clave = $idarticulo[$num_elementos2] . "_" . $codigo[$num_elementos2] . "_" . $idalmacen[$num_elementos2];

                    if (!isset($agrupado[$clave])) {
                        $agrupado[$clave] = [
                            "stock" => 0,
                            "estadomaterial" => $estadomaterial[$num_elementos2],
                            "precio_venta" => $precio_venta[$num_elementos2]
                        ];
                    }
                    
                    $agrupado[$clave]["stock"] += $cantidad[$num_elementos2]; // Sumar cantidades
                    $agrupado[$clave]["precio_venta"] = $precio_venta[$num_elementos2]; // Último precio tomado

                    $num_elementos2++;
                }

                // Ejecutar un único UPDATE por cada idarticulo, codigo e idalmacen
                foreach ($agrupado as $clave => $datos) {
                    list($idart, $cod, $idalm) = explode("_", $clave);
                    $sql_detalle3 = "UPDATE inventario_ingreso 
                                    SET stock = stock + '{$datos['stock']}', 
                                        fecharetorno = '$fecha_hora', 
                                        estadomaterial = '{$datos['estadomaterial']}',
                                        estadomovimiento = '2',
                                        idusuario = '$idusuario',
                                        precio_venta = '{$datos['precio_venta']}'
                                    WHERE idarticulo = '$idart' 
                                    AND codigo = '$cod' 
                                    AND idalmacen = '$idalm'";

                    if (!ejecutarConsulta($sql_detalle3)) {
                        throw new Exception("Error al actualizar inventario_ingreso");
                    }
                }

                $num_elementos3 = 0;
                $agrupadoo = [];
                
                // Agrupar datos por idarticulo e idalmacen
                while ($num_elementos3 < count($idarticulo)) {
                    $clave = $idarticulo[$num_elementos3] . "_" . $idalmacen[$num_elementos3];
                
                    if (!isset($agrupadoo[$clave])) {
                        $agrupadoo[$clave] = 0;
                    }
                    
                    $agrupadoo[$clave] += $cantidad[$num_elementos3]; // Sumar cantidades
                
                    $num_elementos3++;
                }
                
                // Ejecutar un único UPDATE por cada idarticulo e idalmacen
                foreach ($agrupado as $clave => $stock_salida) {
                    list($idart, $idalm) = explode("_", $clave);
                    $sql_detalle4 = "UPDATE inventario_almacen 
                                     SET stock_salida = stock_salida - '$stock_salida'
                                     WHERE idarticulo = '$idart' 
                                     AND idalmacen = '$idalm'";
                
                    if (!ejecutarConsulta($sql_detalle4)) {
                        throw new Exception("Error al actualizar inventario_almacen");
                    }
                }

        // Confirmar transacción
        $conexion->commit();
        return true;
    } catch (Exception $e) {
        // Revertir la transacción en caso de error
        $conexion->rollback();
        error_log("Error en insertar: " . $e->getMessage());
        return false;
    }
}

public function insertarAntiguo($idtecnico, $idusuario, $fecha_hora, $descripcion, $idarticulo, $codigo, $marca, $cantidad, $mac, $serie, $nrofactura, $idprovedor, $garantia, $estadomaterial, $precio_venta)
{
    global $conexion; // Para usar la conexión global

    $hoy = date("Y-m-d H:i:s");

    try {
        // Iniciar transacción
        $conexion->begin_transaction();

        // Insertar en la tabla `retorno`
        $sql = "INSERT INTO retorno (fecharetorno, idtecnico, idusuario, descripcion) 
                VALUES ('$fecha_hora', '$idtecnico', '$idusuario', '$descripcion')";
        $idretorno = ejecutarConsulta_retornarID($sql);

        $num_elementos = 0;

        // Insertar en la tabla `retorno`
        while ($num_elementos < count($idarticulo)) {
            $sql_detalle = "INSERT INTO inventario_retorno (idarticulo, codigo, marca, cantidad,  mac, serie, idtecnico, unidadmedida, fecharetorno, idprovedor, nrofactura, garantia, idusuario, estadomaterial, estadomovimiento, precio_venta, idretorno, descripcion)
                            VALUES (
                                '$idarticulo[$num_elementos]', 
                                '$codigo[$num_elementos]', 
                                '$marca[$num_elementos]', 
                                '$cantidad[$num_elementos]',                                 
                                '$mac[$num_elementos]', 
                                '$serie[$num_elementos]', 
                                '$idtecnico', 
                                '', 
                                '$fecha_hora', 
                                '$idprovedor[$num_elementos]', 
                                '$nrofactura[$num_elementos]', 
                                '$garantia[$num_elementos]', 
                                '$idusuario', 
                                '$estadomaterial[$num_elementos]', 
                                '3', 
                                '$precio_venta[$num_elementos]', 
                                '$idretorno',
                                '$descripcion'
                            )";
            if (!ejecutarConsulta($sql_detalle)) {
                throw new Exception("Error al insertar");
            }
            $num_elementos++;
        }
        
            $sql1 = "INSERT INTO ingreso(
                idproveedor, idusuario, tipo_comprobante, serie_comprobante, num_comprobante, 
                fecha_hora, total_compra, estado, estado_ingreso
            ) 
            VALUES (
                '4', '$idusuario', 'S/N', 'S/N', 
                'S/N', '$fecha_hora', '00', 'Aceptado', '2'
            )";
            $idingresonew = ejecutarConsulta_retornarID($sql1);;

            $num_elementos1 = 0;

            // Insertar en la tabla `ingreso`
            while ($num_elementos1 < count($idarticulo)) {
                $sql_detalle1 = "INSERT INTO inventario_ingreso (iddetalle_ingreso, idalmacen, codigo, idarticulo, cantidad, marca, mac, serie, 
                             idprovedor, fecha, nrofactura, stock, estadomaterial, estadomovimiento, fechaingreso, idusuario, garantia, precio_compra, precio_venta)
                                VALUES (
                                    '$idingresonew',
                                    '1',
                                    '$codigo[$num_elementos1]', 
                                    '$idarticulo[$num_elementos1]',
                                    '$cantidad[$num_elementos1]', 
                                    '$marca[$num_elementos1]', 
                                    '$mac[$num_elementos1]', 
                                    '$serie[$num_elementos1]', 
                                    '4', 
                                    '$fecha_hora', 
                                    '$nrofactura[$num_elementos1]',
                                    '$cantidad[$num_elementos1]', 
                                    '$estadomaterial[$num_elementos1]',
                                    '1', 
                                    '$fecha_hora', 
                                    '$idusuario',
                                    '0',
                                    '$precio_venta[$num_elementos1]',
                                    '$precio_venta[$num_elementos1]'
                                )";
                if (!ejecutarConsulta($sql_detalle1)) {
                    throw new Exception("Error al insertar");
                }
                $num_elementos1++;
            }
        

        // Confirmar transacción
        $conexion->commit();
        return true;
    } catch (Exception $e) {
        // Revertir la transacción en caso de error
        $conexion->rollback();
        error_log("Error en insertar: " . $e->getMessage());
        return false;
    }
}
    
   
    public function listarretorno()
    {
      $sql="SELECT s.idretorno,s.fecharetorno,o.nombre as responsable,p.nombre as usuario, s.descripcion, year(s.created_at) as ano FROM retorno s join usuario o on s.idtecnico=o.idusuario join usuario p on s.idusuario=p.idusuario order by s.idretorno desc";
      return ejecutarConsulta($sql);

    }
    //// LISTA LOS PRODUCTOS QUE TENGA >0 EL STOCK Y ESTADO MATERIAL DIFERENTE DE !4
    public function listarproducto()
    {
   $sql="SELECT d.idsalida,d.codigo,d.idarticulo,d.cantidad,d.mac,d.serie,d.marca,a.nombre,d.precio_compra,d.precio_venta,d.stock,d.unidadmedida,d.nrofactura,d.idprovedor,d.garantia,d.estadomaterial,d.idaveria FROM inventario_salida d join articulo a on d.idarticulo=a.idarticulo WHERE d.estadomaterial!=3 and d.estadomovimiento>=3  order by d.codigo desc";
      return ejecutarConsulta($sql);
    }

    public function listarproductoM($idtecnico)
    {
   $sql="SELECT d.idmovimiento_materiales,d.codigo,d.idarticulo,d.cantidadsalida,d.cantidaddevuelto,d.cantidadusado,d.mac,d.marca,a.nombre,d.precio_compra,d.precio_venta,d.estadomaterial,d.idaveria,d.estado,d.estadofinal,d.idalmacen FROM movimiento_materiales d join articulo a on d.idarticulo=a.idarticulo WHERE d.idtecnico='$idtecnico' and  d.estadomaterial!=3 and d.estadomovimiento>=3 and d.estadofinal='0'  order by d.codigo desc";
      return ejecutarConsulta($sql);
    }



      public function mostrardetalleretorno($idretorno)
    {

    // Consulta para la tabla detalle_ingreso
    $queryDetalles = "SELECT d.fecharetorno,u.nombre as tecnico,a.nombre as producto,d.codigo,d.cantidad,d.precio_venta,d.estadomaterial,d.estadomovimiento,c.codigo as madre,d.unidadmedida
        FROM inventario_retorno d 
        JOIN articulo a ON d.idarticulo = a.idarticulo 
        JOIN usuario u ON d.idtecnico = u.idusuario 
        JOIN categoria c on a.idcategoria=c.idcategoria
        WHERE d.idretorno = '$idretorno' 
        ORDER BY d.idinventario_retorno DESC";
    $resultDetalles = ejecutarConsulta($queryDetalles);

    $detalles = [];
    while ($row = $resultDetalles->fetch_assoc()) {
    $detalles[] = $row;
    }

    // Respuesta JSON
    return [
    "detalles" => $detalles
    ];

    }

}


?>