/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUKjscKaraMailLoginCC
*   ソースファイル名：JFUKjscKaraMailLoginCC.java
*   作成者          ：富士通
*   日付            ：2011年05月18日
*＜機能概要＞
*   工事進捗確認空メールログインコモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v2.00       2012/05/18   FJ）西川    新規作成
*	v4.00       2013/02/27   FJ）藤原    メールマスタ変更対応
*	v5.00       2013/07/13   FJ）瀧澤    【IT1-2013-0001371】メール宛先修正
*   v7.00       2014/01/27   FJ）中谷    【OM-2014-0000310】メール送信登録の別トランザクション対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021C040CBSMsg;

/**
 * 工事進捗確認空メールログインコモンコンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUKjscKaraMailLoginCC extends JFUKjscLoginCC
{
	/** IN項目:携帯メールアドレス */
	private static final String IN_PARAM_KTAI_MLAD = "ktai_mlad";
	/** OUT項目:メール送信可否 */
	private static final String OUT_PARAM_SEND_MAIL_KAHI = "send_mail_kahi";
	
	/** 工事案件情報 */
	private static final String KJAK_INFO = "kjak_info";
	/** 申込明細番号 */
	private static final String MSKM_DTL_NO = "mskm_dtl_no";
	/** ログイン可否フラグ */
	private static final String LOGIN_KH_FLG = "login_kh_flg";
	/** 遷移モード */
	private static final String SCREEN_MODE = "screen_mode";
	/** キャンセルフラグ */
	private static final String CANCEL_FLG = "cancel_flg";
	/** イレギュラーフラグ */
	private static final String IRREGULAR_FLG = "irregular_flg";

	/** 関連チェックエラー項目 */
	private static final String ERR_COLUMN = "key_op_svc_cd_err";
	
	
	/* ■□ 申込明細一意照会SC ■□ */
	/** テンプレートID(申込明細一意照会) */
	private static final String TEMPLATE_ID_1 = "EKK0021A010";
	/** テンプレートID(申込明細一意照会明細) */
	private static final String TEMPLATE_ID_1_DETAIL = EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST;
	/** IN項目リスト(申込明細一意照会) */
	private static final List<String> IN_COLUMN_LIST_1 = Arrays.asList(EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, EKK0021A010CBSMsg.KEY_GENE_ADD_DTM);
	/** SC実行結果取得キー(申込明細一意照会) ※連番なし */
	private static final String TEMP_TEMPLATE_KEY_1 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_1 + TEMP_TEMPLATE_PRIFIX_SEP;
	/** OUT項目リスト(申込明細一意照会) ※申込明細情報変更のIN項目とあわせる */
	private static final List<String> OUT_COLUMN_LIST_1 =
			Arrays.asList(EKK0021A010CBSMsg1List.MSKM_DTL_NO, EKK0021A010CBSMsg1List.MSKMSHO_NO, EKK0021A010CBSMsg1List.MSKM_YMD,
					EKK0021A010CBSMsg1List.MSKM_FORM_CD, EKK0021A010CBSMsg1List.MSKM_DTL_SBT_CD, EKK0021A010CBSMsg1List.RRKS_KTAI_TELNO,
					EKK0021A010CBSMsg1List.RRKS_OFFC_NM, EKK0021A010CBSMsg1List.DT_RRKS_TELNO, EKK0021A010CBSMsg1List.NEW_MSKM_SBT_CD,
					EKK0021A010CBSMsg1List.MSKM_OPTNTY_CD, EKK0021A010CBSMsg1List.TAKCHO_KIBO_APO_KIGEN_YMD,
					EKK0021A010CBSMsg1List.KOJI_APO_RRKS_SHITEI_CD, EKK0021A010CBSMsg1List.KOJI_APO_RRKS_TELNO,
					EKK0021A010CBSMsg1List.RRK_JIKO_ADD_DTM, EKK0021A010CBSMsg1List.MSKM_RRKS_MLAD, EKK0021A010CBSMsg1List.KOJI_PRG_TCHI_MLAD,
					EKK0021A010CBSMsg1List.RRK_JIKO, EKK0021A010CBSMsg1List.RCNT_SHOKAI_YMD, EKK0021A010CBSMsg1List.WEB_SHOKAI_CNT,
					EKK0021A010CBSMsg1List.PC_SHOKAI_CNT, EKK0021A010CBSMsg1List.KTAI_SHOKAI_CNT, EKK0021A010CBSMsg1List.KJSC_TCH_KTAI_MLAD,
					EKK0021A010CBSMsg1List.KJSC_TCH_PC_MLAD_CHG_YMD, EKK0021A010CBSMsg1List.KJSC_TCH_KTAI_MLAD_CHG_YMD,
					EKK0021A010CBSMsg1List.ML_SEND_JGI_FLG, EKK0021A010CBSMsg1List.ML_SEND_JGI_RSN_MEMO, EKK0021A010CBSMsg1List.BMP_MSKM_RRKS_TLN,
					EKK0021A010CBSMsg1List.OP_SVC_HKTGI_UM, EKK0021A010CBSMsg1List.DSL_ATICLE_SOHU_KIBO_UM, EKK0021A010CBSMsg1List.RRK_WAY_HOKI,
					EKK0021A010CBSMsg1List.NEWCONST_BUKKEN_CD, EKK0021A010CBSMsg1List.HUKKAT_ANKEN_FLG, EKK0021A010CBSMsg1List.SAME_EQUIP_RE_MSKM_CD,
					EKK0021A010CBSMsg1List.HNIN_CFM_ATICLE_SBT_CD, EKK0021A010CBSMsg1List.KEI_HUKA_CD, EKK0021A010CBSMsg1List.MAP_TEMP_UM,
					EKK0021A010CBSMsg1List.KCN_STB_MSKM_CNT, EKK0021A010CBSMsg1List.KCN_STB_KIND_CD,
					EKK0021A010CBSMsg1List.MANSSBSYS_RNKI_YO_KIJIRAN, EKK0021A010CBSMsg1List.MANSION_ID, EKK0021A010CBSMsg1List.CATID,
					EKK0021A010CBSMsg1List.MKM_UK_SBT_CD, EKK0021A010CBSMsg1List.MSKMSHO_TRAT_IF_TNTSHA_NM,
					EKK0021A010CBSMsg1List.MSKMSHO_TRAT_IF_TELNO, EKK0021A010CBSMsg1List.LAST_UPD_DTM, EKK0021A010CBSMsg1List.MSKMSHO_DTL_NO,
					EKK0021A010CBSMsg1List.HNIN_CFM_ATICLE_NM);
	
	/* ■□ 申込明細情報変更SC ■□ */
	/** テンプレートID(申込明細情報変更) */
	private static final String TEMPLATE_ID_2 = "EKK0021C040";
	/** IN項目リスト(申込明細情報変更) */
	private static final List<String> IN_COLUMN_LIST_2 =
			Arrays.asList(EKK0021C040CBSMsg.MSKM_DTL_NO, EKK0021C040CBSMsg.MSKMSHO_NO, EKK0021C040CBSMsg.MSKM_YMD, EKK0021C040CBSMsg.MSKM_FORM_CD,
					EKK0021C040CBSMsg.MSKM_DTL_SBT_CD, EKK0021C040CBSMsg.RRKS_KTAI_TELNO, EKK0021C040CBSMsg.RRKS_OFFC_NM,
					EKK0021C040CBSMsg.DT_RRKS_TELNO, EKK0021C040CBSMsg.NEW_MSKM_SBT_CD, EKK0021C040CBSMsg.MSKM_OPTNTY_CD,
					EKK0021C040CBSMsg.TAKCHO_KIBO_APO_KIGEN_YMD, EKK0021C040CBSMsg.KOJI_APO_RRKS_SHITEI_CD, EKK0021C040CBSMsg.KOJI_APO_RRKS_TELNO,
					EKK0021C040CBSMsg.RRK_JIKO_ADD_DTM, EKK0021C040CBSMsg.MSKM_RRKS_MLAD, EKK0021C040CBSMsg.KOJI_PRG_TCHI_MLAD,
					EKK0021C040CBSMsg.RRK_JIKO, EKK0021C040CBSMsg.RCNT_SHOKAI_YMD, EKK0021C040CBSMsg.WEB_SHOKAI_CNT, EKK0021C040CBSMsg.PC_SHOKAI_CNT,
					EKK0021C040CBSMsg.KTAI_SHOKAI_CNT, EKK0021C040CBSMsg.KJSC_TCH_KTAI_MLAD, EKK0021C040CBSMsg.KJSC_TCH_PC_MLAD_CHG_YMD,
					EKK0021C040CBSMsg.KJSC_TCH_KTAI_MLAD_CHG_YMD, EKK0021C040CBSMsg.ML_SEND_JGI_FLG, EKK0021C040CBSMsg.ML_SEND_JGI_RSN_MEMO,
					EKK0021C040CBSMsg.BMP_MSKM_RRKS_TLN, EKK0021C040CBSMsg.OP_SVC_HKTGI_UM, EKK0021C040CBSMsg.DSL_ATICLE_SOHU_KIBO_UM,
					EKK0021C040CBSMsg.RRK_WAY_HOKI, EKK0021C040CBSMsg.NEWCONST_BUKKEN_CD, EKK0021C040CBSMsg.HUKKAT_ANKEN_FLG,
					EKK0021C040CBSMsg.SAME_EQUIP_RE_MSKM_CD, EKK0021C040CBSMsg.HNIN_CFM_ATICLE_SBT_CD, EKK0021C040CBSMsg.KEI_HUKA_CD,
					EKK0021C040CBSMsg.MAP_TEMP_UM, EKK0021C040CBSMsg.KCN_STB_MSKM_CNT, EKK0021C040CBSMsg.KCN_STB_KIND_CD,
					EKK0021C040CBSMsg.MANSSBSYS_RNKI_YO_KIJIRAN, EKK0021C040CBSMsg.MANSION_ID, EKK0021C040CBSMsg.CATID,
					EKK0021C040CBSMsg.MKM_UK_SBT_CD, EKK0021C040CBSMsg.MSKMSHO_TRAT_IF_TNTSHA_NM, EKK0021C040CBSMsg.MSKMSHO_TRAT_IF_TELNO,
					EKK0021C040CBSMsg.UPD_DTM_BF,EKK0021C040CBSMsg.MSKMSHO_DTL_NO,EKK0021C040CBSMsg.HNIN_CFM_ATICLE_NM);
	
	/**
	 * 工事進捗確認ログイン処理.<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	@Override
	public IRequestParameterReadWrite login(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		try
		{
			//----------------------------------------------
			// スーパークラスのログイン処理を実行する
			//----------------------------------------------
			super.login(handle, param, fixedText);
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
			
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);
			
			// メール送信可否：可
			inMap.put(OUT_PARAM_SEND_MAIL_KAHI, JFUStrConst.CD00003_1);
			
			// 工事案件情報(スーパークラスのログイン処理で設定)
			ArrayList kjakList = (ArrayList)inMap.get(KJAK_INFO);
			
			//----------------------------------------------
			// 処理結果判定
			//----------------------------------------------
			// --------------------------------------
			// ログイン可否フラグが"False"の場合、
			// または、遷移モードが"4"(受付中)の場合
			// --------------------------------------
			if (JFUStrConst.LOGIN_KH_FLG_FALSE.equals(inMap.get(LOGIN_KH_FLG)) || JFUStrConst.SCREEN_MODE_UK.equals(inMap.get(SCREEN_MODE)))
			{
				// メール送信可否：否
				inMap.put(OUT_PARAM_SEND_MAIL_KAHI, JFUStrConst.CD00003_0);
				// メール設定不可のため、処理終了
				return param;
			}
			// --------------------------------------
			// キャンセル・イレギュラーチェック
			// --------------------------------------
			else if (!isCancelOrIrregular(kjakList))
			{
				// メール送信可否：否
				inMap.put(OUT_PARAM_SEND_MAIL_KAHI, JFUStrConst.CD00003_0);
				// メール設定不可のため、処理終了
				return param;
			}
			
			// 工事進捗通知メールアドレス
			String kjscTchKtaiMlad = null;
			
			for (int i = 0; i < kjakList.size(); i++)
			{
				HashMap kjakMap = (HashMap)kjakList.get(i);
				
				// 工事案件情報[i]にデータが設定されていない場合、次の工事案件情報を処理する。
				if (JFUBPCommon.isNull((String)kjakMap.get(MSKM_DTL_NO)))
				{
					continue;
				}
				
				//----------------------------------------------
				// 申込明細一意照会
				//----------------------------------------------
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_1);
				// 上りマッピング
				setInMapEKK0021A010(param, fixedText, kjakMap);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERR_COLUMN);
				//----------------------------------------------
				
				// 工事進捗通知メールアドレスを取得 ※PCメールアドレス
				if (JFUBPCommon.isNull(kjscTchKtaiMlad))
				{
					kjscTchKtaiMlad = JFUBPCommon.trim(getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_1),
																			TEMPLATE_ID_1_DETAIL, EKK0021A010CBSMsg1List.KOJI_PRG_TCHI_MLAD, 0));
				}

				//----------------------------------------------
				// 申込明細情報変更
				//----------------------------------------------
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_2);
				// 上りマッピング
				setInMapEKK0021C040(param, fixedText);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_2, "", IN_COLUMN_LIST_2, null);
				//----------------------------------------------
			}
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
		
	}
	
	/**
	 * キャンセル・イレギュラーチェック
	 * <br>
	 * @param kjakList 工事案件情報
	 * @return  true:キャンセル・イレギュラー以外/false:キャンセル・イレギュラー
	 * @throws Exception すべての例外
	 */
	private boolean isCancelOrIrregular(ArrayList kjakList) throws Exception
	{
		boolean ret = true;
		
		String cancel_flg = null;
		String irregular_flg = null;
		
		boolean isTmpCancel = true;
		boolean isAllCancel = true;
		
		boolean isTmpIrregular = true;
		boolean isAllIrregular = true;
		
		HashMap kjakMap = null;
		
		for (int i = 0; i < kjakList.size(); i++)
		{
			kjakMap = (HashMap)kjakList.get(i);
			
			// 工事案件情報.キャンセルフラグ
			cancel_flg = (String)kjakMap.get(CANCEL_FLG);
			// 工事案件情報.イレギュラーフラグ
			irregular_flg = (String)kjakMap.get(IRREGULAR_FLG);
			
			// キャンセルフラグが"0"(通常)以外か?
			isTmpCancel = !JFUStrConst.CD00774_0.equals(cancel_flg);
			isAllCancel = isAllCancel && isTmpCancel;
			
			// キャンセルフラグが"0"(通常)の場合、イレギュラーフラグが"1"(イレギュラー有)か?
			if (!isTmpCancel)
			{
				isTmpIrregular = JFUStrConst.CD00775_1.equals(irregular_flg);
				isAllIrregular = isAllIrregular && isTmpIrregular;
			}
		}
		
		// 全明細がキャンセルの場合
		if (isAllCancel)
		{
			// メール設定不可
			ret = false;
		}
		// キャンセルフラグが"0"(通常)以外の全明細.イレギュラーフラグが"1"(イレギュラー有)
		else if (isAllIrregular)
		{
			// メール設定不可
			ret = false;
		}
		
		return ret;
	}
	
	/**
	 * 上りマッピング項目設定(申込明細一意照会)
	 * <br>
	 * @param param			リクエストパラメータ
	 * @param fixedText		サービスメッセージ
	 * @param kjakMap		工事案件情報マップ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0021A010(IRequestParameterReadWrite param, String fixedText, HashMap kjakMap) throws RequestParameterException
	{
		// 機能コード設定(2:申込明細一意照会(カレント))
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);
		
		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿申込明細番号 ← 工事案件情報.申込明細番号
		inMap.put(EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, kjakMap.get(MSKM_DTL_NO));
	}
	
	/**
	 * 上りマッピング項目設定(申込明細情報変更)
	 * <br>
	 * @param param				リクエストパラメータ
	 * @param fixedText			サービスメッセージ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK0021C040(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		
		// 機能コード設定(1:チェック&登録)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		//----------------------------------------------
		// 登録値の設定(一意照会の結果を設定)
		//----------------------------------------------
		String inColNm = null;
		String outColNm = null;
		
		// IN項目リスト(申込明細情報変更)の項目すべてに、一意照会結果を設定
		for (int i = 0; i < IN_COLUMN_LIST_2.size(); i++)
		{
			inColNm = IN_COLUMN_LIST_2.get(i);
			outColNm = OUT_COLUMN_LIST_1.get(i);
			
			inMap.put(inColNm, getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_1), TEMPLATE_ID_1_DETAIL, outColNm, 0));
		}
		
		//----------------------------------------------
		// 更新情報の設定
		//----------------------------------------------
		// 工事進捗通知携帯メールアドレス
		inMap.put(EKK0021C040CBSMsg.KJSC_TCH_KTAI_MLAD, inMap.get(IN_PARAM_KTAI_MLAD));			// IN項目:携帯メールアドレス
		// 工事進捗通知携帯メールアドレス変更年月日
		inMap.put(EKK0021C040CBSMsg.KJSC_TCH_KTAI_MLAD_CHG_YMD, JFUBPCommon.getOpeDate(null));	// 運用日付

	}
	
	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}
}
