<?php

namespace App\Http\Controllers\Tesoreria;

use App\Model\Matricula;
use App\Model\Mora;
use App\Model\NumeroSerie;
use App\Model\Recibo;
use App\Model\ReciboDetalle;
use App\Model\TramiteProcedimiento;
use App\Model\TramiteRequisito;
use App\Model\TramiteUsuario;
use App\Model\TurnoCaja;
use App\Model\User;
use App\Model\Voucher;
use App\Participante;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;
use Maatwebsite\Excel\Facades\Excel;
use Mockery\Exception;
use Yajra\Datatables\Datatables;

class PagoController extends Controller
{
    public function getIndex()
    {
        $date = Carbon::now()->format('Y-m-d');

        $cierrecajarealizado = DB::table('cierre_caja')
            ->where(DB::raw("DATE(cierre_caja.created_at)"),'=',$date)->count('cierre_caja.id');

        return view('pages.tesoreria.pagos.index',compact('cierrecajarealizado'));
    }
    public function validateUser(Request $request) {
        try {
            $model = new User();
            $usuario = $model->where('username','=', $request['code'])->first();
            if (!$usuario) {
                return response()->json('false');
            }
            return response()->json('true');
        } catch (\Exception $e) {
            return response()->json('false');
        }
    }
    public function getRegistrarTramite($id)
    {
        try {
            return view('pages.tesoreria.pagos.partials.tramite', compact('id'));
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }
    public function getTramitesDisponibles(Request $request)
    {
        try
        {
            $username = $request->input('id_usuario');
            $user = User::where('username', $username)->first();

            $id_rol = $user->roles->pluck('id');

            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->tramite_procedimiento()
                ->orderBy('tramite_procedimiento.id_tramite_categoria', 'ASC')
                ->where('tramite_procedimiento.id_tramite_estado', '=', config('constants.TRAMITE_ESTADO_ID.ACTIVO'))
                ->whereIn('tramite_rol.id_rol', $id_rol)
                ->get();

            return Datatables::of($tramiteProcedimiento)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }
    public function postRegistrarTramite(Request $request)
    {
        try
        {
            $username = $request->input('id_usuario');
            $user = User::where(['username'=>$username])->first();
            $monto_pagar = TramiteRequisito::where('id_tramite_procedimiento', '=',  $request->input('id_tramite_procedimiento'))->sum('tramitacion_soles');

            $model = new TramiteUsuario();
            $tramiteUsuario = $model->create([
                "id_dependencia" => $request->input('id_dependencia'),
                "id_tramite_procedimiento" => $request->input('id_tramite_procedimiento'),
                "id_tramite_usuario_estado" => 1,
                "id_usuario" => $user->id,
                "id_recibo" => null,
                "monto_pagar" => $monto_pagar
            ]);
            return response()->json($tramiteUsuario);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function getPagosTramites(Request $request)
    {
        try {
            $usuario = User::where('username','=',$request['code'])->first();

            $tramites = TramiteUsuario::join('tramite_procedimiento', 'tramite_usuario.id_tramite_procedimiento', '=','tramite_procedimiento.id')
                ->join('usuario', 'usuario.id', '=', 'tramite_usuario.id_usuario')
                ->leftJoin('tramite_requisito', 'tramite_requisito.id_tramite_procedimiento', '=', 'tramite_procedimiento.id')
                ->where('tramite_usuario.id_usuario', '=', $usuario->id)
                ->where(function ($query) {
                    $query->where('tramite_usuario.id_tramite_usuario_estado', '=', 1)
                        ->orWhere('tramite_usuario.deuda', '=', true);
                })
                ->select(
                    'tramite_usuario.id',
                    'usuario.username',
                    'tramite_procedimiento.nombre',
                    'tramite_usuario.monto_pagar as montopagar',
                    DB::raw('(tramite_usuario.monto_pagar - tramite_usuario.monto_pagado) as montodeuda'),
                    'tramite_usuario.deuda'
                )->orderBy('tramite_usuario.id_tramite_procedimiento')
                ->groupBy('tramite_usuario.id_tramite_procedimiento', 'tramite_usuario.id', 'tramite_procedimiento.nombre', 'usuario.username')
                ->get();

            return Datatables::of($tramites)->make(true);
        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }
    }
    public function getPagosBiblioteca(Request $request)
    {
        try {
            $usuario_id = User::where('username','=',$request['code'])->first()->id;
            $model = new Mora();

            $biblioteca = $model->join('prestamo', function($q) use ($usuario_id) {
                $q->on('prestamo.id', '=', 'mora.id_prestamo')
                    ->where('prestamo.id_usuario', '=', $usuario_id);
            })
                ->join('usuario', 'usuario.id', '=', 'prestamo.id_usuario')
                ->where('mora.cancelado', '=', '0')
                ->select(
                    'mora.id',
                    'usuario.username',
                    'prestamo.id as codigo',
                    'prestamo.fecha_inicio',
                    'prestamo.fecha_devolucion',
                    'mora.monto'
                )
                ->get();
            return Datatables::of($biblioteca)->make(true);
        } catch (\Exception $e) {
            return json_encode([
                "sEcho" => 1,
                "iTotalRecords" => 0,
                "iTotalDisplayRecords" => 0,
                "aaData" => []
            ]);
        }
    }

    public function postPagosTramites(Request $request)
    {
        try {
            if (!$request->id) {
                Alert()->error('Debe seleccionar por lo menos un trámite.', 'No selecciono un trámite')->persistent('Ok');
                return redirect('tesoreria/pagos');
            }
            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
//                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();
            if(!$turnocaja){
                Alert()->error('Debe aperturar una caja primero para realizar pagos.', 'No existe caja aperturada')->persistent('Ok');
                return redirect('tesoreria/pagos');
            }
            $numeroserie = NumeroSerie::find($turnocaja->id_serie);

        $ids = $request->id;
        $conceptos = TramiteUsuario::join('tramite_procedimiento', 'tramite_usuario.id_tramite_procedimiento', 'tramite_procedimiento.id')
            ->join('usuario', 'usuario.id', '=', 'tramite_usuario.id_usuario')
            ->whereIn('tramite_usuario.id', $ids)
            ->orderBy('tramite_usuario.id_tramite_procedimiento')
            ->groupBy('tramite_usuario.id_tramite_procedimiento', 'tramite_usuario.id')
            ->select(
                'tramite_usuario.id as id',
                'tramite_procedimiento.nombre as concepto',
                'tramite_usuario.monto_pagar as monto',
                DB::raw('(tramite_usuario.monto_pagar - tramite_usuario.monto_pagado) as montodeuda'),
                'usuario.id as id_usuario',
                'usuario.username as username',
                'usuario.dni as dni',
                DB::raw('CONCAT(usuario.nombres," ",usuario.apellido_paterno," ",usuario.apellido_materno) as nombres')
            )->get();
//        dd($conceptos);
        $usuario["nombre"] = $conceptos->pluck('nombres')->first();
        $usuario["username"] = $conceptos->pluck('username')->first();
        $usuario["dni"] = $conceptos->pluck('dni')->first();
        $usuario["id"] = $conceptos->pluck('id_usuario')->first();
        $montos = $conceptos->pluck('montodeuda');
        $total = 0.0;
        foreach ($montos as $monto) {
            $total += $monto;
        }

        $model_recibo = new Recibo();
        $numboleta1 = str_pad($numeroserie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
        $numboleta2 = str_pad($numeroserie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);

        $recibo = $model_recibo->create([
            'numero' => $numboleta1.' - '.$numboleta2,
            'anulado' => false,
            'dni' =>  $usuario["dni"],
            'nombre_cliente' => $usuario["nombre"],
            'monto' => $total,
            'tipo_recibo' => config('constants.TIPO_RECIBO.TRAMITEMORA'),
            'id_turno' => $turnocaja->id,
            'id_cliente' =>  $usuario["id"],
            'id_tesorero' => Auth::user()->id
        ]);

        $model_detalle = new ReciboDetalle();
        foreach ($conceptos as $concepto) {
            $detalle = [
                'concepto' => $concepto->concepto,
                'monto' => $concepto->montodeuda,
                'id_recibo' => $recibo->id,
                'tipo' => config('constants.TIPO_CONCEPTO.TRAMITE'),
                'id_tramite_usuario' => $concepto->id
            ];
            $model_detalle->create($detalle);
        }

        return redirect('tesoreria/pagos/recibo/'.$recibo->id);
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }
    public function postPagosBiblioteca(Request $request)
    {
        try {
            if (!$request->id) {
                Alert()->error('Debe seleccionar por lo menos un trámite.', 'No selecciono un trámite')->persistent('Ok');
                return redirect('tesoreria/pagos');
            }
            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
//                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();
            if(!$turnocaja){
                Alert()->error('Debe aperturar una caja primero para realizar pagos.', 'No existe caja aperturada')->persistent('Ok');
                return redirect('tesoreria/pagos');
            }
            $numeroserie = NumeroSerie::find($turnocaja->id_serie);

            $ids = $request->id;
            $conceptos = Mora::Join('prestamo', 'mora.id_prestamo', 'prestamo.id')
                ->join('usuario', 'usuario.id', 'prestamo.id_usuario')
                ->select(
                    'mora.id as id',
                    DB::raw('"Prestamo biblioteca" as concepto'),
                    'mora.monto as monto',
                    'usuario.id as id_usuario',
                    'usuario.dni as dni',
                    'usuario.username as username',
                    DB::raw('CONCAT(usuario.nombres," ",usuario.apellido_paterno," ",usuario.apellido_materno) as nombres')
                )->whereIn('mora.id', $ids)
                ->get();

            $usuario["nombre"] = $conceptos->pluck('nombres')->first();
            $usuario["username"] = $conceptos->pluck('username')->first();
            $usuario["dni"] = $conceptos->pluck('dni')->first();
            $usuario["id"] = $conceptos->pluck('id_usuario')->first();
            $montos = $conceptos->pluck('monto');
            $total = 0.0;
            foreach ($montos as $monto) {
                $total += $monto;
            }
            $model_recibo = new Recibo();
            $numboleta1 = str_pad($numeroserie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
            $numboleta2 = str_pad($numeroserie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);

            $recibo = $model_recibo->create([
                'numero' => $numboleta1.' - '.$numboleta2,
                'anulado' => false,
                'dni' =>  $usuario["dni"],
                'nombre_cliente' => $usuario["nombre"],
                'monto' => $total,
                'tipo_recibo' => config('constants.TIPO_RECIBO.TRAMITEMORA'),
                'id_turno' => $turnocaja->id,
                'id_cliente' =>  $usuario["id"],
                'id_tesorero' => Auth::user()->id
            ]);

            $model_detalle = new ReciboDetalle();
            foreach ($conceptos as $concepto) {
                $detalle = [
                    'concepto' => $concepto->concepto,
                    'monto' => $concepto->monto,
                    'id_recibo' => $recibo->id,
                    'tipo' => config('constants.TIPO_CONCEPTO.MORA'),
                    'id_mora' => $concepto->id
                ];
                $model_detalle->create($detalle);
            }

            return redirect('tesoreria/pagos/recibo/'.$recibo->id);
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }
    public function postPagosOtros(Request $request) {
        try {
            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
//                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();
            if(!$turnocaja){
                Alert()->error('Debe aperturar una caja primero para realizar pagos.', 'No existe caja aperturada')->persistent('Ok');
                return redirect('tesoreria/pagos');
            }
            $numeroserie = NumeroSerie::find($turnocaja->id_serie);
            $usuario = User::where('username','=',$request->usuario)->first();

            $model_recibo = new Recibo();
            $numboleta1 = str_pad($numeroserie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
            $numboleta2 = str_pad($numeroserie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);

            $recibo = $model_recibo->create([
                'numero' => $numboleta1.' - '.$numboleta2,
                'anulado' => false,
                'dni' => $usuario->dni,
                'nombre_cliente' => $usuario->nombres." ".$usuario->apellido_paterno." ".$usuario->apellido_materno,
                'tipo_recibo' => config('constants.TIPO_RECIBO.OTROS'),
                'monto' => 0,
                'id_turno' => $turnocaja->id,
                'id_cliente' =>  $usuario->id,
                'id_tesorero' => Auth::user()->id
            ]);
            return redirect('tesoreria/pagos/recibo/'.$recibo->id);
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }

    public function postPagoExterno() {
        try {
            $turnocaja = TurnoCaja::where('id_usuario', '=', Auth::user()->id)
                ->where('estado','=',config('constants.TURNO_ESTADO.ACTIVO'))
                ->whereDate('created_at', '=', Carbon::today()->toDateString())
                ->first();
            if(!$turnocaja){
                Alert()->error('Debe aperturar una caja primero para realizar pagos.', 'No existe caja aperturada')->persistent('Ok');
                return redirect('tesoreria/pagos');
            }
            $numeroserie = NumeroSerie::find($turnocaja->id_serie);

            $model_recibo = new Recibo();
            $numboleta1 = str_pad($numeroserie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
            $numboleta2 = str_pad($numeroserie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);

            $recibo = $model_recibo->create([
                'numero' => $numboleta1.' - '.$numboleta2,
                'anulado' => false,
                'dni' => '',
                'nombre_cliente' => '',
                'tipo_recibo' => config('constants.TIPO_RECIBO.EXTERNO'),
                'monto' => 0,
                'id_turno' => $turnocaja->id,
                'id_tesorero' => Auth::user()->id
            ]);
            return redirect('tesoreria/pagos/recibo/'.$recibo->id);
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }

    public function getRecibo($id)
    {
        try {
            $recibo = Recibo::where('id','=',$id)->with('detalles')->with('usuario')->with('turno')->firstOrFail();

            if ($recibo->tipo_recibo == config('constants.TIPO_RECIBO.EVENTO')) {
                return redirect('tesoreria/eventos/recibo/' . $recibo->id);
            }
            if ($recibo->tipo_recibo == config('constants.TIPO_RECIBO.OTROS')) {
                return view('pages.tesoreria.pagos.recibootros',compact('recibo'));
            }
            if ($recibo->tipo_recibo == config('constants.TIPO_RECIBO.EXTERNO')) {
                return view('pages.tesoreria.pagos.reciboexterno',compact('recibo'));
            }
            return view('pages.tesoreria.pagos.recibo',compact('recibo'));
        } catch(ModelNotFoundException $e) {
            abort(404);
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }
    public function postRecibo(Request $request) {
        try {
            $recibo = Recibo::find($request['id']);
            $turno = TurnoCaja::find($recibo->id_turno);

            $recibo_excel = Recibo::where('id','=',$request->id)->with('detalles')->with('usuario')->first();

            if ($recibo->cancelado == false) {
                $serie = NumeroSerie::find($turno->id_serie);
                $numboleta1 = str_pad($serie->serie, config('constants.ZERO_SERIE'), '0', STR_PAD_LEFT);
                $numboleta2 = str_pad($serie->correlativo, config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);
                $recibo->cancelado = true;
                $recibo->numero = $numboleta1.'-'.$numboleta2;
                $recibo->metodo_pago = $request['tipo_pago'];

                if ($recibo->tipo_recibo == config('constants.TIPO_RECIBO.EXTERNO')) {
                    $recibo->dni = $request['dni'];
                    $recibo->nombre_cliente = $request['nombre'];
                }
                $recibo->save();
                $serie->correlativo = str_pad((intval($serie->correlativo)+1), config('constants.ZERO_CORRELATIVO'), '0', STR_PAD_LEFT);
                $serie->save();

                foreach ($recibo_excel->detalles as $detalle) {
                    if ($detalle->tipo == config('constants.TIPO_CONCEPTO.TRAMITE')) {

                        $tramite = TramiteUsuario::where('tramite_usuario.id', '=', $detalle->id_tramite_usuario)
                            ->select(
                                'tramite_usuario.id',
                                'tramite_usuario.monto_pagar as montopagar',
                                'tramite_usuario.monto_pagado',
                                'tramite_usuario.id_tramite_usuario_estado',
                                'tramite_usuario.id_tramite_procedimiento'
                            )->first();

                        $monto_debe = $tramite->montopagar * 1.0 - $tramite->monto_pagado * 1.0;

                        if ($tramite->id_tramite_usuario_estado == config('constants.TRAMITE_USUARIO_ESTADO_ID.SOLICITADO')) {
                            TramiteUsuario::where('id','=', $detalle->id_tramite_usuario)->update([
                                'id_recibo' => $recibo->id,
                                'id_tramite_usuario_estado' => '2',
                                'deuda' => ($monto_debe > $detalle->monto ? true : false),
                                'monto_pagado' => ( $tramite->monto_pagado + $detalle->monto )
                            ]);
                        } else {
                            TramiteUsuario::where('id','=', $detalle->id_tramite_usuario)->update([
                                'id_recibo' => $recibo->id,
                                'deuda' => ($monto_debe > $detalle->monto ? true : false),
                                'monto_pagado' => ( $tramite->monto_pagado + $detalle->monto )
                            ]);
                        }

                        if ($tramite->id_tramite_procedimiento == config('constants.TRAMITE_PROCEDIMIENTO.MATRICULA')) {
                            Matricula::where('id_tramite_usuario','=',$detalle->id_tramite_usuario)->update([
                                'pagado' => true
                            ]);
                        }
                    }
                    else if ($detalle->tipo == config('constants.TIPO_CONCEPTO.MORA')) {
                        Mora::where('mora.id', '=',$detalle->id_mora)
                            ->update([
                                'id_recibo' => $recibo->id,
                                'cancelado' => '1'
                            ]);
                    } else if ($detalle->tipo == config('constants.TIPO_CONCEPTO.EVENTO')) {
                        Participante::where('id', '=',$detalle->id_participante)
                            ->update([
                                'pagado' => '1'
                            ]);
                    }
                }
            }
            $recibo = Recibo::where('id','=',$request['id'])->with('detalles')->first();
            return view('pages.tesoreria.pagos.boleta',compact('recibo'));
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos');
        }
    }

    public function getConceptos($id) {
        try {
            $model = new ReciboDetalle();
            $conceptos = $model->where('id_recibo','=',$id)->select('concepto','monto','id');
            return Datatables::of($conceptos)->make(true);
        } catch(Exception $e) {
            return response()->json(null);
        }
    }
    public function postConceptoRegistro(Request $request) {
        $this->validate($request,[
            'concepto' => 'required',
            'monto' => 'required|numeric',
            'recibo' => 'required'
        ]);
        try{

            $cancelado = Recibo::find($request->recibo)->cancelado;
            if ($cancelado == true) {
                return response()->json(['responseText' => 'Fallo'], 200);
            }

            $concepto = [
                'concepto' => $request->concepto,
                'monto' => $request->monto,
                'tipo' => config('constants.TIPO_CONCEPTO.OTRO'),
                'id_recibo' => $request->recibo
            ];
            ReciboDetalle::create($concepto);

            $montos = ReciboDetalle::where('id_recibo','=',$request->recibo)->pluck('monto');
            $total = 0.0;
            foreach ($montos as $monto) {
                $total += $monto;
            }
            $recibo = Recibo::find($request->recibo);
            $recibo->monto = $total;
            $recibo->save();

            return response()->json(['total' => $total], 200);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
//            return response()->json(['error' => 'Ocurrió un problema. Revise la Información ingresada.'], 500);

        }
    }
    public function postConceptoEditar(Request $request) {
        try{
            $nuevo_monto = $request->monto;
            $concepto = ReciboDetalle::find($request->id);

            $cancelado = Recibo::find($concepto->id_recibo)->cancelado;
            if ($cancelado == true) {
                return response()->json(['responseText' => 'false'], 200);
            }

            if ($concepto->tipo == config('constants.TIPO_CONCEPTO.TRAMITE')){

                $tramite = TramiteUsuario::find($concepto->id_tramite_usuario);

                if ($tramite) {
                    $monto_debe = $tramite->monto_pagar*1.0 - $tramite->monto_pagado*1.0;

                    if ($monto_debe >= $nuevo_monto) {
                        $concepto->monto = $nuevo_monto;
                        $concepto->save();

                        $montos = ReciboDetalle::where('id_recibo','=',$concepto->id_recibo)->pluck('monto');
                        $total = 0.0;
                        foreach ($montos as $monto) {
                            $total += $monto;
                        }
                        $recibo = Recibo::find($concepto->id_recibo);
                        $recibo->monto = $total;
                        $recibo->save();

                    } else {
                        $concepto->monto = $monto_debe;
                        $concepto->save();

                        $montos = ReciboDetalle::where('id_recibo','=',$concepto->id_recibo)->pluck('monto');
                        $total = 0.0;
                        foreach ($montos as $monto) {
                            $total += $monto;
                        }
                        $recibo = Recibo::find($concepto->id_recibo);
                        $recibo->monto = $total;
                        $recibo->save();
                    }
                    return response()->json(['montototal' => $total], 200);
                }
            }
            else if ($concepto->tipo == config('constants.TIPO_CONCEPTO.OTRO')){
                $concepto->monto = $nuevo_monto;
                $concepto->save();

                $montos = ReciboDetalle::where('id_recibo','=',$concepto->id_recibo)->pluck('monto');
                $total = 0.0;
                foreach ($montos as $monto) {
                    $total += $monto;
                }
                $recibo = Recibo::find($concepto->id_recibo);
                $recibo->monto = $total;
                $recibo->save();

                return response()->json(['montototal' => $total], 200);
            }
            return response()->json(['responseText' => 'false'], 200);
        } catch(Exception $e) {
            return response()->json(['error' => 'Fallo'], 500);
        }
    }
    public function postConceptoEliminar(Request $request) {
        try{
            $concepto = ReciboDetalle::find($request->id);

            $cancelado = Recibo::find($concepto->id_recibo)->cancelado;
            if ($cancelado == true) {
                return response()->json(['responseText' => 'Fallo'], 200);
            }

            $concepto->delete();
            return response()->json(['responseText' => 'Aprobado'], 200);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Fallo'], 500);
        }
    }

    public function getVouchers($id) {
        try {
            $model = new Voucher();
            $vouchers = $model->where('id_recibo','=',$id)->select('codigo','monto','id');
            return Datatables::of($vouchers)->make(true);
        } catch(Exception $e) {
            return response()->json(null);
        }
    }
    public function postVoucherRegistro(Request $request) {
        $this->validate($request,[
            'codigo' => 'required',
            'monto' => 'required|numeric',
            'recibo' => 'required'
        ]);
        try{
            $cancelado = Recibo::find($request->recibo)->cancelado;
            if ($cancelado == true) {
                return response()->json(['responseText' => 'Fallo'], 200);
            }

            $voucher = [
                'codigo' => $request->codigo,
                'monto' => $request->monto,
                'id_recibo' => $request->recibo
            ];
            Voucher::create($voucher);
            return response()->json(['responseText' => 'Aprobado'], 200);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Ocurrió un problema. Revise la Información ingresada.'], 500);

        }
    }
    public function postVoucherEliminar(Request $request) {
        try{
            $voucher =Voucher::find($request->id);

            $cancelado = Recibo::find($voucher->id_recibo)->cancelado;
            if ($cancelado == true) {
                return response()->json(['responseText' => 'Fallo'], 200);
            }

            $voucher->delete();

            return response()->json(['responseText' => 'Aprobado'], 200);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Fallo'], 500);
        }
    }

    public function postHabilitar(Request $request) {
        try{
            TramiteUsuario::whereIn('id', $request->id)->update([
                'id_tramite_usuario_estado' => '2',
                'deuda' => true
            ]);
            return response()->json(['responseText' => 'Aprobado'], 200);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Fallo'], 500);
        }
    }

    public function postCancelarRecibo(Request $request) {
        try{
            $id_recibo = $request->id;

            $recibo = Recibo::find($id_recibo);

            if($recibo->cancelado) {
                Alert()->error('El recibo ya fue pagado por lo que deberá anularlo.', 'Recibo ya pagado')->persistent('Ok');
            } else {
                $mVoucher = new Voucher();
                $mVoucher->where('id_recibo','=',$id_recibo)->delete();

                $mConceptos = new ReciboDetalle();
                $mConceptos->where('id_recibo','=',$id_recibo)->delete();

                $mRecibo = new Recibo();
                $mRecibo->find($id_recibo)->delete();
            }
            return redirect('tesoreria/pagos');
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return redirect('tesoreria/pagos/recibo/'.$request->id);
        }
    }

    public function getImprimir($id){
        try {
            $recibo = Recibo::find($id);
            if ($recibo->cancelado == false) {
                Alert()->error('Se debe generar el recibo primero para descargar el excel.', 'Debe generar el recibo primero')->persistent('Ok');
                return Redirect('tesoreria/pagos/recibo/' . $id);
            }
            $turno = TurnoCaja::find($recibo->id_turno);
            $recibo_excel = Recibo::where('id','=',$id)->with('detalles')->with('usuario')->first();

            return Excel::create("Recibo_".$recibo_excel->numero, function ($excel) use ($recibo_excel, $turno, $recibo) {
                $excel->sheet('Excel', function ($sheet) use ($recibo_excel, $turno, $recibo) {
                    $sheet->mergeCells('H2:I3');
                    $sheet->setBorder('H2:I3', 'thin');
                    $sheet->cell('H2', function ($cell) use ($recibo_excel) {
                        $cell->setValue('Número de Recibo: ' . $recibo_excel->numero);
                        $cell->setFontWeight('bold');
                    });
                    $sheet->getStyle('H2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
                    $sheet->getStyle('H2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

                    if ($recibo->tipo_recibo == config('constants.TIPO_RECIBO.EXTERNO')) {
                        $sheet->cell('B5', function ($cell) {
                            $cell->setValue('DNI:');
                            $cell->setFontWeight('bold');
                        });
                        $sheet->setCellValue('C5', $recibo->dni);
                        $sheet->cell('H5', function ($cell) {
                            $cell->setValue('Nombre Completo:');
                            $cell->setFontWeight('bold');
                        });
                        $sheet->setCellValue('I5', $recibo->nombre_cliente);
                    } else {
                        $sheet->cell('B5', function ($cell) {
                            $cell->setValue('Código del Usuario:');
                            $cell->setFontWeight('bold');
                        });
                        $sheet->setCellValue('C5', $recibo_excel->usuario->username);
                        $sheet->cell('H5', function ($cell) {
                            $cell->setValue('Nombre del Usuario:');
                            $cell->setFontWeight('bold');
                        });
                        $sheet->setCellValue('I5', $recibo_excel->nombre_cliente);
                    }

//                $sheet->cell('B7', function ($cell) {
//                    $cell->setValue('Recibo de:');
//                    $cell->setFontWeight('bold');
//                });
//                $sheet->setCellValue('C7', 'Nombre');
//                $sheet->cell('H7', function ($cell) {
//                    $cell->setValue('Semestre:');
//                    $cell->setFontWeight('bold');
//                });
//                $sheet->setCellValue('I7', $semestre);
                    $sheet->cell('B7', function ($cell) {
                        $cell->setValue('Fecha:');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->setCellValue('C7', Carbon::now()->format('d/m/Y'));

                    $sheet->cell('H7', function ($cell) {
                        $cell->setValue('Turno:');
                        $cell->setFontWeight('bold');
                    });
                    if ($turno->turno == config('constants.TURNO.MAÑANA')) {
                        $sheet->setCellValue('I7', 'Mañana');
                    } else {
                        $sheet->setCellValue('I7', 'Tarde');
                    }
                    $ind = 10;
                    $sheet->mergeCells('B' . ($ind - 1) . ':' . 'H' . ($ind - 1));
                    $sheet->setCellValue('B' . ($ind - 1), 'CONCEPTO');
                    $sheet->setCellValue('I' . ($ind - 1), 'MONTO');
                    $total = 0.0;
                    foreach ($recibo_excel->detalles as $concepto) {
                        $sheet->mergeCells('B' . $ind . ':' . 'H' . $ind);
                        $sheet->setCellValue('B' . $ind, $concepto->concepto);
                        $sheet->setCellValue('I' . $ind, $concepto->monto);
                        $total += $concepto->monto;
                        $ind++;
                    }
                    $sheet->setCellValue('H' . $ind, 'Total: S/.');
                    $sheet->cell('H' . $ind, function ($cell) {
                        $cell->setValue('Total: S/.');
                        $cell->setFontWeight('bold');
                    });
                    $sheet->getStyle('H' . $ind)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                    $sheet->setCellValue('I' . $ind, $total);
                    $sheet->getStyle('I' . $ind)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                    $sheet->setBorder('B9:I' . ($ind - 1), 'thin');
                    $sheet->setOrientation('landscape');
                });
            })->download('xlsx');
        } catch (\Exception $e) {
            Alert()->error(config('constants.ALERT.ERROR.MENSAJE'), config('constants.ALERT.ERROR.TITULO'))->persistent('Ok');
            return Redirect('tesoreria/pagos/recibo/' . $id);
        }
    }
}
