/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAKPrcAdjFileHriwake
*	ソースファイル名	：JBSbatAKPrcAdjFileHriwake.java
*	作成者				：富士通　
*	作成日				：2023年02月22日
*＜機能概要＞
*　料金調整ファイル振り分け部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v64.00.00	2023/02/22  FJ)黒田(美)	ANK-4396-00-00_セット割未提供機能の割引契約補正および料金調整のシステム化対応
*	v71.00.00	2024/04/26	FJ)北谷		新規作成 ANK-4491-00-00_セット割補正機能の自動化対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JZMBatConst;
import eo.business.util.file.JBSbatAKIFM145001;
import eo.business.util.file.JBSbatAKIFM146;
import eo.business.util.file.JBSbatAKIFM147;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAKPrcAdjFileHriwake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 退避．入力レコード*/
	private JBSbatServiceInterfaceMap tmpBean = null;
	
	/** 入力レコード退避リスト */
	private List<JBSbatServiceInterfaceMap> inputList = new ArrayList<JBSbatServiceInterfaceMap>();
	
	/** 処理グループ番号(料金一括調整指示ファイル) */
	private int tranGrpNo146 = 0;
	
	/** 処理グループ番号(料金一括調整指示ファイル(手動)) */
	private int tranGrpNo147 = 0;
	
	/** 処理通番(料金一括調整指示ファイル) */
	private int tranSeq146 = 0;
	
	/** 処理通番(料金一括調整指示ファイル(手動)) */
	private int tranSeq147 = 0;
	
	/** 記事文言 */
	private String kijiMngn = "セット割補正ツール対応";
	
	/** 調整対応区分　01：調整対象 */
	private static final String ADJ_TAIO_DIV_01 = "01";
	
	/** 調整対応区分　02：手動調整対象 */
	private static final String ADJ_TAIO_DIV_02 = "02";
	
	/** 変更区分 */
	private static final Map<String, String> chgeDivMap = new HashMap<String, String>(){{
			put("1","追加");
			put("2","変更");
			put("3","削除");
		}};
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 1件目（退避リストが空のとき）
		if (null == tmpBean)
		{
			tmpBean = inMap;
			
			if(!this.commonItem.isEndRecordFlg())
			{
				//1件目が最終レコードではない場合 次レコードの処理へ
				return null;
			}
			else
			{
				//1件目が最終レコード
				inputList.add(inMap);
				createFile(outputBean,tmpBean.getString(JBSbatAKIFM145001.ADJ_TAIO_DIV));
				return outputBean;
			}
		}
		
		// 2件目以降
		
		//キー（退避） (調整対応区分+請求契約番号)
		String tmpKey = tmpBean.getString(JBSbatAKIFM145001.ADJ_TAIO_DIV) + tmpBean.getString(JBSbatAKIFM145001.SEIKY_KEI_NO);
		
		//キー（入力） (調整対応区分+請求契約番号)
		String inKey = inMap.getString(JBSbatAKIFM145001.ADJ_TAIO_DIV) + inMap.getString(JBSbatAKIFM145001.SEIKY_KEI_NO);
		
		 //前レコードをリストに追加する
		inputList.add(tmpBean);

		// キーが一致の場合（最終レコード以外）
		if (!this.commonItem.isEndRecordFlg() && inKey.equals(tmpKey))
		{
			// 次レコードの処理へ
		}
		// キーが不一致または最終レコードの場合、ファイルを出力する
		else
		{
			//キーが一致かつ最終レコードの場合は現レコードをリストに追加
			if (this.commonItem.isEndRecordFlg() && inKey.equals(tmpKey)) {
				inputList.add(inMap);
			}
			
			// ファイル出力   inputListに処理単位の入力レコードを溜めておき、ここで出力する
			createFile(outputBean,tmpBean.getString(JBSbatAKIFM145001.ADJ_TAIO_DIV));
			
			// リストクリア
			inputList = new ArrayList<JBSbatServiceInterfaceMap>();
			
			//キーが不一致かつ最終レコードの場合は現レコードを処理
			if(this.commonItem.isEndRecordFlg() && !inKey.equals(tmpKey))
			{
				inputList.add(inMap);
				//ANK-4491-00-00 MOD START 最終レコードはinMapを参照する
				//createFile(outputBean,tmpBean.getString(JBSbatAKIFM145001.ADJ_TAIO_DIV));
				createFile(outputBean,inMap.getString(JBSbatAKIFM145001.ADJ_TAIO_DIV));
				//ANK-4491-00-00 MOD END
			}
		}
		tmpBean = inMap;
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputBean;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 出力共通電文に入出力インターフェースを設定する。
	 * @param outMap 出力情報
	 * @param outputBean 出力共通電文
	 */	
	public void setOutputBean(JBSbatServiceInterfaceMap outMap, JBSbatOutputItem outputBean)
	{
		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		// 出力共通電文に入出力インターフェースを設定する。
		outputBean.addOutMapList(outMap);
		
	}
	
	/**
	 * 出力共通電文に２つ目の入出力インターフェースを設定する。
	 * @param outMap 出力情報
	 * @param outputBean 出力共通電文
	 * @throws Exception 
	 */	
	public void setOutputBean2(JBSbatServiceInterfaceMap outMap, JBSbatOutputItem outputBean) throws Exception
	{
		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		// 出力共通電文に入出力インターフェースを設定する。
		outputBean.addOutMapList_2(outMap);
	}
	
	/**
	 * 料金一括調整指示ファイル出力情報に値を設定します
	 * 
	 * @param inMap 入力電文
	 * @return outMap 出力電文
	 * @throws Exception 業務サービス内で発生した例外処理
	 */
	private JBSbatServiceInterfaceMap setOutMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 出力電文
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 処理グループ番号
		String tranGrpNo = String.format("%04d",tranGrpNo146);
		// 処理通番
		String trnSeq = String.format("%04d",tranSeq146);
		// 補償費扱いフラグ
		String hshiakFlg = "";
		// 顧客対応履歴表示フラグ
		String custTorkDspFlg = "";
		// 記事
		String kiji = "";
		
		// 処理通番が"0001"
		if ("0001".equals(trnSeq))
		{
			// 補償費扱いフラグ
			hshiakFlg = "0";
			// 顧客対応履歴表示フラグ
			custTorkDspFlg = "0";
			// 記事
			kiji = makeKiji();
		}
		
		// 処理グループ番号
		outMap.set(JBSbatAKIFM146.TRAN_GRP_NO, tranGrpNo);
		// 処理通番
		outMap.set(JBSbatAKIFM146.TRAN_SEQ, trnSeq);
		// 変更区分
		outMap.set(JBSbatAKIFM146.CHGE_DIV, inMap.getString(JBSbatAKIFM145001.CHGE_DIV));
		// 請求年月
		outMap.set(JBSbatAKIFM146.SEIKY_YM, inMap.getString(JBSbatAKIFM145001.SEIKY_YM));
		// 請求契約番号
		outMap.set(JBSbatAKIFM146.SEIKY_KEI_NO, inMap.getString(JBSbatAKIFM145001.SEIKY_KEI_NO));
		// サービス契約番号
		outMap.set(JBSbatAKIFM146.SVC_KEI_NO, inMap.getString(JBSbatAKIFM145001.SVC_KEI_NO));
		// マンションID
		outMap.set(JBSbatAKIFM146.MANSION_ID, "");
		// 部屋番号
		outMap.set(JBSbatAKIFM146.RM_NO, "");
		// サービス詳細識別番号
		outMap.set(JBSbatAKIFM146.SVC_DTL_SKBT_NO, "");
		// 開始日
		outMap.set(JBSbatAKIFM146.STAYMD, "");
		// 終了日
		outMap.set(JBSbatAKIFM146.ENDYMD, "");
		// 料金コースコード
		outMap.set(JBSbatAKIFM146.PCRS_CD, inMap.getString(JBSbatAKIFM145001.PCRS_CD));
		// 料金サービスコード
		outMap.set(JBSbatAKIFM146.PRC_SVC_CD, inMap.getString(JBSbatAKIFM145001.PRC_SVC_CD));
		// 料金項目コード
		outMap.set(JBSbatAKIFM146.PRC_KMK_CD, inMap.getString(JBSbatAKIFM145001.PRC_KMK_CD));
		// 変更後金額
		outMap.set(JBSbatAKIFM146.CHAF_AMNT, inMap.getString(JBSbatAKIFM145001.CHAF_AMNT));
		// 補償費扱いフラグ
		outMap.set(JBSbatAKIFM146.HSHIAK_FLG, hshiakFlg);
		// 顧客対応履歴表示フラグ
		outMap.set(JBSbatAKIFM146.CUST_TORK_DSP_FLG, custTorkDspFlg);
		// 記事
		outMap.set(JBSbatAKIFM146.KIJI, kiji);
		// パターン
		outMap.set(JBSbatAKIFM146.PTN, inMap.getString(JBSbatAKIFM145001.PTN));
		
		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		return outMap;
	}
	
	/**
	 * 料金一括調整指示ファイル（手動）出力情報に値を設定します
	 * 
	 * @param inMap 入力電文
	 * @return outMap 出力電文
	 * @throws Exception 業務サービス内で発生した例外処理
	 */
	private JBSbatServiceInterfaceMap setOutMap2(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// 出力電文
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 処理グループ番号
		String tranGrpNo = String.format("%04d",tranGrpNo147);
		// 処理通番
		String trnSeq = String.format("%04d",tranSeq147);
		// 補償費扱いフラグ
		String hshiakFlg = "";
		// 顧客対応履歴表示フラグ
		String custTorkDspFlg = "";
		// 記事
		String kiji = "";
		
		// 処理通番が"0001"
		if ("0001".equals(trnSeq))
		{
			// 補償費扱いフラグ
			hshiakFlg = "0";
			// 顧客対応履歴表示フラグ
			custTorkDspFlg = "0";
			// 記事
			kiji = makeKiji();
		}
		// 処理グループ番号
		outMap.set(JBSbatAKIFM147.TRAN_GRP_NO, tranGrpNo);
		// 処理通番
		outMap.set(JBSbatAKIFM147.TRAN_SEQ, trnSeq);
		// 変更区分
		outMap.set(JBSbatAKIFM147.CHGE_DIV, inMap.getString(JBSbatAKIFM145001.CHGE_DIV));
		// 請求年月
		outMap.set(JBSbatAKIFM147.SEIKY_YM, inMap.getString(JBSbatAKIFM145001.SEIKY_YM));
		// 請求契約番号
		outMap.set(JBSbatAKIFM147.SEIKY_KEI_NO, inMap.getString(JBSbatAKIFM145001.SEIKY_KEI_NO));
		// サービス契約番号
		outMap.set(JBSbatAKIFM147.SVC_KEI_NO, inMap.getString(JBSbatAKIFM145001.SVC_KEI_NO));
		// マンションID
		outMap.set(JBSbatAKIFM147.MANSION_ID, "");
		// 部屋番号
		outMap.set(JBSbatAKIFM147.RM_NO, "");
		// サービス詳細識別番号
		outMap.set(JBSbatAKIFM147.SVC_DTL_SKBT_NO, "");
		// 開始日
		outMap.set(JBSbatAKIFM147.STAYMD, "");
		// 終了日
		outMap.set(JBSbatAKIFM147.ENDYMD, "");
		// 料金コースコード
		outMap.set(JBSbatAKIFM147.PCRS_CD, inMap.getString(JBSbatAKIFM145001.PCRS_CD));
		// 料金サービスコード
		outMap.set(JBSbatAKIFM147.PRC_SVC_CD, inMap.getString(JBSbatAKIFM145001.PRC_SVC_CD));
		// 料金項目コード
		outMap.set(JBSbatAKIFM147.PRC_KMK_CD, inMap.getString(JBSbatAKIFM145001.PRC_KMK_CD));
		// 変更後金額
		outMap.set(JBSbatAKIFM147.CHAF_AMNT, inMap.getString(JBSbatAKIFM145001.CHAF_AMNT));
		// 補償費扱いフラグ
		outMap.set(JBSbatAKIFM147.HSHIAK_FLG, hshiakFlg);
		// 顧客対応履歴表示フラグ
		outMap.set(JBSbatAKIFM147.CUST_TORK_DSP_FLG, custTorkDspFlg);
		// 記事
		outMap.set(JBSbatAKIFM147.KIJI, kiji);
		// 手動対象理由
		outMap.set(JBSbatAKIFM147.MAN_TG_RSN, inMap.getString(JBSbatAKIFM145001.MAN_TG_RSN));
		// 確認点
		outMap.set(JBSbatAKIFM147.CFMT, inMap.getString(JBSbatAKIFM145001.CFMT));
		
		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		return outMap;
	}
	
	/**
	 * inputListに処理単位の入力レコードを溜めておき、ここで出力する。
	 * 
	 * @param outputInItem 出力共通電文
	 * @param adjTaioDiv 調整対応区分
	 * @throws Exception 業務サービス内で発生した例外処理
	 */
	private void createFile(JBSbatOutputItem outputInItem, String adjTaioDiv) throws Exception
	{
		// 入出力インターフェースオブジェクトを生成
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		JBSbatServiceInterfaceMap outMap2 = new JBSbatServiceInterfaceMap();
		
		// 処理グループ番号をカウントアップ ＆ 処理通番をリセット
		// 調整対象
		if (ADJ_TAIO_DIV_01.equals(adjTaioDiv)) {
			tranGrpNo146++;
			tranSeq146 = 0;
		}
		// 手動調整対象
		else if (ADJ_TAIO_DIV_02.equals(adjTaioDiv)) {
			tranGrpNo147++;
			tranSeq147 = 0;
		}
		
		// inputListでループ
		for (int i = 0; i < inputList.size(); i++)
		{
			JBSbatServiceInterfaceMap inMap = inputList.get(i);
			
			// 調整対象
			if (ADJ_TAIO_DIV_01.equals(adjTaioDiv))
			{
				// 処理通番採番
				tranSeq146++;

				// 料金一括調整指示ファイルを編集する
				outMap = this.setOutMap(inMap);

				// 出力共通電文に入出力インターフェースを設定する
				setOutputBean(outMap, outputInItem);
			}

			// 手動調整対象
			else if (ADJ_TAIO_DIV_02.equals(adjTaioDiv))
			{
				// 処理通番採番
				tranSeq147++;

				// 料金一括調整指示ファイル（手動）を編集する
				outMap2 = this.setOutMap2(inMap);

				// 出力共通電文に入出力インターフェースを設定する
				setOutputBean2(outMap2, outputInItem);
			}
		}
	}
	
	/**
	 * 記事を作成する
	 * 
	 * @throws Exception 業務サービス内で発生した例外処理
	 */
	private String makeKiji() throws Exception
	{
		StringBuffer kijiBuf = new StringBuffer();
		kijiBuf.append(kijiMngn).append(JZMBatConst.SPACE_ZENKAKU) ;
		// inputListでループ
		for (int i = 0; i < inputList.size(); i++)
		{
			JBSbatServiceInterfaceMap inMap = inputList.get(i);
			
			if(i>0) {
				kijiBuf.append("／");
			}
			kijiBuf.append(inMap.getString(JBSbatAKIFM145001.PRC_KMK_NM))
				.append(JZMBatConst.SPACE_ZENKAKU)
				.append(chgeDivMap.get(inMap.getString(JBSbatAKIFM145001.CHGE_DIV)));
		}
		
		return kijiBuf.toString();
	}
}

