/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNYkRsltNgChsht
*	ソースファイル名	：JBSbatCNYkRsltNgChsht.java
*	作成者				：富士通　
*	作成日				：2011年08月08日
*＜機能概要＞
*　クレジット有効性結果NG抽出処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/08   富士通		新規作成
*	v58.00.00   2022/04/05  GDC)j.lawsin 【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
*	v58.00.01   2022/04/24  FJ)星野      【ANK-3846-11-00】【クレカ】クリアパス→ペイジェント移行／【仕変11】コンテンツクレカのカード会社ＶＩＳＡ・ＭＡＳＴＥＲの分離
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCNBatCommon;
import eo.common.constant.JCNStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCNYkRsltNgChsht extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(処理日付情報)*/
	private static final String D_TBL_NAME_CN_T_TRAN_YMD_INFO = "CN_T_TRAN_YMD_INFO";

	/** テーブル(コンテンツ事業クレジットカード)*/
	private static final String D_TBL_NAME_CN_T_CONTJIGYO_CRECA = "CN_T_CONTJIGYO_CRECA";

	/** テーブル(クレジットカード会社)*/
	private static final String D_TBL_NAME_KK_M_CRECARD_COMP = "KK_M_CRECARD_COMP";

	/** テーブル(実行制御ＨＵＬＦＴ用)*/
	private static final String D_TBL_NAME_CN_T_RUN_CTRL_HULFT = "CN_T_RUN_CTRL_HULFT";

	/** SQL定義キー(CN_SELECT_002)*/
	private static final String CN_T_TRAN_YMD_INFO_CN_SELECT_002 = "CN_SELECT_002";

	/** SQL定義キー(CN_SELECT_004)*/
	private static final String CN_T_CONTJIGYO_CRECA_CN_SELECT_004 = "CN_SELECT_004";

	/** SQL定義キー(CN_SELECT_002)*/
	private static final String KK_M_CRECARD_COMP_CN_SELECT_002 = "CN_SELECT_002";

	/** SQL定義キー(CN_SELECT_001)*/
	private static final String CN_T_RUN_CTRL_HULFT_CN_SELECT_001 = "CN_SELECT_001";

	/** テーブルアクセスクラス(処理日付情報)*/
	private JBSbatSQLAccess db_CN_T_TRAN_YMD_INFO = null;

	/** テーブルアクセスクラス(コンテンツ事業クレジットカード)*/
	private JBSbatSQLAccess db_CN_T_CONTJIGYO_CRECA = null;

	/** テーブルアクセスクラス(クレジットカード会社)*/
	private JBSbatSQLAccess db_KK_M_CRECARD_COMP = null;

	/** テーブルアクセスクラス(実行制御ＨＵＬＦＴ用)*/
	private JBSbatSQLAccess db_CN_T_RUN_CTRL_HULFT = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** メッセージキー(ECNB0090AI)*/
	private static final String ECNB0090AI = JPCBatchMessageConstant.ECNB0090AI;
	
	/** メッセージキー*/
	private static final String ECNB0230KE = JPCBatchMessageConstant.ECNB0230KE;
	
	/** 半角空白*/
	private static final String S_SPACE = " ";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();
		
		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		// パラメータチェック
		if(lines.length != 1 || ("").equals(lines[0]))
		{
			throw new JBSbatBusinessException(ECNB0230KE);
		}
		
		// DBアクセスクラスを生成します
		db_CN_T_TRAN_YMD_INFO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CN_T_TRAN_YMD_INFO);
		db_CN_T_CONTJIGYO_CRECA = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CN_T_CONTJIGYO_CRECA);
		db_KK_M_CRECARD_COMP = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_CRECARD_COMP);
		db_CN_T_RUN_CTRL_HULFT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CN_T_RUN_CTRL_HULFT);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 運用日付取得
		String strOpeDate = commonItem.getOpeDate();
		
		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();
		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		// パラメータ取得
		String strFreeParam1 = lines[0];	// 有効性チェック結果データファイル
		
		// 処理日付情報を取得
		JBSbatCommonDBInterface dbList1 = new JBSbatCommonDBInterface();
		dbList1. setValue(JCNStrConst.S_BAT_TRAN_CD_CINT_UPD);
		executeCN_T_TRAN_YMD_INFO_CN_SELECT_002(dbList1.getList().toArray());
		
		// SQL実行結果を取得
		JBSbatCommonDBInterface map = new JBSbatCommonDBInterface();
		String strTran_tg_ymd_next = "";
		for(map = db_CN_T_TRAN_YMD_INFO.selectNext(); null != map; map = db_CN_T_TRAN_YMD_INFO.selectNext())
		{
			strTran_tg_ymd_next = map.getString("TRAN_TG_YMD_NEXTM");
		}
		String strTranTgYm = strTran_tg_ymd_next.substring(0, 6);
		
		
		// HULFT実行制御を取得
		JBSbatCommonDBInterface dbList2 = new JBSbatCommonDBInterface();
		dbList2. setValue(JCNStrConst.S_CRE_RES_TRAN_FILE_ID);
		executeCN_T_RUN_CTRL_HULFT_CN_SELECT_001(dbList2.getList().toArray());
		
		String strFileSeq = db_CN_T_RUN_CTRL_HULFT.selectNext().getString("TRAN_ZUMI_FILE_SEQ");
		
		int lFileSeq = Integer.valueOf(strFileSeq) + 1;
		
		if(JCNStrConst.S_HULFT_C_FIR_NO_MAX + 1 == lFileSeq)
		{
			lFileSeq = JCNStrConst.S_HULFT_C_FIR_NO_MIN;
		}
		
		strFileSeq = JCNBatCommon.strZeroPad(String.valueOf(lFileSeq), 5);
		
		ArrayList<String> strRecList = new ArrayList<String>();	// ファイル出力レコード格納用
		
		// ヘッダーレコード作成
		String[] strData1 = new String[3];
		strData1[0] = JCNStrConst.S_CREYK_DATAKBN_HEAD;
		strData1[1] = JCNBatCommon.getSysDateTime();
		strData1[2] = strFileSeq;
		strRecList.add(createCSV(strData1, true) + JCNStrConst.S_LINE_SEPARAOR_LF);
		
		int iDatCnt = 0;
		
		// コンテンツ事業クレジットカード取得
		JBSbatCommonDBInterface dbList3 = new JBSbatCommonDBInterface();
		dbList3. setValue(strTranTgYm);
		executeCN_T_CONTJIGYO_CRECA_CN_SELECT_004(dbList3.getList().toArray());
		for(map = db_CN_T_CONTJIGYO_CRECA.selectNext(); null != map; map = db_CN_T_CONTJIGYO_CRECA.selectNext())
		{
			// 取得項目を格納
// ANK-3846-11-00対応 20220424 星野 MOD START
//			String strCreKokanCd = map.getString("CREDIT_KOKAN_CD");
			String strCrecardCompCd = map.getString("CRECARD_COMP_CD");
// ANK-3846-11-00対応 20220424 星野 MOD END
			String strCreNo = JCNBatCommon.getDecryptResult(commonItem, map.getString("CRECARD_NO"));
			String strCreCardId = map.getString("CRECARD_ID");
			
			// クレジットカード会社取得
			JBSbatCommonDBInterface dbList4 = new JBSbatCommonDBInterface();
// ANK-3846-11-00対応 20220424 星野 MOD START
//			dbList4. setValue(strCreKokanCd);
			dbList4. setValue(strCrecardCompCd);
// ANK-3846-11-00対応 20220424 星野 MOD END
			dbList4. setValue(strOpeDate);
			dbList4. setValue(strOpeDate);
			dbList4. setValue(strOpeDate);
			executeKK_M_CRECARD_COMP_CN_SELECT_002(dbList4.getList().toArray());
			for(map = db_KK_M_CRECARD_COMP.selectNext(); null != map; map = db_KK_M_CRECARD_COMP.selectNext())
			{
				String strCreCoNm = map.getString("CRECARD_COMP_NM");
				
				// データレコード作成
				String[] strData2 = new String[3];
				strData2[0] = JCNStrConst.S_CREYK_DATAKBN_DATA;
				strData2[1] = strCreCardId;
				strData2[2] = strCreCoNm + S_SPACE
											// ANK-3846-00-00 DEL START
											// + JCNStrConst.S_SEP_HAIFUN
											// ANK-3846-00-00 DEL END
											// ANK-3846-00-00 MOD START
											+ getMaskCardNo(strCreNo);
											// ANK-3846-00-00 MOD END
				strRecList.add(createCSV(strData2, true) + JCNStrConst.S_LINE_SEPARAOR_LF);
			
				iDatCnt++;
			}
		}
		
		// トレーラレコード作成
		String[] strData3 = new String[2];
		strData3[0] = JCNStrConst.S_CREYK_DATAKBN_TRAL;
		strData3[1] = JCNBatCommon.strZeroPad(String.valueOf(iDatCnt), 9);
		strRecList.add(createCSV(strData3, true));
		
		// ファイル出力
		JBSbatBusinessFileUtil obj = JCNBatCommon.createBusinessFileUtil(strFreeParam1, JCNStrConst.SJIS, JCNStrConst.S_LINE_SEPARAOR_LF, "");
		JCNBatCommon.printBusinessFileUtil(obj, strRecList);
		JCNBatCommon.closeBusinessFileUtil(obj);
		
		// レコード件数出力
		super.logPrint.printBusinessErrorLog(ECNB0090AI, new String[] {strFreeParam1, String.valueOf(iDatCnt + 2)});
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CN_T_TRAN_YMD_INFO.close();
		db_CN_T_CONTJIGYO_CRECA.close();
		db_KK_M_CRECARD_COMP.close();
		db_CN_T_RUN_CTRL_HULFT.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CN_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 executeCN_T_TRAN_YMD_INFO_CN_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CN_T_TRAN_YMD_INFO.selectBySqlDefine(paramList, CN_T_TRAN_YMD_INFO_CN_SELECT_002);
	}

	/**
	 * SQLKEY(CN_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	課金対象年月
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCN_T_CONTJIGYO_CRECA_CN_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CN_T_CONTJIGYO_CRECA.selectBySqlDefine(paramList, CN_T_CONTJIGYO_CRECA_CN_SELECT_004);
	}

	/**
	 * SQLKEY(CN_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_CN_SELECT_002(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_KK_M_CRECARD_COMP.selectBySqlDefine(paramList, KK_M_CRECARD_COMP_CN_SELECT_002);
	}

	/**
	 * SQLKEY(CN_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 executeCN_T_RUN_CTRL_HULFT_CN_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CN_T_RUN_CTRL_HULFT.selectBySqlDefine(paramList, CN_T_RUN_CTRL_HULFT_CN_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	

	/**
	 * CSV形式に文字列編集を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で連結文字列、""括り有無を設定します。<br>
	 *
	 * 2.引数を元に文字列を連結します。
	 *   連結文字列最後尾には改行コードを設定します。<br>
	 *   返却文字列内のnullは""へ置換します。
	 * </pre>
	 * <p>
	 * @param strData       出力対象データ。
	 * @param bDqFlg        ""括りあり(true),括りなし(false)。
	 * @return strRec       文字列連結結果を返却します。
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	public static String createCSV(String[] strData, boolean bDqFlg) throws Exception
	{

		StringBuffer sBufRec = new StringBuffer();

		for (int i = 0; i < strData.length; i++)
		{
			if(!bDqFlg)
			{
				sBufRec.append(strData[i]);
			}
			else
			{
				sBufRec.append(JCNStrConst.S_SEP_DQ);
				sBufRec.append(strData[i]);
				sBufRec.append(JCNStrConst.S_SEP_DQ);
			}
				
			if(i < strData.length - 1)
			{
					sBufRec.append(JCNStrConst.S_SEP_CAM);
			}
		}
		
		return sBufRec.toString().replace(JCNStrConst.S_IS_NULL, "");
	}

// ANK-3846-00-00 ADD START	
	/**
	 * 対象のカード番号の文字をマスクした。<br>
	 * 
	 * @param creCardNo       CN_T_CONTJIGYO_CRECA.CRECARD_NO
	 * @return maskedNumber   マスクされたカード番号の結果が返されます
	 * @throws Exception       業務サービス内で発生した例外全般。
	 */
	public static String getMaskCardNo(String creCardNo) throws Exception
	{
	    int index = 0;
	    StringBuffer maskedNumber = new StringBuffer();
		// 16桁のカード番号のデフォルトパターン
		String maskPattern = "####-##**-****-####";
	    
	    for (int i = 0; i < maskPattern.length(); i++) 
	    {
	        char c = maskPattern.charAt(i);
	        if (c == '#')
	        {
	        	maskedNumber.append(creCardNo.charAt(index));
	            index++;
	        } 
	        else if (c == '*')
	        {
	        	maskedNumber.append(c);
	            index++;
	        } 
	        else
	        {
	            maskedNumber.append(c);
	        }
	    }
	    
	    return maskedNumber.toString();
	}
// ANK-3846-00-00 ADD END
	
}
