/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：KKW22501SFLogic
 *   ソースファイル名：KKW22501SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2018年06月01日
 *＜機能概要＞
 *   代理店イベントＣＰ設定画面のビューロジックです。
 *＜修正履歴＞
 *   バージョン   修正日       修正者      修正内容
 *	v44.00.00	 2019/05/25	  FJ) 松原	【ANK-3272-00-00】【随時機能化案件】モバイルイベントＣＰ登録対応（運用88）
 *   
 **********************************************************************/
package eo.web.webview.KKW22501SF;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JPCDateUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.common.JKKGetDataUtil;
import eo.web.webview.common.JKKScreenConst;
import eo.web.webview.common.JKKWebCommon;
import eo.web.webview.mapping.KKSV0940_KKSV0940OPDBMapper;






/**
 * KKW22501のビューロジックです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class KKW22501SFLogic extends JCCWebBusinessLogic
{
	/**
	 * 処理区分(検索)
	 */
	private static final String PROCESS_KBN_01 = "01";
	/**
	 * 処理区分(CP検索)
	 */
	private static final String PROCESS_KBN_02 = "02";
	/**
	 * 処理区分(登録・変更・削除)
	 */
	private static final String PROCESS_KBN_03 = "03";
	/**
	 * 詳細表示フラグ(非表示)
	 */
	private static final String DTL_DSP_FLG_N = "0";
	
	
	
	
	
	
	/**
	 * 初期表示処理<br>
	 * <br>
	 * １．画面情報を取得し、サービスフォームBeanに設定します。<br>
	 * ２．画面表示用にDataBeanに格納します。<br>
	 * <br>
	 *
	 * @return 正常／異常
	 * @throws Exception 
	 */
	public boolean actionInit() throws Exception 
	{
		// 画面情報を取得し、サービスフォームBeanに設定
		JCCWebCommon.getScreenInfo(this);
		
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess  commoninfoBean = super.getCommonInfoBean();
		
		// 画面名を共有フォームBeanの項目に設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,JKKScreenConst.SCREEN_NAME_KKW22501);
		
		// 表示フラグ"0"にする
		bean.sendMessageString(KKW22501SFConst.DTL_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, DTL_DSP_FLG_N);
		
		// DataBeanをログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		return true;
	}

	/**
	 * 検索処理<br>
	 * <br>
	 * １．処理区分を設定します。
	 * ２．検索実行処理を行います。<br>
	 * <br>
	 *
	 * @return 正常／異常
	 * @throws Exception 
	 */
	public boolean actionSearch() throws Exception 
	{
		boolean result = true;
		
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess commonBean = super.getCommonInfoBean();
		
		// 自画面遷移
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW22501);
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW22501);
		
		// 検索系フラグ、および検索結果の初期化
		beforeSearch(bean);
		
		// 処理区分"01"(検索)
		bean.sendMessageString(KKW22501SFConst.PROCESS_KBN, X31CWebConst.DATABEAN_SET_VALUE, PROCESS_KBN_01);
		
		// 検索処理実行
		execSearch(bean);
		
		// (登録用)受付終了年月日に"20991231"を設定
		bean.sendMessageString(KKW22501SFConst.AGNT_SET_CAMPAIGN_ENDYMD, X31CWebConst.DATABEAN_SET_VALUE, "20991231");
		
		// メッセージを設定(代理店・CP未存在チェック)
		String dtlDspFlg = bean.sendMessageString(KKW22501SFConst.DTL_DSP_FLG, X31CWebConst.DATABEAN_GET_VALUE);
		if (DTL_DSP_FLG_N.equals(dtlDspFlg))
		{
			JCCWebCommon.setMessageInfo(this,
					JPCOnlineMessageConstant.EKB0740_KW,
					new String[] { "代理店コード" });
		}
		else
		{
			X31SDataBeanAccessArray dchskmSeteJknList = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_SETE_JKN_LIST);
			X31SDataBeanAccess subbean = dchskmSeteJknList.getDataBean(0);
			String dspDchskmCd = subbean.sendMessageString(KKW22501SFConst.DSP_DCHSKM_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
			
			if ("".equals(dspDchskmCd))
			{
				JCCWebCommon.setMessageInfo(this,
						JPCOnlineMessageConstant.EKBF310__I);
			}
		}
		
		// DataBeanをログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		return result;
	}

	/**
	 * 検索前処理<br>
	 * <br>
	 * 検索系フラグ、および検索結果の初期化を行います。<BR>
	 * <br>
	 * @param bean データBeanアクセスクラス
	 */
	private void beforeSearch(X31SDataBeanAccess bean) 
	{
		// 一覧表示部分を非表示にする
		bean.sendMessageString(KKW22501SFConst.DTL_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, DTL_DSP_FLG_N);

		// データ抽出項目設定条件一覧照会（イベントＣＰ）明細クリア
		X31SDataBeanAccessArray dcksjlist = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_SETE_JKN_LIST);
		dcksjlist.clearArray();

		// 変更前データ抽出項目設定条件一覧照会（イベントＣＰ）明細クリア
		X31SDataBeanAccessArray bf_dcksjlist = bean.getDataBeanArray(KKW22501SFConst.BF_DCHSKM_SETE_JKN_LIST);
		bf_dcksjlist.clearArray();

		// データ抽出項目一覧照会明細クリア
		X31SDataBeanAccessArray dcklist = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_LIST);
		dcklist.clearArray();
		dcklist.addDataBean();
		
	}
	
	/**
	 * 検索実行処理<BR>
	 * <BR>
	 * 検索処理を実行します。
	 * １．データ抽出項目設定条件一覧照会（イベントCP）SCを呼び出します。
	 * ２．エラーがあれば、ステータスに従いメッセージをセットします。
	 * ３．エラーがなければ、一覧表示部分を表示します。
	 * <p>
	 * @param bean サービスフォームBean
	 * @throws Exception
	 */
	private HashMap<String, Object> execSearch(X31SDataBeanAccess bean) throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess[] paramBean = {bean};
		
		// 上りマッピング処理(サービス項目-DataBean項目マッピング)
		KKSV0940_KKSV0940OPDBMapper mapper = new KKSV0940_KKSV0940OPDBMapper();
		HashMap<String, Object> input = new HashMap<String, Object>();
		HashMap<String, Object> output = new HashMap<String, Object>();
		mapper.setKKSV094001CC(paramBean, input);
		
		// サービス呼出処理
		invokeService(input, output, "KKSV0940", "KKSV0940OP");
		
		// 下りマッピング処理(サービス項目-DataBean項目マッピング)
		mapper.getKKSV094001CC(paramBean, output);
		
		return output;
	}

	/**
	 * サービス呼出処理<br>
	 * <br>
	 * サービスの呼び出しを行います。<br>
	 * <br>
	 * @param usecase_id ユースケースID
	 * @param operation_id オペレーションID
	 * @return APサーバでエラーが発生した場合は、エラーメッセージ情報オブジェクトが返却されます。<br>
	 * 正常終了時には、null値が返却されます。
	 * @throws Exception 
	 */
	private X31CMessageResult invokeService(HashMap<String, Object> input, HashMap<String, Object> output, String usecase_id, String operation_id) throws Exception
	{
		// 戻り値用
		X31CMessageResult msgResult = null;
		
		// パラメタ設定
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, usecase_id);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, operation_id);
		
		// メッセージリストの初期化
		clearMessageResultList();
		
		// DataBeanをログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		// サービスの呼び出し
		msgResult = invokeService(paramMap, input, output);
		
		// DataBeanをログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		return msgResult;
	}
	
	/**
	 * キャンペーンの名称を取得します。（非同期通信用）
	 * @return true
	 * @throws Exception 業務サービス内でエラーが発生した場合
	 */
	public boolean searchCampaignCdAjax() throws Exception
	{
		JKKWebCommon.setSelfScreenID(this);
		
		X31SDataBeanAccess bean = getServiceFormBean();
		bean.sendMessageString(KKW22501SFConst.SEARCH_CAMPAIGN_NM, X31CWebConst.DATABEAN_SET_VALUE, "");
		
		String campaignCd = bean.sendMessageString(KKW22501SFConst.SEARCH_CAMPAIGN_CD, X31CWebConst.DATABEAN_GET_VALUE);
		
		if (null == campaignCd || campaignCd.length() < 8)
		{
			return true;
		}		
		// キャンペーン名称を取得
		getCampaignCdInfo(campaignCd, bean);
		
		return true;
	}

	/**
	 *デー抽出項目マスタよりキャンペーン情報を取得します。
	 * @param画面ID
	 * @returnキャンペーン情報報
	 */
	@SuppressWarnings("unchecked")
	private void getCampaignCdInfo(String campaignCd, X31SDataBeanAccess bean)
	{
		
		X31SDataBeanAccess[] paramBean = { bean };
		
		if (null == campaignCd || "".equals(campaignCd) || campaignCd.length() < 8)
		{
			return;
		}
		KKSV0940_KKSV0940OPDBMapper mapper = new KKSV0940_KKSV0940OPDBMapper();
		// サービス検索条件格納用マップ
		HashMap input = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap output = new HashMap<String, String>();
		// サービスIDをparamMapにセット
		Map paramMap = new HashMap<String, String>();
		
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JKKCommonConst.UCID_KKSV0940);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, JKKCommonConst.OPID_KKSV0940OP);
		
		// 処理区分"02"(CP検索)
		bean.sendMessageString(KKW22501SFConst.PROCESS_KBN, X31CWebConst.DATABEAN_SET_VALUE, PROCESS_KBN_02);
		
		// EKK1351B501_データ抽出項目一覧照会
		mapper.setKKSV094001CC(paramBean, input);
		
		// サービス呼出処理
		invokeService(paramMap, input, output);
		
		// 取得情報の下りマッピング
		mapper.getKKSV094001CC(paramBean, output);
		
		return;
	}

	/**
	 * 登録ボタン押下処理
	 * 
	 * @return 処理結果
	 * @throws Exception Exception
	 */
	public boolean actionAdd() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };
		
		// *********
		// 登録実行
		// *********
		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0940_KKSV0940OPDBMapper mapper = new KKSV0940_KKSV0940OPDBMapper();
		
		// 変数の定義
		HashMap<String, Object> paramMap  = new HashMap<String, Object>();
		HashMap<String, Object> inputMap  = new HashMap<String, Object>();
		HashMap<String, Object> outputMap  = new HashMap<String, Object>();
		
		// ユースケースID格納用マップに情報を設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JKKCommonConst.UCID_KKSV0940);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, JKKCommonConst.OPID_KKSV0940OP);
		
		// 処理区分(登録・変更・削除)
		bean.sendMessageString(KKW22501SFConst.PROCESS_KBN, X31CWebConst.DATABEAN_SET_VALUE, PROCESS_KBN_03);
		
		X31SDataBeanAccessArray dchskmSeteJknList = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_SETE_JKN_LIST);
		
		String ukStaymd = bean.sendMessageString(KKW22501SFConst.AGNT_SET_CAMPAIGN_STAYMD, X31CWebConst.DATABEAN_GET_VALUE);
		if(!(JKKGetDataUtil.isNull(ukStaymd))){
			// 受付開始日が運用日より過去日付の場合、エラー（EKB0270-NW）
			if (JPCDateUtil.subtractDay(ukStaymd, JCCWebCommon.getOpeDate(this, null)) < 0) {
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0260_NW, new String[] { "受付開始年月日", "運用日", "日付" }, "uk_set_ymd_from");
				return false;
			}
		}
		
		// 受付開始年月日が既に登録済みのキャンペーンの受付開始終了の期間内にある時、エラー
		if (!isUkYmdCheck(ukStaymd, -1, bean)) {
			return false;
		}
		for (int i = 0; i < dchskmSeteJknList.getCount(); i++)
		{
			X31SDataBeanAccess subbean = dchskmSeteJknList.getDataBean(i);
			if(subbean.sendMessageBoolean(KKW22501SFConst.DEL_CHECK_01, X31CWebConst.DATABEAN_GET_VALUE)){
				continue;
			}
			ukStaymd = subbean.sendMessageString(KKW22501SFConst.UK_STA_YMDHM_01, X31CWebConst.DATABEAN_GET_VALUE);
			if (!isUkYmdCheck(ukStaymd, i, bean)) {
				return false;
			}
		}
		
		mapper.setKKSV094001CC(paramBean, inputMap);
		
		Boolean isTrue = Boolean.valueOf(true);
		
		// 登録・変更・削除の入力がない場合はエラー
		if (!isTrue.equals(inputMap.get("rslt_kbn_1"))
				&& !isTrue.equals(inputMap.get("rslt_kbn_2"))
				&& !isTrue.equals(inputMap.get("rslt_kbn_3"))) {
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE121_KW, new String[]{""});
			return false;
		}
		
		invokeService(paramMap, inputMap, outputMap);
		
		// メッセージを設定(登録・変更時)
		if (isTrue.equals(inputMap.get("rslt_kbn_1"))) {
			JCCWebCommon.setMessageInfo(this,
					JPCOnlineMessageConstant.EKB9360__I,
					new String[] { "キャンペーン情報の登録" });
		}
		if (isTrue.equals(inputMap.get("rslt_kbn_2"))) {
			JCCWebCommon.setMessageInfo(this,
					JPCOnlineMessageConstant.EKB9360__I,
					new String[] { "キャンペーン情報の変更" });
		}
		if (isTrue.equals(inputMap.get("rslt_kbn_3"))) {
			JCCWebCommon.setMessageInfo(this,
					JPCOnlineMessageConstant.EKB9360__I,
					new String[] { "キャンペーン情報の削除" });
		}
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		// 自画面の画面名を設定
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW22501);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW22501);
		
		// 初期状態に戻す
		actionReset();
		
		return true;
	}
	
	/**
	 * リセットボタン押下処理<br>
	 * 
	 * @return 正常の場合は true、そうでない場合は false
	 * @throws Exception 例外が発生した場合
	 */
	public boolean actionReset() throws Exception 
	{
		// サービスフォームBeanのアクセスクラス取得
		X31SDataBeanAccess bean = super.getServiceFormBean();
		
		// 引継元表示項目をクリア
		bean.sendMessageString(KKW22501SFConst.SEARCH_AGNT_CD, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.SEARCH_CAMPAIGN_CD, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.SEARCH_CAMPAIGN_NM, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.SEARCH_DCHSKM_CD, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.AGNT_SET_CAMPAIGN_STAYMD, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.AGNT_SET_CAMPAIGN_ENDYMD, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.AGNT_CD_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.AGNT_NM_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.DSP_DCHSKM_CD_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.UK_STA_YMDHM_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.UK_END_YMDHM_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.DCHSKM_CD_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.DCHSKM_SETE_JKN_NO_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.UPD_DTM_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.DEL_CHECK_01, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.DCHSKM_NM_02, X31CWebConst.DATABEAN_SET_VALUE, "");
		bean.sendMessageString(KKW22501SFConst.UPD_DTM_02, X31CWebConst.DATABEAN_SET_VALUE, "");
		
		// 一覧表示部分を非表示にする
		bean.sendMessageString(KKW22501SFConst.DTL_DSP_FLG, X31CWebConst.DATABEAN_SET_VALUE, DTL_DSP_FLG_N);
		
		// データ抽出項目設定条件一覧照会（イベントＣＰ）明細クリア
		X31SDataBeanAccessArray dcksjlist = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_SETE_JKN_LIST);
		dcksjlist.clearArray();
		
		// 変更前データ抽出項目設定条件一覧照会（イベントＣＰ）明細クリア
		X31SDataBeanAccessArray bf_dcksjlist = bean.getDataBeanArray(KKW22501SFConst.BF_DCHSKM_SETE_JKN_LIST);
		bf_dcksjlist.clearArray();
		
		// データ抽出項目一覧照会明細クリア
		X31SDataBeanAccessArray dcklist = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_LIST);
		dcklist.clearArray();
		
		// 初期表示処理を呼び出す
		actionInit();
		
		return true;
	}

	/**
	 * 受付日の関連チェックを行う
	 * <br>
	 * @param staYmd 受付開始日
	 * @param dCd データ抽出項目コード
	 * @param X31SDataBeanAccess DataBeanアクセスクラス
	 * @return エラーが存在する場合はtrue、存在しない場合はfalse
	 */
	private boolean isUkYmdCheck(String staYmd, int idx, X31SDataBeanAccess bean)
	{
		if (JKKGetDataUtil.isNull(staYmd) || JKKGetDataUtil.isNull(idx)) {
			return true;
		}
		
		X31SDataBeanAccessArray dchskmSeteJknList = bean.getDataBeanArray(KKW22501SFConst.DCHSKM_SETE_JKN_LIST);
		for (int i = 0; i < dchskmSeteJknList.getCount(); i++)
		{
			X31SDataBeanAccess subbean = dchskmSeteJknList.getDataBean(i);
			if(subbean.sendMessageBoolean(KKW22501SFConst.DEL_CHECK_01, X31CWebConst.DATABEAN_GET_VALUE)){
				continue;
			}
			String ukStaymd = subbean.sendMessageString(KKW22501SFConst.UK_STA_YMDHM_01, X31CWebConst.DATABEAN_GET_VALUE);
			String ukEndymd = subbean.sendMessageString(KKW22501SFConst.UK_END_YMDHM_01, X31CWebConst.DATABEAN_GET_VALUE);
			if (i != idx && !JKKGetDataUtil.isNull(ukStaymd)
					&& !JKKGetDataUtil.isNull(ukEndymd)) {
				if (staYmd.compareTo(ukStaymd) >= 0
						&& staYmd.compareTo(ukEndymd) <= 0) {
					JCCWebCommon.setMessageInfo(this,
							JPCOnlineMessageConstant.EKBF320_NW,
							new String[] { "" }, "uk_end_ymdhm_" + String.valueOf(i));
					return false;
				}
			}
		}
		return true;
	}
}
