/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACFtthChrgKhRsltShuk
*	ソースファイル名	：JBSbatACFtthChrgKhRsltShuk.java
*	作成者				：富士通　
*	作成日				：2013年07月05日
*＜機能概要＞
*　ＦＴＴＨ通信明細課金可否更新結果集計部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/07/05   富士通		【TG1-2013-0000657】新規作成
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM187;
import eo.business.util.file.JBSbatACIFM188;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatACFtthChrgKhRsltShuk extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** キーマッチ処理フラグ */
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ */
	private boolean mastProcFlg;

	/** トランファイル処理フラグ */
	private boolean tranProcFlg;

	/** テーブル(ＦＴＴＨ通信合計)*/
	private static final String D_TBL_NAME_AC_T_FTTH_TUSHIN_GK = "AC_T_FTTH_TUSHIN_GK";

	/** テーブルアクセスクラス(ＦＴＴＨ通信合計INSERT)*/
	private JBSbatSQLAccess db_AC_T_FTTH_TUSHIN_GK_INSERT = null;

	/** テーブルアクセスクラス(ＦＴＴＨ通信合計UPDATE)*/
	private JBSbatSQLAccess db_AC_T_FTTH_TUSHIN_GK_UPDATE = null;
/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/** 割り算用：1000 */
	private static final BigDecimal THOUSAND = new BigDecimal("1000");

	/** 変換済利用通信量 */
	private BigDecimal chgUseTsn = null;

	/** FTTH通信合計_更新フラグ */
	private String ftthTsnUpdFlg = null;

	/** 実行JOBID */
	private String dataFromFlg = null;

	/** 実行JOBID */
	private static final String FROM_MAST = "1";

	/** 実行JOBID */
	private static final String FROM_TRAN = "2";

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_T_FTTH_TUSHIN_GK_INSERT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_T_FTTH_TUSHIN_GK);
		db_AC_T_FTTH_TUSHIN_GK_UPDATE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_T_FTTH_TUSHIN_GK);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * 
	 * @param mastMap
	 *            　入力電文（ＦＴＴＨ通信合計）
	 * @param tranMap
	 *            　入力電文（ＦＴＴＨ通信明細集計）
	 * @param outputInItem
	 *            入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, 	JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem)	throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;

		this.ftthTsnUpdFlg = null;
		this.dataFromFlg = null;

		// 入力Ｍのみ存在する
		if (mastMap != null && tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみ存在する]");
			this.dataFromFlg = FROM_MAST;
			this.setMastProcFlg(true);
		}
		// 入力Ｔのみ存在する
		else if (mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");
			this.dataFromFlg = FROM_TRAN;
			
			// FTTH通信合計_更新フラグ＝"0"(追加)
			this.ftthTsnUpdFlg = JACStrConst.FTTH_TSN_GK_IN;
			this.setTranProcFlg(true);
		}
		
		// 入力Ｍ、入力Ｔともに存在する
		else
		{
			
			// マッチングキー取得
			// ＦＴＴＨ通信合計．サービス契約番号 + ＦＴＴＨ通信合計．料金コースコード + ＦＴＴＨ通信合計．料金サービスコード
			// + ＦＴＴＨ通信合計．請求契約番号 + ＦＴＴＨ通信合計．請求年月 + ＦＴＴＨ通信合計．利用年月
			String mastKey = mastMap.getString(JBSbatACIFM188.SVC_KEI_NO)
					+ mastMap.getString(JBSbatACIFM188.PCRS_CD)
					+ mastMap.getString(JBSbatACIFM188.PRC_SVC_CD)
					+ mastMap.getString(JBSbatACIFM188.SEIKY_KEI_NO)
					+ mastMap.getString(JBSbatACIFM188.SEIKY_YM)
					+ mastMap.getString(JBSbatACIFM188.USE_YM);
			
			// ＦＴＴＨ通信明細集計．サービス契約番号 + ＦＴＴＨ通信明細集計．料金コースコード + ＦＴＴＨ通信明細集計．料金サービスコード
			// + ＦＴＴＨ通信明細集計．請求契約番号 + ＦＴＴＨ通信明細集計．請求年月 + ＦＴＴＨ通信合計．利用年月
			String tranKey = tranMap.getString(JBSbatACIFM187.SVC_KEI_NO)
					+ tranMap.getString(JBSbatACIFM187.PCRS_CD)
					+ tranMap.getString(JBSbatACIFM187.PRC_SVC_CD)
					+ tranMap.getString(JBSbatACIFM187.SEIKY_KEI_NO)
					+ tranMap.getString(JBSbatACIFM187.SEIKY_YM)
					+ tranMap.getString(JBSbatACIFM187.USE_YM);

			// 入力Ｍ＝入力Ｔ（マッチ）
			if (mastKey.compareTo(tranKey) == 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");

				this.dataFromFlg = FROM_TRAN;
				
				// FTTH通信合計_更新フラグ＝"1"(更新)
				this.ftthTsnUpdFlg = JACStrConst.FTTH_TSN_GK_UPD;
				this.setMastProcFlg(true);
				this.setTranProcFlg(true);
			}
			
			// 入力Ｍ＜入力Ｔ
			else if (mastKey.compareTo(tranKey) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");
				this.dataFromFlg = FROM_MAST;
				this.setMastProcFlg(true);
			}
			
			// 入力Ｍ＞入力Ｔ
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");
				this.dataFromFlg = FROM_TRAN;
				
				// FTTH通信合計_更新フラグ＝"0"(追加)
				this.ftthTsnUpdFlg = JACStrConst.FTTH_TSN_GK_IN;
				this.setTranProcFlg(true);
			}
		}

		if (FROM_TRAN.equals(this.dataFromFlg))
		{
			
			// 利用通信量≠nullの場合
			if (tranMap.getBigDecimal(JBSbatACIFM187.USE_TSRYO) != null)
			{
				// 利用通信量変換処理:(小数点以下切り上げ))
				this.chgUseTsn = JACbatRknBusinessUtil.round(
						JACStrConst.ROUND_UP, tranMap.getBigDecimal(
								JBSbatACIFM187.USE_TSRYO).divide(THOUSAND), 0);
			}
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][chgUseTsn=" + this.chgUseTsn + "]");

			// FTTH通信合計_更新フラグ＝"1"(更新)の場合
			if (JACStrConst.FTTH_TSN_GK_UPD.equals(this.ftthTsnUpdFlg))
			{
				// ＦＴＴＨ通信合計登録データ出力
				this.updateFtthTsnGK(tranMap);
			}
			
			// FTTH通信合計_更新フラグ＝"0"(追加)の場合
			else
			{
				// ＦＴＴＨ通信合計登録データ出力
				this.insertFtthTsnGK(tranMap);
			}
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */

		db_AC_T_FTTH_TUSHIN_GK_INSERT.clearBatch();
		db_AC_T_FTTH_TUSHIN_GK_UPDATE.clearBatch();
		
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		
		// DBアクセスクラスをクローズします
		db_AC_T_FTTH_TUSHIN_GK_INSERT.close();
		db_AC_T_FTTH_TUSHIN_GK_UPDATE.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg
	 *            設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg
	 *            設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg
	 *            設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	利用通信量合計				USE_TSRYO_GK
	 *		 	更新年月日時分秒			UPD_DTM
	 *		 	更新オペレータアカウント	UPD_OPEACNT
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SVC_KEI_NO
	 *		 	PCRS_CD
	 *		 	PRC_SVC_CD
	 *		 	USE_YM
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_FTTH_TUSHIN_GK_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("USE_TSRYO_GK", setParam[0]);
		setMap.setValue("UPD_DTM", setParam[1]);
		setMap.setValue("UPD_OPEACNT", setParam[2]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SVC_KEI_NO", whereParam[0]);
		whereMap.setValue("PCRS_CD", whereParam[1]);
		whereMap.setValue("PRC_SVC_CD", whereParam[2]);
		whereMap.setValue("USE_YM", whereParam[3]);

		// DBアクセスを実行します
		db_AC_T_FTTH_TUSHIN_GK_UPDATE.updateByPrimaryKeysBatch(whereMap, setMap, 1);
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	サービス契約番号			SVC_KEI_NO
	 *		 	料金コースコード			PCRS_CD
	 *		 	料金サービスコード			PRC_SVC_CD
	 *		 	請求契約番号				SEIKY_KEI_NO
	 *		 	請求年月					SEIKY_YM
	 *		 	利用年月					USE_YM
	 *		 	利用通信量合計				USE_TSRYO_GK
	 *		 	補正通信量合計				HOSEI_TSRYO_GK
	 *		 	超過通知コード				CHOK_TCHI_CD
	 *		 	登録年月日時分秒			ADD_DTM
	 *		 	登録オペレータアカウント	ADD_OPEACNT
	 *		 	更新年月日時分秒			UPD_DTM
	 *		 	更新オペレータアカウント	UPD_OPEACNT
	 *		 	削除年月日時分秒			DEL_DTM
	 *		 	削除オペレータアカウント	DEL_OPEACNT
	 *		 	無効フラグ					MK_FLG
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_FTTH_TUSHIN_GK_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SVC_KEI_NO", setParam[0]);
		setMap.setValue("PCRS_CD", setParam[1]);
		setMap.setValue("PRC_SVC_CD", setParam[2]);
		setMap.setValue("SEIKY_KEI_NO", setParam[3]);
		setMap.setValue("SEIKY_YM", setParam[4]);
		setMap.setValue("USE_YM", setParam[5]);
		setMap.setValue("USE_TSRYO_GK", setParam[6]);
		setMap.setValue("HOSEI_TSRYO_GK", setParam[7]);
		setMap.setValue("CHOK_TCHI_CD", setParam[8]);
		setMap.setValue("ADD_DTM", setParam[9]);
		setMap.setValue("ADD_OPEACNT", setParam[10]);
		setMap.setValue("UPD_DTM", setParam[11]);
		setMap.setValue("UPD_OPEACNT", setParam[12]);
		setMap.setValue("DEL_DTM", setParam[13]);
		setMap.setValue("DEL_OPEACNT", setParam[14]);
		setMap.setValue("MK_FLG", setParam[15]);
	
		// DBアクセスを実行します
		db_AC_T_FTTH_TUSHIN_GK_INSERT.insertByPrimaryKeysBatch(setMap);
	}
	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */
	
	/**
	 * FTTH通信合計更新処理
	 * @param tsnMeisaiMap 通信明細マップ
	 * @throws Exception   業務サービス内で発生した例外全般。
	 */
	private void updateFtthTsnGK(JBSbatServiceInterfaceMap tsnMeisaiMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][updateFtthTsnGK]");
		
		// 設定項目
		JBSbatCommonDBInterface setParam 	= new JBSbatCommonDBInterface();
		
		// 設定条件
		JBSbatCommonDBInterface whereParam 	= new JBSbatCommonDBInterface();
		
		setParam.setValue(this.chgUseTsn); 											// 変換済利用通信量
		setParam.setValue(JCCBatCommon.getSysDateTimeStamp()); 						// システム日時
		setParam.setValue(JACStrConst.OPEACNT_SYSTEM); 								// オペレータアカウント
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateFtthTsnGK][setParam=" + setParam.getList().toString() + "]");
		whereParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.SVC_KEI_NO)); 	// サービス契約番号
		whereParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.PCRS_CD)); 		// 料金コースコード
		whereParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.PRC_SVC_CD)); 	// 料金サービスコード
		whereParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.USE_YM)); 		// 利用年月
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateFtthTsnGK][whereParam=" + whereParam.getList().toString() + "]");
		
		// FTTH通信合計更新
		executeAC_T_FTTH_TUSHIN_GK_PKUPDATE(setParam.getList().toArray(), whereParam.getList().toArray());
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][updateFtthTsnGK]");
	}

	/**
	 * FTTH通信合計追加処理
	 * @param tsnMeisaiMap 通信明細マップ
	 * @throws Exception   業務サービス内で発生した例外全般。
	 */
	private void insertFtthTsnGK(JBSbatServiceInterfaceMap tsnMeisaiMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][insertFtthTsnGK]");
		
		// 設定項目
		JBSbatCommonDBInterface setParam 	= new JBSbatCommonDBInterface();
		setParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.SVC_KEI_NO)); 	// サービス契約番号
		setParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.PCRS_CD)); 		// 料金コースコード
		setParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.PRC_SVC_CD)); 	// 料金サービスコード
		setParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.SEIKY_KEI_NO)); // 請求契約番号
		setParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.SEIKY_YM)); 	// 請求年月
		setParam.setValue(tsnMeisaiMap.getString(JBSbatACIFM187.USE_YM)); 		// 利用年月
		setParam.setValue(this.chgUseTsn); 										// 利用通信量合計
		setParam.setValue(0); 													// 補正通信量合計
		setParam.setValue(JACStrConst.CHOK_TCHI_CD_MI); 						// 超過通知コード
		setParam.setValue(null); 												// 登録年月日時分秒
		setParam.setValue(null); 												// 登録オペレータアカウント
		setParam.setValue(null); 												// 更新年月日時分秒
		setParam.setValue(null); 												// 更新オペレータアカウント
		setParam.setValue(null); 												// 削除年月日時分秒
		setParam.setValue(null); 												// 削除オペレータアカウント
		setParam.setValue(null); 												// 無効フラグ
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][insertFtthTsnGK][setParam=" + setParam.getList().toString() + "]");
		
		// FTTH通信合計追加
		executeAC_T_FTTH_TUSHIN_GK_PKINSERT(setParam.getList().toArray());
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][insertFtthTsnGK]");
	}
}
