/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKU0131C010TPMA
*	ソースファイル名：JEKU0131C010TPMA.java
*	作成者			：富士通
*	日付			：2012年04月19日
*＜機能概要＞
*	工事作業項目の更新を行うサービスインターフェイス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/04/19	FJ)高橋		新規作成
*	v3.00.00	2012/04/19	FJ)高橋		【ANK-0377-00-00】（OPMS連携）工事費連携における連携機能追加変更
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import com.fujitsu.futurity.model.base.CAANCreateException;
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.KU0131ETMsg;
import eo.ejb.cbs.cbsmsg.EKU0131C010CBSMsg;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JKUejbKU0131SecProc;

/**
 * <p>
 * 工事作業項目更新の独自処理を呼び出す部品です。
 * </p>
 * @author 富士通
 */
public class JEKU0131C010TPMA implements TemplateMainHandler
{
	
	/**
	 * 関連エラーコード
	 */
	/** 工事作業項目存在エラー */
	private static final String RELATION_ERR_CD_SONZAI = "EA";
	/** 工事作業項目排他エラー */
	private static final String RELATION_ERR_CD_HAITA = "EB";
	
	/**
	 * コンストラクタです。
	 */
	public JEKU0131C010TPMA()
	{
		super();
	}
	
	/**
	 * 主処理
	 * @param inCBSMsg
	 * @param inContext
	 * @throws CAANException 
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// 登録対象工事作業項目情報の取得
		
		CAANMsg ku0131Msg = getKU0131Msg(inCBSMsg, inContext);
		
		if (null == ku0131Msg)
		{
			return;
		}
		
		// 機能コードチェック
		
		if(false == JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0131C010CBSMsg.FUNC_CODE)))
		{
			return;
		}
		
		// 論理削除と登録の実行
		
		if (false == deleteAndInsertKU0131(ku0131Msg, inCBSMsg))
		{
			return;
		}
		
		// 出力項目の設定
		
		// 登録年月日時分秒
		inCBSMsg.set(EKU0131C010CBSMsg.ADD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
		// 登録オペレータアカウント
		inCBSMsg.set(EKU0131C010CBSMsg.ADD_OPEACNT, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATORID));
		// 更新年月日時分秒
		inCBSMsg.set(EKU0131C010CBSMsg.UPD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント
		inCBSMsg.set(EKU0131C010CBSMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATORID));
		// 無効フラグ
		inCBSMsg.set(EKU0131C010CBSMsg.MK_FLG, JKUStrConst.MK_FLG_MUKO);
	}
	
	/**
	 * 登録対象工事作業項目取得処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param inContext	ディスパッチコンテキスト
	 * @return	登録対象工事作業項目情報
	 * @throws CAANException
	 */
	private CAANMsg getKU0131Msg(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// 工事作業項目の検索を実行する
		CAANMsg ku0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
		
		// 工事費工事分類コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, inCBSMsg.getString(EKU0131C010CBSMsg.KOJIHI_KOJI_BUNRUI_CD));
		// 工事費項目コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD, inCBSMsg.getString(EKU0131C010CBSMsg.KOJIHI_KMK_CD));
		// 工事費単価コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD, inCBSMsg.getString(EKU0131C010CBSMsg.KOJIHI_TANKA_CD));
		// 世代登録年月日時分秒
		ku0131Msg.set(KU0131ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.GENE_ADD_DTM));
		
		CAANMsg retKu0131Msg = new JKUejbKU0131SecProc().findByPrimaryKey(ku0131Msg, true);
		
		if (null == retKu0131Msg)
		{
			// 存在チェックエラー
			setRelationError(inCBSMsg, EKU0131C010CBSMsg.KOJIHI_KOJI_BUNRUI_CD_ERR, RELATION_ERR_CD_SONZAI);
			return null;
		}
		
		// 排他制御の実行
		ku0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
		
		
		// 工事費工事分類コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, inCBSMsg.getString(EKU0131C010CBSMsg.KOJIHI_KOJI_BUNRUI_CD));
		// 工事費項目コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD, inCBSMsg.getString(EKU0131C010CBSMsg.KOJIHI_KMK_CD));
		// 工事費単価コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD, inCBSMsg.getString(EKU0131C010CBSMsg.KOJIHI_TANKA_CD));
		// 更新前更新年月日時分秒
		ku0131Msg.set(KU0131ETMsg.UPD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.UPD_DTM_BF));
		
		if(false == JPCModelCommon.succeededExclusiveLockForGene(ku0131Msg, inContext, JKUStrConst.SCHEMA_KU0131))
		{
			// 排他エラー
			setRelationError(inCBSMsg, EKU0131C010CBSMsg.KOJIHI_KOJI_BUNRUI_CD_ERR, RELATION_ERR_CD_HAITA);
			return null;
		}
		
		return retKu0131Msg;
	}
	
	/**
	 * 削除対象工事作業項目取得処理
	 * @param inKu0131Msg	更新対象工事作業項目情報
	 * @return	削除対象工事作業項目情報リスト
	 * @throws CAANException
	 */
	private CAANMsg[] getKU0131MsgArray(CAANMsg inKu0131Msg) throws CAANException
	{
		// 工事作業項目の検索を実行する		
		CAANMsg ku0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
		
		// 工事費工事分類コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, inKu0131Msg.getString(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD));
		// 工事費項目コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD, inKu0131Msg.getString(KU0131ETMsg.KOJIHI_KMK_CD));
		// 工事費単価コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD, inKu0131Msg.getString(KU0131ETMsg.KOJIHI_TANKA_CD));
		// 予約適用年月日
		ku0131Msg.set(KU0131ETMsg.RSV_APLY_YMD, JKUStrConst.MAX_YMD);
		// 無効フラグ
		ku0131Msg.set(KU0131ETMsg.MK_FLG, JKUStrConst.MK_FLG_YUKO);
		
		return new JKUejbKU0131SecProc().findByCondition(ku0131Msg);
		
	}
	
	/**
	 * 工事作業項目論理削除と登録処理
	 * @param ku0131Msg		更新対象工事作業項目情報
	 * @param inCBSMsg		CBSメッセージ
	 * @return	実行結果
	 * @throws CAANException
	 */
	private boolean deleteAndInsertKU0131(CAANMsg ku0131Msg, CAANMsg inCBSMsg) throws CAANException
	{
		JKUejbKU0131SecProc ku0131SecProc = new JKUejbKU0131SecProc();
		
		// 削除対象工事作業項目リストの取得
		CAANMsg[] ku0131MsgArray = getKU0131MsgArray(ku0131Msg);
		
		try
		{
			if(null != ku0131MsgArray && ku0131MsgArray.length != 0)
			{
				CAANMsg delKu0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
				
				// 工事費工事分類コード
				delKu0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, ku0131MsgArray[0].getString(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD));
				// 工事費項目コード
				delKu0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD,  ku0131MsgArray[0].getString(KU0131ETMsg.KOJIHI_KMK_CD));
				// 工事費単価コード
				delKu0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD,  ku0131MsgArray[0].getString(KU0131ETMsg.KOJIHI_TANKA_CD));
				// 世代登録年月日時分秒
				delKu0131Msg.set(KU0131ETMsg.GENE_ADD_DTM,  ku0131MsgArray[0].getString(KU0131ETMsg.GENE_ADD_DTM));
				// 更新年月日時分秒(共通部:運用日時)
				delKu0131Msg.set(KU0131ETMsg.UPD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
				// 更新オペレータアカウント(共通部:オペレータＩＤ)
				delKu0131Msg.set(KU0131ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATORID));
				// 削除年月日時分秒(共通部:運用日時)
				delKu0131Msg.set(KU0131ETMsg.DEL_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
				// 削除オペレータアカウント(共通部:オペレータＩＤ)
				delKu0131Msg.set(KU0131ETMsg.DEL_OPEACNT, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATORID));
				// 無効フラグ(1:無効)
				delKu0131Msg.set(KU0131ETMsg.MK_FLG, JKUStrConst.MK_FLG_MUKO);
				
				// 更新実行
				ku0131SecProc.update(delKu0131Msg);
			}
			
			// 項目設定
			// 世代登録年月日時分秒
			ku0131Msg.set(KU0131ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
			// 一時支払料金番号
			ku0131Msg.set(KU0131ETMsg.TMP_PAY_PRC_NO, inCBSMsg.getString(EKU0131C010CBSMsg.TMP_PAY_PRC_NO));
			// 予約適用年月日
			ku0131Msg.set(KU0131ETMsg.RSV_APLY_YMD, inCBSMsg.getString(EKU0131C010CBSMsg.RSV_APLY_YMD));			
			// 登録年月日時分秒(共通部:運用日時)
			ku0131Msg.set(KU0131ETMsg.ADD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
			// 登録オペレータアカウント(共通部:オペレータＩＤ)
			ku0131Msg.set(KU0131ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATORID));
			// 更新年月日時分秒(共通部:運用日時)
			ku0131Msg.set(KU0131ETMsg.UPD_DTM, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATEDATETIME));
			// 更新オペレータアカウント(共通部:オペレータＩＤ)
			ku0131Msg.set(KU0131ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0131C010CBSMsg.OPERATORID));
			
			// 登録実行
			ku0131SecProc.create(ku0131Msg);
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0131C010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		catch (CAANCreateException cce)
		{
			inCBSMsg.set(EKU0131C010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cce;
		}
		
		return true;
	}
	
	
	/**
	 * リレーションエラーを設定します
	 * @param inCBSMsg		CBSメッセージ
	 * @param errContents	エラーを設定する項目
	 * @param errCd			設定するエラーコード
	 */
	private void setRelationError(CAANMsg inCBSMsg, String errContents, String errCd)
	{
		// エラーを設定する
		inCBSMsg.set(errContents, errCd);
		// ステータスを設定する
		inCBSMsg.set(EKU0131C010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
	}
}
