public String doRefund(
      String cardnumber,
      String monthExpires,
      String yearExpires,
      String ccVerifyNumber,
      double amount,
      String currency,
      Object parentDataPK,
      String captureProperties)
      throws CreditCardAuthorizationException {
    IWTimestamp stamp = IWTimestamp.RightNow();
    this.strCCNumber = cardnumber;
    this.strCCExpire = yearExpires + monthExpires;
    this.strCCVerify = ccVerifyNumber;
    setCurrencyAndAmount(currency, amount);
    this.strCurrentDate = getDateString(stamp);

    try {
      StringBuffer logText = new StringBuffer();
      Hashtable capturePropertiesHash = parseResponse(captureProperties);
      Hashtable properties =
          doRefund(getAmountWithExponents(amount), capturePropertiesHash, parentDataPK);

      String authCode = properties.get(this.PROPERTY_APPROVAL_CODE).toString();
      logText.append("\nRefund successful").append("\nAuthorization Code = " + authCode);
      logText.append("\nAction Code = " + properties.get(this.PROPERTY_ACTION_CODE).toString());
      try {
        String tmpCardNum = CreditCardBusinessBean.encodeCreditCardNumber(cardnumber);
        storeAuthorizationEntry(
            tmpCardNum,
            parentDataPK,
            properties,
            KortathjonustanAuthorisationEntries.AUTHORIZATION_TYPE_REFUND);
        log(logText.toString());

      } catch (Exception e) {
        System.err.println("Unable to save entry to database");
        e.printStackTrace();
        if (authCode != null) {
          return authCode;
        } else {
          throw new CreditCardAuthorizationException(e);
        }
      }

      return authCode;
    } catch (CreditCardAuthorizationException e) {
      StringBuffer logText = new StringBuffer();
      logText.append("Authorization FAILED");
      logText.append("\nError           = " + e.getErrorMessage());
      logText.append("\nNumber        = " + e.getErrorNumber());
      logText.append("\nDisplay error = " + e.getDisplayError());
      log(logText.toString());
      throw e;
    } catch (NullPointerException n) {
      throw new CreditCardAuthorizationException(n);
    }
  }
  public String doSale(
      String nameOnCard,
      String cardnumber,
      String monthExpires,
      String yearExpires,
      String ccVerifyNumber,
      double amount,
      String currency,
      String referenceNumber)
      throws CreditCardAuthorizationException {
    try {
      IWTimestamp stamp = IWTimestamp.RightNow();
      this.strName = nameOnCard;
      this.strCCNumber = cardnumber;
      this.strCCExpire = yearExpires + monthExpires;
      this.strCCVerify = ccVerifyNumber;
      setCurrencyAndAmount(currency, amount);
      this.strCurrentDate = getDateString(stamp);
      this.strReferenceNumber = convertStringToNumbers(referenceNumber);

      StringBuffer logText = new StringBuffer();
      // System.out.println("referenceNumber => " + strReferenceNumber);

      Hashtable returnedProperties = getFirstResponse();
      String authCode = null;
      if (returnedProperties != null) {
        logText.append("Authorization successful");
        Hashtable returnedCaptureProperties = finishTransaction(returnedProperties);
        if (returnedCaptureProperties != null
            && returnedCaptureProperties.get(this.PROPERTY_APPROVAL_CODE).toString() != null) {
          // System.out.println("Approval Code =
          // "+returnedCaptureProperties.get(PROPERTY_APPROVAL_CODE).toString());
          authCode =
              returnedCaptureProperties
                  .get(this.PROPERTY_APPROVAL_CODE)
                  .toString(); // returnedCaptureProperties;

          logText.append("\nCapture successful").append("\nAuthorization Code = " + authCode);
          logText.append(
              "\nAction Code = "
                  + returnedCaptureProperties.get(this.PROPERTY_ACTION_CODE).toString());

          try {
            String tmpCardNum = CreditCardBusinessBean.encodeCreditCardNumber(cardnumber);
            this.storeAuthorizationEntry(
                tmpCardNum,
                null,
                returnedCaptureProperties,
                KortathjonustanAuthorisationEntries.AUTHORIZATION_TYPE_SALE);

            log(logText.toString());

          } catch (Exception e) {
            System.err.println("Unable to save entry to database");
            throw new CreditCardAuthorizationException(e);
          }
        }
      }

      return authCode;
    } catch (CreditCardAuthorizationException e) {
      StringBuffer logText = new StringBuffer();
      logText.append("Authorization FAILED");
      logText.append("\nError           = " + e.getErrorMessage());
      logText.append("\nNumber        = " + e.getErrorNumber());
      logText.append("\nDisplay error = " + e.getDisplayError());
      log(logText.toString());
      throw e;
    }
  }