// 'Luis Gachuz, 29/Mar/2003
  // 'Modificaciòn para recibir el nuevo paràmetro ic_Trad
  public final RespuestaFondosVO calculaMontoFondos(
      final ParFondosVO fondosVO, final SantanderSecurityContext sc) throws Exception {
    /*
     * '15032002 GSP.
     * Calcula el monto de la operación si se proporcionan los títulos
     * 'Se regresa una cadena con el monto calculado
     */

    String rateCode = "";
    String strCountry = "";
    String strFundPrice = "";
    String icCon = "";
    String branch = "";
    String ctaContrato = "";
    String user = "";
    String vatrate = "";
    double dblComision = 0.0;
    double dblIva = 0.0;
    double dblMontoBruto = 0.0;
    double dblMontoNeto = 0.0;
    double dblCalcQty = 0.0;
    ValidaContratoVO contratoVO = new ValidaContratoVO();
    RespuestaFondosVO clientInformationVO = new RespuestaFondosVO();
    RespuestaFondosVO issuingVO = new RespuestaFondosVO();
    RespuestaFondosVO commRateVO = new RespuestaFondosVO();
    RespuestaFondosVO respFondosVO = new RespuestaFondosVO();

    /*
     * Se llama al método de validaContrato para obtener
     * valores que se necesitan
     * pasar como parametros para otros metodos.
     */
    branch = fondosVO.getBranch();
    ctaContrato = fondosVO.getContrato();
    user = sc.getPrivilegiosUsuario().getTrad();

    contratoVO = commonDAO.validaContrato(branch, ctaContrato, user);

    icCon = contratoVO.getCno();

    /*===================================================================*/
    /*             Obtenemos la información del cliente.                 */
    /*===================================================================*/
    clientInformationVO = capturaFondosDAO.readClientInformation(icCon.trim());
    if (clientInformationVO != null) {
      if (clientInformationVO.getStatus() != 0) {
        respFondosVO.setError(String.valueOf(clientInformationVO.getStatus()));
        if (!fondosVO.isBlError()) {
          return respFondosVO;
        }
      }
    } else {
      respFondosVO.setError(
          "Error al ejecutar el Store Procedure:" + "\n" + "SPS_READ_CLIENT_INFORMATION. ");
      if (!fondosVO.isBlError()) {
        return respFondosVO;
      }
    }

    log.debug("clientInformationVO[0]" + clientInformationVO.getStrClientInfo()[0]);
    log.debug("clientInformationVO[1]" + clientInformationVO.getStrClientInfo()[1]);

    /*===================================================================*/
    /*         Obtenemos la ciudad a la que corresponde el branch.       */
    /*===================================================================*/
    strCountry = capturaFondosDAO.readBranchCountry(branch);
    if (strCountry.trim().equals("Error")) {
      respFondosVO.setError("Error al obtener la ciudad del branch.");
      if (!fondosVO.isBlError()) {
        return respFondosVO;
      }
    } else if (strCountry == null) {
      strCountry = "";
    } else {
      strCountry = strCountry.trim();
    }
    log.debug("strCountry " + strCountry);
    /*===================================================================*/
    /*                  Valida la moneda de la emisora.                  */
    /*===================================================================*/
    issuingVO = validateIssuing(fondosVO.getEmisora(), fondosVO.getMoneda());
    DatosTabulares dt = null;

    if (issuingVO.getError() == null || issuingVO.getError().trim().length() == 0) {
      dt = issuingVO.getResp();
    } else {
      respFondosVO.setError(issuingVO.getError());
      if (!fondosVO.isBlError()) {
        return respFondosVO;
      }
    }

    /*===================================================================*/
    /*             Se obtiene el precio del fondo de inversión.          */
    /*===================================================================*/
    strFundPrice = capturaFondosDAO.readFundPrice(fondosVO.getBranch(), fondosVO.getEmisora());

    if (strFundPrice.trim().equals("Error")) {
      log.debug("No se encontro el precio del Fondo de Inversión.");
      respFondosVO.setError(ErrorKeys.ERR_NO_ENCONTRO_PRECIO_FONDO);
      if (!fondosVO.isBlError()) {
        return respFondosVO;
      }
    } else if (strFundPrice == null) {
      strFundPrice = "";
    }

    log.debug("strFundPrice " + strFundPrice);

    String ccode = "";

    if (clientInformationVO.getStrClientInfo()[1] != null) {
      ccode = clientInformationVO.getStrClientInfo()[1].trim();
    }

    /*===================================================================*/
    /*                          Obtenemos el IVA                         */
    /*===================================================================*/
    vatrate =
        capturaFondosDAO.getClientesVatRate(
            fondosVO.getBranch(), fondosVO.getContrato(), contratoVO.getCno(), ccode, strCountry);

    log.debug("==== vatrate " + vatrate);

    if (vatrate == null) {
      vatrate = "";
      // vatrate = "10";
    } else if (vatrate.trim().equals("Error")) {
      respFondosVO.setError("Error al ejecutar el Store Procedure SPS_OBTIENE_IVA.");
      if (!fondosVO.isBlError()) {
        return respFondosVO;
      }
    }
    // 'Luis Gachuz, 29/Mar/2003
    // 'Se le envìan nuevos paràmetros ic_Secid, ic_Trad
    /*===================================================================*/
    /*                      Obtenemos la comision.                       */
    /*===================================================================*/

    String product;
    String prodType;

    if (dt == null) {
      product = "";
      prodType = "";
    } else {
      product = dt.get(0, colProduct).toString().trim();
      prodType = dt.get(0, colProdType).toString().trim();
    }

    log.debug("product " + product);
    log.debug("prodType " + prodType);
    log.debug("Vatrate " + vatrate);

    commRateVO =
        capturaFondosDAO.getClientCommission(
            sc,
            fondosVO.getBranch(),
            fondosVO.getContrato(),
            product,
            prodType,
            rateCode,
            fondosVO.getTitulos(),
            fondosVO.getMonto(),
            vatrate,
            fondosVO.getCompraVenta(),
            fondosVO.getEmisora(),
            fondosVO.getPromotor());
    if (commRateVO != null) {
      if (commRateVO.getStatus() != 0 || commRateVO.getError() != null) {
        respFondosVO.setError(commRateVO.getError());
        if (!fondosVO.isBlError()) {
          return respFondosVO;
        }
      }
    } else {
      commRateVO.setOnCommrate(null);
    }

    log.debug("IVA " + commRateVO.getOnCommrate());
    /*===================================================================*/
    /*                         Se calcula el monto                       */
    /*===================================================================*/
    double fundPrice = 0;
    double dblCommrate = 0;
    double dblVatrate = 0;

    if (!strFundPrice.equals("") && !strFundPrice.equals("Error")) {
      fundPrice = Double.parseDouble(strFundPrice);
    }
    if (commRateVO.getOnCommrate() != null) {
      dblCommrate = Double.parseDouble(commRateVO.getOnCommrate());
    }
    if (!vatrate.equals("") && !vatrate.equals("Error")) {
      dblVatrate = Double.parseDouble(vatrate);
    }

    if (fondosVO.getTitulos() != 0) {
      dblComision = Math.abs((fondosVO.getTitulos() * fundPrice * dblCommrate) / 100);
      dblComision = Formateador.formatoDouble(dblComision, fondosVO.getDecimalsMoneda()) * (-1);
      dblIva = ((dblComision * dblVatrate) / 100);
      dblIva = Formateador.formatoDouble(dblIva, fondosVO.getDecimalsMoneda());
      dblMontoBruto =
          Formateador.formatoDouble(
              (fondosVO.getTitulos() * fundPrice), fondosVO.getDecimalsMoneda());
      dblMontoNeto = dblMontoBruto + dblComision + dblIva;
      dblCalcQty = fondosVO.getTitulos();

      log.debug("dblComision " + dblComision);
      log.debug("dblIva " + dblIva);
      log.debug("dblMontoBruto " + dblMontoBruto);
      log.debug("dblCalcQty " + dblCalcQty);

    } else if (fondosVO.getMonto() != 0) {
      if (fondosVO.getCompraVenta().equals("P")) {
        dblCalcQty =
            (fondosVO.getMonto()
                    / (fundPrice * (1 + dblCommrate / 100 + dblCommrate / 100 * dblVatrate / 100)))
                * (-1);
      } else {
        dblCalcQty =
            (fondosVO.getMonto()
                / (fundPrice * (1 - dblCommrate / 100 - dblCommrate / 100 * dblVatrate / 100))
                * (-1));
      }
      dblComision = Math.abs((dblCalcQty * fundPrice * dblCommrate) / 100);
      dblComision = Formateador.formatoDouble(dblComision, fondosVO.getDecimalsMoneda()) * (-1);
      dblIva = (dblComision * dblVatrate) / 100;
      dblIva = Formateador.formatoDouble(dblIva, fondosVO.getDecimalsMoneda());
      dblMontoBruto = (dblCalcQty * fundPrice) * (-1);
      dblMontoBruto = Formateador.formatoDouble(dblMontoBruto, fondosVO.getDecimalsMoneda());
      dblMontoNeto = dblMontoBruto + dblComision + dblIva;
    }

    dblComision = Math.abs(dblComision);

    /* Se debe formatear dblMontoNeto al
     * número de decimales de la moneda. */
    respFondosVO.setDblMontoNeto(
        Formateador.formatoDouble(dblMontoNeto, fondosVO.getDecimalsMoneda()));

    log.debug("dblMontoNeto VO " + respFondosVO.getDblMontoNeto());

    return respFondosVO;
  }
  /**
   * Valida la emisora capturada.
   *
   * @param fondosVO Parametros para filtrar la consulta.
   * @throws Exception En caso que ocurra un error.
   */
  public final RespuestaFondosVO validaEmisoras(final ParFondosVO fondosVO) throws Exception {

    RespuestaFondosVO respFondos = new RespuestaFondosVO();
    RespuestaFondosVO respDAOFon = new RespuestaFondosVO();
    Date strFecha = null;
    long interv = 0;

    respDAOFon = capturaFondosDAO.validaEmisora(fondosVO.getEmisora());

    if (respDAOFon.getError() != null) {
      respFondos.setError(ErrorKeys.ERR_EMISORA_INVALIDA);
      return respFondos;
    } else {
      int dias = respDAOFon.getDias();
      DatosTabulares dt = capturaFondosDAO.validaEmisoraFondos(fondosVO);

      Date fechaFormateada = fondosVO.getFechaProc();

      if (!dt.isEmpty()) {
        log.debug("colFsettdate " + dt.get(0, colFsettdate));
        if (dt.get(0, colFsettdate) == null
            || dt.get(0, colFsettdate).toString().trim().length() == 0) {
          if (respDAOFon.getDias() == 0) {
            respFondos.setFechaValor(fechaFormateada);
          } else {
            respFondos.setSettDate(
                commonDAO.sumaDiasHabiles(fechaFormateada, fondosVO.getMoneda().trim(), dias));
            respFondos.setFechaValor(respFondos.getSettDate());
            log.debug("respFondos.getSettDate" + respFondos.getSettDate());
            log.debug("respFondos.getFechaValor" + respFondos.getFechaValor());
          }
        } else {

          strFecha = commonDAO.sumaDiasHabiles(fechaFormateada, fondosVO.getMoneda().trim(), dias);

          if (strFecha == null) {
            strFecha = fondosVO.getFechaProc();
          }

          interv = commonDAO.diffDates(strFecha, (Date) dt.get(0, colFsettdate), "Fondos");

          log.debug("Valor de interv " + interv);

          if (interv < 0) {
            respFondos.setError(ErrorKeys.ERR_FECHA_EMISORA_MAL_ACTUALIZADA);
            return respFondos;
          } else {
            respFondos.setFechaValor((Date) dt.get(0, colFsettdate));
            log.debug("Fecha valor " + respFondos.getFechaValor());
          }
        }
      } else {
        /**
         * Se cambia la validacion de compraVenta a false porque el envio de compra venta se esta
         * haciendo de manera inversa, es decir, cuando es compra se esta enviando en false y venta
         * como true, se modifica aqui la validacion para no afectar otros procedimientos. Error
         * Interno 636
         */
        if (fondosVO.getCompraVenta().trim().equals("false")) {
          respFondos.setError(ErrorKeys.ERR_EMISORA_INVALIDA_SEMF);
        } else {
          respFondos.setError("-20113");
        }
        return respFondos;
      }
      return respFondos;
    }
  }
  /**
   * Método para hacer una operación de un fondo de inversión.
   *
   * @param fondosVO Parametros para hacer la validación de la operación que se desea realizar.
   * @param sc Contexto de seguridad.
   * @param efectivoVO Parametros para hacer operaciones de Efectivo
   * @return RespuestaFondosVO Regresa los valores que se muestran en la pantalla de confirmación ó
   *     el número de operación.
   * @throws Exception Encaso de que ocurra un error.
   */
  public final RespuestaFondosVO procesamientoDatosFondos(
      final ParFondosVO fondosVO,
      final SantanderSecurityContext sc,
      final ParametrosEfectivoVO efectivoVO)
      throws Exception {

    String brContrato = "";
    String ctaContrato = "";
    String user = "";
    String contrapartesCom = "";
    String contrapartesIva = "";
    String perfil = "";

    ValidaContratoVO contratoVO = new ValidaContratoVO();
    RespuestaFondosVO respFondosVOConf = new RespuestaFondosVO();
    RespuestaFondosVO respProcesaFondos = new RespuestaFondosVO();
    RespuestaFondosVO respFondos = new RespuestaFondosVO();

    brContrato = fondosVO.getBranch();
    ctaContrato = fondosVO.getContrato();
    user = sc.getPrivilegiosUsuario().getTrad();

    contrapartesCom = getCommonService().contrapartes(brContrato, "COMM");
    contrapartesIva = getCommonService().contrapartes(brContrato, "IVA");

    /*
    if (contrapartesCom.equals("") || contrapartesIva.equals("")) {
    			log.debug("No se encontrarón definiciones"
    					+ " de las contrapartes para el sistema.");
    		}
    */

    try {
      contratoVO = commonDAO.validaContrato(brContrato, ctaContrato, user);

      respFondosVOConf =
          capturaFondosDAO.procesaFondosConfirmacion(
              fondosVO.getBranch(),
              fondosVO.getContrato(),
              contratoVO.getCno(),
              fondosVO.getEmisora(),
              fondosVO.getMoneda(),
              fondosVO.getMonto(),
              fondosVO.getTitulos(),
              fondosVO.getCompraVenta(),
              fondosVO.getFechaProc(),
              fondosVO.getPromotor(),
              contratoVO.getNostrovostro(),
              sc);

      if (respFondosVOConf != null) {

        if ((respFondosVOConf.getError() == null
                || respFondosVOConf.getError().trim().length() == 0)
            && respFondosVOConf.getStatus() == 0) {

          int decimales = fondosVO.getDecimalsMoneda();
          String strDec = "";
          for (int iter = 0; iter < decimales; iter++) {
            strDec = strDec + "0";
          }
          String pattern = "#,###,##0." + strDec;

          // Compra / Venta
          if (respFondosVOConf.getCompraVenta().equals("S")) {
            respFondos.setCompraVenta("Venta");
          } else {
            respFondos.setCompraVenta("Compra");
          }
          // Emisora
          respFondos.setEmisora(respFondosVOConf.getEmisora());
          // Moneda
          respFondos.setMoneda(respFondosVOConf.getMoneda());
          // Titulos
          respFondos.setStrCalcQty(
              Formateador.format(String.valueOf(respFondosVOConf.getDblCalcQty()), pattern));
          // Precio
          String patternPrice = "#,###,##0.########";
          respFondos.setStrFundPrice(
              Formateador.format(String.valueOf(respFondosVOConf.getStrFundPrice()), patternPrice));
          // Monto Neto
          // Se valida regla: Importes inferiores a 100,000
          Integer montoValue = Mensajes.MAX_MONTO_DEFAULT;
          if (capturaCapitalesDAO != null) {
            montoValue = capturaCapitalesDAO.getMontoInferior();
          }
          if (fondosVO.getEjecucion() != null
              && Ejecucion.formatString(fondosVO.getEjecucion())
                  .equalsIgnoreCase(Ejecucion.formatString(Ejecucion.EXCEPCIONES.getName()))
              && (montoUnsigned(respFondosVOConf.getDblMontoNeto()) >= montoValue)) {
            if (fondosVO.getBranch() == null
                || fondosVO.getContrato() == null
                || !capturaCapitalesDAO.isContratoDiscrecional(
                    fondosVO.getBranch(), fondosVO.getContrato())) {
              if (respFondos.getCompraVenta().equals("Venta")
                  || respFondosVOConf.getEmisora() == null
                  || respFondosVOConf.getEmisora().equals("")
                  || !capturaCapitalesDAO.existEmisora(respFondosVOConf.getEmisora())) {
                String serr = Mensajes.ERR_EJECUCION;
                log.error(serr);
                respFondos.setError(serr);
                throw new CondicionesInconsistentesException(respFondos.getError());
              }
            }
          }
          respFondos.setStrMontoNeto(
              Formateador.format(String.valueOf(respFondosVOConf.getDblMontoNeto()), pattern));
          // Porcentaje Comisión.
          if (!respFondosVOConf.getOnCommrate().equals("")) {
            respFondos.setOnCommrate(
                Formateador.formatCCY(respFondosVOConf.getOnCommrate(), decimales));
          } else {
            respFondos.setOnCommrate("0.00");
          }
          // Comisión
          String strComision = String.valueOf(respFondosVOConf.getDblComision());
          if (!strComision.equals("")) {
            respFondos.setStrComision(Formateador.formatCCY(strComision, decimales));
          } else {
            respFondos.setStrComision("0.00");
          }
          // IVA
          String strIva =
              Formateador.stringWithOutComma(String.valueOf(respFondosVOConf.getDblIva()));
          if (!strIva.equals("")) {
            respFondos.setStrIva(Formateador.formatCCY(strIva, decimales));
          } else {
            respFondos.setStrIva("0.00");
          }
          // Fecha de liquidación
          if (respFondosVOConf.getSettDate() != null) {
            respFondos.setFechaLiq(
                Formateador.formateaFechaDisplay(respFondosVOConf.getSettDate()));
          } else {
            respFondos.setFechaLiq("");
          }
          // Plazo de permanencia
          respFondos.setOcMinTerms(respFondosVOConf.getOcMinTerms());
          // Fecha de recompra
          if (respFondosVOConf.getExpirdate() != null) {
            respFondos.setFechaExpira(FechaUtils.dateToString(respFondosVOConf.getExpirdate()));
          } else {
            respFondos.setFechaExpira("");
          }
          // Producto.
          if (respFondosVOConf.getOcProduct() != null) {
            respFondos.setOcProduct(respFondosVOConf.getOcProduct());
          } else {
            respFondos.setOcProduct("");
          }
          // Tipo de Producto.
          if (respFondosVOConf.getOcProdType() != null) {
            respFondos.setOcProdType(respFondosVOConf.getOcProdType());
          } else {
            respFondos.setOcProdType("");
          }

          /*
           * Perfil.
           */
          perfil =
              getCommonService()
                  .validaPerfilContrato(
                      fondosVO.getBranch(),
                      fondosVO.getContrato(),
                      getCommonService().MDO_FONDOS,
                      fondosVO.getMoneda(),
                      fondosVO.getEmisora(),
                      fondosVO.getMonto(),
                      "", // Producto
                      "", // TipoProducto
                      getCommonService().CICLO_ANTES_DE_VALIDAR,
                      null);

          log.debug("Perfil '" + perfil + "'");

          respFondos.setPerfil(perfil);

        } else if (respFondosVOConf.getStatus() != 0) {
          log.debug("Status en respFondosVOConf");
          respFondos.setStatus(respFondosVOConf.getStatus());
          return respFondos; // ANZ OCT 2011
          // ANZ OCT 2011. Se comenta para que no mande Exception
          // throw new CondicionesInconsistentesException(
          //		String.valueOf(respFondos.getStatus()));
        } else {
          log.debug("Mensaje de error en respFondosVOConf " + respFondosVOConf.getError());
          respFondos.setError(respFondosVOConf.getError());
          return respFondos; // ANZ OCT 2011
          // ANZ OCT 2011. Se comenta para que no mande Exception
          // throw new CondicionesInconsistentesException(
          //		respFondos.getError());
        }

        /*
         * Se ejecuta cuando se le da click en aceptar
         * a la pantalla de Confirmación.
         */

        if (fondosVO.isConfirmacion()) {
          respProcesaFondos =
              capturaFondosDAO.procesaFondos(
                  fondosVO, contratoVO, respFondosVOConf, contrapartesCom, contrapartesIva, sc);
          if (respProcesaFondos != null) {
            if ((respProcesaFondos.getError() == null
                    || respProcesaFondos.getError().trim().length() == 0)
                && respProcesaFondos.getStatus() == 0) {
              respFondos.setOperacion(respProcesaFondos.getOperacion());
              log.info("Número de operación " + respProcesaFondos.getOperacion());

              /** Bitacora */
              log.debug("Bitacora " + fondosVO.getBitacora());
              getBitacoraService()
                  .registraFondos(
                      respProcesaFondos.getOperacion(),
                      fondosVO.getBranch(),
                      fondosVO.getBitacora(),
                      fondosVO.getEjecucion(),
                      fondosVO.getFolio(),
                      null,
                      FCBitacoraService.MODO_NUEVA_OPERACION,
                      sc);

              if (fondosVO.isEfectivo()) {
                RespuestaDepRet respbean = new RespuestaDepRet();
                try {
                  efectivoVO.setOperacion(respFondos.getOperacion().trim());
                  log.info(
                      "Entre a la operacion de efectivo. Operacion="
                          + efectivoVO.getOperacion()
                          + "; datos para efectivo ="
                          + efectivoVO.getDataList());
                  log.info("COMENZANDO A PROCESAR EFECTIVO");

                  respbean = capturaEfectivoService.procesaEfectivo(efectivoVO, sc);
                  respFondos.setOperacionEfe(respbean.getSemfyield());
                } catch (Exception e) {
                  String serr = "No se termino la operación " + "de fondos con efectivo";
                  if (e instanceof CondicionesInconsistentesException) {
                    log.error(serr, e);
                    respFondos.setError(e.getMessage());
                    throw new CondicionesInconsistentesException(respFondos.getError());
                  } else {
                    log.error(serr, e);
                    respFondos.setError(ErrorKeys.ERR_EFECTIVO);
                    throw new CondicionesInconsistentesException(respFondos.getError());
                  }
                }
              }

            } else if (respProcesaFondos.getStatus() != 0) {
              respFondos.setStatus(respProcesaFondos.getStatus());
              return respFondos; // ANZ OCT 2011
              // ANZ OCT 2011. Se comenta para que no mande Exception
              // throw new CondicionesInconsistentesException(
              //		String.valueOf(respFondos.getStatus()));
            } else {
              respFondos.setError(respProcesaFondos.getError());
              return respFondos; // ANZ OCT 2011
              // ANZ OCT 2011. Se comenta para que no mande Exception
              // throw new CondicionesInconsistentesException(
              //		respFondos.getError());
            }
          }
        }
      }
    } catch (Exception e) {
      log.error("ERROR", e);
      respFondos.setError(ErrorKeys.ERR_EFECTIVO);
      if (e instanceof CondicionesInconsistentesException) {
        throw e;
      } else {
        throw new CondicionesInconsistentesException(ErrorKeys.ERR_EFECTIVO);
      }
    }
    return respFondos;
  }