/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名     ：eo顧客基幹システム
*   モジュール名	：JKKContMskmInfoUpdCC
*   ソースファイル名 ：JKKContMskmInfoUpdCC.java
*   作成者          ：富士通
*   日付            ：2021年03月16日
*＜機能概要＞
*   コンテンツ同時申込更新部品です。
*＜修正履歴＞
*   バージョン  		修正日       修正者      修正内容
*   v53.00.00    	2021/04/29   GDC）ミコ    	【ANK-4009-00-00】CX戦略WG方針対応（異動シェア分・API）
*   v53.00.01    	2021/05/29   FJ)星野    	IT1-2021-0000043対応
*   v54.00.00    	2021/09/09   FJ)星野    	ST-2021-0000022対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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.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.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JCRStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECC0111D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0131B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0131B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B019CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B019CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3291B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK3291B010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK3291C010CBSMsg;

/**
 * @author 富士通
 */
public class JKKContMskmInfoUpdCC extends AbstractCommonComponent {

	/** エラー情報 */
	private static final String ERROR_INFO = "ERROR_INFO";
	/** エラーコード */
	private static final String ERROR_CODE = "errCode";
	/** エラーメッセージ */
	private static final String ERROR_MESSAGE = "errMessage";
	
	/** 請求契約番号 パラメータ名 */
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** 請求方法コード パラメータ名 */
	private static final String CONT_LIST = "cont_list";
	/** クレジットカード事業コード パラメータ名 */
	private static final String CONT_MSKM_NO = "cont_mskm_no";
	/** カードブランド パラメータ名 */
	private static final String UPD_DIV= "upd_div";
	/** クレジットカード番号 パラメータ名 */
	private static final String PAYWAY_ID = "payway_id"; 

	/** テンプレートID EKK0081A010 */
	private static final String TEMPLATE_ID_EKK0081A010 = "EKK0081A010";
	/** テンプレートID EKK0081B019 */
	private static final String TEMPLATE_ID_EKK0081B019 = "EKK0081B019";
	/** テンプレートID EKK0021A010 */
	private static final String TEMPLATE_ID_EKK0021A010 = "EKK0021A010";
	/** テンプレートID EKK3291B010 */
	private static final String TEMPLATE_ID_EKK3291B010 = "EKK3291B010";
	/** テンプレートID ECN0131B001 */
	private static final String TEMPLATE_ID_ECN0131B001 = "ECN0131B001";
	/** テンプレートID EKK3291C010 */
	private static final String TEMPLATE_ID_EKK3291C010 = "EKK3291C010";
	/** テンプレートID ECC0111D010 */
	private static final String TEMPLATE_ID_ECC0111D010 = "ECC0111D010";
	
	/** コンテンツ申込情報状態コード: 10：利用開始依頼済 */
	private static final String CONT_MKM_INF_STCD_10 = "10";
	/** コンテンツ申込情報状態コード: 90：取消済, */
	private static final String CONT_MKM_INF_STCD_90 = "90";
	/** 更新区分: 1 : 利用開始, */
	private static final String UPD_DIV_1 = "1";
	/** 更新区分: 9 : ：取消, */
	private static final String UPD_DIV_9 = "9";
	/** 更新区分: 9 : ：取消, */
	private static final String REQ_JOB_ID_EO40V0110J0 = "EO40V0110J0";
	/** ディレイド処理依頼種別コード 00000 */
	private static final String DLYD_TRN_REQ_SBT_CD_00000 = "00000";
	/** ファイル削除年月日 20991231 */
	private static final String FILE_DEL_YMD_20991231 = "20991231";
	/** 空文字 */
	private static final String EMPTY = "";
	/**  改行コード：CRLF */
	public static final String KAIGYO_CD = "\r\n";
	/**  カンマ区切り */
	private static final String CONMA = ",";
	/**  DOUBLE_QUOT */
	private static final String DOUBLE_QUOT = "\"";
	/** Unicode変換テーブル(MS932⇒EUC/Shift-JIS)*/
	private static final char[][] UNI_CONV_2 = {
		{ 0x2015, 0x2014 },
		{ 0x2225, 0x2016 },
		{ 0xff0d, 0x2212 },
		{ 0xff5e, 0x301c },
		{ 0xffe0, 0x00a2 },
		{ 0xffe1, 0x00a3 },
		{ 0xffe2, 0x00ac },
	};

	/**
	 * 取扱コード反映（営業支援）を行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return IRequestParameterReadWrite リクエストパラメータ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		
		ServiceComponentRequestInvoker scCall = null;
		Map<String, Object> ccMsg = (Map<String, Object>) param.getData(fixedText);
		CAANMsg[] workEKK0081A010 = null;
		CAANMsg[] workEKK0081B019 = null;
		CAANMsg[] workEKK0021A010 = null;
		CAANMsg[] workEKK3291B010 = null;
		String workSvcKeiNo = null;
		ArrayList workContList = null;
		String workMskmDtlNo = null;
		String workMskmNo = null;
		
		try
		{
			// リクエストからデータを取得する。
			workSvcKeiNo = (String) ccMsg.get(SVC_KEI_NO);
			workContList = (ArrayList) ccMsg.get(CONT_LIST);
			
			//  ---------------------- データチェック --------------------------
			// (1) 単項目チェック
			if (!checkUnitParam(ccMsg, workSvcKeiNo, workContList))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return param;
			}
			
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）。
			scCall = new ServiceComponentRequestInvoker();
			
			// (2) 存在チェック
			workEKK0081A010 = getEKK0081A010CAANMsg(handle, scCall, param, fixedText, workSvcKeiNo);

			if (!checkSvcKeiSonzai(ccMsg, workEKK0081A010, workSvcKeiNo))
			{
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
				return param;
			}
			// (3) サービス申込時サービス契約一覧照会サービスIF実行。
			workEKK0081B019 = getEKK0081B019CAANMsg(handle, scCall, param, fixedText, workSvcKeiNo);
			
			// (4)申込明細一意照会サービスIF実行
			if (workEKK0081B019 != null && workEKK0081B019.length > 0)
			{
				workMskmDtlNo = workEKK0081B019[0].getString(EKK0081B019CBSMsg1List.MSKM_DTL_NO);
				
				workEKK0021A010 = getEKK0021A010CAANMsg(handle, scCall, param, fixedText, workMskmDtlNo);
			}
			// (5) コンテンツ申込情報一覧照会サービスIF実行。
			if (workEKK0021A010 != null && workEKK0021A010.length > 0)
			{
				workMskmNo = workEKK0021A010[0].getString(EKK0021A010CBSMsg1List.MSKM_NO);
				
				workEKK3291B010 = getEKK3291B010CAANMsg(handle, scCall, param, fixedText, workMskmNo);
			}
			
			
			if (workContList != null)
			{
				// 繰り返し処理１：入力.「コンテンツリスト」の件数分繰り返す。
				for (int i = 0; i < workContList.size(); i++)
				{
					CAANMsg[] workECN0131B001 = null;
					CAANMsg workContCAANMsg = null;
					String workContMskmNo = null;
					String workContMkmInfStcd = null;
					String workUpdDiv = null;
					String workPaywayId = null;
					String workSysid = null;
					
					Map<Object,String> workContMap = (Map<Object,String>) workContList.get(i);
					
					if (workContMap != null)
					{
						
						workContMskmNo = workContMap.get(CONT_MSKM_NO);
						
						workContCAANMsg = getCAANMsgKeyValue(workEKK3291B010,EKK3291B010CBSMsg1List.CONT_MSKM_NO, workContMskmNo);
						
						// (6) 存在チェック
						if (!checkContMskmSonzai(ccMsg, workContCAANMsg, workContMskmNo))
						{
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
							param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
							return param;
						}
						
						// (7) 処理済チェック
						if (!checkContShoriSumi(ccMsg, workContCAANMsg, workContMskmNo))
						{
							param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
							param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
							return param;
						}
						
						workUpdDiv = workContMap.get(UPD_DIV);
						// 入力.「更新区分」 が、"1"：利用開始 または 未設定 の場合。
						
						if (UPD_DIV_1.equals(workUpdDiv) || (workUpdDiv == null || workUpdDiv.trim().isEmpty()))
						{
							// (8) 支払い方法入力支援一覧照会サービスIF実行。
							if (workEKK0081A010 != null && workEKK0081A010.length > 0)
							{
								workSysid = workEKK0081A010[0].getString(EKK0081A010CBSMsg1List.SYSID);
								workECN0131B001 = getECN0131B001CAANMsg(handle, scCall, param, fixedText, workSysid);
							}

							if (!checkShiHouSonzai(ccMsg, workECN0131B001, workContMskmNo))
							{
								param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
								param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
								return param;
							}
							// (9) 支払方法IDチェック
							workPaywayId = workContMap.get(PAYWAY_ID);
							
							if (!checkShiharaiHouhou(ccMsg, workECN0131B001, workContMskmNo, workPaywayId))
							{
								param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
								param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
								return param;
							}
						}
					}
					
					
				}
				// 繰り返し処理１：終了
				
				//  ------------------- データ更新  --------------------------
				
				//繰り返し処理２：入力.「コンテンツリスト」の件数分繰り返す。
				for (int i = 0; i < workContList.size(); i++)
				{
					Map<Object,String> workContMap = (Map<Object,String>) workContList.get(i);
					
					// (10) コンテンツ申込情報更新サービスIF実行。
					callEKK3291C010(handle, scCall, param, fixedText, workContMap, workEKK0021A010, workEKK3291B010);
					
				}
				// 繰り返し処理２：終了
				
				// IT1-2021-0000043対応 20210529 星野 ADD START
				//繰り返し処理３：入力.「コンテンツリスト」の件数分繰り返す。
				for (int i = 0; i < workContList.size(); i++)
				{
					Map<Object,String> workContMap = (Map<Object,String>) workContList.get(i);
					
					String updDiv = workContMap.get(UPD_DIV);
					if (JKKStringUtil.isNullBlank(updDiv) || UPD_DIV_1.equals(updDiv))
					{
						// (11) ディレイド処理依頼登録サービスIF実行。
						callECC0111D010(handle, scCall, param, fixedText, workContMap, workEKK0021A010, workEKK3291B010);
					}
				}
			// 繰り返し処理３：終了
//IT1-2021-0000043対応 20210529 星野 ADD END

			}
			
// IT1-2021-0000043対応 20210529 星野 DEL START
//			// (11) ディレイド処理依頼登録サービスIF実行。
//			callECC0111D010(handle, scCall, param, fixedText, workEKK0021A010, workEKK3291B010);
// IT1-2021-0000043対応 20210529 星野 DEL END
			
			
			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx)
		{
			// システムエラーを設定する
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
		}
		
		return param;
	}
	
	/**
	 * 単項目チェックを行い、チェック結果を返しま。
	 * <br>
	 * @param ccMsg
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(Map<String, Object> ccMsg, String svcKeiNo, ArrayList contList) throws Exception 
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();

		/* ------------------------- サービス契約番号 入力 パラメータ  -------------------------- */
		// 必須チェック 
		if (JKKStringUtil.isNullBlank(svcKeiNo))
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(SVC_KEI_NO));
		} 
		// 属性チェック 
		else if (!HalfCharCheck.isEnNumber1Check(svcKeiNo))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(SVC_KEI_NO, svcKeiNo));
		} 
		// 桁数チェック 
		else if (!LengthCheck.isLength1Check(svcKeiNo, 10))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(SVC_KEI_NO, svcKeiNo));
		}
		
		/* -------------------------- コンテンツリスト 入力 パラメータ  ----------------------- */
		// 必須チェック 
		if (contList == null || contList.size() == 0)
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(CONT_LIST));
		}
		else
		{
			for (int i=0; i < contList.size(); i++)
			{
				if (contList.get(i) != null)
				{
					Map<Object,String> contMap = (Map<Object,String>) contList.get(i);
						
					/* -------------- コンテンツ申込番号 入力 パラメータ ------------------ */
					String contMskmNo = contMap.get(CONT_MSKM_NO);
					// 必須チェック 
					if (JKKStringUtil.isNullBlank(contMskmNo))
					{
						// 必須チェックエラー
						errList.add(getReqErrInfMap(CONT_MSKM_NO));
					} 
					// 属性チェック 
					else if (!HalfCharCheck.isEnNumber1Check(contMskmNo))
					{
						// 属性チェックエラー
						errList.add(getFormErrInfMap(CONT_MSKM_NO, contMskmNo));
					} 
					// 桁数チェック 
					else if (!LengthCheck.isLength1Check(contMskmNo, 10))
					{
						// 桁数チェックエラー
						errList.add(getLenErrInfMap(CONT_MSKM_NO, contMskmNo));
					}
					
					/* --------------  更新区分 入力 パラメータ --------------------- */
					String updDiv = contMap.get(UPD_DIV);
					
					if (!JKKStringUtil.isNullBlank(updDiv)) {
						// 属性チェック 
						if (!HalfCharCheck.isEnNumber1Check(updDiv))
						{
							// 属性チェックエラー
							errList.add(getFormErrInfMap(UPD_DIV, updDiv));
						} 
						// 桁数チェック 
						else if (!LengthCheck.isLength1Check(updDiv, 1))
						{
							// 桁数チェックエラー
							errList.add(getLenErrInfMap(UPD_DIV, updDiv));
						}
					}
					
					/* --------------  支払方法ID 入力 パラメータ ------------------- */
					String paywayId = contMap.get(PAYWAY_ID);
					
					if (!JKKStringUtil.isNullBlank(paywayId)) {
						// 属性チェック 
						if (!HalfCharCheck.isEnNumber1Check(paywayId))
						{
							// 属性チェックエラー
							errList.add(getFormErrInfMap(PAYWAY_ID, paywayId));
						} 
						// 桁数チェック 
						else if (!LengthCheck.isLength2Check(paywayId, 9, 10))
						{
							// 桁数チェックエラー
							errList.add(getLenErrInfMap(PAYWAY_ID, paywayId));
						}
					}
				}
			}
		}
		
		/* エラーが存在する場合 */
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}
	
	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 必須エラーマップ
	 */
	private Map<String, String> getReqErrInfMap(String itemName)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON;

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1001);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}

	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 属性エラーマップ
	 */
	private Map<String, String> getFormErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1002);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}

	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 数エラーマップ
	 */
	private Map<String, String> getLenErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;

		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1003);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}
	
	/**
	 * 存在チェックの関連エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 関連エラーマップ 
	 */
	private Map<String, String> getExstErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1101);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}
	
	/**
	 * 処理済チェックの関連エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 関連エラーマップ 
	 */
	private Map<String, String> getProcErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1102);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}
	
	/**
	 * 支払い方法チェックの関連エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 関連エラーマップ 
	 */
	private Map<String, String> getPaywErrInfMap(String itemName, String itemValue)
	{
		Map<String, String> returnMap = new HashMap<String, String>();

		// エラーメッセージ設定
		String errMessage = itemName + JKKStrConst.COLON + itemValue;
		
		returnMap.put(ERROR_CODE, JKKStrConst.RETURN_CD_1103);
		returnMap.put(ERROR_MESSAGE, errMessage);

		return returnMap;
	}
	
	/**
	 * 単項目チェックの関連エラーマップ作成メソッドです。
	 * <br>
	 * @param itemName 項目名
	 * @return 関連エラーマップ 
	 */
	private CAANMsg getCAANMsgKeyValue(CAANMsg[] caanMsg1List, String key, String value)
	{
		CAANMsg caanMsg = null;

		for(int i = 0; i < caanMsg1List.length; i++)
		{
			String workValue = caanMsg1List[i].getString(key);
			
			if (!JKKStringUtil.isNullBlank(workValue) && workValue.equals(value))
			{
				return caanMsg1List[i];
			}
			
		}
		return caanMsg;
	}
	/**
	 * サービス契約存在チェックをします。
	 * <br>
	 * @param itemName 項目名
	 * @return チェックの判定
	 */
	private boolean checkSvcKeiSonzai(Map<String, Object> ccMsg, CAANMsg[] workEKK0081A010, String svcKeiNo) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		/* 検索結果なしの場合 */
		if (workEKK0081A010 == null || workEKK0081A010.length == 0)
		{
			// 存在チェックエラーの場合は以下のエラーコードとエラーメッセージを設定する。
			errList.add(getExstErrInfMap(SVC_KEI_NO, svcKeiNo));
			ccMsg.put(ERROR_INFO, errList);
			
			return false;
		}
		return true;
	}
	/**
	 * サービス契約存在チェックをします。
	 * <br>
	 * @param itemName 項目名
	 * @return チェックの判定
	 */
	private boolean checkContMskmSonzai(Map<String, Object> ccMsg, CAANMsg caanMsg, String paramContMskmNo) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		/* 検索結果なしの場合 */
		if (caanMsg == null)
		{
			// 存在チェックエラーの場合は以下のエラーコードとエラーメッセージを設定する。
			errList.add(getExstErrInfMap(CONT_MSKM_NO, paramContMskmNo));
			ccMsg.put(ERROR_INFO, errList);
			
			return false;
		}
		/* 検索結果ありの場合 */
		else 
		{
			String workContMskmNo = caanMsg.getString(EKK3291B010CBSMsg1List.CONT_MSKM_NO);
				
			if (JKKStringUtil.isNullBlank(workContMskmNo) || !workContMskmNo.equals(paramContMskmNo))
			{
				// 存在チェックエラーの場合は以下のエラーコードとエラーメッセージを設定する。
				errList.add(getExstErrInfMap(CONT_MSKM_NO, paramContMskmNo));
				ccMsg.put(ERROR_INFO, errList);
					
				return false;
			}
				
			return true;
		}
	}
	
	/**
	 * 処理済チェックをします。
	 * <br>
	 * @param itemName 項目名
	 * @return チェックの判定
	 */
	private boolean checkContShoriSumi(Map<String, Object> ccMsg, CAANMsg caanMsg, String workContMskmNo) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		/* 検索結果なしの場合 */
		if (caanMsg != null)
		{
			String EKK3291B010ContMskmNo = caanMsg.getString(EKK3291B010CBSMsg1List.CONT_MSKM_NO);
				
			if (!JKKStringUtil.isNullBlank(EKK3291B010ContMskmNo) && EKK3291B010ContMskmNo.equals(workContMskmNo))
			{
				String workContMkmInfStcd = caanMsg.getString(EKK3291B010CBSMsg1List.CONT_MKM_INF_STCD);
					
				if (CONT_MKM_INF_STCD_10.equals(workContMkmInfStcd) || CONT_MKM_INF_STCD_90.equals(workContMkmInfStcd) )
				{
					// 処理済チェックエラーの場合は以下のエラーコードとエラーメッセージを設定する。
					errList.add(getProcErrInfMap(CONT_MSKM_NO, workContMskmNo));
					ccMsg.put(ERROR_INFO, errList);
						
					return false;
				}
			}
		}
		return true;
	}
	/**
	 * 支払い方法存在チェックをします。
	 * <br>
	 * @param itemName 項目名
	 * @return チェックの判定
	 */
	private boolean checkShiHouSonzai(Map<String, Object> ccMsg, CAANMsg[] workECN0131B001, String workContMskmNo) throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		/* 検索結果なしの場合 */
		if (workECN0131B001 == null || workECN0131B001.length == 0)
		{
			//  支払い方法存在エラーの場合は以下のエラーコードとエラーメッセージを設定する。
			errList.add(getPaywErrInfMap(CONT_MSKM_NO, workContMskmNo));
			ccMsg.put(ERROR_INFO, errList);
				
			return false;
		}
		return true;
	}
	/**
	 * 支払い方法チェックをします。
	 * <br>
	 * @param itemName 項目名
	 * @return チェックの判定
	 */
	private boolean checkShiharaiHouhou(Map<String, Object> ccMsg, 
			CAANMsg[] workECN0131B001, 
			String workContMskmNo, 
			String workPaywayId) throws Exception
	{
		
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		
		
		/* 検索結果なしの場合 */
		if (workECN0131B001 == null || workECN0131B001.length == 0)
		{
			// 支払い方法チクエラーの場合は以下のエラーコードとエラーメッセージを設定する。
			errList.add(getPaywErrInfMap(CONT_MSKM_NO, workContMskmNo));
			ccMsg.put(ERROR_INFO, errList);
						
			return false;
		}
		else
		{
// ST-2021-0000022対応 20210909 星野 MOD START
//			String crecardId = workECN0131B001[0].getString(ECN0131B001CBSMsg1List.CRECARD_ID);
//			
//			if (crecardId == null || crecardId.isEmpty() || !crecardId.equals(workPaywayId))
//			{
			
			boolean checkResult = false;
			for(CAANMsg ecn0131b001Msg : workECN0131B001)
			{
				String crecardId = ecn0131b001Msg.getString(ECN0131B001CBSMsg1List.CRECARD_ID);
				if (crecardId != null && !crecardId.isEmpty() && crecardId.equals(workPaywayId))
				{
					checkResult = true;
					break;
				}
			}
			
			if (!checkResult)
			{
// ST-2021-0000022対応 20210909 星野 MOD END
				// 処理済チェックエラーの場合は以下のエラーコードとエラーメッセージを設定する。
				errList.add(getPaywErrInfMap(CONT_MSKM_NO, workContMskmNo));
				ccMsg.put(ERROR_INFO, errList);
				
				return false;
			}
		}
		return true;
	}
	
	/**
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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());

		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));

		// オペレータ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));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			/* CAANMsg[]の場合 */
			if (mappingData[i][1] instanceof CAANMsg[])
			{
				 template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			/* CAANMsg[]の以外 */
			else
			{
				/* nullの場合*/
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				/* 他の場合*/
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @param mappingData
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String fixedText,
														Object[][] mappingData) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		/* 0以外のとき */
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		/* nullのとき */
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		/* nullの場合 */
		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<String, String> inMap = null;

		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(fixedText);
		
		for (int i = 0; i < mappingData.length; i++)
		{
			/* nullチェック　*/
			if (!template.isNull(mappingData[i][0] + "_err"))
			{
				/* ユーザデータ情報にエラーを確認する　*/
				if (!inMap.containsKey(mappingData[i][0] + "_err"))
				{
					inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
				}
			}
		}
		return param;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String fixedText,
							Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, fixedText, mappingData);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		
		/* エラー情報のマップないとき、新しいエラー情報をイニシャライズする*/
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		/* 異常の場合、SCCallExceptionを生成してスローする */
		if (!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}
	/**
	 * サービス契約一意照会IF実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @return CAANMsg[]
	 */
	private CAANMsg[] getEKK0081A010CAANMsg(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
			String workSvcKeiNo) throws Exception 
	{
		
		CAANMsg[] result = null;
		CAANMsg ekk0081a010Msg = null;
		
		// サービス契約一意照会の上りマッピング
		Object[][] ekk0081a010 =
		{
			{EKK0081A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081A010},
			{EKK0081A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			{EKK0081A010CBSMsg.KEY_SVC_KEI_NO, JKKStringUtil.nullToBlank(workSvcKeiNo)},
			{EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
		};
		
		// サービスIF実行
		ekk0081a010Msg = callSC(handle, scCall, param, fixedText, ekk0081a010);
		result = ekk0081a010Msg.getCAANMsgList(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		
		return result;
	}
	
	/**
	 * サービス申込時サービス契約一覧照会IFの実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param ccMsg
	 * @return CAANMsg[]
	 */
	private CAANMsg[] getEKK0081B019CAANMsg(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
			String workSvcKeiNo) throws Exception 
	{
		
		CAANMsg[] result = null;
		CAANMsg ekk0081b019Msg = null;
		
		// サービス申込時サービス契約一覧照会の上りマッピング
		Object[][] ekk0081b019 =
		{
			{EKK0081B019CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B019},
			{EKK0081B019CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			{EKK0081B019CBSMsg.KEY_SVC_KEI_NO, JKKStringUtil.nullToBlank(workSvcKeiNo)},
		};
		
		// サービスIF実行
		ekk0081b019Msg = callSC(handle, scCall, param, fixedText, ekk0081b019);
		result = ekk0081b019Msg.getCAANMsgList(EKK0081B019CBSMsg.EKK0081B019CBSMSG1LIST);
		
		return result;
	}
	/**
	 * 申込明細一意照会IFの実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mskmDtlNo
	 * @return CAANMsg[]
	 */
	private CAANMsg[] getEKK0021A010CAANMsg(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
			String mskmDtlNo) throws Exception 
	{
		
		CAANMsg[] result = null;
		CAANMsg ekk0021a010Msg = null;
		
		// 申込明細一意照会IFの上りマッピング
		Object[][] ekk0021a010 =
		{
			{EKK0021A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021A010},
			{EKK0021A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2},
			{EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, JKKStringUtil.nullToBlank(mskmDtlNo)},
		};
		
		// サービスIF実行
		ekk0021a010Msg = callSC(handle, scCall, param, fixedText, ekk0021a010);
		result = ekk0021a010Msg.getCAANMsgList(EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST);
		
		return result;
	}
	/**
	 * コンテンツ申込情報一覧照会IFの実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param mskmNo
	 * @return CAANMsg[]
	 */
	private CAANMsg[] getEKK3291B010CAANMsg(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
			String mskmNo) throws Exception 
	{
		
		CAANMsg[] result = null;
		CAANMsg ekk3291b010Msg = null;
		
		// コンテンツ申込情報一覧照会
		Object[][] ekk3291b010 =
		{
			{EKK3291B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3291B010},
			{EKK3291B010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			{EKK3291B010CBSMsg.KEY_MSKM_NO, JKKStringUtil.nullToBlank(mskmNo)},
		};
		
		// サービスIF実行
		ekk3291b010Msg = callSC(handle, scCall, param, fixedText, ekk3291b010);
		result = ekk3291b010Msg.getCAANMsgList(EKK3291B010CBSMsg.EKK3291B010CBSMSG1LIST);
		
		return result;
	}
	/**
	 * 支払い方法入力支援一覧照会IFの実行の結果を返す。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @return CAANMsg[]
	 */
	private CAANMsg[] getECN0131B001CAANMsg(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
			String sysid) throws Exception 
	{
		
		CAANMsg[] result = null;
		CAANMsg ecn0131b001Msg = null;
		
		// 支払い方法入力支援一覧照会の上りマッピング
		Object[][] ecn0131b001 =
		{
			{ECN0131B001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECN0131B001},
			{ECN0131B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			{ECN0131B001CBSMsg.KEY_SYSID, JKKStringUtil.nullToBlank(sysid)},
		};
		
		// サービスIF実行
		ecn0131b001Msg = callSC(handle, scCall, param, fixedText, ecn0131b001);
		result = ecn0131b001Msg.getCAANMsgList(ECN0131B001CBSMsg.ECN0131B001CBSMSG1LIST);
		
		return result;
	}
	/**
	 * コンテンツ申込情報更新サービスを実行。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 */
	private void callEKK3291C010(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
			Map<Object,String>  workContMap,
			CAANMsg[] workEKK0021A010, 
			CAANMsg[] workEKK3291B010) throws Exception 
	{
		CAANMsg workContCAANMsg = null;
		String contMskmNo = null;
		String mskmNo = null;
		String contSvcCd = null;
		String contMkmInfStcd = null;
		String paywayId = null;
		String updDiv = null;
		String updDtmBf = null;
		String paramContMskmNo = null;
		
		updDiv = workContMap.get(UPD_DIV);
		paramContMskmNo = workContMap.get(CONT_MSKM_NO);
		
		if (workEKK0021A010 != null && workEKK0021A010.length != 0)
		{
			mskmNo = workEKK0021A010[0].getString(EKK0021A010CBSMsg1List.MSKM_NO);
		}
		if (workEKK3291B010 != null && workEKK3291B010.length != 0)
		{
			workContCAANMsg = getCAANMsgKeyValue(workEKK3291B010,EKK3291B010CBSMsg1List.CONT_MSKM_NO, paramContMskmNo);
			if(workContCAANMsg != null)
			{
				contMskmNo = workContCAANMsg.getString(EKK3291B010CBSMsg1List.CONT_MSKM_NO);
				contSvcCd = workContCAANMsg.getString(EKK3291B010CBSMsg1List.CONT_SVC_CD);
				contMkmInfStcd = workContCAANMsg.getString(EKK3291B010CBSMsg1List.CONT_MKM_INF_STCD);
				paywayId = workContCAANMsg.getString(EKK3291B010CBSMsg1List.PAYWAY_ID);
				updDtmBf = workContCAANMsg.getString(EKK3291B010CBSMsg1List.UPD_DTM);
			}
		}
		if (JKKStringUtil.isNullBlank(updDiv) || UPD_DIV_1.equals(updDiv))
		{
			contMkmInfStcd = CONT_MKM_INF_STCD_10;
			paywayId = workContMap.get(PAYWAY_ID);
		}
		else if (UPD_DIV_9.equals(updDiv))
		{
			contMkmInfStcd = CONT_MKM_INF_STCD_90;
		}
		
		// コンテンツ申込情報更新サービスの上りマッピング
		Object[][] ekk3291c010 =
		{
			{EKK3291C010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3291C010},
			{EKK3291C010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			{EKK3291C010CBSMsg.CONT_MSKM_NO, JKKStringUtil.nullToBlank(contMskmNo)},
			{EKK3291C010CBSMsg.MSKM_NO, JKKStringUtil.nullToBlank(mskmNo)},
			{EKK3291C010CBSMsg.CONT_SVC_CD, JKKStringUtil.nullToBlank(contSvcCd)},
			{EKK3291C010CBSMsg.CONT_MKM_INF_STCD, JKKStringUtil.nullToBlank(contMkmInfStcd)},
			{EKK3291C010CBSMsg.PAYWAY_ID, JKKStringUtil.nullToBlank(paywayId)},
			{EKK3291C010CBSMsg.UPD_DTM_BF, JKKStringUtil.nullToBlank(updDtmBf)},
		};
		
		// サービスIF実行
		callSC(handle, scCall, param, fixedText, ekk3291c010);
	}
	/**
	 * コンテンツ申込情報更新サービスを実行。
	 * <br>
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @throws Throwable 
	 */
	private void callECC0111D010(SessionHandle handle, 
			ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, 
			String fixedText,
// IT1-2021-0000043対応 20210529 星野 ADD START
			Map<Object,String>  workContMap,
// IT1-2021-0000043対応 20210529 星野 ADD END
			CAANMsg[] workEKK0021A010, 
			CAANMsg[] workEKK3291B010) throws Throwable 
	{
		String mskmNo = null;
		String contSvcCd = null;
		
		if (workEKK0021A010 != null && workEKK0021A010.length != 0)
		{
			mskmNo = workEKK0021A010[0].getString(EKK0021A010CBSMsg1List.MSKM_NO);
		}
		if (workEKK3291B010 != null && workEKK3291B010.length != 0)
		{
// IT1-2021-0000043対応 20210529 星野 MOD START
//			contSvcCd = workEKK3291B010[0].getString(EKK3291B010CBSMsg1List.CONT_SVC_CD);
			
			// 入力のコンテンツ申込番号に対応するコンテンツサービスコードを取得
			CAANMsg workContCAANMsg = getCAANMsgKeyValue(workEKK3291B010,EKK3291B010CBSMsg1List.CONT_MSKM_NO, workContMap.get(CONT_MSKM_NO) );
			if(workContCAANMsg != null)
			{
				contSvcCd = workContCAANMsg.getString(EKK3291B010CBSMsg1List.CONT_SVC_CD);
			}
// IT1-2021-0000043対応 20210529 星野 MOD END
		}
		
		// コンテンツ申込情報更新サービスの上りマッピング
		Object[][] ecc0111d010 =
		{
			{ECC0111D010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECC0111D010},
			{ECC0111D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1},
			{ECC0111D010CBSMsg.REQ_JOB_ID, REQ_JOB_ID_EO40V0110J0},
			{ECC0111D010CBSMsg.DLYD_TRN_REQ_SBT_CD, DLYD_TRN_REQ_SBT_CD_00000},
			{ECC0111D010CBSMsg.EFILE, editMetaFile(mskmNo,contSvcCd)},
			{ECC0111D010CBSMsg.FILE_DEL_YMD, FILE_DEL_YMD_20991231}
		};
		
		// サービスIF実行
		callSC(handle, scCall, param, fixedText, ecc0111d010);
	}

	/**
	 * 資料送付登録ファイル生成処理<br>
	 * <br>
	 * @param mskmNo 申込番号
	 * @param contSvcCd コンテンツサービスコード
	 * @throws Throwable 例外が発生した場合
	 */
	private byte[] editMetaFile(String mskmNo, String contSvcCd)
	throws Throwable
	{
		try
		{
			byte[] fileByte = new byte[0];

			StringBuffer sb = new StringBuffer();
			
			sb.append(DOUBLE_QUOT + replaceKaigyo(JKKStringUtil.nullToBlank(mskmNo)) + DOUBLE_QUOT ) 				// 申込番号
			  .append(CONMA + DOUBLE_QUOT + replaceKaigyo(JKKStringUtil.nullToBlank(contSvcCd) + DOUBLE_QUOT )); 	// コンテンツサービスコード
			
			// 改行
			sb.append(JCRStrConst.KAIGYO_CD);
			
			// 文字コード変換
			String txtData = charConverter(sb.toString(), "Shift-JIS");

			fileByte = txtData.getBytes("Shift_JIS");

			return fileByte;
		}
		catch (UnsupportedEncodingException e)
		{
			return null;
		}
	}
 	/**
	 * 文字列内の改行コード変換メソッドです。
	 * 
	 * @param string1 判定対象文字列
	 * @return string2 返却対象文字列
	 */
	public static String replaceKaigyo(String string1)
	{
		String string2 = "";
		// 改行コードがCRLFの場合
		if ( string1.contains(JCRStrConst.KAIGYO_CD))
		{
			string2 = string1;
		}
		// 改行コードがLFの場合、CRLFに変換する
		else if (string1.contains(JCRStrConst.KAIGYO_CD_LF))
		{
			string2 = string1.replaceAll(JCRStrConst.KAIGYO_CD_LF, JCRStrConst.KAIGYO_CD);
		}
		// 改行コードが存在しない場合
		else
		{
			string2 = string1;
		}
		
		return string2;
	}
	/**
	 * 文字コードの変換を行います。<br>
	 * Unicodeコードポイントの強制変換します。
	 * <br>
	 * @param value コード変換対象の文字列
	 * @param charCode 出力する文字コードを「Shift-JIS」で指定する。<br>
	 * 
	 * @return 変換後の文字列
	 */
	private String charConverter(String value, String charCode)
	{
			return changeUnicode(value, UNI_CONV_2);
	}
	/**
	 * Unicodeの強制変換を行います。
	 * <br>
	 * @param arg0 変換対象の文字列
	 * @param convList Unicode変換定義
	 * @return 変換後文字列
	 */
	private String changeUnicode(String arg0, char[][] convList)
	{
		if (JKKStringUtil.isNullBlank(arg0))
		{
			return arg0;
		}

		char[] chars = arg0.toCharArray();

		for (int i = 0; i < chars.length; i++)
		{
			chars[i] = transUnicode(chars[i], convList);
		}

		return new String(chars);
	}
	/**
	 * 指定された変換定義に従ってUnicodeの強制変換を行います。
	 * <br>
	 * @param c Unicode変換する文字
	 * @param convList Unicode変換定義
	 * @return Unicode変換された文字
	 */
	private char transUnicode(char c, char[][] convList)
	{
		for (int i = 0; i < convList.length; i++)
		{
			char[] chars = convList[i];

			if (chars[0] == c)
			{
				return chars[1];
			}
		}

		return c;
	}
}
