<?php

namespace App\Models;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Libreria;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Config;

class CXC
{
    public function __construct() {
        $selectedDatabase = Session::get('selected_database', 'mysql');
        Config::set('database.default', $selectedDatabase);
    }

    public function getLineaCred($idcliente,$dbnomina){
        $result = DB::table('con_cxccliente')
                    ->select(DB::raw('con_cxccliente.*,con_cxccliente.id_tpv_vendedor as idvendedor,pempleado.nombre as vendedor'))
                    ->leftJoin('con_cxcformaspago','con_cxccliente.plazomaximo','=','con_cxcformaspago.id')
                    ->leftJoin($dbnomina.'.pempleado','con_cxccliente.id_tpv_vendedor','=','pempleado.nip')
                    ->where('con_cxccliente.id_tpv_cliente','=',$idcliente)
                    ->whereNotIn('con_cxccliente.status',[99])
                    ->get();

        $amorti = DB::table('con_cxcamortizacion')
                    ->join('con_cxcdocto','con_cxcamortizacion.id_con_cxcdocto','=','con_cxcdocto.id')
                    ->join('con_cxccliente','con_cxcdocto.id_con_cxccliente','=','con_cxccliente.id')
                    ->where('con_cxccliente.id_tpv_cliente','=',$idcliente)
                    ->whereIn('con_cxcamortizacion.status', [1,2])
                    ->where('con_cxcdocto.status','!=', 99)
                    ->get();

        $desfazados = DB::table('con_cxcamortizacion')
                    ->select(DB::raw('con_cxcamortizacion.*, DATEDIFF(con_cxcamortizacion.fecpago, con_cxcamortizacion.fecfija) AS diferencia_dias'))
                    ->join('con_cxcdocto','con_cxcamortizacion.id_con_cxcdocto','=','con_cxcdocto.id')
                    ->join('con_cxccliente','con_cxcdocto.id_con_cxccliente','=','con_cxccliente.id')
                    ->where('con_cxccliente.id_tpv_cliente','=',$idcliente)
                    ->whereIn('con_cxcamortizacion.status', [2])
                    ->where('con_cxcdocto.status','!=', 99)
                    ->where('con_cxcamortizacion.fecpago', '>', 'con_cxcamortizacion.fecfija')
                    ->having('diferencia_dias', '>', 0)
                    ->orderBy('diferencia_dias', 'DESC')
                    ->get();
        //dd($idcliente);
        
        if(count($result)>0)
            $result[0]->totalAmortizaciones = count($amorti);
        
        if(count($desfazados)>0) {
            $result[0]->desfazados = count($desfazados);
            $result[0]->diasRetraso = $desfazados[0]->diferencia_dias;
        }
       
        return $result;
    }
    
    public function getLinea($idcliente,$dbnomina){
        $result = DB::table('con_cxccliente')
                    ->select(DB::raw('con_cxccliente.*,con_cxccliente.id_tpv_vendedor as idvendedor,pempleado.nombre as vendedor'))
                    ->leftJoin('con_cxcformaspago','con_cxccliente.plazomaximo','=','con_cxcformaspago.id')
                    ->leftJoin($dbnomina.'.pempleado','con_cxccliente.id_tpv_vendedor','=','pempleado.nip')
                    ->where('con_cxccliente.id_tpv_cliente','=',$idcliente)
                    ->whereNotIn('con_cxccliente.status',[0,99])
                    ->get();
       
        //dd($result);  
       
        return $result;
    }
        
    public function getDatos($idcliente){
        $result = DB::table('tpv_cliente')
                    ->select(DB::raw('tpv_cliente.*,
                                      sys_persona.nombre as nombre,
                                      sys_persona.clavelector,
                                      sys_persona.rfc as rfc,
                                      sys_persona.curp as curp,
                                      sys_persona.telefono as telefono,
                                      sys_persona.email as email,
                                      sys_persona.id_sat_usocfdi as usocfdi,
                                      sys_persona.id_sat_regimenfiscal as regimenfiscal,
                                      sys_direccion.calle as calle,
                                      sys_direccion.numexterior as numext,
                                      sys_direccion.numinterior as numint,
                                      sys_direccion.cp as cp,
                                      sys_direccion.colonia as colonia,
                                      sys_direccion.municipio as municipio,
                                      sys_direccion.estado as estado,
                                      con_cxcsolicitud.status as statusSolicitud'))
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('sys_direccion','tpv_cliente.id_sys_direccion','=','sys_direccion.id')
                    ->leftjoin('con_cxcsolicitud','tpv_cliente.id','=','con_cxcsolicitud.id_tpv_cliente')
                    ->where('tpv_cliente.id',$idcliente)
                    ->first();
       
        return $result;
    }
        
    public function checkhistorial($idcliente){
        $result = DB::table('tpv_pedido')
                    ->join('tpv_pedidodetalle','tpv_pedido.id','=','tpv_pedidodetalle.id_tpv_pedido')
                    ->where('tpv_pedido.id_tpv_cliente',$idcliente)
                    ->whereRaw('tpv_pedidodetalle.id_tpv_articuloalmacen IS NULL')
                    ->whereRaw('tpv_pedidodetalle.id_tpv_articuloprecio IS NULL')
                    ->where('tpv_pedidodetalle.id_tpv_vendedor',23)
                    ->groupBy('tpv_pedido.id')
                    ->count();
          
        return $result;
    }

    public function getAnalisis($id){
        $cxc = DB::table('con_cxcsolicitud')
                    ->where('id','=',$id)
                    ->first();
        if(isset($cxc->id)){
            $facs = DB::table('con_cxcdocto')
                        ->join('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                        ->where('tpv_pedido.id_tpv_cliente',$cxc->id_tpv_cliente)
                        ->count();
            if($facs>0){
                return 'Cliente con poco tiempo para generar análisis.';
            }else{
                return 'Cliente sin movimientos para generar análisis.';
            }
        }else{
            return 'No se encontro información de solicitud de este cliente.';
        }
    } 

    public function getLineaCredito($idcliente){
        $result = DB::table('con_cxccliente')
                    ->where('id_tpv_cliente','=',$idcliente)
                    ->whereNotIn('status',[0,99])
                    ->get();

        return $result;
    } 

    public function actualizaLineaCredito($row){
        $lib = new Libreria;
        $result = DB::table('con_cxccliente')
            ->where('id_tpv_cliente',$row->id)
            ->where('status',1)
            ->update(
                [
                    'limiteinferior'=>$row->limiteinferior,
                    'limitesuperior'=>$row->limitesuperior,
                    'fecalta'=>$lib->fechaFormat($row->fecalta,'H2M'),
                    'feccorte'=>strlen($row->feccorte)==10?$lib->fechaFormat($row->feccorte,'H2M'):'',
                    'fecpago'=>strlen($row->fecpago)==10?$lib->fechaFormat($row->fecpago,'H2M'):'',
                    'fecvigencia'=>$lib->fechaFormat($row->fecvigencia,'H2M'),
                    'plazomaximo'=>$row->plazomaximo,
                    'limitediario'=>$row->limitediario,
                    'limitemensual'=>$row->limitemensual,
                    'limiteanual'=>$row->limiteanual,
                    'id_tpv_vendedor'=>$row->idvendedor
                ]
            );
                    
        return $result;
    }   

    public function getCXCFormasPago($max){
        $result = DB::table('con_cxcformaspago')
                    ->whereNotIn('status',[0,99])
                    ->where('tipo', 'CREDITO')
                    ->where('id','<=',$max)
                    ->orderBy('posicion')
                    ->get();
        //dd($result);
        return $result;
    } 

    public function getCXCFormasPagoContado(){
        $result = DB::table('con_cxcformaspago')
                    ->whereNotIn('status',[0,99])
                    ->where('tipo', 'CONTADO')
                    ->get();
                    
        return $result;
    } 

    public function getPeriodicidadPago(){
        $result = DB::table('cat_periodicidadpago')
                    ->where('status',1)
                    ->get();
                    
        return $result;
    }

    public function tipoSeleccion($empresa){
        $result = DB::table('sys_empresa')
                    ->where('id',$empresa)
                    ->where('status',1)
                    ->first();
        if(isset($result->tiposelectcxc)){
            return $result->tiposelectcxc;
        }else{
            return 1;
        }
    }

    public function getDoctos($idcliente){
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw("con_cxcamortizacion.*,
                                    con_cxccliente.id as id_con_cxccliente,
                                    CONCAT(tpv_pedido.serie,tpv_pedido.folio) as numero,
                                    tpv_pedido.observaciones as observaciones,
                                    tpv_pedido.id_tpv_vendedor as idvendedor,
                                    tpv_pedido.id as id_tpv_pedido,
                                    tpv_pedido.status as statusPedido,
                                    IFNULL(CONCAT(tpv_factura.serie,tpv_factura.folio), 'MACRO') as factura"))
                    ->join('con_cxcdocto','con_cxcamortizacion.id_con_cxcdocto','=','con_cxcdocto.id')
                    ->leftjoin('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                    ->join('con_cxccliente','con_cxcdocto.id_con_cxccliente','=','con_cxccliente.id')
                    //->leftjoin('tpv_factura','tpv_pedido.id','=','tpv_factura.id_tpv_pedido')
                    ->leftjoin('tpv_factura', function($join)
                    {
                        $join->on('tpv_pedido.id', '=', 'tpv_factura.id_tpv_pedido')
                            ->where('tpv_factura.status', '<>', 99);
                    })
                    ->where('con_cxccliente.id_tpv_cliente','=',$idcliente)
                    ->where('con_cxccliente.status','<>',99)
                    ->where('con_cxcdocto.status','=',1)
                    ->where('con_cxcamortizacion.status','=',1)
                    ->orderBy('con_cxcamortizacion.fecfija', 'asc')
                    ->get();
        //dd($result,$idcliente);  
        return $result;
    }

    public function getDoctosRemision($idcliente,$idpedido){
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw('con_cxcamortizacion.*,
                                      CONCAT(tpv_pedido.serie,tpv_pedido.folio) as numero,
                                      tpv_pedido.observaciones as observaciones,
                                      tpv_pedido.id_tpv_vendedor as idvendedor'))
                    ->join('con_cxcdocto','con_cxcamortizacion.id_con_cxcdocto','=','con_cxcdocto.id')
                    ->leftjoin('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                    ->join('con_cxccliente','con_cxcdocto.id_con_cxccliente','=','con_cxccliente.id')
                    ->where('con_cxccliente.id_tpv_cliente','=',$idcliente)
                    ->where('con_cxcdocto.id_tpv_pedido', '=', $idpedido)
                    ->where('con_cxccliente.status','<>',99)
                    ->where('con_cxcdocto.status','=',1)
                    ->where('con_cxcamortizacion.status','=',1)
                    ->get();
                    
        return $result;
    }

    public function getMovimientos($idcliente,$fecini,$fecfin,$dbnomina){
        $result1 = DB::table('con_cxcdocto')
                    ->select(DB::raw("CONCAT(con_cxcdocto.id,0) as consec,
                                      CONCAT(tpv_pedido.serie,tpv_pedido.folio) as numdocto,
                                      tpv_pedido.observaciones as observaciones,
                                      0 as num,
                                      pusuarios.nombre as vendedor,
                                      con_cxcdocto.monto as cargo,
                                      0 as abono,
                                      con_cxcdocto.feccreado as fecha,
                                      con_cxcdocto.feccreado as fecpago,
                                      'VENTA' as tipo"))
                    ->leftjoin('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                    ->leftjoin('tpv_vendedorcomisiones','tpv_pedido.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->leftjoin($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->where('tpv_pedido.id_tpv_cliente',$idcliente)
                    ->where('con_cxcdocto.feccreado','>=',$fecini)
                    ->where('con_cxcdocto.feccreado','<=',$fecfin)
                    ->whereIn('con_cxcdocto.status',[1,2])
                    ->groupBy('con_cxcdocto.id')
                    ->orderBy('fecha','desc')
                    ->get();

        $array = array();
        foreach ($result1 as $row) {
            $array[$row->numdocto] = $row;
        }
        //dd($result1);
        $result2 = DB::table('con_cxcamortizacion')
                    ->select(DB::raw("CONCAT(con_cxcdocto.id,con_cxcamortizacion.numpago) as consec,
                                      CONCAT(tpv_pedido.serie,tpv_pedido.folio) as numdocto,
                                      '' as observaciones,
                                      con_cxcamortizacion.numpago as num,
                                      pusuarios.nombre as vendedor,
                                      0 as cargo,
                                      con_cxcrecibo.importepagado as abono,
                                      con_cxcrecibo.fecha as fecha,
                                      CONCAT('PAGO ',con_cxcamortizacion.numpago) as tipo,
                                      con_cxcamortizacion.fecpago"))
                    ->join('con_cxcrecibo','con_cxcamortizacion.id','=','con_cxcrecibo.id_con_cxcdocto')
                    ->join('con_cxcdocto','con_cxcrecibo.id_con_cxcdocto_real','=','con_cxcdocto.id')
                    ->join('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                    ->join('tpv_vendedorcomisiones','con_cxcrecibo.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->where('tpv_pedido.id_tpv_cliente',$idcliente)
                    ->where('con_cxcamortizacion.fecpago','>=',$fecini)
                    ->where('con_cxcamortizacion.fecpago','<=',$fecfin)
                    ->where('con_cxcrecibo.status',1)
                    ->orderBy('num','asc')
                    ->get();
        
       
        $arrresult = array();
        $n = 0;
        foreach ($array as $idx => $row2) {
            $arrresult[$n] = $row2;
            $n++;
        }

        foreach($result2 as $row3){
            /*if($row3->numdocto == $idx) {
                $arrresult[$n] = $row3;
                $n++;
            }*/
            array_push($arrresult, $row3);
        }
        
        //$result = $result1->union($result2)->orderBy('consec','asc')->get();
        //dd($arrresult);
        return $arrresult;
    }

    public function getEdoCuenta($idcliente,$fechainicio,$fechafin,$dbnomina,$idDocto) {
        $signoDocto = $idDocto=="0"?">":"=";
        $result = DB::table('con_cxcdocto')
                    ->select(DB::raw("con_cxcdocto.*,
                                      'VENTA' as tipo,
                                      tpv_pedido.serie as seriepedido,
                                      tpv_pedido.folio as foliopedido,
                                      CONCAT(tpv_pedido.serie,tpv_pedido.folio) as numdocto,
                                      tpv_pedido.observaciones as observaciones,
                                      pusuarios.nombre as vendedor,
                                      con_cxcdocto.monto as cargo,
                                      (con_cxcdocto.monto-con_cxcdocto.saldo) as abono,
                                      tpv_pedido.fecha as fecha,
                                      '' as fecpago,
                                      tpv_pedido.id_tpv_almacen,
                                      tpv_pedido.id_tpv_cliente,
                                      tpv_pedido.total as totalcompra,
                                      tpv_pedido.anticipo as enganchepedido,
                                      tpv_almacen.descripcion as sucursal,
                                      IFNULL(tpv_pedido.fecha, '') as fechaCompra,
                                      (SELECT GROUP_CONCAT(tpv_pedidodetalle.descripcion) FROM tpv_pedidodetalle where tpv_pedidodetalle.id_tpv_pedido = tpv_pedido.id) as detallePedido,
                                      DATEDIFF(NOW(),con_cxcdocto.fecvencimiento) as diasvencido,
                                      IFNULL(cat_periodicidadpago.descripcion, '') as periodicidad,
                                      IFNULL(con_cxcformaspago.descripcion, '') as formaPago,
                                      '' as cargosAbonos,
                                      '' as proximosPagos"))
                    ->join('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                    ->join('tpv_almacen', 'tpv_pedido.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->join('tpv_vendedorcomisiones','tpv_pedido.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->leftjoin("cat_periodicidadpago", "con_cxcdocto.id_cat_periodicidadpago", "=", "cat_periodicidadpago.id")
                    ->leftjoin("con_cxcformaspago", "con_cxcdocto.id_con_cxcformaspago", "=", "con_cxcformaspago.id")
                    ->where('tpv_pedido.id_tpv_cliente',$idcliente)
                    ->where('con_cxcdocto.id',$signoDocto,$idDocto)
                    ->whereIn('con_cxcdocto.status',[1,2])
                    ->whereNotIn('tpv_pedido.status',[99,98])
                    ->orderBy('con_cxcdocto.id','asc')
                    ->get();
        
        foreach($result as $docto) {
            $arrayCargos = [];
            $arrayProximos = [];
            $totalMora = 0;
            //dd($docto);
            array_push($arrayCargos, [
                "fecha" => $docto->fechaCompra,
                'movimiento' => "VENTA",
                'documento' => $docto->seriepedido."-".$docto->foliopedido,
                'monto' => $docto->totalcompra,
                'sucursal' => $docto->sucursal,
                'pago' => 0,
                'cargo' => $docto->totalcompra,
                'abono' => 0,
                'tipo' => "VENTA"
            ]);

            $pagos = DB::table("con_cxcrecibo")
                        ->select(DB::raw("con_cxcrecibo.*, con_cxcamortizacion.numpago, con_cxcpago.folio, tpv_almacen.descripcion as sucursal"))
                        ->join("con_cxcamortizacion", "con_cxcrecibo.id_con_cxcdocto", "=", "con_cxcamortizacion.id")
                        ->join("con_cxcpago", "con_cxcrecibo.id_con_cxcpago", "=", "con_cxcpago.id")
                        ->join("tpv_almacen", "con_cxcrecibo.id_tpv_almacen_cobro", "=", "tpv_almacen.id")
                        ->where("con_cxcrecibo.id_con_cxcdocto_real", $docto->id)
                        ->where('con_cxcpago.status', 1)
                        ->get();
            //dd($pagos);
            foreach ($pagos as $key => $pago) {
                $movimiento = $pago->numpago==0?"ENGANCHE":"PAGO";
                array_push($arrayCargos, [
                    "fecha" => $pago->fecha,
                    'movimiento' => $movimiento,
                    'documento' => $pago->folio,
                    'monto' => $pago->importepagado,
                    'sucursal' => $pago->sucursal,
                    'pago' => $pago->numpago,
                    'cargo' => 0,
                    'abono' => $pago->importepagado+$pago->moratorio,
                    'tipo' => "ABONO"
                ]);
            }

            $getMoratorios = DB::table("con_cxcamortizacion")
                                ->select(DB::raw("con_cxcamortizacion.*"))
                                ->where("con_cxcamortizacion.id_con_cxcdocto", $docto->id)
                                ->where('con_cxcamortizacion.moratorio', ">", 0)
                                ->get();

            foreach ($getMoratorios as $key => $mora) {
                array_push($arrayCargos, [
                    "fecha" => $mora->fecfija,
                    'movimiento' => "MORATORIO",
                    'documento' => "",
                    'monto' => $mora->moratorio,
                    'sucursal' => "",
                    'pago' => $mora->numpago,
                    'cargo' => $mora->moratorio,
                    'abono' => 0,
                    'tipo' => "CARGO"
                ]);
            }
            //dd($arrayCargos);
            $amortizaciones = DB::table("con_cxcamortizacion")
                                ->select(DB::raw("con_cxcamortizacion.*"))
                                ->where("con_cxcamortizacion.id_con_cxcdocto", $docto->id)
                                ->where(function($q) {
                                    $q->where("con_cxcamortizacion.saldo", ">", 0)
                                    ->orWhere('con_cxcamortizacion.moratorio', ">", 0);
                                })->get();
            //dd($amortizaciones);
            foreach($amortizaciones as $amort) {
                //dd($amort, $docto, $arrayCargos);
                array_push($arrayProximos, [
                    "fecha" => $amort->fecfija,
                    'movimiento' => "PAGO",
                    'numpago' => $amort->numpago,
                    'monto' => $amort->pago,
                    'pago' => $amort->saldo,
                    'abono' => $amort->abono,
                    'moratorio' => $amort->moratorio,
                    'total' => $amort->saldo+$amort->moratorio
                ]);  
                $totalMora = $totalMora+$amort->moratorio;
            }
            //dd($arrayCargos, $arrayProximos);
            $docto->cargosAbonos = $arrayCargos;
            $docto->proximosPagos = $arrayProximos;
            $docto->moratorio = $totalMora;
        }
        //dd($result);
        return $result;
    }

    public function getAmortizacion($id){
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw("con_cxcamortizacion.*"))
                    ->where('id_con_cxcdocto',$id)
                    ->get();

        foreach ($result as $key => $amort) {
            $recibo = DB::table('con_cxcrecibo')
                        ->select(DB::raw('SUM(con_cxcrecibo.importepagado) as reciboAbono, SUM(con_cxcrecibo.moratorio) as reciboAbonoMora'))
                        ->where('con_cxcrecibo.id_con_cxcdocto',$amort->id)
                        ->first();
            if(isset($recibo) && $recibo->reciboAbono>0) {
                //dd($amort);
                $amort->reciboAbono = $recibo->reciboAbono;
                $amort->reciboAbonoMora = $recibo->reciboAbonoMora;
            } else {
                $amort->reciboAbono = 0;
                $amort->reciboAbonoMora = 0;
            }
        }
        //dd($result);
        return $result;
    }

    public function getEstadoCuentaCliente($id){
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw('con_cxcamortizacion.*, sys_persona.nombre as cliente, tpv_factura.serie, tpv_factura.folio'))
                    ->join('con_cxcdocto', 'con_cxcamortizacion.id_con_cxcdocto', '=', 'con_cxcdocto.id')
                    ->leftjoin('tpv_factura', function($join)
                    {
                        $join->on('con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido')
                            ->where('tpv_factura.status', '<>', 99);
                    })
                    ->join('con_cxccliente', 'con_cxcdocto.id_con_cxccliente', '=', 'con_cxccliente.id')
                    ->join('tpv_cliente', 'con_cxccliente.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                    ->where('id_con_cxcdocto',$id)
                    ->get();
        return $result;
    }

    public function getEstadoCuentaGeneralCliente($idcliente) {
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw('con_cxcamortizacion.*, sys_persona.nombre as cliente, tpv_factura.serie, tpv_factura.folio'))
                    ->join('con_cxcdocto', 'con_cxcamortizacion.id_con_cxcdocto', '=', 'con_cxcdocto.id')
                    //->leftjoin('tpv_factura', 'con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido')
                    ->leftjoin('tpv_factura', function($join)
                    {
                        $join->on('con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido')
                            ->where('tpv_factura.status', '<>', 99);
                    })
                    ->join('con_cxccliente', 'con_cxcdocto.id_con_cxccliente', '=', 'con_cxccliente.id')
                    ->join('tpv_cliente', 'con_cxccliente.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                    ->where('con_cxccliente.id_tpv_cliente',$idcliente)
                    ->whereIn('con_cxcamortizacion.status', [1,2])
                    ->get();
        
        return $result;
    }

    public function aplicacionPago($request){
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $lib = new Libreria;
        DB::beginTransaction();
        $doctopagos = array();
        $pago = $request->montopago;
        //obtenemos los documentos a los que se aplicará
        $fallo0 = 0;
        $fallo1 = 0;
        $fallo2 = 0;
        $fallo3 = 0;
        $fallo4 = 0;
        $fallo5 = 0;
        $fallo6 = 0;
        $doctos = json_decode($request->documentos,1);
        dd($doctos);

        // $cxcdoc = array();
        // foreach($doctos as $idx0 => $docto0){
        //     if(isset($docto0['numpago'])){
        //         $cxcdoc[$docto0['id_con_cxcdocto']][] = $docto0['numpago'];
        //         sort($cxcdoc[$docto0['id_con_cxcdocto']]);
        //     }
        // }        
        // return json_encode($cxcdoc);
        
        if(isset($request->idnotaabono) && $request->formapago=='NA'){
            $request->formapago = 404;
            $rownotaabono = DB::table('con_cxcnotaabono')
                                ->where('id',$request->idnotaabono)
                                ->first();
            $request->montopago = $rownotaabono->monto;
        }

        //OBTENEMOS EL FOLIO DEL RECIBO DE PAGO
        $folio = DB::table('tpv_folio')
                    ->where('id_sys_usuario','=',$usuario)
                    ->where('id_tpv_almacen','=',$request->almacen)
                    ->where('id_cat_operacion','=',21)
                    ->where('id_tpv_turno','=',$turno)
                    ->where('status','=',1)
                    ->get();
        if(count($folio)>0) {
            //INSERTAMOS EL PAGO TOTAL QUE SE ESTÁ HACIENDO
            $idPago = DB::table('con_cxcpago')->insertGetId([
                'folio'=>$folio[0]->serie."-".$folio[0]->folio,
                'id_tpv_almacen' => $request->almacen,
                'id_sys_usuario' => $usuario,
                'id_tpv_turno' => $turno,
                'id_tpv_cliente' => $request->idcliente,
                'id_sat_formapago' => $request->formapago,
                'fecha' => $lib->fechaFormat($request->fechapago,'H2M'),
                'hora' => $request->horapago,
                'subtotal' => ($request->montopago/1.16),
                'iva' => ($request->montopago/1.16)*.16,
                'total' => $request->montopago,
                'uuid' => '',
                'id_cat_tipopagos' => $request->tipoPago,
                'cuentadestino' => $request->cuentadestino
            ]);
            $docsseriesfolios = '';
            $pagosdoctos = 0;
            $pagosmoratorios = 0;
            if($idPago>0) {
                if($request->formapago==404){
                    $updnotaabono = DB::table('con_cxcnotaabono')
                                        ->where('id',$request->idnotaabono)
                                        ->update([
                                            'id_con_cxcpago'=>$idPago,
                                            'status'=>2
                                        ]);
                    if($updnotaabono>0){
                        $updnotaabono = 1;
                    }else{
                        DB::rollBack();
                        return 'Problemas al actualizar la nota de abono intente de nuevo y si el problema persiste informe al administrador del sistema.';
                    }
                }
                foreach($doctos as $idx => $docto){
                    if(is_array($docto)){
                        $saldoconmora = $docto['aplicar'] + $docto['moratorio'];
                        if($request->vendedor>0){
                            $idvendedor = $request->vendedor;
                        }else{
                            $idvendedor = $docto['idvendedor'];
                        }
                        
                        $parc = DB::table('con_cxcrecibo')->where('id_con_cxcdocto',$docto['id'])->where('status',1)->count();
                        $parcialidad = $parc + 1;
                        if($pago>=$saldoconmora){
                            $saldoinsoluto = 0;
                            $importepagado = $docto['aplicar'];
                            $pagomoratorio = $docto['moratorio'];
                            $statusnew = 2;
                        }else{
                            if($pago>=$docto['aplicar']){
                                $pagomoratorio = $pago - $docto['aplicar'];
                                $saldoinsoluto = 0;
                                $importepagado = $docto['aplicar'];
                                $statusnew = 1;
                            }else{
                                $saldoinsoluto = $docto['aplicar'] - $pago;
                                $importepagado = $pago;
                                $statusnew = 1;
                                $pagomoratorio = 0;
                            }
                        }
                        
                        if($pago>0){
                            $pagosdoctos = $pagosdoctos + $importepagado;
                            $pagosmoratorios = $pagosmoratorios + $pagomoratorio;
                            $pag = DB::table('con_cxcrecibo')->insertGetId([
                                'id_con_cxcdocto'=>$docto['id'],
                                'id_con_cxcpago' => $idPago,
                                'id_con_cxcdocto_real'=>$docto['id_con_cxcdocto'],
                                'parcialidad'=>$parcialidad,
                                'isPago' => 1,
                                'id_sat_formapago'=>$request->formapago,
                                'fecha'=>$lib->fechaFormat($request->fechapago,'H2M'),
                                'hora'=>$request->horapago,
                                'id_tpv_vendedor'=>$idvendedor,
                                'saldoanterior'=>$docto['aplicar'],
                                'importepagado'=>$importepagado,
                                'moratorio'=>$pagomoratorio,
                                'saldoinsoluto'=>$saldoinsoluto,
                                'id_sys_usuario_cobro' => $usuario,
                                'id_tpv_almacen_cobro' => $request->almacen
                            ]);
                            
                            if($pag>0){
                                //Obtenemos la cuenta contable de almacen
                                
                                $doc = DB::table('con_cxcamortizacion')
                                            ->select(DB::raw('con_centrocosto.*,tpv_almacen.id as idalmacen,tpv_cliente.clave as clave,CONCAT(tpv_pedido.serie,tpv_pedido.folio) as seriefolio,con_cxcdocto.id as iddocto,con_cxcdocto.monto as montodocto,con_cxcdocto.saldo as saldodocto'))
                                            ->join('con_cxcdocto','con_cxcamortizacion.id_con_cxcdocto','=','con_cxcdocto.id')
                                            ->leftjoin('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                                            ->leftjoin('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                                            ->leftjoin('con_centrocosto','tpv_almacen.id_con_centrocosto','=','con_centrocosto.id')
                                            ->leftjoin('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                                            ->where('con_cxcamortizacion.id',$docto['id'])
                                            ->first();
                                //dd($doc);
                                if(isset($doc->cuentacaja)){ 
                                    $docsseriesfolios = $doc->seriefolio.',';
                                    //Almacenamos en el documento para obtener lo pagado
                                    if(!isset($doctopagos[$doc->iddocto]['pago'])){
                                        $doctopagos[$doc->iddocto]['pago'] = $importepagado;
                                        $doctopagos[$doc->iddocto]['monto'] = $doc->montodocto;
                                        $doctopagos[$doc->iddocto]['saldo'] = $doc->saldodocto;
                                    }else{
                                        $doctopagos[$doc->iddocto]['pago']+= $importepagado;
                                    }
                                    //ACTUALIZAMOS EL DOCUMENTO AFECTADO
                                    $upd1 = DB::table('con_cxcamortizacion')
                                                ->where('id',$docto['id'])
                                                ->update([
                                                    'saldo'=>$saldoinsoluto,
                                                    'abono'=>$importepagado,
                                                    'moratorio'=>$docto['moratorio'] - $pagomoratorio,
                                                    'status'=>$statusnew,
                                                    'fecpago'=>$lib->fechaFormat($request->fechapago,'H2M')
                                                ]);
                                    if($upd1>0){
                                        //Actualizamos cxckardex
                                        $kard = DB::table('con_cxckardex')->insertGetId([
                                            'id_con_cxcamortizacion'=>$docto['id'],
                                            'fecha'=>$lib->fechaFormat($request->fechapago,'H2M'),
                                            'hora'=>$request->horapago,
                                            'id_cat_cxcmovimiento'=>2,
                                            'id_sys_usuario'=>$usuario,
                                            'id_con_cxcrecibo'=>$pag
                                        ]);
                                        if($kard>0)
                                            $fallo1 = $fallo1;
                                        else
                                            $fallo3++;
                                    }else{
                                        $fallo2++;
                                    }
                                }else{
                                    DB::rollBack();
                                    return 'El almacen seleccionado no tiene asigndado su cuenta contable de caja, comuniquese con el administrador del sistema.';
                                }                        
                            }else{
                                $fallo1++;
                            }
                            $pago = $pago - $saldoconmora;
                        }
                    }
                }
            } else {
                $fallo0++;
            }

            $rrr = 0;
            
            foreach($doctopagos as $idx => $dcto){
                $saldoinsol = $dcto['saldo'] - $dcto['pago'];
                $statnew = 1;
                if($saldoinsol==0)
                    $statnew = 2;
                $upd1 = DB::table('con_cxcdocto')
                            ->where('id',$idx)
                            ->update([
                                'saldo'=>$saldoinsol,
                                'status'=>$statnew,
                                'fecupdated'=>date('Y-m-d')]);
                
                if($statnew==2){
                    if($upd1>0){
                        $rrr++;
                    }
                }else{
                    $rrr++;
                }
            }
            //dd($doctopagos, $idx, $rrr);
            if($rrr==0){
                DB::rollBack();
                return 'Problemas al actualizar los registros de cxcdocto intente de nuevo y si el problema persiste informe al administrador del sistema.';
            }

            if($fallo0>0){
                DB::rollBack();
                return 'Problemas al crear el pago total de los pagos de cobros seleccionados en Cuentas Por Cobrar. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
            } else {
                if($fallo1>0){
                    DB::rollBack();
                    return 'Problemas al crear los registros de los pagos, intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }else{
                    if($fallo2>0){
                        DB::rollBack();
                        return 'Problemas al actualizar los documentos por cobrar, intente de nuevo y si el problema persiste informe al administrador del sistema.';
                    }else{
                        if($fallo3>0){
                            DB::rollBack();
                            return 'Problemas al crear registro de historico cxc, intente de nuevo y si el problema persiste informe al administrador del sistema.';
                        }else{
                            if($fallo4>0){
                                DB::rollBack();
                                return 'Problemas al crear registro del detalle del asiento contable, intente de nuevo y si el problema persiste informe al administrador del sistema.';
                            }else{
                                if($fallo5>0){
                                    DB::rollBack();
                                    return 'Problemas al crear registro de la cabecera del asiento contable, intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                }else{
                                    if($fallo6>0){
                                        DB::rollBack();
                                        return 'Problemas al encontrar registro del documento, intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                    }else{
                                        //Movimientos Contables
                                        // CREACION DEL ASIENTO CONTABLE                            
                                        //Creamos la cabecera del asiento contable
                                        if($request->formapago!=201){
                                            $totasiento = ($request->montopago + (($request->montopago/1.16)*.16));
                                        }else{
                                            $totasiento = $request->montopago;
                                        }
                                        $conhead = DB::table('con_asiento')->insertGetId([
                                            'id_sys_usuario'=>$usuario,
                                            'id_cat_tipoasiento'=>19,
                                            'name_tabla'=>'con_cxcpago',
                                            'id_foraneo' => $idPago,
                                            'concepto'=>'ABONO A CREDITO NUM. ('.substr($docsseriesfolios,0,-1).')',
                                            'referencia' => $folio[0]->serie."-".$folio[0]->folio,
                                            'fecha'=>$lib->fechaFormat($request->fechapago,'H2M'),
                                            'hora'=>$request->horapago,
                                            'debe'=>round($totasiento,2),
                                            'haber'=>round($totasiento,2)
                                        ]);
                                        if($conhead>0){
                                            $cargos = 0;
                                            $abonos = 0;
                                            $movimientos = array();   
                                            //Obtenemos la cuenta contable del cliente 
                                            $doc10 = DB::table('tpv_cliente')->where('id',$request->idcliente)->first();
                                            $doc11 = DB::table('tpv_almacen')
                                                        ->select(DB::raw('con_centrocosto.*'))
                                                        ->join('con_centrocosto','tpv_almacen.id_con_centrocosto','con_centrocosto.id')
                                                        ->where('tpv_almacen.id',$request->almacen)
                                                        ->first();                       
                                            $ctacxc = '105 001 '.str_pad($doc10->clave, 6, "0", STR_PAD_LEFT);
                                            if($request->formapago!=404){
                                                if($request->formapago!=201){
                                                    // Abono a Caja o Banco
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>$doc11->cuentacaja,
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>$request->montopago,
                                                        'haber'=>0
                                                    ];
                                                    $cargos = $cargos + $request->montopago;
                                                    // Abono a iva pendiente por trasladar
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>'209 001 000001',
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>round(($pagosdoctos/1.16)*.16,2),
                                                        'haber'=>0
                                                    ];
                                                    $cargos = $cargos + round(($pagosdoctos/1.16)*.16,2);
                                                    // Abono a iva trasladado
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>'208 001 000001',
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>0,
                                                        'haber'=>round(($pagosdoctos/1.16)*.16,2)
                                                    ];
                                                    $abonos = $abonos + round(($pagosdoctos/1.16)*.16,2);
                                                }else{                                              
                                                    // Cargo a Descuentos o Bonificaciones
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>'402 001',
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>round($pagosdoctos,2),
                                                        'haber'=>0
                                                    ]; 
                                                    $cargos = $cargos + round($pagosdoctos,2);  
                                                }
                                                if($pagosdoctos>0){
                                                    // Abono a Clientes
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>$ctacxc,
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>0,
                                                        'haber'=>round($pagosdoctos,2)
                                                    ];
                                                    $abonos = $abonos + round($pagosdoctos,2);
                                                }
                                                if($pagosmoratorios>0){
                                                    // Abono a Ingresos por intereses
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>'401 032 000001',
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>0,
                                                        'haber'=>round(($pagosmoratorios/1.16),2)
                                                    ];
                                                    $abonos = $abonos + round(($pagosmoratorios/1.16),2);
                                                    // Abono a iva trasladado
                                                    $movimientos[] = [
                                                        'id_con_asiento'=>$conhead,
                                                        'cuenta'=>'208 001 000001',
                                                        'id_con_centrocosto'=>$doc11->id,
                                                        'debe'=>0,
                                                        'haber'=>round(($pagosmoratorios/1.16)*.16,2)
                                                    ];
                                                    $abonos = $abonos + round(($pagosmoratorios/1.16)*.16,2);

                                                }
                                                $condet = DB::table('con_asientodetalle')->insert($movimientos);
                                                if($condet>0){                                                
                                                    $increment = DB::table('tpv_folio')
                                                                ->where('id_sys_usuario','=',$usuario)
                                                                ->where('id_tpv_almacen','=',$request->almacen)
                                                                ->where('id_cat_operacion','=',21)
                                                                ->where('id_tpv_turno','=',$turno)
                                                                ->where('status','=',1)
                                                                ->increment('folio');
                                                    if($increment>0){
                                                        $updd = DB::table('con_asiento')
                                                                    ->where('id',$conhead)
                                                                    ->update([
                                                                        'debe'=>$cargos,
                                                                        'haber'=>$abonos
                                                                    ]);
                                                        $diferencia = round($cargos,2) - round($abonos,2);
                                                        if($diferencia==0){
                                                            if($updd>=0){
                                                                DB::commit();
                                                                return $idPago;
                                                            }else{
                                                                DB::rollBack();
                                                                return 'Problemas al actualizar los totales del asiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                                            }
                                                        }else{
                                                            DB::rollBack();
                                                            return 'Existe una diferencia entre cargos y abonos de '.$diferencia.' al crear el asiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                                        }
                                                    } else {
                                                        DB::rollBack();
                                                        return 'Problemas al incrementar el folio del recibo de cobro. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                                    }
                                                }else{
                                                    DB::rollBack();
                                                    return 'Problemas al crear el detalle del asiento contable.';
                                                }
                                            }else{
                                                $movimientos[] = [
                                                    'id_con_asiento'=>$conhead,
                                                    'cuenta'=>'402 001',
                                                    'id_con_centrocosto'=>$doc11->id,
                                                    'debe'=>round($pagosdoctos,2),
                                                    'haber'=>0
                                                ];
                                                $cargos = $cargos + round($pagosdoctos,2); 
                                                $movimientos[] = [
                                                    'id_con_asiento'=>$conhead,
                                                    'cuenta'=>$ctacxc,
                                                    'id_con_centrocosto'=>$doc11->id,
                                                    'debe'=>0,
                                                    'haber'=>round($pagosdoctos,2)
                                                ];
                                                $abonos = $abonos + round($pagosdoctos,2);
                                                $condet = DB::table('con_asientodetalle')->insert($movimientos);
                                                if($condet>0){                                                
                                                    $increment = DB::table('tpv_folio')
                                                                ->where('id_sys_usuario','=',$usuario)
                                                                ->where('id_tpv_almacen','=',$request->almacen)
                                                                ->where('id_cat_operacion','=',21)
                                                                ->where('id_tpv_turno','=',$turno)
                                                                ->where('status','=',1)
                                                                ->increment('folio');
                                                    if($increment>0){
                                                        $updd = DB::table('con_asiento')
                                                                    ->where('id',$conhead)
                                                                    ->update([
                                                                        'debe'=>$cargos,
                                                                        'haber'=>$abonos
                                                                    ]);
                                                        $diferencia = round($cargos,2) - round($abonos,2);
                                                        if($diferencia==0){
                                                            if($updd>=0){
                                                                DB::commit();
                                                                return $idPago;
                                                            }else{
                                                                DB::rollBack();
                                                                return 'Problemas al actualizar los totales del asiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                                            }
                                                        }else{
                                                            DB::rollBack();
                                                            return 'Existe una diferencia entre cargos y abonos de '.$diferencia.' al crear el asiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                                        }
                                                    } else {
                                                        DB::rollBack();
                                                        return 'Problemas al incrementar el folio del recibo de cobro. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                                                    }
                                                }else{
                                                    DB::rollBack();
                                                    return 'Problemas al crear el detalle del asiento contable.';
                                                }
                                            }
                                        }else{
                                            DB::rollBack();
                                            return 'Problemas al crear la cabecera del asiento contable.';
                                        }                                        
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } else {
            DB::rollBack();
            return 'El usuario no cuenta con un folio para realizar la operacion de recibos de cobros de clientes. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
        }
    }

    public function genera($request){
        $usuario = $request->session()->get('idusuario');
        DB::beginTransaction();
        //dd($request);
        $detalleEnganches = json_decode($request->detalle,true);
        $chk = DB::table('con_cxcsolicitud')
                ->join('cat_status','con_cxcsolicitud.status','=','cat_status.status')
                ->where('con_cxcsolicitud.id_tpv_cliente',$request->idcliente)
                ->where('cat_status.tabla','con_cxcsolicitud')
                ->first();

        if(!isset($chk->status)){
            $docs = DB::table('cat_documentacion')
                        ->join('con_tipodocdocumentacion','cat_documentacion.id','=','con_tipodocdocumentacion.id_cat_documentacion')
                        ->where('con_tipodocdocumentacion.tipo',1)
                        ->where('con_tipodocdocumentacion.requerido',1)
                        ->where('con_tipodocdocumentacion.status',1)
                        ->where('cat_documentacion.status',1)
                        ->whereRaw("cat_documentacion.id NOT IN (SELECT id_cat_documentacion FROM con_cxcdocumentacion WHERE id_sys_usuario='".$usuario."' AND status=0)")
                        ->count();
            
            if($docs>0){
                DB::rollBack();
                return 'Los documentos marcados con (*) son obligatorios de subir para la generación de la solicitud';
            }else{
                $result = DB::table('con_cxcsolicitud')->insertGetId(
                    [
                        'id_tpv_almacen' => $request->sucursal,
                        'id_tpv_cliente' => $request->idcliente,
                        'id_sys_usuario' => $request->session()->get('idusuario'),
                        'id_tpv_vendedor' => $request->vendedor,
                        'razonsocial' => $request->cliente,
                        'calle' => $request->calle,
                        'numext' => $request->numext,
                        'numint' => $request->numint,
                        'colonia' => $request->colonia,
                        'cp' => $request->cp,
                        'municipio' => $request->municipio,
                        'estado' => $request->estado,
                        'referencias' => $request->referencias,
                        'id_cat_nacionalidad' => $request->nacionalidad,
                        'rfc' => $request->rfc,
                        'curp' => $request->curp,
                        'clavelector' => $request->clavelector,
                        'tipoclientesat' => $request->tipoclientesat,
                        'id_sat_regimenfiscal' => $request->regimenfiscal,
                        'id_sat_usocfdi' => $request->usocfdi,
                        'telefono' => $request->telefono,
                        'email' => $request->email,
                        'id_cat_ocupacion' => $request->ocupacion,
                        'ocupacionempleo' => $request->empleo,
                        'formacobro' => $request->formacobro,
                        'ingresos' => $request->ingresos,
                        'gastos' => $request->gastos,
                        'id_cat_edocivil' => $request->edocivil,
                        'personasdependientes' => $request->personasdependientes,
                        'conyugenombre' => $request->conyugenombre,
                        'conyugetelefono' => $request->conyugetelefono,
                        'tipovivienda' => $request->tipovivienda,
                        'antiguedadvivienda' => $request->antiguedadvivienda,
                        'creditootro' => $request->creditootro,
                        'creditocuando' => $request->creditocuando,
                        'creditocuanto' => $request->creditocuanto,
                        'limite' => $request->limite,
                        'fecha' => date('Y-m-d'),
                        'hora' => date('h:i:s'),
                        'status' => 0
                    ]
                );
                if($result>0){  
                    $result2 = DB::table('con_cxcreferencia')->insert([
                        [
                            'id_con_cxcsolicitud' => $result,
                            'nombre' => $request->ref1_nombre,
                            'domicilio' => $request->ref1_domicilio,
                            'telefono' => $request->ref1_telefono,
                            'id_cat_ocupacion' => $request->ref1_ocupacion,
                            'ocupacionempleo' => $request->ref1_empleo,
                            'relacion' => $request->ref1_relacion,
                            'antiguedad' => $request->ref1_antiguedad,
                            'status' => 1
                        ],
                        [
                            'id_con_cxcsolicitud' => $result,
                            'nombre' => $request->ref2_nombre,
                            'domicilio' => $request->ref2_domicilio,
                            'telefono' => $request->ref2_telefono,
                            'id_cat_ocupacion' => $request->ref2_ocupacion,
                            'ocupacionempleo' => $request->ref2_empleo,
                            'relacion' => $request->ref2_relacion,
                            'antiguedad' => $request->ref2_antiguedad,
                            'status' => 1
                        ]
                    ]);
                    if($result2>0){
                        $result3 = DB::table('con_cxccliente')->insert(
                            [
                                'id_tpv_cliente' => $request->idcliente,
                                'id_tpv_vendedor' => $request->vendedor,
                                'limiteinferior' => $request->limiteinferior,
                                'limitesuperior' => $request->limite,
                                'diaslimite' => $request->diaslimite,
                                'plazomaximo' => $request->plazomaximo,
                                'limitediario' => $request->limitediario,
                                'limitemensual' => $request->limitemensual,
                                'limiteanual' => $request->limiteanual,
                                'interesesvencido' => $request->interesesvencido,
                                'engancheminimo' => $request->engancheminimo,
                                'fecalta' => date('Y-m-d'),
                                'capacidadPagoSemanal' => $request->capacidad,
                                'status' => 0
                            ]
                        );
                        if($result3>0){
                            $result4 = DB::table('con_cxcdocumentacion')
                                        ->where('status',0)
                                        ->where('id_sys_usuario',$request->session()->get('idusuario'))
                                        ->update([
                                            'id_con_cxcsolicitud' => $result,
                                            'status' => 1
                                        ]);
                            if($result4>0){
                                //dd($detalleEnganches);
                                foreach ($detalleEnganches as $key => $det) {
                                    $result5 = DB::table('con_cxcsolicitudgrupoenganche')->insert([
                                        'id_con_cxcsolicitud' => $result,
                                        'id_tpv_cliente' => $request->idcliente,
                                        'id_cat_grupomarca' => $det['id'],
                                        'id_cat_tipoenganche' => $det['id_cat_tipoenganche'],
                                        'porcentajeenganche' => $det['porcentajeenganche'],
                                    ]);
                                
                                    if($result5==0) {
                                        DB::rollBack();
                                        return 'Problemas al crear la relacion cliente y enganche. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                                    }
                                }
                                if($result5>0){
                                    DB::commit();
                                    return $result;  
                                }                  
                            }else{
                                DB::rollBack();
                                return 'Problemas al actualizar la información de la documentación del cliente. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                            }                   
                        }else{
                            DB::rollBack();
                            return 'Problemas al actualizar la información de la solicitud. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                        }                    
                    }else{
                        DB::rollBack();
                        return 'Problemas al crear las referencias de la solicitud. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                    }
                }else{
                    DB::rollBack();
                    return 'Problemas al crear la solicitud. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                }
            }
        }else{
            DB::rollBack();
            return 'Cliente con línea de crédito '.$chk->descripcion;
        }
    }

    public function getDocumentacion($id){
        $result = DB::table('con_cxcdocumentacion')
                    ->select(DB::raw('con_cxcdocumentacion.*,cat_documentacion.descripcion as tipo,cat_documentacion.vigencia as vigencia'))
                    ->join('cat_documentacion','con_cxcdocumentacion.id_cat_documentacion','=','cat_documentacion.id')
                    ->where('con_cxcdocumentacion.id_con_cxcsolicitud',$id)
                    ->get();
        return $result;
    }

    public function getDocumentacionTemp($usuario, $idsolicitud){
        $result = DB::table('con_cxcdocumentacion')
                    ->select(DB::raw('con_cxcdocumentacion.*,cat_documentacion.descripcion as tipo'))
                    ->join('cat_documentacion','con_cxcdocumentacion.id_cat_documentacion','=','cat_documentacion.id')
                    ->where('con_cxcdocumentacion.id_sys_usuario',$usuario)
                    ->where(function($q) use($idsolicitud){
                        $q->where('con_cxcdocumentacion.id_con_cxcsolicitud', $idsolicitud)
                        ->orWhere('con_cxcdocumentacion.id_con_cxcsolicitud', 0);
                    })
                    //->where('con_cxcdocumentacion.status',0)
                    ->get();
        
        return $result;
    }

    public function borraDocumentacionTemp($usuario){
        $result = DB::table('con_cxcdocumentacion')
                ->where('id_sys_usuario',$usuario)
                ->where('status',0)
                ->delete();
        return $result;
    }

    public function getDocumentacionTempUni($id){
        $result = DB::table('con_cxcdocumentacion')
                    ->where('id',$id)
                    ->first();
        return $result;
    }

    public function borraDocumentacionTempUni($id){
        $result = DB::table('con_cxcdocumentacion')
                ->where('id',$id)
                ->delete();
        return $result;
    }

    public function guardaDocumentacion($tipodoc,$usuario,$file){
        $result = DB::table('con_cxcdocumentacion')->insertGetId(
            [
                'id_cat_documentacion' => $tipodoc,
                'id_sys_usuario' => $usuario,
                'url' => $file,
                'fecha' => date('Y-m-d'),
                'hora' => date('H:i:s'),
                'status' => 0
            ]
        );
        return $result;
    }
    
    public function getSolicitudes($idcliente,$dbnomina,$arrayIdsSucursales,$fechainicio,$fechafin,$tipo,$sucursal,$vendedor){
        //dd($idcliente,$dbnomina,$arrayIdsSucursales,$fechainicio,$fechafin,$tipo,$sucursal,$vendedor);
        $signoSucursal = $sucursal!=="0"?"=":">";
        $signoVendedor = $vendedor!=="0"?"=":">";
        //dd($signoSucursal, $sucursal, $signoVendedor, $vendedor);
        $result = DB::table('con_cxcsolicitud')
                    ->select(DB::raw('con_cxcsolicitud.id as id,
                                      con_cxcsolicitud.status as status,
                                      con_cxcsolicitud.fecha as fecha,
                                      con_cxcsolicitud.hora as hora,
                                      con_cxcsolicitud.limite as limite,
                                      sys_persona.nombre as cliente,
                                      pusuarios.nombre as vendedor,
                                      cat_status.descripcion as txtstatus,
                                      tpv_almacen.descripcion as sucursal'))
                    ->join('tpv_cliente','con_cxcsolicitud.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_vendedorcomisiones','con_cxcsolicitud.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->join('cat_status','con_cxcsolicitud.status','=','cat_status.status')
                    ->leftjoin('tpv_almacen', 'con_cxcsolicitud.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->where('cat_status.tabla','=','con_cxcsolicitud')
                    ->where('con_cxcsolicitud.fecha', '>=', $fechainicio)
                    ->where('con_cxcsolicitud.fecha', '<=', $fechafin)
                    ->where('con_cxcsolicitud.id_tpv_almacen', $signoSucursal, $sucursal)
                    ->where('con_cxcsolicitud.id_tpv_vendedor', $signoVendedor, $vendedor)
                    ->where('con_cxcsolicitud.status', $tipo)
                    ->where('sys_persona.nombre','LIKE','%'.$idcliente.'%')
                    ->whereIn('con_cxcsolicitud.id_tpv_almacen', $arrayIdsSucursales)
                    ->orderby('con_cxcsolicitud.fecha', 'asc')
                    ->orderby('con_cxcsolicitud.hora', 'asc')
                    ->get();
                    
        return $result;
    }
    
    public function getSolicitud($id,$dbnomina){
        $result = DB::table('con_cxcsolicitud')
                    ->select(DB::raw('con_cxcsolicitud.id as id,
                                      con_cxcsolicitud.status as status,
                                      con_cxcsolicitud.fecha as fecha,
                                      con_cxcsolicitud.hora as hora,
                                      con_cxcsolicitud.razonsocial as cliente,
                                      con_cxcsolicitud.calle as calle,
                                      con_cxcsolicitud.numext as numext,
                                      con_cxcsolicitud.numint as numint,
                                      con_cxcsolicitud.colonia as colonia,
                                      con_cxcsolicitud.cp as cp,
                                      con_cxcsolicitud.municipio as municipio,
                                      con_cxcsolicitud.estado as estado,
                                      con_cxcsolicitud.referencias as referencias,
                                      con_cxcsolicitud.id_cat_nacionalidad as nacionalidad,
                                      con_cxcsolicitud.rfc as rfc,
                                      con_cxcsolicitud.curp as curp,
                                      con_cxcsolicitud.clavelector,
                                      con_cxcsolicitud.tipoclientesat,
                                      con_cxcsolicitud.id_sat_regimenfiscal as sat_regimenfiscal,
                                      con_cxcsolicitud.id_sat_usocfdi as sat_usocfdi,
                                      con_cxcsolicitud.telefono as telefono,
                                      con_cxcsolicitud.email as email,
                                      con_cxcsolicitud.limite as limite,
                                      con_cxcsolicitud.id_tpv_cliente as idcliente,
                                      con_cxcsolicitud.id_tpv_vendedor as idvendedor,
                                      pusuarios.nombre as vendedor,
                                      cat_status.descripcion as txtstatus,
                                      con_cxcsolicitud.formacobro as formacobro,
                                      con_cxcsolicitud.id_cat_ocupacion as ocupacion,
                                      con_cxcsolicitud.ocupacionempleo as empleo,
                                      con_cxcsolicitud.ingresos as ingresos,
                                      con_cxcsolicitud.gastos as gastos,
                                      con_cxcsolicitud.id_cat_edocivil as edocivil,
                                      con_cxcsolicitud.personasdependientes as personasdependientes,
                                      con_cxcsolicitud.conyugenombre as conyugenombre,
                                      con_cxcsolicitud.conyugetelefono as conyugetelefono,
                                      con_cxcsolicitud.tipovivienda as tipovivienda,
                                      con_cxcsolicitud.antiguedadvivienda as antiguedadvivienda,
                                      con_cxcsolicitud.creditootro as creditootro,
                                      con_cxcsolicitud.creditocuando as creditocuando,
                                      con_cxcsolicitud.creditocuanto as creditocuanto,
                                      con_cxcsolicitud.id_tpv_almacen,
                                      tpv_cliente.clave as clienteclave,
                                      sys_persona.nombre as clientenombre,
                                      con_cxccliente.limiteinferior as limiteinferior,
                                      con_cxccliente.diaslimite as diaslimite,
                                      con_cxccliente.plazomaximo as plazomaximo,
                                      con_cxccliente.limitediario as limitediario,
                                      con_cxccliente.limitemensual as limitemensual,
                                      con_cxccliente.limiteanual as limiteanual,
                                      con_cxccliente.interesesvencido as interesesvencido,
                                      con_cxccliente.engancheminimo as engancheminimo,
                                      con_cxccliente.capacidadPagoSemanal'))
                    ->join('tpv_cliente','con_cxcsolicitud.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('con_cxccliente','con_cxcsolicitud.id_tpv_cliente','=','con_cxccliente.id_tpv_cliente')
                    ->join('tpv_vendedorcomisiones','con_cxcsolicitud.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->join('cat_status','con_cxcsolicitud.status','=','cat_status.status')
                    ->where('cat_status.tabla','=','con_cxcsolicitud')
                    ->where('con_cxcsolicitud.id','=',$id)
                    ->first();
                    
        return $result;
    }    
    public function getSolicitudReferencias($id,$dbnomina){
        $result = DB::table('con_cxcreferencia')
                    ->select(DB::raw('con_cxcreferencia.*,con_cxcreferencia.ocupacionempleo as empleo,cat_ocupacion.descripcion as ocupacion'))
                    ->join('cat_ocupacion','con_cxcreferencia.id_cat_ocupacion','=','cat_ocupacion.id')
                    ->where('con_cxcreferencia.id_con_cxcsolicitud','=',$id)
                    ->get();
                    
        return $result;
    }   
    
    public function getSolicitudPDF($id,$dbnomina){
        $result = DB::table('con_cxcsolicitud')
                    ->select(DB::raw('con_cxcsolicitud.id as id,
                                      con_cxcsolicitud.status as status,
                                      con_cxcsolicitud.fecha as fecha,
                                      con_cxcsolicitud.hora as hora,
                                      con_cxcsolicitud.razonsocial as cliente,
                                      con_cxcsolicitud.calle as calle,
                                      con_cxcsolicitud.numext as numext,
                                      con_cxcsolicitud.numint as numint,
                                      con_cxcsolicitud.colonia as colonia,
                                      con_cxcsolicitud.cp as cp,
                                      cat_municipio.descripcion as municipio,
                                      cat_estado.descripcion as estado,
                                      con_cxcsolicitud.referencias as referenciasdomiciliarias,
                                      cat_nacionalidad.descripcion as nacionalidad,
                                      con_cxcsolicitud.rfc as rfc,
                                      con_cxcsolicitud.curp as curp,
                                      con_cxcsolicitud.id_sat_regimenfiscal as sat_regimenfiscal,
                                      con_cxcsolicitud.id_sat_usocfdi as sat_usocfdi,
                                      con_cxcsolicitud.telefono as telefonos,
                                      con_cxcsolicitud.email as email,
                                      con_cxcsolicitud.limite as limite,
                                      con_cxcsolicitud.id_tpv_cliente as idcliente,
                                      con_cxcsolicitud.id_tpv_vendedor as idvendedor,
                                      pusuarios.nombre as nombrevendedor,
                                      cat_status.descripcion as txtstatus,
                                      con_cxcsolicitud.formacobro as formacobro,
                                      cat_ocupacion.descripcion as ocupacion,
                                      con_cxcsolicitud.ocupacionempleo as empleo,
                                      con_cxcsolicitud.ingresos as ingresos,
                                      con_cxcsolicitud.gastos as gastos,
                                      cat_edocivil.descripcion as edocivil,
                                      con_cxcsolicitud.personasdependientes as personasdependen,
                                      con_cxcsolicitud.conyugenombre as conyugenombre,
                                      con_cxcsolicitud.conyugetelefono as conyugetelefono,
                                      con_cxcsolicitud.tipovivienda as tipovivienda,
                                      con_cxcsolicitud.antiguedadvivienda as antiguedadvivienda,
                                      con_cxcsolicitud.creditootro as cuentaconcredito,
                                      con_cxcsolicitud.creditocuando as creditocuando,
                                      con_cxcsolicitud.creditocuanto as cuantopagaotro,
                                      tpv_cliente.clave as clienteclave,
                                      sys_persona.nombre as clientenombre,
                                      con_cxccliente.limiteinferior as limiteinferior,
                                      con_cxccliente.diaslimite as diaslimite,
                                      con_cxccliente.plazomaximo as plazomaximo,
                                      con_cxccliente.limitediario as limitediario,
                                      con_cxccliente.limitemensual as limitemensual,
                                      con_cxccliente.limiteanual as limiteanual,
                                      con_cxccliente.interesesvencido as interesesvencido,
                                      con_cxccliente.engancheminimo as engancheminimo'))
                    ->join('tpv_cliente','con_cxcsolicitud.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('con_cxccliente','con_cxcsolicitud.id_tpv_cliente','=','con_cxccliente.id_tpv_cliente')
                    ->join('tpv_vendedorcomisiones','con_cxcsolicitud.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->join('cat_status','con_cxcsolicitud.status','=','cat_status.status')
                    ->leftjoin('cat_municipio','con_cxcsolicitud.municipio','=','cat_municipio.id')
                    ->leftjoin('cat_estado','con_cxcsolicitud.estado','=','cat_estado.id')
                    ->join('cat_nacionalidad','con_cxcsolicitud.id_cat_nacionalidad','=','cat_nacionalidad.id')
                    ->leftjoin('cat_edocivil','con_cxcsolicitud.id_cat_edocivil','=','cat_edocivil.id')
                    ->join('cat_ocupacion','con_cxcsolicitud.id_cat_ocupacion','=','cat_ocupacion.id')
                    ->where('cat_status.tabla','=','con_cxcsolicitud')
                    ->where('con_cxcsolicitud.id','=',$id)
                    ->first();
        
        return $result;
    }     
    
    public function getInfoContratoPDF($id,$dbnomina){
        $result = DB::table('con_cxcsolicitud')
                    ->select(DB::raw('con_cxcsolicitud.id as id,
                                      con_cxcsolicitud.status as status,
                                      con_cxcsolicitud.fecha as fecha,
                                      con_cxcsolicitud.hora as hora,
                                      con_cxcsolicitud.razonsocial as cliente,
                                      con_cxcsolicitud.calle as calle,
                                      con_cxcsolicitud.numext as numext,
                                      con_cxcsolicitud.numint as numint,
                                      con_cxcsolicitud.colonia as colonia,
                                      con_cxcsolicitud.cp as cp,
                                      cat_municipio.descripcion as municipio,
                                      cat_estado.descripcion as estado,
                                      con_cxcsolicitud.referencias as referenciasdomiciliarias,
                                      cat_nacionalidad.descripcion as nacionalidad,
                                      con_cxcsolicitud.rfc as rfc,
                                      con_cxcsolicitud.curp as curp,
                                      con_cxcsolicitud.id_sat_regimenfiscal as sat_regimenfiscal,
                                      con_cxcsolicitud.id_sat_usocfdi as sat_usocfdi,
                                      con_cxcsolicitud.telefono as telefonos,
                                      con_cxcsolicitud.email as email,
                                      con_cxcsolicitud.limite as limite,
                                      con_cxcsolicitud.id_tpv_cliente as idcliente,
                                      con_cxcsolicitud.id_tpv_vendedor as idvendedor,
                                      pusuarios.nombre as nombrevendedor,
                                      cat_status.descripcion as txtstatus,
                                      con_cxcsolicitud.formacobro as formacobro,
                                      cat_ocupacion.descripcion as ocupacion,
                                      con_cxcsolicitud.ocupacionempleo as empleo,
                                      con_cxcsolicitud.ingresos as ingresos,
                                      con_cxcsolicitud.gastos as gastos,
                                      cat_edocivil.descripcion as edocivil,
                                      con_cxcsolicitud.personasdependientes as personasdependen,
                                      con_cxcsolicitud.conyugenombre as conyugenombre,
                                      con_cxcsolicitud.conyugetelefono as conyugetelefono,
                                      con_cxcsolicitud.tipovivienda as tipovivienda,
                                      con_cxcsolicitud.antiguedadvivienda as antiguedadvivienda,
                                      con_cxcsolicitud.creditootro as cuentaconcredito,
                                      con_cxcsolicitud.creditocuando as creditocuando,
                                      con_cxcsolicitud.creditocuanto as cuantopagaotro,
                                      tpv_cliente.clave as clienteclave,
                                      sys_persona.nombre as clientenombre,
                                      con_cxccliente.limiteinferior as limiteinferior,
                                      con_cxccliente.diaslimite as diaslimite,
                                      con_cxccliente.plazomaximo as plazomaximo,
                                      con_cxccliente.limitediario as limitediario,
                                      con_cxccliente.limitemensual as limitemensual,
                                      con_cxccliente.limiteanual as limiteanual,
                                      con_cxccliente.interesesvencido as interesesvencido,
                                      con_cxccliente.engancheminimo as engancheminimo,
                                      tpv_pedido.total as importe'))
                    ->join('tpv_pedido','con_cxcsolicitud.id_tpv_cliente','=','tpv_pedido.id_tpv_cliente')
                    ->join('tpv_cliente','con_cxcsolicitud.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('con_cxccliente','con_cxcsolicitud.id_tpv_cliente','=','con_cxccliente.id_tpv_cliente')
                    ->join('tpv_vendedorcomisiones','con_cxcsolicitud.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->join('cat_status','con_cxcsolicitud.status','=','cat_status.status')
                    ->leftjoin('cat_municipio','con_cxcsolicitud.municipio','=','cat_municipio.id')
                    ->leftjoin('cat_estado','con_cxcsolicitud.estado','=','cat_estado.id')
                    ->leftjoin('cat_nacionalidad','con_cxcsolicitud.id_cat_nacionalidad','=','cat_nacionalidad.id')
                    ->leftjoin('cat_edocivil','con_cxcsolicitud.id_cat_edocivil','=','cat_edocivil.id')
                    ->leftjoin('cat_ocupacion','con_cxcsolicitud.id_cat_ocupacion','=','cat_ocupacion.id')
                    ->where('cat_status.tabla','=','con_cxcsolicitud')
                    ->where('tpv_pedido.id','=',$id)
                    ->where('con_cxcsolicitud.status','=',1)
                    ->first();
               
        return $result;
    }      

    public function getDatosEmpresa($id){
        $result = DB::table('sys_empresa')
                    ->select(DB::raw('sys_empresa.*,sat_regimenfiscal.clave as regimenfiscal'))
                    ->join('sat_regimenfiscal','sys_empresa.id_sat_regimenfiscal','sat_regimenfiscal.id')
                    ->where('sys_empresa.id',$id)
                    ->first();
        return $result;
    }       

    public function getDatosCliente($id){
        $result = DB::table('tpv_cliente')
                    ->select(DB::raw('sys_persona.*,sys_direccion.cp as cp,sat_regimenfiscal.clave as regimenfiscal,sat_usocfdi.clave as usocfdi'))
                    ->join('sys_persona','tpv_cliente.id_sys_persona','sys_persona.id')
                    ->join('sys_direccion','tpv_cliente.id_sys_direccion','sys_direccion.id')
                    ->join('sat_regimenfiscal','sys_persona.id_sat_regimenfiscal','sat_regimenfiscal.id')
                    ->join('sat_usocfdi','sys_persona.id_sat_usocfdi','sat_usocfdi.id')
                    ->where('tpv_cliente.id',$id)
                    ->first();
        return $result;
    }

    public function getNumeroParcialidad($iddocto){
        $result = DB::table('cfdi_pago')
                    ->select(DB::raw('cfdi_pago.*'))
                    ->join('con_cxcrecibo', 'cfdi_pago.id_con_cxcpago', '=', 'con_cxcrecibo.id_con_cxcpago')
                    ->where('con_cxcrecibo.id_con_cxcdocto_real',$iddocto)
                    ->where('con_cxcrecibo.status',1)
                    ->where('cfdi_pago.status',1)
                    ->groupBy('cfdi_pago.id_con_cxcpago')
                    ->get();
        $pagos = 1;
        if(isset($result[0])){
            foreach($result as $res){
                $pagos++;
            }
        }
        return $pagos;
    }

    public function getSerieFolio($usuario,$turno,$idalmacen,$tipooperacion){
        $result = DB::table('tpv_folio')
                    ->where('id_sys_usuario',$usuario)
                    ->where('id_tpv_turno',$turno)
                    ->where('id_tpv_almacen',$idalmacen)
                    ->where('id_cat_operacion',$tipooperacion)
                    ->where('status','=',1)
                    ->first();
        return $result;
    }

    public function getPagosTimbrados($iddocto){
        $result = DB::table('cfdi_pago')
                    ->join('con_cxcpago','cfdi_pago.id_con_cxcpago','con_cxcpago.id')
                    ->join('con_cxcrecibo', 'con_cxcpago.id', '=', 'con_cxcrecibo.id_con_cxcpago')
                    ->where('con_cxcrecibo.id_con_cxcdocto_real',$iddocto)
                    ->where('con_cxcrecibo.status',1)
                    ->where('cfdi_pago.status',1)
                    ->groupBy('con_cxcrecibo.id_con_cxcdocto_real')
                    ->sum('con_cxcrecibo.importepagado');
        return $result;
    }

    public function getEnganche($iddocto){
        $result = DB::table('con_cxcamortizacion')
                    ->where('id_con_cxcdocto',$iddocto)
                    ->where('status',2)
                    ->where('numpago',0)
                    ->sum('pago');
        return $result;
    }

    public function getPago($id){
        $result = DB::table('con_cxcpago')
                    ->select(DB::raw("con_cxcpago.id AS id,
                                      SUM(con_cxcrecibo.importepagado) as pago,
                                      SUM(con_cxcrecibo.moratorio) as moratorio,
                                      con_cxcpago.total as totalpago,
                                      con_cxcdocto.monto as saldoinicial,
                                      con_cxcdocto.saldo as saldoactual,
                                      tpv_factura.uuid as uuid,
                                      tpv_factura.serie as serie,
                                      tpv_factura.folio as folio,
                                      CASE WHEN con_cxcpago.id_sat_formapago='99' THEN IFNULL(con_cxcanticipo.id_sat_formapago,'99') ELSE con_cxcpago.id_sat_formapago END AS formapago,
                                      sys_direccion.cp as lugarexpedicion,
                                      con_cxcdocto.id as idcxcdocto,
                                      con_cxcpago.folio as seriefolio,
                                      con_cxcpago.id_tpv_almacen as almacen,
                                      con_cxcpago.fecha as fecha,
                                      con_cxcpago.hora as hora,
                                      con_cxcpago.id_tpv_cliente as id_tpv_cliente,
                                      sat_regimenfiscal.clave as regimenfiscal"))
                    ->join('con_cxcrecibo', 'con_cxcpago.id', '=', 'con_cxcrecibo.id_con_cxcpago')
                    ->join('con_cxcdocto', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcdocto.id')                    
                    ->leftJoin('tpv_factura', function($join){
                        $join->on('con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido');
                        $join->on('tpv_factura.status', '=',DB::raw('1'));
                    })                 
                    ->leftJoin('con_cxcanticipo', function($join){
                        $join->on('tpv_factura.id_tpv_pedido', '=', 'con_cxcanticipo.id_tpv_pedido');
                        $join->on('con_cxcanticipo.monto', '=','con_cxcpago.total');
                        $join->on('con_cxcanticipo.status', '=',DB::raw('2'));
                    })
                    ->join('tpv_cliente', 'con_cxcpago.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                    ->join('sat_regimenfiscal', 'sys_persona.id_sat_regimenfiscal', '=', 'sat_regimenfiscal.id')
                    ->join('sat_formapago', 'con_cxcpago.id_sat_formapago', '=', 'sat_formapago.id')
                    ->join('tpv_almacen', 'con_cxcpago.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->join('sys_direccion', 'tpv_almacen.id_sys_direccion', '=', 'sys_direccion.id')
                    ->where('con_cxcpago.id', $id)
                    ->whereRaw('con_cxcpago.id NOT IN (SELECT id_con_cxcpago FROM cfdi_pago WHERE status=99)')
                    //->where('tpv_factura.status',1)
                    ->where('con_cxcrecibo.status',1)
                    ->groupBy('con_cxcrecibo.id_con_cxcdocto_real')
                    ->get();
        //dd($result);
        return $result;
    }  

    public function getPagoMoratorio($id){
        $result = DB::table('con_cxcpago')
                    ->select(DB::raw("con_cxcpago.id AS id,
                                      SUM(con_cxcrecibo.moratorio) as totalpago,
                                      con_cxcdocto.monto as saldoinicial,
                                      con_cxcdocto.saldo as saldoactual,
                                      tpv_factura.uuid as uuid,
                                      tpv_factura.serie as serie,
                                      tpv_factura.folio as folio,
                                      CASE WHEN con_cxcpago.id_sat_formapago='99' THEN IFNULL(con_cxcanticipo.id_sat_formapago,'99') ELSE con_cxcpago.id_sat_formapago END AS formapago,
                                      sys_direccion.cp as lugarexpedicion,
                                      con_cxcdocto.id as idcxcdocto,
                                      con_cxcpago.folio as seriefolio,
                                      con_cxcpago.id_tpv_almacen as almacen,
                                      con_cxcpago.fecha as fecha,
                                      con_cxcpago.hora as hora,
                                      con_cxcpago.id_tpv_cliente as id_tpv_cliente,
                                      sat_regimenfiscal.clave as regimenfiscal"))
                    ->join('con_cxcrecibo', 'con_cxcpago.id', '=', 'con_cxcrecibo.id_con_cxcpago')
                    ->join('con_cxcdocto', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcdocto.id')
                    ->leftJoin('tpv_factura', 'con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido')                    
                    ->leftJoin('con_cxcanticipo', function($join){
                        $join->on('tpv_factura.id_tpv_pedido', '=', 'con_cxcanticipo.id_tpv_pedido');
                        $join->on('con_cxcanticipo.monto', '=','con_cxcpago.total');
                        $join->on('con_cxcanticipo.status', '=',DB::raw('2'));
                    })
                    ->join('tpv_cliente', 'con_cxcpago.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                    ->join('sat_regimenfiscal', 'sys_persona.id_sat_regimenfiscal', '=', 'sat_regimenfiscal.id')
                    ->join('sat_formapago', 'con_cxcpago.id_sat_formapago', '=', 'sat_formapago.id')
                    ->join('tpv_almacen', 'con_cxcpago.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->join('sys_direccion', 'tpv_almacen.id_sys_direccion', '=', 'sys_direccion.id')
                    ->where('con_cxcpago.id', $id)
                    //->where('tpv_factura.status',1)
                    ->where('con_cxcrecibo.status',1)
                    ->groupBy('con_cxcpago.id')
                    ->get();
        return $result;
    }  

    public function savePago($usuario,$turno,$almacen,$id,$uuid,$folio){
        DB::beginTransaction();
        $result = DB::table('cfdi_pago')->insertGetId([
                    'id_con_cxcpago'=>$id,
                    'uuid'=>$uuid,
                    'folio'=>$folio
                ]);
        if($result>0){
            $increment = DB::table('tpv_folio')
                        ->where('id_sys_usuario','=',$usuario)
                        ->where('id_tpv_almacen','=',$almacen)
                        ->where('id_cat_operacion','=',21)
                        ->where('id_tpv_turno','=',$turno)
                        ->where('status','=',1)
                        ->increment('folio');
            if($increment>0){
                $resuuid = DB::table('con_cxcpago')
                            ->where('id',$id)
                            ->update([
                                'uuid'=>$uuid
                            ]);
                if($resuuid>0){
                    DB::commit();
                    return $result;
                }else{
                    DB::rollBack();
                    return 'hubo un problema al actualizar el uuid en el pago. Informe al administrador del sistema.';
                }
            }else{
                DB::rollBack();
                return 'hubo un problema al incrementar el folio del recibo de cobro. Informe al administrador del sistema.';
            }
        }else{
            DB::rollBack();
            return 'hubo un problema al insertar el registro del pago en el sistema. Informe de esto al administrador del sistema.';
        }
    }    

    public function getDatosCredito($id){
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw('con_cxcamortizacion.*,con_cxcdocto.monto as monto,con_cxccliente.interesesvencido as intereses,con_cxcformaspago.descripcion as formapago'))
                    ->join('con_cxcdocto','con_cxcamortizacion.id_con_cxcdocto','=','con_cxcdocto.id')
                    ->join('con_cxccliente','con_cxcdocto.id_con_cxccliente','=','con_cxccliente.id')
                    ->join('tpv_pedido','con_cxcdocto.id_tpv_pedido','=','tpv_pedido.id')
                    ->join('con_cxcformaspago','tpv_pedido.id_con_cxcformaspago','=','con_cxcformaspago.id')
                    ->where('con_cxcdocto.id_tpv_pedido',$id)
                    ->get();
        return $result;
    }
    
    public function getDetallePedido($id){
        $result = DB::table('tpv_pedidodetalle')
                        ->select(
                            DB::raw("tpv_pedido.id as idpedido,
                                    tpv_pedidodetalle.id as id_tpv_pedidodetalle,
                                    tpv_pedido.status as status,
                                    tpv_pedido.isAnticipo as isAnticipo,
                                    tpv_articuloalmacen.id as idarticuloalmacen,
                                    tpv_articulo.id as idarticulo,
                                    tpv_articulo.codigo as codigo,
                                    tpv_articulo.codigoproveedor as codigoproveedor,
                                    tpv_articulo.descripcioncorta as descripcioncorta,
                                    tpv_articulo.descripcion as descripcion,
                                    tpv_articulo.imagen as imagen,
                                    tpv_articulo.isService as isService,
                                    tpv_articuloimpuesto.id_cat_impuesto,
                                    (cat_impuesto.tasa/100) as tasa,
                                    tpv_pedidodetalle.precio as precio,
                                    tpv_pedidodetalleimpuesto.monto as impuesto,
                                    tpv_pedidodetalle.id as id,
                                    tpv_pedidodetalle.id_tpv_articuloprecio as idprecio,
                                    tpv_pedidodetalle.cantidad as cantidad,
                                    SUM(tpv_pedidodetalle.total) as total,
                                    SUM(tpv_pedidodetalle.descuento) as descuento"))
                        ->join('tpv_pedido','tpv_pedidodetalle.id_tpv_pedido','=','tpv_pedido.id')
                        ->leftjoin('tpv_articuloalmacen','tpv_pedidodetalle.id_tpv_articuloalmacen','=','tpv_articuloalmacen.id')
                        ->leftjoin('tpv_articulo','tpv_articuloalmacen.id_tpv_articulo','=','tpv_articulo.id')
                        ->leftjoin('tpv_articuloimpuesto','tpv_articulo.id','=','tpv_articuloimpuesto.id_tpv_articulo')
                        ->leftjoin('cat_impuesto','tpv_articuloimpuesto.id_cat_impuesto','=','cat_impuesto.id')
                        ->leftjoin('tpv_pedidodetalleimpuesto','tpv_pedidodetalle.id','=','tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle')
                        ->where('tpv_pedido.id','=',$id)
                        ->groupBy('tpv_articulo.id')
                        ->get();
                    
        return $result;
    }   
    
    public function getSolicitudCliente($id,$dbnomina){
        $result = DB::table('con_cxcsolicitud')
                    ->select(DB::raw('con_cxcsolicitud.id as id,
                                      con_cxcsolicitud.status as status,
                                      con_cxcsolicitud.fecha as fecha,
                                      con_cxcsolicitud.hora as hora,
                                      con_cxcsolicitud.razonsocial as cliente,
                                      con_cxcsolicitud.calle as calle,
                                      con_cxcsolicitud.numext as numext,
                                      con_cxcsolicitud.numint as numint,
                                      con_cxcsolicitud.colonia as colonia,
                                      con_cxcsolicitud.cp as cp,
                                      con_cxcsolicitud.municipio as municipio,
                                      con_cxcsolicitud.estado as estado,
                                      con_cxcsolicitud.referencias as referencias,
                                      con_cxcsolicitud.id_cat_nacionalidad as nacionalidad,
                                      con_cxcsolicitud.rfc as rfc,
                                      con_cxcsolicitud.curp as curp,
                                      con_cxcsolicitud.clavelector,
                                      con_cxcsolicitud.tipoclientesat,
                                      con_cxcsolicitud.id_sat_regimenfiscal as sat_regimenfiscal,
                                      con_cxcsolicitud.id_sat_usocfdi as sat_usocfdi,
                                      con_cxcsolicitud.telefono as telefono,
                                      con_cxcsolicitud.email as email,
                                      con_cxcsolicitud.id_tpv_cliente as idcliente,
                                      con_cxcsolicitud.id_tpv_vendedor as idvendedor,
                                      pusuarios.nombre as vendedor,
                                      cat_status.descripcion as txtstatus,
                                      con_cxcsolicitud.formacobro as formacobro,
                                      con_cxcsolicitud.id_cat_ocupacion as ocupacion,
                                      con_cxcsolicitud.ocupacionempleo as empleo,
                                      con_cxcsolicitud.ingresos as ingresos,
                                      con_cxcsolicitud.gastos as gastos,
                                      con_cxcsolicitud.id_cat_edocivil as edocivil,
                                      con_cxcsolicitud.personasdependientes as personasdependientes,
                                      con_cxcsolicitud.conyugenombre as conyugenombre,
                                      con_cxcsolicitud.conyugetelefono as conyugetelefono,
                                      con_cxcsolicitud.tipovivienda as tipovivienda,
                                      con_cxcsolicitud.antiguedadvivienda as antiguedadvivienda,
                                      con_cxcsolicitud.creditootro as creditootro,
                                      con_cxcsolicitud.creditocuando as creditocuando,
                                      con_cxcsolicitud.creditocuanto as creditocuanto,
                                      con_cxccliente.limiteinferior as limiteinferior,
                                      con_cxccliente.limitesuperior as limite,
                                      con_cxccliente.diaslimite as diaslimite,
                                      con_cxccliente.plazomaximo as plazomaximo,
                                      con_cxccliente.limitediario as limitediario,
                                      con_cxccliente.limitemensual as limitemensual,
                                      con_cxccliente.limiteanual as limiteanual,
                                      con_cxccliente.interesesvencido as interesesvencido,
                                      con_cxccliente.engancheminimo as engancheminimo,
                                      con_cxcsolicitud.id_tpv_almacen,
                                      con_cxccliente.capacidadPagoSemanal'))
                    ->leftjoin('tpv_cliente','con_cxcsolicitud.id_tpv_cliente','=','tpv_cliente.id')
                    ->leftjoin('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->leftjoin('con_cxccliente','con_cxcsolicitud.id_tpv_cliente','=','con_cxccliente.id_tpv_cliente')
                    ->leftjoin('tpv_vendedorcomisiones','con_cxcsolicitud.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->leftjoin($dbnomina.'.pusuarios','tpv_vendedorcomisiones.id_tpv_vendedor','=','pusuarios.idempleado')
                    ->leftjoin('cat_status','con_cxcsolicitud.status','=','cat_status.status')
                    ->where('cat_status.tabla','=','con_cxcsolicitud')
                    ->where('con_cxccliente.id_tpv_cliente','=',$id)
                    ->first();
                  
        return $result;
    }     

    public function getReferencias($id){
        $result = DB::table('con_cxcreferencia')
                    ->where('id_con_cxcsolicitud',$id)
                    ->get();                    
        return $result;
    }

    public function getEnganches($id) {
        $result = DB::table('con_cxcsolicitudgrupoenganche')
                    ->where('id_con_cxcsolicitud',$id)
                    ->orderBy('id_cat_grupomarca', 'ASC')
                    ->get();                    
        return $result;
    }

    public function aprueba($request){
        $usuario = $request->session()->get('idusuario');
        DB::beginTransaction();

        $chk = DB::table('con_cxcsolicitud')
                ->where('id',$request->id)
                ->first();
        //return $chk;
        if(isset($chk->status)){
            $docs = DB::table('cat_documentacion')
                        ->join('con_tipodocdocumentacion','cat_documentacion.id','=','con_tipodocdocumentacion.id_cat_documentacion')
                        ->where('con_tipodocdocumentacion.tipo',2)
                        ->where('con_tipodocdocumentacion.requerido',1)
                        ->where('con_tipodocdocumentacion.status',1)
                        ->where('cat_documentacion.status',1)
                        ->whereRaw("cat_documentacion.id NOT IN (SELECT id_cat_documentacion FROM con_cxcdocumentacion WHERE id_sys_usuario='".$usuario."' AND status=0)")
                        ->count();
            if($docs>0){
                DB::rollBack();
                return 'Los documentos marcados con (*) son obligatorios de subir para la generación de la solicitud';
            }else{
                $result = DB::table('con_cxcsolicitud')
                    ->where('id',$request->id)
                    ->update(
                        [
                            'id_tpv_vendedor' => $request->vendedor,
                            'razonsocial' => $request->cliente,
                            'calle' => $request->calle,
                            'numext' => $request->numext,
                            'numint' => $request->numint,
                            'colonia' => $request->colonia,
                            'cp' => $request->cp,
                            'municipio' => $request->municipio,
                            'estado' => $request->estado,
                            'referencias' => $request->referencias,
                            'id_cat_nacionalidad' => $request->nacionalidad,
                            'rfc' => $request->rfc,
                            'curp' => $request->curp,
                            'id_sat_regimenfiscal' => $request->regimenfiscal,
                            'id_sat_usocfdi' => $request->usocfdi,
                            'telefono' => $request->telefono,
                            'email' => $request->email,
                            'id_cat_ocupacion' => $request->ocupacion,
                            'ocupacionempleo' => $request->empleo,
                            'formacobro' => $request->formacobro,
                            'ingresos' => $request->ingresos,
                            'gastos' => $request->gastos,
                            'id_cat_edocivil' => $request->edocivil,
                            'personasdependientes' => $request->personasdependientes,
                            'conyugenombre' => $request->conyugenombre,
                            'conyugetelefono' => $request->conyugetelefono,
                            'tipovivienda' => $request->tipovivienda,
                            'antiguedadvivienda' => $request->antiguedadvivienda,
                            'creditootro' => $request->creditootro,
                            'creditocuando' => $request->creditocuando,
                            'creditocuanto' => $request->creditocuanto,
                            'limite' => $request->limite,
                            'id_sys_usuario_aprobacion' => $usuario,
                            'fecaprobacion' => date('Y-m-d'),
                            'horaprobacion' => date('h:i:s'),
                            'status' => 1
                        ]
                    );
                if($result>0){  
                    $fecha_actual = date('Y-m-d');
                    $fecha_vigencia = date('Y-m-d', strtotime($fecha_actual . ' +1 day'));
                    $result2 = DB::table('con_cxccliente')
                                ->where('id_tpv_cliente',$chk->id_tpv_cliente)
                                ->update([
                                    'id_tpv_vendedor' => $request->vendedor,
                                    'limiteinferior' => $request->limiteinferior,
                                    'limitesuperior' => $request->limite,
                                    'fecvigencia' => $fecha_vigencia,
                                    'diaslimite' => $request->diaslimite,
                                    'plazomaximo' => $request->plazomaximo,
                                    'limitediario' => $request->limitediario,
                                    'limitemensual' => $request->limitemensual,
                                    'limiteanual' => $request->limiteanual,
                                    'interesesvencido' => $request->interesesvencido,
                                    'engancheminimo' => $request->engancheminimo,
                                    'fecalta' => date('Y-m-d'),
                                    'status' => 1
                                ]);
                    if($result2>0){
                        $result4 = DB::table('con_cxcdocumentacion')
                                    ->where('status',0)
                                    ->where('id_sys_usuario',$request->session()->get('idusuario'))
                                    ->update([
                                        'id_con_cxcsolicitud' => $request->id,
                                        'status' => 1
                                    ]);
                        if($result4>=0){
                            DB::commit();
                            return 1;                    
                        }else{
                            DB::rollBack();
                            return 'Problemas al actualizar la información la documentación. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                        }                      
                    }else{
                        DB::rollBack();
                        return 'Problemas al actualizar la linea de crédito. Comunicarlo al administrador del sistema.';
                    }
                }else{
                    DB::rollBack();
                    return 'Problemas al actualizar la información de la solicitud. Comunicarlo al administrador del sistema.';
                }
            }
        }else{
            DB::rollBack();
            return 'Hubo un problema al obtener la información de la solicitud. Comunicarlo al administrador del sistema.';
        }
    }   

    public function actualizarSolicitudAntesDeAprobar($request) {
        $lib = new Libreria;
        $usuario = $request->session()->get('idusuario');
        DB::beginTransaction();
        $detalleEnganches = json_decode($request->detalle,true);
        //dd($detalleEnganches);
        $chk = DB::table('con_cxcsolicitud')
                ->where('id',$request->id)
                ->first();
        
        if(isset($chk->status)){
            $docs = DB::table('cat_documentacion')
                        ->join('con_tipodocdocumentacion','cat_documentacion.id','=','con_tipodocdocumentacion.id_cat_documentacion')
                        ->whereIn('con_tipodocdocumentacion.tipo',[1,2])
                        ->where('con_tipodocdocumentacion.requerido',1)
                        ->where('con_tipodocdocumentacion.status',1)
                        ->where('cat_documentacion.status',1)
                        ->whereRaw("cat_documentacion.id NOT IN (SELECT id_cat_documentacion FROM con_cxcdocumentacion WHERE id_sys_usuario='".$chk->id_sys_usuario."' AND status=1)")
                        ->count();
            
            if($docs>0){
                DB::rollBack();
                return 'Los documentos marcados con (*) son obligatorios de subir para la generación de la solicitud';
            }else{
                // ID 23 es el id_tpv_vendedor de Cristina
                if($chk->id_tpv_vendedor == 23 || $chk->id_tpv_vendedor == $request->vendedor)
                    $idVendedor = $request->vendedor;
                else
                    $idVendedor = $request->vendedor;

                $result = DB::table('con_cxcsolicitud')
                    ->where('id',$request->id)
                    ->update([
                            'id_tpv_vendedor' => $idVendedor,
                            'razonsocial' => $request->cliente,
                            'calle' => $request->calle,
                            'numext' => $request->numext,
                            'numint' => $request->numint,
                            'colonia' => $request->colonia,
                            'cp' => $request->cp,
                            'municipio' => $request->municipio,
                            'estado' => $request->estado,
                            'referencias' => $request->referencias,
                            'id_cat_nacionalidad' => $request->nacionalidad,
                            'rfc' => $request->rfc,
                            'curp' => $request->curp,
                            'clavelector' => $request->clavelector,
                            'tipoclientesat' => $request->tipoclientesat,
                            'id_sat_regimenfiscal' => $request->regimenfiscal,
                            'id_sat_usocfdi' => $request->usocfdi,
                            'telefono' => $request->telefono,
                            'email' => $request->email,
                            'id_cat_ocupacion' => $request->ocupacion,
                            'ocupacionempleo' => $request->empleo,
                            'formacobro' => $request->formacobro,
                            'ingresos' => $request->ingresos,
                            'gastos' => $request->gastos,
                            'id_cat_edocivil' => $request->edocivil,
                            'personasdependientes' => $request->personasdependientes,
                            'conyugenombre' => $request->conyugenombre,
                            'conyugetelefono' => $request->conyugetelefono,
                            'tipovivienda' => $request->tipovivienda,
                            'antiguedadvivienda' => $request->antiguedadvivienda,
                            'creditootro' => $request->creditootro,
                            'creditocuando' => $request->creditocuando,
                            'creditocuanto' => $request->creditocuanto,
                            'limite' => $request->limite,
                            //'id_sys_usuario_actualiza' => $usuario,
                            'fecha' => date('Y-m-d'),
                            'hora' => date('h:i:s'),
                            'id_tpv_almacen' => $request->sucursal
                        ]
                    );
                if($result>=0){  
                    $getReferencias = DB::table('con_cxcreferencia')
                                        ->where('id_con_cxcsolicitud', $request->id)
                                        ->get();
                    //dd($request);
                    $updateRef1 = DB::table('con_cxcreferencia')
                                    ->where('id',$getReferencias[0]->id)
                                    ->update([
                                        'nombre' => $request->ref1_nombre,
                                        'domicilio' => $request->ref1_domicilio,
                                        'telefono' => $request->ref1_telefono,
                                        'id_cat_ocupacion' => $request->ref1_ocupacion,
                                        'ocupacionempleo' => $request->ref1_empleo,
                                        'antiguedad' => $request->ref1_antiguedad,
                                        'relacion' => $request->ref1_relacion,
                                        'timestamp' => date('Y-m-d h:i:s'),
                                        'status'=>1                                            
                                    ]);
                    $updateRef2 = DB::table('con_cxcreferencia')
                                    ->where('id',$getReferencias[1]->id)
                                    ->update([
                                        'nombre' => $request->ref2_nombre,
                                        'domicilio' => $request->ref2_domicilio,
                                        'telefono' => $request->ref2_telefono,
                                        'id_cat_ocupacion' => $request->ref2_ocupacion,
                                        'ocupacionempleo' => $request->ref2_empleo,
                                        'antiguedad' => $request->ref2_antiguedad,
                                        'relacion' => $request->ref2_relacion,
                                        'timestamp' => date('Y-m-d h:i:s'),
                                        'status'=>1                                            
                                    ]);

                    
                    if($updateRef1>0 && $updateRef2>00) {
                        $result2 = DB::table('con_cxccliente')
                                    ->where('id_tpv_cliente',$chk->id_tpv_cliente)
                                    ->update([
                                        'id_tpv_vendedor' => $request->vendedor,
                                        'limiteinferior' => $request->limiteinferior,
                                        'limitesuperior' => $request->limite,
                                        'diaslimite' => $request->diaslimite,
                                        'plazomaximo' => $request->plazomaximo,
                                        'limitediario' => $request->limitediario,
                                        'limitemensual' => $request->limitemensual,
                                        'limiteanual' => $request->limiteanual,
                                        'interesesvencido' => $request->interesesvencido,
                                        'engancheminimo' => $request->engancheminimo,
                                        'capacidadPagoSemanal' => $request->capacidad,
                                        'fecvigencia' => $lib->fechaFormat($request->vigencia,'H2M'),
                                        'status'=>0
                                    ]);
                        if($result2>=0){
                            foreach ($detalleEnganches as $key => $det) {
                                //dd($det);
                                $result5 = DB::table('con_cxcsolicitudgrupoenganche')
                                            ->where("id", $det['idSolicitud'])
                                            ->update([
                                                'porcentajeenganche' => $det['porcentajeenganche'],
                                                'timestamp' => date("Y-m-d H:i:s")
                                            ]);

                                if($result5==0) {
                                    DB::rollBack();
                                    return 'Problemas al crear la relacion cliente y enganche. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                                }
                            }
                            if($result5>0){
                                $result4 = DB::table('con_cxcdocumentacion')
                                            ->where('status',0)
                                            ->where('id_sys_usuario',$request->session()->get('idusuario'))
                                            ->update([
                                                'id_con_cxcsolicitud' => $request->id,
                                                'status' => 1
                                            ]);
                                // if($result4>0){
                                    DB::commit();
                                    return 1;                    
                                // }else{
                                //     DB::rollBack();
                                //     return 'Problemas al actualizar la información la documentación. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                                // }          
                            }           
                        }else{
                            DB::rollBack();
                            return 'Problemas al actualizar la linea de crédito. Comunicarlo al administrador del sistema.';
                        }
                    }
                    else{
                        DB::rollBack();
                        return 'Problemas al actualizar la información de las referencias de la solicitud. Comunicarlo al administrador del sistema.';
                    }
                }else{
                    DB::rollBack();
                    return 'Problemas al actualizar la información de la solicitud. Comunicarlo al administrador del sistema.';
                }
            }
        }else{
            DB::rollBack();
            return 'Hubo un problema al obtener la información de la solicitud. Comunicarlo al administrador del sistema.';
        }
    }

    public function actualizar($request){
        $lib = new Libreria;
        $usuario = $request->session()->get('idusuario');
        DB::beginTransaction();
        $detalleEnganches = json_decode($request->detalle,true);

        $chk = DB::table('con_cxcsolicitud')
                ->where('id',$request->id)
                ->first();
        //dd($request);

        if(isset($chk->status)){
            $docs = DB::table('cat_documentacion')
                        ->join('con_tipodocdocumentacion','cat_documentacion.id','=','con_tipodocdocumentacion.id_cat_documentacion')
                        ->whereIn('con_tipodocdocumentacion.tipo',[1,2])
                        ->where('con_tipodocdocumentacion.requerido',1)
                        ->where('con_tipodocdocumentacion.status',1)
                        ->where('cat_documentacion.status',1)
                        ->whereRaw("cat_documentacion.id NOT IN (SELECT id_cat_documentacion FROM con_cxcdocumentacion WHERE id_sys_usuario='".$chk->id_sys_usuario."' AND status=1)")
                        ->count();
            
            if($docs>0){
                DB::rollBack();
                return 'Los documentos marcados con (*) son obligatorios de subir para la generación de la solicitud';
            }else{
                $result = DB::table('con_cxcsolicitud')
                    ->where('id',$request->id)
                    ->update(
                        [
                            'id_tpv_vendedor' => $request->vendedor,
                            'razonsocial' => $request->cliente,
                            'calle' => $request->calle,
                            'numext' => $request->numext,
                            'numint' => $request->numint,
                            'colonia' => $request->colonia,
                            'cp' => $request->cp,
                            'municipio' => $request->municipio,
                            'estado' => $request->estado,
                            'referencias' => $request->referencias,
                            'id_cat_nacionalidad' => $request->nacionalidad,
                            'rfc' => $request->rfc,
                            'curp' => $request->curp,
                            'clavelector' => $request->clavelector,
                            'tipoclientesat' => $request->tipoclientesat,
                            'id_sat_regimenfiscal' => $request->regimenfiscal,
                            'id_sat_usocfdi' => $request->usocfdi,
                            'telefono' => $request->telefono,
                            'email' => $request->email,
                            'id_cat_ocupacion' => $request->ocupacion,
                            'ocupacionempleo' => $request->empleo,
                            'formacobro' => $request->formacobro,
                            'ingresos' => $request->ingresos,
                            'gastos' => $request->gastos,
                            'id_cat_edocivil' => $request->edocivil,
                            'personasdependientes' => $request->personasdependientes,
                            'conyugenombre' => $request->conyugenombre,
                            'conyugetelefono' => $request->conyugetelefono,
                            'tipovivienda' => $request->tipovivienda,
                            'antiguedadvivienda' => $request->antiguedadvivienda,
                            'creditootro' => $request->creditootro,
                            'creditocuando' => $request->creditocuando,
                            'creditocuanto' => $request->creditocuanto,
                            'limite' => $request->limite,
                            'id_sys_usuario_actualiza' => $usuario,
                            'fecactualiza' => date('Y-m-d'),
                            'horactualiza' => date('h:i:s'),
                            'id_tpv_almacen' => $request->sucursal
                        ]
                    );
                if($result>=0){  
                    $getReferencias = DB::table('con_cxcreferencia')
                                        ->where('id_con_cxcsolicitud', $request->id)
                                        ->get();

                    $updateRef1 = DB::table('con_cxcreferencia')
                                    ->where('id',$getReferencias[0]->id)
                                    ->update([
                                        'nombre' => $request->ref1_nombre,
                                        'domicilio' => $request->ref1_domicilio,
                                        'telefono' => $request->ref1_telefono,
                                        'id_cat_ocupacion' => $request->ref1_ocupacion,
                                        'ocupacionempleo' => $request->ref1_empleo,
                                        'antiguedad' => $request->ref1_antiguedad,
                                        'relacion' => $request->ref1_relacion,
                                        'timestamp' => date('Y-m-d h:i:s'),
                                        'status'=>1                                            
                                    ]);
                    $updateRef2 = DB::table('con_cxcreferencia')
                                    ->where('id',$getReferencias[1]->id)
                                    ->update([
                                        'nombre' => $request->ref2_nombre,
                                        'domicilio' => $request->ref2_domicilio,
                                        'telefono' => $request->ref2_telefono,
                                        'id_cat_ocupacion' => $request->ref2_ocupacion,
                                        'ocupacionempleo' => $request->ref2_empleo,
                                        'antiguedad' => $request->ref2_antiguedad,
                                        'relacion' => $request->ref2_relacion,
                                        'timestamp' => date('Y-m-d h:i:s'),
                                        'status'=>1                                            
                                    ]);

                    
                    if($updateRef1>0 && $updateRef2>00) {
                        $result2 = DB::table('con_cxccliente')
                                    ->where('id_tpv_cliente',$chk->id_tpv_cliente)
                                    ->update([
                                        'id_tpv_vendedor' => $request->vendedor,
                                        'limiteinferior' => $request->limiteinferior,
                                        'limitesuperior' => $request->limite,
                                        'diaslimite' => $request->diaslimite,
                                        'plazomaximo' => $request->plazomaximo,
                                        'limitediario' => $request->limitediario,
                                        'limitemensual' => $request->limitemensual,
                                        'limiteanual' => $request->limiteanual,
                                        'interesesvencido' => $request->interesesvencido,
                                        'engancheminimo' => $request->engancheminimo,
                                        'capacidadPagoSemanal' => $request->capacidad,
                                        'fecvigencia' => $lib->fechaFormat($request->vigencia,'H2M'),
                                        'id_cat_tipocliente' => $request->estatus,
                                        'status'=>1
                                    ]);
                        if($result2>=0){
                            foreach ($detalleEnganches as $key => $det) {
                                //dd($det);
                                $result5 = DB::table('con_cxcsolicitudgrupoenganche')
                                            ->where("id", $det['idSolicitud'])
                                            ->update([
                                                'porcentajeenganche' => $det['porcentajeenganche'],
                                                'timestamp' => date("Y-m-d H:i:s")
                                            ]);

                                if($result5==0) {
                                    DB::rollBack();
                                    return 'Problemas al crear la relacion cliente y enganche. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                                }
                            }
                            if($result5>0){
                                $result4 = DB::table('con_cxcdocumentacion')
                                            ->where('status',0)
                                            ->where('id_sys_usuario',$request->session()->get('idusuario'))
                                            ->update([
                                                'id_con_cxcsolicitud' => $request->id,
                                                'status' => 1
                                            ]);
                                // if($result4>0){
                                    DB::commit();
                                    return 1;                    
                                // }else{
                                //     DB::rollBack();
                                //     return 'Problemas al actualizar la información la documentación. Verifique su conexión e intente de nuevo. Si el problema persiste comuníquelo al administrador del sistema';
                                // }   
                            }                 
                        }else{
                            DB::rollBack();
                            return 'Problemas al actualizar la linea de crédito. Comunicarlo al administrador del sistema.';
                        }
                    }
                    else{
                        DB::rollBack();
                        return 'Problemas al actualizar la información de las referencias de la solicitud. Comunicarlo al administrador del sistema.';
                    }
                }else{
                    DB::rollBack();
                    return 'Problemas al actualizar la información de la solicitud. Comunicarlo al administrador del sistema.';
                }
            }
        }else{
            DB::rollBack();
            return 'Hubo un problema al obtener la información de la solicitud. Comunicarlo al administrador del sistema.';
        }
    } 

    public function denegar($request){
        $usuario = $request->session()->get('idusuario');
        DB::beginTransaction();

        $chk = DB::table('con_cxcsolicitud')
                ->where('id',$request->id)
                ->first();
        //return $chk;
        if(isset($chk->status)){
            $result = DB::table('con_cxcsolicitud')
                ->where('id',$request->id)
                ->update(
                    [
                        'id_sys_usuario_denegado' => $usuario,
                        'motivoDenegado' => $request->motivo,
                        'fecdenegado' => date('Y-m-d'),
                        'hordenegado' => date('h:i:s'),
                        'status' => 99
                    ]
                );
            if($result>0){  
                DB::commit();
                return 1;
            }else{
                DB::rollBack();
                return 'Problemas al actualizar la información de la solicitud. Comunicarlo al administrador del sistema.';
            }
        }else{
            DB::rollBack();
            return 'Hubo un problema al obtener la información de la solicitud. Comunicarlo al administrador del sistema.';
        }
    }

    public function getPagosReimpresion($idcliente, $fechainicio, $fechafin, $dbnomina, $nameCarpeta) {
        $result = DB::table('con_cxcpago')
                    ->select(DB::raw("con_cxcpago.*, 
                                        tpv_almacen.descripcion as almacencobro, 
                                        usuario.nombre as usuariocobro,
                                        '".$nameCarpeta."' as nameCarpeta,
                                        IFNULL(cfdi_pago.folio,'') as seriefolio,
                                        IFNULL(tpv_factura.folio,'') as factfolio,
                                        IFNULL(tpv_factura.serie,'') as factserie,
                                        CASE WHEN con_cxcpago.id_sat_formapago='99' THEN IFNULL(con_cxcanticipo.id_sat_formapago,'99') ELSE con_cxcpago.id_sat_formapago END AS id_sat_formapago,
                                        CASE WHEN con_cxcpago.id_sat_formapago='99' THEN IFNULL((SELECT descripcion FROM sat_formapago WHERE id=con_cxcanticipo.id_sat_formapago),'POR DEFINIR') ELSE sat_formapago.descripcion END as formapago,
                                        con_cxcdocto.status as statusDocto"))
                    ->join('con_cxcrecibo', 'con_cxcpago.id', '=', 'con_cxcrecibo.id_con_cxcpago')
                    ->join('con_cxcdocto', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcdocto.id')
                    ->leftJoin('tpv_factura', function($join){
                        $join->on('con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido');
                        $join->on('tpv_factura.status', '=',DB::raw('1'));
                    })
                    ->leftJoin('con_cxcanticipo', function($join){
                        $join->on('tpv_factura.id_tpv_pedido', '=', 'con_cxcanticipo.id_tpv_pedido');
                        $join->on('con_cxcanticipo.monto', '=','con_cxcpago.total');
                        $join->on('con_cxcanticipo.status', '=',DB::raw('2'));
                    })
                    ->join('tpv_cliente', 'con_cxcpago.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sat_formapago', 'con_cxcpago.id_sat_formapago', '=', 'sat_formapago.id')
                    ->join('tpv_almacen', 'con_cxcpago.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->join($dbnomina.'.pempleado as usuario', 'con_cxcpago.id_sys_usuario', '=', 'usuario.nip')
                    ->leftJoin('cfdi_pago', function($join){
                        $join->on('con_cxcpago.id', '=', 'cfdi_pago.id_con_cxcpago');
                        $join->on('cfdi_pago.status', '=',DB::raw('1'));
                    })
                    ->where('tpv_cliente.id',$idcliente)
                    ->where('con_cxcpago.fecha', '>=', $fechainicio)
                    ->where('con_cxcpago.fecha', '<=', $fechafin)
                    ->whereNotIn('con_cxcpago.status',[99])
                    ->groupBy('con_cxcpago.id')
                    ->orderBy('con_cxcpago.id','DESC')
                    ->get();
      
        return $result;
    }

    public function getDetallePago($id, $dbnomina) {
        
        $getRecibos = DB::table('con_cxcrecibo')
                            ->select(DB::raw("con_cxcrecibo.*, con_cxcpago.total as pagototal, con_cxcpago.folio, sys_persona.nombre as cliente,
                                                usuario.nombre as usuariocobro, tpv_almacen.descripcion as almacencobro, con_cxcamortizacion.numpago,
                                                '' as totalpagos, sat_formapago.descripcion as formapago, con_cxcdocto.id_con_cxccliente, '' as articulos, '' as fechacompra,
                                                IFNULL(tpv_factura.serie, '') as serieFact, IFNULL(tpv_factura.folio, '') as folioFact, IFNULL(tpv_factura.id_tpv_pedido, '') as id_tpv_pedido"))
                            ->join('con_cxcpago', 'con_cxcrecibo.id_con_cxcpago', '=', 'con_cxcpago.id')
                            ->join('tpv_cliente', 'con_cxcpago.id_tpv_cliente', '=', 'tpv_cliente.id')
                            ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                            ->join($dbnomina.'.pempleado as usuario', 'con_cxcpago.id_sys_usuario', '=', 'usuario.nip')
                            ->join('tpv_almacen', 'con_cxcpago.id_tpv_almacen', '=', 'tpv_almacen.id')
                            ->join('con_cxcamortizacion', 'con_cxcrecibo.id_con_cxcdocto', '=', 'con_cxcamortizacion.id')
                            ->join('sat_formapago', 'con_cxcrecibo.id_sat_formapago', '=', 'sat_formapago.id')
                            ->join('con_cxcdocto', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcdocto.id')
                            //->leftjoin('tpv_factura', 'con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido')
                            ->leftjoin('tpv_factura', function($join)
                            {
                                $join->on('con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido')
                                    ->where('tpv_factura.status', '<>', 99);
                            })
                            ->where('con_cxcrecibo.id_con_cxcpago',$id)
                            ->get();
        //dd($getRecibos);
        
        foreach ($getRecibos as $key => $value) {
            $descripcion = '';
            $fecha = '';
            //dd($value);
            if($value->id_tpv_pedido!='') {
                $getArticulos = DB::table('tpv_pedidodetalle')
                                ->select(DB::raw("tpv_pedidodetalle.*, tpv_pedido.fecha"))
                                ->join("tpv_pedido", "tpv_pedidodetalle.id_tpv_pedido", "=", "tpv_pedido.id")
                                ->where("tpv_pedidodetalle.id_tpv_pedido", $value->id_tpv_pedido)
                                ->get();
                //dd($getArticulos);
                foreach ($getArticulos as $key => $articulo) {
                    $descripcion = $descripcion.$articulo->descripcion."\n";
                    $fecha = $articulo->fecha;
                }
                $value->articulos = $descripcion;
                $value->fechacompra = $fecha;
            }
            
            $getPagosCLiente = DB::table('con_cxcamortizacion')
                            ->select(DB::raw('con_cxcamortizacion.*'))
                            ->where('con_cxcamortizacion.id_con_cxcdocto',$value->id_con_cxcdocto_real)
                            ->latest('id')->first();
            
            $getSaldoRestante = DB::table('con_cxcdocto')
                            ->where('id_con_cxccliente',$value->id_con_cxccliente)
                            ->where('status', 1)
                            ->sum('saldo');

            $getMoratorioRestante = DB::table('con_cxcdocto')
                            ->select(DB::raw('SUM(con_cxcamortizacion.moratorio) as saldomoratorio'))
                            ->join("con_cxcamortizacion", "con_cxcamortizacion.id_con_cxcdocto", "=", "con_cxcdocto.id")
                            ->where('con_cxcdocto.id_con_cxccliente',$value->id_con_cxccliente)
                            ->where('con_cxcamortizacion.status', 1)
                            ->first();

            $value->totalpagos = $getPagosCLiente->numpago;
            $value->saldorestante = $getSaldoRestante;
            $value->moratoriorestante = $getMoratorioRestante->saldomoratorio;
        }
        //dd($getRecibos);
        return $getRecibos;
    }

    public function getProximoPago($id, $dbnomina) {
        $result = DB::table('con_cxcrecibo')
                    ->select(DB::raw('con_cxcamortizacion.*'))
                    ->join('con_cxcpago', 'con_cxcrecibo.id_con_cxcpago', '=', 'con_cxcpago.id')
                    ->join('con_cxcamortizacion', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcamortizacion.id_con_cxcdocto')
                    ->where('con_cxcpago.id',$id)
                    ->get();
        
        $pago = 0;  
        foreach($result as $amortizacion) {
            if(floatval($amortizacion->saldo) != 0.0){
                $pago = $amortizacion;
                break;
            }
        }
        //dd($pago);
        return $pago;
    }

    public function getVentasCliente($idcliente, $nameCarpeta) {
        $result = DB::table('tpv_pedido')
                    ->select(DB::raw('tpv_pedido.*'))
                    ->where('tpv_pedido.id_tpv_cliente',$idcliente)
                    ->get();
        $arrayVentas = array();
        foreach($result as $venta) {
            /*if (!file_exists("../pdf/creditos/comprobantes/".$nameCarpeta."/".$venta->id_tpv_cliente."_8_.pdf")) {
                $corte->existe=0;
            } else 
                $corte->existe=1;*/
            $existe = DB::table('con_cxcdocumentacion')
                ->select(DB::raw('con_cxcdocumentacion.*'))
                //->join('con_cxcpago', 'con_cxcrecibo.id_con_cxcpago', '=', 'con_cxcpago.id')
                //->join('con_cxcamortizacion', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcamortizacion.id_con_cxcdocto')
                ->where('con_cxcdocumentacion.url', "LIKE", $venta->id_tpv_cliente."_8_".$venta->id."%")
                ->first();
            
            if(!isset($existe)) {
                array_push($arrayVentas, $venta);
            }
        }

        return $arrayVentas;
    }

    public function guardaContratoCliente($tipodoc,$usuario,$file,$idsolicitud){
        $result = DB::table('con_cxcdocumentacion')->insertGetId(
            [
                'id_con_cxcsolicitud' => $idsolicitud,
                'id_cat_documentacion' => $tipodoc,
                'id_sys_usuario' => $usuario,
                'url' => $file,
                'fecha' => date('Y-m-d'),
                'hora' => date('H:i:s'),
                'status' => 1
            ]
        );
        return $result;
    }

    public function cancelaPago($request){
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $lib = new Libreria;
        DB::beginTransaction();

        $id = $request->id;

        /*
        1.- Status 99 a cxcpago y cxcrecibo
        2.- Actualización de saldo en cxcdocto, actualiza status a 2 solo si fue liquidación.
        3.- Actualizacion de cxcamortizacion (saldo y status) (Status solo si fue pago total)
        4.- Generamos el asiento contrario al del pago
        */
        if($request->tipodev==7){
            $updpe = DB::table('cfdi_pago')
                        ->where('uuid',$request->uuid)
                        ->update([
                            'status'=>99
                        ]);
            if($updpe>0){
                DB::commit();
                return $updpe;
            }else{
                DB::rollBack();
                return 'Problemas al actualizar la informacion del cfdi. Informa al administrador del sistema.';
            }
        }else{
            $recibos = DB::table('con_cxcrecibo')
                        ->where('id_con_cxcpago','=',$id)
                        ->where('status','=',1)
                        ->get();
            //dd($recibos);
            if(isset($recibos[0])){
                $error = '';
                $importepagado = 0;
                foreach($recibos as $recibo){
                    $upd1 = DB::table('con_cxcrecibo')
                            ->where('id',$recibo->id)
                            ->update([
                                'status'=>99,
                                'id_sys_usuario_cancelo' => $usuario,
                                'fechacancelacion'=>date('Y-m-d')
                            ]);
                    if($upd1>0){
                        //dd($upd1);
                        $amort = DB::table('con_cxcamortizacion')
                                    ->where('id',$recibo->id_con_cxcdocto)
                                    ->first();
                        if(isset($amort->id)){
                            $saldoant = $amort->saldo;
                            $abonoant = $amort->abono;
                            $status = $amort->status;
                            if($saldoant==0 && $recibo->importepagado>0){
                                $status = 1;
                            }
                            $saldonuevo = $saldoant + $recibo->importepagado;
                            $abononuevo = $abonoant - $recibo->importepagado;
                            $upd2 = DB::table('con_cxcamortizacion')
                                ->where('id',$amort->id)
                                ->update([
                                    'status'=>$status,
                                    'abono'=>$abononuevo,
                                    'saldo'=>$saldonuevo
                                ]);
                            if($upd2>0){
                                $cxcdocto = DB::table('con_cxcdocto')
                                            ->where('id',$recibo->id_con_cxcdocto_real)
                                            ->first();
                                if(isset($cxcdocto->id)){
                                    $cxcsaldoant = $cxcdocto->saldo;
                                    $cxcstatus = $cxcdocto->status;
                                    if($cxcsaldoant==0 && $recibo->importepagado>0){
                                        $cxcstatus = 1;
                                    }
                                    $cxcsaldonuevo = $cxcsaldoant + $recibo->importepagado;
                                    $upd3 = DB::table('con_cxcdocto')
                                        ->where('id',$cxcdocto->id)
                                        ->update([
                                            'status'=>$cxcstatus,
                                            'saldo'=>$cxcsaldonuevo
                                        ]);
                                    if($upd3>0){
                                        $importepagado = $importepagado + $recibo->importepagado;  
                                    }else{
                                        $error = 'Problemas al actualizar la informacion del documento CXC. Informa al administrador del sistema.';
                                    }
                                }else{
                                    $error = 'Problemas al obtener la informacion del documento CXC. Informa al administrador del sistema.';
                                }                          
                            }else{
                                $error = 'Problemas al actualizar la informacion de la amortizacion. Informa al administrador del sistema.';
                            }
                        }else{
                            $error = 'Problemas al obtener la informacion de la amortizacion. Informa al administrador del sistema.';
                        }
                    }else{
                        $error = 'Problemas al actualizar la informacion del recibo. Informa al administrador del sistema.';
                    }
                }
                
                if($error==''){
                    //dd("error", $error, $id);
                    $upd3 = DB::table('con_cxcpago')
                            ->where('id',$id)
                            ->update([
                                'fecha_cancelacion'=>date('Y-m-d'),
                                'motivo_cancelacion'=>$request->motivo,
                                'usuario_cancelacion'=>$usuario,
                                'tipo_cancelacion'=>$request->tipodev,
                                'status'=>99
                            ]);
                    if($upd3>0){
                        $cxcpago = DB::table('con_cxcpago')
                                        ->where('id',$id)
                                        ->first();
                        $erroruuid = true;
                        if(isset($request->uuid) && $request->uuid!="0" && $cxcpago->id_sat_formapago!='404'){
                            //dd("error", $error, $id, $request->uuid);
                            $upd6 = DB::table('cfdi_pago')
                                    ->where('uuid',$request->uuid)
                                    ->update([
                                        'fechacancelacion'=>date("Y-m-d"),
                                        'status'=>99
                                    ]);
                            if($upd6>0){
                                $erroruuid = true;
                            }else{
                                $erroruuid = false;
                            }
                        }
                        if(!$erroruuid){
                            DB::rollBack();
                            return 'Problemas al actualizar el stuatus del UUID. Informa al administrador del sistema.';
                        }
                        if(isset($cxcpago->id)){                            
                            if($request->tipodev==1){
                                //dd($idsatformapago);
                                //YA NO SE CREARÁ ANTICIPO AHORA SE CREA NOTA DE CREDITO
                                //CREAMOS EL ANTICIPO
                                $folioant = DB::table('tpv_folio')
                                        ->where('id_sys_usuario',$usuario)
                                        ->where('id_tpv_turno',$turno)
                                        ->where('id_tpv_almacen', $cxcpago->id_tpv_almacen)              
                                        ->where('id_cat_operacion',13)
                                        ->where('status','=',1)
                                        ->first();
                                //dd("folioant", $folioant, $totanticipo);
                                if(isset($folioant->serie)){
                                    $a_aupd2 = DB::table('tpv_folio')
                                            ->where('id_sys_usuario',$usuario)
                                            ->where('id_tpv_turno',$turno)
                                            ->where('id_tpv_almacen', $cxcpago->id_tpv_almacen)              
                                            ->where('id_cat_operacion',13)
                                            ->where('status','=',1)
                                            ->increment('folio');
                                    //dd($a_aupd2, $folioant);
                                    if($a_aupd2>0){
                                        //INSERTAMOS EL ANTICIPO
                                        //TIPO 1->Devolucion Total venta completa, 2->Devolucion Parcial de Venta, 3-> Devolución de pagos de venta PPD
                                        $a_anticipo = DB::table('con_cxcnotacredito')->insertGetId([
                                            'id_tpv_almacen'=>$cxcpago->id_tpv_almacen,
                                            'id_sys_usuario'=>$usuario,
                                            'id_tpv_turno'=>$turno,
                                            'id_tpv_cliente'=>$cxcpago->id_tpv_cliente,
                                            'id_sat_formapago'=>$cxcpago->id_sat_formapago,
                                            'folio'=>$folioant->serie.'-'.$folioant->folio,
                                            'fecha'=>date('Y-m-d'),
                                            'hora'=>date('H:i:s'),
                                            'subtotal'=>round(($cxcpago->total/1.16),2),
                                            'iva'=>round(($cxcpago->total/1.16)*.16,2),
                                            'total'=>$cxcpago->total,
                                            'uuid'=>'',
                                            'tabla_origen'=>'cxc_pago',
                                            'id_origen'=>$cxcpago->id,
                                            'uuid_origen'=>$cxcpago->uuid,
                                            'tipo'=>1
                                        ]);
                                        if($a_anticipo>0){                
                                            //Movimientos Contables
                                            // CREACION DEL ASIENTO CONTABLE                            
                                            //Creamos la cabecera del asiento contable
                                            $conhead = DB::table('con_asiento')->insertGetId([
                                                'id_sys_usuario'=>$usuario,
                                                'id_cat_tipoasiento'=>96,
                                                'concepto'=>'DEVOLUCION DE PAGO DE CLIENTE '.strtoupper($cxcpago->folio),
                                                'fecha'=>date('Y-m-d'),
                                                'hora'=>date('H:i:s'),
                                                'debe'=>$cxcpago->total,
                                                'haber'=>$cxcpago->total
                                            ]);
                                            if($conhead>0){
                                                $almcc = DB::table('tpv_almacen')
                                                            ->select(DB::raw('con_centrocosto.*'))
                                                            ->join('con_centrocosto','tpv_almacen.id_con_centrocosto','=','con_centrocosto.id')
                                                            ->where('tpv_almacen.id',$cxcpago->id_tpv_almacen)
                                                            ->first();
                                                if(isset($almcc->id)){  
                                                    $movimientos = array();
                                                    $cli = DB::table('tpv_cliente')
                                                            ->select(DB::raw('tpv_cliente.*,sys_persona.nombre as nombre'))
                                                            ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                                                            ->where('tpv_cliente.id',$cxcpago->id_tpv_cliente)
                                                            ->first(); 
                                                    $ctacxc = '105 001 '.str_pad($cli->clave, 6, "0", STR_PAD_LEFT);
                                                    $ctaant = '206 001 '.str_pad($cli->clave, 6, "0", STR_PAD_LEFT);
                                                    $cac = DB::table('con_cuentas')->where('numerocuenta',$ctaant)->first();
                                                    if(isset($cac->numerocuenta)){
                                                        $cuentaclienteanticipo = $ctaant;
                                                    }else{
                                                        $arrejercicio = array(2022=>0,2023=>0,2024=>0,2025=>0,2026=>0,2027=>0,2028=>0);
                                                        $cuentaclienteanticipo = DB::table('con_cuentas')->insertGetId([
                                                            'numerocuenta'=>$ctaant,
                                                            'descripcion'=>$cli->nombre,
                                                            'codigoagrupador'=>'206.01',
                                                            'id_sys_usuario'=>$usuario,
                                                            'fecha'=>date('Y-m-d'),
                                                            'hora'=>date('H:i:s'),
                                                            'saldoinicial'=>0,
                                                            'id_con_ejercicio'=>$arrejercicio[date('Y')] //Cambiar a que sea el del ejercicio actual
                                                        ]);
                                                    }

                                                    $subtot = (float)$cxcpago->total/1.16;
                                                    $iva = (float)$cxcpago->total - ((float)$cxcpago->total/1.16);
                                                    $tot = (float)$cxcpago->total;

                                                    if($cxcpago->id_sat_formapago!=201){
                                                        // Cargo a Clientes
                                                        $movimientos[] = [
                                                            'id_con_asiento'=>$conhead,
                                                            'cuenta'=>$ctacxc,
                                                            'id_con_centrocosto'=>$almcc->id,
                                                            'debe'=>$tot,
                                                            'haber'=>0
                                                        ];
                                                        // Cargo a iva trasladado
                                                        $movimientos[] = [
                                                            'id_con_asiento'=>$conhead,
                                                            'cuenta'=>'209 001 000001',
                                                            'id_con_centrocosto'=>$almcc->id,
                                                            'debe'=>$iva,
                                                            'haber'=>0
                                                        ];
                                                        // Abono a cuenta Anticipos
                                                        $movimientos[] = [
                                                            'id_con_asiento'=>$conhead,
                                                            'cuenta'=>$ctaant,
                                                            'id_con_centrocosto'=>$almcc->id,
                                                            'debe'=>0,
                                                            'haber'=>$tot
                                                        ]; 
                                                        // Cargo a iva pendiente por trasladar
                                                        $movimientos[] = [
                                                            'id_con_asiento'=>$conhead,
                                                            'cuenta'=>'208 001 000001',
                                                            'id_con_centrocosto'=>$almcc->id,
                                                            'debe'=>0,
                                                            'haber'=>$iva
                                                        ];
                                                    }else{                                              
                                                        // Cargo a Descuentos o Bonificaciones
                                                        $movimientos[] = [
                                                            'id_con_asiento'=>$conhead,
                                                            'cuenta'=>'402 001',
                                                            'id_con_centrocosto'=>$almcc->id,
                                                            'debe'=>0,
                                                            'haber'=>$tot
                                                        ];            
                                                        // Cargo a Clientes
                                                        $movimientos[] = [
                                                            'id_con_asiento'=>$conhead,
                                                            'cuenta'=>$ctacxc,
                                                            'id_con_centrocosto'=>$almcc->id,
                                                            'debe'=>$tot,
                                                            'haber'=>0
                                                        ];  
                                                    } 
                                                    $condet = DB::table('con_asientodetalle')->insert($movimientos);
                                                    if($condet>0){
                                                        DB::commit();
                                                        return intval($cxcpago->id_sat_formapago);
                                                    }else{
                                                        DB::rollBack();
                                                        return 'Problemas al crear el detalle del asiento contable. Informa al administrador del sistema.';
                                                    }
                                                }else{
                                                    DB::rollBack();
                                                    return 'No existe registro de centro de costos para este almacen. Informa al administrador del sistema.';
                                                }
                                            }else{
                                                DB::rollBack();
                                                return 'Problemas al crear la cabecera del asiento contable. Informa al administrador del sistema.';
                                            }
                                        }else{
                                            DB::rollBack();
                                            return 'Problemas al crear el anticipo. Informa al administrador del sistema.';
                                        }
                                    }else{
                                        DB::rollBack();
                                        return 'Problemas al incrementar el folio del anticipo. Informa al administrador del sistema.';
                                    }
                                }else{
                                    DB::rollBack();
                                    return 'Problemas al obtener el folio del anticipo. Informa al administrador del sistema.';
                                }                                
                            }else{
                                if($request->tipodev==2){
                                    // CREACION DEL ASIENTO CONTABLE                            
                                    //Creamos la cabecera del asiento contable
                                    $conhead = DB::table('con_asiento')->insertGetId([
                                        'id_sys_usuario'=>$usuario,
                                        'id_cat_tipoasiento'=>96,
                                        'concepto'=>'DEVOLUCION DE PAGO DE CLIENTE '.strtoupper($cxcpago->folio),
                                        'fecha'=>date('Y-m-d'),
                                        'hora'=>date('H:i:s'),
                                        'debe'=>$importepagado,
                                        'haber'=>$importepagado
                                    ]);
                                    if($conhead>0){
                                        $almcc = DB::table('tpv_almacen')
                                                    ->select(DB::raw('con_centrocosto.*'))
                                                    ->join('con_centrocosto','tpv_almacen.id_con_centrocosto','=','con_centrocosto.id')
                                                    ->where('tpv_almacen.id',$cxcpago->id_tpv_almacen)
                                                    ->first();
                                        if(isset($almcc->id)){  
                                            $movimientos = array();

                                            $cli = DB::table('tpv_cliente')
                                                    ->select(DB::raw('tpv_cliente.*,sys_persona.nombre as nombre'))
                                                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                                                    ->where('tpv_cliente.id',$cxcpago->id_tpv_cliente)
                                                    ->first(); 
                                            $ctacxc = '105 001 '.str_pad($cli->clave, 6, "0", STR_PAD_LEFT);
                                            $ctaant = '206 001 '.str_pad($cli->clave, 6, "0", STR_PAD_LEFT);
                                            $cac = DB::table('con_cuentas')->where('numerocuenta',$ctaant)->first();
                                            if(isset($cac->numerocuenta)){
                                                $cuentaclienteanticipo = $ctaant;
                                            }else{                                                
                                                $arrejercicio = array(2022=>0,2023=>0,2024=>0,2025=>0,2026=>0,2027=>0,2028=>0);
                                                $cuentaclienteanticipo = DB::table('con_cuentas')->insertGetId([
                                                    'numerocuenta'=>$ctaant,
                                                    'descripcion'=>$cli->nombre,
                                                    'codigoagrupador'=>'206.01',
                                                    'id_sys_usuario'=>$usuario,
                                                    'fecha'=>date('Y-m-d'),
                                                    'hora'=>date('H:i:s'),
                                                    'saldoinicial'=>0,
                                                    'id_con_ejercicio'=>$arrejercicio[date('Y')]
                                                ]);
                                            }

                                            $subtot = (float)$importepagado/1.16;
                                            $iva = (float)$importepagado - ((float)$importepagado/1.16);
                                            $tot = (float)$importepagado;

                                            if($cxcpago->id_sat_formapago!=201){
                                                // Abono a Caja o Banco
                                                $movimientos[] = [
                                                    'id_con_asiento'=>$conhead,
                                                    'cuenta'=>$almcc->cuentacaja,
                                                    'id_con_centrocosto'=>$almcc->id,
                                                    'debe'=>0,
                                                    'haber'=>$tot
                                                ];
                                                // Cargo a iva pendiente por trasladar
                                                $movimientos[] = [
                                                    'id_con_asiento'=>$conhead,
                                                    'cuenta'=>'209 001 000001',
                                                    'id_con_centrocosto'=>$almcc->id,
                                                    'debe'=>0,
                                                    'haber'=>$iva
                                                ];
                                                // Cargo a iva trasladado
                                                $movimientos[] = [
                                                    'id_con_asiento'=>$conhead,
                                                    'cuenta'=>'208 001 000001',
                                                    'id_con_centrocosto'=>$almcc->id,
                                                    'debe'=>$iva,
                                                    'haber'=>0
                                                ];
                                            }else{                                              
                                                // Cargo a Descuentos o Bonificaciones
                                                $movimientos[] = [
                                                    'id_con_asiento'=>$conhead,
                                                    'cuenta'=>'402 001',
                                                    'id_con_centrocosto'=>$almcc->id,
                                                    'debe'=>0,
                                                    'haber'=>$tot
                                                ];       
                                            }
                                            // Cargo a Clientes
                                            $movimientos[] = [
                                                'id_con_asiento'=>$conhead,
                                                'cuenta'=>$ctacxc,
                                                'id_con_centrocosto'=>$almcc->id,
                                                'debe'=>$tot,
                                                'haber'=>0
                                            ];
                                            $condet = DB::table('con_asientodetalle')->insert($movimientos);
                                            if($condet>0){
                                                DB::commit();
                                                return intval($cxcpago->id_sat_formapago);
                                            }else{
                                                DB::rollBack();
                                                return 'Problemas al crear el detalle del asiento contable. Informa al administrador del sistema.';
                                            }
                                        }else{
                                            DB::rollBack();
                                            return 'No existe registro de centro de costos para este almacen. Informa al administrador del sistema.';
                                        }
                                    }else{
                                        DB::rollBack();
                                        return 'Problemas al crear la cabecera del asiento contable. Informa al administrador del sistema.';
                                    }
                                }else{           
                                    if($request->tipodev==99){ 
                                        $truncate = DB::table('con_asiento')
                                                        ->where('referencia',$cxcpago->folio)
                                                        ->where('id_cat_tipoasiento',19)
                                                        ->first();
                                        if(isset($truncate->id)){
                                            $borradetasiento = DB::table('con_asientodetalle')->where('id_con_asiento',$truncate->id)->delete();
                                            if($borradetasiento>0){
                                                $borraasiento = DB::table('con_asiento')->where('id',$truncate->id)->delete();
                                                if($borraasiento>0){                  
                                                    DB::commit();
                                                    return intval($cxcpago->id_sat_formapago);
                                                }else{
                                                    DB::rollBack();
                                                    return 'Problemas al eliminar la cabecera del asiento. Informa al administrador del sistema.';
                                                }
                                            }else{                                                
                                                DB::rollBack();
                                                return 'Problemas al eliminar el detalle del asiento. Informa al administrador del sistema.';
                                            }
                                        }else{
                                            DB::commit();
                                            return intval($cxcpago->id_sat_formapago);
                                        }
                                    }else{         
                                        if($request->tipodev==3){                                        
                                            DB::commit();
                                            return intval($cxcpago->id_sat_formapago);
                                        }else{
                                            DB::rollBack();
                                            return 'No se eligio un tipo de devolucion congruente con el pago seleccionado.';
                                        }
                                    } 
                                }     
                            } 
                        }else{
                            DB::rollBack();
                            return 'Problemas al obtener la informacion del pago. Informa al administrador del sistema.';
                        }
                    }else{
                        DB::rollBack();
                        return 'Problemas al actualizar la informacion del pago. Informa al administrador del sistema.';
                    }
                }else{
                    DB::rollBack();
                    return $error;
                }
            }else{
                DB::rollBack();
                return 'No se encontro informacion de los recibos de este pago. Informa al administrador del sistema.';
            }
        }
    }

    public function getAmortizaciones($hoy) {
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw('con_cxcamortizacion.*,con_cxccliente.diaslimite as diaslimite,con_cxccliente.interesesvencido as interesesvencido'))
                    ->join('con_cxcdocto', 'con_cxcamortizacion.id_con_cxcdocto', '=', 'con_cxcdocto.id')
                    ->join('con_cxccliente', 'con_cxcdocto.id_con_cxccliente', '=', 'con_cxccliente.id')
                    ->where('con_cxcamortizacion.status',1)
                    //->whereRaw("con_cxcamortizacion.fecfija<'".$hoy."'")
                    ->whereRaw("con_cxcamortizacion.id NOT IN (SELECT id_con_cxcamortizacion FROM con_cxcamortizacioninteres WHERE status=1 AND id_cat_tipointeres=1)")
                    ->get();  
        return $result;
    }

    public function aplicaInteres($id,$tipo,$monto) {
        DB::beginTransaction();
        $result = DB::table('con_cxcamortizacioninteres')->insertGetId([
            'id_con_cxcamortizacion'=>$id,
            'id_cat_tipointeres'=>$tipo,
            'monto'=>$monto
        ]);
        if($result>0) {
            $upd = DB::table('con_cxcamortizacion')
                        ->where('id',$id)
                        ->update([
                            'moratorio'=>$monto
                        ]);
            
            if($upd>0){
                DB::commit();
                return $upd;
            } else {
                DB::rollBack();
                return 'Detalle al actualizar el moratorio en con_cxcamortizacion. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
            }
        }
        return $result;
    }

    public function getMoratorio($id) {
        $result = DB::table('con_cxcamortizacioninteres')
                    ->where('id_con_cxcamortizacion',$id)
                    ->where('status',1)
                    ->first();
        return $result;
    }

    public function getTiposPagos() {
        $result = DB::table('cat_tipopagos')
                    ->where('status',1)
                    ->get();
        return $result;
    }

    public function confirmarActualizarMoratorio($usuario, $id, $moratorio,$fechavencimiento,$observaciones) {
        //dd($usuario, $id, $moratorio);
        DB::beginTransaction();
        $getAmort = DB::table('con_cxcamortizacion')
                    ->where('id',$id)
                    ->first();
        if(isset($getAmort)) {
            $idDocto = DB::table('con_cxcamortizacionupdates')->insertGetId([
                'id_sys_usuario' => $usuario,
                'id_con_cxcamortizacion' => $id,
                'fecha' => date("Y-m-d"),
                'moratorioanterior' => $getAmort->moratorio,
                'moratorionuevo' => $moratorio,
                'fecfijaanterior' => $getAmort->fecfija,
                'fecfijanuevo' => $fechavencimiento,
                'observaciones' => strtoupper($observaciones)
            ]);
            if($idDocto>0) {
                $upd = DB::table('con_cxcamortizacion')
                            ->where('id',$id)
                            ->update([
                                'moratorio'=>$moratorio,
                                'fecfija'=>$fechavencimiento,
                                'timestamp'=>date("Y-m-d H:i:s")
                            ]);
                
                if($upd>0){
                    DB::commit();
                    return $upd;
                } else {
                    DB::rollBack();
                    return 'Detalle al actualizar el moratorio del documento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }
            } else {
                DB::rollBack();
                return 'Detalle al crear el registro de actualizacion de la amortizacion. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
            }
        } else {
            DB::rollBack();
            return 'No se encontro la amortizacion. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
        }
    }

    public function confirmarActualizarPago($usuario, $id, $formapago, $cuentadestino, $tipoPago, $fechapago) {
        //dd($usuario, $id, $formapago, $cuentadestino);
        DB::beginTransaction();
        $cuentadestino = $cuentadestino==null?'':$cuentadestino;
        $upd = DB::table('con_cxcpago')
                    ->where('id',$id)
                    ->update([
                        'id_sat_formapago'=>$formapago,
                        'fecha'=>$fechapago,
                        'cuentadestino' => $cuentadestino,
                        'id_sys_usuario_modifica' => $usuario,
                        'fecha_modifica' => date("Y-m-d"),
                        'id_cat_tipopagos' => $tipoPago
                    ]);
        
        if($upd>0){ 
            $upd2 = DB::table('con_cxcrecibo')
                    ->where('id_con_cxcpago',$id)
                    ->update([
                        'id_sat_formapago'=>$formapago,
                        'fecha'=>$fechapago,
                        'timestamp'=>date("Y-m-d H:i:s")
                    ]);
            if($upd2>0) { 
                $upd3 = DB::table('con_asiento')
                            ->where("name_tabla", "con_cxcpago")
                            ->where("id_foraneo", $id)
                            ->update([
                                'fecha'=>$fechapago,
                                'timestamp'=>date("Y-m-d H:i:s")
                            ]);
                if($upd3>0) {
                    DB::commit();
                    return $upd2;
                } else {
                    DB::rollBack();
                return 'Detalle al actualizar la fecha del asiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }
            } else {
                DB::rollBack();
                return 'Detalle al actualizar la informacion de pago de los recibos. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
            }
        } else {
            DB::rollBack();
            return 'Detalle al actualizar la informacion de pago. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
        }
    }

    public function verDetalleDocumento($id) {
        $result = DB::table('con_cxcamortizacion')
                    ->select(DB::raw("tpv_pedido.serie, tpv_pedido.folio, IFNULL(tpv_pedido.fecha,'') as fecha, tpv_pedidodetalle.codigo, tpv_pedidodetalle.descripcion, tpv_almacen.descripcion as sucursal,
                                    con_cxcamortizacion.numpago, con_cxcamortizacion.saldo, con_cxcamortizacion.moratorio, (con_cxcamortizacion.saldo+con_cxcamortizacion.moratorio) as total"))
                    ->join('con_cxcdocto', 'con_cxcamortizacion.id_con_cxcdocto', '=', 'con_cxcdocto.id')
                    ->join('tpv_pedido', 'con_cxcdocto.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->join('tpv_almacen', 'tpv_pedido.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->leftjoin('tpv_pedidodetalle', 'tpv_pedido.id', '=', 'tpv_pedidodetalle.id_tpv_pedido')
                    ->where('con_cxcamortizacion.id', $id)
                    ->get();
        //dd($result);
        return $result;
    }

    public function getDocumentoPago($id){
        $result = DB::table('con_cxcpago')
                    ->select(DB::raw("con_cxcpago.id AS id,
                                      SUM(con_cxcrecibo.importepagado) as pago,
                                      SUM(con_cxcrecibo.moratorio) as moratorio,
                                      con_cxcpago.subtotal as total
                                      con_cxcpago.iva as total
                                      con_cxcpago.total as total,
                                      con_cxcpago.uuid as uuid,
                                      con_cxcpago.uuid_moratorio as uuid_moratorio,
                                      con_cxcpago.folio as folio,
                                      sys_direccion.cp as LugarExpedicion,
                                      sat_regimenfiscal.clave as regimenfiscal,
                                      sys_persona.rfc as rfccliente,
                                      sat_usocfdi.clave as usocfdi,
                                      sys_persona.nombre as nombrecliente"))
                    ->join('con_cxcrecibo', 'con_cxcpago.id', '=', 'con_cxcrecibo.id_con_cxcpago')
                    ->join('con_cxcdocto', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcdocto.id')                    
                    ->join('tpv_factura', function($join){
                        $join->on('con_cxcdocto.id_tpv_pedido', '=', 'tpv_factura.id_tpv_pedido');
                        $join->on('tpv_factura.status', '=',DB::raw('1'));
                    })      
                    ->join('tpv_cliente', 'con_cxcpago.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                    ->join('sat_regimenfiscal', 'sys_persona.id_sat_regimenfiscal', '=', 'sat_regimenfiscal.id')
                    ->join('sat_formapago', 'con_cxcpago.id_sat_formapago', '=', 'sat_formapago.id')
                    ->join('tpv_almacen', 'con_cxcpago.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->join('sys_direccion', 'tpv_almacen.id_sys_direccion', '=', 'sys_direccion.id')
                    ->join('sat_usocfdi', 'sys_persona.id_sat_usocfdi', '=', 'sat_usocfdi.id')
                    ->where('con_cxcpago.id', $id)
                    ->whereRaw('con_cxcpago.id NOT IN (SELECT id_con_cxcpago FROM cfdi_pago WHERE status=99)')
                    ->where('con_cxcrecibo.status',1)
                    ->groupBy('con_cxcpago.id')
                    ->first();
        //dd($result);
        return $result;
    }  

    public function getNotasAbono($idcliente){
        $notasabono = DB::table('con_cxcnotaabono')
                ->select(DB::raw("con_cxcnotaabono.id,
                                'NOTA DE ABONO' as tipo,
                                con_cxcnotaabono.monto as monto,
                                con_cxcnotaabono.fecha as fecha,
                                con_cxcnotaabono.folio as folio,
                                con_cxcnotaabono.concepto as concepto,
                                '' as formapago,
                                tpv_almacen.descripcion as almacen,
                                con_cxcnotaabono.status as status,
                                con_cxcnotaabono.id_tpv_almacen,
                                con_cxcnotaabono.uuid,
                                con_cxcnotaabono.id_sat_formapago"))
                ->join('tpv_almacen','con_cxcnotaabono.id_tpv_almacen','=','tpv_almacen.id')
                ->where('con_cxcnotaabono.id_tpv_cliente','=',$idcliente)
                ->where('con_cxcnotaabono.status','=',1)
                ->get();
        return $notasabono;
    }

    public function confirmarRefinanciamiento($usuario, $idCxcCliente, $subtotal, $monto, $financiado, $feccreado, $fecvencimiento, $plazo, $enganche, $pago, $periodicidad, $numpagos, $doctos, $idAlmacen, $amort, $interes, $folio, $idCliente, $turno) {
        $lib = new Libreria;
        DB::beginTransaction();
        $documentos = json_decode($doctos,1);
        $amortizaciones = json_decode($amort,1);
        //dd($usuario, $idCxcCliente, $subtotal, $monto, $financiado, $feccreado, $fecvencimiento, $plazo, $enganche, $pago, $periodicidad, $numpagos, $doctos, $idAlmacen, $amort, $interes, $folio);

        $idDocto = DB::table('con_cxcdocto')->insertGetId([
            'id_con_cxccliente' => $idCxcCliente,
            'id_tpv_pedido' => $documentos[0]['id_tpv_pedido'],
            'monto' => $monto,
            'saldo' => $financiado,
            'feccreado' => $feccreado,
            'fecvencimiento' => $fecvencimiento,
            'plazo' => '',
            'serie' => '',
            'folio' => '',
            'enganche' => $enganche,
            'financiado' => $financiado,
            'pago' => $pago,
            'id_cat_periodicidadpago' => $periodicidad,
            'id_con_cxcformaspago' => $plazo,
            'numeropagos' => $numpagos,
            'id_tpv_almacen' => $idAlmacen,
            'id_sys_usuario' => $usuario,
            'is_refinanciado' => 1,
            'interes' => $interes
        ]);
        if($idDocto>0) {
            //dd($interes);
            if($enganche>0) { //SI ES MAYOR A CERO, SE REGISTRA LA AMORTIZACION, EL PAGO Y EL RECIBO
                $idAmort = DB::table('con_cxcamortizacion')->insertGetId([
                    'id_con_cxcdocto' => $idDocto,
                    'referencia' => '',
                    'numpago' => 0,
                    'fecfija'=> $feccreado,
                    'capital' => round($enganche/1.16,2),
                    'iva' => round(($enganche/1.16)*.16,2),
                    'intereses' => 0,
                    'pago' => $enganche,
                    'abono' => 0,
                    'saldo' => $enganche,
                    'moratorio' => 0,
                    'status' => 1
                ]);
                if($idAmort==0) {
                    DB::rollBack();
                    return 'Detalle al crear el enganche de la amortizacion del documento refinanciado. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }
            }
            foreach ($amortizaciones as $key => $amorti) {
                $newinteres = 1+($interes/100);
                //dd($amorti['monto'], $newinteres);
                $amorti['monto'] = str_replace(',', '', $amorti['monto']);
                $capital = round($amorti['monto']/$newinteres/1.16,2);
                $iva = round($capital*.16,2);
                $intereses = $amorti['monto']-$capital-$iva;

                $idAmort = DB::table('con_cxcamortizacion')->insertGetId([
                    'id_con_cxcdocto' => $idDocto,
                    'referencia' => '',
                    'numpago' => $amorti['numero'],
                    'fecfija'=> $lib->fechaFormat($amorti['fecha'],'H2M'),
                    'capital' => $capital,
                    'iva' => $iva,
                    'intereses' => $intereses,
                    'pago' => $amorti['monto'],
                    'saldo' => $amorti['monto'],
                    'moratorio' => 0
                ]);
                if($idAmort==0) {
                    DB::rollBack();
                    return 'Detalle al crear la amortizacion del documento refinanciado. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }
            }

            foreach ($documentos as $key => $doc) {
                //dd($documentos);
                $idRefi = DB::table('con_cxcrefinanciamiento')->insertGetId([
                    'id_sys_usuario' => $usuario,
                    'id_con_cxcdocto' => $doc['id'],
                    'id_tpv_pedido' => $doc['id_tpv_pedido'],
                    'id_con_cxcdoctorefinanciado' => $idDocto,
                    'fecha' => date("Y-m-d"),
                    'folio' => $folio
                ]);
                if($idRefi==0) {
                    DB::rollBack();
                    return 'Detalle al crear la relacion del documento refinanciado con los documentos seleccionados. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }

                $upd = DB::table('con_cxcdocto')
                            ->where('id',$doc)
                            ->update([
                                'saldo' => 0,
                                'status' => 2,
                                'timestamp'=>date("Y-m-d H:i:s")
                            ]);

                if($upd==0) {
                    DB::rollBack();
                    return 'Detalle al actualizar la informacion del documento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }

                $update = DB::table('con_cxcamortizacion')
                            ->where('id_con_cxcdocto',$doc)
                            ->update([
                                'fecpago' => $feccreado,
                                'saldo' => 0,
                                'status' => 2,
                                'timestamp'=>date("Y-m-d H:i:s")
                            ]);

                if($update==0) {
                    DB::rollBack();
                    return 'Detalle al actualizar las amortizaciones de los documentos seleccionados. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }
            }
            //dd($interes);
            if($interes>0) {
                $cantInteres = $monto-$subtotal;
                $subtotalInteres = $cantInteres/1.16;
                $ivaInteres = $subtotalInteres*.16;
                //dd($cantInteres, round($subtotalInteres,2), round($ivaInteres,2));

                $conhead = DB::table('con_asiento')->insertGetId([
                    'id_sys_usuario'=>$usuario,
                    'id_cat_tipoasiento'=>20,
                    'name_tabla'=>"con_cxcdocto",
                    'id_foraneo'=>$idDocto,
                    'concepto'=>'REFINANCIAMIENTO DE CREDITO ('.strtoupper($folio).')',
                    'referencia'=>strtoupper($folio),
                    'fecha'=>$feccreado,
                    'hora'=>date('H:i:s'),
                    'debe'=>$cantInteres,
                    'haber'=>$cantInteres
                ]);
                if($conhead>0) {
                    //Obtenemos el centro de costos de la sucursal
                    $almcc = DB::table('tpv_almacen')
                                ->select(DB::raw('con_centrocosto.*'))
                                ->join('con_centrocosto','tpv_almacen.id_con_centrocosto','=','con_centrocosto.id')
                                ->where('tpv_almacen.id',$idAlmacen)
                                ->first();
                    $clie = DB::table('tpv_cliente')
                                ->select(DB::raw('tpv_cliente.*,sys_persona.nombre as nombre'))
                                ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                                ->where('tpv_cliente.id',$idCliente)
                                ->first(); 

                    $ctacxc = '105 001 '.str_pad($clie->clave, 6, "0", STR_PAD_LEFT);
                    //dd($ctacxc);
                    // Abono a Ingresos por intereses
                    $movimientos[] = [
                        'id_con_asiento'=>$conhead,
                        'cuenta'=>'401 032 000001',
                        'id_con_centrocosto'=>$almcc->id,
                        'debe'=>0,
                        'haber'=>round($subtotalInteres,2)
                    ];

                    // Abono a iva pendiente por trasladar
                    $movimientos[] = [
                        'id_con_asiento'=>$conhead,
                        'cuenta'=>'209 001 000001',
                        'id_con_centrocosto'=>$almcc->id,
                        'debe'=>0,
                        'haber'=>round($ivaInteres,2),
                    ];

                    // Cargo a Clientes
                    $movimientos[] = [
                        'id_con_asiento'=>$conhead,
                        'cuenta'=>$ctacxc,
                        'id_con_centrocosto'=>$almcc->id,
                        'debe'=>$cantInteres,
                        'haber'=>0
                    ];
                    $condet = DB::table('con_asientodetalle')->insert($movimientos);
                    if($condet>0){                                                
                        $increment = DB::table('tpv_folio')
                                    ->where('id_sys_usuario','=',$usuario)
                                    ->where('id_tpv_almacen','=',$idAlmacen)
                                    ->where('id_cat_operacion','=',32)
                                    ->where('id_tpv_turno','=',$turno)
                                    ->where('status','=',1)
                                    ->increment('folio');
                        if($increment>0){
                            DB::commit();
                            return $idDocto;
                        } else {
                            DB::rollBack();
                            return 'Detalle al incrementar el folio del refinanciamiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';           
                        }
                    } else {
                        DB::rollBack();
                        return 'Detalle al registrar el detalle del asiento contable del refinanciamiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';    
                    }
                } else {
                    DB::rollBack();
                    return 'Detalle al crear la cabecera del asiento de refinanciamiento. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
                }                
            } else {
                // NO TIENE INTERES, POR LO QUE NO SE GENERA UN ASIENTO CONTABLE
                DB::commit();
                return $idDocto;
            }
        } else {
            DB::rollBack();
            return 'Detalle al crear el documento refinanciado. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
        }
    }

    public function validaSinCredito() {
        $result = DB::table('con_cxcformaspago')
                    ->whereNotIn('status',[0,99])
                    ->where('tipo', 'CREDITO')
                    ->where('aplicaSinCredito',1)
                    ->orderBy('posicion')
                    ->get();
        //dd($result);
        return $result;
    }

    public function getDiasCredito($idPlazo) {
        $result = DB::table('con_cxcformaspago_dias')
                    ->whereNotIn('status',[0,99])
                    ->where('id_con_cxcformaspago', $idPlazo)
                    ->get();
        //dd($result);
        return $result;
    }

    public function confirmarReactivarSolicitud($usuario, $idCliente) {
        DB::beginTransaction();
        //dd($usuario, $idCliente);
        $upd2 = DB::table('con_cxcsolicitud')
                ->where('id_tpv_cliente',$idCliente)
                ->update([
                    'id_sys_usuario_reactivo'=>$usuario,
                    'fecha_reactivo'=>date('Y-m-d'),
                    'hora_reactivo'=>date("H:i:s"),
                    'status'=>0
                ]);
        if($upd2>0) { 
            DB::commit();
            return $upd2;
        } else {
            DB::rollBack();
            return 'Detalle al actualizar el estatus de reactivacion de la solicitud de credito. Intente de nuevo y si el problema persiste informe al administrador del sistema.';
        }
    }

    public function getAllFormasPagoRefinanciamiento() {
        $result = DB::table('con_cxcformaspago')
                    ->where('tipo', 'CREDITO')
                    ->where('aplicaRefinanciamiento', 1)
                    ->orderBy('posicion')
                    ->get();
                    
        return $result;
    }
}
?>