/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム構築
 *	モジュール名	：JCRejbCR0101SecProc
 *	ソースファイル名：JCRejbCR0101SecProc.java
 *	作成者			：富士通
 *	日付			：2011年06月04日
 *＜機能概要＞
 *	MYBOX副次処理部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *
 ********************************************************************************/

package eo.ejb.common.db;

import java.util.Arrays;

import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateSQLEntity;

import eo.common.constant.JCRStrConst;
import eo.common.util.JCRSortComparator;
import eo.common.util.JCRUtilCommon;
import eo.ejb.cbm.entity.CR0381ETMsg;
import eo.ejb.cbm.entity.CR0381LE;
import eo.ejb.cbm.entity.KK0241ETMsg;
import eo.ejb.cbm.entity.KK0241LE;
import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK0251LE;
import eo.ejb.cbm.entity.ZM0341ETMsg;
import eo.ejb.cbm.entity.ZM0341LE;
import eo.ejb.common.JCRModelCommon;
import eo.ejb.common.edit.JCRejbOracleSeqParts;

/**
 * 集約局別問合せモニタワーク登録副次処理部品<p>
 * <BR>
 * @author 富士通
 */
public class JCRejbCR0381SecProc extends TemplateSQLEntity
{
	/**
	 * コンストラクタです。
	 */
	public JCRejbCR0381SecProc()
	{
		super();
	}

	/**
	 * 集約局別問合せモニタワーク登録です。<br>
	 * <br>
	 * NGワードが存在した場合、ユーザー別問合せモニタワークにデータを新規登録する。
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inETMsg ETメッセージ(集約局別問合せモニタワーク)
	 * @param inDatasbt データ種別コード
	 * @param inCloseFailCd クローズ不可コード
	 * @param inSvcKeiNo サービス契約番号
	 * @throws CAANException 
	 */
	public void addSykkToiawaseMonitorWork(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inETMsg
			, String inDatasbt, String inSvcKeiNo) throws CAANException
	{

		// (1) サービス契約回線内訳番号を取得する。
		CAANMsg[] retKaisenTgSvkeiMsg = getKaisenTgSvkei(inSvcKeiNo);

		// (ｱ) サービス契約回線内訳番号の一覧件数が0件の場合、以降の全処理を終了する。
		if (retKaisenTgSvkeiMsg == null || retKaisenTgSvkeiMsg.length == 0)
		{
			return;
		}

		// (ｲ) サービス契約回線内訳番号の一覧件数がn件の場合、n件分について以降の処理を繰り返す。
		for (int i = 0; i < retKaisenTgSvkeiMsg.length; i++)
		{

			// (2) 集約局コードを取得する。
			CAANMsg[] retSvkeiKaisenUwMsg = getSvkeiKaisenUwMsg(retKaisenTgSvkeiMsg[i].getString(KK0241ETMsg.SVC_KEI_KAISEN_UCWK_NO));

			// (ｱ) サービス契約回線内訳の一覧件数が0件の場合、以降の全処理を終了する。
			if (retSvkeiKaisenUwMsg == null || retSvkeiKaisenUwMsg.length == 0)
			{
				continue;
			}

			// (b) 集約局コードの取得
			String shyakkCd = retSvkeiKaisenUwMsg[0].getString(KK0251ETMsg.SHYAKK_CD);
			
			// (3) 集約局マスタの存在チェックを行う。
			CAANMsg[] retShyakkMsg = getShyakk(shyakkCd);

			// (ｱ) 集約局マスタの一覧件数が0件の場合、次のサービス契約回線内訳番号で(2)へ。
			if (retShyakkMsg == null || retShyakkMsg.length == 0)
			{
				continue;
			}
			
			// 集約局名の取得
			String shyakkNm = retShyakkMsg[0].getString(ZM0341ETMsg.SHYAKK_NM);

			// (4) 集約局別問合せモニタワークの存在チェックを行う。
			if (isExist(inCBSMsg, inContext, inETMsg, inDatasbt, shyakkCd))
			{
				continue;
			}

			// (5) 集約局別問合せモニタワークに新規登録する。
			addEcr0381(inCBSMsg, inContext, inETMsg, inDatasbt, shyakkCd, shyakkNm);

		}

	}

	/**
	 * 回線対象サービス契約を取得する。<br>
	 * 
	 * @param inSvcKeiNo サービス契約番号
	 * @return 回線対象サービス契約検索結果
	 * @throws CAANException CAANException
	 */
	private CAANMsg[] getKaisenTgSvkei(String inSvcKeiNo) throws CAANException
	{

		// 回線対象サービス契約のETメッセージ
		CAANMsg kk0241ETMsg = new CAANMsg(KK0241ETMsg.class.getName());
		
		// (a) 回線対象サービス契約のETメッセージに以下の内容を設定し一覧照会を行う。(0〜n件)
		// サービス契約番号
		kk0241ETMsg.set(KK0241ETMsg.SVC_KEI_NO, inSvcKeiNo);

		// 回線対象サービス契約を検索する
		return new KK0241LE().findByCondition(kk0241ETMsg);

	}

	/**
	 * サービス契約回線内訳を取得する。<br>
	 * 
	 * @param inSvcKeiKaisenUcwkNo サービス契約回線内訳番号
	 * @return サービス契約回線内訳検索結果
	 * @throws CAANException CAANException
	 */
	private CAANMsg[] getSvkeiKaisenUwMsg(String inSvcKeiKaisenUcwkNo)
			throws CAANException
	{

		// (a) サービス契約回線内訳のETメッセージに以下の内容を設定し一覧照会を行う。(1件)
		// サービス契約回線内訳のETメッセージ
		CAANMsg kk0251ETMsg = new CAANMsg(KK0251ETMsg.class.getName());
		
		// サービス契約回線内訳番号
		kk0251ETMsg.set(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO, inSvcKeiKaisenUcwkNo);

		// サービス契約回線内訳ステータス
		kk0251ETMsg.set(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_STAT, "100");
		
		CAANMsg[] retSvkeiKaisenUw = new KK0251LE().findByCondition(kk0251ETMsg);

		// 世代登録年月日時分秒で降順ソート
		Arrays.sort(retSvkeiKaisenUw, new JCRSortComparator(
				KK0251ETMsg.GENE_ADD_DTM, JCRSortComparator.SORT_TYPE_DESC));

		// サービス契約回線内訳を検索する
		return retSvkeiKaisenUw;
		
	}

	/**
	 * 集約局マスタを取得する。<br>
	 * 
	 * @param shyakkCd 集約局コード
	 * @return 集約局マスタ
	 * @throws CAANException CAANException
	 */
	private CAANMsg[] getShyakk(String shyakkCd) throws CAANException
	{

		// (3) 集約局マスタの存在チェックを行う。
		// (a) 集約局マスタのETメッセージに以下の内容を設定し一覧照会を行う。(1件)
		// 集約局マスタのETメッセージ
		CAANMsg zm0341ETMsg = new CAANMsg(ZM0341ETMsg.class.getName());
		// 集約局コード
		zm0341ETMsg.set(ZM0341ETMsg.SHYAKK_CD, shyakkCd);

		// 集約局マスタを検索する
		return new ZM0341LE().findByCondition(zm0341ETMsg);
	}

	/**
	 * 集約局別問合せモニタワークの存在チェック.<br>
	 * 
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inETMsg ETメッセージ(集約局別問合せモニタワーク)
	 * @param inDatasbt データ種別コード
	 * @param inShyakkCd 集約局コード
	 * @return 存在フラグ（true：処理済みデータ存在、false：処理済みデータ未存在）
	 * @throws CAANException CAANException
	 */
	private boolean isExist(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			CAANMsg inETMsg, String inDatasbt, String inShyakkCd) throws CAANException
	{

		// (4) 集約局別問合せモニタワークの存在チェックを行う。
		// (a) 集約局別問合せモニタワークのETメッセージに以下の内容を設定し一覧照会を行う。(発生年月日時分秒の0〜n件)
		// 集約局別問合せモニタワークのETメッセージ
		CAANMsg cr0381ETMsg = new CAANMsg(CR0381ETMsg.class.getName());
		// 集約局コード
		cr0381ETMsg.set(CR0381ETMsg.SHYAKK_CD, inShyakkCd);
		// 対応記録番号
		cr0381ETMsg.set(CR0381ETMsg.TAIO_KIROK_NO, inETMsg.getString(CR0381ETMsg.TAIO_KIROK_NO));
		// データ種別コード
		cr0381ETMsg.set(CR0381ETMsg.DATA_SBT_CD, inDatasbt);
		
		// 集約局別問合せモニタワークを検索する
		CAANMsg[] retSykkToiawsmntw = new CR0381LE().findByCondition(cr0381ETMsg);

		// 対象データが0件の場合、処理対象とする
		if (retSykkToiawsmntw == null || retSykkToiawsmntw.length == 0)
		{
			return false;
		}

		// 発生年月日で降順ソート
		Arrays.sort(retSykkToiawsmntw, new JCRSortComparator(
				CR0381ETMsg.HASSEI_DTM, JCRSortComparator.SORT_TYPE_DESC));

		// 発生年月日を取得する。
		String hasseiYmd = JCRUtilCommon.formatDate(retSykkToiawsmntw[0].getString(
				CR0381ETMsg.HASSEI_DTM), JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMD);

		// ・ 集約局別問合せモニタワークの「発生年月日時分秒」の発生年月日(yyyymmdd)とシステム日時(yyyymmdd)が一致する場合、
		//    同日発生データのため、(5)の集約局別問合せモニタワーク登録処理を行わず処理を終了する。
		if (JCRModelCommon.getSysDate().compareTo(hasseiYmd) == 0)
		{
			return true;
		}

		return false;
	}

	/**
	 * 集約局別問合せモニタワーク登録処理.<br>
	 * 集約局別問合せモニタワークを登録します。
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param inETMsg ETメッセージ(ユーザー別問合せモニタワーク)
	 * @param inDataSbtCd データ種別コード
	 * @param inShyakkCd 集約局コード
	 * @param inShyakkNm 集約局名
	 * @throws CAANCreateException 
	 */
	private void addEcr0381(CAANMsg inCBSMsg, AgentDispatchContext inContext,
			CAANMsg inETMsg, String inDataSbtCd, String inShyakkCd, String inShyakkNm) throws CAANCreateException
	{
		// システム日時
		String sysDateTimeStamp = JCRModelCommon.getSysDateTimeStamp();
		
		CAANMsg addETMsg = new CAANMsg(CR0381ETMsg.class.getName());
		// 集約局別問合せモニタワーク番号
		addETMsg.set(CR0381ETMsg.SYKK_TOIAWSMNTW_NO, JCRejbOracleSeqParts.getSeqNo(inCBSMsg, inContext, "SEQ_SYKK_TOIAWSMNTW_NO"
				, "10", "1"));
		// 業務個別設定組織コード
		addETMsg.set(CR0381ETMsg.WKKBT_ORG_CD, inETMsg.getString(CR0381ETMsg.WKKBT_ORG_CD));
		// 集約局コード
		addETMsg.set(CR0381ETMsg.SHYAKK_CD, inShyakkCd);
		// 集約局名
		addETMsg.set(CR0381ETMsg.SHYAKK_NM, inShyakkNm);
		// 対応記録番号
		addETMsg.set(CR0381ETMsg.TAIO_KIROK_NO, inETMsg.getString(CR0381ETMsg.TAIO_KIROK_NO));
		// 発生年月日時分秒
		addETMsg.set(CR0381ETMsg.HASSEI_DTM, JCRModelCommon.getSysDateTime());
		// データ種別コード
		addETMsg.set(CR0381ETMsg.DATA_SBT_CD, inDataSbtCd);
		// データ処理コード
		addETMsg.set(CR0381ETMsg.DATA_TRN_CD, JCRStrConst.DATA_TRN_CD_MISHORI);
		// 登録年月日時分秒
		addETMsg.set(CR0381ETMsg.ADD_DTM, sysDateTimeStamp);
		// 登録オペレータアカウント
		addETMsg.set(CR0381ETMsg.ADD_OPEACNT, inETMsg.getString(CR0381ETMsg.ADD_OPEACNT));
		// 更新年月日時分秒
		addETMsg.set(CR0381ETMsg.UPD_DTM, sysDateTimeStamp);
		// 更新オペレータアカウント
		addETMsg.set(CR0381ETMsg.UPD_OPEACNT, inETMsg.getString(CR0381ETMsg.UPD_OPEACNT));
		// 無効フラグ
		addETMsg.set(CR0381ETMsg.MK_FLG, JCRStrConst.CD_DIV_MK_FLG_YUKO);

		create(addETMsg);

	}

    /**
     * このエンティティのスキーマの内容を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマのContents
     */
	@Override
	protected Object[][] getSchemaContents()
	{
		return CR0381ETMsg.getSchemaContents();
	}

    /**
     * このエンティティのスキーマの名を取得します。<br>
     * 業務レベルで実装します。
     * @return スキーマ名
     */
	@Override
	protected String getSchemaName()
	{
		return CR0381ETMsg.class.getName();
	}

    /**
     * このエンティティの参照するテーブル名を取得します。<br>
     * 業務レベルで実装します。
     * @return テーブル名
     */
	@Override
	protected String getTableName()
	{
		return CR0381ETMsg.getTableName();
	}
}
