/*********************************************************************
*	All Rights reserved,Copyright(c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKCardUkInfoInsCtrlUtil
*	ソースファイル名：JKKCardUkInfoInsCtrlUtil.java
*	作成者			：富士通
*	日付			：2022年06月27日
*＜機能概要＞
*	カード受付情報登録処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v58.00.00	2022/06/27	 FJ) 北村	 【ANK-3846-09-00】【クレカ】ペイジェント→ペイジェント移行
*
**********************************************************************/

package eo.ejb.common;

import java.util.HashMap;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;

import eo.common.constant.JACStrConst;
import eo.common.constant.JKUStrConst;
import eo.common.util.JCNAuthResultCdConvertUtil;
import eo.ejb.cbm.entity.KK3391ETMsg;
import eo.ejb.cbs.cbsmsg.EKKA0010003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0010004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0010005CBSMsg;
import eo.ejb.common.db.JKKejbKK3391SecProc;
import eo.ejb.common.edit.JKKejbKK3391NumberParts;

/**
 *  <dd>クラス名：カード受付情報登録処理部品
 *  <dd>クラス説明：カード受付情報登録に関する登録を行う部品です。
 *  <dd>備考：
 * @version  58.0.0 2022/06/27
 * @author 富士通
 *
 */
public class JKKCardUkInfoInsCtrlUtil 
{
	/** 電文種別判定用項目（カード情報設定電文） */
	public static final String TELEGRAM_KIND_025 = "025";

	/** 電文種別判定用項目（カード決済オーソリ電文） */
	public static final String TELEGRAM_KIND_020 = "020";
	
	/** 電文種別判定用項目（カード決済オーソリキャンセル電文） */
	public static final String TELEGRAM_KIND_021 = "021";
	
	/** オーソリ実施区分：1(預かりオーソリ) */
	public static final String AUTHORI_JSSI_DIV_KBN_1 = "1";
	
	/** オーソリ実施区分：2(有効性チェック) */
	public static final String AUTHORI_JSSI_DIV_KBN_2 = "2";
	
	/** オーソリ実施区分：3(実額オーソリ) */
	public static final String AUTHORI_JSSI_DIV_KBN_3 = "3";
	
	/** オーソリ実施区分：4(オーソリキャンセル) */
	public static final String AUTHORI_JSSI_DIV_KBN_4 = "4";

	/** メール送信状態コード：0(未送信) */
	public static final String MAIL_SEND_STAT_CD_0 = "0";

	private static final String OPERATORID = "operatorID";
	
	/**
	 * カード受付情報_登録
	 * @param inCBSMsg		CBSメッセージ
	 * @param retMapList	オーソリ結果
	 * @param telegram_kind	電文種別判定用項目
	 * @throws CAANException
	 */
	public static void insCardUkInfo(CAANMsg inCBSMsg, HashMap<String,String> outResInfo, String telegram_kind) throws CAANException
	{
		JKKejbKK3391NumberParts util = new JKKejbKK3391NumberParts();
		// カード受付情報履歴番号（シーケンス値）
		String cardUkInfoRirekiNo = util.getCardUkInfoRirekiNo();

		CAANMsg inputCardUkInfo = new CAANMsg("eo.ejb.cbm.entity.KK3391ETMsg");
		
		// カード受付情報履歴番号
		inputCardUkInfo.set(KK3391ETMsg.CARD_UK_INFO_RIREKI_NO, cardUkInfoRirekiNo);
		// 処理年月日
		inputCardUkInfo.set(KK3391ETMsg.TRN_YMD, JCCModelCommon.getSysDate());
		
		// レスポンス詳細を取得
		String response_detail = outResInfo.get("response_detail");
		
		if (!isNullBlank(response_detail)) {
			// レスポンス詳細がnullまたは""でない場合、
			// レスポンス詳細より"(ダブルクォーテーション)を削除する
			response_detail = response_detail.replaceAll("\"", "");
		} else {
			response_detail = "";
		}
		
		if (TELEGRAM_KIND_025.equals(telegram_kind)) 
		{
			// オーソリ結果変換部品インスタンスを作成
			JCNAuthResultCdConvertUtil convertUtil = new JCNAuthResultCdConvertUtil((String)outResInfo.get("result"), 
								(String)outResInfo.get("response_code"), 
								response_detail, 
								(String)outResInfo.get("masked_card_number"), 
								(String)outResInfo.get("debit_prepaid_type"),
								(String)outResInfo.get("card_brand"),
								(String)outResInfo.get("card_valid_term"));
			// オーソリ実績区分
			inputCardUkInfo.set(KK3391ETMsg.AUTHORI_JSSI_DIV, AUTHORI_JSSI_DIV_KBN_1);
			// メール送信状態コード
			inputCardUkInfo.set(KK3391ETMsg.MAIL_SEND_STAT_CD, MAIL_SEND_STAT_CD_0);
			// サイトID
			inputCardUkInfo.set(KK3391ETMsg.SITE_ID,  inCBSMsg.getString(EKKA0010003CBSMsg.PY_SITE_ID));
			// カード情報トークン
			inputCardUkInfo.set(KK3391ETMsg.CARD_INFO_TOKEN,  inCBSMsg.getString(EKKA0010003CBSMsg.PY_CARD_TOKEN));
			// セキュリティーコード利用
			inputCardUkInfo.set(KK3391ETMsg.SECURITY_CD_USE,  inCBSMsg.getString(EKKA0010003CBSMsg.PY_SECURITY_CODE_USE));

			// カード預かりID
			inputCardUkInfo.set(KK3391ETMsg.CARD_AZKRI_ID,  outResInfo.get("customer_id"));
			// 処理結果
			inputCardUkInfo.set(KK3391ETMsg.TRN_RSLT,  outResInfo.get("result"));
			// オーソリ結果応答コード
			inputCardUkInfo.set(KK3391ETMsg.AUTH_RSLT_RSP_CD,  outResInfo.get("response_code"));
			// オーソリ結果応答詳細
			inputCardUkInfo.set(KK3391ETMsg.AUTH_RSLT_RSP_DTL,  response_detail);
			// カード発行会社コード
			inputCardUkInfo.set(KK3391ETMsg.CARD_HAKKO_COMP_CD,  outResInfo.get("issur_id"));
			// カード発行会社名
			inputCardUkInfo.set(KK3391ETMsg.CARD_HAKKO_COMP_NM,  outResInfo.get("issur_name"));
			// フィンガープリント
			inputCardUkInfo.set(KK3391ETMsg.FINGERPRINT,  outResInfo.get("fingerprint"));
			// カード番号の変換処理
			String card_no =  convertUtil.convertCreCardNo();
			// マスクされたカード番号が存在しない場合、""(空)を返却
			if (!isNullBlank(card_no)) {
				// カード番号への暗号化処理
				card_no = JCCModelCommon.getEncryptResultPassword(card_no);
			}
			// マスク済カード番号
			inputCardUkInfo.set(KK3391ETMsg.MASKZM_CARD_NO, card_no);
			// カード有効期限
			inputCardUkInfo.set(KK3391ETMsg.CARD_YK_KIGEN,  outResInfo.get("card_valid_term"));
			// 仕向先カード会社コード
			inputCardUkInfo.set(KK3391ETMsg.SHIKOSAKI_CARD_COMP_CD,  outResInfo.get("acq_id"));
			// 仕向先カード会社名
			inputCardUkInfo.set(KK3391ETMsg.SHIKOSAKI_CARD_COMP_NM,  outResInfo.get("acq_name"));
			// イシュア区分
			inputCardUkInfo.set(KK3391ETMsg.ISSUER_DIV,  outResInfo.get("issur_class"));
			// カード種別
			inputCardUkInfo.set(KK3391ETMsg.CARD_SBT,  outResInfo.get("debit_prepaid_type"));
			// カードブランド
			inputCardUkInfo.set(KK3391ETMsg.CARD_BRAND,  outResInfo.get("card_brand"));
			// カード名義人
			inputCardUkInfo.set(KK3391ETMsg.CARD_MEIGIN,  outResInfo.get("cardholder_name"));
			// 顧客カード数
			inputCardUkInfo.set(KK3391ETMsg.CUST_CARD_NUM,  outResInfo.get("num_of_cards"));
			// 顧客カードID
			inputCardUkInfo.set(KK3391ETMsg.CUST_CARD_ID,  outResInfo.get("customer_card_id"));
		} 
		else if (TELEGRAM_KIND_020.equals(telegram_kind)) 
		{
			// オーソリ結果変換部品インスタンスを作成
			JCNAuthResultCdConvertUtil convertUtil = new JCNAuthResultCdConvertUtil((String)outResInfo.get("result"), 
								(String)outResInfo.get("response_code"), 
								response_detail, 
								(String)outResInfo.get("masked_card_number"), 
								(String)outResInfo.get("debit_prepaid_type"),
								(String)outResInfo.get("card_brand"),
								(String)outResInfo.get("card_valid_term"));

			String seikyAmnt = inCBSMsg.getString(EKKA0010004CBSMsg.PY_PAYMENT_AMOUNT);
			// 請求金額が1円の場合、有効性オーソリをセット
			if ("1".equals(seikyAmnt))
			{
				// オーソリ実績区分
				inputCardUkInfo.set(KK3391ETMsg.AUTHORI_JSSI_DIV, AUTHORI_JSSI_DIV_KBN_2);
			}
			else 
			{
				// オーソリ実績区分
				inputCardUkInfo.set(KK3391ETMsg.AUTHORI_JSSI_DIV, AUTHORI_JSSI_DIV_KBN_3);
			}
			// サイトID
			inputCardUkInfo.set(KK3391ETMsg.SITE_ID,  inCBSMsg.getString(EKKA0010004CBSMsg.PY_SITE_ID));
			// マーチャント取引ID
			inputCardUkInfo.set(KK3391ETMsg.MERCHANT_DEAL_ID,  inCBSMsg.getString(EKKA0010004CBSMsg.PY_TRADING_ID));
			// 決済金額
			inputCardUkInfo.set(KK3391ETMsg.KSSAI_AMNT, seikyAmnt);
			// カード預かりID
			inputCardUkInfo.set(KK3391ETMsg.CARD_AZKRI_ID,  inCBSMsg.getString(EKKA0010004CBSMsg.PY_CUSTOMER_ID));

			// 決済ID
			inputCardUkInfo.set(KK3391ETMsg.KSSAI_ID,  outResInfo.get("payment_id"));
			// 処理結果
			inputCardUkInfo.set(KK3391ETMsg.TRN_RSLT,  outResInfo.get("result"));
			// オーソリ結果応答コード
			inputCardUkInfo.set(KK3391ETMsg.AUTH_RSLT_RSP_CD,  outResInfo.get("response_code"));
			// オーソリ結果応答詳細
			inputCardUkInfo.set(KK3391ETMsg.AUTH_RSLT_RSP_DTL,  response_detail);
			// カード発行会社コード
			inputCardUkInfo.set(KK3391ETMsg.CARD_HAKKO_COMP_CD,  outResInfo.get("issur_id"));
			// カード発行会社名
			inputCardUkInfo.set(KK3391ETMsg.CARD_HAKKO_COMP_NM,  outResInfo.get("issur_name"));
			// フィンガープリント
			inputCardUkInfo.set(KK3391ETMsg.FINGERPRINT,  outResInfo.get("fingerprint"));
			// カード番号の変換処理
			String card_no =  convertUtil.convertCreCardNo();
			// マスクされたカード番号が存在しない場合、""(空)を返却
			if (!isNullBlank(card_no)) {
				// カード番号への暗号化処理
				card_no = JCCModelCommon.getEncryptResultPassword(card_no);
			}
			// マスク済カード番号
			inputCardUkInfo.set(KK3391ETMsg.MASKZM_CARD_NO,  card_no);
			// カード有効期限
			inputCardUkInfo.set(KK3391ETMsg.CARD_YK_KIGEN,  outResInfo.get("card_valid_term"));
			// 仕向先カード会社コード
			inputCardUkInfo.set(KK3391ETMsg.SHIKOSAKI_CARD_COMP_CD,  outResInfo.get("acq_id"));
			// 仕向先カード会社名
			inputCardUkInfo.set(KK3391ETMsg.SHIKOSAKI_CARD_COMP_NM,  outResInfo.get("acq_name"));
			// イシュア区分
			inputCardUkInfo.set(KK3391ETMsg.ISSUER_DIV,  outResInfo.get("issur_class"));
			// カード種別
			inputCardUkInfo.set(KK3391ETMsg.CARD_SBT,  outResInfo.get("debit_prepaid_type"));
			// カードブランド
			inputCardUkInfo.set(KK3391ETMsg.CARD_BRAND,  outResInfo.get("card_brand"));
			// ACS支払人認証要求HTML
			inputCardUkInfo.set(KK3391ETMsg.ACSPAYER_NINSHO_YOKYU_HTML,  outResInfo.get("out_acs_html"));
			// ATTEMPT区分
			inputCardUkInfo.set(KK3391ETMsg.ATTEMPT_DIV,  outResInfo.get("attempt_kbn"));
			// 承認番号
			inputCardUkInfo.set(KK3391ETMsg.SHONIN_NO,  outResInfo.get("shonin_no"));
		}
		else if (TELEGRAM_KIND_021.equals(telegram_kind))
		{
			// オーソリ実績区分
			inputCardUkInfo.set(KK3391ETMsg.AUTHORI_JSSI_DIV, AUTHORI_JSSI_DIV_KBN_4);
			// マーチャント取引ID
			inputCardUkInfo.set(KK3391ETMsg.MERCHANT_DEAL_ID,  inCBSMsg.getString(EKKA0010005CBSMsg.PY_TRADING_ID));
			// 決済ID
			inputCardUkInfo.set(KK3391ETMsg.KSSAI_ID,  inCBSMsg.getString(EKKA0010005CBSMsg.PY_PAYMENT_ID));

			// 処理結果
			inputCardUkInfo.set(KK3391ETMsg.TRN_RSLT,  outResInfo.get("result"));
			// オーソリ結果応答コード
			inputCardUkInfo.set(KK3391ETMsg.AUTH_RSLT_RSP_CD,  outResInfo.get("response_code"));
			// オーソリ結果応答詳細
			inputCardUkInfo.set(KK3391ETMsg.AUTH_RSLT_RSP_DTL,  response_detail);
			// カード発行会社コード
			inputCardUkInfo.set(KK3391ETMsg.CARD_HAKKO_COMP_CD,  outResInfo.get("issur_id"));
			// カード発行会社名
			inputCardUkInfo.set(KK3391ETMsg.CARD_HAKKO_COMP_NM,  outResInfo.get("issur_name"));
			// フィンガープリント
			inputCardUkInfo.set(KK3391ETMsg.FINGERPRINT,  outResInfo.get("fingerprint"));
			// マスク済カード番号
			inputCardUkInfo.set(KK3391ETMsg.MASKZM_CARD_NO,  outResInfo.get("masked_card_number"));
			// カード有効期限
			inputCardUkInfo.set(KK3391ETMsg.CARD_YK_KIGEN,  outResInfo.get("card_valid_term"));
			// 仕向先カード会社コード
			inputCardUkInfo.set(KK3391ETMsg.SHIKOSAKI_CARD_COMP_CD,  outResInfo.get("acq_id"));
			// 仕向先カード会社名
			inputCardUkInfo.set(KK3391ETMsg.SHIKOSAKI_CARD_COMP_NM,  outResInfo.get("acq_name"));
			// イシュア区分
			inputCardUkInfo.set(KK3391ETMsg.ISSUER_DIV,  outResInfo.get("issur_class"));
			// ACS支払人認証要求HTML
			inputCardUkInfo.set(KK3391ETMsg.ACSPAYER_NINSHO_YOKYU_HTML,  outResInfo.get("out_acs_html"));
			// ATTEMPT区分
			inputCardUkInfo.set(KK3391ETMsg.ATTEMPT_DIV,  outResInfo.get("attempt_kbn"));
		}

		// 登録年月日時分秒
		inputCardUkInfo.set(KK3391ETMsg.ADD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		// 登録オペレータアカウント
		inputCardUkInfo.set(KK3391ETMsg.ADD_OPEACNT, inCBSMsg.getObject(OPERATORID));
		// 更新年月日時分秒
		inputCardUkInfo.set(KK3391ETMsg.UPD_DTM, JSYejbSysDate.getDate("YYYYMMDDHHMMSSSSS"));
		// 更新オペレータアカウント
		inputCardUkInfo.set(KK3391ETMsg.UPD_OPEACNT, inCBSMsg.getObject(OPERATORID));
		// 無効フラグ
		inputCardUkInfo.set(KK3391ETMsg.MK_FLG, JACStrConst.MK_FLG_YK);

		try
		{
			new JKKejbKK3391SecProc().create(inputCardUkInfo);
		}
		catch (CAANCreateException cce)
		{
			inCBSMsg.set(JKUStrConst.SIF_STATUS, StatusCodes.CREATE_DB_ERR);
			throw cce;
		}
	}

	/**
	 * null又は空文字の場合、trueを返却する
	 * 
	 * @param str 検査対象文字列
	 * @return true:null、又は空文字／false:左記以外
	 */
	public static boolean isNullBlank(String str)
	{
		if (null == str || "".equals(str))
		{
			return true;
		}
		return false;
	}
}
