<?php

namespace App\Models;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Libreria;
use App\Models\CXC;
use App\Models\DoctosClientes;
use App\Models\Facturacion;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Config;
use App\Http\sat\SatXML;

class Caja
{
    public function __construct() {
        $selectedDatabase = Session::get('selected_database', 'mysql');
        Config::set('database.default', $selectedDatabase);
    }
    
    public function getCierre($usuario,$turno,$fecha){
        $r = DB::table('tpv_caja')
                ->where('id_sys_usuario','=',$usuario)
                ->where('id_tpv_turno','=',$turno)
                ->where('fecha','=',$fecha)
                ->where('status','=',1)
                ->get();
        return $r;
    }

    public function getTipoMovimiento($ids){
        $r = DB::table('cat_cajamovimiento')
                ->whereIn('id',$ids)
                ->get();
        return $r;
    }

    public function getMovimientosvalidaApertura($usuario,$turno,$fecha,$idsAlmacen) {
        //$signo = $idAlmacen!=="0"?"=":">";
        
        $r = DB::table('tpv_caja')
                ->select(DB::raw("tpv_caja.*,
                             tpv_caja.id_cat_cajamovimiento as idmov,
                             cat_cajamovimiento.factor as factor,
                             cat_cajamovimiento.descripcion as movimiento,
                             cat_cajamovimiento.descripcion as tipo,
                             tpv_almacen.descripcion as sucursal,
                             'EFECTIVO' as formapago,
                             tpv_turno.descripcion as turno"))
                ->join('cat_cajamovimiento','tpv_caja.id_cat_cajamovimiento','=','cat_cajamovimiento.id')
                ->join('tpv_almacen','tpv_caja.id_tpv_almacen','=','tpv_almacen.id')
                ->join('tpv_turno','tpv_caja.id_tpv_turno','=','tpv_turno.id')
                //->where('tpv_caja.id_sys_usuario','=',$usuario)
                ->whereIn('tpv_caja.id_tpv_almacen', $idsAlmacen)
                //->where('tpv_caja.id_tpv_turno','=',$turno)
                ->where('tpv_caja.fecha','=',$fecha)
                ->where('tpv_caja.status','=',1)
                ->get();
        //dd($r,$usuario,$turno,$fecha,$idAlmacen);
        return $r;
    }

    public function getMovimientos($usuario,$turno,$fecha,$idAlmacen){
        $r = DB::table('tpv_caja')
                ->select(DB::raw("tpv_caja.id as id,
                             tpv_caja.folio as folio,
                             tpv_caja.id_cat_cajamovimiento as idmov,
                             cat_cajamovimiento.factor as factor,
                             cat_cajamovimiento.descripcion as movimiento,
                             cat_cajamovimiento.descripcion as tipo,
                             tpv_almacen.descripcion as sucursal,
                             tpv_caja.monto as monto,
                             tpv_caja.fecha as fecha,
                             tpv_caja.hora as hora,
                             'EFECTIVO' as formapago,
                             tpv_caja.observaciones as observaciones,
                             tpv_turno.descripcion as turno,
                             tpv_caja.status"))
                ->join('cat_cajamovimiento','tpv_caja.id_cat_cajamovimiento','=','cat_cajamovimiento.id')
                ->join('tpv_almacen','tpv_caja.id_tpv_almacen','=','tpv_almacen.id')
                ->join('tpv_turno','tpv_caja.id_tpv_turno','=','tpv_turno.id')
                //->where('tpv_caja.id_sys_usuario','=',$usuario)
                //->where('tpv_caja.id_tpv_turno','=',$turno)
                ->where('tpv_caja.fecha','=',$fecha)
                ->where('tpv_caja.id_tpv_almacen', '=', $idAlmacen)
                ->where('tpv_caja.status','=',1)
                ->get();
        return $r;
    }

    public function getMovimientosTurno($usuario,$turno,$idAlmacen,$fechaini,$horaini){
        $r = DB::table('tpv_caja')
                ->select(DB::raw("tpv_caja.id as id,
                             tpv_caja.folio as folio,
                             tpv_caja.id_cat_cajamovimiento as idmov,
                             cat_cajamovimiento.factor as factor,
                             cat_cajamovimiento.descripcion as movimiento,
                             cat_cajamovimiento.descripcion as tipo,
                             tpv_almacen.descripcion as sucursal,
                             tpv_caja.monto as monto,
                             tpv_caja.fecha as fecha,
                             tpv_caja.hora as hora,
                             'EFECTIVO' as formapago,
                             tpv_caja.observaciones as observaciones,
                             tpv_turno.descripcion as turno"))
                ->join('cat_cajamovimiento','tpv_caja.id_cat_cajamovimiento','=','cat_cajamovimiento.id')
                ->join('tpv_almacen','tpv_caja.id_tpv_almacen','=','tpv_almacen.id')
                ->join('tpv_turno','tpv_caja.id_tpv_turno','=','tpv_turno.id')
                ->where('tpv_caja.id_sys_usuario','=',$usuario)
                ->where('tpv_caja.id_tpv_turno','=',$turno)
                ->whereRaw("tpv_caja.fecha>='".$fechaini."'")
                ->whereRaw("tpv_caja.hora>='".$horaini."'")
                ->where('tpv_caja.id_tpv_almacen', '=', $idAlmacen)
                ->where('tpv_caja.status','=',1)
                ->get();
        return $r;
    }

    public function validaAllTicketsCobrados($fecha, $arraySucursal,$dbnomina,$empresa) {
        $remisiones = $this->getRemisiones($fecha, $arraySucursal,$dbnomina);
        $facturacion = DB::table('sys_empresa')
                        ->where('id','=',$empresa)
                        ->where('status','=',1)
                        ->first();

        return [$remisiones,$facturacion];
    }

    public function getFolioMovimientoCaja($usuario,$turno,$almacen,$operacion) {
        $result = DB::table('tpv_folio')
                    ->where('id_sys_usuario','=',$usuario)
                    ->where('id_tpv_almacen','=',$almacen)
                    ->where('id_cat_operacion','=',$operacion)
                    ->where('id_tpv_turno','=',$turno)
                    ->where('status','=',1)
                    ->get();
        return $result;
    }

    public function aplicaMovimiento($request, $folio){
        $lib = new Libreria;
        DB::beginTransaction();
        $sinproblema = true;
        $lastid = 0;
        $usuario = $request->session()->get('idusuario');
        $turno = $request->session()->get('idturno'); 
        $separar = explode(" ", $request->bancoCuenta);
        //dd($request, $separar, $request->bancoCuenta);
        if($request->monto >= 0){
            if($request->movimiento==1 || $request->movimiento==3 || $request->movimiento==5) {
                $banco = '';
                $cuentabancaria = '';
                $cuentacontable = '';
            } else {
                $banco = $separar[0];
                $cuentabancaria = $separar[1];
                $cuentacontable = $request->cuentaContable;
            }
            if($request->movimiento==2 || $request->movimiento== 5) {
                $validaIngresos = $this->validaIngresos($request->sucursal, $lib->fechaFormat($request->fecha,'H2M'));
                $retiros = $this->retirosEfectivoCaja($lib->fechaFormat($request->fecha,'H2M'), [2,5], $usuario, $turno, $request->sucursal);
                //dd($validaIngresos, $retiros);
                $efectivorestante = $validaIngresos - $retiros->monto;
                if($efectivorestante<=0) {
                    DB::rollBack();
                    return 'No puede realizar un retiro superior al efectivo actual en caja.';
                }
            }
            $r1 = DB::table('tpv_caja')->insertGetId(
                [   'folio' => $folio,
                    'id_tpv_turno' => $turno,
                    'id_sys_usuario' => $usuario,
                    'id_tpv_almacen' => $request->sucursal,
                    'id_cat_cajamovimiento' => $request->movimiento,
                    'fecha' => $lib->fechaFormat($request->fecha,'H2M'),
                    'hora' => date('H:i:s'),
                    'monto' => $request->monto,
                    'observaciones' => strtoupper($request->observaciones),
                    'banco' => $banco,
                    'cuentabancaria' => $cuentabancaria,
                    'cuentacontable' => $cuentacontable
                    //'id_sys_bancoempresa' => $request->banco,
                    //'id_sys_cuentaempresa' => $request->cuenta
                ]
            );
            if($r1>0){
                $lastid = $r1;
                $sinproblema = $sinproblema;
            }else{
                $sinproblema = false;
            }
        }

        if(!$sinproblema){
            DB::rollBack();
            return false;
        }else{
            //MOVIMIENTO CONTABLE AQUI
            $result = DB::table('tpv_folio')
                    ->where('id_sys_usuario','=',$usuario)
                    ->where('id_tpv_turno','=',$turno)
                    ->where('id_tpv_almacen', $request->sucursal)
                    ->where('id_cat_operacion','=',10)
                    ->where('status','=',1)
                    ->increment('folio');
            if($result>0){
                DB::commit();
                return $lastid;
            } else {
                DB::rollBack();
                return false;
            }
        }  
    }

    public function aplicarNotaCredito($id, $idAlmacen, $idCliente, $monto) {
        // dd($id, $idAlmacen, $idCliente,$monto);
        // $idNotaCredito = DB::table('tpv_kardex')->insertGetId([
        //     'id_sys_usuario' => $item->id_sys_usuario,
        //     'id_tpv_turno' => $item->id_tpv_turno,
        //     'id_tpv_articulo' => $item->id_tpv_articulo,
        //     'id_tpv_almacen' => $item->id_tpv_almacen
        // ]);
        // if($idNotaCredito>0) {
        //     $update = DB::table('tpv_pedido')
        //                 ->where('id','=',$id)
        //                 ->update(['id_cat_tipodoc'=>14,'status'=>14,'fechaLiquidacion'=>date('Y-m-d')." ".date('H:i:s')]);
        //     if($update>0){
        //         //Aplicar movimientos contables
        //         $result = DB::table('tpv_pedidodetalle')
        //                     ->select(DB::raw('tpv_pedidodetalle.*, tpv_articuloalmacen.id_tpv_articulo, tpv_articuloalmacen.id_tpv_almacen,
        //                                     tpv_pedido.serie, tpv_pedido.folio, tpv_pedido.id_cat_tipodoc, tpv_pedido.id_sys_usuario,
        //                                     tpv_pedido.id_tpv_turno'))
        //                     ->join('tpv_articuloalmacen', 'tpv_pedidodetalle.id_tpv_articuloalmacen', '=', 'tpv_articuloalmacen.id')
        //                     ->join('tpv_pedido', 'tpv_pedidodetalle.id_tpv_pedido', '=', 'tpv_pedido.id')
        //                     ->where('id_tpv_pedido', $id)
        //                     ->get();

        //         foreach($result as $item) {
        //             $idKardex = DB::table('tpv_kardex')->insertGetId([
        //                 'id_sys_usuario' => $item->id_sys_usuario,
        //                 'id_tpv_turno' => $item->id_tpv_turno,
        //                 'id_tpv_articulo' => $item->id_tpv_articulo,
        //                 'id_tpv_almacen' => $item->id_tpv_almacen,
        //                 'id_tpv_articuloalmacen' => $item->id_tpv_articuloalmacen,
        //                 'id_cat_tipodoc' => $item->id_cat_tipodoc,
        //                 'id_cat_operacion' => 6,
        //                 'id_cat_operacion_movimiento' => null,
        //                 'id_cat_acciones' => 2,
        //                 'nombretabla' => 'tpv_pedidodetalle',
        //                 'idregistro' => $params->id,
        //                 'folio' => $item->serie."-".$item->folio,
        //                 'fecha' => date('Y-m-d'),
        //                 'hora' => date('H:i:s'),
        //                 'cantidad' => $item->cantidad,
        //                 'costopromedio' => $item->costo,
        //             ]);
        //             if($idKardex==0) {
        //                 DB::rollBack();
        //                 return 'Detalle al guardar el movimiento en el kardex';
        //             }
        //         }
        //         if($idKardex>0) {
        //             return 1;
        //             DB::commit();
        //         }
        //     }else{
        //         return 0;
        //         DB::rollBack();
        //     }
        // } else {
        //     return 0;
        //     DB::rollBack();
        // }
    }

    public function aplicaCobro($params){
        $doctosClientes = new DoctosClientes;
        DB::beginTransaction();
        $usuario = $params->session()->get('idusuario');
        $turno = $params->session()->get('idturno');
        $dbnomina = $params->session()->get('dbnomina');
        $sinproblema = true;
        $efectivo = $params->efectivo - $params->cambio;
        $con_bancos = array();
        $con_caja = 0;
        if($params->idTipoDoc == 13) { //ES ANTICIPO
            if($efectivo > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','01')
                            ->where('isDeposito', 0)
                            ->update(['fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto'=>$efectivo]);
                if($update==0){
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '01',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $efectivo,   
                            'isAnticipo' => 1,                  
                            'status' => 1
                        ]);
                }
                $con_caja = $con_caja + (float)$efectivo;
            } else {
                DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido','=',$params->id)
                    ->where('id_sat_formapago','=','01')
                    ->where('isDeposito', 0)
                    ->delete();
            }
            if($params->deposito > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','')
                            ->where('isDeposito', 1)
                            ->update(['id_sat_formapago'=>$params->depositoforma,'fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto' => $params->deposito,'identificador'=>$params->depositoreferencia]);
                if($update==0) {
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => $params->depositoforma,
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->deposito,   
                            'identificador' => $params->depositoreferencia,   
                            'isDeposito' => 1,  
                            'isAnticipo' => 1,             
                            'status' => 1
                        ]);
                }
                if(!isset($con_bancos['102 001 000002']))
                    $con_bancos['102 001 000002'] = (float)$params->deposito;
                else
                    $con_bancos['102 001 000002'] = $con_bancos['102 001 000002'] + (float)$params->deposito;
            } else {
                DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido','=',$params->id)
                    ->where('id_sat_formapago','=','')
                    ->where('isDeposito', 1)
                    ->delete();
            }
            if($params->td > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','28')
                            ->where('isDeposito', 0)
                            ->update(['fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto' => $params->td,'id_sat_banco'=>$params->tdbanco,'identificador'=>$params->tdreferencia]);
                if($update==0) {
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '28',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->td,
                            'id_sat_banco' => $params->tdbanco,
                            'identificador' => $params->tdreferencia,
                            'isAnticipo' => 1, 
                            'status' => 1
                        ]);
                }
                if(!isset($con_bancos['102 001 000002']))
                    $con_bancos['102 001 000002'] = (float)$params->td;
                else
                    $con_bancos['102 001 000002'] = $con_bancos['102 001 000002'] + (float)$params->td;
            } else {
                DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido','=',$params->id)
                    ->where('id_sat_formapago','=','28')
                    ->where('isDeposito', 0)
                    ->delete();
            }
            if($params->tc > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','04')
                            ->where('isDeposito', 0)
                            ->update(['fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto' => $params->tc,'id_sat_banco'=>$params->tcbanco,'id_tpv_bancomensualidad'=>$params->tcmensualidad,'identificador'=>$params->tcreferencia]);
                if($update==0) {
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '04',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->tc,
                            'id_sat_banco' => $params->tcbanco,
                            'id_tpv_bancomensualidad' => $params->tcmensualidad,
                            'identificador' => $params->tcreferencia,
                            'isAnticipo' => 1, 
                            'status' => 1
                        ]);
                }
                if(!isset($con_bancos['102 001 000002']))
                    $con_bancos['102 001 000002'] = (float)$params->tc;
                else
                    $con_bancos['102 001 000002'] = $con_bancos['102 001 000002'] + (float)$params->tc;
            } else {
                DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido','=',$params->id)
                    ->where('id_sat_formapago','=','04')
                    ->where('isDeposito', 0)
                    ->delete();
            }
            if($params->cheque > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','02')
                            ->where('isDeposito', 0)
                            ->update(['fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto' => $params->cheque,'id_sat_banco'=>$params->chequebanco,'identificador'=>$params->chequenum]);
                if($update==0) {
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '02',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->cheque,
                            'id_sat_banco' => $params->chequebanco,
                            'identificador' => $params->chequenum,
                            'isAnticipo' => 1, 
                            'status' => 1
                        ]);
                }
                if(!isset($con_bancos['102 001 000002']))
                    $con_bancos['102 001 000002'] = (float)$params->cheque;
                else
                    $con_bancos['102 001 000002'] = $con_bancos['102 001 000002'] + (float)$params->cheque;
            } else {
                    DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido','=',$params->id)
                    ->where('id_sat_formapago','=','02')
                    ->where('isDeposito', 0)
                    ->delete();
            }
            if($params->transfer > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','03')
                            ->where('isDeposito', 0)
                            ->update(['fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto' => $params->transfer,'id_sat_banco'=>$params->transferbanco,'identificador'=>$params->transferfolio]);
                if($update==0) {
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '03',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->transfer,
                            'id_sat_banco' => $params->transferbanco,
                            'identificador' => $params->transferfolio,
                            'isAnticipo' => 1, 
                            'status' => 1
                        ]);
                }
                if(!isset($con_bancos['102 001 000002']))
                    $con_bancos['102 001 000002'] = (float)$params->transfer;
                else
                    $con_bancos['102 001 000002'] = $con_bancos['102 001 000002'] + (float)$params->transfer;
            } else {
                DB::table('tpv_pedidoformapago')
                ->where('id_tpv_pedido','=',$params->id)
                ->where('id_sat_formapago','=','03')
                ->where('isDeposito', 0)
                ->delete();
            }
            if($params->monedero > 0) {
                $update = DB::table('tpv_pedidoformapago')
                            ->where('id_tpv_pedido','=',$params->id)
                            ->where('id_sat_formapago','=','05')
                            ->where('isDeposito', 0)
                            ->update(['fecha' => date('Y-m-d'),'hora' => date('H:i:s'),'monto' => $params->monedero,'id_tpv_monedero' => $params->monederocomp,'identificador'=>$params->monederoid]);
                if($update == 0) {
                    DB::table('tpv_pedidoformapago')->insertGetId([
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '05',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->monedero,
                            'id_tpv_monedero' => $params->monederocomp,
                            'identificador' => $params->monederoid,
                            'isAnticipo' => 1, 
                            'status' => 1
                        ]);
                }
                if(!isset($con_bancos['102 001 000002']))
                    $con_bancos['102 001 000002'] = (float)$params->monedero;
                else
                    $con_bancos['102 001 000002'] = $con_bancos['102 001 000002'] + (float)$params->monedero;
            } else {
                DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido','=',$params->id)
                    ->where('id_sat_formapago','=','05')
                    ->where('isDeposito', 0)
                    ->delete();
            }
            $update = DB::table('tpv_pedido')
                            ->where('id','=',$params->id)
                            ->update(['isAnticipo'=>1,'anticipo'=>$params->anticipo]);
            if($update>0) {
                //Aplicar movimientos contables
                $pedd = DB::table('tpv_pedido')
                                ->select(DB::raw('tpv_pedido.*,tpv_cliente.clave as clave,sys_persona.nombre as nombre'))
                                ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                                ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                                ->where('tpv_pedido.id',$params->id)
                                ->first();
                /*
                Inventario >
                Costo de Venta <
                Caja <
                Ventas >
                IVA Trasladado >
                Descuento Sobre Ventas < (Si tuviera descuento)
                */
                $conhead = DB::table('con_asiento')->insertGetId([
                    'id_sys_usuario'=>$usuario,
                    'id_cat_tipoasiento'=>1,
                    'concepto'=>'ANTICIPO DE CLIENTE NUM. '.$params->folio,
                    'fecha'=>date('Y-m-d'),
                    'hora'=>date('H:i:s'),
                    'debe'=>$pedd->total,
                    'haber'=>$pedd->total
                ]);
                if($conhead>0){
                    /*
                    Inventario >
                    Costo de Ventas <
                    Clientes <
                    IVA por trasladar <
                    Ventas >
                    */
                    //Obtenemos la cuenta contable de almacen
                    $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',$pedd->id_tpv_almacen)
                                ->first();
                    if(isset($almcc->id)){
                        $movimientos = array();
                        $totalAbono = 0;
                        
                        // DB::rollBack();
                        // return $con_caja.' :: '.count($con_bancos);
                        // Cargo a Caja
                        // if($con_caja>0){
                        //     $movimientos[] = [
                        //         'id_con_asiento'=>$conhead,
                        //         'cuenta'=>$almcc->cuentacaja,
                        //         'id_con_centrocosto'=>$almcc->id,
                        //         'debe'=>$con_caja,
                        //         'haber'=>0
                        //     ];
                        // }
                        // Cargo a Bancos
                        if(count($con_bancos)>0){
                            foreach($con_bancos as $ixb => $valb){
                                // $movimientos[] = [
                                //     'id_con_asiento'=>$conhead,
                                //     'cuenta'=>$ixb,
                                //     'id_con_centrocosto'=>$almcc->id,
                                //     'debe'=>$valb,
                                //     'haber'=>0
                                // ];
                                $totalAbono+= $valb;
                            }
                        }
                        $totalAbono = $totalAbono + $con_caja;
                        $movimientos[] = [
                            'id_con_asiento'=>$conhead,
                            'cuenta'=>$almcc->cuentacaja,
                            'id_con_centrocosto'=>$almcc->id,
                            'debe'=>$totalAbono,
                            'haber'=>0
                        ];
                        // Abono a Anticipo de Clientes por el total de la venta antes iva
                        //Primero revisamos si existe la cuenta de Anticipos de clientes para este cliente y si no, la creamos
                        $ctaant = '206 001 '.str_pad($pedd->clave, 6, "0", STR_PAD_LEFT);
                        $cac = DB::table('con_cuentas')->where('numerocuenta',$ctaant)->first();
                        if(isset($cac->numerocuenta)){
                            $cuentaclienteanticipo = $ctaant;
                        }else{
                            $cuentaclienteanticipo = DB::table('con_cuentas')->insertGetId([
                                'numerocuenta'=>$ctaant,
                                'descripcion'=>$pedd->clave,
                                'codigoagrupador'=>'206.01',
                                'id_sys_usuario'=>$usuario,
                                'fecha'=>date('Y-m-d'),
                                'hora'=>date('H:i:s'),
                                'saldoinicial'=>0
                            ]);
                        }
                        $abonosiniva = $totalAbono/1.16;
                        $movimientos[] = [
                            'id_con_asiento'=>$conhead,
                            'cuenta'=>$ctaant,
                            'id_con_centrocosto'=>$almcc->id,
                            'debe'=>0,
                            'haber'=>$abonosiniva
                        ];
                        // Abono a iva trasladado
                        $ivatras = $totalAbono - $abonosiniva;
                        $movimientos[] = [
                            'id_con_asiento'=>$conhead,
                            'cuenta'=>'208 001 000001',
                            'id_con_centrocosto'=>$almcc->id,
                            'debe'=>0,
                            'haber'=>$ivatras
                        ];
                        $condet = DB::table('con_asientodetalle')->insert($movimientos);
                        if($condet>0){
                            DB::commit();
                            return 1;
                        }else{
                            DB::rollBack();
                            $sinproblema = 'Problemas al crear el detalle del asiento contable. Comuniquelo con el administrador del sistema.';
                        }
                    }else{
                        DB::rollBack();
                        $sinproblema = 'Problemas obteniendo la cuenta contable del centro de costos. Comuniquelo con el administrador del sistema.';
                    }
                }else{
                    DB::rollBack();
                    $sinproblema = 'Problemas agregando la cabecera del asiento contable. Comuniquelo con el administrador del sistema.';
                }
            } else {
                DB::rollBack();
                $sinproblema = 'Problemas al actualizar el pedido. Comuniquelo con el administrador del sistema.';
            }
        }else { //ES VENTA DE CONTADO
            //Inserta los números de serie
            $series = json_decode($params->series,true);
            // DB::rollBack();
            // return $series;
            $b1 = 0;
            $n1 = 0;
            foreach($series as $serie){
                if(isset($serie['serie'])){
                    $ns = DB::table('tpv_pedidodetalleserie')->insertGetId([
                        'id_tpv_pedidodetalle'=>$serie['idpedidodetalle'],
                        'numeroserie'=>strtoupper($serie['serie'])
                    ]);
                    if($ns>0){
                        $b1=$ns;
                    }else{
                        $b1=0;
                        break;
                    }
                }
                $n1++;
            } 

            if($n1>0 && $b1==0){            
                $sinproblema = false;
                DB::rollBack();
                return $sinproblema;
            }

            if(count($series)==0)
                $b1 = 1;

            //ACTUALIZAMOS LOS ANTICIPOS USADOS
            $anticipos = json_decode($params->detanticipos,true);
            $b2 = 0;
            $maxpagoanti = '01';
            $maxmontoanti = 0;
            foreach($anticipos as $anticip){
                if(isset($anticip['folio'])){
                    $nns2 = DB::table('con_cxcanticipo')
                            ->where('id',$anticip['id'])
                            ->first();
                    if(isset($nns2->id)){
                        if($nns2->monto>$maxmontoanti){
                            $maxpagoanti = $nns2->id_sat_formapago;
                        }
                        $ns2 = DB::table('con_cxcanticipo')
                                ->where('id',$anticip['id'])
                                ->update([
                                    'status'=>2,
                                    'id_tpv_pedido'=>$params->id
                                ]);
                        if($ns2>0){
                            $b2=$ns2;
                        }else{
                            $b2=0;
                            break;
                        }
                    }else{
                        $b2=0;
                        break;
                    }
                }
            }
            if(count($anticipos)==0)
                $b2=1;
            //dd($b1, $b2);
            //return $params->id;
            if($b1>0 && $b2>0){
                if($efectivo > 0){
                    $r1 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '01',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $efectivo,                    
                            'status' => 1
                        ]
                    );
                    $con_caja+= $efectivo;
                    if($r1>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->deposito > 0){
                    $r2 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => $params->depositoforma,
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->deposito,   
                            'identificador' => $params->depositoreferencia,   
                            'isDeposito' => 1,              
                            'status' => 1
                        ]
                    );
                    if(!isset($con_bancos['102 001 000002']))
                        $con_bancos['102 001 000002'] = $params->deposito;
                    else
                        $con_bancos['102 001 000002']+= $params->deposito;
                    if($r2>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->td > 0){
                    $r3 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '28',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->td,
                            'id_sat_banco' => $params->tdbanco,
                            'identificador' => $params->tdreferencia,
                            'status' => 1
                        ]
                    );
                    if(!isset($con_bancos['102 001 000002']))
                        $con_bancos['102 001 000002'] = $params->td;
                    else
                        $con_bancos['102 001 000002']+= $params->td;
                    if($r3>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->tc> 0){
                    $r4 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '04',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->tc,
                            'id_sat_banco' => $params->tcbanco,
                            'id_tpv_bancomensualidad' => $params->tcmensualidad,
                            'identificador' => $params->tcreferencia,
                            'status' => 1
                        ]
                    );
                    if(!isset($con_bancos['102 001 000002']))
                        $con_bancos['102 001 000002'] = $params->tc;
                    else
                        $con_bancos['102 001 000002']+= $params->tc;
                    if($r4>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->cheque > 0){
                    $r5 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '02',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->cheque,
                            'id_sat_banco' => $params->chequebanco,
                            'identificador' => $params->chequenum,
                            'status' => 1
                        ]
                    );
                    if(!isset($con_bancos['102 001 000002']))
                        $con_bancos['102 001 000002'] = $params->cheque;
                    else
                        $con_bancos['102 001 000002']+= $params->cheque;
                    if($r5>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->transfer > 0){
                    $r6 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '03',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->transfer,
                            'id_sat_banco' => $params->transferbanco,
                            'identificador' => $params->transferfolio,
                            'status' => 1
                        ]
                    );
                    if(!isset($con_bancos['102 001 000002']))
                        $con_bancos['102 001 000002'] = $params->transfer;
                    else
                        $con_bancos['102 001 000002']+= $params->transfer;
                    if($r6>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->monedero > 0){
                    $r7 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '05',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $params->monedero,
                            'id_tpv_monedero' => $params->monederocomp,
                            'identificador' => $params->monederoid,
                            'status' => 1
                        ]
                    );
                    if(!isset($con_bancos['102 001 000002']))
                        $con_bancos['102 001 000002'] = $params->monedero;
                    else
                        $con_bancos['102 001 000002']+= $params->monedero;
                    if($r7>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }
                if($params->anticipos > 0){                    
                    $okanti = true;
                    $relanticipos = $this->getAnticipos($params->id);
                    $mayormonto = 0;
                    $id_sat_formapago = '';
                    $sumaanticipos = 0;
                    $okupdatesanti = true;
                    foreach($relanticipos as $anticip){
                        $sumaanticipos = $sumaanticipos + round($anticip->monto,2);
                        if($anticip->monto>$mayormonto){
                            $mayormonto = $anticip->monto;
                        }
                        if($params->cobro>=$sumaanticipos){
                            $updd1 = DB::table('con_cxcanticipo')
                                            ->where('id','=',$anticip->id)
                                            ->update(['monto_aplicado'=>$anticip->monto]);

                            if($updd1>0) {
                                $okupdatesanti = true;
                            }else{
                                $okupdatesanti = false;
                                DB::rollBack();   
                                return 'Problemas al actualizar el monto aplicado en el anticipo '.$anticip->id;
                            }
                        }else{
                            $rem = $sumaanticipos - $params->cobro;
                            $totanticiporem = $anticip->monto - $rem;
                            $updd1 = DB::table('con_cxcanticipo')
                                            ->where('id','=',$anticip->id)
                                            ->update(['monto_aplicado'=>$totanticiporem]);

                            $id_sat_formapago = $anticip->id_sat_formapago;
                            if($updd1>0) {
                                $okupdatesanti = true;
                            }else{
                                $okupdatesanti = false;
                                DB::rollBack();   
                                return 'Problemas al actualizar el monto aplicado en el anticipo '.$anticip->id;
                            }
                        }
                    }
                    if(!$okupdatesanti){
                        DB::rollBack();   
                        return 'Problemas al actualizar el monto aplicado en los anticipos';
                    }
                    if($params->anticipos>$params->cobro){
                        $totanticipos = $params->cobro;
                        $remanente = $params->anticipos - $params->cobro;                        
                        $peddd = DB::table('tpv_pedido')
                                        ->where('id', $params->id)
                                        ->first();
                        if(!isset($peddd->id_tpv_almacen)){
                            DB::rollBack();   
                            return 'No se obtuvo la informacion del almacen del pedido.';
                        }
                        //AQUI SE CREA UN NUEVO ANTICIPO
                        $request = $params;
                        $request->idAlmacen = $peddd->id_tpv_almacen;
                        $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 = $peddd->id_tpv_almacen;
                            $request->idcliente = $peddd->id_tpv_cliente;
                            $request->monto = $remanente;
                            $request->concepto = 'REMANENTE POR APLICACION DE ANTICIPO EN VENTA';
                            $request->formapago = $id_sat_formapago;
                            $ctacaja = $this->getCtaCaja($request->idAlmacen);
                            $request->cuenta = $ctacaja->cuentacaja;
                            $creaanticipo = $doctosClientes->generaAnticipo($request);
                            if($creaanticipo>0){
                                $updantitipo = DB::table('con_cxcanticipo')
                                                ->where('id','=',$creaanticipo)
                                                ->update(['tipo'=>3,'id_tpv_pedido_origen'=>$params->id]);

                                if($updantitipo>0) {
                                    $okanti = true;
                                }else{
                                    $okanti = false;
                                    DB::rollBack();   
                                    return 'Problemas al actualizar el tipo de anticipo al generar el remanente.';
                                }
                            }else{
                                $okanti = false;
                                DB::rollBack();   
                                return 'Problemas al generar el anticipo del saldo a favor.';
                            }
                        }else{
                            $okanti = false;
                            DB::rollBack();   
                            return 'Problemas al obtener el folio del Anticipo generado por remanente.';
                        }
                    }else{
                        $totanticipos = $params->anticipos;
                    }
                    if(!$okanti){
                        DB::rollBack();     
                        return 'Problemas al generar el nuevo anticipo por el remanente del aplicado. Contacte con el administrador del sistema.';
                    }
                    $r8 = DB::table('tpv_pedidoformapago')->insertGetId(
                        [
                            'id_tpv_pedido' => $params->id,
                            'id_sat_formapago' => '30',
                            'fecha' => date('Y-m-d'),
                            'hora' => date('H:i:s'),
                            'monto' => $totanticipos,
                            'id_sat_banco' => '',
                            'identificador' => '',
                            'status' => 1
                        ]
                    );
                    
                    if($r8>0)
                        $sinproblema = $sinproblema;
                    else
                        $sinproblema = false;
                }

                if(!$sinproblema){
                    DB::rollBack();
                }else{
                    if($params->idTipoDoc == 14) {
                        $update = DB::table('tpv_pedido')
                                ->where('id','=',$params->id)
                                ->update(['id_cat_tipodoc'=>14,'status'=>14,'cambio'=>$params->cambio,'efectivo'=>$params->efectivo,'fechaLiquidacion'=>date('Y-m-d')." ".date('H:i:s'),]);
                    } else {
                        $update = DB::table('tpv_pedido')
                                ->where('id','=',$params->id)
                                ->update(['id_cat_tipodoc'=>2,'status'=>2,'cambio'=>$params->cambio,'efectivo'=>$params->efectivo]);
                    }
                    if($update>0){
                        $result = DB::table('tpv_pedidodetalle')
                                    ->select(DB::raw('tpv_pedidodetalle.*, tpv_articuloalmacen.id_tpv_articulo, tpv_articuloalmacen.id_tpv_almacen,
                                                    tpv_pedido.serie, tpv_pedido.folio, tpv_pedido.id_cat_tipodoc, tpv_pedido.id_sys_usuario,
                                                    tpv_pedido.id_tpv_turno,tpv_articulo.isService as isService'))
                                    ->join('tpv_articuloalmacen', 'tpv_pedidodetalle.id_tpv_articuloalmacen', '=', 'tpv_articuloalmacen.id')
                                    ->join('tpv_articulo', 'tpv_articuloalmacen.id_tpv_articulo', '=', 'tpv_articulo.id')
                                    ->join('tpv_pedido', 'tpv_pedidodetalle.id_tpv_pedido', '=', 'tpv_pedido.id')
                                    ->where('id_tpv_pedido', $params->id)
                                    ->get();

                        if($result[0]->id_cat_tipodoc==2) { //SI ES UNA VENTA DE CONTADO; SE ACTUALIZA EL KARDEX
                            //dd($result);
                            foreach($result as $item) {
                                if($item->isService!=1){
                                    $updateKardex = DB::table('tpv_kardex')
                                                    ->where('nombretabla','=','tpv_pedidodetalle')
                                                    ->where('idregistro','=',$item->id)
                                                    ->update(['id_cat_tipodoc'=>2,'id_cat_acciones'=>2,'fecha'=>date("Y-m-d"),'hora'=>date("H:i:s")]);

                                    if($updateKardex==0) {
                                        DB::rollBack();
                                        return 'Detalle al actualizar el movimiento en el kardex';
                                    }
                                }else{
                                    $updateKardex = 1;
                                }
                            }
                            if($updateKardex>0) {
                                $sinproblema = $sinproblema;
                                DB::commit();
                            }
                        } else {
                            $sinproblema = $sinproblema;
                            DB::commit();
                        }
                    }else{
                        $sinproblema = false;
                        DB::rollBack();
                    }
                }
            }else{
                $sinproblema = false;
                DB::rollBack();
            }
        }
        
        return $sinproblema;
    }
    
    public function generarCFDI($cliente,$monto,$serie,$folio,$formapago,$lugarexpedicion){
        $facturacion = new Facturacion;
        $cxc = new CXC;
        //TIMBRAR EL anticipo
        $emisor = $cxc->getDatosEmpresa(1);
        $receptor = $cxc->getDatosCliente($cliente);        
        $usocfdi = $facturacion->getUsoCFDI($receptor->id_sat_usocfdi);
        $subtotal = round(($monto/1.16),2);
        $iva = round(($monto - $subtotal),2);
        $total = $monto;

        date_default_timezone_set('Etc/GMT+6');
        $emisornocertificado = $emisor->nocertificado;
        
        $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"=>$formapago,
                        "Sello"=>"@",
                        #"CondicionesDePago"=>$condicionesDePago,
                        "NoCertificado"=>$emisornocertificado,
                        "Certificado"=>"@",
                        "SubTotal"=>$subtotal,
                        "Total"=>$total,
                        "TipoDeComprobante"=>'I',
                        "MetodoPago"=>'PUE',
                        "LugarExpedicion"=>$lugarexpedicion,
                        "Moneda"=>'MXN'); 
    

        #************  DATOS DEL EMISOR ***********
        $arreglo['Emisor'] = array("Rfc"=>utf8_decode($emisor->rfc),
                                "Nombre"=>utf8_decode($emisor->razonsocial),
                                "RegimenFiscal"=>$emisor->regimenfiscal);
                                    
        if($receptor->rfc=='XAXX010101000'){
            $cpreceptor = $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{
            return true;
        }
    }

    public function aplicaCobroCredito($params){
        $usuario = $params->session()->get('idusuario');
        $turno = $params->session()->get('idturno'); 
        $lib = new Libreria;
        DB::beginTransaction();        
        $efectivo = $params->efectivo - $params->cambio;
        $formapagosel = '99';
        if($efectivo > 0) {
            $formapagosel = '01';
        }
        if($params->deposito > 0) {
            $formapagosel = '01';
        }
        if($params->td > 0) {
            $formapagosel = '28';
        }
        if($params->tc > 0) {
            $formapagosel = '04';
        }
        if($params->cheque > 0) {
            $formapagosel = '02';
        }
        if($params->transfer > 0) {
            $formapagosel = '03';
        }
        if($params->monedero > 0) {
            $formapagosel = '05';
        }


        $sinproblema = true;
        $update = DB::table('tpv_pedido')
                    ->where('id','=',$params->id)
                    ->update(['id_cat_tipodoc'=>2,'status'=>2,'cambio'=>0,'efectivo'=>0]);
        
        //Inserta los números de serie
        //ACTUALIZAMOS LOS ANTICIPOS USADOS
        $response_path = $_SERVER['DOCUMENT_ROOT'].'/naercriserp/seriesomar.txt';
		$xml_out_file = fopen($response_path, "w");
		fwrite($xml_out_file, $params->series);
		fclose($xml_out_file);
        
        $series = json_decode($params->series,true);
        //return $series;
        $b1 = -1;
        $n1 = 0;
        foreach($series as $serie){
            if(isset($serie['serie'])){
                $ns = DB::table('tpv_pedidodetalleserie')->insertGetId([
                    'id_tpv_pedidodetalle'=>$serie['idpedidodetalle'],
                    'numeroserie'=>strtoupper($serie['serie'])
                ]);
                if($ns>0){
                    $b1=$ns;
                }else{
                    $b1=0;
                    break;
                }
            }
            $n1++;
        }

        if($n1>0 && $b1==0){            
            $sinproblema = false;
            DB::rollBack();
            return $sinproblema;
        }

        if(count($series)==0)
            $b1 = 1;
        
        
        $anticipos = json_decode($params->detanticipos,true);
        $b2 = 0;
        foreach($anticipos as $anticip){
            if(isset($anticip['folio'])){
                $ns2 = DB::table('con_cxcanticipo')
                        ->where('id',$anticip['id'])
                        ->update([
                            'status'=>2,
                            'id_tpv_pedido'=>$params->id
                        ]);
                if($ns2>0){
                    $b2=$ns2;
                }else{
                    $b2=0;
                    break;
                }
            }
        }
        if(count($anticipos)==0)
                $b2=1;
        //return $params->id;
        if($b1>0 && $b2>0){
            if($update>0){
                //Obtenemos los datos del documento
                $doc = DB::table('tpv_pedido')
                        ->join('con_cxcformaspago','tpv_pedido.id_con_cxcformaspago','=','con_cxcformaspago.id')
                        ->join('con_cxccliente','tpv_pedido.id_tpv_cliente','=','con_cxccliente.id_tpv_cliente')
                        ->join('tpv_cliente','con_cxccliente.id_tpv_cliente','=','tpv_cliente.id')
                        ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                        ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                        ->join('cat_periodicidadpago','tpv_pedido.id_cat_periodicidadpago','=','cat_periodicidadpago.id')
                        ->select(DB::raw('tpv_pedido.*,
                                        con_cxccliente.id as idcxccliente,
                                        con_cxccliente.diaslimite as diaslimite,
                                        con_cxcformaspago.exhibiciones as exhibiciones,
                                        con_cxcformaspago.intereses as intereses,
                                        cat_periodicidadpago.dias as dias,
                                        cat_periodicidadpago.meses as meses,
                                        tpv_cliente.clave as clave,
                                        tpv_almacen.id_con_centrocosto as centrocosto,
                                        sys_persona.nombre as clientenombre'))
                        ->where('tpv_pedido.id',$params->id)
                        ->first();
                if(isset($doc->total)){
                    if($doc->meses>0){
                        $fec0 = date('d-m-Y',strtotime($doc->fecha));
                        $fecvencimiento = date('Y-m-d',strtotime($fec0.'+ '.($doc->meses*$doc->numpagos).' months'));
                        $plazo = $lib->dateDif($doc->fecha,$fecvencimiento);
                    }else{
                        $fec0 = date('d-m-Y',strtotime($doc->fecha));
                        $plazo = $doc->numpagos * $doc->dias;
                        $fecvencimiento = date('Y-m-d',strtotime($fec0.'+ '.$plazo.' days'));
                    }
                    $saldo = $doc->total - $doc->anticipo;
                    //Creamos el documento CXC
                    $insertcxc = DB::table('con_cxcdocto')->insertGetId([
                        'id_con_cxccliente'=>$doc->idcxccliente,
                        'id_tpv_pedido'=>$params->id,
                        'monto'=>$doc->total,
                        'saldo'=>$saldo,
                        'feccreado'=>$doc->fecha,
                        'fecvencimiento'=>$fecvencimiento,
                        'plazo'=>$plazo
                    ]);
                    if($insertcxc>0){
                        //GENERA EL DETALLE DEL CXCDOCTO QUE ES LA AMORTIZACION
                        $fecdoc = $doc->fecha;
                        $docint = $doc->intereses;
                        $pags = $doc->numpagos;
                        $montopago = $saldo/$pags;
                        $pagoint = $montopago - ($montopago/(1+($docint/100)));
                        $pagoiva = ($montopago-$pagoint) - (($montopago-$pagoint)/(1.16));
                        $pagocap = $montopago - $pagoint - $pagoiva;
                        $amort = array();
                        if($doc->anticipo>0){
                            $apagoint = $doc->anticipo - ($doc->anticipo/(1+($docint/100)));
                            $apagoiva = ($doc->anticipo-$pagoint) - (($doc->anticipo-$pagoint)/(1.16));
                            $apagocap = $doc->anticipo - $pagoint - $pagoiva;
                            $amort0 = DB::table('con_cxcamortizacion')->insertGetId([
                                'id_con_cxcdocto'=>$insertcxc,
                                'numpago' => 0,
                                'fecfija'=>$doc->fecha,
                                'fecpago'=>$doc->fecha,
                                'capital'=>$apagocap,
                                'iva'=>$apagoiva,
                                'intereses'=>$apagoint,
                                'pago'=>$doc->anticipo,
                                'abono'=>$doc->anticipo,
                                'saldo'=>0,
                                'status'=>2
                            ]);
                            if($amort0>0){
                                //OBTENEMOS EL FOLIO DEL RECIBO DE PAGO
                                $folio = DB::table('tpv_folio')
                                        ->where('id_sys_usuario','=',$usuario)
                                        ->where('id_tpv_almacen','=',$doc->id_tpv_almacen)
                                        ->where('id_cat_operacion','=',21)
                                        ->where('id_tpv_turno','=',$turno)
                                        ->where('status','=',1)
                                        ->first();
                                //dd(isset($folio));
                                if(isset($folio)){
                                    //INSERTAMOS EL PAGO TOTAL QUE SE ESTÁ HACIENDO
                                    $idPago = DB::table('con_cxcpago')->insertGetId([
                                        'folio'=>$folio->serie."-".$folio->folio,
                                        'id_tpv_almacen' => $doc->id_tpv_almacen,
                                        'id_sys_usuario' => $usuario,
                                        'id_tpv_turno' => $turno,
                                        'id_tpv_cliente' => $doc->id_tpv_cliente,
                                        'id_sat_formapago' => $formapagosel,
                                        'fecha' => $doc->fecha,
                                        'hora' => date('H:i:s'),
                                        'subtotal' => ($doc->anticipo - $apagoiva),
                                        'iva' => $apagoiva,
                                        'total' => $doc->anticipo,
                                        'uuid' => ''
                                    ]);
                                    if($idPago>0) {
                                        $pag = DB::table('con_cxcrecibo')->insertGetId([
                                            'id_con_cxcdocto'=>$amort0,
                                            'id_con_cxcpago' => $idPago,
                                            'id_con_cxcdocto_real'=>$insertcxc,
                                            'parcialidad'=>1,
                                            'isPago' => 1,
                                            'id_sat_formapago'=>$formapagosel,
                                            'fecha'=>$doc->fecha,
                                            'hora'=>date('H:i:s'),
                                            'id_tpv_vendedor'=>$doc->id_tpv_vendedor,
                                            'saldoanterior'=>$doc->total,
                                            'importepagado'=>$doc->anticipo,
                                            'saldoinsoluto'=>$saldo,
                                            'id_sys_usuario_cobro' => $usuario,
                                            'id_tpv_almacen_cobro' => $doc->id_tpv_almacen
                                        ]);
                                        if($pag>0) {
                                            $increment = DB::table('tpv_folio')
                                                            ->where('id_sys_usuario','=',$usuario)
                                                            ->where('id_tpv_almacen','=',$doc->id_tpv_almacen)
                                                            ->where('id_cat_operacion','=',21)
                                                            ->where('id_tpv_turno','=',$turno)
                                                            ->where('status','=',1)
                                                            ->increment('folio');
                                            if($increment>0){
                                                $noutil = 0;
                                            }else{
                                                DB::rollBack();
                                                return false;
                                            }
                                        } else {
                                            DB::rollBack();
                                            return false;
                                        }
                                    }else{
                                        $increment = DB::table('tpv_folio')
                                                        ->where('id_sys_usuario','=',$usuario)
                                                        ->where('id_tpv_almacen','=',$doc->id_tpv_almacen)
                                                        ->where('id_cat_operacion','=',21)
                                                        ->where('id_tpv_turno','=',$turno)
                                                        ->where('status','=',1)
                                                        ->increment('folio');
                                        if($increment>0){
                                            $noutil = 0;
                                        }else{
                                            DB::rollBack();
                                            return false;
                                        }
                                    }
                                } else {
                                    DB::rollBack();
                                    return 'No cuentas con folios de recibos de cobro para realizar el registro del pago del enganche del artículo. Comuniquese con el administrador del sistema.';
                                }
                            }else{
                                DB::rollBack();
                                return false;
                            }
                        }
                        for($p=1;$p<=$pags;$p++){
                            if($doc->meses>0){
                                //$fec0 = date('d-m-Y',strtotime($doc->fecha));
                                $fec1 = date('d-m-Y',strtotime($doc->fecha.'+ '.$doc->diaslimite.' days'));
                                $fecfija = date('Y-m-d',strtotime($fec1.'+ '.$p.' months'));
                                //$fecpago = date('Y-m-d',strtotime($fec0.'+ '.$p.' months'));
                            }else{
                                //$fec0 = date('d-m-Y',strtotime($doc->fecha));
                                $fec1 = date('d-m-Y',strtotime($doc->fecha.'+ '.$doc->diaslimite.' days'));
                                $fecfija = date('Y-m-d',strtotime($fec1.'+ '.($p*$doc->dias).' days'));
                            }
                            $amort[] = [
                                'id_con_cxcdocto'=>$insertcxc,
                                'numpago' => $p,
                                'fecfija'=>$fecfija,
                                'capital'=>$pagocap,
                                'iva'=>$pagoiva,
                                'intereses'=>$pagoint,
                                'pago'=>$montopago,
                                'abono'=>0,
                                'saldo'=>$montopago
                            ];
                        }
                        // DB::rollBack();
                        // return json_encode($amort);

                        $amortizacion = DB::table('con_cxcamortizacion')->insert($amort);
                        if($amortizacion>0){

                            $kard = DB::table('con_cxckardex')->insertGetId([
                                'id_con_cxcamortizacion'=>$insertcxc,
                                'fecha'=>$doc->fecha,
                                'hora'=>$doc->hora,
                                'id_cat_cxcmovimiento'=>1,
                                'id_sys_usuario'=>$usuario
                            ]);
                            if($insertcxc>0){
                                //Aplicar 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'=>2,
                                    'concepto'=>'VENTA A CREDITO NUM. '.$doc->serie.$doc->folio,
                                    'fecha'=>date('Y-m-d'),
                                    'hora'=>date('H:i:s'),
                                    'debe'=>$doc->total,
                                    'haber'=>$doc->total
                                ]);
                                if($conhead>0){
                                    $costotot = 0;
                                    $pedddet = DB::table('tpv_pedidodetalle')
                                                    ->where('id_tpv_pedido',$params->id)
                                                    ->get();
                                    foreach($pedddet as $pdd){
                                        $costotot+= $pdd->costo * $pdd->cantidad;
                                    }
                                    /*
                                    Inventario >
                                    Costo de Ventas <
                                    Clientes <
                                    IVA por trasladar <
                                    Ventas >
                                    */
                                    $ctacxc = '105 001 '.str_pad($doc->clave, 6, "0", STR_PAD_LEFT);
                                    $ctaant = '206 001 '.str_pad($doc->clave, 6, "0", STR_PAD_LEFT);
                                    $cctaband = 0;
                                    $cac = DB::table('con_cuentas')->where('numerocuenta',$ctacxc)->first();
                                    if(!isset($cac->numerocuenta)){
                                        $creacta = DB::table('con_cuentas')->insertGetId([
                                            'numerocuenta'=>$ctacxc,
                                            'descripcion'=>$doc->clientenombre,
                                            'codigoagrupador'=>'105.01',
                                            'id_sys_usuario'=>$usuario,
                                            'fecha'=>date('Y-m-d'),
                                            'hora'=>date('H:i:s'),
                                            'saldoinicial'=>0
                                        ]);
                                        if($creacta>0){
                                            $cctaband = $cctaband;
                                        }else{
                                            $cctaband++;
                                        }
                                    }
                                    $cac2 = DB::table('con_cuentas')->where('numerocuenta',$ctaant)->first();
                                    if(!isset($cac2->numerocuenta)){
                                        $creacta2 = DB::table('con_cuentas')->insertGetId([
                                            'numerocuenta'=>$ctaant,
                                            'descripcion'=>$doc->clientenombre,
                                            'codigoagrupador'=>'206.01',
                                            'id_sys_usuario'=>$usuario,
                                            'fecha'=>date('Y-m-d'),
                                            'hora'=>date('H:i:s'),
                                            'saldoinicial'=>0
                                        ]);
                                        if($creacta2>0){
                                            $cctaband = $cctaband;
                                        }else{
                                            $cctaband++;
                                        }
                                    }
                                    if($cctaband>0){
                                        DB::rollBack();
                                        return false;
                                    }
                                    //Obtenemos la cuenta contable de almacen
                                    $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',$doc->id_tpv_almacen)
                                                ->first();
                                    if(isset($almcc->id)){
                                        // Abono a Inventarios por el total de la venta antes iva
                                        $movs = array();
                                        
                                        $ivatrasant = $doc->anticipo- ($doc->anticipo/1.16);
                                        $subcli = $doc->total - $ivatrasant;

                                        $totcli = $doc->total;
                                        if($params->anticipos>0)
                                            $totcli = $doc->total - $params->anticipos;
                                        // Cargo a Clientes
                                        $movs[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>$ctacxc,
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>$totcli,
                                            'haber'=>0
                                        ];
                                        // Abono a Ventas
                                        $movs[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>$almcc->cuentaventacredito,
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>0,
                                            'haber'=>$doc->subtotal
                                        ];
                                        // Abono a iva pendiente por trasladar
                                        $movs[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>'209 001 000001',
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>0,
                                            'haber'=>$doc->iva
                                        ];
                                        
                                        //Abono a Inventario
                                        $movs[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>$almcc->cuentainventario,
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>0,
                                            'haber'=>$costotot
                                        ];
                                        // Cargo a Costo de ventas (Antes iva)
                                        $movs[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>$almcc->cuentacostos,
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>$costotot,
                                            'haber'=>0
                                        ];

                                        
                                        // Cargo a Cuenta Concentradora SI HUBO ENGANCHE EFECTIVAMENTE PAGADO
                                        $totsinanti = $doc->anticipo - $params->anticipos;
                                        if($totsinanti>0){
                                            $ivatotsinanti = $totsinanti - ($totsinanti/1.16);
                                            //Cargo a Caja
                                            $movs[] = [
                                                'id_con_asiento'=>$conhead,
                                                'cuenta'=>$almcc->cuentacaja,
                                                'id_con_centrocosto'=>$almcc->id,
                                                'debe'=>$totsinanti,
                                                'haber'=>0
                                            ];
                                            // Abono a Clientes
                                            $movs[] = [
                                                'id_con_asiento'=>$conhead,
                                                'cuenta'=>$ctacxc,
                                                'id_con_centrocosto'=>$almcc->id,
                                                'debe'=>0,
                                                'haber'=>$doc->anticipo
                                            ];
                                            
                                            // Abono a iva pendiente por trasladar
                                            $movs[] = [
                                                'id_con_asiento'=>$conhead,
                                                'cuenta'=>'209 001 000001',
                                                'id_con_centrocosto'=>$almcc->id,
                                                'debe'=>$ivatotsinanti,
                                                'haber'=>0
                                            ];
                                            // Abono a iva trasladado
                                            $movs[] = [
                                                'id_con_asiento'=>$conhead,
                                                'cuenta'=>'208 001 000001',
                                                'id_con_centrocosto'=>$almcc->id,
                                                'debe'=>0,
                                                'haber'=>$ivatotsinanti
                                            ];
                                        }
                                        
                                        //Cargo a Anticipo Clientes en caso de haber usado un anticipo
                                        if($params->anticipos>0){
                                            $movs[] = [
                                                'id_con_asiento'=>$conhead,
                                                'cuenta'=>$ctaant,
                                                'id_con_centrocosto'=>$almcc->id,
                                                'debe'=>$params->anticipos,
                                                'haber'=>0
                                            ];
                                        }

                                        $condet = DB::table('con_asientodetalle')->insert($movs);
                                        if($condet>0){
                                            $updant = DB::table('con_cxcanticipo')
                                                        ->where('id_tpv_pedido', $params->id)
                                                        ->update([
                                                            'status'=>2
                                                        ]);

                                            $result = DB::table('tpv_pedidodetalle')
                                                        ->select(DB::raw('tpv_pedidodetalle.*, tpv_articuloalmacen.id_tpv_articulo, tpv_articuloalmacen.id_tpv_almacen,
                                                                        tpv_pedido.serie, tpv_pedido.folio, tpv_pedido.id_cat_tipodoc, tpv_pedido.id_sys_usuario,
                                                                        tpv_pedido.id_tpv_turno,tpv_articulo.isService as isService'))
                                                        ->join('tpv_articuloalmacen', 'tpv_pedidodetalle.id_tpv_articuloalmacen', '=', 'tpv_articuloalmacen.id')
                                                        ->join('tpv_articulo', 'tpv_articuloalmacen.id_tpv_articulo', '=', 'tpv_articulo.id')
                                                        ->join('tpv_pedido', 'tpv_pedidodetalle.id_tpv_pedido', '=', 'tpv_pedido.id')
                                                        ->where('id_tpv_pedido', $params->id)
                                                        ->get();
                                                        
                                            foreach($result as $item) { //SE ACTUALIZA EL KARDEX DE UNA VENTA A CREDITO
                                                if($item->isService!=1){
                                                    $updateKardex = DB::table('tpv_kardex')
                                                                    ->where('nombretabla','=','tpv_pedidodetalle')
                                                                    ->where('idregistro','=',$item->id)
                                                                    ->update(['id_cat_tipodoc'=>2,'id_cat_acciones'=>2,'fecha'=>date("Y-m-d"),'hora'=>date("H:i:s")]);
                    
                                                    if($updateKardex==0) {
                                                        DB::rollBack();
                                                        return 'Detalle al actualizar el movimiento en el kardex';
                                                    }
                                                }else{
                                                    $updateKardex = 1;
                                                }
                                            }
                                            if($updateKardex>0) {
                                                $sinproblema = $sinproblema;
                                                DB::commit();
                                            }
                                        }else{
                                            DB::rollBack();
                                            $sinproblema = false;
                                        }
                                    }else{
                                        DB::rollBack();
                                        $sinproblema = false;
                                    }
                                }else{
                                    DB::rollBack();
                                    $sinproblema = false;
                                }
                            }else{
                                $sinproblema = false;
                                DB::rollBack();
                            }
                        }else{
                            $sinproblema = false;
                            DB::rollBack();
                        }
                    }else{
                        $sinproblema = false;
                        DB::rollBack();
                    }
                }else{
                    $sinproblema = false;
                    DB::rollBack();
                }        
            }else{
                $sinproblema = false;
                DB::rollBack();
            }
        }else{
            $sinproblema = false;
            DB::rollBack();
        }
        return $sinproblema;
    }
    
    public function getRemisiones($fecha,$almacenes,$dbnomina){
        $result = DB::table('tpv_pedido')
                    ->select(DB::raw("tpv_pedido.id as id,
                                 cat_tipodoc.descripcion as documento,
                                 tpv_pedido.status as status,
                                 tpv_pedido.serie as serie,
                                 tpv_pedido.folio as folio,
                                 tpv_pedido.fecha as fecha,
                                 tpv_pedido.hora as hora,
                                 tpv_pedido.subtotal as subtotal,
                                 tpv_pedido.descuento as descuento,
                                 tpv_pedido.iva as iva,
                                 tpv_pedido.ish as ish,
                                 tpv_pedido.total as total,
                                 tpv_pedido.anticipo as anticipo,
                                 tpv_pedido.isAnticipo as isAnticipo,
                                 tpv_pedido.isLiquidacion as isLiquidacion,
                                 tpv_pedido.fechaLiquidacion as fechaLiquidacion,
                                 tpv_pedido.id_sat_metodopago as metodopago,
                                 tpv_pedido.id_con_cxcformaspago as modalidadpago,
                                 tpv_pedido.observaciones as observaciones,
                                 pusuarios.idempleado as id_tpv_usuario,
                                 pusuarios.username as usuario,
                                 tpv_pedido.id_tpv_cliente as id_tpv_cliente,
                                 tpv_cliente.id_sys_persona as id_sys_persona,
                                 sys_persona.nombre as cliente,
                                 tpv_almacen.id as id_tpv_almacen,
                                 tpv_almacen.descripcion as almacen,
                                 tpv_turno.id as id_tpv_turno,
                                 tpv_turno.descripcion as turno,
                                 tpv_pedido.id_tpv_vendedor as id_tpv_vendedor,
                                 pempleado.nombre as vendedor,
                                 tpv_articuloalmacen.id as idarticuloalmacen,
                                 tpv_articulo.id as idarticulo,
                                 tpv_articulo.codigo as codigo,
                                 tpv_articulo.codigoproveedor as codigoproveedor,
                                 tpv_pedidodetalle.descripcion as descripcioncorta,
                                 tpv_articulo.imagen as imagen,
                                 tpv_pedidodetalle.precio as precio,
                                 SUM(tpv_pedidodetalleimpuesto.monto) as impuesto,
                                 tpv_pedidodetalle.id as idpedidodetalle,
                                 tpv_pedidodetalle.id_tpv_articuloprecio as idprecio,
                                 SUM(tpv_pedidodetalle.cantidad) as cantidad,
                                 tpv_articuloapartado.cantidadsolicitada as cantidadsolicitada,
                                 tpv_articuloapartado.cantidadsolicitada as cantidadasignada,
                                 SUM(tpv_pedidodetalle.total) as detalletotal,
                                 SUM(tpv_pedidodetalle.descuento) as detalledescuento,
                                 IFNULL(tpv_factura.serie,'') as seriefactura,
                                 IFNULL(tpv_factura.folio,'') as foliofactura"))
                    ->join('cat_tipodoc','tpv_pedido.id_cat_tipodoc','=','cat_tipodoc.id')
                    ->join($dbnomina.'.pusuarios','tpv_pedido.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->leftJoin('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('tpv_turno','tpv_pedido.id_tpv_turno','=','tpv_turno.id')
                    ->join('tpv_vendedorcomisiones','tpv_pedido.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pempleado','tpv_vendedorcomisiones.id_tpv_vendedor','=','pempleado.nip')
                    ->join('tpv_pedidodetalle','tpv_pedido.id','=','tpv_pedidodetalle.id_tpv_pedido')
                    ->leftJoin('tpv_articuloapartado','tpv_pedidodetalle.id','=','tpv_articuloapartado.id_tpv_pedidodetalle')
                    ->join('tpv_articuloalmacen','tpv_pedidodetalle.id_tpv_articuloalmacen','=','tpv_articuloalmacen.id')
                    ->join('tpv_articulo','tpv_articuloalmacen.id_tpv_articulo','=','tpv_articulo.id')
                    ->join('tpv_pedidodetalleimpuesto','tpv_pedidodetalle.id','=','tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle')
                    ->leftJoin('tpv_factura', function($join){
                        $join->on('tpv_pedido.id', '=', 'tpv_factura.id_tpv_pedido');
                        $join->on('tpv_factura.status', '=',DB::raw('1'));
                    })
                    ->whereIn('tpv_pedido.id_tpv_almacen',$almacenes)
                    ->where(function($q) use($fecha){
                        $q->where('tpv_pedido.fecha','=',$fecha)
                        ->orWhere('tpv_pedido.fechaLiquidacion','=',$fecha);
                    })
                    ->whereIn('tpv_pedido.status',[1,2,3,13,14,99])
                    ->groupBy('tpv_articulo.id')
                    ->groupBy('tpv_pedido.id')
                    ->orderBy('tpv_pedido.id','desc'); 

        $resultAnticipo = DB::table('tpv_pedido')
                    ->select(DB::raw("tpv_pedido.id as id,
                                 cat_tipodoc.descripcion as documento,
                                 tpv_pedido.status as status,
                                 tpv_pedido.serie as serie,
                                 tpv_pedido.folio as folio,
                                 tpv_pedido.fecha as fecha,
                                 tpv_pedido.hora as hora,
                                 tpv_pedido.subtotal as subtotal,
                                 tpv_pedido.descuento as descuento,
                                 tpv_pedido.iva as iva,
                                 tpv_pedido.ish as ish,
                                 tpv_pedido.total as total,
                                 tpv_pedido.anticipo as anticipo,
                                 tpv_pedido.isAnticipo as isAnticipo,
                                 tpv_pedido.isLiquidacion as isLiquidacion,
                                 tpv_pedido.fechaLiquidacion as fechaLiquidacion,
                                 tpv_pedido.id_sat_metodopago as metodopago,
                                 tpv_pedido.id_con_cxcformaspago as modalidadpago,
                                 tpv_pedido.observaciones as observaciones,
                                 pusuarios.idempleado as id_tpv_usuario,
                                 pusuarios.username as usuario,
                                 tpv_pedido.id_tpv_cliente as id_tpv_cliente,
                                 tpv_cliente.id_sys_persona as id_sys_persona,
                                 sys_persona.nombre as cliente,
                                 tpv_almacen.id as id_tpv_almacen,
                                 tpv_almacen.descripcion as almacen,
                                 tpv_turno.id as id_tpv_turno,
                                 tpv_turno.descripcion as turno,
                                 tpv_pedido.id_tpv_vendedor as id_tpv_vendedor,
                                 pempleado.nombre as vendedor,
                                 tpv_articuloapartado.id_tpv_articuloalmacen as idarticuloalmacenapartado,
                                 NULL as idarticuloapartado,
                                 tpv_articuloapartado.codigo as codigo,
                                 tpv_articuloapartado.codigo as codigoproveedor,
                                 tpv_articuloapartado.descripcion as descripcioncorta,
                                 tpv_articuloapartado.codigo as imagen,
                                 tpv_pedidodetalle.precio as precio,
                                 tpv_articuloapartado.precio-(tpv_articuloapartado.precio/1.16) as impuesto,
                                 tpv_pedidodetalle.id as idpedidodetalle,
                                 tpv_pedidodetalle.id_tpv_articuloprecio as idprecio,
                                 tpv_pedidodetalle.cantidad as cantidad,
                                 tpv_articuloapartado.cantidadsolicitada as cantidadsolicitada,
                                 tpv_articuloapartado.cantidadsolicitada as cantidadasignada,
                                 SUM(tpv_pedidodetalle.total) as detalletotal,
                                 SUM(tpv_pedidodetalle.descuento) as detalledescuento,
                                 IFNULL(tpv_factura.serie,'') as seriefactura,
                                 IFNULL(tpv_factura.folio,'') as foliofactura"))
                    ->join('cat_tipodoc','tpv_pedido.id_cat_tipodoc','=','cat_tipodoc.id')
                    ->join($dbnomina.'.pusuarios','tpv_pedido.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('tpv_turno','tpv_pedido.id_tpv_turno','=','tpv_turno.id')
                    ->join('tpv_vendedorcomisiones','tpv_pedido.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pempleado','tpv_vendedorcomisiones.id_tpv_vendedor','=','pempleado.nip')
                    ->join('tpv_pedidodetalle','tpv_pedido.id','=','tpv_pedidodetalle.id_tpv_pedido')
                    ->join('tpv_articuloapartado','tpv_pedidodetalle.id','=','tpv_articuloapartado.id_tpv_pedidodetalle')
                    //->join('tpv_articuloalmacen','tpv_pedidodetalle.id_tpv_articuloalmacen','=','tpv_articuloalmacen.id')
                    //->join('tpv_articulo','tpv_articuloalmacen.id_tpv_articulo','=','tpv_articulo.id')
                    //->join('tpv_pedidodetalleimpuesto','tpv_pedidodetalle.id','=','tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle')
                    //->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');
                        $join->on('tpv_factura.status', '=',DB::raw('1'));
                    })
                    ->whereIn('tpv_pedido.id_tpv_almacen',$almacenes)
                    ->where('tpv_articuloapartado.id_tpv_articuloalmacen','=',null)
                    ->where('tpv_pedido.fecha','=',$fecha)
                    ->whereIn('tpv_pedido.status',[1,2,3,13,14,99])
                    ->groupBy('tpv_articuloapartado.id')
                    ->groupBy('tpv_pedido.id')
                    ->orderBy('tpv_pedido.id','desc'); 
        
        $unionResult = $result->union($resultAnticipo)->get();               
        return $unionResult;
    }

    public function getMesesSinIntereses() {
        $result = DB::table('sat_mesessinintereses')
                    ->where('status', 1)
                    ->get();
        if(count($result)>0) 
            return $result;
        else 
            return 0;
    }

    public function getBancos() {
        $result = DB::table('sat_banco')
                    ->where('status', 1)
                    ->orderBy('descripcion', 'asc')
                    ->get();
        if(count($result)>0) 
            return $result;
        else 
            return 0;
    }

    public function getCompañia() {
        $result = DB::table('sys_empresa')
                    ->where('status', 1)
                    ->get();
        if(count($result)>0) 
            return $result;
        else 
            return 0;
    }

    public function datosEmisor($idpedido) {
        $result = DB::table('sys_empresa')
                    ->select(DB::raw('sys_empresa.*,sat_regimenfiscal.clave as id_sat_regimenfiscal'))
                    ->join('sat_regimenfiscal','sys_empresa.id_sat_regimenfiscal','=','sat_regimenfiscal.id')
                    ->where('sys_empresa.id',1)
                    ->first();
        return $result;
    }  

    public function aperturaTurno($usuario,$turno,$almacen) {
        $result = DB::table('tpv_caja')
                    ->where('id_cat_cajamovimiento',1)
                    ->where('id_cat_tipodoc',5)
                    ->where('id_tpv_turno',$turno)
                    ->where('id_sys_usuario',$usuario)
                    ->where('id_tpv_almacen',$almacen)
                    ->orderBy('fecha','DESC')
                    ->orderBy('hora','DESC')
                    ->first();
        return $result;
    }   

    public function cierreTurno($usuario,$turno,$almacen) {
        $result = DB::table('tpv_caja')
                    ->where('id_cat_cajamovimiento',4)
                    ->where('id_cat_tipodoc',5)
                    ->where('id_tpv_turno',$turno)
                    ->where('id_sys_usuario',$usuario)
                    ->where('id_tpv_almacen',$almacen)
                    ->where('status',1)
                    ->first();
        return $result;
    }   

    public function getSerieFolio($usuario,$turno,$almacen) {
        $result = DB::table('tpv_folio')
                    ->where('id_sys_usuario',$usuario)
                    ->where('id_tpv_turno',$turno)      
                    ->where('id_tpv_almacen', $almacen)              
                    ->where('id_cat_operacion',3)
                    ->where('status','=',1)
                    ->first();
        return $result;
    }   

    public function getPago($idpedido) {
        $result = DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido',$idpedido)
                    ->orderBy('monto','desc')
                    ->first();
        return $result;
    } 

    public function getInfoPago($idpedido) {
        $result = DB::table('tpv_pedido')
                    ->select(DB::raw(
                        'tpv_pedido.*,
                        tpv_pedido.numpagos as pagos,
                        cat_periodicidadpago.dias as dias,
                        cat_periodicidadpago.descripcion as tipopago'))
                    ->join('con_cxcformaspago','tpv_pedido.id_con_cxcformaspago','=','con_cxcformaspago.id')
                    ->join('cat_periodicidadpago','tpv_pedido.id_cat_periodicidadpago','=','cat_periodicidadpago.id')
                    ->where('tpv_pedido.id',$idpedido)
                    ->first();
        return $result;
    }         

    public function getUsoCFDI($id) {
        $result = DB::table('sat_usocfdi')
                    ->where('id',$id)
                    ->first();
        return $result;
    }        

    public function getFormaPago() {
        $result = DB::table('sat_formapago')
                    ->get();
        return $result;
    }    

    public function getFormasPagoUsuario($usuario) {
        $result = DB::table('tpv_usuarioformapago')
                    ->select(DB::raw("sat_formapago.*"))
                    ->join("sat_formapago", "tpv_usuarioformapago.id_sat_formapago", "=", "sat_formapago.id")
                    ->where('tpv_usuarioformapago.id_sys_usuario', $usuario)
                    ->where('tpv_usuarioformapago.status', 1)
                    ->where('sat_formapago.status', 1)
                    ->get();

        return $result;
    }  

    public function getRegimenFiscal($id) {
        $result = DB::table('sat_regimenfiscal')
                    ->where('id',$id)
                    ->first();
        return $result;
    }   

    public function getImpuestosDetalle($id) {
        $result = DB::table('tpv_pedidodetalleimpuesto')
                    ->select(DB::raw("tpv_pedidodetalleimpuesto.monto as importe,cat_impuesto.idsat as impuesto, cat_impuesto.tasa as tasa, cat_impuesto.tipofactor as factor,cat_impuestotipo.descripcion as tipo"))
                    ->join('cat_impuesto','tpv_pedidodetalleimpuesto.id_cat_impuesto','=','cat_impuesto.id')
                    ->join('cat_impuestotipo','cat_impuesto.id_cat_impuestotipo','=','cat_impuestotipo.id')
                    ->where('tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle',$id)
                    ->get();
        return $result;
    }  
    
    public function getRemision($idpedido, $dbnomina){
        $result = DB::table('tpv_pedido')
                    ->select(
                        DB::raw("tpv_pedido.id as id,
                                 tpv_pedido.status as status,
                                 tpv_pedido.serie as serie,
                                 tpv_pedido.folio as folio,
                                 tpv_pedido.fecha as fecha,
                                 tpv_pedido.hora as hora,
                                 tpv_pedido.subtotal as subtotal,
                                 tpv_pedido.descuento as descuento,
                                 tpv_pedido.iva as iva,
                                 tpv_pedido.total as total,
                                 tpv_pedido.id_sat_metodopago as metodopago,
                                 tpv_pedido.observaciones as observaciones,
                                 pusuarios.idempleado as id_tpv_usuario,
                                 pusuarios.username as usuario,
                                 tpv_pedido.id_tpv_cliente as id_tpv_cliente,
                                 tpv_cliente.id_sys_persona as id_sys_persona,
                                 sys_persona.nombre as cliente,
                                 tpv_almacen.id as id_tpv_almacen,
                                 tpv_almacen.descripcion as almacen,
                                 sys_direccion.cp as lugarexpedicion,
                                 tpv_turno.id as id_tpv_turno,
                                 tpv_turno.descripcion as turno,
                                 tpv_pedido.id_tpv_vendedor as id_tpv_vendedor,
                                 (SELECT pu.nombre FROM ".$dbnomina.".pusuarios pu WHERE pu.idempleado=tpv_pedido.id_tpv_vendedor) as vendedor,
                                 tpv_articuloalmacen.id as idarticuloalmacen,
                                 tpv_articulo.id as idarticulo,
                                 tpv_articulo.codigo as codigo,
                                 tpv_articulo.codigosat as codigosat,
                                 sat_unidadmedida.clave as claveunidad,
                                 tpv_articulo.codigoproveedor as codigoproveedor,
                                 tpv_articulo.descripcioncorta as descripcioncorta,
                                 tpv_articulo.imagen as imagen,
                                 tpv_pedidodetalle.precio as precio,
                                 SUM(tpv_pedidodetalleimpuesto.monto) as impuesto,
                                 tpv_pedidodetalle.id as idpedidodetalle,
                                 tpv_pedidodetalle.id_tpv_articuloprecio as idprecio,
                                 SUM(tpv_pedidodetalle.cantidad) as cantidad,
                                 SUM(tpv_pedidodetalle.total) as detalletotal,
                                 SUM(tpv_pedidodetalle.descuento) as detalledescuento"))
                    ->join('tpv_pedidodetalle','tpv_pedido.id','=','tpv_pedidodetalle.id_tpv_pedido')
                    ->join('tpv_articuloalmacen','tpv_pedidodetalle.id_tpv_articuloalmacen','=','tpv_articuloalmacen.id')
                    ->join('tpv_articulo','tpv_articuloalmacen.id_tpv_articulo','=','tpv_articulo.id')
                    ->join('sat_unidadmedida','tpv_articulo.id_sat_unidadmedida','=','sat_unidadmedida.id')
                    ->join('tpv_pedidodetalleimpuesto','tpv_pedidodetalle.id','=','tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle')
                    ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                    ->leftJoin('sys_direccion','tpv_almacen.id_sys_direccion','=','sys_direccion.id')
                    ->join($dbnomina.'.pusuarios','tpv_pedido.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_turno','tpv_pedido.id_tpv_turno','=','tpv_turno.id')
                    ->where('tpv_pedido.id','=',$idpedido)
                    ->groupBy('tpv_articulo.id')
                    ->groupBy('tpv_pedido.id')
                    ->orderBy('tpv_pedido.id','desc')
                    ->get();
                    
        return $result;
    }    
    
    public function getCabeceraFactura($idpedido, $dbnomina){
        $result = DB::table('tpv_pedido')
                    ->select(
                        DB::raw("tpv_pedido.id as id,
                                 tpv_pedido.status as status,
                                 tpv_pedido.serie as serie,
                                 tpv_pedido.folio as folio,
                                 tpv_pedido.fecha as fecha,
                                 tpv_pedido.hora as hora,
                                 tpv_pedido.subtotal as subtotal,
                                 tpv_pedido.descuento as descuento,
                                 tpv_pedido.iva as iva,
                                 tpv_pedido.total as total,
                                 tpv_pedido.id_sat_metodopago as metodopago,
                                 tpv_pedido.observaciones as observaciones,
                                 pusuarios.idempleado as id_tpv_usuario,
                                 pusuarios.username as usuario,
                                 tpv_pedido.id_tpv_cliente as id_tpv_cliente,
                                 tpv_cliente.id_sys_persona as id_sys_persona,
                                 sys_persona.nombre as cliente,
                                 tpv_almacen.id as id_tpv_almacen,
                                 tpv_almacen.descripcion as almacen,
                                 sys_direccion.cp as lugarexpedicion,
                                 tpv_turno.id as id_tpv_turno,
                                 tpv_turno.descripcion as turno,
                                 tpv_pedido.id_tpv_vendedor as id_tpv_vendedor,
                                 (SELECT pu.nombre FROM ".$dbnomina.".pusuarios pu WHERE pu.idempleado=tpv_pedido.id_tpv_vendedor) as vendedor"))
                    ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                    ->leftJoin('sys_direccion','tpv_almacen.id_sys_direccion','=','sys_direccion.id')
                    ->join($dbnomina.'.pusuarios','tpv_pedido.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_turno','tpv_pedido.id_tpv_turno','=','tpv_turno.id')
                    ->where('tpv_pedido.id','=',$idpedido)
                    ->orderBy('tpv_pedido.id','desc')
                    ->first();
                    
        return $result;
    }   
    
    public function getDetalleFactura($idpedido){
        $result = DB::table('tpv_pedidodetalle')
                    ->select(
                        DB::raw("tpv_articuloalmacen.id as idarticuloalmacen,
                                 tpv_articulo.id as idarticulo,
                                 tpv_articulo.codigo as codigo,
                                 tpv_articulo.codigosat as codigosat,
                                 sat_unidadmedida.clave as claveunidad,
                                 tpv_articulo.codigoproveedor as codigoproveedor,
                                 tpv_pedidodetalle.descripcion as descripcioncorta,
                                 tpv_articulo.imagen as imagen,
                                 tpv_pedidodetalle.precio as precio,
                                 SUM(tpv_pedidodetalleimpuesto.monto) as impuesto,
                                 tpv_pedidodetalle.id as idpedidodetalle,
                                 tpv_pedidodetalle.id_tpv_articuloprecio as idprecio,
                                 SUM(tpv_pedidodetalle.cantidad) as cantidad,
                                 SUM(tpv_pedidodetalle.subtotal) as detallesubtotal,
                                 SUM(tpv_pedidodetalle.total) as detalletotal,
                                 SUM(tpv_pedidodetalle.descuento) as detalledescuento,
                                 cat_impuesto.impuesto as impuestosat,
                                 cat_impuesto.tasa as tasa"))
                    ->join('tpv_articuloalmacen','tpv_pedidodetalle.id_tpv_articuloalmacen','=','tpv_articuloalmacen.id')
                    ->join('tpv_articulo','tpv_articuloalmacen.id_tpv_articulo','=','tpv_articulo.id')
                    ->join('sat_unidadmedida','tpv_articulo.id_sat_unidadmedida','=','sat_unidadmedida.id')
                    ->join('tpv_pedidodetalleimpuesto','tpv_pedidodetalle.id','=','tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle')
                    ->join('cat_impuesto','tpv_pedidodetalleimpuesto.id_cat_impuesto','=','cat_impuesto.id')
                    ->where('tpv_pedidodetalle.id_tpv_pedido','=',$idpedido)
                    ->groupBy('tpv_articulo.id')
                    ->groupBy('tpv_pedidodetalle.id_tpv_pedido')
                    ->get();
                    
        return $result;
    }        
    
    public function getDetalleImpuestoFactura($iddetalle){
        $result = DB::table('tpv_pedidodetalleimpuesto')
                    ->select(
                        DB::raw("tpv_pedidodetalleimpuesto.*,
                                 cat_impuesto.impuesto as impuesto,
                                 cat_impuesto.tipofactor as factor,
                                 cat_impuesto.tasa as tasa,
                                 cat_impuesto.tipofactor as codigosat,
                                 cat_impuestotipo.descripcion as tipo"))
                    ->join('cat_impuesto','tpv_pedidodetalleimpuesto.id_cat_impuesto','=','cat_impuesto.id')
                    ->join('cat_impuestotipo','cat_impuesto.id_cat_impuestotipo','=','cat_impuestotipo.id')
                    ->where('tpv_pedidodetalleimpuesto.id_tpv_pedidodetalle','=',$iddetalle)
                    ->get();
                    
        return $result;
    }   

    public function getNumeroSerie($id){
        $result = DB::table('tpv_pedidodetalleserie')
                    ->where('id_tpv_pedidodetalle','=',$id)
                    ->get();
        return $result;
    }
    
    public function ticketCabecera($id,$tipodoc){
        $result = DB::table('sys_empresa')
                    ->select(
                        DB::raw("sys_empresa.*, sys_direccion.calle AS ledireccion, sys_direccion.cp AS lecp, sys_direccion.numexterior AS lenumExterior, sys_direccion.colonia AS lecolonia, cat_pais.descripcion AS lepais, cat_estado.descripcion AS leestado, cat_municipio.descripcion AS lemunicipio, tpv_almacen.logotipo as logo, tpv_almacen.telefono as letelefono, tpv_almacen.descripcion as sucursal"))
                    ->join('tpv_almacen','sys_empresa.id','=','tpv_almacen.id_sys_empresa')
                    ->join('tpv_caja','tpv_caja.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('sys_direccion','sys_direccion.id','=','tpv_almacen.id_sys_direccion')
                    ->join('cat_pais','cat_pais.clave','=','sys_direccion.pais')
                    ->join('cat_estado','cat_estado.id','=','sys_direccion.estado')
                    ->join('cat_municipio','cat_municipio.id','=','sys_direccion.municipio')
                    ->where('tpv_caja.id','=',$id)
                    ->get();

        /*$result = DB::table('sys_empresa')
                    ->select(
                        DB::raw("sys_empresa.*,tpv_almacen.logotipo as logo,tpv_almacen.direccion as ledireccion,tpv_almacen.cp as lecp,tpv_almacen.telefono as letelefono,tpv_almacen.descripcion as sucursal"))
                    ->join('tpv_almacen','sys_empresa.id','=','tpv_almacen.id_sys_empresa')
                    ->join('tpv_caja','tpv_caja.id_tpv_almacen','=','tpv_almacen.id')
                    ->where('tpv_caja.id','=',$id)
                    ->get();*/
                    
        return $result;
    }   
    
    public function ticketTexto($id,$tipodoc){
        $result = DB::table('tpv_notaimpresion')
                    ->select(
                        DB::raw("tpv_notaimpresion.*,cat_tipodoc.descripcion as tipodoc"))
                    ->join('tpv_almacen','tpv_notaimpresion.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('tpv_caja','tpv_almacen.id','=','tpv_caja.id_tpv_almacen')
                    ->join('cat_tipodoc','tpv_notaimpresion.id_cat_tipodoc','=','cat_tipodoc.id')
                    ->where('tpv_caja.id','=',$id)
                    ->where('tpv_notaimpresion.id_cat_tipodoc','=',$tipodoc)
                    ->where('tpv_notaimpresion.status','=',1)
                    ->get();
                    
        return $result;
    }

    public function ticketMovimiento($id,$dbnomina){
        /*$result = DB::table('tpv_caja')
                    ->select(
                        DB::raw("tpv_caja.*,
                                 tpv_turno.id as idturno,
                                 tpv_turno.descripcion as turno,
                                 sys_usuario.username as usuariocaja,
                                 cat_cajamovimiento.descripcion as movimiento"))
                    ->join('tpv_turno','tpv_caja.id_tpv_turno','=','tpv_turno.id')
                    ->join('sys_usuario','tpv_caja.id_sys_usuario','=','sys_usuario.id')
                    ->join('cat_cajamovimiento','tpv_caja.id_cat_cajamovimiento','=','cat_cajamovimiento.id')
                    ->where('tpv_caja.id','=',$id)
                    ->get();*/
        $result = DB::table('tpv_caja')
                    ->select(DB::raw("tpv_caja.*,
                                 tpv_turno.id as idturno,
                                 tpv_turno.descripcion as turno,
                                 pusuarios.username as usuariocaja,
                                 cat_cajamovimiento.descripcion as movimiento"))
                    ->join('tpv_turno','tpv_caja.id_tpv_turno','=','tpv_turno.id')
                    ->join($dbnomina.'.pusuarios','tpv_caja.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('cat_cajamovimiento','tpv_caja.id_cat_cajamovimiento','=','cat_cajamovimiento.id')
                    ->where('tpv_caja.id','=',$id)
                    ->get();

                    
                    
        return $result;
    }
     
    public function corteCabecera($turno,$usuario,$sucursal,$fecha){
        //dd($turno,$usuario,$sucursal,$fecha);
        //dd($sucursal);
        $result = DB::table('sys_empresa')
                    ->select(DB::raw("sys_empresa.*,tpv_almacen.logotipo as logo, sys_direccion.calle AS ledireccion, sys_direccion.cp AS lecp, sys_direccion.numexterior AS lenumExterior, sys_direccion.colonia AS lecolonia, cat_pais.descripcion AS lepais, cat_estado.descripcion AS leestado, cat_municipio.descripcion AS lemunicipio,tpv_almacen.telefono as letelefono,tpv_almacen.descripcion as sucursal"))
                    ->join('tpv_almacen','sys_empresa.id','=','tpv_almacen.id_sys_empresa')
                    ->join('tpv_caja','tpv_caja.id_tpv_almacen','=','tpv_almacen.id')
                    ->leftjoin('sys_direccion','sys_direccion.id','=','tpv_almacen.id_sys_direccion')
                    ->leftjoin('cat_pais','cat_pais.clave','=','sys_direccion.pais')
                    ->leftjoin('cat_estado','cat_estado.id','=','sys_direccion.estado')
                    ->leftjoin('cat_municipio','cat_municipio.id','=','sys_direccion.municipio')
                    ->where('tpv_caja.id_tpv_turno','=',$turno)
                    ->where('tpv_caja.id_sys_usuario','=',$usuario)
                    ->where('tpv_caja.id_tpv_almacen','=',$sucursal)
                    ->where('tpv_caja.id_cat_cajamovimiento','=',4)
                    ->where('tpv_caja.fecha','=',$fecha)
                    ->get();
        //dd($result);
        return $result;
    }   
    
    public function corteTexto($turno,$usuario,$sucursal,$fecha,$tipodoc){
        $result = DB::table('tpv_notaimpresion')
                    ->select(
                        DB::raw("tpv_notaimpresion.*,cat_tipodoc.descripcion as tipodoc"))
                    ->join('tpv_almacen','tpv_notaimpresion.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('tpv_caja','tpv_almacen.id','=','tpv_caja.id_tpv_almacen')
                    ->join('cat_tipodoc','tpv_notaimpresion.id_cat_tipodoc','=','cat_tipodoc.id')
                    ->where('tpv_caja.id_tpv_turno','=',$turno)
                    ->where('tpv_caja.id_sys_usuario','=',$usuario)
                    ->where('tpv_caja.id_tpv_almacen','=',$sucursal)
                    ->where('tpv_caja.id_cat_cajamovimiento','=',4)
                    ->where('tpv_caja.fecha','=',$fecha)
                    ->where('tpv_notaimpresion.id_cat_tipodoc','=',$tipodoc)
                    ->where('tpv_notaimpresion.status','=',1)
                    ->get();
                    
        return $result;
    }

    public function corte($turno,$usuario,$sucursal,$fecha){
        $result = DB::table('tpv_cortecaja')
                    ->select(
                        DB::raw("tpv_cortecaja.*"))
                    ->join('tpv_cortecaformapago','tpv_caja.id','=','tpv_cortecaformapago.id_tpv_cortecaja')
                    ->join('tpv_caja','tpv_cortecaja.id_tpv_caja','=','tpv_cortecaja.id')
                    ->where('tpv_caja.id_tpv_turno','=',$turno)
                    ->where('tpv_caja.id_sys_usuario','=',$usuario)
                    ->where('tpv_caja.id_tpv_almacen','=',$sucursal)
                    ->where('tpv_caja.id_cat_cajamovimiento','=',4)
                    ->where('tpv_caja.fecha','=',$fecha)
                    ->get();
                    
        return $result;
    }

    public function getKardex($usuario,$turno,$fecha,$sucursal,$dbnomina) {
        $resultSalidas = DB::table('tpv_kardex')
                    ->select(DB::raw("tpv_kardex.*, tpv_articulo.codigo, tpv_articulo.descripcioncorta, cat_tipodoc.descripcion as documento, pempleado.nombre as realizo,
                                    cat_acciones.descripcion as accion, cat_operacion.descripcion as movimiento, cat_operacion_movimiento.descripcion as tipomovimiento"))
                    ->join('tpv_articulo','tpv_kardex.id_tpv_articulo','=','tpv_articulo.id')
                    ->join('cat_tipodoc', 'tpv_kardex.id_cat_tipodoc', '=', 'cat_tipodoc.id')
                    ->join('cat_acciones', 'tpv_kardex.id_cat_acciones', '=', 'cat_acciones.id')
                    ->join('cat_operacion', 'tpv_kardex.id_cat_operacion', '=', 'cat_operacion.id')
                    ->leftjoin('cat_operacion_movimiento', 'tpv_kardex.id_cat_operacion_movimiento', '=', 'cat_operacion_movimiento.id')
                    ->join($dbnomina.'.pempleado', 'tpv_kardex.id_sys_usuario', '=', 'pempleado.nip')
                    ->where('tpv_kardex.id_cat_operacion', 6)
                    ->where(function($q) use($turno){
                        $q->Where('tpv_kardex.id_tpv_turno', $turno)
                            ->orWhere('tpv_kardex.id_tpv_turno', null);
                    })
                    //->where('tpv_kardex.id_sys_usuario','=',$usuario)
                    ->where('tpv_kardex.id_tpv_almacen','=',$sucursal)
                    ->where('tpv_kardex.fecha','=',$fecha)
                    ->get();

        $resultEntradas = DB::table('tpv_kardex')
                    ->select(DB::raw("tpv_kardex.*, tpv_articulo.codigo, tpv_articulo.descripcioncorta, cat_tipodoc.descripcion as documento, pempleado.nombre as realizo,
                                    cat_acciones.descripcion as accion, cat_operacion.descripcion as movimiento, cat_operacion_movimiento.descripcion as tipomovimiento"))
                    ->join('tpv_articulo','tpv_kardex.id_tpv_articulo','=','tpv_articulo.id')
                    ->join('cat_tipodoc', 'tpv_kardex.id_cat_tipodoc', '=', 'cat_tipodoc.id')
                    ->join('cat_acciones', 'tpv_kardex.id_cat_acciones', '=', 'cat_acciones.id')
                    ->join('cat_operacion', 'tpv_kardex.id_cat_operacion', '=', 'cat_operacion.id')
                    ->leftjoin('cat_operacion_movimiento', 'tpv_kardex.id_cat_operacion_movimiento', '=', 'cat_operacion_movimiento.id')
                    ->join($dbnomina.'.pempleado', 'tpv_kardex.id_sys_usuario', '=', 'pempleado.nip')
                    ->where('tpv_kardex.id_cat_operacion', 5)
                    ->where(function($q) use($turno){
                        $q->Where('tpv_kardex.id_tpv_turno', $turno)
                            ->orWhere('tpv_kardex.id_tpv_turno', null);
                    })
                    //->where('tpv_kardex.id_sys_usuario','=',$usuario)
                    ->where('tpv_kardex.id_tpv_almacen','=',$sucursal)
                    ->where('tpv_kardex.fecha','=',$fecha)
                    ->get();
       
        $result = [$resultEntradas, $resultSalidas];  
        //dd($resultEntradas, $resultSalidas);  
        return $result;
    }

    public function getDiarioVenta($turno,$usuario,$sucursal,$fecha,$dbnomina){
        $result = DB::table('tpv_pedido')
                    ->select(DB::raw("tpv_pedido.id as id,
                                cat_tipodoc.descripcion as documento,
                                 tpv_pedido.status as status,
                                 tpv_pedido.serie as serie,
                                 tpv_pedido.folio as folio,
                                 tpv_pedido.fecha as fecha,
                                 tpv_pedido.hora as hora,
                                 tpv_pedido.subtotal as subtotal,
                                 tpv_pedido.descuento as descuento,
                                 tpv_pedido.iva as iva,
                                 tpv_pedido.total as total,
                                 tpv_pedido.anticipo as anticipo,
                                 tpv_pedido.isAnticipo as isAnticipo,
                                 tpv_pedido.isLiquidacion as isLiquidacion,
                                 tpv_pedido.fechaLiquidacion as fechaLiquidacion,
                                 tpv_pedido.id_sat_metodopago as metodopago,
                                 tpv_pedido.observaciones as observaciones,
                                 tpv_pedidoformapago.monto as formapagomonto,
                                 tpv_pedidoformapago.isAnticipo as pagoAnticipo,
                                 tpv_pedidoformapago.isDeposito as pagoDeposito,
                                 sat_formapago.id as idformapago,
                                 sat_formapago.descripcion as formapago,
                                 sat_banco.descripcion as banco,
                                 pusuarios.idempleado as id_tpv_usuario,
                                 pusuarios.username as usuario,
                                 tpv_cliente.id as id_tpv_cliente,
                                 sys_persona.nombre as cliente,
                                 tpv_almacen.id as id_tpv_almacen,
                                 tpv_almacen.descripcion as sucursal,
                                 tpv_turno.id as id_tpv_turno,
                                 tpv_turno.descripcion as turno,
                                 tpv_pedido.id_tpv_vendedor as id_tpv_vendedor,
                                 pu.nombre as vendedor"))
                    ->join('cat_tipodoc','tpv_pedido.id_cat_tipodoc','=','cat_tipodoc.id')
                    ->join($dbnomina.'.pusuarios','tpv_pedido.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('tpv_turno','tpv_pedido.id_tpv_turno','=','tpv_turno.id')
                    ->join('tpv_vendedorcomisiones','tpv_pedido.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios AS pu','tpv_vendedorcomisiones.id_tpv_vendedor','=','pu.idempleado')
                    ->join('tpv_pedidoformapago','tpv_pedido.id','=','tpv_pedidoformapago.id_tpv_pedido')
                    ->join('sat_formapago','tpv_pedidoformapago.id_sat_formapago','=','sat_formapago.id')
                    ->leftJoin('sat_banco','tpv_pedidoformapago.id_sat_banco','=','sat_banco.id')
                    //->where('tpv_pedido.id_sys_usuario','=',$usuario)
                    //->where('tpv_pedido.id_tpv_turno','=',$turno)
                    ->where('tpv_pedido.id_tpv_almacen', $sucursal)
                    ->where('tpv_pedidoformapago.fecha','=',$fecha)
                    ->where(function($q) use($fecha){
                        $q->where('tpv_pedido.fecha','=',$fecha)
                        ->orWhere('tpv_pedido.fechaLiquidacion','=',$fecha);
                    })
                    ->whereIn('tpv_pedido.status',[2,3,4,13,14])
                    ->orderBy('tpv_pedido.id','asc')
                    ->get();
        //dd($result);
        return $result;
    }

    public function getDiarioVentaCredito($turno,$usuario,$sucursal,$fecha,$dbnomina) {
        $result = DB::table('tpv_pedido')
                    ->select(DB::raw("tpv_pedido.id as id,
                                cat_tipodoc.descripcion as documento,
                                 tpv_pedido.status as status,
                                 tpv_pedido.serie as serie,
                                 tpv_pedido.folio as folio,
                                 tpv_pedido.fecha as fecha,
                                 tpv_pedido.hora as hora,
                                 tpv_pedido.subtotal as subtotal,
                                 tpv_pedido.descuento as descuento,
                                 tpv_pedido.iva as iva,
                                 tpv_pedido.total as total,
                                 tpv_pedido.anticipo as anticipo,
                                 tpv_pedido.isAnticipo as isAnticipo,
                                 tpv_pedido.isLiquidacion as isLiquidacion,
                                 tpv_pedido.fechaLiquidacion as fechaLiquidacion,
                                 tpv_pedido.id_sat_metodopago as metodopago,
                                 tpv_pedido.observaciones as observaciones,
                                 tpv_pedidoformapago.monto as formapagomonto,
                                 tpv_pedidoformapago.isAnticipo as pagoAnticipo,
                                 tpv_pedidoformapago.isDeposito as pagoDeposito,
                                 sat_formapago.id as idformapago,
                                 sat_formapago.descripcion as formapago,
                                 sat_banco.descripcion as banco,
                                 pusuarios.idempleado as id_tpv_usuario,
                                 pusuarios.username as usuario,
                                 tpv_cliente.id as id_tpv_cliente,
                                 sys_persona.nombre as cliente,
                                 tpv_almacen.id as id_tpv_almacen,
                                 tpv_almacen.descripcion as sucursal,
                                 tpv_turno.id as id_tpv_turno,
                                 tpv_turno.descripcion as turno,
                                 tpv_pedido.id_tpv_vendedor as id_tpv_vendedor,
                                 pu.nombre as vendedor,
                                 IFNULL(con_cxcanticipo.fecha,'0000-00-00') as fechaanticipo"))
                    ->join('cat_tipodoc','tpv_pedido.id_cat_tipodoc','=','cat_tipodoc.id')
                    ->join($dbnomina.'.pusuarios','tpv_pedido.id_sys_usuario','=','pusuarios.idempleado')
                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                    ->join('tpv_turno','tpv_pedido.id_tpv_turno','=','tpv_turno.id')
                    ->join('tpv_vendedorcomisiones','tpv_pedido.id_tpv_vendedor','=','tpv_vendedorcomisiones.id')
                    ->join($dbnomina.'.pusuarios AS pu','tpv_vendedorcomisiones.id_tpv_vendedor','=','pu.idempleado')
                    ->leftjoin('con_cxcanticipo', 'tpv_pedido.id', '=', 'con_cxcanticipo.id_tpv_pedido')
                    ->leftjoin('tpv_pedidoformapago','tpv_pedido.id','=','tpv_pedidoformapago.id_tpv_pedido')
                    ->leftjoin('sat_formapago','tpv_pedidoformapago.id_sat_formapago','=','sat_formapago.id')
                    ->leftJoin('sat_banco','tpv_pedidoformapago.id_sat_banco','=','sat_banco.id')
                    //->where('tpv_pedido.id_sys_usuario','=',$usuario)
                    //->where('tpv_pedido.id_tpv_turno','=',$turno)
                    ->where('tpv_pedido.id_tpv_almacen', $sucursal)
                    ->where('tpv_pedido.fecha','=',$fecha)
                    ->where('tpv_pedido.id_sat_metodopago','=','PPD')
                    ->whereIn('tpv_pedido.status',[2,3,4,13,14])
                    ->orderBy('tpv_pedido.id','asc')
                    ->orderBy('con_cxcanticipo.fecha','asc')
                    ->get();
        //dd($result);
        return $result;
    }

    public function getPagosCredito($turno,$usuario,$sucursal,$fecha,$dbnomina) {
        $result = DB::table('con_cxcrecibo')
                    ->select(DB::raw("con_cxcrecibo.*, con_cxcpago.folio, sys_persona.nombre as cliente, sat_formapago.descripcion as formapago,
                                        con_cxcamortizacion.numpago, tpv_almacen.descripcion as sucursal, tpv_turno.descripcion as turno, con_cxcpago.total as pagototal,
                                        IFNULL(con_cxcanticipo.fecha,'0000-00-00') as fechaanticipo"))
                    ->join('con_cxcpago', 'con_cxcrecibo.id_con_cxcpago', '=', 'con_cxcpago.id')
                    ->leftjoin('con_cxcdocto', 'con_cxcrecibo.id_con_cxcdocto_real', '=', 'con_cxcdocto.id')
                    ->leftjoin('con_cxcamortizacion', 'con_cxcrecibo.id_con_cxcdocto', '=', 'con_cxcamortizacion.id')
                    ->leftjoin('sat_formapago','con_cxcrecibo.id_sat_formapago','=','sat_formapago.id')
                    ->leftjoin('tpv_pedido', 'con_cxcdocto.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->leftjoin('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                    ->leftjoin('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                    ->leftjoin('tpv_almacen', 'tpv_pedido.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->leftjoin('tpv_turno', 'tpv_pedido.id_tpv_turno', '=', 'tpv_turno.id')
                    ->leftjoin('con_cxcanticipo', 'tpv_pedido.id', '=', 'con_cxcanticipo.id_tpv_pedido')
                    ->where('con_cxcrecibo.fecha','=',$fecha)
                    //->where('fechaanticipo','0000-00-00')
                    //->where('con_cxcrecibo.id_sys_usuario_cobro','=',$usuario)
                    //->where('tpv_pedido.id_tpv_turno','=',$turno)
                    ->where('con_cxcrecibo.id_tpv_almacen_cobro', $sucursal)
                    ->where('con_cxcrecibo.status', "!=", 99)
                    ->orderBy('con_cxcrecibo.timestamp', 'asc')
                    ->orderBy('con_cxcrecibo.id_con_cxcdocto_real', 'asc')
                    //->having('fechaanticipo', '0000-00-00')
                    ->get();
        //dd($result);
        $arrayPagos = [];
        foreach($result as $item) {
            //dd($item);
            if($item->fechaanticipo != $item->fecha && $item->numpago>=0)
                array_push($arrayPagos, $item); 
            else if($item->fechaanticipo == '0000-00-00' && $item->numpago==0)
                array_push($arrayPagos, $item);
            else {
                //La fecha del documento es igual a la fecha de anticipo, por eso no se ingresa al arreglo porque sale en el apartado de anticipos.
                //dd("OTRO CASO DE ANTICIPO DE ENGANCHE; REVISAR", $item);
            }
        }
        //dd($arrayPagos);
        return $arrayPagos;
    }

    public function getDatosFacturacion($idCliente) {
        $result = DB::table('tpv_cliente') 
                    ->join('sys_persona', 'sys_persona.id', '=', 'tpv_cliente.id_sys_persona')
                    ->join('sys_direccion', 'sys_direccion.id', '=', 'tpv_cliente.id_sys_direccion')
                    ->select('tpv_cliente.id', 'tpv_cliente.id_sys_persona', 'sys_persona.nombre', 'sys_persona.rfc', 'sys_persona.curp', 'sys_persona.telefono', 'tpv_cliente.id_cat_clientetipo',
                    'sys_persona.id_sat_usocfdi', 'sys_persona.id_sat_regimenfiscal', 'tpv_cliente.id_sys_direccion', 'sys_direccion.calle', 'sys_direccion.numexterior', 'sys_direccion.numinterior',
                    'sys_direccion.cp', 'sys_direccion.colonia', 'sys_direccion.municipio', 'sys_direccion.estado', 'sys_direccion.pais', 'sys_persona.email')
                    ->where('tpv_cliente.id', $idCliente)
                    ->where('tpv_cliente.status', 1)
                    ->first();
        if(empty($result)) 
            return 0;
        else 
            return $result;  
    }

    public function checkEfectivoCaja($fecha, $usuario, $turno, $idAlmacen) {
        /*$result = DB::table('tpv_pedido')
                    ->select(
                        DB::raw("SUM(tpv_pedido.efectivo) as efectivo,
                                SUM(tpv_pedido.cambio) as cambio"))
                    ->where('fecha', $fecha)
                    ->where('id_tpv_almacen', $idAlmacen)
                    ->whereIn('status', [2,3])
                    ->first();*/
        $ventas = DB::table('tpv_pedido')
                    ->join('tpv_pedidoformapago', 'tpv_pedidoformapago.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('tpv_pedido.id_tpv_almacen', $idAlmacen)
                    ->where('tpv_pedidoformapago.fecha','=',$fecha)
                    ->where('tpv_pedidoformapago.id_sat_formapago','01')
                    ->whereIn('tpv_pedido.status', [1,2,3,13,14])
                    ->sum('tpv_pedidoformapago.monto');
                    //->get();
                
        $pagos = DB::table('con_cxcpago')
                    ->select(DB::raw("con_cxcpago.*, con_cxcrecibo.id_con_cxcdocto_real, con_cxcdocto.id_tpv_pedido"))
                    ->join("con_cxcrecibo", "con_cxcpago.id", "=", "con_cxcrecibo.id_con_cxcpago")
                    ->leftjoin("con_cxcdocto", "con_cxcrecibo.id_con_cxcdocto_real", "=", "con_cxcdocto.id")
                    ->where('con_cxcpago.id_tpv_almacen', $idAlmacen)
                    ->where('con_cxcpago.fecha','=',$fecha)
                    ->where('con_cxcpago.id_sat_formapago','01')
                    ->whereIn('con_cxcpago.status', [1])
                    ->groupBy("con_cxcpago.id")
                    ->get();
                    //->sum('con_cxcpago.total');
        $arrayPagos = array();
        $totalPagos = 0;
        //dd($pagos);
        foreach($pagos as $pago) {
            /**/
            $pago->tieneAnticipo = 0;
            $anticipo = DB::table('con_cxcanticipo')
                        ->select(DB::raw("con_cxcanticipo.*"))
                        ->where('con_cxcanticipo.id_tpv_pedido', $pago->id_tpv_pedido)
                        //->where('con_cxcanticipo.fecha','=',$fecha)
                        ->get();
            /*if($pago->id_tpv_pedido==911)
                        dd($pago, $anticipo);*/
            if(count($anticipo)>0) {
                $monto = 0;
                foreach ($anticipo as $key => $value) {
                   if($value->fecha == $fecha) {
                        $monto = $monto + $value->monto;
                   } else {
                    //dd("ENTRA");
                        $monto = $pago->total;
                   }
                }
                if($monto>0) {
                    $pago->subtotal = $monto/1.16;
                    $pago->iva = ($monto/1.16)*.16;
                    $pago->total = $monto;
                    $pago->tieneAnticipo = 1;
                    $totalPagos = $totalPagos + $monto;
                    array_push($arrayPagos, $pago);
                }
            } else {
                $totalPagos = $totalPagos + $pago->total;
                array_push($arrayPagos, $pago);
            }
        }
        //dd($arrayPagos, $totalPagos);         

        $ingresoCaja = DB::table('tpv_caja')
                    ->where('tpv_caja.id_tpv_almacen', $idAlmacen)
                    ->where('tpv_caja.fecha','=',$fecha)
                    ->where('tpv_caja.id_cat_cajamovimiento', 3)
                    ->where('tpv_caja.status', 1)
                    ->whereIn('tpv_caja.status', [1])
                    ->sum('tpv_caja.monto');

        $anticipos = DB::table('con_cxcanticipo')
                    ->where('con_cxcanticipo.id_tpv_almacen', $idAlmacen)
                    ->where('con_cxcanticipo.fecha','=',$fecha)
                    ->where('con_cxcanticipo.id_sat_formapago','01')
                    ->whereIn('con_cxcanticipo.status', [1])
                    ->sum('con_cxcanticipo.monto');

        $abonosApartados = DB::table('tpv_apartadoabonos')
                    ->join('tpv_pedido', 'tpv_apartadoabonos.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->join('tpv_pedidoformapago', 'tpv_pedidoformapago.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('tpv_apartadoabonos.id_tpv_almacen', $idAlmacen)
                    ->where('tpv_pedidoformapago.fecha','=',$fecha)
                    ->where('tpv_pedidoformapago.id_sat_formapago','01')
                    ->whereIn('tpv_apartadoabonos.status', [1])
                    ->sum('tpv_pedidoformapago.monto');
                    //->sum('tpv_apartadoabonos.cantidadabono');
        //dd($ventas,$totalPagos,$ingresoCaja,$anticipos,$abonosApartados);
        $total = $ventas+$totalPagos+$ingresoCaja+$anticipos+$abonosApartados;
        
        return $total;  
    }

    public function montoMaximoRetiro() {
        $result = DB::table('sys_parametros')
                    ->where('id', 5)
                    ->where('status', 1)
                    ->first();
        return $result;
    }

    public function retirosEfectivoCaja($fecha, $idMovimientoCaja, $usuario, $turno, $idAlmacen) {
        $result = DB::table('tpv_caja')
                    ->select(
                        DB::raw("SUM(tpv_caja.monto) as monto"))
                    ->where('fecha', $fecha)
                    //->where('id_sys_usuario', $usuario)
                    //->where('id_tpv_turno', $turno)
                    ->where('id_tpv_almacen', $idAlmacen)
                    ->where('status', 1)
                    ->whereIn('id_cat_cajamovimiento', $idMovimientoCaja)
                    ->first();
        if($result->monto==null)
            $result->monto=0;

        return $result;
    }

    public function retirosEfectivoCajaTurno($idMovimientoCaja, $usuario, $turno, $idAlmacen, $fechaini, $horaini) {
        $result = DB::table('tpv_caja')
                    ->select(
                        DB::raw("SUM(tpv_caja.monto) as monto"))
                    ->whereRaw("tpv_caja.fecha>='".$fechaini."'")
                    ->whereRaw("tpv_caja.hora>='".$horaini."'")
                    ->where('id_sys_usuario', $usuario)
                    ->where('id_tpv_turno', $turno)
                    ->where('id_tpv_almacen', $idAlmacen)
                    ->whereIn('id_cat_cajamovimiento', $idMovimientoCaja)
                    ->first();
        
        return $result;
    }

    public function saveFactura($id,$params,$usuario,$turno,$almacen){
        DB::beginTransaction();
        $exp = explode('T',$params['comprobante']['Fecha']);


        $upd = DB::table('tpv_pedido')
                ->where('id',$id)
                ->update(['status'=>3]);
        if($upd>0){
            $upd2 = DB::table('tpv_folio')
                    ->where('id_sys_usuario',$usuario)
                    ->where('id_tpv_turno',$turno)
                    ->where('id_tpv_almacen', $almacen)              
                    ->where('id_cat_operacion',3)
                    ->where('status','=',1)
                    ->increment('folio');
            if($upd2>0){
                $result = DB::table('tpv_factura')
                            ->insert([
                                'folio'=>$params['comprobante']['Folio'],
                                'serie'=>$params['comprobante']['Serie'],
                                'sello'=>$params['comprobante']['Sello'],
                                'formaDePago'=>$params['comprobante']['FormaPago'],
                                'noCertificado'=>$params['comprobante']['NoCertificado'],
                                'certificado'=>$params['comprobante']['Certificado'],
                                'subtotal'=>$params['comprobante']['SubTotal'],
                                'descuento'=>$params['comprobante']['Descuento'],
                                'total'=>$params['comprobante']['Total'],
                                'tipoDeComprobante'=>$params['comprobante']['TipoDeComprobante'],
                                'metodoDePago'=>$params['comprobante']['MetodoPago'],
                                'LugarExpedicion'=>$params['comprobante']['LugarExpedicion'],
                                'Moneda'=>$params['comprobante']['Moneda'],
                                'emisorrfc'=>$params['emisor']['Rfc'],
                                'emisornombre'=>$params['emisor']['Nombre'],
                                'emisorregimen'=>$params['emisor']['RegimenFiscal'],
                                'cliente'=>$params['receptor']['Nombre'],
                                'regimencliente'=>$params['receptor']['RegimenFiscalReceptor'],
                                'usocfdi'=>$params['receptor']['UsoCFDI'],
                                'cpcliente'=>$params['receptor']['DomicilioFiscalReceptor'],
                                'rfccliente'=>$params['receptor']['Rfc'],
                                'id_tpv_pedido'=>$id,
                                'fecha'=>$exp[0],
                                'hora'=>$exp[1],
                                'UUID'=>$params['timbrado']['UUID'],
                                'NoCertificadoSAT'=>$params['timbrado']['NoCertificadoSAT'],
                                'FechaSAT'=>$params['timbrado']['FechaSAT'],
                                'SelloSAT'=>$params['timbrado']['SelloSAT'],
                                'SelloCFD'=>$params['timbrado']['SelloCFD'],
                                'sistema'=>'erp'
                            ]);
                if($result>0){
                    //Aplicar movimientos contables
                    $pedd = DB::table('tpv_pedido')
                                    ->select(DB::raw('tpv_pedido.*,tpv_cliente.clave as clave,tpv_cliente.clave as clave,sys_persona.nombre as nombre'))
                                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                                    ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                                    ->where('tpv_pedido.id',$id)
                                    ->first();
                    $costotot = 0;
                    $pedddet = DB::table('tpv_pedidodetalle')
                                    ->where('id_tpv_pedido',$id)
                                    ->get();
                    foreach($pedddet as $pdd){
                        $costotot+= $pdd->costo * $pdd->cantidad;
                    }
                    /*
                    Inventario >
                    Costo de Venta <
                    Caja <
                    Ventas >
                    IVA Trasladado >
                    Descuento Sobre Ventas < (Si tuviera descuento)
                    */
                    $txttipoventa = 'DE CONTADO';
                    // if($params['comprobante']['MetodoPago']=='PPD'){
                    //     $txttipoventa = 'A CREDITO';
                    // }

                    $pedant = DB::table('con_cxcanticipo')
                                    ->where('id_tpv_pedido',$id)
                                    ->where('status',2)
                                    ->get();
                    $montoant = 0;
                    foreach($pedant as $pda){
                        $montoant+= $pda->monto;
                    }


                    if($pedd->id_cat_tipodoc==14 || $montoant>0){
                        $txttipoventa = 'CON APLICACION DE ANTICIPO';
                    }

                    $result0 = DB::table('tpv_factura')
                                ->where("id_tpv_pedido", $id)
                                ->where("status", 99)
                                ->first();
                    if(!isset($result0->status)){

                        $conhead = DB::table('con_asiento')->insertGetId([
                            'id_sys_usuario'=>$usuario,
                            'id_cat_tipoasiento'=>1,
                            'concepto'=>'VENTA '.$txttipoventa.' NUM. '.$params['comprobante']['Serie'].$params['comprobante']['Folio'],
                            'fecha'=>date('Y-m-d'),
                            'hora'=>date('H:i:s'),
                            'debe'=>($pedd->total+$costotot),
                            'haber'=>($pedd->total+$costotot)
                        ]);
                        if($conhead>0){
                            /*
                            Inventario >
                            Costo de Ventas <
                            Clientes <
                            IVA por trasladar <
                            Ventas >
                            */
                            //Obtenemos la cuenta contable de almacen
                            $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',$pedd->id_tpv_almacen)
                                        ->first();
                            if(isset($almcc->id)){
                                $movimientos = array();
                                if($params['comprobante']['MetodoPago']=='PUE'){

                                    //Si tiene anticipo se aplica el movimiento
                                    $antic = 0;
                                    $peddfp = DB::table('tpv_pedidoformapago')
                                                    ->where('id_tpv_pedido',$id)
                                                    ->where('isAnticipo',1)                                                
                                                    ->where('status',1)
                                                    ->get();
                                    foreach($peddfp as $pddfp){
                                        $antic+= $pddfp->monto;
                                    }

                                    if($montoant>0){
                                        $antic = $antic + $montoant;
                                    }

                                    if($pedd->id_cat_tipodoc==14 || $montoant>0){
                                        $ctaant = '206 001 '.str_pad($pedd->clave, 6, "0", STR_PAD_LEFT);
                                        $cac = DB::table('con_cuentas')->where('numerocuenta',$ctaant)->first();
                                        if(isset($cac->numerocuenta)){
                                            $cuentaclienteanticipo = $ctaant;
                                        }else{
                                            $cuentaclienteanticipo = DB::table('con_cuentas')->insertGetId([
                                                'numerocuenta'=>$ctaant,
                                                'descripcion'=>$pedd->nombre,
                                                'codigoagrupador'=>'206.01',
                                                'id_sys_usuario'=>$usuario,
                                                'fecha'=>date('Y-m-d'),
                                                'hora'=>date('H:i:s'),
                                                'saldoinicial'=>0
                                            ]);
                                        }
                                        // Cargo a cuenta Anticipos
                                        $movimientos[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>$ctaant,
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>$antic,
                                            'haber'=>0
                                        ];
                                    }

                                    // Cargo a cuenta Concentradora (CAJA)
                                    $cajj = $pedd->total - $antic;
                                    if($cajj>0){
                                        $movimientos[] = [
                                            'id_con_asiento'=>$conhead,
                                            'cuenta'=>$almcc->cuentacaja,
                                            'id_con_centrocosto'=>$almcc->id,
                                            'debe'=>$cajj,
                                            'haber'=>0
                                        ];
                                    }
                                    // Abono a Ventas
                                    $movimientos[] = [
                                        'id_con_asiento'=>$conhead,
                                        'cuenta'=>$almcc->cuentaventa,
                                        'id_con_centrocosto'=>$almcc->id,
                                        'debe'=>0,
                                        'haber'=>($antic + ($cajj/1.16))
                                    ];
                                    // Abono a iva trasladado
                                    $movimientos[] = [
                                        'id_con_asiento'=>$conhead,
                                        'cuenta'=>'208 001 000001',
                                        'id_con_centrocosto'=>$almcc->id,
                                        'debe'=>0,
                                        'haber'=>($cajj - ($cajj/1.16))
                                    ];
                                    
                                    // Abono a Inventarios por el total de la venta antes iva
                                    $movimientos[] = [
                                        'id_con_asiento'=>$conhead,
                                        'cuenta'=>$almcc->cuentainventario,
                                        'id_con_centrocosto'=>$almcc->id,
                                        'debe'=>0,
                                        'haber'=>$costotot
                                    ];
                                    // Cargo a Costo de ventas (Antes iva)
                                    $movimientos[] = [
                                        'id_con_asiento'=>$conhead,
                                        'cuenta'=>$almcc->cuentacostos,
                                        'id_con_centrocosto'=>$almcc->id,
                                        'debe'=>$costotot,
                                        'haber'=>0
                                    ];
                                }
                                $condet = DB::table('con_asientodetalle')->insert($movimientos);
                                if($condet>0){                                
                                    $updant = DB::table('con_cxcanticipo')
                                        ->where('id_tpv_pedido', $id)
                                        ->update([
                                            'status'=>2,
                                            'uuid_aplicado'=>$params['timbrado']['UUID']
                                        ]);
                                    DB::commit();
                                    return $result;
                                }else{
                                    DB::rollBack();
                                    return 'ERR :: Problemas al crear el detalle del asiento contable';
                                }
                            }else{
                                DB::rollBack();
                                return 'ERR :: No existe registro de centro de costos para este almacen';
                            }
                        }else{
                            DB::rollBack();
                            return 'ERR :: Problemas al crear la cabecera del asiento contable';
                        }
                    }else{                        
                        DB::commit();
                        return $result;
                    }
                }else{
                    DB::rollBack();
                    return 'problemas al crear registro de la factura. Contacte con el administrador del sistema.';
                }
            }else{
                DB::rollBack();
                return 'problemas al incrementar el folio. Contacte con el administrador del sistema.';
            }
        }else{
            DB::rollBack();
            return 'problemas al actualizar el status del registro. Contacte con el administrador del sistema.';
        }
    }

    public function cancelarDocumento($id, $motivo, $tipodoc) {
        DB::beginTransaction();
        $result = DB::table('tpv_pedidodetalle')
                    ->select(DB::raw('tpv_pedidodetalle.*, tpv_articuloalmacen.id_tpv_articulo, tpv_articuloalmacen.id_tpv_almacen,
                                    tpv_pedido.serie, 
                                    tpv_pedido.folio, 
                                    tpv_pedido.id_cat_tipodoc, 
                                    tpv_pedido.id_sys_usuario,
                                    tpv_pedido.id_tpv_turno'))
                    ->join('tpv_articuloalmacen', 'tpv_pedidodetalle.id_tpv_articuloalmacen', '=', 'tpv_articuloalmacen.id')
                    ->join('tpv_pedido', 'tpv_pedidodetalle.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('id_tpv_pedido', $id)
                    ->get();

        $cancel = DB::table('tpv_pedido')
                    ->where('id','=',$id)
                    ->update(['status' => 99, 'motivocancelacion' => $motivo]);
        //dd($id, $motivo, $tipodoc);
        if($cancel>0){
            //SE INGRESAN LOS ARTICULOS AL ALMACEN
            foreach($result as $item) {
                $increment = DB::table('tpv_articuloalmacen')
                                ->where('id','=',$item->id_tpv_articuloalmacen)
                                ->increment('existencia',$item->cantidad);

                $idKardex = DB::table('tpv_kardex')->insertGetId([
                    'id_sys_usuario' => $item->id_sys_usuario,
                    'id_tpv_turno' => $item->id_tpv_turno,
                    'id_tpv_articulo' => $item->id_tpv_articulo,
                    'id_tpv_almacen' => $item->id_tpv_almacen,
                    'id_tpv_articuloalmacen' => $item->id_tpv_articuloalmacen,
                    'id_cat_tipodoc' => $item->id_cat_tipodoc,
                    'id_cat_operacion' => 5,
                    'id_cat_operacion_movimiento' => null,
                    'id_cat_acciones' => 1,
                    'nombretabla' => 'tpv_pedidodetalle',
                    'idregistro' => $id,
                    'folio' => $item->serie."-".$item->folio,
                    'fecha' => date('Y-m-d'),
                    'hora' => date('H:i:s'),
                    'cantidad' => $item->cantidad,
                    'costopromedio' => $item->costo,
                ]);
                if($idKardex==0 || $increment==0) {
                    DB::rollBack();
                    return 'Detalle al devolver los articulos al almacén correspondiente';
                }
            }
            //dd($idKardex, $increment);
            if($idKardex>0 && $increment>0 && $tipodoc==1) {
                DB::commit();
                return $cancel;
            } else if($idKardex>0 && $increment>0 && $tipodoc>1) {
                
                $costotot = 0;
                $pedddet = DB::table('tpv_pedidodetalle')
                                ->where('id_tpv_pedido',$id)
                                ->get();
                foreach($pedddet as $pdd){
                    $costotot+= $pdd->costo * $pdd->cantidad;
                }
                $pedd = DB::table('tpv_pedido')
                                    ->select(DB::raw('tpv_pedido.*,tpv_cliente.clave as clave'))
                                    ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                                    ->where('tpv_pedido.id',$id)
                                    ->first();
                if($pedd->id_sat_metodopago=='PUE')
                    $txttipoventa = ' DE CONTADO';
                else
                    $txttipoventa = ' A CREDITO';
                $conhead = DB::table('con_asiento')->insertGetId([
                    'id_sys_usuario'=>$pedd->id_sys_usuario,
                    'id_cat_tipoasiento'=>98,
                    'concepto'=>'DEVOLUCION DE VENTA'.$txttipoventa.' '.$pedd->serie.$pedd->folio,
                    'fecha'=>date('Y-m-d'),
                    'hora'=>date('H:i:s'),
                    'debe'=>($pedd->total+$costotot),
                    'haber'=>($pedd->total+$costotot)
                ]);  
                //dd($conhead);              
                if($conhead>0){
                    /*
                    Inventario >
                    Costo de Ventas <
                    Clientes <
                    IVA por trasladar <
                    Ventas >
                    */
                    $costotot = 0;
                    $pedddet = DB::table('tpv_pedidodetalle')
                                    ->where('id_tpv_pedido',$id)
                                    ->get();
                    foreach($pedddet as $pdd){
                        $costotot+= $pdd->costo * $pdd->cantidad;
                    }
                    
                    $ctacxcant = '206 001 '.str_pad($pedd->clave, 6, "0", STR_PAD_LEFT);
                    $ctacxccli = '105 001 '.str_pad($pedd->clave, 6, "0", STR_PAD_LEFT);
                    //Obtenemos la cuenta contable de almacen
                    $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',$pedd->id_tpv_almacen)
                                ->first();
                    //dd($almcc);
                    if(isset($almcc->id)){
                        $movimientos = array();
                        
                        if($pedd->id_sat_metodopago=='PUE'){
                            // Cargo a cuenta Devolucion
                            $movimientos[] = [
                                'id_con_asiento'=>$conhead,
                                'cuenta'=>$almcc->cuentadevolucion,
                                'id_con_centrocosto'=>$almcc->id,
                                'debe'=>$pedd->subtotal,
                                'haber'=>0
                            ];
                            // Cargo a iva trasladado por cobrar
                            $movimientos[] = [
                                'id_con_asiento'=>$conhead,
                                'cuenta'=>'209 001 000001',
                                'id_con_centrocosto'=>$almcc->id,
                                'debe'=>$pedd->iva,
                                'haber'=>0
                            ];
                            // Abono a Anticipo de Clientes
                            $movimientos[] = [
                                'id_con_asiento'=>$conhead,
                                'cuenta'=>$ctacxcant,
                                'id_con_centrocosto'=>$almcc->id,
                                'debe'=>0,
                                'haber'=>$pedd->total
                            ];
                        }else{
                            //SACAMOS CUANTO HA DADO EL CLIENTE
                            $cxcpag = DB::table('con_cxcrecibo')
                                        ->select(DB::raw('SUM(con_cxcrecibo.importepagado) as importepagado,
                                                          con_cxcrecibo.id_sat_formapago as formapago,
                                                          con_cxcrecibo.cuenta as cuenta'))
                                        ->join('con_cxcdocto','con_cxcrecibo.id_con_cxcdocto_real','=','con_cxcdocto.id')
                                        ->where('con_cxcdocto.id_tpv_pedido',$pedd->id)
                                        ->where('con_cxcrecibo.id_sat_formapago','<>','201')
                                        ->groupBy('con_cxcrecibo.id_sat_formapago')
                                        ->groupBy('con_cxcrecibo.cuenta')
                                        ->get();
                            $arrformaspago = array();
                            if(isset($cxcpag[0])){
                                $itt = 0;
                                foreach($cxcpag as $fp){
                                    $arrformaspago[$itt]['importe'] = $fp->importepagado;
                                    $arrformaspago[$itt]['formapago'] = $fp->formapago;
                                    $arrformaspago[$itt]['cuenta'] = $fp->cuenta;
                                    $itt++;
                                }
                            }else{
                                DB::rollBack();
                                return 0;
                            }
                            // Cargo a cuenta Devolucion
                            $movimientos[] = [
                                'id_con_asiento'=>$conhead,
                                'cuenta'=>$almcc->cuentadevolucion,
                                'id_con_centrocosto'=>$almcc->id,
                                'debe'=>$pedd->subtotal,
                                'haber'=>0
                            ];
                            // Cargo a iva trasladado por cobrar
                            $movimientos[] = [
                                'id_con_asiento'=>$conhead,
                                'cuenta'=>'209 001 000001',
                                'id_con_centrocosto'=>$almcc->id,
                                'debe'=>$pedd->iva,
                                'haber'=>0
                            ];
                            $abonadotot = 0;
                            foreach($arrformaspago as $rfp){
                                if($rfp['formapago'] == '01'){
                                    // Abono a Caja
                                    $movimientos[] = [
                                        'id_con_asiento'=>$conhead,
                                        'cuenta'=>$almcc->cuentacaja,
                                        'id_con_centrocosto'=>$almcc->id,
                                        'debe'=>0,
                                        'haber'=>$rfp['importe']
                                    ];
                                }else{
                                    // Abono a Bancos
                                    $movimientos[] = [
                                        'id_con_asiento'=>$conhead,
                                        'cuenta'=>$rfp['cuenta'],
                                        'id_con_centrocosto'=>$almcc->id,
                                        'debe'=>0,
                                        'haber'=>$rfp['importe']
                                    ];
                                }
                                $abonadotot = $abonadotot + $rfp['importe'];
                            }
                            $restotot = $pedd->total - $abonadotot;
                            if($restotot>0){
                                // Abono a Clientes
                                $movimientos[] = [
                                    'id_con_asiento'=>$conhead,
                                    'cuenta'=>$ctacxccli,
                                    'id_con_centrocosto'=>$almcc->id,
                                    'debe'=>0,
                                    'haber'=>$$restotot
                                ];
                            }
                        }

                        // Abono a Inventarios por el total de la venta antes iva
                        $movimientos[] = [
                            'id_con_asiento'=>$conhead,
                            'cuenta'=>$almcc->cuentainventario,
                            'id_con_centrocosto'=>$almcc->id,
                            'debe'=>$costotot,
                            'haber'=>0
                        ];
                        // Cargo a Costo de ventas (Antes iva)
                        $movimientos[] = [
                            'id_con_asiento'=>$conhead,
                            'cuenta'=>$almcc->cuentacostos,
                            'id_con_centrocosto'=>$almcc->id,
                            'debe'=>0,
                            'haber'=>$costotot
                        ];
                        
                        $condet = DB::table('con_asientodetalle')->insert($movimientos);
                        //dd($condet);
                        if($condet>0){
                            DB::commit();
                            return $cancel;
                        }else{
                            DB::rollBack();
                            return 0;
                        }
                    }else{
                        DB::rollBack();
                        return 0;
                    }
                }else{
                    DB::rollBack();
                    return 0;
                }
            }else{
                DB::rollBack();
                return 0;
            }
        } else {
            DB::rollBack();
            return 0;
        }
    }

    public function reiniciaDenominacionCorte($usuario, $turno) {
        DB::beginTransaction();
        $result = DB::table('tpv_cortedenominaciones')
                        ->where('id_sys_usuario', $usuario)
                        ->where('id_tpv_turno', $turno)
                        ->where('status', 0)
                        ->get();
        if(count($result)>0) {
            $delete = DB::table('tpv_cortedenominacionesdetalle')
                        ->where('id_tpv_cortedenominaciones', $result[0]->id)
                        ->delete();
            $delete1 = DB::table('tpv_cortedenominaciones')
                        ->where('id', $result[0]->id)
                        ->delete();
            if(($delete>0 && $delete1>0) || $delete1>0){
                DB::commit();
                return 1;
            }else {
                DB::rollBack();
                return 0;
            }
        } else {
            DB::commit();
            return 1;
        }
    }

    public function nuevoCorteDenominacion($usuario, $fecha, $sucursal, $turno, $folio) {
        DB::beginTransaction();
        $result = DB::table('tpv_cortedenominaciones')
                    ->where('id_sys_usuario', $usuario)
                    ->where('id_tpv_turno', $turno)
                    ->where('id_tpv_almacen', $sucursal)
                    ->where('fechacorte', $fecha)
                    ->get();
        if(count($result) == 0) {
            $idCorte = DB::table('tpv_cortedenominaciones')->insertGetId([   
                'id_sys_usuario' => $usuario,
                'id_tpv_turno' => $turno,
                'id_tpv_almacen' => $sucursal,
                'fechacorte' => $fecha,
                'folio' => $folio
            ]);
            if($idCorte>0) {
                DB::commit();
                return $idCorte;
            }else {
                DB::rollBack();
                return 0;
            }
        } else if($result[0]->status == 1) {
            DB::rollBack();
            return 0;
        } else {
            DB::rollBack();
            return $result[0]->id;
        }
    }

    public function detalleCorteDenominacion($cortedenominacion, $formapago, $cantidad, $valor){
        //dd($cortedenominacion, $formapago, $cantidad, $valor);
        DB::beginTransaction();
        if($formapago == '01') {
            $result = DB::table('tpv_cortedenominacionesdetalle')
                        ->where('id_tpv_cortedenominaciones', $cortedenominacion)
                        ->where('id_sat_formapago', '01')
                        ->where('valor', $valor)
                        ->first();
        }
        //dd($result);
        $total = $cantidad*$valor;
        if(isset($result->id)) { //SI EXISTE, ACTUALIZAR
            //dd($total);
            $update = DB::table('tpv_cortedenominacionesdetalle')
                        ->where('id', $result->id)
                        ->update(['cantidad'=>$cantidad, 'total' =>$total]);
            //dd($update);
            if($update>0) {
                DB::commit();
                return [$update];
            }else {
                DB::rollBack();
                return 0;
            }
        } else {  //CREAR
            $idCorte = DB::table('tpv_cortedenominacionesdetalle')->insertGetId([   
                'id_tpv_cortedenominaciones' => $cortedenominacion,
                'id_sat_formapago' => $formapago,
                'cantidad' => $cantidad,
                'valor' => $valor,
                'total' => $total
            ]);
            //dd($idCorte);
            if($idCorte>0) {
                DB::commit();
                if($formapago == '01')
                    return [$idCorte];
                else {
                    $result2 = DB::table('tpv_cortedenominacionesdetalle')
                                ->where('id_tpv_cortedenominaciones', $cortedenominacion)
                                ->where('id_sat_formapago', $formapago)
                                ->get();
                    return $result2;
                }
            }else {
                DB::rollBack();
                return 0;
            }
        }
    }

    public function saveCorteDenominaciones($usuario, $turno, $sucursal, $fecha, $folio, $totalefectivo, $totaldebito, $totalcredito, $totaltransferencia, $totaldeposito, $totales) {
        DB::beginTransaction();
        $cierrecaja = DB::table('tpv_caja')
                    ->where('id_sys_usuario', $usuario)
                    // ->where('id_tpv_turno', $turno)
                    // ->where('id_tpv_almacen', $sucursal)
                    ->whereRaw("fecha='".$fecha."'")
                    ->where('id_cat_cajamovimiento', 4)
                    ->get();
        //dd($cierrecaja);
        if(count($cierrecaja)>0) {
            $validaCorte = DB::table('tpv_cortecaja')
                    ->where('id_tpv_caja', $cierrecaja[0]->id)
                    ->where('id_tpv_almacen', $sucursal)
                    ->where('status', 1)
                    ->exists();
            //dd($validaCorte, $sucursal);
            if($validaCorte) {
                DB::rollBack();
                return 'Ya realizaste el corte de caja anteriormente de la sucursal seleccionada, de ser lo contrario, comuniquese con el administrador del sistema.';
            } else {
                $idCorteCaja = DB::table('tpv_cortecaja')->insertGetId([   
                    'id_tpv_caja' => $cierrecaja[0]->id,
                    'id_sys_usuario' => $usuario,
                    'id_tpv_turno' => $turno,
                    'id_tpv_almacen' => $sucursal,
                    'folio' => $folio,
                    'fecha' => $fecha,
                    'hora' => date('H:i:s'),
                    'total' => $totales
                ]);
                if($totales>0) {
                    if($idCorteCaja>0) {
                        $update = DB::table('tpv_cortedenominaciones')
                                    ->where('folio', $folio)
                                    ->update(['id_tpv_cortecaja' => $idCorteCaja,
                                                'totalefectivo' => $totalefectivo, 
                                                'totaldebito' =>$totaldebito,
                                                'totalcredito' =>$totalcredito,
                                                'totaltransferencia' =>$totaltransferencia,
                                                'totaldeposito' =>$totaldeposito,
                                                'totales' => $totales,
                                                'timestamp' => date('Y-m-d')." ".date('H:i:s'),
                                                'status' => 1]);
                        //dd($idCorteCaja, $update, $totales);
                        if($update>0) {
                            $result = DB::table('tpv_folio')
                                    ->where('id_sys_usuario','=',$usuario)
                                    ->where('id_tpv_turno','=',$turno)
                                    ->where('id_tpv_almacen', $sucursal)
                                    ->where('id_cat_operacion','=',11)
                                    ->where('status','=',1)
                                    ->increment('folio');
                            if($result>0){
                                DB::commit();
                                return $update;
                            } else {
                                DB::rollBack();
                                return 0;
                            }
                        }else {
                            DB::rollBack();
                            return 0;
                        }
                    }else {
                        DB::rollBack();
                        return 'No se creo el corte de caja';
                    }
                } else {
                    //CREA EL REGISTRO DE DENOMINACION CON CEROS
                    $idDenominaciones = DB::table('tpv_cortedenominaciones')->insertGetId([   
                                'id_tpv_cortecaja' => $idCorteCaja,
                                'id_sys_usuario' => $usuario,
                                'id_tpv_turno' => $turno,
                                'id_tpv_almacen' => $sucursal,
                                'folio' => $folio,
                                'fechacorte' => $fecha,
                                'totalefectivo' => $totalefectivo, 
                                'totaldebito' =>$totaldebito,
                                'totalcredito' =>$totalcredito,
                                'totaltransferencia' =>$totaltransferencia,
                                'totaldeposito' =>$totaldeposito,
                                'totales' => $totales,
                                'timestamp' => date('Y-m-d')." ".date('H:i:s'),
                                'status' => 1]);
                                
                    if($idDenominaciones>0) {
                        $result = DB::table('tpv_folio')
                                ->where('id_sys_usuario','=',$usuario)
                                ->where('id_tpv_turno','=',$turno)
                                ->where('id_tpv_almacen', $sucursal)
                                ->where('id_cat_operacion','=',11)
                                ->where('status','=',1)
                                ->increment('folio');
                        if($result>0){
                            DB::commit();
                            return $idCorteCaja;
                        } else {
                            DB::rollBack();
                            return 0;
                        }
                    } else {
                        DB::rollBack();
                        return 'No se creo el registro con denominaciones cero';
                    }  
                }
            }
        } else {
            DB::rollBack();
            return 'No puedes crear el corte porque no has cerrado el almacen en turno';
        }
    }

    public function saveCorteDenominacionesTurno($usuario, $turno, $sucursal, $fecha, $folio, $totalefectivo, $totaldebito, $totalcredito, $totaltransferencia, $totaldeposito, $totales, $fechaini, $horaini) {
        DB::beginTransaction();
        $cierrecaja = DB::table('tpv_caja')
                    ->where('id_sys_usuario', $usuario)
                    ->where('id_tpv_turno', $turno)
                    ->where('id_tpv_almacen', $sucursal)
                    ->whereRaw("fecha>='".$fecha."'")
                    ->whereRaw("hora>='".$fecha."'")
                    ->where('id_cat_cajamovimiento', 4)
                    ->get();
        //dd($cierrecaja);
        if(count($cierrecaja)>0) {
            $validaCorte = DB::table('tpv_cortecaja')
                    ->where('id_tpv_caja', $cierrecaja[0]->id)
                    ->where('status', 1)
                    ->exists();
            if($validaCorte) {
                DB::rollBack();
                return 'Ya realizaste el corte anteriormente, de ser lo contrario, comuniquese con el administrador del sistema.';
            } else {
                $idCorteCaja = DB::table('tpv_cortecaja')->insertGetId([   
                    'id_tpv_caja' => $cierrecaja[0]->id,
                    'id_sys_usuario' => $usuario,
                    'id_tpv_turno' => $turno,
                    'id_tpv_almacen' => $sucursal,
                    'folio' => $folio,
                    'fecha' => $fecha,
                    'hora' => date('H:i:s'),
                    'total' => $totales
                ]);
                if($totales>0) {
                    if($idCorteCaja>0) {
                        $update = DB::table('tpv_cortedenominaciones')
                                    ->where('folio', $folio)
                                    ->update(['id_tpv_cortecaja' => $idCorteCaja,
                                                'totalefectivo' => $totalefectivo, 
                                                'totaldebito' =>$totaldebito,
                                                'totalcredito' =>$totalcredito,
                                                'totaltransferencia' =>$totaltransferencia,
                                                'totaldeposito' =>$totaldeposito,
                                                'totales' => $totales,
                                                'timestamp' => date('Y-m-d')." ".date('H:i:s'),
                                                'status' => 1]);
                        //dd($idCorteCaja, $update, $totales);
                        if($update>0) {
                            $result = DB::table('tpv_folio')
                                    ->where('id_sys_usuario','=',$usuario)
                                    ->where('id_tpv_turno','=',$turno)
                                    ->where('id_tpv_almacen', $sucursal)
                                    ->where('id_cat_operacion','=',11)
                                    ->where('status','=',1)
                                    ->increment('folio');
                            if($result>0){
                                DB::commit();
                                return $update;
                            } else {
                                DB::rollBack();
                                return 0;
                            }
                        }else {
                            DB::rollBack();
                            return 0;
                        }
                    }else {
                        DB::rollBack();
                        return 'No se creo el corte de caja';
                    }
                } else {
                    //CREA EL REGISTRO DE DENOMINACION CON CEROS
                    $idDenominaciones = DB::table('tpv_cortedenominaciones')->insertGetId([   
                                'id_tpv_cortecaja' => $idCorteCaja,
                                'id_sys_usuario' => $usuario,
                                'id_tpv_turno' => $turno,
                                'id_tpv_almacen' => $sucursal,
                                'folio' => $folio,
                                'fechacorte' => $fecha,
                                'totalefectivo' => $totalefectivo, 
                                'totaldebito' =>$totaldebito,
                                'totalcredito' =>$totalcredito,
                                'totaltransferencia' =>$totaltransferencia,
                                'totaldeposito' =>$totaldeposito,
                                'totales' => $totales,
                                'timestamp' => date('Y-m-d')." ".date('H:i:s'),
                                'status' => 1]);
                                
                    if($idDenominaciones>0) {
                        $result = DB::table('tpv_folio')
                                ->where('id_sys_usuario','=',$usuario)
                                ->where('id_tpv_turno','=',$turno)
                                ->where('id_tpv_almacen', $sucursal)
                                ->where('id_cat_operacion','=',11)
                                ->where('status','=',1)
                                ->increment('folio');
                        if($result>0){
                            DB::commit();
                            return $idCorteCaja;
                        } else {
                            DB::rollBack();
                            return 0;
                        }
                    } else {
                        DB::rollBack();
                        return 'No se creo el registro con denominaciones cero';
                    }  
                }
            }
        } else {
            DB::rollBack();
            return 'No puedes crear el corte porque no has cerrado el almacen en turno';
        }
    }

    public function quitarBaucher($id) {
        DB::beginTransaction();
        
        $result = DB::table('tpv_cortedenominacionesdetalle')
                    ->where('id', $id)
                    ->first();

        $delete = DB::table('tpv_cortedenominacionesdetalle')
                    ->where('id', $id)
                    ->delete();

        if($delete>0) {
            DB::commit();
            $getBauchers = DB::table('tpv_cortedenominacionesdetalle')
                                ->where('id_tpv_cortedenominaciones', $result->id_tpv_cortedenominaciones)
                                ->where('id_sat_formapago', $result->id_sat_formapago)
                                ->get();
            return $getBauchers;
        }else {
            DB::rollBack();
            return 0;
        }
    }

    public function enviarValidacion($usuario, $turno, $almacen, $folio, $fecha, $cuentacontable, $banco, $cuentabancaria, $solicita, $fechatransferencia, $bancotransferencia, $cantidadtransferencia, $referenciatransferencia, $conceptotransferencia, $cliente) {
        DB::beginTransaction();
        
        $idValidacion = DB::table('tpv_validaciones')->insertGetId([   
            'id_sys_usuario' => $usuario,
            'id_tpv_turno' => $turno,
            'id_tpv_almacen' => $almacen,
            'folio' => $folio,
            'fecha' => $fecha,
            'banco' => $banco,
            'cuentabancaria' => $cuentabancaria,
            'cuentacontable' => $cuentacontable,
            'solicita' => $solicita,
            'fechatransferencia' => $fechatransferencia,
            'id_sat_banco' => $bancotransferencia,
            'cantidadtransferencia' => $cantidadtransferencia,
            'referenciatransferencia' => $referenciatransferencia,
            'conceptotransferencia' => $conceptotransferencia,
            'cliente' => $cliente
        ]);

        if($idValidacion>0) {
            $result = DB::table('tpv_folio')
                    ->where('id_sys_usuario','=',$usuario)
                    ->where('id_tpv_turno','=',$turno)
                    ->where('id_tpv_almacen', $almacen)
                    ->where('id_cat_operacion','=',12)
                    ->where('status','=',1)
                    ->increment('folio');
            if($result>0){
                DB::commit();
                return $idValidacion;
            } else {
                DB::rollBack();
                return 0;
            }
        }else {
            DB::rollBack();
            return 0;
        }
    }

    public function getAnticiposCorte($usuario,$turno,$fecha,$sucursal) {
        //dd($usuario,$turno,$fecha,$sucursal);
        $result = DB::table('con_cxcanticipo')
                    ->select(DB::raw('con_cxcanticipo.*, sys_persona.nombre as cliente, sat_formapago.descripcion as formapago, tpv_almacen.descripcion as sucursal,tpv_turno.descripcion as turno'))
                    ->join('tpv_cliente', 'con_cxcanticipo.id_tpv_cliente', '=', 'tpv_cliente.id')
                    ->join('sys_persona', 'tpv_cliente.id_sys_persona', '=', 'sys_persona.id')
                    ->join('sat_formapago', 'con_cxcanticipo.id_sat_formapago', '=', 'sat_formapago.id')
                    ->join('tpv_almacen', 'con_cxcanticipo.id_tpv_almacen', '=', 'tpv_almacen.id')
                    ->join('tpv_turno','con_cxcanticipo.id_tpv_turno','=','tpv_turno.id')
                    //->where('con_cxcanticipo.id_sys_usuario','=',$usuario)
                    //->where('con_cxcanticipo.id_tpv_turno','=',$turno)
                    ->where('con_cxcanticipo.id_tpv_almacen', $sucursal)
                    ->where('con_cxcanticipo.fecha','=',$fecha)
                    ->whereIn('con_cxcanticipo.status', [1,2])
                    ->get();
                    
        return $result;
    }

    public function subirBaucher($usuario, $turno, $folio, $id, $fecha, $terminacion, $aprobacion, $total, $tipo, $sucursal) {
        //dd($usuario, $turno, $folio, $id, $fecha, $terminacion, $aprobacion, $total);
        DB::beginTransaction();
        
        $isExist = DB::table('fin_bauchers')
                    ->where("id_pago", $id)
                    ->exists();

        //dd($isExist, $usuario, $turno, $folio, $id, $fecha, $terminacion, $aprobacion, $total, $tipo, $sucursal);
        if($isExist) {
            $update = DB::table('fin_bauchers')
                        ->where('id_pago','=',$id)
                        ->update(['id_sys_usuario'=> $usuario,
                                'id_tpv_turno'=> $turno,
                                'id_tpv_almacen' => $sucursal,
                                'folio_pedido'=> $folio,
                                'fecha'=> $fecha,
                                'hora'=> date('H:i:s'),
                                'terminacion'=> $terminacion,
                                'tipotarjeta'=> $tipo,
                                'aprobacion'=> $aprobacion,
                                'total'=> $total,
                                'timestamp'=>date('Y-m-d')." ".date('H:i:s')]);
            if($update>0) {
                DB::commit();
                return $update;
            } else {
                DB::rollBack();
                return 'Detalle al actualizar el baucher de la venta. Si el problema persiste, comuniquese con el administrador del sistema.';
            }
        } else {
            $idBaucher = DB::table('fin_bauchers')->insertGetId([  
                'id_pago' => $id, 
                'id_sys_usuario' => $usuario,
                'id_tpv_turno' => $turno,
                'id_tpv_almacen' => $sucursal,
                'folio_pedido' => $folio,
                'fecha' => $fecha,
                'hora' => date('H:i:s'),
                'tipotarjeta'=> $tipo,
                'terminacion' => $terminacion,
                'aprobacion' => $aprobacion,
                'total' => $total
            ]);
    
            if($idBaucher>0) {
                DB::commit();
                return $idBaucher;
            } else {
                DB::rollBack();
                return 'Detalle al registrar el baucher de la venta. Si el problema persiste, comuniquese con el administrador del sistema.';
            }
        }
    }

    public function getBaucherVenta($id) {
        $result = DB::table('fin_bauchers')
                ->select(DB::raw('fin_bauchers.*'))
                ->where('fin_bauchers.id_tpv_pedido', $id)
                ->where('fin_bauchers.status','=',1)
                ->first();
                
        return $result;
    }

    public function subirRecibo($usuario, $turno, $folio, $id, $fecha, $banco, $cuenta, $total) {
        DB::beginTransaction();

        $isExist = DB::table('fin_recibos')
                    ->where("id_tpv_caja", $id)
                    ->exists();
        if($isExist) {
            $update = DB::table('fin_recibos')
                        ->where('id_tpv_caja','=',$id)
                        ->update(['id_sys_usuario'=> $usuario,
                                'id_tpv_turno'=> $turno,
                                'folio'=> $folio,
                                'fecha'=> $fecha,
                                'hora'=> date('H:i:s'),
                                'banco'=> $banco,
                                'cuentabancaria'=> $cuenta,
                                'total'=> $total,
                                'timestamp'=>date('Y-m-d')." ".date('H:i:s')]);
            if($update>0) {
                DB::commit();
                return $update;
            } else {
                DB::rollBack();
                return 'Detalle al actualizar el recibo de desposito bancario. Si el problema persiste, comuniquese con el administrador del sistema.';
            }
        } else {
            $idRecibo = DB::table('fin_recibos')->insertGetId([  
                'id_tpv_caja' => $id, 
                'id_sys_usuario' => $usuario,
                'id_tpv_turno' => $turno,
                'folio' => $folio,
                'fecha' => $fecha,
                'hora' => date('H:i:s'),
                'banco'=> $banco,
                'cuentabancaria'=> $cuenta,
                'total'=> $total
            ]);
    
            if($idRecibo>0) {
                DB::commit();
                return $idRecibo;
            } else {
                DB::rollBack();
                return 'Detalle al registrar el recibo de desposito bancario. Si el problema persiste, comuniquese con el administrador del sistema.';
            }
        }
    }

    public function getReciboDeposito($id) {
        $result = DB::table('fin_recibos')
                ->select(DB::raw('fin_recibos.*'))
                ->where('fin_recibos.id_tpv_caja', $id)
                ->where('fin_recibos.status','=',1)
                ->first();
        
        return $result;
    }

    public function validaTodasRemisionesCobradas($idAlmacen, $fecha) {
        $result = DB::table('tpv_pedido')
                ->where('tpv_pedido.id_tpv_almacen', $idAlmacen)
                ->where('tpv_pedido.fecha','=',$fecha)
                ->where('tpv_pedido.status','=',1)
                ->count();
        //dd($result);
        return $result;
    }

    public function validaIngresos($idAlmacen, $fecha) {
        $ventas = DB::table('tpv_pedido')
                    ->join('tpv_pedidoformapago', 'tpv_pedidoformapago.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('tpv_pedido.id_tpv_almacen', $idAlmacen)
                    ->where('tpv_pedidoformapago.fecha','=',$fecha)
                    ->where('tpv_pedidoformapago.id_sat_formapago','01')
                    ->whereIn('tpv_pedido.status', [1,2,3,13,14])
                    ->sum('tpv_pedidoformapago.monto');
        
        $pagos = DB::table('con_cxcpago')
                    ->where('con_cxcpago.id_tpv_almacen', $idAlmacen)
                    ->where('con_cxcpago.fecha','=',$fecha)
                    ->where('con_cxcpago.id_sat_formapago','01')
                    ->whereIn('con_cxcpago.status', [1])
                    ->sum('con_cxcpago.total');

        $ingresoCaja = DB::table('tpv_caja')
                    ->where('tpv_caja.id_tpv_almacen', $idAlmacen)
                    ->where('tpv_caja.fecha','=',$fecha)
                    ->where('tpv_caja.id_cat_cajamovimiento', 3)
                    ->whereIn('tpv_caja.status', [1])
                    ->sum('tpv_caja.monto');

        $anticipos = DB::table('con_cxcanticipo')
                    ->where('con_cxcanticipo.id_tpv_almacen', $idAlmacen)
                    ->where('con_cxcanticipo.fecha','=',$fecha)
                    ->where('con_cxcanticipo.id_sat_formapago','01')
                    ->whereIn('con_cxcanticipo.status', [1])
                    ->sum('con_cxcanticipo.monto');

        $abonosApartados = DB::table('tpv_apartadoabonos')
                    ->join('tpv_pedido', 'tpv_apartadoabonos.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->join('tpv_pedidoformapago', 'tpv_pedidoformapago.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('tpv_apartadoabonos.id_tpv_almacen', $idAlmacen)
                    ->where('tpv_pedidoformapago.fecha','=',$fecha)
                    ->where('tpv_pedidoformapago.id_sat_formapago','01')
                    ->whereIn('tpv_apartadoabonos.status', [1])
                    ->sum('tpv_apartadoabonos.cantidadabono');
        //dd($ventas, $pagos, $ingresoCaja, $anticipos, $abonosApartados);
        return ($ventas+$pagos+$ingresoCaja+$anticipos+$abonosApartados);

    }

    public function validaIngresosTurno($idAlmacen, $usuario, $turno, $fechaini, $horaini) {
        $ventas = DB::table('tpv_pedido')
                    ->join('tpv_pedidoformapago', 'tpv_pedidoformapago.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('tpv_pedido.id_tpv_almacen', $idAlmacen)
                    ->whereRaw("tpv_pedidoformapago.fecha>='".$fechaini."'")
                    ->whereRaw("tpv_pedidoformapago.hora>='".$horaini."'")
                    ->where('tpv_pedido.id_sys_usuario',$usuario)
                    ->where('tpv_pedido.id_tpv_turno',$turno)
                    ->where('tpv_pedidoformapago.id_sat_formapago','01')
                    ->whereIn('tpv_pedido.status', [1,2,3,13,14])
                    ->sum('tpv_pedido.total');
                
        $pagos = DB::table('con_cxcpago')
                    ->where('con_cxcpago.id_tpv_almacen', $idAlmacen)
                    ->whereRaw("con_cxcpago.fecha>='".$fechaini."'")
                    ->whereRaw("con_cxcpago.hora>='".$horaini."'")
                    ->where('con_cxcpago.id_sys_usuario',$usuario)
                    ->where('con_cxcpago.id_tpv_turno',$turno)
                    ->where('con_cxcpago.id_sat_formapago','01')
                    ->whereIn('con_cxcpago.status', [1])
                    ->sum('con_cxcpago.total');

        $ingresoCaja = DB::table('tpv_caja')
                    ->where('tpv_caja.id_tpv_almacen', $idAlmacen)
                    ->whereRaw("tpv_caja.fecha>='".$fechaini."'")
                    ->whereRaw("tpv_caja.hora>='".$horaini."'")
                    ->where('tpv_caja.id_sys_usuario',$usuario)
                    ->where('tpv_caja.id_tpv_turno',$turno)
                    ->where('tpv_caja.id_cat_cajamovimiento', 3)
                    ->whereIn('tpv_caja.status', [1])
                    ->sum('tpv_caja.monto');

        $anticipos = DB::table('con_cxcanticipo')
                    ->where('con_cxcanticipo.id_tpv_almacen', $idAlmacen)
                    ->whereRaw("con_cxcanticipo.fecha>='".$fechaini."'")
                    ->whereRaw("con_cxcanticipo.hora>='".$horaini."'")
                    ->where('con_cxcanticipo.id_sys_usuario',$usuario)
                    ->where('con_cxcanticipo.id_tpv_turno',$turno)
                    ->where('con_cxcanticipo.id_sat_formapago','01')
                    ->whereIn('con_cxcanticipo.status', [1])
                    ->sum('con_cxcanticipo.monto');

        $abonosApartados = DB::table('tpv_apartadoabonos')
                    ->join('tpv_pedido', 'tpv_apartadoabonos.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->join('tpv_pedidoformapago', 'tpv_pedidoformapago.id_tpv_pedido', '=', 'tpv_pedido.id')
                    ->where('tpv_apartadoabonos.id_tpv_almacen', $idAlmacen)
                    ->whereRaw("tpv_pedidoformapago.fecha>='".$fechaini."'")
                    ->whereRaw("tpv_pedidoformapago.hora>='".$horaini."'")
                    ->where('tpv_pedido.id_sys_usuario',$usuario)
                    ->where('tpv_pedido.id_tpv_turno',$turno)
                    ->where('tpv_pedidoformapago.id_sat_formapago','01')
                    ->whereIn('tpv_apartadoabonos.status', [1])
                    ->sum('tpv_apartadoabonos.cantidadabono');
        
        return ($ventas+$pagos+$ingresoCaja+$anticipos+$abonosApartados);

    }

    public function getInfoFactura($id) {
        $result = DB::table('tpv_factura')
                ->where('id_tpv_pedido', $id)
                ->first();
        return $result;
    }

    public function getInfoFG($id) {
        $result = DB::table('tpv_facturapedido')
                ->where('id_tpv_pedido', $id)
                ->first();
        return $result;
    }


    public function foliosVentas($idalmacen, $fecha, $nameCarpeta) {
        $ventas = DB::table('tpv_pedido')
                ->select(DB::raw("tpv_pedido.id, 'VENTA' as operacion, tpv_pedido.serie, tpv_pedido.folio, tpv_pedidoformapago.id_sat_formapago"))
                ->join('tpv_pedidoformapago','tpv_pedido.id','=','tpv_pedidoformapago.id_tpv_pedido')
                ->where('tpv_pedido.fecha', $fecha)
                ->where('tpv_pedido.id_tpv_almacen', $idalmacen)
                ->whereIn('tpv_pedidoformapago.id_sat_formapago', ["28", "04", "101"])
                ->whereIn('tpv_pedido.status', [2,3]);

        $pagos = DB::table('con_cxcpago')
                ->select(DB::raw("con_cxcpago.id, 'PAGO' as operacion, '' as serie, con_cxcpago.folio, con_cxcpago.id_sat_formapago"))
                ->where('con_cxcpago.fecha', $fecha)
                ->where('con_cxcpago.id_tpv_almacen', $idalmacen)
                ->whereIn('con_cxcpago.id_sat_formapago', ["28", "04"])
                ->whereIn('con_cxcpago.status', [1]);

        $unionResult = $ventas->union($pagos)->get();    
        //dd($idalmacen, $fecha, $unionResult);
        $arrayFinal = [];
        foreach($unionResult as $baucher) {
            if($baucher->serie=='')
                $folio = $baucher->folio;
            else
                $folio = $baucher->serie.'-'.$baucher->folio;
            if (!file_exists('../imagenes/bauchers_venta/'.$nameCarpeta.'/'.$folio.'.jpg')) {
                //dd('../naercriserp/imagenes/bauchers_venta/'.$nameCarpeta.'/'.$baucher->serie.'-'.$baucher->folio.'.jpg');
                array_push($arrayFinal, $baucher);
            }
        }
        return $arrayFinal;
    }

    public function confirmarEliminarValidacion($usuario, $turno, $id) {
        //dd($usuario, $turno, $id);
        DB::beginTransaction();

        $vali = DB::table('tpv_validaciones')
                    ->where("id", $id)
                    ->first();
        //dd($vali);
        if($vali->status == 1) {
            $update = DB::table('tpv_validaciones')
                        ->where('id','=',$id)
                        ->update(['fechacancelacion' => date("Y-m-d"),
                                'id_sys_usuario_cancelo' => $usuario,
                                'motivocancelacion' => "SE REGISTRO INCORRECTAMENTE",
                                'status'=> 99,
                                'timestamp'=>date('Y-m-d')." ".date('H:i:s')]);
            if($update>0) {
                DB::commit();
                return $update;
            } else {
                DB::rollBack();
                return 'Detalle al eliminar la validación, comuniquese con el administrador del sistema.';
            }
        } else {
            DB::rollBack();
            return 'No puedes eliminar una validacion validada o rechazada. Si el problema persiste, comuniquese con el administrador del sistema.';
        }
    }

    public function confirmarEliminarMovimiento($usuario, $turno, $id) {
        DB::beginTransaction();

        $vali = DB::table('tpv_caja')
                    ->where("id", $id)
                    ->first();
        //dd($vali);
        if($vali->status == 1) {
            $update = DB::table('tpv_caja')
                        ->where('id','=',$id)
                        ->update(['status'=> 99,
                                'timestamp'=>date('Y-m-d')." ".date('H:i:s')]);
            if($update>0) {
                DB::commit();
                return $update;
            } else {
                DB::rollBack();
                return 'Detalle al eliminar el movimiento de caja, comuniquese con el administrador del sistema.';
            }
        } else {
            DB::rollBack();
            return 'No puedes eliminar el movimiento de caja. Si el problema persiste, comuniquese con el administrador del sistema.';
        }
    }

    public function getDocumentosTransferencia($dbnomina) {
        $ventas = DB::table('tpv_pedido')
                ->select(DB::raw("tpv_pedido.id, 'VENTA' as operacion, tpv_pedido.serie, tpv_pedido.folio, tpv_pedidoformapago.id_sat_formapago, tpv_pedido.fecha,
                                tpv_almacen.descripcion as sucursal, 'VENTA' as operacion, pempleado.nombre as usuario, tpv_pedidoformapago.monto, 
                                'tpv_pedido' as nametable, sys_persona.nombre as cliente"))
                ->join('tpv_pedidoformapago','tpv_pedido.id','=','tpv_pedidoformapago.id_tpv_pedido')
                ->join('tpv_almacen','tpv_pedido.id_tpv_almacen','=','tpv_almacen.id')
                ->join($dbnomina.'.pempleado','tpv_pedido.id_sys_usuario','=','pempleado.nip')
                ->join('tpv_cliente','tpv_pedido.id_tpv_cliente','=','tpv_cliente.id')
                ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                ->whereIn('tpv_pedidoformapago.id_sat_formapago', ["03", "101"])
                ->whereIn('tpv_pedido.status', [2,3]);

        $pagos = DB::table('con_cxcrecibo')
                ->select(DB::raw("con_cxcpago.id, 'PAGO' as operacion, '' as serie, con_cxcpago.folio, con_cxcpago.id_sat_formapago, con_cxcpago.fecha, tpv_almacen.descripcion as sucursal,
                                'PAGO' as operacion, pempleado.nombre as usuario, SUM(con_cxcrecibo.importepagado) as monto, 'con_cxcpago' as nametable, sys_persona.nombre as cliente"))
                ->join('con_cxcpago','con_cxcrecibo.id_con_cxcpago','=','con_cxcpago.id')
                ->join('tpv_almacen','con_cxcpago.id_tpv_almacen','=','tpv_almacen.id')
                ->join($dbnomina.'.pempleado','con_cxcpago.id_sys_usuario','=','pempleado.nip')
                ->join('tpv_cliente','con_cxcpago.id_tpv_cliente','=','tpv_cliente.id')
                ->join('sys_persona','tpv_cliente.id_sys_persona','=','sys_persona.id')
                ->whereIn('con_cxcrecibo.id_sat_formapago', ["03", "101"])
                ->whereIn('con_cxcrecibo.status', [1])
                ->groupBy('con_cxcrecibo.id_con_cxcpago');

        $unionResult = $ventas->union($pagos)->orderBy("fecha")->get();    
        //dd($unionResult);
        $arrayLista = array();
        foreach ($unionResult as $key => $value) {
            $exist = DB::table('tpv_validaciones')
                        ->where('tpv_validaciones.nametable', $value->nametable)
                        ->where('tpv_validaciones.idtable', $value->id)
                        ->exists();
            if(!$exist) 
                array_push($arrayLista, $value);
            //dd($exist);
        }
        return $arrayLista;
    }

    public function confirmarOperacionSeleccionada($idValidacion, $id, $operacion, $usuario) {
        DB::beginTransaction();
        if($operacion=="VENTA")
            $nameTable = "tpv_pedido";
        else if($operacion=="PAGO")
            $nameTable = "con_cxcpago";
        else {
            DB::rollBack();
            return 'La operacion seleccionada no existe, comuniquese con el administrador del sistema.';
        }

        $update = DB::table('tpv_validaciones')
                    ->where('id', $idValidacion)
                    ->update(['nametable'=>$nameTable, 'idtable' =>$id, 'fecha_aplico'=>date("Y-m-d"), 'id_sys_usuario_aplico'=>$usuario]);
        //dd($update);
        if($update>0) {
            DB::commit();
            return $update;
        }else {
            DB::rollBack();
            return 'Detalle al aplicar la operación a la validación de la transferencia.';
        }
    }     

    public function getMontoAbonoVirtual($idpedido) {
        $result = DB::table('con_cxcanticipo')
                    ->where('id_tpv_pedido',$idpedido)
                    ->where('id_sat_formapago','201')
                    ->sum('monto');
        return $result;
    }     

    public function getAnticipos($id) {
        $result = DB::table('con_cxcanticipo')
                ->where('id_tpv_pedido', $id)
                ->whereRaw("uuid<>''")
                ->get();
        
        return $result;
    }            

    public function getPagoNoVirtual($idpedido) {
        $result = DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido',$idpedido)
                    ->where('id_sat_formapago','<>','30')
                    ->orderBy('monto','desc')
                    ->first();
        return $result;
    } 

    public function getAnticipoRemanente($id) {
        $result = DB::table('con_cxcanticipo')
                ->where('id_tpv_pedido_origen', $id)
                ->where("uuid","")
                ->first();
        
        return $result;
    }  

    public function chkAbonoVirtual($id) {
        $result = DB::table('tpv_pedidoformapago')
                    ->where('id_tpv_pedido',$id)
                    ->groupBy('id_sat_formapago')
                    ->get();
        if(isset($result[0])){
            $cant = 0;
            $formapago = '';
            foreach($result as $fp){
                $cant++;
                $formapago = $fp->id_sat_formapago;
            }
            if($cant==1 && $formapago=='30'){
                $result2 = DB::table('con_cxcanticipo')
                    ->where('id_tpv_pedido',$id)
                    ->groupBy('id_sat_formapago')
                    ->get();
                $cant2 = 0;
                $formapago2 = '';
                foreach($result2 as $fp2){
                    $cant2++;
                    $formapago2 = $fp2->id_sat_formapago;
                }
                if($cant2==1 && $formapago2=='201'){
                    return 1;
                }else{
                    return 0;
                }
            }else{
                return 0;
            }
        }else{
            return 'Problemas al obtener las formas de pago de la venta.';
        }
    }

    public function getCtaCaja($id) {
        $result = DB::table('con_centrocosto')
                    ->select(DB::raw("con_centrocosto.*"))
                    ->join('tpv_almacen','tpv_almacen.id_con_centrocosto','=','con_centrocosto.id')
                    ->where('tpv_almacen.id', $id)
                    ->first();
        
        return $result;
    }
}
?>