/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAdchgCancelMskmInfo
*   ソースファイル名：JKKAdchgCancelMskmInfo.java
*   作成者          ：FJ
*   日付            ：2012年12月15日
*＜機能概要＞
*   住所変更申込キャンセル部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v4.00.00	2012/12/15	FJ			新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EKK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;

/**
 * 住所変更申込キャンセル部品
 * 
 * @author 富士通
 */
public class JKKAdchgCancelMskmInfo extends AbstractCommonComponent
{

	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKAdchgCancelMskmInfoMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;

	/** 住所変更申込キャンセルクラス用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	/** 申込番号 */
	private String mskmNo                 = null;
	/** 申込明細番号リスト */
	private ArrayList<String> mskmDtlList = null;
	
	/** パラメータ設定Key：申込番号 */
	private static final String KEY_MSKM_NO = "mskm_no";
	/** パラメータ設定Key：申込明細番号リスト */
	private static final String KEY_MSKM_DTL_LIST = "mskm_dtl_list";
	
	/** マップキー：申込明細ステータス */
	private static final String MAP_KEY_STAT = "stat";
	/** マップキー：申込明細番号 */
	private static final String MAP_KEY_MSKM_DTL_NO = "mskmDtlNo";
	
	/** 申込ステータス（キャンセル済） */
	private static final String MSKM_STAT_CANCEL_ZUMI = "920";
	
// 故障通番:100024 2013.01.05 Y.MORIMOTO ADD START
	/** 申込明細ステータス（キャンセル済） */
	private static final String MSKM_DTL_STAT_CANCECL_ZUMI = "920";
// 故障通番:100024 2013.01.05 Y.MORIMOTO ADD END
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>デバッグログを出力します<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	@SuppressWarnings("static-access")
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>住所変更申込キャンセル処理を実施する.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle    セッションハンドル
	 * @param param     リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle,
												IRequestParameterReadWrite param,
												String fixedText) throws Throwable {
		printlnEjbLog("execute start");
		
		// オンライン運用日付
		String opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKAdchgCancelMskmInfoMapper(handle, param, opeDate);
		
		// ユーザデータ情報
		this.inMap = (HashMap<String, Object>)param.getData(fixedText);
		printlnEjbLog("fixedText=" + fixedText);
		
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null) {
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		// 住所変更申込キャンセル部品クラス用の作業領域
		this.ccWorkMap = new HashMap();
		workMap.put(this.getClass().getName(), this.ccWorkMap);
		
		// 入力データチェック
		chkInMap(handle, param);
		
		// メイン処理実行
		cancelMskmInfo(handle, param);

		// 作業領域のクリア
		workMap.remove(this.getClass().getName());
		
		printlnEjbLog("execute end");
		return param;
	}

	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>入力データをチェックします.<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @return true:引継ぎ可能、false：引継ぎ不可
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("chkInMap start");
		
		// 申込番号取得
		this.mskmNo = (String) this.inMap.get(KEY_MSKM_NO);
		
		if (!JKKStringUtil.isNullBlank(this.mskmNo)) {
			printlnEjbLog("申込番号=" + this.mskmNo.toString());
		} else {
			printlnEjbLog("申込番号=NULL");
			throw new CCException("申込番号=NULL", new Exception());
		}
		
		// 申込明細番号リスト取得
		ArrayList<HashMap<String, String>> list = (ArrayList<HashMap<String, String>>) this.inMap.get(KEY_MSKM_DTL_LIST);
		
		if (list != null) {
			
			int cnt = 0;
			this.mskmDtlList = new ArrayList<String>();
			for (HashMap<String, String> obj : list) {
				cnt++;
				this.mskmDtlList.add(obj.get("mskm_dtl_no"));
				printlnEjbLog("申込明細番号リスト"+ cnt + "件目=" + obj.get("mskm_dtl_no"));
			}
			
			if (cnt == 0) {
				printlnEjbLog("申込明細番号リスト(申込明細番号)=NULL");
				throw new CCException("申込明細番号リスト(申込明細番号)=NULL", new Exception());
			}
			
		} else {
			printlnEjbLog("申込明細番号リスト=NULL");
			throw new CCException("申込明細番号リスト=NULL", new Exception());
		}
		
		printlnEjbLog("chkInMap end");
	}
	
	/**
	 * 
	 * <dl>
	 * <dt>処理概要：
	 * <dd>申込明細関連のキャンセル処理実施<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param handle セッションハンドル
	 * @param param  リクエストパラメータ
	 * @throws Throwable 
	 */
	private void cancelMskmInfo(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable {
		printlnEjbLog("cancelMskmInfo start");
		
		// 申込スキーマ検索
		CAANMsg[] kk0011A010 = this.mapper.callEKK0011A010(this.mskmNo);
		if (kk0011A010 == null) {
			printlnEjbLog("申込スキーマなし(申込番号=" + this.mskmNo + ")");
			return;
		}
		
		// 申込ステータスチェック
		String stat = kk0011A010[0].getString(EKK0011A010CBSMsg1List.MSKM_STAT);
		if (MSKM_STAT_CANCEL_ZUMI.equals(kk0011A010[0].getString(EKK0011A010CBSMsg1List.MSKM_STAT))) {
// 故障通番:100024 2013.01.05 Y.MORIMOTO ADD START
			// 申込明細のステータス確認
			for (String mskmDtlNo : this.mskmDtlList) {
				
				// 申込明細スキーマ検索
				CAANMsg[] kk0021A010 = this.mapper.callEKK0021A010(mskmDtlNo);
				if (kk0021A010 == null) {
					printlnEjbLog("申込明細スキーマなし(申込明細番号=" + mskmDtlNo + ")");
					continue;
				}
				
				// 申込明細ステータスチェック
				if (MSKM_DTL_STAT_CANCECL_ZUMI.equals(kk0021A010[0].getString(EKK0021A010CBSMsg1List.MSKM_DTL_STAT)))
				{
					continue;
				}
				
				// 申込スキーマ更新
				CAANMsg[] kk0021CAANMsg = this.mapper.callEKK0021C070(mskmDtlNo,
																		kk0021A010[0].getString(EKK0011A010CBSMsg1List.LAST_UPD_DTM));
				
				if (kk0021CAANMsg == null) {
					printlnEjbLog("対象となる申込明細情報なし");
				}
			}
// 故障通番:100024 2013.01.05 Y.MORIMOTO ADD END
			printlnEjbLog("申込スキーマステータス不備(申込ステータス=" + kk0011A010[0].getString(EKK0011A010CBSMsg1List.MSKM_STAT) + ")");
			return;
		}
		
		// 申込,申込明細スキーマ更新処理
		ArrayList<HashMap<String, String>> kk0021 = new ArrayList<HashMap<String, String>>();
		for (String mskmDtlNo : this.mskmDtlList) {
			
			// 申込明細スキーマ検索
			CAANMsg[] kk0021A010 = this.mapper.callEKK0021A010(mskmDtlNo);
			if (kk0021A010 == null) {
				printlnEjbLog("申込明細スキーマなし(申込明細番号=" + mskmDtlNo + ")");
				continue;
			}
			
			HashMap<String, String> map = new HashMap<String, String>();
			map.put(MAP_KEY_STAT,        kk0021A010[0].getString(EKK0021A010CBSMsg1List.MSKM_DTL_STAT));
			map.put(MAP_KEY_MSKM_DTL_NO, mskmDtlNo);
			kk0021.add(map);
		}
		
		// 申込スキーマ更新
		CAANMsg[] kk0011CAANMsg = this.mapper.callEKK0011C060(this.mskmNo,
																kk0011A010[0].getString(EKK0011A010CBSMsg1List.LAST_UPD_DTM),
																kk0021);
		
		if (kk0011CAANMsg == null) {
			printlnEjbLog("対象となる申込明細情報なし");
		}
		
//		if(true)
//		{
//			throw new Exception();
//		}
		printlnEjbLog("cancelMskmInfo end");
	}
}
