/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACMdgcSksHakCommiAdd
*	ソースファイル名	：JBSbatACMdgcSksHakCommiAdd.java
*	作成者				：富士通　
*	作成日				：2012年12月12日
*＜機能概要＞
*　窓口請求書発行手数料作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/25   富士通		新規作成
*	v3.00		2012/05/01   FJ)永田	【ANK-0024-04-00】	出力項目追加
*	v3.01		2012/10/08   FJ)岡田	【ST3-2012-0000331】整理番号NULL対応
*	v3.02		2012/11/15   FJ)今井	【TG1-2012-0000278】強制窓口発行手数料対象が抽出されない対応
*	v4.00		2012/12/12   FJ)今井	【TG1-2012-0000295】請求書発行手数料が計算されない対応
*	v4.01		2013/02/22   FJ)浜口	【ST2-2013-0001025】初回請求無料期間の判定処理を追加
*	v4.02		2013/03/26   FJ)小柴	【内部管理番号-0000613】ファイル出力オブジェクト生成時のエンコード設定ずれ防止対応
*	v4.03		2013/04/05   FJ)小柴	【IKK-2013-0000783】文字化け対策のため、エンコード形式の変更
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.table.JBSbatAC_M_TEGAK_PRC;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_SEIKY;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACMdgcSksHakCommiAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(定額料金)*/
	private static final String D_TBL_NAME_AC_M_TEGAK_PRC = "AC_M_TEGAK_PRC";

	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** テーブル(請求)*/
	private static final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";
	
	/** テーブル(請求契約)*/
	private static final String D_TBL_NAME_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";

	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";
	
	/** SQL定義キー(AC_SELECT_002)*/
	private static final String AC_M_TEGAK_PRC_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_007)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_007 = "AC_SELECT_007";

	/** SQL定義キー(AC_SELECT_004)*/
	private static final String CH_T_SEIKY_AC_SELECT_004 = "AC_SELECT_004";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String KK_T_SEIKY_KEI_AC_SELECT_003 = "AC_SELECT_003";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_002 = "AC_SELECT_002";
	
	/** テーブルアクセスクラス(定額料金)*/
	private JBSbatSQLAccess db_AC_M_TEGAK_PRC = null;

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/** テーブルアクセスクラス(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;
	
	/** テーブルアクセスクラス(請求契約)*/
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 請求年月 （利用開始日／利用終了日基準）*/
	private String seikyYm = null;
	
	/** 翌請求年月 */
	private String wkNextSeikyYm 			= null;
	
	/** 料金項目抽出変換 */
	JBSbatCommonDBInterface csChgeMap 	= null;
	
	/** 定額料金取得結果 */
	JBSbatCommonDBInterface tegakuMap = null;
	
	/** ファイル出力件数 */
	private int outPutCnt = 0;

	/** ファイル出力部品 */
	JBSbatOutputFileUtil fileUtil = null;
	
	/** 出力定義ファイルオブジェクト */
	JBSbatDefFileUtil outFileDef = null;

	/** 請求書発行手数料課金サービス */
	String[] wkParaSvc = null;

	/** 請求書発行手数料非課金料金グループ */
	String[] wkParaPrgp = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_TEGAK_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_TEGAK_PRC);
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_KEI);
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 業務パラメータ情報を取得する
		String wKinoSkbt = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_SEIKY_HAK_CMS);							// 請求書発行手数料登録
		this.wkParaSvc = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_KK_SKSHAK_CHRG_SVC).split(JACStrConst.COMMA);		// 請求書発行手数料課金サービス
		this.wkParaPrgp = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_KK_SKSHAK_HCHRG_PRGP).split(JACStrConst.COMMA);	// 請求書発行手数料非課金料金グループ
		// パラメータ取得クラスクローズ
		paramUtil.close();
		
		// スケジュール定義アクセスクラス生成
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		
		// 利用開始日と利用終了に対応する請求年月を取得する
		seikyYm = getSeikyYm(super.opeDate);
		
		// 料金スケジュール定義．請求年月
		String wSeikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
		wkNextSeikyYm = JPCUtilCommon.addMonth(wSeikyYm.concat(JACStrConst.STR_OF_MONTH), 1).substring(0, 6);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "翌請求年月：" + wkNextSeikyYm);

		// スケジュール定義アクセスクラスクローズ
		schdlUtil.close();
		
		// 料金情報取得
		this.getPrcInfo(wKinoSkbt);
		
		// 定額料金取得
		this.getTegakuPrc();
		
		// ファイル出力部品を取得
		this.fileUtil = super.commonItem.getOutPutFile();
		// 設定されているエンコード形式を退避
		String enc = fileUtil.getEncode();
		// encodeの形式がSHIFT-JISの場合、MS932に変換
		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(enc.toUpperCase()))
		{
			enc = JACStrConst.ENCODE_MS932;
		}
		
		// 出力定義ファイル名を取得する。
		String outFileDefName = JBSbatAplConst.getAplConstValue("OTD") + super.freeItem;
		
		// 出力定義ファイルオブジェクトを生成する
		this.outFileDef = new JBSbatDefFileUtil(outFileDefName, fileUtil);
		// 退避したエンコード形式を戻す（出力定義ファイルオブジェクト生成時に上書きが発生しているため）
		fileUtil.setEncode(enc);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");

		// 請求スキーマより請求先番号抽出
		this.getSeiky();
		
		// 請求先番号取得結果
		JBSbatCommonDBInterface seikyRec = db_CH_T_SEIKY.selectNext();
		
		while(seikyRec != null)
		{
			
			// 発行手数料無料期間判定処理
			// 無料期間判定要素（請求契約.初回請求年月、サービス契約.サービス課金開始年月日）を取得する
			this.getSeikyKei(seikyRec);
			
			// 取得結果
			JBSbatCommonDBInterface jdgRec = db_KK_T_SEIKY_KEI.selectNext();
			
			// 無料期間かどうかの判定を行う(true:発行手数料無料期間)
			if(this.isHakCmTrgtJdg(jdgRec))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][発行手数料徴収対象外]");

				// 強制窓口請求書発行手数料情報を出力せずし次のレコードを読み込む
				seikyRec = db_CH_T_SEIKY.selectNext();

				continue;
			}

			// 出力項目設定
			JBSbatServiceInterfaceMap outList = setOutList(seikyRec);
			
			// ファイル出力
			finalOut(outList);
			
			seikyRec = db_CH_T_SEIKY.selectNext();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_TEGAK_PRC.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		db_CH_T_SEIKY.close();
		db_KK_T_SEIKY_KEI.close();
		db_CH_M_PRC_SCHDL_TEIGI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		String[] outCntMsg = {"主処理", String.valueOf(outPutCnt)};
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0560AI, outCntMsg);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_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 executeAC_M_TEGAK_PRC_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_AC_M_TEGAK_PRC.selectBySqlDefine(paramList, AC_M_TEGAK_PRC_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_007)で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_KMK_CS_CHGE_AC_SELECT_007(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());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_007);
	}
	
	/**
	 * SQLKEY(AC_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_AC_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		for (int i = 0; i < param.length; i++ )
		{
			paramList.setValue(param[i].toString());
		}

		// DBアクセスを実行します
		db_CH_T_SEIKY.selectBySqlDefine(paramList, CH_T_SEIKY_AC_SELECT_004);
	}
	
	/**
	 * SQLKEY(AC_SELECT_003)で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_T_SEIKY_KEI_AC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		for (int i = 0; i < param.length; i++ )
		{
			paramList.setValue(param[i].toString());
		}

		// DBアクセスを実行します
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_AC_SELECT_003);
	}
	/**
	 * SQLKEY(AC_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_AC_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_AC_SELECT_002);
	}

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 請求年月を取得する
	 * 
	 * @param ymd 年月日
	 * @return 請求年月
	 * @throws Exception
	 */
	private String getSeikyYm(String ymd) throws Exception
	{
		executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_002(new String[] {ymd, ymd});
		JBSbatCommonDBInterface record = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		if (record != null)
		{
			// レコードが存在する場合
			return record.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM);
		}
		else
		{
			// レコードが存在しない場合

			// 業務例外
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0440CE, new String[] {JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME});
		}
	}
	

	/**
	 * 料金情報取得を取得します。
	 * @param wKinoSkbt 業務機能識別コード
	 * @throws Exception
	 */
	private void getPrcInfo(String wKinoSkbt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcInfo]");

		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();

		// 対象キーの設定
		dbList.setValue(super.systemCode); 					// システムコード
		dbList.setValue(wKinoSkbt); 						// 業務機能識別コード
		dbList.setValue(JACStrConst.CHSHT_CHG_CD_CST); 		// 抽出変換コード（抽出のみ） 
		dbList.setValue(super.opeDate); 					// バッチ運用日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcInfo]dbList：" + dbList.getList().toString());

		// 料金情報取得
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_007(dbList.getList().toArray());

		// 料金情報取得結果
		csChgeMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		if(csChgeMap == null)
		{
			String[] msgParam = new String[]{JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME, wKinoSkbt};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, msgParam);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcInfo]");
	}
	
	/**
	 * 定額料金データを取得します。
	 * @throws Exception
	 */
	private void getTegakuPrc() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTegakuPrc]");

		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 対象キーの設定
		dbList.setValue(super.systemCode); 												// システムコード
		dbList.setValue(csChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD));		// 料金コースコード
		dbList.setValue(csChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD));	// 料金サービスコード
		dbList.setValue(csChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));	// 料金項目コード
		dbList.setValue(super.opeDate); 												// バッチ運用日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTegakuPrc]dbList：" + dbList.getList().toString());

		// 定額料金データ取得
		executeAC_M_TEGAK_PRC_AC_SELECT_002(dbList.getList().toArray());

		// 定額料金取得結果
		this.tegakuMap = db_AC_M_TEGAK_PRC.selectNext();

		if(this.tegakuMap == null)
		{
			String[] msgParam = new String[]{JBSbatAC_M_TEGAK_PRC.TABLE_NAME, JPCUtilCommon.convMapToString(csChgeMap.getMap())};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, msgParam);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTegakuPrc]");
	}

	/**
	 * 出力対象の請求先番号を取得します。
	 * @throws Exception
	 */
	private void getSeiky() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSeiky]");

		// SQL定義キーを指定してSQL文を取得
		String sqlBf = db_CH_T_SEIKY.getSql(CH_T_SEIKY_AC_SELECT_004);

		// 加工対象の文字列
		String ckn1Bf = "KK0081.SVC_CD          IN(?)";
		String ckn2Bf = "KK0081.PRC_GRP_CD      NOT IN(?)";

		String para = "?";

		// IN句の対象数を変更（SVC_CD）
		StringBuffer paraAf = new StringBuffer();
		for(int i = 0; this.wkParaSvc.length > i; i++)
		{
			if(i > 0)
			{
				paraAf.append(JACStrConst.COMMA);
			}

			paraAf.append(para);
		}
		String ckn1Af = ckn1Bf.replace(para, paraAf.toString());
		
		// IN句の対象数を変更（PRC_GRP_CD）
		paraAf = new StringBuffer();
		for(int i = 0; wkParaPrgp.length > i; i++)
		{
			if(i > 0)
			{
				paraAf.append(JACStrConst.COMMA);
			}

			paraAf.append(para);
		}
		String ckn2Af = ckn2Bf.replace(para, paraAf.toString());

		// SQLを置き換える
		HashMap<String, String> tgt = new HashMap<String, String>();
		tgt.put(ckn1Bf, ckn1Af);
		tgt.put(ckn2Bf, ckn2Af);
		
		String sqlAf = JACbatRknBusinessUtil.ckanUmeMojiHanyo(sqlBf, tgt);
		
		//SQL定義キーを指定し、加工したSQLをセット
		db_CH_T_SEIKY.setSqlMap(CH_T_SEIKY_AC_SELECT_004, sqlAf);

		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 対象キーの設定
		dbList.setValue(JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);	// イベントコード
		dbList.setValue(super.opeDate);							// イベント年月日
		dbList.setValue(super.opeDate);							// 請求契約．予約適用年月日
		dbList.setValue(super.opeDate);							// サービス契約．予約適用年月日
		for(int i = 0; this.wkParaSvc.length > i; i++)
		{
			dbList.setValue(this.wkParaSvc[i]);					// サービス契約．サービスコード
		}
		for(int i = 0; wkParaPrgp.length > i; i++)
		{
			dbList.setValue(this.wkParaPrgp[i]);				// サービス契約．料金グループコード
		}
		dbList.setValue(super.opeDate);							// 課金先．課金先適用開始年月日
		dbList.setValue(super.opeDate);							// 課金先．課金先適用終了年月日
		dbList.setValue(JACStrConst.SEIKY_MADOGUCHI);			// 請求方法コード（窓口）
		dbList.setValue(JACStrConst.SKS_HAK_YH_H);				// 請求書発行要否(否)
		dbList.setValue(JACStrConst.SIKYSHBTS_TEIGK_SEIKY);		// 請求種別コード（定例請求）
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSeiky]sqlBf：" + sqlBf);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSeiky]sqlAf：" + sqlAf);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSeiky]dbList：" + dbList.getList().toString());
		
		// 請求データ取得
		executeCH_T_SEIKY_AC_SELECT_004(dbList.getList().toArray());

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSeiky]");
	}
	/**
	 * 請求契約.初回請求年月、サービス契約.サービス課金開始年月日）を取得します。
	 * @throws Exception
	 */
	private void getSeikyKei(JBSbatCommonDBInterface seikyRec) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSeikyKei]");

		// SQL定義キーを指定してSQL文を取得
		String sqlBf = db_KK_T_SEIKY_KEI.getSql(KK_T_SEIKY_KEI_AC_SELECT_003);

		// 加工対象の文字列
		String ckn1Bf = "KK0081.SVC_CD          IN(?)";
		String ckn2Bf = "KK0081.PRC_GRP_CD      NOT IN(?)";

		String para = "?";

		// IN句の対象数を変更（SVC_CD）
		StringBuffer paraAf = new StringBuffer();
		for(int i = 0; this.wkParaSvc.length > i; i++)
		{
			if(i > 0)
			{
				paraAf.append(JACStrConst.COMMA);
			}

			paraAf.append(para);
		}
		String ckn1Af = ckn1Bf.replace(para, paraAf.toString());
		
		// IN句の対象数を変更（PRC_GRP_CD）
		paraAf = new StringBuffer();
		for(int i = 0; wkParaPrgp.length > i; i++)
		{
			if(i > 0)
			{
				paraAf.append(JACStrConst.COMMA);
			}

			paraAf.append(para);
		}
		String ckn2Af = ckn2Bf.replace(para, paraAf.toString());

		// SQLを置き換える
		HashMap<String, String> tgt = new HashMap<String, String>();
		tgt.put(ckn1Bf, ckn1Af);
		tgt.put(ckn2Bf, ckn2Af);
		
		String sqlAf = JACbatRknBusinessUtil.ckanUmeMojiHanyo(sqlBf, tgt);
		
		//SQL定義キーを指定し、加工したSQLをセット
		db_KK_T_SEIKY_KEI.setSqlMap(KK_T_SEIKY_KEI_AC_SELECT_003, sqlAf);

		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 対象キーの設定
		dbList.setValue(seikyRec.getString(JBSbatCH_T_SEIKY.SEIKY_KEI_NO));	// 請求契約番号
		dbList.setValue(super.opeDate);										// 予約適用年月日
		dbList.setValue(seikyRec.getString(JBSbatCH_T_SEIKY.SEIKY_KEI_NO));	// 請求契約番号
		dbList.setValue(super.opeDate);										// 予約適用年月日
		for(int i = 0; this.wkParaSvc.length > i; i++)
		{
			dbList.setValue(this.wkParaSvc[i]);					// サービス契約．サービスコード
		}
		for(int i = 0; wkParaPrgp.length > i; i++)
		{
			dbList.setValue(this.wkParaPrgp[i]);				// サービス契約．料金グループコード
		}
		dbList.setValue(super.opeDate);										// 課金先．課金先適用開始年月日
		dbList.setValue(super.opeDate);										// 課金先．課金先適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSeikyKei]sqlBf：" + sqlBf);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSeikyKei]sqlAf：" + sqlAf);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSeikyKei]dbList：" + dbList.getList().toString());
		
		// 請求データ取得
		executeKK_T_SEIKY_KEI_AC_SELECT_003(dbList.getList().toArray());

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSeikyKei]");
	}

	/**
	 * 出力情報を設定します。
	 * @param seikyRec 請求先番号取得結果
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap setOutList(JBSbatCommonDBInterface seikyRec) throws Exception
	{
		// 出力情報を設定する
		JBSbatServiceInterfaceMap outList = new JBSbatServiceInterfaceMap();
		
		outList.setString(JBSbatACIFI016.SEIKY_KEI_NO, 			seikyRec.getString(JBSbatCH_T_SEIKY.SEIKY_KEI_NO)); 					// 請求先番号
		outList.setString(JBSbatACIFI016.SEIKY_YM, 				wkNextSeikyYm); 														// 請求年月
		outList.setString(JBSbatACIFI016.SEIRI_NO, 				JACStrConst.SEIRI_NO_SP); 												// 整理番号
		outList.setString(JBSbatACIFI016.WRIB_SVC_KEI_NO, 		JACStrConst.KARA_MOJI); 												// 割引サービス契約番号
		outList.setString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO,	JACStrConst.KARA_MOJI);													// 割引サービス対象契約番号
		outList.setString(JBSbatACIFI016.SVC_NO, 	 			JACStrConst.KARA_MOJI); 												// サービス番号
		outList.setString(JBSbatACIFI016.OP_SVKEI_NO, 	 		JACStrConst.KARA_MOJI); 												// オプションサービス契約番号
		outList.setString(JBSbatACIFI016.SVC_SKBT_CD, 			JACStrConst.KARA_MOJI);		 											// 料金サービス識別コード
		outList.setString(JBSbatACIFI016.PRC_GRP_CD, 			csChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD)); 			// 料金グループコード
		outList.setString(JBSbatACIFI016.PCRS_CD, 				csChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)); 				// 料金コースコード
		outList.setString(JBSbatACIFI016.PRC_SVC_CD, 	 		csChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD)); 			// 料金サービスコード
		outList.setString(JBSbatACIFI016.PRC_KMK_CD, 			this.tegakuMap.getString(JBSbatAC_M_TEGAK_PRC.PRC_KMK_CD)); 			// 料金項目コード
		outList.setString(JBSbatACIFI016.COLLECT_PATTERN_CD, 	this.tegakuMap.getString(JBSbatAC_M_TEGAK_PRC.COLLECT_PATTERN_CD));		// 徴収パターンコード
		outList.setBigDecimal(JBSbatACIFI016.PRC, 				this.tegakuMap.getBigDecimal(JBSbatAC_M_TEGAK_PRC.PRC));				// 料金
		outList.setString(JBSbatACIFI016.USE_STAYMD,			JACStrConst.KARA_MOJI);													// 利用開始日
		outList.setString(JBSbatACIFI016.USE_ENDYMD, 			JACStrConst.KARA_MOJI);													// 利用終了日
		outList.setString(JBSbatACIFI016.SVC_STAYMD, 			JACStrConst.KARA_MOJI);													// サービス開始日
		outList.setString(JBSbatACIFI016.FIRST_CHRG_STAYMD, 	JACStrConst.KARA_MOJI);	 												// 初回課金開始日
		outList.setString(JBSbatACIFI016.SVC_DSL_YMD, 			JACStrConst.KARA_MOJI);	 												// サービス解約日
		outList.setString(JBSbatACIFI016.SVC_DLRE, 				JACStrConst.KARA_MOJI);	 												// サービス解約理由
		outList.setString(JBSbatACIFI016.SVC_KAIHK_DAY, 		JACStrConst.KARA_MOJI);		 											// サービス回復日
		outList.setString(JBSbatACIFI016.USE_DAY_CNT, 			JACStrConst.KARA_MOJI);	 												// 利用日数
		outList.setString(JBSbatACIFI016.USE_FAIL_DAY_CNT, 		JACStrConst.KARA_MOJI);	 												// 利用不可日数
		outList.setString(JBSbatACIFI016.AIT_DIV, 				JACStrConst.KARA_MOJI);													// 相対区分
		outList.setString(JBSbatACIFI016.SIME_DAY, 				JACStrConst.KARA_MOJI);													// 締め日
		outList.setString(JBSbatACIFI016.USE_APLY_KH_CD, 		this.tegakuMap.getString(JBSbatAC_M_TEGAK_PRC.USE_FAIL_APLY_WAY_CD));	// 利用不可適用可否
		outList.setString(JBSbatACIFI016.MAE_YUSEN_JUN, 		JACStrConst.MAE_YUSEN_JUN_0);											// 前受相殺優先順位
		outList.setString(JBSbatACIFI016.WRIB_YUSEN_JUN, 		JACStrConst.WRIB_YUSEN_JUN_0);											// 割引優先順位
		outList.setString(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN, 	JACStrConst.KARA_MOJI);													// 上限判定優先順位
		outList.setString(JBSbatACIFI016.WRIB_KKSHI_KH, 		JACStrConst.WRIB_TKY_H);												// 割引繰越可否
		
		return outList;
	}
	
	/**
	 * 退避しているレコードを出力します。
	 * 
	 * @param outUsePrcMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void finalOut(JBSbatServiceInterfaceMap outUsePrcMap) throws Exception
	{
		fileUtil.print(outUsePrcMap, outFileDef);
		
		outPutCnt += 1;
	}

	/**
	 * 発行手数料無料期間かどうかの判定を行い、booleanを返却します。
	 * @param inMap　入力電文
	 * @return boolean　true：発行手数料無料期間 false：発行手数料無料期間外
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isHakCmTrgtJdg(JBSbatCommonDBInterface inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isHakCmTrgtJdg]");
		
		if(inMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][サービス契約スキーマ取得なし]");
			return true;
		}
		// 初回請求年月を取得
		String fstSeikyYM = inMap.getString(JBSbatKK_T_SEIKY_KEI.FIRST_SEIKY_YM);
		
		// 初回請求年月 = null の場合
		if (fstSeikyYM == null) 
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][初回請求年月 = null]");
			// 発行手数料無料期間
			return true;
		}
		// サービス課金開始年月日 = null の場合
		if (inMap.getString(JBSbatKK_T_SVC_KEI.SVC_CHRG_STAYMD) == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][サービス課金開始年月日 = null]");
			return true;
		}
		
		// サービス課金開始年月日の年月を取得
		String svcChrgStYM	= inMap.getString(JBSbatKK_T_SVC_KEI.SVC_CHRG_STAYMD).substring(0, 6);

		// サービス課金開始年月日の年月　≦　初回請求年月 の場合
		if (svcChrgStYM.compareTo(fstSeikyYM) <= 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isHakCmTrgtJdg][サービス課金開始年月日の年月　≦　初回請求年月]");

			// 初回請求年月 + 3ヵ月(月数加減算部品を使用し取得する) < 初期処理で取得した当月請求年月の場合
			if (JPCUtilCommon.addMonth(fstSeikyYM.concat(JACStrConst.STR_OF_MONTH), 3).substring(0, 6).compareTo(this.seikyYm) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][初回請求年月 + 3ヵ月 < 当月請求年月]");
				// 発行手数料無料期間外
				return false;
			}
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][!初回請求年月 + 3ヵ月 < 当月請求年月]");
				// 発行手数料無料期間
				return true;
			}
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isHakCmTrgtJdg][サービス課金開始年月日の年月　≦　初回請求年月]");

			// サービス課金開始年月日の年月 + 3ヵ月(月数加減算部品を使用し取得する) < 初期処理で取得した当月請求年月の場合
			if (JPCUtilCommon.addMonth(svcChrgStYM.concat(JACStrConst.STR_OF_MONTH), 3).substring(0, 6).compareTo(this.seikyYm) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][サービス課金開始年月日の年月 + 3ヵ月 < 当月請求年月]");
				// 発行手数料無料期間外
				return false;
			}
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isHakCmTrgtJdg][!サービス課金開始年月日の年月 + 3ヵ月 < 当月請求年月]");
				// 発行手数料無料期間
				return true;
			}
			
		}
	}
	

}
