/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACMaeukkinInfoMake
*	ソースファイル名	：JBSbatACMaeukkinInfoMake.java
*	作成者				：富士通　
*	作成日				：2011年06月29日
*＜機能概要＞
*　前受金情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/29   富士通		新規作成
*	v4.00		2013/01/08	FJ)垣内		【】前受金相殺課題対応
*	v8.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.JBSbatInterface;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFI015;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.file.JBSbatACIFI009;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACMaeukkinInfoMake extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @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)
		{
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			
			return outputInItem;
		}
		
		// 入力ＴのみNullの場合
		else if (tranMap == null)
		{
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			
			// 前受金エラーファイル出力処理を行う
			this.setErrFile(mastMap, outputInItem);
			
			return outputInItem;
		}
		
		// マッチングキーリスト(配列[0]:マッチングキー(マスタ) 、配列[1]:マッチングキー(トラン) 
		String[] macthKeyList = new String[2];
		
		// マッチングキー取得
		macthKeyList = getMacthKey(mastMap, tranMap);
		
		// 料金サービスコード
		String prcSvcCd = JBSbatInterface.Rtrim(tranMap.getString(JBSbatACIFI015.PRC_SVC_CD));
		
		// 入力Ｍ ＝ 入力Ｔ かつ 料金サービスコード ＝ "SEIKYU"(請求契約単位)
		if (macthKeyList[0].equals(macthKeyList[1]) && prcSvcCd.equals(JACStrConst.PRC_SVC_CD_SEIKY))
		{
			// 利用料金情報（前受金）出力処理を行う
			this.setMaeukekin(mastMap, tranMap, outputInItem);
			
			// 次レコード
			this.setTranProcFlg(true);
			this.setMastProcFlg(true);
		}
		// 入力Ｍ ＝ 入力Ｔ
		else if (macthKeyList[0].equals(macthKeyList[1]))
		{
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
		}
		// 入力Ｍ > 入力Ｔ
		else if (macthKeyList[0].compareTo(macthKeyList[1]) > 0)
		{
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
		}
		// 入力Ｍ < 入力Ｔ
		else if (macthKeyList[0].compareTo(macthKeyList[1]) < 0)
		{
			// 前受金エラーファイル出力処理を行う
			this.setErrFile(mastMap, outputInItem);
			
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
		}
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 利用料金情報（前受金）出力処理を行います。
	 * @param mastMap 前受金相殺依頼情報
	 * @param tranMap 課金対象サービス契約情報
	 * @param outputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setMaeukekin(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputItem) throws Exception
	{
		JBSbatServiceInterfaceMap outMaeukekin = new JBSbatServiceInterfaceMap();

		// 項目設定
		outMaeukekin.setString(JBSbatACIFI016.SEIKY_KEI_NO, 		mastMap.getString(JBSbatACIFI009.SEIKY_KEI_NO));			// 請求先番号
		outMaeukekin.setString(JBSbatACIFI016.SEIKY_YM, 			mastMap.getString(JBSbatACIFI009.SEIKY_YM));				// 請求年月
		outMaeukekin.setString(JBSbatACIFI016.SEIRI_NO, 			tranMap.getString(JBSbatACIFI015.SEIRI_NO));				// 整理番号
		outMaeukekin.setString(JBSbatACIFI016.WRIB_SVC_KEI_NO,		tranMap.getString(JBSbatACIFI015.WRIB_SVC_KEI_NO));			// 割引サービス契約番号
		outMaeukekin.setString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO,	tranMap.getString(JBSbatACIFI015.WRISVC_TRGT_KEI_NO));		// 割引サービス対象契約番号
		outMaeukekin.setString(JBSbatACIFI016.SVC_NO, 				tranMap.getString(JBSbatACIFI015.SVC_NO));					// サービス番号
		outMaeukekin.setString(JBSbatACIFI016.OP_SVKEI_NO, 			tranMap.getString(JBSbatACIFI015.OP_SVKEI_NO));				// オプションサービス契約番号
		outMaeukekin.setString(JBSbatACIFI016.SVC_SKBT_CD,			tranMap.getString(JBSbatACIFI015.SVC_SKBT_CD));				// 料金サービス識別コード
		outMaeukekin.setString(JBSbatACIFI016.PRC_GRP_CD, 			mastMap.getString(JBSbatACIFI009.PRC_GRP_CD));				// 料金グループコード
		outMaeukekin.setString(JBSbatACIFI016.PCRS_CD, 				mastMap.getString(JBSbatACIFI009.PCRS_CD));					// 料金コースコード
		outMaeukekin.setString(JBSbatACIFI016.PRC_SVC_CD, 			mastMap.getString(JBSbatACIFI009.PRC_SVC_CD));				// 料金サービスコード
		outMaeukekin.setString(JBSbatACIFI016.PRC_KMK_CD, 			mastMap.getString(JBSbatACIFI009.PRC_KMK_CD));				// 料金項目コード
		outMaeukekin.setString(JBSbatACIFI016.COLLECT_PATTERN_CD, 	JACStrConst.COLLECT_PATTERN_CD_SP);							// 徴収パターンコード
		outMaeukekin.setBigDecimal(JBSbatACIFI016.PRC, 				new BigDecimal(mastMap.getString(JBSbatACIFI009.MAEUKKIN_SOSAI_REQ_AMNT)));						// 料金
		outMaeukekin.setString(JBSbatACIFI016.USE_STAYMD, 			tranMap.getString(JBSbatACIFI015.USE_STAYMD));				// 利用開始日
		outMaeukekin.setString(JBSbatACIFI016.USE_ENDYMD, 			tranMap.getString(JBSbatACIFI015.USE_ENDYMD));				// 利用終了日
		outMaeukekin.setString(JBSbatACIFI016.SVC_STAYMD, 			tranMap.getString(JBSbatACIFI015.SVC_STAYMD));				// サービス開始日
		outMaeukekin.setString(JBSbatACIFI016.FIRST_CHRG_STAYMD,	tranMap.getString(JBSbatACIFI015.FIRST_CHRG_STAYMD));		// 初回課金開始日
		outMaeukekin.setString(JBSbatACIFI016.SVC_DSL_YMD, 			tranMap.getString(JBSbatACIFI015.SVC_DSL_YMD));				// サービス解約日 
		outMaeukekin.setString(JBSbatACIFI016.SVC_DLRE, 			tranMap.getString(JBSbatACIFI015.SVC_DLRE));				// サービス解約理由
		outMaeukekin.setString(JBSbatACIFI016.SVC_KAIHK_DAY,		tranMap.getString(JBSbatACIFI015.SVC_KAIHK_DAY));			// サービス回復日
		outMaeukekin.setBigDecimal(JBSbatACIFI016.USE_DAY_CNT,		tranMap.getBigDecimal(JBSbatACIFI015.USE_DAY_CNT));			// 利用日数
		outMaeukekin.setBigDecimal(JBSbatACIFI016.USE_FAIL_DAY_CNT,	tranMap.getBigDecimal(JBSbatACIFI015.USE_FAIL_DAY_CNT));	// 利用不可日数
		outMaeukekin.setString(JBSbatACIFI016.AIT_DIV,				tranMap.getString(JBSbatACIFI015.AIT_DIV));					// 相対区分
		outMaeukekin.setString(JBSbatACIFI016.SIME_DAY,				tranMap.getString(JBSbatACIFI015.SIME_DAY));				// 締め日
		outMaeukekin.setString(JBSbatACIFI016.USE_APLY_KH_CD,		JACStrConst.USE_NG_TKY_N);									// 利用不可適用可否
		outMaeukekin.setString(JBSbatACIFI016.MAE_YUSEN_JUN,		JACStrConst.MAE_YUSEN_JUN_0);								// 前受相殺優先順位
		outMaeukekin.setString(JBSbatACIFI016.WRIB_YUSEN_JUN,		JACStrConst.WRIB_YUSEN_JUN_0);								// 割引優先順位
		outMaeukekin.setString(JBSbatACIFI016.WRIB_KKSHI_KH,		JACStrConst.WRIB_KKS_H);									// 割引繰越可否
		outMaeukekin.setString(JBSbatACIFI016.SVC_DTL_SKBT_NO,		JACStrConst.KARA_MOJI);										// サービス詳細識別番号
	
		// 出力判定フラグtrue
		outMaeukekin.setOutFlg(true); 

		// 出力共通電文の出力電文リストに追加する
		outputItem.addOutMapList(outMaeukekin);
	}

	/**
	 * 前受金エラーファイル出力処理を行います。
	 * @param mastMap 前受金相殺依頼情報
	 * @param outputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setErrFile(JBSbatServiceInterfaceMap mastMap, JBSbatOutputItem outputItem) throws Exception
	{
		JBSbatServiceInterfaceMap outErrFile = new JBSbatServiceInterfaceMap();

		// 項目設定
		outErrFile.setString(JBSbatACIFI016.SEIKY_KEI_NO, 			mastMap.getString(JBSbatACIFI009.SEIKY_KEI_NO));							// 請求先番号
		outErrFile.setString(JBSbatACIFI016.SEIKY_YM, 				mastMap.getString(JBSbatACIFI009.SEIKY_YM));								// 請求年月
		outErrFile.setString(JBSbatACIFI016.SEIRI_NO,				JACStrConst.KARA_MOJI);														// 割引サービス契約番号
		outErrFile.setString(JBSbatACIFI016.WRIB_SVC_KEI_NO,		JACStrConst.KARA_MOJI);														// 割引サービス契約番号
		outErrFile.setString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO,		JACStrConst.KARA_MOJI);														// 割引サービス対象契約番号
		outErrFile.setString(JBSbatACIFI016.SVC_NO, 				JACStrConst.KARA_MOJI);														// サービス番号
		outErrFile.setString(JBSbatACIFI016.OP_SVKEI_NO, 			JACStrConst.KARA_MOJI);														// オプションサービス契約番号
		outErrFile.setString(JBSbatACIFI016.SVC_SKBT_CD,			JACStrConst.KARA_MOJI);														// 料金サービス識別コード
		outErrFile.setString(JBSbatACIFI016.PRC_GRP_CD, 			mastMap.getString(JBSbatACIFI009.PRC_GRP_CD));								// 料金グループコード
		outErrFile.setString(JBSbatACIFI016.PCRS_CD, 				mastMap.getString(JBSbatACIFI009.PCRS_CD));									// 料金コースコード
		outErrFile.setString(JBSbatACIFI016.PRC_SVC_CD, 			mastMap.getString(JBSbatACIFI009.PRC_SVC_CD));								// 料金サービスコード
		outErrFile.setString(JBSbatACIFI016.PRC_KMK_CD, 			mastMap.getString(JBSbatACIFI009.PRC_KMK_CD));								// 料金項目コード
		outErrFile.setString(JBSbatACIFI016.COLLECT_PATTERN_CD, 	JACStrConst.KARA_MOJI);														// 徴収パターンコード
		outErrFile.setBigDecimal(JBSbatACIFI016.PRC, 				new BigDecimal(mastMap.getString(JBSbatACIFI009.MAEUKKIN_SOSAI_REQ_AMNT)));	// 料金
		outErrFile.setString(JBSbatACIFI016.USE_STAYMD, 			JACStrConst.KARA_MOJI);														// 利用開始日
		outErrFile.setString(JBSbatACIFI016.USE_ENDYMD, 			JACStrConst.KARA_MOJI);														// 利用終了日
		outErrFile.setString(JBSbatACIFI016.SVC_STAYMD, 			JACStrConst.KARA_MOJI);														// サービス開始日
		outErrFile.setString(JBSbatACIFI016.FIRST_CHRG_STAYMD,		JACStrConst.KARA_MOJI);														// 初回課金開始日
		outErrFile.setString(JBSbatACIFI016.SVC_DSL_YMD, 			JACStrConst.KARA_MOJI);														// サービス解約日 
		outErrFile.setString(JBSbatACIFI016.SVC_DLRE, 				JACStrConst.KARA_MOJI);														// サービス解約理由
		outErrFile.setString(JBSbatACIFI016.SVC_KAIHK_DAY,			JACStrConst.KARA_MOJI);														// サービス回復日
		outErrFile.setString(JBSbatACIFI016.USE_DAY_CNT,			JACStrConst.KARA_MOJI);														// 利用日数
		outErrFile.setString(JBSbatACIFI016.USE_FAIL_DAY_CNT,		JACStrConst.KARA_MOJI);														// 利用不可日数
		outErrFile.setString(JBSbatACIFI016.AIT_DIV,				JACStrConst.KARA_MOJI);														// 相対区分
		outErrFile.setString(JBSbatACIFI016.SIME_DAY,				JACStrConst.KARA_MOJI);														// 締め日
		outErrFile.setString(JBSbatACIFI016.USE_APLY_KH_CD,			JACStrConst.KARA_MOJI);														// 利用不可適用可否
		outErrFile.setString(JBSbatACIFI016.MAE_YUSEN_JUN,			JACStrConst.KARA_MOJI);														// 前受相殺優先順位
		outErrFile.setString(JBSbatACIFI016.WRIB_YUSEN_JUN,			JACStrConst.KARA_MOJI);														// 割引優先順位
		outErrFile.setString(JBSbatACIFI016.WRIB_KKSHI_KH,			JACStrConst.KARA_MOJI);														// 割引繰越可否
		outErrFile.setString(JBSbatACIFI016.SVC_DTL_SKBT_NO,		JACStrConst.KARA_MOJI);														// サービス詳細識別番号
		
		// 出力判定フラグtrue
		outErrFile.setOutFlg(true); 

		// 出力共通電文の出力電文リストに追加する
		outputItem.addOutMapList_2(outErrFile);
	}
	
	/**
	 * マッチングキーリストを取得します。
	 * @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(JBSbatACIFI009.SEIKY_KEI_NO)); 	// 請求先番号
		keyBufMast.append(mastMap.getString(JBSbatACIFI009.SEIKY_YM)); 		// 請求年月
		macthKeyList[0] = keyBufMast.toString(); 							// マッチングキー（マスタ）生成
		
		StringBuffer keyBufTran = new StringBuffer();
		
		keyBufTran.append(tranMap.getString(JBSbatACIFI015.SEIKY_KEI_NO)); 	// 請求先番号
		keyBufTran.append(tranMap.getString(JBSbatACIFI015.SEIKY_YM)); 		// 請求年月
		macthKeyList[1] = keyBufTran.toString(); 							// マッチングキー（トラン）生成
		
		return macthKeyList;
	}
	
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * @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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
