/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACTsryoHoseiInfoChk
*	ソースファイル名	：JBSbatACTsryoHoseiInfoChk.java
*	作成者				：富士通　
*	作成日				：2012年12月06日
*＜機能概要＞
*　通信量補正情報チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/12/06  FJ）垣内	【ANK-0363-00-00】新規作成
*	v4.01.00	2013/02/26  FJ）浜口	【ST2-2013-0001071】入力ファイルのダブルクォートを考慮
*	v4.02.00	2013/03/27  FJ）浜口	【ST2-2013-0001631】補正通信料DOUBLE変換後の値で明細登録する
*	v5.00.00	2013/08/19  FJ）狭間	【OM-2013-0000124】契約スキーマの結合方法見直し
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM159;
import eo.business.util.file.JBSbatACIFM160;
import eo.business.util.file.JBSbatACIFM161;
import eo.business.util.file.JBSbatACIFM162;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVKEIUW_EOH_NET;
import eo.common.constant.JACStrConst;
import eo.common.util.JPCUtilCommon;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACTsryoHoseiInfoChk extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(サービス契約＜ｅｏ光ネット＞)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_EOH_NET = "KK_T_SVC_KEI_EOH_NET";

	/** SQL定義キー(AC_SELECT_013)*/
	private static final String KK_T_SVC_KEI_AC_SELECT_013 = "AC_SELECT_013";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String KK_T_SVC_KEI_EOH_NET_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(AC_SELECT_021)*/
	private static final String KK_T_SVC_KEI_AC_SELECT_021 = "AC_SELECT_021";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(サービス契約＜ｅｏ光ネット＞)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_EOH_NET = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	JACbatSchdlUtil schdlUtil = null;
	
	/** エラーマップ */
	private HashMap<String, String> errMap = null;
	
	/** エラーコード */
	private String tmpErrCd = null;

	/** オンライン請求年月 */
	private String onSeikyYm = null;
	
	/** オンライン年月 */
	private String onlineYm = null;
	
	/** FTTH通信量補正編集情報 */
	private JBSbatCommonDBInterface svcKeiMap = null;
	
	/** 出力請求年月 */
	private String outSeikyYm = null;

	/** 利用年月 */
	private String useYm = null;

	/** 0 */
	private static final String ZERO = "0";
	
	/** 補正通信量(9999999.99) */
	private static final double PLUS_ALL_9 = 99999999.99;
	
	/** 補正通信量(-9999999.99) */
	private static final double MINUS_ALL_9 = -99999999.99;

	/** 通信量補正情報の項目数 */
	private static final String TSRYO_HS_INFO_KMK_CNT = "3";

	/** 変換後通信量補正情報 */
	private double tmpHoseiTsry = 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_SVC_KEI_EOH_NET = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_EOH_NET);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// エラー内容マップ作成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		try
		{
			this.errMap = paramUtil.getGyoumuParameterMap2(JACStrConst.WKPARA_AC_TSR_HOS_MSG, super.onlineOpeDate);
		}
		finally
		{
			paramUtil.close();
		}

		// 請求年月取得
		schdlUtil = new JACbatSchdlUtil(commonItem);
		this.onSeikyYm = schdlUtil.getBillDate(super.onlineOpeDate, JACStrConst.EVENT_CD_PRC_CALC_DAY);
		
		// オンライン運用年月取得
		this.onlineYm = super.onlineOpeDate.substring(0,6);

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;
		
		// トランファイル処理フラグを設定する
		this.setTranProcFlg(true);
		// マスタファイル処理フラグを設定する
		this.setMastProcFlg(true);
		
		// ファイル形式チェック
		// レコード分割
		String[] fileInfo 			= tranMap.getString(JBSbatACIFM162.RECORD).split(JACStrConst.COMMA);
		
		// CSV形式以外の場合エラー（配列に格納した件数≦1件以下の場合）
		if(fileInfo.length <= 1)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][配列に格納した件数≦1件以下の場合]");
			// エラーコード設定
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_H001;
			// エラーファイル作成
			outputInItem.addOutMapList_2(this.makeErrFile(tranMap));
		}
		// カラム数が既定数と異なる場合エラー（配列に格納した件数≠定数．項目数の場合）
		else if(fileInfo.length != Integer.parseInt(TSRYO_HS_INFO_KMK_CNT))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][配列に格納した件数≠初期処理．項目数の場合]");
			// エラーコード設定
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_H001;
			// エラーファイル作成
			outputInItem.addOutMapList_2(this.makeErrFile(tranMap));
		}
		// 上記以外の場合
		else
		{
			// 単項目チェック及び関連チェックで正常の場合
			if(isSingleCheckACIFM159_INF1(mastMap) && isKnrnKmkChk(mastMap) && isGetHenshuInfo(mastMap))
			{
				// FTTH通信量補正出力
				outputInItem.addOutMapList(this.makeTsryoHosei(mastMap));
			}
			// 上記以外の場合
			else
			{
				// エラーファイル作成
				outputInItem.addOutMapList_2(this.makeErrFile(tranMap));
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_T_SVC_KEI_EOH_NET.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		schdlUtil.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(AC_SELECT_013)で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_SVC_KEI_AC_SELECT_013(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_AC_SELECT_013);
	}

	/**
	 * 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 executeKK_T_SVC_KEI_EOH_NET_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI_EOH_NET.selectBySqlDefine(paramList, KK_T_SVC_KEI_EOH_NET_AC_SELECT_002);
	}

	/**
	 * SQLKEY(AC_SELECT_021)で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_SVC_KEI_AC_SELECT_021(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_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_AC_SELECT_021);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 入力データチェック処理
	 * 
	 * @param rsMap
	 * @return
	 * @throws Exception
	 */
	private boolean isSingleCheckACIFM159_INF1(JBSbatServiceInterfaceMap rsMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isSingleCheckACIFM159_INF1]");
	
		// 単項目チェックを行います
		// お客様ＩＤ
		String custId = rsMap.getString(JBSbatACIFM159.CUST_ID);
		// 利用日
		String useYmd = rsMap.getString(JBSbatACIFM159.USE_YMD);
		// 補正通信量
		String hoseiTsryo = rsMap.getString(JBSbatACIFM159.HOSEI_TSRYO);

		// 必須チェック
		// お客さまＩＤ
		if(custId == null || JACStrConst.KARA_MOJI.equals(custId))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E001;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][必須チェックエラー：お客さまID]");
			return false;
		}
		// 利用日
		if(useYmd == null || JACStrConst.KARA_MOJI.equals(useYmd))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E001;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][必須チェックエラー：利用日]");
			return false;
		}
		// 補正通信量
		if(hoseiTsryo == null || JACStrConst.KARA_MOJI.equals(hoseiTsryo))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E001;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][必須チェックエラー：補正通信量]");
			return false;
		}
		
		// 数値チェック
		// 利用日
		if(!JBSbatCheckUtil.invoke(useYmd, new String[]{"hannkakusuuji1"}))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E002;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][数値チェックエラー：利用日]");
			return false;
		}
		// 補正通信量
		if(!JBSbatCheckUtil.invoke(hoseiTsryo, new String[]{"double2"}))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E002;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][数値チェックエラー：補正通信量]");
			return false;
		}
		
		// 補正通信量チェック
		this.tmpHoseiTsry = Double.parseDouble(hoseiTsryo);
		
		// 補正通信量 ＞ 99999999.99　または　補正通信量 ＜ -99999999.99の場合
		if(this.tmpHoseiTsry > PLUS_ALL_9 || this.tmpHoseiTsry < MINUS_ALL_9)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E003;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][補正通信量＞999999999999　または　補正通信量＜-999999999999]");
			return false;
		}
		// 補正通信量 ＝ 0の場合
		if(this.tmpHoseiTsry == 0)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E004;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckACIFM159_INF1][補正通信量＝0]");
			return false;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckACIFM159_INF1]");
		return true;
	}
	
	/**
	 * 入力データの関連チェック処理
	 * 
	 * @param rsMap
	 * @return
	 * @throws Exception
	 */
	private boolean isKnrnKmkChk(JBSbatServiceInterfaceMap rsMap)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isKnrnKmkChk]");

		// 存在チェック
		// サービス契約＜eo光ネット＞検索
		if(!isSvcKeiEohCheck(rsMap.getString(JBSbatACIFM159.CUST_ID)))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E005;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isKnrnKmkChk][存在チェックエラー：サービス契約＜eo光ネット＞]");
			return false;
		}
		
		// 利用日チェック
		if(!isUseYmdCheck(rsMap))
		{
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKnrnKmkChk]");
		return true;
	}
	
	/**
	 * サービス契約＜eo光ネット＞存在チェック
	 * 
	 * @param svcKeiNo
	 * @return
	 * @throws Exception
	 */
	private boolean isSvcKeiEohCheck(String svcKeiNo)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isSvcKeiEohCheck]");
		
		JBSbatCommonDBInterface whereparam = new JBSbatCommonDBInterface();
		
		whereparam.setValue(svcKeiNo);				// サービス契約番号
		
		executeKK_T_SVC_KEI_EOH_NET_AC_SELECT_002(whereparam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_KK_T_SVC_KEI_EOH_NET.selectNext();
		if(dbMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSvcKeiEohCheck]");
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSvcKeiEohCheck]");
		return true;
	}
	
	/**
	 * 利用日チェック
	 * 
	 * @param svcKeiNo
	 * @return
	 * @throws Exception
	 */
	private boolean isUseYmdCheck(JBSbatServiceInterfaceMap rsMap)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isUseYmdCheck]");
		JBSbatCommonDBInterface whereparam = new JBSbatCommonDBInterface();
		
		whereparam.setValue(rsMap.getString(JBSbatACIFM159.CUST_ID));	// サービス契約番号
		whereparam.setValue(super.onlineOpeDate);						// オンライン運用日
		
		executeKK_T_SVC_KEI_AC_SELECT_013(whereparam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_KK_T_SVC_KEI.selectNext();
		if(dbMap == null)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E007;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck]");
			return false;
		}
		
		// 利用日
		String useYmd = rsMap.getString(JBSbatACIFM159.USE_YMD);
		
		// 利用日　＝　年月日1
		if(!JBSbatCheckUtil.invoke(useYmd, new String[]{"year_month_day1"}))
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E006;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck][利用日チェックエラー：実在する日付でない]");
			return false;
		}
		
		// プラン課金開始年月日
		String planChrgStaYmd = dbMap.getString(JBSbatKK_T_SVC_KEI.PLAN_CHRG_STAYMD);

		if(JACStrConst.KARA_MOJI.equals(planChrgStaYmd) || planChrgStaYmd == null)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E007;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck][利用日チェックエラー：利用日＜プラン課金開始年月日]");
			return false;
		}
		// 利用日　＜　プラン課金開始年月日
		if(useYmd.compareTo(planChrgStaYmd) < 0)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E007;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck][利用日チェックエラー：利用日＜プラン課金開始年月日]");
			return false;
		}
		
		// 利用日の年月
		this.useYm = useYmd.substring(0, 6);
		// 利用日の年月　＜　請求年月
		if(useYm.compareTo(this.onSeikyYm) < 0)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E008;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck][利用日チェックエラー：利用日の年月＜請求年月]");
			return false;
		}
		// 利用日の年月　＞　オンライン運用年月
		if(useYm.compareTo(onlineYm) > 0)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E009;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck][利用日チェックエラー：利用日の年月＞オンライン運用年月]");
			return false;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isUseYmdCheck]");
		return true;
	}
	
	/**
	 * FTTH通信量補正編集
	 * 
	 * @param rsMap
	 * @return
	 * @throws Exception
	 */
	private boolean isGetHenshuInfo(JBSbatServiceInterfaceMap rsMap)throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isGetHenshuInfo]");
		
		JBSbatCommonDBInterface whereparam = new JBSbatCommonDBInterface();
		
		whereparam.setValue(rsMap.getString(JBSbatACIFM159.CUST_ID));	// サービス契約番号
		whereparam.setValue(super.onlineOpeDate);						// オンライン運用日
		whereparam.setValue(super.onlineOpeDate);						// オンライン運用日
		whereparam.setValue(super.onlineOpeDate);						// オンライン運用日
		whereparam.setValue(rsMap.getString(JBSbatACIFM159.CUST_ID));	// サービス契約番号
		whereparam.setValue(super.onlineOpeDate);						// オンライン運用日
		
		executeKK_T_SVC_KEI_AC_SELECT_021(whereparam.getList().toArray());
		
		this.svcKeiMap =  db_KK_T_SVC_KEI.selectNext();
		if(svcKeiMap == null)
		{
			this.tmpErrCd = JACStrConst.WKPARA_AC_TSR_HOS_MSG_E005;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isKnrnKmkChk][存在チェックエラー：サービス契約]");
			return false;
		}
		
		// 請求年月取得
		this.outSeikyYm = schdlUtil.getBillDate(rsMap.getString(JBSbatACIFM159.USE_YMD), JACStrConst.EVENT_CD_USE_ENDYMD);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isGetHenshuInfo]");
		return true;
	}
	
	/**
	 * エラーレコードを作成します。
	 * 
	 * @param tranMap 入力Ｔ情報
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeErrFile(JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeErrFile]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeErrFile][tmpErrCd=" + this.tmpErrCd + "]");
		
		JBSbatServiceInterfaceMap errInf = new JBSbatServiceInterfaceMap();
		
		errInf.set(JBSbatACIFM161.TSRYO_HOSEI_REC,		tranMap.getString(JBSbatACIFM162.RECORD));	// エラーコード
		errInf.set(JBSbatACIFM161.ERR_NAIYO,			JACStrConst.DOUBLE_QUOTE + this.errMap.get(this.tmpErrCd) +JACStrConst.DOUBLE_QUOTE);		// エラー内容(「""」で囲む)

		errInf.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeErrFile]");
		return errInf;
	}
	
	/**
	 * FTTH通信量補正を作成します。
	 * 
	 * @param tranMap 入力Ｔ情報
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeTsryoHosei(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeTsryoHosei]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.set(JBSbatACIFM160.SVC_KEI_NO,		mastMap.getString(JBSbatACIFM159.CUST_ID));								// サービス契約番号
		outMap.set(JBSbatACIFM160.PCRS_CD,			this.svcKeiMap.getString(JBSbatKK_T_SVC_KEI.PCRS_CD));					// 料金コースコード
		outMap.set(JBSbatACIFM160.PRC_SVC_CD,		JPCUtilCommon.fillHalfSpace(this.svcKeiMap.getString(JBSbatKK_T_SVC_KEI.PPLAN_CD), JACStrConst.PRC_SVC_CD_LENGTH, true));	// 料金サービスコード
		outMap.set(JBSbatACIFM160.ISP_NINSHO_ID,	this.svcKeiMap.getString(JBSbatKK_T_SVKEIUW_EOH_NET.ISP_NINSHO_ID));	// 認証ＩＤ
		outMap.set(JBSbatACIFM160.SEI_KEI_NO,		this.svcKeiMap.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO));			// 請求契約番号
		outMap.set(JBSbatACIFM160.SEIKY_YM,			this.outSeikyYm);														// 請求年月
		outMap.set(JBSbatACIFM160.USE_YM,			this.useYm);															// 利用年月
		outMap.set(JBSbatACIFM160.DATE_STKU_YMD,	mastMap.getString(JBSbatACIFM159.USE_YMD));								// データ取得年月日
		outMap.set(JBSbatACIFM160.USE_TSRYO,		ZERO);																	// 利用通信量
		outMap.set(JBSbatACIFM160.HOSEI_TSRYO,		this.tmpHoseiTsry);														// 補正通信量
		outMap.set(JBSbatACIFM160.CHRG_KH,			JACStrConst.KAKIN_KA);													// 課金可否

		outMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeTsryoHosei]");
		return outMap;
	}
}
