/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHIktKnkIdoSksi
*	ソースファイル名	：JBSbatCHIktKnkIdoSksi.java
*	作成者				：富士通　
*	作成日				：2023年10月11日
*＜機能概要＞
*　CHPRC12301_一括金庫移動登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v68.00.00	2023/10/11	FJ)美濃原	【ANK-4475-00-00】インボイス対応 STEP2 新規作成
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatShoriIraiUtil;
import eo.business.common.JCHbatIktKnkIdoSksUtil;
import eo.business.util.file.JBSbatCHIFM434;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatCH_T_KNK;
import eo.business.util.table.JBSbatCH_T_TOKUSOKU;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.constant.JPCModelConstant;
import eo.framework.application.JBSbatBusinessException;
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.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHIktKnkIdoSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(紹介)*/
	private static final String D_TBL_NAME_KK_T_INTR = "KK_T_INTR";

	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";

	/** SQL定義キー(CH_INSERT_001)*/
	private static final String ZM_T_DL_FILE_KANRI_CH_INSERT_001 = "CH_INSERT_001";

	/** テーブルアクセスクラス(紹介)*/
	private JBSbatSQLAccess db_KK_T_INTR = null;

	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ユーザー関連マップ */
	private HashMap<String, String> userMap = new HashMap<String, String>();

	/** 一括金庫移動登録Util部品 */
	private JCHbatIktKnkIdoSksUtil iktKnkIdoSksUtil = null;

	/** 「一括金庫移動登録指示ファイル」ファイル名 */
	private static final String CHIFM434_DEF = "CHIFM434.def";

	/** 「一括金庫移動登録処理結果ファイル」ファイル名 */
	private static final String CHIFM435_NAME = "CHIFM435.csv";

	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";

	/** ファイルコード */
	private static final String FILE_CD = "0000";

	/** 処理管理番号 */
	private static final String TRN_KANRI_NO = "000000000267";

	/** ファイル名編集用 */
	private static final String FILE_NM = "一括金庫移動登録処理結果ファイル_yyyyMMddHHmmssSSS.csv";

	/** ファイル名で利用するタイムスタンプのフォーマット */
	private static final String FILE_TIMESTAMP_FORMAT = "yyyyMMddHHmmssSSS";

	/** 「一括金庫移動登録処理結果ファイル」オブジェクト */
	private JBSbatBusinessFileUtil CHIFM435FileObj = null;

	/** 「一括金庫移動登録処理結果ファイル」レコード件数 */
	private int CHIFM435RecordCnt = 0;

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";
	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;
	/** SQL定義キー コード名称管理 (CH_SELECT_008)*/
	private static final String ZM_M_CD_NM_KANRI_CH_SELECT_008 = "CH_SELECT_008";
	/** [退避マスタ]バッチ メッセージマップ */
	private HashMap<String, String> errNaiyoMap = null;

	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";
	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/** SQL定義キー コード名称管理 (CH_SELECT_008)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_022 = "CH_SELECT_022";
	/** [退避マスタ]バッチ 料金項目コード */
	private HashMap<String, String> prcKmkCdMap = null;

	/** テーブル(金庫)*/
	private static final String D_TBL_NAME_CH_T_KNK = "CH_T_KNK";
	/** テーブルアクセスクラス(金庫)*/
	private JBSbatSQLAccess db_CH_T_KNK = null;
	/** SQL定義キー(CH_SELECT_013)*/
	private static final String CH_T_KNK_CH_SELECT_013 = "CH_SELECT_013";

	/** テーブル(請求契約)*/
	private static final String D_TBL_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";
	/** テーブルアクセスクラス(請求契約)*/
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;
	/** SQL定義キー(CH_SELECT_004)*/
	private static final String KK_T_SEIKY_KEI_CH_SELECT_004 = "CH_SELECT_004";

	/** テーブル(督促)*/
	private static final String D_TBL_CH_T_TOKUSOKU = "CH_T_TOKUSOKU";
	/** テーブルアクセスクラス(督促)*/
	private JBSbatSQLAccess db_CH_T_TOKUSOKU = null;
	/** SQL定義キー(CH_SELECT_004)*/
	private static final String CH_T_TOKUSOKU_CH_SELECT_023 = "CH_SELECT_023";
	
	/** 金庫ステータス */
	private static final List<String> CHECK_KNK_STATUS = Arrays.asList("1", "2", "3", "4");
	/** 顧客対応履歴表示フラグ */
	private static final List<String> CHECK_UST_TOAK_DSP_FLG = Arrays.asList("0", "1");

	/** 預り金金庫の総合計 */
	private static final String SEIKY_KEI_NO_KNK_AMNT = "SEIKY_KEI_NO_KNK_AMNT";

	/** 空文字 */
	private static final String EMPTY = "";

	/**
	 * 業務機能識別コードと移動先ステータスのマッピング<br/>
	 * <br/>
	 * 前受金：KNKSTAT03  ⇒ 1：前受金<br/>
	 * 仮受金：KNKSTAT01  ⇒ 2：仮受金<br/>
	 * 返戻不可分：KNKSTAT05  ⇒ 3：返戻不可金<br/>
	 * 処理済金（返戻金）：KNKSTAT15  ⇒ 4：処理済み金(返戻金)<br/>
	 * 預り金：KNKSTAT02  ※残金が発生する場合に使用<br/>
	 */
	private static final HashMap<String, String> CONV_KNKSTAT = new HashMap<String, String>()
	{
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		{
			put(JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT03, "1");
			put(JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT01, "2");
			put(JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT05, "3");
			put(JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT15, "4");
			put(JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT02, JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT02);
		}
	};

	/** 入力ファイルの項目名 */
	private static final List<String> INPUT_FILE_FIELDS =
			Arrays.asList(JBSbatCHIFM434.SEIKY_KEI_NO, JBSbatCHIFM434.KNK_STATUS, JBSbatCHIFM434.KNK_AMNT, JBSbatCHIFM434.CUST_TOAK_DSP_FLG,
					JBSbatCHIFM434.KIJI);

	/** エラー件数 */
	private int errCount = 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_INTR = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_INTR);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		db_CH_T_KNK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_KNK);
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_KK_T_SEIKY_KEI);
		db_CH_T_TOKUSOKU = new JBSbatSQLAccess(commonItem, D_TBL_CH_T_TOKUSOKU);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// コード名称管理取得
		this.errNaiyoMap = new HashMap<String, String>();
		makeCdNmKanriInfo(JACStrConst.CD_SBT_CD_CD01818, this.errNaiyoMap);
		if (this.errNaiyoMap == null || this.errNaiyoMap.size() == 0)
		{
			// コード名称管理が存在しない。
			// %1%テーブルに%2%が存在しません。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, new String[] { "コード名称管理", "コード区分(CD01818)" });
		}

		// 料金項目抽出変換
		this.prcKmkCdMap = new HashMap<String, String>();
		makePrcKmkCdMap(this.prcKmkCdMap);

		if (this.prcKmkCdMap == null || this.prcKmkCdMap.size() != 5)
		{
			// 変換用の料金科目コードが存在しない。
			// %1%テーブルに%2%が存在しません。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, new String[] { "料金項目抽出変換", "変換用の料金科目コード" });
		}

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// ディレイド処理依頼情報リストを取得する
		List<HashMap<String, Object>> shoriIraiList = JCCbatShoriIraiUtil.getShoriIraiInfo(commonItem, this.jobid);

		// ディレイド処理依頼情報リストが取得できない場合、処理を終了する
		if (null == shoriIraiList)
		{
			printInfoLog("■■■■■ディレイド処理依頼のリストは存在しませんでした。処理を終了します。■■■■■");
			return null;
		}

		// フリー項目を取得する
		String[] freeItems = freeItem.split(JACStrConst.FREE_DIV);

		// 「一括金庫移動登録処理結果ファイル」パス
		String CHIFM435FilePath = freeItems[0] + CHIFM435_NAME;

		// 「一括金庫移動登録指示ファイル」名を取得する（例：IND=/apl/it1-05/futurity-app/batch/def/）
		String CHIFM434DefName = JBSbatAplConst.getAplConstValue(PARAM_IND) + CHIFM434_DEF;

		// ■一括金庫移動登録Util部品オブジェクト生成し、バッチ→サービス間マッピングで必要な情報を取得
		iktKnkIdoSksUtil = new JCHbatIktKnkIdoSksUtil(commonItem);

		super.logPrint.printDebugLog("運用日付[" + super.opeDate + "]");

		// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
		//■ ディレイド処理依頼情報リストの件数分繰り返す
		// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
		for (HashMap<String, Object> shoriIrai : shoriIraiList)
		{
			String dlyd_trn_req_no = (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO);
			String input_efile_kanri_no = (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.INPUT_EFILE_KANRI_NO);
			// ユーザー関連情報を取得
			userMap = iktKnkIdoSksUtil.getUserMap(commonItem, dlyd_trn_req_no);
			printInfoLog("■■■■■ <START> ディレイド処理依頼番号[" + dlyd_trn_req_no + "],入力電子ファイル管理番号[" + input_efile_kanri_no +  "] ■■■■■");

			// チェックエラーフラグ
			boolean checkErrFlg = false;

			// 電子ファイル管理から「一括金庫移動登録指示ファイル」 を取得する
			String CHIFM434FilePath = JCCBatCommon.searchDenshiFile(commonItem, input_efile_kanri_no);

			// 「一括金庫移動登録指示ファイル」オブジェクトを生成する
			JBSbatInputFileUtil CHIFM434FileUtil = new JBSbatInputFileUtil(CHIFM434FilePath);

			// 「一括金庫移動登録指示ファイル」オブジェクトを生成する
			JBSbatDefFileUtil CHIFM434FileDef = new JBSbatDefFileUtil(CHIFM434DefName, CHIFM434FileUtil);

			// 「一括金庫移動登録処理結果ファイル」オブジェクトを生成する
			CHIFM435FileObj =
					JCCBatCommon.createBusinessFileUtil(CHIFM435FilePath, JACStrConst.ENCODE_SJIS, JACStrConst.LINE_SEPARATOR, JACStrConst.COMMA);

			// 「一括金庫移動登録指示ファイル」レコード件数
			int CHIFM434RecordCnt = 0;

			// 「一括金庫移動登録処理結果ファイル」レコード件数
			CHIFM435RecordCnt = 0;

			// Readerオブジェクトを生成する
			CHIFM434FileUtil.createReader();
			
			// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
			// 「一括金庫移動登録指示ファイル」の件数分繰り返す
			// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
			// □単項目チェック仕様を設定する
			LinkedHashMap<String, String[]> hashData = propertiesCHIFM434();
			while (CHIFM434FileUtil.ready())
			{
				// ファイルから１レコードを取得する
				String line = CHIFM434FileUtil.readLine();
				String[] lineFields = null;

				// 「一括金庫移動登録指示ファイル」レコード件数カウント
				CHIFM434RecordCnt++;

				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute]" + "ファイルの行番号[" + String.valueOf(CHIFM434RecordCnt) + "]");
				// 空行の場合
				if (JACBatCommon.isNull(line))
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					createCHIFM435(lineFields, "H001");
					checkErrFlg = true;
					continue;
				}
				
				// １レコードの情報をマップに格納する
				JBSbatServiceInterfaceMap recordMap = CHIFM434FileDef.lineToObject(line, CHIFM434FileUtil, CHIFM434RecordCnt);
				HashMap rsMap = recordMap.getMap();

				// フォーマットチェックを行う
				if (recordMap.isInputErrorFlg())
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					lineFields = getFieldsFromLine(line);
					createCHIFM435(lineFields, "H001");
					checkErrFlg = true;
					continue;
				}

				lineFields = getFieldsFromMap(rsMap);

				// □単項目チェックを行う
				if (isSingleCheckErr(lineFields, rsMap, hashData))
				{
					checkErrFlg = true;
					continue;
				}

				List<HashMap<String, String>> befKnkList = new ArrayList<HashMap<String, String>>();
				// □関連チェックを行う
				if (isKanrenCheckErr(lineFields, rsMap, befKnkList))
				{
					checkErrFlg = true;
					continue;
				}

				// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
				// □金庫テーブルの登録を行う
				// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
				printInfoLog("□□□ 更新開始 □□□" + recLogInfo(CHIFM434RecordCnt, rsMap));
				if (execCHSV0017(CHIFM434RecordCnt, rsMap, befKnkList, JPCModelConstant.FUNC_CD_1))
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					// 正常に登録されました。
					createCHIFM435(lineFields, "0000");
					printInfoLog("□□□ 正常更新 □□□" + "ファイルの行番号[" + String.valueOf(CHIFM434RecordCnt) + "]");
				}
				else
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					// 登録処理でエラーが発生しました。
					createCHIFM435(lineFields, "E900");
					checkErrFlg = true;
				}
			}
			
			// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
			// 「一括金庫移動登録処理結果ファイル」を閉じる
			// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
			JCCBatCommon.closeBusinessFileUtil(CHIFM435FileObj);
			
			// ディレイド処理依頼結果更新
			// チェックエラーフラグがtrueの場合
			if (checkErrFlg)
			{
				JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, dlyd_trn_req_no, JACStrConst.DLYD_TRN_RSLT_CD_WORK_ERR, null);
			}
			// チェックエラーフラグがfalseの場合
			else
			{
				JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, dlyd_trn_req_no, JACStrConst.DLYD_TRN_RSLT_CD_FIN, null);
			}
			
			// ■電子ファイル管理登録処理
			JBSbatCommonItem arg0 = commonItem;								// 業務共通電文
			String arg1 = FILE_CD;											// ファイルコード
			String arg2 = CHIFM435FilePath;									// ファイルパス
			String arg3 = JBSbatDateUtil.adjustMonth(super.opeDate, 1);		// ファイル削除年月日（運用日付 + 1ヶ月）
			String[] rc = JCCBatCommon.createDenshiFile(arg0, arg1, arg2, arg3);
			
			// システム日時を取得する(YYYYMMDDhhmmssSSS形式)
			String sysDateTimeStamp = JCCBatCommon.getSysDateTimeStamp();
			
			// ファイル名
			String fileName = FILE_NM.replaceAll(FILE_TIMESTAMP_FORMAT, sysDateTimeStamp);
			
			// ダウンロードファイル管理登録処理
			String[] insertSetParam2 = new String[5];
			insertSetParam2[0] = TRN_KANRI_NO;								// 処理管理番号
			insertSetParam2[1] = fileName;									// ファイル名
			insertSetParam2[2] = String.valueOf(CHIFM435RecordCnt);			// データ件数
			insertSetParam2[3] = rc[0];										// 電子ファイル管理番号
			insertSetParam2[4] = rc[1];										// 世代登録年月日時分秒
			executeZM_T_DL_FILE_KANRI_CH_INSERT_001(insertSetParam2);
			
			// ログ出力
			StringBuffer msgOutFile = new StringBuffer();
			msgOutFile.append("出力電子ファイル管理番号[" + rc[0] + "],世代登録年月日時分秒[" + rc[1] + "],出力ファイル名[" + fileName + "]");
			if (checkErrFlg)
			{
				msgOutFile.append(" 業務エラー有り");
			}
			else
			{
				msgOutFile.append(" 正常終了");
			}
			
			// 一時ファイルを削除する
			File CHIFM435File = new File(CHIFM435FilePath);
			if (CHIFM435File.exists())
			{
				CHIFM435File.delete();
			}

			// ログ出力
			StringBuffer msgStr = new StringBuffer();
			msgStr.append("■■■■■ < END > ディレイド処理依頼番号[" + dlyd_trn_req_no + "],");
			msgStr.append("入力電子ファイル管理番号[" + input_efile_kanri_no + "],");
			msgStr.append(msgOutFile);
			msgStr.append(" ■■■■■");
			printInfoLog(msgStr.toString());

		}
		// ■一括金庫移動登録Util部品オブジェクト Close
		iktKnkIdoSksUtil.close();

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_INTR.close();
		db_ZM_T_DL_FILE_KANRI.close();
		db_ZM_M_CD_NM_KANRI.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		db_CH_T_KNK.close();
		db_KK_T_SEIKY_KEI.close();
		db_CH_T_TOKUSOKU.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * コード名称管理スキーマを検索し、その結果を基にマップを作成します。
	 * 
	 * @param cdSbtCd　コード種別コード
	 * @param map　空のマップ作成
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeCdNmKanriInfo(String cdSbtCd, HashMap<String, String> map) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeCdNmKanriInfo]");

		// 条件値
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();

		// コード種別コード
		whereParam.setValue(cdSbtCd);
		// 適用開始年月日
		whereParam.setValue(super.opeDate);
		// 適用終了年月日
		whereParam.setValue(super.opeDate);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCdNmKanriInfo][whereParam=" + whereParam.getList().toString() + "]");

		// SQL実施
		executeZM_M_CD_NM_KANRI_CH_SELECT_008(whereParam.getList().toArray());

		// 結果取得
		JBSbatCommonDBInterface dbMap = db_ZM_M_CD_NM_KANRI.selectNext();

		// 取得した情報分情報を設定します。
		while (null != dbMap)
		{
			// 値を設定（KEY:コード名称管理．コード区分、VALUE:コード名称管理．コード区分名称）
			map.put(dbMap.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV), dbMap.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM));

			// 次レコード　読み込み
			dbMap = db_ZM_M_CD_NM_KANRI.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeCdNmKanriInfo]");
	}

	/**
	 * 料金項目抽出変換スキーマを検索し、その結果を基にマップを作成します。
	 * 
	 * @param map　空のマップ作成
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makePrcKmkCdMap(HashMap<String, String> map) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makePrcKmkCdMap]");

		// SQL実施
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_022();

		// 結果取得
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();

		// 取得した情報分情報を設定します。
		while (null != dbMap)
		{
			// 値を設定（KEY:業務機能識別コード、VALUE:料金項目コード）
			String workKinoSkbtCd = dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.WORK_KINO_SKBT_CD);
			String prcKmkCd = dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD);
			map.put(workKinoSkbtCd, prcKmkCd);

			// 次レコード　読み込み
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makePrcKmkCdMap]");
	}

	/**
	 * SQLKEY(ZM_M_CD_NM_KANRI_CH_SELECT_008)で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_M_CD_NM_KANRI_CH_SELECT_008(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_CH_SELECT_008);
	}

	/**
	 * SQLKEY(CH_M_PRC_KMK_CS_CHGE_CH_SELECT_022)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	業務機能識別コード
	 *		 	抽出変換コード
	 *		 	料金項目抽出変換適用開始年月日〜料金項目抽出変換適用終了年月日
	 * </pre>
	 * <p>
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_022() throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();

		// システムコード
		whereParam.setValue(JACStrConst.SYS_CD_CH);
		// 業務機能識別コード
		Set<String> keyInfo = CONV_KNKSTAT.keySet();
		for (String wkKnkStat : keyInfo)
		{
			whereParam.setValue(wkKnkStat);
		}
		// 抽出変換コード
		whereParam.setValue("1");
		// 料金項目抽出変換適用開始年月日〜料金項目抽出変換適用終了年月日
		whereParam.setValue(super.opeDate);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCdMap][whereParam=" + whereParam.getList().toString() + "]");

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(whereParam, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_022);
	}

	/**
	 * 出力ファイルの編集用。
	 * 
	 * @param line 入力ファイル行イメージ
	 * @return 配列変数
	 */
	private String[] getFieldsFromLine(String line)
	{
		String[] wLine = line.split(",");
		for (int idx = 0; idx < wLine.length; idx++)
		{
			wLine[idx] = wLine[idx].replaceAll(JACStrConst.DOUBLE_QUOTE, EMPTY);
		}
		return wLine;
	}

	/**
	 * 出力ファイルの編集用。
	 * 
	 * @param rsMap 入力項目
	 * @return 配列変数
	 */
	@SuppressWarnings("unchecked")
	private String[] getFieldsFromMap(HashMap rsMap)
	{
		String[] wLine = new String[rsMap.size()];
		for (int idx = 0; idx < rsMap.size(); idx++)
		{
			wLine[idx] = (String)rsMap.get(INPUT_FILE_FIELDS.get(idx));
		}
		return wLine;
	}

	/**
	 * 「一括金庫移動登録処理結果ファイル」を出力する。<br>
	 * @param lineFields 入力ファイル行イメージ
	 * @param msgCd メッセージコード
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void createCHIFM435(String[] lineFields, String msgCd)
			throws Exception {
		ArrayList<String> outputInfo = new ArrayList<String>();

		String msgStr = errNaiyoMap.get(msgCd);
		outputInfo.add(msgCd); // エラーコード
		outputInfo.add(msgStr); // エラー内容

		if (lineFields != null)
		{
			for (String str : lineFields)
			{
				outputInfo.add(getFieldVal(str));
			}
		}
		JCCBatCommon.printDoubleQuoteBusinessFileUtil(CHIFM435FileObj, outputInfo);

		CHIFM435RecordCnt++;
	}

	/**
	 * パラメタ単項目チェックのためハッシュを作成する。<br>
	 * @return LinkedHashMap 一括登録リストのハッシュマップ
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private LinkedHashMap<String, String[]> propertiesCHIFM434() throws Exception
	{
		LinkedHashMap<String, String[]> hashData = new LinkedHashMap<String, String[]>();

		// ※値が決まっていものは別途チェックするため、形式、桁数は設定しない。

		// 請求契約番号
		String[] value = new String[8];
		value[0] = "請求契約番号";								// 項目名
		value[1] = "1";											// 必須フラグ
		value[2] = "hannkakuesuuji1";							// 形式
		value[3] = "10";										// 最小桁数
		value[4] = "10";										// 最大桁数
		value[5] = "E001";										// 未入力エラーコード
		value[6] = "E001";										// 桁数エラーコード
		value[7] = "E001";										// 属性(形式)エラーコード
		hashData.put(JBSbatCHIFM434.SEIKY_KEI_NO, value);
		
		// 金庫ステータス
		String[] value2 = new String[8];
		value2[0] = "金庫ステータス";							// 項目名
		value2[1] = "";											// 必須フラグ
		value2[2] = "";											// 形式
		value2[3] = "";											// 最小桁数
		value2[4] = "";											// 最大桁数
		value2[5] = "";											// 未入力エラーコード
		value2[6] = "";											// 桁数エラーコード
		value2[7] = "";											// 属性(形式)エラーコード
		hashData.put(JBSbatCHIFM434.KNK_STATUS, value2);

		// 金額
		String[] value3 = new String[8];
		value3[0] = "金額";										// 項目名
		value3[1] = "1";										// 必須フラグ
		value3[2] = "hannkakuesuuji1";							// 形式
		value3[3] = "1";										// 最小桁数
		value3[4] = "12";										// 最大桁数
		value3[5] = "E003";										// 未入力エラーコード
		value3[6] = "E003";										// 桁数エラーコード
		value3[7] = "E003";										// 属性(形式)エラーコード
		hashData.put(JBSbatCHIFM434.KNK_AMNT, value3);

		// 顧客対応履歴表示フラグ
		String[] value4 = new String[8];
		value4[0] = "顧客対応履歴表示フラグ";					// 項目名
		value4[1] = "";											// 必須フラグ
		value4[2] = "";											// 形式
		value4[3] = "";											// 最小桁数
		value4[4] = "";											// 最大桁数
		value4[5] = "";											// 未入力エラーコード
		value4[6] = "";											// 桁数エラーコード
		value4[7] = "";											// 属性(形式)エラーコード
		hashData.put(JBSbatCHIFM434.CUST_TOAK_DSP_FLG, value4);

		// 記事
		String[] value5 = new String[8];
		value5[0] = "記事";										// 項目名
		value5[1] = "1";										// 必須フラグ
		value5[2] = "";											// 形式
		value5[3] = "1";										// 最小桁数
		value5[4] = "200";										// 最大桁数
		value5[5] = "E004";										// 未入力エラーコード
		value5[6] = "E004";										// 桁数エラーコード
		value5[7] = "";											// 属性(形式)エラーコード
		hashData.put(JBSbatCHIFM434.KIJI, value5);

		return hashData;
	}

	/**
	 * パラメタの単項目チェックを行う。<br>
	 * @param lineFields 入力ファイル行イメージ
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @param arrHash チェックするデータの属性
	 * @return boolean false：エラーなし、true：エラーあり
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private boolean isSingleCheckErr(String[] lineFields, HashMap rsMap, LinkedHashMap<String, String[]> arrHash) throws Exception
	{
		String key = "";
		String strValue = "";
		String min = "";
		String max = "";
		boolean singleCheckErrFlg = false;
		Iterator<String> iterator = arrHash.keySet().iterator();

		while (iterator.hasNext())
		{
			key = iterator.next();
			strValue = (String)rsMap.get(key);

			// 必須チェック
			if ("1".equals(arrHash.get(key)[1]))
			{
				if (JACBatCommon.isNull(strValue))
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					String msgCd = arrHash.get(key)[5];
					createCHIFM435(lineFields, msgCd);
					singleCheckErrFlg = true;
					break;
				}
			}

			if (!JACBatCommon.isNull(strValue))
			{
				min = arrHash.get(key)[3];
				max = arrHash.get(key)[4];

				// 桁数チェック
				if ((!JACBatCommon.isNull(min)) && (!JACBatCommon.isNull(max)))
				{
					if (!JBSbatCheckUtil.invoke(strValue, new String[] { "ketasuu2", min, max }))
					{
						// 「一括金庫移動登録処理結果ファイル」を出力する
						String msgCd = arrHash.get(key)[6];
						createCHIFM435(lineFields, msgCd);
						singleCheckErrFlg = true;
						break;
					}
				}

				// 形式チェック
				String zokusei = arrHash.get(key)[2];
				if (!JACBatCommon.isNull(zokusei))
				{
					if (!JBSbatCheckUtil.invoke(strValue, new String[] { arrHash.get(key)[2] }))
					{
						// 「一括金庫移動登録処理結果ファイル」を出力する
						String msgCd = arrHash.get(key)[7];
						createCHIFM435(lineFields, msgCd);
						singleCheckErrFlg = true;
						break;
					}
				}
			}

			if (JBSbatCHIFM434.KNK_STATUS.equals(key))
			{
				if (!CHECK_KNK_STATUS.contains(strValue))
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					createCHIFM435(lineFields, "E002");
					singleCheckErrFlg = true;
					break;
				}
			}
			if (JBSbatCHIFM434.CUST_TOAK_DSP_FLG.equals(key))
			{
				if (!CHECK_UST_TOAK_DSP_FLG.contains(strValue))
				{
					// 「一括金庫移動登録処理結果ファイル」を出力する
					createCHIFM435(lineFields, "E005");
					singleCheckErrFlg = true;
					break;
				}
			}
		}
		return singleCheckErrFlg;
	}

	/**
	 * パラメタの関連チェックを行う。<br>
	 * @param lineFields 入力ファイル行イメージ
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @param befKnkList 移動元金庫データ（DB）を格納されたList
	 * @return boolean false：エラーなし、true：エラーあり
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private boolean isKanrenCheckErr(String[] lineFields, HashMap rsMap, List<HashMap<String, String>> befKnkList) throws Exception
	{

		if (!isSikyKeiNo(rsMap))
		{
			// 「一括金庫移動登録処理結果ファイル」を出力する
			// 請求契約番号に該当する請求契約が存在しません。
			createCHIFM435(lineFields, "E100");
			return true;
		}

		// 督促情報取得
		getTokusoku(rsMap);

		if (!getKinkoInfo(rsMap, befKnkList))
		{
			// 「一括金庫移動登録処理結果ファイル」を出力する
			// 請求契約番号に紐づく預り金金庫が存在しません。
			createCHIFM435(lineFields, "E101");
			return true;
		}

		// 預り金金庫の合計金額を取得する。
		HashMap<String, String> befMap = befKnkList.get(0);
		long amntSum = getKngk(befMap.get(SEIKY_KEI_NO_KNK_AMNT));
		long saki = getKngk((String)rsMap.get(JBSbatCH_T_KNK.KNK_AMNT));
		if (saki > amntSum)
		{
			// 「一括金庫移動登録処理結果ファイル」を出力する
			// 預り金金庫の金額を超えています。
			createCHIFM435(lineFields, "E102");
			return true;
		}

		// 金庫ステータスに該当する料金項目コードが存在しません。
		HashMap<String, String> prcKmkCdMap = getPrcKmkCd(getFieldVal(rsMap.get(JBSbatCHIFM434.KNK_STATUS)));
		if (prcKmkCdMap == null || prcKmkCdMap.size() == 0)
		{
			// 「一括金庫移動登録処理結果ファイル」を出力する
			// 金庫ステータスに該当する料金項目コードが存在しません。
			createCHIFM435(lineFields, "E103");
			return true;
		}
		else
		{
			String prcKmkCd = prcKmkCdMap.get(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD);
			String workKinoSkbtCd = prcKmkCdMap.get(JBSbatCH_M_PRC_KMK_CS_CHGE.WORK_KINO_SKBT_CD);
			if (JACBatCommon.isNull(prcKmkCd))
			{
				// 「一括金庫移動登録処理結果ファイル」を出力する
				// 金庫ステータスに該当する料金項目コードが存在しません。
				createCHIFM435(lineFields, "E103");
				return true;
			}
			// 料金項目コード転記
			rsMap.put(JBSbatCH_T_KNK.KNK_PRC_KMK_CD, prcKmkCd);
			rsMap.put(JBSbatCH_M_PRC_KMK_CS_CHGE.WORK_KINO_SKBT_CD, workKinoSkbtCd);
		}
		return false;
	}

	/**
	 * 請求契約スキーマを入力情報の請求契約番号で検索し、取得の有無のチェックを行います。
	 * 
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @return boolean 判定結果（true：あり、false：なし）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private boolean isSikyKeiNo(HashMap rsMap) throws Exception
	{
		// SQL実行
		executeKK_T_SEIKY_KEI_CH_SELECT_004(rsMap);

		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_KK_T_SEIKY_KEI.selectNext();

		// 取得なしの場合
		if (dbMap == null)
		{
			return false;
		}

		return true;
	}


	/**
	 * 督促スキーマを入力情報の請求契約番号で検索し、督促番号を取得します。
	 * 
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @return boolean 判定結果（true：あり、false：なし）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private boolean getTokusoku(HashMap rsMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTokusoku]");

		// SQL実行
		executeCH_T_TOKUSOKU_CH_SELECT_023(rsMap);

		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_CH_T_TOKUSOKU.selectNext();

		// 取得なしの場合
		if (dbMap == null)
		{
			rsMap.put(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO, EMPTY);
//			rsMap.put("TOKUSOKU_UPD_DTM", EMPTY);
//			rsMap.put("TOKUSOKU_MSU_AMNT_SUM", EMPTY);
			return false;
		}
		else
		{
			rsMap.put(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO, getFieldVal(dbMap.getValue(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO)));
//			rsMap.put("TOKUSOKU_UPD_DTM", getFieldVal(dbMap.getValue(JBSbatCH_T_TOKUSOKU.UPD_DTM)));
//			rsMap.put("TOKUSOKU_MSU_AMNT_SUM", getFieldVal(dbMap.getValue(JBSbatCH_T_TOKUSOKU.MSU_AMNT_SUM));
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTokusoku]");

		return true;
	}

	/**
	 * 金庫スキーマを入力情報の請求契約番号で検索し、取得の有無のチェックを行います。
	 * 
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @param befKnkList 移動元金庫データ（DB）を格納されたList
	 * @return boolean 判定結果（true：あり、false：なし）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private boolean getKinkoInfo(HashMap rsMap, List<HashMap<String, String>> befKnkList) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKinkoInfo]");
		boolean resultFlg = false;
		// SQL実行
		executeCH_T_KNK_CH_SELECT_013(rsMap);

		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_CH_T_KNK.selectNext();

		// 取得した情報分情報を設定します。
		while (null != dbMap)
		{
			// 値を設定
			HashMap<String, String> befKnkMap = new HashMap<String, String>();
			befKnkMap.put(JBSbatCH_T_KNK.KNK_NO, dbMap.getString(JBSbatCH_T_KNK.KNK_NO));
			befKnkMap.put(JBSbatCH_T_KNK.GENE_ADD_DTM, dbMap.getString(JBSbatCH_T_KNK.GENE_ADD_DTM));
			befKnkMap.put(JBSbatCH_T_KNK.KNK_MOVE_CD, dbMap.getString(JBSbatCH_T_KNK.KNK_MOVE_CD));
			befKnkMap.put(JBSbatCH_T_KNK.SEIKY_KEI_NO, dbMap.getString(JBSbatCH_T_KNK.SEIKY_KEI_NO));
			befKnkMap.put(JBSbatCH_T_KNK.KNK_IDO_YMD, dbMap.getString(JBSbatCH_T_KNK.KNK_IDO_YMD));
			befKnkMap.put(JBSbatCH_T_KNK.IDOMOTO_KNK_NO, dbMap.getString(JBSbatCH_T_KNK.IDOMOTO_KNK_NO));
			befKnkMap.put(JBSbatCH_T_KNK.TOGO_KNK_NO, dbMap.getString(JBSbatCH_T_KNK.TOGO_KNK_NO));
			befKnkMap.put(JBSbatCH_T_KNK.NYUKIN_NO, dbMap.getString(JBSbatCH_T_KNK.NYUKIN_NO));
			befKnkMap.put(JBSbatCH_T_KNK.KNK_PRC_KMK_CD, dbMap.getString(JBSbatCH_T_KNK.KNK_PRC_KMK_CD));
			befKnkMap.put(JBSbatCH_T_KNK.KNK_AMNT, dbMap.getString(JBSbatCH_T_KNK.KNK_AMNT));
			befKnkMap.put(JBSbatCH_T_KNK.SSN_WAY_CD, dbMap.getString(JBSbatCH_T_KNK.SSN_WAY_CD));
			befKnkMap.put(JBSbatCH_T_KNK.UPD_DTM, dbMap.getString(JBSbatCH_T_KNK.UPD_DTM));
			befKnkMap.put(SEIKY_KEI_NO_KNK_AMNT, dbMap.getString(SEIKY_KEI_NO_KNK_AMNT));
			befKnkList.add(befKnkMap);
			// 次レコード　読み込み
			dbMap = db_CH_T_KNK.selectNext();
			resultFlg = true;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKinkoInfo]");
		return resultFlg;
	}

	/**
	 * SQLKEY(CH_SELECT_004)でDBアクセスを行います。<br>
	 * 
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private void executeKK_T_SEIKY_KEI_CH_SELECT_004(HashMap rsMap) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(rsMap.get(JBSbatCHIFM434.SEIKY_KEI_NO));
		whereMap.setValue(this.opeDate);

		// DBアクセスを実行します
		db_KK_T_SEIKY_KEI.selectBySqlDefine(whereMap, KK_T_SEIKY_KEI_CH_SELECT_004);
	}

	/**
	 * SQLKEY(CH_SELECT_023)でDBアクセスを行います。<br>
	 * 
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private void executeCH_T_TOKUSOKU_CH_SELECT_023(HashMap rsMap) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(rsMap.get(JBSbatCHIFM434.SEIKY_KEI_NO));
		whereMap.setValue(this.opeDate);
		whereMap.setValue(this.opeDate);

		// DBアクセスを実行します
		db_CH_T_TOKUSOKU.selectBySqlDefine(whereMap, CH_T_TOKUSOKU_CH_SELECT_023);
	}

	/**
	 * SQLKEY(CH_SELECT_013)でDBアクセスを行います。<br>
	 * 
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	@SuppressWarnings("unchecked")
	private void executeCH_T_KNK_CH_SELECT_013(HashMap rsMap) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue(rsMap.get(JBSbatCHIFM434.SEIKY_KEI_NO));

		// DBアクセスを実行します
		db_CH_T_KNK.selectBySqlDefine(whereMap, CH_T_KNK_CH_SELECT_013);
	}

	/**
	 * 料金項目コードを取得します。
	 * 
	 * <br>
	 * @param knk_status 移動先ステータス
	 * @return 料金項目コード
	 */
	private HashMap<String, String> getPrcKmkCd(String knk_status)
	{
		HashMap<String, String> resultMap = new HashMap<String, String>();
		// 業務機能識別コード
		Set<String> keyInfo = CONV_KNKSTAT.keySet();
		for (String work_kino_skbt_cd : keyInfo)
		{
			String status = CONV_KNKSTAT.get(work_kino_skbt_cd);
			if (knk_status.equals(status))
			{
				resultMap.put(JBSbatCH_M_PRC_KMK_CS_CHGE.WORK_KINO_SKBT_CD, work_kino_skbt_cd);
				resultMap.put(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD, prcKmkCdMap.get(work_kino_skbt_cd));
				break;
			}
		}

		return resultMap;
	}
	/**
	 * [更新処理]金庫移動登録
	 * @param fileIdx ファイルの行番号
	 * @param rsMap 入力ファイル情報
	 * @param befKnkList 移動元金庫のリスト
	 * @param funcCd 機能コード
	 * @return 実行結果 true:エラーなし、false:エラーあり
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private boolean execCHSV0017(long fileIdx, HashMap rsMap, List<HashMap<String, String>> befKnkList, String funcCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execCHSV0017]");

		// 移動元金庫毎に更新処理を呼び出す。
		// 入力ファイルの金額
		long checkKnkAmnt = Long.parseLong((String)rsMap.get(JBSbatCHIFM434.KNK_AMNT));
		long wkZan = checkKnkAmnt;

		String seiky_kei_no = (String)rsMap.get(JBSbatCH_T_KNK.SEIKY_KEI_NO);
		String knk_prc_kmk_cd_1 = (String)rsMap.get(JBSbatCH_T_KNK.KNK_PRC_KMK_CD);
		String work_kino_skbt_cd_1 = (String)rsMap.get(JBSbatCH_M_PRC_KMK_CS_CHGE.WORK_KINO_SKBT_CD);
		String cust_toak_dsp_flg = (String)rsMap.get(JBSbatCHIFM434.CUST_TOAK_DSP_FLG);
		String kiji = (String)rsMap.get(JBSbatCHIFM434.KIJI);

		// 残金調整用の料金科目コード（預り金）
		String knk_prc_kmk_cd_2 = getFieldVal(prcKmkCdMap.get(JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT02));
		String work_kino_skbt_cd_2 = JACStrConst.WORK_KINO_SKBT_CD_KNKSTAT02;

		long updKnk = 0;
		long sum = 0;
		for (HashMap<String, String> befKnk : befKnkList)
		{
			long wkUpdAmnt = 0;
			long wkCreateAzukari = 0;

			// 移動元金庫の金庫金額
			long knk_amnt = getKngk(befKnk.get(JBSbatCH_T_KNK.KNK_AMNT));
			if (0 >= wkZan)
			{
				// 未引当金額なし
				break;
			}
			else if (wkZan >= knk_amnt)
			{
				// @又はAの場合＝１明細作成する
				// ・@「入力ファイル金額」で未引当の金額 と「移動元金庫の金額」が同額（引当完了）
				// ・A「入力ファイル金額」で未引当の金額がある（引当未完了） 
				wkUpdAmnt = knk_amnt;
				wkZan = wkZan - knk_amnt;
			}
			else if (wkZan < knk_amnt)
			{
				// 「入力ファイル金額」で未引当の金額 と預り金金庫作成（引当完了）＝２明細
				wkUpdAmnt = wkZan;
				wkCreateAzukari = knk_amnt - wkZan;
				wkZan = 0;
			}

			// 更新対象となった金庫の集計値
			sum = sum + wkUpdAmnt;
			updKnk++;

			String moto_prc_kmk_cd = befKnk.get(JBSbatCH_T_KNK.KNK_PRC_KMK_CD);

			HashMap<String, String> knkchg = new HashMap<String, String>();
			knkchg.put(JBSbatCHIFM434.CUST_TOAK_DSP_FLG, cust_toak_dsp_flg);
			knkchg.put(JBSbatCHIFM434.KIJI, kiji);

			knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_SEIKY_KEI_NO_1, seiky_kei_no);
			knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_KNK_PRC_KMK_CD_1, knk_prc_kmk_cd_1);
			knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_KNK_AMNT_1, String.valueOf(wkUpdAmnt));
			knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_WORK_KINO_SKBT_CD_1, work_kino_skbt_cd_1);
			knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_KIJI_1, kiji);
			String ssnWayCd1 = iktKnkIdoSksUtil.getSsnWayCd(work_kino_skbt_cd_1);
			knkchg.put(JCHbatIktKnkIdoSksUtil.SSN_WAY_CD_AF_1, ssnWayCd1);
			String prcTaioKirokSbtDtlCd1 = iktKnkIdoSksUtil.getPrcTaioKirokSbtDtlCd(prcKmkCdMap, moto_prc_kmk_cd, knk_prc_kmk_cd_1);
			knkchg.put(JCHbatIktKnkIdoSksUtil.PRC_TAIO_KIROK_SBT_DTL_CD_1, prcTaioKirokSbtDtlCd1);

			String ssnWayCd2 = EMPTY;
			String prcTaioKirokSbtDtlCd2 = EMPTY;
			StringBuffer infoMsg = new StringBuffer();
			StringBuffer infoMsg2 = new StringBuffer();
			// 移動元金庫に残金がある場合
			if (wkCreateAzukari > 0)
			{
				knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_SEIKY_KEI_NO_2, seiky_kei_no);
				knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_KNK_PRC_KMK_CD_2, knk_prc_kmk_cd_2);
				knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_KNK_AMNT_2, String.valueOf(wkCreateAzukari));
				knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_WORK_KINO_SKBT_CD_2, work_kino_skbt_cd_2);
				knkchg.put(JCHbatIktKnkIdoSksUtil.KNK_IDO_SK_KIJI_2, kiji);
				ssnWayCd2 = iktKnkIdoSksUtil.getSsnWayCd(work_kino_skbt_cd_2);
				knkchg.put(JCHbatIktKnkIdoSksUtil.SSN_WAY_CD_AF_2, ssnWayCd2);
				prcTaioKirokSbtDtlCd2 = iktKnkIdoSksUtil.getPrcTaioKirokSbtDtlCd(prcKmkCdMap, moto_prc_kmk_cd, knk_prc_kmk_cd_2);
				knkchg.put(JCHbatIktKnkIdoSksUtil.PRC_TAIO_KIROK_SBT_DTL_CD_2, prcTaioKirokSbtDtlCd2);
				// メッセージ編集
				infoMsg2.append("(2)更新科目[" + String.valueOf(knk_prc_kmk_cd_2) + "],");
				infoMsg2.append("移動先金額[" + String.valueOf(wkCreateAzukari) + "] ");
				infoMsg2.append("精算方法コード[" + ssnWayCd2 + "],");
				infoMsg2.append("料金対応記録種別詳細コード[" + prcTaioKirokSbtDtlCd2 + "],");
			}

			// メッセージ編集
			infoMsg.append("ファイルの行番号[" + String.valueOf(fileIdx) + "],");
			infoMsg.append("請求契約番号[" + seiky_kei_no + "],");
			infoMsg.append("督促番号[" + rsMap.get(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO) + "],");
			infoMsg.append("移動元金庫更新件数[" + String.valueOf(updKnk) + "]件目,");
			infoMsg.append("移動元金庫[" + befKnk.get(JBSbatCH_T_KNK.KNK_NO) + "],");
			infoMsg.append("(1)更新科目[" + String.valueOf(knk_prc_kmk_cd_1) + "],");
			infoMsg.append("移動先金額[" + String.valueOf(wkUpdAmnt) + "],");
			infoMsg.append("精算方法コード[" + ssnWayCd1 + "],");
			infoMsg.append("料金対応記録種別詳細コード[" + prcTaioKirokSbtDtlCd1 + "],");
			infoMsg.append(infoMsg2);
			infoMsg.append("⇒ファイル残金[" + String.valueOf(wkZan) + "]");

			// ログ出力
			printInfoLog(infoMsg.toString());

			if (!subCHSV0017(fileIdx, rsMap, befKnk, knkchg, funcCd))
			{
				// 更新処理中のエラー。（データ不整合の可能性あり）
				return false;
			}
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execCHSV0017]");

		return true;
	}

	/**
	 * [更新処理]金庫移動登録
	 * @param fileIdx ファイルの行番号
	 * @param rsMap 入力ファイル情報
	 * @param befKnk 移動元金庫情報
	 * @param knkchg 更新情報
	 * @param funcCode 機能コード
	 * @return 実行結果 true:エラーなし、false:エラーあり
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private boolean subCHSV0017(long fileIdx, HashMap rsMap, HashMap<String, String> befKnk, HashMap<String, String> knkchg, String funcCode) throws Exception
	{
		// チェックサービス用パラメータ
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		// サービス呼出用
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// 上りマッピング
		knkchg.put(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO, getFieldVal(rsMap.get(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO)));
		iktKnkIdoSksUtil.setCHSV001701SC(inputMap, befKnk, knkchg, funcCode); // ECH0191D020 : 金庫移動登録
		iktKnkIdoSksUtil.setHURYOCUSTDELCC(inputMap, befKnk, knkchg, funcCode); // HURYOCUSTDELCC : 不良顧客論理削除CC
		iktKnkIdoSksUtil.setPRCTAIOKIROKADDCC(inputMap, befKnk, knkchg, funcCode, userMap); // PRCTAIOKIROKADDCC : 料金対応記録登録CC
		iktKnkIdoSksUtil.setTAIOKIROKADDCC(inputMap, befKnk, knkchg, funcCode, userMap); // TAIOKIROKADDCC : 顧客対応記録登録CC
		iktKnkIdoSksUtil.setADDHOTVOICCC(inputMap, befKnk, knkchg, funcCode); // ADDHOTVOICCC : ホットボイスCC
		iktKnkIdoSksUtil.setSEIKYKEISEARCHCC(inputMap, befKnk, knkchg, funcCode); // SEIKYKEISEARCHCC : 請求契約取得

		// パラメータ設定
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, JCHbatIktKnkIdoSksUtil.UCID_CHSV0017);
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, JCHbatIktKnkIdoSksUtil.OPID_CHSV0017OP);

		// 連携パラメータ（デバッグ）
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][subCHSV0017]" + "\n" + mapDebug("", inputMap, ""));

		try
		{
			JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		}
		catch (Exception ex)
		{
			// エラー内容をログに出力する
			// 更新処理中のエラー。（データ不整合の可能性あり）
			String msgInfo = "【システムエラー】(subCHSV0017-1) " + ex.toString() +"\n" + recLogInfo(fileIdx, rsMap);
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, new String[] { msgInfo });
			super.commonItem.setErrFlg(true);
			errCount++;
			return false;
		}

		// サービスの呼び出し結果が正常終了でない場合
		String returnCode = JCCBatchEsbInterface.getReturnCode(outputMap);
		if (!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode))
		{
			// エラー内容をログに出力する
			// 更新処理中のエラー。（データ不整合の可能性あり）
			String msgInfo = "【リターンコード】" + returnCode + ",【システムエラー】(subCHSV0017-2)" + recLogInfo(fileIdx, rsMap);
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, new String[] { msgInfo });
			super.commonItem.setErrFlg(true);
			errCount++;
			return false;
		}

		return true;

	}

	/**
	 * SQLKEY(ZM_T_DL_FILE_KANRI_CH_INSERT_001)で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_CH_INSERT_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());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_CH_INSERT_001);
	}
	
	/**
	 * null値を空文字に変換する。
	 * 
	 * <br>
	 * @param val 値
	 * @return 変換後
	 */
	private String getFieldVal(Object val)
	{
		String checkVal = (String)val;
		if (JACBatCommon.isNull(checkVal))
		{
			return EMPTY;
		}
		return checkVal;
	}

	/**
	 * 金額の型変換。
	 * 
	 * @param val 値
	 * @return 変換結果
	 */
	private long getKngk(String val) {
		return Long.parseLong(val);
	}

	/**
	 * 情報メッセージ出力
	 * 
	 * <br>
	 * @param msg メッセージ
	 */
	private void printInfoLog(String msg)
	{
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1200AI, new String[] { msg });
	}

	/**
	 * ログ出力時の補足情報
	 * 
	 * <br>
	 * @param fileIdx ファイルの行番号
	 * @param rsMap 入力ファイルの情報
	 * @return 編集結果
	 */
	@SuppressWarnings("unchecked")
	private String recLogInfo(long fileIdx, HashMap rsMap)
	{
		StringBuffer infoMsg = new StringBuffer();
		infoMsg.append("ファイルの行番号[" + String.valueOf(fileIdx) + "],");
		infoMsg.append("請求契約番号[" + getFieldVal(rsMap.get(JBSbatCHIFM434.SEIKY_KEI_NO)) + "],");
		infoMsg.append("金額[" + getFieldVal(rsMap.get(JBSbatCHIFM434.KNK_AMNT)) + "],");
		infoMsg.append("金庫ステータス[" + getFieldVal(rsMap.get(JBSbatCHIFM434.KNK_STATUS)) + "],");
		infoMsg.append("記事[" + getFieldVal(rsMap.get(JBSbatCHIFM434.KIJI)) + "],");
		infoMsg.append("顧客対応履歴表示フラグ[" + getFieldVal(rsMap.get(JBSbatCHIFM434.CUST_TOAK_DSP_FLG)) + "]");
		return infoMsg.toString();
	}

	/**
	 * Mapデバッグ確認。
	 *
	 * <br>
	 * @param groupNm 名称
	 * @param wkMap マップ
	 */
	@SuppressWarnings("unchecked")
	public static String mapDebug(String groupNm, HashMap wkMap, String wTab)
	{
		StringBuffer sb = new StringBuffer();
		try
		{
			if (wkMap == null || wkMap.size() == 0)
			{
				return sb.toString();
			}
			Iterator<String> itr = wkMap.keySet().iterator();
			wTab = wTab + "\t";
			while (itr.hasNext())
			{
				String key = (String)itr.next();
				Object value = wkMap.get(key);
				if (value == null)
				{
					sb.append(wTab + "＠＠＠ " + key + "=[" + value + "]" + "\r\n");
				}
				else if (value instanceof String)
				{
					sb.append(wTab + "＠＠＠ " + key + "=[" + value + "]" + "\r\n");
				}
				else if (value instanceof Map)
				{
					sb.append(wTab + "＠＠＠ 【" + key + "】" + "\r\n");
					sb = sb.append(mapDebug(groupNm, (HashMap)value, wTab));
				}
				else if (value instanceof List)
				{
					sb.append(wTab + "＠＠＠ 【" + key + "】" + "\r\n");
					sb = sb.append(listDebug(groupNm, (ArrayList)value, key, wTab));
				}
				else
				{
					sb.append(wTab + "＠＠＠ タイプ対応外 \r\n");
				}
			}
		}
		catch (Exception ex)
		{
			// 処理続行
			return sb.toString();
		}

		return sb.toString();
	}

	/**
	 * 変数デバッグ確認。
	 *
	 * <br>
	 * @param groupNm 集計単位名
	 * @param wribCampList リスト
	 */
	@SuppressWarnings("unchecked")
	public static String listDebug(String groupNm, ArrayList wribCampList, String key, String wTab)
	{
		StringBuffer sb = new StringBuffer();
		try
		{
			if (wribCampList == null || wribCampList.size() == 0)
			{
				return sb.toString();
			}
			int idx = 0;
			for (int i = 0; i < wribCampList.size(); i++)
			{
				sb.append(wTab + "＠＠＠ " + key + " 配列(" + idx + ")" + "\r\n");
				wTab = wTab + "\t";
				Object value = (HashMap)wribCampList.get(i);
				if (value == null)
				{
					sb.append(wTab + "＠＠＠ " + "=[" + value + "]" + "\r\n");
				}
				else if (value instanceof String)
				{
					sb = sb.append((String)value);
				}
				else if (value instanceof Map)
				{
					sb = sb.append(mapDebug(groupNm, (HashMap)value, wTab));
				}
				else if (value instanceof List)
				{
					sb = sb.append(listDebug(groupNm, (ArrayList)value, key, wTab));
				}
				else
				{
					sb.append(wTab + "＠＠＠ タイプ対応外 \r\n");
				}
				idx++;
			}
		}
		catch (Exception ex)
		{
			// 処理続行
			return sb.toString();
		}
		return sb.toString();
	}
}
