/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACFmtcelSsnPrcKmkRefSyk
*	ソースファイル名	：JBSbatACFmtcelSsnPrcKmkRefSyk.java
*	作成者				：富士通　
*	作成日				：2012年11月14日
*＜機能概要＞
*　フェムトセル精算料金項目反映（集約）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/11/19  FJ) 垣内	【ANK-0035-00-00】新規作成
*********************************************************************/
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.util.file.JBSbatACIFM171;
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 JBSbatACFmtcelSsnPrcKmkRefSyk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(事業者間精算)*/
	private static final String D_TBL_NAME_CH_T_JGSHAKSSN = "CH_T_JGSHAKSSN";

	/** テーブルアクセスクラス(事業者間精算)*/
	private JBSbatSQLAccess db_CH_T_JGSHAKSSN = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．集計キー */
	private String thShukeiKey = null;
	
	/** 入力．集計キー */
	private String inShukeiKey = null;
	
	/** 退避．事業者コード */
	private String jigyoshaCd = null;
	
	/** 退避．事業者契約コード */
	private String jigyoshaKeiCd = null;
	
	/** 退避．精算料金項目コード */
	private String ssnPrcKmkCd = null;
	
	/** 退避．精算年月 */
	private String ssnYm = null;
	
	/** 退避．精算単価 */
	private BigDecimal ssnTanka = BigDecimal.ZERO;
	
	/** 退避．精算金額 */
	private BigDecimal ssnAmnt = BigDecimal.ZERO;
	
	/** 退避．精算数量 */
	private int ssnCnt = 0;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_JGSHAKSSN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_JGSHAKSSN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		
		if(inMap != null)
		{
			// 退避．集計キーがnullの場合（1レコード目）
			if(this.thShukeiKey == null)
			{
				// 集計キーの退避
				this.thShukeiKey = getShukeiKey(inMap);
				
				// 退避項目へ入力データ格納
				this.jigyoshaCd    = inMap.getString(JBSbatACIFM171.JIGYOSHA_CD);
				this.jigyoshaKeiCd = inMap.getString(JBSbatACIFM171.JIGYOSHA_KEI_CD);
				this.ssnPrcKmkCd   = inMap.getString(JBSbatACIFM171.PRC_KMK_CD);
				this.ssnYm         = inMap.getString(JBSbatACIFM171.SSN_YM);
				this.ssnTanka      = inMap.getBigDecimal(JBSbatACIFM171.PRC);
				
				if(checkTrgtFlg(inMap))
				{
					this.ssnAmnt = inMap.getBigDecimal(JBSbatACIFM171.PRC);
					this.ssnCnt  = 1;
				}
				// ダミーレコード設定
				outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
				return outputInItem;
			}
			else
			{
				// 集計キーの生成
				this.inShukeiKey = getShukeiKey(inMap);
				
				// 退避．集計キー　＝　入力．集計キーの場合
				if(this.inShukeiKey.equals(this.thShukeiKey))
				{
					if(checkTrgtFlg(inMap))
					{
						this.ssnAmnt = this.ssnAmnt.add(inMap.getBigDecimal(JBSbatACIFM171.PRC));
						this.ssnCnt++;
					}
				}
				// 退避．集計キー　≠　入力．集計キーの場合
				else
				{
					// 事業者間精算スキーマに登録する
					createJgshakssn();
					
					// 退避項目の初期化
					this.ssnAmnt = BigDecimal.ZERO;
					this.ssnCnt  = 0;

					// 集計キーの退避
					this.thShukeiKey = getShukeiKey(inMap);
					
					// 退避項目へ入力データ格納
					this.jigyoshaCd    = inMap.getString(JBSbatACIFM171.JIGYOSHA_CD);
					this.jigyoshaKeiCd = inMap.getString(JBSbatACIFM171.JIGYOSHA_KEI_CD);
					this.ssnPrcKmkCd   = inMap.getString(JBSbatACIFM171.PRC_KMK_CD);
					this.ssnYm         = inMap.getString(JBSbatACIFM171.SSN_YM);
					this.ssnTanka      = inMap.getBigDecimal(JBSbatACIFM171.PRC);
					
					if(checkTrgtFlg(inMap))
					{
						this.ssnAmnt = inMap.getBigDecimal(JBSbatACIFM171.PRC);
						this.ssnCnt  = 1;
					}
				}
				return outputInItem;
			}
		}
		// 最終レコードの場合
		else
		{
			// 事業者間精算スキーマに登録する
			createJgshakssn();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_JGSHAKSSN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	事業者コード				JIGYOSHA_CD
	 *		 	事業者契約コード				JIGYOSHA_KEI_CD
	 *		 	精算料金項目コード				SSN_PRC_KMK_CD
	 *		 	精算年月				SSN_YM
	 *		 	精算金額				SSN_AMNT
	 *		 	精算金額税コード				SSN_AMNT_STAX_CD
	 *		 	精算金額設定年月日				SSN_AMNT_YMD
	 *		 	精算単位コード				SSN_TANI_CD
	 *		 	精算単価				SSN_TANKA
	 *		 	精算数量				SSN_CNT
	 *		 	登録年月日時分秒				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 executeCH_T_JGSHAKSSN_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("JIGYOSHA_CD", setParam[0]);
		setMap.setValue("JIGYOSHA_KEI_CD", setParam[1]);
		setMap.setValue("SSN_PRC_KMK_CD", setParam[2]);
		setMap.setValue("SSN_YM", setParam[3]);
		setMap.setValue("SSN_AMNT", setParam[4]);
		setMap.setValue("SSN_AMNT_STAX_CD", setParam[5]);
		setMap.setValue("SSN_AMNT_YMD", setParam[6]);
		setMap.setValue("SSN_TANI_CD", setParam[7]);
		setMap.setValue("SSN_TANKA", setParam[8]);
		setMap.setValue("SSN_CNT", setParam[9]);
		setMap.setValue("ADD_DTM", setParam[10]);
		setMap.setValue("ADD_OPEACNT", setParam[11]);
		setMap.setValue("UPD_DTM", setParam[12]);
		setMap.setValue("UPD_OPEACNT", setParam[13]);
		setMap.setValue("DEL_DTM", setParam[14]);
		setMap.setValue("DEL_OPEACNT", setParam[15]);
		setMap.setValue("MK_FLG", setParam[16]);
		setMap.setValue("ADD_UNYO_YMD", setParam[17]);
		setMap.setValue("ADD_TRN_ID", setParam[18]);
		setMap.setValue("UPD_UNYO_YMD", setParam[19]);
		setMap.setValue("UPD_TRN_ID", setParam[20]);
		setMap.setValue("DEL_UNYO_YMD", setParam[21]);
		setMap.setValue("DEL_TRN_ID", setParam[22]);
	
		// DBアクセスを実行します
		db_CH_T_JGSHAKSSN.insertByPrimaryKeys(setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 集計キーを取得します。
	 * @param  inMap     入力電文
	 * @return String    集計キー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getShukeiKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getShukeiKey]");
		// 集計キー
		String shukeiKey = null;

		StringBuffer keyBuf = new StringBuffer();
		if (inMap != null)
		{
			keyBuf.append(inMap.getString(JBSbatACIFM171.JIGYOSHA_CD)); 			// 事業者コード
			keyBuf.append(inMap.getString(JBSbatACIFM171.JIGYOSHA_KEI_CD)); 		// 事業者契約コード
			shukeiKey = keyBuf.toString();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getShukeiKey][shukeiKey=" + shukeiKey + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getShukeiKey]");
	
		return shukeiKey;
	}

	/**
	 * 精算対象のレコードかチェックします。
	 * @param  inMap     入力電文
	 * @return Boolean    集計キー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private Boolean checkTrgtFlg(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][checkTrgtFlg]");
		// 精算対象フラグ
		String ssnTrgtFlg = inMap.getString(JBSbatACIFM171.SSN_TRGT_FLG);

		// 休止中フラグ
		String pauseFlg = inMap.getString(JBSbatACIFM171.PAUSE_FLG);

		Boolean rtnValue = false;
		if (JACStrConst.SSN_TRGT_FLG_ON.equals(ssnTrgtFlg) && JACStrConst.PAUSE_FLG_OFF.equals(pauseFlg))
		{
			rtnValue = true;
		}
		else
		
		{
			rtnValue = false;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkTrgtFlg]");
		return rtnValue;
	}

	/**
	 * 事業者間精算の登録を行います。
	 * @throws Exception
	 */
	private void createJgshakssn() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createJgshakssn]");
		
		// 精算金額の丸め処理
		BigDecimal amnt = JACbatRknBusinessUtil.round(JACStrConst.ROUND_DOWN, this.ssnAmnt, 0);

		// 事業者間精算テーブルへ登録
		Object[] setParam = new Object[25];
		setParam[0] = this.jigyoshaCd;						// 事業者コード
		setParam[1] = this.jigyoshaKeiCd;					// 事業者契約コード
		setParam[2] = this.ssnPrcKmkCd;						// 精算料金項目コード
		setParam[3] = this.ssnYm;							// 精算年月
		setParam[4] = amnt.toString();						// 精算金額
		setParam[5] = JACStrConst.UZEI_SZEI_SKBT_UCHI;		// 精算金額税コード
		setParam[6] = super.opeDate;						// 精算金額設定年月日
		setParam[7] = JACStrConst.SSN_TANI_CD_INIT_CNT;		// 精算単位コード
		setParam[8] = this.ssnTanka.toString();				// 精算単価
		setParam[9] = String.valueOf(this.ssnCnt); 			// 精算数量
		
		executeCH_T_JGSHAKSSN_PKINSERT(setParam);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][createJgshakssn]");
		return;
	}
}
