/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK1071C141Edit
*	ソースファイル名：JKKejbEKK1071C141Edit.java
*	作成者			：富士通
*	日付			：2011年10月17日
*＜機能概要＞
*	支払方法審査審査部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/17	富士通		新規作成
*
**********************************************************************/

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.KK0501ETMsg;
import eo.ejb.cbm.entity.KK0521ETMsg;
import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C141CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0501DBABase;
import eo.ejb.common.db.JKKejbKK0521DBABase;

/**
 * <p>
 * 支払方法審査クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C141Edit
{

	/** 審査チェック結果 OK */
	private static final String CHECK_OK = "00";
	
	/** 審査チェック結果 NG */
	private static final String CHECK_NG = "01";
	
	/** 審査チェック結果 WG */
	private static final String CHECK_WG = "02";

	/** 審査詳細種別コード クレジットオーソリチェック */
	private static final String JDG_KINO_SBT_AUTH = "020";

	/** 審査詳細種別コード 口振・郵振与信審査結果チェック */
	private static final String JDG_KINO_SBT_KF = "045";
	
	/** 審査対象画面タブコード 支払方法 */
	private static final String JDG_SCREEN_TAB_PAY = "06";

	/** 審査対象画面項目コード クレジットカード番号 */
	private static final String JDG_SCREEN_CRECARD = "006";

	/** 審査対象画面項目コード 口振・郵振情報 */
	private static final String JDG_SCREEN_KFSHINSA = "011";
	
	/** 審査詳細メッセージID */
	private static final String JDG_MESSAGE_ID = "EKB1040-JW";

	/** メッセージ埋込み文字(クレジットオーソリチェック) */
	private static final String MESSAGE_INPUT_AUTH = "クレジットオーソリ審査,ＮＧ,登録";

	/** メッセージ埋込み文字(クレジットオーソリチェック未審査) */
	private static final String MESSAGE_INPUT_AUTH_2 = "クレジットオーソリ審査,未完了,登録";

	/** メッセージ埋込み文字(口振・郵振与信審査結果チェック) */
	private static final String MESSAGE_INPUT_KF = "口振・郵振与信審査,ＮＧ,登録";

	/** 支払い審査結果コード(口座振替申請ＯＫ) */
	private static final String PAY_SKEKKA_CD_KF = "20";

	/** 支払い審査結果コード(郵便自動振込申請ＯＫ) */
	private static final String PAY_SKEKKA_CD_YF = "30";
	
	/** 支払い審査結果コード(審査異常なし) */
	private static final String PAY_SKEKKA_CD_DEF = "00";

	/** 支払い審査結果コード(口座振替ＮＧ解除) */
	private static final String PAY_SKEKKA_CD_KFNG_KJ = "29";
	
	/** 支払い審査結果コード(郵便自動振込ＮＧ解除) */
	private static final String PAY_SKEKKA_CD_YFNG_KJ = "39";
	
	/** クレジットカードステータス 登録済 */
	private static final String CRECARD_STAT_010 = "010";
	
	/** クレジットカードステータス 審査依頼中 */
	private static final String CRECARD_STAT_020 = "020";
	
	/** クレジットカードステータス 無効 */
	private static final String CRECARD_STAT_190 = "190";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C141Edit()
	{
	}
	
	/**
	 * <p>
	 * 支払方法審査チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getPayWayOkChkRslt(CAANMsg inMsg, AgentDispatchContext inContext) {
		
		// 結果格納用
		Object result[] = new Object[2];
		
		// クレジットオーソリチェックを実施する
		result[0] = this.getCreditOsoliChkRslt(inMsg, inContext);
		
		// クレジットオーソリチェックの結果がnullの場合、nullを返却する
		if (null == result[0])
		{
			return null;
		}
		
		// 口振・郵振与信審査結果チェックを実施する
		result[1] = this.getKoufuriYufuriYoshinChkRslt(inMsg, inContext);
		
		// チェック結果をマージして返却
		return chkResultMarge(result);
	}
	

	/**
	 * <p>
	 * クレジットオーソリチェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	private Object getCreditOsoliChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 必要項目の設定チェックを行い、未設定の項目が存在する場合はチェックを行わない
		if (!isContentsNotNull(inMsg)) 
		{
			return CHECK_OK;
		}

		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C141CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_AUTH);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}

		// クレジットカードのカレント検索を行う
		CAANMsg retKK1031 = findByCurrentKK0521(inMsg);

		// 取得件数が存在しない場合、処理を終了する
		if (null == retKK1031)
		{
			return CHECK_OK;
		}

		// クレジットカードステータスが"登録済"または"審査依頼中"の場合、審査詳細に登録して審査結果NGを返却する
		if (CRECARD_STAT_010.equals(retKK1031.getString(KK0521ETMsg.CRECARD_STAT)) 
				|| CRECARD_STAT_020.equals(retKK1031.getString(KK0521ETMsg.CRECARD_STAT)))
		{
			createJdgDtl(inMsg, inContext, errRsltCd, JDG_KINO_SBT_AUTH, MESSAGE_INPUT_AUTH_2, JDG_SCREEN_CRECARD);
			return errRsltCd;
		}
		
		// クレジットカードステータスが"無効"の場合、審査詳細に登録して審査結果NGを返却する
		if (CRECARD_STAT_190.equals(retKK1031.getString(KK0521ETMsg.CRECARD_STAT)))
		{
			createJdgDtl(inMsg, inContext, errRsltCd, JDG_KINO_SBT_AUTH, MESSAGE_INPUT_AUTH, JDG_SCREEN_CRECARD);
			return errRsltCd;
		}
		
		return CHECK_OK;
	}
	
	/**
	 * <p>
	 * 口振・郵振与信審査結果チェック処理を行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	private Object getKoufuriYufuriYoshinChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();

		// 審査詳細実施条件のエラー結果コードを取得する
		String errRsltCd = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C141CBSMsg.JDG_JSSI_KINO_SKBT_CD), JDG_KINO_SBT_KF);

		// エラー結果取得コードが取得できなかった場合は処理を行わない
		if (errRsltCd == null || "".equals(errRsltCd))
		{
			return CHECK_OK;
		}
		
		// 請求契約_請求方法番号(口座)が未設定の場合
		if (inMsg.isNull(EKK1071C141CBSMsg.SEIKY_WAY_NO_KOZA))
		{
			return CHECK_OK;
		}
		
		// 請求契約_請求方法番号(口座)をKEYに口座の支払い審査結果コードを取得する
		CAANMsg retMsg = this.findByCurrentKK0501(inMsg);
		
		// 検索結果が0件または検索結果の支払い審査結果コードがnullの場合
		if (retMsg == null || retMsg.isNull(KK0501ETMsg.PAY_SKEKKA_CD))
		{
			// 審査詳細に登録
			createJdgDtl(inMsg, inContext, errRsltCd, JDG_KINO_SBT_KF, MESSAGE_INPUT_KF, JDG_SCREEN_KFSHINSA);
			return CHECK_NG;
		}
		
		// 検索結果から支払い審査結果コードを取得する
		String paySkekkaCd = retMsg.getString(KK0501ETMsg.PAY_SKEKKA_CD);
		
		// 支払い審査結果コードが口座振替申請ＯＫ("20")もしくは郵便自動振込申請ＯＫ("30")もしくは審査異常なし("00")もしくは
		// 口座振替ＮＧ解除("29")もしくは郵便自動振込ＮＧ解除("39")の場合
		if (paySkekkaCd.equals(PAY_SKEKKA_CD_KF) || paySkekkaCd.equals(PAY_SKEKKA_CD_YF) || paySkekkaCd.equals(PAY_SKEKKA_CD_DEF) ||
				 paySkekkaCd.equals(PAY_SKEKKA_CD_KFNG_KJ) ||  paySkekkaCd.equals(PAY_SKEKKA_CD_YFNG_KJ))
		{
			return CHECK_OK;
		}
		
		// 審査詳細に登録
		createJdgDtl(inMsg, inContext, errRsltCd, JDG_KINO_SBT_KF, MESSAGE_INPUT_KF, JDG_SCREEN_KFSHINSA);
		return CHECK_NG;	
	}

	/**
	 * <p>
	 * チェックに必要な項目が未設定でないかを判定します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return チェックに必要な項目が全て設定されている場合true。それ以外の場合false。
	 */
	private boolean isContentsNotNull(CAANMsg inMsg)
	{
		// 請求契約_請求契約番号が未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C141CBSMsg.SEIKY_KEI_NO)) 
		{
			return false;
		}

		// 請求契約_世代登録年月日時分秒が未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C141CBSMsg.KK0491_GENE_ADD_DTM)) 
		{
			return false;
		}

		// クレジットカード_請求方法番号（クレジットカード）が未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C141CBSMsg.SEIKY_WAY_NO_CRECARD)) 
		{
			return false;
		}

		// クレジットカード_世代登録年月日時分秒が未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C141CBSMsg.KK0521_GENE_ADD_DTM)) 
		{
			return false;
		}

		// クレジットカード_クレジットカード会社コードが未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C141CBSMsg.CRECARD_COMP_CD)) 
		{
			return false;
		}

		// クレジットカード_クレジットカード番号コードが未設定の場合は処理を行わない
		if (inMsg.isNull(EKK1071C141CBSMsg.CRECARD_NO)) 
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 審査判定結果コードの値を返却する
	 * </p>
	 * 
	 * @param  result 各チェックの結果
	 * @return 審査判定結果コード
	 */
	private Object chkResultMarge(Object[] result)
	{

		// チェック結果がない場合はチェックOKを返却する
		if (result == null || result.length == 0)
		{
			return CHECK_OK;
		}

		int wgCnt = 0;
		int ngCnt = 0;

		for (int cnt = 0; cnt < result.length; cnt++)
		{
			// チェック結果NGの場合
			if (result[cnt].equals(CHECK_NG))
			{
				ngCnt++;
			}

			// チェック結果WGの場合
			if (result[cnt].equals(CHECK_WG))
			{
				wgCnt++;
			}
		}

		// チェックNGが１件以上存在した場合
		if (ngCnt > 0)
		{
			return CHECK_NG;
		}

		// チェックWGが１件以上存在した場合
		if (wgCnt > 0)
		{
			return CHECK_WG;
		}

		return CHECK_OK;
	}
	

	/**
	 * <p>
	 * クレジットカードのPK検索を行います。
	 * </p>
	 * 
	 * @param inMsg 処理対象のメッセージ
	 * @return 取得結果のレコード
	 */
	private CAANMsg findByCurrentKK0521(CAANMsg inMsg)
	{
		// カレント検索用のメッセージを作成する
		CAANMsg inETMsg = new CAANMsg(KK0521ETMsg.class.getName());
		inETMsg.set(KK0521ETMsg.SEIKY_WAY_NO_CRECARD, inMsg.getString(EKK1071C141CBSMsg.SEIKY_WAY_NO_CRECARD));
		inETMsg.set(KK0521ETMsg.GENE_ADD_DTM, inMsg.getString(EKK1071C141CBSMsg.KK0521_GENE_ADD_DTM));

		// PK検索を行い、結果を返却する
		CAANMsg retMsg = null;
		retMsg = new JKKejbKK0521DBABase().findByPrimaryKey(inETMsg);

		return retMsg;
	}
	
	/**
	 * <p>
	 * 口座のカレント検索を行います。
	 * </p>
	 * 
	 * @param inMsg 処理対象のメッセージ
	 * @return 取得結果のレコード
	 */
	private CAANMsg findByCurrentKK0501(CAANMsg inMsg)
	{
		// カレント検索用のメッセージを作成する
		CAANMsg inETMsg = new CAANMsg(KK0501ETMsg.class.getName());
		inETMsg.set(KK0501ETMsg.SEIKY_WAY_NO_KOZA, inMsg.getString(EKK1071C141CBSMsg.SEIKY_WAY_NO_KOZA));

		// カレント検索を行い、結果を返却する
		CAANMsg retMsg = null;
		retMsg = new JKKejbKK0501DBABase().findByCurrent(inETMsg);

		return retMsg;
	}
	
	/**
	 * <p>
	 * 審査詳細の登録を行います（クレジットオーソリチェック,口振・郵振与信審査結果チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd   エラー結果コード
	 * @param jdgDtlSbtCd 審査詳細種別コード
	 * @param umekomiMoji 埋め込みメッセージ
	 * @param screenKmkCd 審査対象画面項目コード
	 */
	private void createJdgDtl(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, String jdgDtlSbtCd, String umekomiMoji, String screenKmkCd)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());

		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C141CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, jdgDtlSbtCd);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JDG_SCREEN_TAB_PAY);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, screenKmkCd);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, JDG_MESSAGE_ID);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, umekomiMoji);

		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C141CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C141CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}
}
