/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACSvkeiSsnPrcCalc
*	ソースファイル名	：JBSbatACSvkeiSsnPrcCalc.java
*	作成者				：富士通　
*	作成日				：2011年12月19日
*＜機能概要＞
*　サービス契約精算料金計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/19   富士通		新規作成
*	v3.00.00	2012/08/29   FJ）今井	【ST2-2012-0001601】ログ出力処理削除（DB未存在エラー）
*	v3.00.01	2012/11/06   FJ）北村	【ST2-2012-0001913】KCN事業者間精算明細表・項目表に出力されない
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM105;
import eo.business.util.file.JBSbatACIFM144;
import eo.business.util.table.JBSbatCH_M_JGSHAKSSN_PRC;
import eo.common.constant.JACStrConst;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACSvkeiSsnPrcCalc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(事業者間精算料金)*/
	private static final String D_TBL_NAME_CH_M_JGSHAKSSN_PRC = "CH_M_JGSHAKSSN_PRC";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String CH_M_JGSHAKSSN_PRC_AC_SELECT_001 = "AC_SELECT_001";

	/** テーブルアクセスクラス(事業者間精算料金)*/
	private JBSbatSQLAccess db_CH_M_JGSHAKSSN_PRC = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/

	/**  事業者間積算料金リスト */
	private ArrayList<JBSbatCommonDBInterface> jgshakssnPrcMap = null;
	
	/** 退避キー （料金コースコード ＋ 料金サービスコードを保持）*/
	private String saveKey			= null;
	
	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_JGSHAKSSN_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_JGSHAKSSN_PRC);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		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 + "]");
		
		
		// 事業者間積算料金リストを初期化
		this.jgshakssnPrcMap = new ArrayList<JBSbatCommonDBInterface>(101);
		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][inMap=" + inMap.getMap().toString() + "]") : true;
		assert this.saveKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][saveKey=" + this.saveKey + "]") : true;
		
		// 出力共通電文
		JBSbatOutputItem outputItem = new JBSbatOutputItem(); 
		
		//  WKキーの設定
		StringBuffer keyBuf = new StringBuffer();
		
		keyBuf.append(inMap.getString(JBSbatACIFM144.PCRS_CD)); 	// 料金コースコード
		keyBuf.append(inMap.getString(JBSbatACIFM144.PRC_SVC_CD)); 	// 料金サービスコード 
		
		String inKey = keyBuf.toString(); //  WKキー
		
		assert inKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][inKey=" + inKey + "]") : true;
		
		// 退避キーがない(入力１件目) or キーブレイク時
		if(null == this.saveKey || !inKey.equals(this.saveKey))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避キーがない(入力１件目) or キーブレイク]");
			
			// キー設定
			this.saveKey = inKey;
			
			// ブレイク時に事業者間積算料金リストを初期化する
			this.jgshakssnPrcMap.clear();

			// 事業者間積算料金データ取得
			// 事業者間積算料金リストに検索結果を格納する。
			this.getByJgshakssnPrc(inMap);
		}
		
		// 該当データなしの場合
		if (this.jgshakssnPrcMap.isEmpty() || this.jgshakssnPrcMap.size() == 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][事業者スキーマに該当データなし]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

			return outputItem;
		}
		// 出力項目設定
		setOutMapList(outputItem, inMap);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		// 出力共通電文を返却
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_JGSHAKSSN_PRC.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_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_JGSHAKSSN_PRC_AC_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_CH_M_JGSHAKSSN_PRC.selectBySqlDefine(paramList, CH_M_JGSHAKSSN_PRC_AC_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/	
	
	/**
	 * 事業者間積算料金データ取得を行います。
	 * teigakuMap：定額料金マップに検索結果を格納する。
	 * 
	 * @param inMap 入力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getByJgshakssnPrc(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getByJgshakssnPrc]");
		
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();

		// 事業者間積算料金 ＷＨＥＲＥ条件設定
		dbList.setValue(super.systemCode); 									// システムコード
		dbList.setValue(inMap.getString(JBSbatACIFM144.PCRS_CD)); 			// 料金コースコード
		dbList.setValue(inMap.getString(JBSbatACIFM144.PRC_SVC_CD)); 		// 料金サービスコード
		dbList.setValue(super.opeDate); 									// バッチ運用日
		dbList.setValue(super.opeDate); 									// バッチ運用日
		dbList.setValue(super.opeDate); 									// バッチ運用日
		
		assert dbList != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getByJgshakssnPrc][dbList=" + dbList.getList().toString() + "]") : true;

		// 事業者間積算料金データ取得
		executeCH_M_JGSHAKSSN_PRC_AC_SELECT_001(dbList.getList().toArray());

		// レコード読み込み
		JBSbatCommonDBInterface dbMap = db_CH_M_JGSHAKSSN_PRC.selectNext();

		// 検索結果がなくなるまで繰り返す
		while (dbMap != null)
		{
			assert dbMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getByJgshakssnPrc][dbMap=" + dbMap.getMap().toString() + "]") : true;
			
			if (this.jgshakssnPrcMap.isEmpty())
			{
				// 存在しない場合はリストを生成
				this.jgshakssnPrcMap = new ArrayList<JBSbatCommonDBInterface>(10);
			}
			
			// リストにデータを格納
			this.jgshakssnPrcMap.add(dbMap);

			// 次レコード取得
			dbMap = db_CH_M_JGSHAKSSN_PRC.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getByJgshakssnPrc]");
		return;
	}
	
	/**
	 * 出力情報を設定します。
	 * @param outputItem
	 * @param inMap 入力電文
	 * @param mstList 事業者間積算料金データ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutMapList(JBSbatOutputItem outputItem, JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutMapList]");
		
		// 事業者間積算料金取得分、処理
		for (int i = 0; i < this.jgshakssnPrcMap.size(); i++) 
		{
			// 事業者間積算料金情報
			JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
			
			JBSbatCommonDBInterface dbMap = this.jgshakssnPrcMap.get(i);

			outputMap.setString(JBSbatACIFM105.SEIKY_KEI_NO,		inMap.getString(JBSbatACIFM105.SEIKY_KEI_NO));						// 請求先番号
			outputMap.setString(JBSbatACIFM105.SEIKY_YM,			inMap.getString(JBSbatACIFM105.SEIKY_YM));							// 請求年月
			outputMap.setString(JBSbatACIFM105.SVC_NO,				inMap.getString(JBSbatACIFM105.SVC_NO));							// サービス番号
			outputMap.setString(JBSbatACIFM105.SVC_SKBT_CD,			JACStrConst.KARA_MOJI);												// 料金サービス識別コード
			outputMap.setString(JBSbatACIFM105.PCRS_CD,				inMap.getString(JBSbatACIFM105.PCRS_CD));							// 料金コースコード
			outputMap.setString(JBSbatACIFM105.PRC_SVC_CD,			inMap.getString(JBSbatACIFM105.PRC_SVC_CD));						// 料金サービスコード
			outputMap.setString(JBSbatACIFM105.SSN_NYO_SORT_KEY, 	JACStrConst.SSN_NYO_SORT_KEY_SEIKY);								// 積算内容ソートキー
			outputMap.setString(JBSbatACIFM105.SSN_NYO, 			JACStrConst.SSN_NYO_SEIKY);											// 積算内容
			outputMap.setString(JBSbatACIFM105.PRC_KMK_CD, 			inMap.getString(JBSbatACIFM105.PRC_KMK_CD)); 				// 料金項目コード
			outputMap.setString(JBSbatACIFM105.COLLECT_PATTERN_CD, 	inMap.getString(JBSbatACIFM105.COLLECT_PATTERN_CD));		// 徴収パターンコード
			outputMap.setBigDecimal(JBSbatACIFM105.PRC, 			inMap.getBigDecimal(JBSbatACIFM105.PRC)); 					// 料金
			outputMap.setString(JBSbatACIFM105.USE_STAYMD,			inMap.getString(JBSbatACIFM105.USE_STAYMD));						// 利用開始日
			outputMap.setString(JBSbatACIFM105.USE_ENDYMD,			inMap.getString(JBSbatACIFM105.USE_ENDYMD));						// 利用終了日
			outputMap.setString(JBSbatACIFM105.SVC_STAYMD,			inMap.getString(JBSbatACIFM105.SVC_STAYMD));						// サービス開始日
			outputMap.setString(JBSbatACIFM105.FIRST_CHRG_STAYMD,	inMap.getString(JBSbatACIFM105.FIRST_CHRG_STAYMD));					// 初回課金開始日
			outputMap.setString(JBSbatACIFM105.SVC_DSL_YMD,			inMap.getString(JBSbatACIFM105.SVC_DSL_YMD));						// サービス解約日
			outputMap.setString(JBSbatACIFM105.SVC_DLRE,			inMap.getString(JBSbatACIFM105.SVC_DLRE));							// サービス解約理由
			outputMap.setString(JBSbatACIFM105.SVC_KAIHK_DAY,		inMap.getString(JBSbatACIFM105.SVC_KAIHK_DAY));						// サービス回復日
			outputMap.setString(JBSbatACIFM105.USE_DAY_CNT,			inMap.getString(JBSbatACIFM105.USE_DAY_CNT).toString());		// 利用日数
			outputMap.setString(JBSbatACIFM105.USE_FAIL_DAY_CNT,	inMap.getString(JBSbatACIFM105.USE_FAIL_DAY_CNT).toString());	// 利用不可日数
			outputMap.setString(JBSbatACIFM105.AIT_DIV,				inMap.getString(JBSbatACIFM105.AIT_DIV));							// 相対区分
			outputMap.setString(JBSbatACIFM105.SIME_DAY,			inMap.getString(JBSbatACIFM105.SIME_DAY));							// 締め日
			outputMap.setString(JBSbatACIFM105.JIGYOSHA_CD, 		inMap.getString(JBSbatACIFM105.JIGYOSHA_CD));				// 事業者コード
			outputMap.setString(JBSbatACIFM105.JIGYOSHA_KEI_CD, 	inMap.getString(JBSbatACIFM105.JIGYOSHA_KEI_CD));			// 事業者契約コード
			outputMap.setString(JBSbatACIFM105.USE_APLY_KH_CD, 		JACStrConst.USE_FAIL_APLY_WAY_CD_ALL);								// 利用不可適用方法
			outputMap.setString(JBSbatACIFM105.MAE_YUSEN_JUN, 		JACStrConst.MAEUK_SOSAI_YUSEN_JUN_0);								// 前受相殺優先順位
			outputMap.setString(JBSbatACIFM105.WRIB_YUSEN_JUN, 		JACStrConst.WRIB_YUSEN_JUN_0);										// 割引優先順位
			
			assert outputMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutMapList][outputMap=" + outputMap.getMap().toString() + "]") : true;

			// レコード出力判定フラグの設定
			outputMap.setOutFlg(true);

			// 出力レコード情報を設定する
			outputItem.addOutMapList(outputMap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutMapList]");
	}
}
