/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACWribRsltShukBfHanei
*	ソースファイル名	：JBSbatACWribRsltShukBfHanei.java
*	作成者				：富士通　
*	作成日				：2013年05月16日
*＜機能概要＞
*　割引適用結果集計前反映部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/05/16   FJ)早崎	新規作成
*	v4.01.00	2013/05/29   FJ)垣内	【IT2-2013-0000483】キャスト不正対応
*	v4.02.00	2013/06/12   FJ)早崎	【内部管理番号-0001103】ソート項目単位に料金サービスコードを追加
*	v9.00.00	2014/06/17   FJ)酒井	【IT2-2014-0000259】キー項目にサービス詳細識別コードを追加
*	v57.00.00	2022/03/04   FJ)上村	【OM-2021-0001807】ＣＰ不正終了について
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM226;
import eo.business.util.file.JBSbatACIFM227;
import eo.business.util.table.JBSbatAC_M_PRC_SHUK;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACWribRsltShukBfHanei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金集計)*/
	private static final String D_TBL_NAME_AC_M_PRC_SHUK = "AC_M_PRC_SHUK";

	/** SQL定義キー(AC_SELECT_005)*/
	private static final String AC_M_PRC_SHUK_AC_SELECT_005 = "AC_SELECT_005";

	/** テーブルアクセスクラス(料金集計)*/
	private JBSbatSQLAccess db_AC_M_PRC_SHUK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 請求年月月末日 */
	private String seikyYmEndDay = null;
	
	/** 退避．キー */
	private String bkWorkKey = null;

	/** 退避．料金 */
	private BigDecimal bkPrc = null;

	/** 料金集計マスタMap */
	private HashMap<String, ArrayList<String>> prcShukMap = null;

	/** 退避．料金集計前リスト */
	private ArrayList<JBSbatServiceInterfaceMap> bkPrcShukBfInfoList = null;

	/** 退避．対象内訳単位明細リスト */
	private ArrayList<JBSbatServiceInterfaceMap> bkTrgUchiDtlList = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_PRC_SHUK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_PRC_SHUK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");

		// 料金スケジュールアクセス部品より請求年月月末日を求める
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		
		// 請求年月
		String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_PRC_CALC_DAY);
		String[] ymd   = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		
		// 請求年月月末日
		this.seikyYmEndDay	= ymd[1];
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][請求年月月末日=" + this.seikyYmEndDay + "]");
		
		// 料金スケジュールアクセス部品をクローズ
		schdlUtil.close();
		
		// 料金集計マスタMapを取得する
		getPrcShukInfo();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]");

		JBSbatOutputItem outputInItem = new JBSbatOutputItem();

		// 出力情報
		JBSbatServiceInterfaceMap outPutInfo = null;

		// キー項目を取得
//IT2-2014-0000259 MOD STA 
//		// 入力．請求先番号＋入力．サービス番号
//		String workKey = makeStr(inMap.getString(JBSbatACIFM227.SEIKY_KEI_NO), inMap.getString(JBSbatACIFM227.SVC_NO));
		// 入力．請求先番号＋入力．サービス番号＋入力．サービス詳細識別コード
		String workKey = makeStr(inMap.getString(JBSbatACIFM227.SEIKY_KEI_NO), inMap.getString(JBSbatACIFM227.SVC_NO), inMap.getString(JBSbatACIFM227.SVC_DTL_SKBT_NO).trim());
//IT2-2014-0000259 MOD END 
		
		// ファイル区分
		String fileDiv = inMap.getString(JBSbatACIFM227.FILE_DIV);

		// 1レコード目の場合
		if(null == this.bkWorkKey)
		{
			// 退避．料金集計前情報を初期化
			this.bkPrcShukBfInfoList = new ArrayList<JBSbatServiceInterfaceMap>();
			
			// 退避．キー ← キー
			this.bkWorkKey = workKey;
		}
		
		// 退避．キー ＝ キー
		if(this.bkWorkKey.equals(workKey))
		{
			
			// ファイル区分 ＝ "1"の場合
			if("1".equals(fileDiv))
			{
				// 退避．料金 ← 入力．料金
				this.bkPrc = inMap.getBigDecimal(JBSbatACIFM227.PRC);

				// 入力．料金 != 0 の場合
				if(0 != this.bkPrc.compareTo(BigDecimal.ZERO))
				{
					// 入力．料金がマイナス値の場合は符号を反転させる
					if(0 < BigDecimal.ZERO.compareTo(this.bkPrc))
					{
						this.bkPrc = this.bkPrc.negate();
					}
					
					// 集計前明細抽出処理
					shukBfDtlChuShut(inMap.getString(JBSbatACIFM227.PRC_KMK_CD));
				
					// 対象内訳単位明細リストソート処理
					sortListMap();
				
					// 退避．対象内訳単位明細リスト 件数分処理を行う
					for(int i = 0; i < this.bkTrgUchiDtlList.size(); i++)
					{
						// 集計前反映後割引適用結果情報作成
						outPutInfo = makeOutPutInfo(this.bkTrgUchiDtlList.get(i));
					
						// 出力フラグ ← true
						outPutInfo.setOutFlg(true);
					
						// 出力共通電文設定
						outputInItem.addOutMapList(outPutInfo);
					
						// 退避．対象内訳単位明細リスト．料金
						BigDecimal dltPrc =  this.bkTrgUchiDtlList.get(i).getBigDecimal(JBSbatACIFM227.PRC);
						
						// 退避．対象内訳単位明細リスト．料金がマイナス値の場合符号を反転させる
						if(0 < BigDecimal.ZERO.compareTo(dltPrc))
						{
							dltPrc = dltPrc.negate();
						}
						
						// 退避．料金 ← 退避．料金 - 退避．対象内訳単位明細リスト．料金
						this.bkPrc = this.bkPrc.subtract(dltPrc);
					
						// 退避．料金 ≧ 0 の場合
						if(0 >= this.bkPrc.compareTo(BigDecimal.ZERO))
						{
							// 処理を抜ける
							break;
						}
					}
				}
			}
			// ファイル区分 ＝ "2"の場合
			else
			{
				// 退避．料金集計前リストに入力情報を格納する
				this.bkPrcShukBfInfoList.add(inMap);
			}
		}
		
		// 退避．キー ≠ キー(キーブレイク)
		else
		{
			// 退避．料金集計前リストを初期化
			this.bkPrcShukBfInfoList.clear();
			
			// ファイル区分 ＝ "2"の場合
			if("2".equals(fileDiv))
			{
				// 退避．料金集計前リストに入力情報を格納する
				this.bkPrcShukBfInfoList.add(inMap);
			}
		}
		
		// 退避．キー ← キー
		this.bkWorkKey = workKey;

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_PRC_SHUK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AC_SELECT_005)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	集計先料金項目コード(下2桁)
	 *		 	適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_M_PRC_SHUK_AC_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_AC_M_PRC_SHUK.selectBySqlDefine(paramList, AC_M_PRC_SHUK_AC_SELECT_005);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 文字を連結します
	 * @param  string 文字
	 * @return strBuf 連結した文字列
	 */
	private String makeStr(String ...string)
	{
		StringBuffer strBuf = new StringBuffer();
		for(String str:string)
		{
			if(null == str)
			{
				strBuf.append(JACStrConst.KARA_MOJI);
			}
			else
			{
				strBuf.append(str);
			}
		}
		return strBuf.toString();
	}

	/**
	 * 料金集計マスタMap作成処理
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getPrcShukInfo() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcShukInfo]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(JACStrConst.SYS_CD_AC);	// システムコード
		paramList.setValue("10");					// 集計先料金項目コード下2桁が10(相殺済)
		paramList.setValue(this.seikyYmEndDay);		// 請求年月月末日
		
		// SQL実行
		executeAC_M_PRC_SHUK_AC_SELECT_005(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_AC_M_PRC_SHUK.selectNext();
		
		// 取得結果が存在しない場合
		if(null == dbMap)
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcShukInfo][DB未存在エラー]");
			String[] outCntMsg = {JBSbatAC_M_PRC_SHUK.TABLE_NAME, paramList.getList().toString()};
			// エラーログ出力（エラーコード："EACB0240CW"（DB未存在エラー））
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, outCntMsg);
		}
		
		// 料金集計マスタMap初期化
		this.prcShukMap = new HashMap<String, ArrayList<String>>();
		
		// 集計元料金項目コードリスト
		ArrayList<String> shukMtKmkCdList = new ArrayList<String>();

		// 退避．集計先料金項目コード
		String bkShukSkKmkCd = dbMap.getString(JBSbatAC_M_PRC_SHUK.SHUK_SK_PRC_KMK_CD);
		
		while(null != dbMap)
		{
			// 集計先料金項目コード
			String shukSkKmkCd = dbMap.getString(JBSbatAC_M_PRC_SHUK.SHUK_SK_PRC_KMK_CD);
			
			// 集計元料金項目コード
			StringBuilder shukMtKmkCd = new StringBuilder(dbMap.getString(JBSbatAC_M_PRC_SHUK.SHUK_MT_PRC_KMK_CD));
			
			// 退避．集計先料金項目コード ≠ 集計先料金項目コード(キーブレイク)の場合
			if(!bkShukSkKmkCd.equals(shukSkKmkCd))
			{
				// 料金集計マスタMapに取得結果を格納する
				// Key:退避．集計先料金項目コード Value:集計元料金項目コード
				this.prcShukMap.put(bkShukSkKmkCd, shukMtKmkCdList);
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcShukInfo][key(shukSkPrcKmkCd)=" + bkShukSkKmkCd + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcShukInfo][value(shukMtPrcKmkCd)=" + shukMtKmkCdList.toString() + "]");
				
				// 集計元料金項目コードリストを初期化
				shukMtKmkCdList = new ArrayList<String>();
				
			}

			// 集計元料金項目コードリスト ← 集計元料金項目コード(変換後)
			shukMtKmkCdList.add(shukMtKmkCd.replace(9, 11, "01").toString());
			shukMtKmkCdList.add(shukMtKmkCd.replace(9, 11, "00").toString());

			// 退避．集計先料金項目コード ← 集計先料金項目コード
			bkShukSkKmkCd = shukSkKmkCd;

			// 次レコード取得
			dbMap = db_AC_M_PRC_SHUK.selectNext();
			
			// 最終レコードの場合
			if(null == dbMap)
			{
				// 料金集計マスタMapに取得結果を格納する
				// Key:退避．集計先料金項目コード Value:集計元料金項目コード
				this.prcShukMap.put(bkShukSkKmkCd, shukMtKmkCdList);
				
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcShukInfo][key(shukSkPrcKmkCd)=" + bkShukSkKmkCd + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcShukInfo][value(shukMtPrcKmkCd)=" + shukMtKmkCdList.toString() + "]");
			}
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcShukInfo]");
	}
	
	/**
	 * 集計前明細抽出処理
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void shukBfDtlChuShut(String prcKmkCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][shukBfDtlChuShut]");

		// 退避．対象内訳単位明細リスト初期化
		this.bkTrgUchiDtlList = new ArrayList<JBSbatServiceInterfaceMap>();
		
		// 集計元料金項目コードリスト
		ArrayList<String> shukMtKmkCdList = new ArrayList<String>();
		
		// 料金集計マスタMap検索結果存在フラグ
		boolean searchMapFlg = false;
		
		// 退避．料金集計前リスト検索結果存在フラグ
		boolean searchListFlg = false;
		
		// 入力．料金項目コードより料金集計マスタMapを検索する
		// 料金集計マスタMap検索結果が存在する場合
		if(this.prcShukMap.containsKey(prcKmkCd))
		{
			shukMtKmkCdList = prcShukMap.get(prcKmkCd);

			// 料金集計マスタMap検索結果存在フラグ ← true
			searchMapFlg = true;
		}
		// 料金集計マスタMap検索結果が存在しない場合
		else
		{
			// 入力．料金項目コード
			StringBuilder strPrcKmkCd = new StringBuilder(prcKmkCd);

			// 変換後コード_料金
			shukMtKmkCdList.add(strPrcKmkCd.replace(9, 11, "01").toString());
			// 変換後コード_運用投入
			shukMtKmkCdList.add(strPrcKmkCd.replace(9, 11, "00").toString());
		}
		
		// 退避．料金集計前リスト件数分下記処理を行う
		for(int i = 0; i < this.bkPrcShukBfInfoList.size(); i++)
		{
			// 退避．料金集計前リスト．料金項目コード
			String bkPrcKmkCd = this.bkPrcShukBfInfoList.get(i).getString(JBSbatACIFM227.PRC_KMK_CD);
			
			for(int j = 0; j < shukMtKmkCdList.size(); j++)
			{
				// 退避．料金集計前リスト．料金項目コード ＝ 変換後コード_料金 または 変換後コード_運用投入 の場合
				if(shukMtKmkCdList.get(j).equals(bkPrcKmkCd))
				{
					// 退避．対象内訳単位明細リストに格納する
					this.bkTrgUchiDtlList.add(this.bkPrcShukBfInfoList.get(i));

					// 退避．料金集計前リスト検索結果存在フラグ ← true
					searchListFlg = true;
				
				}
			}
		}
		
		// 退避．料金集計前リスト検索結果存在フラグ = false かつ 料金集計マスタMap検索結果存在フラグ = trueの場合
		if(!searchListFlg && searchMapFlg)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][shukBfDtlChuShut][該当する料金集計マスタMapを元に料金集計前リストを検索した結果が存在しない場合");

			// 入力．料金項目コード
			StringBuilder strPrcKmkCd = new StringBuilder(prcKmkCd);

			// 変換後コード_料金
			shukMtKmkCdList.add(strPrcKmkCd.replace(9, 11, "01").toString());
			// 変換後コード_運用投入
			shukMtKmkCdList.add(strPrcKmkCd.replace(9, 11, "00").toString());
			
			// 退避．料金集計前リスト件数分下記処理を行う
			for(int i = 0; i < this.bkPrcShukBfInfoList.size(); i++)
			{
				// 退避．料金集計前リスト．料金項目コード
				String bkPrcKmkCd = this.bkPrcShukBfInfoList.get(i).getString(JBSbatACIFM227.PRC_KMK_CD);
				
				for(int j = 0; j < shukMtKmkCdList.size(); j++)
				{
					// 退避．料金集計前リスト．料金項目コード ＝ 変換後コード_料金 または 変換後コード_運用投入 の場合
					if(shukMtKmkCdList.get(j).equals(bkPrcKmkCd))
					{
						// 退避．対象内訳単位明細リストに格納する
						this.bkTrgUchiDtlList.add(this.bkPrcShukBfInfoList.get(i));
					}
				}
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][shukBfDtlChuShut]");
	}
	
	
	/**
	 * 対象内訳単位明細リストソート処理
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void sortListMap() throws Exception
	{
		if(null == this.bkTrgUchiDtlList || 0 == this.bkTrgUchiDtlList.size())
		{
			return;
		}
		
		Collections.sort(this.bkTrgUchiDtlList, new Comparator<JBSbatServiceInterfaceMap>()
		{
			
			/**
			 * <p>
			 * ソート用。
			 * </p>
			 * @param o1 入力1
			 * @param o2 入力2
			 * @return int compareTo結果
			 */
			@Override public int compare(JBSbatServiceInterfaceMap o1, JBSbatServiceInterfaceMap o2) 
			{
				// キー取得
				String o1Key = makeSortKey(o1);
				String o2Key = makeSortKey(o2);
				
				// 入力１．キー．compareTo（入力２．キー）を返却
				return o1Key.compareTo(o2Key);
			}
		});
		return;
	}
	
	/**
	 * ソート用のキー作成処理
	 * @param inMap 入力情報
	 * @return String 作成したキー
	 */
	public String makeSortKey(JBSbatServiceInterfaceMap inMap)
	{
		StringBuffer bufKey = new StringBuffer(12);
//OM-2021-0001807 ADD START
		// 割引優先順位 
		bufKey.append(inMap.get(JBSbatACIFM227.WRIB_YUSEN_JUN));
//OM-2021-0001807 ADD END
		// 割引サービス契約番号
		bufKey.append(inMap.get(JBSbatACIFM227.WRIB_SVC_KEI_NO));
		
		// 料金サービスコード
		bufKey.append(inMap.get(JBSbatACIFM227.PRC_SVC_CD));
		
		return bufKey.toString();
	}
	
	/**
	 * 集計前反映後割引適用結果情報作成
	 * 
	 * @param prc 料金
	 * @return outPutInfo 集計前反映後割引適用結果情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatServiceInterfaceMap makeOutPutInfo(JBSbatServiceInterfaceMap bkInMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutPutInfo]");


		// 集計前反映後割引適用結果情報
		JBSbatServiceInterfaceMap outPutInfo = new JBSbatServiceInterfaceMap();
		
		// 請求先番号
		outPutInfo.set(JBSbatACIFM226.SEIKY_KEI_NO, bkInMap.getString(JBSbatACIFM227.SEIKY_KEI_NO));
		// 請求年月
		outPutInfo.set(JBSbatACIFM226.SEIKY_YM, bkInMap.getString(JBSbatACIFM227.SEIKY_YM));
		// 割引サービス契約番号
		outPutInfo.set(JBSbatACIFM226.WRIB_SVC_KEI_NO, bkInMap.getString(JBSbatACIFM227.WRIB_SVC_KEI_NO));
		// 割引サービス対象契約番号
		outPutInfo.set(JBSbatACIFM226.WRISVC_TRGT_KEI_NO, bkInMap.getString(JBSbatACIFM227.WRISVC_TRGT_KEI_NO));
		// サービス番号
		outPutInfo.set(JBSbatACIFM226.SVC_NO, bkInMap.getString(JBSbatACIFM227.SVC_NO));
		// サービス識別
		outPutInfo.set(JBSbatACIFM226.SVC_CD, bkInMap.getString(JBSbatACIFM227.SVC_CD));
		// 料金コースコード
		outPutInfo.set(JBSbatACIFM226.PCRS_CD, bkInMap.getString(JBSbatACIFM227.PCRS_CD));
		// 料金サービスコード
		outPutInfo.set(JBSbatACIFM226.PRC_SVC_CD, bkInMap.getString(JBSbatACIFM227.PRC_SVC_CD));
		// 料金項目コード
		outPutInfo.set(JBSbatACIFM226.PRC_KMK_CD, bkInMap.getString(JBSbatACIFM227.PRC_KMK_CD));
		// 徴収パターンコード
		outPutInfo.set(JBSbatACIFM226.COLLECT_PATTERN_CD, bkInMap.getString(JBSbatACIFM227.COLLECT_PATTERN_CD));
		// 料金
		outPutInfo.set(JBSbatACIFM226.PRC, bkInMap.getBigDecimal(JBSbatACIFM227.PRC));
		// 利用開始日
		outPutInfo.set(JBSbatACIFM226.USE_STAYMD, bkInMap.getString(JBSbatACIFM227.USE_STAYMD));
		// 利用終了日
		outPutInfo.set(JBSbatACIFM226.USE_ENDYMD, bkInMap.getString(JBSbatACIFM227.USE_ENDYMD));
		// サービス開始日
		outPutInfo.set(JBSbatACIFM226.SVC_STAYMD, bkInMap.getString(JBSbatACIFM227.SVC_STAYMD));
		// 初回課金開始日
		outPutInfo.set(JBSbatACIFM226.FIRST_CHRG_STAYMD, bkInMap.getString(JBSbatACIFM227.FIRST_CHRG_STAYMD));
		// サービス解約日
		outPutInfo.set(JBSbatACIFM226.SVC_DSL_YMD, bkInMap.getString(JBSbatACIFM227.SVC_DSL_YMD));
		// サービス解約理由
		outPutInfo.set(JBSbatACIFM226.SVC_DLRE, bkInMap.getString(JBSbatACIFM227.SVC_DLRE));
		// サービス回復日
		outPutInfo.set(JBSbatACIFM226.SVC_KAIHK_DAY, bkInMap.getString(JBSbatACIFM227.SVC_KAIHK_DAY));
		// 利用日数
		outPutInfo.set(JBSbatACIFM226.USE_DAY_CNT, bkInMap.getBigDecimal(JBSbatACIFM227.USE_DAY_CNT));
		// 利用不可日数
		outPutInfo.set(JBSbatACIFM226.USE_FAIL_DAY_CNT, bkInMap.getBigDecimal(JBSbatACIFM227.USE_FAIL_DAY_CNT));
		// 相対区分
		outPutInfo.set(JBSbatACIFM226.AIT_DIV, bkInMap.getString(JBSbatACIFM227.AIT_DIV));
		// 締め日
		outPutInfo.set(JBSbatACIFM226.SIME_DAY, bkInMap.getString(JBSbatACIFM227.SIME_DAY));
		// 割引優先順位
//OM-2021-0001807 ADD START
		// 空白判定のため一度取得
		String wribYusenJun = bkInMap.getString(JBSbatACIFM227.WRIB_YUSEN_JUN);
		// 空白もしくはnullの場合は、そのまま設定
		if (wribYusenJun == null || wribYusenJun.equals("") || wribYusenJun.length() <= 4) {
//OM-2021-0001807 ADD END
			outPutInfo.set(JBSbatACIFM226.WRIB_YUSEN_JUN, bkInMap.getString(JBSbatACIFM227.WRIB_YUSEN_JUN));
//OM-2021-0001807 ADD START
		} else {
			// 空白もしくはnullでない場合は、
			// 前方4桁のみ出力
			outPutInfo.set(JBSbatACIFM226.WRIB_YUSEN_JUN, bkInMap.getString(JBSbatACIFM227.WRIB_YUSEN_JUN).substring(0, 4));
		}
//OM-2021-0001807 ADD END
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutPutInfo][outPutInfo=" + outPutInfo.getMap().toString());
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutPutInfo]");
		
		return outPutInfo;
	}
}
