/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAdChgPlaceNoChgRnkiCC
*   ソースファイル名：JKKAdChgPlaceNoChgRnkiCC.java
*   作成者          ：富士通
*   日付            ：2012年09月18日
*＜機能概要＞
*   住所変更場所番号変更連携部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2012/09/18   FJ）        新規作成
*   v28.00.00   2017/01/31   FJ)江藤     【OM-2016-0001720】買取機器情報送信（ディレイド用）バッチ廃止
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1081C011CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1081D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020003CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKKA0020004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020006CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020006CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0411A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0411A010CBSMsg1List;

/**
 * 住所変更場所番号変更連携部品
 * <p>
 * <br>
 * 住所変更場所番号変更連携部品を実行し、機器の場所番号を連携する。<br>
 * <br>
 * 【使用するサービスIF】<br>
 *   ・
 * <br>
 * @author FJ
 */
public class JKKAdChgPlaceNoChgRnkiCC extends AbstractCommonComponent {
	
// IKK-2013-0000707対応 20130403 星野 ADD START
	/** テンプレートID(サービス契約番号更新) */
	private static final String TEMPLATE_EKKA0020006 = "EKKA0020006";
	
	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";
// IKK-2013-0000707対応 20130403 星野 ADD END


	/**
	 * 住所変更フェムトセルＳＯＤ更新処理
	 * <br>
	 * パラメータの件数分、住所変更フェムトセルＳＯＤ更新します。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return パラメータマップ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite addChgPlaceNo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable {

		// ----- 引数チェック -----
		// パラメータ
		if (param == null) {
			return null;
		}
		// ユーザ任意文字列
		if (fixedText == null) {
			return null;
		}

		// ----- 主処理 -----
		// 対象データListを取得
		ArrayList<HashMap<String, Object>> trgtDataList = (ArrayList<HashMap<String, Object>>)param.getData(fixedText);

		// 対象データListの存在チェック
		if (trgtDataList == null) {
			return param;
		}

		// 対象データListの件数分、以下の処理を繰り返す
		for (HashMap<String, Object> trgtData : trgtDataList) {

// OM-2013-0002217 Y.Kanata 2013.09.17 ADD START
			// 宅内機器型式コードを持つ場合、宅内機器型式コードを元に製造番号有無を取得
			String taknkiki_model_cd = "";
			String seizou_no_umu = null;
			if ( trgtData != null ) {
				if ( trgtData.containsKey("taknkiki_model_cd") ) {
					taknkiki_model_cd = (String)trgtData.get("taknkiki_model_cd");
				}
			}
			if (StringUtils.isEmpty(taknkiki_model_cd)) {
				// 宅内機器型式コードを持たない場合は、製造番号有無が"0":なしの場合と同じ処理を行う。
				seizou_no_umu = "0";
			} else {
				/** EZM0411A010 宅内機器型式一意照会 */
				seizou_no_umu = executeEZM0411A010(handle, param, "EZM0411A010", taknkiki_model_cd);
			}
			// 製造番号有無が"0":なしの場合は処理を行わない
			if ( StringUtils.isEmpty(seizou_no_umu) || "0".equals( seizou_no_umu ) ) {
				continue;
			}
// OM-2013-0002217 Y.Kanata 2013.09.17 ADD END
			String kihontUpdDttm = null;
			kihontUpdDttm = getKihontUpdDttm(handle, param, trgtData);

			if (kihontUpdDttm == null || "".equals(kihontUpdDttm.trim())) {
				throw new CCException("宅内機器基本Ｔ更新日付が存在しません。", new Exception());
			}

			trgtData.put("kihont_upd_dttm", kihontUpdDttm);

// IKK-2013-0000707対応 20130403 星野 ADD START
			if( !StringUtils.isEmpty( (String)trgtData.get("bf_svc_kei_no") ) ){
				// OM-2016-0001720 宅内機器ステータスチェックを追加 2017/01/31 ADD START
				JKKBpCommon.printBpDebugLog(this.getClass(), "【住所変更場所番号変更CC】宅内機器ステータス:" + (String)trgtData.get("taknkiki_stat"));
				if (JKKTkkkSvKeiNoUpdCC.isTrgtTaknkikiStat((String)trgtData.get("taknkiki_stat")))
				{
					JKKBpCommon.printBpDebugLog(this.getClass(), "【住所変更場所番号変更CC】サービス契約番号更新SIF呼出 型式:" + (String)trgtData.get("taknkiki_model_cd") + " 製番:" + (String)trgtData.get("kiki_seizo_no") + " 連携サービス契約番号:" + (String)trgtData.get("svc_kei_no"));
				// OM-2016-0001720 宅内機器ステータスチェックを追加 2017/01/31 ADD END
					// サービス契約番号変更
					modKikiSvcKeiNo(handle, param, fixedText, trgtData);
				// OM-2016-0001720 宅内機器ステータスチェックを追加 2017/01/31 ADD START
				}
				// OM-2016-0001720 宅内機器ステータスチェックを追加 2017/01/31 ADD END
			}
// IKK-2013-0000707対応 20130403 星野 ADD END
			
// IKK-2013-0000849対応 20130408 福永 ADD START
			kihontUpdDttm = getKihontUpdDttm(handle, param, trgtData);

			if (kihontUpdDttm == null || "".equals(kihontUpdDttm.trim())) {
				throw new CCException("宅内機器基本Ｔ更新日付が存在しません。", new Exception());
			}

			trgtData.put("kihont_upd_dttm", kihontUpdDttm);
// IKK-2013-0000849対応 20130408 福永 ADD END
			
			modKikiPlaceNo(handle, param, trgtData);
			
		}

		return param;
	}

	/**
	 * ＢＰチェック入力パラメータ作成
	 * <br>
	 * ＢＰチェック用の入力パラメータを作成する。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return HashMap パラメータマップ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws RequestParameterException {
		return new HashMap();
	}

	/**
	 * ＢＰチェック結果編集
	 * <br>
	 * ＢＰチェック結果を編集する。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) {
		return param;
	}

	/**
	 * 宅内機器一意照会（４）
	 * <br>
	 * 宅内機器一意照会（４）を実行します。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @return パラメータマップ
	 * @throws Throwable
	 */
	private String getKihontUpdDttm(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> trgtData) throws Throwable {

		HashMap<String, Object> inMap = createSifInMap(param);

		CAANMsg template = createTemplate(param, EKKA0020003CBSMsg.class.getName(), "EKKA0020003", JPCModelConstant.FUNC_CD_1);

		{
			CAANMsg[] templateArray = template.getCAANMsgList(EKKA0020003CBSMsg.EKKA0020003CBSMSG1LIST);
			if (templateArray == null || templateArray.length < 1) {
				templateArray = new CAANMsg[1];
			}
			{
				CAANMsg childTemplate = templateArray[0];
				if (childTemplate == null) {
					childTemplate = new CAANMsg(EKKA0020003CBSMsg1List.class.getName());
				}
				if (trgtData == null || trgtData.get("taknkiki_model_cd") == null || "".equals(trgtData.get("taknkiki_model_cd"))) {
					childTemplate.setNull(EKKA0020003CBSMsg1List.KEY_TK_MDL_CD);
				} else {
					childTemplate.set(EKKA0020003CBSMsg1List.KEY_TK_MDL_CD, (String)trgtData.get("taknkiki_model_cd"));
				}
				if (trgtData == null || trgtData.get("kiki_seizo_no") == null || "".equals(trgtData.get("kiki_seizo_no"))) {
					childTemplate.setNull(EKKA0020003CBSMsg1List.KEY_KK_SEIZO_NO);
				} else {
					childTemplate.set(EKKA0020003CBSMsg1List.KEY_KK_SEIZO_NO, (String)trgtData.get("kiki_seizo_no"));
				}
				templateArray[0] = childTemplate;
			}
			// 宅内機器一意照会（４）条件明細
			template.set(EKKA0020003CBSMsg.EKKA0020003CBSMSG1LIST, templateArray);
		}

		inMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SCコール
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> resultMap = scCall.run(inMap, handle);

		checkError(param, resultMap, EKKA0020003CBSMsg.STATUS);

		CAANMsg[] templates = (CAANMsg[])resultMap.get(JCMConstants.TEMPLATE_LIST_KEY);
		if (templates == null || templates.length < 1) {
			return "";
		}
		CAANMsg[] templateArray = templates[0].getCAANMsgList(EKKA0020003CBSMsg.EKKA0020003CBSMSG2LIST);
		if (templateArray == null || templateArray.length < 1) {
			return "";
		}
		// OM-2016-0001720 2017/01/31 ADD START
		// 宅内機器一意照会（４）結果.宅内機器ステータスを対象データに追加する
		trgtData.put("taknkiki_stat", templateArray[0].getString(EKKA0020003CBSMsg2List.TAKNKIKI_STAT));
		// OM-2016-0001720 2017/01/31 ADD END
		
		return templateArray[0].getString(EKKA0020003CBSMsg2List.KIHONT_UPD_DTTM);
	}

	/**
	 * 機器場所番号変更
	 * <br>
	 * 機器場所番号を変更します。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param trgtData 対象データ
	 * @throws Throwable
	 */
	private void modKikiPlaceNo(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> trgtData) throws Throwable {

		HashMap<String, Object> inMap = createSifInMap(param);

		CAANMsg template = createTemplate(param, EKKA0020004CBSMsg.class.getName(), "EKKA0020004", JPCModelConstant.FUNC_CD_1);

		{
			CAANMsg[] templateArray = template.getCAANMsgList(EKKA0020004CBSMsg.EKKA0020004CBSMSG1LIST);
			if (templateArray == null || templateArray.length < 1) {
				templateArray = new CAANMsg[1];
			}
			{
				CAANMsg childTemplate = templateArray[0];
				if (childTemplate == null) {
					childTemplate = new CAANMsg(EKKA0020004CBSMsg1List.class.getName());
				}

				// ＫＥＹ＿宅内機器型式コード
				if (trgtData == null || trgtData.get("taknkiki_model_cd") == null || "".equals(trgtData.get("taknkiki_model_cd"))) {
					childTemplate.setNull(EKKA0020004CBSMsg1List.KEY_TK_MDL_CD);
				} else {
					childTemplate.set(EKKA0020004CBSMsg1List.KEY_TK_MDL_CD, (String)trgtData.get("taknkiki_model_cd"));
				}
				// ＫＥＹ＿機器製造番号
				if (trgtData == null || trgtData.get("kiki_seizo_no") == null || "".equals(trgtData.get("kiki_seizo_no"))) {
					childTemplate.setNull(EKKA0020004CBSMsg1List.KEY_KK_SEIZO_NO);
				} else {
					childTemplate.set(EKKA0020004CBSMsg1List.KEY_KK_SEIZO_NO, (String)trgtData.get("kiki_seizo_no"));
				}
				// ＫＥＹ＿変更理由コード
				if (trgtData == null || trgtData.get("kiki_chg_rsn_cd") == null || "".equals(trgtData.get("kiki_chg_rsn_cd"))) {
					childTemplate.setNull(EKKA0020004CBSMsg1List.KEY_CHG_RSN_CD);
				} else {
					childTemplate.set(EKKA0020004CBSMsg1List.KEY_CHG_RSN_CD, (String)trgtData.get("kiki_chg_rsn_cd"));
				}
				// ＫＥＹ＿宅内機器基本Ｔ更新日付
				if (trgtData == null || trgtData.get("kihont_upd_dttm") == null || "".equals(trgtData.get("kihont_upd_dttm"))) {
					childTemplate.setNull(EKKA0020004CBSMsg1List.KEY_BTRY_UPD_DTTM);
				} else {
					childTemplate.set(EKKA0020004CBSMsg1List.KEY_BTRY_UPD_DTTM, (String)trgtData.get("kihont_upd_dttm"));
				}
				// 設置場所番号
				if (trgtData == null || trgtData.get("setplace_no") == null || "".equals(trgtData.get("setplace_no"))) {
					childTemplate.setNull(EKKA0020004CBSMsg1List.SETPLACE_NO);
				} else {
					childTemplate.set(EKKA0020004CBSMsg1List.SETPLACE_NO, (String)trgtData.get("setplace_no"));
				}
				// サービス契約番号
				if (trgtData == null || trgtData.get("svc_kei_no") == null || "".equals(trgtData.get("svc_kei_no"))) {
					childTemplate.setNull(EKKA0020004CBSMsg1List.SVC_KEI_NO);
				} else {
					childTemplate.set(EKKA0020004CBSMsg1List.SVC_KEI_NO, (String)trgtData.get("svc_kei_no"));
				}

				templateArray[0] = childTemplate;
			}
			// 機器場所番号変更明細
			template.set(EKKA0020004CBSMsg.EKKA0020004CBSMSG1LIST, templateArray);
		}

		inMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

		// SCコール
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> resultMap = scCall.run(inMap, handle);

		checkError(param, resultMap, EKK1081D010CBSMsg.STATUS);
	}
	
// IKK-2013-0000707対応 20130403 星野 ADD START
	private void modKikiSvcKeiNo(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> trgtData) throws Throwable {
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// リクエストパラメータ
		HashMap<String, Object> sIFRequest = null;
		// SIFの実行結果から取得したCAANMsg[]
		CAANMsg[] resultMsgs = null;
		// テンプレート情報部（入力時の情報）
		CAANMsg template = null;
		// 結果情報域
		Map<?, ?> sIFResult = null;

		// 上りデータマッピング情報の作成
		//リクエストパラメータにメッセージ共通部を設定
		sIFRequest = createSifInMap(param);
		
		//templateとしてEKKA0020006形式のクラスを生成
		template = createTemplate(param, EKKA0020006CBSMsg.class.getName(), TEMPLATE_EKKA0020006, JPCModelConstant.FUNC_CD_1);
		
		//テンプレート共通部のID,機能コード、検索条件を設定
		mappingEKKA0020006SCInMsg(template, param, (String)trgtData.get("taknkiki_model_cd"), (String)trgtData.get("kiki_seizo_no"), (String)trgtData.get("svc_kei_no"), (String)trgtData.get("kihont_upd_dttm"));
		
		//条件を詰めたテンプレートクラスの配列を生成し、リクエストパラメータに設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});
		
		//SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);

		checkError(param, sIFResult, EKKA0020006CBSMsg.STATUS);		
	}
	
	/**
	 * templateに対してEKKA0020006SCの条件に関する部分を設定する
	 * @param template 条件の設定先
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException 
	 */
	private void mappingEKKA0020006SCInMsg(
			CAANMsg template,
			IRequestParameterReadWrite param,
			String kikiModelCd,
			String kikiSeizoNo,
			String svcKeiNo,
			String kihontUpdDttm)   
	throws RequestParameterException
	{
		
//		//まずは全条件のNullマッピング
//		fillCAANMSGNullMapping(template, new EKKA0020006CBSMsg().getContents());
		
		//テンプレートID(SIFのID)
		template.set(EKKA0020006CBSMsg.TEMPLATEID, TEMPLATE_EKKA0020006);

		//機能コード--サービスIFDBアクセス部品
		template.set(EKKA0020006CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		CAANMsg[] templateArray = template.getCAANMsgList(EKKA0020006CBSMsg.EKKA0020006CBSMSG1LIST);
		if (templateArray == null) {
			templateArray = new CAANMsg[1];
		}
		
		CAANMsg childTemplate = templateArray[0];
		if (childTemplate == null) {
			childTemplate = new CAANMsg(EKKA0020006CBSMsg1List.class.getName());
		}
		
		//ＫＥＹ＿宅内機器型式コード
		childTemplate.set(EKKA0020006CBSMsg1List.KEY_TK_MDL_CD, kikiModelCd);
		//ＫＥＹ＿機器製造番号
		childTemplate.set(EKKA0020006CBSMsg1List.KEY_KK_SEIZO_NO, kikiSeizoNo);
		//ＫＥＹ＿宅内機器基本Ｔ更新日付
		childTemplate.set(EKKA0020006CBSMsg1List.KEY_KIHON_UPD_DTTM, kihontUpdDttm);
		//サービス契約番号
		childTemplate.set(EKKA0020006CBSMsg1List.SVC_KEI_NO, svcKeiNo);
		
		templateArray[0] = childTemplate;
		template.set(EKKA0020006CBSMsg.EKKA0020006CBSMSG1LIST, templateArray);
		
	}
	
	/**
	 *<DL>
	 *<DT>処理概要:EKKA0020006_サービス契約番号更新
	 *<DD>サービスコンポーネント実行後に、IRequestParameterReadWriteにエラー情報をマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 * @since 2011.11.08
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoEKKA0020006(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
	throws Throwable
	{
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(EKKA0020006CBSMsg.STATUS);
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		HashMap inMap = null;
		
		// 作業項目領域
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		/* ユーザデータ情報 */
		inMap = (HashMap)param.getData(fixedText);
		if (inMap == null)
		{
			inMap = new HashMap();
			param.setData(fixedText, inMap);
		}

		ArrayList inList = (ArrayList)inMap.get("EKKA0020006CBSMsg1List");
		if (inList == null) 
		{
			inList = new ArrayList();
			inMap.put("EKKA0020006CBSMsg1List", inList);
		}
		CAANMsg[] templateArray = template.getCAANMsgList(EKKA0020006CBSMsg.EKKA0020006CBSMSG1LIST);

		if (templateArray != null) 
		{
			for (int i = 0; i < templateArray.length; i++) 
			{
				if (i >= inList.size()) 
				{
					inList.add(new HashMap());
				}
			
				HashMap childMap = (HashMap)inList.get(i);
				CAANMsg childTemplate = templateArray[i];

				// ＫＥＹ＿宅内機器型式コード のエラー情報返却
				if (!childTemplate.isNull(EKKA0020006CBSMsg1List.KEY_TK_MDL_CD_ERR)) 
				{
					if (!childMap.containsKey("key_tk_mdl_cd_err")) 
					{
						childMap.put("key_tk_mdl_cd_err", childTemplate.getString(EKKA0020006CBSMsg1List.KEY_TK_MDL_CD_ERR));
					}
				}
				// ＫＥＹ＿機器製造番号 のエラー情報返却
				if (!childTemplate.isNull(EKKA0020006CBSMsg1List.KEY_KK_SEIZO_NO_ERR)) 
				{
					if (!childMap.containsKey("key_kk_seizo_no_err")) 
					{
						childMap.put("key_kk_seizo_no_err", childTemplate.getString(EKKA0020006CBSMsg1List.KEY_KK_SEIZO_NO_ERR));
					}
				}
				// ＫＥＹ＿宅内機器基本Ｔ更新日付 のエラー情報返却
				if (!childTemplate.isNull(EKKA0020006CBSMsg1List.KEY_KIHON_UPD_DTTM_ERR)) 
				{
					if (!childMap.containsKey("key_kihon_upd_dttm_err")) 
					{
						childMap.put("key_kihon_upd_dttm_err", childTemplate.getString(EKKA0020006CBSMsg1List.KEY_KIHON_UPD_DTTM_ERR));
					}
				}
				// サービス契約番号 のエラー情報返却
				if (!childTemplate.isNull(EKKA0020006CBSMsg1List.SVC_KEI_NO_ERR)) 
				{
					if (!childMap.containsKey("svc_kei_no_err")) 
					{
						childMap.put("svc_kei_no_err", childTemplate.getString(EKKA0020006CBSMsg1List.SVC_KEI_NO_ERR));
					}
				}
			}
		}
		if (!template.isNull(EKKA0020006CBSMsg.EKKA0020006CBSMSG1LIST_ERR)) 
		{
			if (!inMap.containsKey("EKKA0020006CBSMsg1List_err")) 
			{
				inMap.put("EKKA0020006CBSMsg1List_err", template.getString(EKKA0020006CBSMsg.EKKA0020006CBSMSG1LIST_ERR));
			}
		}
		
		return param;
	}
	
	/**
	 * エラーチェック処理
	 * 
	 * @param msgList サービスインタフェース実行結果
	 * return void
	 * @throws SCCallException 
	 */
	private void errChk(Map<?, ?> msgList) 
	throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		int returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// ステータス
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if ((0 != returnCode) || (0 != templateStatus))
		{
			throw new SCCallException(ERR_MSG, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * 持ちうるフィールドにNullマッピングで埋める
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		
		//要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			
			Object element = null;
			
			//キーに該当する箇所の取得
			element = contents[i][0];

			//Nullでマッピング
			msg.setNull((String)element);
			
		}
		
	}
// IKK-2013-0000707対応 20130403 星野 ADD END


	/**
	 * サービスI/F入力パラメータ生成
	 * <br>
	 * サービスI/F呼び出し時の入力パラメータを生成します。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return 入力Map
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> createSifInMap(IRequestParameterReadWrite param) throws RequestParameterException {

		HashMap<String, Object> inMap = new HashMap<String, Object>();

		// ----- 電文ヘッダー（ヘッダー） -----
		// 電文ID
		inMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		inMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		inMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		inMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// ----- ユーザエリア（コントロールマップ） -----
		// 依頼先ホスト名
		inMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		inMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		inMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		inMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		return inMap;
	}

	/**
	 * サービスI/Fテンプレート生成
	 * <br>
	 * サービスI/F呼び出し時のテンプレートを生成します。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param schemaName スキーマ名
	 * @param templateId テンプレートID
	 * @param funcCd 機能コード
	 * @return メッセージキャリア
	 * @throws RequestParameterException
	 */
	private CAANMsg createTemplate(IRequestParameterReadWrite param, String schemaName, String templateId, String funcCd) throws RequestParameterException {

		// ----- テンプレート -----
		CAANMsg template = new CAANMsg(schemaName);
		// テンプレートID
		template.set(EKK1081C011CBSMsg.TEMPLATEID, templateId);
		// 機能コード（同一処理番号採番）
		template.set(EKK1081C011CBSMsg.FUNC_CODE, funcCd);
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));

		return template;
	}

	/**
	 * サービスI/Fエラーチェック
	 * <br>
	 * サービスI/F呼び出し後のエラーをチェックします。
	 * <br>
	 * @param resultMap 結果
	 * @param msgKey サービスI/Fキー
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void checkError(IRequestParameterReadWrite param, Map<?, ?> resultMap, String msgKey) throws Exception {

		CAANMsg[] templates = (CAANMsg[])resultMap.get(JCMConstants.TEMPLATE_LIST_KEY);

		if (templates == null || templates.length < 1) {
			throw new CCException("", new Exception());
		}

		CAANMsg template = templates[0];

		if (template == null) {
			throw new CCException("", new Exception());
		}

		Object objRtnCd = resultMap.get(JCMConstants.RET_CD_INT_KEY);

		if (objRtnCd == null) {
			throw new CCException("", new Exception());
		}

		int returnCode = (Integer)objRtnCd;

		int templateStatus = template.getInt(msgKey);

		if (returnCode != 0) {
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null) {
			templateStatus = 0;
		}

		int bpStatus = 0;
		if (param.getControlMapData(SCControlMapKeys.RETURN_CODE) == null) {
			bpStatus = -1;
		} else {
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus) {
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}

		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null) {
			errList = new ArrayList<Object>();
		}
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(resultMap, errList));

		if (!(errList == null || errList.isEmpty())) {
			throw new CCException("", new SCCallException("", ((Integer)returnCode).toString(), templates[0].getInt(msgKey)));
		}
	}
// OM-2013-0002217 2013.09.17 Y.Kanata ADD START
	/**
	 *  宅内機器型式一意照会から製造番号有無を返却する
	 * <br>
	 * @param   param      モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @param   fixedText  ユーザ任意文字列
	 * @param   kk0341_a010_map  機器提供サービス契約一意照会マップ
	 * @throws  Exception  例外が発生した場合
	 */
	private String executeEZM0411A010( SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String taknKikiModelCd ) throws Exception
	{
		/** 事前準備 */
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所変更登録コモンコンポーネントマッピングクラスインスタンス
		JKKAdInfChgMapperCC mapper = JKKAdInfChgMapperCC.getInstance();
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ■ EZM0411A010  宅内機器型式一意照会
		// place_map生成
		HashMap<String, String> zm0411_a010_meisai_map = new HashMap<String, String>();
		
		// 機器提供サービス契約番号
		zm0411_a010_meisai_map.put( EZM0411A010CBSMsg.KEY_TAKNKIKI_MODEL_CD, taknKikiModelCd );
	
		//  宅内機器型式一意照会
		reqMap = mapper.setEZM0411A010( param, fixedText, zm0411_a010_meisai_map );
		resMap = scCall.run( reqMap, handle );
		ArrayList<HashMap<String, Object>> zm0411_a010_lst = mapper.getEZM0411A010( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		// 製造番号有無の取得
		if (zm0411_a010_lst == null || zm0411_a010_lst.isEmpty()) {
			// ■取得件数が0件の場合
			//   紹介結果無しの為、以下の処理は行わない。
			return new String();
		}

		// ■取得件数が1件以上の場合
		//   EZM0411A010 宅内機器型式一意照会から取得した製造番号有無を返却
		HashMap<String, Object> ret_map = zm0411_a010_lst.get(0);
		String seizou_no_umu = (String) ret_map.get( EZM0411A010CBSMsg1List.SEIZO_NO_UM );

		return seizou_no_umu;
	}
// OM-2013-0002217 2013.09.17 Y.Kanata ADD END
}
