/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEDK0101TPMA
*	ソースファイル名：JEDK0101TPMA.java
*	作成者			：EK909731
*	日付			：2012年06月26日
*＜機能概要＞
*	倉庫棚制約部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/

package eo.ejb.cbs.mainproc;

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 com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JDKStrConst;
import eo.ejb.cbm.entity.DK0101ETMsg;
import eo.ejb.cbm.entity.ZM0421ETMsg;
import eo.ejb.cbm.entity.ZM0431ETMsg;
import eo.ejb.cbs.cbsmsg.EDK0011C080CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011C080CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0011D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EDK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg;
import eo.ejb.cbs.cbsmsg.EDKA0010006CBSMsg2List;
import eo.ejb.common.entity.JDKejbDK0101KRCK;
import eo.ejb.common.entity.JDKejbZM0421KRCK;
import eo.ejb.common.entity.JDKejbZM0431KRCK;

/**
 * <p>
 * 倉庫棚の独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEDK0101TPMA implements TemplateMainHandler
{

	private static final String STATUS = "status";
	
	/**
	 * <p>
	 * 新しいJEDK0101TPMAを作成します。
	 * </p>
	 */
	public JEDK0101TPMA()
	{
		super();
	}

	/**
	 * <p>
	 * 配送実績登録時の倉庫棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invokeEDK0011D010(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String sokoCd = "";
		String shelfCd = "";
		String sokoErr = "";
		
		String shikibetuCd = inMsg.getString(EDK0011D010CBSMsg.IDOMOTO_KRIPLACE_SKCD);
		if (JDKStrConst.KANRI_PLACE_SKB_SOKO.equals(shikibetuCd))
		{
			sokoCd = EDK0011D010CBSMsg.HAISO_MOTO_SOKO_CD;
			shelfCd = EDK0011D010CBSMsg1List.HAISO_MOTO_SKDN_CD;
			sokoErr = EDK0011D010CBSMsg.HAISO_MOTO_SOKO_CD_ERR;
			
			checkForSoko(inMsg, inContext, 
					EDK0011D010CBSMsg.EDK0011D010CBSMSG1LIST,
					sokoCd,
					shelfCd,
					sokoErr,
					"EA"
					);
		}
		else if (JDKStrConst.KANRI_PLACE_SKB_KOJI.equals(shikibetuCd))
		{
			sokoCd = EDK0011D010CBSMsg.IDOMOTO_KOCOMP_CD;
			shelfCd = EDK0011D010CBSMsg1List.IDOMOTO_KOCOMP_SLF_CD;
			sokoErr = EDK0011D010CBSMsg.IDOMOTO_KOCOMP_CD_ERR;
			
			checkForKoji(inMsg, inContext, 
					EDK0011D010CBSMsg.EDK0011D010CBSMSG1LIST,
					sokoCd,
					shelfCd,
					sokoErr,
					"EA"
					);
		}
		if (JDKStrConst.KANRI_PLACE_SKB_YOTAKU.equals(shikibetuCd))
		{
			sokoCd = EDK0011D010CBSMsg.IDOMOTO_YTKSKOF_CD;
			shelfCd = EDK0011D010CBSMsg1List.IDOMOTO_YTKSKOF_SLF_CD;
			sokoErr = EDK0011D010CBSMsg.IDOMOTO_YTKSKOF_CD_ERR;
			
			checkForYotaku(inMsg, inContext, 
					EDK0011D010CBSMsg.EDK0011D010CBSMSG1LIST,
					sokoCd,
					shelfCd,
					sokoErr,
					"EA"
					);
			
		}

	}
	
	/**
	 * <p>
	 * 配送受付時の倉庫棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invokeEDK0011D020(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String sokoCd = "";
		String shelfCd = "";
		String sokoErr = "";
		
		String shikibetuCd = inMsg.getString(EDK0011D020CBSMsg.IDOMOTO_KRIPLACE_SKCD);
		if (JDKStrConst.KANRI_PLACE_SKB_SOKO.equals(shikibetuCd))
		{
			sokoCd = EDK0011D020CBSMsg.HAISO_MOTO_SOKO_CD;
			shelfCd = EDK0011D020CBSMsg1List.HAISO_MOTO_SKDN_CD;
			sokoErr = EDK0011D020CBSMsg.HAISO_MOTO_SOKO_CD_ERR;
			
			checkForSoko(inMsg, inContext, 
					EDK0011D020CBSMsg.EDK0011D020CBSMSG1LIST,
					sokoCd,
					shelfCd,
					sokoErr,
					"EB"
					);
		}
		else if (JDKStrConst.KANRI_PLACE_SKB_KOJI.equals(shikibetuCd))
		{
			sokoCd = EDK0011D020CBSMsg.IDOMOTO_KOCOMP_CD;
			shelfCd = EDK0011D020CBSMsg1List.IDOMOTO_KOCOMP_SLF_CD;
			sokoErr = EDK0011D020CBSMsg.IDOMOTO_KOCOMP_CD_ERR;
			
			checkForKoji(inMsg, inContext, 
					EDK0011D020CBSMsg.EDK0011D020CBSMSG1LIST,
					sokoCd,
					shelfCd,
					sokoErr,
					"EB"
					);
		}
		if (JDKStrConst.KANRI_PLACE_SKB_YOTAKU.equals(shikibetuCd))
		{
			sokoCd = EDK0011D020CBSMsg.IDOMOTO_YTKSKOF_CD;
			shelfCd = EDK0011D020CBSMsg1List.IDOMOTO_YTKSKOF_SLF_CD;
			sokoErr = EDK0011D020CBSMsg.IDOMOTO_YTKSKOF_CD_ERR;
			
			checkForYotaku(inMsg, inContext, 
					EDK0011D020CBSMsg.EDK0011D020CBSMSG1LIST,
					sokoCd,
					shelfCd,
					sokoErr,
					"EB"
					);
			
		}
	}
	
	/**
	 * <p>
	 * 配送完了実績登録時の倉庫棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invokeEDK0011C080(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		String shikibetuCd = inMsg.getString(EDK0011C080CBSMsg.IDOMOTO_KRIPLACE_SKCD);
		if (JDKStrConst.KANRI_PLACE_SKB_SOKO.equals(shikibetuCd))
		{
			checkForSoko(inMsg, inContext, 
					EDK0011C080CBSMsg.EDK0011C080CBSMSG1LIST,
					EDK0011C080CBSMsg.SOKO_CD,
					EDK0011C080CBSMsg1List.SHELF_CD,
					EDK0011C080CBSMsg1List.SHELF_CD_ERR,
					"EE"
					);
		}
		else if (JDKStrConst.KANRI_PLACE_SKB_KOJI.equals(shikibetuCd))
		{
			checkForKoji(inMsg, inContext, 
					EDK0011C080CBSMsg.EDK0011C080CBSMSG1LIST,
					EDK0011C080CBSMsg.SOKO_CD,
					EDK0011C080CBSMsg1List.SHELF_CD,
					EDK0011C080CBSMsg1List.SHELF_CD_ERR,
					"EE"
					);
		}
		else if (JDKStrConst.KANRI_PLACE_SKB_YOTAKU.equals(shikibetuCd))
		{
			checkForYotaku(inMsg, inContext, 
					EDK0011C080CBSMsg.EDK0011C080CBSMSG1LIST,
					EDK0011C080CBSMsg.SOKO_CD,
					EDK0011C080CBSMsg1List.SHELF_CD,
					EDK0011C080CBSMsg1List.SHELF_CD_ERR,
					"EE"
					);
			
		}
	}
	
	/**
	 * <p>
	 * 宅内機器修理交換情報更新の倉庫棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invokeEDKA0010006(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		CAANMsg inCheckMsg = null;

		for (CAANMsg inDetailMsg : inMsg.getCAANMsgList(EDKA0010006CBSMsg.EDKA0010006CBSMSG2LIST))
		{
			if (inDetailMsg.isNull(EDKA0010006CBSMsg2List.KEY_KNRI_PLC_CD) || 
				inDetailMsg.isNull(EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SLF_CD) ||
				inDetailMsg.isNull(EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SKBT_CD)
				)
			{
				continue;
			}

			String shikibetuCd = inDetailMsg.getString(EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SKBT_CD);
			String sokoCd = inDetailMsg.getString(EDKA0010006CBSMsg2List.KEY_KNRI_PLC_CD);
			String shelfCd = inDetailMsg.getString(EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SLF_CD);
			
			if (JDKStrConst.KANRI_PLACE_SKB_SOKO.equals(shikibetuCd))
			{
				inCheckMsg = new CAANMsg(DK0101ETMsg.class.getName());
				inCheckMsg.set(DK0101ETMsg.SOKO_CD, sokoCd);
				inCheckMsg.set(DK0101ETMsg.SHELF_CD, shelfCd);
				reportError(JDKejbDK0101KRCK.isExistsShelf(inCheckMsg, inContext, DK0101ETMsg.SOKO_CD, DK0101ETMsg.SHELF_CD)
						, inMsg, inDetailMsg, EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SLF_CD_ERR, "EB");
			}
			else if (JDKStrConst.KANRI_PLACE_SKB_KOJI.equals(shikibetuCd))
			{
				inCheckMsg = new CAANMsg(ZM0421ETMsg.class.getName());
				inCheckMsg.set(ZM0421ETMsg.KOJI_COMP_CD, sokoCd);
				inCheckMsg.set(ZM0421ETMsg.KOJI_COMP_SLF_CD, shelfCd);
				reportError(JDKejbZM0421KRCK.isExistsShelf(inCheckMsg, inContext, ZM0421ETMsg.KOJI_COMP_CD, ZM0421ETMsg.KOJI_COMP_SLF_CD)
						, inMsg, inDetailMsg, EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SLF_CD_ERR, "EC");
			}
			else if (JDKStrConst.KANRI_PLACE_SKB_YOTAKU.equals(shikibetuCd))
			{
				inCheckMsg = new CAANMsg(ZM0431ETMsg.class.getName());
				inCheckMsg.set(ZM0431ETMsg.YOTAKU_SAKI_OFFC_CD, sokoCd);
				inCheckMsg.set(ZM0431ETMsg.YOTAKU_SAKI_OFFC_SLF_CD, shelfCd);
				reportError(JDKejbZM0431KRCK.isExistsShelf(inCheckMsg, inContext, ZM0431ETMsg.YOTAKU_SAKI_OFFC_CD, ZM0431ETMsg.YOTAKU_SAKI_OFFC_SLF_CD)
						, inMsg, inDetailMsg, EDKA0010006CBSMsg2List.KEY_KNRI_PLC_SLF_CD_ERR, "ED");
			}

		}
	}
	
	/**
	 * <p>
	 * 棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param listName 明細リスト名
	 * @param ttmCdKey 倉庫コード
	 * @param shelfCdKey 棚コード
	 * @param errCd エラーコード
	 */
	private static void checkForSoko(CAANMsg inMsg, AgentDispatchContext inContext, 
			String listName, String ttmCdKey, String shelfCdKey, String errField, String errCd)
	{
		CAANMsg in0101ETMsg = new CAANMsg(DK0101ETMsg.class.getName());
		in0101ETMsg.set(DK0101ETMsg.SOKO_CD, inMsg.getString(ttmCdKey));

		for (CAANMsg inDetailMsg : inMsg.getCAANMsgList(listName))
		{
			in0101ETMsg.set(DK0101ETMsg.SHELF_CD, inDetailMsg.getString(shelfCdKey));

			reportError(JDKejbDK0101KRCK.isExistsShelf(in0101ETMsg, inContext, DK0101ETMsg.SOKO_CD, DK0101ETMsg.SHELF_CD)
					, inMsg, inDetailMsg, errField, errCd);
		}
	}
	
	/**
	 * <p>
	 * 預託先オフィス棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param listName 明細リスト名
	 * @param ttmCdKey 預託先コード
	 * @param shelfCdKey 棚コード
	 * @param errCd エラーコード
	 */
	private static void checkForYotaku(CAANMsg inMsg, AgentDispatchContext inContext, 
			String listName, String ttmCdKey, String shelfCdKey, String errField, String errCd)
	{
		CAANMsg in0431ETMsg = new CAANMsg(ZM0431ETMsg.class.getName());
		in0431ETMsg.set(ZM0431ETMsg.YOTAKU_SAKI_OFFC_CD, inMsg.getString(ttmCdKey));

		for (CAANMsg inDetailMsg : inMsg.getCAANMsgList(listName))
		{
			in0431ETMsg.set(ZM0431ETMsg.YOTAKU_SAKI_OFFC_SLF_CD, inDetailMsg.getString(shelfCdKey));

			reportError(JDKejbZM0431KRCK.isExistsShelf(in0431ETMsg, inContext, ZM0431ETMsg.YOTAKU_SAKI_OFFC_CD, ZM0431ETMsg.YOTAKU_SAKI_OFFC_SLF_CD)
					, inMsg, inDetailMsg, errField, errCd);
		}
	}

	/**
	 * <p>
	 * 工事会社棚の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param listName 明細リスト名
	 * @param ttmCdKey 工事会社コード
	 * @param shelfCdKey 棚コード
	 * @param errCd エラーコード
	 */
	private static void checkForKoji(CAANMsg inMsg, AgentDispatchContext inContext, 
			String listName, String ttmCdKey, String shelfCdKey, String errField, String errCd)
	{
		CAANMsg in0421ETMsg = new CAANMsg(ZM0421ETMsg.class.getName());
		in0421ETMsg.set(ZM0421ETMsg.KOJI_COMP_CD, inMsg.getString(ttmCdKey));

		for (CAANMsg inDetailMsg : inMsg.getCAANMsgList(listName))
		{
			in0421ETMsg.set(ZM0421ETMsg.KOJI_COMP_SLF_CD, inDetailMsg.getString(shelfCdKey));

			reportError(JDKejbZM0421KRCK.isExistsShelf(in0421ETMsg, inContext, ZM0421ETMsg.KOJI_COMP_CD, ZM0421ETMsg.KOJI_COMP_SLF_CD)
					, inMsg, inDetailMsg, errField, errCd);
		}
	}
	
	private static void reportError(boolean noError, CAANMsg inMsg, CAANMsg inDetailMsg, String errField, String errCd)
	{
		if (noError)
		{
			return;
		}
		
		if (inMsg.containsKeyOfSchema(errField))
		{
			inMsg.set(errField, errCd);
		}
		else
		{
			inDetailMsg.set(errField, errCd);
		}
	
		inMsg.set(STATUS, StatusCodes.RELATION_ERR);
	}
}
