public SolicitudCartaPresentacionPasantia getSolicitud(Long scpp_scpp) {
    SolicitudCartaPresentacionPasantia solicitud =
        SolicitudCartaPresentacionPasantiaControllerDB.getInstance().getSolicitud(scpp_scpp);
    completarInformacionAdicionalSolicitud(solicitud);

    return solicitud;
  }
  public List<SolicitudCartaPresentacionPasantia> getSolicitudesPorPrepropuesta(Long prep_prep) {
    List<SolicitudCartaPresentacionPasantia> solicitudes =
        SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
            .getSolicitudesPorPrepropuesta(prep_prep);

    if (solicitudes != null) {
      for (SolicitudCartaPresentacionPasantia solicitud : solicitudes) {
        completarInformacionAdicionalSolicitud(solicitud);
      }
    }

    return solicitudes;
  }
  public List<SolicitudCartaPresentacionPasantia> getSolicitudesPorEstudiante(String estd_estd) {

    List<SolicitudCartaPresentacionPasantia> solicitudes =
        SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
            .getSolicitudesPorEstudiante(estd_estd);

    if (solicitudes != null) {
      for (SolicitudCartaPresentacionPasantia solicitud : solicitudes) {
        completarInformacionAdicionalSolicitud(solicitud);
      }
    }

    return solicitudes;
  }
  public List<SolicitudCartaPresentacionPasantia> getSolicitudesSinElaborar(Long ofpa_ofpa) {

    List<SolicitudCartaPresentacionPasantia> solicitudes =
        SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
            .getSolicitudesSinElaborar(ofpa_ofpa);

    if (solicitudes != null) {
      for (SolicitudCartaPresentacionPasantia solicitud : solicitudes) {
        completarInformacionAdicionalSolicitud(solicitud);
      }
    }

    return solicitudes;
  }
  public List<HistoricoSolicitudCartaPresentacionPasantia> getHistoricoPorSolicitud(
      Long scpp_scpp) {

    List<HistoricoSolicitudCartaPresentacionPasantia> listaHistorico =
        SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
            .getHistoricoPorSolicitud(scpp_scpp);

    // Se asocia la informacion de la persona asociada al usuario registrado en el historico
    if (listaHistorico != null && listaHistorico.size() > 0) {
      for (HistoricoSolicitudCartaPresentacionPasantia historicoSolicitudCartaPresentacionPasantia :
          listaHistorico) {

        completarInformacionAdicionalDeHistorico(historicoSolicitudCartaPresentacionPasantia);
      }
    }

    return listaHistorico;
  }
  public SolicitudCartaPresentacionPasantia rechazarSolicitud(
      Long scpp_scpp, String observacion, Usuario usuario, StringBuffer mensajeError) {

    SolicitudCartaPresentacionPasantia solcitudRechazada =
        SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
            .rechazarSolicitud(scpp_scpp, observacion, usuario.getUsua_usua());

    if (solcitudRechazada == null) {
      mensajeError.append("Error. No se puede rechazar la solicitud No " + scpp_scpp);

    } else {

      // Se completa la informacion adicional de la solicitud
      solcitudRechazada = getSolicitud(solcitudRechazada.getScpp_scpp());
    }

    return solcitudRechazada;
  }
  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;
  }
  /**
   * ========================================== OPERACIONES TRANSACCIONALES ==============
   * ==========================================
   */
  public Long getSiguienteID() {

    return SolicitudCartaPresentacionPasantiaControllerDB.getInstance().getSiguienteID();
  }
  public SolicitudCartaPresentacionPasantia finalizarSolicitudTransaccional(
      Long scpp_scpp,
      String observacion,
      Usuario usuario,
      DocAnexoSolCartaPresentacionPasantia cartaElaborada,
      StringBuffer mensajeError) {

    SqlSession session = DBManager.openSession();
    SolicitudCartaPresentacionPasantia solicitudFinalizada = null;

    try {
      SolicitudCartaPresentacionPasantia solicitud =
          SolicitudCartaPresentacionPasantiaControllerDB.getInstance()
              .finalizarSolicitudTransaccional(
                  session, scpp_scpp, observacion, usuario.getUsua_usua());

      if (solicitud != null) {
        // Se alamacena la carta de presentacion

        DocAnexoSolCartaPresentacionPasantiaServicio docAnexoServicio =
            DocAnexoSolCartaPresentacionPasantiaServicio.getInstance();

        Boolean sinErrores = true;
        Long idDoc = docAnexoServicio.getSiguienteID();

        cartaElaborada.setDscpp_scpp(solicitud.getScpp_scpp());
        cartaElaborada.setDscpp_dscpp(idDoc);
        cartaElaborada.setDscpp_usua(usuario.getUsua_usua());

        sinErrores =
            docAnexoServicio.crearDocumentoTransaccional(session, cartaElaborada) && sinErrores;

        if (sinErrores) {
          session.commit();
          solicitudFinalizada = getSolicitud(scpp_scpp);
        } else {
          session.rollback();
          String error = "Error al finalizar la solicitud No " + scpp_scpp + " Error 1";
          SimpleLogger.error(error);
          mensajeError.append(error);
          solicitudFinalizada = null;
        }

      } else {
        session.rollback();
        String error = "Error al finalizar la solicitud No " + scpp_scpp + " Error 2";
        SimpleLogger.error(error);
        mensajeError.append(error);
        solicitudFinalizada = null;
      }

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

    } finally {
      session.close();
    }

    return solicitudFinalizada;
  }