/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACFileOputPrcInfoMake
*	ソースファイル名	：JBSbatACFileOputPrcInfoMake.java
*	作成者				：富士通　
*	作成日				：2011年05月25日
*＜機能概要＞
*　ファイル出力料金情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/25   富士通		新規作成
*	v3.00		2012/04/29   FJ)永田	【ANK-0024-04-00】	出力項目追加
*	v8.00		2013/12/13   FJ)鈴木	【ANK-1794-00-00】	L2-MVNO対応（請求書電話番号表示（LC含む））
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.util.file.JBSbatACIFM040;
import eo.business.util.file.JBSbatACIFM048;
import eo.business.util.table.JBSbatAC_M_FILE_OPUT_CTRL;
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 JBSbatACFileOputPrcInfoMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ファイル出力制御)*/
	private static final String D_TBL_NAME_AC_M_FILE_OPUT_CTRL = "AC_M_FILE_OPUT_CTRL";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_M_FILE_OPUT_CTRL_AC_SELECT_001 = "AC_SELECT_001";

	/** テーブルアクセスクラス(ファイル出力制御)*/
	private JBSbatSQLAccess db_AC_M_FILE_OPUT_CTRL = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_FILE_OPUT_CTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_FILE_OPUT_CTRL);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// バッチ運用日のログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "バッチ運用日：" + super.opeDate);
		
		//WKキー設定
		String wkKey = inMap.getString(JBSbatACIFM048.PRC_KMK_CD); 		// 利用料金情報．料金項目コード
		
		// 退避．キーリスト存在確認、及び退避キー・WKキーの比較を行う
		String tempKey = "";
		
		// ファイル出力制御情報取得処理判定フラグ
		boolean dbSelectFlg = false;
		
		// 退避．キーリストに値が存在する場合
		if (outputInItem.isKeyList())
		{

			// 出力共通電文．キーリストの取得
			ArrayList<String> tempKeyList = outputInItem.getKeyList();
			// 退避．キーの取得
			tempKey = tempKeyList.get(0).toString();

			// 退避キー ≠ ＷＫキーの場合
			if (!tempKey.equals(wkKey))
			{
				dbSelectFlg = true;
			}

		}
		
		// 退避．キーリストに値が存在しない場合
		else
		{
			dbSelectFlg = true;
		}

		// ファイル出力制御情報取得処理を行なう。
		if (dbSelectFlg)
		{

			// 退避．ファイル出力制御情報をクリアする
			outputInItem.clearTmpList();

			// ファイル出力制御スキーマデータの取得
			JBSbatCommonDBInterface fileOutputMstData = getBYFileitemMstBean(inMap);

			// WKキーを退避キーに設定
			outputInItem.clearKeyList();
			outputInItem.addKeyList(wkKey);

			// 該当データなしの場合
			if (fileOutputMstData == null)
			{
				// 正常終了(出力なし)
				return outputInItem;
			}
			
			// 該当データありの場合
			else
			{ 

				// 退避．ファイル出力制御情報にファイル出力制御スキーマデータを格納する。
				setTempFileOutputMastData(fileOutputMstData, outputInItem);
			}
		}

		// ファイル出力料金情報作成
		this.setOutputInfo(inMap, outputInItem);
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_FILE_OPUT_CTRL.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * 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 executeAC_M_FILE_OPUT_CTRL_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());


		// DBアクセスを実行します
		db_AC_M_FILE_OPUT_CTRL.selectBySqlDefine(paramList, AC_M_FILE_OPUT_CTRL_AC_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加▼▼▼▼▼▼*/	
	
	/**
	 * ファイル出力制御スキーマ情報格納を行います。<BR>
	 * ファイル出力制御スキーマから抽出したデータを出力共通電文(退避リスト)に格納を行います。
	 * 
	 * @param mastData ファイル出力制御情報スキーマ
	 * @param outputInItem 出力共通電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setTempFileOutputMastData(JBSbatCommonDBInterface mastData, JBSbatOutputItem outputInItem) throws Exception
	{
			while (mastData != null)
			{
				// 入出力インターフェースオブジェクトを初期化
				JBSbatServiceInterfaceMap setTempMap = new JBSbatServiceInterfaceMap();

				// 検索結果データを設定
				setTempMap.setString(JBSbatAC_M_FILE_OPUT_CTRL.FILE_ID, 				mastData.getString(JBSbatAC_M_FILE_OPUT_CTRL.FILE_ID));				// ファイルＩＤ
				setTempMap.setBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION, 	mastData.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION));	// 縦位置
				setTempMap.setBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION, 		mastData.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION));	// 横位置
				setTempMap.setBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD, 	mastData.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD));	// 出力元項目コード
				setTempMap.setString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK, 				mastData.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK));			// 出力項目
				setTempMap.setBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.DIGITNO, 			mastData.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.DIGITNO));			// 桁数
				setTempMap.setString(JBSbatAC_M_FILE_OPUT_CTRL.KMK_HENSHU_SKBT_CD , 	mastData.getString(JBSbatAC_M_FILE_OPUT_CTRL.KMK_HENSHU_SKBT_CD));	// 項目編集識別コード
				setTempMap.setString(JBSbatAC_M_FILE_OPUT_CTRL.NM_SKBT_CD, 				mastData.getString(JBSbatAC_M_FILE_OPUT_CTRL.NM_SKBT_CD));			// 名称識別コード

				// 出力共通電文．退避リストに検索結果データを格納
				outputInItem.addTmpList(setTempMap);

				// 次のレコードの読込
				mastData = db_AC_M_FILE_OPUT_CTRL.selectNext();
			}
			return;
		
	}

	/**
	 * ファイル出力料金情報作成を行います。<BR>
	 * 退避ファイル出力制御情報のレコード数分、ファイル出力料金情報の作成を行います。
	 * 
	 * @param inMap 利用料金情報（入力）
	 * @param outputInItem 出力共通電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutputInfo(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{

		// 退避．ファイル出力制御情報の存在確認
		if (!outputInItem.isTmpList())
		{ // 存在しなかった場合
			return;
		}

		// 退避．ファイル出力制御情報の取得
		ArrayList<JBSbatServiceInterfaceMap> tempList = outputInItem.getTmpList();

		// 退避．ファイル出力制御情報のレコード数分処理を行なう。
		for (int i = 0; i < tempList.size(); i++)
		{
			// 退避．ファイル出力制御情報から1レコード読込
			JBSbatServiceInterfaceMap fileOutputMstMap = (JBSbatServiceInterfaceMap)tempList.get(i);

			// 入出力インターフェースオブジェクト初期化
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

			outMap.setString(JBSbatACIFM040.SEIKY_KEI_NO, 			inMap.getString(JBSbatACIFM048.SEIKY_KEI_NO));								// 請求先番号
			outMap.setString(JBSbatACIFM040.SEIKY_YM, 				inMap.getString(JBSbatACIFM048.SEIKY_YM));									// 請求年月
			outMap.setString(JBSbatACIFM040.SEIRI_NO, 				inMap.getString(JBSbatACIFM048.SEIRI_NO));									// 整理番号
			outMap.setString(JBSbatACIFM040.SVC_NO, 				inMap.getString(JBSbatACIFM048.SVC_NO));									// サービス番号
			outMap.setString(JBSbatACIFM040.SVC_SKBT_CD, 			inMap.getString(JBSbatACIFM048.SVC_SKBT_CD));								// 料金サービス識別コード
			outMap.setString(JBSbatACIFM040.PRC_GRP_CD, 			inMap.getString(JBSbatACIFM048.PRC_GRP_CD));								// 料金グループコード
			outMap.setString(JBSbatACIFM040.PCRS_CD, 				inMap.getString(JBSbatACIFM048.PCRS_CD));									// 料金コースコード
			outMap.setString(JBSbatACIFM040.PRC_SVC_CD, 			inMap.getString(JBSbatACIFM048.PRC_SVC_CD));								// 料金サービスコード
			outMap.setString(JBSbatACIFM040.PRC_KMK_CD, 			inMap.getString(JBSbatACIFM048.PRC_KMK_CD));								// 料金項目コード
			outMap.setBigDecimal(JBSbatACIFM040.PRC, 				inMap.getBigDecimal(JBSbatACIFM048.PRC));									// 料金（数量）
			outMap.setString(JBSbatACIFM040.USE_STAYMD, 			inMap.getString(JBSbatACIFM048.USE_STAYMD));								// 利用開始日
			outMap.setString(JBSbatACIFM040.USE_ENDYMD, 			inMap.getString(JBSbatACIFM048.USE_ENDYMD));								// 利用終了日
			outMap.setString(JBSbatACIFM040.AIT_DIV , 				inMap.getString(JBSbatACIFM048.AIT_DIV));									// 相対区分
			outMap.setString(JBSbatACIFM040.SIME_DAY, 				inMap.getString(JBSbatACIFM048.SIME_DAY));									// 締め日
			outMap.setString(JBSbatACIFM040.FILE_ID, 				fileOutputMstMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.FILE_ID));				// ファイルＩＤ
			outMap.setBigDecimal(JBSbatACIFM040.LENGTH_POSITION, 	fileOutputMstMap.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION));	// 縦位置
			outMap.setBigDecimal(JBSbatACIFM040.SIDE_POSITION, 		fileOutputMstMap.getBigDecimal(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION));	// 横位置
			outMap.setString(JBSbatACIFM040.KMK_HENSHU_SKBT_CD, 	fileOutputMstMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.KMK_HENSHU_SKBT_CD));	// 項目編集識別コード
			outMap.setString(JBSbatACIFM040.NM_SKBT_CD, 			fileOutputMstMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.NM_SKBT_CD));			// 名称識別コード
			outMap.setString(JBSbatACIFM040.SVC_DTL_SKBT_NO, 		inMap.getString(JBSbatACIFM048.SVC_DTL_SKBT_NO));							// サービス詳細識別番号

			// 出力判定フラグを設定
			outMap.setOutFlg(true);

			// 出力共通電文に、編集したファイル出力料金情報を格納
			outputInItem.addOutMapList(outMap);
		}
		return;
	}

	/**
	 * ファイル出力制御スキーマデータ取得を行います。
	 * 
	 * @param inMap 利用料金情報（入力）
	 * @return JBSbatCommonDBList ファイル出力制御スキーマデータ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatCommonDBInterface getBYFileitemMstBean(JBSbatServiceInterfaceMap inMap) throws Exception
	{

		// SQLキーを設定する
		JBSbatCommonDBInterface keyList = new JBSbatCommonDBInterface();

		// 対象キーの設定
		keyList.setValue(super.systemCode); 								// システムコード
		keyList.setValue(inMap.getString(JBSbatACIFM048.PRC_KMK_CD)); 		// 料金項目コード
		keyList.setValue(JACStrConst.OUTDATASKBT_DTL); 						// 出力データ区分
		keyList.setValue(JACStrConst.KMKSKBT_PRC); 							// 項目区分
		keyList.setValue(super.opeDate); 									// バッチ運用日

		// SQL実行
		executeAC_M_FILE_OPUT_CTRL_AC_SELECT_001(keyList.getList().toArray());
		JBSbatCommonDBInterface getData = db_AC_M_FILE_OPUT_CTRL.selectNext();

		return getData;
	}	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
}
