<?php
date_default_timezone_set("America/Bogota");
include("../conexion/conexion.php");

try{
    
include("../conexion/contabilidad.php");
include("../conexion/turnos.php");
$GLOBALS["respuest"]=0;
$GLOBALS["prod"]=0;

$cliente=$_POST["cliente"];
$vendedor=$_POST["vendedor"];
$total=trim($_POST["total"]);

$factura = ($_POST["factura"]);


$fecha=date('Y-m-d H:i:s');
 $exento=$_POST["exento"];
 $iva19=$_POST["iva19"];
 $iva5=$_POST["iva5"];
 $base19=$_POST["base19"];
 $base5=$_POST["base5"];
$excluido=$_POST["excluido"];
$fpago=$_POST["fpago"];//credicto porma de pago
$efecti=str_replace(' ', '',$_POST["efectivo"]);
$tcredicto=str_replace(' ', '',$_POST["tcred"]);
$tdebito=str_replace(' ', '',$_POST["tdebi"]);
$cambio=str_replace(' ', '',$_POST["devuleta"]);
$detallef=$_POST["detallef"];
$descuento=str_replace(' ', '',$_POST["descuento"]);
$cufe=$_POST["cufe"];
$sorteo=$_POST["sorteo"];

$otroiva=$_POST["otroiva"];
$baseotro=$_POST["baseotro"];

$ivaipc=$_POST["ivaipc"];
$baseipc=$_POST["baseipc"];
$vencimientoFactura=$_POST["vencimientoFactura"];

$fechaFactElectroVencime=$_POST["fechaFactElectroVencime"];
$formaPago=$_POST["formaPago"];
$medioPago=$_POST["medioPago"];
$participante=$_POST["participante"];
$tipoAtencion=$_POST["tipoAtencion"];
$propina=$_POST["propina"];


$otrosBANCO=$_POST["otrosBANCO"];
$cuentaDestino=$_POST["cuentaDestino"];




if(isset($_POST["sucursalClien"])){
    $sucursalClien=$_POST["sucursalClien"];
}else{
    $sucursalClien=0;
}


if(!is_numeric($propina)){
    $propina=0;
}
if(!is_numeric($total)){
    $total=0;
}
if(!is_numeric($cambio)){
    $cambio=0;
}

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

if(!is_numeric($tcredicto)){
    $tcredicto=0;
}
if(!is_numeric($tdebito)){
    $tdebito=0;
}

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

$TipoFactura=$_POST["tipoFactura"];
$bodega=$_POST["bodega"];
$bodegaVenta=$_POST["bodegaVenta"];
$fila =json_decode($factura,true);
$usuarioA=$_POST["usuarioA"];
$numerocotizacion=$_POST["numerocotizacion"];
validarturnoFacturacion($bodegaVenta);
turno($bodegaVenta);

$facturar=new facturacion();


$vende=$facturar->validadvendor($vendedor,$TipoFactura);

if($vende==2){
    $vendedor=0;
    $vende=1;
}

$client=$facturar->validadcliente($cliente);



$validarclientecredicto=$facturar->ventacredictocliente($cliente,$fpago);

if($GLOBALS["valorMaximoTurnoBodega"]>1){
    $valorVent=$facturar->maximoValorCaja($bodegaVenta,$turno);
    if( $valorVent>=$GLOBALS["valorMaximoTurnoBodega"])
    {

        $dat=["respueta"=>"SUPERASTE EL VALOR MAXIMO PERMITIDO PARA EL TURNO Y TIPO DE FACTURA  ","produc"=>"turno ".$turno];
        
        echo(json_encode($dat));

        die();

    }
}

// 


if($validarclientecredicto==2 && $fpago>0 && $tipoAtencion !="Convenios"){ 
    $dat=["respueta"=>"El cliente no esta habiliatdo para facturar a credicto O no tiene Cupo Disponible","produc"=>$GLOBALS["prod"]];
    echo(json_encode($dat));
    }else{

       if($tipoAtencion=="Convenios"  && $fpago>0){
           $validarclientecredicto=1;
       }


    if($client==1 && $vende==1){
      $facturar->consultarixistencias($fila,$bodega);
    
        if($GLOBALS["respuest"]==1){
            
            $dat=["respueta"=>"No se permite factura en negativo","produc"=>$GLOBALS["prod"]];
            echo(json_encode($dat));

        }else{
            if($GLOBALS["respuest"]==2){
                $dat=["respueta"=>"El producto no esta fracionado","produc"=>$GLOBALS["prod"]];
                echo(json_encode($dat));
            }else{
               $bodeEMp=$facturar->validabodega($bodega); 
               
             
            if($bodeEMp && $total > 0){

                        if($TipoFactura=="Electronica"){
                            $facturar->consusltarfacturaElectronica($bodegaVenta);
                        }else{
                            if($TipoFactura=="Pos_Elec"){
                                $facturar->consusltarfacturaPosElectro($bodegaVenta);
                                
                            }else{
                            $facturar->consusltarfactura($bodegaVenta); 
                            }
                        }

                        if($validarclientecredicto==1 && $fpago>0){
                                $facturar->actulizarsalocredictocliente($cliente,$fpago);
                                $valorcredico=$fpago;
                        } else{
                            $valorcredico=0;
                        }
                       
                                            
                          if($sorteo==1 || $sorteo=="1"){
                            $numeroSorteo="Numero Sorteo: ".$facturar->sorteos();
                          }else{
                             $numeroSorteo="";
                          }
                    
                          $puntoss=$facturar->puntos($total,$cliente);

                        
                        $respuestaa= $facturar->valorfactura( $GLOBALS["facturaBodega"],$total,$cliente,$vendedor,
                        $fecha, $exento,$iva19,$iva5, $base19,$base5,$excluido,
                         $valorcredico,$efecti,$tcredicto, $tdebito,$cambio,
                         $detallef." ".$numeroSorteo,$descuento,$TipoFactura,
                         $bodega,$cufe,$usuarioA,$GLOBALS["turno"],$otroiva,
                         $baseotro,$ivaipc,$baseipc,$vencimientoFactura,
                         $fechaFactElectroVencime,$formaPago,$medioPago,$puntoss,$tipoAtencion,$propina,$bodegaVenta,$sucursalClien,$otrosBANCO,$cuentaDestino);
                    
                            
                        
                        if($respuestaa==true){

                           

                             $facturar->facturar($fila,$GLOBALS["facturaBodega"],$vendedor,
                             $fecha,$cliente,$bodega,$usuarioA,$GLOBALS["turno"],
                             $tdebito,$valorcredico,$tcredicto,$efecti-$cambio,
                             $participante,$bodegaVenta,$sucursalClien,$otrosBANCO,$cuentaDestino);
                           
                            
                                    if($TipoFactura=="Electronica"){

                                        $facturar->actulizarfacturaElectronica($GLOBALS["numeroFacElectronico"],$bodegaVenta);

                                    }else{
                                        if($TipoFactura=="Pos_Elec"){
                                            $facturar->actulizarfacturaPosElectronica($GLOBALS["numeroFacElectronico"],$bodegaVenta);

                                        }else{
                                            $facturar->actulizarfactura($GLOBALS["numfact"],$bodegaVenta);
                                        }
                                    
                                    }
                                   
                                    $cufe=0;

                                        // Configurar un manejador global para convertir errores en excepciones
                            set_error_handler(function($severity, $message, $file, $line) {
                                throw new ErrorException($message, 0, $severity, $file, $line);
                            });

try {
    // Configuración inicial
    error_reporting(0);
    $movimiento = "venta";

    // Procesar kardex
    $facturar->kardex($fila, $movimiento, $fecha, $GLOBALS["facturaBodega"], $cliente, $bodega, $usuarioA, $GLOBALS["turno"]);

    // Borrar la mesa siempre, incluso si hay un error
    $facturar->borrarmesa($numerocotizacion, $bodega);

    // Verificar si se debe ejecutar el documento electrónico en línea
    if ($_SESSION["DocElectonicoEnlinea"] == 1) {
        $startTime = microtime(true);  // Marca el tiempo de inicio

        // Envuelve la inclusión en un try-catch adicional
        
        // Determinar qué archivo incluir según el tipo de factura
        if ($_SESSION["DocElectonicoEnlinea"] == 1) {
            $startTime = microtime(true);  // Marca el tiempo de inicio
    
            try {
                if ($TipoFactura == "Electronica") {
                    include("facturacionElectronica.php");
                } elseif ($TipoFactura == "Pos_Elec") {
                    include("posElectronico.php");
                }
            } catch (Throwable $e) {
                // Captura errores específicos del archivo incluido
                throw new Exception("Error en facturacionElectronica.php: " . $e->getMessage(), 0, $e);
            }
    
            // Verifica si han pasado más de 13 segundos
            if ((microtime(true) - $startTime) > 12) {
                throw new Exception("El tiempo de ejecución ha excedido los 10 segundos.");
            }
        }



        
    }
} catch (Exception $e) {
   
    try {
        // Captura y registro de errores
        $errorMessage = date('Y-m-d H:i:s') . " " . $usuarioA . " - Error: " . $e->getMessage() . " in " 
            . $e->getFile() . " on line " . $e->getLine() . "\n";
        // Intentar escribir el error en el archivo
        file_put_contents('mensajeError.txt', $errorMessage, FILE_APPEND);
    } catch (Exception $innerException) {
        
    }
} finally {

   // --- Garantizar salida JSON limpia siempre ---
    restore_error_handler();
  

    // Operaciones críticas que deben ejecutarse siempre
    $datos = [
        "respueta" => $GLOBALS["respuesta"] ?? 0,
        "factura" => $GLOBALS["facturaBodega"] ?? 0,
        "fech" => $fecha ?? null,
        "Rifa" => $numeroSorteo ?? 0,
        "puntos" => $puntoss ?? 0,
        "cufe" => $cufe ?? 0
    ];

    //simular espera de 40 segundos
    //  sleep(40);
    // Enviar la respuesta en formato JSON
     echo json_encode($datos);
     exit; // evita que se imprima HTML o warnings después
}

                                          




                            }else{
                                $dat=["respueta"=>"Error al facturar","produc"=>"00000"];
                            echo(json_encode($dat)); 
                            

                            }

                        }else{
                            $dat=["respueta"=>"No existe la bodega o no esta Habilitada O revise Valor Total ","produc"=>$bodega];
                            echo(json_encode($dat)); 
                        }
                
            }
        }   

 }else{
    $dat=["respueta"=>"cliente o vendedor no registrado","produc"=>$GLOBALS["prod"]];
    echo(json_encode($dat));
    
    
}

    }
}

catch (Exception $e) {
    // Crear mensaje de error detallado
    $errorMessage = date('Y-m-d H:i:s') . " - Error_ejecucion: " . $e->getMessage() . " in " . $e->getFile() . " on line " . $e->getLine() . "\n";
    
    // Guardar en archivo de log
    $logFile = 'mensajeError.txt'; // Cambia a una ubicación segura
    if (!file_put_contents($logFile, $errorMessage, FILE_APPEND)) {
        error_log("No se pudo escribir en $logFile: $errorMessage");
    }
    
    // Respuesta genérica en producción
    $dat = [
        "respueta" => "Error en ejecución Favor Enviar Imagen al administrador",
        "produc" => $errorMessage // En producción omitir detalles técnicos
    ];
    echo json_encode($dat);
}
    
class facturacion{

    function __construct()

    {
        $conn=new conexion();
        $this->conectar=$conn->conectar();
        
    
    }

    public function maximoValorCaja($bodega,$turno)
    {
        $feha1=date('Y-m-d');
        $feha2=date('Y-m-d');

        $numfact= $this->conectar->query("SELECT * FROM `empresa` where `bodegaEm`=$bodega"); 
        if( $numfactura=mysqli_fetch_object($numfact)){
          $tipofacMaxiVenta=$numfactura->tipofacMaxiVenta;
           
        }else{
            $tipofacMaxiVenta="";
        }



        $tipoFa=$tipofacMaxiVenta;

        if($tipoFa=="Electronica" ||  $tipoFa=="Pos" || $tipoFa=="Pos_Elec"){
            $sql="SELECT idbodegaF, facturno, SUM(efectivo) AS total_efectivo, SUM(devuelta) AS total_devuelta
            FROM facturas
            WHERE idbodegaF = $bodega AND facturno = '$turno'and tipoFactura='$tipoFa' and LEFT(fechaFactura,10)  BETWEEN  '$feha1' AND '$feha2'
            GROUP BY idbodegaF, facturno ";
            $sql1=$this->conectar->query($sql);
            if( $datos=mysqli_fetch_object($sql1)){
                $efectivo=$datos->total_efectivo;
                $total_devuelta=$datos->total_devuelta;
               }else{
                $efectivo=0;
                $total_devuelta=0;
               }

        }else{
            $sql="SELECT idbodegaF, facturno, SUM(efectivo) AS total_efectivo, SUM(devuelta) AS total_devuelta
            FROM facturas
            WHERE idbodegaF = $bodega AND facturno = '$turno'  and LEFT(fechaFactura,10)  BETWEEN  '$feha1' AND '$feha2'
            GROUP BY idbodegaF, facturno ";
            $sql1=$this->conectar->query($sql);
           if( $datos=mysqli_fetch_object($sql1)){
            $efectivo=$datos->total_efectivo;
            $total_devuelta=$datos->total_devuelta;
           }else{
            $efectivo=0;
            $total_devuelta=0;
           }
            
        }

     

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

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

        $valor=$efectivo-$total_devuelta;
          return  $valor;

    }
    public function puntos($valor,$cliente){

        $punto= $this->conectar->query("SELECT * FROM `funcgenerales` where idFun=2 "); 
        $puntos=mysqli_fetch_object($punto);
        $valorpun=str_replace(' ', '',$puntos->Dato1);
       
        if($valorpun>0){
              try {
                $puntoFactu=round( $valor/$valorpun);
              } catch (\Throwable $th) {
                $puntoFactu=0;
              }
           

             $clien= $this->conectar->query("SELECT  `puntos` FROM `clientes` WHERE cedula='$cliente' "); 
            $puntosAct=mysqli_fetch_object($clien);
            $valorpunAc=str_replace(' ', '',$puntosAct->puntos);

            $totalesPuntos=(int)$valorpunAc+ (int) $puntoFactu;

            $actulizarpunt="UPDATE `clientes` SET  `puntos`='$totalesPuntos' where cedula='$cliente'";            
            $actulizarPuntos=$this->conectar->query($actulizarpunt); 

            return $puntoFactu;

        }else{
            return 0;
        }

    }


    public function sorteos()
    {

        try {
            $numfact= $this->conectar->query("SELECT * FROM `funcgenerales` where idFun=1 "); 
            $numRifa=mysqli_fetch_object($numfact);
            $rifa=trim($numRifa->Rifa);
            $numrifaG=$rifa+1;
            $numrifa=$numrifaG;
          
            $numeroMaximo=9999;
           
            if($_SESSION["nitEm"]=="34065368"){
                $numeroMaximo=999;  
                
            }

            if($numrifaG>$numeroMaximo){
                $numrifa="----"; 
                
            }

            $actulizaSorteo="UPDATE `funcgenerales` SET  `Rifa`='$numrifaG' where idFun=1";            
            $actulizar=$this->conectar->query($actulizaSorteo); 
            $carat="";

            if(strlen($numrifa)==1){
                $carat="000";
            }elseif (strlen($numrifa)==2) {
                $carat="00";
            }elseif (strlen($numrifa)==3) {
                $carat="0";
            }
            return $carat.$numrifa;
          
        } catch (Exception $e) {
         
             return 0;
        }
        

    }
    public function borrarmesa($numerocotizacion,$bodega){

        // $numfact= $this->conectar->query("DELETE FROM `cotizacion` WHERE numeroCotizacion='$numerocotizacion' AND idbodegac=$bodega"); 
        $stmt = $this->conectar->prepare("DELETE FROM `cotizacion` WHERE numeroCotizacion = ? AND idbodegac = ?");
        $stmt->bind_param("si", $numerocotizacion, $bodega);
        $stmt->execute();
    }

    public function  validabodega($bodega)
    {
        $numfact= $this->conectar->query("SELECT * FROM `empresa` where `bodegaEm`=$bodega"); 
       if( $numfactura=mysqli_fetch_object($numfact)){
        // $GLOBALS["tipofacMaxiVenta"]=$numfactura->tipofacMaxiVenta;
           return true;
       }else{
        return false; 
       }
    }


    public function  consusltarfactura($bodega){
       
             $numfact= $this->conectar->query("SELECT * FROM `empresa` LEFT JOIN bodegas ON empresa.bodegaEm = bodegas.id where  `bodegaEm`=$bodega"); 
             $numfactura=mysqli_fetch_object($numfact);
             $fact=$numfactura->factura;
             $numerofactura=$fact+1;
             $pfj=trim($numfactura->Prefijo);
            
            $GLOBALS["numfact"]=$numerofactura;
            if($pfj=="" ||  $pfj==" " ||  $pfj==null){
                $GLOBALS["facturaBodega"]="B".$bodega."-".$numerofactura;
            }else{
                $GLOBALS["facturaBodega"]="B".$bodega."-".$pfj.$numerofactura;
            }
            

          
            
            
           
    }

    public function  consusltarfacturaElectronica($bodega){
            
        $numfact= $this->conectar->query("SELECT * FROM `empresa` where `bodegaEm`=$bodega"); 
        $numfactura=mysqli_fetch_object($numfact);
        $fact=$numfactura->numeroFactuElectro;
        $prefijo=$numfactura->prefijoElectro;
        $numerofactura=$prefijo.($fact+1);
        $numeroFinalF=$numfactura->NumeroFinalResolu_elect;

        if( $fact>=$numeroFinalF){

            if($numeroFinalF !="0"){
                $dat=["respueta"=>"Numeracion Agotada, Actuliza tu Resolucion pos Electronica:  ","produc"=>$numeroFinalF];
                echo(json_encode($dat));
                die();
            }
         

        }


        $GLOBALS["facturaBodega"]=$numerofactura;
        $GLOBALS["numfact"]=$numerofactura;
        $GLOBALS["numeroFacElectronico"]=$fact+1;

      
       
      
}


public function  consusltarfacturaPosElectro($bodega){
            
    $numfact= $this->conectar->query("SELECT * FROM `empresa` where `bodegaEm`=$bodega"); 
    $numfactura=mysqli_fetch_object($numfact);
    $fact=$numfactura->numeroPosE;
    $prefijo=$numfactura->PrefijoPosE;
    $numerofactura=$prefijo.($fact+1);
    $numeroFinalF=$numfactura->NumeroFinalPosE;

    if($_SESSION["activarPosElectronico"]==0){
        $dat=["respueta"=>"No esta Habilitado Para Generar Pos electronico  ","produc"=>$numeroFinalF];
        echo(json_encode($dat));
        die();
    }

    if( $fact>=$numeroFinalF ){
        if($numeroFinalF !="0"){
            $dat=["respueta"=>"Numeracion Agotada, Actuliza tu Resolucion Electronica:  ","produc"=>$numeroFinalF];
            echo(json_encode($dat));
            die();
        }
     

    }


    $GLOBALS["facturaBodega"]=$numerofactura;
    $GLOBALS["numfact"]=$numerofactura;
    $GLOBALS["numeroFacElectronico"]=$fact+1;

  
   
  
}


    public function actulizarfactura($numerofactura,$bodega){
       
            $insertarfac="UPDATE `empresa` SET `factura`='$numerofactura' where `bodegaEm`=$bodega";            
            $actulizar=$this->conectar->query($insertarfac); 
                         

    }
    public function actulizarfacturaElectronica($numerofactura,$bodega){
       
        $insertarfac="UPDATE `empresa` SET `numeroFactuElectro`='$numerofactura' where `bodegaEm`=$bodega";            
        $actulizar=$this->conectar->query($insertarfac); 
                     

}

public function actulizarfacturaPosElectronica($numerofactura,$bodega){
       
    $insertarfac="UPDATE `empresa` SET `numeroPosE`='$numerofactura' where `bodegaEm`=$bodega";            
    $actulizar=$this->conectar->query($insertarfac); 
                 

}
 public function kardex($fila,$tipo,$fecha,$numerofactura,$cliente,$bodega,$usuarioA,$turno){

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

        if(isset($valor["idvencimeinto"])){            
            $detalle=substr($valor["idvencimeinto"],0,99);
        }else{
            $detalle=0;
        }

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

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




        // if($caja>0 && $frcc==0){
        //     $valorcaja=$precio/$caja;
        // }elseif($frcc>0 && $caja==0){
        //     $valorfrcc=$precio/$frcc;
        // }

     

        $consulta="SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega ";     
        $resultado=$this->conectar->query($consulta);         
        $fi=mysqli_fetch_object($resultado);        
        
        $inventario1=$fi->inventario;
        $factor=$fi->factor;
        if($factor>0){
            $inventariofrcc=round($factor*$inventario1,0);
        }else{
            $inventariofrcc=0;  
        }
        
        


    $ejecutarr=$this->conectar->prepare("INSERT INTO `kardex`(`cliente`,`numero`,`producto`, `tipo`,
    `caja`, `frcc`, `inventarioo`, `fecha`, `inventFrcc`, `valoUnitcaja`, `valorUnifrcc`,`idbodegaK`,`usuariok`,`kturno`,`detalle` ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
    $ejecutarr->bind_param("sssssssssssssss",$cliente,$numerofactura,$codigo,$tipo,$caja,$frcc,$inventario1,$fecha,$inventariofrcc,$valorcaja,$valorfrcc,$bodega,$usuarioA,$turno,$detalle);
    $ejecutarr->execute(); 


    }
    
 }   

// public function facturar($fila,$numerofactura,$vendedor,$fecha,
// $cliente,$bodega,$usuarioA,$turno,$tarjetas=0,$credito=0,
// $trasferencias=0,$contado=0,$participante,$bodegaVenta,$sucursalClien,$otrosBANCO=0,$cuentaDestino=0){

//     $excento=0;
//     $excluido=0;
//     $base5=0;
//     $iva5=0;
//     $base19=0;
//     $iva19=0;
//     $totalcosto=0;
//     $valorMovimiento=0;
//     $otroiva=0;
//     $baseotro=0;
//     $ivaipc=0;
//     $baseipc=0;

// //costos ivas
//     $excentoCos=0;
//     $excluidoCos=0;
//     $base5Cos=0;
//     $iva5Cos=0;
//     $base19Cos=0;
//     $iva19Cos=0;

//     $otroivaCos=0;
//     $baseotroCos=0;
  
// //final costos iva

//     foreach($fila as $valor) {
//         $codigo=$valor["Codigo"];
//         $nombre=$valor["Nombre"];
//         $caja=str_replace(' ', '',$valor["Cantida_caja"]);
//         $frcc=str_replace(' ', '',$valor["Cantida_frcc"]);
//         $precio=str_replace(' ', '',$valor["precio"]);
//         $iva=str_replace(' ', '',$valor["iva"]);  
//         $tipoiva=str_replace(' ', '',$valor["tipo"]);   
//         $base=str_replace(' ', '',$valor["Base"]); 
//         $tratamiento=str_replace(' ', '',$valor["tratamiento"]);
//         $costoCaja=str_replace(' ', '',$valor["costoCaja"]);
//         $costoFrcc=str_replace(' ', '',$valor["costoFrcc"]);
//         $descuentoProd=str_replace(' ', '',$valor["Descu"]);
//         if(isset($valor["idvencimeinto"])){
//             $idvencimeinto=$valor["idvencimeinto"];
//         }else{
//             $idvencimeinto=0;
//         }

//         if($idvencimeinto==""||$idvencimeinto==" "){
//             $idvencimeinto=0;
//         }
        
       

//         if(!is_numeric($frcc)){
//             $frcc=0;
//         }
//         if(!is_numeric($caja)){
//             $caja=0;
//         }
//         if(!is_numeric($costoFrcc)){
//             $costoFrcc=0;
//         }
//         if(!is_numeric($tipoiva)){
//             $tipoiva=0;
//         }
//         if(!is_numeric($descuentoProd)){
//             $descuentoProd=0;
//         }

//    if($_SESSION["tipoIva"]==0 || $_SESSION["tipoIva"]=="0"){

//         $tipoiva=0;
//      }


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

//         // $fi=mysqli_fetch_object($resultado);        
//         // $inventario=str_replace(' ', '',$fi->inventario);
//         // $inventarioGeneral=str_replace(' ', '',$fi->TotalInventario);
//         // $factor=str_replace(' ', '',$fi->factor);
//         // $controlInventario=$fi->controlInventario;
//         // $tipoproducto=$fi->tipoProducto;
        
//         // cambio 

//         $consulta = "SELECT * FROM productos 
//         INNER JOIN inventarios 
//         ON productos.codigo = inventarios.codigoProd 
//         WHERE inventarios.codigoProd = ? AND inventarios.idbodega = ?";

//         // Preparar la consulta
//         $stmt = $this->conectar->prepare($consulta);
//         $stmt->bind_param("si", $codigo, $bodega); // "si" indica: string, integer

//         // Ejecutar la consulta
//         $stmt->execute();
//         $resultado = $stmt->get_result();

//         // Validar el resultado
//         if ($fi = $resultado->fetch_object()) {
//             $inventario = str_replace(' ', '', $fi->inventario);
//             $inventarioGeneral = str_replace(' ', '', $fi->TotalInventario);
//             $factor=str_replace(' ', '',$fi->factor);
//             $controlInventario=$fi->controlInventario;
//             $tipoproducto=$fi->tipoProducto;
//         } else {
       
//             $consulta="SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega";     
//             $resultado=$this->conectar->query($consulta); 

//             $fi=mysqli_fetch_object($resultado);        
//             $inventario=str_replace(' ', '',$fi->inventario);
//             $inventarioGeneral=str_replace(' ', '',$fi->TotalInventario);
//             $factor=str_replace(' ', '',$fi->factor);
//             $controlInventario=$fi->controlInventario;
//             $tipoproducto=$fi->tipoProducto;
//         }
// // fin cambio

        

//             if($tipoproducto=="terminado1"){
                
//                for ($i=1; $i <=$caja ; $i++) { 
//                 $this->facturarTerminados($codigo,$numerofactura,$vendedor,$fecha,$cliente,$bodega,$usuarioA,$turno,$bodegaVenta);
//                } 
                


//             }

//               $saldoFacrado=0;
//               $frccacaja=0;
//             if($frcc>0){
//                     // if($controlInventario=="no"){
//                     //     $totalcaja=$inventario;
//                     //     $saldoFacrado=$inventario;
//                     // }else{
//                     $frccacaja=round($frcc/$factor,3);        
//                     $saldoFacrado=round($frccacaja+$caja,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); 
//                     $saldoFacrado=round($caja,3);
//                 }
                
//             $ejecutar=$this->conectar->prepare( "INSERT INTO `ventas`(`factura`, `codigoProducto`, `cantCaja`,
//             `cantfrcc`, `valor`,`vendedor`,`fecha`,`cliente`,`iva`,`tipoiva`,`base`,`tratamiento`,`costoCaja`, `costoFrcc`,`descuentoUn`,`bodegaVenta`,`usuariov`,`tipoProduct`,`veturno`,`idVencimeinto`,`idparticipanteVenta`,`Bodega_Inventario`,`sucursalClinete`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
//             $ejecutar->bind_param("sssssssssssssssssssssss",$numerofactura, $codigo, $caja,$frcc,$precio,$vendedor,$fecha,$cliente,$iva,$tipoiva,$base,$tratamiento,$costoCaja,$costoFrcc,$descuentoProd,$bodegaVenta,$usuarioA,$tipoproducto,$turno,$idvencimeinto,$participante,$bodega,$sucursalClien);
//            $vend= $ejecutar->execute();  
//             if($vend){

//                 // if($controlInventario=="no"){
//                 //     $insertar=$this->conectar->prepare( "UPDATE `inventarios`  SET `fechaUltimaVenta`=? WHERE codigoProd=? AND idbodega=?");
//                 //     $insertar->bind_param("sss",$fecha,$codigo,$bodega);
//                 //     $actulizar= $insertar->execute();
//                 // }else{

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

//                     $saldoGeneral= round($inventarioGeneral-$saldoFacrado,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();
                    
//                 // }

//                 //contabilidad
              
//                 if(!is_numeric($costoCaja)){
//                     $costoCaja=0;
//                 }
//                 if(!is_numeric($costoFrcc)){
//                     $costoFrcc=0;
//                 }
//                 $totalcosto=$totalcosto+((int)$costoCaja*$caja)+((int)$costoFrcc* $frcc);     
//                 $costoPorProduc= ((int)$costoCaja*$caja)+((int)$costoFrcc* $frcc);   

//                 if(!is_numeric($costoPorProduc)){
//                     $costoPorProduc=0;
//                 }
                
//                 if(!is_numeric($iva)){
//                     $iva=0;
//                 }
//                 if(!is_numeric($base)){
//                     $base=0;
//                 }

                 
                
             

                
//                 if($tipoiva==0){
//                   $excento=$excento+$base;

//                   $excentoCos=$excentoCos+$costoPorProduc;

//                 }elseif($tipoiva==1){
//                   $excluido=$excluido+ $base;                  
//                   $excluidoCos=$excluidoCos+$costoPorProduc;
                   
        
//                 }elseif($tipoiva==5){
              

//                   $base5=$base5+ $base;
//                   $iva5=$iva5+  $iva;
//                    $base5Costo = $costoPorProduc / 1.05;
//                    $valoriva5Costo =($costoPorProduc -$base5Costo);

//                   $base5Cos=round($base5Cos+$base5Costo,2);
//                   $iva5Cos=round( $iva5Cos+$valoriva5Costo,2);

                  
//                 }elseif($tipoiva==19){
//                   $base19=$base19+  $base;
//                   $iva19=$iva19+$iva;


//                   $base19Costo = $costoPorProduc / 1.19;
//                   $valoriva19osto = ($costoPorProduc -$base19Costo);

//                   $base19Cos=round($base19Cos+$base19Costo);
//                   $iva19Cos=round($iva19Cos+ $valoriva19osto);

                
//                 }
//                 elseif($tipoiva==8){
//                     $baseipc=$baseipc+  $base;
//                     $ivaipc=$ivaipc+$iva;

                                     
                  
//                   }
//                   elseif($tipoiva==10){
//                     $baseotro=$baseotro+  $base;
//                     $otroiva=$otroiva+$iva;

//                     $base10Costo = $costoPorProduc / 1.10;
//                     $valoriva10osto = ($costoPorProduc -$base10Costo);

//                     $otroivaCos= round($otroivaCos+  $base10Costo,2);
//                     $baseotroCos=round($baseotroCos+$valoriva10osto,2);
                  
//                   }



        
                
                
//                 $valorMovimiento=$valorMovimiento+$precio;


//                 if($_SESSION["tipoIva"]==0 || $_SESSION["tipoIva"]=="0"){
//                     $excento=$valorMovimiento;
//                     $excentoCos=$totalcosto;
                   
//                 }

//                 //contabilidad


            
//             }
            
           

//             //fin  insertar productos facturado en la tabla
       
        

    
//         if($actulizar){
            
//             $GLOBALS["respuesta"]=1;
        

//         }

//     }
    
//     contabilidad($bodegaVenta,"Factura",$totalcosto,$numerofactura,
//     $cliente,0,"null",$excento,$excluido,$base19,$iva19,$base5,$iva5,
//     $fecha,$valorMovimiento,$otroiva,$baseotro,$ivaipc,$baseipc,
//     $excentoCos,$excluidoCos,$base5Cos,$iva5Cos,$base19Cos,$iva19Cos,$otroivaCos,
//     $baseotroCos,$tarjetas,$credito,$trasferencias,$contado,0,0,0,0,0,$otrosBANCO,$cuentaDestino);  


   
// }



public function facturar($fila,$numerofactura,$vendedor,$fecha,
$cliente,$bodega,$usuarioA,$turno,$tarjetas=0,$credito=0,
$trasferencias=0,$contado=0,$participante,$bodegaVenta,$sucursalClien,$otrosBANCO=0,$cuentaDestino=0){

    // Activar el reporte de errores para mysqli (lanza excepciones automáticamente)
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    try {
        $excento=0;
        $excluido=0;
        $base5=0;
        $iva5=0;
        $base19=0;
        $iva19=0;
        $totalcosto=0;
        $valorMovimiento=0;
        $otroiva=0;
        $baseotro=0;
        $ivaipc=0;
        $baseipc=0;

        //costos ivas
        $excentoCos=0;
        $excluidoCos=0;
        $base5Cos=0;
        $iva5Cos=0;
        $base19Cos=0;
        $iva19Cos=0;
        $otroivaCos=0;
        $baseotroCos=0;
      
        foreach($fila as $valor) {
            $codigo=$valor["Codigo"];
            $nombre=$valor["Nombre"];
            $caja=str_replace(' ', '',$valor["Cantida_caja"]);
            $frcc=str_replace(' ', '',$valor["Cantida_frcc"]);
            $precio=str_replace(' ', '',$valor["precio"]);
            $iva=str_replace(' ', '',$valor["iva"]);  
            $tipoiva=str_replace(' ', '',$valor["tipo"]);   
            $base=str_replace(' ', '',$valor["Base"]); 
            $tratamiento=str_replace(' ', '',$valor["tratamiento"]);
            $costoCaja=str_replace(' ', '',$valor["costoCaja"]);
            $costoFrcc=str_replace(' ', '',$valor["costoFrcc"]);
            $descuentoProd=str_replace(' ', '',$valor["Descu"]);

            if(isset($valor["idvencimeinto"])){
                $idvencimeinto=$valor["idvencimeinto"];
            }else{
                $idvencimeinto=0;
            }

            if($idvencimeinto==""||$idvencimeinto==" "){
                $idvencimeinto=0;
            }
            
            if(!is_numeric($frcc)){ $frcc=0; }
            if(!is_numeric($caja)){ $caja=0; }
            if(!is_numeric($costoFrcc)){ $costoFrcc=0; }
            if(!is_numeric($tipoiva)){ $tipoiva=0; }
            if(!is_numeric($descuentoProd)){ $descuentoProd=0; }

            if($_SESSION["tipoIva"]==0 || $_SESSION["tipoIva"]=="0"){
                $tipoiva=0;
            }

            // CONSULTA PRODUCTO E INVENTARIO
            $consulta = "SELECT * FROM productos 
            INNER JOIN inventarios 
            ON productos.codigo = inventarios.codigoProd 
            WHERE inventarios.codigoProd = ? AND inventarios.idbodega = ?";

            $stmt = $this->conectar->prepare($consulta);
            $stmt->bind_param("si", $codigo, $bodega);
            $stmt->execute();
            $resultado = $stmt->get_result();

            if ($fi = $resultado->fetch_object()) {
                $inventario = str_replace(' ', '', $fi->inventario);
                $inventarioGeneral = str_replace(' ', '', $fi->TotalInventario);
                $factor=str_replace(' ', '',$fi->factor);
                $controlInventario=$fi->controlInventario;
                $tipoproducto=$fi->tipoProducto;
            } else {
                // Fallback si falla el bind_param por alguna razón
                $consulta_legacy="SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega";     
                $resultado_legacy=$this->conectar->query($consulta_legacy); 
                $fi=mysqli_fetch_object($resultado_legacy);        
                $inventario=str_replace(' ', '',$fi->inventario);
                $inventarioGeneral=str_replace(' ', '',$fi->TotalInventario);
                $factor=str_replace(' ', '',$fi->factor);
                $controlInventario=$fi->controlInventario;
                $tipoproducto=$fi->tipoProducto;
            }

            if($tipoproducto=="terminado1"){
                for ($i=1; $i <=$caja ; $i++) { 
                    $this->facturarTerminados($codigo,$numerofactura,$vendedor,$fecha,$cliente,$bodega,$usuarioA,$turno,$bodegaVenta);
                } 
            }

            $saldoFacrado=0;
            $frccacaja=0;
            if($frcc>0){
                $frccacaja=round($frcc/$factor,3);        
                $saldoFacrado=round($frccacaja+$caja,3);
                $inventarioEnfracc=round( $inventario*$factor,0);
                $SaldoInvenFrcc=$inventarioEnfracc-$frcc; 
                $frccacaja=round($SaldoInvenFrcc/$factor,3);
                $totalcaja=round($frccacaja-$caja,3); 
            }else{
                $totalcaja=round($inventario-$caja,3); 
                $saldoFacrado=round($caja,3);
            }
                
            // INSERTAR VENTA
            $ejecutar=$this->conectar->prepare( "INSERT INTO `ventas`(`factura`, `codigoProducto`, `cantCaja`,
            `cantfrcc`, `valor`,`vendedor`,`fecha`,`cliente`,`iva`,`tipoiva`,`base`,`tratamiento`,`costoCaja`, `costoFrcc`,`descuentoUn`,`bodegaVenta`,`usuariov`,`tipoProduct`,`veturno`,`idVencimeinto`,`idparticipanteVenta`,`Bodega_Inventario`,`sucursalClinete`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            
            $ejecutar->bind_param("sssssssssssssssssssssss",$numerofactura, $codigo, $caja,$frcc,$precio,$vendedor,$fecha,$cliente,$iva,$tipoiva,$base,$tratamiento,$costoCaja,$costoFrcc,$descuentoProd,$bodegaVenta,$usuarioA,$tipoproducto,$turno,$idvencimeinto,$participante,$bodega,$sucursalClien);
            
            if($ejecutar->execute()){
                // ACTUALIZAR INVENTARIO POR BODEGA
                $insertar=$this->conectar->prepare( "UPDATE `inventarios` SET `inventario`=?, `fechaUltimaVenta`=? WHERE codigoProd=? AND idbodega=?");
                $insertar->bind_param("ssss",$totalcaja,$fecha,$codigo,$bodega);
                $insertar->execute();

                // ACTUALIZAR TOTAL INVENTARIO PRODUCTO
                $saldoGeneral= round($inventarioGeneral-$saldoFacrado,3); 
                if($saldoGeneral<0 || $saldoGeneral<"0" ){
                    $saldoGeneral=0;
                }
                $insertarProd=$this->conectar->prepare( "UPDATE `productos` SET `TotalInventario`=? WHERE codigo=? ");
                $insertarProd->bind_param("ss",$saldoGeneral,$codigo);
                $actulizar = $insertarProd->execute();

                // Lógica de Contabilidad interna
                if(!is_numeric($costoCaja)){ $costoCaja=0; }
                if(!is_numeric($costoFrcc)){ $costoFrcc=0; }
                
                $totalcosto=$totalcosto+((int)$costoCaja*$caja)+((int)$costoFrcc* $frcc);     
                $costoPorProduc= ((int)$costoCaja*$caja)+((int)$costoFrcc* $frcc);   

                if(!is_numeric($costoPorProduc)){ $costoPorProduc=0; }
                if(!is_numeric($iva)){ $iva=0; }
                if(!is_numeric($base)){ $base=0; }

                if($tipoiva==0){
                    $excento=$excento+$base;
                    $excentoCos=$excentoCos+$costoPorProduc;
                }elseif($tipoiva==1){
                    $excluido=$excluido+ $base;                  
                    $excluidoCos=$excluidoCos+$costoPorProduc;
                }elseif($tipoiva==5){
                    $base5=$base5+ $base;
                    $iva5=$iva5+  $iva;
                    $base5Costo = $costoPorProduc / 1.05;
                    $valoriva5Costo =($costoPorProduc -$base5Costo);
                    $base5Cos=round($base5Cos+$base5Costo,2);
                    $iva5Cos=round( $iva5Cos+$valoriva5Costo,2);
                }elseif($tipoiva==19){
                    $base19=$base19+  $base;
                    $iva19=$iva19+$iva;
                    $base19Costo = $costoPorProduc / 1.19;
                    $valoriva19osto = ($costoPorProduc -$base19Costo);
                    $base19Cos=round($base19Cos+$base19Costo);
                    $iva19Cos=round($iva19Cos+ $valoriva19osto);
                }elseif($tipoiva==8){
                    $baseipc=$baseipc+  $base;
                    $ivaipc=$ivaipc+$iva;
                }elseif($tipoiva==10){
                    $baseotro=$baseotro+  $base;
                    $otroiva=$otroiva+$iva;
                    $base10Costo = $costoPorProduc / 1.10;
                    $valoriva10osto = ($costoPorProduc -$base10Costo);
                    $otroivaCos= round($otroivaCos+  $base10Costo,2);
                    $baseotroCos=round($baseotroCos+$valoriva10osto,2);
                }

                $valorMovimiento=$valorMovimiento+$precio;

                if($_SESSION["tipoIva"]==0 || $_SESSION["tipoIva"]=="0"){
                    $excento=$valorMovimiento;
                    $excentoCos=$totalcosto;
                }
            }

            if(isset($actulizar) && $actulizar){
                $GLOBALS["respuesta"]=1;
            }
        }
        
        // Llamada a función contabilidad
        contabilidad($bodegaVenta,"Factura",$totalcosto,$numerofactura,
        $cliente,0,"null",$excento,$excluido,$base19,$iva19,$base5,$iva5,
        $fecha,$valorMovimiento,$otroiva,$baseotro,$ivaipc,$baseipc,
        $excentoCos,$excluidoCos,$base5Cos,$iva5Cos,$base19Cos,$iva19Cos,$otroivaCos,
        $baseotroCos,$tarjetas,$credito,$trasferencias,$contado,0,0,0,0,0,$otrosBANCO,$cuentaDestino);  

    } catch (Throwable $e) {
        // Captura el error detallado de la función facturar
        $errorMessage = date('Y-m-d H:i:s') . " " . $usuarioA . " - Error en funcion facturar productos: " . $e->getMessage() . " in " 
                    . $e->getFile() . " on line " . $e->getLine() . "\n";
        
        file_put_contents('mensajeError.txt', $errorMessage, FILE_APPEND);
    }
}

public function facturarTerminados($producto,$numerofactura,$vendedor,$fecha,$cliente,$bodega,$usuarioA,$turno,$bodegaVenta){

    $validar=$this->conectar->query(" SELECT * FROM `terminado1` WHERE  codigoProdutPadre='$producto' "); 
          
    $fila=$validar->fetch_all(MYSQLI_ASSOC);
   
 
      if (count($fila) > 0) {


    foreach($fila as $key => $valor) {

        

        $codigo=$valor["codigot"];
        $nombre=$valor["nombret"];
        $caja=str_replace(' ', '',$valor["cajat"]);
        $frcc=str_replace(' ', '',$valor["frcct"]);


        $consulta="SELECT * FROM `productos` INNER JOIN inventarios on productos.codigo=inventarios.codigoProd where codigo ='$codigo' AND idbodega=$bodega ";     
        $resultado=$this->conectar->query($consulta);         
        $fi=mysqli_fetch_object($resultado);        
        $inventario=trim($fi->inventario);
        $factor=str_replace(' ', '',$fi->factor);
        $controlInventario=$fi->controlInventario;
        $tipoproducto=$fi->tipoProducto;

        $inventarioGeneral=str_replace(' ', '',$fi->TotalInventario);
  
        if($tipoproducto=="hibrido") {
            $preciocaja=0;
            $preciofrcc=0;
        }else{

            $preciocaja=0;
            $preciofrcc=0;
            // $preciocaja=(int)$fi->VentaCaja;
            // $preciofrcc=(int)$fi->VentaFrcc;
        }
        

       


        $precio=($caja*$preciocaja)+($frcc*$preciofrcc);
        $iva=0;  
        $tipoiva=0;   
        $base=0; 
        $tratamiento=0;

        // $costoCaja=trim($fi->costocaja);
        // $costoFrcc=trim($fi->costofrcc);

        $costoCaja=0;
        $costoFrcc=0;
       

        $descuentoProd=0;

        if(!is_numeric($frcc)){
            $frcc=0;
        }
        if(!is_numeric($caja)){
            $caja=0;
        }
        if(!is_numeric($costoFrcc)){
            $costoFrcc=0;
        }
        if(!is_numeric($tipoiva)){
            $tipoiva=0;
        }
        if(!is_numeric($descuentoProd)){
            $descuentoProd=0;
        }

        
        $frccacaja=0;
            if($frcc>0){
                $frccacaja=round($frcc/$factor,3);        
                $saldoFacrado=round($frccacaja+$caja,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);
                    $saldoFacrado=round($caja,3);
                }
     
            $ejecutar=$this->conectar->prepare( "INSERT INTO `ventas`(`factura`, `codigoProducto`, `cantCaja`,
            `cantfrcc`, `valor`,`vendedor`,`fecha`,`cliente`,`iva`,`tipoiva`,`base`,`tratamiento`,`costoCaja`, `costoFrcc`,`descuentoUn`,`bodegaVenta`,`usuariov`,`tipoProduct`,`veturno`,`Bodega_Inventario`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            $ejecutar->bind_param("ssssssssssssssssssss",$numerofactura, $codigo, $caja,$frcc,$precio,$vendedor,$fecha,$cliente,$iva,$tipoiva,$base,$tratamiento,$costoCaja,$costoFrcc,$descuentoProd,$bodegaVenta,$usuarioA,$tipoproducto,$turno,$bodega);
           $vend= $ejecutar->execute();  
            if($vend){

                // if($controlInventario=="no"){
                //     $insertar=$this->conectar->prepare( "UPDATE `inventarios`  SET `fechaUltimaVenta`=? WHERE codigoProd=? AND idbodega=?");
                //     $insertar->bind_param("sss",$fecha,$codigo,$bodega);
                //     $actulizar= $insertar->execute();
                // }else{
                    $insertar=$this->conectar->prepare( "UPDATE `inventarios`  SET `inventario`=?, `fechaUltimaVenta`=? WHERE codigoProd=? AND idbodega=?");
                    $insertar->bind_param("ssss",$totalcaja,$fecha,$codigo,$bodega);
                    $actulizar= $insertar->execute();


                    $tipo="VentaT";
                    $ejecutarr=$this->conectar->prepare("INSERT INTO `kardex`(`cliente`,`numero`,`producto`, `tipo`,
                    `caja`, `frcc`, `inventarioo`, `fecha`, `inventFrcc`, `valoUnitcaja`, `valorUnifrcc`,`idbodegaK`,`usuariok`,`kturno` ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
                    $ejecutarr->bind_param("ssssssssssssss",$cliente,$numerofactura,$codigo,$tipo,$caja,$frcc,$totalcaja,$fecha,$SaldoInvenFrcc,$preciocaja,$preciofrcc,$bodega,$usuarioA,$turno);
                    $ejecutarr->execute(); 


                    
                    $saldoGeneral= round($inventarioGeneral-$saldoFacrado,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();

                // }

                   

            
            }
            
           

            //fin  insertar productos facturado en la tabla
       
        

    
        if($actulizar){
            
            $GLOBALS["respuesta"]=1;
        

        }

    }

      }
   
}

// public function valorfactura($numerofactura,$precio,$cliente,$vendedor,$fecha,
//  $exento,$iva19,$iva5, $base19,$base5,$excluido,$valorcredict,$efecti,$tcredicto,
//   $tdebito,$cambio,$detallef,$descuento,$TipoFactura,$bodega,$cufe,$usuarioA,
//   $turno,$otroiva,$baseotro,$ivaipc,$baseipc,$vencimientoFactura,$fechaFactElectroVencime,
//   $formaPago,$medioPago,$puntoss,$tipoAtencion,$propina,$bodegaVenta,$sucursalClien,$otrosBANCO=0,$cuentaDestino=0){
//        //anexar german
       

//         if(!is_numeric($valorcredict)){
//             $valorcredict=0;
//         }
//         if(!is_numeric($efecti)){
//             $efecti=0;
//         }

//         if(!is_numeric($tcredicto)){
//             $tcredicto=0;
//         }
//         if(!is_numeric($tdebito)){
//             $tdebito=0;
//         }
//          if(!is_numeric($otrosBANCO)){
//             $otrosBANCO=0;
//         }

//         $tdebito=$tdebito+$otrosBANCO;

//         if($valorcredict==0 && $efecti==0 && $tcredicto==0 && $tdebito==0){
//             $efecti=$precio;
//             }  
// $posEle=0;
            
//             if($TipoFactura=="Pos_Elec"){
//                 $TipoFactura="Electronica";
//                 $posEle=1;
//             }


//             // $fechaFactElectroVencime,$formaPago,$medioPago 
//     //fin anexar german
    
// $estadof="PE";
//     $ejecutarr=$this->conectar->prepare( "INSERT INTO `facturas`( `factura`,`valor`,`cliente`,
//      `fechaFactura`,`vendedor`,`iva5`,`iva19`,`base5`,`base19`,`excento`,
//      `excluido`,`ventCredicto`,`efectivo`, `tcredicto`, `tdebito`,
//      `devuelta`,`detallef`,`descuento`,`tipoFactura`,`idbodegaF`,`cufe`,
//      `usuariof`,`facturno`,`ivaipc`, `baseipc`, `ivaotro`, `baseotro`,`saldoPendiente`,
//      `estadof`,`diasVencimiento`,`F.Pago_Electro`, `Fecha_Venci_Electro`, `M.Pago_Electro`,`PuntosFact`,`tipoAtencion`,`propina`,`bodegaInventario`,`Pos_Electronico`,`sucursalFacClient`,`pagosDinamicos`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
//     $ejecutarr->bind_param("ssssssssssssssssssssssssssssssssssssssss",$numerofactura, $precio,
//     $cliente,$fecha,$vendedor,$iva5,$iva19,$base5,$base19,$exento,$excluido,
//     $valorcredict, $efecti,$tcredicto, $tdebito,$cambio,$detallef,$descuento,
//     $TipoFactura,$bodegaVenta,$cufe,$usuarioA,$turno,$ivaipc,$baseipc,$otroiva,
//     $baseotro,$valorcredict,$estadof,$vencimientoFactura,$formaPago,$fechaFactElectroVencime,$medioPago,$puntoss,$tipoAtencion,$propina,$bodega,$posEle,$sucursalClien,$cuentaDestino);
//     $ejecute= $ejecutarr->execute();  
    
    
   
   
  


// $efect=0;
// $bancos=0;
// if($efecti>0){
//     $efect=$efecti-$cambio;
// }
// if($tcredicto>0 || $tdebito>0){
//     $bancos= $tcredicto+ $tdebito;
// }

//     CajaMayor("Factura", $detallef, $usuarioA,$bodega,$turno, $numerofactura,
//     $fecha,$efect,$tdebito,"suma",$cliente,$tcredicto);




//     if($ejecute){
        
//         return true;
     
// }else{
   
    
//     return false;
// }


  
// }





public function valorfactura($numerofactura,$precio,$cliente,$vendedor,$fecha,
 $exento,$iva19,$iva5, $base19,$base5,$excluido,$valorcredict,$efecti,$tcredicto,
  $tdebito,$cambio,$detallef,$descuento,$TipoFactura,$bodega,$cufe,$usuarioA,
  $turno,$otroiva,$baseotro,$ivaipc,$baseipc,$vencimientoFactura,$fechaFactElectroVencime,
  $formaPago,$medioPago,$puntoss,$tipoAtencion,$propina,$bodegaVenta,$sucursalClien,$otrosBANCO=0,$cuentaDestino=0){

    // Esto hace que los errores de MySQL se puedan capturar
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    try {
        // --- TU LÓGICA ORIGINAL ---
        if(!is_numeric($valorcredict)){
            $valorcredict=0;
        }
        if(!is_numeric($efecti)){
            $efecti=0;
        }

        if(!is_numeric($tcredicto)){
            $tcredicto=0;
        }
        if(!is_numeric($tdebito)){
            $tdebito=0;
        }
        if(!is_numeric($otrosBANCO)){
            $otrosBANCO=0;
        }

        $tdebito=$tdebito+$otrosBANCO;

        if($valorcredict==0 && $efecti==0 && $tcredicto==0 && $tdebito==0){
            $efecti=$precio;
        }  
        
        $posEle=0;
        if($TipoFactura=="Pos_Elec"){
            $TipoFactura="Electronica";
            $posEle=1;
        }

        $estadof="PE";

        // --- TU INSERCIÓN ORIGINAL ---
        $ejecutarr=$this->conectar->prepare( "INSERT INTO `facturas`( `factura`,`valor`,`cliente`,
         `fechaFactura`,`vendedor`,`iva5`,`iva19`,`base5`,`base19`,`excento`,
         `excluido`,`ventCredicto`,`efectivo`, `tcredicto`, `tdebito`,
         `devuelta`,`detallef`,`descuento`,`tipoFactura`,`idbodegaF`,`cufe`,
         `usuariof`,`facturno`,`ivaipc`, `baseipc`, `ivaotro`, `baseotro`,`saldoPendiente`,
         `estadof`,`diasVencimiento`,`F.Pago_Electro`, `Fecha_Venci_Electro`, `M.Pago_Electro`,`PuntosFact`,`tipoAtencion`,`propina`,`bodegaInventario`,`Pos_Electronico`,`sucursalFacClient`,`pagosDinamicos`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
        
        $ejecutarr->bind_param("ssssssssssssssssssssssssssssssssssssssss",$numerofactura, $precio,
        $cliente,$fecha,$vendedor,$iva5,$iva19,$base5,$base19,$exento,$excluido,
        $valorcredict, $efecti,$tcredicto, $tdebito,$cambio,$detallef,$descuento,
        $TipoFactura,$bodegaVenta,$cufe,$usuarioA,$turno,$ivaipc,$baseipc,$otroiva,
        $baseotro,$valorcredict,$estadof,$vencimientoFactura,$formaPago,$fechaFactElectroVencime,$medioPago,$puntoss,$tipoAtencion,$propina,$bodega,$posEle,$sucursalClien,$cuentaDestino);
        
        $ejecute = $ejecutarr->execute();  

        // --- TU LÓGICA DE CAJA MAYOR ORIGINAL ---
        $efect=0;
        $bancos=0;
        if($efecti>0){
            $efect=$efecti-$cambio;
        }
        if($tcredicto>0 || $tdebito>0){
            $bancos= $tcredicto+ $tdebito;
        }

        CajaMayor("Factura", $detallef, $usuarioA,$bodega,$turno, $numerofactura,
        $fecha,$efect,$tdebito,"suma",$cliente,$tcredicto);

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

    } catch (Throwable $e) {
        // Esto captura CUALQUIER error de PHP o SQL que antes mataba el proceso
        $errorMessage = date('Y-m-d H:i:s') . " [ERROR CRÍTICO] " . $usuarioA . " - Factura: " . $numerofactura . " - Mensaje: " . $e->getMessage() . " en " . $e->getFile() . " Lína: " . $e->getLine() . "\n";
        file_put_contents('mensajeError.txt', $errorMessage, FILE_APPEND);
        return false;
    }
}










public function validarterminados($codigop,$bodega,$cajaFac){
    //unicio terminados
    if(!is_numeric($cajaFac)){
        $cajaFac=0;
    }
        $validar=$this->conectar->query(" SELECT * FROM `terminado1` WHERE  codigoProdutPadre='$codigop' "); 
          
         $fila=$validar->fetch_all(MYSQLI_ASSOC);
     
   
        if (count($fila) > 0) {
            //  json_encode($fila);
            
            foreach ($fila as $key => $valor) {
             
                //  $codigo=$valor->codigot;
                // $nombre=$valor->nombret;
                // $caja=$valor->cajat;
                // $frcc=$valor->frcct;                 
               
                $codigo=$valor["codigot"];
                $nombre=$valor["nombret"];
                $caja=str_replace(' ', '',$valor["cajat"])*$cajaFac;
                $frcc=str_replace(' ', '',$valor["frcct"]);
                

                $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)){ 
                    
                          
                        
                             $controlInventario=$fi->controlInventario;
                             $tipoProducto=$fi->tipoProducto;
                
                            if($tipoProducto=="hibrido"|| $tipoProducto=="Fabricacion"  ){

                                

                            }else{
                                $GLOBALS["respuest"]=1;
                                $GLOBALS["prod"]=$codigo." "."El producto Debe ser de tipo Fabricacion o hibrido";
                            }
        
                                if($controlInventario=="no"){
                                   
                                }else{
                                    


                                        $inventario=str_replace(' ', '', $fi->inventario);
                                        $factor=str_replace(' ', '',$fi->factor);   
                                        
                                        $frccacaja=0;
        
                                        if($factor==0 && $frcc > 0){
                                            $GLOBALS["respuest"]=2;
                                            $GLOBALS["prod"]=$codigo." ".$nombre;
                                            break;
                                        }else{
                                                if($frcc>0){
                                                
        
        
                                                $inventarioEnfracc=round( $inventario*$factor,0);
                                                $SaldoInventario=$inventarioEnfracc-$frcc;            
                                                
                                                if($SaldoInventario==0){
                                                    $frccacaja=$inventario;
                                                    
        
                                                }else{
                                                    $frccacaja= round( $frcc/$factor,3);
                                                
                                                }
                                                
        
                                                
                                                }
                                            
                                                
                                        
                                            }
                                            // $subtocaja=$frccacaja+(int)$caja;
                                            $subtocaja=$frccacaja+$caja;
        
                                            $inventariored=round($inventario,3);
        
                                            $total=round($inventariored-$subtocaja,3);  
        
                                        
                                        
        
                                            // if( $total == 0.001 || $total == 0.002 || $total == 0.003 || $total == 0.004 || $total == 0.005 || $total == 0.006 || $total == 0.007 || $total == 0.008 || $total == 0.009 || $total== -0.001 || $total== -0.002 || $total== -0.003 || $total== -0.004 || $total== -0.005 || $total== -0.006 || $total== -0.007 || $total== -0.008 || $total== -0.009) {
                                            //     $total=0;
                                            // }
        
        
                                    if($total<0){
                                            
                                        $GLOBALS["respuest"]=1;//1
                                        $GLOBALS["prod"]=$codigo." ".$nombre;
                                    break;
                                    } 
                        }
                    
            
            }else{
                        $GLOBALS["respuest"]=1;//1
                        $GLOBALS["prod"]=$codigo." ".$nombre;
                        break;
                }    
        
        }//fin ciclo

        }
     
//fin terminados
}

public function consultarixistencias($fila,$bodega){
    
    foreach($fila as $valor) {
        
        $codigo=$valor["Codigo"];
        $nombre=$valor["Nombre"];
        $caja=str_replace(' ', '',$valor["Cantida_caja"]);
        $frcc=str_replace(' ', '',$valor["Cantida_frcc"]);
        $precio=str_replace(' ', '',$valor["precio"]); 

        $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)){ 

                  $tipoProducto=$fi->tipoProducto;
                
                  if($tipoProducto=="terminado1"){
                    $this->validarterminados($codigo,$bodega,$caja);
                  }else{
                    if($tipoProducto=="Fabricacion"){
                        $GLOBALS["respuest"]=1;
                        $GLOBALS["prod"]=$codigo." "."El producto Debe ser  De un Tipo Diferente A Fabricacion. ";
                      }
                    
                  }
                  
            if($GLOBALS["respuest"]>=1){

                break;

            }else{

                if($_SESSION["confirmarTraslado"]==1){
                    $pendienteCOnfir=$fi->cantidTraslada;
                    if($pendienteCOnfir>0){
                        $GLOBALS["respuest"]=1;
                        $GLOBALS["prod"]=$codigo." "."El producto Tiene traslados Pendientes por confirmar";
                        break;
                    }
                }



                     $controlInventario=$fi->controlInventario;

                        if($controlInventario=="no"){
                            


                        }else{

                                $inventario= $fi->inventario;
                                $factor=$fi->factor;   
                                
                                $frccacaja=0;

                                if($factor==0 && $frcc > 0){
                                    $GLOBALS["respuest"]=2;
                                    $GLOBALS["prod"]=$codigo." ".$nombre;
                                    break;
                                }else{
                                        if($frcc>0){
                                        


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

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

                                        
                                        }
                                    
                                        
                                
                                    }
                                    // $subtocaja=$frccacaja+(int)$caja;

                                    $subtocaja=$frccacaja+$caja;

                                    $inventariored=round($inventario,3);

                                    $total=round($inventariored-$subtocaja,3);  

                                
                                

                                    // if( $total == 0.001 || $total == 0.002 || $total == 0.003 || $total == 0.004 || $total == 0.005 || $total == 0.006 || $total == 0.007 || $total == 0.008 || $total == 0.009 || $total== -0.001 || $total== -0.002 || $total== -0.003 || $total== -0.004 || $total== -0.005 || $total== -0.006 || $total== -0.007 || $total== -0.008 || $total== -0.009) {
                                    //     $total=0;
                                    // }


                            if($total<0){
                                    
                                $GLOBALS["respuest"]=1;//1
                                $GLOBALS["prod"]=$codigo." ".$nombre;
                            break;
                            } 
                }
            }
            
    
    }else{
                $GLOBALS["respuest"]=1;//1
                $GLOBALS["prod"]=$codigo." ".$nombre;
                break;
        }    

}//fin ciclo


}
public function validadvendor($id,$TipoFactura){

    $consulta="select * from vendedores where id='$id'";     
    $resultado=$this->conectar->query($consulta);
    if( $fila=mysqli_fetch_object($resultado)){     
     
       return 1;
        

    }else{

        if ($TipoFactura=="Electronica") {
            return 2;
        }

    }

}

function validadcliente($id){
  
    $consulta="select * from clientes where cedula='$id'";     
    $resultado=$this->conectar->query($consulta);

     if($fila=mysqli_fetch_object($resultado)){
       
       return 1;

    }
      

}


function ventacredictocliente($id,$total){
  
    $consulta="select * from clientes where cedula='$id'";     
    $resultado=$this->conectar->query($consulta);

     if($fila=mysqli_fetch_object($resultado)){
       $activo=$fila->credicto;
       $cupo=str_replace(' ', '',$fila->cupo);
       $credValor=str_replace(' ', '',$fila->credValor);

       if(!is_numeric($credValor)){
        $credValor=0;
    }
    if(!is_numeric($cupo)){
        $cupo=0;
    }

       if($activo==1){
        $diferencia=(int)$cupo-((int)$total+$credValor);
        if($diferencia<0){
            return 2;
        }else{
            return 1;  
        }

       
       }else{
           return 2;
       }
       

    }  
      

}
function actulizarsalocredictocliente($id,$valor){
    $consulta1="select * from clientes where cedula='$id'";     
    $resultado1=$this->conectar->query($consulta1);

     $fila=mysqli_fetch_object($resultado1);
     $valoract=$fila->credValor;
     

    $total=$valoract+$valor;
    

    $consulta="UPDATE `clientes` SET `credValor`='$total' where cedula='$id'";     
    $resultado=$this->conectar->query($consulta);

     if($resultado){
      return 1;
       

    }  
      

}








}
     










?>