/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCN050HakkoCC
*   ソースファイル名：JCN050HakkoCC.java
*   作成者          ：富士通
*   日付            ：2013年02月21日
*＜機能概要＞
*  ０５０番号発行処理を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2013/02/21   圓山        新規作成
*   v1.00.01    2013/06/13   木村        番号復活する場合のSIPID設定方法を変更
*   v8.00.00    2014/01/17   山口       【ANK-1585-00-00】サービスＩＦの変更
*   v9.00.00    2014/05/28   味岡       【ANK-2107-00-00】番号発番時の連携パラメータチェック強化対応
*   v15.00.00   2015/08/25   FJ)宇野    【ANK-2634-00-00】２重発番チェック仕様強化
*   v70.00.00   2024/02/26   FJ)張	    【ANK-4538-00-00】LaLaCall契約時の本人確認必須化
*
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import static eo.common.constant.JCNStrConst.*;
import static com.fujitsu.futurity.bp.custom.common.JCNDslCommonUtil.*;
import static com.fujitsu.futurity.bp.custom.common.JCNDslScParamHenshu.*;

import java.math.BigInteger;
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.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.ICommonComponent;
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.model.base.CAANMsg;

import eo.common.constant.JACStrConst;
import eo.common.constant.JCNStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECN0331B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0331B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0331D002CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0070001CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0111B070CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0111B070CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0111D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0111E010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0181B030CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0181B030CBSMSG1LIST;
import eo.ejb.cbs.cbsmsg.EZM0181E020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0341D010CBSMsg;

import eo.ejb.common.edit.JCNejbCN0011NumberParts;

/**
 * ０５０番号発行処理を行います。
 * <BR>
 * @ author 富士通
 *
 */
public class JCN050HakkoCC extends AbstractCommonComponent implements ICommonComponent
{

	// **************************************************************
	// クラス変数
	// **************************************************************
	
	/** 050電話番号払出種別コード */
	String telNoHrSbtCd = "";
	String inputTelNo = "";

	/** 過去契約で初期設定済みのSIPID */
	private String SETTEIZUMI_SIPID = "";

	// **************************************************************
	// 定数
	// **************************************************************
	/** 共通コンポーネント名 */
	public static String ccName = "JCN050HakkoCC";

	// ------------------------------------------
	// サービスマップ項目
	// ------------------------------------------
	/** サービスマップ項目名：SYSID */
	private static final String SVMAP_SYSID = "SYSID";

	/** サービスマップ項目名：コンテンツ契約番号 */
	private static final String SVMAP_CONT_KEI_NO = "CONT_KEI_NO";
	
	/** サービスマップ項目名：０５０電話番号払出種別コード */
	private static final String SVMAP_TELNO_HRADSI_SBT_CD = "TELNO_HRADSI_SBT_CD";
	
	/** サービスマップ項目名：０５０電話番号 */
	private static final String SVMAP_IN_TELNO = "IN_TELNO";
	
	/** サービスマップ項目名：戻りコード */
	private static final String SVMAP_RETURN_CODE = "RETURN_CODE";
	
	/** サービスマップ項目名：050電話番号 */
	private static final String SVMAP_050_TELNO = "TELNO";
	
	// ANK-4538-00-00 ADD START
	/** サービスマップ項目名：050電話番号 */
	private static final String SVMAP_MIMOTCFM_ID = "MIMOTCFM_ID";
	// ANK-4538-00-00 ADD END
	
	// ------------------------------------------
	// テンプレートID
	// ------------------------------------------
	/** テンプレートID：コンテンツ契約050番号発行SC */
	private static final String TEMPLATE_CONT_KEI_050HAKKO = "ECNA0070001";
	
	/** テンプレートID：050電話番号予約一覧照会 */
	private static final String TEMPLATE_050TEL_YOYAKU_ICHIRAN = "EZM0181B030";
	
	/** テンプレートID：コンテンツ契約050電話番号内訳本契約登録 */
	private static final String TEMPLATE_CONT_KEI_050TEL_UCHIWAKE_ADD = "ECN0331D002";
	
	/** テンプレートID：電話番号予約削除(050IP電話アプリ用) */
	private static final String TEMPLATE_TELNO_RSV_DEL_050 = "EZM0181E020";
	
	/** テンプレートID：エイジング対象登録 */
	private static final String TEMPLATE_AGING_ADD = "EZM0111D010";

	/** テンプレートID：050番号エイジング一覧照会 */
	private static final String TEMPLATE_050TEL_AGING_ICHIRAN = "EZM0111B070";

	/** テンプレートID：エイジング削除 */
	private static final String TEMPLATE_AGING_DELETE = "EZM0111E010";
	
	// ANK-4538-00-00 ADD START
	/** テンプレートID：コンテンツ公的身分証管理登録 */
	private static final String TEMPLATE_CNKOTKMBNS_INSERT = "ECN0341D010";
	// ANK-4538-00-00 ADD END

	/**
	 * ０５０番号発行メイン処理を行います。
	 * <BR>
	 * @param handle セッションハンドル	
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute050Hakko(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 入力パラメータ格納
		HashMap<String, Object> ccParam = (HashMap<String, Object>)param.getData(ccName);

		// **************************************************
		// 内部で使用する変数の初期化
		// **************************************************
		String rtnCd = DSL_NORMAL_END;
		int status = 0;
		String telNo = null;
		String Ezm0181telNoHrSbtCd = null;
		telNoHrSbtCd = (String)ccParam.get(SVMAP_TELNO_HRADSI_SBT_CD);
		inputTelNo = (String)ccParam.get(SVMAP_IN_TELNO);

		// 返却パラメータ格納用マップ生成
		Map userResult = new HashMap();

		// **************************************************
		// コンテンツ契約050番号発行SCの実行(ECNA0070001)
		// **************************************************
		rtnCd = callHakkoSc(handle, param, ccParam);
		
		// リターンコードが00以外の場合はそのまま呼び出し元へ返却
		if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			editReturnValue(userResult, rtnCd, telNo);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		
		// **************************************************
		// 050電話番号予約一覧照会SCの実行(EZM0181B030)
		// **************************************************
		Map<?, ?> rsvListMap = callGetRsvListSc(handle, param, ccParam);
		
		// 処理結果の判定を行う。
		if (rsvListMap == null)
		{
			// データなしの場合は呼び出し元へ返却
			rtnCd = JCNStrConst.API_RETURN_CD_99;
			editReturnValue(userResult, rtnCd, telNo);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		else
		{
			rtnCd = getSCReturnCd(rsvListMap, EZM0181B030CBSMsg.SEARCH_ERR_FLG);
			if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
			{
				// リターンコードが00以外の場合は呼び出し元へ返却
				editReturnValue(userResult, rtnCd, telNo);
				setResultUserData(param, ccName, userResult);
				return param;
			}
		}
		
		// 戻り値から一覧を取得する。
		CAANMsg[] inList = getResultMsgList(rsvListMap, EZM0181B030CBSMsg.EZM0181B030CBSMSG1LIST); 
		
		// **************************************************
		// 取得した一覧のうち、電話番号予約開始年月日時分秒が最も新しいものを取得
		// **************************************************
		// 電話番号予約開始年月日時分秒が最も新しい情報
		CAANMsg telMap = null;
		BigInteger maxDTM = BigInteger.ZERO;
		for (int i = 0; i < inList.length; i++ )
		{
			BigInteger curDTM = new BigInteger(inList[i].getString(EZM0181B030CBSMSG1LIST.TELNO_RSV_STA_DTM)); 
			if (maxDTM.compareTo(curDTM) < 0 )
			{
				// 新しい方を保持
				maxDTM = curDTM;
				telMap = inList[i];
			}
		}
		// 予約開始年月日時分秒が最も新しいデータから値を取得する。
		Map<?, ?> inMap = telMap.getHashMap(); 
		telNo = (String)inMap.get(EZM0181B030CBSMSG1LIST.TELNO);
		Ezm0181telNoHrSbtCd = (String)inMap.get(EZM0181B030CBSMSG1LIST.N_050_TELNO_HRADSI_SBT_CD);
		
		// 電話番号予約より取得した050電話番号、050電話番号払出種別コードとINPUT項目の050電話番号、
		// 050電話番号払出種別コードを比較し、同一の値でなければ、リターンコード[21]を返却する
		if(!inputTelNo.equals(telNo) || !telNoHrSbtCd.equals(Ezm0181telNoHrSbtCd))
		{
			telNo = null;	// リターンコードを返却する場合は電話番号のOUTPUTパラメータを初期化する。
			rtnCd = JCNStrConst.API_RETURN_CD_21;
			editReturnValue(userResult, rtnCd, telNo);
			setResultUserData(param, ccName, userResult);
			return param;
		}
		
		// ************************************************************
		// コンテンツ契約050電話番号内訳一覧照会のサービスI/Fを呼び出す(ECN0331B001)
		// 番号復活の場合は初期設定済みのSIPIDが存在するか確認する
		// ************************************************************
		if (JCNStrConst.N_050APL_HRADSI_SBT_CD_FUKKATU.equals(telNoHrSbtCd)) {
			rtnCd = callGetUcwkListSc(handle, param, ccParam, telNo);
		}

		if(!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			// リターンコードが00以外の場合は呼び出し元へ返却
			editReturnValue(userResult, rtnCd, telNo);
			setResultUserData(param, ccName, userResult);
			return param;
		}

		// **************************************************
		// 050番号SIPユーザIDの払い出し処理
		// **************************************************
		String aplSipUserId = "";
		if ("".equals(SETTEIZUMI_SIPID)) {
			// 採番処理
			JCNejbCN0011NumberParts numParts = new JCNejbCN0011NumberParts();
			aplSipUserId = numParts.getSipUserID();
		} else {
			aplSipUserId = SETTEIZUMI_SIPID;
		}
		
		// **************************************************
		// コンテンツ契約050電話番号内訳本契約登録(ECN0331D002)
		// **************************************************
		Map<?, ?> ucwkResultMap = callUpdUcwkSc(handle, param, inMap, aplSipUserId);
		
		// 結果取得
		rtnCd = ucwkResultMap.get(JCMConstants.RET_CD_INT_KEY).toString();
		status = resultChkScStatus(ucwkResultMap);
		// リターンコード、ステータスの内容を見て処理結果の判定を行う。
		if (!("0".equals(rtnCd) && 0 == status)) 
		{
			// リターンコード、ステータスが0でない場合、「エラーコード」を「結果コード」に変換
			rtnCd = JCNStrConst.API_RETURN_CD_99;
		}
		else
		{
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			// リターンコードが00以外の場合は呼び出し元へ返却
			// Exception発生させてロールバック
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
			throw scCallEx;
		}
		
		// **************************************************
		// 電話番号予約削除(050IP電話アプリ用)(EZM0181E020)
		// **************************************************
		Map<?, ?> rsvRmvResultMap = callRmvRsvSc(handle, param, ccParam);

		// 結果取得
		rtnCd = rsvRmvResultMap.get(JCMConstants.RET_CD_INT_KEY).toString();
		status = resultChkScStatus(rsvRmvResultMap);
		// リターンコード、ステータスの内容を見て処理結果の判定を行う。
		if (!("0".equals(rtnCd) && 0 == status)) 
		{
			// リターンコード、ステータスが0でない場合
			rtnCd = JCNStrConst.API_RETURN_CD_99;
		}
		else
		{
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			// リターンコードが00以外の場合は呼び出し元へ返却
			// Exception発生させてロールバック
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
			throw scCallEx;
		}

		
		// **************************************************
		// 050電話番号払出種別コードが2(番号復活)の場合、エイジング情報を取得し、削除する
		// **************************************************
		if (N_050APL_HRADSI_SBT_CD_FUKKATU.equals(telNoHrSbtCd))
		{
			// **********************************************
			// 050番号エイジング一覧照会SCの実行(EZM0111B070)
			// **********************************************
			Map<?, ?> agingResult = callGetAgingSc(handle, param, inMap);
			
			// リターンコード、ステータス、検索エラーフラグの内容を見て処理結果の判定を行う。
			rtnCd = agingResult.get(JCMConstants.RET_CD_INT_KEY).toString();
			status = resultChkScStatus(agingResult);
			String errFlg = getResultString(agingResult, EZM0111B070CBSMsg.SEARCH_ERR_FLG);
			if (!("0".equals(rtnCd) && 0 == status) || JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(errFlg)) 
			{
				// リターンコードが0以外 or ステータスが0以外 or エラーフラグが1ならエラー
				printErrorLog("050番号エイジング一覧照会SCにてエラーが発生しました。" + "(KEY:N_050_TELNO=" + telNo 
						+ " returnCd:" + rtnCd + " status:" + status + " errFlg:" + errFlg + ")");
				rtnCd = JCNStrConst.API_RETURN_CD_99;
			}
			else 
			{
				rtnCd = JCNStrConst.API_RETURN_CD_00;
			}
			
			if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
			{
				// リターンコードが00以外の場合は呼び出し元へ返却
				// Exception発生させてロールバック
				SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
				throw scCallEx;
			}
			
			// **********************************************
			// エイジング削除SCの実行(EZM0111E010)
			// **********************************************
			// 戻り値から値を取得する。
			Map<?, ?> agingInMap = getResultMsgList(agingResult, EZM0111B070CBSMsg.EZM0111B070CBSMSG1LIST)[0].getHashMap(); 
			Map<?, ?> agingDelResult = callDelAgingSc(handle, param, agingInMap);
			
			// リターンコード、ステータス、検索エラーフラグの内容を見て処理結果の判定を行う。
			rtnCd = agingDelResult.get(JCMConstants.RET_CD_INT_KEY).toString();
			status = resultChkScStatus(agingDelResult);
			if (!("0".equals(rtnCd) && 0 == status)) 
			{
				// リターンコードが0以外 or ステータスが0以外 
				printErrorLog("エイジング削除SCにてエラーが発生しました。" + "(KEY:N_050_TELNO=" + telNo 
						+ " returnCd:" + rtnCd + " status:" + status + ")");
				rtnCd = JCNStrConst.API_RETURN_CD_99;
			}
			else 
			{
				rtnCd = JCNStrConst.API_RETURN_CD_00;
			}
			
			if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
			{
				// リターンコードが00以外の場合は呼び出し元へ返却
				// Exception発生させてロールバック
				SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
				throw scCallEx;
			}
		}
		
		// **********************************************
		// エイジング対象登録SCの実行(EZM0111D010)
		// **********************************************
		Map<?, ?> agingResultMap = callRegAgingSc(handle, param, inMap);
		
		// リターンコード、ステータスの内容を見て処理結果の判定を行う。
		// 結果取得
		rtnCd = agingResultMap.get(JCMConstants.RET_CD_INT_KEY).toString();
		status = resultChkScStatus(agingResultMap);
		if (!("0".equals(rtnCd) && 0 == status)) 
		{
			printErrorLog("050番号発行SCにてエラーが発生しました。" + "(KEY:N_050_TELNO=" + telNo + ")");
			rtnCd = JCNStrConst.API_RETURN_CD_99;
		}
		else 
		{
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		
		if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			// リターンコードが00以外の場合は呼び出し元へ返却
			// Exception発生させてロールバック
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
			throw scCallEx;
		}	
		
		// ANK-4538-00-00 ADD START
		// **********************************************
		// コンテンツ公的身分証管理対象登録SCの実行(ECN0341D010)
		// **********************************************
		Map<?, ?> CnkotkmbnsResultMap = callRegCnkotkmbnsSc(handle, param, ccParam);
		
		// リターンコード、ステータスの内容を見て処理結果の判定を行う。
		// 結果取得
		rtnCd = CnkotkmbnsResultMap.get(JCMConstants.RET_CD_INT_KEY).toString();
		status = resultChkScStatus(CnkotkmbnsResultMap);
		if (!("0".equals(rtnCd) && 0 == status)) 
		{
			printErrorLog("コンテンツ公的身分証管理対象登録SCにてエラーが発生しました。" + "(KEY:N_050_TELNO=" + telNo + ")");
			rtnCd = JCNStrConst.API_RETURN_CD_99;
		}
		else 
		{
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		
		if (!JCNStrConst.API_RETURN_CD_00.equals(rtnCd))
		{
			// リターンコードが00以外の場合は呼び出し元へ返却
			// Exception発生させてロールバック
			SCCallException scCallEx = new SCCallException("INVALID_RETURN_MESSAGE", rtnCd, status);
			throw scCallEx;
		}
		// ANK-4538-00-00 ADD END
		
		// 呼び出し元へ返却
		editReturnValue(userResult, rtnCd, telNo);
		setResultUserData(param, ccName, userResult);
		return param;

	}
	
	/**
	 * コンテンツ契約050番号発行SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private String callHakkoSc(SessionHandle handle, IRequestParameterReadWrite param ,Map<String, Object> ccParam) throws Throwable
	{
		// **************************************************
		// コンテンツ契約050番号発行SCの実行。
		// **************************************************
		 
		// リターンコード初期化
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		
		String templateId = TEMPLATE_CONT_KEI_050HAKKO;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// 入力SYSID
		paramIf.put(ECNA0070001CBSMsg.IN_SYS_ID , (String)ccParam.get(SVMAP_SYSID));
		
		// コンテンツ契約番号
		paramIf.put(ECNA0070001CBSMsg.CONT_KEI_NO, (String)ccParam.get(SVMAP_CONT_KEI_NO));
		
		// 050電話番号払出種別コード
		paramIf.put(ECNA0070001CBSMsg.TELNO_HRADSI_SBT_CD , telNoHrSbtCd);
		
		// 050電話番号
		paramIf.put(ECNA0070001CBSMsg.TELNO , inputTelNo);
		
		// SC呼出用パラメータ作成   機能コード="1"(チェックのみ)
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECNA0070001CBSMsg.class , paramIf, "1");

		// SC呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		// 結果取得
		rtnCd = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		int status = resultChkScStatus(result);
		
		// リターンコード、ステータスの内容を見て処理結果の判定を行う。
		if (!("0".equals(rtnCd) && 0 == status)) 
		{
			// リターンコード、ステータスが0でない場合、「エラーコード」を「結果コード」に変換
			rtnCd = rtnCdEdit(result);
		}
		else
		{
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		
		return rtnCd;
	}
	
	/**
	 * 050電話番号予約一覧照会SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callGetRsvListSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_050TEL_YOYAKU_ICHIRAN;;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// KEY_コンテンツ契約番号
		paramIf.put(EZM0181B030CBSMsg.KEY_CONT_KEI_NO, (String)ccParam.get(SVMAP_CONT_KEI_NO));
		
		// KEY_電話番号予約ステータス
		paramIf.put(EZM0181B030CBSMsg.KEY_TELNO_RSV_STAT, JCNStrConst.TELNO_RSV_STAT_RESERVED);
		
		// KEY_電話番号
		paramIf.put(EZM0181B030CBSMsg.KEY_TELNO, inputTelNo);

		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0181B030CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		return result;
	}
	
	/**
	 * SCの処理結果(リターンコード、ステータス、検索エラーフラグ)を判定します。
	 * <BR>
	 * @param result SCの戻り値
	 * @param searchErrFlgKey 検索エラーフラグの取得キー
	 * @return 処理結果(リターンコード、ステータス、検索エラーフラグにエラーがあれば"99")
	 */
	private String getSCReturnCd(Map<?, ?> result, String searchErrFlgKey)
	{
		// 検索エラーフラグの取得
		if (!"".equals(searchErrFlgKey))
		{
			CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg msg = templates[0];
	
			// 検索エラーの場合は「99」システムエラー
			String searchErrFlg = msg.getString(searchErrFlgKey);
			if ("1".equals(searchErrFlg))
			{
				return JCNStrConst.API_RETURN_CD_99;
			}
		}
		
		// 結果取得
		String rtnCd = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		int status = resultChkScStatus(result);
		if (!("0".equals(rtnCd) && 0 == status)) 
		{
			printErrorLog("コンテンツ契約050番号発行SCにてエラーが発生しました。");
			return JCNStrConst.API_RETURN_CD_99;
		}
		else
		{
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		
		return rtnCd;
	}
	
	/**
	 * コンテンツ契約050電話番号内訳本契約登録SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param inMap パラメータ
	 * @param aplSipUserId 050アプリSIPユーザーID
	 * @param 
	 * @return 処理結果
	 */
	private Map<?, ?> callUpdUcwkSc(SessionHandle handle, IRequestParameterReadWrite param ,Map<?,?> inMap,
										String aplSipUserId) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_CONT_KEI_050TEL_UCHIWAKE_ADD;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		String mapKey = "";

		// コンテンツ契約番号
		mapKey = ECN0331D002CBSMsg.CONT_KEI_NO;
		paramIf.put(mapKey, (String)inMap.get(EZM0181B030CBSMSG1LIST.RSV_MT_CONT_KEI_NO));

		// SYSID
		mapKey = ECN0331D002CBSMsg.SYSID;
		paramIf.put(mapKey, (String)inMap.get(EZM0181B030CBSMSG1LIST.YOYAKSHA_SYSID));
		
		// 050電話番号
		mapKey = ECN0331D002CBSMsg.N_050_TELNO;
		paramIf.put(mapKey, (String)inMap.get(EZM0181B030CBSMSG1LIST.TELNO));

		// 050アプリSIPユーザーID
		mapKey = ECN0331D002CBSMsg.N_050APL_SIP_USER_ID;
		paramIf.put(mapKey, aplSipUserId);
		
		// 050アプリSIPユーザパスワード
		// 設定しない
		
		// 050アプリ設定状態コード
		mapKey = ECN0331D002CBSMsg.N_050APL_SETTE_STAT_CD;
		if (N_050APL_HRADSI_SBT_CD_SINKI.equals(telNoHrSbtCd))
		{
			// 新規払出
			paramIf.put(mapKey, N_050APL_SETTE_STAT_CD_SINKI);
		}
		else if (N_050APL_HRADSI_SBT_CD_FUKKATU.equals(telNoHrSbtCd))
		{
			// 番号復活
			if ("".equals(SETTEIZUMI_SIPID)) {
				// 初期設定済みのSIPIDが見つからなければ、050アプリ設定状態コードは新規を設定する
				paramIf.put(mapKey, N_050APL_SETTE_STAT_CD_SINKI);
			} else {
				paramIf.put(mapKey, N_050APL_SETTE_STAT_CD_FUKKATU);
			}
		}

		// 050アプリ払出依頼コード
		mapKey = ECN0331D002CBSMsg.N_050APL_HRADSI_REQ_CD;
		paramIf.put(mapKey, (String)inMap.get(mapKey));
		
		// 050電話番号払出種別コード
		mapKey = ECN0331D002CBSMsg.N_050_TELNO_HRADSI_SBT_CD;
		paramIf.put(mapKey, (String)inMap.get(mapKey));

		// 050アプリ本人確認用電話番号
		// 設定しない
		
		// 利用端末環境情報
		// 設定しない
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0331D002CBSMsg.class, paramIf, "1");

		// SC呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		return result;
	}
	
	/**
	 * 電話番号予約削除(050IP電話アプリ用)SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callRmvRsvSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{
		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_TELNO_RSV_DEL_050;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// ＫＥＹ＿予約者SYSID
		paramIf.put(EZM0181E020CBSMsg.KEY_YOYAKSHA_SYSID, (String)ccParam.get(SVMAP_SYSID));

		// ＫＥＹ＿予約元コンテンツ契約番号
		paramIf.put(EZM0181E020CBSMsg.KEY_RSV_MT_CONT_KEI_NO, (String)ccParam.get(SVMAP_CONT_KEI_NO));
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0181E020CBSMsg.class, paramIf, "1");

		// SC呼出実行
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);

		return result;
	}
	
	/**
	 * エイジング対象登録SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param inMap パラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callRegAgingSc(SessionHandle handle, IRequestParameterReadWrite param, Map<?, ?> inMap) throws Throwable
	{

		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_AGING_ADD;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();

		// エイジング種別コード(電話番号(050IP電話アプリ))
		paramIf.put(EZM0111D010CBSMsg.AGING_SBT_CD, JCNStrConst.CD00412_050TELNO);

		// エイジング対象値(電話番号)
		paramIf.put(EZM0111D010CBSMsg.AGING_TG_VALUE, (String)inMap.get(EZM0181B030CBSMSG1LIST.TELNO));
		
		// 使用開始年月日時分秒
		// 設定しない
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0111D010CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		return result;
	}
	
	// ANK-4538-00-00 ADD START
	/**
	 * コンテンツ公的身分証管理対象登録SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param inMap パラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callRegCnkotkmbnsSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
	{

		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_CNKOTKMBNS_INSERT;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();

		// コンテンツ契約番号
		paramIf.put(ECN0341D010CBSMsg.CONT_KEI_NO, (String)ccParam.get(SVMAP_CONT_KEI_NO));
		
		// SYSID
		paramIf.put(ECN0341D010CBSMsg.SYSID, (String)ccParam.get(SVMAP_SYSID));
		
		// 身元確認ID
		paramIf.put(ECN0341D010CBSMsg.MIMOTCFM_ID, (String)ccParam.get(SVMAP_MIMOTCFM_ID));
		
		// 公的身分証確認ステータス "000"：未登録
		paramIf.put(ECN0341D010CBSMsg.KOTEKMBNS_CFM_STAT, "000");
		
		// 身元確認ID登録年月日
		paramIf.put(ECN0341D010CBSMsg.MIMOTCFM_ID_ADD_YMD, JCCBPCommon.getOpeDate( null));
		
		// 使用開始年月日時分秒
		// 設定しない
		
		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0341D010CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		return result;
	}
	// ANK-4538-00-00 ADD END
	
	/**
	 * SC呼出用のパラメータを作成します。
	 * <BR>
	 * @param param リクエストパラメータ
	 * @param templateId テンプレートID
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 * @param funcCode 機能コード
	 * @return SC呼出用パラメータ
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private static HashMap<String, Object> createScParam(IRequestParameterReadOnly param,
			String templateId, Class<?> cbsMsgClass , Map param4serviceIf, String funcCode) throws RequestParameterException
	{
		// 受け取ったリクエストパラメータを元に、ＳＣ呼出用の上りマップを生成
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		CAANMsg[] templates = new CAANMsg[1];
		CAANMsg template = new CAANMsg(cbsMsgClass.getName());

		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		Object clientHostName = param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME);
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, clientHostName);

		// 依頼元IPアドレス
		Object clientIPAddress = param.getControlMapData(SCControlMapKeys.REQ_HOSTIP);
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, clientIPAddress);

		// 依頼元画面ID
		Object clientViewId = param.getControlMapData(SCControlMapKeys.REQ_VIEWID);
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, clientViewId);

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// **********************************************
		// 【取得元：ユーザデータ
		// **********************************************

		// テンプレートIDのセット
		paramMap.put(JCMConstants.TEMPLATE_ID_KEY, templateId);
		template.set(JCMConstants.TEMPLATE_ID_KEY, templateId);
		template.set(JCMConstants.FUNC_CODE_KEY, funcCode);
		
		setNullOtherColumn(cbsMsgClass, param4serviceIf);
		
		// 入力パラメータのセット
		template.setMsgDataOfAll((HashMap)param4serviceIf);
		templates[0] = template;

		paramMap.put("templates", templates);

		return paramMap;
	}
	
	/**
	 * 050番号エイジング一覧照会SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param inMap パラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callGetAgingSc(SessionHandle handle, IRequestParameterReadWrite param, Map<?, ?> inMap) throws Throwable
	{

		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_050TEL_AGING_ICHIRAN;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// 050電話番号
		paramIf.put(EZM0111B070CBSMsg.KEY_N_050_TELNO, (String)inMap.get(EZM0181B030CBSMSG1LIST.TELNO));

		// エイジング種別コード
		paramIf.put(EZM0111B070CBSMsg.KEY_AGING_SBT_CD, JCNStrConst.CD00412_050TELNO);

		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0111B070CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		return result;
	}

	/**
	 * エイジング削除SCを実行します。
	 * <BR>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param inMap パラメータ
	 * @return 処理結果
	 */
	private Map<?, ?> callDelAgingSc(SessionHandle handle, IRequestParameterReadWrite param, Map<?, ?> inMap) throws Throwable
	{

		// **************************************************
		// 上りマッピング
		// **************************************************
		String templateId = TEMPLATE_AGING_DELETE;
		Map<Object, Object> paramIf = new HashMap<Object, Object>();
		
		// エイジング番号
		paramIf.put(EZM0111E010CBSMsg.AGING_NO, (String)inMap.get(EZM0111B070CBSMsg1List.AGING_NO));

		// エイジング種別コード
		paramIf.put(EZM0111E010CBSMsg.AGING_SBT_CD, (String)inMap.get(EZM0111B070CBSMsg1List.AGING_SBT_CD));

		// エイジング対象値(050電話番号)
		paramIf.put(EZM0111E010CBSMsg.AGING_TG_VALUE, (String)inMap.get(EZM0111B070CBSMsg1List.AGING_TG_VALUE));

		// 最終更新年月日時分秒
		paramIf.put(EZM0111E010CBSMsg.LAST_UPD_DTM_BF, (String)inMap.get(EZM0111B070CBSMsg1List.UPD_DTM));

		// SC呼出用パラメータ作成
		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0111E010CBSMsg.class ,paramIf, "1");

		// **************************************************
		// SC呼出実行                                     
		// **************************************************
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		return result;
	}

	
	/**
	 * コンテンツ契約050電話番号内訳一覧照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param ccParam CCパラメータマップ
	 * @param fukkatuNo 復活させた050電話番号
	 * @return 処理結果
	 * @throws Throwable
	 */
	private String callGetUcwkListSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam, String telNo) throws Throwable
	{
		String rtnCd = JCNStrConst.API_RETURN_CD_00;
		int status = 0;
		
		/***************************************************************/
		/** コンテンツ契約050電話番号内訳一覧照会SCへの上りマッピング  */
		/***************************************************************/
		String templateId = "ECN0331B001";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECN0331B001CBSMsg.KEY_SYSID, (String) ccParam.get("SYSID"));
		param4serviceIf.put(ECN0331B001CBSMsg.KEY_N_050_TELNO, telNo);
		
		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0331B001CBSMsg.class , param4serviceIf, "1");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// 処理結果判定
		rtnCd = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		status = resultChkScStatus(result);

		// 検索エラーフラグの取得
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		CAANMsg[] cbsMsgList = getResultMsgList(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST); 

		// 検索エラーフラグが存在するか？
		String serchErrFlg = msg.getString(ECN0331B001CBSMsg.SEARCH_ERR_FLG);
		if(("1".equals(serchErrFlg)) || ("2".equals(serchErrFlg)) ||("3".equals(serchErrFlg))||(cbsMsgList.length == 0))
		{
			// 復活番号の元ネタがないことは、エラーではない。
			return JCNStrConst.API_RETURN_CD_00;
		}

		
		if(!("0".equals(rtnCd) && 0 == status)) 
		{
			printErrorLog("コンテンツ契約050電話番号内訳一覧照会SCにてエラーが発生しました。" + "(rtnCode=" + rtnCd + ":status=" + status + ")");
			return JCNStrConst.API_RETURN_CD_99;
		} else {
			rtnCd = JCNStrConst.API_RETURN_CD_00;
		}
		

		// コンテンツ契約050電話番号内訳一覧照会SCではコンテンツ契約番号が昇順にソートされてるので、一番大きいものから取る。
		for (int i = cbsMsgList.length - 1; i >= 0; i--) 
		{
			// コンテンツ契約内訳の050アプリ設定状態コードを取得
			String n_050_AplSetteStatCd = getResultString(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST + "[" + i + "]" + "." 
					+  ECN0331B001CBSMsg1List.N_050APL_SETTE_STAT_CD);
			
			// コンテンツ契約内訳の050アプリ払い出し種別コードを取得
			String n_050_AplHradsiSbtCd = getResultString(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST + "[" + i + "]" + "." 
					+  ECN0331B001CBSMsg1List.N_050_TELNO_HRADSI_SBT_CD);
			
			// コンテンツ契約内訳のSIPIDを取得
			String n_050_AplSipUserID = getResultString(result, ECN0331B001CBSMsg.ECN0331B001CBSMSG1LIST + "[" + i + "]" + "." 
					+  ECN0331B001CBSMsg1List.N_050APL_SIP_USER_ID);
			
			if (JCNStrConst.N_050APL_SETTE_STAT_CD_SUMI.equals(n_050_AplSetteStatCd)) {
				// 初期設定済みのデータが見つかった！SIPIDを取得して処理終了
				SETTEIZUMI_SIPID = n_050_AplSipUserID;
				break;
			} else {
				// 初期設定未完了だが、同一050電話番号とSIPIDの新規契約が見つかったので、これより古い契約は参照してはいけない。
				if (JCNStrConst.N_050APL_HRADSI_SBT_CD_SINKI.equals(n_050_AplHradsiSbtCd)) {
					break;
				}
			}

			// 目的のデータが見つからなかった。
			SETTEIZUMI_SIPID = "";
		}
		
		return rtnCd;
	}

	/**
	 * 入力パラメータ値の指定がない項目にnullをセットします。
	 * <BR>
	 * @param cbsMsgClass CBSMsgクラス
	 * @param param4serviceIf サービスインターフェイス用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public static void setNullOtherColumn(Class<?> cbsMsgClass, Map param4serviceIf) 
	{
		try 
		{
			java.lang.reflect.Field fieldContents = cbsMsgClass.getDeclaredField("CONTENTS");
			fieldContents.setAccessible(true);
			Object[][] contents = (Object[][])fieldContents.get(cbsMsgClass);

			// サービスインターフェイスの列情報を取得
			Map<String, String> colInfo = new HashMap<String, String>();
			for (int i = 0; i < contents.length; i++) 
			{
				Object[] obj = contents[i]; 
				colInfo.put(obj[0].toString(), obj[1].toString()); 
			}

			// エラーフィールド(項目末尾が"_err"の項目)の定義されている項目を入力項目と見なし
			// 当該フィールドについて、パラメータ値の指定がない場合は項nullをセットする
			for (int i = 0; i < contents.length; i++) 
			{
				Object[] obj = contents[i];
				String errFieldName = obj[0].toString(); 
				if (errFieldName.matches(".*_err$"))
				{
					String fieldName = errFieldName.replaceAll("_err$", ""); 
					String colDataType = colInfo.get(fieldName);
					if (("String".equals(colDataType))||("Long".equals(colDataType))) 
					{
						// 指定がない項目にnullをセット
						if (!param4serviceIf.containsKey(fieldName))
						{
							param4serviceIf.put(fieldName, null); 
						}
					}
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}	
	
	/**
	 * SC処理結果(ステータス)を取得します。
	 * <BR>
	 * @param result オブジェクト名
	 */
	private int resultChkScStatus(Map<?, ?> result)
	{
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		return msg.getInt(JCMConstants.STATUS_INT_KEY);
	}
	
	/**
	 * 返却値を編集します。
	 * <BR>
	 * @param userResult 返却用Map
	 * @param returnCode 戻りコード
	 * @param telNo 050電話番号
	 */
	@SuppressWarnings("unchecked")
	private void editReturnValue(Map userResult, String returnCode, String telNo)
	{
		userResult.put(SVMAP_RETURN_CODE, returnCode);
		userResult.put(SVMAP_050_TELNO,	telNo);
	}
	
	/**
	 * リターンコードを設定します。
	 * <BR>
	 * @param map サービスIF処理結果
	 * @return rtnCd リターンコード
	 */
	private String rtnCdEdit(Map<?, ?> result)
	{
		String rtnCd = "";
		CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// エラー項目の抽出
		String sysIdErr = nullToBlank(msg.getString(ECNA0070001CBSMsg.IN_SYS_ID_ERR));
		String contKeiNoErr = nullToBlank(msg.getString(ECNA0070001CBSMsg.CONT_KEI_NO_ERR));
		String telNoHrSbErr = nullToBlank(msg.getString(ECNA0070001CBSMsg.TELNO_HRADSI_SBT_CD_ERR));
		String telNoErr = nullToBlank(msg.getString(ECNA0070001CBSMsg.TELNO_ERR));
		
		// SYSID
		if ("E1".equals(sysIdErr))
		{
			return JCNStrConst.API_RETURN_CD_10;
		}
		if ("E2".equals(sysIdErr))
		{
			return JCNStrConst.API_RETURN_CD_12;
		}
		if ("E4".equals(sysIdErr))
		{
			return JCNStrConst.API_RETURN_CD_12;
		}
		if ("E3".equals(sysIdErr))
		{
			return JCNStrConst.API_RETURN_CD_11;
		}
		if ("EA".equals(sysIdErr))
		{
			return JCNStrConst.API_RETURN_CD_51;
		}
		
		// コンテンツ契約番号
		if ("E1".equals(contKeiNoErr))
		{
			return JCNStrConst.API_RETURN_CD_13;
		}
		if ("E3".equals(contKeiNoErr))
		{
			return JCNStrConst.API_RETURN_CD_14;
		}
		if ("E2".equals(contKeiNoErr))
		{
			return JCNStrConst.API_RETURN_CD_15;
		}
		if ("E4".equals(contKeiNoErr))
		{
			return JCNStrConst.API_RETURN_CD_15;
		}
		if ("EA".equals(contKeiNoErr))
		{
			return JCNStrConst.API_RETURN_CD_52;
		}
		if ("EB".equals(contKeiNoErr))
		{
			return JCNStrConst.API_RETURN_CD_52;
		}

		// SYSID
		if ("EB".equals(sysIdErr))
		{
			return JCNStrConst.API_RETURN_CD_50;
		}

		// 050電話番号払出種別コード
		if ("E1".equals(telNoHrSbErr))
		{
			return JCNStrConst.API_RETURN_CD_16;
		}
		if ("E3".equals(telNoHrSbErr))
		{
			return JCNStrConst.API_RETURN_CD_17;
		}
		if ("E2".equals(telNoHrSbErr))
		{
			return JCNStrConst.API_RETURN_CD_18;
		}
		if ("E4".equals(telNoHrSbErr))
		{
			return JCNStrConst.API_RETURN_CD_18;
		}
		if ("EA".equals(telNoHrSbErr))
		{
			return JCNStrConst.API_RETURN_CD_54;
		}
		
		// 050電話番号
		if ("E1".equals(telNoErr))
		{
			return JCNStrConst.API_RETURN_CD_19;
		}
		if ("E3".equals(telNoErr))
		{
			return JCNStrConst.API_RETURN_CD_20;
		}
		if ("E2".equals(telNoErr))
		{
			return JCNStrConst.API_RETURN_CD_21;
		}
		if ("E4".equals(telNoErr))
		{
			return JCNStrConst.API_RETURN_CD_21;
		}
// 2015/08/24 ANK-2634-00-00 Add Start
		if ("EA".equals(telNoErr))
		{
			// エラーログにキー情報を出力する
			String contKeiNo = msg.getString(ECNA0070001CBSMsg.CONT_KEI_NO);
			String telno = msg.getString(ECNA0070001CBSMsg.TELNO);
			printErrorLog("コンテンツ契約050番号発行SCにて2重発番エラーが発生しました。" + "(KEY:CONT_KEI_NO=" + contKeiNo + ":N_050_TELNO=" + telno + ")");
			
			// ログに出力する電話番号をマスクする
			StringBuffer sb = new StringBuffer();
			if (telno.length() >= 7)
			{
				sb.append(telno.substring(0, 3));
				sb.append("****");
				sb.append(telno.substring(7));
			}
			
			// メッセージログ（システムログ）にメッセージID「EKBD910-KW」に該当するメッセージを出力する
			String message = "登録対象の電話番号は他契約で既に利用中の為、登録出来ません。" + "(KEY:コンテンツ契約番号=" + contKeiNo + ":電話番号=" + sb.toString() + ")";
			printSyslog4Err("CNIFE026","EKBD910-KW",message);
			
			return JCNStrConst.API_RETURN_CD_55;
		}
// 2015/08/24 ANK-2634-00-00 Add End
		
		return rtnCd;
	}	
		
	/**
     * 文字列がNullの場合空白を返します。Null出ない場合はそのまま返します。
	 * <BR>
     * @param str 対象文字列
     * @return 文字列がNullの場合空白、それ以外は元の値。
     */
	private static String nullToBlank(String str) 
	{
		if (str == null){
			return "";
		}
		return str;
	}	
	
}
