<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Caja;
use App\Models\DoctosClientes;
use App\Models\CXC;
use App\Models\Facturacion;
use App\Models\CortesCaja;
use App\Models\Remisiones;
use App\Models\HotelRecepcion;
use App\Models\Misc;
use App\Http\Controllers\Libreria;
use App\Http\sat\SatXML;
use TCPDF;

class cajaController extends Controller
{
    public function goToCaja(Request $request){
        $lib = new Libreria;
        if (!$request->session()->has('usuario') || !$lib->validaSesion($request)) {
            return redirect()->route('login');
        }else{
            return view('pages.caja');
        }
    }

    public function getFolio(Request $request){
        $remisiones = new Remisiones;
        if ($request->session()->has('idusuario')) {
            $usuario = $request->session()->get('idusuario');
            $turno = $request->session()->get('idturno');
            $resp = $remisiones->getFolio($usuario,$turno);
            if(isset($resp[0]))
                $folio = $resp[0]->serie.'-'.$resp[0]->folio;
            else
                $folio = 0;
            return $folio;
        }else{
            return 0;
        }
    }

    public function fechaFormat($fecha,$tipo){
        switch($tipo){
            case 'M2H':{
                $fecExp = explode('-',$fecha);
                return $fecExp[2].'/'.$fecExp[1].'/'.$fecExp[0];
                break;
            }
            case 'H2M':{
                $fecExp = explode('/',$fecha);
                return $fecExp[2].'-'.$fecExp[1].'-'.$fecExp[0];
                break;
            }
        }
    }

    public function getRemisiones(Request $request){
        $caja = new Caja;
        $lib = new Libreria;
        $misc = new Misc;
        $hotel = new HotelRecepcion;        
        $emp = $caja->datosEmisor(1);
        $fecha = $this->fechaFormat($request->fecha,'H2M');
        $dbnomina = $request->session()->get('dbnomina');
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');     
        //$almacenes = $lib->getAlmacenesUsuario($request); 
        $almacenes = $misc->getSucursalesTurnoUsuario($usuario, $turno, 9);
        $arrayIdAlmacenes = array();
        foreach($almacenes as $almacen) {
            array_push($arrayIdAlmacenes, $almacen->id);
        }

        /*CODIGO PARA VALIDAR LAS SUCURSALES QUE APERTURARON 
        $almacenes = $misc->getSucursalesApertura($usuario, $turno, date('Y-m-d'));
        $arrayIdAlmacenes = array();
        $arrayIdAlmacenesCierre = array();
        foreach($almacenes as $almacen) {
            if($almacen->id_cat_cajamovimiento == 1)  {
                //dd("entra");
                if (in_array($almacen->id, $arrayIdAlmacenesCierre)) {
                    //dd("entra1");
                    //NO HACE NADA, NO INSERTA
                } else {
                    //dd("entra2");
                    array_push($arrayIdAlmacenes, $almacen->id);
                }
            } else if($almacen->id_cat_cajamovimiento == 4) {
                if (in_array($almacen->id, $arrayIdAlmacenes)) {
                    //Borra el ID
                    $key = array_search($almacen->id, $arrayIdAlmacenes);
                    if ($key !== false) {
                        unset($arrayIdAlmacenes[$key]);
                    }
                } else 
                    array_push($arrayIdAlmacenesCierre, $almacen->id);
            }
        }*/
        $exist = $caja->getRemisiones($fecha,$arrayIdAlmacenes,$dbnomina);

        if(isset($exist[0])){  
            $array = array();
            $itt = 0;
            foreach($exist as $idx => $row){
                //Metemos cabecera
                $array[$row->id]['id'] = $row->id;
                $array[$row->id]['documento'] = $row->documento;
                $array[$row->id]['status'] = $row->status;
                $array[$row->id]['isAnticipo'] = $row->isAnticipo;
                $array[$row->id]['anticipo'] = $row->anticipo;
                $array[$row->id]['isLiquidacion'] = $row->isLiquidacion;
                $array[$row->id]['fechaLiquidacion'] = $row->fechaLiquidacion;
                $array[$row->id]['seriefolio'] = $row->serie.'-'.$row->folio;
                $array[$row->id]['seriefoliolist'] = $row->serie.'-'.$row->folio;
                $array[$row->id]['id_tpv_cliente'] = $row->id_tpv_cliente;
                $array[$row->id]['id_sys_persona'] = $row->id_sys_persona;
                $array[$row->id]['cliente'] = $row->cliente;
                $array[$row->id]['clientelist'] = $row->cliente;
                $array[$row->id]['id_tpv_usuario'] = $row->id;
                $array[$row->id]['usuario'] = $row->usuario;
                $array[$row->id]['id_tpv_almacen'] = $row->id_tpv_almacen;
                $array[$row->id]['almacen'] = $row->almacen;
                $array[$row->id]['id_tpv_vendedor'] = $row->id;
                $array[$row->id]['vendedor'] = $row->vendedor;
                $array[$row->id]['id_tpv_turno'] = $row->id;
                $array[$row->id]['turno'] = $row->turno;
                $array[$row->id]['metodopago'] = $row->metodopago;
                $array[$row->id]['modalidadpago'] = $row->modalidadpago;
                $array[$row->id]['fecha'] = date('d/m/Y',strtotime($row->fecha));
                $array[$row->id]['hora'] = $row->hora;
                $array[$row->id]['subtotal'] = $row->subtotal;
                $array[$row->id]['descuento'] = $row->descuento;
                $array[$row->id]['iva'] = $row->iva;
                $array[$row->id]['ish'] = $row->ish;
                $array[$row->id]['total'] = $row->total;
                $array[$row->id]['serie'] = $row->serie;
                $array[$row->id]['folio'] = $row->folio;
                $array[$row->id]['observaciones'] = $row->observaciones;
                //Metemos detalle
                if(isset($emp->isHotel)){
                    if($emp->isHotel==1){
                        $hab = $hotel->getInfoOcupacion($row->id);
                        if(isset($hab->id)){
                            $array[$row->id]['seriefoliolist'] = 'Hab.'.$hab->numero.' | Reg.'.$hab->id;
                            $array[$row->id]['clientelist'] = $hab->cliente;
                        }
                    }
                }                
                
                $array[$row->id]['detalle'][$idx] = $row;                
                if($row->codigoproveedor != '')
                    $array[$row->id]['detalle'][$idx]->imagen = $row->codigoproveedor;
                else {
                    $arrayName = explode('/', $row->codigo);
                    $nameImagen = $arrayName[0];
                    $concat = '_slash_';
                    for ($j=1; $j < count($arrayName); $j++) { 
                        $nameImagen = $nameImagen.$concat.$arrayName[$j];
                    }
                    $array[$row->id]['detalle'][$idx]->imagen = $nameImagen;
                }
                //$itt;
            }
            $col = array_column( $array, "id" );
            array_multisort( $col, SORT_DESC, $array );
            return json_encode($array);
        }else{
            return 0;
        }
    }

    public function getInfoPago(Request $request){
        $idpedido = $request->idpedido;
        $caja = new Caja;
        $misc = new Misc;
        $result = $caja->getInfoPago($idpedido);
        $result->enganche = number_format($result->anticipo,2,'.',',');
        $financiado = $result->total - $result->anticipo;
        $result->financiado = number_format($financiado,2,'.',',');
        $result->pago = number_format(($result->total-$result->anticipo)/$result->numpagos,2,'.',',');
        $result->total = number_format($result->total,2,'.',',');
        $result->modelopago = $result->tipopago;
        $result->fechapago = date('d/m/Y',strtotime(date("d-m-Y")."+ ".$result->dias." days"));
        return json_encode($result);
    }

    public function aplicarNotaCredito(Request $request) {
        $caja = new Caja;
        $resp = $caja->aplicarNotaCredito($request->id, $request->idAlmacen, $request->idCliente, $request->monto);
        if(!$resp){
            return 'CAJ02 :: Ocurrió un error al aplicar el pago. Comunique al área de T.I este mensaje';
        }else {  
            return 1;
        }
    }
    
    public function aplicaCobro(Request $request){
        //dd($request);
        $caja = new Caja;
        $misc = new Misc;
        $resp = $caja->aplicaCobro($request);
        return $resp;
    }
    
    public function aplicaCobroCredito(Request $request){
        //dd($request);
        $caja = new Caja;
        $misc = new Misc;
        $resp = $caja->aplicaCobroCredito($request);
        return $resp;
        if(!$resp)
            return 'CAJ02 :: Ocurrió un error al aplicar el pago. Comunique al área de T.I este mensaje';
        else {  
            return 1;
        }
    }

    public function validaApertura(Request $request){
        $caja = new Caja;
        $misc = new Misc;
        $libreria = new Libreria;
        //dd($request);
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $arrayIdAlmacenes = array();
        $idAlmacen = $request->idAlmacen;
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');

        if($idAlmacen==0) {
            $almacenes = $misc->getSucursalesTurnoUsuario($usuario, $turno, 9);
            
            foreach($almacenes as $almacen) {
                array_push($arrayIdAlmacenes, $almacen->id);
            }
        } else 
            array_push($arrayIdAlmacenes, $idAlmacen);
        
        $resp = $caja->getMovimientosvalidaApertura($usuario,$turno,$request->fecha,$arrayIdAlmacenes);
        
        $aperturado = 0;
        foreach($resp as $r){
            if($r->idmov == 1)
                $aperturado++;
        }
        if($aperturado>0)        
            $request->session()->put('aperturado',1);
        else
            $request->session()->put('aperturado',0);

        return $aperturado;
    }

    public function validaCierre(Request $request, $idAlmacen){
        $caja = new Caja;
        $misc = new Misc;
        $libreria = new Libreria;
        $emp = $caja->datosEmisor(1);
        //dd($request->fecha);
        if($request->fecha != null)
            $fecha = $libreria->fechaFormat($request->fecha,'H2M');
        else
            $fecha = date('Y-m-d');
        
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');

        if($emp->corteporturno==1){
            $initurn = $caja->aperturaTurno($usuario,$turno,$idAlmacen);            
            $finturn = $caja->cierreTurno($usuario,$turno,$idAlmacen);
            if(!isset($finturn->fecha)){
                return json_encode([0, 'No existe el registro de cierre de la caja, por favor haga el cierre de la caja para poder generar el corte.']);
            }
            $resp = $caja->getMovimientosTurno($usuario,$turno,$idAlmacen,$initurn->fecha,$initurn->hora);
            //dd($resp);
            $cerrado = 0;
            $cierraCaja = -1;
            foreach($resp as $r){
                if($r->idmov == 4)
                    $cerrado++;
            }
            //dd($cerrado);
            if($cerrado>0) {
                //VALIDA DE QUE SI TUVO INGRESOS, NO PERMITA QUE EN TOTALES VENGA EN CEROS
                $validaIngresos = $caja->validaIngresosTurno($idAlmacen,$usuario,$turno,$initurn->fecha,$initurn->hora);
                $retiros = $caja->retirosEfectivoCajaTurno([2,5], $usuario, $turno, $idAlmacen,$initurn->fecha,$initurn->hora);
                //dd($validaIngresos, $request->totales, $retiros->monto, $validaIngresos-$retiros->monto);
                //HAY QUE HACER LA RESTA DE SALIDA DE EFECTIVO, PARA QUE SI ES CERO, DEJE HACER EL CORTE
                if(($validaIngresos-$retiros->monto)>0 && $request->totales==0) {
                    $cierraCaja = 'Tuviste ingresos en efectivo, necesitas ingresar tus denominaciones.';
                } else {
                    //dd("HACE EL CORTE");
                    $cierraCaja = $caja->saveCorteDenominacionesTurno($usuario, $turno, $idAlmacen, $fecha, $request->folio, $request->totalefectivo, $request->totaldebito, $request->totalcredito, $request->totaltransferencia, $request->totaldeposito, $request->totales,$initurn->fecha,$initurn->hora);
                }
            }
            //dd($cerrado, $cierraCaja);
            return json_encode([$cerrado, $cierraCaja]);
        }else{
            $resp = $caja->getMovimientos($usuario,$turno,$fecha,$idAlmacen);
            //dd($resp);
            $cerrado = 0;
            $cierraCaja = -1;
            foreach($resp as $r){
                if($r->idmov == 4)
                    $cerrado++;
            }
            //dd($cerrado);
            if($cerrado>0) {
                //VALIDA DE QUE SI TUVO INGRESOS, NO PERMITA QUE EN TOTALES VENGA EN CEROS
                $validaIngresos = $caja->validaIngresos($idAlmacen, $fecha);
                $retiros = $caja->retirosEfectivoCaja($fecha, [2,5], $usuario, $turno, $idAlmacen);
                //dd($validaIngresos, $request->totales, $retiros->monto, $validaIngresos-$retiros->monto);
                //HAY QUE HACER LA RESTA DE SALIDA DE EFECTIVO, PARA QUE SI ES CERO, DEJE HACER EL CORTE
                if(($validaIngresos-$retiros->monto)>0 && $request->totales==0) {
                    $cierraCaja = 'Tuviste ingresos en efectivo, necesitas ingresar tus denominaciones.';
                } else {
                    //dd("HACE EL CORTE");
                    $cierraCaja = $caja->saveCorteDenominaciones($usuario, $turno, $idAlmacen, $fecha, $request->folio, $request->totalefectivo, $request->totaldebito, $request->totalcredito, $request->totaltransferencia, $request->totaldeposito, $request->totales);
                }
            }
            //dd($cerrado, $cierraCaja);
            return json_encode([$cerrado, $cierraCaja]);
        }
    }

    public function getTipoMovimiento(Request $request, $idAlmacen){
        $caja = new Caja;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $fecha = $libreria->fechaFormat($request->fecha,'H2M');
        //dd($fecha);
        $resp = $caja->getMovimientos($usuario,$turno,$fecha,$idAlmacen);

        $aperturado = 0;
        $cerrado = 0;
        //dd($resp);
        foreach($resp as $r){
            if($r->idmov == 1)
                $aperturado++;
            if($r->idmov == 4)
                $cerrado++;
        }
        //dd($aperturado,$cerrado);
        if($aperturado>0 && $cerrado==0)        
            return json_encode($caja->getTipoMovimiento([2,3,4,5,6,7,8,9,10,11,12,13]));
        else if($aperturado>0 && $cerrado>0)   
            return json_encode($caja->getTipoMovimiento([0]));     
        else
            return json_encode($caja->getTipoMovimiento([1]));
    }
    
    public function aplicaMovimiento(Request $request){
        $caja = new Caja;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        //dd($request);
        $getFolio = $caja->getFolioMovimientoCaja($usuario, $turno, $request->sucursal, 10);
        $folio = $getFolio[0]->serie."-".$getFolio[0]->folio;
        if(intval($request->movimiento) != 2) {
            $request->banco=0;
            $request->cuenta=0;
        }
        $resp = $caja->aplicaMovimiento($request, $folio);
        if(!$resp){
            return 'CAJ02 :: Ocurrió un error al aplicar el movimiento. Comunique al área de T.I este mensaje';
        }else{
            return $resp;
        }
    }
    
    public function getMovimientos(Request $request){
        $caja = new Caja;
        $misc = new Misc;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $arrayIdAlmacenes = array();
        $idAlmacen = $request->idAlmacen;
        $fecha = $libreria->fechaFormat($request->fecha,'H2M');
        if($idAlmacen==0) {
            $almacenes = $misc->getSucursalesTurnoUsuario($usuario, $turno, 9);
            
            foreach($almacenes as $almacen) {
                array_push($arrayIdAlmacenes, $almacen->id);
            }
        } else 
            array_push($arrayIdAlmacenes, $idAlmacen);

        $resp = $caja->getMovimientosvalidaApertura($usuario,$turno,$fecha,$arrayIdAlmacenes);
        $array = array();
        foreach($resp as $idx => $row){
            $array[$idx] = $row;
            $array[$idx]->fechahora = date('d/m/Y',strtotime($row->fecha)).' '.$row->hora;
        }
        return json_encode($resp);
    }

    public function getMesesSinIntereses() {
        $caja = new Caja;
        $resp = $caja->getMesesSinIntereses();
        return json_encode($resp);
    }

    public function getBancos(){
        $caja = new Caja;
        $resp = $caja->getBancos();
        return json_encode($resp);
    }

    public function getCompañia() {
        $caja = new Caja;
        $resp = $caja->getCompañia();
        return json_encode($resp);
    }

    public function ticketMovimiento($id,$tipodoc,Request $request){
        $caja = new Caja;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');  
        $dbnomina = $request->session()->get('dbnomina');
        $id = $request->id;

        setlocale(LC_ALL, 'es_MX');
        $pdf = new TCPDF("P","mm",array(152,800));
        $pdf->SetPrintHeader(false);
        $pdf->SetMargins(1, 1, 1);
        //echo $_SERVER['DOCUMENT_ROOT'];
        
        //Get Generales
        $cabecera = $caja->ticketCabecera($id,$tipodoc);
        $texto = $caja->ticketTexto($id,$tipodoc);
        //dd($cabecera, $texto);

        //Get Datos de Remision
        $movimiento = $caja->ticketMovimiento($id,$dbnomina);
        if($movimiento[0]->monto > 0)
            $numerosletras = $libreria->num2letras($movimiento[0]->monto);
        else
            $numerosletras = '';
        
        if($request->session()->get('nombre') == null)
            $usuario = $request->session()->get('usuario');
        else 
            $usuario = $request->session()->get('nombre');
       
        $data = array('cabecera'=>$cabecera[0],'texto'=>$texto[0],'movimiento'=>$movimiento[0],'numerosletras'=>$numerosletras,'usuario'=>$usuario,'tipodoc'=>$tipodoc);
        $template = \View::make("formatos.movimientocaja", $data);
        $html = $template->render();

        $pdf->SetTitle("Movimiento Caja");
        $pdf->AddPage();
        $pdf->writeHTML(  $html , true, false, true, false, '');

        // Genera el archivo PDF en memoria
        $pdfData = $pdf->Output('example.pdf', 'S');
        return response($pdfData, 200, [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'attachment; filename="example.pdf"',
            'Content-Length' => strlen($pdfData)
        ]);

        /*$pdf->Output($_SERVER['DOCUMENT_ROOT'].'/naercriserp/pdf/caja/MOV'.$usuario.$turno.'_'.$id.'.pdf','F');
        return '/naercriserp/pdf/caja/MOV'.$usuario.$turno.'_'.$id.'.pdf';*/
    }

    public function imprimeCorte(Request $request){
        //dd($request);
        $caja = new Caja;
        $cortes = new CortesCaja;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $namesistema = $request->session()->get('namesistema');
        $dbnomina = $request->session()->get('dbnomina');
        $nameCarpeta = $request->session()->get('erp');
        $turno = $request->turno;
        $tipo = $request->tipo;
        $sucursal = $request->sucursal;
        //dd($sucursal);
        $fecha = $libreria->fechaFormat($request->fecha,'H2M');
        setlocale(LC_ALL, 'es_MX');
        if($tipo==1){
            $pdf = new TCPDF("P","mm",array(152,800));
            $pdf->SetPrintHeader(false);
            $pdf->SetMargins(1, 1, 1);
        }else{
            $pdf = new TCPDF("P", 'mm', 'Letter');
            $pdf->SetPrintHeader(false);
        }
        //echo $_SERVER['DOCUMENT_ROOT'];
        
        //Get Generales
        $cabecera = $caja->corteCabecera($turno,$usuario,$sucursal,$fecha);
        $ventas = $caja->getDiarioVenta($turno,$usuario,$sucursal,$fecha,$dbnomina);
        $ventasCredito = $caja->getDiarioVentaCredito($turno,$usuario,$sucursal,$fecha,$dbnomina);
        $abonos = $caja->getPagosCredito($turno,$usuario,$sucursal,$fecha,$dbnomina);
        $corteCiego = $cortes->getCorteCiegoDenominaciones($turno,$usuario,$sucursal,$fecha,$dbnomina);
        $movimientos = $caja->getMovimientos($usuario,$turno,$fecha,$sucursal);
        $kardex = $caja->getKardex($usuario,$turno,$fecha,$sucursal,$dbnomina);
        $anticipos = $caja->getAnticiposCorte($usuario,$turno,$fecha,$sucursal);

        //dd($cabecera, $ventas, $ventasCredito, $abonos, $corteCiego, $movimientos, $kardex, $anticipos);

        $arrayAux = array();
        foreach($abonos as $key => $item) {
            if(count($arrayAux)==0) {
                array_push($arrayAux, $item);
                if(count($arrayAux)==0)
                    dd("ENTRA POR SEGUNDA VEZ");
            } else {
                $flag = 0;
                $flagExist = false;
                foreach($arrayAux as $itemAux) {
                    if($item->id_con_cxcpago == $itemAux->id_con_cxcpago && $item->id_sat_formapago == $itemAux->id_sat_formapago) {
                    //if($item->id_con_cxcdocto_real == $itemAux->id_con_cxcdocto_real && $item->id_con_cxcpago == $itemAux->id_con_cxcpago) {
                        $itemAux->numpago = $itemAux->numpago.", ".$item->numpago;
                        $flagExist = true;
                    } else {
                        $flag = 1;
                    }
                }
                if($flag==1 && $flagExist==false)
                    array_push($arrayAux, $item);
            }
        }
        $abonos = $arrayAux;
        
        $ingresos = array();
        $egresos = array();
        foreach($ventas as $venta){
            if($venta->pagoDeposito == 1) {
                if(!isset($ingresos[$venta->sucursal][$venta->turno]['VENTA']["DEPOSITO EN ".$venta->formapago])){
                        $ingresos[$venta->sucursal][$venta->turno]['VENTA']["DEPOSITO EN ".$venta->formapago] = $venta->formapagomonto;
                    }else{
                        $ingresos[$venta->sucursal][$venta->turno]['VENTA']["DEPOSITO EN ".$venta->formapago] = $ingresos[$venta->sucursal][$venta->turno]['VENTA']["DEPOSITO EN ".$venta->formapago] + $venta->formapagomonto;
                    }
            } else {
                if(!isset($ingresos[$venta->sucursal][$venta->turno]['VENTA'][$venta->formapago])){
                    $ingresos[$venta->sucursal][$venta->turno]['VENTA'][$venta->formapago] = $venta->formapagomonto;
                }else{
                    $ingresos[$venta->sucursal][$venta->turno]['VENTA'][$venta->formapago] = $ingresos[$venta->sucursal][$venta->turno]['VENTA'][$venta->formapago] + $venta->formapagomonto;
                }
            }
        }
        
        //TABLA ABONOS TOTALES A CREDITO
        foreach($abonos as $venta){
            if(!isset($ingresos[$venta->sucursal][$venta->turno]['PAGO'][$venta->formapago])){
                $ingresos[$venta->sucursal][$venta->turno]['PAGO'][$venta->formapago] = $venta->pagototal;
            }else{
                $ingresos[$venta->sucursal][$venta->turno]['PAGO'][$venta->formapago] = $ingresos[$venta->sucursal][$venta->turno]['PAGO'][$venta->formapago] + $venta->pagototal;
            }
        }

        //TABLA ANTICIPOS DE CLIENTES
        foreach($anticipos as $venta){
            if(!isset($ingresos[$venta->sucursal][$venta->turno]['ANTICIPO'][$venta->formapago])){
                $ingresos[$venta->sucursal][$venta->turno]['ANTICIPO'][$venta->formapago] = $venta->monto;
            }else{
                $ingresos[$venta->sucursal][$venta->turno]['ANTICIPO'][$venta->formapago] = $ingresos[$venta->sucursal][$venta->turno]['ANTICIPO'][$venta->formapago] + $venta->monto;
            }
        }

        foreach($movimientos as $mov){
            if($mov->factor<0){
                if(!isset($egresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago])){
                    $egresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago] = $mov->monto * $mov->factor;
                }else{
                    $egresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago] = $egresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago] + ($mov->monto * $mov->factor);
                }
            }else{
                if(!isset($ingresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago])){
                    $ingresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago] = $mov->monto * $mov->factor;
                }else{
                    $ingresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago] = $ingresos[$mov->sucursal][$mov->turno]['MOV.CAJA'][$mov->formapago] + ($mov->monto * $mov->factor);
                }
            }
        }
        //dd($egresos);
        $formaspago = array();
        foreach($ingresos as $sucursales){
            foreach($sucursales as $turnos){
                foreach($turnos as $tipomov){
                    foreach($tipomov as $idxfp => $formapago){
                        if(!isset($formaspago[$idxfp])){
                            $formaspago[$idxfp] = $formapago;
                        }else{
                            $formaspago[$idxfp] = $formaspago[$idxfp] + $formapago;
                        }
                    }
                }
            }
        }
        
        foreach($egresos as $sucursales){
            foreach($sucursales as $turnos){
                foreach($turnos as $tipomov){
                    foreach($tipomov as $idxfp => $formapago){
                        if(!isset($formaspago[$idxfp])){
                            $formaspago[$idxfp] = $formapago * (-1);
                        }else{
                            $formaspago[$idxfp] = $formaspago[$idxfp] + $formapago;
                        }
                    }
                }
            }
        }

        isset($cabecera[0])?$cabecera=$cabecera[0]:$cabecera=[];
        !isset($ventas[0])?$ventas=[]:null;
        !isset($ventasCredito[0])?$ventasCredito=[]:null;
        !isset($movimientos[0])?$movimientos=[]:null;       
        $corteCiego[0]->fechacorte = $libreria->fechaFormat($corteCiego[0]->fechacorte,'M2H');

        $data = array('cabecera'=>$cabecera,'ventas'=>$ventas,'ventasCredito'=>$ventasCredito,'abonos'=>$abonos, 'anticipos'=>$anticipos, 'corteciego'=>$corteCiego, 'kardexEntradas'=>$kardex[0],'kardexSalidas'=>$kardex[1],'movimientos'=>$movimientos,'ingresos'=>$ingresos,'egresos'=>$egresos,'formaspago'=>$formaspago,'namesistema'=>$namesistema);
        //dd($data);
        if($tipo==1)
            $template = \View::make("formatos.cortecajaticket", $data);
        else {
            $template = \View::make("formatos.cortecajanormal", $data);
            //$template2 = \View::make("formatos.cortekardex", $data);
        }
        $html = $template->render();
        //$html2 = $template2->render();

        $pdf->SetTitle("Corte de Caja");        
        $pdf->AddPage();
        $pdf->writeHTML(  $html , true, false, true, false, '');

        //$pdf->AddPage();
        //$pdf->writeHTML(  $html2 , true, false, true, false, '');

        //SE GUARDA EL CORTE DE CAJA EN DOCUMENTO
        $pdf->Output($_SERVER['DOCUMENT_ROOT'].'/naercriserp/pdf/cortestiendas/'.$nameCarpeta.'/'.$request->folio.'.pdf','F');

        // Genera el archivo PDF en memoria
        $pdfData = $pdf->Output('example.pdf', 'S');
        return response($pdfData, 200, [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'attachment; filename="example.pdf"',
            'Content-Length' => strlen($pdfData)
        ]);

        /*$pdf->Output($_SERVER['DOCUMENT_ROOT'].'/naercriserp/pdf/caja/CC'.$usuario.$sucursal.$turno.'_'.str_replace('/','',$fecha).'.pdf','F');
        return '/naercriserp/pdf/caja/CC'.$usuario.$sucursal.$turno.'_'.str_replace('/','',$fecha).'.pdf';*/
    }

    public function getDatosFacturacion($idCliente) {
        $caja = new Caja;
        $resp = $caja->getDatosFacturacion($idCliente);
        return json_encode($resp);
    }

    public function checkEfectivoCaja(Request $request, $idAlmacen) {
        $caja = new Caja;
        $libreria = new Libreria;
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $resp = $caja->checkEfectivoCaja($request->fecha, $usuario, $turno, $idAlmacen);
        $retiros = $caja->retirosEfectivoCaja($request->fecha, [2,5], $usuario, $turno, $idAlmacen);
        $montoMaximo = $caja->montoMaximoRetiro();
        $total = floatval($resp)-floatval($retiros->monto);
        //dd($resp, $retiros, $request->fecha, $montoMaximo, $total);
        //dd($retiros, $resp, $total, $montoMaximo);
        if($total>$montoMaximo->monto) 
            return $total;
        else
            return 0;
    }

    public function getFormaPago(){
        $caja = new Caja;
        $resp = $caja->getFormaPago();
        return json_encode($resp);
    }

    public function getFormasPagoUsuario(Request $request){
        $caja = new Caja;
        $usuario = $request->session()->get('idusuario');
        $resp = $caja->getFormasPagoUsuario($usuario);
        return json_encode($resp);
    }

    public function validaAllTicketsCobrados(Request $request){
        $caja = new Caja;
        $fecha = $this->fechaFormat($request->fecha,'H2M');
        $dbnomina = $request->session()->get('dbnomina');
        $empresa = $request->session()->get('empresa');
        $arraySucursal = [$request->sucursal];
        $resp = $caja->validaAllTicketsCobrados($fecha, $arraySucursal,$dbnomina,$empresa);
        if($resp[1]->aplicaFacturacion==1) {
            foreach($resp[0] as $remision) {
                if($remision->status == 1 || $remision->status == 2 ||($remision->status == 13 && $remision->isAnticipo == 0) || ($remision->status == 14 && $remision->isLiquidacion == 1 && $remision->fechaLiquidacion == null))
                    return 0;
            }
        } else {
            foreach($resp[0] as $remision) {
                if($remision->status == 1 ||($remision->status == 13 && $remision->isAnticipo == 0) || ($remision->status == 14 && $remision->isLiquidacion == 1 && $remision->fechaLiquidacion == null))
                    return 0;
            }
        }
        return 1;
    }

    public function checkModalSerie(Request $request){
        $caja = new Caja;
        $resp = $caja->datosEmisor(0);        
        return $resp->aplicanumeroserie;
    }

    public function generaCFDI(Request $request){
        $data = json_decode($request->params,true);
        extract($data);

        $caja = new Caja;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $dbnomina = $request->session()->get('dbnomina');
        $seriefolio = $caja->getSerieFolio($usuario,$turno,$idAlmacen);
        //dd($seriefolio);
        //return $usuario.','.$turno.','.$idAlmacen;
        $emisor = $caja->datosEmisor($idpedido);
        //dd($request);
        $pedido = $caja->getCabeceraFactura($idpedido,$dbnomina);
        //return $pedido;
        $pago = $caja->getPago($idpedido);
        //return json_encode($pago);
        $usocfdi = $caja->getUsoCFDI($id_sat_usocfdi);
        $regimen = $caja->getRegimenFiscal($id_sat_regimenfiscal);
        date_default_timezone_set('Etc/GMT+6');

        //dd($pedido);
        //Si es a crédito
        if($pedido->metodopago=='PPD'){
            $aformapago = '99';
        }else{
            if($pago->id_sat_formapago!='30'){
                $aformapago = $pago->id_sat_formapago;
            }else{
                $allanti = $caja->getAnticipos($idpedido);
                //dd($idpedido);
                if(isset($allanti[0])){
                    $maxmonto = 0;
                    $aformapago = '';
                    foreach($allanti as $aant){
                        if($aant->monto>$maxmonto){
                            $maxmonto = $aant->monto;
                            $aformapago = $aant->id_sat_formapago;
                        }
                    }
                    if($aformapago==''){
                        $arrResp = array();
                        $arrResp['status'] = 404;
                        $arrResp['tipo'] = 'Atencion!';
                        $arrResp['env'] = '';
                        $arrResp['mensaje'] = 'Problemas al obtener la forma de pago de los anticipoas aplicados en la factura. Informe con el administrador del sistema.';
                        $arrResp['serie'] = '';
                        $arrResp['folio'] = '';
                        return json_encode(($arrResp));
                    }
                }else{
                    $arrResp = array();
                    $arrResp['status'] = 404;
                    $arrResp['tipo'] = 'Atencion!';
                    $arrResp['env'] = '';
                    $arrResp['mensaje'] = 'Problemas al obtener la informacion de los anticipoas aplicados en la factura. Informe con el administrador del sistema.';
                    $arrResp['serie'] = '';
                    $arrResp['folio'] = '';
                    return json_encode(($arrResp));
                }
            }
        }

        $subt = 0;
        $desc = 0;
        $tott = 0;

        // $trasret0 = array();
        $sihayish = 0;
        
        $pedidodet0 = $caja->getDetalleFactura($idpedido);
        foreach($pedidodet0 as $concepto0){
            if($concepto0->codigosat=='90111501'){ 
                $sihayish++;
            }
        }        

        // $totalTraslados0 = 0;
        // $totalRetenciones0 = 0;
        // foreach($trasret0 as $idxTipo0 => $impTipo0){
        //     foreach($impTipo0 as $idxImpuesto0 => $impNombre0){
        //         foreach($impNombre0 as $idxFactor0 => $impFactor0){
        //             foreach($impFactor0 as $idxTasa0 => $impTasa0){	
        //                 if($idxTipo0=='Traslados'){
        //                     $totalTraslados0 = $totalTraslados0 + $impTasa0['Importe'];
        //                 }else{
        //                     $totalRetenciones0 = $totalRetenciones0 + $impTasa0['Importe'];
        //                 }
        //             }
        //         }
        //     }
        // }
        //dd($subt." - ".$desc." + (".$totalTraslados0." - ".$totalRetenciones0.")");
        //$tott = $subt - $desc + ($totalTraslados0 - $totalRetenciones0);

        //************  DATOS GENERALES DE LA FACTURA ***********
        if($sihayish>0){
            $arreglo = array("xmlns:cfdi"=>"http://www.sat.gob.mx/cfd/4",
                            "xmlns:xs"=>"http://www.w3.org/2001/XMLSchema",
                            "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
                            "xmlns:implocal"=>"http://www.sat.gob.mx/implocal",
                            "xsi:schemaLocation"=>"http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd",
                            "Version"=>"4.0",
                            "Serie"=>$seriefolio->serie,
                            "Folio"=>$seriefolio->folio,
                            "Exportacion"=>"01",
                            "Fecha"=>date("Y-m-d")."T".date("h:i:s"),
                            #"fecha"=>"2013-01-12T10:45:12",
                            "Sello"=>"@",
                            "FormaPago"=>$aformapago,
                            #"CondicionesDePago"=>$condicionesDePago,
                            "NoCertificado"=>$emisor->nocertificado,
                            "Certificado"=>"@",
                            "SubTotal"=>round($pedido->subtotal,2),
                            "Descuento"=>round($pedido->descuento,2),
                            "Total"=>round($pedido->total,2),
                            "TipoDeComprobante"=>'I',
                            "MetodoPago"=>$pedido->metodopago,
                            "LugarExpedicion"=>$pedido->lugarexpedicion,
                            "Moneda"=>'MXN'); 
        }else{
            $arreglo = array("xmlns:cfdi"=>"http://www.sat.gob.mx/cfd/4",
                            "xmlns:xs"=>"http://www.w3.org/2001/XMLSchema",
                            "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
                            "xsi:schemaLocation"=>"http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd",
                            "Version"=>"4.0",
                            "Serie"=>$seriefolio->serie,
                            "Folio"=>$seriefolio->folio,
                            "Exportacion"=>"01",
                            "Fecha"=>date("Y-m-d")."T".date("h:i:s"),
                            #"fecha"=>"2013-01-12T10:45:12",
                            "Sello"=>"@",
                            "FormaPago"=>$aformapago,
                            #"CondicionesDePago"=>$condicionesDePago,
                            "NoCertificado"=>$emisor->nocertificado,
                            "Certificado"=>"@",
                            "SubTotal"=>round($pedido->subtotal,2),
                            "Descuento"=>round($pedido->descuento,2),
                            "Total"=>round($pedido->total,2),
                            "TipoDeComprobante"=>'I',
                            "MetodoPago"=>$pedido->metodopago,
                            "LugarExpedicion"=>$pedido->lugarexpedicion,
                            "Moneda"=>'MXN');      
        }  
       
        //Documentos relacionados
        $irel = 0;
        $relanticipos = $caja->getAnticipos($idpedido);
        if(isset($relanticipos[0])){            
            $arreglo['Relacionados'] = array();
            $arreglo['Relacionados'][$irel]['TipoRelacion'] = '07';
            $arreglo['Relacionados'][$irel]['documentos'] = array();
            $iant = 0;
            foreach($relanticipos as $relanti){
                $arreglo['Relacionados'][$irel]['documentos'][$iant]['UUID'] = $relanti->uuid;
            }
        }

        #************  DATOS DEL EMISOR ***********
        //dd($emisor);
        $arreglo['Emisor'] = array("Rfc"=>utf8_decode($emisor->rfc),
                                "Nombre"=>utf8_decode($emisor->razonsocial),
                                "RegimenFiscal"=>$emisor->id_sat_regimenfiscal);                                
        if($rfc=='XAXX010101000'){
            $cpreceptor = $pedido->lugarexpedicion;
        }else{
            $cpreceptor = utf8_decode($cp);
        }
        #************  DATOS DEL RECEPTOR ***********
        if($rfc=='SEA200824V99'){     
            $arreglo['Receptor'] = array("Rfc"=>utf8_decode($rfc),
                                        "Nombre"=>trim('SANYMX EQUIPMENT & TECHNOLOGY'),
                                        "UsoCFDI"=>utf8_decode($usocfdi->clave),
                                        "RegimenFiscalReceptor"=>utf8_decode($regimen->clave),
                                        "DomicilioFiscalReceptor"=>$cpreceptor);   
        }else{            
            $arreglo['Receptor'] = array("Rfc"=>utf8_decode($rfc),
                                        "Nombre"=>trim(utf8_decode($nombre)),
                                        "UsoCFDI"=>utf8_decode($usocfdi->clave),
                                        "RegimenFiscalReceptor"=>utf8_decode($regimen->clave),
                                        "DomicilioFiscalReceptor"=>$cpreceptor);   
        }          
                                    
        #************  CONCEPTOS DE LA FACTURA ***********
        //Preparamos los nodos para Impuestos en la parte final
        $trasret = array();
        $impn = 0;

        $arreglo['Conceptos'] = array();
        $arreglo['CImpuestos'] = array();
        $baseTraslado = 0;
        $baseRetenido = 0;
        $descuentoTot = 0;
        $subtotalTot = 0;
        $ish = 0;
        $pedidodet = $caja->getDetalleFactura($idpedido);
        $i = 1;
        foreach($pedidodet as $concepto){	
            $numeroserie = '';
            if($concepto->detalledescuento>0){
                $dd1 = ($concepto->detalledescuento*100) - ((int)($concepto->detalledescuento*100));
                $dd2 = $dd1/100;
                $ddif = (int)($dd1*10);
                if($ddif==5){
                    $descuentodet = ($concepto->detalledescuento/1.16) - $dd2;
                }else{
                    $descuentodet = ($concepto->detalledescuento/1.16);
                }
            }else{
                $descuentodet = 0;
            }
            $descuentoTot = ($descuentoTot + $descuentodet);
            
            $ns = $caja->getNumeroSerie($concepto->idpedidodetalle);
            $numeroserie = "";
            if(count($ns)>0) {                
                $numeroserie = ". Numero de Serie:";
                foreach ($ns as $k => $value) {
                    if(trim($value->numeroserie!='')){
                        $numeroserie = $numeroserie.' ('.$value->numeroserie.')';
                    }
                }
            }
            /*if(isset($ns->numeroserie)){
                if(trim($ns->numeroserie!='')){
                    $numeroserie = '. Numero de Serie ('.$ns->numeroserie.')';
                }
            }*/
            if($concepto->codigosat=='90111501'){ 
                $basedetalle = $concepto->detalletotal/1.18;
                $importedetalle = $basedetalle;
                $preciounitario = $importedetalle/$concepto->cantidad;
                $subtotalTot = $subtotalTot + $importedetalle;
                $ish = $ish + ($basedetalle*0.02);
            }else{                    
                //$iv = number_format($basedetalle*($impuesto->tasa/100),2,".","");
                $basedetalle = (float)number_format($concepto->detalletotal/(1+($concepto->tasa/100)),6,".","");
                $importedetalle = $basedetalle + $descuentodet;
                $preciounitario = $importedetalle/$concepto->cantidad;
                $subtotalTot = $subtotalTot + $importedetalle;
            }
            
            $arreglo['Conceptos'][$i]['Cantidad'] = $concepto->cantidad;
            $arreglo['Conceptos'][$i]['ClaveUnidad'] = $concepto->claveunidad;
            $arreglo['Conceptos'][$i]['Descripcion'] = utf8_decode($concepto->descripcioncorta.$numeroserie);
            $arreglo['Conceptos'][$i]['ValorUnitario'] = number_format($preciounitario,6,".","");
            $arreglo['Conceptos'][$i]['ObjetoImp'] = "02";
            $arreglo['Conceptos'][$i]['Importe'] = number_format($importedetalle,6,".","");
            $arreglo['Conceptos'][$i]['NoIdentificacion'] = $concepto->codigo;
            $arreglo['Conceptos'][$i]['Descuento'] = number_format($descuentodet,6,'.','');
            $arreglo['Conceptos'][$i]['ClaveProdServ'] = $concepto->codigosat;
            
            $arreglo['CImpuestos'][$i]['Traslados'] = array();
            $arreglo['CImpuestos'][$i]['Retenciones'] = array();
            
            //PROCESAMOS IMPUESTOS
            $tmit = 1;
            $totimpuestosd = 0;
            if($concepto->codigosat=='90111501'){ 
                $coniva = $basedetalle * 0.16;
                $arreglo['CImpuestos'][$i]['Traslados'][$tmit]['Importe'] = number_format(round($coniva,2),2,".","");
                $arreglo['CImpuestos'][$i]['Traslados'][$tmit]['TasaOCuota'] = '0.160000';
                $arreglo['CImpuestos'][$i]['Traslados'][$tmit]['TipoFactor'] = 'Tasa';
                $arreglo['CImpuestos'][$i]['Traslados'][$tmit]['Impuesto'] = '002';
                $arreglo['CImpuestos'][$i]['Traslados'][$tmit]['Base'] = number_format(round($basedetalle,2),2,".","");
                
                if(!isset($trasret['Traslados']['002']['Tasa'][16]['Base']))
                    $trasret['Traslados']['002']['Tasa'][16]['Base'] = round($basedetalle,2);
                else
                    $trasret['Traslados']['002']['Tasa'][16]['Base']+= round($basedetalle,2);

                if(!isset($trasret['Traslados']['002']['Tasa'][16]['Importe']))
                    $trasret['Traslados']['002']['Tasa'][16]['Importe'] = round($coniva,2);
                else
                    $trasret['Traslados']['002']['Tasa'][16]['Importe']+= round($coniva,2);		

                $tmit++;
            }else{
                $impuestos = $caja->getDetalleImpuestoFactura($concepto->idpedidodetalle);
                foreach($impuestos as $impuesto){
                    if($impuesto->tipo=='Traslado'){
                        $impuestotipo = $impuesto->tipo.'s';
                        $totimpuestosd = $totimpuestosd + ($basedetalle*($impuesto->tasa/100));
                        $baseTraslado = $baseTraslado + $basedetalle;
                    }else{
                        $impuestotipo = $impuesto->tipo.'es';
                        $totimpuestosd = $totimpuestosd + ($basedetalle*($impuesto->tasa/100));
                        $baseRetenido = $baseRetenido + $basedetalle;
                    }
                    $arreglo['CImpuestos'][$i][$impuestotipo][$tmit]['Importe'] = number_format($basedetalle*($impuesto->tasa/100),6,".","");
                    $arreglo['CImpuestos'][$i][$impuestotipo][$tmit]['TasaOCuota'] = number_format($impuesto->tasa/100,6,".","");
                    $arreglo['CImpuestos'][$i][$impuestotipo][$tmit]['TipoFactor'] = $impuesto->factor;
                    $arreglo['CImpuestos'][$i][$impuestotipo][$tmit]['Impuesto'] = $impuesto->impuesto;
                    $arreglo['CImpuestos'][$i][$impuestotipo][$tmit]['Base'] = number_format($basedetalle,6,".","");
                    // if($tmr['tasa']==0)
                    //     $tasacero++;					
                    $tmit++;

                    if(!isset($trasret[$impuestotipo][$impuesto->impuesto][$impuesto->factor][$impuesto->tasa]['Base'])){
                        $trasret[$impuestotipo][$impuesto->impuesto][$impuesto->factor][$impuesto->tasa]['Base'] = number_format($basedetalle,6,".","");
                    }else{
                        $trasret[$impuestotipo][$impuesto->impuesto][$impuesto->factor][$impuesto->tasa]['Base']+= number_format($basedetalle,6,".","");
                    }
                    if(!isset($trasret[$impuestotipo][$impuesto->impuesto][$impuesto->factor][$impuesto->tasa]['Importe'])){
                        $trasret[$impuestotipo][$impuesto->impuesto][$impuesto->factor][$impuesto->tasa]['Importe'] = number_format($basedetalle*($impuesto->tasa/100),6,".","");
                    }else{
                        $trasret[$impuestotipo][$impuesto->impuesto][$impuesto->factor][$impuesto->tasa]['Importe']+= number_format($basedetalle*($impuesto->tasa/100),6,".","");
                    }
        
                }
            }
            
            $i++;
        }

        $totalTraslados = 0;
        $totalRetenciones = 0;
        $arreglo['Traslados'] = array();
        $arreglo['Retenciones'] = array();
        $h = 1;
        foreach($trasret as $idxTipo => $impTipo){
            foreach($impTipo as $idxImpuesto => $impNombre){
                foreach($impNombre as $idxFactor => $impFactor){
                    foreach($impFactor as $idxTasa => $impTasa){
                        $arreglo[$idxTipo][$h]['Base'] = number_format($impTasa['Base'],2,".","");
                        $arreglo[$idxTipo][$h]['Impuesto'] = $idxImpuesto;
                        $arreglo[$idxTipo][$h]['Importe'] = number_format($impTasa['Importe'],2,".","");		
                        if($idxTipo=='Traslados'){
                            $totalTraslados = $totalTraslados + round($impTasa['Importe'],2);
                            $arreglo[$idxTipo][$h]['TasaOCuota'] = number_format($idxTasa/100,6,".","");	
                            $arreglo[$idxTipo][$h]['TipoFactor'] = $idxFactor;
                        }else{
                            $totalRetenciones = $totalRetenciones + round($impTasa['Importe'],2);
                        }
                    }
                }
            }
        }
        if($ish>0){
            $arreglo['ISH']['total'] = number_format($ish,2,".","");
        }

        $arreglo['totalesImpuestos'] = array('totalTraslado'=>number_format($totalTraslados,2,".",""),
                                            'totalRetencion'=>number_format($totalRetenciones,2,".",""));

        $arreglo['SubTotal'] = number_format($subtotalTot,2,".","");
        $subtotalc = ($pedido->total + ($totalRetenciones - $totalTraslados)) + $descuentoTot;
        $difsub = $subtotalTot - $subtotalc;
        if($descuentoTot>0){
            // $descuentoTot = $descuentoTot - $difsub;
            $arreglo['Descuento'] = number_format($descuentoTot,2,".","");
            //$arreglo['Descuento'] = $arreglo['Descuento'] - 0.01;
        }

        

        $cfd = new SatXML;
        $xml = $cfd->satxmlsv22($arreglo,NULL,$_SERVER['DOCUMENT_ROOT'].'/naercriserp/send/');    // Genera cadena XML en base a arreglo asociativo y cadena EDI
        $arrResp = array();
        $arrResp['status'] = 201;
        $arrResp['tipo'] = 'Facturado!';
        $arrResp['env'] = $emisor->env;
        $arrResp['mensaje'] = '';
        $arrResp['serie'] = $seriefolio->serie;
        $arrResp['folio'] = $seriefolio->folio;
        return json_encode($arrResp);
    }

    public function saveFactura(Request $request){
        $doctosClientes = new DoctosClientes;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $id = $request->id;
        $seriefolio = $request->folio.$request->serie;
        $caja = new Caja;

        $filexml = $_SERVER['DOCUMENT_ROOT'].'/naercriserp/CFDI/'.$seriefolio.'.xml';
        if(isset($request->env)){
            if($request->env=='nofact'){
                $filexml = $_SERVER['DOCUMENT_ROOT'].'/naercriserp/send/'.$seriefolio.'.xml';
            }
        }
        $xml = simplexml_load_file($filexml);
        $ns = $xml->getNamespaces(true);
        $xml->registerXPathNamespace('c', $ns['cfdi']);
        if(isset($request->env)){
            if($request->env=='nofact'){
                $filexml = $_SERVER['DOCUMENT_ROOT'].'/naercriserp/send/'.$seriefolio.'.xml';
                $row = array(
                    'UUID'=>'',
                    'NoCertificadoSAT'=>'',
                    'FechaSAT'=>'',
                    'SelloCFD'=>'',
                    'SelloSAT'=>''
                );
            }else{
                $xml->registerXPathNamespace('t', $ns['tfd']);
                foreach ($xml->xpath('//t:TimbreFiscalDigital') as $tfd) {
                    $row = array(
                        'UUID'=>$tfd['UUID'],
                        'NoCertificadoSAT'=>$tfd['NoCertificadoSAT'],
                        'FechaSAT'=>$tfd['FechaTimbrado'],
                        'SelloCFD'=>$tfd['SelloCFD'],
                        'SelloSAT'=>$tfd['SelloSAT']
                    );
                }
            }
        }else{
            $xml->registerXPathNamespace('t', $ns['tfd']);
            foreach ($xml->xpath('//t:TimbreFiscalDigital') as $tfd) {
                $row = array(
                    'UUID'=>$tfd['UUID'],
                    'NoCertificadoSAT'=>$tfd['NoCertificadoSAT'],
                    'FechaSAT'=>$tfd['FechaTimbrado'],
                    'SelloCFD'=>$tfd['SelloCFD'],
                    'SelloSAT'=>$tfd['SelloSAT']
                );
            }
        }
        $comprobante = array();
        foreach ($xml->xpath('//cfdi:Comprobante') as $cfdiComprobante){ 
            $comprobante['Fecha'] = $cfdiComprobante['Fecha']; 
            $comprobante['Serie'] = $cfdiComprobante['Serie']; 
            $comprobante['Folio'] = $cfdiComprobante['Folio']; 
            $comprobante['Total'] = $cfdiComprobante['Total']; 
            $comprobante['Sello'] = $cfdiComprobante['Sello']; 
            $comprobante['Certificado'] = $cfdiComprobante['Certificado']; 
            $comprobante['SubTotal'] = $cfdiComprobante['SubTotal']; 
            $comprobante['FormaPago'] = $cfdiComprobante['FormaPago']; 
            $comprobante['MetodoPago'] = $cfdiComprobante['MetodoPago']; 
            $comprobante['NoCertificado'] = $cfdiComprobante['NoCertificado']; 
            $comprobante['TipoDeComprobante'] = $cfdiComprobante['TipoDeComprobante']; 
            $comprobante['LugarExpedicion'] = $cfdiComprobante['LugarExpedicion']; 
            $comprobante['Moneda'] = $cfdiComprobante['Moneda']; 
            $comprobante['Descuento'] = $cfdiComprobante['Descuento']; 
        } 

        $emisor = array();
        foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Emisor') as $Emisor){ 
            $emisor['Rfc'] = $Emisor['Rfc'];
            $emisor['Nombre'] = $Emisor['Nombre']; 
            $emisor['RegimenFiscal'] = $Emisor['RegimenFiscal']; 
        }
        
        $receptor = array();
        foreach ($xml->xpath('//cfdi:Comprobante//cfdi:Receptor') as $idx => $Receptor){ 
            $receptor['Rfc'] = $Receptor['Rfc'];
            $receptor['Nombre'] = $Receptor['Nombre']; 
            $receptor['UsoCFDI'] = $Receptor['UsoCFDI']; 
            $receptor['RegimenFiscalReceptor'] = $Receptor['RegimenFiscalReceptor']; 
            $receptor['DomicilioFiscalReceptor'] = $Receptor['DomicilioFiscalReceptor']; 
        }
        
        $array = array('timbrado'=>$row,'comprobante'=>$comprobante,'emisor'=>$emisor,'receptor'=>$receptor);
        $res = $caja->saveFactura($id,$array,$usuario,$turno,$request->idAlmacen);
        if($res>0){
            $totalDocumento = round((float)$comprobante['Total'],2);
            $relanticipos = $caja->getAnticipos($id);
            if(isset($relanticipos[0])){
                //Generar los CFDI de egresos de los anticipos
                $errorTimbrado = 0;
                $errorUpdateUUID = 0;
                $sumaanticipos = 0;
                $mayormonto = 0;
                $id_tpv_cliente = 0;
                $id_sat_formapago = '';
                foreach($relanticipos as $anticip){
                    $sumaanticipos = $sumaanticipos + round($anticip->monto,2);
                    if($anticip->monto>$mayormonto){
                        $mayormonto = $anticip->monto;
                        $id_tpv_cliente = $anticip->id_tpv_cliente;
                        $id_sat_formapago = $anticip->id_sat_formapago;
                    }
                    if($totalDocumento>=$sumaanticipos){
                        $timbrar = $this->generaCFDIEgreso($anticip->id ,'ANTICIPO', $usuario, $turno, $anticip->monto, $row['UUID']);
                        if(!$timbrar){
                            $errorTimbrado++;
                        }else{
                            $saveuuid = $doctosClientes->saveUUIDEgreso($anticip->id,$timbrar);
                            if($saveuuid==0){
                                $errorUpdateUUID++;
                            }
                        }
                    }else{
                        $rem = $sumaanticipos - $totalDocumento;
                        $totanticiporem = $anticip->monto - $rem;
                        $timbrar = $this->generaCFDIEgreso($anticip->id ,'ANTICIPO', $usuario, $turno, $totanticiporem, $row['UUID']);
                        if(!$timbrar){
                            $errorTimbrado++;
                        }else{
                            $saveuuid = $doctosClientes->saveUUIDEgreso($anticip->id,$timbrar);
                            if($saveuuid==0){
                                $errorUpdateUUID++;
                            }
                        }
                    }
                }     
                if($errorTimbrado==0 && $errorUpdateUUID==0){
                    $remanente = $sumaanticipos - $totalDocumento;
                    if($remanente>0){
                        $almacen = $request->idAlmacen;
                        $idTipoDoc = 13;
                        $respFol = $doctosClientes->getFolio($usuario,$turno,$idTipoDoc,$almacen);
                        if(isset($respFol[0])){
                            $request->folio = $respFol[0]->serie.'-'.$respFol[0]->folio;
                            $request->almacen = $request->idAlmacen;
                            $request->idcliente = $id_tpv_cliente;
                            $request->monto = $remanente;
                            $request->concepto = 'REMANENTE POR APLICACION DE ANTICIPO EN VENTA';
                            $request->formapago = $id_sat_formapago;
                            $ctacaja = $caja->getCtaCaja($request->idAlmacen);
                            $request->cuenta = $ctacaja->cuentacaja;
                            $creaanticipo = $doctosClientes->generaAnticipo($request);
                            if($creaanticipo>0){
                                $timbrar = $this->generaCFDIEgreso($creaanticipo ,'ANTICIPO', $usuario, $turno, $remanente, $row['UUID']);
                                if(!$timbrar){
                                    return 'Se genero la factura correctamente pero hubo problemas al timbrar el documento de egreso de saldo a favor.';
                                }else{
                                    $saveuuid = $doctosClientes->saveUUIDAnticipo($creaanticipo,$timbrar);
                                    if($saveuuid==1){
                                        return $res;
                                    }else{
                                        return 'Se genero la factura correctamente pero hubo problemas al agregar el UUID al documento de egreso del saldo a favor.';
                                    }
                                }
                            }else{
                                return 'Se genero la factura correctamente pero no se genero el anticipo del saldo a favor por '.$remanente.'. Debera generarlo manualmente. ';
                            }
                        }else{
                            return 'Se genero la factura correctamente pero hubo problemas al obtener el folio del Anticipo generado por remanente.';
                        }
                    }else{
                        return $res;
                    }
                }else{
                    if($errorTimbrado>0){
                        return 'Se genero la factura correctamente pero hubo problemas al timbrar los documentos de Egresos.';
                    }
                    if($errorUpdateUUID>0){
                        return 'Se genero la factura correctamente pero hubo problemas al actualizar los UUID de los documentos de Egresos.';
                    }
                }
            }else{
                return $res;
            }
        }else{
            return $res;
        }
    }    

    public function generaCFDIEgreso($id ,$tipo, $usuario, $turno, $totaldoc, $uuiddoc){
        $doctosClientes = new DoctosClientes;
        $caja = new Caja;
        $cxc = new CXC;
        $facturacion = new Facturacion;
        if($tipo=='ANTICIPO'){
            $documento = $doctosClientes->getAnticipo($id);
        }
        if(!isset($documento->id)){
            return false;
        }
        $seriefolioexp = explode('-',$documento->folio);
        $serie = $seriefolioexp[0].'_EG';
        $folio = $seriefolioexp[1];

        $emisor = $cxc->getDatosEmpresa(1);
        $receptor = $cxc->getDatosCliente($documento->id_tpv_cliente);        
        $usocfdi = $facturacion->getUsoCFDI($receptor->id_sat_usocfdi);

        $subtotal = round(($totaldoc/1.16),2);
        $iva = round(($totaldoc - $subtotal),2);
        $total = $totaldoc;

        date_default_timezone_set('Etc/GMT+6');
        // if($emisor->env=='prod'){
             $emisornocertificado = $emisor->nocertificado;
        // }else{
        //     $emisornocertificado = $emisor->dev_certificado;
        // }
        $arreglo = array("xmlns:cfdi"=>"http://www.sat.gob.mx/cfd/4",
                        "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
                        "xsi:schemaLocation"=>"http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd",
                        "Version"=>"4.0",
                        "Serie"=>$serie,
                        "Folio"=>$folio,
                        "Exportacion"=>"01",
                        "Fecha"=>date("Y-m-d")."T".date("h:i:s"),
                        "FormaPago"=>'30',
                        "Sello"=>"@",
                        #"CondicionesDePago"=>$condicionesDePago,
                        "NoCertificado"=>$emisornocertificado,
                        "Certificado"=>"@",
                        "SubTotal"=>$subtotal,
                        "Total"=>$total,
                        "TipoDeComprobante"=>'E',
                        "MetodoPago"=>'PUE',
                        "LugarExpedicion"=>$documento->lugarexpedicion,
                        "Moneda"=>'MXN'); 
     

        //Documentos relacionados
        $irel = 0;         
        $arreglo['Relacionados'] = array();
        $arreglo['Relacionados'][$irel]['TipoRelacion'] = '07';
        $arreglo['Relacionados'][$irel]['documentos'] = array();
        $iant = 0;
        $arreglo['Relacionados'][$irel]['documentos'][$iant]['UUID'] = $uuiddoc;
        #************  DATOS DEL EMISOR ***********
        //dd($emisor);
        //if($emisor->env=='prod'){
            $arreglo['Emisor'] = array("Rfc"=>utf8_decode($emisor->rfc),
                                    "Nombre"=>utf8_decode($emisor->razonsocial),
                                    "RegimenFiscal"=>$emisor->regimenfiscal);  
        // }else{
        //     $arreglo['Emisor'] = array("Rfc"=>utf8_decode($emisor->dev_rfc),
        //                             "Nombre"=>utf8_decode($emisor->dev_razonsocial),
        //                             "RegimenFiscal"=>$emisor->dev_regimenfiscal); 
        // }
                                    
        if($receptor->rfc=='XAXX010101000'){
            $cpreceptor = $documento->lugarexpedicion;
        }else{
            $cpreceptor = $receptor->cp;
        }                        
        #************  DATOS DEL RECEPTOR ***********
        $arreglo['Receptor'] = array("Rfc"=>utf8_decode($receptor->rfc),
                                    "Nombre"=>trim(utf8_decode($receptor->nombre)),
                                    "UsoCFDI"=>'CP01',
                                    "RegimenFiscalReceptor"=>utf8_decode($receptor->regimenfiscal),
                                    "DomicilioFiscalReceptor"=>$cpreceptor);        
                                    
        #************  CONCEPTOS DE LA FACTURA ***********
        //Preparamos los nodos para Impuestos en la parte final
        $trasret = array();
        $impn = 0;

        $arreglo['Conceptos'] = array();
        

        $arreglo['Conceptos'][1]['Cantidad'] = 1;
        $arreglo['Conceptos'][1]['ClaveUnidad'] = 'ACT';
        $arreglo['Conceptos'][1]['Descripcion'] = 'Anticipo del bien o servicio';
        $arreglo['Conceptos'][1]['ValorUnitario'] = $subtotal;
        $arreglo['Conceptos'][1]['ObjetoImp'] = "02";
        $arreglo['Conceptos'][1]['Importe'] = $subtotal;
        $arreglo['Conceptos'][1]['ClaveProdServ'] = '84111506';
        
        $arreglo['CImpuestos'][1]['Traslados'] = array();
        $arreglo['CImpuestos'][1]['Retenciones'] = array();
        $tmit = 1;
        $tmir = 1;
        $arreglo['CImpuestos'][1]['Traslados'][$tmit]['Importe'] = number_format($iva,2,".","");
        $arreglo['CImpuestos'][1]['Traslados'][$tmit]['TasaOCuota'] = '0.160000';
        $arreglo['CImpuestos'][1]['Traslados'][$tmit]['TipoFactor'] = 'Tasa';
        $arreglo['CImpuestos'][1]['Traslados'][$tmit]['Impuesto'] = '002';
        $arreglo['CImpuestos'][1]['Traslados'][$tmit]['Base'] = number_format($subtotal,2,".","");
        
        if(!isset($trasret['Traslados']['002']['Tasa'][16]['Base']))
            $trasret['Traslados']['002']['Tasa'][16]['Base'] = number_format($subtotal,2,".","");
        else
            $trasret['Traslados']['002']['Tasa'][16]['Base']+= number_format($subtotal,2,".","");

        if(!isset($trasret['Traslados']['002']['Tasa'][16]['Importe']))
            $trasret['Traslados']['002']['Tasa'][16]['Importe'] = number_format($iva,2,".","");
        else
            $trasret['Traslados']['002']['Tasa'][16]['Importe']+= number_format($iva,2,".","");
                

        $totalTraslados = 0;
        $totalRetenciones = 0;
        $arreglo['Traslados'] = array();
        $arreglo['Retenciones'] = array();
        $h = 1;
        foreach($trasret as $idxTipo => $impTipo){
            foreach($impTipo as $idxImpuesto => $impNombre){
                foreach($impNombre as $idxFactor => $impFactor){
                    foreach($impFactor as $idxTasa => $impTasa){
                        $arreglo[$idxTipo][$h]['Base'] = number_format($impTasa['Base'],2,".","");
                        $arreglo[$idxTipo][$h]['Impuesto'] = $idxImpuesto;
                        $arreglo[$idxTipo][$h]['Importe'] = number_format($impTasa['Importe'],2,".","");		
                        if($idxTipo=='Traslados'){
                            $totalTraslados = $totalTraslados + $impTasa['Importe'];
                            $arreglo[$idxTipo][$h]['TasaOCuota'] = number_format($idxTasa/100,6,".","");	
                            $arreglo[$idxTipo][$h]['TipoFactor'] = $idxFactor;
                        }else{
                            $totalRetenciones = $totalRetenciones + $impTasa['Importe'];
                        }
                    }
                }
            }
        }        

        $arreglo['totalesImpuestos'] = array('totalTraslado'=>number_format($totalTraslados,2,".",""),
                                            'totalRetencion'=>number_format($totalRetenciones,2,".",""));

        $cfd = new SatXML;
        $xml = $cfd->satxmlsv22($arreglo,NULL,$_SERVER['DOCUMENT_ROOT'].'/naercriserp/send/');    // Genera cadena XML en base a arreglo asociativo y cadena EDI
        if(!$xml){
            return false;
        }else{
            $timbrado = $this->timbrarCFDI($serie,$folio,$emisor->env);
            if(isset($timbrado['status'])){
                if($timbrado['status']==201){
                    return $timbrado['uuid'];
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }
    }

    public function timbrarCFDI($serie,$folio,$env){
        $invoice_path = $_SERVER['DOCUMENT_ROOT']."/naercriserp/send/".$folio."".$serie.".xml";
        $xml_file = fopen($invoice_path, "rb");
        $xml_content = fread($xml_file, filesize($invoice_path));
        fclose($xml_file);
        $normalenv = 0;
        # Username and Password, assigned by FINKOK    
        if(isset($env)){
            if($env=='prod'){
                $username = 'sergio@xiontecnologias.com';
                $password = 'Serygra300107+-';
                $url ="https://facturacion.finkok.com/servicios/soap/stamp.wsdl";
                $arrResp = array('status'=>0,'tipo'=>'Ups!','mensaje'=>'');
            }else{
                if($env=='nofact'){
                    $username = 'sergio@xiontecnologias.com';
                    $password = 'Serygra300107+-';
                    $url ="http://demo-facturacion.finkok.com/servicios/soap/stamp.wsdl";
                    $arrResp = array('status'=>201,'tipo'=>'Facturado!','mensaje'=>'');
                    $normalenv = 1;
                }else{
                    $username = 'sergio@xiontecnologias.com';
                    $password = 'Serygra300107+-';
                    $url ="http://demo-facturacion.finkok.com/servicios/soap/stamp.wsdl";
                    $arrResp = array('status'=>0,'tipo'=>'Ups!','mensaje'=>'');
                }
            }
        }else{
            $username = 'sergio@xiontecnologias.com';
            $password = 'Serygra300107+-';
            $url ="https://facturacion.finkok.com/servicios/soap/stamp.wsdl";
            $arrResp = array('status'=>0,'tipo'=>'Ups!','mensaje'=>'');
        }

        if($normalenv==0){
            /* Tiempo lmite de espera entre la conexin de 10 segundos */
            $timeout = stream_context_create(array('http' => array('timeout' => 5))); 
            /* Verifica si la url existe */
            if(@file_get_contents($url, 0, $timeout)){
                # Consuming the stamp service   
                $client = new \SoapClient($url, array('trace' => 1));
                
                $params = array(
                "xml" => $xml_content,
                "username" => $username,
                "password" => $password
                );
                $response = $client->__soapCall("stamp", array($params));
                $xmlResp = $response->stampResult->xml;

                # Saving the Last Request
                $response_path = $_SERVER['DOCUMENT_ROOT'].'/naercriserp/send/LastRequest_.xml';
                $xml_out_file = fopen($response_path, "w");
                fwrite($xml_out_file, $client->__getLastRequest());
                fclose($xml_out_file);

                # Saving the Last Request
                $response_path2 = $_SERVER['DOCUMENT_ROOT'].'/naercriserp/send/LastResponse_.xml';
                $xml_out_file2 = fopen($response_path2, "w");
                fwrite($xml_out_file2, $client->__getLastResponse());
                fclose($xml_out_file2);
                
                if($xmlResp!=""){
                    $arrResp['status'] = 201;
                    $arrResp['uuid'] = $response->stampResult->UUID;
                    
                    $sxe = new \SimpleXMLElement($xmlResp);
                    $ns = $sxe->getNamespaces(true);
                    $sxe->registerXPathNamespace('c', $ns['cfdi']);
                    $sxe->registerXPathNamespace('t', $ns['tfd']);
                    $selloCFD = "";
                    foreach ($sxe->xpath('//t:TimbreFiscalDigital') as $tfd) {
                        $selloCFD = $tfd['SelloCFD'];
                    }
                    
                    //$arrResp['selloCFD'] = "".$selloCFD;
                    $arrResp['tipo'] = 'Facturado!';
                    $arrResp['mensaje'] = '';
                    # Guardar el XML timbrado
                    $response_path = $_SERVER['DOCUMENT_ROOT']."/naercriserp/CFDI/".$folio."".$serie.".xml";
                    $xml_out_file = fopen($response_path, "w");
                    fwrite($xml_out_file, $xmlResp);
                    fclose($xml_out_file);
                }else{		
                    $arrResp['status'] = 2;
                    $arrResp['tipo'] = 'Atencion!';
                    $arrResp['mensaje'] = $response->stampResult->Incidencias->Incidencia->MensajeIncidencia;//;
                }
            }else{
                $arrResp['status'] = 0;
                $arrResp['tipo'] = 'Atencion!';
                $arrResp['mensaje'] = 'Servidor PAC fuera de linea';
            }
        }
        return $arrResp;
    }

    public function getFormaPagoAnticipo(Request $request) {
        //dd($request->idPedido);
        $remisiones = new Remisiones;
        $formapago = $remisiones->ticketFormaPago($request->idPedido,13);
        return json_encode($formapago);
        //dd($formapago);
    }

    public function cancelarDocumento(Request $request) {
        $caja = new Caja;
        $remisiones = new Remisiones;
        $misc = new Misc;
        $arrResp = array('status'=>0,'response'=>'');
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $dbnomina = $request->session()->get('dbnomina');

        $empresa = $misc->getEmpresa(1);
        $documento = $remisiones->getDocumento($request->id,$dbnomina);
        $factura = $caja->getInfoFactura($request->id);
        if(isset($factura->UUID)){
            # usario y passwor de Finkok
            $username = 'sergio@xiontecnologias.com';#'serygra@gmail.com';
            $password = 'Serygra300107+-';#'Serygra300107+';

            #RFC del Emisor
            $rfc = strtoupper($empresa->rfc);
            if(!is_dir($_SERVER['DOCUMENT_ROOT']."/".$empresa->directorioraiz."/cancelaciones/".strtoupper($empresa->rfc))){
                mkdir($_SERVER['DOCUMENT_ROOT']."/".$empresa->directorioraiz."/cancelaciones/".strtoupper($empresa->rfc));
            }
            #Lee el archivo de certificado en formato PEM
            $cer_path = $_SERVER['DOCUMENT_ROOT']."/".$empresa->directorioraiz."/sat/certificados/".$empresa->rfc.".cer.pem";
            $cer_file = fopen($cer_path, "r");
            $cer= fread($cer_file, filesize($cer_path));
            fclose($cer_file);

            #Lee el archivo de la llave privada en formato ENC
            $key_path = $_SERVER['DOCUMENT_ROOT']."/".$empresa->directorioraiz."/sat/certificados/".$empresa->rfc.".enc.key";
            $key_file = fopen($key_path, "r");
            $key = fread($key_file,filesize($key_path));
            fclose($key_file);

            $url = "https://facturacion.finkok.com/servicios/soap/cancel.wsdl";
            $client = new \SoapClient($url, array('trace' => 1));

            $uuids = array("UUID" => $factura->UUID, "Motivo" => "02", "FolioSustitucion" => "");
            $uuid_ar = array('UUID' => $uuids);
            $params = array("UUIDS"=>$uuid_ar,
                        "username" => $username,
                        "password" => $password,
                        "taxpayer_id" => $rfc,
                        "cer" => $cer,
                        "key" => $key);

            $response = $client->__soapCall("cancel", array($params));

            #Genera el SOAP Request y Response en la ruta especificada
            // $lastrequest = $client->__getLastRequest();
            // $file = fopen("lastrequest.xml", "w");
            // fwrite($file, $lastrequest);
            // fclose($file);

            // $lastresponse = $client->__getLastResponse();
            // $file = fopen("lastresponse.xml", "w");
            // fwrite($file, $lastresponse);
            // fclose($file);

            if(isset($response->cancelResult->Folios->Folio->EstatusUUID)){
                $statusResponse = $response->cancelResult->Folios->Folio->EstatusUUID;

                if($statusResponse == 201 || $statusResponse == 202){
                    
                    $xmlResp = utf8_encode($response->cancelResult->Acuse);
                    //$FechaC = substr($response->cancelResult->Fecha,0,10);
                    //$HoraC = substr($response->cancelResult->Fecha,11,8);
                    
                    
                    $acuseName = "Acuse_".$factura->UUID.".xml";
                    $xml_out_file = fopen($_SERVER['DOCUMENT_ROOT']."/".$empresa->directorioraiz."/cancelaciones/".strtoupper($rfc)."/".$acuseName, "w");
                    fwrite($xml_out_file, $xmlResp);
                    fclose($xml_out_file);
                    
                    $clave = $misc->getClaveOperacion(1, $documento[0]->id_tpv_almacen, $documento[0]->id_cat_tipodoc);
                    if(isset($clave)) {
                        if($request->clave==$clave->clave) {
                            $cancelacion = $caja->cancelarDocumento($request->id, $request->motivo, $documento[0]->id_cat_tipodoc);
                            if($cancelacion>0) {
                                $arrResp['status'] = $statusResponse;
                                $arrResp['response'] = 'La clave ingresa es correcta. El documento fue cancelado exitosamente';
                            } else {
                                $arrResp['response'] = 'El documento no pudo ser cancelado, si el problema persiste Si el problema persiste, comuniquese con el administrador del sistema..';
                            }
                        } else {
                            $arrResp['response'] = 'La clave ingresa es incorrecta, vuelva a intentar.';
                        }
                    } else {
                        $arrResp['response'] = 'No cuentas con los permisos necesarios para cancelar este documento. Si el problema persiste, comuniquese con el administrador del sistema.';
                    }
                }else{
                    $arrResp['status'] = $statusResponse;
                    $arrResp['response'] = $response->cancelResult->Folios->Folio->EstatusCancelacion;
                }
            }else{
                $arrResp['status'] = 404;
                $arrResp['response'] = 'Ha ocurrido un detalle al intentar cancelar en el SAT. Comuniquelo con el administrador del sistema.';
            }
        }else{
            $fg = $caja->getInfoFG($request->id);
            if(isset($fg->folio)){$arrResp['status'] = 402;
                $arrResp['response'] = 'El documento seleccionado se encuentra registrado en una Factura Global por lo que no podrá ser cancelado. Informe al área correspondiente.';
            }else{
                $clave = $misc->getClaveOperacion(1, $documento[0]->id_tpv_almacen, $documento[0]->id_cat_tipodoc);
                if(isset($clave)) {
                    if($request->clave==$clave->clave) {
                        $cancelacion = $caja->cancelarDocumento($request->id, $request->motivo, $documento[0]->id_cat_tipodoc);
                        if($cancelacion>0) {
                            $arrResp['status'] = 201;
                            $arrResp['response'] = 'La clave ingresa es correcta. El documento fue cancelado exitosamente';
                        } else {
                            $arrResp['response'] = 'El documento no pudo ser cancelado, si el problema persiste Si el problema persiste, comuniquese con el administrador del sistema..';
                        }
                    } else {
                        $arrResp['response'] = 'La clave ingresa es incorrecta, vuelva a intentar.';
                    }
                } else {
                    $arrResp['response'] = 'No cuentas con los permisos necesarios para cancelar este documento. Si el problema persiste, comuniquese con el administrador del sistema.';
                }
            }            
        }
        return json_encode($arrResp);
    }

    public function reiniciaDenominacionCorte(Request $request){
        $caja = new Caja;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno');
        $reinicia = $caja->reiniciaDenominacionCorte($usuario, $turno);
        return $reinicia;
    }

    public function addDenominaciones(Request $request) {
        //dd($request);
        $caja = new Caja;
        $libreria = new Libreria;
        $arrResp = array('status'=>0,'response'=>'');
        $fecha = $libreria->fechaFormat($request->fecha,'H2M');
        $usuario = $request->session()->get('idusuario');
        $cortedenominacion = $caja->nuevoCorteDenominacion($usuario, $fecha, $request->sucursal, $request->turno, $request->folio);
        if($cortedenominacion>0) {
            //dd("ENTRA");
            $cortedetalle = $caja->detalleCorteDenominacion($cortedenominacion, $request->formapago, $request->cantidad, $request->valor);
            //dd($cortedetalle);
            if(count($cortedetalle)>0){
                $arrResp['status'] = 1;
                $arrResp['response'] = json_encode($cortedetalle);
                return json_encode($arrResp);
            } else {
                $arrResp['response'] = 'Ocurrio un error al agregar un nuevo baucher al corte.';
                return json_encode($arrResp);
            }
        } else {
            $arrResp['response'] = 'Ya se encuentra registrado un corte con este usuario y esta fecha.';
            return json_encode($arrResp);
        }
    }

    public function getFolioCorte(Request $request) {
        $caja = new Caja;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $getFolio = $caja->getFolioMovimientoCaja($usuario, $turno, $request->idAlmacen, $request->idcatope);
        if(count($getFolio)>0) {
            $folio = $getFolio[0]->serie."-".$getFolio[0]->folio;
            return $folio;
        } else 
            return 0;
    }

    public function quitarBaucher($id) {
        $caja = new Caja;
        $quitar = $caja->quitarBaucher($id);
        return json_encode($quitar);
    }

    public function enviarValidacion(Request $request) {
        $caja = new Caja;
        $libreria = new Libreria;
        $nameCarpeta = $request->session()->get('erp');
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');
        $request->fechatransferencia = $libreria->fechaFormat($request->fechatransferencia,'H2M');
        $separar = explode(" ", $request->cuentabancaria);
        $result = $caja->enviarValidacion($usuario, $turno, $request->almacen, $request->folio, $request->fecha, $request->cuentacontable, $separar[0], $separar[1], $request->solicita, $request->fechatransferencia, $request->bancotransferencia, $request->cantidadtransferencia, $request->referenciatransferencia, $request->conceptotransferencia, $request->cliente);
        if($result>0) {
            if($request->validate(['foto' => 'required|image|mimes:jpeg,png,jpg']))
            {
                $file = $request->file('foto');
                $destinationPath = public_path('../imagenes/validaciones/'.$nameCarpeta.'/');
                $file->move($destinationPath, strtoupper($request->folio).'.jpg');
                return $result;
            }
            else
                return "No se guardo la imagen de la validación. Si el problema persiste, comuniquese con el administrador del sistema.";
        } else {
            return "No se guardo la validacion. Si el problema persiste, comuniquese con el administrador del sistema.";
        }
    }

    public function subirBaucher(Request $request) {
        $caja = new Caja;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $nameCarpeta = $request->session()->get('erp');
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');
        //dd($request);        
        $datosEmpresa = $caja->datosEmisor(1);
        //dd($datosEmpresa);
        if(!is_dir($_SERVER['DOCUMENT_ROOT'].'/'.$datosEmpresa->directorioraiz.'/imagenes/bauchers_venta/'.$nameCarpeta)){
            mkdir($_SERVER['DOCUMENT_ROOT'].'/'.$datosEmpresa->directorioraiz.'/imagenes/bauchers_venta/'.$nameCarpeta,0777);
        }
        $result = $caja->subirBaucher($usuario, $turno, $request->folio, $request->id, $request->fecha, $request->terminacion, $request->aprobacion, $request->total, $request->tipo, $request->sucursal);
        if($result>0) {
            if($request->validate(['foto' => 'required|image|mimes:jpeg,png,jpg']))
            {
                $file = $request->file('foto');
                $destinationPath = public_path('../imagenes/bauchers_venta/'.$nameCarpeta.'/');
                $file->move($destinationPath, strtoupper($request->folio).'.jpg');
                return $result;
            }
            else
                return "No se guardo la imagen del baucher de la venta. Si el problema persiste, comuniquese con el administrador del sistema.";
        } else {
            return "No se guardo el registro del baucher de la venta. Si el problema persiste, comuniquese con el administrador del sistema.";
        }
    }

    public function getBaucherVenta($id, $folio, Request $request) {
        $caja = new Caja;
        $nameCarpeta = $request->session()->get('erp');
        $ruta = "../imagenes/bauchers_venta/".$nameCarpeta."/".$folio.".jpg";
        $result = $caja->getBaucherVenta($id);
        if(!$result) {
            return 0;
        } else {
            $result->ruta = $ruta;
            return json_encode($result);
        }
    }

    public function subirRecibo(Request $request) {
        $caja = new Caja;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $nameCarpeta = $request->session()->get('erp');
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');
        
        $result = $caja->subirRecibo($usuario, $turno, $request->folio, $request->id, $request->fecha, $request->banco, $request->cuenta, $request->total);
        if($result>0) {
            if($request->validate(['foto' => 'required|image|mimes:jpeg,png,jpg']))
            {
                $file = $request->file('foto');
                $destinationPath = public_path('../imagenes/recibos_depositos/'.$nameCarpeta.'/');
                $file->move($destinationPath, strtoupper($request->folio).'.jpg');
                return $result;
            }
            else
                return "No se guardo la imagen del recibo de deposito bancario. Si el problema persiste, comuniquese con el administrador del sistema.";
        } else {
            return "No se guardo el registro del recibo de deposito bancario. Si el problema persiste, comuniquese con el administrador del sistema.";
        }
    }

    public function getReciboDeposito($id, $folio, Request $request) {
        $caja = new Caja;
        $nameCarpeta = $request->session()->get('erp');
        $ruta = "../imagenes/recibos_depositos/".$nameCarpeta."/".$folio.".jpg";
        $result = $caja->getReciboDeposito($id);
        if(!$result) {
            return 0;
        } else {
            $result->ruta = $ruta;
            return json_encode($result);
        }
    }

    public function validaTodasRemisionesCobradas(Request $request) {
        $caja = new Caja;
        $libreria = new Libreria;
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');
        $emp = $caja->datosEmisor(1);
        if(isset($emp->cortesinfacturar)){
            if($emp->cortesinfacturar==1){
                $result = 0;
            }else{
                $result = $caja->validaTodasRemisionesCobradas($request->idAlmacen, $request->fecha);
            }
        }else{
            $result = $caja->validaTodasRemisionesCobradas($request->idAlmacen, $request->fecha);
        }
        return $result;
    }

    public function foliosVentas(Request $request) {
        $caja = new Caja;
        $libreria = new Libreria;
        $nameCarpeta = $request->session()->get('erp');
        $request->fecha = $libreria->fechaFormat($request->fecha,'H2M');
        $result = $caja->foliosVentas($request->sucursal, $request->fecha, $nameCarpeta);
        return json_encode($result);
    }

    public function confirmarEliminarValidacion($id, Request $request) {
        //dd($id);
        $caja = new Caja;
        $libreria = new Libreria;
        $nameCarpeta = $request->session()->get('erp');
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $result = $caja->confirmarEliminarValidacion($usuario, $turno, $id);
        return json_encode($result);
    }

    public function confirmarEliminarMovimiento($id, Request $request) {
        //dd($id);
        $caja = new Caja;
        $libreria = new Libreria;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $result = $caja->confirmarEliminarMovimiento($usuario, $turno, $id);
        return json_encode($result);
    }

    public function getDocumentosTransferencia(Request $request) {
        $caja = new Caja;
        $dbnomina = $request->session()->get('dbnomina');
        $result = $caja->getDocumentosTransferencia($dbnomina);
        return json_encode($result);
    }

    public function confirmarOperacionSeleccionada($id, Request $request) {
        //dd($id, $request);
        $caja = new Caja;
        $dbnomina = $request->session()->get('dbnomina');
        $usuario = $request->session()->get('idusuario');
        $result = $caja->confirmarOperacionSeleccionada($id, $request->id, $request->operacion, $usuario);
        return json_encode($result);
    }
}
