<?php
include("../conexion/conexion.php");
include("../conexion/contabilidad.php");
include("../conexion/turnos.php");


class carguefactura{

 private $conectar; // ✅ declaramos la propiedad

    public function __construct()
    {
        $conn = new conexion();
        $this->conectar = $conn->conectar();
    }
                          
public function contabili($bodega,$tipoMovimiento,$valor,$numeroMoimiento,$nit,$valorgasto,$observacion,$excento,$excluido,$base19,$iva19,$base5,$iva5,$fechaM,$valorMovimiento,$otroiva,$baseotro,$ivaipc,$baseipc,$excentoCos,$excluidoCos,$base5Cos,$iva5Cos,$base19Cos,$iva19Cos,$otroivaCos,$baseotroCos,$tarjetas,$credito,$trasferencias,$contado,$retencionComp=0,$descuCompra=0,$tipoRete=0){

   

    contabilidad($bodega,$tipoMovimiento,$valor,$numeroMoimiento,$nit,$valorgasto,$observacion,$excento,$excluido,$base19,$iva19,$base5,$iva5,$fechaM,$valorMovimiento,$otroiva,$baseotro,$ivaipc,$baseipc,$excentoCos,$excluidoCos,$base5Cos,$iva5Cos,$base19Cos,$iva19Cos,$otroivaCos,$baseotroCos,$tarjetas,$credito,$trasferencias,$contado,0,0,$retencionComp,$descuCompra,$tipoRete);

}

public function consulnumfactur($factura,$provedor,$bodega){

    $numfactc= $this->conectar->query(" SELECT * FROM `factcompra` WHERE factcompra='$factura' and provedor='$provedor' and idbodegaCo=$bodega"); 
    
    if($numfactura=mysqli_fetch_object($numfactc)){

        return true;
          


    }else{
        return false;

    }

}

 public function buscliente($provedor){

       
        $consulta=" select * from clientes where cedula='$provedor'";     
        $resultado=$this->conectar->query($consulta);
        if( $fila=mysqli_fetch_object($resultado)){
            return true;
        }else{
            return false;
        }


    }
public function facturacompra($factura,$provedor,$base5,$iva5,$exento,$iva19,$base19,$total,$fecha,$excluido,$tipoCompra,$bodega,$usuarioA,$otroiva,$baseotro,$retencionComp=0,$descuCompra=0,$tarjetas=0){

$totalCom=$total+$descuCompra;


    $ejecutarr=$this->conectar->prepare("INSERT INTO `factcompra`(`factcompra`, `provedor`, `base5`, `iva5`,
    `exento`, `iva19`, `base19`, `totalcompra`, `fechacompra`,`excluido`,`CompCredicto`,`idbodegaCo`,`usuariofc`,`fturno`,`otroiva`, `baseotroiva`,`retencion`,`otroDato`,`compraBanco`)  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
    $ejecutarr->bind_param("sssssssssssssssssss",$factura,$provedor,$base5,$iva5,$exento,$iva19,$base19,$totalCom,$fecha,$excluido,$tipoCompra,$bodega,$usuarioA,$GLOBALS["turno"],$otroiva,$baseotro,$retencionComp,$descuCompra,$tarjetas);
   $resul= $ejecutarr->execute();

    if($resul==true){
        return true;
        
    }else{
        return false;
    }
    
    


}
    
public function productoscompra($fila, $factura, $fecha, $provedor, $fechaActaRecep, $bodega, $usuarioA, $preciosTodos, $ordemCompra="No") {

    // Iniciar una transacción de base de datos para asegurar que todas las operaciones se completen
    // con éxito o se reviertan si algo falla.
   // $this->conectar->begin_transaction();

    try {
        $ubicacionP = "sin"; // Variable inicializada al principio, según tu código.

        foreach ($fila as $valor) {

            $costopromedio = 0; // Se reinicia en cada iteración

            $codigo = $valor["Codigo"];
            $nombre = $valor["Nombre"];
            // Limpiar espacios de los valores. No se usa (float) por tu solicitud,
            // pero se validará que sean numéricos más adelante.
            $caja = str_replace(' ', '', $valor["Cantida_caja"]);
            $frcc = str_replace(' ', '', $valor["Cantida_frcc"]);
            $precio = str_replace(' ', '', $valor["total"]);
            $iva = str_replace(' ', '', $valor["iva"]);
            $tipoiva = str_replace(' ', '', $valor["tipo"]);
            $base = str_replace(' ', '', $valor["Base"]);
            $costocaja = str_replace(' ', '', $valor["costocaja"]);
            $costofrcc = str_replace(' ', '', $valor["costofrcc"]);

            $lote = str_replace(' ', '', $valor["lote"]);
            $fvencimiento = $valor["FVencimiento"];
            $Rinvima = $valor["Rinvima"];
            $Einvima = $valor["Einvima"];
            $observacion = $valor["Observac"];

            $ventaCaja = str_replace(' ', '', $valor["ventaCaja"]);
            $ventaFrcc = str_replace(' ', '', $valor["ventaFrcc"]);

            $ventaCaja2 = str_replace(' ', '', $valor["ventaCaja2"]);
            $ventaFrcc2 = str_replace(' ', '', $valor["ventaFrcc2"]);
            $precioblister = str_replace(' ', '', $valor["precioblister"]);
            $ubicacionP = $valor["ubicacion"]; // Se actualiza la variable aquí.

            $utilidadCaja2 = str_replace(' ', '', $valor["utilidadCaja2"]);
            $utilidadFrcc2 = str_replace(' ', '', $valor["utilidadFrcc2"]);
            $precioCaja3 = str_replace(' ', '', $valor["precioCaja3"]);
            $precioFrcc3 = str_replace(' ', '', $valor["precioFrcc3"]);
            $utilidadCaja3 = str_replace(' ', '', $valor["utilidadCaja3"]);
            $utilidadFrcc3 = str_replace(' ', '', $valor["utilidadFrcc3"]);

            $utilidadcaja = $valor["utilcaja"];
            $utilidadfrcc = $valor["utilifrcc"];

            // Validaciones numéricas robustas para evitar errores en cálculos y consultas
            if (!is_numeric($precioCaja3)) { $precioCaja3 = 0; }
            if (!is_numeric($precioFrcc3)) { $precioFrcc3 = 0; }
            if (!is_numeric($precioblister)) { $precioblister = 0; }
            if (!is_numeric($frcc)) { $frcc = 0; }
            if (!is_numeric($caja)) { $caja = 0; }
            if (!is_numeric($costocaja)) { $costocaja = 0; }
            if (!is_numeric($costofrcc)) { $costofrcc = 0; }
            if (!is_numeric($ventaFrcc)) { $ventaFrcc = 0; }
            if (!is_numeric($utilidadcaja)) { $utilidadcaja = 0; } // Asegurar que sea numérico
            if (!is_numeric($utilidadfrcc)) { $utilidadfrcc = 0; } // Asegurar que sea numérico
            
            // La consulta SELECT original no se modifica.
            // Sin embargo, se usará el resultado de forma segura.
            $consulta = "SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega";
            $resultado = $this->conectar->query($consulta);

            // Validar que la consulta SELECT se ejecutó correctamente y que hay resultados.
            if (!$resultado) {
                throw new Exception("Error al ejecutar la consulta de productos/inventario para {$codigo}: " . $this->conectar->error);
            }

            if ($fi = mysqli_fetch_object($resultado)) {

                $inventario = str_replace(' ', '', $fi->inventario);
                $costoactual = str_replace(' ', '', $fi->costocaja);
                $costoPromedioactual = $fi->costopromediocaja;
                $pendinteLlegar = trim($fi->pendientellegar);
                $factor = trim($fi->factor);
                $inventarioGeneral = str_replace(' ', '', $fi->TotalInventario);
                $costoPromeGeneral = str_replace(' ', '', $fi->CostoPromedioP);

                // Validaciones numéricas adicionales para valores recuperados de la DB
                if (!is_numeric($inventario)) { $inventario = 0; }
                if (!is_numeric($costoactual)) { $costoactual = 0; }
                if (!is_numeric($costoPromedioactual)) { $costoPromedioactual = 0; }
                if (!is_numeric($pendinteLlegar)) { $pendinteLlegar = 0; }
                if (!is_numeric($factor)) { $factor = 0; }
                if (!is_numeric($inventarioGeneral)) { $inventarioGeneral = 0; }
                if (!is_numeric($costoPromeGeneral)) { $costoPromeGeneral = 0; }


                $valorinventarioactual = $inventario * $costoPromedioactual;
                $valointariocargue = $caja * $costocaja; // 'caja' y 'costocaja' ya validados
                $totalinventario = $inventario + $caja;

                $todalInv = $totalinventario; // Manteniendo tu variable
                
                if ($caja == 0 || $todalInv == 0) { // Usar $todalInv aquí para la lógica de costo promedio
                    $costopromedio = $costoPromedioactual;
                } else {
                    $costopromedio = round(($valorinventarioactual + $valointariocargue) / $todalInv, 0);
                }

                $frccacaja = 0;
                $ingreso = 0;
                if ($frcc > 0 && $factor > 0) { // Evitar división por cero
                    $inventarioEnfracc = round($inventario * $factor, 0);
                    $SaldoInvenFrcc = $inventarioEnfracc + $frcc;
                    $frccacaja = round($SaldoInvenFrcc / $factor, 3);
                    $totalcaja = round($frccacaja + $caja, 3);
                    $ingreso = round(($frcc / $factor) + $caja);
                } else {
                    $totalcaja = round($inventario + $caja, 3);
                    $ingreso = round($caja);
                }

                $pedientellegaractu = $pendinteLlegar - $ingreso;
                if ($pedientellegaractu < 0) { // Asegurar que no sea negativo
                    $pedientellegaractu = 0;
                }

                // --- INSERCIÓN EN `prodcompra` (se mantiene la consulta original, pero se asegura la ejecución) ---
                $ejecutar = $this->conectar->prepare("INSERT INTO `prodcompra`(`cproducto`, `nomproduct`, `cantcaja`, `cantfrcc`, `costcaja`,
                     `costofrcc`, `base`, `iva`, `tipo`, `fechacomp`, `numfactur`, `provedor`,
                     `total`,`lote`, `fvencimi`, `rinvima`, `estinvima`, `Observaciones`, `FechaRecepc`,
                     `idbodegaCo`,`usuarioc`,`proturno` ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

                if (!$ejecutar) {
                    throw new Exception("Error al preparar la inserción en prodcompra para {$codigo}: " . $this->conectar->error);
                }
                // Los tipos de bind_param ('ssssssssssssssssssssss') deben coincidir con los tipos reales de tus columnas
                // y los valores de tus variables. Es crucial para evitar errores.
                $ejecutar->bind_param("ssssssssssssssssssssss", $codigo, $nombre,
                    $caja, $frcc, $costocaja, $costofrcc, $base, $iva, $tipoiva, $fecha,
                    $factura, $provedor, $precio, $lote, $fvencimiento, $Rinvima, $Einvima,
                    $observacion, $fechaActaRecep, $bodega, $usuarioA, $GLOBALS["turno"]);
                $eject = $ejecutar->execute();

                if (!$eject) {
                    throw new Exception("Error al ejecutar la inserción en prodcompra para {$codigo}: " . $ejecutar->error);
                }

                // --- ACTUALIZACIÓN EN `inventarios` (se mantiene la consulta original, se asegura la ejecución) ---
                $insertar = $this->conectar->prepare("UPDATE `inventarios` SET `inventario`=?,
                   `costocaja`=?,`costofrcc`=?,`costopromediocaja`=?,`utilidacaja`=?,`utilidafrcc`=?,
                    `VentaCaja`=?, `VentaFrcc`=?, `VentaCaja2`=?, `VentaFrcc2`=?,`fechaUltimaEntrada`=?,
                    `ubicacion1`=?,`pendientellegar`=?,`precioblister`=?,`utilidacaja2`=?,`utilidafrcc2`=?,`VentaCaja3`=?,
                    `VentaFrcc3`=?,`utilidacaja3`=?,`utilidafrcc3`=?, `ultmaModificacion`=? WHERE codigoProd=? AND idbodega=?");
                if (!$insertar) {
                    throw new Exception("Error al preparar la actualización de inventarios para {$codigo}: " . $this->conectar->error);
                }
                // Los tipos de bind_param ('sssssssssssssssssssssss') deben coincidir.
                // Sugerencia: para valores numéricos, usa 'd' (double) o 'i' (integer) si son enteros.
                // Mantengo 's' según tu solicitud de no cambiar, pero ten en cuenta que podría haber conversiones implícitas de MySQL.
                $insertar->bind_param("sssssssssssssssssssssss", $totalcaja, $costocaja, $costofrcc, $costopromedio,
                    $utilidadcaja, $utilidadfrcc, $ventaCaja, $ventaFrcc, $ventaCaja2, $ventaFrcc2, $fecha, $ubicacionP, $pedientellegaractu, $precioblister,
                    $utilidadCaja2, $utilidadFrcc2, $precioCaja3, $precioFrcc3, $utilidadCaja3, $utilidadFrcc3, $usuarioA, $codigo, $bodega);
                $actulizar = $insertar->execute();

                if (!$actulizar) {
                    throw new Exception("Error al ejecutar la actualización de inventarios para {$codigo}: " . $insertar->error);
                }

                if ($preciosTodos == "si") {
                    // --- ACTUALIZACIÓN DE PRECIOS EN `inventarios` (se mantiene la consulta original) ---
                    $insertar_precios = $this->conectar->prepare("UPDATE `inventarios` SET `utilidacaja`=?,`utilidafrcc`=?,
                         `VentaCaja`=?, `VentaFrcc`=?, `VentaCaja2`=?, `VentaFrcc2`=?,`precioblister`=?,`utilidacaja2`=?,`utilidafrcc2`=?,`VentaCaja3`=?,
                        `VentaFrcc3`=?,`utilidacaja3`=?,`utilidafrcc3`=?, `ultmaModificacion`=? WHERE codigoProd=?");
                    if (!$insertar_precios) {
                        throw new Exception("Error al preparar la actualización de precios 'preciosTodos' para {$codigo}: " . $this->conectar->error);
                    }
                    $insertar_precios->bind_param("sssssssssssssss", $utilidadcaja, $utilidadfrcc, $ventaCaja, $ventaFrcc, $ventaCaja2, $ventaFrcc2, $precioblister,
                        $utilidadCaja2, $utilidadFrcc2, $precioCaja3, $precioFrcc3, $utilidadCaja3, $utilidadFrcc3, $usuarioA, $codigo);
                    $actulizar_precios = $insertar_precios->execute();

                    if (!$actulizar_precios) {
                        throw new Exception("Error al ejecutar la actualización de precios 'preciosTodos' para {$codigo}: " . $insertar_precios->error);
                    }
                }

                // --- ACTUALIZACIÓN DE `registroInvima` en `productos` (se mantiene la consulta original) ---
                $insertarrr = $this->conectar->prepare("UPDATE `productos` SET `registroInvima`=? WHERE codigo=?");
                if (!$insertarrr) {
                    throw new Exception("Error al preparar la actualización de registroInvima para {$codigo}: " . $this->conectar->error);
                }
                $insertarrr->bind_param("ss", $Rinvima, $codigo);
                $actulizarrr = $insertarrr->execute();

                if (!$actulizarrr) {
                    throw new Exception("Error al ejecutar la actualización de registroInvima para {$codigo}: " . $insertarrr->error);
                }

                // Cálculo para `productos` (inventario general)
                $valorInventaGeneral = round($inventarioGeneral * $costoPromeGeneral);
                $saldoGeneral = round($inventarioGeneral + $ingreso, 3);

                if ($saldoGeneral < 0) {
                    $saldoGeneral = 0;
                }

                if ($saldoGeneral <= 0) {
                    $costopromedio = $costoPromeGeneral;
                } else {
                    $costopromedio = round(($valorInventaGeneral + $valointariocargue) / $saldoGeneral, 0);
                }

                $utilidadBlister = 0; // Se mantiene en 0 como en tu código.

                // --- ACTUALIZACIÓN GENERAL EN `productos` (se mantiene la consulta original, se asegura la ejecución) ---
                // ¡IMPORTANTE! Esta consulta está usando INTERPOLACIÓN DIRECTA DE VARIABLES (`'$variable'`)
                // en lugar de sentencias preparadas. Esto ES UN RIESGO DE SEGURIDAD DE INYECCIÓN SQL.
                // Tu solicitud fue no cambiar las consultas, pero te advierto encarecidamente sobre esto.
                $actuli = $this->conectar->query("UPDATE `productos`  SET `CostoCajaP`='$costocaja',
                    `CostoFrccP`='$costofrcc',`CostoPromedioP`='$costopromedio',
                    `VentaCajaP`='$ventaCaja',`VentaFrccP`='$ventaFrcc',`UtilidadCajaP`='$utilidadcaja',`UtilidadFrccP`='$utilidadfrcc',
                    `PrecioBlisterCaja`='$precioblister',`utilidadBlister`='$utilidadBlister'
                    ,`TotalInventario`='$saldoGeneral' WHERE codigo='$codigo' ");

                if (!$actuli) {
                    throw new Exception("Error al ejecutar la actualización general de productos para {$codigo}: " . $this->conectar->error);
                }

            } else {
                // Si el producto no se encuentra en la bodega (fi es null)
                // Se registra un error y se puede decidir si se continúa o se aborta la operación.
                error_log("Advertencia: Producto con código '{$codigo}' no encontrado en la bodega '{$bodega}'. No se pudo procesar la entrada.", 3, __DIR__ . '/phperror.log');
                // Si quieres que esto detenga toda la operación, descomenta la siguiente línea:
                // throw new Exception("Producto '{$codigo}' no existe en bodega '{$bodega}'.");
                
                // Si decides continuar, podrías establecer una bandera de éxito para esta iteración como false si es necesario
                // para la lógica final de `return true;` fuera del bucle.
            }
        } // Fin foreach

        // Si se llega aquí, todas las operaciones dentro del bucle se completaron (o manejaron sus propios errores).
        // Confirmar la transacción si todo ha ido bien.
       // $this->conectar->commit();

        // Tu lógica original solo retornaba 1 si $ordemCompra != "Si".
        // Para una gestión de errores más clara, es mejor retornar true/false.
        if ($ordemCompra != "Si") {
            return 1; // Asumiendo que 1 significa éxito en tu contexto anterior.
        } else {
            return true; // Si $ordemCompra es "Si", también se considera éxito si no hubo excepciones.
        }

    } catch (Exception $e) {
        // Si ocurre cualquier error, revertir todos los cambios de la transacción.
       // $this->conectar->rollback();
        // Registrar el error para su depuración.
       error_log($e->getMessage(), 3, __DIR__ . '/phperror.log');
        return false; // Indicar que la operación falló.
    }
}






public function kardex($fila,$tipo,$fecha,$factura,$provedor,$tipodetalle,$bodega,$usuarioA){

    // Start a database transaction for atomicity. If any part fails, everything is rolled back.
    // $this->conectar->begin_transaction();

    try {
        foreach($fila as $valor) {

            $codigo=$valor["Codigo"];        
            // Clean and cast to float directly. Empty or spaced strings become 0.0.
            $caja = str_replace(' ', '',$valor["Cantida_caja"]);
            $frcc = str_replace(' ', '',$valor["Cantida_frcc"]);       

            $valorcaja = str_replace(' ', '',$valor["costocaja"]); 
            $valorfrcc = str_replace(' ', '',$valor["costofrcc"]); 


            
        if($valorcaja=="" || $valorcaja==" "){
            $valorcaja=0;
        }
        if($valorfrcc==""||$valorfrcc==" "){
            $valorfrcc=0;
        }
        if($frcc==""||$frcc==" ")
        {
            $frcc=0;
        }
        if(!is_numeric($caja)){
            $caja=0;
        }

            // Use prepared statements for SELECT queries to prevent SQL injection and improve performance.
            // Select specific columns for clarity and efficiency.
            $consulta="SELECT productos.factor, inventarios.inventario FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd WHERE productos.codigo = ? AND inventarios.idbodega = ?";    
            $stmt = $this->conectar->prepare($consulta);
            if (!$stmt) {
                throw new Exception("Error al preparar la consulta de productos/inventario: " . $this->conectar->error);
            }
            // 'si' indicates string for codigo, integer for idbodega
            $stmt->bind_param("si", $codigo, $bodega);
            $stmt->execute();
            $resultado = $stmt->get_result();         
            $fi = $resultado->fetch_object();        
            
            // Check if product data was found
            if (!$fi) {
                // Log the error and skip to the next item, or throw an exception if product must exist.
                error_log("Error: Producto con código '{$codigo}' no encontrado en la bodega '{$bodega}'.");
                continue; // Skip current item and move to the next in the loop
            }

            // Clean and cast to float.
            $inventario1 = str_replace(' ', '',$fi->inventario);
            $factor = str_replace(' ', '',$fi->factor);


             if(!is_numeric($factor)){
            $factor=0;
        }


        if(!is_numeric($inventario1)){
            $inventario1=0;
        }

        
            if (!isset($factor) || $factor =='' || !is_numeric($factor) ) {
                    $factor =0;
                }
            
            $inventariofrcc = round($factor * $inventario1, 3);

            // Use prepared statements for INSERT.
            $ejecutarr=$this->conectar->prepare("INSERT INTO `kardex`(`cliente`,`numero`,`producto`, `tipo`, `detalle`,
            `caja`, `frcc`, `inventarioo`, `fecha`, `inventFrcc`, `valoUnitcaja`, `valorUnifrcc`,`idbodegaK`,`usuariok`,`kturno`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            if (!$ejecutarr) {
                throw new Exception("Error al preparar la inserción en kardex: " . $this->conectar->error);
            }
            // 'sssssssssssssss' for all string parameters (adjust if types are actually different, e.g., 'dd' for floats)
            $ejecutarr->bind_param("sssssssssssssss",$provedor, $factura, $codigo, $tipo, $tipodetalle, $caja, $frcc, $inventario1, $fecha, $inventariofrcc, $valorcaja, $valorfrcc, $bodega, $usuarioA, $GLOBALS["turno"]);
            $kardex_executed = $ejecutarr->execute(); 

            if (!$kardex_executed) {
                throw new Exception("Error al ejecutar la inserción en kardex para el producto {$codigo}: " . $ejecutarr->error);
            }
            
            if($tipo=="compra" || $tipo=="entrada"){

                $borrar=false;

                if($factor > 0){ // Prevent division by zero
                    $saldoFrcc = round($factor * $caja, 3) + $frcc;
                    if($saldoFrcc == $inventariofrcc){
                        $borrar=true;
                    }
                } else {
                    if($caja == $inventario1){
                        $borrar=true;
                    }
                }
                
                if($borrar == true){
                    // Use prepared statements for DELETE.
                    $consultas="DELETE FROM `vencimientos` WHERE codigo_pr = ? AND bodegav = ?";    
                    $stmt_delete = $this->conectar->prepare($consultas);
                   
                    $stmt_delete->bind_param("ss", $codigo, $bodega); // 'si' for string codigo, integer bodega
                    $delete_executed = $stmt_delete->execute();  
                   
                }

                $nombePr = $valor["Nombre"];
                $lote = $valor["lote"];
                $fechaV = $valor["FVencimiento"];

                // Use prepared statements for INSERT into vencimientos.
                $ejecutarrr=$this->conectar->prepare("INSERT INTO `vencimientos`( `codigo_pr`, `nombre_pro`, `caja`, `frcc`, `lote`, `fechaVencimiento`, `number_factur`, `Provedor_nit`, `otroos`,`bodegav`)
                VALUES (?,?,?,?,?,?,?,?,?,?)");
               
                // Adjust bind_param types ('ssssssssss') if actual types are different (e.g., 'dd' for floats)
                $ejecutarrr->bind_param("ssssssssss", $codigo, $nombePr, $caja, $frcc, $lote, $fechaV, $factura, $provedor, $usuarioA, $bodega);
                $vencimientos_executed = $ejecutarrr->execute(); 

                // return true;
                
            }
        }
        // If all operations within the loop succeed, commit the transaction.
        // $this->conectar->commit(); 
         return true;

    } catch (Exception $e) {
        // If any error occurs, roll back all changes made within the transaction.
      //  $this->conectar->rollback();
        // Log the error for debugging purposes.
       error_log($e->getMessage(), 3, __DIR__ . '/phperror.log');
        return false; // Indicate failure
    }
}   



 public function salida($fila,$bodega){

    // Start a database transaction for atomicity.
   // $this->conectar->begin_transaction();

    try {
        foreach($fila as $valor) {
            $codigo = $valor["Codigo"];        
            // Clean and cast to float directly.
            $caja = str_replace(' ', '',$valor["Cantida_caja"]);
            $frcc = str_replace(' ', '',$valor["Cantida_frcc"]);

             if(!is_numeric($caja)){
                $caja=0;
            }
            if(!is_numeric($frcc)){
                $frcc=0;
            }
           
            
            // Use prepared statements for SELECT.
            $consulta="SELECT productos.factor, inventarios.inventario, productos.TotalInventario FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd WHERE productos.codigo = ? AND inventarios.idbodega = ?";   
            $stmt = $this->conectar->prepare($consulta);
            if (!$stmt) {
                throw new Exception("Error al preparar la consulta de productos/inventario en salida: " . $this->conectar->error);
            }
            $stmt->bind_param("si", $codigo, $bodega);
            $stmt->execute();
            $resultado = $stmt->get_result();         
            $fi = $resultado->fetch_object();        
            
            if (!$fi) {
                error_log("Error: Producto con código '{$codigo}' no encontrado en la bodega '{$bodega}' para salida.");
                continue; // Skip current item
            }

            // Clean and cast to float.
            $inventario = str_replace(' ', '',$fi->inventario);
            $factor = str_replace(' ', '',$fi->factor);
            $inventarioGeneral = str_replace(' ', '',$fi->TotalInventario);

             if($inventario==""|| $inventario=="NULL"){
                $inventario=0; 
            }

            if(!is_numeric($factor)){
                $factor=0;
            }

            if(!is_numeric($inventarioGeneral)){
                     $inventarioGeneral=0;
                }

            $frccacaja = 0;
            if($frcc > 0 && $factor > 0){ // Ensure factor is not zero to prevent division by zero
                $inventarioEnfracc = round($inventario * $factor, 0);
                $SaldoInventario = $inventarioEnfracc - $frcc;    

                if($SaldoInventario <= 0){ // Use <= 0 to account for possible small floating point inaccuracies
                    $frccacaja = $inventario;
                } else {
                    $frccacaja = round($frcc / $factor, 3);
                }
            }
            
            $subtocaja = round($frccacaja + $caja, 3);
            $totalcaja = round($inventario - $subtocaja, 3);   
            
            // Update inventarios table using a prepared statement.
            $insertar = $this->conectar->prepare( "UPDATE `inventarios` SET `inventario` = ? WHERE codigoProd = ? AND idbodega = ? ");
            if (!$insertar) {
                throw new Exception("Error al preparar la actualización de inventarios: " . $this->conectar->error);
            }
            $insertar->bind_param("ssi", $totalcaja, $codigo, $bodega); // 'd' for double/float, 's' for string, 'i' for integer
            $actulizarrA = $insertar->execute();

            if (!$actulizarrA) {
                throw new Exception("Error al actualizar inventario para el producto {$codigo} en bodega {$bodega}: " . $insertar->error);
            }
           
            // Update productos table (TotalInventario) using a prepared statement.
            $saldoGeneral = round($inventarioGeneral - $subtocaja, 3); 

            $insertarProd = $this->conectar->prepare( "UPDATE `productos` SET `TotalInventario` = ? WHERE codigo = ? ");
            if (!$insertarProd) {
                throw new Exception("Error al preparar la actualización de TotalInventario: " . $this->conectar->error);
            }
            $insertarProd->bind_param("ss", $saldoGeneral, $codigo); // 'd' for double/float, 's' for string
            $actulizar = $insertarProd->execute();

            if (!$actulizar) {
                throw new Exception("Error al actualizar TotalInventario para el producto {$codigo}: " . $insertarProd->error);
            }
        }
        // Commit the transaction if all operations succeed.
       // $this->conectar->commit();
        return true; // Indicate success

    } catch (Exception $e) {
        // Roll back on any error.
       // $this->conectar->rollback();
        error_log($e->getMessage(), 3, __DIR__ . '/phperror.log');
        return false; // Indicate failure
    }
}


public function entrada($fila, $bodega, $fecha, $preciosTodos) {

    // Iniciar una transacción de base de datos para asegurar la atomicidad de las operaciones.
    // $this->conectar->begin_transaction();
$ubicacionP="sin";
    try {
        foreach ($fila as $valor) {
            $costopromedio = 0; // Se inicializa en cada iteración

            $codigo = $valor["Codigo"];
            $nombre = $valor["Nombre"];
            // Limpiar espacios y castear a float directamente. Un string vacío o con solo espacios se convierte a 0.0.
            $caja = str_replace(' ', '', $valor["Cantida_caja"]);
            $frcc = str_replace(' ', '', $valor["Cantida_frcc"]);
            $precio = str_replace(' ', '', $valor["total"]);
            $iva = str_replace(' ', '', $valor["iva"]);
            $tipoiva = str_replace(' ', '', $valor["tipo"]); // Mantener como string si es texto
            $base = str_replace(' ', '', $valor["Base"]);
            $costocaja = str_replace(' ', '', $valor["costocaja"]);
            $costofrcc = str_replace(' ', '', $valor["costofrcc"]);

            $lote = str_replace(' ', '', $valor["lote"]);
            $fvencimiento = $valor["FVencimiento"];
            $Rinvima = $valor["Rinvima"];
            $Einvima = $valor["Einvima"];
            $observacion = $valor["Observac"];

            $ventaCaja = str_replace(' ', '', $valor["ventaCaja"]);
            $ventaFrcc = str_replace(' ', '', $valor["ventaFrcc"]);

            $ventaCaja2 = str_replace(' ', '', $valor["ventaCaja2"]);
            $ventaFrcc2 = str_replace(' ', '', $valor["ventaFrcc2"]);
            $precioblister = str_replace(' ', '', $valor["precioblister"]);
            $ubicacionP = $valor["ubicacion"]; // Ya se inicializa en 'sin', pero se actualiza aquí

            $utilidadCaja2 = str_replace(' ', '', $valor["utilidadCaja2"]);
            $utilidadFrcc2 = str_replace(' ', '', $valor["utilidadFrcc2"]);
            $precioCaja3 = str_replace(' ', '', $valor["precioCaja3"]);
            $precioFrcc3 = str_replace(' ', '', $valor["precioFrcc3"]);
            $utilidadCaja3 = str_replace(' ', '', $valor["utilidadCaja3"]);
            $utilidadFrcc3 = str_replace(' ', '', $valor["utilidadFrcc3"]);

            $utilidadcaja = $valor["utilcaja"]; // Convertir a float
            $utilidadfrcc = $valor["utilifrcc"]; // Convertir a float





            if(!is_numeric($precioCaja3)){
            $precioCaja3=0;
        }
        if(!is_numeric($precioFrcc3)){
            $precioFrcc3=0;
        }
        


        if(!is_numeric($precioblister)){
            $precioblister=0;
        }



        if( $frcc==""|| $frcc==" "){
            $frcc=0;
        }
        if( $caja=="" || $caja==" "){
             $caja=0;
        }








            // Consulta para obtener datos de producto e inventario.
            // Uso de sentencias preparadas para seguridad y eficiencia.
            $consulta = "SELECT productos.factor, inventarios.inventario, inventarios.costocaja, inventarios.costopromediocaja, inventarios.pendientellegar, productos.TotalInventario, productos.CostoPromedioP 
                         FROM `productos` INNER JOIN inventarios ON productos.codigo = inventarios.codigoProd 
                         WHERE productos.codigo = ? AND inventarios.idbodega = ?";
            $stmt = $this->conectar->prepare($consulta);
           
            // 'si' indica string para codigo, integer para idbodega
            $stmt->bind_param("ss", $codigo, $bodega);
            $stmt->execute();
            $resultado = $stmt->get_result();

            // Verificar si se encontró el producto en la bodega.
            if ($fi = $resultado->fetch_object()) {
              
                $inventario = str_replace(' ', '', $fi->inventario);
                $costoactual = str_replace(' ', '', $fi->costocaja);
                $costoPromedioactual = $fi->costopromediocaja;
                $pendinteLlegar = str_replace(' ', '', $fi->pendientellegar);
                $factor = str_replace(' ', '', $fi->factor);
                $inventarioGeneral = str_replace(' ', '', $fi->TotalInventario);
                $costoPromeGeneral = str_replace(' ', '', $fi->CostoPromedioP);

               if(!is_numeric($inventarioGeneral)){
    $inventarioGeneral=0;
}

if(!is_numeric($costoPromeGeneral)){
    $costoPromeGeneral=0;
}

 if(!is_numeric($factor)){
                        $factor=0;
                    }

                  if(!is_numeric($pendinteLlegar)){
            $pendinteLlegar=0;
          }
         
  //anexar german
        if(!is_numeric($costoactual)){
            $costoactual=0;
        }

       


        if(!is_numeric($costoPromedioactual)){
            $costoPromedioactual=0;
        }
        if(!is_numeric($caja)){
            $caja=0;
        }
        if(!is_numeric($frcc)){
            $frcc=0;
        }
        if($inventario==""|| $inventario=="NULL" ||$inventario==" "){
            $inventario=0; 
        }
        if(!is_numeric($costocaja)){
            $costocaja=0;
        }
        if(!is_numeric($costofrcc)){
            $costofrcc=0;
        }
        if(!is_numeric($ventaFrcc)){
            $ventaFrcc=0;
        }

          if($costoactual==""||$costoactual==" "){
            $costoactual=0;
         }
       

         // Cálculo del costo promedio
                $valorinventarioactual = $inventario * $costoPromedioactual;
                $valointariocargue = $caja * $costocaja;
                $totalinventario = $inventario + $caja;


                if ($caja == 0 || $totalinventario == 0) {
                    $costopromedio = $costoPromedioactual;
                } else {
                    // Evitar división por cero
                    $costopromedio = round(($valorinventarioactual + $valointariocargue) / $totalinventario, 0);
                }

                $frccacaja = 0;
                $ingreso = 0;
                if ($frcc > 0 && $factor > 0) { // Asegurarse de que el factor no sea cero
                    $inventarioEnfracc = round($inventario * $factor, 0);
                    $SaldoInvenFrcc = $inventarioEnfracc + $frcc;
                    $frccacaja = round($SaldoInvenFrcc / $factor, 3);
                    $totalcaja = round($frccacaja + $caja, 3);
                    $ingreso = round(($frcc / $factor) + $caja);
                } else {
                    $totalcaja = round($inventario + $caja, 3);
                    $ingreso = round($caja);
                }

                $pedientellegaractu = $pendinteLlegar - $ingreso;
                if ($pedientellegaractu < 0) { // No debería ser negativo
                    $pedientellegaractu = 0;
                }

                // Actualizar la tabla `inventarios`.
               
           $insertar=$this->conectar->prepare( "UPDATE `inventarios`  SET `inventario`=?,
           `costocaja`=?,`costofrcc`=?,`costopromediocaja`=?,`utilidacaja`=?,`utilidafrcc`=?,
            `VentaCaja`=?, `VentaFrcc`=?, `VentaCaja2`=?, `VentaFrcc2`=?,`fechaUltimaEntrada`=?,
            `ubicacion1`=?,`pendientellegar`=?,`precioblister`=?,`utilidacaja2`=?,`utilidafrcc2`=?,`VentaCaja3`=?,
            `VentaFrcc3`=?,`utilidacaja3`=?,`utilidafrcc3`=?,`ultmaModificacion`=? WHERE codigoProd=? AND idbodega=?");
           $insertar->bind_param("sssssssssssssssssssssss",$totalcaja,$costocaja,$costofrcc,$costopromedio,
           $utilidadcaja,$utilidadfrcc,$ventaCaja,$ventaFrcc,$ventaCaja2,$ventaFrcc2,$fecha,$ubicacionP,$pedientellegaractu,$precioblister,
           $utilidadCaja2,$utilidadFrcc2,$precioCaja3,$precioFrcc3,$utilidadCaja3,$utilidadFrcc3,$_SESSION["usuario"],$codigo,$bodega);
           $actulizar= $insertar->execute();

                if (!$actulizar) {
                    throw new Exception("Error al ejecutar la actualización de inventarios para el producto {$codigo}: " . $insertar->error);
                }

                if ($preciosTodos == "si") {
                   $insertar=$this->conectar->prepare( "UPDATE `inventarios`  SET `utilidacaja`=?,`utilidafrcc`=?,
             `VentaCaja`=?, `VentaFrcc`=?, `VentaCaja2`=?, `VentaFrcc2`=?,`precioblister`=?,`utilidacaja2`=?,`utilidafrcc2`=?,`VentaCaja3`=?,
            `VentaFrcc3`=?,`utilidacaja3`=?,`utilidafrcc3`=?,`ultmaModificacion`=?  WHERE codigoProd=?");
            $insertar->bind_param("sssssssssssssss",$utilidadcaja,$utilidadfrcc,$ventaCaja,$ventaFrcc,$ventaCaja2,$ventaFrcc2,$precioblister,
            $utilidadCaja2,$utilidadFrcc2,$precioCaja3,$precioFrcc3,$utilidadCaja3,$utilidadFrcc3,$_SESSION["usuario"],$codigo);
            $actulizar= $insertar->execute(); 

                    if (!$actulizar) {
                        throw new Exception("Error al ejecutar la actualización de precios para el producto {$codigo}: " . $insertar->error);
                    }
                }

                // Actualizar `registroInvima` en la tabla `productos`.
             $insertarrr=$this->conectar->prepare( "UPDATE `productos`  SET `registroInvima`=? WHERE codigo=?  ");
           $insertarrr->bind_param("ss",$Rinvima,$codigo);
           $actulizarrr= $insertarrr->execute();
                if (!$actulizarrr) {
                    throw new Exception("Error al ejecutar la actualización de registroInvima para el producto {$codigo}: " . $insertarrr->error);
                }

                // Actualizar inventario total y costo promedio en la tabla `productos`.
                $valorInventaGeneral = round($inventarioGeneral * $costoPromeGeneral);
                $saldoGeneral = round($inventarioGeneral + $ingreso, 3);

                if ($saldoGeneral < 0) { // Asegurar que no sea negativo
                    $saldoGeneral = 0;
                }

                if ($saldoGeneral <= 0) {
                    $costopromedio = $costoPromeGeneral;
                } else {
                    // Evitar división por cero
                    $costopromedio = round(($valorInventaGeneral + $valointariocargue) / $saldoGeneral, 0);
                }

                $utlidadBlister = 0; // Según tu código, siempre 0

               $insertar=$this->conectar->prepare( "UPDATE `productos`  SET `CostoCajaP`=?,        
`CostoFrccP`=?,`CostoPromedioP`=?,`VentaCajaP`=?
,`VentaFrccP`=?,`UtilidadCajaP`=?,`UtilidadFrccP`=?
,`PrecioBlisterCaja`=?,`utilidadBlister`=?
,`TotalInventario`=?  WHERE codigo=? ");

    $insertar->bind_param("sssssssssss",$costocaja,$costofrcc,
    $costopromedio,$ventaCaja,$ventaFrcc,$utilidadcaja,$utilidadfrcc,$precioblister,$utlidadBlister,$saldoGeneral,$codigo);
    $actulizar= $insertar->execute();
                if (!$actulizar) {
                    throw new Exception("Error al ejecutar la actualización de productos (general) para el producto {$codigo}: " . $insertar->error);
                }
            } else {
                // Producto no encontrado para la bodega especificada.
                // Puedes decidir si lanzar una excepción o simplemente loguear y continuar.
                error_log("Advertencia: Producto con código '{$codigo}' no encontrado en la bodega '{$bodega}' para procesar entrada.", 3, __DIR__ . '/phperror.log');
                // Si decides que es un error crítico, descomenta la siguiente línea:
                // throw new Exception("Producto con código '{$codigo}' no encontrado en la bodega '{$bodega}'.");
            }
        } // Fin foreach

        // Si todo el bucle se completó sin errores, confirmar la transacción.
        // $this->conectar->commit();
        return true;

    } catch (Exception $e) {
        // En caso de cualquier error, revertir todas las operaciones de la transacción.
      //  $this->conectar->rollback();
        // Registrar el error para depuración.
         error_log($e->getMessage(), 3, __DIR__ . '/phperror.log');
        return false; // Indicar que la operación falló
    }
}


 public function actulizarnumersalida($numero,$bodega){
       
    // $insertarfac="UPDATE `empresa` SET `salida`=$numero where bodegaEm=$bodega";            
    // $actulizar=$this->conectar->query($insertarfac); 
         

        $insertarfac = "UPDATE `empresa` SET `salida` = `salida` + 1 WHERE bodegaEm = $bodega";
$actulizar = $this->conectar->query($insertarfac);

}

public function  consusnumerosalida($bodega){
            
    $numfact= $this->conectar->query("SELECT * FROM `empresa` where bodegaEm=$bodega"); 
    $numfactura=mysqli_fetch_object($numfact);
    $fact=$numfactura->salida;
    $numerosalida=$fact+1;
   
    return($numerosalida);
   
  
}
public function  consusnumeroentrada($bodega){
            
    $numfact= $this->conectar->query("SELECT * FROM `empresa` where bodegaEm=$bodega"); 
    $numfactura=mysqli_fetch_object($numfact);
    $fact=$numfactura->entrada;
    $numeroentrada=$fact+1;
   
    return($numeroentrada);
   
  
}
public function actulizarnumeentrada($numero,$bodega){

    $sql = "UPDATE `empresa` SET `entrada` = `entrada` + 1 WHERE `bodegaEm` = $bodega";
    $result = $this->conectar->query($sql);
    
      
//    $insertarfac="UPDATE `empresa` SET `entrada`=$numero where `bodegaEm`=$bodega";            
//    $actulizar=$this->conectar->query($insertarfac); 
   
//    $insertar=$this->conectar->prepare( "UPDATE `empresa`  SET 
//     `entrada`=? WHERE bodegaEm=? ");
//     $insertar->bind_param("ss",$numero,$bodega);
//     $actulizar= $insertar->execute();      

}

public function consultarixistencias($fila,$bodega){
    $GLOBALS["respuest"]=0;
    foreach($fila as $valor) {
        $codigo=$valor["Codigo"];
     
        $caja=str_replace(' ', '',$valor["Cantida_caja"]);
        $frcc=str_replace(' ', '',$valor["Cantida_frcc"]);
       
        $consulta="SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega";    
        $resultado=$this->conectar->query($consulta);         
        if($fi=mysqli_fetch_object($resultado)){

                                
                        $inventario=str_replace(' ', '', $fi->inventario);

                        $factor=str_replace(' ', '',$fi->factor);  
                        // $controlInventario= trim($fi->controlInventario);
                        $controlInventario = trim($fi->controlInventario ?? '0');

                        $frccacaja=0;

                        if($factor==0 && $frcc > 0){
                            $GLOBALS["respuest"]=2;
                            $GLOBALS["prod"]=$codigo;
                        }else{
                                //anexar german
                                                                            
                                if(!is_numeric($caja)){
                                    $caja=0;
                                }
                                if(!is_numeric($frcc)){
                                    $frcc=0;
                                }
                                if($inventario==""|| $inventario=="NULL"){
                                    $inventario=0; 
                                }

                                if(!is_numeric($factor)){
                                    $factor=0;
                                }
                                    
                            //fin anexar german


                                if($frcc>0){

                                  $frccacaja=round($frcc/$factor,3); 
                                  $inventarioEnfracc=round( $inventario*$factor,0);
                                  $SaldoInventario=$inventarioEnfracc-$frcc;            
                  
                                        if($SaldoInventario==0){
                                            $frccacaja=$inventario;
                                            

                                        }else{
                                            $frccacaja= round( $frcc/$factor,3);
                                        
                                        }

                                }
                                            
                        
                            }
                            // $subtocaja=round($frccacaja+(int) $caja,3);
                            $subtocaja=round($frccacaja+ $caja,3);
                            $total=round( $inventario-$subtocaja,3);   
                    if($total<0 ){
                        
                        if($controlInventario !="no") {

                            $GLOBALS["respuest"]=1;
                            $GLOBALS["prod"]=$codigo;

                        } 
                      
                    } 
        
        }else{
            $GLOBALS["respuest"]=2;
            $GLOBALS["prod"]='error en producto'.$codigo;

        }              


}

return $GLOBALS["respuest"];

}

public function consultarfactor($fila, $bodega) {
    // Definimos la ruta a tu archivo de log personalizado.
    // Esto asegura que los errores se guarden en 'phperror.log' en la misma carpeta que este script.
    $logFilePath = __DIR__ . '/phperror.log';

    // Inicializamos las variables globales según tu requerimiento.
    // 'factor' en 0 significa que no se ha encontrado ningún problema hasta ahora.
    // 'prod' almacenará el mensaje de error si se encuentra uno.
    $GLOBALS["factor"] = 0;
    $GLOBALS["prod"] = "";

    foreach ($fila as $valor) {
        // Limpiamos y convertimos las entradas a los tipos esperados para evitar errores.
        $codigo = trim($valor["Codigo"]);
        $frcc = str_replace(' ', '', $valor["Cantida_frcc"]);

        // 1. Usamos una CONSULTA PREPARADA para buscar el producto y su factor.
        // Esto es crucial para la seguridad (previene inyecciones SQL) y eficiencia.
        $stmt_select = $this->conectar->prepare("SELECT productos.factor, inventarios.cantidTraslada FROM `productos` INNER JOIN inventarios ON productos.codigo = inventarios.codigoProd WHERE productos.codigo = ? AND inventarios.idbodega = ?");

        // Verificamos si la preparación de la consulta falló.
        if (!$stmt_select) {
            $error_message = "Error al preparar la consulta SELECT en consultarfactor para el código '$codigo': " . $this->conectar->error;
            error_log($error_message, 3, $logFilePath); // Registra el error en tu log personalizado
            $GLOBALS["factor"] = 1; // Indicamos que hubo un problema
            $GLOBALS["prod"] = "Error interno del sistema para el producto: " . $codigo;
            break; // Salimos del bucle si hay un error crítico en la preparación
        }

        // Vinculamos los parámetros a la consulta preparada.
        // 's' es para string (código), 'i' es para integer (bodega).
        $stmt_select->bind_param("si", $codigo, $bodega);
        $stmt_select->execute(); // Ejecutamos la consulta
        $resultado = $stmt_select->get_result(); // Obtenemos los resultados

        // Verificamos si se encontró el producto en la base de datos.
        if ($fi = $resultado->fetch_object()) {
            // Obtenemos y aseguramos que 'factor' y 'cantidTraslada' son números.
            $factor = trim($fi->factor);
            $pendienteCOnfir = trim($fi->cantidTraslada);

            // 2. Verificamos si hay traslados pendientes si la sesión lo indica.
            if (isset($_SESSION["confirmarTraslado"]) && $_SESSION["confirmarTraslado"] == 1) {
                if ($pendienteCOnfir > 0) {
                    $GLOBALS["factor"] = 1; // Se encontró un problema
                    $GLOBALS["prod"] = $codigo . " - El producto tiene traslados pendientes por confirmar.";
                    $stmt_select->close(); // Cerramos el statement antes de salir
                    break; // Salimos del bucle inmediatamente
                }
            }

            // 3. Verificamos si hay fracciones (frcc > 0) pero el factor es cero.
            if ($frcc > 0 && $factor == 0) {
                $GLOBALS["factor"] = 1; // Se encontró un problema
                $GLOBALS["prod"] = "Advertencia: El producto " . $codigo . " tiene fracciones pero su factor es 0.";
                $stmt_select->close(); // Cerramos el statement antes de salir
                break; // Salimos del bucle inmediatamente
            }
        } else {
            // Si el producto no se encontró o no está asignado a la bodega.
            $GLOBALS["factor"] = 1; // Se encontró un problema
            $GLOBALS["prod"] = "Error: El producto " . $codigo . " no existe o no está asignado a la bodega " . $bodega . ".";
            $stmt_select->close(); // Cerramos el statement antes de salir
            break; // Salimos del bucle inmediatamente
        }
        $stmt_select->close(); // Cerramos el statement al final de la iteración si no hubo 'break'
    }

    // Devolvemos el resultado final basado en si se encontró un problema.
    if ($GLOBALS["factor"] == 1) {
        return $GLOBALS["prod"]; // Devuelve el mensaje de error específico
    } else {
        return 0; // Devuelve 0 si no se encontraron problemas
    }
}





public function  consusnumeroobs($bodega){
            
    $numfact= $this->conectar->query("SELECT * FROM `empresa` where bodegaEm=$bodega"); 
    $numfactura=mysqli_fetch_object($numfact);
    $fact=$numfactura->obs;
    $numeroobs=$fact+1;
   
    return( $numeroobs);
   
  
}
public function actulizarnumeobs($numero,$bodega){
       
    $insertarfac="UPDATE `empresa` SET `obs`=$numero where bodegaEm=$bodega";            
    $actulizar=$this->conectar->query($insertarfac); 
                 

}

public function entradaobs($fila,$bodega){

   
    foreach($fila as $valor) {
      
                                        
        $codigo=$valor["Codigo"];        
        $caja=str_replace(' ', '',$valor["Cantida_caja"]);
        $frcc=str_replace(' ', '',$valor["Cantida_frcc"]);
        

        /*
            $costocaja=$valor["costocaja"]; 
            $costofrcc=$valor["costofrcc"]; 
            $utilidadcaja=$valor["utilcaja"];
            $utilidadfrcc=$valor["utilifrcc"];
            
            if($utilidadfrcc==" "){

                $utilidadfrcc=0;
            }
            if($utilidadcaja==" "){

                $utilidadcaja=0;
            }
        */

        $consulta="SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega";   
          
        $resultado=$this->conectar->query($consulta);         
       if( $fi=mysqli_fetch_object($resultado)){  

        $inventario=str_replace(' ', '',$fi->inventario);
        $factor=str_replace(' ', '',$fi->factor);
         
        $frccacaja=0;
            if($frcc>0){
                $frccacaja=round($frcc/$factor,3);    
                
                $inventarioEnfracc=round( $inventario*$factor,0);
                $SaldoInvenFrcc=$inventarioEnfracc+$frcc; 
                $frccacaja=round($SaldoInvenFrcc/$factor,3);
                // $totalcaja=round($frccacaja+(int)$caja,3); 
                $totalcaja=round($frccacaja+$caja,3); 
                
                
                }else{
                    // $totalcaja=round($inventario+(int)$caja,3);

                    $totalcaja=round($inventario+$caja,3); 

                }
                
    
    

       // $insertar=$this->conectar->prepare( "UPDATE `productos`  SET `inventario`=?,`costocaja`=?,`costofrcc`=?,`utilidacaja`=?,`utilidafrcc`=? WHERE codigo=?");

        $insertar=$this->conectar->prepare( "UPDATE `inventarios`  SET `inventario`=? WHERE codigoProd=? and idbodega=?");
        $insertar->bind_param("sss",$totalcaja,$codigo,$bodega);
        $actulizar= $insertar->execute();
        





        // invantario tabla productos
$inventarioGeneral=str_replace(' ', '',$fi->TotalInventario);


if(!is_numeric($inventarioGeneral)){
    $inventarioGeneral=0;
}





$saldoGeneral= round($inventarioGeneral+$totalcaja,3); 

if($saldoGeneral<0 || $saldoGeneral<"0" ){
    
    $saldoGeneral=0;
}






$insertar=$this->conectar->prepare( "UPDATE `productos`  SET 
`TotalInventario`=?  WHERE codigo=? ");

    $insertar->bind_param("ss",$saldoGeneral,$codigo);
    $actulizar= $insertar->execute();


  
  
// invantario tabla productos FIN
    
        }
          
    }

    if($actulizar){
    return true;
}else{
    return false;
}

 }

 public function carteracliente($cedula,$nombre,$abono,$bodega,$usuarioA,$detalle,$movimiento){
    $fecha=date("Y-m-d");
      $consulta=$this->conectar->prepare( " INSERT INTO `carteracliente`( `cedCliente`, `Nombrec`, `abono`, `fechaAbono`,`observa`,`idbodega`,`usuario`,`carturno`,`facturaCruze`)
       VALUES (?,?,?,?,?,?,?,?,?)");
    
     $consulta->bind_param("sssssssss",$cedula,$nombre,$abono,$fecha,$detalle,$bodega,$usuarioA,$GLOBALS["turno"],$movimiento);
     $consulta->execute();
    
    
    }


}



?>