/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKAdchgCnclAgingCC
*   ソースファイル名：JKKAdchgCnclAgingCC.java
*   作成者          ：FJ
*   日付            ：2012年12月20日
*＜機能概要＞
*   住所変更キャンセルエイジング処理を行う。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*	v4.00.00	2012/12/20	FJ			新規作成
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

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;

/**
 * 住所変更キャンセルエイジング処理クラス
 * 
 * @author 富士通
 */
public class JKKAdchgCnclAgingCC extends AbstractCommonComponent
{
	/** サービスインタフェース呼び出しで使用するマッパー群 */
	private JKKAdchgCnclAgingCCMapper mapper = null;
	
	/** ユーザデータ情報 */
	private HashMap<String, Object> inMap = null;
	
	/** 住所変更キャンセルエイジング用の作業領域 */
	private Map<String, Object> ccWorkMap = null;
	
	/** 運用日 */
	private String opeDate = null;
	
	/** 引数設定Key：エイジング種別コード */
	private final String PARA_KEY_AGING_SBT_CD         = "aging_sbt_cd";
	/** 引数設定Key：エイジング対象値 */
	private final String PARA_KEY_KEI_AGING_TG_VALUE   = "aging_tg_value";
	/** 引数設定Key：エイジング実行種別 */
	private final String PARA_KEY_KEI_AGING_EXE_STB_CD = "aging_exe_stb_cd";
	
	/** エイジング種別コード */
	private String agingSbtCd    = null;
	/** エイジング対象値 */
	private String agingTgValue  = null;
	/** エイジング実行種別 */
	private String agingExeStbCd = null;
	
	/** エイジング実行種別値　01 */
	private String AGING_EXE_STB_CD_01 = "01";
	/** エイジング実行種値　02 */
	private String AGING_EXE_STB_CD_02 = "02";
	
	/**
	 * デバッグログを出力します。<BR>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
	
	/**
	 * 住所変更キャンセルエイジングを実施する
	 * 
	 * @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");
		// オンライン運用日付
		this.opeDate = JCCBPCommon.getOpeDate(null);
		
		// CC-SCマッピングクラスのインスタンス生成
		this.mapper = new JKKAdchgCnclAgingCCMapper(handle, param, opeDate);
		
		printlnEjbLog("fixedText=" + fixedText);
		// ユーザデータ情報
		inMap = (HashMap<String, Object>)param.getData(fixedText);
		
		// 作業領域の取得
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		ccWorkMap = new HashMap();
		// 作業領域
		workMap.put(this.getClass().getName(), this.ccWorkMap);

		// 入力データチェック
		chkInMap(handle, param);
		
		// エイジング一覧照会(エイジング対象値)
		CAANMsg[] zm0111b030List = this.mapper.callEZM0111B030(this.agingSbtCd, this.agingTgValue);
		if (zm0111b030List == null)
		{
			printlnEjbLog("エイジング一覧照会(エイジング対象値)=NULL");
			return param;
		}
		
		for (CAANMsg row : zm0111b030List)
		{
			// エイジング番号
			String agingNo = row.getString("aging_no");
			
			// エイジング一意照会
			CAANMsg zm0111a010 = this.mapper.callEZM0111A010(agingNo);
			if (zm0111a010 == null)
			{
				printlnEjbLog("エイジング一意照会=NULL エイジング番号=" + agingNo);
				continue;
			}
			
			// エイジングステータス
			String agingStat = zm0111a010.getString("aging_stat");
			// エイジング種別コード
			String agingSbtCd = zm0111a010.getString("aging_sbt_cd");
			// エイジング対象値
			String agingTgValue = zm0111a010.getString("aging_tg_value");
			// 更新年月日時分秒
			String updDtm = zm0111a010.getString("upd_dtm");
			
			if (AGING_EXE_STB_CD_01.equals(this.agingExeStbCd) && "200".equals(agingStat))
			{
				// エイジング実行種別が01（エイジング回復）且つエイジングステータスが200（回復可能）
				// エイジング対象回復
				this.mapper.callEZM0111C020(agingNo,
											agingSbtCd,
											agingTgValue,
											JCCBPCommon.getOpeDateTimeStamp(null),
											updDtm);
			}
			if (AGING_EXE_STB_CD_02.equals(this.agingExeStbCd) && "100".equals(agingStat))
			{
				// エイジング実行種別が02（エイジング終了）且つエイジングステータスが200（使用中）
				// エイジング対象使用終了
				this.mapper.callEZM0111C010(agingNo,
											agingSbtCd,
											agingTgValue,
											JCCBPCommon.getOpeDateTimeStamp(null),
											updDtm);
			}
		}
		
		// 作業領域のクリア
		workMap.remove(this.getClass().getName());
		
		printlnEjbLog("execute end");
		return param;
	}

	/**
	 * 入力データをチェックします。
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @return true:引継ぎ可能、false：引継ぎ不可
	 * @throws Throwable 
	 */
	private void chkInMap(SessionHandle handle, IRequestParameterReadWrite param) throws Throwable
	{
		printlnEjbLog("chkInMap start");
		
		// エイジング種別コード
		this.agingSbtCd = (String)inMap.get(PARA_KEY_AGING_SBT_CD);
		if (JKKStringUtil.isNullBlank(agingSbtCd))
		{
			printlnEjbLog("エイジング種別コードが未設定");
			throw new CCException("エイジング種別コードが未設定", new Exception());
		}
		else
		{
			printlnEjbLog("エイジング種別コード=" + this.agingSbtCd);
		}
		
		// エイジング対象値
		this.agingTgValue = (String)inMap.get(PARA_KEY_KEI_AGING_TG_VALUE);
		if (JKKStringUtil.isNullBlank(agingTgValue))
		{
			printlnEjbLog("エイジング対象値が未設定");
			throw new CCException("エイジング対象値が未設定", new Exception());
		}
		else
		{
			printlnEjbLog("エイジング対象値=" + this.agingTgValue);
		}
		
		// エイジング実行種別
		this.agingExeStbCd = (String)inMap.get(PARA_KEY_KEI_AGING_EXE_STB_CD);
		if (JKKStringUtil.isNullBlank(agingExeStbCd))
		{
			printlnEjbLog("エイジング実行種別が未設定");
			throw new CCException("エイジング実行種別が未設定", new Exception());
		}
		else
		{
			printlnEjbLog("エイジング実行種別=" + this.agingExeStbCd);
		}
		if (AGING_EXE_STB_CD_01.equals(this.agingExeStbCd) || AGING_EXE_STB_CD_02.equals(this.agingExeStbCd))
		{
			// OK
		}
		else
		{
			printlnEjbLog("エイジング実行種別が想定外=" + this.agingExeStbCd);
			throw new CCException("エイジング実行種別が想定外=" + this.agingExeStbCd, new Exception());
		}
		
		printlnEjbLog("chkInMap end");
	}
}
