/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACContTwGkUpd
*	ソースファイル名	：JBSbatACContTwGkUpd.java
*	作成者				：富士通　
*	作成日				：2013年02月27日
*＜機能概要＞
*　コンテンツ通話合計更新部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/02/27   富士通		新規作成
*********************************************************************/
package eo.business.service;


import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM207;
import eo.business.util.table.JBSbatAC_T_CN050AP_TW_DTL;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACContTwGkUpd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コンテンツ０５０アプリ通話明細)*/
	private static final String D_TBL_NAME_AC_T_CN050AP_TW_DTL = "AC_T_CN050AP_TW_DTL";

	/** テーブル(コンテンツ０５０アプリ通話合計)*/
	private static final String D_TBL_NAME_AC_T_CN050AP_TW_GK = "AC_T_CN050AP_TW_GK";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_T_CN050AP_TW_DTL_AC_SELECT_001 = "AC_SELECT_001";

	/** テーブルアクセスクラス(コンテンツ０５０アプリ通話明細)*/
	private JBSbatSQLAccess db_AC_T_CN050AP_TW_DTL = null;

	/** テーブルアクセスクラス(コンテンツ０５０アプリ通話合計)*/
	private JBSbatSQLAccess db_AC_T_CN050AP_TW_GK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/

		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_T_CN050AP_TW_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_T_CN050AP_TW_DTL);
		db_AC_T_CN050AP_TW_GK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_T_CN050AP_TW_GK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		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]");

		// コンテンツ０５０アプリ通話明細テーブル抽出集計
		this.getPcallPrc(inMap);
		
		// コンテンツ０５０アプリ通話明細テーブル取得結果
		JBSbatCommonDBInterface dtlRec = db_AC_T_CN050AP_TW_DTL.selectNext();
		
		while(dtlRec != null)
		{
			// コンテンツ０５０アプリ通話合計登録
			setCN050AP_GOKEI(dtlRec);
			
			dtlRec = db_AC_T_CN050AP_TW_DTL.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");

		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_T_CN050AP_TW_DTL.close();
		db_AC_T_CN050AP_TW_GK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		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配列に入れます。バイント変数は以下に説明します。
	 *		 	課金可否
	 *		 	SYSID
	 *		 	コンテンツ契約番号
	 *		 	課金対象年月
	 *		 	課金先電話番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_CN050AP_TW_DTL_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_T_CN050AP_TW_DTL.selectBySqlDefine(paramList, AC_T_CN050AP_TW_DTL_AC_SELECT_001);
	}

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SYSID
	 *		 	CONT_KEI_NO
	 *		 	CHRG_TRGT_YM
	 *		 	KAKINS_TELNO
	 *		 	KAZEI_HIKAZEI_CD
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeAC_T_CN050AP_TW_GK_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SYSID", whereParam[0]);
		whereMap.setValue("CONT_KEI_NO", whereParam[1]);
		whereMap.setValue("CHRG_TRGT_YM", whereParam[2]);
		whereMap.setValue("KAKINS_TELNO", whereParam[3]);
		whereMap.setValue("KAZEI_HIKAZEI_CD", whereParam[4]);

		// DBアクセスを実行します
		return db_AC_T_CN050AP_TW_GK.selectByPrimaryKeys(whereMap);
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	ＳＹＳＩＤ				SYSID
	 *		 	コンテンツ契約番号				CONT_KEI_NO
	 *		 	課金対象年月				CHRG_TRGT_YM
	 *		 	課金先電話番号				KAKINS_TELNO
	 *		 	課税非課税コード				KAZEI_HIKAZEI_CD
	 *		 	通話数合計				PCALL_CNT_GK
	 *		 	通話料金合計				PCALL_PRC_GK
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 *		 	登録運用年月日				ADD_UNYO_YMD
	 *		 	登録処理ＩＤ				ADD_TRN_ID
	 *		 	更新運用年月日				UPD_UNYO_YMD
	 *		 	更新処理ＩＤ				UPD_TRN_ID
	 *		 	削除運用年月日				DEL_UNYO_YMD
	 *		 	削除処理ＩＤ				DEL_TRN_ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_CN050AP_TW_GK_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SYSID", setParam[0]);
		setMap.setValue("CONT_KEI_NO", setParam[1]);
		setMap.setValue("CHRG_TRGT_YM", setParam[2]);
		setMap.setValue("KAKINS_TELNO", setParam[3]);
		setMap.setValue("KAZEI_HIKAZEI_CD", setParam[4]);
		setMap.setValue("PCALL_CNT_GK", setParam[5]);
		setMap.setValue("PCALL_PRC_GK", setParam[6]);
		setMap.setValue("ADD_DTM", setParam[7]);
		setMap.setValue("ADD_OPEACNT", setParam[8]);
		setMap.setValue("UPD_DTM", setParam[9]);
		setMap.setValue("UPD_OPEACNT", setParam[10]);
		setMap.setValue("DEL_DTM", setParam[11]);
		setMap.setValue("DEL_OPEACNT", setParam[12]);
		setMap.setValue("MK_FLG", setParam[13]);
		setMap.setValue("ADD_UNYO_YMD", setParam[14]);
		setMap.setValue("ADD_TRN_ID", setParam[15]);
		setMap.setValue("UPD_UNYO_YMD", setParam[16]);
		setMap.setValue("UPD_TRN_ID", setParam[17]);
		setMap.setValue("DEL_UNYO_YMD", setParam[18]);
		setMap.setValue("DEL_TRN_ID", setParam[19]);
	
		// DBアクセスを実行します
		db_AC_T_CN050AP_TW_GK.insertByPrimaryKeys(setMap);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	通話数合計				PCALL_CNT_GK
	 *		 	通話料金合計				PCALL_PRC_GK
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SYSID
	 *		 	CONT_KEI_NO
	 *		 	CHRG_TRGT_YM
	 *		 	KAKINS_TELNO
	 *		 	KAZEI_HIKAZEI_CD
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_CN050AP_TW_GK_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("PCALL_CNT_GK", setParam[0]);
		setMap.setValue("PCALL_PRC_GK", setParam[1]);
		setMap.setValue("UPD_DTM", setParam[2]);
		setMap.setValue("UPD_OPEACNT", setParam[3]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SYSID", whereParam[0]);
		whereMap.setValue("CONT_KEI_NO", whereParam[1]);
		whereMap.setValue("CHRG_TRGT_YM", whereParam[2]);
		whereMap.setValue("KAKINS_TELNO", whereParam[3]);
		whereMap.setValue("KAZEI_HIKAZEI_CD", whereParam[4]);

		// DBアクセスを実行します
		db_AC_T_CN050AP_TW_GK.updateByPrimaryKeys(whereMap, setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	/**
	 * コンテンツ０５０アプリ通話明細テーブルより通話料金合計を取得します。
	 * @throws Exception
	 */
	private void getPcallPrc(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPcallPrc]");

		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 対象キーの設定
		dbList.setValue(JACStrConst.CHRG_KH_PSB);							// 課金可否（"1"（課金可））
		dbList.setValue(inMap.getString(JBSbatACIFM207.SYSID));				// ＳＹＳＩＤ
		dbList.setValue(inMap.getString(JBSbatACIFM207.CONT_KEI_NO));		// コンテンツ契約番号
		dbList.setValue(inMap.getString(JBSbatACIFM207.KAKIN_TRG_YM));		// 課金対象年月
		dbList.setValue(inMap.getString(JBSbatACIFM207.KAKINS_TELNO));		// 課金先電話番号
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPcallPrc]dbList：" + dbList.getList().toString());
		
		// コンテンツ０５０アプリ通話明細データ取得
		executeAC_T_CN050AP_TW_DTL_AC_SELECT_001(dbList.getList().toArray());

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPcallPrc]");
	}
	
	/**
	 * コンテンツ０５０アプリ通話合計テーブル登録・更新
	 * @param dtlRec		コンテンツ０５０アプリ通話明細テーブル取得結果
	 * @throws Exception
	 */
	private void setCN050AP_GOKEI(JBSbatCommonDBInterface dtlRec) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setCN050AP_GOKEI]");

		// システム日時の取得
		String sysDateTimeStamp = JCCBatCommon.getSysDateTimeStamp();
		
		// ＳＹＳＩＤ
		String sysId = dtlRec.getString(JBSbatAC_T_CN050AP_TW_DTL.SYSID);

		// コンテンツ契約番号
		String contKeiNo = dtlRec.getString(JBSbatAC_T_CN050AP_TW_DTL.CONT_KEI_NO);

		// 課金対象年月
		String chrgTrgtYm = dtlRec.getString(JBSbatAC_T_CN050AP_TW_DTL.CHRG_TRGT_YM);

		// 課金先電話番号
		String kakinsTelNo = dtlRec.getString(JBSbatAC_T_CN050AP_TW_DTL.KAKINS_TELNO);

		// 課税非課税コード
		String kazeiHikazeiCd = dtlRec.getString(JBSbatAC_T_CN050AP_TW_DTL.KAZEI_HIKAZEI_CD);

		// 通話数合計
		String pcallCntGk = dtlRec.getString("CNT");

		// 通話料金合計
		String pcallPrc = dtlRec.getString(JBSbatAC_T_CN050AP_TW_DTL.PCALL_PRC);

		// コンテンツ０５０アプリ通話合計テーブルレコード存在チェック
		if (isExistCN050AP_GOKEI(sysId, contKeiNo, chrgTrgtYm, kakinsTelNo, kazeiHikazeiCd))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][コンテンツ０５０アプリ通話合計テーブルレコードなし]");

			// コンテンツ０５０アプリ通話合計テーブル登録
			executeAC_T_CN050AP_TW_GK_PKINSERT(new Object[] {
					sysId, 
					contKeiNo, 
					chrgTrgtYm, 
					kakinsTelNo, 
					kazeiHikazeiCd, 
					pcallCntGk, 
					pcallPrc, 
					sysDateTimeStamp, 
					super.batchUserId, 
					sysDateTimeStamp, 
					super.batchUserId, 
					null, 
					null, 
					0,
					null, 
					null, 
					null, 
					null, 
					null, 
					null});
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][コンテンツ０５０アプリ通話合計テーブルレコードあり]");

			// ｅｏモバイル合計テーブル更新
			executeAC_T_CN050AP_TW_GK_PKUPDATE(new Object[] {
					pcallCntGk, 
					pcallPrc, 
					sysDateTimeStamp, 
					super.batchUserId
				}, new Object[] {
					sysId, 
					contKeiNo, 
					chrgTrgtYm, 
					kakinsTelNo,
					kazeiHikazeiCd
			});
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setCN050AP_GOKEI]");

	}
	/**
	 * コンテンツ０５０アプリ通話合計テーブルレコード存在チェック
	 * @param sysId				ＳＹＳＩＤ
	 * @param contKeiNo			コンテンツ契約番号
	 * @param chrgTrgtYm		課金対象年月
	 * @param kakinsTelNo		課金先電話番号
	 * @param kazeiHikazeiCd 	課税非課税コード
	 * @return	boolean	true:存在する、false:存在しない
	 * @throws Exception
	 */
	private boolean isExistCN050AP_GOKEI(String sysId, String contKeiNo, String chrgTrgtYm, String kakinsTelNo, String kazeiHikazeiCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isExistCN050AP_GOKEI]");

		JBSbatCommonDBInterface record = executeAC_T_CN050AP_TW_GK_PKSELECT(new Object[] {sysId, contKeiNo, chrgTrgtYm, kakinsTelNo, kazeiHikazeiCd});
		if (record == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isExistCN050AP_GOKEI]");
			return true;
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isExistCN050AP_GOKEI]");
			return false;
		}
	}
}
