/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.bscvsmdk;

import java.util.Map;

import jp.co.sint.config.SIConfig;
import jp.co.sint.tools.SIUtil;

import Jp.BuySmart.CVS.GWLib.*;

import org.apache.log4j.Category;

/**
 * @version $Id: SIBSCVSMDKAction.java,v 1.0 2004/11/16 Exp $
 * @author  Akao Shinya
 * <br>Description:
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 *  ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Akao Shinya    2004/11/16 10:15:26  Original
 */
public class SIBSCVSMDKAction {
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  //マーチャントID
  private String merchantID    = "";
  //秘密鍵
  private String signatureKey = "";
  //受注番号
  private String orderCode    = "";
  //CVSタイプ
  private String cvsType      = "";
  //金額
  private String amount       = "0";
  //氏名（姓）
  private String familyName   = "";
  //氏名（名）
  private String firstName    = "";
  //カナ
  private String kanaName     = "";
  //電話番号
  private String telNo        = "";
  //支払期限
  private String payLimit     = "";
  //7.4.0 ST2057 追加 ここから
  //受付番号
  private String receiptNo    = "";
  //払込票URL
  private String haraikomiURL = "";
  //7.4.0 ST2057 追加 ここまで

  
  //コンストラクタ
  public SIBSCVSMDKAction() {
  }
  //コンストラクタ
  public SIBSCVSMDKAction(String lMerchantID, String lSignatureKey) {
    this.setMerchantID(lMerchantID);
    this.setSignatureKey(lSignatureKey);
  }

  /**
   * <b>setMerchantID</b>
   * コンビニ決済サーバとの接続、取引の送信を行います
   * @param  なし
   * @return なし
   * @throws SIBSCVSMDKException
   */
  public void doTransaction() throws SIBSCVSMDKException {
    try {
      //引数のHashtableのインスタンスを作ります
      Map data = TransactionFactory.createRequest();

      //マーチャントID
      data.put(Transaction.REQ_SECRET, this.merchantID);
      //秘密鍵
      data.put(Transaction.REQ_KEY_HA1, this.signatureKey);
      //取引コマンド entry(登録)
      data.put(Transaction.REQ_COMMAND, Transaction.CMD_ENTRY);
      //取引ID(最多25桁)
      data.put(Transaction.REQ_ORDER_ID, this.getOrderCode());
      //CVSタイプ
      data.put(Transaction.REQ_CVS_TYPE, this.getCvsType());
      //金額
      data.put(Transaction.REQ_AMOUNT, this.getAmount());
      //氏名
      data.put(Transaction.REQ_NAME1, this.getFamilyName());
      data.put(Transaction.REQ_NAME2, this.getFirstName());
      //ファミリーマートのときは「カナ」必須
      if (this.getCvsType().equals(SIBSCVSMDKConfig.MDK_CVS_TYPE_FAMILYMART)) {
        //カナ
        data.put(Transaction.REQ_KANA, this.getKanaName());
      }
      //電話番号
      data.put(Transaction.REQ_TEL_NO, this.getTelNo());
      //支払期限
      data.put(Transaction.REQ_PAY_LIMIT, this.getPayLimit());

      //doTransactionメソッドでゲートウェイに取引を送信します
      //取引結果はHashtableにキーと値のペアで格納されます
      Transaction t = TransactionFactory.createInstance();
      Map result = t.doTransaction(data);

      //取引結果取得
      String status = (String)result.get("MStatus");

      //7.4.0 ST2057 追加 ここから
      //受付番号の取得
      receiptNo = (String)result.get("receipt-no");
      //払込票URLの取得
      haraikomiURL = (String)result.get("haraikomi-url");
      //7.4.0 ST2057 追加 ここまで

      //取引失敗
      if (!status.equals("success")) {
        throw new SIBSCVSMDKException("コンビニ決済データの送信に失敗しました。");
      }
    // 例外処理
    } catch (Exception e) {
      throw new SIBSCVSMDKException("コンビニ決済データの送信に失敗しました。");
    }
  }

  /**
   * <b>setMerchantID</b>
   * マーチャントIDの設定
   * @param lMerchantID
   * @return なし
   * @throws なし
   */
  public void setMerchantID(String lMerchantID) {
    if (SIUtil.isNull(lMerchantID)) lMerchantID = "";
    this.merchantID = lMerchantID;
  }

  /**
   * <b>setSignatureKey</b>
   * 秘密鍵の設定
   * @param lMerchantID
   * @return なし
   * @throws なし
   */
  public void setSignatureKey(String lSignatureKey) {
    if (SIUtil.isNull(lSignatureKey)) lSignatureKey = "";
    this.signatureKey = lSignatureKey;
  }

  /**
   * <b>setOrderCode</b>
   * 注文番号の設定
   * @param  lOrderID 注文番号
   * @return なし
   * @throws なし
   */
  public void setOrderCode(String lOrderCode) {
    if (SIUtil.isNull(lOrderCode)) lOrderCode = "";
    this.orderCode = lOrderCode;
  }

  /**
   * <b>setCvsType</b>
   * CVSタイプの設定
   * @param  lType CVSタイプ
   * @return なし
   * @throws なし
   */
  public void setCvsType(String lType) {
    if (SIUtil.isNull(lType)) lType = "";
    this.cvsType = lType;
  }

  /**
   * <b>setAmount</b>
   * 金額の設定
   * @param  lAmount 金額
   * @return なし
   * @throws なし
   */
  public void setAmount(String lAmount) {
    if (SIUtil.isNull(lAmount)) lAmount = "0";
    this.amount = lAmount;
  }

  /**
   * <b>setFamilyName</b>
   * 氏名（姓）の設定
   * @param  lFamilyName 氏名（姓）
   * @return なし
   * @throws なし
   */
  public void setFamilyName(String lFamilyName) {
    if (SIUtil.isNull(lFamilyName)) lFamilyName = "";
    this.familyName = lFamilyName;
  }

  /**
   * <b>setFirstName</b>
   * 氏名（名）の設定
   * @param  lFirstName 氏名（名）
   * @return なし
   * @throws なし
   */
  public void setFirstName(String lFirstName) {
    if (SIUtil.isNull(lFirstName)) lFirstName = "";
    this.firstName = lFirstName;
  }

  /**
   * <b>setKanaName</b>
   * 氏名カナの設定
   * @param  lKanaName 氏名カナ
   * @return なし
   * @throws なし
   */
  public void setKanaName(String lKanaName) {
    if (SIUtil.isNull(lKanaName)) lKanaName = "";
    this.kanaName = lKanaName;
  }

  /**
   * <b>setTelNo</b>
   * 電話番号の設定
   * @param  lTelNo 電話番号
   * @return なし
   * @throws なし
   */
  public void setTelNo(String lTelNo) {
    if (SIUtil.isNull(lTelNo)) lTelNo = "";
    this.telNo = lTelNo;
  }

  /**
   * <b>setPayLimit</b>
   * 支払期限の設定
   * @param  lPayLimit 支払期限
   * @return なし
   * @throws なし
   */
  public void setPayLimit(String lPayLimit) {
    if (SIUtil.isNull(lPayLimit)) lPayLimit = "";
    this.payLimit = lPayLimit;
  }


  /**
   * <b>getMerchantID</b>
   * マーチャントIDの取得
   * @param  なし
   * @return マーチャントID
   * @throws なし
   */
  public String getMerchantID() {
    return this.merchantID;
  }

  /**
   * <b>getSignatureKey</b>
   * 秘密鍵の取得
   * @param  なし
   * @return 秘密鍵
   * @throws なし
   */
  public String getSignatureKey() {
    return this.signatureKey;
  }

  /**
   * <b>getOrderCode</b>
   * 受注番号の取得
   * @param  なし
   * @return 受注番号
   * @throws なし
   */
  public String getOrderCode() {
    return this.orderCode;
  }

  /**
   * <b>getCvsType</b>
   * CVSタイプの取得
   * @param  なし
   * @return CVSタイプ
   * @throws なし
   */
  public String getCvsType() {
    return this.cvsType;
  }

  /**
   * <b>getAmount</b>
   * 金額の取得
   * @param  なし
   * @return 金額
   * @throws なし
   */
  public String getAmount() {
    return this.amount;
  }

  /**
   * <b>getFamilyName</b>
   * 氏名（姓）の取得
   * @param  なし
   * @return 氏名（姓）
   * @throws なし
   */
  public String getFamilyName() {
    return this.familyName;
  }

  /**
   * <b>getFirstName</b>
   * 氏名（名）の取得
   * @param  なし
   * @return 氏名（名）
   * @throws なし
   */
  public String getFirstName() {
    return this.firstName;
  }

  /**
   * <b>getKanaName</b>
   * 氏名カナの取得
   * @param  なし
   * @return 氏名カナ
   * @throws なし
   */
  public String getKanaName() {
    return this.kanaName;
  }

  /**
   * <b>getTelNo</b>
   * 電話番号の取得
   * @param  なし
   * @return 電話番号
   * @throws なし
   */
  public String getTelNo() {
    return this.telNo;
  }

  /**
   * <b>getPayLimit</b>
   * 支払期限の取得
   * @param  なし
   * @return 支払期限
   * @throws なし
   */
  public String getPayLimit() {
    return this.payLimit;
  }

  //7.4.0 ST2057 追加 ここから
  //受付番号
  /**
   * <b>setReceiptNo</b>
   * 受付番号の設定
   * @param argStr
   * @return なし
   * @throws なし
   */
  public void setReceiptNo(String argStr) {
    if (SIUtil.isNull(argStr)) receiptNo = "";
    this.receiptNo = argStr;
  }
  /**
   * <b>getReceiptNo</b>
   * 受付番号の取得
   * @param  なし
   * @return 受付番号
   * @throws なし
   */
  public String getReceiptNo() {
    return this.receiptNo;
  }
  //払込票URL
  /**
   * <b>setHaraikomiURL</b>
   * 払込票URLの設定
   * @param argStr
   * @return なし
   * @throws なし
   */
  public void setHaraikomiURL(String argStr) {
    if (SIUtil.isNull(argStr)) haraikomiURL = "";
    this.haraikomiURL = argStr;
  }
  /**
   * <b>getHaraikomiURL</b>
   * 払込票URLの取得
   * @param  なし
   * @return 払込票URL
   * @throws なし
   */
  public String getHaraikomiURL() {
    return this.haraikomiURL;
  }
  //7.4.0 ST2057 追加 ここまで
}