/*********************************************************************
 *   All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbEKK1071C031Edit
 *	ソースファイル名：JKKejbEKK1071C031Edit.java
 *	作成者			：富士通
 *	日付			：2011年07月14日
 *＜機能概要＞
 *	住所不備お客様情報審査部品クラス
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/07/14	富士通		新規作成
*	v5.00.00	2013/06/27	FJ) 沖田	IT1-2013-0001288
 *
 **********************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C031CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 住所不備お客様情報審査部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C031Edit
{

	/** 異動区分（新規契約） */
	private static final String IDO_IDV_NEW = "00001";

	/** 異動区分（サービス追加） */
	private static final String IDO_IDV_ADD = "00002";

	/** 手動入力フラグ（１） */
	private static final String MAN_INPUT_FLG_ONE = "1";

	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";
	
	/** 審査チェック結果 WORNING */
	private static final String CHECK_WG = "02";
	
	/** 住所コード存在判定エラー */
	private static final String NG_ADCD = "01";

	/** 郵便番号存在判定エラー */
	private static final String NG_PCD = "02";
	
	/** 住所名称一致判定エラー */
	private static final String NG_MEISHO = "03";
	
	/** 都道府県名判定エラー */
	private static final String NG_STATE = "030";
	
	/** 市区町村名一致判定エラー */
	private static final String NG_CITY = "031";
	
	/** 番地号一致判定エラー */
	private static final String NG_BNCHIGO = "032";
	
	/** 住所マスタ最下層チェックワーニング */
	private static final String WG_AD_KASO = "06";
	
	//お客様住所不備チェック
	/** 審査詳細種別コード(お客様住所不備チェック) */
	private static final String JDG_DTL_SBT_CD1 = "011";

	/** 審査対象画面タブコード */
	private static final String JUDGE_TG_SCREEN_TAB_CD = "03";

	/** 審査対象画面項目コード */
	private static final String JUDGE_TG_SCREEN_KMK_CD = "004";

	/** 審査詳細メッセージID： */
	private static final String JDG_DTL_MSG_ID_EKB0720_KW = "EKB0720-KW";

	/** 審査詳細メッセージID(利用場所住所不備チェック) */
	private static final String JDG_DTL_MSG_ID_AD_HBI2 = "EKB5400-KW";
	
	/** 審査詳細メッセージID：住所チェックワーニング */
	private static final String JDG_DTL_MSG_ID_EKBD290__Q = "EKBD290--Q";

	//住所コードが住所マスタに存在すること
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI1 = "住所マスタ,契約者住所";

	//郵便番号が住所マスタに存在すること
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI2 = "郵便番号";
	//住所の名称が住所マスタの名称と等しいこと
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI3 = "住所マスタ,契約者住所";

	/** メッセージ埋込み文字(都道府県) */
	private static final String MSG_UMKM_MOJI31 = "都道府県";

	/** メッセージ埋込み文字(市区町村) */
	private static final String MSG_UMKM_MOJI32 = "市区町村";
	
	/** メッセージ埋込み文字(番地号) */
	private static final String MSG_UMKM_MOJI33 = "番地号";
	
	//お客様<個人>住所不備チェック
	/** 審査詳細種別コード(お客様<個人>住所不備チェック) */
	private static final String JDG_DTL_SBT_CD2 = "012";

	//親権者住所コードが住所マスタに存在すること
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI4 = "住所マスタ,親権者住所";

	//親権者郵便番号が住所マスタに存在すること
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI5 = "親権者住所_郵便番号";
	
	/** メッセージ埋込み文字(都道府県) */
	private static final String MSG_UMKM_MOJI51 = "親権者住所_都道府県";

	/** メッセージ埋込み文字(市区町村) */
	private static final String MSG_UMKM_MOJI52 = "親権者住所_市区町村";
	
	/** メッセージ埋込み文字(番地号) */
	private static final String MSG_UMKM_MOJI53 = "親権者住所_番地号";

	//親権者住所の名称が住所マスタの名称と等しいこと
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI6 = "住所マスタ,親権者住所";
	
	/** 住所チェックレベル（1：全て） */
	private static final String AD_CHK_LV_ONE = "1";
	
	//住所最下層チェック(契約者住所)
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI7 = "契約者住所";
	
	//住所最下層チェック(親権者住所)
	/** メッセージ埋込み文字 */
	private static final String MSG_UMKM_MOJI8 = "親権者住所";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C031Edit()
	{
	}

	/**
	 * <p>
	 * 住所不備お客様情報審査のチェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getAdHbiOkForCustChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査.審査結果コード設定用
		String[] jdg_result = new String[2];

		// 異動区分が「新規契約」、「サービス追加」以外の場合チェック処理部品を呼ばない。
		String idoDiv = inMsg.getString(EKK1071C031CBSMsg.IDO_DIV);
		if(!IDO_IDV_NEW.equals(idoDiv) && !IDO_IDV_ADD.equals(idoDiv))
		{
			return CHECK_OK;
		}

		//お客様住所不備チェック
		//指定した条件で審査詳細実施条件を検索し、エラー結果コードの項目値を行う。
		String jdgStaCd = inMsg.getString(EKK1071C031CBSMsg.JDG_JSSI_KINO_SKBT_CD);	
		String errRsltCd1 = kk1071.getErrRsltKK1831(inMsg, jdgStaCd, JDG_DTL_SBT_CD1);
		if(errRsltCd1 != null)
		{
			Object result = CHECK_OK;
			// お客様_契約者住所手動入力フラグが"1"の場合は、番地号未入力チェック
			if (MAN_INPUT_FLG_ONE.equals(inMsg.getString(EKK1071C031CBSMsg.KEISHA_AD_MAN_INPUT_FLG)))
			{
				// お客様_契約者番地号が未入力の場合はチェック結果NG(住所名称一致判定)とする
				if (inMsg.isNull(EKK1071C031CBSMsg.KEISHA_BNCHIGO))
				{
					result = NG_MEISHO;
				}
			}
			// お客様_契約者住所手動入力フラグが"1"以外の場合は、住所不備チェック
			else
			{	
				// 引数設定
				String adCd = inMsg.getString(EKK1071C031CBSMsg.KEISHA_AD_CD);
				String pcd = inMsg.getString(EKK1071C031CBSMsg.KEISHA_PCD);
				String stateNm = inMsg.getString(EKK1071C031CBSMsg.KEISHA_STATE_NM);
				String cityNm = inMsg.getString(EKK1071C031CBSMsg.KEISHA_CITY_NM);
				String oaztsuNm = inMsg.getString(EKK1071C031CBSMsg.KEISHA_OAZTSU_NM);
				String azchoNm = inMsg.getString(EKK1071C031CBSMsg.KEISHA_AZCHO_NM);
				String banchiGo = inMsg.getString(EKK1071C031CBSMsg.KEISHA_BNCHIGO);

				// 審査チェック処理部品を呼び出す。
				result = kk1071.adHbiCheck(inMsg, adCd, pcd, stateNm, cityNm, oaztsuNm, azchoNm, banchiGo);
			}
			
			// お客様_契約者住所の住所最下層チェックを行う
			String adCd = inMsg.getString(EKK1071C031CBSMsg.KEISHA_AD_CD);
			String pcd = inMsg.getString(EKK1071C031CBSMsg.KEISHA_PCD);
			String akeishaAdChkLv = inMsg.getString(EKK1071C031CBSMsg.KEISHA_AD_CHK_LV);

			if (CHECK_OK.equals(result))
			{
				// お客様_契約者住所チェックレベルが"1"(全て)の場合
				if (AD_CHK_LV_ONE.equals(akeishaAdChkLv))
				{
					result = adCdMostBottomPriKikiKeisha(inMsg, kk1071, adCd, pcd);
				}
			}

			if(!CHECK_OK.equals(result))
			{
				String msgUmkmMoji = null;
				String jdgDtlMsgId = JDG_DTL_MSG_ID_EKB0720_KW;
				if(NG_ADCD.equals(result))
				{
					msgUmkmMoji = MSG_UMKM_MOJI1;
				}
				else if(NG_PCD.equals(result))
				{
					msgUmkmMoji = MSG_UMKM_MOJI2;
					jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
				}
				else if(NG_STATE.equals(result))
				{
					msgUmkmMoji = MSG_UMKM_MOJI31;
					jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
				}
				else if(NG_CITY.equals(result))
				{
					msgUmkmMoji = MSG_UMKM_MOJI32;
					jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
				}
				else if(NG_BNCHIGO.equals(result))
				{
					msgUmkmMoji = MSG_UMKM_MOJI33;
					jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
				}
				else if (WG_AD_KASO.equals(result)) {
					msgUmkmMoji = MSG_UMKM_MOJI7;
					jdgDtlMsgId = JDG_DTL_MSG_ID_EKBD290__Q;
					errRsltCd1 = CHECK_WG;
				}
				else
				{
					msgUmkmMoji = MSG_UMKM_MOJI3;
				}
				//審査詳細の登録を行う。
				createAdHbiCheck1(inMsg, inContext, errRsltCd1, msgUmkmMoji, jdgDtlMsgId);
				jdg_result[0] = errRsltCd1;
			}
		}

		// お客様<個人>住所不備チェック
		// 親権者情報の入力値チェックを行い、全て未入力ならOKとする
		if (isSkshaAllNull(inMsg, inContext))
		{
			jdg_result[1] = CHECK_OK;
		}
		else
		{
			// 指定した条件で審査詳細実施条件を検索し、エラー結果コードの項目値を行う。
			String errRsltCd2 = kk1071.getErrRsltKK1831(inMsg, jdgStaCd, JDG_DTL_SBT_CD2);
			if(errRsltCd2 != null)
			{
				Object result = CHECK_OK;
				// お客様＜個人＞_親権者住所手動入力フラグが"1"の場合は、番地号未入力チェック
				if (MAN_INPUT_FLG_ONE.equals(inMsg.getString(EKK1071C031CBSMsg.SKSHA_AD_MAN_INPUT_FLG)))
				{
					// お客様_契約者番地号が未入力の場合はチェック結果NG(住所名称一致判定)とする
					if (inMsg.isNull(EKK1071C031CBSMsg.SKSHA_AD_BNCHIGO))
					{
						result = NG_MEISHO;
					}
				}
				// お客様＜個人＞_親権者住所手動入力フラグが"1"以外の場合は、住所不備チェック
				else
				{	
					// 引数設定
					String adCdCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_AD_CD);
					String pcdCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_PCD);
					String stateNmCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_STATE_NM);
					String cityNmCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_CITY_NM);
					String oaztsuNmCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_OAZTSU_NM);
					String azchoNmCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_AZCHO_NM);
					String banchiGoCust = inMsg.getString(EKK1071C031CBSMsg.SKSHA_AD_BNCHIGO);

					// 審査チェック処理部品を呼び出す。
					result =  kk1071.adHbiCheck(inMsg, adCdCust, pcdCust, stateNmCust, cityNmCust, oaztsuNmCust, azchoNmCust, banchiGoCust);
				}

				// お客様＜個人＞_親権者住所の住所最下層チェックを行います
				String adCd = inMsg.getString(EKK1071C031CBSMsg.SKSHA_AD_CD);
				String pcd = inMsg.getString(EKK1071C031CBSMsg.SKSHA_PCD);
				String skshaAdChkLv = inMsg.getString(EKK1071C031CBSMsg.SKSHA_AD_CHK_LV);

				if (CHECK_OK.equals(result))
				{
					// お客様＜個人＞_親権者住所チェックレベルが"1"(全て)の場合
					if (AD_CHK_LV_ONE.equals(skshaAdChkLv))
					{
						result = adCdMostBottomPriKikiSksha(inMsg, kk1071, adCd, pcd);
					}
				}

				if (!CHECK_OK.equals(result))
				{
					String msgUmkmMoji = null;
					String jdgDtlMsgId = JDG_DTL_MSG_ID_EKB0720_KW;
					if (NG_ADCD.equals(result))
					{
						msgUmkmMoji = MSG_UMKM_MOJI4;
					}
					else if(NG_PCD.equals(result))
					{
						msgUmkmMoji = MSG_UMKM_MOJI5;
						jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
					}
					else if(NG_STATE.equals(result))
					{
						msgUmkmMoji = MSG_UMKM_MOJI51;
						jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
					}
					else if(NG_CITY.equals(result))
					{
						msgUmkmMoji = MSG_UMKM_MOJI52;
						jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
					}
					else if(NG_BNCHIGO.equals(result))
					{
						msgUmkmMoji = MSG_UMKM_MOJI53;
						jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
					}
					else if (WG_AD_KASO.equals(result))
					{
						msgUmkmMoji = MSG_UMKM_MOJI8;
						jdgDtlMsgId = JDG_DTL_MSG_ID_EKBD290__Q;
						errRsltCd2 = CHECK_WG;
					}
					else
					{
						msgUmkmMoji = MSG_UMKM_MOJI6;
					}
					// 審査詳細の登録を行う。
					createAdHbiCheck2(inMsg, inContext, errRsltCd2, msgUmkmMoji, jdgDtlMsgId);
					jdg_result[1] = errRsltCd2;
				}
			}
		}

		// 審査詳細のエラーコードをもとに、審査の審査結果コードを設定
		JKKejbKK1071Edit kk1071Edit = new JKKejbKK1071Edit();
		return kk1071Edit.getJudgeJudgeRsltCd(jdg_result);
	}

	/**
	 * <p>
	 * 親権者情報がすべて入力されているかを判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 親権者情報が全て未入力の場合はtrue。1つでも入力がある場合はfalse。
	 */
	public boolean isSkshaAllNull(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 親権者住所コードが入力されていた場合はfalseを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_AD_CD))
		{
			return false;
		}

		// 親権者郵便番号が入力されていた場合はfalseを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_PCD))
		{
			return false;
		}

		// 親権者都道府県名が入力されていた場合はtrueを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_STATE_NM))
		{
			return true;
		}

		// 親権者市区町村名が入力されていた場合はfalseを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_CITY_NM))
		{
			return false;
		}

		// 親権者大字通称名が入力されていた場合はfalseを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_OAZTSU_NM))
		{
			return false;
		}

		// 親権者字丁目名が入力されていた場合はfalseを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_AZCHO_NM))
		{
			return false;
		}

		// 親権者番地号が入力されていた場合はfalseを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_AD_BNCHIGO))
		{
			return false;
		}

		// 全て入力されていなかった場合はtrueを返却する
		return true;
	}	

	/**
	 * <p>
	 * 住所コード最下層チェックを行う。(お客様_契約者住所)
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param kk1071      審査共通部品のインスタンス
	 * @param adCd        住所コード
	 * @param pcdSet      郵便番号
	 * @return 住所コード最下層チェック結果
	 */
	private Object adCdMostBottomPriKikiKeisha(CAANMsg inMsg, JKKejbKK1071Edit kk1071, String adCd, String pcdSet)
	{
		// お客様_契約者字丁目名が設定されている場合、チェック結果OKを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.KEISHA_AZCHO_NM))
		{
			return CHECK_OK;
		}

		// 住所コード最下層チェックを行う
		String resultBtm = kk1071.adCdMostBottom(inMsg, adCd, pcdSet);

		// チェック結果が警告の場合
		if (CHECK_WG.equals(resultBtm))
		{
			return WG_AD_KASO;
		}
		return CHECK_OK;
	}
	
	/**
	 * <p>
	 * 住所コード最下層チェックを行う。(お客様＜個人＞_親権者住所)
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param kk1071      審査共通部品のインスタンス
	 * @param adCd        住所コード
	 * @param pcdSet      郵便番号
	 * @return 住所コード最下層チェック結果
	 */
	private Object adCdMostBottomPriKikiSksha(CAANMsg inMsg, JKKejbKK1071Edit kk1071, String adCd, String pcdSet)
	{
		// お客様＜個人＞_親権者字丁目名が設定されている場合、チェック結果OKを返却する
		if (!inMsg.isNull(EKK1071C031CBSMsg.SKSHA_AZCHO_NM))
		{
			return CHECK_OK;
		}

		// 住所コード最下層チェックを行う
		String resultBtm = kk1071.adCdMostBottom(inMsg, adCd, pcdSet);

		// チェック結果が警告の場合
		if (CHECK_WG.equals(resultBtm))
		{
			return WG_AD_KASO;
		}
		return CHECK_OK;
	}

	/**
	 * <p>
	 * 審査詳細の登録を行う（お客様住所不備チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param msgUmkmMoji 埋め込み文字
	 * @param jdgDtlMsgId 審査詳細メッセージID
	 * @return errRsltCd　エラー結果コード
	 */
	public void createAdHbiCheck1(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, String msgUmkmMoji, String jdgDtlMsgId)
	{
		//審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());
		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C031CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_DTL_SBT_CD1);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JUDGE_TG_SCREEN_TAB_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JUDGE_TG_SCREEN_KMK_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, jdgDtlMsgId);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, msgUmkmMoji);

		//登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		//PKが重複していた場合は関連制約エラーとする
		if(!createFlg)
		{
			inMsg.set(EKK1071C031CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C031CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}
	}
	
	/**
	 * <p>
	 * 審査詳細の登録を行う（お客様<個人>住所不備チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param msgUmkmMoji 埋め込み文字
	 * @param jdgDtlMsgId 審査詳細メッセージID
	 * @return errRsltCd　エラー結果コード
	 */
	public void createAdHbiCheck2(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, String msgUmkmMoji, String jdgDtlMsgId)
	{
		//審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());
		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C031CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_DTL_SBT_CD2);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JUDGE_TG_SCREEN_TAB_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, JUDGE_TG_SCREEN_KMK_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, jdgDtlMsgId);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, msgUmkmMoji);

		//登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		//PKが重複していた場合は関連制約エラーとする
		if(!createFlg)
		{
			inMsg.set(EKK1071C031CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C031CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}
	}	
}