/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSBatACTelnoGuideUseChrgInfoTrkmSvcUcwkHuka
*	ソースファイル名	：JBSBatACTelnoGuideUseChrgInfoTrkmSvcUcwkHuka.java
*	作成者				：富士通　
*   日付                ：2024年05月17日
*＜機能概要＞
*　電話番号案内利用課金情報取込サービス内訳情報付加部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*  v71.00.00   2024/05/17  FJ)吉田賢	【ANK-4497-00-00】電話番号案内の課金情報連携変更対応
*  v71.00.00   2024/07/02  FJ)上島      【IT1-2024-0000017】電話番号案内の課金情報連携変更対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFM368;
import eo.business.util.file.JBSbatACIFM369;
import eo.common.constant.JACStrConst;
import eo.common.util.JCHStringUtil;
import eo.common.util.JPCUtilCommon;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* 電話番号案内利用課金情報取込サービス内訳情報付加 <p>
*<BR>
* @author 富士通
*/
public class JBSbatACTelnoGuideUseChrgInfoTrkmSvcUcwkHuka extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	// 2024/07/02 IT1-2024-0000017 上島 DEL START
//	// ログ出力用ファイル名
//	/** マスタファイル名 */ 
//	private static final String MAST_FILE_NAME = "電話番号案内利用課金情報取込データファイル";
//	
//	/** トランファイル名 */
//	private static final String TRAN_FILE_NAME = "電話番号案内利用課金情報取込付加情報ファイル";
	// 2024/07/02 IT1-2024-0000017 上島 DEL END
	// ======================
	// =====共通変数情報=====
	// ======================
	/** 出力情報；電話番号 */
	private String outputInfoTelNo = JACStrConst.KARA_MOJI;
	/** 出力情報；個人法人番号帯コード */
	private String outputInfoKojinHojinTlnTaiCd = JACStrConst.KARA_MOJI;
	/** 出力情報；サービス契約番号 */
	private String outputInfoSvcKeiNo = JACStrConst.KARA_MOJI;
	/** 出力情報；サービス開始日 */
	private String outputInfoSvcStaYmd = JACStrConst.KARA_MOJI;
	/** 出力情報；サービス終了日 */
	private String outputInfoSvcEndYmd = JACStrConst.KARA_MOJI;
	
	/**
	 * 初期処理
	 * @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, "[S][initial][opeDate=" + super.opeDate + "]");

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @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)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍのみ存在する]");
			
			// 出力
			makeOutputData(mastMap, new JBSbatServiceInterfaceMap(), outputInItem);
			
			// マスタ処理フラグ→true
			this.setMastProcFlg(true);
			
			String mastKey = mastMap.getString(JBSbatACIFM368.HASINSHA_TELNO);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][mastKey = " + mastKey + "]");
			
		}
		// 入力Ｔのみ存在する
		// 取込ファイルのレコードが回りきり、アンロードファイルにまだ残レコードが存在する状態
		else if (mastMap == null && tranMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｔのみ存在する]");
			
			// トラン処理フラグ→true
			this.setTranProcFlg(true);
			
			String tranKey = tranMap.getString(JBSbatACIFM369.TELNO);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][tranKey = " + tranKey + "]");
		}
		// 入力Ｍ、入力Ｔともに存在する
		else
		{
			String mastKey = mastMap.getString(JBSbatACIFM368.HASINSHA_TELNO);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][mastKey = " + mastKey + "]");
			
			String tranKey = JPCUtilCommon.fillZero(tranMap.getString(JBSbatACIFM369.TELNO), 11, false);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][tranKey = " + tranKey + "]");
			
			// 入力Ｍ＝入力Ｔ（マッチ）
			// 比較対象の電話番号が一致しているので、捜査域に達した状態
			if (mastKey.compareTo(tranKey) == 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＝入力Ｔ（マッチ）]");
				
				// key.電話番号が一致したら
				// 電話番号を退避する
				outputInfoTelNo = tranMap.getString(JBSbatACIFM369.TELNO);
				outputInfoKojinHojinTlnTaiCd = tranMap.getString(JBSbatACIFM369.KOJIN_HOJIN_TLN_TAI_CD);
				
				// サービス契約番号が空の場合
				if(JCHStringUtil.isNullBlank(tranMap.getString(JBSbatACIFM369.SVC_KEI_NO)))
				{
					// 対応するサービスがないとして出力する
					// ・サービス契約番号は空
					// ・サービス開始日は空
					// ・サービス終了日は空
					// 出力
					makeOutputData(mastMap, tranMap, outputInItem);
					// 退避初期化処理
					initInfo();
					
					// マスタ処理フラグ→true
					this.setMastProcFlg(true);
					return outputInItem;
				}
				else
				{
					// 最初のレコードを一旦退避する（データが見つかれば、後続処理で正しいものを設定する）
					if(JCHStringUtil.isNullBlank(outputInfoSvcKeiNo))
					{
						outputInfoSvcKeiNo = tranMap.getString(JBSbatACIFM369.SVC_KEI_NO);
					}
				}
				
				// マスタ．発側終了日
				String hashinEndYmd = mastMap.getString(JBSbatACIFM368.HASHIN_END_YMD);
				// トラン．サービス開始日
				String svcStaYmd = tranMap.getString(JBSbatACIFM369.SVC_STA_YMD);
				// トラン．サービス終了日
				String svcEndYmd = tranMap.getString(JBSbatACIFM369.SVC_END_YMD);
				
				// サービス開始日 ＞ 発側終了日の場合、
				if(JPCUtilCommon.isFutureDate(svcStaYmd, hashinEndYmd, "0"))
				{
					// 対象データより未来のデータのため、トランを進める
					// トラン処理フラグ→true
					this.setTranProcFlg(true);
				}
				// サービス開始日 ≦ 発側終了日 ≦ サービス終了日の場合
				else if(JPCUtilCommon.isPastDate(svcStaYmd, hashinEndYmd, "1") && JPCUtilCommon.isFutureDate(svcEndYmd, hashinEndYmd, "1"))
				{
					// 対象データであると判断する
					// サービス契約番号を退避する
					outputInfoSvcKeiNo = tranMap.getString(JBSbatACIFM369.SVC_KEI_NO);
					// サービス開始日を退避する
					outputInfoSvcStaYmd = tranMap.getString(JBSbatACIFM369.SVC_STA_YMD);
					// サービス終了日を退避する
					outputInfoSvcEndYmd = tranMap.getString(JBSbatACIFM369.SVC_END_YMD);
					
					// 出力
					makeOutputData(mastMap, tranMap, outputInItem);
					// 退避初期化処理
					initInfo();
					
					// マスタ処理フラグ→true
					this.setMastProcFlg(true);
				}
				// 上記以外（サービス終了日 ＜ 発側終了日）の場合、
				else
				{
					// 対象データより過去のデータのため、
					// 発側終了日に該当するデータがなかったとして出力する
					// ・サービス契約番号は最初にヒットしたもの
					// ・サービス開始日は空
					// ・サービス終了日は空
					// 出力
					makeOutputData(mastMap, tranMap, outputInItem);
					
					// マスタ処理フラグ→true
					this.setMastProcFlg(true);
				}
			}
			// 入力Ｍ＜入力Ｔ
			// 情報付加したい対象となる電話番号（入力ファイル側レコード）に対して、マッチング対象のアンロードファイルの捜査域外へ達したため
			// アンロード側には見るべきレコードがない状態
			else if (mastKey.compareTo(tranKey) < 0)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＜入力Ｔ]");
				
				// 出力
				makeOutputData(mastMap, new JBSbatServiceInterfaceMap(), outputInItem);
				// 退避初期化処理
				initInfo();
				
				// マスタ処理フラグ→true
				this.setMastProcFlg(true);
				
			}
			// 入力Ｍ＞入力Ｔ
			// 情報付加したい対象となる電話番号（入力ファイル側レコード）に対して、マッチング対象のアンロードファイルの捜査域へ達していない状態
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力Ｍ、入力Ｔともに存在する][入力Ｍ＞入力Ｔ]");
				// トラン処理フラグ→true
				this.setTranProcFlg(true);
				
			}
		}
		
		assert outputInItem != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][outputInItem=" + outputInItem.getOutMapList().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * キー情報を初期化します。
	 * 
	 */
	private void initInfo()
	{
		outputInfoTelNo = JACStrConst.KARA_MOJI;
		outputInfoKojinHojinTlnTaiCd = JACStrConst.KARA_MOJI;
		outputInfoSvcKeiNo = JACStrConst.KARA_MOJI;
		outputInfoSvcStaYmd = JACStrConst.KARA_MOJI;
		outputInfoSvcEndYmd = JACStrConst.KARA_MOJI;
	}
	
	
	/**
	 * 出力データを作成します。
	 * 
	 * @param mastMap 入力電文
	 * @param tranMap 入力電文
	 * @param outputInItem  出力電文
	 * @param kagenSkbtCd 加減識別コード
	 * @throws Exception
	 */
	private void makeOutputData(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputData]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][mastMap=" + mastMap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][tranMap=" + tranMap.getMap().toString() + "]");

		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.setString(JBSbatACIFM368.RECODE_KBN				, mastMap.getString(JBSbatACIFM368.RECODE_KBN));				// レコード区分
		outMap.setString(JBSbatACIFM368.JIGYOSHA_CD				, mastMap.getString(JBSbatACIFM368.JIGYOSHA_CD));				// 事業者コード
		outMap.setString(JBSbatACIFM368.DATA_MAKE_YMD			, mastMap.getString(JBSbatACIFM368.DATA_MAKE_YMD));				// データ作成日
		outMap.setString(JBSbatACIFM368.DATA_MAKE_TIME			, mastMap.getString(JBSbatACIFM368.DATA_MAKE_TIME));			// データ作成時刻
		outMap.setString(JBSbatACIFM368.RECODE_NO				, mastMap.getString(JBSbatACIFM368.RECODE_NO));					// レコード番号
		outMap.setString(JBSbatACIFM368.HASINSHA_TELNO			, mastMap.getString(JBSbatACIFM368.HASINSHA_TELNO));			// 発信者電話番号
		outMap.setString(JBSbatACIFM368.INCOMING_TELNO			, mastMap.getString(JBSbatACIFM368.INCOMING_TELNO));			// 着信電話番号
		outMap.setString(JBSbatACIFM368.HASHIN_AREA_CD			, mastMap.getString(JBSbatACIFM368.HASHIN_AREA_CD));			// 発側エリアコード
		outMap.setString(JBSbatACIFM368.INCOMING_AREA_CD		, mastMap.getString(JBSbatACIFM368.INCOMING_AREA_CD));			// 着側エリアコード
		outMap.setString(JBSbatACIFM368.CHRG_CNT				, mastMap.getString(JBSbatACIFM368.CHRG_CNT));					// 課金回数
		outMap.setString(JBSbatACIFM368.HASHIN_STA_YMD			, mastMap.getString(JBSbatACIFM368.HASHIN_STA_YMD));			// 発側開始日
		outMap.setString(JBSbatACIFM368.HASHIN_STA_TIME			, mastMap.getString(JBSbatACIFM368.HASHIN_STA_TIME));			// 発側開始時刻
		outMap.setString(JBSbatACIFM368.HASHIN_END_YMD			, mastMap.getString(JBSbatACIFM368.HASHIN_END_YMD));			// 発側終了日
		outMap.setString(JBSbatACIFM368.HASHIN_END_TIME			, mastMap.getString(JBSbatACIFM368.HASHIN_END_TIME));			// 発側終了時刻
		outMap.setString(JBSbatACIFM368.INCOMING_STA_YMD		, mastMap.getString(JBSbatACIFM368.INCOMING_STA_YMD));			// 着側開始日
		outMap.setString(JBSbatACIFM368.INCOMING_STA_TIME		, mastMap.getString(JBSbatACIFM368.INCOMING_STA_TIME));			// 着側開始時刻
		outMap.setString(JBSbatACIFM368.INCOMING_END_YMD		, mastMap.getString(JBSbatACIFM368.INCOMING_END_YMD));			// 着側終了日
		outMap.setString(JBSbatACIFM368.INCOMING_END_TIME		, mastMap.getString(JBSbatACIFM368.INCOMING_END_TIME));			// 着側終了時刻
		outMap.setString(JBSbatACIFM368.TELNO					, outputInfoTelNo);												// 電話番号
		outMap.setString(JBSbatACIFM368.KOJIN_HOJIN_TLN_TAI_CD	, outputInfoKojinHojinTlnTaiCd);								// 個人法人電話番号帯コード
		outMap.setString(JBSbatACIFM368.SVC_KEI_NO				, outputInfoSvcKeiNo);											// サービス契約番号
		outMap.setString(JBSbatACIFM368.SVC_STA_YMD				, outputInfoSvcStaYmd);											// サービス開始日
		outMap.setString(JBSbatACIFM368.SVC_END_YMD				, outputInfoSvcEndYmd);											// サービス終了日
		
		outMap.setOutFlg(true);
		
		// 出力レコード作成
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][outputInItem=" + outputInItem.getOutMapList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputData]");
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * @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;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
