/**
   * Metodo que obtiene los movimientos de fondo de inversion
   *
   * @param cliente Bean de cliente
   * @param datosFondos Bean con los datos de fondos
   * @param bitacoraBean Bean de bitacora
   * @return Regresa los movimientos de fondos de inversion
   * @throws BusinessException Excepcion de negocio
   */
  public MovimientosFondosInversionBean getMovimientoFondoInversion(
      ClienteBean cliente, DatosEntradaMovimientosBean datosFondos, BitacoraBean bitacoraBean)
      throws BusinessException {

    MovimientosFondosInversionBean movimientos = new MovimientosFondosInversionBean();

    movimientos =
        MovimientosServiceReusableFunctions.txn390(datosFondos, bitacoraBean.getNombreClase());

    SantanderReferenciaService referencia =
        commonService.getReferencia(bitacoraBean.getNombreClase());
    bitacoraBean.setNumeroReferencia(referencia.getNumReferencia());
    bitacoraBean.setClaveUsuario(cliente.getClaveCliente());
    bitacoraBean.setNumeroCuenta(datosFondos.getCuenta());
    int estatus = movimientos.getCodigoStatus();
    if (estatus == 0) {
      bitacoraBean.setMensaje(
          SantanderConstantesService.MOVF + "0000CONSULTA DE MOVIMIENTOS INVERSION");
    } else {
      bitacoraBean.setMensaje(SantanderConstantesService.MOVF + estatus);
    }

    bitacoraBean.setClaveConcepto(SantanderConstantesService.CMFONDOS);
    commonService.registrarBitacora(bitacoraBean);
    if (movimientos.getMovimientosFondos() == null
        || movimientos.getMovimientosFondos().isEmpty()) {

      throw new BusinessException("MOVFON-1");
    }
    return movimientos;
  }
  /**
   * Método que obtiene los ultimos 5 movimientos de una cuenta.
   *
   * @param cliente ClienteBean.
   * @param datosMovimientos Datos para la consulta.
   * @param bitacoraBean Objeto para bitacorizar.
   * @param tipoProducto Tipo de producto a consultar (CC, TC, FI, IV)
   * @throws BusinessException Excepción lanzada si no se puede ejecutar el servicio.
   */
  public Object getUltMvtos(ClienteBean cliente, DatosUltMvtos datos, BitacoraBean bitacoraBean)
      throws BusinessException, ParseException {

    log.debug("*****************ENTRO A CONSULTA ULTIMOS 5 MOVIMIENTOS************");
    if (cliente == null) {
      throw new BusinessException("MOVIMIENTOS");
    }

    String tipoConsulta = datos.getTipoConsulta();
    boolean restaranio = false;

    // Obtencion de fechas inicial y final
    String sdiaFrom = "", smesFrom = "", sanioFrom = "";
    String sdiaTo = "", smesTo = "", sanioTo = "";

    GregorianCalendar gc = new GregorianCalendar();
    Date trialTime = new Date();
    gc.setTime(trialTime);

    // se obtiene fecha inicial
    int idiaTo = gc.get(Calendar.DAY_OF_MONTH);
    int imesTo = gc.get(Calendar.MONTH);
    int ianioTo = gc.get(Calendar.YEAR);

    sdiaTo = Integer.toString(idiaTo);
    sanioTo = Integer.toString(ianioTo);
    smesTo = getMesFromNumber(imesTo);

    if (imesTo <= 2) {
      restaranio = true;
    }

    // Se reduce la fecha tres meses
    gc.roll(Calendar.MONTH, -2);

    // se obtiene la fecha final
    int idiaFrom = gc.get(Calendar.DAY_OF_MONTH);
    int imesFrom = gc.get(Calendar.MONTH);
    int ianioFrom = gc.get(Calendar.YEAR);

    if (restaranio) {
      ianioFrom -= 1;
    }

    sdiaFrom = Integer.toString(idiaFrom);
    sanioFrom = Integer.toString(ianioFrom);
    smesFrom = getMesFromNumber(imesFrom);

    String from = sdiaFrom + "/" + smesFrom + "/" + sanioFrom;
    String to = sdiaTo + "/" + smesTo + "/" + sanioTo;

    System.out.println("From: " + from);
    System.out.println("To: " + to);

    datos.setFecha(to);
    datos.setFechaDia(to);
    datos.setFechaHistorica(from);

    if (tipoConsulta.equals("CC") || tipoConsulta.equals("IV")) {
      log.debug("*********************ENTRA EN CONSULTA DE CUENTA DE CHEQUES*********************");
      DatosConsultaMovimientosBean bean = new DatosConsultaMovimientosBean();

      bean.setCuenta(datos.getCuenta());
      bean.setFechaDia(datos.getFechaDia());
      bean.setFechaHistorica(datos.getFechaHistorica());
      bean.setImporte(datos.getImporte());
      bean.setTipoCuenta(datos.getTipoCuenta());
      bean.setTipoMovimiento(datos.getTipoMovimiento());

      return getMovimientoCuentasChequeras(cliente, bean, bitacoraBean);
    }
    if (tipoConsulta.equals("TC")) {
      log.debug(
          "*********************ENTRA EN CONSULTA DE TARJETAS DE CREDITO*********************");
      DatosEntradaMovimientosBean bean = new DatosEntradaMovimientosBean();

      bean.setCuenta(datos.getCuenta());
      bean.setDespliega(datos.getDespliega());
      bean.setExtracto(datos.getExtracto());
      bean.setFecha(datos.getFecha());
      bean.setFechaHistorica(datos.getFechaHistorica());
      bean.setNumeroExtracto(datos.getNumeroExtracto());
      bean.setTasaAnualizada(datos.getTasaAnualizada());
      bean.setTipoOperacion(datos.getTipoOperacion());
      bean.setTipoProducto(datos.getTipoProducto());

      return getMovimientoTarjetacredito(cliente, bean, bitacoraBean);
    }
    if (tipoConsulta.equals("FI")) {
      log.debug(
          "*********************ENTRA EN CONSULTA DE FONDOS DE INVERSION*********************");

      DatosEntradaMovimientosBean bean = new DatosEntradaMovimientosBean();

      bean.setCuenta(datos.getCuenta());
      bean.setDespliega(datos.getDespliega());
      bean.setExtracto(datos.getExtracto());
      bean.setFecha(datos.getFecha());
      bean.setFechaHistorica(datos.getFechaHistorica());
      bean.setNumeroExtracto(datos.getNumeroExtracto());
      bean.setTasaAnualizada(datos.getTasaAnualizada());
      bean.setTipoOperacion(datos.getTipoOperacion());
      bean.setTipoProducto(datos.getTipoProducto());

      return getMovimientoFondoInversion(cliente, bean, bitacoraBean);
    }
    if (tipoConsulta.equals("IV")) {
      log.debug(
          "*********************ENTRA EN CONSULTA DE INVERSION VISTA*************************");
    }
    return null;
  }
  /**
   * Metodo que obtiene los movimientos de la tarjeta de credito
   *
   * @param cliente Bean de cliente
   * @param datosTarjeta Bien de los datos de la tarjeta
   * @param bitacoraBean Bean de bitacora
   * @return Regresa los movimeintos de las tarjetas de credito
   * @throws BusinessException Excepcion de negocio
   */
  public MovimientosTarjetasCreditoBean getMovimientoTarjetacredito(
      ClienteBean cliente, DatosEntradaMovimientosBean datosTarjeta, BitacoraBean bitacoraBean)
      throws BusinessException {

    Validator.valida(cliente, CLAVE_MODULO_MOVIMIENTO_TARJETA);
    String tramaDiasInhabil;
    String diasInhabiles[];
    TramaDiasInhabiles tramaSiasInhabiles = new TramaDiasInhabiles();
    tramaDiasInhabil = tramaSiasInhabiles.getTramaDiasInhabiles();
    diasInhabiles = SantanderUtileriasService.desentrama(tramaDiasInhabil, '|');

    MovimientosTarjetasCreditoBean movimientoTarjetaBean = null;

    String[] fechas = null;

    if (StringUtils.equals(datosTarjeta.getTipoOperacion(), "Fechas")) {

      fechas = new String[4];
      fechas[3] = tramaDiasInhabil;
      fechas[0] = MovimientosServiceReusableFunctions.AnteriorDiaHabil(2, diasInhabiles);
      fechas[2] = MovimientosServiceReusableFunctions.AnteriorDiaHabil(1, diasInhabiles);
      fechas[1] = MovimientosServiceReusableFunctions.InicioDelMes(fechas[2]);

      if (cliente.getTarjetas() == null) {
        throw new BusinessException("MOVT-MT-2");
      }
      movimientoTarjetaBean = new MovimientosTarjetasCreditoBean();
      if (StringUtils.equals(datosTarjeta.getCuenta(), "-1")) {
        movimientoTarjetaBean.setFechas(fechas);
        movimientoTarjetaBean.setCuenta(datosTarjeta.getCuenta());
        return movimientoTarjetaBean;
      } else {
        boolean esTarjetaTitular = false;
        Iterator itera = (Iterator) cliente.getTarjetas().iterator();
        while (itera.hasNext()) {
          TarjetaBean tarjetaPropia = (TarjetaBean) itera.next();

          if (tarjetaPropia.getNumeroTarjeta().equals(datosTarjeta.getCuenta())) {
            if (tarjetaPropia.getParticipacion().equals("TI")) {
              esTarjetaTitular = true;
              break;
            }
          }
        }
        log.debug("VALOR DE TITULAR****** " + esTarjetaTitular);
        if (!esTarjetaTitular) { // si NO es Titular - SE DESPLEGARAN
          // EXTRACTOS
          SantanderReferenciaService referencia =
              commonService.getReferencia(bitacoraBean.getNombreClase());

          MovimientosBean extractos =
              MovimientosServiceReusableFunctions.obtenerExtractoTarjetasPAMPA(
                  datosTarjeta.getCuenta(), bitacoraBean.getNombreClase(), referencia);
          if (Integer.parseInt(extractos.getMensajeStatus()) != 0) {
            throw new BusinessException("MOVIMIENTOS");
          } else {
            movimientoTarjetaBean = new MovimientosTarjetasCreditoBean();
            movimientoTarjetaBean.setExtractos(extractos);
            movimientoTarjetaBean.setCuenta(datosTarjeta.getCuenta());
            movimientoTarjetaBean.setFechas(fechas);
          }

        } else { // si ES Titular - SE DESPLEGARAN FECHAS

          movimientoTarjetaBean = new MovimientosTarjetasCreditoBean();
          movimientoTarjetaBean.setCuenta(datosTarjeta.getCuenta());
          movimientoTarjetaBean.setFechas(fechas);
        }
        return movimientoTarjetaBean;
      }
    }

    if (StringUtils.equals(datosTarjeta.getTipoOperacion(), "TarjetaCredito")) {

      boolean aurizado = false;
      movimientoTarjetaBean = new MovimientosTarjetasCreditoBean();
      try {
        Iterator itera = (Iterator) cliente.getTarjetas().iterator();

        while (itera.hasNext()) {
          TarjetaBean tarjeta = (TarjetaBean) itera.next();
          if (tarjeta.getNumeroTarjeta().equalsIgnoreCase(datosTarjeta.getCuenta())) {
            aurizado = true;
            break;
          }
        }
        log.debug("VALOR de autorizado*********** " + aurizado);
        if (!aurizado) {
          log.debug("Se trato de hacer una operacion invalida...");
          throw new BusinessException("MOVT-MT-3");
        }
      } catch (Exception e) {
        throw new BusinessException("MOVIMIENTOS");
      }

      MovimientosFinalesContainerBean movimientosTarjeta = null;

      log.debug("entro en obtener movimientos***********");
      boolean estaBloqueada =
          MovimientosServiceReusableFunctions.ServicioValidaBloqueo(
              datosTarjeta.getCuenta(), bitacoraBean.getNombreClase());
      SantanderReferenciaService referencia =
          commonService.getReferencia(bitacoraBean.getNombreClase());
      log.debug("Valor de bloqueada********" + estaBloqueada);
      if (!estaBloqueada) {
        // String tasaAnualizada = null;
        log.debug("ENTRO en !esBloquedada");
        if (StringUtils.equals(datosTarjeta.getDespliega(), "extractos")) {

          log.debug("ENTro en extractos!!!!!");
          movimientosTarjeta =
              MovimientosServiceReusableFunctions.obtenerMovimientosExtracto(
                  datosTarjeta.getNumeroExtracto(),
                  datosTarjeta.getExtracto().getMonedaExtracto(),
                  datosTarjeta.getCuenta(),
                  datosTarjeta.getExtracto().getTasaAnualizada(),
                  bitacoraBean,
                  String.valueOf(referencia.getNumReferencia()));
          log.debug("MOVIMIENTOS TARJETA" + movimientosTarjeta.toString());

        } else { // Si viene de Fechas consulta por MPV3
          log.debug("Sin extractos!!!!!");
          movimientosTarjeta =
              MovimientosServiceReusableFunctions.obtenerMovsTarjetaPAMPA(
                  datosTarjeta.getFechaHistorica(),
                  datosTarjeta.getFecha(),
                  datosTarjeta.getCuenta(),
                  bitacoraBean,
                  String.valueOf(referencia.getNumReferencia())); // PAMPAIII
        }
      }

      if (movimientosTarjeta.getListaMovimientos() == null) {
        throw new BusinessException("MOVT-MT-3");
      }
      if (estaBloqueada) {
        throw new BusinessException("MOVT-MT-4");
      }

      bitacoraBean.setNumeroReferencia(referencia.getNumReferencia());
      bitacoraBean.setNumeroCuenta(datosTarjeta.getCuenta());
      String mensajeStatus = SantanderConstantesService.MOVT; // +
      // movimientosTarjeta.getMensajeStatus().substring(4);
      bitacoraBean.setMensaje(mensajeStatus);
      bitacoraBean.setClaveUsuario(cliente.getClaveCliente());
      commonService.registrarBitacora(bitacoraBean);

      movimientoTarjetaBean.setMovimientos(movimientosTarjeta);
      movimientoTarjetaBean.setCuenta(datosTarjeta.getCuenta());
      movimientoTarjetaBean.setFechaHistorica(datosTarjeta.getFechaHistorica());
      movimientoTarjetaBean.setFecha(datosTarjeta.getFecha());
    }
    if (movimientoTarjetaBean == null) {
      throw new BusinessException("MOVIMIENTOS");
    }
    return movimientoTarjetaBean;
  }