/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHUcwkInfoSabunChsht
*	ソースファイル名	：JBSbatCHUcwkInfoSabunChsht.java
*	作成者				：富士通　
*	作成日				：2011年07月06日
*＜機能概要＞
*　内訳情報差分抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/06   富士通		新規作成
*	v3.00		2012/05/25   FJ）永田	【ANK-0024-04-00】	
*	v3.01		2012/08/11   FJ）後藤	【ST2-2012-0001479】工事遅延一意制約対応
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.common.JPCBatCommon;
import eo.business.util.file.JBSbatCHIFI005;
import eo.business.util.file.JBSbatCHIFM049;
import eo.business.util.file.JBSbatCHIFM061;
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 JBSbatCHUcwkInfoSabunChsht extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．トランキー */
	private String bkTranKey = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文（請求債権内訳）
	 * @param tranMap　入力電文（請求内訳情報）
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報（内訳情報差分）
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;

		// 入力Ｍのみ存在する
		if (mastMap != null && tranMap == null)
		{
			StringBuilder mastKey = new StringBuilder();
			// 請求契約番号
			mastKey.append(mastMap.getString(JBSbatCHIFM049.SEIKY_KEI_NO));
			// 請求年月
			mastKey.append(mastMap.getString(JBSbatCHIFM049.SEIKY_YM));

			if(bkTranKey != null && mastKey.toString().compareTo(bkTranKey) == 0)
			{
				// 当日分にない場合[マスタのみ]：請求内訳情報差分作成（削除）
				makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_DEL);
			}
			this.setMastProcFlg(true);
		}

		// 入力Ｔのみ存在する
		else if (mastMap == null && tranMap != null)
		{
			this.setTranProcFlg(true);

			// 当日分のみの場合[トランのみ]：請求内訳情報差分作成（追加）
			makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_ADD);
		}

		// 入力Ｍ、入力Ｔともに存在する
		else
		{
			// 第1マッチングキー（請求契約番号）取得
			StringBuilder mastKey = new StringBuilder();
			StringBuilder tranKey = new StringBuilder();
			
			// 請求契約番号
			mastKey.append(mastMap.getString(JBSbatCHIFM049.SEIKY_KEI_NO));
			tranKey.append(tranMap.getString(JBSbatCHIFI005.SEIKY_KEI_NO));
			
			// 請求年月
			mastKey.append(mastMap.getString(JBSbatCHIFM049.SEIKY_YM));
			tranKey.append(tranMap.getString(JBSbatCHIFI005.SEIKY_YM));
			
			// 第1マッチング処理（M.請求契約番号+合算請求年月 = T.請求契約番号+請求年月）
			if (mastKey.toString().compareTo(tranKey.toString()) == 0)
			{
				// 第2マッチングキー
				StringBuilder sbMastSecKey = new StringBuilder();
				StringBuilder sbTranSecKey = new StringBuilder();

				// 整理番号
				sbMastSecKey.append(mastMap.getString(JBSbatCHIFM049.SEIRI_NO));
				sbTranSecKey.append(tranMap.getString(JBSbatCHIFI005.SEIRI_NO));

				// サービス契約番号
				sbMastSecKey.append(mastMap.getString(JBSbatCHIFM049.SVC_KEI_NO));
				sbTranSecKey.append(tranMap.getString(JBSbatCHIFI005.SVC_NO));

				// 料金グループコード
				sbMastSecKey.append(mastMap.getString(JBSbatCHIFM049.PRC_GRP_CD));
				sbTranSecKey.append(tranMap.getString(JBSbatCHIFI005.PRC_GRP_CD));

				// 料金コースコード
				sbMastSecKey.append(mastMap.getString(JBSbatCHIFM049.PCRS_CD));
				sbTranSecKey.append(tranMap.getString(JBSbatCHIFI005.PCRS_CD));

				// 料金サービスコード
				sbMastSecKey.append(mastMap.getString(JBSbatCHIFM049.PRC_SVC_CD));
				sbTranSecKey.append(tranMap.getString(JBSbatCHIFI005.PRC_SVC_CD));

				// 料金項目コード
				sbMastSecKey.append(mastMap.getString(JBSbatCHIFM049.PRC_KMK_CD));
				sbTranSecKey.append(tranMap.getString(JBSbatCHIFI005.PRC_KMK_CD));

				// 第2マッチング処理（請求債権内訳 = 請求内訳情報）
				if (sbMastSecKey.toString().compareTo(sbTranSecKey.toString()) == 0)
				{
					this.setMatchProcFlg(true);
					this.setMastProcFlg(true);
					bkTranKey = tranKey.toString();
					
					// 利用期間開始年月日取得
					String mastUseStaYmd = mastMap.getString(JBSbatCHIFM049.USE_STAYMD);
					String tranUseStaYmd = tranMap.getString(JBSbatCHIFI005.USE_STA_YMD);

					// 利用期間終了年月日取得
					String mastUseEndYmd = mastMap.getString(JBSbatCHIFM049.USE_ENDYMD);
					String tranUseEndYmd = tranMap.getString(JBSbatCHIFI005.USE_END_YMD);

					// 金額取得
					BigDecimal mastAmnt = mastMap.getBigDecimal(JBSbatCHIFM049.AMNT);
					BigDecimal tranAmnt = tranMap.getBigDecimal(JBSbatCHIFI005.AMNT);

					// 利用期間開始年月日、利用期間終了年月日、金額のいずれかが変わっている場合
					if (mastUseStaYmd.compareTo(tranUseStaYmd) != 0
							|| mastUseEndYmd.compareTo(tranUseEndYmd) != 0
							|| mastAmnt.compareTo(tranAmnt) != 0)
					{
						// 請求内訳情報差分作成（更新）
						makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_UPD);
					}
				}

				// 第2マッチング処理（請求債権内訳 < 請求内訳情報）
				else if (sbMastSecKey.toString().compareTo(sbTranSecKey.toString()) < 0)
				{
					this.setMastProcFlg(true);

					// 当日分にない場合[マスタのみ]：請求内訳情報差分作成（削除）
					makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_DEL);
				}

				// 第2マッチング処理（請求債権内訳 > 請求内訳情報）
				else if (sbMastSecKey.toString().compareTo(sbTranSecKey.toString()) > 0)
				{
					this.setTranProcFlg(true);
					bkTranKey = tranKey.toString();
					// 当日分のみの場合[トランのみ]：請求内訳情報差分作成（追加）
					makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_ADD);
				}
			}
			// 第1マッチング処理「入力Ｍ＜入力Ｔ（Ｍのみ）」
			else if (mastKey.toString().compareTo(tranKey.toString()) < 0)
			{
				if(bkTranKey != null && mastKey.toString().compareTo(bkTranKey) == 0)
				{
					// 当日分にない場合[マスタのみ]：請求内訳情報差分作成（削除）
					makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_DEL);
				}
				
				this.setMastProcFlg(true);
			}
			// 第1マッチング処理「入力Ｍ＞入力Ｔ（Ｔのみ）」
			else
			{
				this.setTranProcFlg(true);
				bkTranKey = tranKey.toString();

				// 当日分のみの場合[トランのみ]：請求内訳情報差分作成（追加）
				makeUcwkInfoSabun(mastMap, tranMap, outputInItem, JACStrConst.INFO_UPDATE_FLG_ADD);
			}
		}

		assert outputInItem != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][outputInItem=" + outputInItem.getOutMapList().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

		return outputInItem;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 請求内訳情報差分を作成する。
	 * @param mMap 請求債権内訳
	 * @param tMap 請求内訳情報
	 * @param outputInItem
	 * @param updInfoFlg 情報更新フラグ
	 */
	private void makeUcwkInfoSabun(JBSbatServiceInterfaceMap mMap, JBSbatServiceInterfaceMap tMap, JBSbatOutputItem outputInItem, String infoUpdFlg)
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeUcwkInfoSabun][infoUpdFlg=" + infoUpdFlg + "]");

		JBSbatServiceInterfaceMap ucwkInfoSabunMap = new JBSbatServiceInterfaceMap();

		// 更新フラグが更新・追加の場合、請求内訳情報をセットする
		if (infoUpdFlg.equals(JACStrConst.INFO_UPDATE_FLG_UPD) || infoUpdFlg.equals(JACStrConst.INFO_UPDATE_FLG_ADD))
		{
			// 請求契約番号
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SEIKY_KEI_NO, 	tMap.get(JBSbatCHIFI005.SEIKY_KEI_NO));
			// 請求年月
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SEIKY_YM,	 	tMap.get(JBSbatCHIFI005.SEIKY_YM));
			// 整理番号
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SEIRI_NO, 		tMap.get(JBSbatCHIFI005.SEIRI_NO));
			// サービス番号
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SVC_KEI_NO, 	tMap.get(JBSbatCHIFI005.SVC_NO));
			// 料金グループコード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PRC_GRP_CD, 	tMap.get(JBSbatCHIFI005.PRC_GRP_CD));
			// 料金コースコード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PCRS_CD, 		tMap.get(JBSbatCHIFI005.PCRS_CD));
			// 料金サービスコード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PRC_SVC_CD, 	tMap.get(JBSbatCHIFI005.PRC_SVC_CD));
			// 料金項目コード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PRC_KMK_CD, 	tMap.get(JBSbatCHIFI005.PRC_KMK_CD));
			// 利用期間開始年月日
			ucwkInfoSabunMap.set(JBSbatCHIFM061.USE_STA_YMD, 	tMap.get(JBSbatCHIFI005.USE_STA_YMD));
			// 利用期間終了年月日
			ucwkInfoSabunMap.set(JBSbatCHIFM061.USE_END_YMD, 	tMap.get(JBSbatCHIFI005.USE_END_YMD));
			// 金額
			ucwkInfoSabunMap.set(JBSbatCHIFM061.AMNT, 			tMap.get(JBSbatCHIFI005.AMNT));
		}
		// 更新フラグが削除の場合、請求債権内訳をセットする
		else if (infoUpdFlg.equals(JACStrConst.INFO_UPDATE_FLG_DEL))
		{
			// 請求契約番号
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SEIKY_KEI_NO, 	mMap.get(JBSbatCHIFM049.SEIKY_KEI_NO));
			// 請求年月
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SEIKY_YM, 		mMap.get(JBSbatCHIFM049.SEIKY_YM));
			// 整理番号
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SEIRI_NO, 		mMap.get(JBSbatCHIFM049.SEIRI_NO));
			// サービス番号
			ucwkInfoSabunMap.set(JBSbatCHIFM061.SVC_KEI_NO, 	mMap.get(JBSbatCHIFM049.SVC_KEI_NO));
			// 料金グループコード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PRC_GRP_CD, 	mMap.get(JBSbatCHIFM049.PRC_GRP_CD));
			// 料金コースコード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PCRS_CD, 		mMap.get(JBSbatCHIFM049.PCRS_CD));
			// 料金サービスコード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PRC_SVC_CD, 	mMap.get(JBSbatCHIFM049.PRC_SVC_CD));
			// 料金項目コード
			ucwkInfoSabunMap.set(JBSbatCHIFM061.PRC_KMK_CD, 	mMap.get(JBSbatCHIFM049.PRC_KMK_CD));
			// 利用期間開始年月日
			ucwkInfoSabunMap.set(JBSbatCHIFM061.USE_STA_YMD, 	mMap.get(JBSbatCHIFM049.USE_STAYMD));
			// 利用期間終了年月日
			ucwkInfoSabunMap.set(JBSbatCHIFM061.USE_END_YMD, 	mMap.get(JBSbatCHIFM049.USE_ENDYMD));
			// 金額
			ucwkInfoSabunMap.set(JBSbatCHIFM061.AMNT, 			mMap.get(JBSbatCHIFM049.AMNT));
		}

		// 情報更新フラグ
		ucwkInfoSabunMap.set(JBSbatCHIFM061.INFO_UPD_FLG, infoUpdFlg);
		
		// 出力フラグを設定
		ucwkInfoSabunMap.setOutFlg(true);
		
		// 出力共通電文に設定
		outputInItem.addOutMapList(ucwkInfoSabunMap);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeUcwkInfoSabun]");

		return;
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
