/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JKKejbEKK1071C061Edit
 *	ソースファイル名：JKKejbEKK1071C061Edit.java
 *	作成者			：富士通
 *	日付			：2061年07月14日
 *＜機能概要＞
 *	住所不備請求契約情報審査部品クラス
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2061/07/14	富士通		新規作成
 *	v5.00.00	2013/06/27	FJ) 沖田	IT1-2013-0001288
 *	v5.01.00	2013/07/05	FJ) 砂川	LT-2013-0000282
 *
 **********************************************************************/

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.EKK1071C061CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 住所不備請求契約情報審査部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C061Edit
{
	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";
	
	/** 審査チェック結果 WORNING */
	private static final String CHECK_WG = "02";

	/** 異動区分 新規契約 */
	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";
	
	/** 住所コード存在判定エラー */
	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_CD = "019";

	/** 審査詳細メッセージID */
	private static final String JDG_DTL_MSG_ID_EKB5400_KW = "EKB5400-KW";
	
	/** 審査詳細メッセージID */
	private static final String JDG_DTL_MSG_ID_EKB0720_KW = "EKB0720-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 MSG_UMKM_MOJI4 = "送付先住所";

	/** 住所チェックレベル（1：全て） */
	private static final String AD_CHK_LV_ONE = "1";

	/** 審査対象画面タブコード(支払方法) */
	private static final String JUDGE_TG_SCREEN_TAB_CD = "06";

	/** 審査対象画面項目コード(ご住所) */
	private static final String JUDGE_TG_SCREEN_KMK_CD = "004";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C061Edit()
	{
	}

	/**
	 * <p>
	 * 住所不備請求契約情報審査チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getAdHbiOkForSeikyKeiChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();
		
		//指定した条件で審査詳細実施条件を検索し、エラー結果コードの項目値を行う。
		String jdgStaCd = inMsg.getString(EKK1071C061CBSMsg.JDG_JSSI_KINO_SKBT_CD);
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, jdgStaCd, JDG_DTL_SBT_CD);
		if(errRsltCd == null)
		{
			return CHECK_OK;
		}

		// 異動区分が「新規契約」、「サービス追加」以外の場合チェック処理部品を呼ばない。
		String idoDiv = inMsg.getString(EKK1071C061CBSMsg.IDO_DIV);
		if (!IDO_IDV_NEW.equals(idoDiv) && !IDO_IDV_ADD.equals(idoDiv))
		{	
			return CHECK_OK;
		}

		Object result = CHECK_OK;
		// 送付先住所手動入力フラグが"1"の場合は、番地号未入力チェック
		if (MAN_INPUT_FLG_ONE.equals(inMsg.getString(EKK1071C061CBSMsg.SOHUS_AD_MAN_INPUT_FLG)))
		{
			// 送付先番地号が未入力の場合はチェック結果NG(住所名称一致判定)とする
			if (inMsg.isNull(EKK1071C061CBSMsg.SOHUS_BNCHIGO))
			{
				result = NG_MEISHO;
			}
		}
		// 送付先住所手動入力フラグが"1"以外の場合は、住所不備チェック
		else
		{	
			// 引数設定
			String adCd = inMsg.getString(EKK1071C061CBSMsg.SOHUS_AD_CD);
			String pcd = inMsg.getString(EKK1071C061CBSMsg.SOHUS_PCD);
			String stateNm = inMsg.getString(EKK1071C061CBSMsg.SOHUS_STATE_NM);
			String cityNm = inMsg.getString(EKK1071C061CBSMsg.SOHUS_CITY_NM);
			String oaztsuNm = inMsg.getString(EKK1071C061CBSMsg.SOHUS_OAZTSU_NM);
			String azchoNm = inMsg.getString(EKK1071C061CBSMsg.SOHUS_AZCHO_NM);
			String banchiGo = inMsg.getString(EKK1071C061CBSMsg.SOHUS_BNCHIGO);

			// 審査チェック処理部品(住所不備チェック)を呼び出す。
			result = kk1071.adHbiCheck(inMsg, adCd, pcd, stateNm, cityNm, oaztsuNm, azchoNm, banchiGo);
		}

		String adCd = inMsg.getString(EKK1071C061CBSMsg.SOHUS_AD_CD);
		String pcd = inMsg.getString(EKK1071C061CBSMsg.SOHUS_PCD);
		String sohusAdChkLv = inMsg.getString(EKK1071C061CBSMsg.SOHUS_AD_CHK_LV);
		
		// 送付先住所の住所最下層チェックを行います
		if (CHECK_OK.equals(result))
		{
			// 送付先住所チェックレベルが"1"(全て)の場合
			if (AD_CHK_LV_ONE.equals(sohusAdChkLv))
			{
				result = adCdMostBottomPriKikiSohus(inMsg, kk1071, adCd, pcd);
			}
		}

		if(CHECK_OK.equals(result))
		{
			return CHECK_OK;
		}
		else
		{
			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))
			{
				jdgDtlMsgId = JDG_DTL_MSG_ID_EKB5400_KW;
				msgUmkmMoji = MSG_UMKM_MOJI2;
			}
			else if(NG_STATE.equals(result))
			{
				jdgDtlMsgId = JDG_DTL_MSG_ID_EKB5400_KW;
				msgUmkmMoji = MSG_UMKM_MOJI31;
			}
			else if(NG_CITY.equals(result))
			{
				jdgDtlMsgId = JDG_DTL_MSG_ID_EKB5400_KW;
				msgUmkmMoji = MSG_UMKM_MOJI32;
			}
			else if(NG_BNCHIGO.equals(result))
			{
				jdgDtlMsgId = JDG_DTL_MSG_ID_EKB5400_KW;
				msgUmkmMoji = MSG_UMKM_MOJI33;
			}
			else if (WG_AD_KASO.equals(result))
			{
				msgUmkmMoji = MSG_UMKM_MOJI4;
				jdgDtlMsgId = JDG_DTL_MSG_ID_EKBD290__Q;
				errRsltCd = CHECK_WG;
			}
			else
			{
				msgUmkmMoji = MSG_UMKM_MOJI3;
			}
			createAdHbiCheckk(inMsg, inContext, errRsltCd, msgUmkmMoji, jdgDtlMsgId);
			return errRsltCd;
		}
	}

	/**
	 * <p>
	 * 住所コード最下層チェックを行う。(送付先住所)
	 * </p>
	 * @param inMsg       処理対象のメッセージキャリア
	 * @param kk1071      審査共通部品のインスタンス
	 * @param adCd        住所コード
	 * @param pcdSet      郵便番号
	 * @return 住所コード最下層チェック結果
	 */
	private Object adCdMostBottomPriKikiSohus(CAANMsg inMsg, JKKejbKK1071Edit kk1071, String adCd, String pcdSet)
	{
		// 送付先字丁目名が設定されている場合、チェック結果OKを返却する
		if (!inMsg.isNull(EKK1071C061CBSMsg.SOHUS_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 createAdHbiCheckk(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, String msgUmkmMoji, String jdgDtlMsgId)
	{
		//審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C061CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JDG_DTL_SBT_CD);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		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_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(EKK1071C061CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C061CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}
	}	
}