/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKBndWdtOvrSendPstCrd
*	ソースファイル名	：JBSbatKKBndWdtOvrSendPstCrd.java
*	作成者				：富士通　
*	作成日				：2012年07月17日
*＜機能概要＞
*　帯域制御通信量超過通知ハガキ作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/07/17   富士通		新規作成
* 	v12.00.00	2015/02/26   FJ)岡田	【OM-2015-0000129】FTTH通信量超過通知の利用月を前月を取得
* 	v13.00.00	2015/04/22   FJ)藤田	【OM-2015-0000836】月初日は帯域制限を実施しない
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatKKIFM206;
import eo.business.util.table.JBSbatKK_T_FTTH_TSRCK_JSK;
import eo.business.util.table.JBSbatKK_T_OPSVKEI_ISP;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVKEIUW_EOH_NET;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatCheckUtil;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKBndWdtOvrSendPstCrd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約)*/
	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_UCWK = "KK_T_SVC_KEI_UCWK";

	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";

	/** テーブル(ＦＴＴＨ通信量超過実績)*/
	private static final String D_TBL_NAME_KK_T_FTTH_TSRCK_JSK = "KK_T_FTTH_TSRCK_JSK";

	/** SQL定義キー(KK_SELECT_180)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_180 = "KK_SELECT_180";

	/** SQL定義キー(KK_SELECT_069)*/
	private static final String KK_T_SVC_KEI_UCWK_KK_SELECT_069 = "KK_SELECT_069";

	/** SQL定義キー(KK_SELECT_054)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_054 = "KK_SELECT_054";

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_UCWK = null;

	/** テーブルアクセスクラス(オプションサービス契約)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI = null;

	/** テーブルアクセスクラス(ＦＴＴＨ通信量超過実績)*/
	private JBSbatSQLAccess db_KK_T_FTTH_TSRCK_JSK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 送信区分 予告通知 */
	private static final String SEND_KBN_YOKOKU = "1";
	
	/** 送信区分 2ヶ月連続 */
	private static final String SEND_KBN_NONE = "0";
	
	/** 送信区分 実施通知 */
	private static final String SEND_KBN_JISHI = "2";
	
	/** メッセージ文字列 予告 */
	private static final String MSG_STRING_JSHI = "実施";
	
	/** ユースケースID 帯域制限実施 */
	private static final String USECASE_ID_KKSV0571 = "KKSV0571";
	
	/** CCタイトル サービスオーダ発行 */
	private static final String CC_TITLE_JKKHAKKOSODCC = "JKKHakkoSODCC";

	/** 処理区分 帯域制限実施 */
	private static final String SYORI_DIV_011 = "011";
	
	/** サービスIFのリターンコード(正常) */
	private static final String RETURN_CODE_SUCCESS = "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_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
		db_KK_T_OP_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		db_KK_T_FTTH_TSRCK_JSK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_FTTH_TSRCK_JSK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		if (!isSingleCheckKKIFM206_INF1(inMap.getMap(), getItemvalueMap()))
		{
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			return null;
		}
		
		// サービス契約番号
		String svcKeiNo = inMap.getString(JBSbatKKIFM206.SVC_KEI_NO);
		// SYSID
		String sysId = inMap.getString(JBSbatKKIFM206.SYSID);
		// 通知メッセージ
		String msg = inMap.getString(JBSbatKKIFM206.TCHI_MSG);
		
		String sendKbn = null;
		
		// 通知メッセージの文頭から予告通知か実施通知か判断する
		if (null != msg && !"".equals(msg))
		{
			if (msg.substring(4,6).equals(MSG_STRING_JSHI))
			{
				sendKbn = SEND_KBN_JISHI;
			}
			else
			{
				sendKbn = SEND_KBN_YOKOKU;
			}
		}
		else
		{
			sendKbn = SEND_KBN_NONE;
		}
		
		// -------------------------------------------------------
		// 実施通知であれば、オーダ発行を行う
		// -------------------------------------------------------
		// OM-2015-0000836 月初日は帯域制限を実施しない 2015/04/22 藤田 MOD START
//		if (SEND_KBN_JISHI.equals(sendKbn))
		String opeDateDay = super.opeDate.substring(6,8);
		if (SEND_KBN_JISHI.equals(sendKbn) && !"01".equals(opeDateDay))
		// OM-2015-0000836 月初日は帯域制限を実施しない 2015/04/22 藤田 MOD END
		{
			// SODへのパラメータ設定
			HashMap<String, Object> inputMap = new HashMap<String, Object>();
			setSodParam(svcKeiNo, sysId, inputMap);

			// ユースケースIDを格納
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID_KKSV0571);
			
			// サービスの処理結果の格納用MAP
			HashMap<String, Object> outputMap = new HashMap<String, Object>();

			JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
			
			String returnCode = JCCBatchEsbInterface.getReturnCode(outputMap);
			if(!RETURN_CODE_SUCCESS.equals(returnCode))
			{//サービスがエラーを返した場合
				StringBuffer err_msg = new StringBuffer();
				err_msg.append("ステータスコード ：" + returnCode);
				super.logPrint.printBusinessErrorLog("EKKB0010CW", 
						new String[]{ err_msg.toString() });
			}
			
			StringBuilder sb = new StringBuilder();
			sb.append("サービス契約番号:").append(svcKeiNo).append("の帯域制御実施SODを発行しました。");
		}
		
		// -------------------------------------------------------
		// FTTH通信量超過実績を更新する
		// -------------------------------------------------------
		updateFtthTsrckJsk(svcKeiNo, sendKbn);
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_T_SVC_KEI_UCWK.close();
		db_KK_T_OP_SVC_KEI.close();
		db_KK_T_FTTH_TSRCK_JSK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（ハガキ用帯域制限超過通知情報ファイル）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-KKIFM206-INF1.SVC_KEI_NO			ハガキ用帯域制限超過通知情報ファイル.サービス契約番号
	 *			 TXT-KKIFM206-INF1.SYSID			ハガキ用帯域制限超過通知情報ファイル.ＳＹＳＩＤ
	 *			 TXT-KKIFM206-INF1.TCHI_MSG			ハガキ用帯域制限超過通知情報ファイル.通信量上限超過通知メッセージ
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckKKIFM206_INF1(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// サービス契約番号項目チェック
		strValue = (String)rsMap.get("SVC_KEI_NO");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM206-INF1.SVC_KEI_NO")});
			return false;
		}
		
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "10"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM206-INF1.SVC_KEI_NO")});
			return false;
		}

		// ＳＹＳＩＤ項目チェック
		strValue = (String)rsMap.get("SYSID");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM206-INF1.SYSID")});
			return false;
		}
		
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "10"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM206-INF1.SYSID")});
			return false;
		}

		return true;
	}
	
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_FTTH_TSRCK_JSK_PKSELECT_FORUPDATE(JBSbatCommonDBInterface whereParam) throws Exception
	{
		// DBアクセスを実行します
		return db_KK_T_FTTH_TSRCK_JSK.selectByPrimaryKeysForUpdate(whereParam);
	}
	
	/**
	 * SQLKEY(KK_SELECT_180)で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_KK_SELECT_180(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_KK_SELECT_180);
	}

	/**
	 * SQLKEY(KK_SELECT_069)で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_UCWK_KK_SELECT_069(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_UCWK.selectBySqlDefine(paramList, KK_T_SVC_KEI_UCWK_KK_SELECT_069);
	}

	/**
	 * SQLKEY(KK_SELECT_054)で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_OP_SVC_KEI_KK_SELECT_054(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_KK_T_OP_SVC_KEI.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_KK_SELECT_054);
	}

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_FTTH_TSRCK_JSK_PKSELECT(JBSbatCommonDBInterface whereParam) throws Exception
	{
		// DBアクセスを実行します
		return db_KK_T_FTTH_TSRCK_JSK.selectByPrimaryKeys(whereParam);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private int executeKK_T_FTTH_TSRCK_JSK_PKUPDATE(
			JBSbatCommonDBInterface setMap, JBSbatCommonDBInterface whereMap) throws Exception
	{
		// DBアクセスを実行します
		return db_KK_T_FTTH_TSRCK_JSK.updateByPrimaryKeys(whereMap, setMap);
		
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * SOD発行に必要なパラメータを設定します
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @param sysId SYSID
	 */
	private void setSodParam(String svcKeiNo, String sysId, HashMap<String, Object> inputMap)
	{
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		ArrayList<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
		HashMap<String, Object> sodMap = new HashMap<String, Object>();
		HashMap<String, Object> sodKihonInfoMap = new HashMap<String, Object>();
		HashMap<String, Object> svcKeiInfoMap = new HashMap<String, Object>();
		
		// ------------------------------------
		// SOD基本情報を設定する
		// ------------------------------------
		// SYSID
		sodKihonInfoMap.put("sysid", sysId);
		// 処理区分
		sodKihonInfoMap.put("syori_div", SYORI_DIV_011);
		// SOD基本情報をSOD情報に設定する
		sodMap.put("sod_kihon_info", sodKihonInfoMap);
		
		// ------------------------------------
		// サービス契約情報を設定する
		// ------------------------------------
		// サービス契約番号
		svcKeiInfoMap.put("svc_kei_no", svcKeiNo);
		// サービス契約情報をSOD情報に設定する
		sodMap.put("svc_kei_info", svcKeiInfoMap);
		
		// ------------------------------------
		// SOD情報をリストに設定する
		// ------------------------------------
		dataList.add(sodMap);
		
		// ------------------------------------
		// リストをデータマップに設定する
		// ------------------------------------
		dataMap.put("trgt_data_list", dataList);
		// 機能コードを設定
		dataMap.put("func_code", "1");	
		
		// CCのタイトルをキーにデータを格納
		inputMap.put(CC_TITLE_JKKHAKKOSODCC, dataMap);
	}
	
	/**
	 * ＦＴＴＨ通信量超過実績を更新します。
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @param sendKbn 送信区分
	 * @throws Exception
	 */
	private void updateFtthTsrckJsk(
			String svcKeiNo, String sendKbn) throws Exception
	{
		// サービス契約から料金コースコードと料金プランコードを取得する
		Object[] svcKeiParam = {svcKeiNo, super.opeDate};
		executeKK_T_SVC_KEI_KK_SELECT_180(svcKeiParam);
		JBSbatCommonDBInterface resultMap = db_KK_T_SVC_KEI.selectNext();
		String pcrsCd = null;
		String pplanCd = null;
		if (null != resultMap)
		{
			pcrsCd = resultMap.getString(JBSbatKK_T_SVC_KEI.PCRS_CD);
			pplanCd = resultMap.getString(JBSbatKK_T_SVC_KEI.PPLAN_CD);
		}
		
		// FTTH通信利用年月
		String nengetsu = getTargetNengetsu(0);
		
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		// 実施通知の場合
		if (SEND_KBN_JISHI.equals(sendKbn))
		{
			// FTTH通信量初回超過通知年月日
			String ftthFstYmd = getLastMonthFtthFstYmd(svcKeiNo, pcrsCd, pplanCd);
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TSR_FST_CHOK_TCH_YMD, ftthFstYmd);
			// 帯域制御実施済フラグ
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.TIK_CTL_JSSI_ZM_FLG, "1");
			// 帯域制御実施年月日
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.TIK_CTL_JSSI_YMD, super.opeDate);
			// ISP認証ID
			String ninshoId = getNinshoId(svcKeiNo);
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.ISP_NINSHO_ID, ninshoId);
			// マルチセッション用認証ID
			String mltNinshoId = getMltNinshoId(svcKeiNo);
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.MLTISE_NINSHO_ID, mltNinshoId);
			
		}
		// 予告通知の場合
		else if (SEND_KBN_YOKOKU.equals(sendKbn))
		{
			// FTTH通信量初回超過通知年月日
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TSR_FST_CHOK_TCH_YMD, super.opeDate);
		}
		else
		{
			// FTTH通信量初回超過通知年月日
			String ftthFstYmd = getLastMonthFtthFstYmd(svcKeiNo, pcrsCd, pplanCd);
			setMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TSR_FST_CHOK_TCH_YMD, ftthFstYmd);
		}
		
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		// サービス契約番号
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.SVC_KEI_NO, svcKeiNo);
		// 料金コースコード
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.PCRS_CD, pcrsCd);
		// 料金プランコード
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.PPLAN_CD, pplanCd);
		// FTTH通信利用年月
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TUSHIN_USE_YM, nengetsu);
		
		// --------------------------------------------------------------------------------
		// FTTH通信量超過実績スキーマをロックする
		// --------------------------------------------------------------------------------
		lockFtthTsrckJsk(svcKeiNo, pcrsCd, pplanCd);

		// --------------------------------------------------------------------------------
		// 帯域制限対象者スキーマを更新する
		// --------------------------------------------------------------------------------
		int cnt = executeKK_T_FTTH_TSRCK_JSK_PKUPDATE(setMap, whereMap);
		
		if (1 > cnt)
		{
			throw new JBSbatBusinessError();
		}
	}
	
	/**
	 * 運用日より更新対象の年月を取得します
	 * 
	 * @param year 年
	 * @param month 月
	 * @param date 否
	 * @return 年月
	 */
//v12.00.00 2015/02/26 MOD START
//	private String getTargetNengetsu(int minus)
//	{
//		// バッチ運用日から年月日を分割して取得する
//		String opeDateYear = super.opeDate.substring(0,4);
//		String opeDateMonth = super.opeDate.substring(4,6);
//		String opeDateDay = super.opeDate.substring(6,8);
//		
//		int yearInt = Integer.parseInt(opeDateYear);
//		int monthInt = Integer.parseInt(opeDateMonth);
//		int dateInt = Integer.parseInt(opeDateDay);
//		
//		if (0 == dateInt - 1)
//		{
//			monthInt = monthInt - 1;
//		}
//		
//		if (0 == monthInt)
//		{
//			monthInt = 12;
//			yearInt = yearInt - 1;
//		}
//		
//		monthInt = monthInt - minus;
//		
//		StringBuilder nengetsu = new StringBuilder();
//		nengetsu.append(yearInt);
//		if (10 > monthInt)
//		{
//			nengetsu.append("0");
//		}
//		nengetsu.append(monthInt);
//		return nengetsu.toString();
//	}
	private String getTargetNengetsu(int minus) throws Exception
	{
		//運用日−１日に対して引数分引いた年月を取得る
		return JCCBatCommon.addMonth(JCCBatCommon.addDay(super.opeDate, -1),-minus).toString().substring(0,6);
	}
//v12.00.00 2015/02/26 MOD END
	
	/**
	 * 前月の利用年月のFTTH通信量初回超過通知年月日を取得します
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @return FTTH通信量初回超過通知年月日
	 * @throws Exception
	 */
	private String getLastMonthFtthFstYmd(String svcKeiNo, String pcrsCd, String pplanCd) throws Exception
	{
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		String ftthFstYmd = null;
		
		// サービス契約番号
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.SVC_KEI_NO, svcKeiNo);
		// 料金コースコード
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.PCRS_CD, pcrsCd);
		// 料金プランコード
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.PPLAN_CD, pplanCd);
		// FTTH通信利用年月
		String tshinYm = getTargetNengetsu(1);
		whereMap.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TUSHIN_USE_YM, tshinYm);
		
		JBSbatCommonDBInterface ftthInfo = executeKK_T_FTTH_TSRCK_JSK_PKSELECT(whereMap);

		if (null != ftthInfo)
		{
			ftthFstYmd = ftthInfo.getString(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TSR_FST_CHOK_TCH_YMD);
		}
		
		return ftthFstYmd;
	}
	
	/**
	 * 認証IDを取得します
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @return カンマ連結した認証ID
	 * @throws Exception
	 */
	private String getNinshoId(String svcKeiNo) throws Exception
	{
		JBSbatCommonDBInterface param = new JBSbatCommonDBInterface();
		
		// ----------------------------------------------------------
		// サービス契約内訳から認証IDを取得する
		// ----------------------------------------------------------
		// サービス契約番号
		param.setValue(svcKeiNo);
		// 運用日
		param.setValue(super.opeDate);
		param.setValue(super.opeDate);
		// サービス契約番号
		param.setValue(svcKeiNo);
		// 運用日
		param.setValue(super.opeDate);
		param.setValue(super.opeDate);
		
		executeKK_T_SVC_KEI_UCWK_KK_SELECT_069(param.getList().toArray());
		
		JBSbatCommonDBInterface svcKeiUcwkInfo = db_KK_T_SVC_KEI_UCWK.selectNext();
		
		String ninshoId = "";
		if (null != svcKeiUcwkInfo)
		{
			ninshoId = svcKeiUcwkInfo.getString(JBSbatKK_T_SVKEIUW_EOH_NET.ISP_NINSHO_ID);
		}
		
		return ninshoId;
	}
		
	/**
	 * マルチセッション用認証IDを取得します
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @return マルチセッション用認証ID
	 * @throws Exception
	 */
	private String getMltNinshoId(String svcKeiNo) throws Exception
	{
		JBSbatCommonDBInterface param = new JBSbatCommonDBInterface();

		// ----------------------------------------------------------
		// オプションサービス契約からマルチセッション用認証IDを取得する
		// ----------------------------------------------------------
		param = new JBSbatCommonDBInterface();
		
		// サービス契約番号
		param.setValue(svcKeiNo);
		// 運用日
		param.setValue(super.opeDate);
		// オプションサービスコード
		param.setValue("B015");
		// 運用日
		param.setValue(super.opeDate);
		
		executeKK_T_OP_SVC_KEI_KK_SELECT_054(param.getList().toArray());
		
		JBSbatCommonDBInterface opSvcKeiInfo = db_KK_T_OP_SVC_KEI.selectNext();
		
		String mltiNinshoId = "";
		if (null != opSvcKeiInfo)
		{
			mltiNinshoId = opSvcKeiInfo.getString(JBSbatKK_T_OPSVKEI_ISP.MLTISE_NINSHO_ID);
		}
		
		return mltiNinshoId;
	}
	
	/**
	 * FTTH通信量実績をロックします
	 * 
	 * @param svcKeiNo サービス契約番号
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @throws Exception
	 */
	private void lockFtthTsrckJsk(String svcKeiNo, String pcrsCd, String pplanCd) throws Exception
	{
		JBSbatCommonDBInterface lockParam = new JBSbatCommonDBInterface();
		// サービス契約番号
		lockParam.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.SVC_KEI_NO, svcKeiNo);
		// 料金コースコード
		lockParam.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.PCRS_CD, pcrsCd);
		// 料金プランコード
		lockParam.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.PPLAN_CD, pplanCd);
		// FTTH通信利用年月
		String nengetsu = getTargetNengetsu(0);
		lockParam.setValue(JBSbatKK_T_FTTH_TSRCK_JSK.FTTH_TUSHIN_USE_YM, nengetsu);
		
		executeKK_T_FTTH_TSRCK_JSK_PKSELECT_FORUPDATE(lockParam);
	}
	
	/**
	 * エラーメッセージに関する項目値を格納されたHashMap<String, String>を生成します。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.エラーメッセージに関する項目値を格納されたHashMapを生成する。<br>
	 *
	 * 2.エラーメッセージに関する項目値を格納されたHashMapに値を設定する。<br>
	 * </pre>
	 * <p>
	 * @return itemvalueMap エラーメッセージに関する項目値を格納されたHashMap
	 */
	private HashMap<String, String> getItemvalueMap()
	{
		// エラーメッセージに関する項目値が格納されたHashMapを設定
		HashMap<String, String> itemvalueMap = new HashMap<String, String>();
		itemvalueMap.put("TXT-KKIFM206-INF1.SVC_KEI_NO", "ハガキ用帯域制限超過通知情報ファイル.サービス契約番号");
		itemvalueMap.put("TXT-KKIFM206-INF1.SYSID", "メール用帯域制限超過通知情報ファイル.ＳＹＳＩＤ");

		return itemvalueMap;
	}
	
}
