/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名		：JBSbatKKBankTohaigoInfIktAdd
*	ソースファイル名	：JBSbatKKBankTohaigoInfIktAdd.java
*	作成者		：富士通　
*	作成日		：2022年05月30日
*＜機能概要＞
* 金融機関統廃合情報一括登録
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v58.00.00	2022/05/30   GDC) D.Dinglasan 60_ANK-4234-00-00_廃止金融機関に紐づく口座情報一括更新対応
*********************************************************************/

package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatShoriIraiUtil;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSBatKKIFM946;
import eo.business.util.table.JBSbatKK_T_KOZA;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JPCDateUtil;
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.JBSbatDateUtil;
import eo.framework.util.JCCBatchEsbInterface;

public class JBSbatKKBankTohaigoInfIktAdd extends JBSbatBusinessService {

	/** データベーステーブル名 (ZM_T_DL_FILE_KANRI) */
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI= "ZM_T_DL_FILE_KANRI";
	
	/** データベーステーブル名 (KK_T_SVC_KEI) */
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	
	/** データベーステーブル名 (KK_T_SEIKY_KEI) */
	private static final String D_TBL_NAME_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";
	
	/** データベーステーブル名 (KK_T_KOZA) */
	private static final String D_TBL_NAME_KK_T_KOZA = "KK_T_KOZA";
	
	
	/** データベースSQLアクセス (ZM_T_DL_FILE_KANRI) */
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	/** データベースSQLアクセス (KK_T_SVC_KEI) */
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	
	/** データベースSQLアクセス (KK_T_SEIKY_KEI) */
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;
	
	/** データベースSQLアクセス (KK_T_KOZA) */
	private JBSbatSQLAccess db_KK_T_KOZA = null;
	
	
	/** SQL定義キー(KK_SELECT_345)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_345 = "KK_SELECT_345";
	
	/** SQL定義キー(KK_SELECT_068)*/
	private static final String KK_T_SEIKY_KEI_KK_SELECT_068 = "KK_SELECT_068";
	
	/** SQL定義キー(KK_SELECT_072)*/
	private static final String KK_T_SEIKY_KEI_KK_SELECT_072 = "KK_SELECT_072";
	
	/** SQL定義キー(KK_SELECT_003)*/
	private static final String KK_T_KOZA_KK_SELECT_003 = "KK_SELECT_003";
	
	/** SQL定義キー(KK_INSERT_006)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_006 = "KK_INSERT_006";
	
	
	/** 入力電子ファイル管理番号 */
	private static final String INPUT_EFILE_KANRI_NO = "INPUT_EFILE_KANRI_NO";
	
	/** ディレイド処理依頼番号 */
	private static final String	DLYD_TRN_REQ_NO = "DLYD_TRN_REQ_NO";
	
	
	/** エラーコード (E010) */
	private static final String ERR_CD_E010 = "E010";
	
	/** エラーコード (E020) */
	private static final String ERR_CD_E020 = "E020";
	
	/** エラーコード (E010) */
	private static final String ERR_CD_E030 = "E030";
	
	/** エラーコード (E040) */
	private static final String ERR_CD_E040 = "E040";
	
	/** エラーコード (E050) */
	private static final String ERR_CD_E050 = "E050";
	
	/** エラーコード (E100) */
	private static final String ERR_CD_E100 = "E100";
	
	/** エラーコード (E110) */
	private static final String ERR_CD_E110 = "E110";
	
	/** エラーコード (E120) */
	private static final String ERR_CD_E120 = "E120";
	
	/** エラーコード (E130) */
	private static final String ERR_CD_E130 = "E130";
	
	/** エラーコード (E140) */
	private static final String ERR_CD_E140 = "E140";
	
	/** エラーコード (E150) */
	private static final String ERR_CD_E150 = "E150";
	
	/** エラー内容メッセージ (E010) */
	private static final String ERR_CONTENT_E010 = "入力ファイルのレイアウト、またはファイル形式が不正です。";
	
	/** エラー内容メッセージ (E020) */
	private static final String ERR_CONTENT_E020 = "必須チェックエラー";
	
	/** エラー内容メッセージ (E030) */
	private static final String ERR_CONTENT_E030 = "桁数チェックエラー";
	
	/** エラー内容メッセージ (E040) */
	private static final String ERR_CONTENT_E040 = "形式チェックエラー";
	
	/** エラー内容メッセージ (E050) */
	private static final String ERR_CONTENT_E050 = "入力ファイルの口座情報の変更前後に差がありません。";
	
	/** エラー内容メッセージ (E100) */
	private static final String ERR_CONTENT_E100 = "入力ファイルの請求契約番号に紐付くデータが存在しません。";
	
	/** エラー内容メッセージ (E110) */
	private static final String ERR_CONTENT_E110 = "請求契約テーブルに未来予約のレコードが存在します。";
	
	/** エラー内容メッセージ (E120) */
	private static final String ERR_CONTENT_E120 = "入力ファイルの変更前口座情報と現在適用中の口座情報が一致しません。";
	
	/** エラー内容メッセージ (E130) */
	private static final String ERR_CONTENT_E130 = "現在適用中の口座がNG状態です。";
	
	/** エラー内容メッセージ (E140) */
	private static final String ERR_CONTENT_E140 = "金融機関存在チェックエラー";
	
	/** エラー内容メッセージ (E150) */
	private static final String ERR_CONTENT_E150 = "排他チェックエラー";
	
	/** 支払査定結果コード21 */
	private static final String PAY_SKEKKA_CD_21 = "21";
	
	private static final String[] KKIFM946_ITEMS = {
		JBSBatKKIFM946.SEIKY_KEI_NO,
		JBSBatKKIFM946.BF_BANK_CD,
		JBSBatKKIFM946.BF_SHITEN_CD,
		JBSBatKKIFM946.BF_KOZA_NO,
		JBSBatKKIFM946.BF_YOKIN_SBT_CD,
		JBSBatKKIFM946.BF_KOZA_NAME,
		JBSBatKKIFM946.AF_BANK_CD,
		JBSBatKKIFM946.AF_SHITEN_CD,
		JBSBatKKIFM946.AF_KOZA_NO
		};
	
	/** 統合登録ファイル一覧 */
	int outputCount = 0;
	
	/** KKIFM 947定義からパターン化された出力ファイル */
	private String outFileDir = "";
	
	/** 必要なデータ */
	private static final String REQUIRED = "入力必須項目";
	
	/** 空のデータ */
	private static final String EMPTY = "";
	
	private static final String ATTR_HLF_WDTH_ALPHANUM_1 = "半角英数字1";
	
	private static final String ATTR_FULL_WDTH_KATAKANA = "全角カタカナ";
	
	private static final String KKSV100401CC = "KKSV100401CC";
	
	/** 正常終了戻りコード */
	private static final String RETURN_CD_0000 = "0000";
	
	/* (non-Javadoc)
	 * @see eo.business.common.JBSbatBusinessService#initial(eo.framework.item.JBSbatCommonItem)
	 */
	@Override
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_KEI);
		
		db_KK_T_KOZA = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KOZA);
		
		outFileDir = super.freeItem;
	}
	
	/**<p>
	 * 入力ファイルの各レコードの初期処理と主処理を行います。
	 * </p>
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute() throws Exception {
		
		// (1) 遅延処理要求情報リストを取得する
		ArrayList<HashMap<String, Object>> shoriIraiList = 
			JCCBatCommon.getShoriIraiInfo(commonItem, super.jobid);
		
		// (2) ディレイド処理依頼情報リストが取得できない場合、処理を終了する。
		if(shoriIraiList == null)
			return null;
		
		// (3) 遅延処理要求情報リスト数の処理
		for(HashMap<String, Object> shoriIrai : shoriIraiList) {
			
			// (3-1) エラー回数をカウントする
			int errorCount = 0;
			outputCount = 0;
			
			String outFileName = "KKLST12802_" + JBSbatDateUtil.getSystemDateTime() + ".csv";
			String outFilePath = outFileDir + outFileName;
			JBSbatBusinessFileUtil outFileUtil = JCCBatCommon.createBusinessFileUtil(
					outFilePath, "Shift-JIS", JKKStrConst.LINE_SEPARATOR, "");
			
			try
			{
				String eFileKanriNo = (String) shoriIrai.get(INPUT_EFILE_KANRI_NO);
				
				// (3-2) 電子ファイル管理テーブルファイル取得部品(JCCBatCommon.searchDenshiFile)を使用し、金融機関統廃合情報一括登録ファイル(KKIFM946)を取得する。
				String inFilePath = JCCBatCommon.searchDenshiFile(super.commonItem, eFileKanriNo);
				
				String inDefFileName = JBSbatAplConst.getAplConstValue("IND") + "KKIFM946.def";
				
				JBSbatInputFileUtil inFileUtil = new JBSbatInputFileUtil(inFilePath);
				JBSbatDefFileUtil inFileDef = new JBSbatDefFileUtil(inDefFileName, inFileUtil);
				
				inFileUtil.createReader();
				
				int inFileRecordCnt = 0;
				
				ArrayList<JBSbatServiceInterfaceMap> validRecordMapList = new ArrayList<JBSbatServiceInterfaceMap>();
				
				// (1).初期処理
				// 入力ファイルの先頭レコードより順番にレコード分、フォーマットチェックを行う。
				while (inFileUtil.ready()) {
					String line = inFileUtil.readLine();
					
					inFileRecordCnt++;
					
					JBSbatServiceInterfaceMap inRecordMap = inFileDef.lineToObject(line, inFileUtil, inFileRecordCnt);
					
					if (inRecordMap.isInputErrorFlg()) {
						
						// (a)Execute 「(別紙1) 金融機関連結情報の一括登録結果一覧の作成処理」
						createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E010, ERR_CONTENT_E010);
						
						// (d) エラーメッセージを出力し、処理を終了する。(マイナーアラームを通知する)
						super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1460KW, new String[] {"行数：" + Integer.toString(inFileRecordCnt) });
						
						// (b)エラー件数をカウントアップする。
						errorCount++;
	//					break;
					} else {
						
						validRecordMapList.add(inRecordMap);
					}
				}
				
				if (errorCount == 0) 
				{
					
					// (2) 主処理
					for (JBSbatServiceInterfaceMap inRecordMap : validRecordMapList) {
						
						// (a) 項目チェック（必須・属性・桁数チェック）
						if (hasErrorInItemCheck(inRecordMap, outFileUtil)) {
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						}
						
						// (b) 変更前と変更後のチェック
						if (isIdenticalItems(inRecordMap, outFileUtil)) {
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						}
						
						// (c) 更新サービス契約及び顧客情報の取得・処理
						String sysId = "";
						String serviceContractNo = "";
						
						executeKK_T_SVC_KEI_KK_SELECT_345(inRecordMap.getString(JBSBatKKIFM946.SEIKY_KEI_NO));
						
						JBSbatCommonDBInterface resultDBMap = db_KK_T_SVC_KEI.selectNext();
						
						if (resultDBMap == null) {
							
							// 付録1
							createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E100, ERR_CONTENT_E100);
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						} else {
							
							sysId = resultDBMap.getString(JBSbatKK_T_SVC_KEI.SYSID);
							serviceContractNo = resultDBMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO);
						}
						
						// (d) 構成表契約番号先日付レコード存在チェック
						// String seikyKeiNoResult = "";
						
						executeKK_T_SEIKY_KEI_KK_SELECT_068(inRecordMap.getString(JBSBatKKIFM946.SEIKY_KEI_NO));
						
						resultDBMap = db_KK_T_SEIKY_KEI.selectNext();
						
						if (resultDBMap != null) {
							
							// 付録1
							createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E110, ERR_CONTENT_E110);
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						}
						
						String seikyWayNoKozaResult = "";
						executeKK_T_SEIKY_KEI_KK_SELECT_072(inRecordMap.getString(JBSBatKKIFM946.SEIKY_KEI_NO));
						
						resultDBMap = db_KK_T_SEIKY_KEI.selectNext();
						
						if (resultDBMap == null) {
							
							// 付録1
							createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E100, ERR_CONTENT_E100);
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						} else {
							
							seikyWayNoKozaResult = resultDBMap.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_WAY_NO_KOZA);
						}
						
						// (e)-2.アカウントを検索します。
						String paySkekkaCdResult = searchForAccounts(inRecordMap, seikyWayNoKozaResult, outFileUtil);
						if (JKKCommonUtil.isNull(paySkekkaCdResult)) {
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						}
						
						// (e)-3アカウント・ステータスのチェック
						if (isPaySkekkaCd21(inRecordMap, paySkekkaCdResult, outFileUtil)) {
							
							// エラー件数をカウントアップする。
							errorCount++;
							continue;
						}
						
						// (f) データ登録処理※上記のチェックエラーが発生していない場合のみ実行します。
						HashMap<String, Object> outputMap = getJKKBankTohaigoInfAddCC(inRecordMap, sysId, serviceContractNo, seikyWayNoKozaResult);
						
						String returnCode = outputMap.get(JCCBatchEsbInterface.RETURN_CODE).toString();
						

						HashMap<String, Object> kksv1004Map = (HashMap<String, Object>) outputMap.get(KKSV100401CC);
						
						String errCd = null;
						if( kksv1004Map != null )
						{
							errCd =(String) kksv1004Map.get("err_cd");
						}
						
						if (RETURN_CD_0000.equals(returnCode)) {
							
							if (ERR_CD_E140.equals(errCd)) {
								
								// 付録1
								createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E140, ERR_CONTENT_E140);
								
								// エラー件数をカウントアップする。
								errorCount++;
							} else {
								
								// 付録1
								createCnsldtedRegResList(outFileUtil, inRecordMap, "", "");
							}
						} else {
							
							// 付録1
							createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E150, ERR_CONTENT_E150);
							// エラー件数をカウントアップする。
							errorCount++;
						}
						
					} // (2) 主な処理の終了
				}
				
				// (3-4) ディレイド処理依頼結果更新部品(JCCbatShoriIraiUtil.updateShoriIraiResult)を使用し、ディレイド処理依頼結果コードを更新する。
				updateShoriIraiResult((String) shoriIrai.get(DLYD_TRN_REQ_NO), errorCount);
				
				JCCBatCommon.closeBusinessFileUtil(outFileUtil);
				// (3-5) 「(別記2)電子ファイル管理およびダウンロードファイル管理登録処理」を行う
				eDLFileManRegProcessing(outFilePath, outFileName);
				
				
				commonItem.getConnection().commit();
			} 
			catch (Exception e) {
				// エラーの場合はマイナーエラーとログを出力し、処理を終了する。
				
				commonItem.getConnection().rollback();
				// ディレイド処理依頼のステータスに「処理エラー」で更新
				JCCbatShoriIraiUtil.updateShoriIraiResult(commonItem, (String) shoriIrai.get(DLYD_TRN_REQ_NO), JKKBatConst.RESULT_SYSERR, null);
				commonItem.getConnection().commit();
				
				// 業務エラーログ出力
				e.printStackTrace();
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1270CW	, new String[]{e.toString()});
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB1270CW	, new String[]{"ディレイド処理依頼番号" + (String) shoriIrai.get(DLYD_TRN_REQ_NO)});
				
				JCCBatCommon.closeBusinessFileUtil(outFileUtil);
				// 次のディレイド処理依頼へ
			}


		} // end for loop
		
		return null;
	}
	
	/**<p>
	 * (別記1)金融機関統廃合情報一括登録結果リストの作成処理<b>
	 * 以下の設定値で金融機関統廃合情報一括登録結果リスト(KKIFM947)の作成を行う。
	 * </p>
	 * @param inMap
	 * @param errCd
	 * @param errContent
	 * @throws Exception
	 */
	private void createCnsldtedRegResList(JBSbatBusinessFileUtil outFileUtil, JBSbatServiceInterfaceMap inMap, String errCd, String errContent) throws Exception {
		
		StringBuilder record = new StringBuilder();
		for (String key : KKIFM946_ITEMS) {
			record.append("\"");
			if (!ERR_CD_E010.equals(errCd))
			{
				record.append(inMap.getString(key));
			}
			record.append("\"");
			record.append(JKKStrConst.COMMA);
		}
		record.append("\"");
		record.append(errCd);
		record.append("\"");
		record.append(JKKStrConst.COMMA);
		record.append("\"");
		record.append(errContent);
		record.append("\"");
		
		JCCBatCommon.printBusinessFileUtil(outFileUtil, record.toString());
		
		outputCount++;
		
		super.logPrint.printDebugLog("createCnsldtedRegResList, added: " + inMap.getMap().toString());
	}
	
	/**<p>
	 * (別記2)電子ファイル管理およびダウンロードファイル管理登録処理<br>
	 * 金融機関統廃合情報一括登録結果リスト(KKIFM947)を電子ファイル管理およびダウンロードファイル管理に登録する。
	 * @param filePath
	 * @throws Exception 
	 */
	private void eDLFileManRegProcessing(String filePath, String outFileName) throws Exception {
		final String FILE_CODE = "0000";
		final String PROCESS_CTRL_NO = "000000000253";
		final int ADD_MONTHS = 6;
		
		String onlineOpedate = JPCDateUtil.addMonth(super.opeDate, ADD_MONTHS);
		
		// 電子ファイル管理テーブル登録部品(JCCBatCommon.createDenshiFile) より登録を行う。
		String[] registerResult = JCCBatCommon.createDenshiFile(super.commonItem, FILE_CODE, filePath, onlineOpedate);
		
		String eFileKanriNo = registerResult[0];
		String registerDateYMDhmsS = registerResult[1];
		
		JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();
		
		inMap.setValue(PROCESS_CTRL_NO);
		inMap.setValue(outFileName);
		inMap.setValue(outputCount);
		inMap.setValue(eFileKanriNo);
		inMap.setValue(registerDateYMDhmsS);
		
		super.logPrint.printDebugLog("eDLFileManRegProcessing, inMap: " + inMap.getList().toString());
		
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(inMap, ZM_T_DL_FILE_KANRI_KK_INSERT_006);
		
		File file = new File(filePath);
		if (file.exists()) {
			file.delete();
		}
	}
	
	/**<p>
	 * KK_T_SVC_KEIデータベースでKK_SELECT_345文を実行します。
	 * </p>
	 * @param seikyKeiNo
	 * @throws Exception
	 */
	private void executeKK_T_SVC_KEI_KK_SELECT_345(String seikyKeiNo) throws Exception {
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(seikyKeiNo);
		paramList.setValue(super.opeDate);
		paramList.setValue(super.opeDate);
		
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_345);
	}
	
	/**<p>
	 * KK_T_SEIKY_KEIデータベースでKK_SELECT_068文を実行します。
	 * </p>
	 * @param seikyKeiNo
	 * @throws Exception
	 */
	private void executeKK_T_SEIKY_KEI_KK_SELECT_068(String seikyKeiNo) throws Exception {
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(seikyKeiNo);
		paramList.setValue(super.opeDate);
		
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_KK_SELECT_068);
	}
	
	/**<p>
	 * KK_T_SEIKY_KEIデータベースでKK_SELECT_072文を実行します。
	 * </p>
	 * @param seikyKeiNo
	 * @throws Exception
	 */
	private void executeKK_T_SEIKY_KEI_KK_SELECT_072(String seikyKeiNo) throws Exception {
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(seikyKeiNo);
		paramList.setValue(super.opeDate);
		
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_KK_SELECT_072);
	}
	
	/**<p>
	 * KK_T_KOZAデータベースでKK_SELECT_003文を実行します。
	 * </p>
	 * @param seikyWayNo
	 * @param bfBankCd
	 * @param bfShitenCd
	 * @param bfKozaNo
	 * @param bfKozaName
	 * @throws Exception
	 */
	private void executeKK_T_KOZA_KK_SELECT_003(String seikyWayNo, String bfBankCd, String bfShitenCd, String bfKozaNo, String bfKozaName) throws Exception {
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(seikyWayNo);
		paramList.setValue(bfBankCd);
		paramList.setValue(bfShitenCd);
		paramList.setValue(bfKozaNo);
		paramList.setValue(bfKozaName);
		
		db_KK_T_KOZA.selectBySqlDefine(paramList, KK_T_KOZA_KK_SELECT_003);
	}
	
	/**<p>
	 * (a).項目チェック（必須・属性・桁数チェック）
	 * </p>
	 * @param inRecordMap
	 * @return
	 * @throws Exception
	 */
	private boolean hasErrorInItemCheck(JBSbatServiceInterfaceMap inRecordMap, JBSbatBusinessFileUtil outFileUtil) throws Exception {
		
		// (a)項目チェック(チェックが必要です、属性、桁数)
		String[][] headerRecordsKKIFM946 = {
				{"請求契約番号", 		REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "10", "10", inRecordMap.getString(JBSBatKKIFM946.SEIKY_KEI_NO)}, 
				{"変更前金融機関コード", 	REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "4", "4", inRecordMap.getString(JBSBatKKIFM946.BF_BANK_CD)},
				{"変更前支店コード", 	REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "3", "3", inRecordMap.getString(JBSBatKKIFM946.BF_SHITEN_CD)},
				{"変更前口座番号", 	REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "7", "7", inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NO)},
				{"変更前預金種別", 	REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "1", "1", inRecordMap.getString(JBSBatKKIFM946.BF_YOKIN_SBT_CD)},
				{"変更前口座名", 		REQUIRED, 	ATTR_FULL_WDTH_KATAKANA, "1", "121", inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NAME)},
				{"変更後金融機関コード", 	REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "4", "4", inRecordMap.getString(JBSBatKKIFM946.AF_BANK_CD)},
				{"変更後支店コード", 	REQUIRED, 	ATTR_HLF_WDTH_ALPHANUM_1, "3", "3", inRecordMap.getString(JBSBatKKIFM946.AF_SHITEN_CD)},
				{"変更後口座番号", 	EMPTY, 		ATTR_HLF_WDTH_ALPHANUM_1, "7", "7", inRecordMap.getString(JBSBatKKIFM946.AF_KOZA_NO)}
		};
		
		for (String[] item : headerRecordsKKIFM946) {
			
			//必要なエラーが発生した場合
			final String headerName = item[0];
			final String type = item[1];
			final String data = item[5];
			
			if (REQUIRED.equals(type) && JKKCommonUtil.isNull(data)) {
				
				StringBuilder errContent = new StringBuilder(ERR_CONTENT_E020);
				errContent.append("(");
				errContent.append(headerName);
				errContent.append(")");
				
				//付録1
				createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E020, errContent.toString());
				
				return true;
			}
			
			if (!JKKCommonUtil.isNull(data)) {
				
				//属性エラーの場合
				boolean hasAttrError = false;
				
				final String attribute = item[2];
				
				if (ATTR_HLF_WDTH_ALPHANUM_1.equals(attribute)) {
					
					hasAttrError = !JCCBatCommon.isHannkakuESuuji1(data);
				} else if (ATTR_FULL_WDTH_KATAKANA.equals(attribute)) {
					
					hasAttrError = !JCCBatCommon.isZenkakuKana(data);
				}
				
				if (hasAttrError) {
					
					StringBuilder errContent = new StringBuilder(ERR_CONTENT_E040);
					errContent.append("(");
					errContent.append(headerName);
					errContent.append(")");
					
					//付録1
					createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E040, errContent.toString());
					
					return true;
				}
				
				//数字エラーの場合
				final String minLength = item[3];
				final String maxLength = item[4];
				
				if (!LengthCheck.isLength2Check(data, Integer.parseInt(minLength), Integer.parseInt(maxLength))) {
					
					StringBuilder errContent = new StringBuilder(ERR_CONTENT_E030);
					errContent.append("(");
					errContent.append(headerName);
					errContent.append(")");
					
					//付録1
					createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E030, errContent.toString());
					
					return true;
				}
			}
		}
		
		return false;
	}
	
	/**<p>
	 * (b).変更前後情報チェック<br>
	 * 入力ファイルの金融機関コード、支店コード、口座番号の変更前後の情報を比較する。
	 * </p>
	 * @param inRecordMap
	 * @return
	 * @throws Exception
	 */
	private boolean isIdenticalItems(JBSbatServiceInterfaceMap inRecordMap, JBSbatBusinessFileUtil outFileUtil) throws Exception {
		
		String bfBankCd = inRecordMap.getString(JBSBatKKIFM946.BF_BANK_CD);
		String afBankCd = inRecordMap.getString(JBSBatKKIFM946.AF_BANK_CD);
		
		boolean isSameBankCd = bfBankCd.equals(afBankCd);
		
		String bfShitenCd = inRecordMap.getString(JBSBatKKIFM946.BF_SHITEN_CD);
		String afShitenCd = inRecordMap.getString(JBSBatKKIFM946.AF_SHITEN_CD);
		
		boolean isSameShitenCd = bfShitenCd.equals(afShitenCd);
		
		String bfKozaNo = inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NO);
		String afKozaNo = inRecordMap.getString(JBSBatKKIFM946.AF_KOZA_NO);
		
		boolean isSameKozaNo = true;
		if (!JKKCommonUtil.isNull(afKozaNo)) {
			isSameKozaNo = bfKozaNo.equals(afKozaNo);
		}
		
		if (isSameBankCd && isSameShitenCd && isSameKozaNo) {
			//付録1
			createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E050, ERR_CONTENT_E050);
			
			return true;
		}
		
		return false;
	}
	
	/**<p>
	 * (e)-2.口座の検索を行う。
	 * </p>
	 * @param inRecordMap
	 * @param seikyWayNoKoza
	 * @return
	 * @throws Exception
	 */
	private String searchForAccounts(JBSbatServiceInterfaceMap inRecordMap, String seikyWayNoKoza, JBSbatBusinessFileUtil outFileUtil) throws Exception {
		
		String paySkekkaCdResult = null;
		
		String bfBankCd = inRecordMap.getString(JBSBatKKIFM946.BF_BANK_CD);
		String bfShitenCd = inRecordMap.getString(JBSBatKKIFM946.BF_SHITEN_CD);
		String bfKozaNo = inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NO);
		String bfKozaName = inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NAME);
		
		executeKK_T_KOZA_KK_SELECT_003(seikyWayNoKoza, bfBankCd, bfShitenCd, bfKozaNo, bfKozaName);
		
		JBSbatCommonDBInterface resultDBMap = db_KK_T_KOZA.selectNext();
		if (resultDBMap == null) {
			
			//付録1
			createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E120, ERR_CONTENT_E120);
		} else {
			
			paySkekkaCdResult = resultDBMap.getString(JBSbatKK_T_KOZA.PAY_SKEKKA_CD);
		}
		
		return paySkekkaCdResult;
	}
	
	/**<p>
	 * (e)-3.口座ステータスチェック
	 * </p>
	 * @param inRecordMap
	 * @param paySkekkaCdResult
	 * @return
	 * @throws Exception
	 */
	private boolean isPaySkekkaCd21(JBSbatServiceInterfaceMap inRecordMap, String paySkekkaCdResult, JBSbatBusinessFileUtil outFileUtil) throws Exception {
		
		if (PAY_SKEKKA_CD_21.equals(paySkekkaCdResult)) {
			
			//付録1
			createCnsldtedRegResList(outFileUtil, inRecordMap, ERR_CD_E130, ERR_CONTENT_E130);
			
			return true;
		}
		return false; 
	}
	
	/**<p>
	 * (f).データ登録処理<br>
	 * (f)-1.金融機関統廃合情報登録サービスを呼び出す。
	 * </p>
	 * @param inRecordMap
	 * @param sysId
	 * @param svcKeiNo
	 * @param seikyWayNoKoza
	 * @return
	 * @throws Exception
	 */
	private HashMap<String, Object> getJKKBankTohaigoInfAddCC(JBSbatServiceInterfaceMap inRecordMap, String sysId, String svcKeiNo, String seikyWayNoKoza) throws Exception {
		
		HashMap<String, String> mapJKKBankTohaigoInfAddCC = new HashMap<String, String>();
		
		mapJKKBankTohaigoInfAddCC.put("seiky_kei_no", inRecordMap.getString(JBSBatKKIFM946.SEIKY_KEI_NO));
		mapJKKBankTohaigoInfAddCC.put("bf_bank_cd", inRecordMap.getString(JBSBatKKIFM946.BF_BANK_CD));
		mapJKKBankTohaigoInfAddCC.put("bf_shiten_cd", inRecordMap.getString(JBSBatKKIFM946.BF_SHITEN_CD));
		mapJKKBankTohaigoInfAddCC.put("bf_koza_no", inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NO));
		mapJKKBankTohaigoInfAddCC.put("bf_yokin_sbt_cd", inRecordMap.getString(JBSBatKKIFM946.BF_YOKIN_SBT_CD));
		mapJKKBankTohaigoInfAddCC.put("bf_koza_name", inRecordMap.getString(JBSBatKKIFM946.BF_KOZA_NAME));
		mapJKKBankTohaigoInfAddCC.put("af_bank_cd", inRecordMap.getString(JBSBatKKIFM946.AF_BANK_CD));
		mapJKKBankTohaigoInfAddCC.put("af_shiten_cd", inRecordMap.getString(JBSBatKKIFM946.AF_SHITEN_CD));
		mapJKKBankTohaigoInfAddCC.put("af_koza_no", inRecordMap.getString(JBSBatKKIFM946.AF_KOZA_NO));
		mapJKKBankTohaigoInfAddCC.put("sysid", sysId);
		mapJKKBankTohaigoInfAddCC.put("svc_kei_no", svcKeiNo);
		mapJKKBankTohaigoInfAddCC.put("seiky_way_no_koza", seikyWayNoKoza);
		
		HashMap<String, Object> inputMap = new HashMap<String, Object>();
		inputMap.put(JBSbatKKBankTohaigoInfIktAdd.KKSV100401CC, mapJKKBankTohaigoInfAddCC);
		
		final String KKSV1004 = "KKSV1004";
		final String KKSV1004OP = "KKSV1004OP";
		
		HashMap<Object, Object> paramMap = new HashMap<Object, Object>();
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, KKSV1004);
		paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, KKSV1004OP);		
		
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
		
		return outputMap;
	}
	
	/**<p>
	 * 3-4.ディレイド処理依頼結果更新部品(JCCbatShoriIraiUtil.updateShoriIraiResult)を使用し、ディレイド処理依頼結果コードを更新する。
	 * </p>
	 * @param delayedReqNo
	 * @param errorCount
	 */
	private void updateShoriIraiResult(String delayedReqNo, int errorCount) {
		
		String delayedReqResCd = (errorCount > 0) ? "2" : "1";
		
		super.logPrint.printDebugLog("updateShoriIraiResult, ディレイド処理依頼結果コード: ".concat(delayedReqResCd));
		
		JCCbatShoriIraiUtil.updateShoriIraiResult(super.commonItem, delayedReqNo, delayedReqResCd, null);
	}
	
	/* (non-Javadoc)
	 * @see eo.business.common.JBSbatBusinessService#terminal()
	 */
	@Override
	public void terminal() throws Exception {
		
		if (db_ZM_T_DL_FILE_KANRI != null) {
			
			db_ZM_T_DL_FILE_KANRI.close();
		}
		
		if (db_KK_T_SVC_KEI != null) {
			
			db_KK_T_SVC_KEI.close();
		}
		
		if (db_KK_T_SEIKY_KEI != null) {
			
			db_KK_T_SEIKY_KEI.close();
		}
		
		if (db_KK_T_KOZA != null) {
			
			db_KK_T_KOZA.close();
		}
		
	}

}
