/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK1861D010TPMA
*	ソースファイル名：JEKK1861D010TPMA.java
*	作成者			：富士通
*	日付			：2016年10月11日
*＜機能概要＞
*	再生品機器型式登録の独自処理を呼び出す部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ27.00.00	2016/10/11	FJ)田口		【ANK-2870-00-00】【随時機能化案件】機器型番追加の機能化
*	ｖ61.00.00	2023/04/05	FJ)中川		【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応
*
********************************************************************************/
package eo.ejb.cbs.mainproc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
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.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
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.common.constant.JPCModelConstant;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.DK0291ETMsg;
import eo.ejb.cbm.entity.DK0291LE;
import eo.ejb.cbm.entity.KK1621ETMsg;
import eo.ejb.cbm.entity.KK1621LE;
import eo.ejb.cbm.entity.KK1861ETMsg;
import eo.ejb.cbm.entity.KK1861LE;
import eo.ejb.cbm.entity.KK2041ETMsg;
import eo.ejb.cbm.entity.KK2041LE;
import eo.ejb.cbm.entity.KK2991ETMsg;
import eo.ejb.cbm.entity.KK2991LE;
import eo.ejb.cbm.entity.ZM0411ETMsg;
import eo.ejb.cbm.entity.ZM0411LE;
import eo.ejb.cbm.entity.ZM0491ETMsg;
import eo.ejb.cbm.entity.ZM0491LE;
import eo.ejb.cbs.cbsmsg.EKK1861D010CBSMsg;
import eo.ejb.common.db.JDKejbDK0291SecProc;
import eo.ejb.common.db.JKKejbKK1621SecProc;
import eo.ejb.common.db.JKKejbKK1861SecProc;
import eo.ejb.common.db.JKKejbKK2041SecProc;
import eo.ejb.common.db.JKKejbKK2991SecProc;
import eo.ejb.common.db.JZMejbZM0491SecProc;

/**
 * <p>
 * 再生品宅内機器登録の独自処理を呼び出す部品です。
 * </p>
 * @author 富士通
 */
public class JEKK1861D010TPMA implements TemplateMainHandler
{

	/**
	 * 宅内機器種別コードの配列
	 */
	private static final String[] TAKNKIKI_SBT_CD_ARY = new String[]
	{
		JDKStrConst.VA,
		JDKStrConst.MODEM,
		JDKStrConst.STB,
		JDKStrConst.ONU,
		JDKStrConst.VONU,
// ANK-4315-00-00 MOD START
//		JDKStrConst.TAKINORT
		JDKStrConst.TAKINORT,
		JDKStrConst.HGW
// ANK-4315-00-00 MOD END
	};
	
	/**
	 * スキーマ更新対象判定配列
	 * trueを更新・登録とする。<br />
	 * 列：0:サービス別宅内機器型式候補<br />
	 *     1:宅内機器型式コード確定条件<br />
	 *     2:機器型式対象料金コース<br />
	 *     3:機器利用期間別一時金候補<br />
	 *     4:宅内機器型式関連情報<br />
	 *     5:機器提供料金プラン別機器型式候補<br />
	 * 行：0:eo電話用VA<br />
	 *     1:モデム<br />
	 *     2:STB<br />
	 *     3:ONU<br />
	 *     4:V-ONU<br />
	 *     5:多機能ルーター<br />
	 *     6:HGW
	 */
	private static final Boolean[][] SCHMA_UPD_TG_JDG_ARY = new Boolean[][]
	{
		{true, true, false, true, false, true},
		{true, false, true, true, false, false},
		{true, false, true, true, false, false},
		{true, true, false, true, false, false},
		{true, false, false, true, false, false},
// ANK-4315-00-00 MOD START
//		{true, false, true, true, true, false}
		{true, false, true, true, true, false},
		{true, true, true, true, true, false}
// ANK-4315-00-00 MOD END
	};
	
	/**
	 * コンストラクタです。
	 */
	public JEKK1861D010TPMA()
	{
		super();
	}
	
	/**
	 * 主処理
	 * @param inCBSMsg
	 * @param inContext
	 * @throws CAANException
	 */
	public void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器種別コードを取得する。
		String taknkikiSbtCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_SBT_CD);
		
		// INPUTの再生品宅内機器型式コードを取得する。
		String saisehnTaknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD);
		
		// スキーマ更新対象判定配列で使用する添え字を保持する変数
		int idx = -1;
		
		// 再生品宅内機器型式存在チェック
		// 宅内機器型式のETメッセージを作成
		CAANMsg zm0411Msg = new CAANMsg(ZM0411ETMsg.class.getName());
		
		// 宅内機器種別コードにINPUTの宅内機器種別コードを設定
		zm0411Msg.set(ZM0411ETMsg.TAKNKIKI_SBT_CD, taknkikiSbtCd);
		
		// 宅内機器型式コードにINPUTの再生品宅内機器型式コードを設定
		zm0411Msg.set(ZM0411ETMsg.TAKNKIKI_MODEL_CD, saisehnTaknkikiModelCd); 
		
		// 無効フラグに有効を設定
		zm0411Msg.set(ZM0411ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// 宅内機器型式 ロジカルエンティティクラス
		ZM0411LE leZM0411 = new ZM0411LE();
		
		// 宅内機器型式スキーマから条件と一致するレコードを取得
		CAANMsg[] arrZM0411Msg = leZM0411.findByCondition(zm0411Msg);
		
		// レコードが取得できなかった場合は、エラーを設定し、処理を終了する。
		if(isNull(arrZM0411Msg))
		{
			// 再生品宅内機器型式存在エラーを登録
			inCBSMsg.set(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD_ERR, "EA");
			// ステータス
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return;
		}
		
		// 宅内機器種別コード配列から宅内機器種別コードに一致する添え字を取得する。
		idx = Arrays.asList(TAKNKIKI_SBT_CD_ARY).indexOf(taknkikiSbtCd);
		
		// サービス別宅内機器型式候補に登録するか判断する。
		if(SCHMA_UPD_TG_JDG_ARY[idx][0])
		{
			// サービス別宅内機器型式候補登録を行う。
			boolean seijoFlg = addSvcbtTkmdlKho(inCBSMsg, inContext);
			
			// 正常フラグがfalse(異常)の場合以降の登録・更新処理を行わない。
			if(!seijoFlg)
			{
				return;
			}
		}
		
		// 機能コードがチェックモードの場合、以降の登録・更新処理を行わない。
		if(JPCModelConstant.FUNC_CD_2.equals(inCBSMsg.getString(EKK1861D010CBSMsg.FUNC_CODE)))
		{
			return;
		}
		
		// 宅内機器型式コード確定条件に登録するか判断する。
		if(SCHMA_UPD_TG_JDG_ARY[idx][1])
		{
			addTkkikiMdlFix(inCBSMsg, inContext);
		}
		
		// 機器型式対象料金コースに登録するか判断する。
		if(SCHMA_UPD_TG_JDG_ARY[idx][2])
		{
			addKkmdlTgPcrs(inCBSMsg, inContext);
		}
		
		// 機器利用期間別一時金候補に登録するか判断する。
		if(SCHMA_UPD_TG_JDG_ARY[idx][3])
		{
			addKkupblcjknKho(inCBSMsg, inContext);
		}
		
		// 宅内機器型式関連情報に登録するか判断する。
		if(SCHMA_UPD_TG_JDG_ARY[idx][4])
		{
			addTkmdlKnrnInfo(inCBSMsg, inContext);
		}
		
		// 機器提供料金プラン別機器型式候補に登録するか判断する。
		if(SCHMA_UPD_TG_JDG_ARY[idx][5])
		{
			updKppbtKkmdiKho(inCBSMsg, inContext);
		}
	}

	/**
	 * サービス別宅内機器型式候補登録を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @return true:正常, false:異常
	 * @throws CAANException
	 */
	private boolean addSvcbtTkmdlKho(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器型式コードを取得する。
		String taknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD);
		
		// 再生品宅内機器型式存在チェック
		// サービス別宅内機器型式候補のETメッセージを作成
		CAANMsg msgKK1861 = new CAANMsg(KK1861ETMsg.class.getName());
		
		// 宅内機器型式コードにINPUTの宅内機器型式コードを設定
		msgKK1861.set(KK1861ETMsg.TAKNKIKI_MODEL_CD, taknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgKK1861.set(KK1861ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// サービス別宅内機器型式候補 ロジカルエンティティクラス
		KK1861LE leKK1861 = new KK1861LE();
		
		// サービス別宅内機器型式候補から条件と一致するレコードを取得
		CAANMsg[] addArrMsgKK1861 = leKK1861.findByCondition(msgKK1861);
		
		// レコードが取得できなかった場合は、エラーを設定し、処理を終了する。
		if(isNull(addArrMsgKK1861))
		{
			// 宅内機器型式コードエラーに"EA"(存在チェック)を設定
			inCBSMsg.set(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD_ERR, "EA");
			// ステータスを設定
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}
		
		// INPUTの再生品宅内機器型式コードを取得する。
		String saisehnTaknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD);
		
		// サービス別宅内機器型式候補のETメッセージをクリア
		msgKK1861.clear();
		
		// 宅内機器型式コードにINPUTの再生品宅内機器型式コードを設定
		msgKK1861.set(KK1861ETMsg.TAKNKIKI_MODEL_CD, saisehnTaknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgKK1861.set(KK1861ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// サービス別宅内機器型式候補から条件と一致するレコードを取得
		CAANMsg[] arrMsgKK1861 = leKK1861.findByCondition(msgKK1861);
		
		// レコードが取得できた場合は、エラーを設定し、処理を終了する。
		if(!isNull(arrMsgKK1861))
		{
			// 再生品宅内機器型式コードエラーに重複エラーを登録
			inCBSMsg.set(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD_ERR, "EB");
			// ステータス
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}
		
		// 機能コードがチェックモードの場合、以降の登録・更新処理を行わない。
		if(JPCModelConstant.FUNC_CD_2.equals(inCBSMsg.getString(EKK1861D010CBSMsg.FUNC_CODE)))
		{
			return true;
		}
		
		// サービス別宅内機器型式候補番号でソートする
		List<CAANMsg> msgKK1861List = Arrays.asList(addArrMsgKK1861);
		Collections.sort(msgKK1861List, new Comparator<CAANMsg>(){
			@Override
			public int compare(CAANMsg arg0, CAANMsg arg1)
			{
				return arg0.getString(KK1861ETMsg.SVCBT_TKMDL_KHO_NO).compareTo(arg1.getString(KK1861ETMsg.SVCBT_TKMDL_KHO_NO));
			}
			
		});
		
		// サービス別宅内機器型式候補番号最大値取得を行う。
		long svcbtTkmdlKhoNo = getMaxSvcbtTkmdlKhoNo(inCBSMsg, inContext);
		
		// 副次処理部品
		JKKejbKK1861SecProc kk1861SecProc = new JKKejbKK1861SecProc();
		
		// 登録処理の戻り値
		CAANMsg resultMsg = null;
		
		try
		{
			// 取得したレコードの分ループする
			for(CAANMsg addMsgKK1861 : msgKK1861List)
			{
				// 取得した値に+1をし、保持する
				svcbtTkmdlKhoNo++;
				
				// サービス別宅内機器型式候補番号
				addMsgKK1861.set(KK1861ETMsg.SVCBT_TKMDL_KHO_NO, JPCUtilCommon.fillZero(String.valueOf(svcbtTkmdlKhoNo), 10, false));
				// 再生品宅内機器型式コード
				addMsgKK1861.set(KK1861ETMsg.TAKNKIKI_MODEL_CD, saisehnTaknkikiModelCd);
				// 登録年月日時分秒
				addMsgKK1861.set(KK1861ETMsg.ADD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 登録オペレータアカウント
				addMsgKK1861.set(KK1861ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				// 更新年月日時分秒
				addMsgKK1861.set(KK1861ETMsg.UPD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 更新オペレータアカウント
				addMsgKK1861.set(KK1861ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				
				// サービス別宅内機器型式候補に登録する。
				resultMsg = kk1861SecProc.create(addMsgKK1861);
				
				// 更新年月日時分秒
				inCBSMsg.set(EKK1861D010CBSMsg.UPD_DTM, resultMsg.getString(KK1861ETMsg.UPD_DTM));
				// 更新オペレータアカウント
				inCBSMsg.set(EKK1861D010CBSMsg.UPD_OPEACNT, resultMsg.getString(KK1861ETMsg.UPD_OPEACNT));
				// 無効フラグ
				inCBSMsg.set(EKK1861D010CBSMsg.MK_FLG, resultMsg.getString(KK1861ETMsg.MK_FLG));
			}
		}
		catch(CAANCreateException cce)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.CREATE_DB_ERR);
			throw cce;
		}
		
		return true;
	}
	
	/**
	 * 宅内機器型式コード確定条件登録を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws CAANException
	 */
	private void addTkkikiMdlFix(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器種別コードを取得する。
		String taknkikiSbtCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_SBT_CD);
		
		// INPUTの宅内機器型式コードを取得する。
		String taknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD);
		
		// 宅内機器型式コード確定条件のETメッセージを作成
		CAANMsg msgDK0291 = new CAANMsg(DK0291ETMsg.class.getName());
		
		// 宅内機器種別コードにINPUTの宅内機器種別コードを設定
		msgDK0291.set(DK0291ETMsg.TAKNKIKI_SBT_CD, taknkikiSbtCd);
		
		// 宅内機器型式コードにINPUTの宅内機器型式コードを設定
		msgDK0291.set(DK0291ETMsg.TAKNKIKI_MODEL_CD, taknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgDK0291.set(DK0291ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// 宅内機器型式コード確定条件 ロジカルエンティティクラス
		DK0291LE leDK0291 = new DK0291LE();
		
		// 宅内機器型式コード確定条件から条件と一致するレコードを取得
		CAANMsg[] arrMsgDK0291 = leDK0291.findByCondition(msgDK0291);

		// レコードが取得できなかった場合は、処理を終了する。
		if(isNull(arrMsgDK0291))
		{
			return;
		}
		
		// 宅内機器型式コード確定条件番号でソートする
		List<CAANMsg> msgDK0291List = Arrays.asList(arrMsgDK0291);
		Collections.sort(msgDK0291List, new Comparator<CAANMsg>(){
			@Override
			public int compare(CAANMsg arg0, CAANMsg arg1)
			{
				return arg0.getString(DK0291ETMsg.TKKIKI_MDL_CD_FIX_NO).compareTo(arg1.getString(DK0291ETMsg.TKKIKI_MDL_CD_FIX_NO));
			}
			
		});
		
		// 宅内機器型式コード確定条件番号最大値取得を行う。
		long tkkikiMdlCdFixNo = getMaxTkkikiMdlCdFixNo(inCBSMsg, inContext);
		
		// 副次処理部品
		JDKejbDK0291SecProc dk0291SecProc = new JDKejbDK0291SecProc();
		
		try
		{
			// 取得したレコードの件数分処理を行う。
			for(CAANMsg addMsgDK0291 : msgDK0291List)
			{
				// CSBメッセージの宅内機器種別コードがeo電話用VAかV-ONUの場合
				if(JDKStrConst.VA.equals(taknkikiSbtCd))
				{
					// メーカーコードに値が設定されている場合、次のレコードを判定する。
					if(!addMsgDK0291.isNull(DK0291ETMsg.MAKER_CD))
					{
						continue;
					}
				}
				// CBSメッセージの宅内機器種別コードがONUの場合
				else if(JDKStrConst.ONU.equals(taknkikiSbtCd))
				{
					// 宅内機器型式コード確定グループコードが"ONU2"以外の場合、次のレコードを判定
					if(!JDKStrConst.ONU2.equals(addMsgDK0291.getString(DK0291ETMsg.TAKNKIKI_MDL_CD_FIX_GRP_CD)))
					{
						continue;
					}
				}
				
				// 宅内機器型式コード確定条件番号の値を+1し、保持する。
				tkkikiMdlCdFixNo++;
				
				// 宅内機器型式コード確定条件番号
				addMsgDK0291.set(DK0291ETMsg.TKKIKI_MDL_CD_FIX_NO, JPCUtilCommon.fillZero(String.valueOf(tkkikiMdlCdFixNo), 3, false));
				// 再生品宅内機器型式コード
				addMsgDK0291.set(DK0291ETMsg.TAKNKIKI_MODEL_CD, inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD));
				// 在庫比率
				addMsgDK0291.set(DK0291ETMsg.ZAIKO_RT, "0");
				// 登録年月日時分秒
				addMsgDK0291.set(DK0291ETMsg.ADD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 登録オペレータアカウント
				addMsgDK0291.set(DK0291ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				// 更新年月日時分秒
				addMsgDK0291.set(DK0291ETMsg.UPD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// // 更新オペレータアカウント
				addMsgDK0291.set(DK0291ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				
				// 宅内機器型式コード確定条件に登録する。
				dk0291SecProc.create(addMsgDK0291);
			}
		}
		catch(CAANCreateException cce)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.CREATE_DB_ERR);
			throw cce;
		}
	}
	
	/**
	 * 機器型式対象料金コース登録を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws CAANException
	 */
	private void addKkmdlTgPcrs(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器型式コードを取得する。
		String taknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD);
		
		// 機器型式対象料金コースのETメッセージを作成
		CAANMsg msgKK1621 = new CAANMsg(KK1621ETMsg.class.getName());
		
		// 宅内機器型式コードにINPUTの宅内機器型式コードを設定
		msgKK1621.set(KK1621ETMsg.TAKNKIKI_MODEL_CD, taknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgKK1621.set(KK1621ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// 機器型式対象料金コース ロジカルエンティティクラス
		KK1621LE leKK1621 = new KK1621LE();
		
		// 機器型式対象料金コースから条件と一致するレコードを取得
		CAANMsg[] arrMsgKK1621 = leKK1621.findByCondition(msgKK1621);
		
		// レコードが取得できなかった場合は、処理を終了する。
		if(isNull(arrMsgKK1621))
		{
			return;
		}
		
		// 副次処理部品
		JKKejbKK1621SecProc kk1621SecProc = new JKKejbKK1621SecProc(); 
		
		try
		{
			// 取得したレコードの分ループする
			for(CAANMsg addMsgKK1621 : arrMsgKK1621)
			{
				// 再生品宅内機器型式コード
				addMsgKK1621.set(KK1621ETMsg.TAKNKIKI_MODEL_CD, inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD));
				// 登録年月日時分秒
				addMsgKK1621.set(KK1621ETMsg.ADD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 登録オペレーターアカウント
				addMsgKK1621.set(KK1621ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				// 更新年月日時分秒
				addMsgKK1621.set(KK1621ETMsg.UPD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 更新オペレーターアカウント
				addMsgKK1621.set(KK1621ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				
				// 機器型式対象料金コースに登録する。
				kk1621SecProc.create(addMsgKK1621);
			}
		}
		catch(CAANCreateException cce)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.CREATE_DB_ERR);
			throw cce;
		}
	}
	
	/**
	 * 機器利用期間別一時金候補登録を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws CAANException
	 */
	private void addKkupblcjknKho(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器型式コードを取得する。
		String taknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD);
		
		// 機器利用期間別一時金候補のETメッセージを作成
		CAANMsg msgKK2991 = new CAANMsg(KK2991ETMsg.class.getName());
		
		// 宅内機器型式コードにINPUTの宅内機器型式コードを設定
		msgKK2991.set(KK2991ETMsg.TAKNKIKI_MODEL_CD, taknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgKK2991.set(KK2991ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// 機器利用期間別一時金候補 ロジカルエンティティクラス
		KK2991LE leKK2991 = new KK2991LE();
		
		// 機器利用期間別一時金候補から条件と一致するレコードを取得
		CAANMsg[] arrMsgKK2991 = leKK2991.findByCondition(msgKK2991);
		
		// レコードが取得できなかった場合は、エラーを設定し、処理を終了する。
		if(isNull(arrMsgKK2991))
		{
			return;
		}
		
		// 機器利用期間別一時金候補番号でソートする
		List<CAANMsg> msgKK2991List = Arrays.asList(arrMsgKK2991);
		Collections.sort(msgKK2991List, new Comparator<CAANMsg>(){
			@Override
			public int compare(CAANMsg arg0, CAANMsg arg1)
			{
				return arg0.getString(KK2991ETMsg.KKUPB_ICJKN_KHO_NO).compareTo(arg1.getString(KK2991ETMsg.KKUPB_ICJKN_KHO_NO));
			}
			
		});
		
		// 機器利用期間別一時金候補番号最大値を取得。
		long kkupbIcjknKhoNo = getMaxKkupblcjknKhoNo(inCBSMsg, inContext);
		
		// 副次処理部品
		JKKejbKK2991SecProc kk2991SecProc = new JKKejbKK2991SecProc(); 
		
		try
		{
			// 取得したレコードの分ループする
			for(CAANMsg addMsgKK2991 : msgKK2991List)
			{
				// 機器利用期間別一時金候補番号に+1をし、保持する。
				kkupbIcjknKhoNo++;
				
				// 機器利用期間別一時期候補番号
				addMsgKK2991.set(KK2991ETMsg.KKUPB_ICJKN_KHO_NO, JPCUtilCommon.fillZero(String.valueOf(kkupbIcjknKhoNo), 10, false));
				// 再生品宅内機器型式コード
				addMsgKK2991.set(KK2991ETMsg.TAKNKIKI_MODEL_CD, inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD));
				// 登録年月日時分秒
				addMsgKK2991.set(KK2991ETMsg.ADD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 登録オペレーターアカウント
				addMsgKK2991.set(KK2991ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				// 更新年月日時分秒
				addMsgKK2991.set(KK2991ETMsg.UPD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 更新オペレーターアカウント
				addMsgKK2991.set(KK2991ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				
				// 機器利用期間別一時金候補に登録する。
				kk2991SecProc.create(addMsgKK2991);
			}
		}
		catch(CAANCreateException cce)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.CREATE_DB_ERR);
			throw cce;
		}
	}

	/**
	 * 宅内機器型式関連情報登録を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws CAANException
	 */
	private void addTkmdlKnrnInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器型式コードを取得する。
		String taknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD);
		
		// 宅内機器型式関連情報のETメッセージを作成
		CAANMsg msgZM0491 = new CAANMsg(ZM0491ETMsg.class.getName());
		
		// 宅内機器型式コードにINPUTの宅内機器型式コードを設定
		msgZM0491.set(ZM0491ETMsg.TAKNKIKI_MODEL_CD, taknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgZM0491.set(ZM0491ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// 宅内機器型式関連情報 ロジカルエンティティクラス
		ZM0491LE leZM0491 = new ZM0491LE();
		
		// 宅内機器型式関連情報から条件と一致するレコードを取得
		CAANMsg[] arrMsgZM0491 = leZM0491.findByCondition(msgZM0491);
		
		// レコードが取得できなかった場合は、エラーを設定し、処理を終了する。
		if(isNull(arrMsgZM0491))
		{
			return;
		}
		
		// 宅内機器型式関連情報の副次処理部品
		JZMejbZM0491SecProc zm0491SecProc = new JZMejbZM0491SecProc(); 
		
		try
		{
			// 取得したレコードの分ループする
			for(CAANMsg addMsgZM0491 : arrMsgZM0491)
			{
				// 宅内機器型式コードにINPUTの再生品宅内機器型式コードを設定する。
				addMsgZM0491.set(ZM0491ETMsg.TAKNKIKI_MODEL_CD, inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD));
				// 登録年月日時分秒
				addMsgZM0491.set(ZM0491ETMsg.ADD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 登録オペレーターアカウント
				addMsgZM0491.set(ZM0491ETMsg.ADD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				// 更新年月日時分秒
				addMsgZM0491.set(ZM0491ETMsg.UPD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 更新オペレーターアカウント
				addMsgZM0491.set(ZM0491ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				
				// 宅内機器型式関連情報に登録する。
				zm0491SecProc.create(addMsgZM0491);
			}
		}
		catch(CAANCreateException cce)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.CREATE_DB_ERR);
			throw cce;
		}
	}

	/**
	 * 機器提供料金プラン別機器型式候補更新を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @throws CAANException
	 */
	private void updKppbtKkmdiKho(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// INPUTの宅内機器型式コードを取得する。
		String taknkikiModelCd = inCBSMsg.getString(EKK1861D010CBSMsg.TAKNKIKI_MODEL_CD);
		
		// 機器提供料金プラン別機器型式候補のETメッセージを作成
		CAANMsg msgKK2041 = new CAANMsg(KK2041ETMsg.class.getName());
		
		// 宅内機器型式コードにINPUTの宅内機器型式コードを設定
		msgKK2041.set(KK2041ETMsg.TAKNKIKI_MODEL_CD, taknkikiModelCd);
		
		// 無効フラグに有効を設定
		msgKK2041.set(KK2041ETMsg.MK_FLG, JDKStrConst.MK_FLG_YUKO);
		
		// 機器提供料金プラン別機器型式候補 ロジカルエンティティクラス
		KK2041LE leKK2041 = new KK2041LE();
		
		// 機器提供料金プラン別機器型式候補から条件と一致するレコードを取得
		CAANMsg[] arrMsgKK2041 = leKK2041.findByCondition(msgKK2041);
		
		// レコードが取得できなかった場合は、エラーを設定し、処理を終了する。
		if(isNull(arrMsgKK2041))
		{
			return;
		}
		
		// 機器提供料金プラン別機器型式候補の副次処理部品
		JKKejbKK2041SecProc kk2041SecProc = new JKKejbKK2041SecProc(); 
		
		try
		{
			// 取得したレコードの分ループする
			for(CAANMsg addMsgKK2041 : arrMsgKK2041)
			{
				// 宅内機器型式コードにINPUTの再生品宅内機器型式コードを設定する。
				addMsgKK2041.set(KK2041ETMsg.TAKNKIKI_MODEL_CD, inCBSMsg.getString(EKK1861D010CBSMsg.SAISEHN_TAKNKIKI_MODEL_CD));
				// 更新年月日時分秒
				addMsgKK2041.set(KK2041ETMsg.UPD_DTM, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATEDATETIME));
				// 更新オペレーターアカウント
				addMsgKK2041.set(KK2041ETMsg.UPD_OPEACNT, inCBSMsg.getString(EKK1861D010CBSMsg.OPERATORID));
				
				// 機器提供料金プラン別機器型式候補を更新する。
				kk2041SecProc.update(addMsgKK2041);
			}
		}
		catch(CAANFinderException cfe)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.UPDATE_DB_ERR);
			throw cfe;
		}
	}
	
	/**
	 * サービス別宅内機器型式候補番号最大値取得を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @return サービス別宅内機器型式候補番号の最大値
	 */
	private long getMaxSvcbtTkmdlKhoNo(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// SQL作成
		StringBuffer sql_Buff = new StringBuffer();
		
		sql_Buff.append("SELECT MAX(KK1861.SVCBT_TKMDL_KHO_NO) AS SVCBT_TKMDL_KHO_NO ");
		sql_Buff.append(" FROM KK_M_SVCBT_TKMDL_KHO KK1861 ");
		
		// 条件
		sql_Buff.append(" WHERE KK1861.MK_FLG = '0' ");
		
		
		// 最大値取得
		return getMaxNo(inCBSMsg, inContext, "KK_M_SVCBT_TKMDL_KHO", sql_Buff.toString(), "SVCBT_TKMDL_KHO_NO");
	}
	
	/**
	 * 最大値取得処理
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @param tableName テーブル名
	 * @param sql sql文
	 * @param colName 取得列名
	 * @return 最大値
	 */
	private long getMaxNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String tableName, String sql, String colName)
	{
		// 最大値
		long maxNo = 0;
		
		// コネクション
		Connection conl = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		conl = JSYejbConnection.getConnection(tableName);
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		try
		{
			// prepareStatementにSQL文をセット
			pstmt = conl.prepareStatement(sql);
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			if(rsltQuery.next())
			{
				String value = rsltQuery.getString(colName);
				
				// 最大値が取得できた場合
				if(value != null)
				{
					maxNo = Long.parseLong(value);
				}
			}
			
		}
		catch(SQLException e)
		{
			inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally 
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(conl != null)
				{
					CAANConnectionMgr.getInstance().close(conl);
				}
			}
			catch (SQLException e)
			{
				inCBSMsg.set(EKK1861D010CBSMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		
		return maxNo;
	}
	
	/**
	 * 宅内機器型式コード確定条件番号最大値取得を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @return 宅内機器型式コード確定条件番号の最大値 
	 */
	private long getMaxTkkikiMdlCdFixNo(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		StringBuffer sql_Buff = new StringBuffer();
		
		sql_Buff.append("SELECT MAX(DK0291.TKKIKI_MDL_CD_FIX_NO) AS TKKIKI_MDL_CD_FIX_NO ");
		sql_Buff.append(" FROM DK_M_TKKIKI_MDL_FIX DK0291 ");
		
		// 条件
		sql_Buff.append(" WHERE DK0291.MK_FLG = '0' ");
		
		return getMaxNo(inCBSMsg, inContext, "DK_M_TKKIKI_MDL_FIX", sql_Buff.toString(), "TKKIKI_MDL_CD_FIX_NO");
	}
	
	/**
	 * 機器利用期間別一時金候補番号最大値取得を行う。
	 * @param inCBSMsg CSBメッセージ
	 * @param inContext ディスパッチコンテキスト
	 * @return 機器利用期間別一時金候補番号の最大値
	 */
	private long getMaxKkupblcjknKhoNo(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		StringBuffer sql_Buff = new StringBuffer();
		
		sql_Buff.append("SELECT MAX(KK2991.KKUPB_ICJKN_KHO_NO) AS KKUPB_ICJKN_KHO_NO ");
		sql_Buff.append(" FROM KK_M_KKUPB_ICJKN_KHO KK2991 ");
		
		// 条件
		sql_Buff.append(" WHERE KK2991.MK_FLG = '0' ");
		
		return getMaxNo(inCBSMsg, inContext, "KK_M_KKUPB_ICJKN_KHO", sql_Buff.toString(), "KKUPB_ICJKN_KHO_NO");
	}
	
	/**
	 * CAANMsg[]がnullか判定します。
	 * @param msg CBSメッセージキャリア
	 * @return nullの場合、true<br />
	 *          nullでない場合、false
	 */
	private boolean isNull(CAANMsg[] msg)
	{
		return (null == msg || msg.length <= 0);
	}
}
