/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JCKejbCK0011NumberParts
*	ソースファイル名：JCKejbCK0011NumberParts.java
*	作成者			：富士通
*	日付			：2011年06月09日
*＜機能概要＞
*	お客様採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/09	富士通		新規作成
*   v5.00.00    2013/08/24  FJ）寺本    IT1-2013-0001609
*   v5.00.01    2013/08/25  FJ）清藤    QA-2013-0001106
*   v5.00.02    2013/09/06  FJ）寺本    OM-2013-0001721
*   v6.00.00    2013/12/03  FJ）宇野    OM-2013-0003329
*   v8.00.00    2014/02/19  FJ）松枝    IT2-2014-0000129
*   v53.00.00   2021/05/11  FJ）謝      【ANK-4009-00-00】CX戦略WG方針対応
**********************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbSucceedDataAccess;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.CK0011ETMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JCKModelCommon;
import eo.ejb.common.db.JCKejbCK0011DBABase;

/**
 * <p>
 * お客様採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JCKejbCK0011NumberParts extends JKKejbNumberPartsBase
{

	/** 引継データアクセスキー(初期eoID) */
	private static final String KEY_SHKEOID = "SHKEOID";

	/** シーケンス定義名(初期eoID) */
	private static final String SEQ_EOID_NAME = "SEQ_EOID";

	/** 接頭語(初期eoID) */
	private static final String PREFIX_EOID = "51";

	/** シーケンス補正桁数(初期eoID) */
	private static final int SEQ_EOID_LENGTH = 9;

	/** 処理情報コード（採番処理） */
	private static final String PROC_NUMPATRS = "1";

	/** 処理情報コード（空白設定） */
	private static final String PROC_NULL = "2";

	/** 処理情報コード（カレント引継） */
	private static final String PROC_CURRENT = "3";
	
	/** 処理情報コード（カレントの値が未設定の場合採番）*/
	private static final String PROC_EMPTY_NUMPATRS = "4";
// ANK-4009-00-00 ADD START
	/** 処理情報コード（カレントのeoIDの値が未設定の場合採番）*/
	private static final String PROC_EOID_EMPTY_NUMPATRS = "5";
// ANK-4009-00-00 ADD END

	/** 会員種別コード(非eo会員) */
	private static final String MEMB_SBT_CD_NO_EO = "00";

	/** 会員種別コード(マスター会員(個人)) */
	private static final String MEMB_SBT_CD_MAST_KOJIN = "10";

	/** 会員種別コード(ファミリー会員(個人)) */
	private static final String MEMB_SBT_CD_FAML_KOJIN = "11";

	/** 会員種別コード(マスター会員(法人)) */
	private static final String MEMB_SBT_CD_MAST_HOJIN = "20";

	/** 会員種別コード(ファミリー会員(法人)) */
	private static final String MEMB_SBT_CD_FAML_HOJIN = "21";

	/** 会員種別コード(オープン会員) */
	private static final String MEMB_SBT_CD_OPEN = "30";

	/** 処理情報定義体（変更前、変更後、処理情報） */
	private static final String[][] PROC_PATRS_BLOCK = new String[][]{
		{MEMB_SBT_CD_NO_EO, MEMB_SBT_CD_MAST_KOJIN, PROC_NUMPATRS}          // 非eo会員⇒マスター会員(個人)：採番処理
		, {MEMB_SBT_CD_FAML_KOJIN, MEMB_SBT_CD_MAST_KOJIN, PROC_NUMPATRS}    // ファミリー会員(個人)⇒マスター会員(個人)：採番処理
		, {MEMB_SBT_CD_FAML_HOJIN, MEMB_SBT_CD_MAST_KOJIN, PROC_NUMPATRS}    // ファミリー会員(法人)⇒マスター会員(個人)：採番処理
		, {MEMB_SBT_CD_OPEN, MEMB_SBT_CD_MAST_KOJIN, PROC_EMPTY_NUMPATRS}   // オープン会員⇒マスター会員(個人)：カレントの値が未設定の場合採番
		, {MEMB_SBT_CD_NO_EO, MEMB_SBT_CD_MAST_HOJIN, PROC_NUMPATRS}        // 非eo会員⇒マスター会員(法人)：採番処理
		, {MEMB_SBT_CD_FAML_KOJIN, MEMB_SBT_CD_MAST_HOJIN, PROC_NUMPATRS}    // ファミリー会員(個人)⇒マスター会員(法人)：採番処理
		, {MEMB_SBT_CD_FAML_HOJIN, MEMB_SBT_CD_MAST_HOJIN, PROC_NUMPATRS}    // ファミリー会員(法人)⇒マスター会員(法人)：採番処理
		, {MEMB_SBT_CD_OPEN, MEMB_SBT_CD_MAST_HOJIN, PROC_EMPTY_NUMPATRS}   // オープン会員⇒マスター会員(法人)：カレントの値が未設定の場合採番
		, {MEMB_SBT_CD_OPEN, MEMB_SBT_CD_FAML_KOJIN, PROC_NULL}             // オープン会員⇒ファミリー会員(個人)：空白設定
		, {MEMB_SBT_CD_OPEN, MEMB_SBT_CD_FAML_HOJIN, PROC_NULL}             // オープン会員⇒ファミリー会員(法人)：空白設定
// ANK-4009-00-00 ADD START
		, {MEMB_SBT_CD_NO_EO, MEMB_SBT_CD_OPEN, PROC_EOID_EMPTY_NUMPATRS}   // 非eo会員⇒オープン会員：カレントのeoIDの値が未設定の場合採番
// ANK-4009-00-00 ADD END
	};

	/**
	 * コンストラクタです。
	 */
	public JCKejbCK0011NumberParts()
	{
	}

	/**
	 * <p>
	 * 初期eoIDの採番を行います（採番条件付）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysid SYSID
	 * @param memberSbtCd 会員種別コード
	 * @return 会員種別コードが「マスター会員（個人）」,「マスター会員（法人）」以外から
	 *         「マスター会員（個人）」,「マスター会員（法人）」に設定される場合、採番値
	 *         「オープン会員」から「ファミリー会員（個人）」,「ファミリー会員（法人）」に設定される場合、空白
	 *          上記以外の場合はカレントレコードの同項目の値
	 */
	public Object getShkEoidCond1(CAANMsg inMsg, AgentDispatchContext inContext, String sysid, String memberSbtCd)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// お客様のカレント検索を行う
		CAANMsg retETMsg = findByCurrentCK0011(inMsg, inContext, sysid);

		// カレントレコードが取得できなかった場合、nullを返却する
		if (null == retETMsg)
		{
			return null;
		}

		// 定義体から処理情報を取得する
		String proc_info = getProcInfo(retETMsg, memberSbtCd);

		// 採番処理の場合、採番した値を返却する
		if (PROC_NUMPATRS.equals(proc_info))
		{
			return getShkEoid(inMsg, inContext);
		}

		// 空白設定の場合、nullを返却する
		if (PROC_NULL.equals(proc_info))
		{
			return null;
		}

		// カレント引継の場合、カレントレコードの値を返却する
		if (PROC_CURRENT.equals(proc_info))
		{
			return retETMsg.getString(CK0011ETMsg.SHK_EOID);
		}
		
		// カレントの値が未設定の場合採番の場合、採番する
		if (PROC_EMPTY_NUMPATRS.equals(proc_info))
		{
			// カレントが未設定の場合は採番する
			if (retETMsg.isNull(CK0011ETMsg.SHK_EOID))
			{
				return getShkEoid(inMsg, inContext);
			}

			return retETMsg.getString(CK0011ETMsg.SHK_EOID);
		}
// ANK-4009-00-00 ADD START
		// カレントのeoIDの値が未設定の場合採番の場合、採番する
		if (PROC_EOID_EMPTY_NUMPATRS.equals(proc_info))
		{
			// カレントのeoIDが未設定の場合は採番する
			if (retETMsg.isNull(CK0011ETMsg.EOID))
			{
				return getShkEoid(inMsg, inContext);
			}

			return retETMsg.getString(CK0011ETMsg.SHK_EOID);
		}
// ANK-4009-00-00 ADD END
		// 上記以外の定義情報の場合、nullを返却する
		// 想定外ロジック。本来ならばこの処理には到達しない
		return null;
	}

	/**
	 * <p>
	 * 初期eoIDの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番された初期eoID
	 */
	public Object getShkEoid(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 引継データの取得
		String value = (String)JSYejbSucceedDataAccess.getSucceedData(KEY_SHKEOID);

		if (value != null)
		{
			// 引継データが設定されている場合はまま返却
			return value;
		}

		// 採番処理
		StringBuffer buffer = new StringBuffer();
		String seq = JCCModelCommon.getFormatedNextSeq(SEQ_EOID_NAME, PREFIX_EOID, SEQ_EOID_LENGTH); // Oracleシーケンス取得

		//忌み数字対象外処理
		seq = chkNgWord(inMsg, inContext, seq, SEQ_EOID_NAME, PREFIX_EOID, SEQ_EOID_LENGTH);

		buffer.append(seq); // シーケンス番号追加
		buffer.append(getCheckDigit27(seq)); // チェックデジット追加
		value = buffer.toString();

		// 引継データの設定
		JSYejbSucceedDataAccess.setSucceedData(KEY_SHKEOID, value);

		return value;
	}

	/**
	 * <p>
	 * 初期eoIDパスワードの採番を行います（採番条件付）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysid SYSID
	 * @param memberSbtCd 会員種別コード
	 * @return 会員種別コードが「マスター会員（個人）」,「マスター会員（法人）」以外から
	 *         「マスター会員（個人）」,「マスター会員（法人）」に設定される場合、採番値
	 *         「オープン会員」から「ファミリー会員（個人）」,「ファミリー会員（法人）」に設定される場合、空白
	 *          上記以外の場合はカレントレコードの同項目の値
	 */
	public Object getShkEoidPwdCond1(CAANMsg inMsg, AgentDispatchContext inContext, String sysid, String memberSbtCd)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// お客様のカレント検索を行う
		CAANMsg retETMsg = findByCurrentCK0011(inMsg, inContext, sysid);

		// カレントレコードが取得できなかった場合、nullを返却する
		if (null == retETMsg)
		{
			return null;
		}
		
		// 定義体から処理情報を取得する
		String proc_info = getProcInfo(retETMsg, memberSbtCd);

		// 採番処理の場合、採番した値を返却する
		if (PROC_NUMPATRS.equals(proc_info))
		{
			return getShkEoidPwd(inMsg, inContext);
		}

		// 空白設定の場合、nullを返却する
		if (PROC_NULL.equals(proc_info))
		{
			return null;
		}

		// カレント引継の場合、カレントレコードの値を返却する
		if (PROC_CURRENT.equals(proc_info))
		{
			return retETMsg.getString(CK0011ETMsg.SHK_EOID_PWD);
		}
		
		// カレントの値が未設定の場合採番の場合、採番する
		if (PROC_EMPTY_NUMPATRS.equals(proc_info))
		{
			// カレントが未設定の場合は採番する
			if (retETMsg.isNull(CK0011ETMsg.SHK_EOID_PWD))
			{
				return getShkEoidPwd(inMsg, inContext);
			}

			return retETMsg.getString(CK0011ETMsg.SHK_EOID_PWD);
		}
// ANK-4009-00-00 ADD START
		// カレントのeoIDの値が未設定の場合採番の場合、採番する
		if (PROC_EOID_EMPTY_NUMPATRS.equals(proc_info))
		{
			// カレントのeoIDが未設定の場合は採番する
			if (retETMsg.isNull(CK0011ETMsg.EOID))
			{
				return getShkEoidPwd(inMsg, inContext);
			}

			return retETMsg.getString(CK0011ETMsg.SHK_EOID_PWD);
		}
// ANK-4009-00-00 ADD END
		// 上記以外の定義情報の場合、nullを返却する
		// 想定外ロジック。本来ならばこの処理には到達しない
		return null;
	}

	/**
	 * <p>
	 * 初期eoIDパスワードの採番を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 採番された初期eoIDパスワード
	 */
	public Object getShkEoidPwd(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 機能コードのチェック（偶数の場合は採番しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}

		// 初期eoIDパスワードの取得
		String value = getPwdCk();

		// 小文字に変換して返却
		return value.toLowerCase();
	}

	/**
	 * <p>
	 * eoIDに設定する値の取得処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysid SYSID
	 * @param memberSbtCd 会員種別コード
	 * @return eoIDが未設定、またはお客様退会年月日が設定されている場合、初期eoIDの値を設定。
	 *          それ以外の場合、カレントレコードのeoIDの値を設定。
	 */
	public Object getEoid(CAANMsg inMsg, AgentDispatchContext inContext, String sysid, String memberSbtCd)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(CK0011ETMsg.class.getName());
		inETMsg.set(CK0011ETMsg.SYSID, sysid);
		inETMsg.set(CK0011ETMsg.RSV_APLY_YMD, JCKModelCommon.getOpeDate(inMsg));
		
		CAANMsg retETMsg = new JCKejbCK0011DBABase().findByCurrent(inETMsg);

		// カレントレコードが取得できなかった場合、nullを返す。
		if (null == retETMsg)
		{
			return null;
		}

		// eoIDが未設定、またはお客様退会年月日が設定されている場合
		if (retETMsg.isNull(CK0011ETMsg.EOID) || !retETMsg.isNull(CK0011ETMsg.CUST_TAIKAI_YMD))
		{
			// カレントレコードの会員種別コードを取得
			String sCurMemberSbtCd = retETMsg.getString(CK0011ETMsg.MEMBER_SBT_CD);

			// カレントレコードの会員種別コードが「マスター会員(個人)」または「マスター会員(法人)」の場合
			if (MEMB_SBT_CD_MAST_KOJIN.equals(sCurMemberSbtCd) || MEMB_SBT_CD_MAST_HOJIN.equals(sCurMemberSbtCd))
			{
				// カレントレコードの初期eoIDの値を返す。
				return retETMsg.getString(CK0011ETMsg.SHK_EOID);
			}
			else
			{
				// 引数の会員種別コードが「マスター会員(個人)」または「マスター会員(法人)」の場合
				if (MEMB_SBT_CD_MAST_KOJIN.equals(memberSbtCd) || MEMB_SBT_CD_MAST_HOJIN.equals(memberSbtCd))
				{
					// 採番した初期eoIDの値を返す。
					return getShkEoid(inMsg, inContext);
				}
// ANK-4009-00-00 ADD START
				// 会員種別コードが「非eo会員」から「オープン会員」に変更される場合
				else if (MEMB_SBT_CD_NO_EO.equals(sCurMemberSbtCd) && MEMB_SBT_CD_OPEN.equals(memberSbtCd))
				{
					// 採番した初期eoIDの値を返す。
					return getShkEoid(inMsg, inContext);
				}
// ANK-4009-00-00 ADD END

				// カレントレコードの初期eoIDの値を返す。
				return retETMsg.getString(CK0011ETMsg.SHK_EOID);
			}
		}
		
		return retETMsg.getString(CK0011ETMsg.EOID);
	}

	/**
	 * <p>
	 * お客様のカレント検索を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysid SYSID
	 * @return お客様のカレントレコードメッセージ
	 */
	private CAANMsg findByCurrentCK0011(CAANMsg inMsg, AgentDispatchContext inContext, String sysid)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(CK0011ETMsg.class.getName());
		inETMsg.set(CK0011ETMsg.SYSID, sysid);
		inETMsg.set(CK0011ETMsg.RSV_APLY_YMD, JCKModelCommon.getOpeDate(inMsg));

		return new JCKejbCK0011DBABase().findByCurrent(inETMsg);
	}

	/**
	 * <p>
	 * 処理情報定義体から、処理情報を取得する。
	 * </p>
	 * @param curMsg お客様のカレントレコードメッセージ
	 * @param memberSbtCd 会員種別
	 * @return 処理情報
	 */
	private String getProcInfo(CAANMsg curMsg, String memberSbtCd)
	{
		// 定義体から処理情報を取得する
		for (String[] proc_parts: PROC_PATRS_BLOCK)
		{
			// 変更前の会員種別情報が一致しない場合は次へ
			if (!proc_parts[0].equals(curMsg.getString(CK0011ETMsg.MEMBER_SBT_CD)))
			{
				continue;
			}

			// 変更後の会員種別情報が一致しない場合は次へ
			if (!proc_parts[1].equals(memberSbtCd))
			{
				continue;
			}
			
			// 初期eoID、初期eoIDパスワードが設定されている場合は次へ
			if (!curMsg.isNull(CK0011ETMsg.SHK_EOID) && !curMsg.isNull(CK0011ETMsg.SHK_EOID_PWD))
			{
				continue;
			}

			// 変更前後が一致した定義の処理情報を返却する
			return proc_parts[2];
		}

		// 一致する定義体が存在しない場合、カレント引継処理を返却する
		return PROC_CURRENT;
	}

}
