<?php

namespace App\Http\Controllers\Admin;

use App\Model\DependenciaUsuario;
use App\Model\Periodo;
use App\Model\TramiteCategoria;
use App\Model\TramiteProcedimiento;
use App\Model\TramiteRequisito;
use App\Model\TramiteResolucion;
use App\Model\TramiteRol;
use App\Model\TramiteUsuario;
use App\Model\TramiteUsuarioDocumento;
use App\Model\TramiteUsuarioObservacion;
use App\Model\TramiteUsuarioRequisito;
use App\Model\UIT;
use App\Model\User;
use App\Notifications\IntranetNotification;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Mockery\Exception;
use Yajra\Datatables\Datatables;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\Style;

class TramiteController extends Controller
{
    public function getIndex()
    {
        return view('pages.admin.tramite.index');
    }

    public function getDetalle($id)
    {
        $model = new TramiteProcedimiento();
        $tramiteProcedimiento = $model->tramite_procedimiento()
            ->where('tramite_procedimiento.id', '=', $id)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.detalle')->with('tramiteProcedimiento', $tramiteProcedimiento);
    }

    public function getAgregar()
    {
        return view('pages.admin.tramite.agregar');
    }

    public function getEditar($id)
    {
        $model = new TramiteProcedimiento();
        $tramiteProcedimiento = $model->tramite_procedimiento()
            ->where('tramite_procedimiento.id', '=', $id)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.editar')->with('tramiteProcedimiento', $tramiteProcedimiento);
    }

    public function getIndexCategoria()
    {
        return view('pages.admin.tramite.categoria.index');
    }

    public function getDetalleRequisito($id)
    {
        $model = new UIT();
        $uit = $model->uit()
            ->orderBy('anio', 'desc')
            ->firstOrFail();

        $model = new TramiteRequisito();
        $tramiteRequisito = $model->tramite_requisito($uit['valor'])
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->where('tramite_requisito.id', '=', $id)
            ->firstOrFail();

        return view('pages.admin.tramite.requisito.detalle')->with('tramiteRequisito', $tramiteRequisito);
    }

    public function getAgregarRequisito($id_tramite_procedimiento)
    {
        $model = new UIT();
        $uit = $model->uit()
            ->orderBy('anio', 'desc')
            ->firstOrFail();

        $model = new TramiteProcedimiento();
        $tramiteProcedimiento = $model->tramite_procedimiento()
            ->where('tramite_procedimiento.id', '=', $id_tramite_procedimiento)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.requisito.agregar')->with('tramiteProcedimiento', $tramiteProcedimiento)->with('uit', $uit);
    }

    public function getEditarRequisito($id)
    {
        $model = new UIT();
        $uit = $model->uit()
            ->orderBy('anio', 'desc')
            ->firstOrFail();

        $model = new TramiteRequisito();
        $tramiteRequisito = $model->tramite_requisito($uit['valor'])
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->where('tramite_requisito.id', '=', $id)
            ->firstOrFail();

        return view('pages.admin.tramite.requisito.editar')->with('tramiteRequisito', $tramiteRequisito)->with('uit', $uit);
    }

    public function getDetalleResolucion($id)
    {
        $model = new TramiteResolucion();
        $tramiteResolucion = $model->tramite_resolucion()
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->where('tramite_resolucion.id', '=', $id)
            ->firstOrFail();

        return view('pages.admin.tramite.resolucion.detalle')->with('tramiteResolucion', $tramiteResolucion);
    }

    public function getAgregarResolucion($id_tramite_procedimiento)
    {
        $model = new TramiteProcedimiento();
        $tramiteProcedimiento = $model->tramite_procedimiento()
            ->where('tramite_procedimiento.id', '=', $id_tramite_procedimiento)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.resolucion.agregar')->with('tramiteProcedimiento', $tramiteProcedimiento);
    }

    public function getEditarResolucion($id)
    {
        $model = new TramiteResolucion();
        $tramiteResolucion = $model->tramite_resolucion()
            ->where('tramite_resolucion.id', '=', $id)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.resolucion.editar')->with('tramiteResolucion', $tramiteResolucion);
    }

    public function getIndexUsuario()
    {
        return view('pages.admin.tramite.usuario.index');
    }

    public function getDetalleUsuario($id)
    {
        $user = Auth::user();

        $model = new DependenciaUsuario();
        $dependenciaUsuario = $model->dependencia_usuario($user['id'])
            ->where('dependencia_usuario.id_usuario', '=', $user['id'])
            ->whereNull('dependencia.deleted_at')
            ->get();

        $model = new TramiteUsuario();
        $tramiteUsuario = $model->tramite_usuario()
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->where('tramite_usuario.id', '=', $id)
            ->whereIn('tramite_usuario.id_dependencia', $dependenciaUsuario->pluck('id_dependencia'))
            ->orWhereNull('tramite_usuario.id_dependencia')
            ->firstOrFail();

        return view('pages.admin.tramite.usuario.detalle')->with('tramiteUsuario', $tramiteUsuario);
    }
    
    public function getDocumentoUsuario($id)
    {
        $model = new TramiteUsuario();
        $tramiteUsuario = $model->tramite_usuario2()
            ->where('tramite_usuario.id', '=', $id)
            ->firstOrFail();
        
        $model = new TramiteUsuarioDocumento();
        $tramiteUsuarioDocumento = $model->where('tramite_usuario_documento.id_tramite_usuario', '=', $id)
            ->firstOrFail();
        
        $model = new Periodo();
        $periodo = $model->where('fecha_inicio', '<=', $tramiteUsuario['updated_at'])
            ->where('fecha_fin', '>=', $tramiteUsuario['updated_at'])
            ->firstOrFail();
        
        $documento = null;
        
        if ($tramiteUsuarioDocumento['id_documento'] == config('constants.DOCUMENTO_ID.CONSTANCIA_EGRESADO'))
        {
            $documento = $this->getConstanciaEgresado($tramiteUsuario, $periodo);
        }
        else if ($tramiteUsuarioDocumento['id_documento'] == config('constants.DOCUMENTO_ID.GENERACION_TRAMITE'))
        {
            $documento = $this->getConstanciaEstudios($tramiteUsuario, $periodo);
        }

        $headers = ['Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'];
        
        return response()->download(storage_path($documento), $documento,$headers);
    }
    
    public function getEditarUsuario($id)
    {
        $user = Auth::user();

        $model = new DependenciaUsuario();
        $dependenciaUsuario = $model->dependencia_usuario($user['id'])
            ->where('dependencia_usuario.id_usuario', '=', $user['id'])
            ->whereNull('dependencia.deleted_at')
            ->get();

        $model = new TramiteUsuario();
        $tramiteUsuario = $model->tramite_usuario()
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->where('tramite_usuario.id', '=', $id)
            ->whereIn('tramite_usuario.id_dependencia', $dependenciaUsuario->pluck('id_dependencia'))
            ->orWhereNull('tramite_usuario.id_dependencia')
            ->firstOrFail();

        return view('pages.admin.tramite.usuario.editar')->with('tramiteUsuario', $tramiteUsuario)->with('dependenciaUsuario', $dependenciaUsuario);
    }

    public function getImprimirUsuario($id)
    {
        $model = new TramiteUsuario();
        $tramiteUsuario = $model->tramite_usuario()
            ->where('tramite_usuario.id', '=', $id)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.usuario.imprimir')->with('tramiteUsuario', $tramiteUsuario);
    }

    public function getIndexUsuarioAdicionar()
    {
        return view('pages.admin.tramite.usuario.adicionar.index');
    }

    public function getDetalleUsuarioAdicionar($id)
    {
        $model = new TramiteProcedimiento();
        $tramiteProcedimiento = $model->tramite_procedimiento()
            ->where('tramite_procedimiento.id', '=', $id)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.usuario.adicionar.detalle')->with('tramiteProcedimiento', $tramiteProcedimiento);
    }

    public function getIndexUsuarioHistorico()
    {
        return view('pages.admin.tramite.usuario.historico.index');
    }

    public function getDetalleUsuarioHistorico($id)
    {
        $model = new TramiteUsuario();
        $tramiteUsuario = $model->tramite_usuario()
            ->where('tramite_usuario.id', '=', $id)
            ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
            ->firstOrFail();

        return view('pages.admin.tramite.usuario.historico.detalle')->with('tramiteUsuario', $tramiteUsuario);
    }

    public function postIndex(Request $request)
    {
        try
        {
            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->tramite_procedimiento()
                ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
                ->get();

            return Datatables::of($tramiteProcedimiento)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregar(Request $request)
    {
        try
        {
            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->create([
                "nombre" => $request->input('nombre'),
                "base_legal" => $request->input('base_legal'),
                "plazo_resolucion" => $request->input('plazo_resolucion'),
                "id_area_inicio" => $request->input('id_area_inicio'),
                "id_autoridad_competente" => $request->input('id_autoridad_competente'),
                "id_tramite_calificacion" => $request->input('id_tramite_calificacion'),
                "id_tramite_categoria" => $request->input('id_tramite_categoria'),
                "id_tramite_estado" => $request->input('id_tramite_estado'),
                "id_tramite_tipo" => config('constants.TRAMITE_TIPO.TUPA'),
            ]);

            return response()->json($tramiteProcedimiento);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEditar(Request $request)
    {
        try
        {
            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->find($request->input('id'));
            $tramiteProcedimiento['codigo'] = $request->input('codigo');
            $tramiteProcedimiento['cuenta_contable'] = $request->input('cuenta_contable');
            $tramiteProcedimiento['nombre'] = $request->input('nombre');
            $tramiteProcedimiento['base_legal'] = $request->input('base_legal');
            $tramiteProcedimiento['plazo_resolucion'] = $request->input('plazo_resolucion');
            $tramiteProcedimiento['id_area_inicio'] = $request->input('id_area_inicio');
            $tramiteProcedimiento['id_autoridad_competente'] = $request->input('id_autoridad_competente');
            $tramiteProcedimiento['id_tramite_calificacion'] = $request->input('id_tramite_calificacion');
            $tramiteProcedimiento['id_tramite_categoria'] = $request->input('id_tramite_categoria');
            $tramiteProcedimiento['id_tramite_estado'] = $request->input('id_tramite_estado');
            $tramiteProcedimiento->save();

            return response()->json($tramiteProcedimiento);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminar(Request $request)
    {
        try
        {
            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->find($request->input('id'));
            $tramiteProcedimiento->delete();

            return response()->json($tramiteProcedimiento);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postCategoria(Request $request)
    {
        try
        {
            $model = new TramiteCategoria();
            $tramiteCategoria = $model->tramite_categoria()
                ->get();

            return Datatables::of($tramiteCategoria)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarCategoria(Request $request)
    {
        try
        {
            $model = new TramiteCategoria();
            $tramiteCategoria = $model->create([
                "nombre" => $request->input('nombre')
            ]);

            return response()->json($tramiteCategoria);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEditarCategoria(Request $request)
    {
        try
        {
            $model = new TramiteCategoria();
            $tramiteCategoria = $model->find($request->input('id'));
            $tramiteCategoria['nombre'] = $request->input('nombre');
            $tramiteCategoria->save();

            return response()->json($tramiteCategoria);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarCategoria(Request $request)
    {
        try
        {
            $model = new TramiteCategoria();
            $tramiteCategoria = $model->find($request->input('id'));
            $tramiteCategoria->delete();

            return response()->json($tramiteCategoria);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postRequisito(Request $request)
    {
        try
        {
            $model = new UIT();
            $uit = $model->uit()
                ->orderBy('anio', 'desc')
                ->first();

            $model = new TramiteRequisito();
            $tramiteRequisito = $model->tramite_requisito($uit['valor'])
                ->where('tramite_requisito.id_tramite_procedimiento', '=', $request->input('id_tramite_procedimiento'))
                ->get();

            return Datatables::of($tramiteRequisito)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarRequisito(Request $request)
    {
        try
        {
            $model = new TramiteRequisito();
            $tramiteRequisito = $model->create([
                "nombre" => $request->input('nombre'),
                "codigo" => $request->input('codigo'),
                "tramitacion_soles" => $request->input('tramitacion_soles'),
                "id_tramite_procedimiento" => $request->input('id_tramite_procedimiento'),
            ]);

            return response()->json($tramiteRequisito);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEditarRequisito(Request $request)
    {
        try
        {
            $model = new TramiteRequisito();
            $tramiteRequisito = $model->find($request->input('id'));
            $tramiteRequisito['nombre'] = $request->input('nombre');
            $tramiteRequisito['codigo'] = $request->input('codigo');
            $tramiteRequisito['tramitacion_soles'] = $request->input('tramitacion_soles');
            $tramiteRequisito->save();

            return response()->json($tramiteRequisito);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarRequisito(Request $request)
    {
        try
        {
            $model = new TramiteRequisito();
            $tramiteRequisito = $model->find($request->input('id'));
            $tramiteRequisito->delete();

            return response()->json($tramiteRequisito);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postResolucion(Request $request)
    {
        try
        {
            $model = new TramiteResolucion();
            $tramiteResolucion = $model->tramite_resolucion()
                ->where('tramite_resolucion.id_tramite_procedimiento', '=', $request->input('id_tramite_procedimiento'))
                ->get();

            return Datatables::of($tramiteResolucion)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarResolucion(Request $request)
    {
        try
        {
            $model = new TramiteResolucion();
            $tramiteResolucion = $model->create([
                "plazo_presentacion" => $request->input('plazo_presentacion'),
                "plazo_resolucion" => $request->input('plazo_resolucion'),
                "id_autoridad" => $request->input('id_autoridad'),
                "id_tramite_procedimiento" => $request->input('id_tramite_procedimiento'),
                "id_tramite_resolucion_tipo" => $request->input('id_tramite_resolucion_tipo'),
            ]);

            return response()->json($tramiteResolucion);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEditarResolucion(Request $request)
    {
        try
        {
            $model = new TramiteResolucion();
            $tramiteResolucion = $model->find($request->input('id'));
            $tramiteResolucion['plazo_presentacion'] = $request->input('plazo_presentacion');
            $tramiteResolucion['plazo_resolucion'] = $request->input('plazo_resolucion');
            $tramiteResolucion['id_autoridad'] = $request->input('id_autoridad');
            $tramiteResolucion['id_tramite_resolucion_tipo'] = $request->input('id_tramite_resolucion_tipo');
            $tramiteResolucion->save();

            return response()->json($tramiteResolucion);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarResolucion(Request $request)
    {
        try
        {
            $model = new TramiteResolucion();
            $tramiteResolucion = $model->find($request->input('id'));
            $tramiteResolucion->delete();

            return response()->json($tramiteResolucion);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postRol(Request $request)
    {
        try
        {
            $model = new TramiteRol();
            $tramiteRol = $model->tramite_rol($request->input('id_tramite_procedimiento'))
                ->get();

            return Datatables::of($tramiteRol)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarRol(Request $request)
    {
        try
        {
            $model = new TramiteRol();
            $tramiteRol = $model->create([
                "id_rol" => $request->input('id_rol'),
                "id_tramite_procedimiento" => $request->input('id_tramite_procedimiento'),
            ]);

            return response()->json($tramiteRol);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarRol(Request $request)
    {
        try
        {
            $model = new TramiteRol();
            $tramiteRol = $model->where('id_rol', '=', $request->input('id_rol'))
                ->where('id_tramite_procedimiento', '=', $request->input('id_tramite_procedimiento'))
                ->delete();

            return response()->json($tramiteRol);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postUsuario(Request $request)
    {
        try
        {
            $user = Auth::user();

            $model = new DependenciaUsuario();
            $dependenciaUsuario = $model->dependencia_usuario($user['id'])
                ->where('dependencia_usuario.id_usuario', '=', $user['id'])
                ->whereNull('dependencia.deleted_at')
                ->get();

            $model = new TramiteUsuario();
            $tramiteUsuario = $model->tramite_usuario()
                ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
                ->where('tramite_usuario.id_tramite_usuario_estado', '<>', config('constants.TRAMITE_USUARIO_ESTADO_ID.FINALIZADO'))
                ->whereIn('tramite_usuario.id_dependencia', $dependenciaUsuario->pluck('id_dependencia'))
                ->orWhereNull('tramite_usuario.id_dependencia')
                ->get();

            return Datatables::of($tramiteUsuario)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarUsuario(Request $request)
    {
        try
        {
            $id_tramite_procedimiento = $request->input('id_tramite_procedimiento');
            $id_usuario = $request->input('id_usuario');
            $monto_pagar = 0;

            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->find($id_tramite_procedimiento);

            $model = new TramiteRequisito();
            $tramiteRequisito = $model->where('tramite_requisito.id_tramite_procedimiento', '=', $id_tramite_procedimiento);

            if ($tramiteRequisito != null)
            {
                $monto_pagar = $tramiteRequisito->sum('tramite_requisito.tramitacion_soles');
            }

            $model = new TramiteUsuario();
            $tramiteUsuario = $model->whereNotNull('tramite_usuario.codigo')
                ->orderBy('id', 'desc')
                ->first();

            $codigoAnio = Carbon::now()->year . "";
            $codigoAnioLength = strlen($codigoAnio);
            $codigo = $codigoAnio . "00001";

            if ($tramiteUsuario['codigo'] != null)
            {
                $codigoAnio2 = substr($tramiteUsuario['codigo'], 0, $codigoAnioLength);

                if ($codigoAnio == $codigoAnio2)
                {
                    $codigoNumero = $tramiteUsuario['codigo'] * 1;
                    $codigo = ($codigoNumero + 1) . "";
                }
            }

            $tramiteUsuario = $model->create([
                "codigo" => $codigo,
                "monto_pagar" => $monto_pagar,
                //"id_dependencia" => $request->input('id_dependencia'),
                "id_dependencia" => null,
                "id_recibo" => null,
                "id_tramite_procedimiento" => $id_tramite_procedimiento,
                "id_tramite_usuario_estado" => 1,
                "id_usuario" => $id_usuario,
            ]);

            $model = new User();
            $user = $model->find($id_usuario);

            $href = "/tramite/detalle/" . $tramiteUsuario['id'];
            $from = "Trámites TUPA";
            $message = "Se le ha asignado el trámite " . $tramiteProcedimiento['nombre'];
            $user->notify(new IntranetNotification($href, $from, $message));

            return response()->json($tramiteUsuario);
        }
        catch(Exception $e) {
            return response()->json(null);
        }
    }

    public function postEditarUsuario(Request $request)
    {
        try
        {
            $id_dependencia = $request->input('id_dependencia');
            $id_tramite_usuario_estado = $request->input('id_tramite_usuario_estado');

            $model = new TramiteUsuario();
            $tramiteUsuario = $model->find($request->input('id'));

            $model = new DependenciaUsuario();
            $dependenciaUsuario = $model->where('id_dependencia', '=', $tramiteUsuario['id_dependencia'])
                ->get();
            $dependenciaUsuario2 = $model->where('id_dependencia', '=', $id_dependencia)
                ->get();

            $tramiteUsuarioEstado = config('constants.TRAMITE_USUARIO_ESTADO_NOMBRE')[$tramiteUsuario['id_tramite_usuario_estado']];
            $tramiteUsuarioEstado2 = config('constants.TRAMITE_USUARIO_ESTADO_NOMBRE')[$id_tramite_usuario_estado];

            $tramiteUsuario['folio'] = $request->input('folio');
            $tramiteUsuario['id_dependencia'] = $request->input('id_dependencia');
            $tramiteUsuario['id_tramite_usuario_accion'] = $request->input('id_tramite_usuario_accion');
            $tramiteUsuario['id_tramite_usuario_estado'] = $request->input('id_tramite_usuario_estado');
            $tramiteUsuario->save();

            $model = new TramiteProcedimiento();
            $tramiteProcedimiento = $model->find($tramiteUsuario['id_tramite_procedimiento']);

            $model = new User();
            $user = $model->find($tramiteUsuario['id_usuario']);

            $href = "/tramite/detalle/" . $tramiteUsuario['id'];
            $from = "Trámites TUPA";
            $message = "Se ha actualizado el estado de su trámite " . $tramiteProcedimiento['nombre'] . " de " . $tramiteUsuarioEstado . " a " . $tramiteUsuarioEstado2;
            $user->notify(new IntranetNotification($href, $from, $message));

            if ($dependenciaUsuario != null)
            {
                $href = url('/admin/tramite/usuario/editar/') . $tramiteUsuario['id'];
                $from = "Trámites TUPA";
                $message = "Se ha derivado el trámite " . $tramiteProcedimiento['nombre'] . ", solicitado por " . $user->getFullNameAttributes();
                $arrDependenciaUsuarios = $dependenciaUsuario->toArray();

                foreach ($arrDependenciaUsuarios as $arrDependenciaUsuario)
                {
                    $user = $model->find($arrDependenciaUsuario['id_usuario']);
                    $user->notify(new IntranetNotification($href, $from, $message));
                }
            }

            if ($dependenciaUsuario2 != null)
            {
                $href = url('/admin/tramite/usuario/editar/') . $tramiteUsuario['id'];
                $from = "Trámites TUPA";
                $message = "Se le ha asignado el trámite " . $tramiteProcedimiento['nombre'] . ", solicitado por " . $user->getFullNameAttributes();
                $arrDependenciaUsuarios = $dependenciaUsuario2->toArray();

                foreach ($arrDependenciaUsuarios as $arrDependenciaUsuario) {
                    $user = $model->find($arrDependenciaUsuario['id_usuario']);
                    $user->notify(new IntranetNotification($href, $from, $message));
                }
            }

            return response()->json($tramiteUsuario);
        }
        catch(Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarUsuario(Request $request)
    {
        try
        {
            $model = new TramiteUsuario();
            $tramiteUsuario = $model->find($request->input('id'));
            $tramiteUsuario->delete();

            return response()->json($tramiteUsuario);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }
    
    public function postAgregarUsuarioDocumento(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioDocumento();
            $tramiteUsuarioDocumento = $model->create([
                "id_documento" => $request->input('id_documento'),
                "id_tramite_usuario" => $request->input('id_tramite_usuario'),
            ]);

            return response()->json($tramiteUsuarioDocumento);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postUsuarioHistorico(Request $request)
    {
        try
        {
            $model = new TramiteUsuario();
            $tramiteUsuario = $model->tramite_usuario()
                ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
                ->where('tramite_usuario.id_tramite_usuario_estado', '=', config('constants.TRAMITE_USUARIO_ESTADO_ID.FINALIZADO'))
                ->get();

            return Datatables::of($tramiteUsuario)->make(true);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postUsuarioObservacion(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioObservacion();
            $tramiteUsuarioObservacion = $model->tramite_usuario_observacion()
                ->where('tramite_procedimiento.id_tramite_tipo', '=', config('constants.TRAMITE_TIPO.TUPA'))
                ->where('tramite_usuario_observacion.id_tramite_usuario', '=', $request->input('id_tramite_usuario'))
                ->get();

            return Datatables::of($tramiteUsuarioObservacion)->make(true);
        }
        catch(Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarUsuarioObservacion(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioObservacion();
            $tramiteUsuarioObservacion = $model->create([
                "observacion" => $request->input('observacion'),
                "id_dependencia" => $request->input('id_dependencia'),
                "id_tramite_usuario" => $request->input('id_tramite_usuario'),
            ]);

            return response()->json($tramiteUsuarioObservacion);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEditarUsuarioObservacion(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioObservacion();
            $tramiteUsuarioObservacion = $model->find($request->input('id'));
            $tramiteUsuarioObservacion['observacion'] = $request->input('observacion');
            $tramiteUsuarioObservacion->save();

            return response()->json($tramiteUsuarioObservacion);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarUsuarioObservacion(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioObservacion();
            $tramiteUsuarioObservacion = $model->find($request->input('id'));
            $tramiteUsuarioObservacion->delete();

            return response()->json($tramiteUsuarioObservacion);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postUsuarioRequisito(Request $request)
    {
        try
        {
            $model = new UIT();
            $uit = $model->uit()
                ->orderBy('anio', 'desc')
                ->first();

            $model = new TramiteUsuarioRequisito();
            $tramiteUsuarioRequisito = $model->tramite_usuario_requisito($uit['valor'], $request->input('id_tramite_usuario'))
                ->where('tramite_requisito.id_tramite_procedimiento', '=', $request->input('id_tramite_procedimiento'))
                ->get();

            return Datatables::of($tramiteUsuarioRequisito)->make(true);
        }
        catch(Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postAgregarUsuarioRequisito(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioRequisito();
            $tramiteUsuarioRequisito = $model->create([
                "id_tramite_requisito" => $request->input('id_tramite_requisito'),
                "id_tramite_usuario" => $request->input('id_tramite_usuario'),
            ]);

            return response()->json($tramiteUsuarioRequisito);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }

    public function postEliminarUsuarioRequisito(Request $request)
    {
        try
        {
            $model = new TramiteUsuarioRequisito();
            $tramiteUsuarioRequisito = $model->where('id_tramite_requisito', '=', $request->input('id_tramite_requisito'))
                ->where('id_tramite_usuario', '=', $request->input('id_tramite_usuario'))
                ->delete();

            return response()->json($tramiteUsuarioRequisito);
        }
        catch (Exception $e)
        {
            return response()->json(null);
        }
    }
    
    private function getConstanciaEgresado($tu,$p){

        $phpWord = new PhpWord();

        $phpWord->setDefaultParagraphStyle(
            array(
                'lineHeight' => 1.3,
            )
        );

        $phpWord->addParagraphStyle(
            'rightTab',
            array('tabs' => array(new Style\Tab('right', 9090)))
        );

        $phpWord->addParagraphStyle(
            'centerTab',
            array('tabs' => array(new Style\Tab('center', 4680)))
        );

        $section = $phpWord->addSection();

        $section->addTextBreak(1);

        $section->addText(
            '“AÑO DE LA CONSOLIDACIÓN DEL MAR DE GRAU”',
            array('name' => 'Times New Roman', 'size' => 16, 'bold' => true)
            , [ 'align' => 'center']
        );

        $section->addTextBreak(3);

        $section->addText(
            'CONSTANCIA DE EGRESADO',
            array('name' => 'Bookman Old Style', 'size' => 22, 'bold' => true,'underline' => 'single')
            , [ 'align' => 'center']
        );

        $section->addTextBreak(1);

        $section->addText(
            'EL DIRECTOR DEL '.strtoupper(config('constants.INSTITUCIONES')[config('constants.GENERAL.INSTITUCION')]).'.',
            array('name' => 'Bookman Old Style', 'size' => 10, 'bold' => true),
            [ 'align' => 'center']
        );

        $section->addTextBreak(1);

        $section->addText(
            'HACE CONSTAR:',
            array('name' => 'Bookman Old Style', 'size' => 12, 'bold' => true,'underline' => 'single')
        );

        $section->addTextBreak(1);

        $s = "";

        $t = "";

        if($tu->usuario_genero == "Masculino"){
            $s = "Sr. ";
            $t = "EGRESADO";
        }else{
            $s = "Sra. ";
            $t = "EGRESADA";
        }

        $section->addText(
            '               Que la '.$s.$tu->nombres.' ha concluido satisfactoriamente sus estudios en la carrera profesional  de '.strtoupper($tu->especialidad_nombre).', Turno '.strtoupper($tu->turno_nombre).',  en el período lectivo '.$p->nombre.' encontrándose en condición de:',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'both']
        );

        $section->addTextBreak(1);

        $section->addText(
            $t,
            array('name' => 'Times New Roman', 'size' => 26, 'bold' => true)
            , [ 'align' => 'center']
        );

        $section->addText(
            '               Se expide la presente constancia a solicitud de la interesada para los fines que estime conveniente.',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );

        $section->addTextBreak(2);

        $time = Carbon::now();

        $section->addText(
            'San Juan de Lurigancho, '.$time->format('l d, F Y'),
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'right']
        );

        $section->addTextBreak(3);

        $section->addText(
            'HACH/DG-ISTP-MSC',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );
        $section->addText(
            'NYBLR/JSA',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );
        $section->addText(
            'JDV',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );

        $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');

        $newName = 'constancia'.time().'.docx';

        $objWriter->save(storage_path($newName));

        return $newName;
    }

    private function getConstanciaEstudios($tu,$p){

        $phpWord = new PhpWord();

        $phpWord->setDefaultParagraphStyle(
            array(
                'lineHeight' => 1.3,
            )
        );

        $phpWord->addParagraphStyle(
            'rightTab',
            array('tabs' => array(new Style\Tab('right', 9090)))
        );

        $phpWord->addParagraphStyle(
            'centerTab',
            array('tabs' => array(new Style\Tab('center', 4680)))
        );

        $section = $phpWord->addSection();

        $section->addTextBreak(1);

        $section->addText(
            '“AÑO DE LA CONSOLIDACIÓN DEL MAR DE GRAU”',
            array('name' => 'Times New Roman', 'size' => 16, 'bold' => true)
            , [ 'align' => 'center']
        );

        $section->addTextBreak(3);

        $section->addText(
            'CONSTANCIA DE ESTUDIOS',
            array('name' => 'Bookman Old Style', 'size' => 22, 'bold' => true,'underline' => 'single')
            , [ 'align' => 'center']
        );

        $section->addTextBreak(1);

        $section->addText(
            'EL DIRECTOR DEL  '.strtoupper(config(´constants.instituto´)),
            array('name' => 'Bookman Old Style', 'size' => 10, 'bold' => true),
            [ 'align' => 'center']
        );

        $section->addTextBreak(1);

        $section->addText(
            'HACE CONSTAR:',
            array('name' => 'Bookman Old Style', 'size' => 12, 'bold' => true,'underline' => 'single')
        );

        $section->addTextBreak(1);

        $s = "";

        $t = "";

        $a = "";

        $e = "";

        if($tu->usuario_genero == "Masculino"){
            $s = "Sr. ";
            $t = "EGRESADO";
            $e = "el";
            $a = "alumno";
        }else{
            $s = "Sra. ";
            $t = "EGRESADA";
            $e = "la";
            $a = "alumna";
        }

        $section->addText(
            '               Que '.$e.' '.$a.' '.$s.$tu->nombres.', del  '.strtoupper(config('constants.INSTITUCIONES')[config('constants.GENERAL.INSTITUCION')]).' ha estudiado en nuestra casa de estudios en la Carrera Profesional de '.strtoupper($tu->especialidad_nombre).' en el Turno '.strtoupper($tu->turno_nombre).',  en el períodos lectivo '.$p->nombre.' Semestre',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'both']
        );

        $section->addTextBreak(1);

        $section->addText(
            '               Se expide la presente constancia a solicitud de la interesada para los fines que estime conveniente.',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );

        $section->addTextBreak(2);

        $time = Carbon::now();

        $section->addText(
            'San Juan de Lurigancho, '.$time->format('l d, F Y'),
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'right']
        );

        $section->addTextBreak(3);

        $section->addText(
            'HACH/DG-ISTP-MSC',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );
        $section->addText(
            'NYBLR/JSA',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );
        $section->addText(
            'JDV',
            array('name' => 'Times New Roman', 'size' => 12),
            [ 'align'=>'left']
        );

        $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');

        $newName = 'constancia'.time().'.docx';

        $objWriter->save(storage_path($newName));

        return $newName;
    }
}
