/**
   * 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;
  }
  /**
   * Este método obtenerMovimientosCheques se encuentra en el paquete
   * com.santander.supernet.web.servlets.consultas en el servlet Movimientos.
   *
   * @param datosMovimientos datos de los movimientos
   * @param usuario usuario
   * @param referencia Referncia
   * @param nombreClase Nombre de la clase
   * @return Regresa un movimiento
   * @throws ParseException Excepcion de parse
   * @throws BusinessException excepiocn de negocio
   */
  private MovimientosBean obtenerMovimientosCheques(
      DatosConsultaMovimientosBean datosMovimientos,
      String usuario,
      String referencia,
      String nombreClase)
      throws BusinessException, ParseException {
    log.debug("*******ENTRO EN OBTENRE MOVIMIENTOS CHEQUES***********");
    MovimientosBean movimientosCuentasChequerasBean = new MovimientosBean();
    log.debug("TIPO MOVIMIENTO " + datosMovimientos.getTipoMovimiento());
    char tipoMovimiento = 'T';
    if (datosMovimientos.getTipoMovimiento().equals("Retiros")) {
      tipoMovimiento = 'C';
    } else {
      if (datosMovimientos.getTipoMovimiento().equals("Depositos")) {
        tipoMovimiento = 'A';
        log.debug("TIPO MOVIMIENTO " + tipoMovimiento);
      } else {
        tipoMovimiento = 'T';
      }
    }
    log.debug("TIPO MOVIMIENTO " + tipoMovimiento);
    if (datosMovimientos.getTipoCuenta().equals("Vista")) {
      datosMovimientos.setTipoCuenta("V");
    } else {
      if (datosMovimientos.getTipoCuenta().equals("Cheques")) {
        datosMovimientos.setTipoCuenta("C");
      }
    }

    String fechaInicio =
        datosMovimientos.getFechaHistorica().substring(6)
            + "-"
            + datosMovimientos.getFechaHistorica().substring(3, 5)
            + "-"
            + datosMovimientos.getFechaHistorica().substring(0, 2);
    log.debug("FECHA INICIO " + fechaInicio);
    String fechaFin =
        datosMovimientos.getFechaDia().substring(6)
            + "-"
            + datosMovimientos.getFechaDia().substring(3, 5)
            + "-"
            + datosMovimientos.getFechaDia().substring(0, 2);
    log.debug("FECHA FIN " + fechaFin);

    SantanderMovimientoCuentaService servicioMovimientos = null;
    // synchronized (this) {
    log.debug("**************ENTRO EN SINCONIZADO******************");
    log.debug("CUENTA " + datosMovimientos.getCuenta());
    log.debug("REFERENCIA " + referencia);
    log.debug("FECHA INICIO " + fechaInicio);
    log.debug("FECHA FIN " + fechaFin);
    log.debug("TIPO MOVIMIENTO " + tipoMovimiento);
    log.debug("TIPO CUENTA " + datosMovimientos.getTipoCuenta());
    log.debug("IMPORTE " + datosMovimientos.getImporte());
    log.debug("NOMBRE CLASE " + nombreClase);
    log.debug("datosMovimientos.getImporte() " + datosMovimientos.getImporte());
    if (StringUtils.equals(datosMovimientos.getImporte(), "")
        || StringUtils.isEmpty(datosMovimientos.getImporte())
        || StringUtils.isBlank(datosMovimientos.getImporte())) {
      datosMovimientos.setImporte("0.00");
    }
    try {
      servicioMovimientos = new SantanderMovimientoCuentaService();

      servicioMovimientos = new SantanderMovimientoCuentaService();
      servicioMovimientos.setNumeroCuenta(datosMovimientos.getCuenta());
      servicioMovimientos.setReferencia(referencia);
      servicioMovimientos.setFechaInicio(fechaInicio);
      servicioMovimientos.setFechaFin(fechaFin);
      servicioMovimientos.setTipoMovimiento(tipoMovimiento);
      servicioMovimientos.setTipoCuenta(datosMovimientos.getTipoCuenta());
      servicioMovimientos.setImporte(datosMovimientos.getImporte());
      servicioMovimientos.setNombreClase(nombreClase);

      log.debug("**************ANTES DE EJECUTA******************");
      servicioMovimientos.ejecuta();
      log.debug("**************DESPUES DE EJECUTAR******************");
    } catch (Error e) {
      throw new BusinessException("B401-00");
    }

    // }
    List<MovimientosChequerasBean> listaMovimientos = new ArrayList<MovimientosChequerasBean>();
    MovimientosChequerasBean movimientosChequeraBean = null;
    log.debug("Codigo de status " + servicioMovimientos.getCodigoEstatus());
    if (servicioMovimientos.getCodigoEstatus() == 0) {

      log.debug("Entro en codigo de status 0");

      Hashtable movimientos = servicioMovimientos.getMovimientos();
      log.debug("MUESTRA LOS MOVIMIENTOS SIZE " + movimientos.size());
      log.debug("MUESTRA LOS MOVIMIENTOS " + movimientos.toString());
      for (int i = 0; i < movimientos.size(); i++) {
        log.debug("*******ENTRO EN EL FOR*********");

        String cantidades[] = (String[]) movimientos.get(String.valueOf(i));
        movimientosChequeraBean = new MovimientosChequerasBean();
        log.debug("fechaOperante " + cantidades[0]);
        log.debug("fecha Operante 2 " + Utils.sdfMovimientosCheques.parse(cantidades[0]));
        log.debug("fecha " + Utils.sdf.format(Utils.sdfMovimientosCheques.parse(cantidades[0])));
        movimientosChequeraBean.setFechaOperante(
            Utils.sdf.format(Utils.sdfMovimientosCheques.parse(cantidades[0])));
        movimientosChequeraBean.setCodigoAmpliado(cantidades[1]);
        movimientosChequeraBean.setReferenciaInterna(cantidades[2]);
        if (!cantidades[3].equals("")) {
          cantidades[3] = MovimientosServiceReusableFunctions.formateaCantidades(cantidades[3]);
          movimientosChequeraBean.setMontoCargo(cantidades[3]);
        }
        if (!cantidades[4].equals("")) {
          cantidades[4] = MovimientosServiceReusableFunctions.formateaCantidades(cantidades[4]);
          movimientosChequeraBean.setMontoAbono(cantidades[4]);
        }
        movimientosChequeraBean.setCentroUmo(cantidades[5]);
        movimientosChequeraBean.setHoraFinal(cantidades[6]);
        if (!cantidades[7].equals("")) {
          cantidades[7] = MovimientosServiceReusableFunctions.formateaCantidades(cantidades[7]);
          movimientosChequeraBean.setSaldoFinal(cantidades[7]);
        }
        movimientosChequeraBean.setObservaciones(cantidades[8]);
        // Se agrega el set de referencia SPEI se separa de observaciones (concepto)
        movimientosChequeraBean.setReferenciaSPEI(cantidades[9]);
        log.debug("movimientosChequeraBean********* " + movimientosChequeraBean.toString());
        log.debug("TIPO MOVIMIENTO ********* " + tipoMovimiento);
        if (movimientosChequeraBean.getMontoAbono() != null && tipoMovimiento == 'A') {
          log.debug("***********ENTRO EN TIPO MOVIMIENTO A ********* ");
          log.debug("MONTO ABONO ********* " + movimientosChequeraBean.getMontoAbono());

          listaMovimientos.add(movimientosChequeraBean);
        } else {
          log.debug("ENTRO EN EL ELSE DE TIPO DE MOVIMIENTO " + listaMovimientos.size());
          if (movimientosChequeraBean.getMontoCargo() != null && tipoMovimiento == 'C') {
            log.debug("ENTRO EN TIPO MOVIMIENTO C ********* ");
            listaMovimientos.add(movimientosChequeraBean);
          } else {
            log.debug("ENTRO EN EL SEGUNDO ELSE DE TIPO DE MOVIMIENTO " + listaMovimientos.size());
            if (tipoMovimiento == 'T') {
              log.debug("ENTRO EN TIPO MOVIMIENTO T ********* ");
              listaMovimientos.add(movimientosChequeraBean);
            }
          }
        }
        log.debug("*****LISTA EN EL FOR " + listaMovimientos.size());
        // movimientos.put(String.valueOf(i), cantidades);

      }
      if (movimientosChequeraBean != null) {
        movimientosCuentasChequerasBean.setImporte(movimientosChequeraBean.getSaldoFinal());
      }
      log.debug("tamanio de la lista " + listaMovimientos.size());
      // log.debug("lista  datos" + listaMovimientos.toString());

      if (listaMovimientos.size() == 0) {
        throw new BusinessException("MOVC-MCC-3");
      }
      movimientosCuentasChequerasBean.setListaMovimientos(listaMovimientos);
      movimientosCuentasChequerasBean.setMensajeStatus(servicioMovimientos.getMensajeEstatus());
    } else if (servicioMovimientos.getCodigoEstatus() == -9) { // Inicio: ELIMINACIÓN OFFLINE
      throw new BusinessException("OFF-LINE"); // Fin: ELIMINACIÓN OFFLINE
    } else {
      throw new BusinessException("MOVC-MCC-2");
    }

    return movimientosCuentasChequerasBean;
  }
  /**
   * Metodo para obtener los movimientos de credito personal
   *
   * @param cliente Bean del cliente
   * @param entrada Bean de movimientos de entrada
   * @param bitacoraBean Bean de bitacora
   * @return Lista de movimientos de las tarjetas de cédito.
   * @throws BusinessException Excepcion lanzada
   */
  public List<CreditoConsumoMovBean> getMovimientoCreditoPersonal(
      ClienteBean cliente, DatosConsultaMovimientosBean entrada, BitacoraBean bitacoraBean)
      throws BusinessException {

    List<CreditoConsumoMovBean> movimientos = new ArrayList<CreditoConsumoMovBean>();
    String importe = "";

    bitacoraBean.setClaveUsuario(cliente.getClaveCliente());

    if (!"0.00".equals(entrada.getImporte())) {
      importe = entrada.getImporte();
    }

    if (PROD_ALTAIR.equals(entrada.getTipoCuenta())) {
      SantanderConsultaMovContratosPersonas consultaMovimientosAltair =
          new SantanderConsultaMovContratosPersonas();

      String fechaInicio =
          entrada.getFechaHistorica().substring(6)
              + "-"
              + entrada.getFechaHistorica().substring(3, 5)
              + "-"
              + entrada.getFechaHistorica().substring(0, 2);
      String fechaFin =
          entrada.getFechaDia().substring(6)
              + "-"
              + entrada.getFechaDia().substring(3, 5)
              + "-"
              + entrada.getFechaDia().substring(0, 2);

      String[] datos = {entrada.getCuenta(), fechaInicio, fechaFin};

      if (consultaMovimientosAltair.ejecuta(datos)) {
        movimientos =
            getMovimientosFiltrados(
                entrada.getTipoMovimiento(), importe, consultaMovimientosAltair.getMovimientos());
        registraBitacoraCP(
            bitacoraBean,
            entrada.getCuenta(),
            entrada.getImporte(),
            "0000 OPERACION REALIZADA EXITOSAMENTE");
      } else {
        registraBitacoraCP(
            bitacoraBean, entrada.getCuenta(), entrada.getImporte(), "9999 OPERACION FALLIDA");
        throw new BusinessException("LB14-0");
      }
    } else {
      List<CreditoConsumoMovBean> movimientosTotal = new ArrayList<CreditoConsumoMovBean>();
      SantanderMovtosAltamiraService consultaMovimientosAltamira =
          new SantanderMovtosAltamiraService();
      DetalleCreditoAltamiraBean detalleCreditoAltamira = new DetalleCreditoAltamiraBean();

      String fechaInicio =
          entrada.getFechaHistorica().substring(8, 10)
              + entrada.getFechaHistorica().substring(3, 5)
              + entrada.getFechaHistorica().substring(0, 2);
      log.debug("FECHA INICIO " + fechaInicio);
      String fechaFin =
          entrada.getFechaDia().substring(8, 10)
              + entrada.getFechaDia().substring(3, 5)
              + entrada.getFechaDia().substring(0, 2);
      log.debug("FECHA FIN " + fechaFin);

      detalleCreditoAltamira.setNumeroDeCredito(entrada.getCuenta());
      detalleCreditoAltamira.setFechaDesde(fechaInicio);
      detalleCreditoAltamira.setFechaHasta(fechaFin);

      consultaMovimientosAltamira.ejecutarTransaccion(detalleCreditoAltamira);
      if (consultaMovimientosAltamira.getCodStatus() == 0) {
        for (SaldosCreditoAltamiraBean saldosAltamira :
            consultaMovimientosAltamira.getListaSaldos()) {
          CreditoConsumoMovBean movContratoPersonas = new CreditoConsumoMovBean();
          movContratoPersonas.setConcepto(saldosAltamira.getConcepto().trim());
          movContratoPersonas.setRetiro(saldosAltamira.getCargo().trim());
          movContratoPersonas.setFecha(saldosAltamira.getFechaDeOperacion().trim());
          movContratoPersonas.setDeposito(saldosAltamira.getAbono().trim());
          movContratoPersonas.setReferencia(saldosAltamira.getReferencia().trim());
          movimientosTotal.add(movContratoPersonas);
        }
        movimientos =
            getMovimientosFiltrados(entrada.getTipoMovimiento(), importe, movimientosTotal);
        registraBitacoraCP(
            bitacoraBean,
            entrada.getCuenta(),
            entrada.getImporte(),
            "0000 OPERACION REALIZADA EXITOSAMENTE");
      } else {
        registraBitacoraCP(
            bitacoraBean, entrada.getCuenta(), entrada.getImporte(), "9999 OPERACION FALLIDA");
        throw new BusinessException("LB14-0");
      }
    }
    return movimientos;
  }
  /**
   * Metodo que obtiene los movimientos realizados por cada cuenta o chequera del cliente.
   *
   * @param cliente Bean del Cliente
   * @param datosMovimientos Bean de los datos con mivimeintos
   * @param bitacoraBean Bean de bitacora
   * @return MovimientosBean Bean con los movimientos
   * @author Igor Mejia
   * @throws ParseException Excepxion al parsear
   * @throws BusinessException Excepcion de negocio
   */
  public MovimientosBean getMovimientoCuentasChequeras(
      ClienteBean cliente, DatosConsultaMovimientosBean datosMovimientos, BitacoraBean bitacoraBean)
      throws BusinessException, ParseException {

    boolean autorizadoPesos = false;
    boolean autorizadoDolares = false;

    Validator.valida(cliente, CLAVE_MODULO_MOVIMIENTO_CUENTA);
    log.debug("*****************ENTRO A MOVIMIENTOS CUENTAS CHEQUERAS************");
    if (cliente == null) {
      throw new BusinessException("MOVIMIENTOS");
    }
    Iterator itera = (Iterator) cuentaService.getCuentasPropias(cliente).iterator();
    while (itera.hasNext()) {
      CuentaBean cuenta = (CuentaBean) itera.next();
      String cuentaVista =
          MovimientosServiceReusableFunctions.getCuentaVista(
              cliente.getClaveCliente(),
              cuenta.getNumeroCuenta(),
              cuenta.getSucursal(),
              NOMBRE_CALSE);
      if (cuenta.getNumeroCuenta().equalsIgnoreCase(datosMovimientos.getCuenta())
          || datosMovimientos.getCuenta().equalsIgnoreCase(cuentaVista)) {
        autorizadoPesos = true;
        break;
      }
    }
    if (cliente.isDolares()) {
      Iterator iter = (Iterator) cuentaService.getCuentasPropiasDolares(cliente).iterator();

      while (iter.hasNext()) {
        CuentaBean cuentaDolares = (CuentaBean) iter.next();
        String cuentaVistaDolares =
            MovimientosServiceReusableFunctions.getCuentaVista(
                cliente.getClaveCliente(),
                cuentaDolares.getNumeroCuenta(),
                cuentaDolares.getSucursal(),
                NOMBRE_CALSE);

        if (!cuentaDolares.getNumeroCuenta().equalsIgnoreCase(datosMovimientos.getCuenta())
            && datosMovimientos.getCuenta().equalsIgnoreCase(cuentaVistaDolares)) {
          autorizadoDolares = true;
          break;
        }
      }
    }

    if (!autorizadoPesos && !autorizadoDolares) {
      if (datosMovimientos.getTipoCuenta().equals(TIPO_CUENTA_VISTA)) {
        throw new BusinessException("MOVC-MCC-1");
      } else throw new BusinessException("MOVC-MCC-1");
    }

    SantanderReferenciaService referencia =
        commonService.getReferencia(bitacoraBean.getNombreClase());

    MovimientosBean movimientosBean =
        obtenerMovimientosCheques(
            datosMovimientos,
            cliente.getClaveCliente(),
            String.valueOf(referencia.getNumReferencia()),
            bitacoraBean.getNombreClase());

    if (movimientosBean.getListaMovimientos() == null
        && movimientosBean.getMensajeStatus() == null
        && movimientosBean.getImporte() == null) {

      throw new BusinessException("MOVIMIENTOS");
    }

    String mensaje =
        SantanderConstantesService.MOVC + movimientosBean.getMensajeStatus().substring(4);

    bitacoraBean.setNumeroReferencia(referencia.getNumReferencia());
    bitacoraBean.setNumeroCuenta(datosMovimientos.getCuenta());
    bitacoraBean.setImporte(movimientosBean.getImporte());
    bitacoraBean.setClaveUsuario(cliente.getClaveCliente());
    bitacoraBean.setMensaje(mensaje);
    bitacoraBean.setClaveConcepto(SantanderConstantesService.CMCHEQUES);
    commonService.registrarBitacora(bitacoraBean);

    return movimientosBean;
  }