/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHKhriHukaKanst
*	ソースファイル名	：JBSbatCHKhriHukaKanst.java
*	作成者				：富士通　
*	作成日				：2011年08月12日
*＜機能概要＞
*　口座振替情報付加（間接）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/12   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatCHIFM027;
import eo.business.util.file.JBSbatCHIFM006;
import eo.business.util.table.JBSbatCH_M_KHRI_SHUNOKIKAN;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_SEIKY;
import eo.business.util.table.JBSbatKK_M_BANK;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCConvertString;
import eo.common.util.JPCEditString;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;

/**
* 口座振替情報付加（間接） <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHKhriHukaKanst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";

	/** テーブル(請求)*/
	private static final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";

	/** テーブル(口座振替収納機関)*/
	private static final String D_TBL_NAME_CH_M_KHRI_SHUNOKIKAN = "CH_M_KHRI_SHUNOKIKAN";

	/** テーブル(金融機関)*/
	private static final String D_TBL_NAME_KK_M_BANK = "KK_M_BANK";

	/** SQL定義キー(CH_SELECT_002)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_CH_SELECT_002 = "CH_SELECT_002";

	/** SQL定義キー(CH_SELECT_001)*/
	private static final String CH_M_KHRI_SHUNOKIKAN_CH_SELECT_001 = "CH_SELECT_001";

	/** SQL定義キー(CH_SELECT_001)*/
	private static final String KK_M_BANK_CH_SELECT_001 = "CH_SELECT_001";

	/** SQL定義キー(CH_SELECT_004)*/
	private static final String CH_T_SEIKY_CH_SELECT_004 = "CH_SELECT_004";

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;

	/** テーブルアクセスクラス(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;

	/** テーブルアクセスクラス(口座振替収納機関)*/
	private JBSbatSQLAccess db_CH_M_KHRI_SHUNOKIKAN = null;

	/** テーブルアクセスクラス(金融機関)*/
	private JBSbatSQLAccess db_KK_M_BANK = null;
	
	/** 請求業務共通クラス */
	private JCHbatSeikyKaknoBusinessUtil chUtil = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/


	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	 /** 合計件数 */
	private int gkCnt = 0;
	
	/** 合計金額 */
	private BigDecimal gkAmnt = BigDecimal.ZERO;
	
	/** 口座振替日 */
	private String khuriDay = null;
	
	/** 委託者コード */
	private String itkShaCd = SPACE;
	
	/** スペース */
	private static final String SPACE = " ";
	
	/** ヘッダ・種別コードの桁数 */
	private static final int HDER_SBT_CD_DIG = 2;
	
	/** ヘッダ・委託者コードの桁数 */
	private static final int HDER_ITKSHA_CD_DIG = 10;
	
	/** ヘッダ・委託者名の桁数 */
	private static final int HDER_ITKSHA_NM_DIG = 40;
	
	/** ヘッダ・取引銀行番号の桁数 */
	private static final int HDER_TRHK_BANK_NO_DIG = 4;
	
	/** ヘッダ・取引銀行名の桁数 */
	private static final int HDER_TRHK_BANK_NM_DIG = 15;
	
	/** ヘッダ・取引支店番号の桁数 */
	private static final int HDER_TRHK_SITEN_NO_DIG = 3;
	
	/** ヘッダ・取引支店名の桁数 */
	private static final int HDER_TRHK_SITEN_NM_DIG = 15;
	
	/** ヘッダ・口座番号（委託者）の桁数 */
	private static final int HDER_KOZA_NO_DIG = 7;
	
	/** データ・引落銀行番号の桁数 */
	private static final int DT_HKOTSI_BANK_NO_DIG = 4;
	
	/** データ・引落銀行名の桁数 */
	private static final int DT_HKOTSI_BANK_NM_DIG = 15;
	
	/** データ・引落支店番号の桁数 */
	private static final int DT_HKOTSI_SHITEN_NO_DIG = 3;
	
	/** データ・引落支店名の桁数 */
	private static final int DT_HKOTSI_SHITEN_NM_DIG = 15;
	
	/** データ・口座番号の桁数 */
	private static final int DT_KOZA_NO_DIG = 7;
	
	/** データ・預金者名の桁数 */
	private static final int DT_NM_DIG = 30;

	
	/** 件数の桁数 */
	private static final int CNT_DIG = 6;
	
	/** 金額の桁数 */
	private static final int AMNT_DIG = 12;

	
	/** ヘッダ・コード区分 */
	private static final String HDER_CD_DIV = "1";
	
	/** ヘッダ・予備１ */
	private static final String HDER_YOBI_1 = JPCEditString.fillHalfSpace(" ", 17, true);
	
	/** データ・予備１ */
	private static final String DT_YOBI_1 = JPCEditString.fillHalfSpace(" ", 4, true);
	
	/** データ・予備２ */
	private static final String DT_YOBI_2 = JPCEditString.fillHalfSpace(" ", 8, true);;

	
	/** データ・群番号 */
	private static final String DT_GUN_NO = "6";
	
	/** データ・振替結果コード */
	private static final String DT_HRI_RSLT_CD = "0";
	
	/** トレーラ・予備１ */
	private static final String TRLER_YOBI_1 = JPCEditString.fillHalfSpace(" ", 65, true);
	
	/** エンド・予備１ */
	private static final String END_YOBI_1 = JPCEditString.fillHalfSpace(" ", 119, true);
	
	/** 件数（６桁０パディング） */
	private static final String CNT_ZERO = JPCEditString.fillZero("0", 6, true);
	
	/** 金額（１２桁０パディング） */
	private static final String AMNT_ZERO = JPCEditString.fillZero("0", 12, true);
	
	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		db_CH_M_KHRI_SHUNOKIKAN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_KHRI_SHUNOKIKAN);
		db_KK_M_BANK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_BANK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");
		
		// 口座振替日取得
		setKhriDay();
		
		chUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + inMap.getMap().toString() + "]") : true;
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// ■最終レコード後はここで終了
		if(inMap == null)
		{
			// トレーラレコード作成
			outputItem.addOutMapList(makeTrailerRec());
			
			// エンドレコード作成
			outputItem.addOutMapList(makeEndRec());
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][合計件数=" + gkCnt + "]") : true;
			assert gkAmnt != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][合計金額=" + gkAmnt.toString() + "]") : true;
			assert outputItem != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][OutputItem="
					+ outputItem.getOutMapList().toString() + "]") : true;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			
			return outputItem;
		}
		
		// ダミーレコード作成
		outputItem.addOutMapList(new JBSbatServiceInterfaceMap());
		
		// 一件目のレコードの場合
		if(gkCnt == 0)	
		{
			// ヘッダレコード作成
			outputItem.addOutMapList(makeHeaderRec(inMap));
		}
		
		// データレコード作成
		outputItem.addOutMapList(makeDateRec(inMap));
		
		// 合計件数カウントアップ
		gkCnt++;
		// 合計金額合算
		gkAmnt =  gkAmnt.add(inMap.getBigDecimal(JBSbatCHIFM006.AMNT));
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][合計件数=" + gkCnt + "]") : true;
		assert gkAmnt != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][合計金額="
											+ gkAmnt.toString() + "]") : true;
		assert outputItem != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][=outputItem"
											+ outputItem.getOutMapList().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_SCHDL_TEIGI.close();
		db_CH_T_SEIKY.close();
		db_CH_M_KHRI_SHUNOKIKAN.close();
		db_KK_M_BANK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		chUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * 口座振替日を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void setKhriDay() throws Exception
	{

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setKhriDay]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setKhriDay][口座振替日=" + khuriDay + "]");
		
		// バッチ運用日の前月を算出
		String bfOpedate = JBSbatInterface.adjustMonth(super.opeDate, -1);
		
		// 口座振替日の取得
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// バッチ運用日の前月の年月
		whereParam.setValue(bfOpedate.substring(0, 6));
		
		// イベントコード（口座振替日）
		whereParam.setValue(JACStrConst.EVENT_CD_KOUZA_HURIKAE_YMD);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setKhriDay][whereParam=]" + whereParam.getList().toString());
		
		// SQL実行
		executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_002(whereParam.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface selectMap = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		
		if(selectMap == null)
		{
			// ログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0270CH,
					new String[] {JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME, whereParam.toString()});
			// 口座振替日（空白）
			khuriDay = JPCEditString.fillHalfSpace(" ", 8, true);
		}
		else
		{
			// 口座振替日
			khuriDay = selectMap.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.EVENT_YMD);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setKhriDay][口座振替日=" + khuriDay + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setKhriDay]");
		
		return;
	}
	
	/**
	 * ヘッダレコードを設定します。
	 * 
	 * @param inMap 入力情報
	 * @return JBSbatServiceInterfaceMap ヘッダレコード
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeHeaderRec(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeHeaderRec]");
		
		JBSbatCommonDBInterface khrimap = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface bankMap = new JBSbatCommonDBInterface();
		
		// その他情報の初期値設定
		// 種別コード
		String sbtCd = SPACE;
		// 委託者名
		String itkshaNm = SPACE;
		// 取引銀行番号
		String trhkBankNo = SPACE;
		// 取引支店番号
		String trhkShitenNo = SPACE;
		// 預金種目（委託者）
		String yokinShumokuCd = SPACE;
		// 口座番号（委託者）
		String kozaNo = SPACE;
		// 取引銀行名
		String trhkBankNm = SPACE;
		// 取引支店名
		String trhkShitenNm = SPACE;
		
		// 請求検索（金融機関レコード取得）
		String bankCd = getBankRec(inMap);
		
		// 金融機関コードの取得結果判定
		if(bankCd != null)
		{
			// 口座振替収納機関検索
			khrimap = getkhriMap(bankCd);
			
			// 口座振替収納機関情報の取得結果判定
			if(khrimap != null)
			{
				// 金融機関情報検索
				bankMap = getBankMap(khrimap);
				// 種別コード
				sbtCd = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.KHRI_SBT_CD));
				// 委託者コード
				itkShaCd = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_CD));
				// 委託者名
				itkshaNm = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_NM));
				// 取引銀行番号
				trhkBankNo = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_BANK_CD));
				// 取引支店番号
				trhkShitenNo = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_BANK_SHITEN_CD));
				// 預金種目（委託者）
				yokinShumokuCd = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_YOKIN_SHUMOKU_CD));
				// 口座番号（委託者）
				kozaNo = setNullChgSpeace(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_KOZA_NO));
				
				// 金融機関情報の取得結果判定
				if(bankMap != null)
				{
					// 取引銀行名
					trhkBankNm = setNullChgSpeace(chUtil.chgZenHanMoji(JPCConvertString.convFullToHalfByKata(bankMap.getString(JBSbatKK_M_BANK.BANK_KANA))));
					// 取引支店名
					trhkShitenNm = setNullChgSpeace(chUtil.chgZenHanMoji(JPCConvertString.convFullToHalfByKata(bankMap.getString(JBSbatKK_M_BANK.BANK_SHITEN_KANA))));
				}
			}
		}
		
		// 委託者コードの桁数を１０桁に合わせる
		itkShaCd = JPCEditString.fillHalfSpace(itkShaCd, HDER_ITKSHA_CD_DIG, true);

		StringBuffer outRecBuf = new StringBuffer();
		// 口振種別コード
		outRecBuf.append(JPCEditString.fillHalfSpace(sbtCd, HDER_SBT_CD_DIG, true));
		// コード区分
		outRecBuf.append(HDER_CD_DIV);
		// 委託者コード
		outRecBuf.append(itkShaCd);
		// 委託者名
		outRecBuf.append(JPCEditString.fillHalfSpace(itkshaNm, HDER_ITKSHA_NM_DIG, true));
		// 引落日
		outRecBuf.append(khuriDay.substring(4, 8));
		// 取引銀行番号
		outRecBuf.append(JPCEditString.fillHalfSpace(trhkBankNo, HDER_TRHK_BANK_NO_DIG, true));
		// 取引銀行名（上15桁）
		outRecBuf.append(JPCEditString.fillHalfSpace(trhkBankNm, HDER_TRHK_BANK_NM_DIG, true).substring(0, HDER_TRHK_BANK_NM_DIG));
		// 取引支店番号
		outRecBuf.append(JPCEditString.fillHalfSpace(trhkShitenNo, HDER_TRHK_SITEN_NO_DIG, true));
		// 取引支店名（上15桁）
		outRecBuf.append(JPCEditString.fillHalfSpace(trhkShitenNm, HDER_TRHK_SITEN_NM_DIG, true).substring(0, HDER_TRHK_SITEN_NM_DIG));
		// 預金種目（委託者）
		outRecBuf.append(yokinShumokuCd);
		// 口座番号（委託者）
		outRecBuf.append(JPCEditString.fillHalfSpace(kozaNo, HDER_KOZA_NO_DIG, true));
		// 予備１
		outRecBuf.append(HDER_YOBI_1);
		
		
		JBSbatServiceInterfaceMap outRecMap = new JBSbatServiceInterfaceMap();
		// 口座種別WORK（間接）
		outRecMap.setString(JBSbatCHIFM027.KHRI_SBT_WK, JACStrConst.KOZA_SBT_WORK_KAN);
		// データ区分（"1"ヘッダレコード）
		outRecMap.setString(JBSbatCHIFM027.ID, JACStrConst.DATA_KUBUN_HEADER);
		// その他
		outRecMap.setString(JBSbatCHIFM027.OTHER, outRecBuf.toString());
		
		outRecMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeHeaderRec]");
		
		return outRecMap;
	}
	

	/**
	 * 請求検索（金融機関コード取得）を行います。
	 * 
	 * @param inMap 入力情報
	 * @return String 金融機関コード
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String getBankRec(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getBankRec]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		String bankCd = null;
		
		// 請求番号
		whereParam.setValue(inMap.getString(JBSbatCHIFM006.SEIKY_NO));
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getBankRec][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		// 結果を取得
		JBSbatCommonDBInterface selectMap = executeCH_T_SEIKY_PKSELECT(whereParam.getList().toArray());
		
		if(selectMap == null)
		{
			// ログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0270CH,
					new String[] {JBSbatCH_T_SEIKY.TABLE_NAME, whereParam.toString()});
		}
		else
		{
			bankCd = selectMap.getString(JBSbatCH_T_SEIKY.BANK_CD);
		}
		assert selectMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSokhoTuchiYmd][selectMap="
									+ selectMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getBankRec]");
		return bankCd;
	}
	
	/**
	 * 口座振替収納機関検索を行います。
	 * 
	 * @param bankCd 金融機関コード
	 * @return JBSbatCommonDBInterface 口座振替収納機関検索結果情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface getkhriMap(String bankCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getkhriMap]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getkhriMap][bankCd=" + bankCd + "]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 収納機関コード
		whereParam.setValue(bankCd);
		// 適用開始年月日
		whereParam.setValue(super.opeDate);	
		// 適用終了年月日
		whereParam.setValue(super.opeDate);	
		// 予約適用年月日
		whereParam.setValue(super.opeDate);	
		// 無効フラグ
		whereParam.setValue(JACStrConst.MK_FLG_YK);	
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getkhriMap][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_KHRI_SHUNOKIKAN_CH_SELECT_001(whereParam.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface selectMap = db_CH_M_KHRI_SHUNOKIKAN.selectNext();
		if(selectMap == null)
		{
			// ログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0270CH,
					new String[] {JBSbatCH_M_KHRI_SHUNOKIKAN.TABLE_NAME, whereParam.toString()});
		}
		assert selectMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getkhriMap][selectMap="
										+ selectMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getkhriMap]");
		
		return selectMap;
	}
	
	/**
	 * 金融機関検索を行います。
	 * 
	 * @param khrimap 口座振替収納機関検索結果情報
	 * @return JBSbatCommonDBInterface 金融機関検索結果
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface getBankMap(JBSbatCommonDBInterface khrimap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getBankMap]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getBankMap][selectMap=" + khrimap.getMap().toString() + "]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 金融機関コード
		whereParam.setValue(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_BANK_CD));
		// 金融機関支店コード
		whereParam.setValue(khrimap.getString(JBSbatCH_M_KHRI_SHUNOKIKAN.ITKSHA_BANK_SHITEN_CD));
		// 適用開始年月日
		whereParam.setValue(super.opeDate);
		// 適用終了年月日
		whereParam.setValue(super.opeDate);
		// 予約適用年月日
		whereParam.setValue(super.opeDate);
		// 無効フラグ
		whereParam.setValue(JACStrConst.MK_FLG_YK);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getBankMap][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		executeKK_M_BANK_CH_SELECT_001(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface selectMap = new JBSbatCommonDBInterface();
		
		//結果を取得
		selectMap = db_KK_M_BANK.selectNext();
		
		if(selectMap == null)
		{
			// ログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0270CH,
					new String[] {JBSbatKK_M_BANK.TABLE_NAME, whereParam.toString()});
		}
		
		assert selectMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getBankMap][selectMap="
							+ selectMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getBankMap]");
		
		return selectMap;
	}
	
	/**
	 * データレコードを作成します。
	 * 
	 * @param inMap 入力情報
	 * @return JBSbatServiceInterfaceMap データレコード情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeDateRec(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeDateRec]");
		
		
		// その他情報の初期値設定
		// 引落銀行番号
		String hkotsiBankNo = SPACE;
		// 引落銀行名
		String hkotsiBankNm = SPACE;
		// 引落支店番号
		String hkotosiShitenNo = SPACE;
		// 引落支店名
		String hkotosiShitenNm = SPACE;
		// 預金科目
		String yokinKamk = SPACE;
		// 口座番号
		String kozaNo = SPACE;
		// 預金者名
		String name = SPACE;
		// 新規コード
		String newCd = SPACE;
		
		// 口座振替付加情報取得
		JBSbatCommonDBInterface khriHkMap = getKhuriHkMap(inMap);

		
		// 口座振替付加情報　≠　nullの場合
		if(khriHkMap != null)
		{
			// 引落銀行番号
			hkotsiBankNo = setNullChgSpeace(khriHkMap.getString(JBSbatCH_T_SEIKY.BANK_CD));
			// 引落銀行名
			hkotsiBankNm = setNullChgSpeace(chUtil.chgZenHanMoji(JPCConvertString.convFullToHalfByKata(khriHkMap.getString(JBSbatKK_M_BANK.BANK_KANA))));
			// 引落支店番号
			hkotosiShitenNo = setNullChgSpeace(khriHkMap.getString(JBSbatCH_T_SEIKY.BANK_SHITEN_CD));
			// 引落支店名
			hkotosiShitenNm = setNullChgSpeace(chUtil.chgZenHanMoji(JPCConvertString.convFullToHalfByKata(khriHkMap.getString(JBSbatKK_M_BANK.BANK_SHITEN_KANA))));
			// 預金科目
			yokinKamk = setNullChgSpeace(khriHkMap.getString(JBSbatCH_T_SEIKY.YOKIN_SHUMOKU_CD));
			// 口座番号
			kozaNo = setNullChgSpeace(khriHkMap.getString(JBSbatCH_T_SEIKY.KOZA_NO));
			// 新規コード
			newCd = setNullChgSpeace(khriHkMap.getString(JBSbatCH_T_SEIKY.NEW_CD));
			
			// 口座振替依頼の受け入れ可能文字への変換
			// 氏名
			name = JCHbatSeikyKaknoBusinessUtil.formatKhriUkeirePsb(setNullChgSpeace(khriHkMap.getString(JBSbatCH_T_SEIKY.KOZA_MEIGIN_KANA)));
		}

		StringBuffer outRecBuf = new StringBuffer();
		
		// 引落銀行番号
		outRecBuf.append(JPCEditString.fillHalfSpace(hkotsiBankNo, DT_HKOTSI_BANK_NO_DIG, true));
		// 引落銀行名
		outRecBuf.append(JPCEditString.fillHalfSpace(hkotsiBankNm, DT_HKOTSI_BANK_NM_DIG, true).substring(0, DT_HKOTSI_BANK_NM_DIG));
		// 引落支店番号
		outRecBuf.append(JPCEditString.fillHalfSpace(hkotosiShitenNo, DT_HKOTSI_SHITEN_NO_DIG, true));
		// 引落支店名
		outRecBuf.append(JPCEditString.fillHalfSpace(hkotosiShitenNm, DT_HKOTSI_SHITEN_NM_DIG, true).substring(0, DT_HKOTSI_SHITEN_NM_DIG));
		// 予備１
		outRecBuf.append(DT_YOBI_1);
		// 預金科目
		outRecBuf.append(yokinKamk);
		// 口座番号
		outRecBuf.append(JPCEditString.fillHalfSpace(kozaNo, DT_KOZA_NO_DIG, true));
		// 預金者名
		outRecBuf.append(JPCEditString.fillHalfSpace(name, DT_NM_DIG, true).substring(0, DT_NM_DIG));
		// 請求金額
		outRecBuf.append(JPCEditString.fillZero(inMap.getBigDecimal(JBSbatCHIFM006.AMNT).toString(), AMNT_DIG, false).substring(2, AMNT_DIG));
		// 新規コード
		outRecBuf.append(newCd);
		// 委託者コード
		outRecBuf.append(itkShaCd.substring(5, 10));
		// 請求年月
		outRecBuf.append(inMap.getString(JBSbatCHIFM006.SEIKY_YM).substring(2, 6));
		// 請求者番号
		outRecBuf.append(inMap.getString(JBSbatCHIFM006.SEIKY_KEI_NO));
		// 群番号
		outRecBuf.append(DT_GUN_NO);
		// 振替結果コード
		outRecBuf.append(DT_HRI_RSLT_CD);
		// 予備３
		outRecBuf.append(DT_YOBI_2);
		
		JBSbatServiceInterfaceMap outRecMap = new JBSbatServiceInterfaceMap();
		
		// 口座種別WORK（間接）
		outRecMap.setString(JBSbatCHIFM027.KHRI_SBT_WK, JACStrConst.KOZA_SBT_WORK_KAN);
		
		// データ区分（"2"データレコード）
		outRecMap.set(JBSbatCHIFM027.ID, JACStrConst.DATA_KUBUN_DATA);
		
		
		// 上記項目を設定
		// その他
		outRecMap.set(JBSbatCHIFM027.OTHER, outRecBuf.toString());
		
		outRecMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeDateRec]");
		
		return outRecMap;
	}
	
	/**
	 * 口座振替付加情報を取得します。
	 * 
	 * @param inMap 入力情報
	 * @return JBSbatCommonDBInterface 口座振替付加情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface getKhuriHkMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKhuriHkMap]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 請求番号
		whereParam.setValue(inMap.getString(JBSbatCHIFM006.SEIKY_NO));
		// 適用開始年月日
		whereParam.setValue(super.opeDate);
		// 適用終了年月日
		whereParam.setValue(super.opeDate);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKhuriHkMap][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		executeCH_T_SEIKY_CH_SELECT_004(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface selectMap = new JBSbatCommonDBInterface();
		
		selectMap = db_CH_T_SEIKY.selectNext();
		
		if(selectMap == null)
		{
			// ログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0270CH,
					new String[] {JBSbatCH_T_SEIKY.TABLE_NAME, whereParam.toString()});
		}
		
		assert selectMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKhuriHkMap][selectMap="
				+ selectMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKhuriHkMap]");
		
		return selectMap;
	}
	
	/**
	 * トレーラレコードを設定します。
	 * 
	 * @return JBSbatServiceInterfaceMap トレーラレコード情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeTrailerRec() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeTrailerRec]");
		
		// 合計件数（左詰め０パディング）
		String outGkCnt = JPCEditString.fillZero(String.valueOf(gkCnt), CNT_DIG, false);
		// 合計金額（左詰め０パディング）
		String outGkAmnt = JPCEditString.fillZero(String.valueOf(gkAmnt), AMNT_DIG, false);
		
		StringBuffer outRecBuf = new StringBuffer();
		
		// 合計件数
		outRecBuf.append(outGkCnt.substring(outGkCnt.length() - CNT_DIG, outGkCnt.length()));
		// 合計金額
		outRecBuf.append(outGkAmnt.substring(outGkAmnt.length() - AMNT_DIG, outGkAmnt.length()));
		// 振替済件数
		outRecBuf.append(CNT_ZERO);
		// 振替済金額
		outRecBuf.append(AMNT_ZERO);
		// 振替不能件数
		outRecBuf.append(CNT_ZERO);
		// 振替不能金額
		outRecBuf.append(AMNT_ZERO);
		// 予備１
		outRecBuf.append(TRLER_YOBI_1);
		
		JBSbatServiceInterfaceMap outRecMap = new JBSbatServiceInterfaceMap();
		
		// 口座種別WORK（間接）
		outRecMap.setString(JBSbatCHIFM027.KHRI_SBT_WK, JACStrConst.KOZA_SBT_WORK_KAN);
		
		// データ区分（"8"トレーラ）
		outRecMap.set(JBSbatCHIFM027.ID, JACStrConst.DATA_KUBUN_TRAILER);
		
		// その他
		outRecMap.set(JBSbatCHIFM027.OTHER, outRecBuf.toString());
		
		outRecMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeTrailerRec]");
		
		return outRecMap;
	}
	
	/**
	 * エンドレコードを設定します。
	 * 
	 * @return JBSbatServiceInterfaceMap エンドレコード情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeEndRec() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeEndRec]");
		
		JBSbatServiceInterfaceMap outRecMap = new JBSbatServiceInterfaceMap();
		
		// 口座種別WORK（間接）
		outRecMap.setString(JBSbatCHIFM027.KHRI_SBT_WK, JACStrConst.KOZA_SBT_WORK_KAN);
		
		// データ区分（"9"エンドレコード）
		outRecMap.set(JBSbatCHIFM027.ID, JACStrConst.DATA_KUBUN_END);
		// その他
		outRecMap.set(JBSbatCHIFM027.OTHER, END_YOBI_1);
		
		outRecMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeEndRec]");
		
		return outRecMap;
	}
	
	/**
	 * 対象文字列がnullかどうかを判定し、nullの場合はスペース、
	 * null以外の場合は入力された値を返します。
	 * 
	 * @param trg 対象文字列
	 * @return String スペースまたは入力された値
	 */
	private String setNullChgSpeace(Object trg)
	{
		String rtn = (String)trg;
		if(trg == null)
		{
			rtn = SPACE;
		}
		return rtn;
	}
	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CH_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	料金スケジュール定義．スケジュール年月
	 *		 	料金スケジュール定義．イベントコード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_CH_SELECT_002);
	}

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SEIKY_NO
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeCH_T_SEIKY_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SEIKY_NO", whereParam[0]);

		// DBアクセスを実行します
		return db_CH_T_SEIKY.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(CH_SELECT_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 executeCH_M_KHRI_SHUNOKIKAN_CH_SELECT_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_CH_M_KHRI_SHUNOKIKAN.selectBySqlDefine(paramList, CH_M_KHRI_SHUNOKIKAN_CH_SELECT_001);
	}

	/**
	 * SQLKEY(CH_SELECT_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 executeKK_M_BANK_CH_SELECT_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());
		paramList.setValue(param[5].toString());

		// DBアクセスを実行します
		db_KK_M_BANK.selectBySqlDefine(paramList, KK_M_BANK_CH_SELECT_001);
	}

	/**
	 * SQLKEY(CH_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	請求．請求番号
	 *		 	金融機関．金融機関適用開始年月日
	 *		 	金融機関．金融機関適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SEIKY_CH_SELECT_004(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_CH_T_SEIKY.selectBySqlDefine(paramList, CH_T_SEIKY_CH_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
