/*********************************************************************
*  All Rights reserved,Copyright (c) Fujitsu ,2015					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKMoushikomiIkou
*	ソースファイル名	：JBSbatKKMoushikomiIkou.java
*	作成者				：富士通　
*	作成日				：2015年11月20日
*＜機能概要＞
*　申込断面明細移行対象抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v20.00.00	2015/11/20   FJ)笠川	ANK-2565-00-00_クレジットカード番号預かりサービス導入（Step3:預かり番号化）[新規作成]
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import eo.common.util.JCCMapConvXml;
import eo.business.common.JBSbatBusinessService;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKMoushikomiIkou<JBSbatServiceInterfaceMap> extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(申込断面明細)*/
	private static final String D_TBL_NAME_KK_T_MSKM_DMEN_DTL = "KK_T_MSKM_DMEN_DTL";

	/** SQL定義キー(KK_SELECT_002)*/
	private static final String KK_T_MSKM_DMEN_DTL_KK_SELECT_002 = "KK_SELECT_002";

	/** テーブル(システムパラメータ管理) */
	private static final String TBL_ZM_M_SYS_PARAM_KNRI = "ZM_M_SYS_PARAM_KNRI";

	/** SQL定義キー(システムパラメータ管理)*/
	private static final String ZM_M_SYS_PARAM_KNRI_AC_SELECT_001 = "AC_SELECT_001";

	/** テーブルアクセスクラス(申込断面明細)*/
	private JBSbatSQLAccess db_KK_T_MSKM_DMEN_DTL = null;

	/** DBアクセスクラス(システムパラメータ管理) */
	private JBSbatSQLAccess db_access_sys_param_knri = null;
	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	@Override
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		// TODO 自動生成されたメソッドスタブ
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// DBアクセスクラス生成
		db_KK_T_MSKM_DMEN_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_MSKM_DMEN_DTL);
		db_access_sys_param_knri = new JBSbatSQLAccess(commonItem, TBL_ZM_M_SYS_PARAM_KNRI);
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	/**
	 * 主処理
	 * @param ArrayList 
	 * @throws Exception
	 */
	public void execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("execute start");
		JCCMapConvXml jJCCMapConvXml = new JCCMapConvXml();

		// Listを生成します
		ArrayList<Object> listvalue = new ArrayList<Object>();
		ArrayList<Object> webNewInfo = new ArrayList<Object>();
		ArrayList<Object> payWayInfo = new ArrayList<Object>();
		ArrayList<Object> listCrecard1 = new ArrayList<Object>();
		ArrayList<Object> listCrecard2 = new ArrayList<Object>();
		ArrayList<Object> listCrecard3 = new ArrayList<Object>();
		ArrayList<Object> listCrecard4 = new ArrayList<Object>();
		HashMap<String, Object> map = new HashMap<String, Object>();

		JBSbatCommonDBInterface out_map = null;

		// システムパラメータ管理テーブル検索用パラメータ
		String[] sysParamParam = {"COMMIT_CNT"
				, commonItem.getJobid()
				, commonItem.getOpeDate()
				, commonItem.getOpeDate()};

		// システムパラメータ管理テーブル検索
		executeZM_M_SYS_PARAM_KNRI_AC_SELECT_001(sysParamParam);

		JBSbatCommonDBInterface resMap = new JBSbatCommonDBInterface();

		// 分割コミット数
		String commitRcrdCnt = "";


		// システムパラメータより取得した値をセットする。
		while((resMap = db_access_sys_param_knri.selectNext()) != null)
		{
			commitRcrdCnt = resMap.getString("SYS_PARAM_SETTE_VALUE_1");
		}
		//システムパラメータの値がnull
		if(commitRcrdCnt == null)
		{
			//EKKB0090TE	データ値が不正です。(%1%)	1	1	1
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0090TE", new String[]{"SYS_PARAM_SETTE_VALUE_1=" + commitRcrdCnt + "年月日を確認してください"});
		}
		// DBアクセスを実行します
		executeKK_M_CRECARD_COMP_KK_SELECT_002();
		//分割コミット件数
		int count = 0;
		//申込内容の項目にクレジットカード番号が割り振られているレコードを取得する(XMLデータ)
		while ((out_map = db_KK_T_MSKM_DMEN_DTL.selectNext()) != null)
		{
			//申込書番号
			String mskmsho_no = "";
			//申込断面明細番号
			String mskm_dmen_dtl_no = "";
			//申込内容
			String mskm_naiyo = "";
			try
			{
				mskmsho_no = JBSbatStringUtil.Rtrim(out_map.getString("MSKMSHO_NO"));
				mskm_dmen_dtl_no = JBSbatStringUtil.Rtrim(out_map.getString("MSKM_DMEN_DTL_NO"));
				mskm_naiyo = JBSbatStringUtil.Rtrim(out_map.getString("MSKM_NAIYO"));

				//XMLからMapオブジェクトへの変換処理です。
				map = jJCCMapConvXml.getParseXmlToMap(mskm_naiyo);

				//XML情報取得
				listvalue = (ArrayList<Object>)map.get("VALUE");
				if(listvalue == null || listvalue.size() == 0 )
				{
					//EKKB0090TE	データ値が不正です。(%1%)	1	1	1
					commonItem.getLogPrint().printBusinessErrorLog("EKKB0090TE",
							new String[]{"MSKMSHO_NO=" + mskmsho_no + "データ値が存在しません。"});
					continue;
				}
				//WEB新規情報の取得
				webNewInfo = getKeyListvalue(listvalue, "web_new_info");
				if(webNewInfo == null || webNewInfo.size() == 0 )
				{
					//EKKB0090TE	データ値が不正です。(%1%)	1	1	1
					commonItem.getLogPrint().printBusinessErrorLog("EKKB0090TE", new String[]{"MSKMSHO_NO=" + mskmsho_no + "データ値が存在しません。"});
					continue;
				}
				//支払い方法情報の取得
				payWayInfo = getKeyListvalue(webNewInfo, "payway_info");
				if(payWayInfo == null || payWayInfo.size() == 0 )
				{
					//EKKB0090TE	データ値が不正です。(%1%)	1	1	1
					commonItem.getLogPrint().printBusinessErrorLog("EKKB0090TE", new String[]{"MSKMSHO_NO=" + mskmsho_no + "データ値が存在しません。"});
					continue;
				}
				//クレジットカード番号の取得
				listCrecard1 = getKeyListvalue(payWayInfo, "crecard_no1");
				listCrecard2 = getKeyListvalue(payWayInfo, "crecard_no2");
				listCrecard3 = getKeyListvalue(payWayInfo, "crecard_no3");
				listCrecard4 = getKeyListvalue(payWayInfo, "crecard_no4");
				
				//クレジットカード番号をString型に変換する
				String crecard_no1 = (String)listCrecard1.get(0); 
				String crecard_no2 = (String)listCrecard2.get(0); 
				String crecard_no3 = (String)listCrecard3.get(0);
				String crecard_no4 = (String)listCrecard4.get(0);

				//クレジットカード番号を結合する
				StringBuffer card_no = new StringBuffer();
				card_no.append(crecard_no1);
				card_no.append(crecard_no2);
				card_no.append(crecard_no3);
				card_no.append(crecard_no4);
				card_no.toString();

				if(card_no.length() <= 10 )
				{
					throw new Exception();
				}
				//クレジットカード番号マスク化
				//クレジットカード番号の下4桁を抽出する。
				String lastDigits = (card_no.toString()).substring(card_no.length() -4);
				// 上12桁"0"パディング
				String mskNo = JBSbatStringUtil.padNumFormString(lastDigits, 16);

				//"crecard_no1〜4"に4桁ずつクレジットカード番号を割り当てる
				listCrecard1.set(0, mskNo.substring(0, 4));
				listCrecard2.set(0, mskNo.substring(4, 8));
				listCrecard3.set(0, mskNo.substring(8, 12));
				listCrecard4.set(0, mskNo.substring(12, 16));

				//マスク化対応したマップを文字列に変換
				String mskm_naiyo_henkan = jJCCMapConvXml.getParseMapToXml(map);
				//SQL更新項目パラメーター
				String[] setParam = {
						mskm_naiyo_henkan


				};
				//SQL条件パラメーター
				String[] whereParam = {
						mskmsho_no,
						mskm_dmen_dtl_no

				};
				//更新処理
				executeKK_T_MSKM_DMEN_DTL_PKUPDATE(setParam, whereParam);

				//分割コミット件数
				count++;
			}
			catch (Exception e)
			{
				commonItem.getLogPrint().printBusinessErrorLog("EKKB0010CW",
						new String[]{"DB更新に失敗しました。" 
						+ "　対象レコード：" +"申込書番号(MSKMSHO_NO) = " + mskmsho_no });
			}finally
			{
				if ((count != 0) && ((count + 1) % Integer.parseInt(commitRcrdCnt) == 0)) 
				{
					// 分割コミット
					super.commit();
				}
			}
		}
		super.logPrint.printDebugLog("execute_END");
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * ListからMapの取得<BR>
	 * @param list 取得したいlistのキー名
	 * @param element 取得したいelementの値名
	 * @return ArrayList 
	 */
	public ArrayList<Object> getKeyListvalue(ArrayList<Object> list , String element){
		HashMap<Object,Object> mapValue  = new HashMap<Object,Object>();
		ArrayList<Object> listValue = new ArrayList<Object>();
		for(int i = 0; i < list.size(); i++){
			mapValue = (HashMap)list.get(i);
			//パラメータ値とMap値の比較
			if (element.equals(mapValue.get("ELEMENT"))) 
			{
				//値の取得
				listValue = (ArrayList<Object>)mapValue.get("VALUE");
				if (listValue == null) 
				{
					ArrayList<Object> listCrecardNew = new ArrayList<Object>();
					listCrecardNew.add((Object)"");
					mapValue.put("VALUE",listCrecardNew);
					return listCrecardNew;
				}

				break;
			}
		}
		return listValue ;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_MSKM_DMEN_DTL.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	KDDI_WKEI_IDT_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
		private void executeKK_T_MSKM_DMEN_DTL_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
		{
			// 設定値のマップを作成します
			JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
			setMap.setValue("MSKM_NAIYO", setParam[0]);

			// 条件のマップを作成します
					JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
			whereMap.setValue("MSKMSHO_NO", whereParam[0]);
			whereMap.setValue("MSKM_DMEN_DTL_NO", whereParam[1]);
	
			// DBアクセスを実行します
			db_KK_T_MSKM_DMEN_DTL.updateByPrimaryKeys(whereMap, setMap);
		}

	
	/**
	 * SQLKEY(KK_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	更新年月日時分秒
	 *		 	更新オペレータアカウント
	 *		 	申込書番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_CRECARD_COMP_KK_SELECT_002() throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		
		// DBアクセスを実行します
		db_KK_T_MSKM_DMEN_DTL.selectBySqlDefine(paramList, KK_T_MSKM_DMEN_DTL_KK_SELECT_002);
	}	
	
	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムパラメータ分類コード
	 *		 	システムパラメータID
	 *		 	システムパラメータ適用開始年月日
	 *		 	システムパラメータ適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_SYS_PARAM_KNRI_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
	
		// DBアクセスを実行します
		db_access_sys_param_knri.selectBySqlDefine(paramList, ZM_M_SYS_PARAM_KNRI_AC_SELECT_001);
		
	}

}
