/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JSYejbKK0011CBMMsgCV
*	ソースファイル名：JSYejbKK0011CBMMsgCV.java
*	作成者			：EK919738
*	日付			：2016年11月09日
*＜機能概要＞
*	申込 三層スキーマ変換部品（概念-内部）です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ29.00.00  2017/04/03  FJ)クウン   ANK-3158-00-00_訪販申込情報の検索・取得API作成
*   ｖ29.00.01  2017/04/07  FJ)舘山     IT1-2017-0000025_照査前登録時の排他エラー
*
********************************************************************************/

package eo.ejb.cbm.msgconv;

import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.LayerConvertHandler;
import eo.ejb.cbm.cbmmsg.KK0011CBMMsg;
import eo.ejb.common.EventIDList;
import eo.ejb.common.JPCejbEntityMainBase;
import eo.ejb.cbm.entity.KK0011ETMsg;


/**
 * 三層スキーマ変換クラスです。
 */
public class JSYejbKK0011CBMMsgCV extends LayerConvertHandler {
	/**
	 * コンストラクタ
	 */
	public JSYejbKK0011CBMMsgCV() {
	}

	/**
	 * 概念スキーマIDを取得します。
	 * @return 概念スキーマID
	 */
	public String getId() {
		return "KK0011";
	}

	/**
	 * EventID対応表
	 */
	private static HashMap<String, String> EVENT_ID_MAP = new HashMap<String, String>()
	{
		{
			put(EventIDList.KK0011D001, EventIDList.IKK0011D001);		// 申込登録振舞概念
			put(EventIDList.KK0011D004, EventIDList.IKK0011D004);		// 申込内容承認登録振舞概念
			put(EventIDList.KK0011D005, EventIDList.IKK0011D005);		// 申込内容変更振舞概念
			put(EventIDList.KK0011D006, EventIDList.IKK0011D006);		// 仮申込フラグ変更振舞概念
			put(EventIDList.KK0011D007, EventIDList.IKK0011D007);		// 申込内容承認申請振舞概念
			put(EventIDList.KK0011D008, EventIDList.IKK0011D008);		// 申込内容承認振舞概念
			put(EventIDList.KK0011D009, EventIDList.IKK0011D009);		// 申込キャンセル振舞概念
			put(EventIDList.KK0011D010, EventIDList.IKK0011D010);		// 申込差戻し振舞概念
			put(EventIDList.KK0011D011, EventIDList.IKK0011D011);		// 承認前申込キャンセル取消振舞概念
			put(EventIDList.KK0011D012, EventIDList.IKK0011D012);		// 承認後申込キャンセル取消振舞概念
			put(EventIDList.KK0011D013, EventIDList.IKK0011D013);		// 申込お客様変更振舞概念
		}
	};

	/**
	 * CBMMsgからETMsgの配列に変換します。
	 * @param inCBMMsg
	 * @return エンティティの配列
	 */
	public CAANMsg[] toElementMsg( CAANMsg inCBMMsg, AgentDispatchContext inContext) throws Exception {

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JSYejbKK0011CBMMsgCV.toElementMsg#start");

		//振舞ID取り出し
		String eventID = inCBMMsg.getString(KK0011CBMMsg.EVENTID);

		//上りデータ引継処理
		inCBMMsg = getSucceedDataToElementMsg(inCBMMsg, inContext, eventID);

		//ETMsg
		CAANMsg[] outETMsg = null;

		outETMsg = new CAANMsg[1];
		
		outETMsg[0] = new CAANMsg("eo.ejb.cbm.entity.KK0011ETMsg");
		
		if (EVENT_ID_MAP.containsKey(eventID))
		{
			//振舞IDのセット
			outETMsg[0].set(KK0011ETMsg.EVENTID, EVENT_ID_MAP.get(eventID));
			//申込更新共通振舞内部
			execIKK0011D999_toElementMsg(inCBMMsg, outETMsg[0], inContext, EVENT_ID_MAP.get(eventID));
		}
		else
		{
			throw new Exception("EventIDが定義されていません。");
		}

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JSYejbKK0011CBMMsgCV.toElementMsg#end");

		return outETMsg;
	}

	/**
	 * 申込登録振舞内部<IKK0011D001> (CBMMsg→ETMsg) です。
	 * @param inCBMMsg 処理を行うCBMMsg
	 * @param outETMsg 処理を行うETMsg
	 */
	private CAANMsg execIKK0011D999_toElementMsg(CAANMsg inCBMMsg,CAANMsg outETMsg,AgentDispatchContext inContext, String eventID) {

		//ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JSYejbKK0011CBMMsgCV." + eventID);

		//項目転記
		outETMsg = execCopyToETMsg(inCBMMsg, outETMsg);

		//概念スキーマ項目から内部スキーマ項目へ変換する
		// DBカラムについて、概念スキーマ項目から内部スキーマ項目へ変換する
		Object[][] contents = KK0011ETMsg.getSchemaContents();
		String msgName = null;
		String dBColumnName = null;

		for (int i = 0; i < contents.length; i++)
		{
			msgName = (String)contents[i][0];
			dBColumnName = (String)contents[i][2];

			// DBカラム(システム共通項目を除く)のみ対象とする
// ▼▼▼ IT1-2017-0000025 2017/04/07 Modify START 
//			if (dBColumnName != null && !SYS_COMMON_KEY_LIST.contains(dBColumnName))
			if (dBColumnName != null && !JPCejbEntityMainBase.SYS_COMMON_KEY_LIST.contains(dBColumnName))
// ▲▲▲ IT1-2017-0000025 2017/04/07 Modify END
			{
				//FROM:申込:CBMMsg TO:申込:ETMsg
				outETMsg.set(msgName, inCBMMsg.getObject(msgName));
			}
		}

		//FROM:申込:登録オペレータアカウント TO:申込:登録オペレータアカウント
		outETMsg.set(KK0011ETMsg.ADD_OPEACNT,inCBMMsg.getObject(KK0011ETMsg.ADD_OPEACNT));
		//FROM:申込:更新年月日時分秒 TO:申込:更新年月日時分秒
		outETMsg.set(KK0011ETMsg.UPD_DTM,inCBMMsg.getObject(KK0011ETMsg.UPD_DTM));
		//FROM:申込:更新オペレータアカウント TO:申込:更新オペレータアカウント
		outETMsg.set(KK0011ETMsg.UPD_OPEACNT,inCBMMsg.getObject(KK0011ETMsg.UPD_OPEACNT));
		//FROM:申込:無効フラグ TO:申込:無効フラグ
		outETMsg.set(KK0011ETMsg.MK_FLG,inCBMMsg.getObject(KK0011ETMsg.MK_FLG));

		//ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JSYejbKK0011CBMMsgCV." + eventID);
		return outETMsg;
	}

	/**
	* ETMsgの配列からCBMMsgに変換します。
	* 
	* @param inETMsg エンティティの配列
	* @param inCBMMsg 分解前の概念スキーマ
	* @return inCBMMsg 分解後の概念スキーマ
	*/
	public CAANMsg toGroupMsg(CAANMsg[] inETMsg, CAANMsg inCBMMsg, AgentDispatchContext inContext) throws Exception {

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JSYejbKK0011CBMMsgCV.toGroupMsg#start");

		//振舞ID取り出し
		String eventID = inCBMMsg.getString(KK0011CBMMsg.EVENTID);

		//処理の振り分け
		if(EVENT_ID_MAP.containsKey(eventID)){
			//申込登録振舞内部
			execIKK0011D999_toGroupMsg(inETMsg[0], inCBMMsg, EVENT_ID_MAP.get(eventID));

		}
		//下りデータ引継処理
		setSucceedDataToGroupMsg(inCBMMsg, inContext, eventID);

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "JSYejbKK0011CBMMsgCV.toGroupMsg#end");

		return inCBMMsg;
	}

	/**
	 * 申込登録振舞内部<IKK0011D001> (ETMsg→CBMMsg) です。
	 * @param inETMsg   処理を行うETMsg
	 * @param outCBMMsg 処理を行うoutCBMMsg
	 */
	private CAANMsg execIKK0011D999_toGroupMsg(CAANMsg inETMsg,CAANMsg outCBMMsg, String eventID) {

		//ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JSYejbKK0011CBMMsgCV." + eventID);

		//ステータス
		int st = 0;

		//項目転記
		outCBMMsg = execCopyToCBMMsg(inETMsg, outCBMMsg);

		// エラー返却項目について、内部スキーマ項目から概念スキーマ項目へ変換する
		Object[][] contents = KK0011ETMsg.getSchemaContents();
		String msgName = null;
		String dBColumnName = null;

		for (int i = 0; i < contents.length; i++)
		{
			msgName = (String)contents[i][0] + "_err";
			dBColumnName = (String)contents[i][2];

			// DBカラム(システム共通項目を除く)のみ対象とする
// ▼▼▼ IT1-2017-0000025 2017/04/07 Modify START 
//			if (dBColumnName != null && !SYS_COMMON_KEY_LIST.contains(dBColumnName))
			if (dBColumnName != null && !JPCejbEntityMainBase.SYS_COMMON_KEY_LIST.contains(dBColumnName))
// ▲▲▲ IT1-2017-0000025 2017/04/07 Modify END
			{
				if (!inETMsg.isNull(msgName))
				{
					//FROM:申込:ETMsg TO:申込:CBMMsg
					outCBMMsg.set(msgName, inETMsg.getObject(msgName));
				}
			}
		}

// ▼▼▼ IT1-2017-0000025 2017/04/07 ADD START
		//FROM:申込:登録年月日時分秒 TO:申込:登録年月日時分秒
		outCBMMsg.set(KK0011CBMMsg.ADD_DTM,inETMsg.getObject(KK0011ETMsg.ADD_DTM));
		if(!inETMsg.isNull(KK0011ETMsg.ADD_OPEACNT_ERR)){
			//FROM:申込:登録オペレータアカウントエラー TO:申込:登録オペレータアカウントエラー
			outCBMMsg.set(KK0011CBMMsg.ADD_OPEACNT_ERR, inETMsg.getObject(KK0011ETMsg.ADD_OPEACNT_ERR));
		}
		if(!inETMsg.isNull(KK0011ETMsg.UPD_DTM_ERR)){
			//FROM:申込:更新年月日時分秒エラー TO:申込:更新年月日時分秒エラー
			outCBMMsg.set(KK0011CBMMsg.UPD_DTM_ERR, inETMsg.getObject(KK0011ETMsg.UPD_DTM_ERR));
		}
		//FROM:申込:更新年月日時分秒 TO:申込:更新年月日時分秒
		outCBMMsg.set(KK0011CBMMsg.UPD_DTM,inETMsg.getObject(KK0011ETMsg.UPD_DTM));
		if(!inETMsg.isNull(KK0011ETMsg.UPD_OPEACNT_ERR)){
			//FROM:申込:更新オペレータアカウントエラー TO:申込:更新オペレータアカウントエラー
			outCBMMsg.set(KK0011CBMMsg.UPD_OPEACNT_ERR, inETMsg.getObject(KK0011ETMsg.UPD_OPEACNT_ERR));
		}
		if(!inETMsg.isNull(KK0011ETMsg.MK_FLG_ERR)){
			//FROM:申込:無効フラグエラー TO:申込:無効フラグエラー
			outCBMMsg.set(KK0011CBMMsg.MK_FLG_ERR, inETMsg.getObject(KK0011ETMsg.MK_FLG_ERR));
		}
// ▲▲▲ IT1-2017-0000025 2017/04/07 ADD END

		//ステータス
		if(st < inETMsg.getInt(KK0011ETMsg.STATUS)) {
			st = inETMsg.getInt(KK0011ETMsg.STATUS);
		}

		//ステータスのセット
		outCBMMsg.set(KK0011ETMsg.STATUS,st);

		//ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JSYejbKK0011CBMMsgCV." + eventID);

		return outCBMMsg;

	}	
	/**
	 * 共通項目情報転記(CBMMsg→ETMsg)
	 * @param inCBMMsg 処理を行うCBMMsg
	 * @param outETMsg 処理を行うETMsg
	 */
	private static CAANMsg execCopyToETMsg(CAANMsg inCBMMsg, CAANMsg outETMsg) {
		//項目転記
		outETMsg.set(KK0011ETMsg.TEMPLATEID, inCBMMsg.getObject(KK0011CBMMsg.TEMPLATEID));
		outETMsg.set(KK0011ETMsg.IDENTIFYCD, inCBMMsg.getObject(KK0011CBMMsg.IDENTIFYCD));
		outETMsg.set(KK0011ETMsg.STATUS, inCBMMsg.getObject(KK0011CBMMsg.STATUS));
		outETMsg.set(KK0011ETMsg.OPERATORID, inCBMMsg.getObject(KK0011CBMMsg.OPERATORID));
		outETMsg.set(KK0011ETMsg.OPERATEDATE, inCBMMsg.getObject(KK0011CBMMsg.OPERATEDATE));
		outETMsg.set(KK0011ETMsg.OPERATEDATETIME, inCBMMsg.getObject(KK0011CBMMsg.OPERATEDATETIME));
		outETMsg.set(KK0011ETMsg.AC_GROUP_CD, inCBMMsg.getObject(KK0011CBMMsg.AC_GROUP_CD));
		outETMsg.set(KK0011ETMsg.FUNC_CODE, inCBMMsg.getObject(KK0011CBMMsg.FUNC_CODE));

		return outETMsg;
	}
	
	/**
	 * 共通項目情報転記(ETMsg→CBMMsg)
	 * @param inCBMMsg 処理を行うCBMMsg
	 * @param outETMsg 処理を行うETMsg
	 */
	private static CAANMsg execCopyToCBMMsg(CAANMsg inETMsg, CAANMsg outCBMMsg) {
		//項目転記
		outCBMMsg.set(KK0011CBMMsg.TEMPLATEID, inETMsg.getObject(KK0011ETMsg.TEMPLATEID));
		outCBMMsg.set(KK0011CBMMsg.IDENTIFYCD, inETMsg.getObject(KK0011ETMsg.IDENTIFYCD));
		outCBMMsg.set(KK0011CBMMsg.STATUS, inETMsg.getObject(KK0011ETMsg.STATUS));
		outCBMMsg.set(KK0011CBMMsg.OPERATORID, inETMsg.getObject(KK0011ETMsg.OPERATORID));
		outCBMMsg.set(KK0011CBMMsg.OPERATEDATE, inETMsg.getObject(KK0011ETMsg.OPERATEDATE));
		outCBMMsg.set(KK0011CBMMsg.OPERATEDATETIME, inETMsg.getObject(KK0011ETMsg.OPERATEDATETIME));
		outCBMMsg.set(KK0011CBMMsg.AC_GROUP_CD, inETMsg.getObject(KK0011ETMsg.AC_GROUP_CD));
		outCBMMsg.set(KK0011CBMMsg.FUNC_CODE, inETMsg.getObject(KK0011ETMsg.FUNC_CODE));

		return outCBMMsg;
	}

// ▼▼▼ IT1-2017-0000025 2017/4/7 DEL START
//	/** システム共通項目キーリスト */
//	public static final ArrayList<String> SYS_COMMON_KEY_LIST = new ArrayList<String>();
//	static
//	{
//		SYS_COMMON_KEY_LIST.add("ADD_DTM");       // 登録年月日時分秒
//		SYS_COMMON_KEY_LIST.add("ADD_OPEACNT");   // 登録オペレータアカウント
//		SYS_COMMON_KEY_LIST.add("UPD_DTM");       // 更新年月日時分秒
//		SYS_COMMON_KEY_LIST.add("UPD_OPEACNT");   // 更新オペレータアカウント
//		SYS_COMMON_KEY_LIST.add("DEL_DTM");       // 削除年月日時分秒
//		SYS_COMMON_KEY_LIST.add("DEL_OPEACNT");   // 削除オペレータアカウント
//		SYS_COMMON_KEY_LIST.add("MK_FLG");        // 無効フラグ
//		SYS_COMMON_KEY_LIST.add("ADD_UNYO_YMD");  // 登録運用年月日
//		SYS_COMMON_KEY_LIST.add("ADD_TRN_ID");    // 登録処理ID
//		SYS_COMMON_KEY_LIST.add("UPD_UNYO_YMD");  // 更新運用年月日
//		SYS_COMMON_KEY_LIST.add("UPD_TRN_ID");    // 更新処理ID
//		SYS_COMMON_KEY_LIST.add("DEL_UNYO_YMD");  // 削除運用年月日
//		SYS_COMMON_KEY_LIST.add("DEL_TRN_ID");    // 削除処理ID
//	};
// ▲▲▲ IT1-2017-0000025 2017/4/7 DEL END

}

