/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSyuseibanSeikyushoInstDataSskm
*	ソースファイル名	：JBSbatCHSyuseibanSeikyushoInstDataSskm.java
*	作成者				：富士通　
*	作成日				：2023年06月19日
*＜機能概要＞
*　訂正版請求書印刷データ差込(口振)部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者			修正内容
*	v67.00.00	2023/06/23	 FJ)松永		新規作成
*				2023/08/11	 FJ)松永		【IT1-2023-0000034】支払方法が口振・郵振で混在している場合に正常に差込できない
**				2023/08/16	 FJ)松永		【IT2-2023-0000007】泣き別れ請求書データ不正
*				2023/08/26	 FJ)松永		【IT1-2023-0000047】口振の請求書で修正内訳レコードの差込位置が違う
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatCHIFM430;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

public class JBSbatCHSyuseibanSeikyushoInstDataSskm extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/** キーマッチ処理フラグ */
	private boolean matchProcFlg;
	/** マスタファイル処理フラグ */
	private boolean mastProcFlg;
	/** トランファイル処理フラグ */
	private boolean tranProcFlg;
	
	/** レコード区分：料金情報 */
	private final String REC_KBN_HD = "050";
	/** レコード区分：トレーラレコード */
	private final String REC_KBN_TR = "800";
	
// IT2-2023-0000007 DEL START
//	/** 請求書送信不可リストの重複を防ぐセット */
//	private Set<String> sksSendsFkSet = new HashSet<String>();
//	
//	/** 送信不可理由：定例請求なし */
//	private final String SENDS_FUKA_RIYU_NOT_REGULAR_BILLING = "定例請求なし";
//	/** 請求抑止コード：00 */
//	private final String SEIKY_YOKSI_CD_NOT_YOKSI = "00";
//	/** 抑止理由：抑止なし */
//	private final String YOKSI_NAIYO_NOT_YOKSI = "抑止なし";
// IT2-2023-0000007 DEL END
	
	/** 空白 */
	private String BLANK = "";
	
	/** 処理中のレコードが次の請求契約番号の情報にうつったことを証明するフラグ */
	private boolean nextSeikyKeiNoRec = false;
	
	// IT2-2023-0000007 DEL START
	// IT1-2023-0000034 ADD START
//	/** 支払方法コード：口振 */
//	private final String PAYWAY_CD_KOUFURI = "2";
//	/** 支払方法コード：郵振 */
//	private final String PAYWAY_CD_YUUFURI = "3";
	// IT2-2023-0000007 DEL END
	
	/** 退避．修正版請求内訳データリスト */
	ArrayList<JBSbatServiceInterfaceMap> tranMapList = null;
	// IT1-2023-0000034 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// IT1-2023-0000034 ADD START
		// 退避．修正版請求内訳データリストを初期化
		tranMapList = new ArrayList<JBSbatServiceInterfaceMap>();
		// IT1-2023-0000034 ADD END
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][onlineOpeDate=" + super.onlineOpeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");
		
		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;

		// IT1-2023-0000047 MOD START
		// マッチングキー初期化
		String mastKey = BLANK;
//		// 請求書印刷データ.請求契約番号を一時的に保持
//		String tmpSeikyKeiNo = BLANK;
		// IT1-2023-0000047 MOD END
		
		// 一時的に保持した請求契約番号を出力情報の一時リストに格納するためのリスト
		ArrayList<String> tmpSeikyKeiNoList = new ArrayList<String>();
		// 次レコード判別フラグ初期化
		nextSeikyKeiNoRec = false;
		
		// 入力Ｍのみnullの場合
		if (mastMap == null && tranMap != null) 
		{
// IT2-2023-0000007 MOD START
//			// キー情報取得
//			String tranStr = tranMap.getString(JBSbatCHIFM430.SYUSEI_SKS_PRINT_DATA);
//			String key = tranStr.substring(16, 28).trim() + tranStr.substring(57, 63);
//			
//			// 請求契約番号・請求年月単位で請求書送信不可リストに登録されていない場合
//			if (!this.sksSendsFkSet.contains(key))
//			{
//				// 出力する請求書送信不可リストの請求契約番号・請求年月を格納
//				this.sksSendsFkSet.add(key);
//				
//				// 請求書送信不可レコードを作成
//				JBSbatServiceInterfaceMap sksSoushinFkMap = addSeikyuSendFukaMap(tranMap);
//
//				// 請求書送信不可レコードを出力情報2に格納
//				sksSoushinFkMap.setOutFlg(true);
//				outputInItem.addOutMapList_2(sksSoushinFkMap);
//			}
			tranMap.setOutFlg(true);
			outputInItem.addOutMapList_2(tranMap);
// IT2-2023-0000007 MOD END
			// トランファイルを次レコードに進める。
			this.setMatchProcFlg(true);
			this.setTranProcFlg(true);
		} 
		// 入力Ｔのみnullの場合
		else if (mastMap != null && tranMap == null) 
		{
			// 出力フラグを設定し、入力Ｍのレコードを格納
			mastMap.setOutFlg(true);
			outputInItem.addOutMapList(mastMap);
			// マスタファイルを次レコードに進める。
			this.setMastProcFlg(true);
		}
		// 入力Ｔ、入力Ｍが共にnullでない場合
		else 
		{
			// キー情報取得
			String mastStr = mastMap.getString(JBSbatCHIFM430.SYUSEI_SKS_PRINT_DATA);
			String tranStr = tranMap.getString(JBSbatCHIFM430.SYUSEI_SKS_PRINT_DATA);
			
			// レコード区分
			String mastRecKbn = mastStr.substring(1, 4);
			// 請求書データマージ後ファイル．請求契約番号
			String mastSeikyKeiNo = BLANK;
			// 修正版請求内訳データ．請求契約番号
			String tranSeikyKeiNo = tranStr.substring(16, 28).trim();
			// IT1-2023-0000047 ADD START
			// 請求書データマージ後ファイル．支払方法コード
			String tranPaywayCd = tranStr.substring(0, 1);
			// 入力Ｔキー
			String tranKey = tranPaywayCd + tranSeikyKeiNo;
			
			// IT2-2023-0000007 DEL START
//			// IT1-2023-0000034 ADD START
//			// 修正版請求内訳データ．支払方法コード
//			String mastPayWayCd = mastStr.substring(0, 1);
//			// 修正版請求内訳データ．支払方法コード
//			String tranPayWayCd = tranStr.substring(0, 1);
//			
//			// 入力Ｍ．支払方法コードが口振かつ入力Ｔ．支払方法コードが郵振の場合
//			if (PAYWAY_CD_KOUFURI.equals(mastPayWayCd) && PAYWAY_CD_YUUFURI.equals(tranPayWayCd))
//			{
//				// 出力フラグを設定し、入力Ｍのレコードを格納
//				mastMap.setOutFlg(true);
//				outputInItem.addOutMapList(mastMap);
//				// マスタファイルを次レコードに進める。
//				this.setMastProcFlg(true);
//				
//				return outputInItem;
//			} 
//			// 入力Ｍ．支払方法コードが郵振かつ入力Ｔ．支払方法コードが口振の場合
//			else if (PAYWAY_CD_YUUFURI.equals(mastPayWayCd) && PAYWAY_CD_KOUFURI.equals(tranPayWayCd))
//			{
//				// 請求書送信不可リスト重複確認キー生成
//				String key = tranStr.substring(16, 28).trim() + tranStr.substring(57, 63);
//				
//				// 請求契約番号・請求年月単位で請求書送信不可リストに登録されていない場合
//				if (!this.sksSendsFkSet.contains(key))
//				{
//					// 出力する請求書送信不可リストの請求契約番号・請求年月を格納
//					this.sksSendsFkSet.add(key);
//					
//					// 請求書送信不可レコードを作成
//					JBSbatServiceInterfaceMap sksSoushinFkMap = addSeikyuSendFukaMap(tranMap);
//
//					// 請求書送信不可レコードを出力情報2に格納
//					sksSoushinFkMap.setOutFlg(true);
//					outputInItem.addOutMapList_2(sksSoushinFkMap);
//				}
//				
//				// トランファイルを次レコードに進める。
//				this.setMatchProcFlg(true);
//				this.setTranProcFlg(true);
//			}
//			// IT1-2023-0000034 ADD END
			// IT2-2023-0000007 DEL END
			
			// レコード区分が同封管理ヘッダ： 050 の場合
			// 次の請求契約番号のレコードに移ったことを意味する。
			if (REC_KBN_HD.equals(mastRecKbn.toString()))
			{
				// 請求書データマージ後ファイル．請求契約番号
				mastSeikyKeiNo = mastStr.substring(76, 86);
				
				// IT1-2023-0000047 MOD START
				// 請求書データマージ後ファイル．支払方法
				String mastPaywayCd = mastStr.substring(0, 1);
				// マッチングキー生成
				String key = mastPaywayCd + mastSeikyKeiNo;
				
				// 出力情報.一時リストをクリア
				outputInItem.clearTmpList();
//				// 請求契約番号を出力情報.一時リストに保持
//				tmpSeikyKeiNo = mastSeikyKeiNo;
//				tmpSeikyKeiNoList.add(tmpSeikyKeiNo);
				// マッチングキーを出力情報.一時リストに保持
				mastKey = key;
				tmpSeikyKeiNoList.add(mastKey);
				// IT1-2023-0000047 MOD END
				outputInItem.setTmpList(tmpSeikyKeiNoList);
				
				// 当該処理レコードから前回と違う請求契約番号の情報を読み込んでいる
				nextSeikyKeiNoRec = true;
			}

			// 新しい請求契約番号の情報を読み込んでいる場合
			if (nextSeikyKeiNoRec)
			{
				// IT2-2023-0000007 MOD START
				// 差込処理中のレコード.請求契約番号が入力Ｔ.請求契約番号より大きい値の場合
//				if (outputInItem.getTmpList().get(0).toString().compareTo(tranSeikyKeiNo) > 0)
//				{
				if (outputInItem.getTmpList().get(0).toString().compareTo(tranKey) > 0)
				{
//					// キー情報取得
//					String key = tranStr.substring(16, 28).trim() + tranStr.substring(57, 63);
//
//					// 請求契約番号・請求年月単位で請求書送信不可リストに登録されていない場合
//					if (!this.sksSendsFkSet.contains(key))
//					{
//						// 出力する請求書送信不可リストの請求契約番号・請求年月を格納
//						this.sksSendsFkSet.add(key);
//						// 請求書送信不可レコードを作成
//						JBSbatServiceInterfaceMap sksSoushinFkMap = addSeikyuSendFukaMap(tranMap);
//
//						// 請求書送信不可レコードを出力情報2に格納
//						sksSoushinFkMap.setOutFlg(true);
//						outputInItem.addOutMapList_2(sksSoushinFkMap);
//					}
					tranMap.setOutFlg(true);
					outputInItem.addOutMapList_2(tranMap);
					// IT2-2023-0000007 MOD END
					
					// トランファイルを次レコードに進める。
					this.setMatchProcFlg(true);
					this.setTranProcFlg(true);
					
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
					return outputInItem;
				}
			}
			
			// 出力情報.一時リストが空でないかつ、
			// 請求契約番号が一致するかつ、
			// レコード区分が同封管理トレーラ： 800 の場合
			if (!outputInItem.getTmpList().isEmpty() 
					&& tranKey.equals(outputInItem.getTmpList().get(0).toString()) 
					&& (REC_KBN_TR.equals(mastRecKbn.toString())))
			{
				// IT1-2023-0000047 DEL START
				// IT2-2023-0000007 ADD START
				// 請求書データマージ後ファイル．支払方法コード
//				String mastPaywayCd = mastStr.substring(0, 1);
//
//				// 定例請求書の支払方法コードに変換する
//				StringBuilder sb = new StringBuilder();
//				sb.append(tranStr);
//				sb.replace(0, 1, mastPaywayCd);
//				tranMap.setString(JBSbatCHIFM430.SYUSEI_SKS_PRINT_DATA, sb);
				// IT2-2023-0000007 ADD END
				// IT1-2023-0000047 DEL END
				
				// 入力Ｔのレコードを格納
				tranMap.setOutFlg(true);
				outputInItem.addOutMapList(tranMap);

				// トランファイルを次レコードに進める。
				this.setMatchProcFlg(true);
				this.setTranProcFlg(true);
			} 
			else
			{
				// 出力フラグを設定し、入力Ｍのレコードを格納
				mastMap.setOutFlg(true);
				outputInItem.addOutMapList(mastMap);
				// マスタファイルを次レコードに進める。
				this.setMastProcFlg(true);
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	@Override
	public void terminal() throws Exception {
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	// IT2-2023-0000007 DEL START
//	/**
//	 * 請求書送信不可リストの情報を格納します。
//	 * 
//	 * @param tranMap 入力電文2
//	 * @param num 送信不可理由を設定に必要な値
//	 * @return 請求書送信不可リスト
//	 * @throws Exception
//	 */
//	private JBSbatServiceInterfaceMap addSeikyuSendFukaMap (JBSbatServiceInterfaceMap tranMap) throws Exception
//	{
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][addSeikyUcwkList]");
//		
//		JBSbatServiceInterfaceMap setMap = new JBSbatServiceInterfaceMap();
//		
//		// キー情報取得
//		String tranStr = tranMap.getString(JBSbatCHIFM430.SYUSEI_SKS_PRINT_DATA);
//		
//		// 請求契約番号
//		setMap.set(JBSbatCHIFM428.SEIKY_KEI_NO, tranStr.substring(16, 28).trim());
//		// 請求年月
//		setMap.set(JBSbatCHIFM428.SEIKY_YM, tranStr.substring(57, 63));
//		// 送信不可理由
//		setMap.set(JBSbatCHIFM428.SENDS_FUKA_RIYU, SENDS_FUKA_RIYU_NOT_REGULAR_BILLING);
//		// 督促ステータス
//		setMap.set(JBSbatCHIFM428.TOKUSOKU_STAT, BLANK);
//		// 督促内容
//		setMap.set(JBSbatCHIFM428.TOKUSOKU_NAIYO, BLANK);
//		// 請求抑止コード
//		setMap.set(JBSbatCHIFM428.SEIKY_YOKSI_CD, SEIKY_YOKSI_CD_NOT_YOKSI);
//		// 抑止内容
//		setMap.set(JBSbatCHIFM428.YOKSI_NAIYO, YOKSI_NAIYO_NOT_YOKSI);
//		
//		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][addSeikyUcwkList]");
//		return setMap;
//	}
	// IT2-2023-0000007 DEL END

	@Override
	public boolean isMastProcFlg() {
		return mastProcFlg;
	}

	@Override
	public boolean isMatchProcFlg() {
		return matchProcFlg;
	}

	@Override
	public boolean isTranProcFlg() {
		return tranProcFlg;
	}

	@Override
	public void setMastProcFlg(boolean mastProcFlg) {
		this.mastProcFlg = mastProcFlg;
	}

	@Override
	public void setMatchProcFlg(boolean matchProcFlg) {
		this.matchProcFlg = matchProcFlg;
	}

	@Override
	public void setTranProcFlg(boolean tranProcFlg) {
		this.tranProcFlg = tranProcFlg;
	}

	
}
