/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKKzkSvKeiInfTodayMerge
*	ソースファイル名	：JBSbatKKKzkSvKeiInfTodayMerge.java
*	作成者				：富士通　
*	作成日				：2012年11月16日
*＜機能概要＞
*	従量分サービス契約インターフェイスの当日分マージ処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/11/16	富士通		新規作成
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM159;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKKzkSvKeiInfTodayMerge extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg = false;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg = false;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg = false;

	/** キーマッチフラグ */
	private boolean KeyMatchFlg = false;

	/** フリー項目[マスタキー] **/
	private String mastKey = "";

	/** フリー項目[トランザクションキー] **/
	private String tranKey = "";

	/** マッチングキー退避領域 **/
	private String workKey = "";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		String[] freeItems = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		
		// フリー項目[マスタキー]を設定
		mastKey = freeItems[0];
		
		// フリー項目[トランザクションキー]を設定
		tranKey = freeItems[1];
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatServiceInterfaceMap inMap2, JBSbatOutputItem outputInItem) throws Exception
	{
		// 出力情報保持部品
		JBSbatOutputItem outItem = new JBSbatOutputItem();
		
		// 退避キーがブレイクした場合
		if (!(workKey.isEmpty())
			&& !(inMap == null)
			&& !(workKey.equals(inMap.getString(mastKey))))
		{
			// キーマッチフラグをクリアする
			KeyMatchFlg = false;
			// キー退避領域をクリアする
			workKey = "";
		}
		
		// マスタにのみレコードが存在する場合
		if (inMap2 == null)
		{
			// マッチング処理中の場合
			if (KeyMatchFlg)
			{
				// マスタファイルを次レコードに進める
				this.setMastProcFlg(true);
			} else
			{
				// 取得情報編集
				JBSbatServiceInterfaceMap outMap = setOutMap(inMap);
				// 出力フラグをON
				outMap.setOutFlg(true);
				// 変更前出力情報を格納
				outItem.addOutMapList(outMap);
				// マスタファイルを次レコードに進める
				this.setMastProcFlg(true);
			}
		// トランにのみレコードが存在する場合
		} else if (inMap == null)
		{
			// 取得情報編集
			JBSbatServiceInterfaceMap outMap = setOutMap(inMap2);
			// 出力フラグをON
			outMap.setOutFlg(true);
			// 変更前出力情報を格納
			outItem.addOutMapList(outMap);
			// トランファイルを次レコードに進める
			this.setTranProcFlg(true);
		// マスタ&トランにレコードが存在する場合
		} else
		{
			// マスタキーとトランキーがマッチする場合
			if (inMap.getString(mastKey).equals(inMap2.getString(tranKey)))
			{
				// トランレコードにて取得情報編集処理を行う
				JBSbatServiceInterfaceMap outMap = setOutMap(inMap2);
				// 出力フラグをON
				outMap.setOutFlg(true);
				// 変更前出力情報を格納
				outItem.addOutMapList(outMap);
				// ブレイクキーを退避させる
				workKey = inMap.getString(mastKey);
				// トランファイルを次レコードに進める
				this.setTranProcFlg(true);
				// キーマッチフラグをオンする
				KeyMatchFlg = true;
			// マスタキーとトランキーがアンマッチの場合
			} else
			{
				// マッチング処理中の場合
				if (KeyMatchFlg)
				{
					// マスタファイルを次レコードに進める
					this.setMastProcFlg(true);
				} else
				{
					// マスタキー ＜ トランキーの場合
					if(inMap.getString(mastKey).compareTo(inMap2.getString(tranKey)) < 0)
					{
						// マスタレコードにて取得情報編集処理を行う
						JBSbatServiceInterfaceMap outMap = setOutMap(inMap);
						// 出力フラグをON
						outMap.setOutFlg(true);
						// 変更前出力情報を格納
						outItem.addOutMapList(outMap);
						// マスタファイルを次レコードに進める
						this.setMastProcFlg(true);
					}
					// マスタキー ＞ トランキーの場合
					if(inMap.getString(mastKey).compareTo(inMap2.getString(tranKey)) > 0)
					{
						// トランレコードにて取得情報編集処理を行う
						JBSbatServiceInterfaceMap outMap = setOutMap(inMap2);
						// 出力フラグをON
						outMap.setOutFlg(true);
						// 変更前出力情報を格納
						outItem.addOutMapList(outMap);
						// トランファイルを次レコードに進める
						this.setTranProcFlg(true);
					}
				}
			}
		}
		return outItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * <dd>メソッド名	：出力ファイル設定
	 * <dd>メソッド説明	：1.ファイル編集対象項目を取得します。
	 *                    2.取得した項目を元にファイル設定を行います。
	 * @param  inMap     入力レコードデータ情報Map
	 * @param  rsltMap   課金先情報
	 * @return outMap    出力情報Map
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap setOutMap(JBSbatServiceInterfaceMap workMap) throws Exception 
	{
		// 出力情報Map
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 料金グループコード
		outMap.set(JBSbatKKIFM159.PRC_GRP_CD, workMap.getString(JBSbatKKIFM159.PRC_GRP_CD));
		// 料金コースコード
		outMap.set(JBSbatKKIFM159.PCRS_CD, workMap.getString(JBSbatKKIFM159.PCRS_CD));
		// 料金サービスコード
		outMap.set(JBSbatKKIFM159.PRC_SVC_CD, workMap.getString(JBSbatKKIFM159.PRC_SVC_CD));
		// 整理番号
		outMap.set(JBSbatKKIFM159.SEIRI_NO, workMap.getString(JBSbatKKIFM159.SEIRI_NO));
		// サービス契約番号
		outMap.set(JBSbatKKIFM159.SVC_KEI_NO, workMap.getString(JBSbatKKIFM159.SVC_KEI_NO));
		// サービス契約内訳番号
		outMap.set(JBSbatKKIFM159.SVC_KEI_UCWK_NO, workMap.getString(JBSbatKKIFM159.SVC_KEI_UCWK_NO));
		// 従属サービス番号
		outMap.set(JBSbatKKIFM159.JUZOKU_SVC_NO, workMap.getString(JBSbatKKIFM159.JUZOKU_SVC_NO));
		// 請求契約番号
		outMap.set(JBSbatKKIFM159.SEIKY_KEI_NO, workMap.getString(JBSbatKKIFM159.SEIKY_KEI_NO));
		// 割引サービス契約番号
		outMap.set(JBSbatKKIFM159.WRIB_SVC_KEI_NO, workMap.getString(JBSbatKKIFM159.WRIB_SVC_KEI_NO));
		// 電話番号
		outMap.set(JBSbatKKIFM159.TELNO, workMap.getString(JBSbatKKIFM159.TELNO));
		// 事業者契約用ＩＤ
		outMap.set(JBSbatKKIFM159.JIGYOSHA_KEI_ID, workMap.getString(JBSbatKKIFM159.JIGYOSHA_KEI_ID));
		// サービス開始日
		outMap.set(JBSbatKKIFM159.SVC_STAYMD, workMap.getString(JBSbatKKIFM159.SVC_STAYMD));
		// サービス解約日
		outMap.set(JBSbatKKIFM159.SVC_DSL_YMD, workMap.getString(JBSbatKKIFM159.SVC_DSL_YMD));
		// サービス解約理由
		outMap.set(JBSbatKKIFM159.SVC_DLRE_CD, workMap.getString(JBSbatKKIFM159.SVC_DLRE_CD));
		// サービス回復日
		outMap.set(JBSbatKKIFM159.KAIHK_YMD, workMap.getString(JBSbatKKIFM159.KAIHK_YMD));
		// サービスキャンセル日
		outMap.set(JBSbatKKIFM159.SVC_CANCEL_YMD, workMap.getString(JBSbatKKIFM159.SVC_CANCEL_YMD));
		// サービス休止日
		outMap.set(JBSbatKKIFM159.SVC_PAUSE_YMD, workMap.getString(JBSbatKKIFM159.SVC_PAUSE_YMD));
		// サービス休止解除日
		outMap.set(JBSbatKKIFM159.SVC_PAUSE_RLS_YMD, workMap.getString(JBSbatKKIFM159.SVC_PAUSE_RLS_YMD));
		// サービス利用不可開始日
		outMap.set(JBSbatKKIFM159.USE_FAIL_STAYMD, workMap.getString(JBSbatKKIFM159.USE_FAIL_STAYMD));
		// サービス利用不可終了日
		outMap.set(JBSbatKKIFM159.USE_FAIL_ENDYMD, workMap.getString(JBSbatKKIFM159.USE_FAIL_ENDYMD));
		// 課金開始日
		outMap.set(JBSbatKKIFM159.CHRG_STAYMD, workMap.getString(JBSbatKKIFM159.CHRG_STAYMD));
		// 初回課金開始日
		outMap.set(JBSbatKKIFM159.FIRST_CHRG_STAYMD, workMap.getString(JBSbatKKIFM159.FIRST_CHRG_STAYMD));
		// 課金終了日
		outMap.set(JBSbatKKIFM159.CHRG_ENDYMD, workMap.getString(JBSbatKKIFM159.CHRG_ENDYMD));
		// ＶＡ出荷日
		outMap.set(JBSbatKKIFM159.VA_SHUKKA_YMD, workMap.getString(JBSbatKKIFM159.VA_SHUKKA_YMD));
		// サービス継続月数
		outMap.set(JBSbatKKIFM159.SVC_KZK_MON_CNT, workMap.getBigDecimal(JBSbatKKIFM159.SVC_KZK_MON_CNT));
		// サービス継続日数
		outMap.set(JBSbatKKIFM159.SVC_KZK_DAY_CNT, workMap.getBigDecimal(JBSbatKKIFM159.SVC_KZK_DAY_CNT));
		// 課金継続月数
		outMap.set(JBSbatKKIFM159.CHRG_KZK_MON_CNT, workMap.getBigDecimal(JBSbatKKIFM159.CHRG_KZK_MON_CNT));
		// 課金継続日数
		outMap.set(JBSbatKKIFM159.CHRG_KZK_DAY_CNT, workMap.getBigDecimal(JBSbatKKIFM159.CHRG_KZK_DAY_CNT));
		// 契約数
		outMap.set(JBSbatKKIFM159.KEI_CNT, workMap.getBigDecimal(JBSbatKKIFM159.KEI_CNT));
		// 月中最大契約数
		outMap.set(JBSbatKKIFM159.MON_MAX_KEI_CNT, workMap.getBigDecimal(JBSbatKKIFM159.MON_MAX_KEI_CNT));
		// 相対区分
		outMap.set(JBSbatKKIFM159.AITAI_DIV, workMap.getString(JBSbatKKIFM159.AITAI_DIV));
		// 締め日
		outMap.set(JBSbatKKIFM159.SIME_DAY, workMap.getString(JBSbatKKIFM159.SIME_DAY));
		// マンションＩＤ
		outMap.set(JBSbatKKIFM159.MANSION_ID, workMap.getString(JBSbatKKIFM159.MANSION_ID));
		// 提供方式契約番号
		outMap.set(JBSbatKKIFM159.TK_HOSHIKI_KEI_NO, workMap.getString(JBSbatKKIFM159.TK_HOSHIKI_KEI_NO));
		// 加入者契約支払方式コード
		outMap.set(JBSbatKKIFM159.KANYU_KEI_PAY_HOSHIKI_CD, workMap.getString(JBSbatKKIFM159.KANYU_KEI_PAY_HOSHIKI_CD));
		// 総戸数
		outMap.set(JBSbatKKIFM159.TTL_KOSU, workMap.getString(JBSbatKKIFM159.TTL_KOSU));
		
		return outMap;
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * @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;
	}
}
