/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCrdtPaywayChgErrLstIvr
*	ソースファイル名	：JBSbatKKCrdtPaywayChgErrLstIvr.java
*	作成者				：GDC)j.lawsin
*	作成日				：2022年04月22日
*＜機能概要＞
*	クレジット支払方法変更エラーリスト（ＩＶＲ）作成
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v58.00.00   2022/04/22  GDC)j.lawsin      【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.common.constant.JKKStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author GDC)j.lawsin
*/
public class JBSbatKKCrdtPaywayChgErrLstIvr extends JBSbatBusinessService
{
	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	
	/** SQL定義キー(KK_INSERT_006)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_006 = "KK_INSERT_006";
	
	/** テーブル(ＩＶＲ進捗管理)*/
	private static final String D_TBL_NAME_KK_T_IVR_PRG_KANRI = "KK_T_IVR_PRG_KANRI";
	
	/** SQL定義キー(KK_SELECT_002)*/
	private static final String KK_T_IVR_PRG_KANRI_KK_SELECT_002 = "KK_SELECT_002";
	
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_KK_T_IVR_PRG_KANRI = null;
	
	/** 処理管理番号：クレジット支払方法変更エラーリスト（ＩＶＲ） */
	private static final String KKLST10902_TRN_KANRI_NO = "000000000252";
	
	/** クレジット支払方法変更エラーリスト（ＩＶＲ）ファイル名編集用 */
	private static final String KKLST10902_FILE_NM = "KKLST10902_yyyyMMddHHmmss.csv";
	
	/** ファイル名で利用するタイムスタンプのフォーマット */
	private static final String FILE_TIMESTAMP_FORMAT = "yyyyMMddHHmmss";
	
	/** ファイルコード */
	private static final String FILE_CD = "0000";
	
	/** クレジット支払方法変更エラーリスト（ＩＶＲ）ファイルオブジェクト */
	private JBSbatBusinessFileUtil kklst10902FileObj = null;
	
	/** クレジット支払方法変更エラーリスト（ＩＶＲ）ファイル件数 */
	private int kklst10902Cnt = 0;
	
	/** 出力済フラグ */
	private static final String OUTPUT_ZUMI_FLG = "0";
	
	/** IVRオーソリ状況情報 (正常) */
	private static final String IVR_AUTHORI_JOKYO_INFO_NORMAL = "0";
	
	/** IVRオーソリ状況情報 (異常) */
	private static final String IVR_AUTHORI_JOKYO_INFO_ERR = "1";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		db_KK_T_IVR_PRG_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_IVR_PRG_KANRI);
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		// フリー項目を取得する
		String[] freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);
		
		// システム日時を取得する
		String sysDateTime = JCCBatCommon.getSysDateTime();
		
		// ファイル名
		String kklst10902FileName = KKLST10902_FILE_NM.replaceAll(FILE_TIMESTAMP_FORMAT, sysDateTime);
		
		// クレジット支払方法変更エラーリスト（ＩＶＲ）ファイルパス
		String kklst10902FilePath = freeItems[0] + kklst10902FileName;
		
		// クレジット支払方法変更エラーリスト（ＩＶＲ）ファイルオブジェクトを生成する
		kklst10902FileObj = JKKBatCommon.createBusinessFileUtil(kklst10902FilePath,
				JKKBatConst.SJIS, JKKStrConst.LINE_SEPARATOR, JKKBatConst.S_SEP_CAM);
		
		// クレジット支払方法変更エラーリスト（ＩＶＲ）ファイルレコード件数
		kklst10902Cnt = 0;
		
		// ＩＶＲ進捗管理の検索を行う。
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		executKK_T_IVR_PRG_KANRI_KK_SELECT_002(paramList.getList().toArray());
		
		// SQL実行結果を取得
		JBSbatCommonDBInterface map = new JBSbatCommonDBInterface();
		
		for(map = db_KK_T_IVR_PRG_KANRI.selectNext(); null != map; map = db_KK_T_IVR_PRG_KANRI.selectNext())
		{
			// クレジット支払方法変更エラーリスト（ＩＶＲ）ファイルのデータ部
			ArrayList<String> kklst10902Data = new ArrayList<String>();
			
			// IVRオーソリ状況情報: 4 - レスポンスコード, 5 - レスポンス詳細, 3 - 処理結果, 8 - 取扱カード会社コード, 11 - カードブランド
			//                 6 - マスクされたカード番号, 7 - クレジットカード有効期限, 9 - デビット・プリペイド判定結果, 10 - クレジットイシュア区分
			String[] splitArray = map.getString("IVR_AUTHORI_JOKYO_INFO").split(JKKBatConst.S_SEP_CAM);
			// 分割後の長さを12に揃える 埋まってないところは空文字列で埋める
			String[] statusInfo = Arrays.copyOf(splitArray, 12);
			if(splitArray.length < statusInfo.length)
			{
				Arrays.fill(statusInfo, splitArray.length, statusInfo.length, "");
			}
			
			// 取得項目を格納
			kklst10902Data.add(map.getString("IVR_IKT_ADD_ERR_CD"));				// エラーコード
			kklst10902Data.add(map.getString("IVR_IKT_ADD_ERR_RSN"));				// エラー内容
			kklst10902Data.add(statusInfo[4]);										// レスポンスコード
			kklst10902Data.add(statusInfo[5]);										// レスポンス詳細
			kklst10902Data.add(map.getString("SEIKY_KEI_NO"));						// 顧客ID（請求契約番号）
			kklst10902Data.add(map.getString("CRECARD_NO_AZKRI_ID"));				// カード番号預りID
			kklst10902Data.add(map.getString("IVR_SKBT_ID"));						// 識別ID
			kklst10902Data.add(map.getString("IVR_UK_NO"));							// 受付番号
			kklst10902Data.add(map.getString("IVR_TRAN_RUN_DATE"));					// 処理実行日時
			
			// 処理結果
			String processingRsltNm = "";
			if (IVR_AUTHORI_JOKYO_INFO_NORMAL.equals(statusInfo[3]))
			{
				processingRsltNm = "正常";
			}
			else if (IVR_AUTHORI_JOKYO_INFO_ERR.equals(statusInfo[3]))
			{
				processingRsltNm = "異常";
			}

			kklst10902Data.add(processingRsltNm);									// 処理結果
			kklst10902Data.add(statusInfo[8]);										// 取扱カード会社コード
			kklst10902Data.add(statusInfo[11]);										// カードブランド
			kklst10902Data.add(statusInfo[6]);										// マスクされたカード番号
			kklst10902Data.add(statusInfo[7]);										// クレジットカード有効期限
			kklst10902Data.add(statusInfo[9]);										// デビット・プリペイド判定結果
			kklst10902Data.add(statusInfo[10]);										// クレジットイシュア区分
			
			JKKBatCommon.printBusinessFileUtil(kklst10902FileObj, kklst10902Data);
			
			// クレジット支払方法変更エラーリスト（ＩＶＲ）ファイル件数カウント
			kklst10902Cnt++;
			
			// 設定値
			JBSbatCommonDBInterface setParam = new JBSbatCommonDBInterface();
			setParam.setValue("1");														// 出力済フラグ
			
			// 条件値
			JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
			whereParam.setValue(map.getString("IVR_UK_NO"));								// IVR受付番号
			
			executeKK_T_IVR_PRG_KANRI_PK_UPDATE(setParam.getList().toArray(), whereParam.getList().toArray());
		}

		// クレジット支払方法変更エラーリスト（ＩＶＲ）ファイルを閉じる
		JKKBatCommon.closeBusinessFileUtil(kklst10902FileObj);
		
		// 電子ファイル管理登録処理
		JBSbatCommonItem common = commonItem;										// 業務共通電文
		String fileCd = FILE_CD;													// ファイルコード
		String filePath = kklst10902FilePath;										// ファイルパス
		String fileDeletionDt = JBSbatDateUtil.adjustMonth(super.opeDate, 3);		// ファイル削除年月日（運用日付 + 3ヶ月）
		String[] rc = JCCBatCommon.createDenshiFile(common, fileCd, filePath, fileDeletionDt);
		
		// ログ出力
		super.logPrint.printDebugLog("電子ファイル管理番号(" + rc[0] + ")、世代登録年月日時分秒(" + rc[1] + ")");
		
		// ダウンロードファイル管理登録処理
		String[] insertSetParamKK_INSERT_006 = new String[5];
		insertSetParamKK_INSERT_006[0] = KKLST10902_TRN_KANRI_NO;				// 処理管理番号
		insertSetParamKK_INSERT_006[1] = kklst10902FileName;					// ファイル名
		insertSetParamKK_INSERT_006[2] = String.valueOf(kklst10902Cnt);			// データ件数
		insertSetParamKK_INSERT_006[3] = rc[0];									// 電子ファイル管理番号
		insertSetParamKK_INSERT_006[4] = rc[1];									// 世代登録年月日時分秒
		executeZM_T_DL_FILE_KANRI_KK_INSERT_006(insertSetParamKK_INSERT_006);
		
		// 一時ファイルを削除する
		File kklst10902File = new File(kklst10902FilePath);
		if (kklst10902File.exists())
		{
			kklst10902File.delete();
		}
		
		return null;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		// DBアクセスクラスをクローズします
		db_ZM_T_DL_FILE_KANRI.close();
		db_KK_T_IVR_PRG_KANRI.close();
	}

	/**
	 * SQLKEY(KK_INSERT_006)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	処理管理番号
	 *		 	ファイル名
	 *		 	データ件数
	 *		 	電子ファイル管理番号
	 *		 	世代登録年月日時分秒
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_DL_FILE_KANRI_KK_INSERT_006(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());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_006);
	}
	
	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	出力済フラグ				MK_FLG
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	IVR受付番号				IVR_UK_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private int executeKK_T_IVR_PRG_KANRI_PK_UPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("OUTPUT_ZUMI_FLG", setParam[0]);
		
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("IVR_UK_NO", whereParam[0]);
	
		// DBアクセスを実行します
		int updateCnt = db_KK_T_IVR_PRG_KANRI.updateByPrimaryKeys(whereMap, setMap);
		
		return updateCnt;
	}
	
	/**
	 * SQLKEY(KK_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *			OUTPUT_ZUMI_FLG
	 *			MK_FLG
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executKK_T_IVR_PRG_KANRI_KK_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();

		// DBアクセスを実行します
		db_KK_T_IVR_PRG_KANRI.selectBySqlDefine(paramList, KK_T_IVR_PRG_KANRI_KK_SELECT_002);
	}
}
