/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACEmHokinKeiChge
*	ソースファイル名	：JBSbatACEmHokinKeiChge.java
*	作成者				：富士通　
*	作成日				：2012年08月29日
*＜機能概要＞
*　EM法人契約変換部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/09/02   富士通		新規作成
*	v4.00.00	2012/11/28   FJ)早崎	【ANK-0141-00-00】対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM169;
import eo.business.util.file.JBSbatACIFM027;
import eo.business.util.table.JBSbatCH_M_EM_HJIN_SVC_CHG;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_EM_HOJIN_KEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACEmHokinKeiChge extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ＥＭ法人契約)*/
	private static final String D_TBL_NAME_CH_T_EM_HOJIN_KEI = "CH_T_EM_HOJIN_KEI";

	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";

	/** SQL定義キー(AC_SELECT_007)*/
	private static final String CH_T_EM_HOJIN_KEI_AC_SELECT_007 = "AC_SELECT_007";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_002 = "AC_SELECT_002";

	/** テーブルアクセスクラス(ＥＭ法人契約)*/
	private JBSbatSQLAccess db_CH_T_EM_HOJIN_KEI = null;

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_EM_HOJIN_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_EM_HOJIN_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]");
		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]");
		// 出力電文
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// ＥＭ法人契約、ＥＭ法人サービス変換情報取得
		JBSbatCommonDBInterface dbHojinMap = selectHojin(inMap);
		// 料金スケジュール定義マスタ取得（請求年月）
		JBSbatCommonDBInterface dbPrcSchdlMap = selectPrcSchdl(inMap);
		
		// 出力電文を生成する
		JBSbatServiceInterfaceMap editOutMap = editEmHojinPrcInfo(inMap, dbHojinMap, dbPrcSchdlMap);
		outputItem.addOutMapList(editOutMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		// 出力電文を返却
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_EM_HOJIN_KEI.close();
		db_CH_M_PRC_SCHDL_TEIGI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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_T_EM_HOJIN_KEI_AC_SELECT_007(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_T_EM_HOJIN_KEI.selectBySqlDefine(paramList, CH_T_EM_HOJIN_KEI_AC_SELECT_007);
	}

	/**
	 * 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 inMap 入力電文
	 * @return ＥＭ法人契約スキーマ検索結果
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface selectHojin(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selectHojin]");
		// パラメータの生成を行う
		Object[] param = new Object[2];
		param[0] = super.opeDate;									// バッチ運用日
		param[1] = inMap.getString(JBSbatACIFM027.EM_KEISHA_CD);	// EM法人契約者コード
		
		// ＥＭ法人契約より生成
		executeCH_T_EM_HOJIN_KEI_AC_SELECT_007(param);
		// ＥＭ法人契約スキーマアクセス
		JBSbatCommonDBInterface dbMap = db_CH_T_EM_HOJIN_KEI.selectNext();
		
		if (dbMap == null)
		{
			// レコード未存在
			String[] msgParam = new String[]{JBSbatCH_T_EM_HOJIN_KEI.TABLE_NAME, arrayToString(param)};
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][ＥＭ法人契約のＤＢ未存在エラー]");
			// ログ出力（【最重要】ＤＢ未存在エラー）強制的に処理を終了する
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, msgParam);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectHojin]");
		// 取得情報を返却する
		return dbMap;
	}
	
	/**
	 * 料金スケジュール定義マスタを参照し、請求年月を取得します。
	 * 
	 * @param inMap 入力電文
	 * @return 料金スケジュール定義マスタ取得データ
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface selectPrcSchdl(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selectPrcSchdl]");
		// パラメータの生成を行う
		Object[] param = new Object[2];
		param[0] = inMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY);	// 通信利用日
		param[1] = inMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY);	// 通信利用日
		
		// 料金スケジュール定義マスタよりレコードを取得
		executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_002(param);
		// 金スケジュール定義マスタアクセス
		JBSbatCommonDBInterface dbMap =  db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		if (dbMap == null)
		{
			// レコード未存在
			String[] msgParam = new String[]{JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME, arrayToString(param)};
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][料金スケジュール定義マスタのＤＢ未存在エラー]");
			// ログ出力（【最重要】ＤＢ未存在エラー）強制的に処理を終了する
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, msgParam);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectPrcSchdl]");
		// 取得情報を返却する
		return dbMap;
	}

	/**
	 * EM法人利用料金情報作成
	 * 
	 * @param inMap 入力電文
	 * @param dbHojinMap ＥＭ法人契約取得データ
	 * @param dbScdlMap 料金スケジュール定義取得データ
	 * @return EM法人利用料金情報作成
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap editEmHojinPrcInfo(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbHojinMap, JBSbatCommonDBInterface dbScdlMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][editEmHojinPrcInfo]");
		
		// EM法人利用料金情報マップ
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		//  1.請求先番号
		outMap.set(JBSbatACIFM169.SEIKY_KEI_NO, 		inMap.getString(JBSbatACIFM027.EM_KEISHA_CD));
		//  2.請求年月
		outMap.set(JBSbatACIFM169.SEIKY_YM, 			dbScdlMap.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM));
		//  6.サービス番号
		outMap.set(JBSbatACIFM169.SVC_NO, 				dbHojinMap.getString(JBSbatCH_T_EM_HOJIN_KEI.HJIN_EO_YKAE_SVKEI_NO));
		// 10.料金コースコード
		outMap.set(JBSbatACIFM169.PCRS_CD, 				dbHojinMap.getString(JBSbatCH_M_EM_HJIN_SVC_CHG.PCRS_CD));
		// 11.料金サービスコード
		outMap.set(JBSbatACIFM169.PRC_SVC_CD, 			dbHojinMap.getString(JBSbatCH_M_EM_HJIN_SVC_CHG.PRC_SVC_CD));
		// 14.宅内機器型式コード
		outMap.set(JBSbatACIFM169.TAKNKIKI_MODEL_CD, 	dbHojinMap.getString(JBSbatCH_T_EM_HOJIN_KEI.TAKNKIKI_MODEL_CD));
		// 15.料金
		outMap.set(JBSbatACIFM169.PRC, 					inMap.getString(JBSbatACIFM027.USE_BYTE_CNT));
		// 18.サービス開始日
		outMap.set(JBSbatACIFM169.SVC_STAYMD, 			dbHojinMap.getString(JBSbatCH_T_EM_HOJIN_KEI.SVC_STAYMD));
		// 19.初回課金開始日
		outMap.set(JBSbatACIFM169.FIRST_CHRG_STAYMD, 	dbHojinMap.getString(JBSbatCH_T_EM_HOJIN_KEI.EM_CHRG_STAYMD));
		// 20.サービス解約日
		outMap.set(JBSbatACIFM169.SVC_DSL_YMD, 			dbHojinMap.getString(JBSbatCH_T_EM_HOJIN_KEI.SVC_ENDYMD));
		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][editEmHojinPrcInfo]");
		// 出力情報を返却する
		return outMap;
	}
	
	/**
	 * 配列をカンマ区切り文字列に編集します。
	 * 
	 * @param obArray 対象配列
	 * @return カンマ区切り文字列
	 */
	private String arrayToString(Object[] obArray) {
		
		StringBuffer bufString = new StringBuffer();
		
		if (obArray == null || obArray.length == 0){
			return bufString.toString();
		}
		
		for(int i=0; i<obArray.length; i++){
			bufString.append(",");
			bufString.append(obArray[i]);
		}
		bufString.delete(0, 1);
		
		return bufString.toString();
	}
}
