/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAddSvcKeiTelCC
*   ソースファイル名：JKKAddSvcKeiTelCC.java
*   作成者          ：富士通
*   日付            ：
*＜機能概要＞
*   サービス契約内訳キャンセル部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v9.00.00	2014/04/30   FJ)北谷     ANK-2056-00-00対応
*  v26.00.00	2016/09/28   FJ)江藤     OM-2016-0001600対応
*  v50.00.00	2019/05/21   FJ)吉田     OM-2020-0000365対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

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.JKKAdchgConstCC;
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 eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161C160CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161C180CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161C190CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0191A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0191B002CBSMsg1List;
import eo.ejb.common.JCCModelCommon;

public class JKKAdchgCancelSvcKeiUwckTelCC  extends AbstractCommonComponent {

	/**
	 * サービス契約内訳キャンセル（住所変更）の処理です。
	 * 
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite cancel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// パラメータから、サービス契約番号、申込明細番号を取得
		HashMap<String , Object>paramMap = (HashMap<String , Object>)param.getData(fixedText);
		String svc_kei_no = (String)paramMap.get("svc_kei_no");
		String mskm_dtl_no = (String)paramMap.get("mskm_dtl_no");
		
		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();

		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

// OM-2013-0005055対応 20131215 星野 ADD START
		// 事前に追加分のキャンセル・解約を実施
		cancelDslSvcKeiUcwk(handle, param, fixedText, svc_kei_no, mskm_dtl_no);
// OM-2013-0005055対応 20131215 星野 ADD END

		// 機器提供サービス契約一覧照会の結果リスト
		List<HashMap<String, Object>> kk0191_b001_map_list = null;
		
		/** EKK0191B001 サービス契約内訳＜光電話＞一覧照会を呼び出し */
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svc_kei_no);
		HashMap<String, Object> reqMap = mapper.setEKK0191B001( param, fixedText, condMap);
		Map<?, ?> resMap = scCall.run( reqMap, handle);
		kk0191_b001_map_list = mapper.getEKK0191B001( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		if(kk0191_b001_map_list == null)
		{
			return param;
		}
		
		//　電話の内訳数分電話履歴一覧照会を実行する
		for (HashMap<String, Object> kk0191_b001_map : kk0191_b001_map_list ) {
			String svckeiUcwkNo = (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO);

// OM-2013-0005055対応 20131215 星野 ADD START
// 下から移動
			String ucwkState = (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_STAT);
			
			// 解約済・キャンセル済の場合は無視
			if ("910".equals(ucwkState) || "920".equals(ucwkState)) {
				continue;
			}
// OM-2013-0005055対応 20131215 星野 ADD END
			
			ArrayList<HashMap<String,Object>>kk0191_b002_map_list = null;
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svckeiUcwkNo);
			reqMap = mapper.setEKK0191B002( param, fixedText, condMap);
			resMap = scCall.run( reqMap, handle);
			kk0191_b002_map_list = mapper.getEKK0191B002( param, fixedText, resMap );
			mapper.scResultCheck( param );
			
			for(HashMap<String, Object> kk0191_b002_map : kk0191_b002_map_list )
			{
				String k0191_gene_add_dtm = (String)kk0191_b002_map.get(EKK0191B002CBSMsg1List.GENE_ADD_DTM);
				// サービス契約内訳一意照会を実行
				HashMap<String , Object>k0161_a001_map = null;
				condMap.clear();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svckeiUcwkNo);
				condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, k0191_gene_add_dtm);
				reqMap = mapper.setEKK0161A010_Func1( param, fixedText, condMap);
				resMap = scCall.run( reqMap, handle);
				k0161_a001_map = mapper.getEKK0161A010( param, fixedText, resMap );
				mapper.scResultCheck( param );

				String mskm_dtl_no_a010 = (String)k0161_a001_map.get(EKK0161A010CBSMsg1List.MSKM_DTL_NO);
				String last_upd_dtm = (String)k0161_a001_map.get(EKK0161A010CBSMsg1List.LAST_UPD_DTM);
				
// OM-2013-0005055対応 20131215 星野 DEL START
// 上に移動
//// 住所変更キャンセル品質向上 2013/06/11 START
//				String ucwkState = (String)k0161_a001_map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
//				
//				// 解約済みの場合は無視
//				if ("910".equals(ucwkState)) {
//					continue;
//				}
//// 住所変更キャンセル品質向上 2013/06/11 END
// OM-2013-0005055対応 20131215 星野 DEL END
				
				if(mskm_dtl_no.equals(mskm_dtl_no_a010))
				{
					// サービス契約内訳の論理削除を実行する。
					HashMap<String , Object>k0161_e011_map = null;
					condMap.clear();
					condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svckeiUcwkNo);
					condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, k0191_gene_add_dtm);
					condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, last_upd_dtm);
					reqMap = mapper.setEKK0161E011( param, fixedText, condMap);
					resMap = scCall.run( reqMap, handle);
					k0161_e011_map = mapper.getEKK0161E011( param, fixedText, resMap );
					mapper.scResultCheck( param );
					
				}

			}
			
		}
		
		// 解約新規の処理
		List<HashMap<String, Object>> kk0161_b004_map_list = null;
		condMap.clear();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svc_kei_no);
		reqMap = mapper.setEKK0161B004(param, fixedText, condMap, JPCModelConstant.FUNC_CD_2);
		resMap = scCall.run( reqMap, handle);
		kk0161_b004_map_list = mapper.getEKK0161B004( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		Iterator<HashMap<String, Object>> kk0161_b004_ite = kk0161_b004_map_list.iterator();
		while(kk0161_b004_ite.hasNext()) {
			
			HashMap<String, Object> svc_kei_ucwk_map = kk0161_b004_ite.next();
			
			String ucwk = (String)svc_kei_ucwk_map.get(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO);
			
// OM-2013-0005055対応 20131215 星野 ADD START
//// 下から移動
			String ucwkState = (String)svc_kei_ucwk_map.get(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_STAT);
			
			// 解約済・キャンセル済の場合は無視
			if ("910".equals(ucwkState) || "920".equals(ucwkState)) {
				continue;
			}
// OM-2013-0005055対応 20131215 星野 ADD END
			ArrayList<HashMap<String,Object>>kk0191_b002_map_list = null;
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, ucwk);
			reqMap = mapper.setEKK0191B002( param, fixedText, condMap);
			resMap = scCall.run( reqMap, handle);
			kk0191_b002_map_list = mapper.getEKK0191B002( param, fixedText, resMap );
			mapper.scResultCheck( param );
			
			for(HashMap<String, Object> kk0191_b002_map : kk0191_b002_map_list )
			{
				
				String k0191_gene_add_dtm = (String)kk0191_b002_map.get(EKK0191B002CBSMsg1List.GENE_ADD_DTM);
				// サービス契約内訳一意照会を実行
				HashMap<String , Object>kk0161_a010_map = null;
				condMap.clear();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, ucwk);
				condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, k0191_gene_add_dtm);
				reqMap = mapper.setEKK0161A010_Func1( param, fixedText, condMap);
				resMap = scCall.run( reqMap, handle);
				kk0161_a010_map = mapper.getEKK0161A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
// OM-2013-0005055対応 20131215 星野 DEL START
//// 上に移動
//// 住所変更キャンセル品質向上 2013/06/11 START
//				String ucwkState = (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
//				
//				// 解約済みの場合は無視
//				if ("910".equals(ucwkState)) {
//					continue;
//				}
//// 住所変更キャンセル品質向上 2013/06/11 END
// OM-2013-0005055対応 20131215 星野 DEL END
				
				String telNochg = (String) kk0161_a010_map.get(EKK0161A010CBSMsg1List.KEIZK_AF_KEI_CHGECHU_FLG);
				
				if ("1".equals(telNochg)) {
					
					// サービス契約内訳の論理削除を実行する。
					HashMap<String , Object>k0161_e011_map = null;
					condMap.clear();
					condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, ucwk);
					condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, (String) kk0161_a010_map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM));
					condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String) kk0161_a010_map.get(EKK0161A010CBSMsg1List.LAST_UPD_DTM));
					reqMap = mapper.setEKK0161E011( param, fixedText, condMap);
					resMap = scCall.run( reqMap, handle);
					k0161_e011_map = mapper.getEKK0161E011( param, fixedText, resMap );
					mapper.scResultCheck( param );
				}
			}
			
		}
		
// 住所変更キャンセル品質向上 2013/06/11 START
		/** 予約レコードの削除を行う */
//		/** EKK0161B005_サービス契約内訳予約一覧照会を呼び出し */
//		condMap.clear();
//		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svc_kei_no);
//		condMap.put( JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null) );
//		reqMap = mapper.setEKK0161B005( param, fixedText, condMap);
//		resMap = scCall.run( reqMap, handle);
//		List<HashMap<String, Object>> kk0161_b005_map_list = mapper.getEKK0161B005( param, fixedText, resMap );
//		mapper.scResultCheck( param );
//		
//		for (HashMap<String, Object> kk0161_b005_map : kk0161_b005_map_list ) {
//			
//			String svcKeiUcwkNo = (String)kk0161_b005_map.get(EKK0161B005CBSMsg1List.SVC_KEI_UCWK_NO);
//			String geneAddDtm = (String)kk0161_b005_map.get(EKK0161B005CBSMsg1List.GENE_ADD_DTM);
//			
//			// サービス契約内訳一意照会を実行
//			HashMap<String , Object>k0161_a001_map = null;
//			condMap.clear();
//			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svcKeiUcwkNo);
//			condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, geneAddDtm);
//			reqMap = mapper.setEKK0161A010_Func1( param, fixedText, condMap);
//			resMap = scCall.run( reqMap, handle);
//			k0161_a001_map = mapper.getEKK0161A010( param, fixedText, resMap );
//			mapper.scResultCheck( param );
//			
//			String ucwkState = (String)k0161_a001_map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
//			String idoDiv = (String)k0161_a001_map.get(EKK0161A010CBSMsg1List.IDO_DIV);
//			
//			// 解約済みの場合は無視
//			if ("00019".equals(idoDiv) && !"910".equals(ucwkState)) {
//				
//				// サービス契約内訳の論理削除を実行する。
//				HashMap<String , Object>k0161_e011_map = null;
//				condMap.clear();
//				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svcKeiUcwkNo);
//				condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, (String) k0161_a001_map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM));
//				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String) k0161_a001_map.get(EKK0161A010CBSMsg1List.LAST_UPD_DTM));
//				reqMap = mapper.setEKK0161E011( param, fixedText, condMap);
//				resMap = scCall.run( reqMap, handle);
//				k0161_e011_map = mapper.getEKK0161E011( param, fixedText, resMap );
//				mapper.scResultCheck( param );
//			}
//		}
		
		String opeDate = JCCBPCommon.getOpeDate(null);
		for (HashMap<String, Object> kk0191_b001_map : kk0191_b001_map_list ) {
			String svckeiUcwkNo = (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO);
			
			// 2013/06/13の時点では未来で積まれるデータはMAX3件だが、余裕を見て5回ループさせる
			// また、無限ループはリスクが高いため不採用
			// OM-2016-0001600 未来日レコードの論削のループ回数が、住変以外の異動が起こると5では足りない。障害対応のついでに修正。 2016/09/28 MOD START
//			for (int i = 0 ; i < 5 ; i++) {
			for (int i = 0 ; i < 100 ; i++) {
			// OM-2016-0001600 未来日レコードの論削のループ回数が、住変以外の異動が起こると5では足りない。障害対応のついでに修正。 2016/09/28 MOD END
				
				condMap.clear();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svckeiUcwkNo);
				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, "20991231");
				reqMap = mapper.setEKK0161A010( param, fixedText, condMap);
				resMap = scCall.run(reqMap, handle);
				HashMap<String, Object> kk0161_a010_map = mapper.getEKK0161A010(param, fixedText, resMap);
				mapper.scResultCheck(param);
				
				if (kk0161_a010_map.isEmpty()) {
					continue;
				}
				
				String rsvYmd = (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.RSV_APLY_YMD);
				String idoDiv = (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.IDO_DIV);
				
				if (rsvYmd.compareTo(opeDate) <= 0) {
					// 予約適用年月日が運用日付以下なら終了
					break;
				}
				
				String ucwkState = (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT);
				
				// 解約済みの場合は無視
// OM-2013-0005055対応 20131215 星野 MOD START
//				if ("910".equals(ucwkState)) {
				if ( "910".equals(ucwkState) || "920".equals(ucwkState) ){
// OM-2013-0005055対応 20131215 星野 MOD END
					continue;
				}
				
				if ("00019".equals(idoDiv)) {
					
					// サービス契約内訳の論理削除を実行する。
					HashMap<String , Object>k0161_e011_map = null;
					condMap.clear();
					condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, svckeiUcwkNo);
					condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, (String) kk0161_a010_map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM));
					condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, (String) kk0161_a010_map.get(EKK0161A010CBSMsg1List.LAST_UPD_DTM));
					reqMap = mapper.setEKK0161E011( param, fixedText, condMap);
					resMap = scCall.run( reqMap, handle);
					k0161_e011_map = mapper.getEKK0161E011( param, fixedText, resMap );
					mapper.scResultCheck( param );
				}
				
			}
		}
		
// 住所変更キャンセル品質向上 2013/06/11 END
		// OM-2016-0001600 2016/09/28 ADD START
		// 電話番号順:1を番号解約する住変申込で、番号解約に伴い電話番号順2が1に繰り上がった後に、
		// 住変キャンセルしたら、上の論理削除処理で、繰り上げた電話番号順:1が2に戻ってしまう。
		// 従って、内訳取消処理の最後に電話番号順をチェックして、
		// 有効な内訳が1件、且つその電話番号順が1以外という不整合な状態なら電話番号順を1に変更する。
		
		// 有効なステータスのサービス契約内訳を格納するリスト
		ArrayList<HashMap<String, Object>> svcKeiUcwkList = new ArrayList<HashMap<String, Object>>();
		
		// サービス契約内訳＜光電話＞一覧照会を実行し、有効なステータスのサービス契約内訳をリストに追加する
		condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svc_kei_no);
		reqMap = mapper.setEKK0191B001( param, fixedText, condMap);
		resMap = scCall.run( reqMap, handle);
		kk0191_b001_map_list = mapper.getEKK0191B001( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		if(kk0191_b001_map_list != null)
		{
			for (HashMap<String, Object> kk0191_b001_map : kk0191_b001_map_list )
			{
				if (JKKStrConst.CD00037_DSL_ZM.compareTo((String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_STAT)) > 0)
				{
					svcKeiUcwkList.add(kk0191_b001_map);
				}
			}
		}
		
		// 有効なステータスのサービス契約内訳ステータスが1件の場合
		if (svcKeiUcwkList.size() == 1)
		{
			HashMap<String, Object> kk0191_b001_map = svcKeiUcwkList.get(0);
			
			String telnoJun = (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.TELNO_JUN);
			
			// 電話番号順が1以外の場合は、電話番号順を1にする
			if(!"1".equals(telnoJun))
			{
				// サービス契約内訳一意照会（カレント）
				condMap = new HashMap<String, String>();
				condMap.put( JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO) );
				condMap.put( JKKAdchgMapperCC.COND_KEY_OPEDATE, JCCBPCommon.getOpeDate(null) );
				reqMap = mapper.setEKK0161A010( param, fixedText, condMap );
				resMap = scCall.run( reqMap, handle );
				HashMap<String, Object> kk0161_a010_map = mapper.getEKK0161A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				// サービス契約内訳＜eo光電話＞一意照会（PK）
				HashMap<String , Object>kk0191_a010_map = null;
				condMap.clear();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_NO));
				condMap.put(JKKAdchgMapperCC.COND_KEY_GENE_ADD_DTM, (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM));
				reqMap = mapper.setEKK0191A010_Func1( param, fixedText, condMap);
				resMap = scCall.run( reqMap, handle);
				kk0191_a010_map = mapper.getEKK0191A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				// 更新項目を設定
				// 機能コード
				paramMap.put(JKKAdchgConstCC.PARAM_KEY_FUNC_CD, JPCModelConstant.FUNC_CD_1);
				
				// 電話番号順 ← "1"（固定）
				kk0191_a010_map.put(EKK0191A010CBSMsg1List.TELNO_JUN, "1");
				
				// 予約適用年月日 ← 運用日
				kk0161_a010_map.put(EKK0161A010CBSMsg1List.RSV_APLY_YMD, JCCBPCommon.getOpeDate(null));
				
				// 異動区分 ← 住所変更・登録（固定）
				kk0161_a010_map.put(EKK0161A010CBSMsg1List.IDO_DIV, JKKAdchgConstCC.IDO_DIV_ADCHG_RGST);
				
				// 申込明細番号 ← INPUT.申込明細番号
				kk0161_a010_map.put(EKK0161A010CBSMsg1List.MSKM_DTL_NO, mskm_dtl_no);
				
				// 更新年月日時分秒(更新前) ← 最終更新年月日時分秒
				kk0191_a010_map.put( JKKAdchgMapperCC.UPD_DT_SVC_KEI_UCWK_UPD_DTM_BEF, kk0161_a010_map.get(EKK0161A010CBSMsg1List.LAST_UPD_DTM));
				
				// サービス契約内訳<eo光電話>情報変更(住所変更)
				//  ※EKK0191C060ではなく、EKK0191C061(住変用)を使用したのは、JKKAdchgMapperCCで実装済という理由のみでどちらを使用してもよい
				reqMap = mapper.setEKK0191C061( param, fixedText, kk0161_a010_map, kk0191_a010_map );
				resMap = scCall.run( reqMap, handle );
				HashMap<String, Object> kk0191_c061_map = mapper.getEKK0191C061( param, fixedText, resMap );
				mapper.scResultCheck( param );
			}
		}
		// OM-2016-0001600 2016/09/28 ADD END
		
		return param;
	}

// OM-2013-0005055対応 20131215 星野 ADD START
	private void cancelDslSvcKeiUcwk(
		SessionHandle handle,
		IRequestParameterReadWrite param, 
		String fixedText,
		String svc_kei_no, 
		String mskm_dtl_no
// ANK-2056-00-00 2014/05/01 ADD START
//	)throws Exception
	)throws Throwable
// ANK-2056-00-00 2014/05/01 ADD END
	{
		// 住所変更登録コモンコンポーネントマッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		/** EKK0191B001 サービス契約内訳＜光電話＞一覧照会(番号変更中含む) */
		HashMap<String, String> condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_NO, svc_kei_no);
		HashMap<String, Object> reqMap = mapper.setEKK0191B001( param, fixedText, condMap, "4");
		Map<?, ?> resMap = scCall.run( reqMap, handle);
		List<HashMap<String, Object>> kk0191_b001_map_list = mapper.getEKK0191B001( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		
		for(HashMap<String, Object> kk0191_b001_map : kk0191_b001_map_list){
			
			// OM-2020-0000365 ADD START
			// 住変申込〜住変キャンセルの期間中に異動があり、
			// カレントの申込明細番号が変更されている場合を考慮し、
			// 最も古い世代の内訳の申込明細番号を取得する。
			// その申込明細番号が当該住変登録の申込明細番号と一致するならば
			// 以下の処理を行う。
			// サービス契約内訳履歴一覧照会を実行
			condMap.clear();
			condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));
			reqMap = mapper.setEKK0161B011( param, fixedText, condMap);
			resMap = scCall.run( reqMap, handle);
			// 結果を取得
			List<HashMap<String, Object>> kk0161_b011_list = mapper.getEKK0161B011( param, fixedText, resMap );
			// 結果の最終行を取得
			HashMap<String, Object> kk0161_b011_map = kk0161_b011_list.get(kk0161_b011_list.size()-1);
			mapper.scResultCheck( param );
			// OM-2020-0000365 ADD END

			// OM-2020-0000365 MOD START
//			String mskm_dtl_no_a010 = (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.MSKM_DTL_NO);
			String mskm_dtl_no_a010 = (String)kk0161_b011_map.get(EKK0191B001CBSMsg1List.MSKM_DTL_NO);
			// OM-2020-0000365 MOD END
			String ucwkState = (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_STAT);
			
			if(mskm_dtl_no.equals(mskm_dtl_no_a010))
			{
				// サービス契約内訳一意照会を実行
				condMap.clear();
				condMap.put(JKKAdchgMapperCC.COND_KEY_SVC_KEI_UCWK_NO, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));
				condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, "20991231");
				reqMap = mapper.setEKK0161A010( param, fixedText, condMap);
				resMap = scCall.run( reqMap, handle);
				HashMap<String , Object>kk0161_a010_map = mapper.getEKK0161A010( param, fixedText, resMap );
				mapper.scResultCheck( param );
				
				String lastUpdDtm = (String)kk0161_a010_map.get(EKK0161A010CBSMsg1List.LAST_UPD_DTM);
				
				// ANK-2056-00-00 2014/05/01 ADD START
				// 割引サービスコードの取得
				String wri_svc_cd = "";
				ArrayList<HashMap<String, Object>> wribSvcKeiList = getTelSelectOpPack(handle, param,
						svc_kei_no,
						(String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));
				for(int i=wribSvcKeiList.size()-1; i>=0; i--){
					if("100".compareTo((String)wribSvcKeiList.get(i).get("wrib_svc_kei_stat")) <= 0 ){
						wribSvcKeiList.remove(i);
					}
				}
				if(wribSvcKeiList.size()>0){
					wri_svc_cd = (String)wribSvcKeiList.get(0).get("wrib_svc_cd");
				
					// オプションサービス契約の登録及びOPパックの振舞いを行う
					String workKKAdchgOptionPackKey = "JKKAdchgOptionPackRunCC";
					JKKAdchgOptionPackRunCC adchgOptionPackRunCC = new JKKAdchgOptionPackRunCC();

					HashMap<String, Object> trgt_data = new HashMap<String, Object>();
					// サービス契約番号
					trgt_data.put(JKKAdchgOptionPackRunCC.SVC_KEI_NO, svc_kei_no);

					// サービス契約内訳番号
					trgt_data.put(JKKAdchgOptionPackRunCC.SVC_KEI_UCWK_NO_TEL1, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));

					// オプションパック登録パターンコード（電話１番号）
					trgt_data.put(JKKAdchgOptionPackRunCC.OP_PACK_ADD_PTN_NO1, wri_svc_cd);

					// 住所変更処理パターンフラグ
					trgt_data.put(JKKAdchgOptionPackRunCC.ADDCHANG_PTN_FLG,  JKKAdchgOptionPackRunCC.ADCHG_TELNO_ADDCL);

					// 住所変更処理モードフラグ
					trgt_data.put(JKKAdchgOptionPackRunCC.ADDCHANG_MODE_FLG, JKKAdchgOptionPackRunCC.ADCHG_ADCL_MOD);

					// 申込明細番号
					trgt_data.put(JKKAdchgOptionPackRunCC.MSKM_DTL_NO, mskm_dtl_no);

					// 異動区分を渡す
					trgt_data.put(JKKAdchgOptionPackRunCC.IDO_DIV, JKKAdchgConstCC.IDO_DIV_ADCHG_RGST);

					//解約希望年月日
					trgt_data.put("dsl_kibo_ymd", (String)reqMap.get(JKKAdchgOptionPackRunCC.DSL_KIBO_YMD));
					
					createUserData(param, workKKAdchgOptionPackKey);

					adchgOptionPackRunCC.adChgOptionPackMain(handle, param, trgt_data, workKKAdchgOptionPackKey);
					
					JKKAdchgCmnLogicCC lclCmnLogic = new JKKAdchgCmnLogicCC(handle);
					// EKK0081A010_サービス契約一意照会
					HashMap<String, Object> kk0081_a010_map_new = 
						lclCmnLogic.getEKK0081A010( param, mapper, fixedText, scCall, svc_kei_no, JKKAdchgConstCC.DEFAULT_RSV_APLY_YMD );
					// 更新年月日時分秒
					lastUpdDtm = (String)kk0081_a010_map_new.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM);

				}
				// ANK-2056-00-00 2014/05/01 ADD END

				if("010".equals(ucwkState) || "020".equals(ucwkState)){
					// サービス契約内訳キャンセル呼び出し
					condMap.clear();
					condMap.put(EKK0161C160CBSMsg.SVC_KEI_UCWK_NO, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));
					condMap.put(EKK0161C160CBSMsg.MSKM_DTL_NO, mskm_dtl_no);
					condMap.put(EKK0161C160CBSMsg.SVC_CANCEL_RSN_CD, "02");
					condMap.put(EKK0161C160CBSMsg.IDO_DIV, JKKAdchgConstCC.IDO_DIV_ADCHG_RGST);
					condMap.put(EKK0161C160CBSMsg.UPD_DTM_BF, lastUpdDtm);

					reqMap = mapper.setEKK0161C160( param, fixedText, condMap);
					resMap = scCall.run( reqMap, handle);
					HashMap<String , Object>kk0161_c160_map = mapper.getEKK0161C160( param, fixedText, resMap );
					mapper.scResultCheck( param );
					
					
				}else if("030".equals(ucwkState)){
					// サービス契約内訳解約呼び出し
					condMap.clear();
					condMap.put(EKK0161C180CBSMsg.SVC_KEI_UCWK_NO, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));
					condMap.put(EKK0161C180CBSMsg.MSKM_DTL_NO, mskm_dtl_no);
					condMap.put(EKK0161C180CBSMsg.RSV_TSTA_KIBO_YMD, JCCBPCommon.getOpeDate(null));
					condMap.put(EKK0161C180CBSMsg.SVC_ENDYMD, JCCBPCommon.getOpeDate(null));
					condMap.put(EKK0161C180CBSMsg.SVC_CHRG_ENDYMD, JCCBPCommon.getOpeDate(null));
					condMap.put(EKK0161C180CBSMsg.SVC_DLRE_CD, "03");
					condMap.put(EKK0161C180CBSMsg.SVC_DLRE_MEMO, null);
					condMap.put(EKK0161C180CBSMsg.PNLTY_HASSEI_CD, null);
					condMap.put(EKK0161C180CBSMsg.IDO_DIV, JKKAdchgConstCC.IDO_DIV_ADCHG_RGST);
					condMap.put(EKK0161C180CBSMsg.UPD_DTM_BF, lastUpdDtm);
					
					reqMap = mapper.setEKK0161C180( param, fixedText, condMap);
					resMap = scCall.run( reqMap, handle);
					HashMap<String , Object>kk0161_c180_map = mapper.getEKK0161C180( param, fixedText, resMap );
					mapper.scResultCheck( param );
					
					lastUpdDtm = (String)kk0161_c180_map.get(EKK0161C180CBSMsg.UPD_DTM);

					// サービス契約内訳解約確定呼び出し
					condMap.clear();
					condMap.put(EKK0161C190CBSMsg.SVC_KEI_UCWK_NO, (String)kk0191_b001_map.get(EKK0191B001CBSMsg1List.SVC_KEI_UCWK_NO));
					condMap.put(EKK0161C190CBSMsg.SVC_ENDYMD, JCCBPCommon.getOpeDate(null));
					condMap.put(EKK0161C190CBSMsg.SVC_DSL_KISAN_YMD, JCCBPCommon.getOpeDate(null));
					condMap.put(EKK0161C190CBSMsg.SVC_DLRE_CD, "03");
					condMap.put(EKK0161C190CBSMsg.SVC_DLRE_MEMO, null);
					condMap.put(EKK0161C190CBSMsg.UPD_DTM_BF, lastUpdDtm);
					condMap.put(EKK0161C190CBSMsg.IDO_DIV, JKKAdchgConstCC.IDO_DIV_ADCHG_RGST);
// OM-2013-0005335対応 20131227 星野 ADD START
					if("1".equals( kk0161_a010_map.get(EKK0161A010CBSMsg1List.KEIZK_AF_KEI_CHGECHU_FLG) ) ){
						condMap.put(EKK0161C190CBSMsg.KEIZK_AF_KEI_CHGECHU_FLG, "0");
					}else{
// OM-2013-0005335対応 20131227 星野 ADD END
						condMap.put(EKK0161C190CBSMsg.KEIZK_AF_KEI_CHGECHU_FLG, null);
// OM-2013-0005335対応 20131227 星野 ADD START
					}
// OM-2013-0005335対応 20131227 星野 ADD END
					condMap.put(EKK0161C190CBSMsg.ADCHG_IDO_RSV_DTL_CD, null);
					condMap.put(EKK0161C190CBSMsg.PLAN_END_SBT_CD, null);
					
					reqMap = mapper.setEKK0161C190( param, fixedText, condMap);
					resMap = scCall.run( reqMap, handle);
					HashMap<String , Object>kk0161_c190_map = mapper.getEKK0161C190( param, fixedText, resMap );
					mapper.scResultCheck( param );
				}
				// 上記以外は後続処理で論理削除
			}
		}
	}
	
// OM-2013-0005055対応 20131215 星野 ADD END
	// ANK-2056-00-00 2014/05/01 ADD START
	/**
	 * ユーザ定義文字列がユーザ情報になければデータを作成します。
	 * <br>
	 * @param param 業務データ取得用I/F
	 * @param workMapKey 業務データのマップキー
	 * @return true：作成した　False：存在していたため作成不要
	 * @throws RequestParameterException 
	 */
	private boolean createUserData(IRequestParameterReadWrite param, String workMapKey) 
	throws RequestParameterException
	{
		if (param.getData(workMapKey) == null)
		{
			param.setData(workMapKey, new HashMap<String, Object>());
			return true;
		}
		
		return false;
	}
	
	/**
	 * 電話セレクトオプションパック操作CCでパック情報を取得
	 * 
	 * @param param
	 * @param fixedText
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getTelSelectOpPack(SessionHandle handle, IRequestParameterReadWrite param, 
			String svc_kei_no, String svc_kei_ucwk_no) throws Throwable {
		String fixedTextPackCC = "fixedTextPackCC";
		JKKTelSelectOpPackOperateCC telSelectOpPackOperateCC = new JKKTelSelectOpPackOperateCC();
		//電話セレクトオプションパック操作CCに渡すパラメータを作成
		HashMap<String, Object> paramMapPackCC = new HashMap<String, Object>();
		paramMapPackCC.put("func_cd", "1");
		paramMapPackCC.put("trn_div","00"); //照会
		paramMapPackCC.put("svc_kei_no",svc_kei_no);
		paramMapPackCC.put("svc_kei_ucwk_no",svc_kei_ucwk_no);
		param.setData(fixedTextPackCC, paramMapPackCC);
		//照会を実行
		param = telSelectOpPackOperateCC.execute(handle, param, fixedTextPackCC);

		HashMap<String, Object> retMapPackCC = (HashMap<String, Object>)param.getData(fixedTextPackCC);
		ArrayList<HashMap<String, Object>> retList = (ArrayList<HashMap<String, Object>>)retMapPackCC.get("wrib_svc_kei_list"); 

		return retList;
	}
	// ANK-2056-00-00 2014/05/01 ADD END
}
