/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSknksitkcmNukinListInfoHenshu
*	ソースファイル名	：JBSbatCHSknksitkcmNukinListInfoHenshu.java
*	作成者				：富士通　
*	作成日				：2021年07月28日
*＜機能概要＞
*　債権回収委託会社入金リスト情報編集部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v54.00.00	2021/07/28	FJ)吉田		【ANK-4079-00-00】債権委託先会社からの入金処理システム化対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM402;
import eo.business.util.file.JBSbatCHIFM403;
import eo.business.util.table.JBSbatCH_M_SKNKSITKCM;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JCHStringUtil;
import eo.common.util.JPCFomatString;
import eo.common.util.JPCUtilCommon;
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 JBSbatCHSknksitkcmNukinListInfoHenshu extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";
	
	/** SQL定義キー(CH_SELECT_001)*/
	private static final String ZM_M_CD_NM_KANRI_CH_SELECT_001 = "CH_SELECT_001";
	
	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;
	
	/** テーブル(債権回収委託会社)*/
	private static final String D_TBL_NAME_CH_M_SKNKSITKCM = "CH_M_SKNKSITKCM";
	
	/** SQL定義キー(CH_SELECT_001)*/
	private static final String CH_M_SKNKSITKCM_CH_SELECT_001 = "CH_SELECT_001";
	
	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_CH_M_SKNKSITKCM = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** ゼロ */
	private static final String AMNT_ZERO = "0";
	
	/** 収納状態:一部収納 */
	private static final String SHUNO_STAT_ICHIBU_SHUNO = "一部収納済";
	
	/** 収納状態:収納済 */
	private static final String SHUNO_STAT_SHUNO_ZUMI = "収納済";
	
	/** SEQ番号 */
	private int seqNo = 0;
	
	/** SEQ番号枝番 */
	private int seqNoSub = 0;
	
	private int dataCnt = 0;
	
	// 退避
	/** 退避．キー情報  */
	private String prcKey = JACStrConst.KARA_MOJI;
	/** 退避.入金番号 */
	private String nyukinNo = JACStrConst.KARA_MOJI;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		db_CH_M_SKNKSITKCM  = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_SKNKSITKCM);
		
		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 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;
		
		
		if (inMap == null)
		{
			return outputInItem;
		}
		// キー情報取得
		String key = getKeyInfo(inMap);
		
		// キー情報 ≠ 退避.キー情報の場合
		// (初回データ、あるいはキー情報が変わったとき)
		if (!prcKey.equals(key))
		{
		
			seqNo++;
			seqNoSub = 1;
			prcKey = key;
			
			makeOutputData(inMap, outputInItem);
		}
		// キー情報 ＝ 退避.キー情報の場合
		else{
			String seikyKeiNo = inMap.getString(JBSbatCHIFM402.SEIKY_KEI_NO);
			// 請求契約番号が未設定の場合
			if ("".equals(seikyKeiNo))
			{
				seqNo++;
				seqNoSub = 1;
				prcKey = key;
				
				makeOutputData(inMap, outputInItem);
			}
			// 請求契約番号が設定済の場合
			else
			{
				seqNoSub++;
				
				makeOutputData(inMap, outputInItem);
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * SEQ採番のキー情報を作成します。
	 * 
	 * @param inMap
	 * @return
	 * @throws Exception
	 */
	private String getKeyInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		String key = JACStrConst.KARA_MOJI;
		
		// 領収日
		String receiptYmd = inMap.getString(JBSbatCHIFM402.RECEIPT_YMD);
		// 請求契約番号
		String seikyKeiNo = inMap.getString(JBSbatCHIFM402.SEIKY_KEI_NO);
		
		key = receiptYmd + seikyKeiNo;

		return key;
	}

	/**
	 * 出力データを作成します。
	 * 
	 * @param mastMap 入力電文
	 * @param tranMap 入力電文
	 * @param outputInItem  出力電文
	 * @param kagenSkbtCd 加減識別コード
	 * @throws Exception
	 */
	private void makeOutputData(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputData]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][inMap=" + inMap.getMap().toString() + "]");

		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 1行目のデータの場合、タイトル行を作成する。
		if (dataCnt == 0)
		{
			makeOutputTitle(outputInItem);
		}
		
		// 出力文字列の書式を変更する
		convertOutputStr(inMap);
		
		// 領収日
		outMap.setString(JBSbatCHIFM403.RECEIPT_YMD, inMap.getString(JBSbatCHIFM402.RECEIPT_YMD));
		// 入金額
		outMap.setString(JBSbatCHIFM403.NYUKIN_AMNT, inMap.getString(JBSbatCHIFM402.NYUKIN_AMNT));
		// 入金経路コード
		outMap.setString(JBSbatCHIFM403.NYUKIN_ROUTE_CD, getNyukinRoute(inMap));
		// 債権回収委託会社コード
		outMap.setString(JBSbatCHIFM403.SKNKSITKCM_CD, getSknksitkcm(inMap));
		// 請求先番号
		outMap.setString(JBSbatCHIFM403.SEIKY_KEI_NO, inMap.getString(JBSbatCHIFM402.SEIKY_KEI_NO));
		// 債権月
		outMap.setString(JBSbatCHIFM403.SAIKEN_YM, inMap.getString(JBSbatCHIFM402.SAIKEN_YM));
		// 充当額
		outMap.setString(JBSbatCHIFM403.JUTO_AMNT, inMap.getString(JBSbatCHIFM402.JUTO_AMNT));
		// 未収額
		outMap.setString(JBSbatCHIFM403.MISHU_AMNT, inMap.getString(JBSbatCHIFM402.MISHU_AMNT));
		// 収納状態
		outMap.setString(JBSbatCHIFM403.SHUNO_STAT, getShunoStat(inMap));
		
		// 入金番号が切り替わった場合のみ金庫情報を出力する。
		if ( !nyukinNo.equals(inMap.getString(JBSbatCHIFM402.NYUKIN_NO)))
		{
			// 入金番号を退避する
			nyukinNo = inMap.getString(JBSbatCHIFM402.NYUKIN_NO);
			// 金庫番号
			outMap.setString(JBSbatCHIFM403.KNK_NO, inMap.getString(JBSbatCHIFM402.KNK_NO));
			// 金庫ステータス
			outMap.setString(JBSbatCHIFM403.KNK_STAT, inMap.getString(JBSbatCHIFM402.KNK_STAT));
			// 金庫金額
			outMap.setString(JBSbatCHIFM403.KNK_AMNT, inMap.getString(JBSbatCHIFM402.KNK_AMNT));
		}
		// メッセージ
		outMap.setString(JBSbatCHIFM403.MESSAGE, inMap.getString(JBSbatCHIFM402.MESSAGE));
		
		outMap.setOutFlg(true);
		
		// 出力レコード作成
		outputInItem.addOutMapList(outMap);
		
		dataCnt++;
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputData][outputInItem=" + outputInItem.getOutMapList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputData]");
	}

	/**
	 * 出力データのタイトル行を作成します。
	 * 
	 * @param outputInItem
	 * @throws Exception 
	 */
	private void makeOutputTitle(JBSbatOutputItem outputInItem) throws Exception {
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 領収日
		outMap.setString(JBSbatCHIFM403.RECEIPT_YMD, "領収日");
		// 入金額
		outMap.setString(JBSbatCHIFM403.NYUKIN_AMNT, "入金額");
		// 入金経路コード
		outMap.setString(JBSbatCHIFM403.NYUKIN_ROUTE_CD, "入金経路");
		// 債権回収委託会社コード
		outMap.setString(JBSbatCHIFM403.SKNKSITKCM_CD, "債権回収委託会社");
		// 請求先番号
		outMap.setString(JBSbatCHIFM403.SEIKY_KEI_NO, "請求先番号");
		// 債権月
		outMap.setString(JBSbatCHIFM403.SAIKEN_YM, "請求年月");
		// 充当額
		outMap.setString(JBSbatCHIFM403.JUTO_AMNT, "充当額");
		// 未収額
		outMap.setString(JBSbatCHIFM403.MISHU_AMNT, "未収額");
		// 収納状態
		outMap.setString(JBSbatCHIFM403.SHUNO_STAT, "収納状態");
		// 金庫番号
		outMap.setString(JBSbatCHIFM403.KNK_NO, "金庫番号");
		// 金庫ステータス
		outMap.setString(JBSbatCHIFM403.KNK_STAT, "金庫ステータス");
		// 金庫金額
		outMap.setString(JBSbatCHIFM403.KNK_AMNT, "金庫金額");
		// メッセージ
		outMap.setString(JBSbatCHIFM403.MESSAGE, "メッセージ");
		
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
	}

	/**
	 * リスト出力時に出力文字列に編集が必要な項目を変換します。
	 * 
	 * @throws Exception 
	 * 
	 */
	private void convertOutputStr(JBSbatServiceInterfaceMap inMap) throws Exception  {
		
		String receiptYmd	=	inMap.getString(JBSbatCHIFM402.RECEIPT_YMD);	// 領収日
		String nyukinAmnt	=	inMap.getString(JBSbatCHIFM402.NYUKIN_AMNT);	// 入金額
		String saikenYmd	=	inMap.getString(JBSbatCHIFM402.SAIKEN_YM);		// 債権月
		String jutoAmnt		=	inMap.getString(JBSbatCHIFM402.JUTO_AMNT);		// 充当額
		String knkAmnt		=	inMap.getString(JBSbatCHIFM402.KNK_AMNT);		// 金庫額
		String mishuAmnt	=	inMap.getString(JBSbatCHIFM402.MISHU_AMNT);		// 未収額
		
		// 各種変換を行う
		receiptYmd	=	JPCFomatString.formatDate(receiptYmd);
		nyukinAmnt	=	JPCFomatString.formatNumber(nyukinAmnt);
		if(!JCHStringUtil.isNullBlank(saikenYmd))
		{
			saikenYmd	=	JPCUtilCommon.toYearFromYm(saikenYmd) + "年" + Integer.parseInt(JPCUtilCommon.toMonthFromYm(saikenYmd)) + "月";
		}
		jutoAmnt	=	JPCFomatString.formatNumber(jutoAmnt);
		knkAmnt		=	JPCFomatString.formatNumber(knkAmnt);
		mishuAmnt	=	JPCFomatString.formatNumber(mishuAmnt);
		
		// 変換した文字列をinMapへ上書きする
		// 収納日付
		inMap.setString(JBSbatCHIFM402.RECEIPT_YMD, receiptYmd);

		// 入金額
		inMap.setString(JBSbatCHIFM402.NYUKIN_AMNT, nyukinAmnt);
		// 債権月
		inMap.setString(JBSbatCHIFM402.SAIKEN_YM, saikenYmd);
		// 充当額
		inMap.setString(JBSbatCHIFM402.JUTO_AMNT, jutoAmnt);
		// 金庫額
		inMap.setString(JBSbatCHIFM402.KNK_AMNT, knkAmnt);
		// 未収額
		inMap.setString(JBSbatCHIFM402.MISHU_AMNT, mishuAmnt);
	}

	/**
	 * 入金経路コードを取得します。
	 * 
	 * @param inMap
	 * @return
	 */
	private Object getNyukinRoute(JBSbatServiceInterfaceMap inMap) throws Exception {
		
		return getCodeNmKanri(JZM0171Constant.CD00176, inMap.getString(JBSbatCHIFM402.NYUKIN_ROUTE_CD));
	}
	
	/**
	 * 収納状態を取得します
	 * 
	 * @param inMap
	 * @return
	 */
	private Object getShunoStat(JBSbatServiceInterfaceMap inMap)  throws Exception {
		//充当額
		String jutoAmnt = inMap.getString(JBSbatCHIFM402.JUTO_AMNT);
		//未収額
		String mishuAmnt = inMap.getString(JBSbatCHIFM402.MISHU_AMNT);
		
		// 充当額が設定無の場合
		if(JACStrConst.KARA_MOJI.equals(jutoAmnt))
		{
			// 収納状態は""(空)
			return JACStrConst.KARA_MOJI;
		}
		// 充当額が0の場合
		else if(AMNT_ZERO.equals(jutoAmnt))
		{
			// 未収額が0以外の場合
			if(!AMNT_ZERO.equals(mishuAmnt))
			{
				// 債権番号から債権ステータスを取得する
				return getSaikenStat(inMap);
			}
			return JACStrConst.KARA_MOJI;
		}
		// 充当額が0以外の場合
		else
		{
			// 未収額が設定無の場合
			if(JACStrConst.KARA_MOJI.equals(mishuAmnt))
			{
				// 収納状態は""(空)
				return JACStrConst.KARA_MOJI;
			}
			// 未収額が0の場合
			else if(AMNT_ZERO.equals(mishuAmnt))
			{
				return SHUNO_STAT_SHUNO_ZUMI;
			}
			// 未収額が0以外の場合
			else
			{
				return SHUNO_STAT_ICHIBU_SHUNO;
			}
		}
	}
	
	/**
	 * 債権ステータスを取得します。
	 * 
	 * @param inMap
	 * @return
	 * @throws Exception 
	 */
	private String getSaikenStat(JBSbatServiceInterfaceMap inMap) throws Exception {
		
		String saikenStatNm = JACStrConst.KARA_MOJI;
		
		// 収納状態(債権ステータス)が設定されていたら
		if (!JCHStringUtil.isNullBlank(inMap.getString(JBSbatCHIFM402.SHUNO_STAT)))
		{
			// 収納状態(債権ステータス)が設定されていたら債権ステータス名称を取得
			saikenStatNm = getCodeNmKanri(JZM0171Constant.CD00158, inMap.getString(JBSbatCHIFM402.SHUNO_STAT));
		}
		
		return saikenStatNm;
	}
	
	/**
	 * コード名称管理からコード区分名を取得します。
	 * 
	 * @param cdSbtCd
	 * @param cdDiv
	 * @return
	 * @throws Exception
	 */
	private String getCodeNmKanri(String cdSbtCd, String cdDiv) throws Exception
	{
		String cdDivNm = JACStrConst.KARA_MOJI;
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(cdSbtCd);							// コード種別コード
		paramList.setValue(cdDiv);								// コード区分
		paramList.setValue(super.opeDate);						// 適用開始年月日
		paramList.setValue(super.opeDate);						// 適用終了年月日
		
		// SQL実行
		executeZM_M_CD_NM_KANRI_CH_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_ZM_M_CD_NM_KANRI.selectNext(); 
		
		if(dbMap != null)
		{
			cdDivNm = dbMap.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_NM);
		}
		
		return cdDivNm;
	}
	
	/**
	 * SQLKEY(CH_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード名称管理．コード種別コード
	 *		 	コード名称管理．コード区分
	 *		 	コード名称管理．適用開始年月日
	 *		 	コード名称管理．適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_CH_SELECT_001(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());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_CH_SELECT_001);
	}
	
	/**
	 * 債権回収委託会社コードから債権回収委託会社名を取得します。
	 * 
	 * @param cdSbtCd
	 * @param cdDiv
	 * @return
	 * @throws Exception
	 */
	private Object getSknksitkcm(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		String SknksitkcmNm = JACStrConst.KARA_MOJI;
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(inMap.getString(JBSbatCHIFM402.SKNKSITKCM_CD));		// 債権回収委託会社コード
		paramList.setValue(super.opeDate);										// 適用開始年月日
		paramList.setValue(super.opeDate);										// 適用終了年月日
		
		// SQL実行
		executeCH_M_SKNKSITKCM_CH_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_SKNKSITKCM.selectNext(); 
		
		if(dbMap != null)
		{
			SknksitkcmNm = dbMap.getString(JBSbatCH_M_SKNKSITKCM.SKNKSITKCM_NM);
		}
		
		return SknksitkcmNm;
	}
	
	/**
	 * SQLKEY(CH_SELECT_001)で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_SKNKSITKCM_CH_SELECT_001(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_CH_M_SKNKSITKCM.selectBySqlDefine(paramList, CH_M_SKNKSITKCM_CH_SELECT_001);
	}

	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		db_ZM_M_CD_NM_KANRI.close();
		db_CH_M_SKNKSITKCM.close();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
}
