/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatZMAdAplyHoseiCst
*	ソースファイル名	：JBSbatZMAdAplyHoseiCst.java
*	作成者				：富士通　
*	作成日				：2011年11月30日
*＜機能概要＞
*　当月分住所適用日データ抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v2.00.00	2011/11/30	FJ)岩元		新規作成
*	v4.00.00	2012/11/15	FJ)伊藤		【TAI-2012-0000140】品質強化対策
*	v4.01.00	2013/01/08  FJ)日野		【TAI-2012-0000142】バッチ異常終了時のメッセージについて【優先度A】
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JZMBatCommon;
import eo.business.common.JZMBatConst;
import eo.business.common.JZMBatConstZokuseiEnum;
import eo.business.util.file.JBSbatZMIFM011;
import eo.business.util.table.JBSbatZM_T_AD_APLY_HOSEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* 当月分住所適用日データ抽出クラスです。<p>
*<BR>
* @author 富士通
*/
public class JBSbatZMAdAplyHoseiCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
	
	/** 住所コード上５桁 */
	private static final String AD_CD_KAMI5 = "住所適用日補正.住所コード上５桁";

	/** 住所コード下６桁 */
	private static final String AD_CD_SHIMO6 = "住所適用日補正.住所コード下６桁";

	/** 住所変更種別コード */
	private static final String AD_CHG_SBT_CD = "住所適用日補正.住所変更種別コード";

	/** 呼称変更フラグ */
	private static final String KOSHO_CHG_FLG = "住所適用日補正.呼称変更フラグ";

	/** 郵便番号変更フラグ */
	private static final String PCD_CHG_FLG = "住所適用日補正.郵便番号変更フラグ";

	/** 処理年月 */
	private static final String TRN_YM = "住所適用日補正.処理年月";

	/** 住所コード上５桁 英名 */
	private static final String DB_AD_CD_KAMI5 = "DB-ZM_T_AD_APLY_HOSEI-.AD_CD_KAMI5";

	/** 住所コード下５桁 英名 */
	private static final String DB_AD_CD_SHIMO6 = "DB-ZM_T_AD_APLY_HOSEI-.AD_CD_SHIMO6";

	/** 住所変更種別コード 英名 */
	private static final String DB_AD_CHG_SBT_CD = "DB-ZM_T_AD_APLY_HOSEI-.AD_CHG_SBT_CD";

	/** 呼称変更フラグ 英名 */
	private static final String DB_KOSHO_CHG_FLG = "DB-ZM_T_AD_APLY_HOSEI-.KOSHO_CHG_FLG";

	/** 郵便番号変更フラグ 英名 */
	private static final String DB_PCD_CHG_FLG = "DB-ZM_T_AD_APLY_HOSEI-.PCD_CHG_FLG";

	/** 処理年月 英名 */
	private static final String DB_TRN_YM = "DB-ZM_T_AD_APLY_HOSEI-.TRN_YM";
	
	/** 新住所コード上５桁  */
	private static final String NEW_AD_CD_KAMI5_NM = "新住所コード上５桁";

	/** メッセージ置換文字列　住所コード上５桁  */
	private static final String MSG_AD_CD_KAMI5 = "住所コード上５桁";

	/** メッセージ置換文字列　住所コード下６桁 */
	private static final String MSG_AD_CD_SHIMO6 = "住所コード下６桁";

	/** メッセージ置換文字列　処理年月  */
	private static final String MSG_TRN_YM = "処理年月";

	/* ++++++++++ v1.0.0 追加終了 ++++++++++ */


	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		/* ++++++++++ v1.0.0 追加開始 ++++++++++ */

		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// 単項目チェック・返却用ハッシュマップの作成
		HashMap<String, String> rsMap = new HashMap<String, String>();
		rsMap.put(JBSbatZM_T_AD_APLY_HOSEI.AD_CD_KAMI5, JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_KAMI5));
		rsMap.put(JBSbatZM_T_AD_APLY_HOSEI.AD_CD_SHIMO6, JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_SHIMO6));
		rsMap.put(JBSbatZMIFM011.AD_CHG_SBT_CD, JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CHG_SBT_CD));
		rsMap.put(JBSbatZMIFM011.KOSHO_CHG_FLG, JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.KOSHO_CHG_FLG));
		rsMap.put(JBSbatZMIFM011.PCD_CHG_FLG, JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.PCD_CHG_FLG));
		rsMap.put(JBSbatZMIFM011.TRN_YM, JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.TRN_YM));
		
		HashMap<String, String> itemvalueMap = new HashMap<String, String>();
		itemvalueMap.put(DB_AD_CD_KAMI5, AD_CD_KAMI5);
		itemvalueMap.put(DB_AD_CD_SHIMO6, AD_CD_SHIMO6);
		itemvalueMap.put(DB_AD_CHG_SBT_CD, AD_CHG_SBT_CD);
		itemvalueMap.put(DB_KOSHO_CHG_FLG, KOSHO_CHG_FLG);
		itemvalueMap.put(DB_PCD_CHG_FLG, PCD_CHG_FLG);
		itemvalueMap.put(DB_TRN_YM, TRN_YM);
		
		if(!isSingleCheckZM_T_AD_APLY_HOSEI_ZM_SELECT_001(rsMap, itemvalueMap))
		{
			
			// 単項目チェックでエラーが発生した場合、処理を終了する。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0060CW);
		}

		rsMap.remove(JBSbatZM_T_AD_APLY_HOSEI.AD_CD_KAMI5);
		rsMap.remove(JBSbatZM_T_AD_APLY_HOSEI.AD_CD_SHIMO6);
		
		// 補正対象年月日の設定
		rsMap.put(JBSbatZMIFM011.HOSEI_TG_YMD,
				JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.HOSEI_TG_YMD));
		
		if(JZMBatConst.ZERO_ONE.equals(rsMap.get(JBSbatZMIFM011.AD_CHG_SBT_CD)))
		{
			
			/* メッセージ用キー情報 */
			ArrayList<String> keyList = new ArrayList<String>();
			keyList.add(JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_KAMI5));
			keyList.add(JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_SHIMO6));
			keyList.add(JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.TRN_YM));
			
			// 単項目チェック
			JZMBatCommon.singleCheck(commonItem, NEW_AD_CD_KAMI5_NM,
					JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.NEW_AD_CD_KAMI5),
					JZMBatConstZokuseiEnum.hannkakuesuuji1, 5, 5,
					createErrMsg(JZMBatConst.BLANK, keyList));
			
			// 市町村合併元の情報の編集
			
			// 住所コードの設定
			rsMap.put(JBSbatZMIFM011.AD_CD,
					JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_KAMI5) + JZMBatConst.SIX_ZERO);
			
			// 補正データ種別の設定
			rsMap.put(JBSbatZMIFM011.HOSEI_DATA_SBT, JZMBatConst.ZERO_ONE);
			
			// 出力共通電文に入出力インターフェースを設定する。
			outputBean.addOutMapList(setOutMap(rsMap));

			// 市町村合併先の情報の編集
			HashMap<String, String> rsMap2 = new HashMap<String, String>();
			rsMap2.putAll(rsMap);
			
			// 住所コードの設定
			rsMap2.put(JBSbatZMIFM011.AD_CD,
					JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.NEW_AD_CD_KAMI5) + JZMBatConst.SIX_ZERO);
			
			// 補正データ種別の設定
			rsMap2.put(JBSbatZMIFM011.HOSEI_DATA_SBT, JZMBatConst.ZERO_TWO);
			
			// 出力共通電文に入出力インターフェースを設定する。
			outputBean.addOutMapList(setOutMap(rsMap2));
			
		}
		else if(JZMBatConst.ELEVEN.equals(rsMap.get(JBSbatZMIFM011.AD_CHG_SBT_CD)))
		{

			// 住所コードの設定
			rsMap.put(JBSbatZMIFM011.AD_CD,
					JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_KAMI5) +
					JZMBatCommon.getInMapData(inMap, JBSbatZM_T_AD_APLY_HOSEI.AD_CD_SHIMO6));
			
			// 補正データ種別の設定
			rsMap.put(JBSbatZMIFM011.HOSEI_DATA_SBT, JZMBatConst.ELEVEN);
			
			// 出力共通電文に入出力インターフェースを設定する。
			outputBean.addOutMapList(setOutMap(rsMap));
		}

		
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
		
		/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
	}
	
	
	/**
	 * JBSbatServiceInterfaceMapに結果マップを設定する処理です。
	 * @param map 結果マップ
	 * @return 出力マップ(JBSbatServiceInterfaceMap)
	 */
	private JBSbatServiceInterfaceMap setOutMap(HashMap<?, ?> map)
	{

		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.setMap(map);

		// 出力フラグを設定
		outMap.setOutFlg(true);
		
		return outMap;
	}

	/**
	 * エラーメッセージ作成処理です。
	 * @param strItem 項目名
	 * @param keyList 入力データ（TXT又はDB）を格納したArrayList
	 * @return string メッセージ置換文字列
	 */
	private String createErrMsg(String strItem, ArrayList<String> keyList)
	{
		StringBuffer sb = new StringBuffer();
		
		sb.append(strItem);
		sb.append(JZMBatConst.KAKKO_LEFT);
		sb.append(JZMBatConst.KEY);
		sb.append(JZMBatConst.ZENKAKU_COLON);
		sb.append(MSG_AD_CD_KAMI5);
		sb.append(JZMBatConst.EQUAL);
		sb.append(keyList.get(0));
		sb.append(JZMBatConst.CONMA);
		sb.append(MSG_AD_CD_SHIMO6);
		sb.append(JZMBatConst.EQUAL);
		sb.append(keyList.get(1));
		sb.append(JZMBatConst.CONMA);
		sb.append(MSG_TRN_YM);
		sb.append(JZMBatConst.EQUAL);
		sb.append(keyList.get(2));
		sb.append(JZMBatConst.KAKKO_RIGHT);
		
		return sb.toString();
	}
	
	/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（住所適用日補正）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 DB-ZM_T_AD_APLY_HOSEI-.AD_CD_KAMI5			住所適用日補正.住所コード上５桁
	 *			 DB-ZM_T_AD_APLY_HOSEI-.AD_CD_SHIMO6			住所適用日補正.住所コード下６桁
	 *			 DB-ZM_T_AD_APLY_HOSEI-.AD_CHG_SBT_CD			住所適用日補正.住所変更種別コード
	 *			 DB-ZM_T_AD_APLY_HOSEI-.KOSHO_CHG_FLG			住所適用日補正.呼称変更フラグ
	 *			 DB-ZM_T_AD_APLY_HOSEI-.PCD_CHG_FLG			住所適用日補正.郵便番号変更フラグ
	 *			 DB-ZM_T_AD_APLY_HOSEI-.TRN_YM			住所適用日補正.処理年月
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckZM_T_AD_APLY_HOSEI_ZM_SELECT_001(HashMap<String, String> rsMap, HashMap<String, String> itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;
		
		ArrayList<String> keyList = new ArrayList<String>();
		keyList.add((String)rsMap.get("AD_CD_KAMI5"));
		keyList.add((String)rsMap.get("AD_CD_SHIMO6"));
		keyList.add((String)rsMap.get("TRN_YM"));
		
		// 住所コード上５桁項目チェック
		strValue = (String)rsMap.get("AD_CD_KAMI5");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EZMB0030TW", new String[]{
					createErrMsg((String)itemvalueMap.get("DB-ZM_T_AD_APLY_HOSEI-.AD_CD_KAMI5"), keyList)});
			return false;
		}

		// 住所コード下６桁項目チェック
		strValue = (String)rsMap.get("AD_CD_SHIMO6");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EZMB0030TW", new String[]{
					createErrMsg((String)itemvalueMap.get("DB-ZM_T_AD_APLY_HOSEI-.AD_CD_SHIMO6"), keyList)});
			return false;
		}

		// 住所変更種別コード項目チェック
		strValue = (String)rsMap.get("AD_CHG_SBT_CD");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EZMB0030TW", new String[]{
					createErrMsg((String)itemvalueMap.get("DB-ZM_T_AD_APLY_HOSEI-.AD_CHG_SBT_CD"), keyList)});
			return false;
		}

		// 呼称変更フラグ項目チェック
		strValue = (String)rsMap.get("KOSHO_CHG_FLG");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EZMB0030TW", new String[]{
					createErrMsg((String)itemvalueMap.get("DB-ZM_T_AD_APLY_HOSEI-.KOSHO_CHG_FLG"), keyList)});
			return false;
		}

		// 郵便番号変更フラグ項目チェック
		strValue = (String)rsMap.get("PCD_CHG_FLG");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EZMB0030TW", new String[]{
					createErrMsg((String)itemvalueMap.get("DB-ZM_T_AD_APLY_HOSEI-.PCD_CHG_FLG"), keyList)});
			return false;
		}

		// 処理年月項目チェック
		strValue = (String)rsMap.get("TRN_YM");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EZMB0030TW", new String[]{
					createErrMsg((String)itemvalueMap.get("DB-ZM_T_AD_APLY_HOSEI-.TRN_YM"), keyList)});
			return false;
		}

		return true;
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
