/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACIcjknTrkmRsltHanei
*	ソースファイル名	：JBSbatACIcjknTrkmRsltHanei.java
*	作成者				：富士通　
*	作成日				：2011年06月10日
*＜機能概要＞
*　一時金取込結果反映部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/10   富士通		新規作成
*	v4.00.00	2012/11/06   FJ)垣内	【ANK-1254-00-00】マンション一時金対応
*	v8.00.00	2013/12/13   FJ)鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatInterface;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM043;
import eo.business.util.file.JBSbatACIFM044;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
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 JBSbatACIcjknTrkmRsltHanei extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(一時金)*/
	private static final String D_TBL_NAME_AC_T_ICJKN = "AC_T_ICJKN";

	/** SQL定義キー(AC_UPDATE_006)*/
	private static final String AC_T_ICJKN_AC_UPDATE_006 = "AC_UPDATE_006";

	/** テーブルアクセスクラス(一時金)*/
	private JBSbatSQLAccess db_AC_T_ICJKN = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 算出値0 */
	private static final BigDecimal SNST_VALUE_ZERO 	= BigDecimal.ZERO;
	
	/** 算出値1 */
	private static final BigDecimal SNST_VALUE_ONE 	= BigDecimal.ONE;
	
	/** 取込残額算出値 */
	private BigDecimal trkmZanSnst						= BigDecimal.ONE;
	
	/** 取込済額算出値 */
	private BigDecimal trkmZumiSnst					= BigDecimal.ZERO;
	
	/** 更新件数 */
	private int updCnt 								= 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_T_ICJKN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_T_ICJKN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// 入力ＭのみNullの場合
		if (mastMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "トランのみ");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値：" + trkmZanSnst);
			
			// プラス更新
			setUpdKmk(tranMap, JACStrConst.ICJKN_TRKM_RSLT_NON,
					tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC), BigDecimal.ZERO);
			
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			return outputInItem;
		}
		
		// 入力ＴのみNullの場合
		else if (tranMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "マスタのみ");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値：" + trkmZanSnst);
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			return outputInItem;
		}
		
		// 一時金登録番号が未設定の場合、次レコードへ
		String icjknAddSeq = tranMap.getString(JBSbatACIFM043.ICJKN_ADD_SEQ);
		if(JACStrConst.KARA_MOJI.equals(icjknAddSeq) || icjknAddSeq == null)
		{
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			return outputInItem;
		}
		
		// マッチングキーリスト(配列[0]:マッチングキー(マスタ) 、配列[1]:マッチングキー(トラン) 
		String[] macthKeyList = new String[2];

		// マッチングキー取得
		macthKeyList = getMacthKey(mastMap, tranMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力Ｍ = " + macthKeyList[0]);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力Ｔ = " + macthKeyList[1]);
		
		// 入力Ｍ ＝ 入力Ｔ
		if (macthKeyList[0].equals(macthKeyList[1]))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力Ｍ ＝ 入力Ｔ");
			
			// 入力Ｍ及び入力Ｔより出力情報を編集する
			this.matchTrn(mastMap, tranMap);
			
			// キーマッチ処理フラグを設定する
			this.setMatchProcFlg(true);
		}
		// 入力Ｍ ＞ 入力Ｔ
		else if (macthKeyList[0].compareTo(macthKeyList[1]) > 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力Ｍ ＞ 入力Ｔ");
		
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			
			// プラス更新
			setUpdKmk(tranMap, JACStrConst.ICJKN_TRKM_RSLT_NON,
					tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC), BigDecimal.ZERO);
			
			// 取込残額算出値 ← 1
			trkmZanSnst = SNST_VALUE_ONE;
		}
		// 上記以外
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力Ｍ ＜ 入力Ｔ");
			
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			
			// 取込残額算出値 ← 1
			trkmZanSnst = SNST_VALUE_ONE;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値：" + trkmZanSnst);
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_T_ICJKN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
			
		// 更新件数出力
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0420AI, new String[] {D_TBL_NAME_AC_T_ICJKN , String.valueOf(updCnt)});

	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * マッチングキーリストを取得します。
	 * 
	 * @param mastMap 一時金取込結果情報(ファイル入力）
	 * @param tranMap 一時金情報(ファイル入力）
	 * @return String[] 配列[0]:マッチングキー(マスタ)、配列[1]:マッチングキー(トラン) 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String[] getMacthKey(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		// マッチングキーリスト(配列[0]:マッチングキー(マスタ) 、配列[1]:マッチングキー(トラン) 
		String[] macthKeyList = new String[2];
		
		StringBuffer keyBufMast = new StringBuffer();
		
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.SEIKY_KEI_NO)); 					// 請求先番号
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.SEIKY_YM)); 						// 請求年月
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.SVC_KEI_NO));					// サービス契約番号
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.SVC_DTL_SKBT_NO));				// サービス詳細識別番号
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.PCRS_CD));						// 料金コースコード
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.PRC_SVC_CD)); 					// 料金サービスコード
		keyBufMast.append(mastMap.getString(JBSbatACIFM044.PRC_KMK_CD).substring(0, 9));	// 料金項目コード
		macthKeyList[0] = keyBufMast.toString(); 											// マッチングキー（マスタ）生成
		
		StringBuffer keyBufTran = new StringBuffer();
		
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.SEIKY_KEI_NO)); 					// 請求先番号
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.SEIKY_YM)); 						// 請求年月
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.SVC_KEI_NO));					// サービス契約番号
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.SVC_DTL_SKBT_NO));				// サービス詳細識別番号
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.PCRS_CD));						// 料金コースコード
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.PRC_SVC_CD)); 					// 料金サービスコード
		keyBufTran.append(tranMap.getString(JBSbatACIFM043.PRC_KMK_CD).substring(0, 9)); 	// 料金項目コード
		macthKeyList[1] = keyBufTran.toString(); 											// マッチングキー（トラン）生成
		
		return macthKeyList;
	}
	
	/**
	 * 取込残額、取込済額を算出します。
	 * 
	 * @param mastMap
	 * @param tranMap
	 * @throws Exception
	 */
	private void matchTrn(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "マッチング処理");
		
		// 取込済額
		BigDecimal trkmZan = null;
		 
		// 取込残額算出値の算出
		// 取込残額算出値 = "1" の場合
		if(trkmZanSnst.equals(SNST_VALUE_ONE))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値 = 1の場合");
			// 取込残額算出値 ← 一時金取込結果情報．取込残額
			trkmZanSnst = mastMap.getBigDecimal(JBSbatACIFM044.TRKM_ZAN_AMNT);
		}
		
		// 取込残額算出値 ≧ "0" の場合
		if(trkmZanSnst.compareTo(SNST_VALUE_ZERO) >= 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値 ≧ 0の場合");
			// 取込済額算出値 ← 一時金情報ファイル．一時金料金
			trkmZumiSnst = tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC);
			
			// 取込残額算出値 ← 0
			trkmZanSnst = SNST_VALUE_ZERO;
			trkmZan = trkmZanSnst;

			// プラス更新
			setUpdKmk(tranMap, JACStrConst.ICJKN_TRKM_RSLT_NON, trkmZumiSnst, trkmZan);
		}
		// 取込残額算出値 ＜ ０ かつ 取込残額算出値 ＞ 一時金情報.料金 の場合
		else if(trkmZanSnst.compareTo(SNST_VALUE_ZERO) < 0 && trkmZanSnst.compareTo(tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC)) > 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値 ＜ ０ かつ 取込残額算出値 ＞ 一時金情報.料金 の場合");
			// 取込済額算出値 ← 一時金情報ファイル．料金 − 取込残額算出値
			trkmZumiSnst = tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC).subtract(trkmZanSnst);
			trkmZan = trkmZanSnst;
			
			// マイナス更新
			setUpdKmk(tranMap, JACStrConst.ICJKN_TRKM_RSLT_ARI, trkmZumiSnst, trkmZan);			
			
			// 取込残額算出値 ← 取込残額算出値 − 一時金情報ファイル．一時金料金
			trkmZanSnst = trkmZanSnst.subtract(tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC));
		}
		// 取込残額算出値 ＜ ０ かつ 取込残額算出値 ≦ 一時金情報.料金 の場合
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "取込残額算出値 ＜ ０ かつ 取込残額算出値 ≦ 一時金情報.料金");
			// 取込済額算出値 ← 0
			trkmZumiSnst = SNST_VALUE_ZERO;
			
			// 取込残額 ← 一時金情報ファイル．一時金料金
			trkmZan = tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC);
			
			// マイナス更新
			setUpdKmk(tranMap, JACStrConst.ICJKN_TRKM_RSLT_ARI, trkmZumiSnst, trkmZan);
			
			// 取込残額算出値 ← 取込残額算出値 − 一時金情報ファイル．一時金料金
			trkmZanSnst = trkmZanSnst.subtract(tranMap.getBigDecimal(JBSbatACIFM043.ICJKN_PRC));
		}	
	}

	/**
	 * 一時金スキーマを更新します。
	 * 
	 * @param tranMap
	 * @param icjknTrkmRslt
	 * @param trkmZumi
	 * @param trkmZan
	 * @throws Exception
	 */
	private void setUpdKmk(JBSbatServiceInterfaceMap tranMap, String icjknTrkmRslt, BigDecimal trkmZumi, BigDecimal trkmZan) throws Exception
	{
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();

		// 対象キーの設定
		dbList.setValue(JACStrConst.ICJKN_TRKM_STAT_CHU); 					// 一時金取込ステータス
		dbList.setValue(icjknTrkmRslt); 										// 一時金取込結果
		dbList.setValue(trkmZumi); 												// 取込済額
		dbList.setValue(trkmZan); 												// 取込残額
		dbList.setValue(JBSbatInterface.getSystemDateTimeStamp()); 				// 更新年月日時分秒 
		dbList.setValue(super.batchUserId); 									// 更新オペレータアカウント 
		dbList.setValue(tranMap.getString(JBSbatACIFM043.ICJKN_ADD_SEQ));	// 一時金登録番号
		dbList.setValue(tranMap.getString(JBSbatACIFM043.ICJKN_UPD_SEQ));	// 一時金更新枝番
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "一時金登録番号(" + tranMap.getString(JBSbatACIFM043.ICJKN_ADD_SEQ) 
				+ ") 一時金更新枝番(" + tranMap.getString(JBSbatACIFM043.ICJKN_UPD_SEQ) + ") <-Update " 
				+ "一時金取込結果(" + icjknTrkmRslt + ") 取込済額(" + trkmZumi + ") 取込残額(" + trkmZan + ")");

		// 一時金UPDATE
		executeAC_T_ICJKN_AC_UPDATE_006(dbList.getList().toArray());
		
		// 更新件数 +1
		updCnt += 1;
	}
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * @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;
	}

	/**
	 * SQLKEY(AC_UPDATE_006)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	一時金取込ステータス
	 *		 	一時金取込結果
	 *		 	一時金取込済額
	 *		 	一時金取込残額
	 *		 	更新年月日時分秒
	 *		 	更新オペレータアカウント
	 *		 	一時金登録番号
	 *		 	一時金更新枝番
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_T_ICJKN_AC_UPDATE_006(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());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());

		// DBアクセスを実行します
		db_AC_T_ICJKN.executeBySqlDefine(paramList, AC_T_ICJKN_AC_UPDATE_006);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
