/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAuthJskAddCC
*   ソースファイル名：JFUAuthJskAddCC.java
*   作成者          ：富士通
*   日付            ：2012年10月10日
*＜機能概要＞
*  オーソリ実績登録コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/10/10   FJ）大塚    新規作成
*   v1.01.00    2013/05/23   FJ）大塚    請求方法番号(クレジットカード)対応
*   v20.00      2015/11/20   FJ）岡井    【ANK-2565-00-00】クレカ番号預かりサービス導入(STEP3)
*   V24.00      2016/04/19   FJ) 横山    変更【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応
*   v36.00      2017/12/14   FJ) 岡井   【ANK-3313-02-00】クレジットカード非通過対応
*   v58.00.00   2022/05/09   FJ) 新谷   【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0531B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1031D010CBSMsg;

/**
 * オーソリ実績登録コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAuthJskAddCC extends JFUBaseCC
{
	/* ■□ クレジットオーソリ実績登録 ■□ */
	/** テンプレートID(クレジットオーソリ実績登録) */
	private static final String TEMPLATE_ID_EKK1031D010 = "EKK1031D010";

	/** IN項目リスト(クレジットオーソリ実績登録) */
	private static final List<String> IN_COLUMN_LIST_EKK1031D010 =
			Arrays.asList(EKK1031D010CBSMsg.SEIKY_KEI_NO, EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM, EKK1031D010CBSMsg.SEIKY_WAY_NO_CRECARD,
					EKK1031D010CBSMsg.CRECARD_GENE_ADD_DTM, EKK1031D010CBSMsg.CRECARD_COMP_CD, EKK1031D010CBSMsg.AUTH_TRAN_CD,
					EKK1031D010CBSMsg.SALES_AUTHORI_AMNT, EKK1031D010CBSMsg.CRECARD_NO, EKK1031D010CBSMsg.MEMBSTR_NO,
					EKK1031D010CBSMsg.CRECARD_YK_KIGEN, EKK1031D010CBSMsg.AUTHORI_YOKYU_CD, EKK1031D010CBSMsg.TRN_FLG, EKK1031D010CBSMsg.CHSHT_FLG,
					EKK1031D010CBSMsg.CL_CD, EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID, EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD);

	/* ■□ クレジットカード請求手続 ■□ */
	/** テンプレートID(クレジットカード請求手続) */
	private static final String TEMPLATE_ID_EKK0521D010 = "EKK0521D010";

	/** ワークエリア */
	private static final String CC_WORK_AREA_NAME = "JFUAuthCheckCCWork";
	private static final String CC_WORK_AREA_NAME_SKK = "JFUAddSkkSCWork";

	// 与信OK
	private static final String YOSHIN_OK = "000";
	// 与信OK
	private static final String YOSHIN_OK2 = "001";

	//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 start
	// 問合せ用カード番号
	private static final String CR_INQUIRE_CARD_NO = "cr_inquire_card_no";
	//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 end
	// マスクされたカード番号
	private static final String PY_MASKED_CARD_NUMBER = "py_masked_card_number";

	/**
	 *オーソリ実績登録処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite authorityJskAdd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ取得

		// クレジットオーソリ実績登録 EKK1031D010
		HashMap<String, Object> creAuthMap = (HashMap<String, Object>)param.getData(TEMPLATE_ID_EKK1031D010);

		// クレジット請求手続 EKK0521D010
		HashMap<String, Object> creSeikyMap = (HashMap<String, Object>)param.getData(TEMPLATE_ID_EKK0521D010);

		// クレジットオーソリ実績登録マップにデータが存在しない場合、処理を終了する。
		if (creAuthMap == null || creAuthMap.isEmpty())
		{
			return param;
		}

		String iktFlg = (String)creSeikyMap.get("iktFlg"); // 1:一括またはモバイル単独 0:一括でない

		// 一括登録・モバイル単独用に値を取得する。
		HashMap<String, String> iktMap = new HashMap<String, String>();

		// 一括登録の場合
		if ("1".equals(iktFlg))
		{
			// クリアパスがシステムエラーの場合は関連チェックエラーとなる為、クレジット請求手続の処理は削除
			// 判定はオーソリ初回依頼CCで実施している

			// ---請求契約番号---
			if (getWorkMapValue(param, "seiky_kei_no", CC_WORK_AREA_NAME_SKK) != null)
			{
				iktMap.put("seiky_kei_no", getWorkMapValue(param, "seiky_kei_no", CC_WORK_AREA_NAME_SKK));
			}

			// ---世代登録年月日時分秒---
			if (getWorkMapValue(param, "gene_add_dtm", CC_WORK_AREA_NAME_SKK) != null)
			{
				iktMap.put("gene_add_dtm", getWorkMapValue(param, "gene_add_dtm", CC_WORK_AREA_NAME_SKK));
			}
		}

		// ---請求方法番号(クレジットカード)---
		if (getWorkMapValue(param, "seiky_way_no_crecard", CC_WORK_AREA_NAME) != null)
		{
			iktMap.put("seiky_way_no_crecard", getWorkMapValue(param, "seiky_way_no_crecard", CC_WORK_AREA_NAME));
		}

		// ---クレジットカード世代登録年月日時分秒---
		if (getWorkMapValue(param, "gene_add_dtm", CC_WORK_AREA_NAME) != null)
		{
			iktMap.put("crecard_gene_add_dtm", getWorkMapValue(param, "gene_add_dtm", CC_WORK_AREA_NAME));
		}

		// ●クレジットオーソリ実績登録

		setInMapEKK1031D010(param, TEMPLATE_ID_EKK1031D010, creAuthMap, iktMap, iktFlg);

		// サービスIF実行
		executeSC(handle, param, TEMPLATE_ID_EKK1031D010, TEMPLATE_ID_EKK1031D010, BLANK, IN_COLUMN_LIST_EKK1031D010, BLANK);

		// 下りマッピング
		setOutMapEKK1031D010(param, TEMPLATE_ID_EKK1031D010);

		return param;
	}

	/**
	 * 上りマッピング項目設定(クレジットオーソリ実績登録)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK1031D010(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMap,
			HashMap<String, String> iktMap, String iktFlg) throws RequestParameterException
	{
		// 機能コード設定
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		if ("1".equals(iktFlg))
		{
			inMap.put(EKK1031D010CBSMsg.SEIKY_KEI_NO, iktMap.get("seiky_kei_no"));
		}
		else
		{
			inMap.put(EKK1031D010CBSMsg.SEIKY_KEI_NO, ccMap.get(EKK1031D010CBSMsg.SEIKY_KEI_NO));
		}
		if ("1".equals(iktFlg))
		{
			inMap.put(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM, iktMap.get("gene_add_dtm"));
		}
		else
		{
			inMap.put(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM, ccMap.get(EKK1031D010CBSMsg.SEIKY_KEI_GENE_ADD_DTM));
		}

		// 請求方法番号(クレジットカード)
		inMap.put(EKK1031D010CBSMsg.SEIKY_WAY_NO_CRECARD, iktMap.get("seiky_way_no_crecard"));
		// クレジットカード世代登録年月日時分秒
		inMap.put(EKK1031D010CBSMsg.CRECARD_GENE_ADD_DTM, iktMap.get("crecard_gene_add_dtm"));
		// クレジット会社コード
		//inMap.put(EKK1031D010CBSMsg.CRECARD_COMP_CD, ccMap.get(EKK1031D010CBSMsg.CRECARD_COMP_CD));
		// オーソリ依頼CCで返却されたカードブランドを設定
		String cardBrand = getWorkMapValue(param, "py_card_brand", CC_WORK_AREA_NAME);
		inMap.put(EKK1031D010CBSMsg.CRECARD_COMP_CD, cardBrand);
		// オーソリ処理コード
		inMap.put(EKK1031D010CBSMsg.AUTH_TRAN_CD, ccMap.get(EKK1031D010CBSMsg.AUTH_TRAN_CD));
		//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 start
		// クレジットカード番号
		// オーソリ初回依頼CCで返却された問合せ用カード番号を設定
		//inMap.put(EKK1031D010CBSMsg.CRECARD_NO, getWorkMapValue(param, CR_INQUIRE_CARD_NO, CC_WORK_AREA_NAME));
		// オーソリ依頼CCで返却されたマスクされたカード番号を設定
		inMap.put(EKK1031D010CBSMsg.CRECARD_NO, getWorkMapValue(param, PY_MASKED_CARD_NUMBER, CC_WORK_AREA_NAME));
		//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 end
		// 加盟店番号
		//inMap.put(EKK1031D010CBSMsg.MEMBSTR_NO, ccMap.get(EKK1031D010CBSMsg.MEMBSTR_NO));
		String membstrNo = "";
		ArrayList childList = getWorkMapArrayList(param, "EKK0531B501CBSMsg1List", CC_WORK_AREA_NAME);
		if (!JFUBPCommon.isNull(childList) && !JFUBPCommon.isNull(cardBrand))
		{
			for (int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);
				if (cardBrand.equals((String)childMap.get(EKK0531B501CBSMsg1List.CRECARD_COMP_CD)))
				{
					membstrNo = (String)childMap.get(EKK0531B501CBSMsg1List.MEMBSTR_NO_15);
					break;
				}
			}
		}
		inMap.put(EKK1031D010CBSMsg.MEMBSTR_NO, membstrNo);
		// クレジットカード有効期限
		inMap.put(EKK1031D010CBSMsg.CRECARD_YK_KIGEN, ccMap.get(EKK1031D010CBSMsg.CRECARD_YK_KIGEN));
		// オーソリ要求コード
		inMap.put(EKK1031D010CBSMsg.AUTHORI_YOKYU_CD, ccMap.get(EKK1031D010CBSMsg.AUTHORI_YOKYU_CD));

		// 与信結果フラグ
		Boolean yoshinFlg = false;

		// 処理フラグ
		//if (getWorkMapValue(param, "cr_resultcode", CC_WORK_AREA_NAME) != null)
		if (getWorkMapValue(param, "py_resultcode", CC_WORK_AREA_NAME) != null)
		{
			//String rstCd = getWorkMapValue(param, "cr_resultcode", CC_WORK_AREA_NAME);
			String rstCd = getWorkMapValue(param, "py_resultcode", CC_WORK_AREA_NAME);
			//処理結果の3桁目までを取得
			String resultCode = rstCd.substring(0, 3);

			// 与信OKな場合
			if (YOSHIN_OK.equals(resultCode) || YOSHIN_OK2.equals(resultCode))
			{
				// 処理済
				inMap.put(EKK1031D010CBSMsg.TRN_FLG, JFUStrConst.CD00614_1);
				yoshinFlg = true;
			}
			else
			{
				// 未処理
				inMap.put(EKK1031D010CBSMsg.TRN_FLG, JFUStrConst.CD00614_0);
			}
		}
		else
		{
			// 未処理
			inMap.put(EKK1031D010CBSMsg.TRN_FLG, JFUStrConst.CD00614_0);
		}

		// 抽出フラグ
		if (yoshinFlg)
		{
			// 処理済
			inMap.put(EKK1031D010CBSMsg.CHSHT_FLG, JFUStrConst.CD00615_1);
		}
		else
		{
			// 未処理
			inMap.put(EKK1031D010CBSMsg.CHSHT_FLG, JFUStrConst.CD00615_0);
		}

		// 取消コード
		inMap.put(EKK1031D010CBSMsg.CL_CD, ccMap.get(EKK1031D010CBSMsg.CL_CD));

		// クレジットカード番号預りID
		//if(getWorkMapValue(param, "cr_save_id", CC_WORK_AREA_NAME) != null)
		if(getWorkMapValue(param, "py_customer_id", CC_WORK_AREA_NAME) != null)
		{
			// オーソリ初回依頼CCで返却されたクレジットカード番号預りIDを設定
			//inMap.put(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID, getWorkMapValue(param, "cr_save_id", CC_WORK_AREA_NAME));
			// オーソリ依頼CCで返却された顧客IDを設定
			inMap.put(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID, getWorkMapValue(param, "py_customer_id", CC_WORK_AREA_NAME));
		}
		else
		{
			// 未設定
			inMap.put(EKK1031D010CBSMsg.CRECARD_NO_AZKRI_ID, JFUStrConst.EMPTY);
		}

		// 仕向先会社コード
		//if(!JFUBPCommon.isNull(getWorkMapValue(param, "cr_brandcode", CC_WORK_AREA_NAME)))
		if(!JFUBPCommon.isNull(getWorkMapValue(param, "py_acq_id", CC_WORK_AREA_NAME)))
		{
			// オーソリ初回依頼CC(クリアパス)で返却された仕向先カード会社コードを設定
			//inMap.put(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD, getWorkMapValue(param, "cr_brandcode", CC_WORK_AREA_NAME));
			// オーソリ依頼CCで返却された取扱カード会社コードを設定
			inMap.put(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD, getWorkMapValue(param, "py_acq_id", CC_WORK_AREA_NAME));
		}
		else
		{
			// 選択したクレジットカード会社に紐づく仕向先会社コードを設定
			inMap.put(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD, ccMap.get(EKK1031D010CBSMsg.SHIKOSAKI_COMP_CD));
		}
	}

	/**
	 * 下りマッピング項目設定(クレジットオーソリ実績登録)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap CCマップ
	 * @throws RequestParameterException
	 */
	private void setOutMapEKK1031D010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// クレジットオーソリ実績番号
		inMap.put(EKK1031D010CBSMsg.CREDIT_AUTH_JSK_NO, inMap.get(EKK1031D010CBSMsg.CREDIT_AUTH_JSK_NO));

		// 世代登録年月日時分秒
		inMap.put(EKK1031D010CBSMsg.GENE_ADD_DTM, inMap.get(EKK1031D010CBSMsg.GENE_ADD_DTM));
	}

	/**
	 * チェック処理
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 作業エリア
	 */
	private String getWorkMapValue(IRequestParameterReadWrite param, String key, String fixText) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(fixText);
		}

		String result = null;
		if (inMap != null)
		{
			result = (String)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}


	/**
	 * 作業領域から指定(キー)のリストを取得
	 */
	private ArrayList getWorkMapArrayList(IRequestParameterReadWrite param, String key, String fixText) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(fixText);
		}

		ArrayList result = null;
		if (inMap != null)
		{
			result = (ArrayList)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}
}
