/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHOrosiNkinDataMake
*	ソースファイル名	：JBSbatCHOrosiNkinDataMake.java
*	作成者				：富士通
*	作成日				：2018年03月22日
*＜機能概要＞
*　入金データ作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/03/22	 富士通		新規作成
*
*********************************************************************/
package eo.business.service;

import java.util.HashMap;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM043;
import eo.business.util.file.JBSbatCHIFM291;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatDateUtil;

/**
 * 卸入金データ作成<p>
 *<BR>
 * @author 富士通
 */
public class JBSbatCHOrosiNkinDataMake extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 入金経路コード */
	private static final String NYUKIN_ROUTE_CD = "97";
		
	/** 請求契約存在有無（有） */
	private static final String SEIKY_KEI_UMU_ARI = "1";
	
	/** 業務パラメータID */
	private static final String WORK_PARAM_ID = "CH_OROSHICD_SHUNO";

	/** 業務パラメータ設定値 */
	private String workParamSetteValue = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 取得した業務パラメータ設定値を格納するオブジェクトの生成
		HashMap<String,String> chOroshicdShuno = new HashMap<String,String>();
		
		// 業務パラメータ設定値取得（業務パラメータ管理検索）
		chOroshicdShuno = paramUtil.getGyoumuParameterMap(WORK_PARAM_ID, super.opeDate);
		this.workParamSetteValue = new String(chOroshicdShuno.get(WORK_PARAM_ID));
		
		// パラメータ取得クラスクローズ
		paramUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		// 引数有無判定
		if (inMap.getMap().isEmpty()) {
			return null;
		}
		
		// 請求年月の翌月末日算出
		String seikyYm = inMap.getString(JBSbatCHIFM291.SEIKY_YM);
		// 末日算出
		String day = JBSbatDateUtil.getEndOfMonth(seikyYm);
		// 翌月算出
		String nextYmd = JBSbatDateUtil.adjustMonth(seikyYm + day, 1);
		
		//卸先請求データより卸先事業者コードを取得
		String orsjgsCd = inMap.getString(JBSbatCHIFM291.ORSJGS_CD);
		
		//収納機関コード取得
		String shunokikan = getShunokikanCd(this.workParamSetteValue, orsjgsCd);
		//収納機関コードが取得できなければ卸入金データに出力をしない
		if(shunokikan.equals(JACStrConst.KARA_MOJI))
		{
			String logMsg = "卸先事業者コードに紐づく収納機関コードが存在しません。：";
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0340CW, new String[] {logMsg + inMap.getMap().toString()});
			return null;
		}

		// 卸入金データ作成
		JBSbatOutputItem outputItem = makeOrosiNkinData(inMap, nextYmd, shunokikan);
		return outputItem;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 卸先請求情報から卸入金データを作成します。
	 * 
	 * @param inMap 入力電文
	 * @param nextYmd 翌月末日
	 * @return outputItem 出力共通電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOrosiNkinData(JBSbatServiceInterfaceMap inMap, String nextYmd, String shunokikan) throws Exception
	{
		// 出力共通電文を格納するオブジェクトの生成
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 卸入金データ
		JBSbatServiceInterfaceMap nkinDataMap = new JBSbatServiceInterfaceMap();
		
		// 請求契約番号
		nkinDataMap.setString(JBSbatCHIFM043.SEIKY_KEI_NO,					inMap.getString(JBSbatCHIFM291.SEIKY_KEI_NO));
		// 請求年月
		nkinDataMap.setString(JBSbatCHIFM043.SEIKY_YM,						inMap.getString(JBSbatCHIFM291.SEIKY_YM));
		// 請求番号
		nkinDataMap.setString(JBSbatCHIFM043.SEIKY_NO,						inMap.getString(JBSbatCHIFM291.SEIKY_NO));
		// 請求書発行シーケンス
		nkinDataMap.setString(JBSbatCHIFM043.SKS_HAKKO_SEQ,					JACStrConst.KARA_MOJI);
		// 入金経路コード
		nkinDataMap.setString(JBSbatCHIFM043.NYUKIN_ROUTE_CD,				NYUKIN_ROUTE_CD);
		// 収納機関コード
		nkinDataMap.setString(JBSbatCHIFM043.SHUNOKIKAN_CD,					shunokikan);
		// 収納年月日
		nkinDataMap.setString(JBSbatCHIFM043.OUT_ORG_SHUNO_YMD,				nextYmd);
		// 入金額
		nkinDataMap.setString(JBSbatCHIFM043.NYUKIN_AMNT,					inMap.getLong(JBSbatCHIFM291.AMNT));
		// 領収年月日
		nkinDataMap.setString(JBSbatCHIFM043.RECEIPT_YMD,					nextYmd);
		// 領収時分秒
		nkinDataMap.setString(JBSbatCHIFM043.RECEIPT_HMS,				    JACStrConst.KARA_MOJI);
		// 入金処理済フラグ
		nkinDataMap.setString(JBSbatCHIFM043.NYUKIN_SYRZM_FLG,				JACStrConst.NKIN_SYORI_ZUMI_FLG_MI);
		// 窓口金融機関コード
		nkinDataMap.setString(JBSbatCHIFM043.MADOGUCHI_BANK_CD,				JACStrConst.KARA_MOJI);
		// 窓口金融機関支店コード
		nkinDataMap.setString(JBSbatCHIFM043.MADOGUCHI_BANK_SHITEN_CD,		JACStrConst.KARA_MOJI);
		// コンビニエンスストアコード
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_CD,					JACStrConst.KARA_MOJI);
		// コンビニ受付店コード
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_UK_TEN_CD,				JACStrConst.KARA_MOJI);
		// コンビニリアル業務区分コード
		nkinDataMap.setString(JBSbatCHIFM043.WORK_DIV,					    JACStrConst.KARA_MOJI);
		// コンビニリアル速報通知年月日
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_REAL_SOKHO_TCH_YMD,	JACStrConst.KARA_MOJI);
		// コンビニリアル速報通知時分秒
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_REAL_SOKHO_TCH_HMS,	JACStrConst.KARA_MOJI);
		// コンビニリアル速報処理済フラグ
		nkinDataMap.setString(JBSbatCHIFM043.CVS_REAL_SOKHO_SYRZM_FLG,		JACStrConst.KARA_MOJI);
		// コンビニデータ種別
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_DATA_SBT,				JACStrConst.KARA_MOJI);
		// コンビ二速報通知年月日
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_SOKHO_TCH_YMD,			JACStrConst.KARA_MOJI);
		// コンビニ速報処理済フラグ
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_SOKHO_SYRZM_FLG,		JACStrConst.KARA_MOJI);
		// コンビニ確報通知年月日
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_KAKHO_TCH_YMD,			JACStrConst.KARA_MOJI);
		// コンビニ取消通知年月日
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_SOKHO_CL_TCH_YMD,		JACStrConst.KARA_MOJI);
		// コンビニ支払予定年月日
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_PAY_RSV_YMD,			JACStrConst.KARA_MOJI);
		// コンビニ収納代行会社
		nkinDataMap.setString(JBSbatCHIFM043.CVSTORE_KAKNO_DAIKO_COMP,		JACStrConst.KARA_MOJI);
		// 振替結果コード
		nkinDataMap.setString(JBSbatCHIFM043.FURIKAE_RSLT_CD,				JACStrConst.KARA_MOJI);
		// 履歴詳細区分
		nkinDataMap.setString(JBSbatCHIFM043.RIREKI_DTL_DIV,				JACStrConst.KARA_MOJI);
		// 請求契約存在有無
		nkinDataMap.setString(JBSbatCHIFM043.SEIKY_KEI_UMU,					SEIKY_KEI_UMU_ARI);
		
		// 出力フラグON
		nkinDataMap.setOutFlg(true);

		// 出力共通電文設定
		outputItem.addOutMapList(nkinDataMap);
		
		return outputItem;
	}
	
	private String getShunokikanCd(String workParamSetteValue, String orsjgsCd) throws Exception
	{
		//業務パラメータ取得値を","で分割して配列に設定する。
		String[] search = workParamSetteValue.split(JACStrConst.COMMA);

		//業務パラメータに設定されている組合せ分判定を行う。
		for (int i = 0; i < search.length; i++) 
		{
			//分割した業務パラメータの取得値を":"で分割して配列に設定する。
			String[] str = search[i].split(JACStrConst.COLON);
			
			//取得した卸事業者コードと卸先請求データの卸事業者コードが一致するか判定を行う。
			if (str[0].equals(orsjgsCd))
			{
				//一致した場合は処理を終了する。
				return str[1];
			}
		}
		return JACStrConst.KARA_MOJI;
	}
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
