/**
  * guardar consulta
  * @param Request $request
  * @param ConsultasRepositorioInterface $consultasRepositorio
  * @param CitasRepositorioInterface $citasRepositorio
  * @param PlanTratamientoRepositorioInterface $planRepositorio
  * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
  */
 public function guardar(Request $request, ConsultasRepositorioInterface $consultasRepositorio, CitasRepositorioInterface $citasRepositorio, PlanTratamientoRepositorioInterface $planRepositorio)
 {
     // variable de respuesta
     $respuesta = '';
     // parámetros de consulta
     $idPaciente = (int) base64_decode($request->get('idPaciente'));
     $userMedico = base64_decode($request->get('userMedico'));
     $idCita = (int) base64_decode($request->get('idCita'));
     $generoPlan = $request->get('generoPlan') === '0' ? false : true;
     $tipoAnestesia = !is_null($request->get('tipoCostoConsulta')) ? true : false;
     $padecimientoActual = $request->get('txtPadecimiento');
     $interrogatorioAparatosSistemas = $request->get('txtInterrogatorio');
     $peso = $request->get('txtPeso');
     $talla = $request->get('txtTalla');
     $pulso = $request->get('txtPulso');
     $temperatura = $request->get('txtTemperatura');
     $tensionArterial = $request->get('txtTension');
     $notaMedica = $request->get('txtNota');
     $comportamientoFrankl = $request->get('comportamientoFrankl');
     $costoConsulta = $request->get('costoAsignadoConsulta');
     $exploracion = new ExploracionFisica($peso, $talla, $pulso, $temperatura, $tensionArterial);
     $comportamiento = new ComportamientoFrankl($comportamientoFrankl);
     $consulta = new Consulta(0, $padecimientoActual, $interrogatorioAparatosSistemas, $exploracion, $notaMedica, $comportamiento, $costoConsulta);
     // expediente
     $medico = $this->usuariosRepositorio->obtenerUsuarioPorUsername($userMedico);
     $pacientesRepositorio = PacientesRepositorioFactory::crear($medico);
     $paciente = $pacientesRepositorio->obtenerPacientePorId($idPaciente);
     $expediente = $this->expedientesRepositorio->obtenerExpedientePorPacienteMedico($paciente, $medico);
     // cambiar el estatus de la cita a atendida
     $cita = $citasRepositorio->obtenerCitaPorId($idCita);
     $cita->setEstatus(new CitaEstatus(4));
     if (!$citasRepositorio->actualizaEstatus($cita)) {
         return response(0);
     }
     // verificar los elementos generados durante la consulta (odontograma, plan) y agregarlos al expediente del paciente x
     if (is_null($expediente->obtenerPlanActivo())) {
         if ($generoPlan) {
             $consultasElementosServicio = new ConsultasElementosServicio($this->expedientesRepositorio);
             if (!$consultasElementosServicio->verificarElementosCreadosEnConsulta($request, $expediente)) {
                 return response(0);
             }
         }
     }
     // verificar si hay interconsulta
     if ($request->session()->has('interconsulta')) {
         $interconsulta = $request->session()->get('interconsulta');
         $expediente->agregarInterconsulta($interconsulta);
         $this->expedientesRepositorio->guardarInterconsulta($expediente);
     }
     // verificar si hay receta
     if ($request->session()->has('receta')) {
         $receta = $request->session()->get('receta');
         $consulta->setReceta($receta);
     }
     // verificar si es primera vez o subsecuente el expediente para completar la información
     if ($expediente->primeraVez()) {
         $pacientesRepositorio = PacientesRepositorioFactory::crear($expediente->getMedico());
         $pacientesComplemento = PacientesComplementoFactory::crear($expediente->getMedico(), $pacientesRepositorio);
         if (!$pacientesComplemento->crearDeHttp($request, $expediente->getPaciente())) {
             return response(0);
         }
     }
     $consulta->setExpediente($expediente);
     // persistir consulta
     if (!$consultasRepositorio->persistir($consulta)) {
         return response(0);
     }
     if ($tipoAnestesia === true) {
         if (!is_null($plan = $expediente->obtenerPlanActivo())) {
             $plan->atender();
             if (!$planRepositorio->actualizarAtencionTratamiento($plan)) {
                 return response(0);
             }
         }
     }
     // dientes atendidos - plan atendido
     if (!is_null($request->get('dienteAtendido'))) {
         $plan = $expediente->obtenerPlanActivo();
         foreach ($request->get('dienteAtendido') as $dienteNumero) {
             $plan->diente((int) $dienteNumero)->atenderTratamientos();
         }
         if (!$planRepositorio->actualizarAtencionTratamiento($plan)) {
             return response(0);
         }
     }
     // devolver elementos
     $respuesta['respuesta'] = 1;
     // id Plan
     $respuesta['expediente'] = $expediente->getId();
     return response()->json($respuesta);
 }
 /**
  * generar plan en PDF
  * @param string $id
  * @param string $idPaciente
  * @param string $userMedico
  * @param ExpedientesRepositorioInterface $expedientesRepositorio
  * @param PlanTratamientoRepositorioInterface $planesRepositorio
  */
 public function generarPlan($id, $idPaciente, $userMedico, ExpedientesRepositorioInterface $expedientesRepositorio, PlanTratamientoRepositorioInterface $planesRepositorio)
 {
     $id = (int) base64_decode($id);
     $idPaciente = (int) base64_decode($idPaciente);
     $userMedico = base64_decode($userMedico);
     $medico = $this->usuariosRepositorio->obtenerUsuarioPorUsername($userMedico);
     $pacientesRepositorio = PacientesRepositorioFactory::crear($medico);
     $paciente = $pacientesRepositorio->obtenerPacientePorId($idPaciente);
     $expediente = $expedientesRepositorio->obtenerExpedientePorPacienteMedico($paciente, $medico);
     $plan = $planesRepositorio->obtenerPorId($id);
     $reporte = new PlanTratamientoJohanna($plan, $expediente);
     $reporte->SetHeaderMargin(10);
     $reporte->SetMargins(15, 50);
     $reporte->SetAutoPageBreak(true, 20);
     $reporte->generar();
 }