/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKaisenKikiAddCalc
*	ソースファイル名	：JBSbatACKaisenKikiAddCalc.java
*	作成者				：富士通　
*	作成日				：2012年11月27日
*＜機能概要＞
*　回線登録料・機器登録料計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/11/27  FJ)岡田		【ANK-0137-00-00】対応 新規作成
*	v4.00.01	2013/01/30  FJ)垣内		【ST2-2013-0000325】対応
*	v5.00.00	2013/07/11  FJ)岡田		【TG1-2013-0000662】マスタ参照基準日水平展開対応
*	v5.00.01	2013/07/16  FJ)狭間		【TG1-2013-0000662】エラーログ出力内容の修正
*	v6.00.00	2013/12/13  FJ)早崎		【OM-2013-0004838】LT-2013-0000352対応漏れ対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM174;
import eo.business.util.file.JBSbatACIFM175;
import eo.business.util.table.JBSbatCH_M_JGSHAKSSN_PRC;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
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 JBSbatACKaisenKikiAddCalc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(事業者間精算料金)*/
	private static final String D_TBL_NAME_CH_M_JGSHAKSSN_PRC = "CH_M_JGSHAKSSN_PRC";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String CH_M_JGSHAKSSN_PRC_AC_SELECT_002 = "AC_SELECT_002";

	/** テーブルアクセスクラス(事業者間精算料金)*/
	private JBSbatSQLAccess db_CH_M_JGSHAKSSN_PRC = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 事業者コード */
	private String jigyoshaCd = "";

	/** 事業者契約コード */
	private String[] jgsKeiCd = null;

	/** 単価リスト 金額・料金項目コード */
	private ArrayList<String> tankaArray = new ArrayList<String>(101);
	
	/** 群月末日 */
	private String wk_GunEnd = 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);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 料金スケジュール定義アクセス部品初期処理
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		
		try
		{
			// 請求年月を取得する
			String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			// 請求年月から、利用開始終了日取得
			String[] strEndYmd = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			
			this.wk_GunEnd = strEndYmd[1];	// 群月末日
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月末日：" + wk_GunEnd + "]");
		}
		finally
		{
			// 料金スケジュール定義アクセス部品クローズ
			schdlUtil.close();
		}
		
		// 業務パラメータ管理より、事業者コード・事業者契約コードを取得する
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// UQ事業者コード
		jigyoshaCd = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_UQ_JIGYOSHA_CD);

		// UQ事業者契約コード
		// 複数あるので「,」で分割する
		jgsKeiCd = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_UQ_JGS_KEI_CD_CUI).split(",");

		paramUtil.close();

		// 事業者間精算料金より各単価の金額と料金項目コードを取得する
		// CUI登録料
		String[] param = new String[] { super.systemCode, jigyoshaCd, jgsKeiCd[0], this.wk_GunEnd, this.wk_GunEnd, this.wk_GunEnd };
		executeCH_M_JGSHAKSSN_PRC_AC_SELECT_002(param);

		JBSbatCommonDBInterface result = db_CH_M_JGSHAKSSN_PRC.selectNext();

		if (null != result)
		{
			// CUI登録料を格納
			tankaArray.add(result.getString(JBSbatCH_M_JGSHAKSSN_PRC.SSN_PRC));
			tankaArray.add(result.getString(JBSbatCH_M_JGSHAKSSN_PRC.PRC_KMK_CD));
		}
		else
		{
			// ログ出力
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0260CH, new String[] { JBSbatCH_M_JGSHAKSSN_PRC.TABLE_NAME,
							super.systemCode + "," + jigyoshaCd + "," + jgsKeiCd[0] + "," + this.wk_GunEnd + "," + this.wk_GunEnd + "," + this.wk_GunEnd });
		}

		// 機器登録料
		param = new String[] { super.systemCode, jigyoshaCd, jgsKeiCd[1], this.wk_GunEnd, this.wk_GunEnd, this.wk_GunEnd };
		executeCH_M_JGSHAKSSN_PRC_AC_SELECT_002(param);

		result = db_CH_M_JGSHAKSSN_PRC.selectNext();

		if (null != result)
		{
			// 機器登録料を格納
			tankaArray.add(result.getString(JBSbatCH_M_JGSHAKSSN_PRC.SSN_PRC));
			tankaArray.add(result.getString(JBSbatCH_M_JGSHAKSSN_PRC.PRC_KMK_CD));
		}
		else
		{
			// ログ出力
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0260CH, new String[] { JBSbatCH_M_JGSHAKSSN_PRC.TABLE_NAME,
							super.systemCode + "," + jigyoshaCd + "," + jgsKeiCd[1] + "," + this.wk_GunEnd + "," + this.wk_GunEnd + "," + this.wk_GunEnd });
		}
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatOutputItem outputInItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		String mysb = inMap.getString(JBSbatACIFM174.MOBILE_YOKYU_SBT_CD);

		// モバイル要求種別コードが"110"（CUI新規）の場合
		if (JACStrConst.MOBILE_YOKYU_SBT_CD_SINKI.equals(mysb))
		{
			// 回線登録料情報作成
			outMap.set(JBSbatACIFM175.DISP_JUN, "1");
			outMap.set(JBSbatACIFM175.SSN_KMK_CD, tankaArray.get(1));
			outMap.set(JBSbatACIFM175.AMNT, tankaArray.get(0));
			outMap.set(JBSbatACIFM175.JIGYOSHA_KEI_CD, jgsKeiCd[0]);
		}
		// モバイル要求種別コードが"210"（DEV新規）の場合
		else if (JACStrConst.MOBILE_YOKYU_SBT_CD_DEV_SINKI.equals(mysb))
		{
			// 機器登録料情報作成
			outMap.set(JBSbatACIFM175.DISP_JUN, "2");
			outMap.set(JBSbatACIFM175.SSN_KMK_CD, tankaArray.get(3));
			outMap.set(JBSbatACIFM175.AMNT, tankaArray.get(2));
			outMap.set(JBSbatACIFM175.JIGYOSHA_KEI_CD, jgsKeiCd[1]);
		}
		else
		{
			// 以外の場合
			// 処理スキップ
			return null;
		}

		outMap.set(JBSbatACIFM175.JIGYOSHA_CD, jigyoshaCd);
		outMap.set(JBSbatACIFM175.CUST_ID, inMap.getString(JBSbatACIFM174.SVC_KEI_NO));
		outMap.set(JBSbatACIFM175.KEISHA_TYPE_CD, inMap.getString(JBSbatACIFM174.KEISHA_TYPE_CD));
		outMap.set(JBSbatACIFM175.CHRG_STA_YMD, inMap.getString(JBSbatACIFM174.CHRG_STA_YMD));
		outMap.set(JBSbatACIFM175.DSL_KISAN_YMD, "");

		// 出力フラグ設定
		outMap.setOutFlg(true);

		outputInItem.addOutMapList(outMap);

		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_JGSHAKSSN_PRC.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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_JGSHAKSSN_PRC_AC_SELECT_002(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_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
