/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSaikenKshkmInfoMake
*	ソースファイル名	：JBSbatCHSaikenKshkmInfoMake.java
*	作成者				：富士通　
*	作成日				：2011年07月27日
*＜機能概要＞
*　債権消込情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/27   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM099;
import eo.business.util.file.JBSbatCHIFM068;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCEditString;
import eo.framework.application.JBSbatBusinessException;
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 JBSbatCHSaikenKshkmInfoMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(CH_SELECT_015)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_015 = "CH_SELECT_015";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	/** サービス識別：入金 */
	private static final String SVC_SKBT_NYUKIN = "2";

	/** 過大入金フラグ"0"（過小） */
	private static final String KADAI_NYUKIN_FLG_KASYO = "0";

	/** 過大入金フラグ"1"（同額） */
	private static final String KADAI_NYUKIN_FLG_DOUGAKU = "1";

	/** 過大入金フラグ"2"（過大） */
	private static final String KADAI_NYUKIN_FLG_KADAI = "2";

	/** 業務機能識別コード桁数 */
	private static final int GYOMU_KINO_SKBT_CD_VALUE = 9;
	
	/** 前受相殺優先順位（0） */
	private static final String MAE_YUSEN_JUN_ZERO = "0";
	
	/** 料金グループコード「入金額（ＩＮ）」 */
	private String prcGrpCdNkinAmntIn = null;
	
	/** 料金グループコード「未収額（ＩＮ）」 */
	private String prcGrpCdMisAmntIn = null;
	
	/** 料金グループコード「過小入金額（ＩＮ）」 */
	private String prcGrpCdKshoNknAmntIn = null;
	
	/** 料金グループコード「過小未収額（ＩＮ）」 */
	private String prcGrpCdKashoMisAmntIn = null;
	
	/** 料金コースコード「入金額（ＩＮ）」 */
	private String pcrsCdNkinAmntIn = null;
	
	/** 料金コースコード「未収額（ＩＮ）」 */
	private String pcrsCdMisAmntIn = null;
	
	/** 料金コースコード「過小入金額（ＩＮ）」 */
	private String pcrsCdKshoNknAmntIn = null;
	
	/** 料金コースコード「過小未収額（ＩＮ）」 */
	private String pcrsCdKashoMisAmntIn = null;
	
	/** 料金サービスコード「入金額（ＩＮ）」 */
	private String svcCdNkinAmntIn = null;
	
	/** 料金サービスコード「未収額（ＩＮ）」 */
	private String svcCdMisAmntIn = null;
	
	/** 料金サービスコード「過小入金額（ＩＮ）」 */
	private String svcCdKashoNkinAmntIn = null;
	
	/** 料金サービスコード「過小未収額（ＩＮ）」 */
	private String svcCdKashoMisAmntIn = null;
	
	/** 料金項目コード「入金額（ＩＮ）」 */
	private String kmkCdNkinAmntIn = null;
	
	/** 料金項目コード「未収額（ＩＮ）」 */
	private String kmkCdMisAmntIn = null;
	
	/** 料金項目コード「過小入金額（ＩＮ）」 */
	private String kmkCdKashoNkinAmntIn = null;
	
	/** 料金項目コード「過小未収額（ＩＮ）」 */
	private String kmkCdKashoMisAmntIn = null;

	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");

		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 料金項目抽出変換スキーマ検索用業務機能識別コードリスト形成
		ArrayList<String> workKinoSkbtCdList = new ArrayList<String>();
		// 業務機能識別コード：入金額（ＩＮ）
		workKinoSkbtCdList.add(JACStrConst.WKPRA_CH_WKS_NKIN_AMNT_IN);
		// 業務機能識別コード：未収額（ＩＮ）
		workKinoSkbtCdList.add(JACStrConst.WKPRA_CH_WKS_MIS_AMNT_IN);
		// 業務機能識別コード：過小入金額（ＩＮ）
		workKinoSkbtCdList.add(JACStrConst.WKPRA_CH_WKS_KSH_NK_AMT_IN);
		// 業務機能識別コード：過小未収額（ＩＮ）
		workKinoSkbtCdList.add(JACStrConst.WKPRA_CH_WKS_KSH_MS_AMT_IN);

		for(int i = 0; i < workKinoSkbtCdList.size() ; i++)
		{
			// 業務機能識別コード値を取得
			String gyomuKinoSkbtCd = paramUtil.getGyoumuParameter(workKinoSkbtCdList.get(i));
			
			// 料金項目抽出変換スキーマより料金グループコード、料金コースコード、料金サービスコード、料金項目コードを取得
			StringBuilder prcGrpCd = new StringBuilder();
			StringBuilder pcrsCd = new StringBuilder();
			StringBuilder prcSvcCd = new StringBuilder();
			StringBuilder prcKmkCd = new StringBuilder();
			getPrcInf(gyomuKinoSkbtCd, prcGrpCd, pcrsCd, prcSvcCd, prcKmkCd);
			if (JACStrConst.WKPRA_CH_WKS_NKIN_AMNT_IN.equals(workKinoSkbtCdList.get(i)))
			{
				// 入金額（ＩＮ）
				prcGrpCdNkinAmntIn = prcGrpCd.toString();
				pcrsCdNkinAmntIn = pcrsCd.toString();
				svcCdNkinAmntIn = prcSvcCd.toString();
				kmkCdNkinAmntIn = prcKmkCd.toString();
			}
			else if (JACStrConst.WKPRA_CH_WKS_MIS_AMNT_IN.equals(workKinoSkbtCdList.get(i)))
			{
				// 未収額（ＩＮ）
				prcGrpCdMisAmntIn = prcGrpCd.toString();
				pcrsCdMisAmntIn = pcrsCd.toString();
				svcCdMisAmntIn = prcSvcCd.toString();
				kmkCdMisAmntIn = prcKmkCd.toString();
			}
			else if (JACStrConst.WKPRA_CH_WKS_KSH_NK_AMT_IN.equals(workKinoSkbtCdList.get(i)))
			{
				// 過小入金額（ＩＮ）
				prcGrpCdKshoNknAmntIn = prcGrpCd.toString();
				pcrsCdKshoNknAmntIn = pcrsCd.toString();
				svcCdKashoNkinAmntIn = prcSvcCd.toString();
				kmkCdKashoNkinAmntIn = prcKmkCd.toString();
			}
			else if (JACStrConst.WKPRA_CH_WKS_KSH_MS_AMT_IN.equals(workKinoSkbtCdList.get(i)))
			{
				// 過小未収額（ＩＮ）
				prcGrpCdKashoMisAmntIn = prcGrpCd.toString();
				pcrsCdKashoMisAmntIn = pcrsCd.toString();
				svcCdKashoMisAmntIn = prcSvcCd.toString();
				kmkCdKashoMisAmntIn = prcKmkCd.toString();
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][pcrsCdNkinAmntIn=" + pcrsCdNkinAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][svcCdNkinAmntIn=" + svcCdNkinAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][kmkCdNkinAmntIn=" + kmkCdNkinAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][pcrsCdMisAmntIn=" + pcrsCdMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][svcCdMisAmntIn=" + svcCdMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][kmkCdMisAmntIn=" + kmkCdMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][pcrsCdKashoNkinAmntIn=" + pcrsCdKshoNknAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][svcCdKashoNkinAmntIn=" + svcCdKashoNkinAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][kmkCdKashoNkinAmntIn=" + kmkCdKashoNkinAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][pcrsCdKashoMisAmntIn=" + pcrsCdKashoMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][svcCdKashoMisAmntIn=" + svcCdKashoMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][kmkCdKashoMisAmntIn=" + kmkCdKashoMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][prcGrpCdNkinAmntIn=" + prcGrpCdNkinAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][prcGrpCdMisAmntIn=" + prcGrpCdMisAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][prcGrpCdKshoNknAmntIn=" + prcGrpCdKshoNknAmntIn + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][prcGrpCdKashoMisAmntIn=" + prcGrpCdKashoMisAmntIn + "]");
		
		// ＤＢアクセスクラスをクローズする
		db_CH_M_PRC_KMK_CS_CHGE.close();
		paramUtil.close();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;

		// 入力．キー1　入金番号
		String inKey1 = null;
		// 退避．キー1　入金番号
		String tmpKey1 = null;
		// 退避．キー2　過大・過小入金フラグ（0：過小、1:同額、2：過大）
		String tmpKey2 = null;
		// キーブレークフラグ
		boolean keyBreakFlg = false;

		// 出力オブジェクト格納リスト
		ArrayList<JBSbatServiceInterfaceMap> outList = outputInItem.getOutMapList();
		// ＜outList設定内容＞
		// [0]:入金額集計
		// [1]:未収額集計
		// [2]:キーブレーク後情報
		
		// 最終レコード時
		if(inMap == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][最終レコード]");
			
			// キーブレークフラグ設定
			keyBreakFlg = true;

			// 出力リストに未収レコードが存在しない場合
			if(outList.size() == 1)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][未収レコードなし]");
				// 空の未収レコードを設定
				outList.add(1, new JBSbatServiceInterfaceMap());
			}
			// 過大入金の判定
			String kadaiHnti = judgmentKadaiNyukin(outList);
			// 出力処理
			this.setOutMap(outList, kadaiHnti, outputInItem);
			return outputInItem;
		}

		inKey1 = inMap.getString(JBSbatCHIFM068.NYUKIN_NO);
		
		String inSvcSkbt = inMap.getString(JBSbatCHIFM068.SVC_SKBT);

		// 初回処理判定（入力1件目）
		if(!outputInItem.isKeyList())
		{
			// 初回レコードＫＥＹの設定
			tmpKey1 = inKey1;
			tmpKey2 = KADAI_NYUKIN_FLG_KADAI;

			// 入力が入金レコードの場合
			if(inSvcSkbt.equals(SVC_SKBT_NYUKIN))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][初回レコード（入金）]");
				// 出力リスト（退避）の設定（入力は入金レコード）
				outList.add(0, inMap);
			}
			// 上記以外（未収）の場合
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][初回レコード（未収）]");
				// 入金レコードにダミーを設定
				outList.add(0, new JBSbatServiceInterfaceMap());
				// 出力リスト（退避）の設定（入力は未収レコード）
				outList.add(1, inMap);
			}
		}
		else
		{
			// 前レコードＫＥＹの設定
			tmpKey1 = (String)outputInItem.getKeyList().get(0);
			tmpKey2 = (String)outputInItem.getKeyList().get(1);
			
			// 前回入力レコードと入金番号が同じ場合
			if (inKey1.equals(tmpKey1)) 
			{
				// 退避キーリスト設定
				tmpKey1 = inKey1;
				
				// 料金のサマリー処理
				// 入金レコード
				if(inSvcSkbt.equals(SVC_SKBT_NYUKIN))
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチ（入金）]");
					JBSbatServiceInterfaceMap nyukinMap = (JBSbatServiceInterfaceMap)outList.get(0);

					// 退避．入金レコードがダミーファイルの場合
					if(nyukinMap.getMap().size() == 0)
					{
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避（入金）ダミー]");
						// 入金レコードを設定
						outList.set(0, inMap);
					}
					// 上記以外の場合
					else
					{
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避（入金）入金データ]");
						// 入金額合計
						BigDecimal nyukin = new BigDecimal(0);

						nyukin = inMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT);
						nyukin = nyukin.add(nyukinMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT));
						nyukinMap.setBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT, nyukin);
						// サマリー後入金レコードの設定
						outList.set(0, nyukinMap);
					}
				}
				// 未収レコード
				else
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][マッチ（未収）]");
					JBSbatServiceInterfaceMap misyuMap = null;
					// 退避．未収レコードが設定されていない場合
					if(outList.size() == 1)
					{
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避（未収）ダミー]");
						// 未収レコードを設定
						outList.add(1, inMap);
					}
					// 上記以外の場
					else
					{
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避（未収）未収データ]");
						misyuMap = (JBSbatServiceInterfaceMap)outList.get(1);
						// 未収額合計
						BigDecimal misyu = new BigDecimal(0);

						misyu = inMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT);
						misyu = misyu.add(misyuMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT));
						misyuMap.setBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT, misyu);

						// サマリー後未収レコードの設定
						outList.set(1, misyuMap);
					}
				}
			}
			// 上記以外の場合
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][キーブレイク]");
				
				// 退避キーリスト設定
				tmpKey1 = inKey1;

				// キーブレークフラグ設定
				keyBreakFlg = true;

				// 出力リストに未収レコードが存在しない場合
				if(outList.size() == 1)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][未収レコードなし]");
					// 空の未収レコードを設定
					outList.add(1, new JBSbatServiceInterfaceMap());
				}

				// 過大入金の判定
				tmpKey2 = judgmentKadaiNyukin(outList);
				// 出力リスト（退避）の設定（
				outList.add(2, inMap);
			}
		}

		// 出力処理
		if (keyBreakFlg)
		{
			this.setOutMap(outList, tmpKey2, outputInItem);
		}

		// 6．キーリスト退避
		outputInItem.clearKeyList();
		outputInItem.addKeyList(tmpKey1);
		outputInItem.addKeyList(tmpKey2);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][KeyList=" + outputInItem.getKeyList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CH_SELECT_015)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	業務機能識別コード
	 *		 	抽出変換コード
	 *		 	料金項目抽出変換適用開始年月日
	 *		 	料金項目抽出変換適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_015(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_015);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * 料金情報を取得する
	 * 
	 * @param gyomuKinoSkbtCd 業務機能識別コード
	 * @param prcGrpCd 料金グループコード
	 * @param pcrsCd   料金コースコード
	 * @param prcSvcCd 料金サービスコード
	 * @param prcKmkCd 料金項目コード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getPrcInf(String gyomuKinoSkbtCd, StringBuilder prcGrpCd, StringBuilder pcrsCd, StringBuilder prcSvcCd, StringBuilder prcKmkCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcInf]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcInf][gyomuKinoSkbtCd=" + gyomuKinoSkbtCd + "]");

		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();

		// 検索条件の設定
		// システムコード
		whereParam.setValue(super.systemCode);
		// 業務機能識別コード
		whereParam.setValue(JPCEditString.fillHalfSpace(gyomuKinoSkbtCd, GYOMU_KINO_SKBT_CD_VALUE, true));
		// 抽出変換コード（抽出のみ）
		whereParam.setValue(JACStrConst.CHSHT_CHG_CD_CST);
		// 適用開始年月日
		whereParam.setValue(super.opeDate);
		// 適用終了年月日
		whereParam.setValue(super.opeDate);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcInf][whereParam=" + whereParam.getList().toString() + "]");

		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_015(whereParam.getList().toArray());
		// 検索結果取得
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();

		// 検索結果なし
		if(dbMap == null)
		{
			// マスタ未存在エラー
			String[] msgParam = new String[]
			{
				JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME,
				whereParam.getList().toString()
			};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0270CH, msgParam);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcInf][dbMap=" + dbMap.getMap().toString() + "]");

		prcGrpCd.append(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD));
		pcrsCd.append(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD));
		prcSvcCd.append(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD));
		prcKmkCd.append(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcInf]");
	}
	
	/**
	 * 過大入金判定
	 * 
	 * @param outList 出力リスト
	 * @return String 過大入金フラグ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String judgmentKadaiNyukin(ArrayList<JBSbatServiceInterfaceMap> outList) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][judgmentKadaiNyukin]");

		String kadaiNyukinFlg = KADAI_NYUKIN_FLG_KADAI;

		JBSbatServiceInterfaceMap nyukinMap = (JBSbatServiceInterfaceMap)outList.get(0);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][judgmentKadaiNyukin][nyukinMap=" + nyukinMap.getMap().toString() + "]");

		// 入金合計額
		BigDecimal nyukinSum = new BigDecimal(0);
		nyukinSum = nyukinSum.add(nyukinMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT));

		JBSbatServiceInterfaceMap misyuMap = (JBSbatServiceInterfaceMap)outList.get(1);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][judgmentKadaiNyukin][misyuMap=" + misyuMap.getMap().toString() + "]");

		// 未収合計額
		BigDecimal misyuSum = new BigDecimal(0);
		// 未収合計額取得（未収レコードなし時はnull返却）
		BigDecimal misyuAmnt = misyuMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT);
		if(misyuAmnt != null)
		{
			misyuSum = misyuSum.add(misyuAmnt);
		}

		// 入金額：未収額　一致　または　過大入金の場合
		if(nyukinSum.compareTo(misyuSum) > 0 || nyukinSum.equals(misyuSum))
		{
			// 過大入金
			// 仕様変更により同額扱い
			kadaiNyukinFlg = KADAI_NYUKIN_FLG_DOUGAKU;
		}
		else
		{
			// 過小入金
			kadaiNyukinFlg = KADAI_NYUKIN_FLG_KASYO;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][judgmentKadaiNyukin][kadaiNyukinFlg=" + kadaiNyukinFlg + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][judgmentKadaiNyukin]");

		return kadaiNyukinFlg;
	}

	/**
	 * 出力編集処理
	 * 
	 * @param outList 出力リスト
	 * @param kadaiHnti 過大判定結果
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutMap(ArrayList<JBSbatServiceInterfaceMap> outList, String kadaiHnti, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutMap]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutMap][kadaiHnti=" + kadaiHnti + "]");

		ArrayList<JBSbatServiceInterfaceMap> tmpOutputList = new ArrayList<JBSbatServiceInterfaceMap>();
		JBSbatServiceInterfaceMap nyukinMap = (JBSbatServiceInterfaceMap)outList.get(0);
		JBSbatServiceInterfaceMap misyuMap = (JBSbatServiceInterfaceMap)outList.get(1);

		// 未収合計額
		int misyuRkn = 0;
		BigDecimal misyuAmnt = misyuMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT);
		if(misyuAmnt != null)
		{
			misyuRkn = Integer.parseInt(misyuAmnt.toString());
		}

		// 過大入金フラグが"0"（過小）
		if(KADAI_NYUKIN_FLG_KASYO.equals(kadaiHnti))
		{
			// 入金額（過小）
			tmpOutputList.add(0, makeOutMap(nyukinMap, prcGrpCdKshoNknAmntIn, pcrsCdKshoNknAmntIn, svcCdKashoNkinAmntIn,
										kmkCdKashoNkinAmntIn, nyukinMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT).toString()));
			if(misyuRkn != 0)
			{
				// 未収額（過小）
				tmpOutputList.add(1, makeOutMap(misyuMap, prcGrpCdKashoMisAmntIn, pcrsCdKashoMisAmntIn, svcCdKashoMisAmntIn, kmkCdKashoMisAmntIn, misyuAmnt.toString()));
			}
		}
		// 過大入金フラグが"1"（同額）
		// 仕様変更により、過大も同額扱い
		else
		{
			// 入金額（同額）
			tmpOutputList.add(0, makeOutMap(nyukinMap, prcGrpCdNkinAmntIn, pcrsCdNkinAmntIn, svcCdNkinAmntIn, kmkCdNkinAmntIn,
											nyukinMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT).toString()));
			if(misyuRkn != 0)
			{
				// 未収額（同額）
				tmpOutputList.add(1, makeOutMap(misyuMap, prcGrpCdMisAmntIn, pcrsCdMisAmntIn, svcCdMisAmntIn, kmkCdMisAmntIn, misyuAmnt.toString()));
			}
		}

		// 次のレコードが設定されている場合
		if(outList.size() == 3)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutMap][出力リストに３レコード存在]");
			
			JBSbatServiceInterfaceMap nextMap = (JBSbatServiceInterfaceMap)outList.get(2);
			
			// サービス識別
			String svcSkbt = nextMap.getString(JBSbatCHIFM068.SVC_SKBT);
			
			// サービス識別　≠　"2"（入金）の場合
			if(!svcSkbt.equals(JACStrConst.SVC_SKBT_NYUKIN))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutMap][３レコード目（未収）]");
				// ダミーレコード追加
				tmpOutputList.add(new JBSbatServiceInterfaceMap());
			}
			// リスト追加
			tmpOutputList.add(nextMap);
		}
		// 出力共通電文に出力リストを設定
		outputInItem.setOutMapList(tmpOutputList);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutMap]");

		return;
	}

	/**
	 * 出力MAP作成
	 * 
	 * @param tmpMap 出力リスト
	 * @param prcGrpCd 料金グループコード
	 * @param pcrsCd   料金コースコード
	 * @param prcSvcCd 料金サービスコード
	 * @param rknKmkCd 料金項目コード
	 * @param prc 料金
	 * @return JBSbatServiceInterfaceMap 編集後出力共通電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatServiceInterfaceMap makeOutMap(JBSbatServiceInterfaceMap tmpMap, String prcGrpCd, String pcrsCd,
												String prcSvcCd, String rknKmkCd, String prc) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutMap]");

		JBSbatServiceInterfaceMap resultOutMap = new JBSbatServiceInterfaceMap();

		// 出力項目設定（料金資材を使用しているため、項目名と設定内容が等しいとは限らない）
		// 請求先番号
		resultOutMap.setString(JBSbatCHIFM099.SEIKY_KEI_NO, tmpMap.getString(JBSbatCHIFM068.SEIKY_NO));
		// 請求年月
		resultOutMap.setString(JBSbatCHIFM099.SEIKY_YM, tmpMap.getString(JBSbatCHIFM068.SEIKY_YM));
		// 整理番号
		resultOutMap.setString(JBSbatCHIFM099.SEIRI_NO, tmpMap.getString(JBSbatCHIFM068.SEIRI_NO));
		// 割引サービス契約番号
		resultOutMap.setString(JBSbatCHIFM099.WRIB_SVC_KEI_NO, JACStrConst.KARA_MOJI);
		// 割引サービス対象契約番号
		resultOutMap.setString(JBSbatCHIFM099.WRISVC_TRGT_KEI_NO, JACStrConst.KARA_MOJI);
		// サービス番号
		resultOutMap.setString(JBSbatCHIFM099.SVC_NO, tmpMap.getString(JBSbatCHIFM068.NYUKIN_NO));
		// オプションサービス契約番号
		resultOutMap.setString(JBSbatCHIFM099.OP_SVKEI_NO, JACStrConst.KARA_MOJI);
		// 料金サービス識別コード
		resultOutMap.setString(JBSbatCHIFM099.SVC_SKBT_CD, JACStrConst.KARA_MOJI);
		// 料金グループコード
		resultOutMap.setString(JBSbatCHIFM099.PRC_GRP_CD, prcGrpCd);
		// 料金コースコード
		resultOutMap.setString(JBSbatCHIFM099.PCRS_CD, pcrsCd);
		// 料金サービスコード
		resultOutMap.setString(JBSbatCHIFM099.PRC_SVC_CD, prcSvcCd);
		// 料金項目コード
		resultOutMap.setString(JBSbatCHIFM099.PRC_KMK_CD, rknKmkCd);
		// 徴収パターンコード
		resultOutMap.setString(JBSbatCHIFM099.COLLECT_PATTERN_CD, JACStrConst.KARA_MOJI);
		// 料金
		resultOutMap.setString(JBSbatCHIFM099.PRC, prc);
		// 利用開始日
		resultOutMap.setString(JBSbatCHIFM099.USE_STAYMD, JACStrConst.YMD_SP);
		// 利用終了日
		resultOutMap.setString(JBSbatCHIFM099.USE_ENDYMD, JACStrConst.YMD_SP);
		// サービス開始日
		resultOutMap.setString(JBSbatCHIFM099.SVC_STAYMD, JACStrConst.KARA_MOJI);
		// 初回課金開始日
		resultOutMap.setString(JBSbatCHIFM099.FIRST_CHRG_STAYMD, tmpMap.getString(JBSbatCHIFM068.NYUKIN_TG_SAIKEN_YM));
		// サービス解約日
		resultOutMap.setString(JBSbatCHIFM099.SVC_DSL_YMD, tmpMap.getString(JBSbatCHIFM068.NYUKIN_ROUTE_CD));
		// サービス解約理由
		resultOutMap.setString(JBSbatCHIFM099.SVC_DLRE, tmpMap.getString(JBSbatCHIFM068.SEIKY_KEI_NO));
		// サービス回復日
		resultOutMap.setString(JBSbatCHIFM099.SVC_KAIHK_DAY, tmpMap.getString(JBSbatCHIFM068.SAIKEN_NO));
		// 利用日数
		resultOutMap.setString(JBSbatCHIFM099.USE_DAY_CNT, tmpMap.getBigDecimal(JBSbatCHIFM068.TRN_JUN_PRC_KMK_CD).toString());
		// 利用不可日数
		resultOutMap.setString(JBSbatCHIFM099.USE_FAIL_DAY_CNT, JACStrConst.KARA_MOJI);
		// 相対区分
		resultOutMap.setString(JBSbatCHIFM099.AIT_DIV, JACStrConst.KARA_MOJI);
		// 締め日
		resultOutMap.setString(JBSbatCHIFM099.SIME_DAY, tmpMap.getBigDecimal(JBSbatCHIFM068.TRN_JUN_SAIKEN_FIX_YM).toString());
		// 利用不可適用可否
		resultOutMap.setString(JBSbatCHIFM099.USE_APLY_KH_CD, JACStrConst.KARA_MOJI);
		// 前受相殺優先順位
		resultOutMap.setString(JBSbatCHIFM099.MAE_YUSEN_JUN, MAE_YUSEN_JUN_ZERO);
		// 割引優先順位
		resultOutMap.setString(JBSbatCHIFM099.WRIB_YUSEN_JUN, JACStrConst.KARA_MOJI);
		// 上限判定優先順位
		resultOutMap.setString(JBSbatCHIFM099.UPPL_JUDGE_YUSEN_JUN, JACStrConst.KARA_MOJI);
		// 割引繰越可否
		resultOutMap.setString(JBSbatCHIFM099.WRIB_KKSHI_KH, JACStrConst.KARA_MOJI);

		// 出力フラグを設定
		resultOutMap.setOutFlg(true);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutMap][resultOutMap=" + resultOutMap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutMap]");

		return resultOutMap;
	}
	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
	
}
