/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHTkskJskKeiyakuInfAdd
*	ソースファイル名	：JBSbatCHTkskJskKeiyakuInfAdd.java
*	作成者				：富士通　
*	作成日				：2016年05月06日
*＜機能概要＞
*　TRANK向け督促実績契約情報付与部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v26.00.00	2016/05/06  FJ）三宅	新規作成
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatCHIFE514;
import eo.business.util.file.JBSbatCHIFM264;
import eo.business.util.file.JBSbatCHIFM265;
import eo.business.util.table.JBSbatZM_M_CD_NM_KANRI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHTkskJskKeiyakuInfAdd extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** SQL定義キー(CH_SELECT_010)*/
	private static final String ZM_M_CD_NM_KANRI_CH_SELECT_010 = "CH_SELECT_010";

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	ArrayList<HashMap<String, String>> tokusokuStatList = null;

	/**
	 * 初期処理
	 * @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);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		this.tokusokuStatList = getTokusokuStatList();
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 入力ＭのみNullの場合
		if (mastMap == null)
		{
			// 処理対象外
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
			return outputInItem;
		}
		// 入力ＴのみNullの場合
		else if (tranMap == null)
		{
			// 処理対象外
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);
			return outputInItem;
		}
		
		// マスタファイルのキーを取得
		String mastKey = mastMap.getString(JBSbatCHIFM264.SEIKY_SAKI_NO);	// 請求先番号
		// トランファイルのキーを取得
		String tranKey = tranMap.getString(JBSbatCHIFM265.SEIKY_SAKI_NO);	// 請求先番号
		
		if(mastKey.equals(tranKey))
		{
			//----------------------------------------------------------
			// マスタファイルとトランファイルの督促番号が一致した場合
			//----------------------------------------------------------
			// ファイル出力
			this.setOuptputItem(mastMap, tranMap, outputInItem);
			// キーマッチ処理フラグを設定する
			this.setMatchProcFlg(true);
			
		}
		else if(mastKey.compareTo(tranKey) < 0)
		{
			//----------------------------------------------------------
			// マスタファイル請求先番号がトランファイルに存在しない場合
			//----------------------------------------------------------
			// 請求先に対してSYSIDが付与できないため、ファイル出力不要
			
			// マスタファイル処理フラグを設定する
			this.setMastProcFlg(true);

		}
		else
		{
			//----------------------------------------------------------
			// トランファイル請求先番号がマスタファイルに存在しない場合
			//----------------------------------------------------------
			// レコード出力は行わない
			
			// トランファイル処理フラグを設定する
			this.setTranProcFlg(true);
		}
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_CD_NM_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * コード名称管理マスタから督促ステータスの名称を取得する
	 * 
	 * @return tokusokuStatList 督促ステータスのコード・名称が格納されたList
	 * @throws Exception        呼び出し元に返す例外
	 */
	private ArrayList<HashMap<String, String>> getTokusokuStatList() throws Exception
	{
		ArrayList<HashMap<String, String>> tokusokuStatList = new ArrayList<HashMap<String, String>>();
		
		// SQL実行
		executeZM_M_CD_NM_KANRI_CH_SELECT_010(new String[]{super.opeDate, super.opeDate});
		// レコードの取得
		JBSbatCommonDBInterface record =db_ZM_M_CD_NM_KANRI.selectNext();
		//レコードの存在チェック
		if (null != record)
		{
			HashMap<String, String> tokusokuStatMap = null;
			while(null != record)
			{
				tokusokuStatMap = new HashMap<String, String>();
				String key = record.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV);
				String val = record.getString(JBSbatZM_M_CD_NM_KANRI.CD_DIV_ALI);
				// 督促ステータスのコード・名称
				tokusokuStatMap.put(key, val);
				
				// リストに追加
				tokusokuStatList.add(tokusokuStatMap);
				
				// 次のレコード情報取得
				record = db_ZM_M_CD_NM_KANRI.selectNext();
			}
		}
		return tokusokuStatList;
	}

	/**
	 * 出力情報を設定します。
	 * 
	 * @param mastMap 入力M
	 * @param tranMap 入力T
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOuptputItem(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		//-------------------------------------------------------
		// 督促ステータスの名称取得
		//-------------------------------------------------------
		String tokusokuStatCd = (String)mastMap.get(JBSbatCHIFM264.TOKUSOKU_STAT);
		String tokusokuStatNm = "";
		for(HashMap<String, String> tokusokuStatMap : this.tokusokuStatList)
		{
			if(tokusokuStatMap.containsKey(tokusokuStatCd))
			{
				// 督促ステータスの名称を設定
				tokusokuStatNm = tokusokuStatMap.get(tokusokuStatCd);
			}
		}
		if(tokusokuStatNm == null || "".equals(tokusokuStatNm))
		{
			// 業務例外 ※入力ファイル（督促実績情報ファイル"CHIFM264"）の督促ステータスにマスタに存在しない値が設定されている
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0260CE, 
					new String[] { JBSbatZM_M_CD_NM_KANRI.TABLE_NAME, tokusokuStatCd });
		}
		
		//-------------------------------------------------------
		// ファイル出力
		//-------------------------------------------------------
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap(); // 出力情報
		
		outputMap.setString(JBSbatCHIFE514.SYSID,            tranMap.get(JBSbatCHIFM265.SYSID));			// 請求先番号
		outputMap.setString(JBSbatCHIFE514.SEIKY_SAKI_NO,    mastMap.get(JBSbatCHIFM264.SEIKY_SAKI_NO));	// 督促番号
		outputMap.setString(JBSbatCHIFE514.TOKUSOKU_STAT,    tokusokuStatCd);								// 督促ステータス
		outputMap.setString(JBSbatCHIFE514.TOKUSOKU_STAT_NM, tokusokuStatNm); 								// 督促ステータス名称
		outputMap.setString(JBSbatCHIFE514.TOKUSOKU_IDO_YMD, mastMap.get(JBSbatCHIFM264.TOKUSOKU_IDO_YMD)); // 督促異動年月日
		
		// 出力フラグをtrue
		outputMap.setOutFlg(true);
		
		// 出力レコード情報を設定する
		outputInItem.addOutMapList(outputMap);
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(CH_SELECT_010)で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_010(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_CH_SELECT_010);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
