/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKU0081C020TPMA
*	ソースファイル名：JEKU0081C020TPMA.java
*	作成者			：FJ
*	日付			：2011年10月14日
*＜機能概要＞
*	工事案件回復(eo光テレビ、eo光テレビ回線)の独自処理を呼び出す部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
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.JKUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbm.entity.KU0011ETMsg;
import eo.ejb.cbm.entity.KU0031ETMsg;
import eo.ejb.cbm.entity.KU0041ETMsg;
import eo.ejb.cbm.entity.KU0081ETMsg;
import eo.ejb.cbm.entity.KU0101ETMsg;
import eo.ejb.cbm.entity.KU0111ETMsg;
import eo.ejb.cbs.cbsmsg.EKU0081C020CBSMsg;
import eo.ejb.common.JKUModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JKUejbKU0011SecProc;
import eo.ejb.common.db.JKUejbKU0031SecProc;
import eo.ejb.common.db.JKUejbKU0041SecProc;
import eo.ejb.common.db.JKUejbKU0081SecProc;
import eo.ejb.common.db.JKUejbKU0101SecProc;
import eo.ejb.common.db.JKUejbKU0111SecProc;

/**
 * <p>
 * 工事案件回復(eo光テレビ、eo光テレビ回線)の独自処理を呼び出す部品です。
 * </p>
 * @author 富士通
 */
public class JEKU0081C020TPMA implements TemplateMainHandler
{
	
	/**
	 * エラー定数
	 */
	
	/** サービス契約_工事案件　検索時存在チェックエラー */
	private static final String ERR_CD_KU0081_ISNULL_FIND = "EA";
	/** サービス契約_工事案件　サービスコード　整合性エラー */
	private static final String ERR_CD_KU0081_SVC_CD = "EB";
	/** サービス契約_工事案件　回復不可確定年月日　整合性エラー */
	private static final String ERR_CD_KU0081_KAIHK = "ED";
	/** 工事案件　存在チェックエラー */
	private static final String ERR_CD_KU0011_ISNULL = "EE";
	/** 工事案件　回線撤去済　整合性エラー */
	private static final String ERR_CD_KU0011_TEKKYOZM = "EF";
	/** 工事案件　排他エラー */
	private static final String ERR_CD_KU0011_HAITA = "EG";
	/** 工事案件　振舞パターン　整合性エラー */
	private static final String ERR_CD_KU0011_FURUMAI = "EH";
	/** 工事案件＜eo光テレビ＞　存在チェックエラー */
	private static final String ERR_CD_KU0031_ISNULL = "EI";
	/** 工事案件＜eo光テレビ回線＞　存在チェックエラー */
	private static final String ERR_CD_KU0041_ISNULL = "EJ";
	/** サービス契約_工事案件　更新時存在チェックエラー */
	private static final String ERR_CD_KU0081_ISNULL_UPD = "EK";
	/** 工事案件　中止かつ工事案件依頼年月日が設定済エラー */
	private static final String ERR_CD_KU0011_CHUSHI_REQ = "EL";
	
	/**
	 * 工事案件検索フラグ
	 */
	
	/** 検索フラグ1（工事案件番号検索） */
	private static final String SEARCH_KEY_FLG = "1";
	/** 検索フラグ2（更新対象工事案件番号検索） */
	private static final String SEARCH_KOSHIN_TAISHO_FLG = "2";
	
	/**
	 * コンストラクタです。
	 */
	public JEKU0081C020TPMA()
	{
		super();
	}

	/**
	 * 主処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param inContext	ディスパッチコンテキスト
	 * @throws CAANException
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		//	---サービス契約_工事案件情報配列を作成する
		
		JKUejbKU0081SecProc ku0081SecProc = new JKUejbKU0081SecProc();
		CAANMsg ku0081Msg = new CAANMsg(KU0081ETMsg.class.getName());
		
		// サービス契約番号
		ku0081Msg.set(KU0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKU0081C020CBSMsg.SVC_KEI_NO));
		// 無効フラグ
		ku0081Msg.set(KU0081ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		CAANMsg[] ku0081MsgArray = ku0081SecProc.findByCondition(ku0081Msg);
		
		// ---存在チェック
		
		if (null == ku0081MsgArray || ku0081MsgArray.length == 0)
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0081_ISNULL_FIND);
			return;
		}
		
		// ---サービスコードチェック
		
		for (int i = 0; i < ku0081MsgArray.length; ++i)
		{
			// サービスコードがテレビサービス以外の場合
			if (!JKUStrConst.CD00130_TV.equals(ku0081MsgArray[i].getString(KU0081ETMsg.SVC_CD)))
			{
				// エラーを設定する
				setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0081_SVC_CD);
				return;
			}
		}
		
		// ---回復不可確定年月日チェック
		
		for (int i = 0; i < ku0081MsgArray.length; ++i)
		{
			// 回復不可確定年月日が存在する場合のみチェック
			if (null != ku0081MsgArray[i].getString(KU0081ETMsg.KAIHK_FAIL_FIX_YMD))
			{
				// 回復不可確定年月日がオンライン日付以前であればエラー
				if (Integer.parseInt(ku0081MsgArray[i].getString(KU0081ETMsg.KAIHK_FAIL_FIX_YMD)) <= Integer.parseInt(JKUModelCommon.getOpeDate(inCBSMsg, null)))
				{
					// エラーを設定する
					setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0081_KAIHK);
					return;
				}
			}
		}
		
		// ---工事案件番号リストを作成する
		
		List<String> kojiakNoList = new ArrayList<String>();
		
		for (int i = 0; i < ku0081MsgArray.length; ++i)
		{
			kojiakNoList.add(ku0081MsgArray[i].getString(KU0081ETMsg.KOJIAK_NO));
		}
		
		// ---工事案件リストを作成する
		
		List<CAANMsg> ku0011MsgList = getKojiakList(kojiakNoList, SEARCH_KEY_FLG);
		
		// ---工事案件存在チェック
		
		// 工事案件リストの件数と、サービス契約_工事案件配列の件数に差異がある場合
		if (ku0011MsgList.size() != ku0081MsgArray.length)
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0011_ISNULL);
			return;
		}
		
		// ---回線撤去済みチェック
		
		// 最新基本工事のみの工事案件番号リストを作成する
		List<String> kihonKojiakNoList = new ArrayList<String>();
		
		for (int i = 0; i < ku0011MsgList.size(); ++i)
		{
			if (JKUStrConst.CD00882_RCNT_KIHON_KOJI.equals(ku0011MsgList.get(i).getString(KU0011ETMsg.RCNT_KIHON_KOJI_FLG)))
			{
				kihonKojiakNoList.add(ku0011MsgList.get(i).getString(KU0011ETMsg.KOJIAK_NO));
			}
		}
		
		// 工事案件リストを取得する
		List<CAANMsg> kojiakMsgList4check = getKojiakList(kihonKojiakNoList, SEARCH_KOSHIN_TAISHO_FLG);
		
		// 回線撤去済みチェックを実行する
		for (int i = 0; i < kojiakMsgList4check.size(); ++i)
		{
			// 工事案件ステータス
			String kojiakStat = kojiakMsgList4check.get(i).getString(KU0011ETMsg.KOJIAK_STAT);
			// 工事案件種別
			String kojiakSbt = kojiakMsgList4check.get(i).getString(KU0011ETMsg.KOJIAK_SBT_CD);
			
			// 工事案件ステータスが完了済の場合
			if (JKUStrConst.CD00474_KOJI_FIN_ZM.equals(kojiakStat))
			{
				// 工事案件種別が強制解約(撤去)または撤去(解約)の場合
				if (JKUStrConst.CD00577_KYOSEI_DSL.equals(kojiakSbt)
						|| JKUStrConst.CD00577_TEKKYO_DSL.equals(kojiakSbt))
				{
					// エラーを設定する
					setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0011_TEKKYOZM);
					return;
				}
			}
		}
		
		// ---排他制御を実行する
		
		if (false == execExclusiveLock(ku0011MsgList, inContext))
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0011_HAITA);
			return;
		}
		
		// ---振舞パターンを取得する
		
		List<String> updPatternList = getUpdPatternList(ku0011MsgList);
		
		if (null == updPatternList)
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0011_FURUMAI);
			return;
		}
		
		// ---更新処理を実行する
		for (int i = 0; i < ku0011MsgList.size(); ++i)
		{
			CAANMsg ku0011Msg = ku0011MsgList.get(i);
			String updPattern = updPatternList.get(i);
			
			// 1:最新基本工事の工事案件
			if (JKUStrConst.HRMI_PATTERN_KAITV_1.equals(updPattern))
			{
				// 最新基本工事の工事案件更新実行
				if (false == updKihonKoji(inCBSMsg, ku0011Msg))
				{
					return;
				}
			}
			// 2:外部連携終了の工事案件
			else if (JKUStrConst.HRMI_PATTERN_KAITV_2.equals(updPattern))
			{
				if (false == updRnkFinKoji(inCBSMsg, ku0011Msg))
				{
					return;
				}
			}
			// 3:中止の工事案件(工事案件依頼年月日設定無し)
			else if (JKUStrConst.HRMI_PATTERN_KAITV_3.equals(updPattern))
			{
				if (false == updChushiKoji(inCBSMsg, ku0011Msg, inContext))
				{
					return;
				}
			}
			// 4:中止の工事案件(工事案件依頼年月日設定有り)
			else if (JKUStrConst.HRMI_PATTERN_KAITV_4.equals(updPattern))
			{
				// エラーを設定する
				setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0011_CHUSHI_REQ);
				return;
			}
		}
		
		// ---共通部の設定を実行する
		
		// 更新年月日時分秒
		inCBSMsg.set(EKU0081C020CBSMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント
		inCBSMsg.set(EKU0081C020CBSMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));
		
	}
	
	/**
	 * 工事案件取得処理
	 * @param kojiakNoList	工事案件番号リスト
	 * @param wherePatternFlg	検索条件設定フラグ
	 * @return	工事案件情報のリスト
	 * @throws CAANException
	 */
	private List<CAANMsg> getKojiakList(List<String> kojiakNoList, String wherePatternFlg) throws CAANException
	{
		JKUejbKU0011SecProc ku0011SecProc = new JKUejbKU0011SecProc();
		
		
		List<CAANMsg> retList = new ArrayList<CAANMsg>();
		CAANMsg[] tempKu0011MsgArray = null;
		for (int i = 0; i < kojiakNoList.size(); ++i)
		{
			CAANMsg ku0011Msg = new CAANMsg(KU0011ETMsg.class.getName());
			String kojiakNo = kojiakNoList.get(i);
			
			// 工事案件番号による検索を指定された場合
			if (SEARCH_KEY_FLG.equals(wherePatternFlg))
			{
				ku0011Msg.set(KU0011ETMsg.KOJIAK_NO, kojiakNo);
				ku0011Msg = ku0011SecProc.findByPrimaryKey(ku0011Msg, true);
				if (null != ku0011Msg)
				{
					retList.add(ku0011Msg);
				}
			}
			// 更新対象工事案件番号による検索を指定された場合
			else if (SEARCH_KOSHIN_TAISHO_FLG.equals(wherePatternFlg))
			{
				ku0011Msg.set(KU0011ETMsg.UPD_TRGT_KOJIAK_NO, kojiakNo);
				tempKu0011MsgArray = ku0011SecProc.findByCondition(ku0011Msg);
				
				if (null != tempKu0011MsgArray)
				{
					for (int j = 0; j < tempKu0011MsgArray.length; ++j)
					{
						retList.add(tempKu0011MsgArray[j]);
					}
				}
				
			}
		}
		return retList;
	}
	
	/**
	 * 工事案件リスト排他ロック処理
	 * @param ku0011MsgList	排他処理を行う工事案件情報リスト
	 * @param inContext	ディスパッチコンテキスト
	 * @return	リストの全てに対して排他ロック処理が成功した場合のみtrue
	 */
	private boolean execExclusiveLock(List<CAANMsg> ku0011MsgList, AgentDispatchContext inContext)
	{
		for (int i = 0; i < ku0011MsgList.size(); ++i)
		{
			// 共通部品による排他制御を実行する
			if (!JPCModelCommon.succeededExclusiveLock(ku0011MsgList.get(i), inContext, JKUStrConst.SCHEMA_KU0011))
			{
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 振舞パターンリスト取得処理
	 * @param ku0011MsgList	工事案件情報リスト
	 * @return	工事案件情報に対応する振舞パターン
	 */
	private List<String> getUpdPatternList(List<CAANMsg> ku0011MsgList)
	{
		if (null == ku0011MsgList)
		{
			return null;
		}
		List<String> retList = new ArrayList<String>();
		for (int i = 0; i < ku0011MsgList.size(); ++i)
		{
			// 工事案件ステータス
			String kojiakStatus = ku0011MsgList.get(i).getString(KU0011ETMsg.KOJIAK_STAT);
			// 最新基本工事フラグ
			String kihonKojiFlg = ku0011MsgList.get(i).getString(KU0011ETMsg.RCNT_KIHON_KOJI_FLG);
			// 工事案件種別
			String kojiakSbt = ku0011MsgList.get(i).getString(KU0011ETMsg.KOJIAK_SBT_CD);
			// 工事案件依頼年月日
			String kojiIraiYmd = ku0011MsgList.get(i).getString(KU0011ETMsg.KOJIAK_REQYMD);
			// 工事受付契機異動区分
			String kojiIdoDiv = ku0011MsgList.get(i).getString(KU0011ETMsg.KOJI_UK_OPTNTY_IDO_DIV);

			// 振舞パターン
			String pattern = null;
			
			// 工事案件ステータス = 「200:工事完了済」
			if (JKUStrConst.CD00474_KOJI_FIN_ZM.equals(kojiakStatus))
			{
				// 最新基本工事
				if (JKUStrConst.CD00882_RCNT_KIHON_KOJI.equals(kihonKojiFlg))
				{
					pattern = JKUStrConst.HRMI_PATTERN_KAITV_1;
				}
				// 最新基本工事以外
				else
				{
					pattern = JKUStrConst.HRMI_PATTERN_KAITV_2;
				}
			}
			// 工事案件ステータス = 「900:中止」
			else if (JKUStrConst.CD00474_CHUSHI.equals(kojiakStatus))
			{
				// 工事案件種別 = 「001:新設」or「008:リンクSTB」or「012:面開発」且つ 異動区分が「住所変更・登録」以外
				if ((JKUStrConst.CD00577_NEWESTA.equals(kojiakSbt) || JKUStrConst.CD00577_LINK_STB.equals(kojiakSbt) || JKUStrConst.CD00577_MNKHT.equals(kojiakSbt)) &&
						!JKUStrConst.CD00576_AD_CHG_TOROKU.equals(kojiIdoDiv))
				{
					// 工事案件依頼年月日 = nullまたは「20991231:初期値」の場合
					if (null == kojiIraiYmd || JKUStrConst.MAX_YMD.equals(kojiIraiYmd))
					{
						pattern = JKUStrConst.HRMI_PATTERN_KAITV_3;
					}
					// 工事案件依頼年月日が設定されている場合
					else
					{
						pattern = JKUStrConst.HRMI_PATTERN_KAITV_4;
					}
				}
				else
				{
					pattern = JKUStrConst.HRMI_PATTERN_KAITV_2;
				}
			}
			// その他
			else
			{
				pattern = JKUStrConst.HRMI_PATTERN_KAITV_2;
			}
			
			if (null == pattern)
			{
				return null;
			}
			
			retList.add(pattern);
		}
		
		return retList;
	}
	
	/**
	 * 最新基本工事の工事案件更新
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKihonKoji(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{
		// 工事案件更新
		if (false == updKU0011P1(inCBSMsg, ku0011Msg))
		{
			return false;
		}
		// 工事案件サブスキーマ更新
		if (true == isTVKaisen(inCBSMsg))
		{
			// 光テレビ回線更新
			if (false == updKU0041(inCBSMsg, ku0011Msg))
			{
				return false;
			}
		}
		else
		{
			// 光テレビ更新
			if (false == updKU0031(inCBSMsg, ku0011Msg))
			{
				return false;
			}
		}
		
		// サービス契約_工事案件更新
		if (false == updKU0081(inCBSMsg, ku0011Msg))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * 外部連携終了の工事案件更新
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updRnkFinKoji(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{
		// サービス契約_工事案件更新
		if (false == updKU0081(inCBSMsg, ku0011Msg))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * 中止の工事案件更新
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @param inContext
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updChushiKoji(CAANMsg inCBSMsg, CAANMsg ku0011Msg, AgentDispatchContext inContext) throws CAANException
	{
		JKUejbKU0081SecProc ku0081SecProc = new JKUejbKU0081SecProc();
		CAANMsg ku0081Msg = new CAANMsg(KU0081ETMsg.class.getName());
		
		// サービス契約番号
		ku0081Msg.set(KU0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKU0081C020CBSMsg.SVC_KEI_NO));
		// 工事案件番号
		ku0081Msg.set(KU0081ETMsg.KOJIAK_NO, ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO));
		
		ku0081Msg = ku0081SecProc.findByPrimaryKey(ku0081Msg, true);
		
		// 同時代表工事案件番号を取得
		String dojiDaihyoKojiakNo = JKUModelCommon.getSimRepKojiakNoNotFindByPk(
				ku0011Msg.getString(KU0011ETMsg.KOJIAK_SBT_CD), ku0011Msg.getString(KU0011ETMsg.PRC_GRP_CD)
				, null, null, null, ku0081Msg.getString(KU0081ETMsg.SVC_KEI_KAISEN_UCWK_NO));
		
		// 工事契約の更新
		if (false == updKU0011P2(inCBSMsg, ku0011Msg, dojiDaihyoKojiakNo, inContext))
		{
			return false;
		}
		
		// 工事案件サブスキーマ更新
		if (true == isTVKaisen(inCBSMsg))
		{
			// 光テレビ回線更新
			if (false == updKU0041(inCBSMsg, ku0011Msg))
			{
				return false;
			}
		}
		else
		{
			// 光テレビ更新
			if (false == updKU0031(inCBSMsg, ku0011Msg))
			{
				return false;
			}
		}
		
		// サービス契約_工事案件更新
		if (false == updKU0081(inCBSMsg, ku0011Msg))
		{
			return false;
		}
		
		// 先行設計更新
		if (false == updKU0101(inCBSMsg, ku0011Msg, dojiDaihyoKojiakNo))
		{
			return false;
		}
		
		// 設定工事更新
		if (false == updKU0111(inCBSMsg, ku0011Msg))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * 工事案件更新処理パターン@
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0011P1(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{

		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		JKUejbKU0011SecProc ku0011SecProc = new JKUejbKU0011SecProc();
		
		// 連携サービス終了年月日("":空欄)
		ku0011Msg.set(KU0011ETMsg.RNKI_SVC_ENDYMD, "");
		// 連携サービスキャンセル年月日("":空欄)
		ku0011Msg.set(KU0011ETMsg.RNKI_SVC_CANCEL_YMD, "");
		// 更新年月日時分秒(システム日付)
		ku0011Msg.set(KU0011ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(オペレータアカウント)
		ku0011Msg.set(KU0011ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));
		
		try
		{
			ku0011SecProc.update(ku0011Msg);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * 工事案件更新処理パターンA
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @param dojiDaihyoKojiakNo	同時代表工事案件番号
	 * @param inContext
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0011P2(CAANMsg inCBSMsg, CAANMsg ku0011Msg, String dojiDaihyoKojiakNo, AgentDispatchContext inContext) throws CAANException
	{

		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		
		// 同時代表工事案件の更新処理
		if(!JKUModelCommon.updateDojiDaihyoKojiak(ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO), dojiDaihyoKojiakNo, 
				inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME), 
				inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID), inContext, true))
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0011_HAITA);
			return false;
		}
		
		JKUejbKU0011SecProc ku0011SecProc = new JKUejbKU0011SecProc();

		// 工事案件ステータス(130:受付済)
		ku0011Msg.set(KU0011ETMsg.KOJIAK_STAT, JKUStrConst.CD00474_UK_ZM);
		// 連携サービス終了年月日("":空欄)
		ku0011Msg.set(KU0011ETMsg.RNKI_SVC_ENDYMD, "");
		// 連携サービスキャンセル年月日("":空欄)
		ku0011Msg.set(KU0011ETMsg.RNKI_SVC_CANCEL_YMD, "");
		// 工事案件キャンセル年月日("":空欄)
		ku0011Msg.set(KU0011ETMsg.KOJIAK_CANCEL_YMD, "");
		// 同時代表工事案件番号
		ku0011Msg.set(KU0011ETMsg.DOJI_DAIHYO_KOJIAK_NO, dojiDaihyoKojiakNo);
		// 更新年月日時分秒(システム日付)
		ku0011Msg.set(KU0011ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(オペレータアカウント)
		ku0011Msg.set(KU0011ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));

		try
		{
			ku0011SecProc.update(ku0011Msg);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * 工事案件＜eo光テレビ＞更新処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0031(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{
		JKUejbKU0031SecProc ku0031SecProc = new JKUejbKU0031SecProc();
		CAANMsg ku0031Msg = new CAANMsg(KU0031ETMsg.class.getName());
		
		// 工事案件番号
		ku0031Msg.set(KU0031ETMsg.KOJIAK_NO, ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO));
		// キー項目検索を実行する
		ku0031Msg = ku0031SecProc.findByPrimaryKey(ku0031Msg, true);
		
		// 存在チェック
		if (null == ku0031Msg)
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0031_ISNULL);
			return false;
		}
		
		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		// 強制解約指示年月日("":空欄)
		ku0031Msg.set(KU0031ETMsg.KYOSEI_DSL_SJI_YMD, "");
		// 更新年月日時分秒(システム日付)
		ku0031Msg.set(KU0031ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(オペレータアカウント)
		ku0031Msg.set(KU0031ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));

		try
		{
			ku0031SecProc.update(ku0031Msg);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}


		return true;
	}
	
	/**
	 * 工事案件＜eo光テレビ回線＞更新処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0041(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{
		JKUejbKU0041SecProc ku0041SecProc = new JKUejbKU0041SecProc();
		CAANMsg ku0041Msg = new CAANMsg(KU0041ETMsg.class.getName());
		
		// 工事案件番号
		ku0041Msg.set(KU0041ETMsg.KOJIAK_NO, ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO));
		// キー項目で検索する
		ku0041Msg = ku0041SecProc.findByPrimaryKey(ku0041Msg, true);
		
		// 存在チェック
		if (null == ku0041Msg)
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0041_ISNULL);
			return false;
		}
		
		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		
		// 強制解約指示年月日("":空欄)
		ku0041Msg.set(KU0041ETMsg.KYOSEI_DSL_SJI_YMD, "");
		// 更新年月日時分秒(システム日付)
		ku0041Msg.set(KU0041ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(オペレータアカウント)
		ku0041Msg.set(KU0041ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));
		
		try
		{
			ku0041SecProc.update(ku0041Msg);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}


		return true;
	}
	
	/**
	 * サービス契約_工事案件更新処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0081(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{
		JKUejbKU0081SecProc ku0081SecProc = new JKUejbKU0081SecProc();
		CAANMsg ku0081Msg = new CAANMsg(KU0081ETMsg.class.getName());
		
		// サービス契約番号
		ku0081Msg.set(KU0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKU0081C020CBSMsg.SVC_KEI_NO));
		// 工事案件番号
		ku0081Msg.set(KU0081ETMsg.KOJIAK_NO, ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO));
		
		// キー項目で検索する
		ku0081Msg = ku0081SecProc.findByPrimaryKey(ku0081Msg, true);
		
		// 存在チェック
		if (null == ku0081Msg)
		{
			// エラーを設定する
			setRelationError(inCBSMsg, EKU0081C020CBSMsg.SVC_KEI_NO_ERR, ERR_CD_KU0081_ISNULL_UPD);
			return false;
		}
		
		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		
		// サービス契約_工事案件適用終了年月日("20111231":初期値)
		ku0081Msg.set(KU0081ETMsg.SVKEI_KOJIAK_TENDYMD, JKUStrConst.MAX_YMD);
		// 更新年月日時分秒(システム日付)
		ku0081Msg.set(KU0081ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント(オペレータアカウント)
		ku0081Msg.set(KU0081ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));
		
		try
		{
			ku0081SecProc.update(ku0081Msg);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}

		return true;
	}
	
	/**
	 * 先行設計更新処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @param dojiDaihyoKojiakNo	同時代表工事案件番号
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0101(CAANMsg inCBSMsg, CAANMsg ku0011Msg, String dojiDaihyoKojiakNo) throws CAANException
	{
		JKUejbKU0101SecProc ku0101SecProc = new JKUejbKU0101SecProc();
		CAANMsg ku0101Msg = new CAANMsg(KU0101ETMsg.class.getName());
		
		// 工事案件番号
		String kojiakNo = ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO);
		
		// 工事案件番号
		ku0101Msg.set(KU0101ETMsg.KOJIAK_NO, kojiakNo);
		// 無効フラグ
		ku0101Msg.set(KU0101ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		// 検索を実行する
		CAANMsg[] ku0101MsgArray = ku0101SecProc.findByCondition(ku0101Msg);
		
		// 存在チェック
		if (null == ku0101MsgArray || 0 == ku0101MsgArray.length)
		{
			return true;
		}
		
		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		
		// 同時代表工事案件の更新処理
		boolean dojiUpdUM = JKUModelCommon.updateDojiDaihyoSenkoDsgn(kojiakNo, dojiDaihyoKojiakNo, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME), 
				inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID), true);
		

		try
		{
			for (int i = 0; i < ku0101MsgArray.length; ++i)
			{
				ku0101Msg = ku0101MsgArray[i];
				
				// 先行設計ステータス("130":受付済)
				ku0101Msg.set(KU0101ETMsg.SNKSKI_STAT, JKUStrConst.SNKSKI_STAT_UK_ZM);
				// 先行設計中止年月日("":空欄)
				ku0101Msg.set(KU0101ETMsg.SNKSKI_STP_YMD, "");
				
				if(dojiUpdUM)
				{
					// 同時代表工事案件番号
					ku0101Msg.set(KU0101ETMsg.DOJI_DAIHYO_KOJIAK_NO, dojiDaihyoKojiakNo);
				}
				else
				{
					// 同時代表工事案件番号
					ku0101Msg.set(KU0101ETMsg.DOJI_DAIHYO_KOJIAK_NO, "");
				}
				
				// 更新年月日時分秒(システム日付)
				ku0101Msg.set(KU0101ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
				// 更新オペレータアカウント(オペレータアカウント)
				ku0101Msg.set(KU0101ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));
				
				ku0101SecProc.update(ku0101Msg);
			}
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * 設定工事更新処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param ku0011Msg	工事案件情報
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean updKU0111(CAANMsg inCBSMsg, CAANMsg ku0011Msg) throws CAANException
	{
		JKUejbKU0111SecProc ku0111SecProc = new JKUejbKU0111SecProc();
		CAANMsg ku0111Msg = new CAANMsg(KU0111ETMsg.class.getName());
		
		// 工事案件番号
		ku0111Msg.set(KU0111ETMsg.KOJIAK_NO, ku0011Msg.getString(KU0011ETMsg.KOJIAK_NO));
		// 無効フラグ
		ku0111Msg.set(KU0111ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		// 検索を実行する
		CAANMsg[] ku0111MsgArray = ku0111SecProc.findByCondition(ku0111Msg);
		
		// 存在チェック
		if (null == ku0111MsgArray || 0 == ku0111MsgArray.length)
		{
			return true;
		}
		
		// --- 機能コードを確認する
		if (!JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0081C020CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		
		try
		{
			for (int i = 0; i < ku0111MsgArray.length; ++i)
			{
				ku0111Msg = ku0111MsgArray[i];
				
				// 設定工事ステータス("130":受付済)
				ku0111Msg.set(KU0111ETMsg.SETTE_KOJI_STAT, JKUStrConst.CD00477_UK_ZM);
				// 設定工事キャンセル年月日時分秒("":空欄)
				ku0111Msg.set(KU0111ETMsg.SETTE_KOJI_CANCEL_DTM, "");
				// 更新年月日時分秒(システム日付)
				ku0111Msg.set(KU0111ETMsg.UPD_DTM, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATEDATETIME));
				// 更新オペレータアカウント(オペレータアカウント)
				ku0111Msg.set(KU0111ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0081C020CBSMsg.OPERATORID));
				
				ku0111SecProc.update(ku0111Msg);
				
			}
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	/**
	 * 光テレビ回線判定処理
	 * @param inCBSMsg	CBSメッセージ
	 * @return	光テレビ回線の回復である場合true
	 */
	private boolean isTVKaisen(CAANMsg inCBSMsg)
	{
		// 料金グループコード
		String prcGrpCd = inCBSMsg.getString(EKU0081C020CBSMsg.PRC_GRP_CD);
		
		// 料金グループコードがeo光テレビ（KCN)の場合は、光テレビ回線
		if (JKUStrConst.CD00133_EOH_TV_KCN.equals(prcGrpCd))
		{
			return true;
		}
		return false;
	}
	
	
	/**
	 * リレーションエラーを設定します
	 * @param inCBSMsg		CBSメッセージ
	 * @param errContents	エラーを設定する項目
	 * @param errCd			設定するエラーコード
	 */
	private void setRelationError(CAANMsg inCBSMsg, String errContents, String errCd)
	{
		// エラーを設定する
		inCBSMsg.set(errContents, errCd);
		// ステータスを設定する
		inCBSMsg.set(EKU0081C020CBSMsg.STATUS, StatusCodes.RELATION_ERR);
	}
}
