/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCNSV902801CC
*   ソースファイル名：JCNSV902801CC.java
*   作成者          ：富士通
*   日付            ：2011年12月10日
*＜機能概要＞
*  指定されたSYSIDの標準コンテンツを解約します。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/10   FJ）池田    新規作成
*   v5.00.00    2013/02/21   FJ）小林    【IT1-2013-0000316】水平展開、CCMGAPIエラーハンドリング対応
*   v5.00.01    2013/03/22   FJ）味岡    【OT-2013-0000308】eoID初期化S-IFのパラメータ追加対応
*   v5.00.02    2013/03/23   FJ）小林    【IT1-2013-0000604】お客様グループ設定の取得処理をお客様退会処理前に変更
*   v27.00.00   2016/11/07   FJ) 澤田    ANK-2987-08-00対応 
*   v47.00.00   2019/12/19   FJ)三原     【ANK-3706-00-00】ｅｏＩＤログインのセキュリティ強化対応
*   v54.00.00   2021/08/04   FJ)南       【OM-2020-0001148】お客様状態遷移チェックエラーメッセージ出力対応
*	v65.00.00	2023/12/20   FJ)北村     【ANK-4346-00-00】【eo定期】CCMG再構築対応
*   v70.00.00	2024/03/15	 FJ)中原	 【#84105】SIFエラーがＣＣＭＧエラーとして表示される
**********************************************************************/

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.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CNSV0028_CNSV0028OP_CNSV002801CC;
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.ICommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.sc.exception.SCException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.ErrorInfoMapKeys;
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 eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011B120CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B120CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0011C020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011C180CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0021C010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0031C010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0121B020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0121B020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0141C030CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0151D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0021B004CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0021B004CBSMsgList;
import eo.ejb.cbs.cbsmsg.ECNA0010003CBSMsg;
import eo.ejb.cbs.cbsmsg.ECNA0210001CBSMsg;

/**
 * 指定されたSYSIDの標準コンテンツを解約します。
 * <BR>
 * @ author 富士通
 */
public class JCNSV002801CC extends AbstractCommonComponent implements ICommonComponent
{
	/** 当CCの内部でしか使わないエラーコード */
	private static final String DSL_ERR_OTHER = "OTHER";
	
	private static final String NO_KEI_DATA = "92";

	/**
	 * 標準コンテンツ解約メイン処理。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeMain(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 入力パラメータ取得
		Map inMap = (Map)param.getData(fixedText);
		String sysid = (String)inMap.get(CNSV0028_CNSV0028OP_CNSV002801CC.SYSID);
		String ckUpdDtm = (String)inMap.get(CNSV0028_CNSV0028OP_CNSV002801CC.CK_UPD_DTM);
		String kkUpdDtm = (String)inMap.get(CNSV0028_CNSV0028OP_CNSV002801CC.KK_UPD_DTM);
		String userId = (String)inMap.get(CNSV0028_CNSV0028OP_CNSV002801CC.USER_ID);
		String userNm = (String)inMap.get(CNSV0028_CNSV0028OP_CNSV002801CC.USER_NM);

		// リターンコード初期化
		String returnCd = DSL_NORMAL_END;

		//***************************************************
		// 内部で使用する変数の初期化
		//***************************************************
		String opeDate = JCCBPCommon.getOpeDate(null);
		Map<String, Object> custInfo = new HashMap<String, Object>();
		CAANMsg custResultMsg = null;
		String contCustNm = null;
		String contCustNmKana = null;
		String updDtmSysid = null;
		String memberSbtCd = null;
		String eoid = null;
		String shkEoidPwd = null;
		String nkname = null;
		String shkEoid = null;
		String svcKeiNo = null;
		String updDtmSvcKei = null;
		String rrkNoMlad = null;
		String keishaTypeCd = null;
		String rrksNoContTelno = null;
		String mlad = null;
		// ANK-3706-00-00 ADD START
		String keishaTelno = "";
		// ANK-3706-00-00 ADD END
		
		// OM-2020-0001148 ADD START
		String workErrFlg = null;
		// OM-2020-0001148 ADD END

		//***************************************************
		// PMP連携用排他制御
		//***************************************************
// ANK-4346-00-00 MOD START
		Map result = null;
//		Map result = callECNA0010003(handle, param, sysid, "1");
//		if (isSuccess(result))
//		{
//			 String errFlg = getResultString(result, ECNA0010003CBSMsg.LOC_ERR_FLG);
//			if (!"0".equals(errFlg))
//			{
//				returnCd = DSL_ERR_EXCLUSION;
//			}
//		}
//		else
//		{
//			returnCd = DSL_ERR_OTHER;
//		}
// ANK-4346-00-00 DEL END

		//***************************************************
		// 最終更新日時チェック
		//***************************************************
		String lastCkUpdDtm = null;
		String lastKkUpdDtm = null;
// ANK-4346-00-00 MOD START
		updDtmSysid = (String)inMap.get(CNSV0028_CNSV0028OP_CNSV002801CC.CK_UPD_DTM);
//		if (JCNBPCommon.inArray(returnCd, DSL_NORMAL_END, DSL_ERR_EXCLUSION))
//		{
//			result = callECN0021B004(handle, param, sysid);
//			if (isSuccess(result))
//			{
//				String mapKeyPre = ECN0021B004CBSMsg.ECN0021B004CBSMSGLIST + "[0].";
//				
//				String chkKkUpdDtm = getResultString(result, mapKeyPre + ECN0021B004CBSMsgList.UPD_DTM);
//				
//				updDtmSysid = ckUpdDtm;
//				if ((!kkUpdDtm.equals(chkKkUpdDtm)) || DSL_ERR_EXCLUSION.equals(returnCd))
//				{
//					if ((chkKkUpdDtm != null))
//					{
//						lastKkUpdDtm = chkKkUpdDtm;
//						returnCd = DSL_ERR_EXCLUSION;   // 更新日時が異なる時は排他エラー
//					}
//					else
//					{
//						returnCd = DSL_ERR_NODATA;   // 該当データが存在しない場合はデータ無しエラー
//					}
//				}
//			}
//			else
//			{
//				returnCd = DSL_ERR_OTHER;   // その他のエラー
//			}
//		}
// ANK-4346-00-00 DEL END

		//***************************************************
		// お客様情報取得
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			result = callECK0011B050(handle, param, "1", sysid);
			if (isSuccess(result))
			{
				
				CAANMsg[] dataList = getResultMsgList(result, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
				if ((dataList == null) || (dataList.length == 0))
				{
					returnCd = DSL_ERR_NODATA;   // データなし
				}
				else
				{
					// お客様情報照会(PMP連携用)結果を取得
					custResultMsg = getResultMsgList(result, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST)[0];
					// お客様情報照会(PMP連携用)結果マップを取得
					custInfo = copyMsgToMap(custResultMsg, ECK0011B050CBSMsg1List.class, ECK0011B050CBSMsg1List.class);
					String mapKeyPre = ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST + "[0].";
					contCustNm = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CONT_CUST_NM);
					contCustNmKana = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.CONT_CUST_KANA);
					memberSbtCd = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.MEMBER_SBT_CD);
					eoid = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.EOID);
					nkname = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.NKNAME);
					shkEoid = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.SHK_EOID);
					shkEoidPwd = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.SHK_EOID_PWD);
					svcKeiNo = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.SVC_KEI_NO);
					updDtmSvcKei = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.UPD_DTM_SVC_KEI);
					rrkNoMlad = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.RRKS_NO_MLAD);
					mlad = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.MLAD);
					keishaTypeCd = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_TYPE_CD);
					rrksNoContTelno = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.RRKS_NO_CONT_TELNO);
					// ANK-3706-00-00 ADD START
					keishaTelno = getResultString(result, mapKeyPre + ECK0011B050CBSMsg1List.KEISHA_TELNO);
					// ANK-3706-00-00 ADD END
				}
			}
			else
			{
				returnCd = DSL_ERR_OTHER;   // その他のエラー
			}
		}

		//***************************************************
		//オプトインメール受信設定削除
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			// 会員種別がマスター会員(個人)、マスター会員(法人)の時のみ実行
			// ※ファミリー会員、オープン会員は「お客様退会」の副次処理で行われる為、ここでは実施しない。(グループ設定の削除も同様)
			if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_MASTER_KOJIN, MMB_SBT_CD_MASTER_HOJIN))
			{
				result = mkOptinmRcvSetteForContMlad(handle, param, sysid, updDtmSysid);
				if (isSuccess(result))
				{
					String updDtm = getResultString(result, ECK0141C030CBSMsg.UPD_DTM);
					updDtmSysid = (updDtm != null)&&(!"".equals(updDtm)) ? updDtm : updDtmSysid;
				}
				else
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
			}
		}

		//***************************************************
		// eoIDエイジング終了
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd) && (eoid != null) && (!eoid.equals(shkEoid)))
		{
			// 会員種別がマスター会員(保守用のみ)、ファミリー会員、オープン会員の時のみ
			if ((JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_MASTER_KOJIN, MMB_SBT_CD_MASTER_HOJIN) && KEISHA_TYPE_CD_MNT.equals(keishaTypeCd))
			|| (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_FAMILY_KOJIN, MMB_SBT_CD_FAMILY_HOJIN, MMB_SBT_CD_OPEN)))
			{
				result = chgEoIdAgingStateEnd(handle, param, eoid);
				if (isError(result))
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
			}
		}

		//***************************************************
		// ニックネームエイジング終了
		//***************************************************
		if ((DSL_NORMAL_END.equals(returnCd)) && (!JCNBPCommon.isNullOrBlank(nkname)))
		{
			result = chgNkNameAgingStateEnd(handle, param, nkname);
			if (isError(result))
			{
				returnCd = DSL_ERR_OTHER;   // その他のエラー
			}
		}
		
		//***************************************************
		// ニックネームクリア
		//***************************************************
		if ((DSL_NORMAL_END.equals(returnCd)) && (!JCNBPCommon.isNullOrBlank(nkname)))
		{
			// 会員種別がマスター会員(個人)、マスター会員(法人)の時のみ実行
			if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_MASTER_KOJIN, MMB_SBT_CD_MASTER_HOJIN))
			{
				result = callECK0011C180(handle, param, sysid, updDtmSysid);
				if (isSuccess(result))
				{
					updDtmSysid = getResultString(result, ECK0011C180CBSMsg.UPD_DTM);
				}
				else
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
			}
		}

		//***************************************************
		// eoID初期化
		//***************************************************
		// 会員種別がマスター会員(個人)、マスター会員(法人)の時のみ実行する (初期化種別コードは"1"固定)
		if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_MASTER_KOJIN, MMB_SBT_CD_MASTER_HOJIN))
		{
			if (KEISHA_TYPE_CD_MNT.equals(keishaTypeCd))
			{
				if (DSL_NORMAL_END.equals(returnCd))
				{
					result = callECK0011C020(handle, param, sysid, updDtmSysid, "1");
					if (isSuccess(result))
					{
						updDtmSysid = getResultString(result, ECK0011C020CBSMsg.UPD_DTM);
					}
					else
					{
						returnCd = DSL_ERR_OTHER;   // その他のエラー
					}
				}
			}
		}

		//***************************************************
		// コンテンツ系会員情報クリア
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			// 会員種別がマスター会員(個人)の時
			if (MMB_SBT_CD_MASTER_KOJIN.equals(memberSbtCd))
			{
				Map custKojinInfo = (Map)((HashMap)custInfo).clone();
				custKojinInfo.put(ECK0021C010CBSMsg.SYSID, sysid);
				custKojinInfo.put(ECK0021C010CBSMsg.UPD_DTM_BF, updDtmSysid);
				result = callECK0021C010ForClearContInfo(handle, param, custKojinInfo);
				if (isSuccess(result))
				{
					updDtmSysid = getResultString(result, ECK0021C010CBSMsg.UPD_DTM);
				}
				else
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
			}
			// 会員種別がマスター会員(法人)の時
			else if (MMB_SBT_CD_MASTER_HOJIN.equals(memberSbtCd))
			{
				Map custHojinInfo = (Map)((HashMap)custInfo).clone();
				custHojinInfo.put(ECK0031C010CBSMsg.SYSID, sysid);
				custHojinInfo.put(ECK0031C010CBSMsg.UPD_DTM_BF, updDtmSysid);
				result = callECK0031C010ForClearContInfo(handle, param, custHojinInfo);
				if (isSuccess(result))
				{
					updDtmSysid = getResultString(result, ECK0031C010CBSMsg.UPD_DTM);
				}
				else
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
			}
		}

		//***************************************************
		// 支払方法入力支援削除
		//***************************************************
		List paywayInsuportList = null;
		if (DSL_NORMAL_END.equals(returnCd))
		{
			// 会員種別がファミリー会員(個人)、ファミリー会員(法人)、オープン会員の時のみ実行
			if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_FAMILY_KOJIN, MMB_SBT_CD_FAMILY_HOJIN, MMB_SBT_CD_OPEN))
			{
				Map tmpResult = delPaywayInsuportInfo(handle, param, "1", sysid);
				result = (Map)tmpResult.get("result");
				if (isError(result))
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
				paywayInsuportList = (List)tmpResult.get("payway_insuport_list");
			}
		}

		//***************************************************
		// サービス契約(標準コンテンツ同意)解約
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			result = stdardContDsl(handle, param, svcKeiNo, updDtmSvcKei, opeDate);
			if (isError(result))
			{
				returnCd = DSL_ERR_OTHER;   // その他のエラー
			}
		}

		//***************************************************
		// 処理前のお客様グループ設定データを取得
		//***************************************************
		CAANMsg[] grpSetteList = null;
		if (DSL_NORMAL_END.equals(returnCd))
		{
			// 会員種別がファミリー会員(個人)、ファミリー会員(法人)の時のみ実行する
			if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_FAMILY_KOJIN, MMB_SBT_CD_FAMILY_HOJIN))
			{
				result = callECK0121B020(handle, param, "2", sysid);
				if (isSuccess(result))
				{
					CAANMsg[] dataList = getResultMsgList(result, ECK0121B020CBSMsg.ECK0121B020CBSMSG1LIST);
					if ((dataList != null) && (dataList.length > 0))
					{
						grpSetteList = dataList;
					}
				}
				else
				{
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}

			}
		}
		
		//***************************************************
		// お客様退会
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			// 会員種別がファミリー会員(個人)、ファミリー会員(法人)、オープン会員の時のみ実行する
			if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_FAMILY_KOJIN, MMB_SBT_CD_FAMILY_HOJIN, MMB_SBT_CD_OPEN))
			{
				result = callECK0011C060(handle, param, sysid, opeDate, TAIKAI_RSN_CD_CUST_OWN, updDtmSysid);
				if (isSuccess(result))
				{
					updDtmSysid = getResultString(result, ECK0011C180CBSMsg.UPD_DTM);
				}
				else
				{
					// OM-2020-0001148 ADD START
					CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
					CAANMsg msg = templates[0];
					
					// お客様状態遷移チェックエラーの場合は、エラーフラグを設定
					if(msg.containsKeyOfMsgData("sysid_err"))
					{
						String errFlg  = msg.getString("sysid_err");
						int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
						if("EA".equals(errFlg) && status == 1150)
						{
							workErrFlg = "EA";
						}
					}
					// OM-2020-0001148 ADD END
					
					returnCd = DSL_ERR_OTHER;   // その他のエラー
				}
			}
		}

		//***************************************************
		// 指示書登録
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			// 会員種別がマスター会員(個人)、マスター会員(法人)の時のみ実行する
			if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_MASTER_KOJIN, MMB_SBT_CD_MASTER_HOJIN))
			{
				// ニックネーム、連絡先メールアドレス連携用の指示書作成
				Map sjishoMap = createShijishoParamClearNknmRrksMlad(sysid);
				result = callECK0151D010Map(handle, param, sjishoMap);
			}

			// 標準コンテンツ規約同意フラグ連携用の指示書作成
			if (isSuccess(result))
			{
				// 会員種別がマスター会員(個人)、マスター会員(法人)の時
				if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_MASTER_KOJIN, MMB_SBT_CD_MASTER_HOJIN))
				{
					// 「標準コンテンツ未同意」用のパラメータ作成
					// ANK-3706-00-00 MOD START
					//Map sjishoMap = createShijishoParamContMidoui(sysid);
					Map sjishoMap = createShijishoParamContMidoui(sysid, keishaTelno);
					// ANK-3706-00-00 MOD END

					// 契約者タイプコードが 保守用の時はeoID、パスワード(初期化データ)も連携
					if (KEISHA_TYPE_CD_MNT.equals(keishaTypeCd))
					{
						sjishoMap = createShijishoParamEoidShkka(sjishoMap, shkEoid, shkEoidPwd);
					}
					result = callECK0151D010Map(handle, param, sjishoMap);
				}
			}

			// 会員情報の削除連携用の指示書作成
			if (isSuccess(result))
			{
				// 会員種別がファミリー会員(個人)、ファミリー会員(法人)、オープン会員の時のみ実行する
				if (JCNBPCommon.inArray(memberSbtCd, MMB_SBT_CD_FAMILY_KOJIN, MMB_SBT_CD_FAMILY_HOJIN, MMB_SBT_CD_OPEN))
				{
					Map sjishoMap = createShijishoParamDelMmb(sysid);
					result = callECK0151D010Map(handle, param, sjishoMap);
				}
			}

			// グループ情報(無効データ)連携用の指示書作成
			if (isSuccess(result))
			{
				if (grpSetteList != null)
				{
					for (CAANMsg grpSetteInfo : grpSetteList) {
						String grpSbtCd = grpSetteInfo.getString(ECK0121B020CBSMsg1List.GRP_SBT_CD);
						String grpLeaderSysid = grpSetteInfo.getString(ECK0121B020CBSMsg1List.GRP_LEADER_SYSID);
						String addDtm = grpSetteInfo.getString(ECK0121B020CBSMsg1List.ADD_DTM);
						String addOpeacnt = grpSetteInfo.getString(ECK0121B020CBSMsg1List.ADD_OPEACNT);
						String updDtm = grpSetteInfo.getString(ECK0121B020CBSMsg1List.UPD_DTM);
						String updOpeacnt = grpSetteInfo.getString(ECK0121B020CBSMsg1List.UPD_OPEACNT);
						Map<String, Object> grpAddMap = createShijishoParamGrpDel(sysid, grpLeaderSysid, grpSbtCd, addDtm, addOpeacnt, updDtm, updOpeacnt);
						result = callECK0151D010Map(handle, param, grpAddMap);
					}
				}
			}

			// 支払方法入力支援情報(無効データ)連携用用の指示書作成
			if (isSuccess(result))
			{
				List sjishoList = createShijishoParamDelPaywayInsup(sysid, paywayInsuportList);
				if (sjishoList.size() > 0)
				{
					result = callECK0151D010List(handle, param, sjishoList);
				}
			}

			if (isError(result))
			{
				returnCd = DSL_ERR_OTHER;   // その他のエラー
			}
		}

		//***************************************************
		// CCMG連携
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			String res = requestCcmgApiAllDsl(handle, param, sysid, userId, userNm);
			// IT1-2024-0000003 ADD START
			HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
			HashMap<String, Object> lcs_last_result = (HashMap<String, Object>)param.getData("LCS_LAST_RESULT");
			CAANMsg[]  templates = (CAANMsg[]) lcs_last_result.get("templates");
			int status = templates[0].getInt("status");
			param.setData("ccmg_status", Integer.toString(status));
		// IT1-2024-0000003 ADD END
			// IT1-2024-0000003 MOD START
//			if (!"00000".equals(res))
			if (0 < status)
			// IT1-2024-0000003 MOD END
			{
				//returnCd = DSL_ERR_SYSTEM;   // その他のエラー
//ANK-4346-00-00 MOD START
				returnCd = res;
				// 下りユーザデータマップのセット
				Map<String, Object> resultMap = new HashMap();
				resultMap.put(CNSV0028_CNSV0028OP_CNSV002801CC.RETURN_CD, returnCd);
				// IT1-2024-0000003 DEL START
//				HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(fixedText);
				// IT1-2024-0000003 DEL END
				ccMsg.put("err_flg", "CCMG_ERR");
				ccMsg.put("err_cd", returnCd);
				// IT1-2024-0000003 ADD START
				ccMsg.put("ccmg_status", Integer.toString(status));
				// IT1-2024-0000003 ADD END

				editErrInfo(param);
				throw new CCException("サービスコンポーネントエラー", new Exception());
//ANK-4346-00-00 MOD END
			}
			
			// #84105 DEL START
			//// 全解約APIのリターンコードが"90006"eoID会員存在エラーの場合は、SCCallExceptionを発行し画面側でエラーハンドリングを行う。
			//if ("90006".equals(res))
			//{
			//	SCCallException scCallEx = new SCCallException("eoID存在チェックエラー", "1050", 8);
			//	throw scCallEx;
			//}
			// #84105 DEL END
		}
		
		//***************************************************
		// 標準コンテンツ解約メール送信
		//***************************************************
		if (DSL_NORMAL_END.equals(returnCd))
		{
			String sysDtm = JCCBPCommon.getSysDateTime();
			String[] repTextAry = {contCustNmKana, sysDtm.substring(0, 2), sysDtm.substring(2, 4), sysDtm.substring(4, 6), sysDtm.substring(6, 8)};
			boolean res = callMailSendSc(handle, param, sysid, eoid, contCustNmKana, MAIL_CD_STDARD_CONT_DSL_TCHI, mlad, repTextAry);
			if (!res)
			{
				returnCd = DSL_ERR_SYSTEM;   // その他のエラー
			}
		}
		
		//***************************************************
		// 返却パラメータ設定
		//***************************************************

		// 最後に実行したSCの実行結果を取得
		result = getLastResult(param);

		// 下りコントロールマップのセット
		setResultCtrlData(param, result, fixedText);

		// SC実行エラーの場合は、結果に応じてリターンコードを設定
		if (DSL_ERR_OTHER.equals(returnCd)) {
			String scReturnCd = getReturnCode(result).toString();
			String scStatusCd = getStatus(result).toString();
			returnCd = ("0".equals(scReturnCd) && "1000".equals(scStatusCd)) ? DSL_ERR_PARAM : DSL_ERR_SYSTEM;
		}

		// 下りユーザデータマップのセット
		Map<String, Object> resultMap = new HashMap();
		resultMap.put(CNSV0028_CNSV0028OP_CNSV002801CC.RETURN_CD, returnCd);
		
		// OM-2020-0001148 ADD START
		if (workErrFlg !=null) {
			resultMap.put(CNSV0028_CNSV0028OP_CNSV002801CC.SYSID_ERR, workErrFlg );
		} 
		// OM-2020-0001148 ADD END
		
		setResultUserData(param, fixedText, resultMap);

		//*************************************************
		// 処理結果の判定
		//*************************************************
		if (!DSL_NORMAL_END.equals(returnCd))
		{
			String errMsg = "標準コンテンツ解約CCでエラーが発生しました)";
			throw new CCException(errMsg, new Exception(errMsg));
		}

		return param;
	}

	/**
	 * ニックネーム、連絡先メールアドレスクリア用の指示書パラメータ作成。<br />
	 * @param sysid
	 * @return 指示書登録用パラメータ
	 */
	private Map<String, Object> createShijishoParamClearNknmRrksMlad(String sysid)
	{
		Map<String, Object> inMap = new HashMap<String, Object>();
		inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_ADMIN_API);
		inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
		inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, sysid);
		inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
		// ANK-3706-00-00 MOD START
		//inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "19");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "22");
		// ANK-3706-00-00 MOD END
		inMap.put(ECK0151D010CBSMsg.PARAMETER_1, ADMIN_SJISHO_PARAM1_CLEAR);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_3, sysid);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_5, SJISHO_PARAM_CLEAR_FIELD);
		// ANK-2987-08-00 2016/11/07 DEL START
		//inMap.put(ECK0151D010CBSMsg.PARAMETER_7, SJISHO_PARAM_CLEAR_FIELD);
		// ANK-2987-08-00 2016/11/07 DEL END
		inMap.put(ECK0151D010CBSMsg.PARAMETER_19, JCCBPCommon.getSysDateTime());
		return inMap;
	}

	/**
	 * 標準コンテンツ規約同意フラグ(未同意)連携用の指示書パラメータ作成。<br />
	 * @param sysid
	 * @param keishaTelno
	 * @return 指示書登録用パラメータ
	 */
	// ANK-3706-00-00 MOD START
	//private Map<String, Object> createShijishoParamContMidoui(String sysid)
	private Map<String, Object> createShijishoParamContMidoui(String sysid, String keishaTelno)
	// ANK-3706-00-00 MOD END
	{
		Map<String, Object> inMap = new HashMap<String, Object>();
		inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_ADMIN_API);
		inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
		inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, sysid);
		inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
		// ANK-3706-00-00 MOD START
		//inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "19");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "22");
		// ANK-3706-00-00 MOD END
		inMap.put(ECK0151D010CBSMsg.PARAMETER_1, ADMIN_SJISHO_PARAM1_UPD_PART);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_3, sysid);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_12, "0");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_19, JCCBPCommon.getSysDateTime());
		// ANK-3706-00-00 ADD START
		inMap.put(ECK0151D010CBSMsg.PARAMETER_20, keishaTelno);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_21, "");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_22, "");
		// ANK-3706-00-00 ADD END
		return inMap;
	}

	/**
	 * eoID、パスワード(初期化データ)連携用の指示書パラメータ作成。<br />
	 * @param sjishoMap 指示書登録用パラメータ
	 * @param shkEoid 初期eoID
	 * @param shkEoidPwd 初期eoIDパスワード
	 * @return 指示書登録用パラメータ
	 */
	private Map<String, Object> createShijishoParamEoidShkka(Map<String, Object> sjishoMap, String shkEoid, String shkEoidPwd)
	{
		sjishoMap.put(ECK0151D010CBSMsg.PARAMETER_2, shkEoid);
		sjishoMap.put(ECK0151D010CBSMsg.PARAMETER_4, shkEoidPwd);
		return sjishoMap;
	}

	/**
	 * 会員情報の削除連携用の指示書パラメータ作成。<br />
	 * @param sysid SYSID
	 * @return 指示書登録用パラメータ
	 */
	private Map<String, Object> createShijishoParamDelMmb(String sysid)
	{
		Map<String, Object> inMap = new HashMap<String, Object>();
		inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_ADMIN_API);
		inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
		inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, sysid);
		inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
		// ANK-3706-00-00 MOD START
		//inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "19");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "22");
		// ANK-3706-00-00 MOD END
		inMap.put(ECK0151D010CBSMsg.PARAMETER_1, ADMIN_SJISHO_PARAM1_DEL);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_19, JCCBPCommon.getSysDateTime());
		return inMap;
	}

	/**
	 * グループ削除用の指示書パラメータ作成。<br />
	 * @param sysid SYSID
	 * @param grpLeaderSysid グループリーダSYSID
	 * @param grpSbtCd グループ種別コード
	 * @param addDtm 登録年月日時分秒
	 * @param addOpeacnt 登録オペレータアカウント
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeacnt 更新オペレータアカウント
	 * @return 指示書登録用パラメータ
	 */
	private Map<String, Object> createShijishoParamGrpDel(String sysid, String grpLeaderSysid, String grpSbtCd, String addDtm, String addOpeacnt, String updDtm, String updOpeacnt)
	{
		Map<String, Object> inMap = new HashMap<String, Object>();
		inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_REPLICA_API);
		inMap.put(ECK0151D010CBSMsg.TRGT_TABLE_ID, "TNM00030");
		inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
		inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, sysid);
		inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "10");
		inMap.put(ECK0151D010CBSMsg.PARAMETER_1, grpSbtCd);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_2, grpLeaderSysid);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_3, sysid);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_4, AXM_YK_MK_FLG); 
		inMap.put(ECK0151D010CBSMsg.PARAMETER_5, addDtm);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_6, addOpeacnt);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_7, null);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_8, updDtm);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_9, updOpeacnt);
		inMap.put(ECK0151D010CBSMsg.PARAMETER_10, null);
		return inMap;
	}


	/**
	 * 支払い方法入力支援(無効データ)連携用の指示書パラメータ作成。<br />
	 * ※論理削除の為、"TNM00060_D" でなく "TNM00060" かつ 無効フラグを使用。<br />
	 * @param sysid SYSID
	 * @param paywayInsupList 支払い方法入力支援リスト
	 * @return 指示書登録用パラメータリスト
	 */
	@SuppressWarnings("unchecked")
	private List<Map> createShijishoParamDelPaywayInsup(String sysid, List<Map> paywayInsupList)
	{
		List<Map> list = new ArrayList<Map>();
		if (paywayInsupList != null)
		{
			for (Map rec : paywayInsupList) {
				Map<String, Object> inMap = new HashMap<String, Object>();
				inMap.put(ECK0151D010CBSMsg.TRN_CD, SJISHO_TRN_CD_REPLICA_API);
				inMap.put(ECK0151D010CBSMsg.TRGT_TABLE_ID, "TNM00060");
				inMap.put(ECK0151D010CBSMsg.ERR_CNT, "0");
				inMap.put(ECK0151D010CBSMsg.TRAN_TRGT_SYSID, sysid);
				inMap.put(ECK0151D010CBSMsg.RSLT_FLG, "0");
				inMap.put(ECK0151D010CBSMsg.PARAMETER_YK_CNT, "13");
				inMap.put(ECK0151D010CBSMsg.PARAMETER_1, sysid);
				inMap.put(ECK0151D010CBSMsg.PARAMETER_2, (String)rec.get("payway_input_shien_cd"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_3, (String)rec.get("tsyrn_pay_seq"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_4, (String)rec.get("isp_kssai_svc_kei_no"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_5, (String)rec.get("crecard_id"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_6, (String)rec.get("mk_flg"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_7, (String)rec.get("add_dtm"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_8, (String)rec.get("add_opeacnt"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_9, null);
				inMap.put(ECK0151D010CBSMsg.PARAMETER_10, (String)rec.get("upd_dtm"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_11, (String)rec.get("upd_opeacnt"));
				inMap.put(ECK0151D010CBSMsg.PARAMETER_12, null);
				inMap.put(ECK0151D010CBSMsg.PARAMETER_13, (String)rec.get("tokusoku_stat"));
				list.add(inMap);
			}
		}
		return list;
	}

	/**
	 * BPチェック用パラメータ作成。<br />
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return BPチェック用パラメータ
	 */
	@SuppressWarnings("unchecked")
	public HashMap getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	{
		// BPチェックはスキップする
		return JCNDslScParamHenshu.createBpNotCheckParam();
	}

	/**
	 * ＢＰチェック結果を編集する。<br />
	 * @param param リクエストパラメータ
	 * @param caanMsgs サービスインターフェイス用のパラメータ配列
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] caanMsgs, Integer returnCode) throws Throwable
	{
		return JCNDslScParamHenshu.editErrorInfo(param, caanMsgs, returnCode);
	}
	
// ANK-4346-00-00 ADD START
	/**
	 * エラー情報を設定します。
	 * @param iparam IRequestParameterReadWrite
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrInfo(IRequestParameterReadWrite iparam) throws RequestParameterException
	{
		IRequestParameterReadWrite param = setControlMapErrInfo(iparam, JPCModelConstant.RELATION_ERR, JPCModelConstant.NORMAL_END);
		
		// エラー情報のリストを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		HashMap<String, Object> errorMap = new HashMap<String, Object>();
		HashMap<String, String> errorMapChild = new HashMap<String, String>();
		
		errorMap.put(ErrorInfoMapKeys.RETURN_CODE, JPCModelConstant.NORMAL_END);
		errorMap.put(ErrorInfoMapKeys.STATUS, JPCModelConstant.RELATION_ERR);
		
		errorMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, errorMapChild);
		
		errList.add(errorMap);
		
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, errList);
		
		return param;
	}
	/**
	 * コントロールマップエラー情報格納処理を行います。
	 * @param param リクエストパラメータ
	 * @param itemplateStatus サービスインターフェイスステータス
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite setControlMapErrInfo(IRequestParameterReadWrite param, int itemplateStatus, int returnCode)
	throws RequestParameterException
	{
		int templateStatus = itemplateStatus;
		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);
		}
		
		return param;
	}
// ANK-4346-00-00 ADD END
}
