/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKU0131E010TPMA
*	ソースファイル名：JEKU0131E010TPMA.java
*	作成者			：富士通
*	日付			：2011年01月16日
*＜機能概要＞
*	工事作業項目の論理削除を行うサービスインターフェイス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	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 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.KU0131ETMsg;
import eo.ejb.cbs.cbsmsg.EKU0131E010CBSMsg;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JKUejbKU0131SecProc;

/**
 * <p>
 * 工事作業項目削除の独自処理を呼び出す部品です。
 * </p>
 * @author 富士通
 */
public class JEKU0131E010TPMA implements TemplateMainHandler
{
	
	/**
	 * 関連エラーコード
	 */
	/** 工事作業項目存在エラー */
	private static final String RELATION_ERR_CD_SONZAI = "EA";
	/** 工事作業項目削除済エラー */
	private static final String RELATION_ERR_CD_DELETE = "EB";
	/** 工事作業項目排他エラー */
	private static final String RELATION_ERR_CD_HAITA = "EC";
	
	/**
	 * コンストラクタです。
	 */
	public JEKU0131E010TPMA()
	{
		super();
	}
	
	/**
	 * 主処理
	 * @param inCBSMsg
	 * @param inContext
	 * @throws CAANException 
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// ---削除対象工事作業項目リストの取得
		
		List<CAANMsg> ku0131MsgList = getKU0131MsgList(inCBSMsg, inContext);
		
		if (null == ku0131MsgList)
		{
			return;
		}
		
		// ---機能コードチェック
		
		if(false == JPCModelConstant.FUNC_CD_1.equals(inCBSMsg.getString(EKU0131E010CBSMsg.FUNC_CODE)))
		{
			return;
		}
		
		// ---論理削除の実行
		
		if (false == deleteKU0131(ku0131MsgList, inCBSMsg))
		{
			return;
		}
		
		// ---出力項目の設定
		
		// 更新年月日時分秒
		inCBSMsg.set(EKU0131E010CBSMsg.UPD_DTM, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATEDATETIME));
		// 更新オペレータアカウント
		inCBSMsg.set(EKU0131E010CBSMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATORID));
		// 削除年月日時分秒
		inCBSMsg.set(EKU0131E010CBSMsg.DEL_DTM, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATEDATETIME));
		// 削除オペレータアカウント
		inCBSMsg.set(EKU0131E010CBSMsg.DEL_OPEACNT, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATORID));
		// 無効フラグ
		inCBSMsg.set(EKU0131E010CBSMsg.MK_FLG, JKUStrConst.MK_FLG_MUKO);
	}
	
	/**
	 * 削除対象工事作業項目取得処理
	 * @param inCBSMsg	CBSメッセージ
	 * @param inContext	ディスパッチコンテキスト
	 * @return	削除対象工事作業項目情報リスト
	 * @throws CAANException
	 */
	private List<CAANMsg> getKU0131MsgList(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		List<CAANMsg> retList = null;
		
		// ---工事作業項目の検索を実行する
		
		CAANMsg ku0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
		
		// 工事費工事分類コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, inCBSMsg.getString(EKU0131E010CBSMsg.KOJIHI_KOJI_BUNRUI_CD));
		// 工事費項目コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD, inCBSMsg.getString(EKU0131E010CBSMsg.KOJIHI_KMK_CD));
		// 工事費単価コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD, inCBSMsg.getString(EKU0131E010CBSMsg.KOJIHI_TANKA_CD));
		// 予約適用年月日
		ku0131Msg.set(KU0131ETMsg.RSV_APLY_YMD, inCBSMsg.getString(EKU0131E010CBSMsg.RSV_APLY_YMD));
		
		CAANMsg[] ku0131MsgArray = new JKUejbKU0131SecProc().findByCondition(ku0131Msg);
		
		if (null == ku0131MsgArray || ku0131MsgArray.length == 0)
		{
			// 存在チェックエラー
			setRelationError(inCBSMsg, EKU0131E010CBSMsg.KOJIHI_KOJI_BUNRUI_CD_ERR, RELATION_ERR_CD_SONZAI);
			return null;
		}
		
		// ---削除対象工事作業項目をリスト化する
		
		retList = new ArrayList<CAANMsg>();
		
		for (int i = 0; i < ku0131MsgArray.length; ++i)
		{
			// 無効フラグが0の場合
			if (JKUStrConst.MK_FLG_YUKO.equals(ku0131MsgArray[i].getString(KU0131ETMsg.MK_FLG)))
			{
				// 削除対象に追加する
				retList.add(ku0131MsgArray[i]);
			}
		}
		
		if (retList.size() == 0)
		{
			// 削除済みエラー
			setRelationError(inCBSMsg, EKU0131E010CBSMsg.KOJIHI_KOJI_BUNRUI_CD_ERR, RELATION_ERR_CD_DELETE);
			return null;
		}
		
		// 排他制御の実行
		ku0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
		// 工事費工事分類コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, inCBSMsg.getString(EKU0131E010CBSMsg.KOJIHI_KOJI_BUNRUI_CD));
		// 工事費項目コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD, inCBSMsg.getString(EKU0131E010CBSMsg.KOJIHI_KMK_CD));
		// 工事費単価コード
		ku0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD, inCBSMsg.getString(EKU0131E010CBSMsg.KOJIHI_TANKA_CD));
		// 更新前更新年月日時分秒
		ku0131Msg.set(KU0131ETMsg.UPD_DTM, inCBSMsg.getString(EKU0131E010CBSMsg.UPD_DTM_BF));
		
		if(false == JPCModelCommon.succeededExclusiveLockForGene(ku0131Msg, inContext, JKUStrConst.SCHEMA_KU0131))
		{
			// 排他エラー
			setRelationError(inCBSMsg, EKU0131E010CBSMsg.KOJIHI_KOJI_BUNRUI_CD_ERR, RELATION_ERR_CD_HAITA);
			return null;
		}
		
		return retList;
	}
	
	/**
	 * 工事作業項目論理削除処理
	 * @param ku0131MsgList	削除対象工事作業項目情報リスト
	 * @param inCBSMsg	CBSメッセージ
	 * @return	実行結果
	 * @throws CAANFinderException
	 */
	private boolean deleteKU0131(List<CAANMsg> ku0131MsgList, CAANMsg inCBSMsg) throws CAANFinderException
	{
		JKUejbKU0131SecProc ku0131SecProc = new JKUejbKU0131SecProc();
		CAANMsg ku0131Msg = null;
		
		try
		{
			// 削除対象工事作業項目情報リスト全てで実行する
			for (int i = 0; i < ku0131MsgList.size(); ++i)
			{
				ku0131Msg = new CAANMsg(KU0131ETMsg.class.getName());
				
				// ---項目設定
				// 工事費工事分類コード
				ku0131Msg.set(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD, ku0131MsgList.get(i).getString(KU0131ETMsg.KOJIHI_KOJI_BUNRUI_CD));
				// 工事費項目コード
				ku0131Msg.set(KU0131ETMsg.KOJIHI_KMK_CD, ku0131MsgList.get(i).getString(KU0131ETMsg.KOJIHI_KMK_CD));
				// 工事費単価コード
				ku0131Msg.set(KU0131ETMsg.KOJIHI_TANKA_CD, ku0131MsgList.get(i).getString(KU0131ETMsg.KOJIHI_TANKA_CD));
				// 世代登録年月日時分秒(削除対象工事作業項目情報リスト.世代登録年月日時分秒)
				ku0131Msg.set(KU0131ETMsg.GENE_ADD_DTM, ku0131MsgList.get(i).getString(KU0131ETMsg.GENE_ADD_DTM));
				// 更新年月日時分秒(共通部:運用日時)
				ku0131Msg.set(KU0131ETMsg.UPD_DTM, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATEDATETIME));
				// 更新オペレータアカウント(共通部:オペレータＩＤ)
				ku0131Msg.set(KU0131ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATORID));
				// 削除年月日時分秒(共通部:運用日時)
				ku0131Msg.set(KU0131ETMsg.DEL_DTM, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATEDATETIME));
				// 削除オペレータアカウント(共通部:オペレータＩＤ)
				ku0131Msg.set(KU0131ETMsg.DEL_OPEACNT, inCBSMsg.getString(EKU0131E010CBSMsg.OPERATORID));
				// 無効フラグ(1:無効)
				ku0131Msg.set(KU0131ETMsg.MK_FLG, JKUStrConst.MK_FLG_MUKO);
				
				// ---更新実行
				
				ku0131SecProc.update(ku0131Msg);
			}
		}
		catch (CAANFinderException cfe)
		{
			inCBSMsg.set(EKU0131E010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
		
		return true;
	}
	
	
	/**
	 * リレーションエラーを設定します
	 * @param inCBSMsg		CBSメッセージ
	 * @param errContents	エラーを設定する項目
	 * @param errCd			設定するエラーコード
	 */
	private void setRelationError(CAANMsg inCBSMsg, String errContents, String errCd)
	{
		// エラーを設定する
		inCBSMsg.set(errContents, errCd);
		// ステータスを設定する
		inCBSMsg.set(EKU0131E010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
	}
}
