/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKsiMdgcSksComiKeiInfHk
*	ソースファイル名	：JBSbatACKsiMdgcSksComiKeiInfHk.java
*	作成者				：富士通　
*	作成日				：2011年07月28日
*＜機能概要＞
*　強制窓口請求書発行手数料契約情報付加部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/28   富士通		新規作成
*	v4.00.00	2012/12/12   FJ）加島	【ST3-2012-0000431】マッチングしない場合、ファイル出力を行わないよう修正
*	v4.00.01	2013/04/19   FJ) 早崎	【ST6-2013-0000048】エラーメッセージにキー情報を出力
*	v4.00.02	2013/04/30   FJ) 小柴	【TG1-2013-0000272】日付項目の出力仕様を修正
*	v4.00.03	2013/05/08   FJ) 垣内	【TG1-2013-0000272】料金計算日を基にした請求年月の月初月末日に修正
*	v8.00.00	2013/12/13   FJ) 鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*	v9.00.00	2014/04/29   FJ) 狭間	【ANK-2054-00-00】スマートリンク端末補償対応
*	v24.00.00	2015/09/03   FJ）酒井	【ANK-2691-00-00】請求書発行手数料の課金方式の変更
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM053;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.table.JBSbatAC_M_PNLTY;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKsiMdgcSksComiKeiInfHk extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 既出力ファイルフラグ */
	private boolean kiOutputFlg = false;
	
	/** ログ出力用マップ名 マスタ*/
// v24.00.00 ANK-2691-00-00 MOD STA
//	private static String MAST_MAP_NAME = "窓口請求書発行手数料";
	private static String MAST_MAP_NAME = "請求書発行手数料";
// v24.00.00 ANK-2691-00-00 MOD END
	
	/** ログ出力用マップ名 トラン*/
	private static String TRAN_MAP_NAME = "契約情報";
	
	/** 月初、月末保持用 */
	private String[] startEndDate = null;
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// アクセス部品の初期化
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		// 料金計算日を基にした請求年月を取得
		String seikyYm = schdlUtil.getBillDate(this.opeDate, JACStrConst.EVENT_CD_PRC_CALC_DAY);
		// 月初日、末日を取得する
		startEndDate = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		// 使用後の部品をクローズ
		schdlUtil.close();
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		
		// 入力T、入力Mともにnullの場合処理を抜ける。
		if(mastMap == null && tranMap == null)
		// 入力M、入力T共にNullの場合は処理を抜ける。
		{
			return(outputInItem);
		}
		else if(mastMap == null)
		// 入力MのみNullの場合
		{
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			return(outputInItem);
		}
		else if(tranMap == null)
		// 入力TのみNullの場合
		{
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			
			// 既出力フラグ　＝　false（未出力）の場合
			if(!kiOutputFlg)
			{
				// エラーログ出力（エラーコード："EACB0840KW"（関連エラー））
				String[] outCntMsg = {MAST_MAP_NAME + "(" + mastMap.getString(JBSbatACIFI016.SEIKY_KEI_NO) + ")", TRAN_MAP_NAME};
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0840KW, outCntMsg);
			}
			// 既出力フラグ　＝　false（未出力）に設定
			kiOutputFlg = false;					// 未出力
			
			return(outputInItem);
		}
		// マスタキー
		String mastKey = mastMap.getString(JBSbatACIFI016.SEIKY_KEI_NO);	// 請求先番号
		
		// トランキー
		String tranKey = tranMap.getString(JBSbatACIFM053.SEIKY_KEI_NO);	// 請求先番号
		
		// マッチした場合
		if(mastKey.equals(tranKey))
		{
			// 既出力フラグ　＝　false（未出力）の場合
			if(!kiOutputFlg)
			{
				// レコード出力
				this.setOuptputItem(mastMap, tranMap, outputInItem);
				
				// 既出力フラグ　＝　true（既出力）に設定
				kiOutputFlg = true;					// 既出力
			}
			// キーマッチ処理フラグを設定する
			this.setMatchProcFlg(true);
		}
		// 入力M＜入力Tの場合
		else if(mastKey.compareTo(tranKey) < 0)
		{
			// 既出力フラグ　＝　false（未出力）の場合
			if(!kiOutputFlg)
			{
				// エラーログ出力（エラーコード："EACB0840KW"（関連エラー））
				String[] outCntMsg = {MAST_MAP_NAME + "(" + mastKey + ")", TRAN_MAP_NAME};
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0840KW, outCntMsg);
			}
			
			// 既出力フラグ　＝　false（未出力）に設定
			kiOutputFlg = false;					// 未出力
			
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
		}
		// 上記以外の場合
		else
		{
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
		}
		
		return(outputInItem);
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	
	/**
	 * 出力情報を設定します。
	 * 
	 * @param mastMap 入力M
	 * @param tranMap 入力T
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private void setOuptputItem(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap(); // 出力情報
		
		outputMap.setString(JBSbatACIFI016.SEIKY_KEI_NO,				mastMap.getString(JBSbatACIFI016.SEIKY_KEI_NO)); 			// 請求先番号
		outputMap.setString(JBSbatACIFI016.SEIKY_YM,					mastMap.getString(JBSbatACIFI016.SEIKY_YM)); 				// 請求年月
		outputMap.setString(JBSbatACIFI016.SEIRI_NO,					mastMap.getString(JBSbatACIFI016.SEIRI_NO)); 				// 整理番号
		outputMap.setString(JBSbatACIFI016.WRIB_SVC_KEI_NO,				mastMap.getString(JBSbatACIFI016.WRIB_SVC_KEI_NO)); 		// 割引サービス契約番号
		outputMap.setString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO,			mastMap.getString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO)); 		// 割引サービス対象契約番号
		outputMap.setString(JBSbatACIFI016.SVC_NO,						mastMap.getString(JBSbatACIFI016.SVC_NO)); 					// サービス番号
		outputMap.setString(JBSbatACIFI016.OP_SVKEI_NO,					mastMap.getString(JBSbatACIFI016.OP_SVKEI_NO)); 			// オプションサービス契約番号
		outputMap.setString(JBSbatACIFI016.SVC_SKBT_CD,					mastMap.getString(JBSbatACIFI016.SVC_SKBT_CD)); 			// 料金サービス識別コード
		outputMap.setString(JBSbatACIFI016.PRC_GRP_CD,					mastMap.getString(JBSbatACIFI016.PRC_GRP_CD)); 				// 料金グループコード
		outputMap.setString(JBSbatACIFI016.PCRS_CD,						mastMap.getString(JBSbatACIFI016.PCRS_CD)); 				// 料金コースコード
		outputMap.setString(JBSbatACIFI016.PRC_SVC_CD,					mastMap.getString(JBSbatACIFI016.PRC_SVC_CD));				// 料金サービスコード
		outputMap.setString(JBSbatACIFI016.PRC_KMK_CD,					mastMap.getString(JBSbatAC_M_PNLTY.PRC_KMK_CD));			// 料金項目コード
		outputMap.setString(JBSbatACIFI016.COLLECT_PATTERN_CD,			mastMap.getString(JBSbatACIFI016.COLLECT_PATTERN_CD)); 		// 徴収パターンコード
		outputMap.setBigDecimal(JBSbatACIFI016.PRC,						mastMap.getBigDecimal(JBSbatACIFI016.PRC)); 				// 料金
		
		outputMap.setString(JBSbatACIFI016.USE_STAYMD,					startEndDate[0]); 											// 利用開始日
		outputMap.setString(JBSbatACIFI016.USE_ENDYMD,					startEndDate[1]); 											// 利用終了日
		outputMap.setString(JBSbatACIFI016.SVC_STAYMD,					tranMap.getString(JBSbatACIFM053.SVC_STAYMD)); 				// サービス開始日
		outputMap.setString(JBSbatACIFI016.FIRST_CHRG_STAYMD,			startEndDate[0]);	 										// 初回課金開始日
		outputMap.setString(JBSbatACIFI016.SVC_DSL_YMD,					JACStrConst.KARA_MOJI); 									// サービス解約日
		outputMap.setString(JBSbatACIFI016.SVC_DLRE,					JACStrConst.KARA_MOJI);										// サービス解約理由
		outputMap.setString(JBSbatACIFI016.SVC_KAIHK_DAY,				JACStrConst.KARA_MOJI); 									// サービス回復日
		outputMap.setBigDecimal(JBSbatACIFI016.USE_DAY_CNT,				tranMap.getBigDecimal(JBSbatACIFM053.USE_DAY_CNT)); 		// 利用日数
		outputMap.setBigDecimal(JBSbatACIFI016.USE_FAIL_DAY_CNT,		tranMap.getBigDecimal(JBSbatACIFM053.USE_FAIL_DAY_CNT));	// 利用不可日数
		outputMap.setString(JBSbatACIFI016.AIT_DIV,						tranMap.getString(JBSbatACIFM053.AIT_DIV));					// 相対区分
		outputMap.setString(JBSbatACIFI016.SIME_DAY,					tranMap.getString(JBSbatACIFM053.SIME_DAY)); 				// 締め日
		
		outputMap.setString(JBSbatACIFI016.USE_APLY_KH_CD,				mastMap.getString(JBSbatACIFI016.USE_APLY_KH_CD)); 			// 利用不可適用可否
		outputMap.setString(JBSbatACIFI016.MAE_YUSEN_JUN,				mastMap.getString(JBSbatACIFI016.MAE_YUSEN_JUN)); 			// 前受相殺優先順位
		outputMap.setString(JBSbatACIFI016.WRIB_YUSEN_JUN,				mastMap.getString(JBSbatACIFI016.WRIB_YUSEN_JUN)); 			// 割引優先順位
		outputMap.setString(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN,		mastMap.getString(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN)); 	// 上限判定優先順位
		outputMap.setString(JBSbatACIFI016.WRIB_KKSHI_KH,				JACStrConst.WRIB_KKS_H); 									// 割引繰越可否
		outputMap.setString(JBSbatACIFI016.SVC_DTL_SKBT_NO,				mastMap.getString(JBSbatACIFM053.SVC_DTL_SKBT_NO)); 		// サービス詳細識別番号
		
		outputMap.setOutFlg(true);		// 出力フラグをtrue
		
		// 出力レコード情報を設定する
		outputInItem.addOutMapList(outputMap);
	}
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * @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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
