/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKCashPostIkaAdd
*	ソースファイル名	：JBSbatKKCashPostIkaAdd.java
*	作成者				：富士通　
*	作成日				：2019年10月09日
*＜機能概要＞
*　キャッシュバックCP一括登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v46.00.00	2019/10/09	FJ)岡井		【ANK-3704-00-00】CASHPOST連携機能開発
*	v59.00.00	2022/04/06  FJ)美濃原	【ANK-4229-00-00】CASHPOST登録結果のメール送付
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatShoriIraiUtil;
import eo.business.common.JKKBatCommon;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM890;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.business.util.table.JBSbatKK_T_CASHPOST_KEI;
import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatOracleSeqUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKCashPostIkaAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(CASHPOST契約)*/
	private static final String D_TBL_NAME_KK_T_CASHPOST_KEI = "KK_T_CASHPOST_KEI";
	
	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	
	/** テーブル(データ一括登録管理)*/
	private static final String D_TBL_NAME_ZM_T_DATAIKTTRK_KNRI = "ZM_T_DATAIKTTRK_KNRI";
	
	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_T_CASHPOST_KEI_KK_SELECT_001 = "KK_SELECT_001";
	/** SQL定義キー(KK_SELECT_373)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_002 = "KK_INSERT_002";
	
	/** テーブルアクセスクラス(CASHPOST契約)*/
	private JBSbatSQLAccess db_KK_T_CASHPOST_KEI = null;
	
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	/** テーブルアクセスクラス(ディレイド処理依頼)*/
	private JBSbatSQLAccess db_ZM_T_DATAIKTTRK_KNRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** ファイルエンコード(SJIS) */
	private static final String ENCODE_SHIFT_JIS = "Shift-JIS";
	
	/** シーケンス定義名(CASHPOST契約番号：SEQ_CASHPOST_KEI_NO) */
	private static final String SEQ_CASHPOST_KEI_NO = "SEQ_CASHPOST_KEI_NO";
	
	/** エラーコード＆エラー理由 */
	private static enum ErrCdEnum
	{
		/** E010：項目数エラー */
		E010("入力ファイルの項目数が不正です。")
		/** E020：サービス契約番号エラー */
		,E020("サービス契約番号が不正です。")
		/** E030：CASHPOSTコードエラー */
		,E030("CASHPOSTコードが不正です。")
		/** E040：送付金額エラー */
		,E040("送付金額が不正です。")
		/** E100：サービス契約番号未存在エラー */
		,E100("サービス契約番号が存在しません。")
		/** E110：CASHPOSTコード未存在エラー */
		,E110("CASHPOSTコードが存在しません。")
		/** E120：組み合わせ存在エラー */
		,E120("サービス契約番号とCASHPOSTコードの組み合わせが既に登録されています。")
		/** E130：申込期間外エラー */
		,E130("CASHPOSTコードが申込期間外です。")
		/** E140：サービス契約番号ステータスエラー */
		,E140("サービス契約ステータスが登録対象外です。")
		/** E150：最大還元額エラー */
		,E150("送付金額が最大還元額を超過しています。")
		/** E160：合計最大還元額エラー */
		,E160("送付金額の合計が合計最大還元額を超過しています。")
		;
		
		final String message;
		
		private ErrCdEnum(String message)
		{
			this.message = message;
		}
	}
	
	/** キャッシュバックCP一括登録リスト定義ファイル名 */
	private static final String KKIFM890_DEF = "KKIFM890.def";
	
	/** キャッシュバックCP一括登録エラーリストファイル名 */
	private static final String KKIFM891_NAME = "KKIFM891.csv";
	
	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";
	
	/** ファイルコード */
	private static final String FILE_CD = "0000";
	
	/** 処理管理番号（キャッシュバックCP一括登録エラーリスト） */
	private static final String TRN_KANRI_NO_KKIFM891 = "000000000212";
	
	/** ファイル名編集用（キャッシュバックCP一括登録エラーリスト） */
	private static final String FILE_NAME_TEMPLATE_KKIFM891 = "キャッシュバックCP一括登録エラーリスト_yyyyMMddHHmmssSSS.csv";
	
	/** ファイル名で利用するタイムスタンプのフォーマット */
	private static final String FILE_TIMESTAMP_FORMAT = "yyyyMMddHHmmssSSS";
	
	/** キャッシュバックCP一括登録エラーリストファイルオブジェクト */
	private JBSbatBusinessFileUtil kkifm891FileObj = null;
	
	/** キャッシュバックCP一括登録エラーリストファイルレコード件数 */
	private int kkifm891RecordCnt = 0;
	
	/** 申込可否：0(申込不可) */
	private static final String MSKM_KH_0 = "0";
	
	/** 申込対象外サービス契約ステータス */
	private static final List<String> TG_OUT_SVC_KEI_STAT = Arrays.asList("010", "910", "920");
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_CASHPOST_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CASHPOST_KEI);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		db_ZM_T_DATAIKTTRK_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DATAIKTTRK_KNRI);

		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// ディレイド処理依頼情報リストを取得する
		List<HashMap<String, Object>> shoriIraiList = JCCbatShoriIraiUtil.getShoriIraiInfo(commonItem, this.jobid);

		// ディレイド処理依頼情報リストが取得できない場合、処理を終了する
		if (null == shoriIraiList)
		{
			return null;
		}

		// フリー項目を取得する
		String[] freeItems = freeItem.split(JKKBatConst.S_PARAM_DELIM);

		// キャッシュバックCP一括登録リスト定義ファイル名を取得する
		String kkifm890DefName = JBSbatAplConst.getAplConstValue(PARAM_IND) + KKIFM890_DEF;
		// キャッシュバックCP一括登録エラーリストファイルパス
		String kkifm891FilePath = freeItems[0] + KKIFM891_NAME;

		// ディレイド処理依頼情報リストの件数分繰り返す
		for (HashMap<String, Object> shoriIrai : shoriIraiList)
		{
			try
			{
				// チェックエラーフラグ
				boolean checkErrFlg = false;

				// 電子ファイル管理からキャッシュバックCP一括登録リストを取得する
				JBSbatInputFileUtil kkifm890FileUtil = 
					new JBSbatInputFileUtil(JCCBatCommon.searchDenshiFile(commonItem, (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.INPUT_EFILE_KANRI_NO)));

				// キャッシュバックCP一括登録リスト定義ファイルオブジェクトを生成する
				JBSbatDefFileUtil kkifm890FileDef = new JBSbatDefFileUtil(kkifm890DefName, kkifm890FileUtil);
				// キャッシュバックCP一括登録エラーリストファイルオブジェクトを生成する
				kkifm891FileObj = JKKBatCommon.createBusinessFileUtil(kkifm891FilePath, ENCODE_SHIFT_JIS, JKKStrConst.LINE_SEPARATOR, JKKStrConst.COMMA);

				// キャッシュバックCP一括登録リストファイルレコード件数
				int kkifm890RecordCnt = 0;
				// キャッシュバックCP一括登録エラーリストファイルレコード件数
				kkifm891RecordCnt = 0;

				// Readerオブジェクトを生成する
				kkifm890FileUtil.createReader();

				// キャッシュバックCP一括登録リストファイルの件数分繰り返す
				while (kkifm890FileUtil.ready())
				{
					// ファイルから１レコードを取得する
					String line = kkifm890FileUtil.readLine();

					// キャッシュバックCP一括登録リストファイルレコード件数カウント
					kkifm890RecordCnt++;

					// 空行の場合
					if (!JKKBatCommon.isNotNull(line))
					{
						// フォーマットエラー
						createKkifm891(null, ErrCdEnum.E010, " [" + kkifm890RecordCnt + "行目：空行エラー]");
						checkErrFlg = true;
						continue;
					}

					// １レコードの情報をマップに格納する
					JBSbatServiceInterfaceMap recordMap = kkifm890FileDef.lineToObject(line, kkifm890FileUtil, kkifm890RecordCnt);

					if (recordMap.isInputErrorFlg())
					{
						// フォーマットエラー
						createKkifm891(null, ErrCdEnum.E010, " [" + kkifm890RecordCnt + "行目：項目数エラー]");
						checkErrFlg = true;
						continue;
					}

					// 単項目チェック、関連チェック
					HashMap<String, Object> errMap = checkMain(recordMap);

					if(errMap != null && errMap.size() > 0)
					{
						// チェックエラー
						createKkifm891(recordMap, (ErrCdEnum)errMap.get("err_cd"), " [" + kkifm890RecordCnt + "行目："+ String.valueOf(errMap.get("err_naiyo")) +"]");
						checkErrFlg = true;
						continue;
					}

					// CASHPOST契約番号の採番(12桁)
					String cashpostKeiNo = JBSbatStringUtil.padNumFormString(JBSbatOracleSeqUtil.getNextSeq(commonItem.getConnection(), SEQ_CASHPOST_KEI_NO), 12);

					// CASHPOST契約の登録処理
					insertCashpostKei(recordMap, cashpostKeiNo);
				}

				// キャッシュバックCP一括登録エラーリストを閉じる
				JKKBatCommon.closeBusinessFileUtil(kkifm891FileObj);

				// 電子ファイル管理・ダウンロードファイル管理に登録
				addEfileAndDlFileKanri(kkifm891FilePath, FILE_NAME_TEMPLATE_KKIFM891, TRN_KANRI_NO_KKIFM891, String.valueOf(kkifm891RecordCnt));

				// 一時ファイルの削除
				deleteTmpFile(kkifm891FilePath);

				// ディレイド処理依頼の更新
				updateDelaydTrnReq(shoriIrai, checkErrFlg);

				// ディレイド処理依頼1件を処理する毎にコミット
				commit();
			}
			catch (Exception e)
			{
				// 想定外のエラー発生時は、ロールバック後にディレイド処理依頼だけをエラー更新してコミット。
				commonItem.getConnection().rollback();
				JCCBatCommon.updateShoriIraiResult(
						commonItem, (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO), JKKStrConst.DLYD_TRN_RSLT_CD_SYS_ERR, null);
				commit();

				// エラー通知は必要なので例外はそのまま投げる
				throw e;
			}
		}

		return null;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * CASHPOST契約の登録処理です。
	 * <br>
	 * @param recordMap
	 * @param cashpostKeiNo
	 * @throws Exception
	 */
	private void insertCashpostKei(JBSbatServiceInterfaceMap recordMap, String cashpostKeiNo) throws Exception
	{
		// CASHPOST契約テーブルの登録を行う
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_NO, cashpostKeiNo);
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.GENE_ADD_DTM, JCCBatCommon.getSysDateTimeStamp());
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_KEI_STAT, "010");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_NO, recordMap.get(JBSbatKKIFM890.SVC_KEI_NO));
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_CD, recordMap.get(JBSbatKKIFM890.CASHPOST_CD));
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.SOHU_AMNT, recordMap.get(JBSbatKKIFM890.SOHU_AMNT));
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_RNKI_YMD, "");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.MLAD, "");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.UKETORI_NINSHO_KEY, "");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_UK_NO, "");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ENDTIME, "");
// ANK-4229-00-00 ADD START
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.SITE_KANRI_NO, "");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.CASHPOST_ADD_YMD, super.opeDate);
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SEND_FLG, JKKStrConst.CD01335_SENDMI);
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.ADD_MAIL_SAKSEI_YMD, "");
		setMap.setValue(JBSbatKK_T_CASHPOST_KEI.RPSRC_CASHPOST_KEI_NO, "");
// ANK-4229-00-00 ADD END
		// 以下はフレームワークで自動設定
		// 登録年月日時分秒 登録オペレータアカウント 更新年月日時分秒 更新オペレータアカウント 無効フラグ
		// 登録運用年月日 登録処理ID 更新運用年月日 更新処理ID

		db_KK_T_CASHPOST_KEI.insertByPrimaryKeys(setMap);
	}

	/**
	 * 電子ファイル管理・ダウンロードファイル管理に登録します。
	 * <br>
	 * @param tmpFilePath
	 * @param fileNameTemplate
	 * @param trnKanriNo
	 * @param recordCount
	 * @throws Exception
	 */
	private void addEfileAndDlFileKanri(String tmpFilePath, String fileNameTemplate, String trnKanriNo, String recordCount) throws Exception
	{
		// 電子ファイル管理登録処理
		JBSbatCommonItem arg0 = commonItem;								// 業務共通電文
		String arg1 = FILE_CD;											// ファイルコード
		String arg2 = tmpFilePath;										// ファイルパス
		String arg3 = JBSbatDateUtil.adjustMonth(super.opeDate, 1);		// ファイル削除年月日（運用日付 + 1ヶ月）

		// 電子ファイル管理登録処理
		String[] rc = JCCBatCommon.createDenshiFile(arg0, arg1, arg2, arg3);

		// ログ出力
		super.logPrint.printDebugLog("電子ファイル管理番号(" + rc[0] +  ")、世代登録年月日時分秒(" + rc[1] + ")");

		// ファイル名
		String fileName = fileNameTemplate .replaceAll(FILE_TIMESTAMP_FORMAT, JCCBatCommon.getSysDateTime());

		// ダウンロードファイル管理登録処理
		String[] insertSetParam2 = new String[5];
		insertSetParam2[0] = trnKanriNo;								// 処理管理番号
		insertSetParam2[1] = fileName;									// ファイル名
		insertSetParam2[2] = recordCount;								// データ件数
		insertSetParam2[3] = rc[0];										// 電子ファイル管理番号
		insertSetParam2[4] = rc[1];										// 世代登録年月日時分秒
		executeZM_T_DL_FILE_KANRI_KK_INSERT_002(insertSetParam2);
	}

	/**
	 * 一時ファイルを削除します。
	 * <br>
	 * @param tmpFilePath 一時ファイルのファイルパス
	 */
	private void deleteTmpFile(String tmpFilePath)
	{
		File tmpFile = new File(tmpFilePath);
		if (tmpFile.exists())
		{
			tmpFile.delete();
		}
	}

	/**
	 * ディレイド処理依頼を更新します。
	 * <br>
	 * @param shoriIrai
	 * @param checkErrFlg
	 */
	private void updateDelaydTrnReq(HashMap<String, Object> shoriIrai, boolean checkErrFlg)
	{
		// ディレイド処理依頼番号
		String shoriIraiNo = (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO);

		// ディレイド処理依頼結果更新
		if (checkErrFlg)
		{
			// チェックエラーフラグがtrueの場合
			JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, shoriIraiNo, JKKStrConst.DLYD_TRN_RSLT_CD_APP_ERR, null);
		}
		else
		{
			// チェックエラーフラグがfalseの場合
			JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, shoriIraiNo, JKKStrConst.DLYD_TRN_RSLT_CD_COMPLETE, null);
		}
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_CASHPOST_KEI.close();
		db_ZM_T_DL_FILE_KANRI.close();
		db_ZM_T_DATAIKTTRK_KNRI.close();
			/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	[0]:サービス契約番号
	 *			[1]:CASHPOSTコード(上4桁)
	 *		 	[2]:CASHPOSTコード
	 *			[3]:オンライン運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CASHPOST_KEI_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[1] + "%");
		paramList.setValue(param[0]);
		paramList.setValue(param[0]);
		paramList.setValue(param[2]);
		paramList.setValue(param[2]);
		paramList.setValue(param[3]);
		paramList.setValue(param[0]);
		paramList.setValue(param[3]);

		// DBアクセスを実行します
		db_KK_T_CASHPOST_KEI.selectBySqlDefine(paramList, KK_T_CASHPOST_KEI_KK_SELECT_001);
	}
	
	/**
	 * SQLKEY(KK_INSERT_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 executeZM_T_DL_FILE_KANRI_KK_INSERT_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());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * キャッシュバックCP一括登録エラーリストを出力する。
	 * <br>
	 * @param recordMap 1レコード分の情報
	 * @param errCdEnum エラーコード
	 * @param additionalMessage エラー理由の付加文字列
	 */
	private void createKkifm891(JBSbatServiceInterfaceMap recordMap, ErrCdEnum errCdEnum, String additionalMessage) throws Exception
	{
		ArrayList<String> outputInfo = new ArrayList<String>();

		// 項目値
		if(recordMap == null)
		{
			outputInfo.add("");		// サービス契約番号
			outputInfo.add("");		// CASHPOSTコード
			outputInfo.add("");		// 送付金額
		}
		else
		{
			outputInfo.add(recordMap.getString(JBSbatKKIFM890.SVC_KEI_NO));		// サービス契約番号
			outputInfo.add(recordMap.getString(JBSbatKKIFM890.CASHPOST_CD));	// CASHPOSTコード
			outputInfo.add(recordMap.getString(JBSbatKKIFM890.SOHU_AMNT));		// 送付金額
		}

		// エラーコード
		outputInfo.add(errCdEnum.toString());

		// エラー理由
		if(additionalMessage != null)
		{
			outputInfo.add(errCdEnum.message + additionalMessage);
		}
		else
		{
			outputInfo.add(errCdEnum.message);
		}

		// 情報を格納
		JKKBatCommon.printDoubleQuoteBusinessFileUtil(kkifm891FileObj, outputInfo);

		// カウントアップ
		kkifm891RecordCnt++;
	}
	
	/**
	 * エラーチェックを行います。
	 * <br>
	 * @param recordMap キャッシュバックCP一括登録リストの１レコードの情報
	 * @return キャッシュバックCP一括登録エラーコード
	 */
	@SuppressWarnings("unchecked")
	private HashMap<String, Object> checkMain(JBSbatServiceInterfaceMap recordMap) throws Exception
	{
		// ********** 単項目チェック **********
		HashMap<String, Object> singleResult = singleCheck(recordMap.getMap());
		if(singleResult != null)
		{
			return singleResult;
		}

		// ********** 関連チェック **********
		HashMap<String, Object> relationResult = relationCheck(recordMap.getMap());
		if(relationResult != null)
		{
			return relationResult;
		}

		return null;
	}

	/**
	 * 入力情報の単項目チェックを行います。
	 * <br>
	 * @param rsMap 入力データが格納されたMap
	 * @return エラーコード
	 */
	private HashMap<String, Object> singleCheck(Map<String, Object> rsMap)
	{
		// 単項目チェックを行います
		String strValue = null;
		HashMap<String, Object> resultMap = new HashMap<String, Object>();

		// ********** サービス契約番号チェック **********
		strValue = (String)rsMap.get(JBSbatKKIFM890.SVC_KEI_NO);

		// 必須チェック
		if(JKKStringUtil.isNullBlank(strValue))
		{
			resultMap.put("err_cd", ErrCdEnum.E020);
			resultMap.put("err_naiyo", "必須エラー");
			return resultMap;
		}

		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1", "10"}))
		{
			resultMap.put("err_cd", ErrCdEnum.E020);
			resultMap.put("err_naiyo", "桁数エラー");
			return resultMap;
		}

		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			resultMap.put("err_cd", ErrCdEnum.E020);
			resultMap.put("err_naiyo", "属性エラー");
			return resultMap;
		}

		// ********** CASHPOSTコードチェック **********
		strValue = (String)rsMap.get(JBSbatKKIFM890.CASHPOST_CD);

		// 必須チェック
		if(JKKStringUtil.isNullBlank(strValue))
		{
			resultMap.put("err_cd", ErrCdEnum.E030);
			resultMap.put("err_naiyo", "必須エラー");
			return resultMap;
		}

		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1", "6"}))
		{
			resultMap.put("err_cd", ErrCdEnum.E030);
			resultMap.put("err_naiyo", "桁数エラー");
			return resultMap;
		}

		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			resultMap.put("err_cd", ErrCdEnum.E030);
			resultMap.put("err_naiyo", "属性エラー");
			return resultMap;
		}

		// ********** 送付金額チェック **********
		strValue = (String)rsMap.get(JBSbatKKIFM890.SOHU_AMNT);

		// 必須チェック
		if(JKKStringUtil.isNullBlank(strValue))
		{
			resultMap.put("err_cd", ErrCdEnum.E040);
			resultMap.put("err_naiyo", "必須エラー");
			return resultMap;
		}

		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "1", "7"}))
		{
			resultMap.put("err_cd", ErrCdEnum.E040);
			resultMap.put("err_naiyo", "桁数エラー");
			return resultMap;
		}

		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"long1"}))
		{
			resultMap.put("err_cd", ErrCdEnum.E040);
			resultMap.put("err_naiyo", "属性エラー");
			return resultMap;
		}

		// 金額チェック
		if(Integer.parseInt(strValue) <= 0)
		{
			resultMap.put("err_cd", ErrCdEnum.E040);
			resultMap.put("err_naiyo", "金額エラー");
			return resultMap;
		}

		return null;
	}

	/**
	 * 入力情報の関連チェックを行います。
	 * <br>
	 * @param rsMap 入力データが格納されたMap
	 * @return エラーコード
	 * @throws Exception 例外
	 */
	private HashMap<String, Object> relationCheck(Map<String, Object> rsMap) throws Exception
	{
		String svcKeiNo = (String) rsMap.get(JBSbatKKIFM890.SVC_KEI_NO);
		String cashpostCd = (String) rsMap.get(JBSbatKKIFM890.CASHPOST_CD);
		String sohuAmnt = (String) rsMap.get(JBSbatKKIFM890.SOHU_AMNT);

		// CASHPOST契約情報の取得
		executeKK_T_CASHPOST_KEI_KK_SELECT_001(new String[]{svcKeiNo, cashpostCd.substring(0, 4), cashpostCd, super.onlineOpeDate});
		JBSbatCommonDBInterface cpKeiInfo = db_KK_T_CASHPOST_KEI.selectNext();

		HashMap<String, Object> resultMap = new HashMap<String, Object>();

		// サービス契約番号存在チェック
		if (null == cpKeiInfo)
		{
			resultMap.put("err_cd", ErrCdEnum.E100);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		// CASHPOSTコード存在チェック
		if (JKKStringUtil.isNullBlank(cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.MST_CASHPOST_CD)))
		{
			resultMap.put("err_cd", ErrCdEnum.E110);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		// 組み合わせチェック
		if (!JKKStringUtil.isNullBlank(cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.TRN_CASHPOST_CD)))
		{
			resultMap.put("err_cd", ErrCdEnum.E120);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		// 申込期間チェック
		if (MSKM_KH_0.equals(cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.MSKM_KAHI_FLG)))
		{
			resultMap.put("err_cd", ErrCdEnum.E130);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		// サービス契約ステータスチェック
		if (TG_OUT_SVC_KEI_STAT.contains(cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.SVC_KEI_STAT)))
		{
			resultMap.put("err_cd", ErrCdEnum.E140);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		// 最大還元額チェック
		String maxKangenAmnt = cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.MAX_KANGEN_AMNT);
		if (JKKStringUtil.isNullBlank(maxKangenAmnt))
		{
			// マスタ値なので未設定はないはずだが、設定漏れを考慮しておく
			maxKangenAmnt = "0";
		}
		if (Integer.parseInt(sohuAmnt) > Integer.parseInt(maxKangenAmnt))
		{
			resultMap.put("err_cd", ErrCdEnum.E150);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		// 合計最大還元額チェック
		String grpSohuAmnt = cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.GRP_SOHU_AMNT);
		if (JKKStringUtil.isNullBlank(grpSohuAmnt))
		{
			// キャッシュバックCPが登録されていない場合は空のため、0円に置き換える
			grpSohuAmnt = "0";
		}

		String gokeiMaxKangenAmnt = cpKeiInfo.getString(JBSbatKK_T_CASHPOST_KEI.GOKEI_MAX_KANGEN_AMNT);
		if (JKKStringUtil.isNullBlank(gokeiMaxKangenAmnt))
		{
			// マスタ値なので未設定はないはずだが、設定漏れを考慮しておく
			gokeiMaxKangenAmnt = "0";
		}

		if ((Integer.parseInt(grpSohuAmnt) + Integer.parseInt(sohuAmnt)) > Integer.parseInt(gokeiMaxKangenAmnt))
		{
			resultMap.put("err_cd", ErrCdEnum.E160);
			resultMap.put("err_naiyo", "関連チェックエラー");
			return resultMap;
		}

		return null;
	}
}
