/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKSyuKeiWbSvcFix
*	ソースファイル名	：JBSbatKKSyuKeiWbSvcFix.java
*	作成者				：富士通　
*	作成日				：2013年06月15日
*＜機能概要＞
*　主契約割引サービス確定部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/06/26   FJ)団		【IT1-2013-0001289】障害対応
*	v4.00.01	2013/12/17   FJ)団		【OM-2013-0004836】障害対応（KK_T_MSKM_KK_SELECT_006→KK_T_MSKM_KK_SELECT_013に修正）
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM495;
import eo.business.util.table.JBSbatKK_T_MSKM;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI_UCWK;
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;
import eo.framework.util.JBSbatStringUtil;
import eo.framework.util.JCCBatchEsbInterface;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKSyuKeiWbSvcFix extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約内訳)*/
	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_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(申込)*/
	private static final String D_TBL_NAME_KK_T_MSKM = "KK_T_MSKM";

	/** SQL定義キー(KK_SELECT_023)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_023 = "KK_SELECT_023";

	/** SQL定義キー(KK_SELECT_013)*/
	private static final String KK_T_MSKM_KK_SELECT_013 = "KK_SELECT_013";

	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_UCWK = null;

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(申込)*/
	private JBSbatSQLAccess db_KK_T_MSKM = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** テーブル名（サービス契約内訳）*/
	private static final String KK_T_SVC_KEI_UCWK = "サービス契約内訳";
	
	/** 情報名（サービス契約内訳情報）*/
	private static final String STR_KK_SVC_KEI_UCWK_INFO = "サービス契約内訳番号：";
	
	/** ユースケースID(割引サービス自動適用) */
	private static final String USECASE_ID_WRISVC_AUTO_APLY = "KKSV0679";
	
	/** CCタイトル(割引サービス自動適用) */
	private static final String CC_TITLE_WRISVC_AUTO_APLY = "KKSV067901CC";
	
	/** 
	 * サービス契約内訳番号
	 */
	protected String svcKeiUcwk_no = "";

	/** 
	 * 世代登録年月日時分秒
	 */
	protected String geneAddDtm = "";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_MSKM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_MSKM);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("execute_START");
		
		// 中間ファイルの読み込みを行います。
		getKkifm495(inMap);
		
		// サービス契約内訳のPK検索を行う
		String [] whereParam = {svcKeiUcwk_no, geneAddDtm};
		
		JBSbatCommonDBInterface svcKeiUcwk = executeKK_T_SVC_KEI_UCWK_PKSELECT(whereParam);
		if(null == svcKeiUcwk){
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, 
					new String[]{KK_T_SVC_KEI_UCWK, STR_KK_SVC_KEI_UCWK_INFO + svcKeiUcwk_no});
		}
		
		// 割引サービス自動適用CC呼出
		// サービス契約番号を取得します。
		String svcKeiNo = JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
		
		// ユースケースIDを格納するMAPを生成します。
		HashMap<String, Object> paramMap0679 = new HashMap<String, Object>();
		paramMap0679.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID_WRISVC_AUTO_APLY);
		
		// サービスに渡す業務データを格納するMAPを生成します。
		HashMap<String, Object> inputMap0679 = new HashMap<String, Object>();
		
		// inputMap0679に設定するデータ用HashMapを生成します。
		HashMap<String, Object> dataMap0679 = new HashMap<String, Object>();
		
		// CCタイトル
		String ccTitleOpn = CC_TITLE_WRISVC_AUTO_APLY;
		
		// inputMap0679にデータ用HashMapをサービスIDをKeyとして設定します。
		inputMap0679.put(ccTitleOpn, dataMap0679);
		
		// サービスの処理結果が格納されるMAPを生成します。
		HashMap<Object, Object> outMap0679 = new HashMap<Object, Object>();
		
		// サービス契約検索結果格納マップ
		JBSbatCommonDBInterface svcKei_map = new JBSbatCommonDBInterface();
		
		// サービス契約検索
		svcKei_map = searchSvcKeiInfo(svcKeiNo);
		
		// SYSID
		String sysId = JBSbatStringUtil.Rtrim(svcKei_map.getString(JBSbatKK_T_SVC_KEI.SYSID));
		
		// 申込明細番号
		String mskmDtlNo = JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI_UCWK.MSKM_DTL_NO));
		
		// 申込より申込番号、申込種別コード取得
		executeKK_T_MSKM_KK_SELECT_013(new Object[]{mskmDtlNo});
		
		JBSbatCommonDBInterface dbMap = db_KK_T_MSKM.selectNext(); 
		
		// 申込検索結果なしの場合、エラーとし処理中断します
		if(null == dbMap)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, new String[]{"KK_T_MSKM", mskmDtlNo});
		}
		
		// 申込番号
		String mskmNo = JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatKK_T_MSKM.MSKM_NO));
		
		// 申込種別コード
		String mskmSbtCd = JBSbatStringUtil.Rtrim(dbMap.getString(JBSbatKK_T_MSKM.MSKM_SBT_CD));
		
		// SYSID
		dataMap0679.put("sysid", sysId);
		
		// 登録／変更区分
		dataMap0679.put("add_chge_div", "16");		// STB
		
		// 申込番号
		dataMap0679.put("mskm_no", mskmNo);
		
		// 申込種別コード
		dataMap0679.put("mskm_sbt_cd", mskmSbtCd);
		
		// 異動区分
		dataMap0679.put("ido_div", JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI_UCWK.IDO_DIV)));
		
		// 機能コード
		dataMap0679.put("func_code", "1");
		
		// サービス解約理由コード
		dataMap0679.put("svc_dlre_cd", "01");		// 01:通常解約
		
		// サービス契約グループリスト
		ArrayList<Object> svcKeiGrpList = new ArrayList<Object>();
		HashMap<String, Object> svcKeiGrpMap = new HashMap<String, Object>();
		
		// グループ区分
		svcKeiGrpMap.put("grp_div", "00");
		
		// サービス契約リスト
		ArrayList<Object> svcKeiList = new ArrayList<Object>();
		HashMap<String, String> svcKeiMap = new HashMap<String, String>();
		
		// 対象契約識別コード
		svcKeiMap.put("tg_kei_skbt_cd", "03");		// 03:サービス契約内訳
		
		// サービス契約内訳番号
		svcKeiMap.put("svc_kei_ucwk_no", JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_NO)));
		
		// サービス契約内訳ステータス
		svcKeiMap.put("svc_kei_ucwk_stat", JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_STAT)));
		
		// 料金コースコード
		svcKeiMap.put("pcrs_cd", JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI_UCWK.PCRS_CD)));
		
		// 料金プランコード
		svcKeiMap.put("pplan_cd", JBSbatStringUtil.Rtrim(svcKeiUcwk.getString(JBSbatKK_T_SVC_KEI_UCWK.PPLAN_CD)));
		
		svcKeiList.add(svcKeiMap);
		
		svcKeiGrpMap.put("svc_kei_list", svcKeiList);
		
		svcKeiGrpList.add(svcKeiGrpMap);
		
		dataMap0679.put("svc_kei_grp_list", svcKeiGrpList);
		// 割引サービス自動適用部品CCを呼び出します。
		JCCBatchEsbInterface.invokeService(super.commonItem, paramMap0679, inputMap0679, outMap0679);
		
		// 部品からのリターンコードを取得します。
		String returnCode = (String)outMap0679.get("RETURN_CODE");
		super.logPrint.printDebugLog("★RETURN_CODE：" + returnCode);
		
		// サービスインターフェースよりエラーが返却された場合
		if(!"0000".equals(returnCode))
		{			

			StringBuffer sb = new StringBuffer();
			sb.append(" SYSID：" + sysId);
			sb.append("、登録／変更区分："+ "16");
			sb.append("、申込番号："+ mskmNo);
			sb.append("、申込種別コード："+ mskmSbtCd);
			sb.append("、サービス解約理由コード："+ "01");

			// 「サービスインターフェイスエラーの場合は、下記のログ出力する。
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, 
				new String[]{"割引サービス自動適用CCでエラーが発生しました(リターンコード):" + returnCode + sb.toString()});

			//エラーフラグ設定
			super.commonItem.setErrFlg(true);
			
			//出力情報を返却
			return new JBSbatOutputItem() ;
		}
		super.logPrint.printDebugLog("execute_END");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI_UCWK.close();
		db_KK_T_SVC_KEI.close();
		db_KK_T_MSKM.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SVC_KEI_UCWK_NO
	 *		 	GENE_ADD_DTM
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_SVC_KEI_UCWK_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SVC_KEI_UCWK_NO", whereParam[0]);
		whereMap.setValue("GENE_ADD_DTM", whereParam[1]);

		// DBアクセスを実行します
		return db_KK_T_SVC_KEI_UCWK.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(KK_SELECT_023)で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_023(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_023);
	}

	/**
	 * SQLKEY(KK_SELECT_013)で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_MSKM_KK_SELECT_013(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_MSKM.selectBySqlDefine(paramList, KK_T_MSKM_KK_SELECT_013);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 
	 * 中間ファイルの読み込みを行います。
	 * 
	 * @param inMap 中間ファイルの値。
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void getKkifm495(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		svcKeiUcwk_no       = "";															// サービス契約内訳番号
		geneAddDtm          = "";															// 世代登録年月日

		svcKeiUcwk_no       = inMap.getString(JBSbatKKIFM495.SVC_KEI_UCWK_NO);				// サービス契約内訳番号
		geneAddDtm          = inMap.getString(JBSbatKKIFM495.GENE_ADD_DTM);					// 世代登録年月日

	}
	
	/**
	 * サービス契約情報取得
	 * @param svcKeiNo サービス契約番号
	 * 
	 * @return 
	 * @throws Exception 
	 */
	private JBSbatCommonDBInterface searchSvcKeiInfo(String svcKeiNo) throws Exception
	{
		executeKK_T_SVC_KEI_KK_SELECT_023(new Object[]{svcKeiNo, this.opeDate});
		
		JBSbatCommonDBInterface dbInfo = db_KK_T_SVC_KEI.selectNext();
		
		// サービス契約検索結果がない場合、エラーとし処理中断します。
		if (null == dbInfo)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0210CE, 
					new String[]{"サービス契約", "サービス契約番号：" + svcKeiNo});
		}
		
		return dbInfo;
	}	
}
