private void completarInformacionAdicionalSolicitud(
      SolicitudCartaPresentacionPasantia solicitud) {

    // Se completa la informacion de la empresa
    Empresa empresa = OficinaPasantiaServicio.getInstance().getEmpresa(solicitud.getScpp_cias());
    solicitud.setEmpresa(empresa);

    // Se completan los documentos asociados a la solicitud
    List<DocAnexoSolCartaPresentacionPasantia> documentos =
        DocAnexoSolCartaPresentacionPasantiaServicio.getInstance()
            .getDocumentosPorSolicitud(solicitud.getScpp_scpp());
    solicitud.setDocumentos(documentos);
  }
  public int getTotalMisPendientesPorServicio(Servicio servicio, Usuario usuario) {

    OficinaPasantia oficinaPasantia =
        OficinaPasantiaServicio.getInstance().getOficinaPasantiaPorUsuarioDelegado(usuario);

    int totalSolicitudes = 0;
    if (oficinaPasantia != null) {
      SolicitudRevisionDocumentacionPasantiaPropuestaServicio servicioSolicitudes =
          SolicitudRevisionDocumentacionPasantiaPropuestaServicio.getInstance();

      List<SolicitudRevisionDocumentacionPasantia> solicitudes =
          servicioSolicitudes.getSolicitudesSinAprobar(oficinaPasantia.getOfpa_ofpa());
      totalSolicitudes = solicitudes.size();
    }

    return totalSolicitudes;
  }
  public Boolean enviarNotificacionesPorFinalizarSolicitud(
      SolicitudCartaPresentacionPasantia solicitudFinalizada) {

    // Se crean las notificaciones

    String emisor = Constantes.USUA_APP;
    Boolean sinErrores = true;

    if (solicitudFinalizada != null) {

      String asunto =
          "Solicitud de Elaboracion de Cartas de Presentación de Pasantía No. "
              + solicitudFinalizada.getScpp_scpp()
              + " FINALIZADA";
      Prepropuesta prepropuesta =
          PrepropuestaServicio.getInstance().getPrepropuesta(solicitudFinalizada.getScpp_prep());

      // Notificacion a los usuarios delegados de la oficina de pasantia
      try {

        ProyectoCurricular proyectoCurricular =
            ProyectoCurricularServicio.getInstance()
                .getProyectoCurricular(prepropuesta.getPrep_pcur());

        List<Usuario> usuariosDelegados =
            OficinaPasantiaServicio.getInstance()
                .getUsuariosDelegados(proyectoCurricular.getPcur_facu());
        if (usuariosDelegados != null && usuariosDelegados.size() > 0) {
          // Se crea una notificacion al proyecto curricular
          String mensaje =
              "Se ha FINALIZADO la elaboración de la carta de presentación de pasantía No. "
                  + solicitudFinalizada.getScpp_scpp()
                  + ". Para mas información consulte el estado de la solicitud.";

          for (Usuario usuario : usuariosDelegados) {
            NotificacionServicio.getInstance()
                .generarNotificacionPorUsuario(emisor, asunto, mensaje, usuario.getUsua_usua());
          }
        }

      } catch (Exception e) {
        SimpleLogger.warn(
            "No se han podido enviar las notificaciones de FINALIZACION de elaboracion de cartas de presentación de pasantía a los usuario delegados");
        sinErrores = false;
      }

      // Notificacion a los autores de la prepropuesta
      try {

        String mensaje =
            "Su solicitud de elaboracion de cartas de presentación de pasantía No."
                + solicitudFinalizada.getScpp_scpp()
                + " ha sido FINALIZADA. Para mayor información consulte el estado de su solicitud a través del aplicativo";

        List<Estudiante> autores = prepropuesta.getAutores();

        for (Estudiante autor : autores) {

          NotificacionServicio.getInstance()
              .generarNotificacionPorUsuario(emisor, asunto, mensaje, autor.getEstd_usua());
        }
      } catch (Exception e) {
        SimpleLogger.warn(
            "No se han podido enviar las notificaciones de FINALIZACION de la solicitud a los autores de la prepropuesta");
        sinErrores = false;
      }
    }

    return sinErrores;
  }
  public SolicitudCartaPresentacionPasantia crearSolicitudCartaPresentacion(
      Prepropuesta prepropuesta,
      Usuario estudiante,
      SolicitudCartaPresentacionPasantia solicitud,
      Empresa empresa,
      List<DocAnexoSolCartaPresentacionPasantia> documentos,
      StringBuffer mensajeError) {

    SolicitudCartaPresentacionPasantia solicitudCreada = null;
    // Se crea la solcitud de elaboración de carta de presentación de pasantía
    try {
      Boolean crearEmpresa = false;
      // Se valida la informacion
      if (prepropuesta == null) {
        String error =
            "Error creando solcitud de elaboración de carta de presentación de pasantía. No se ha especificado la prepropuesta a la cual esta asociada.";
        SimpleLogger.error(error);
        mensajeError.append(error);
        return null;
      }

      if (estudiante == null) {
        String error =
            "Error creando solcitud de elaboración de carta de presentación de pasantía. No se ha especificado el solicitante.";
        SimpleLogger.error(error);
        mensajeError.append(error);
        return null;
      }

      if (solicitud == null) {
        String error =
            "Error creando solcitud de elaboración de carta de presentación de pasantía. No se ha especificado correctamente la observación";
        SimpleLogger.error(error);
        mensajeError.append(error);
        return null;
      }

      if (documentos == null || documentos.size() == 0) {
        String error =
            "Error creando solcitud de elaboración de carta de presentación de pasantía. No se ha especificado correctamente la observación";
        SimpleLogger.error(error);
        mensajeError.append(error);
        return null;
      }

      if (solicitud.getScpp_cias() == null) {
        if (empresa.getCias_nomb() == null
            || empresa.getCias_nit() == null
            || empresa.getCias_descri() == null) {
          String error =
              "Error creando solcitud de elaboración de carta de presentación de pasantía. No se ha especificado correctamente la empresa";
          SimpleLogger.error(error);
          mensajeError.append(error);
          return null;

        } else {
          // Se debe crear la empresa
          crearEmpresa = true;
        }
      }

      // Se crea la solicitud transaccional
      SqlSession session = DBManager.openSession();
      Boolean sinErrores = true;

      try {

        // Se verifica si se debe crear la empresa
        Long cias_cias = null;

        if (crearEmpresa) {
          cias_cias =
              OficinaPasantiaServicio.getInstance().crearEmpresaTransaccional(session, empresa);

          if (cias_cias != null) {
            solicitud.setScpp_cias(cias_cias);

          } else {
            sinErrores = false;
          }
        }

        if (sinErrores) {
          solicitudCreada =
              SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
                  .crearSolicitudTransaccional(
                      session, prepropuesta, estudiante, solicitud, mensajeError);

          if (solicitudCreada != null) {
            // Se deben crear los documentos anexos
            DocAnexoSolCartaPresentacionPasantiaServicio docAnexoServicio =
                DocAnexoSolCartaPresentacionPasantiaServicio.getInstance();

            ArrayList<DocAnexoSolCartaPresentacionPasantia> documentosAlmacenados =
                new ArrayList<DocAnexoSolCartaPresentacionPasantia>();

            for (DocAnexoSolCartaPresentacionPasantia docAnexo : documentos) {

              docAnexo.setDscpp_scpp(solicitudCreada.getScpp_scpp());
              docAnexo.setDscpp_usua(estudiante.getUsua_usua());
              sinErrores =
                  docAnexoServicio.crearDocumentoTransaccional(session, docAnexo) && sinErrores;
              documentosAlmacenados.add(docAnexo);
            }

            // Se revisa que no hayan ocurrido errores
            if (sinErrores) {

              solicitudCreada.setDocumentos(documentosAlmacenados);
              session.commit();

            } else {
              session.rollback();
              String error =
                  "Error: No fue posible crear la solicitud de elaboración de carta de presentación de pasantía. Error creando los documentos anexos";
              SimpleLogger.error(error);
              mensajeError.append(error);
              solicitudCreada = null;
            }

          } else {
            session.rollback();
            String error =
                "Error: No fue posible crear la solicitud de elaboración de carta de presentación de pasantía. Error desconocido 2";
            SimpleLogger.error(error);
            mensajeError.append(error);
            solicitudCreada = null;
          }

        } else {
          session.rollback();
          String error =
              "Error: No fue posible crear la solicitud de elaboración de carta de presentación de pasantía. Error creando la empresa de la pasantía";
          SimpleLogger.error(error);
          mensajeError.append(error);
          solicitudCreada = null;
        }

      } catch (Exception e) {
        session.rollback();
        String error = "Error: " + e.getMessage();
        SimpleLogger.error(error);
        mensajeError.append(error);
        solicitudCreada = null;
      } finally {
        session.close();
      }

    } catch (Exception e) {
      SimpleLogger.error("Error generando solicitud de carta de presentacion de pasantía ", e);
      solicitudCreada = null;
      mensajeError.append(
          "Error creando la solicitud de elaboración de carta de presentación de pasantía . No se ha podido finalizar la transacción correctamente");
    }

    return solicitudCreada;
  }
  /**
   * ========================================== ENVIO DE NOTIFICACIONES ==================
   * ==========================================
   */
  public Boolean enviarNotificacionesPorCreacionDeSolicitud(
      Prepropuesta prepropuesta, SolicitudCartaPresentacionPasantia solicitud) {
    // Se crean las notificaciones

    String emisor = Constantes.USUA_APP;
    Boolean sinErrores = true;

    if (solicitud != null) {

      String asunto =
          "Solicitud de Elaboración de Carta de Presentacion  de Pasantia. Solicitud  No. "
              + solicitud.getScpp_scpp();

      // Notificacion a los usuarios delegados de la oficina de pasantia
      try {

        ProyectoCurricular proyectoCurricular =
            ProyectoCurricularServicio.getInstance()
                .getProyectoCurricular(prepropuesta.getPrep_pcur());

        List<Usuario> usuariosDelegados =
            OficinaPasantiaServicio.getInstance()
                .getUsuariosDelegados(proyectoCurricular.getPcur_facu());

        if (usuariosDelegados != null && usuariosDelegados.size() > 0) {
          // Se crea una notificacion al proyecto curricular
          String mensaje =
              "Se ha registrado una nueva solcitud de elaboración de carta de presentación de pasantía No. "
                  + solicitud.getScpp_scpp()
                  + ". Por favor antender esta solicitud.";

          for (Usuario usuario : usuariosDelegados) {
            NotificacionServicio.getInstance()
                .generarNotificacionPorUsuario(emisor, asunto, mensaje, usuario.getUsua_usua());
          }
        }

      } catch (Exception e) {
        SimpleLogger.warn(
            "No se han podido enviar las notificaciones de solcitud de elaboración de carta de presentación de pasantía");
        sinErrores = false;
      }

      // Notificacion a los autores de la prepropuesta
      try {

        String mensaje =
            "Se ha registrado una nueva solcitud de elaboración de carta de presentación de pasantía No. "
                + solicitud.getScpp_scpp()
                + ". Su solicitud ha sido enviado a la instancia correspondiente.";

        List<Estudiante> autores = prepropuesta.getAutores();

        for (Estudiante autor : autores) {

          NotificacionServicio.getInstance()
              .generarNotificacionPorUsuario(emisor, asunto, mensaje, autor.getEstd_usua());
        }
      } catch (Exception e) {
        SimpleLogger.warn(
            "No se han podido enviar las notificaciones de solicitud de elaboración de carta de presentación de pasantía");
        sinErrores = false;
      }
    }

    return sinErrores;
  }