/*********************************************************************
 * All Right reserved,Copyright (c) Fujitsu, 2011
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：顧客契約
 *   モジュール名    ：割引サービス登録画面ビューロジック
 *   ソースファイル名：KKW01027SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年05月11日
 *＜機能概要＞
 *   割引サービス登録画面のビューロジック。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/05/11   FJ          新規作成
 *   v3.01.00    2012/05/29   FJ          【IT1-2012-0000572】
 *   v4.01.00    2012/09/07   FJ          ANK-0546-00-00
 *   v5.00.00    2013/01/08   FJ          ANK-1276-00-00
 *   v5.00.01    2013/08/12   FJ          ANK-1624-00-00
 *   v7.00.00    2013/11/14   FJ          ANK-1578-00-00
 *   v8.00.00    2014/03/01   FJ          ANK-1913-00-00 【ＮＯ．４５４】光電話に関する不具合改善
 *   v10.00.00   2014/07/01   FJ)福岡     ANK-2135-00-00
 *   v19.00.00	 2015/09/11	  FJ)岡田	  OM-2015-0001604 申込日と申込起算日に違いがある場合のメッセージを設定しない
 *   v37.00.00	 2018/07/13	  FJ)藤本	  【ANK-3383-09-00】標準工事費分割請求（STEP2）自治体特別キャンペーン登録/解約時チェック
 *   v39.00.00	 2018/08/28	  FJ)三原	  【ANK-3472-00-00】キャンペーン登録誤り防止のためのチェック実装
 *   v44.00.00	 2019/05/21	  FJ)三原	  【ANK-3606-00-00】201907CP切替案件他 (コメントのみ変更：スマートリンク端末割引："19000100",GoogleHome端末割引："19000200"を追加)
 **********************************************************************/

package eo.web.webview.KKW01027SF;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31CVector;
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.JCCFrameworkException;
import eo.common.util.JKKStringUtil;
import eo.common.util.JPCDateUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.KKW01021SF.KKW01021SFConst;
import eo.web.webview.KKW01027SF.Items.Closure;
import eo.web.webview.KKW01027SF.Items.Predicater;
import eo.web.webview.KKW01027SF.Items.Transformer;
import eo.web.webview.KKW01027SF.KKW01027SFConst.FunctionCode;
import eo.web.webview.KKW01027SF.KKW01027SFConst.Screen;
import eo.web.webview.KKW01027SF.KKW01027SFConst.Service;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.common.JKKPulldownUtil;
import eo.web.webview.common.JKKScreenConst;

/**
 * <dd>クラス名：KKW01027SFLogic <dd>クラス説明：割引サービス契約の登録を行う。 <dd>備考：なし。
 * 
 * @version 1.00.00 2011/03/31
 * @author 富士通
 */
@SuppressWarnings("serial")
public class KKW01027SFLogic extends JCCWebBusinessLogic
{

	/**
	 * <dd>メソッド名：初期表示処理 <dd>メソッド説明：選択画面の初期表示を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	public boolean actionInit() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		// /// セッション情報取得 /////
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 引継ぎリストからSYSID,サービス契約番号,異動区分,異動理由コード,申込番号を転記
		X31SDataBeanAccessArray custKeiHktgiListArray = Mover.getBeanArray(bean, JKKCommonConst.HKTGI_CUST_KEI_HKTGI_LIST);
		X31SDataBeanAccess custKeiHktgiList = custKeiHktgiListArray.getDataBean(0);
		// SYSIDを転記
		String sysid = Mover.getString(custKeiHktgiList, JKKCommonConst.HKTGI_SYSID);
		Mover.setString(bean, KKW01027SFConst.SYSID, sysid);
		// サービス契約番号を転記
		String svcKeiNo = Mover.getString(custKeiHktgiList, JKKCommonConst.HKTGI_SVC_KEI_NO);
		Mover.setString(bean, KKW01027SFConst.SVC_KEI_NO, svcKeiNo);
		// 異動区分を転記
		String idoDiv = Mover.getString(custKeiHktgiList, JKKCommonConst.HKTGI_IDO_DIV);
		Mover.setString(bean, KKW01027SFConst.IDO_DIV, idoDiv);
		// 異動理由コードを転記
		String[] idoRsnCd = Mover.getStringArray(custKeiHktgiList, JKKCommonConst.HKTGI_IDO_RSN_CD);
		Mover.setStringArray(bean, KKW01027SFConst.IDO_RSN_CD, idoRsnCd);
		// ++++++++++++++ 2012/05/29 v3.01.00 追加開始 ++++++++++++++++ //
		// 異動理由メモを転記
		String idoRsnMemo = Mover.getString(custKeiHktgiList, JKKCommonConst.HKTGI_IDO_RSN_MEMO);
		Mover.setString(bean, KKW01027SFConst.IDO_RSN_MEMO, idoRsnMemo);
		// ++++++++++++++ 2012/05/29 v3.01.00 追加終了 ++++++++++++++++ //
		// 申込番号を転記
		String mskmNo = Mover.getString(custKeiHktgiList, JKKCommonConst.HKTGI_MSKM_NO);
		Mover.setString(bean, KKW01027SFConst.MSKM_NO, mskmNo);

		// サービス呼び出し
		Service.KKSV0236.invokeAndApplySFBean(this, bean, FunctionCode.READ_FULL.getCode());
		
		// ++++++++++++++ 2012/09/07 v4.01.00 変更開始 ++++++++++++++++ //
		
		// 割引タイプコードリスト取得
		X31SDataBeanAccessArray wribTypeCdListArray = Mover.getBeanArray(bean, KKW01027SFConst.WRIB_TYPE_CD_LIST);
		X31SDataBeanAccess wribTypeCdList = wribTypeCdListArray.getDataBean(0);
		// 不要項目削除
		setWribTypeCdPullDown(wribTypeCdList);
		
		// ++++++++++++++ 2012/09/07 v4.01.00 変更終了 ++++++++++++++++ //
		
		// /// DataBean内容編集 /////
		// 運用年月日 ← オンライン運用日付
		String unyo_ymd = bean.sendMessageString(KKW01027SFConst.OPE_DATE, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon
				.getOpeDate(this, null));

		// 申込年月日 ← 運用年月日
		bean.sendMessageString(KKW01027SFConst.MSKM_YMD, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd);
		// 申込年月日（年） ← 運用年月日1-4桁目
		bean.sendMessageString(KKW01027SFConst.MSKM_YMD_YEAR, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd.substring(0, 4));
		// 申込年月日（年） ← 運用年月日5-6桁目
		bean.sendMessageString(KKW01027SFConst.MSKM_YMD_MON, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd.substring(4, 6));
		// 申込年月日（年） ← 運用年月日7-8桁目
		bean.sendMessageString(KKW01027SFConst.MSKM_YMD_DAY, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd.substring(6, 8));
		// 申込起算年月日 ← 運用年月日
		bean.sendMessageString(KKW01027SFConst.MSKM_KISAN_YMD, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd);
		//v8.00.00 2014/03/01 DEL START
		// 申込起算年月日（年） ← 運用年月日1-4桁目
		//bean.sendMessageString(KKW01027SFConst.MSKM_KISAN_YMD_YEAR, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd.substring(0, 4));
		// 申込起算年月日（年） ← 運用年月日5-6桁目
		//bean.sendMessageString(KKW01027SFConst.MSKM_KISAN_YMD_MON, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd.substring(4, 6));
		// 申込起算年月日（年） ← 運用年月日7-8桁目
		//bean.sendMessageString(KKW01027SFConst.MSKM_KISAN_YMD_DAY, X31CWebConst.DATABEAN_SET_VALUE, unyo_ymd.substring(6, 8));
		//v8.00.00 2014/03/01 DEL END
		//画面名設定
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW01027);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * <dd>メソッド名：検索ボタン押下 <dd>メソッド説明：選択画面の検索ボタン押下時処理を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	@SuppressWarnings("unchecked")
	public boolean actionSearch() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		/*
		 * サービスを呼び出し、検索条件をチェック、 問題なければ登録候補となる割引の検索を行い自画面へ遷移
		 */
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		//申込起算日を転記
		Mover.setString(bean, KKW01027SFConst.MSKM_KISAN_YMD, getMskmKisanYmd(bean));
		
		//受付開始年月日(自)を転記
		String ukStaymdJiYear=Mover.getString(bean, KKW01027SFConst.UK_STAYMD_JI_YEAR);
		String ukStaymdJiMon=Mover.getString(bean, KKW01027SFConst.UK_STAYMD_JI_MON);
		String ukStaymdJiDay=Mover.getString(bean, KKW01027SFConst.UK_STAYMD_JI_DAY);
		String ukStaymdJi=ukStaymdJiYear+ukStaymdJiMon+ukStaymdJiDay;
		Mover.setString(bean, KKW01027SFConst.UK_STAYMD_JI, ukStaymdJi);

		//受付開始年月日(至)を転記
		String ukStaymdItaYear=Mover.getString(bean, KKW01027SFConst.UK_STAYMD_ITA_YEAR);
		String ukStaymdItaMon=Mover.getString(bean, KKW01027SFConst.UK_STAYMD_ITA_MON);
		String ukStaymdItaDay=Mover.getString(bean, KKW01027SFConst.UK_STAYMD_ITA_DAY);
		String ukStaymdIta=ukStaymdItaYear+ukStaymdItaMon+ukStaymdItaDay;
		Mover.setString(bean, KKW01027SFConst.UK_STAYMD_ITA, ukStaymdIta);

		//受付終了年月日(自)を転記
		String ukEndymdJiYear=Mover.getString(bean, KKW01027SFConst.UK_ENDYMD_JI_YEAR);
		String ukEndymdJiMon=Mover.getString(bean, KKW01027SFConst.UK_ENDYMD_JI_MON);
		String ukEndymdJiDay=Mover.getString(bean, KKW01027SFConst.UK_ENDYMD_JI_DAY);
		String ukEndymdJi=ukEndymdJiYear+ukEndymdJiMon+ukEndymdJiDay;
		Mover.setString(bean, KKW01027SFConst.UK_ENDYMD_JI, ukEndymdJi);

		//受付終了年月日(至)を転記
		String ukEndymdItaYear=Mover.getString(bean, KKW01027SFConst.UK_ENDYMD_ITA_YEAR);
		String ukEndymdItaMon=Mover.getString(bean, KKW01027SFConst.UK_ENDYMD_ITA_MON);
		String ukEndymdItaDay=Mover.getString(bean, KKW01027SFConst.UK_ENDYMD_ITA_DAY);
		String ukEndymdIta=ukEndymdItaYear+ukEndymdItaMon+ukEndymdItaDay;
		Mover.setString(bean, KKW01027SFConst.UK_ENDYMD_ITA, ukEndymdIta);

		BeanMap beanMap=Mover.getBeanMapFromDataBean(bean, KKW01027SFConst.SFBEAN);
		
		//プルダウン 割引タイプコードを転記
		ArrayList<BeanMap> wribTypeCdList=(ArrayList<BeanMap>)beanMap.take(KKW01027SFConst.WRIB_TYPE_CD_LIST);
		BeanMap wribTypeCdListHead=wribTypeCdList.get(0);
		String wribTypeCdListIndex=(String)wribTypeCdListHead.take(KKW01027SFConst.INDEX_02);
		int wribTypeCdListIndexInt=Integer.parseInt(wribTypeCdListIndex);
		String[] wribTypeCds=(String[])wribTypeCdListHead.take(KKW01027SFConst.CD_DIV_LIST_02);
		String wribTypeCd=wribTypeCds[wribTypeCdListIndexInt];
		Mover.setString(bean, KKW01027SFConst.WRIB_TYPE_CD, wribTypeCd);
		
		//プルダウン 割引適用契機コードを転記
		ArrayList<BeanMap> wribAplyOptntyCdList=(ArrayList<BeanMap>)beanMap.take(KKW01027SFConst.WRIB_APLY_OPTNTY_CD_LIST);
		BeanMap wribAplyOptntyCdListHead=wribAplyOptntyCdList.get(0);
		String wribAplyOptntyCdListIndex=(String)wribAplyOptntyCdListHead.take(KKW01027SFConst.INDEX_02);
		int wribAplyOptntyCdListIndexInt=Integer.parseInt(wribAplyOptntyCdListIndex);
		String[] wribAplyOptntyCds=(String[])wribAplyOptntyCdListHead.take(KKW01027SFConst.CD_DIV_LIST_02);
		String wribAplyOptntyCd=wribAplyOptntyCds[wribAplyOptntyCdListIndexInt];
		Mover.setString(bean, KKW01027SFConst.WRIB_APLY_OPTNTY_CD, wribAplyOptntyCd);
		
		// 割引キャンペーン一覧を初期化
		Mover.getBeanArray(bean, KKW01027SFConst.CAMPAIGN_ICRN).clearArray();
		
		// 割引サービス対象契約一覧を初期化
		Mover.getBeanArray(bean, KKW01027SFConst.TG_KEI_ICRN).clearArray();
		
		// サービス呼び出し
		Service.KKSV0237.invokeAndApplySFBean(this, bean, FunctionCode.READ_FULL.getCode());
		
		// ++++++++++++++ 2012/09/07 v4.01.00 変更開始 ++++++++++++++++ //
		
		// 
		// 検索結果に対しての制御(キャンペーン一覧：KKSV023702CC)
		// 
		X31SDataBeanAccessArray icrnListArray = Mover.getBeanArray(bean, KKW01027SFConst.CAMPAIGN_ICRN);
		
		// 除外処理
		for (int i=0; i < icrnListArray.getCount(); i++) {
			X31SDataBeanAccess icrnList = icrnListArray.getDataBean(i);
			String typeCd = Mover.getString(icrnList, KKW01027SFConst.TYPE_CD_03);
			
// v10.00.00 ADD START
			
			if (Mover.getBoolean(icrnList, KKW01027SFConst.DISP_RIYO_STA_YMD_03)) {
				
				// 利用希望日にオンライン日付を設定
				String opeDate = JCCWebCommon.getOpeDate(this, null);
				icrnList.sendMessageString(KKW01027SFConst.RIYO_STA_YMD_YEAR_03, X31CWebConst.DATABEAN_SET_VALUE, opeDate.substring(0, 4));
				icrnList.sendMessageString(KKW01027SFConst.RIYO_STA_YMD_MON_03,  X31CWebConst.DATABEAN_SET_VALUE, opeDate.substring(4, 6));
				icrnList.sendMessageString(KKW01027SFConst.RIYO_STA_YMD_DAY_03,  X31CWebConst.DATABEAN_SET_VALUE, opeDate.substring(6, 8));
			}
// v10.00.00 ADD END
			
			if (JKKCommonConst.WRIB_TYPE_CD_CUP_KEI_WRIB.equals(typeCd)) {
				icrnListArray.removeDataBean(i);
				i--;
			}
		}
		
		// 
		// 0件チェック
		// 
		if (icrnListArray.getCount() == 0) {
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB2190_KW, new String[] {"割引/キャンペーン/販売促進"});
		}
		
		// ++++++++++++++ 2012/09/07 v4.01.00 変更終了 ++++++++++++++++ //
		
		moveToNextSameScreen(Screen.KKW01027);
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * <dd>メソッド名：更新確認ボタン押下 <dd>メソッド説明：更新画面の更新確認ボタン押下時処理を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	@SuppressWarnings("boxing")
	public boolean actionConfirm() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		/*
		 * サービスを呼び出し、登録対象となる割引のチェックを行い 問題なければ確認画面へ遷移
		 */
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		//申込年月日を転記
		String mskmYmd = getMskmYmd(bean);
		if(null == mskmYmd.trim() || 8 != mskmYmd.trim().length() || JKKCommonConst.MAX_YMD.equals(mskmYmd.trim()))
		{
			mskmYmd = "";
		}
		Mover.setString(bean, KKW01027SFConst.MSKM_YMD, mskmYmd);
		//申込起算日を転記
		String mskmKisanYmd = getMskmKisanYmd(bean);
		Mover.setString(bean, KKW01027SFConst.MSKM_KISAN_YMD, mskmKisanYmd);
		
// ++++++++++++++ 2013/01/08 v5.00.00 追加開始 ++++++++++++++++ //
		
		// 長期継続利用割引
		final String choukiKeizokuWrib = "32";
		final String tougetsu          = "1";
		
		// 検索結果に対しての制御(キャンペーン一覧)
		X31SDataBeanAccessArray icrnListArray = Mover.getBeanArray(bean, KKW01027SFConst.CAMPAIGN_ICRN);
		
		// 適用月名称取得
		for (int i=0; i < icrnListArray.getCount(); i++) {
			X31SDataBeanAccess icrnList = icrnListArray.getDataBean(i);
			String typeCd = Mover.getString(icrnList, KKW01027SFConst.TYPE_CD_03);
// v5.00.01 mod start
			boolean dispFlg = Mover.getBoolean(icrnList, KKW01027SFConst.DISP_JKN_2_03);
//			if (choukiKeizokuWrib.equals(typeCd)) {
			if (choukiKeizokuWrib.equals(typeCd) || dispFlg) {
// v5.00.01 mod end  
				if (tougetsu.equals(Mover.getString(icrnList, KKW01027SFConst.TEKIYO_YMD_03))) {
					Mover.setString(icrnList, KKW01027SFConst.TEKIYO_YMD_NM_03, Mover.getString(icrnList, KKW01027SFConst.TEKIYO_YMD_NM_1_03));
				} else {
					Mover.setString(icrnList, KKW01027SFConst.TEKIYO_YMD_NM_03, Mover.getString(icrnList, KKW01027SFConst.TEKIYO_YMD_NM_2_03));
				}
			} else {
				Mover.setString(icrnList, KKW01027SFConst.TEKIYO_YMD_03,      "");
				Mover.setString(icrnList, KKW01027SFConst.TEKIYO_YMD_NM_1_03, "");
				Mover.setString(icrnList, KKW01027SFConst.TEKIYO_YMD_NM_2_03, "");
			}
// v7.00.00 ADD START
			boolean dispUmuFlg = Mover.getBoolean(icrnList, KKW01027SFConst.DISP_JKN_UMU_03);

			// 表示条件判定
			if (!dispUmuFlg) {
				// 表示条件なし（ファミリーパック以外）のときは何も表示しない
				Mover.setString(icrnList, KKW01027SFConst.TAKINOU_RTR_CHG_UMU_03,  "");
			}
// v7.00.00 ADD END
			
// v10.00.00 ADD START
			
			if (Mover.getBoolean(icrnList, KKW01027SFConst.DISP_RIYO_STA_YMD_03)) {
				
				// 利用開始希望日を設定する.
				Mover.setString(icrnList, KKW01027SFConst.RIYO_STA_YMD_03, 
						  Mover.getString(icrnList, KKW01027SFConst.RIYO_STA_YMD_YEAR_03)
						+ Mover.getString(icrnList, KKW01027SFConst.RIYO_STA_YMD_MON_03)
						+ Mover.getString(icrnList, KKW01027SFConst.RIYO_STA_YMD_DAY_03));
			}
// v10.00.00 ADD END
		}
		
// ++++++++++++++ 2013/01/08 v5.00.00 追加終了 ++++++++++++++++ //
		
		HashMap<String, Object> out = new HashMap<String, Object>();
		
		// サービス呼び出し
		Service.KKSV0238.invokeAndApplySFBean(this, bean, FunctionCode.CHECK_ONLY.getCode(), out);
		
		// ANK-3383-09-00 ADD START
		boolean isError = false;
		// ANK-3383-09-00 ADD END
		// 即割適用時長割登録エラーメッセージ設定
		if (!setThowariVsSokuwariMessage(out))
		{
			// ANK-3383-09-00 MOD START
//			return false;
			isError = true;
			// ANK-3383-09-00 MOD END
		}
		// ANK-3383-09-00 ADD START
		// 自治体特別キャンペーン登録時チェック
		if (!checkJctSpclCp(out))
		{
			isError = true;
		}
		// エラーの場合
		if (isError)
		{
			return false;
		}
		// ANK-3383-09-00 ADD END
		
		// ANK-3472-00-00 ADD START
		// (A)商品券："170016ZZ"、量販特典："170016ZZ","170018ZZ","170025ZZ"、
		// (B)スマートリンク無料："17005000"、"19000100"、
		// (C)GoogleHome無料："17008600"、"19000200"、
		// (D)お祝いパック割："18000200"、お祝いパック特典："180012ZZ"
		// (E)のりかえCP："160048ZZ","160049ZZ","160050ZZ", "170021ZZ","170046ZZ","170047ZZ",
		//    "170039ZZ","170040ZZ","170041ZZ","170042ZZ"のキャンペーンのチェック処理を行う。
		if (!checkCampaign(out))
		{
			isError = true;
		}
		// エラーの場合
		if (isError)
		{
			return false;
		}
		// ANK-3472-00-00 ADD END

		moveToNextSameScreen(Screen.KKW01028);
		///// メッセージ表示処理 /////
		String[] messages = {"割引サービス契約の登録"};
		JCCWebCommon.setMessageInfo(this, "EKB0370--I", messages);

// ++++++++++++++ 2013/01/08 v5.00.00 追加開始 ++++++++++++++++ //
		
		// エラー判定
		if (!JKKStringUtil.isNullBlank(Mover.getString(bean, KKW01027SFConst.FAMILY_PACK_ERR_FLG))) {
			
			JCCWebCommon.setMessageInfo(this, "EKBD010--Q", "");
		}
// ++++++++++++++ 2013/01/08 v5.00.00 追加終了 ++++++++++++++++ //
		
		// ++++++++++++++ 2012/05/29 v3.01.00 追加開始 ++++++++++++++++ //
		// 注意メッセージ表示
		editWarningMessage(mskmYmd);
		// ++++++++++++++ 2012/05/29 v3.01.00 追加開始 ++++++++++++++++ //
		// 申込日・申込起算日相違時メッセージ設定
		//v19.00.00 DEL START
		//setMskmYmdDiffMessage(bean);
		//v19.00.00 DEL END
		// 割引エイジング期間該当割引サービス選択時メッセージ設定
		setAgingWribSvcMessage(out);
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * <dd>メソッド名：確定ボタン押下 <dd>メソッド説明：確認画面の確定ボタン押下時処理を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	public boolean actionFix() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		/*
		 * サービスを呼び出し、登録対象となる割引のチェック、登録を行い 問題なければ完了画面へ遷移
		 */
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		// サービス呼び出し
		Service.KKSV0238.invokeAndApplySFBean(this, bean, FunctionCode.CHECK_AND_CHANGE.getCode());
		moveToNextSameScreen(Screen.KKW01029);
		///// メッセージ表示処理 /////
		String[] messages = {"割引サービス契約の登録"};
		JCCWebCommon.setMessageInfo(this, "EKB4390--I", messages);
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * <dd>メソッド名：修正ボタン押下 <dd>メソッド説明：確認画面の修正ボタン押下時処理を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	public boolean actionReturn() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		// 画面遷移
		moveToNextSameScreen(Screen.KKW01027);
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * <dd>メソッド名：一覧照会へボタン押下 <dd>メソッド説明：完了画面の一覧照会へボタン押下時処理を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	public boolean actionReturnToIcrn() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		// 画面遷移
		backToNextOtherScreen();
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	/**
	 * <dd>メソッド名：お客様一覧照会へボタン押下 <dd>メソッド説明：完了画面のお客様一覧照会へボタン押下時処理を行う。 <dd>備考：なし。
	 * 
	 * @param
	 * @return true
	 */

	public boolean actionReturnToCustIcrn() throws Exception
	{
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		// 画面遷移
		moveToNextOtherScreen(Screen.CKW00101);
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		return true;
	}

	// ++++++++++++++ 2012/09/07 v4.01.00 変更開始 ++++++++++++++++ //
	/**
	 * <dl>
	 * <dt>処理概要:
	 * <dd>割引タイプコードリストより不要項目を除外する。
	 * <dd>当メソッドの処理範囲は以下とする。
	 * <dd>・コード名称のINDEXの採番
	 * <dd>・Bean内の不要項目除外
	 * <dd>・除外後のBeanの再設定
	 * <dt>処理補足:
	 * <dd>・当処理内の不要項目とは[42:割賦契約割引]を示す。
	 * </dl>
	 * 
	 * @param  typeCd  チェック対象となる割引タイプコード
	 * @param  errMsg1 エラー埋め込み文字１個目
	 * @param  errMsg2 エラー埋め込み文字２個目
	 * @return true：正常、false：異常
	 * @throws Exception 
	 */
	private void setWribTypeCdPullDown(X31SDataBeanAccess list) throws Exception 
	{
		ArrayList<String> paraCdList = new ArrayList<String>();
		ArrayList<String> paraNmList = new ArrayList<String>();
		
		// 既に設定されている件数取得
		Integer cnt = (Integer) list.sendMessage(KKW01027SFConst.CD_DIV_LIST_02,  X31CWebConst.DATABEAN_GET_COUNT);
		for (int i=0; i < cnt; i++) 
		{
			String cd = list.sendMessageString(KKW01027SFConst.CD_DIV_LIST_02,    X31CWebConst.DATABEAN_GET_VALUE, i);
			String nm = list.sendMessageString(KKW01027SFConst.CD_DIV_NM_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, i);
			
			// [割賦契約割引],[初期値]は除外
			if (JKKCommonConst.WRIB_TYPE_CD_CUP_KEI_WRIB.equals(cd) || "".equals(cd)) {
				continue;
			}
			paraCdList.add(cd);
			paraNmList.add(nm);
		}
		
		// 必要な情報取得後に初期化
		list.sendMessage(KKW01027SFConst.CD_DIV_LIST_02,    X31CWebConst.DATABEAN_CLEAR);
		list.sendMessage(KKW01027SFConst.CD_DIV_NM_LIST_02, X31CWebConst.DATABEAN_CLEAR);
		
		// 先頭は省いている為,ループ前にセット
		list.sendMessageString(KKW01027SFConst.CD_DIV_LIST_02,    X31CWebConst.DATABEAN_ADD_VALUE, "");
		list.sendMessageString(KKW01027SFConst.CD_DIV_NM_LIST_02, X31CWebConst.DATABEAN_ADD_VALUE, "");
		
		// 添え字を考慮した設定を実施
		int indexCnt = 1;
		for (int i=0; i < paraCdList.size(); i++) 
		{
			int index = paraNmList.get(i).indexOf(JKKPulldownUtil.IDX_SEP);
			if (index == -1) {
				// そもそも,区切り文字が存在しないのは共通違反.
				// 該当Exceptionは,PullDownBeanが生成された場合のみ動作する.
				throw new Exception();
			}
			
			list.sendMessageString(KKW01027SFConst.CD_DIV_LIST_02,
												X31CWebConst.DATABEAN_ADD_VALUE,
												paraCdList.get(i));
			
			list.sendMessageString(KKW01027SFConst.CD_DIV_NM_LIST_02,
												X31CWebConst.DATABEAN_ADD_VALUE,
												indexCnt + JKKPulldownUtil.IDX_SEP + paraNmList.get(i).substring(index+1));
			indexCnt++;
		}
	}
	// ++++++++++++++ 2012/09/07 v4.01.00 変更終了 ++++++++++++++++ //
	
	private void moveToNextSameScreen(String nextScreenId, String nextScreenNm) 
	{
		// 遷移先情報の設定
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenNm);
	}

	private void moveToNextSameScreen(Screen next) 
	{
		moveToNextSameScreen(next.getScreenId(), next.getScreenName());
	}

	private void moveToNextOtherScreen(String nextScreenId) 
	{
		// 遷移先情報の設定
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
	}

	private void moveToNextOtherScreen(Screen next) 
	{
		moveToNextOtherScreen(next.getScreenId());
	}


	private void backToNextOtherScreen() 
	{
		// 遷移先情報の設定
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCCWebCommon
				.getScreenId(this));
	}
	// ++++++++++++++ 2012/05/29 v3.01.00 追加開始 ++++++++++++++++ //
	/**
	 * 注意メッセージの表示判定および編集処理を行う。
	 * @param mskmYmd 申込年月日
	 * @throws Excepiton
	 */
	private void editWarningMessage(String mskmYmd) throws Exception
	{
		// 注意メッセージの表示
		String opeYmd=JCCWebCommon.getOpeDate(this, null);
		
		String preMonth = JPCDateUtil.addMonth(opeYmd, -1).substring(0, 6);
		
		// 申込日が操作日より過去月の場合、注意メッセージを表示
		if (preMonth.compareTo(mskmYmd.substring(0, 6)) >= 0) 
		{
			JCCWebCommon.setMessageInfo(this, "EKBB070--Q");
		}
		// 申込日が操作日より未来日の場合、注意メッセージを表示
		// (3か月(90日)以上のチェックはクライアント側で実施)
		else if (opeYmd.compareTo(mskmYmd) < 0) 
		{
			JCCWebCommon.setMessageInfo(this, "EKBB080--Q");
		}
	}
	// ++++++++++++++ 2012/05/29 v3.01.00 追加終了 ++++++++++++++++ //
	
	/**
	 * 即割適用時の長割登録エラーのメッセージを設定する
	 * 
	 * @param outputMap
	 * @return true:エラー無し／false:エラー有り
	 */
	@SuppressWarnings("unchecked")
	private boolean setThowariVsSokuwariMessage(HashMap<String, Object> outputMap)
	{
		HashMap<String, Object> outMap = (HashMap<String, Object>) outputMap.get("KKSV023801CC");
		ArrayList<HashMap<String, Object>> dataList = (ArrayList<HashMap<String, Object>>)outMap.get("sokuwari_vs_tyowari_list");

		if (dataList != null)
		{
			// メッセージ設定
			String[] messages = {"即割が適用されている割引サービス契約", "長期利用割引"};
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB9510_KW, messages);
			return false;
		}
		return true;
	}
	
	/**
	 * 申込日と申込起算日に違いがある場合のメッセージを設定する
	 * 
	 * @param bean
	 */
	private void setMskmYmdDiffMessage(X31SDataBeanAccess bean)
	{
		// 申込日
		String mskmYmd = getMskmYmd(bean);
		// 申込起算日
		String mskmKisanYmd = getMskmKisanYmd(bean);
		
		if (!mskmYmd.equals(mskmKisanYmd))
		{
			// メッセージ設定
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBA290__Q);
		}
	}
	
	/**
	 * 割引エイジング期間に該当する割引サービスを選択した場合のメッセージを設定する
	 * 
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	private void setAgingWribSvcMessage(HashMap<String, Object> outputMap)
	{
		// 割引エイジング期間に該当する割引サービスリストを取得し全件メッセージ出力する
		HashMap<String, Object> outMap = (HashMap<String, Object>) outputMap.get("KKSV023801CC");
		ArrayList<HashMap<String, Object>> dataList = (ArrayList<HashMap<String, Object>>)outMap.get("aging_wrib_svc_list");
		for (HashMap<String, Object> svcNmMap : dataList)
		{
			// メッセージ設定
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBA380__I, new String[]{(String)svcNmMap.get("campaign_cd_nm")});
		}
	}
	
	/**
	 * 画面入力された申込日を連結し年月日形式にて返却します。
	 * 
	 * @param bean
	 * @return
	 */
	private String getMskmYmd(X31SDataBeanAccess bean)
	{
		String mskmYmdYear = Mover.getString(bean, KKW01027SFConst.MSKM_YMD_YEAR);
		String mskmYmdMon = Mover.getString(bean, KKW01027SFConst.MSKM_YMD_MON);
		String mskmYmdDay = Mover.getString(bean, KKW01027SFConst.MSKM_YMD_DAY);
		return mskmYmdYear + mskmYmdMon + mskmYmdDay;
	}
	
	/**
	 * 画面入力された申込起算日を連結し年月日形式にて返却します。
	 * 
	 * @param bean
	 * @return
	 */
	private String getMskmKisanYmd(X31SDataBeanAccess bean)
	{
		String mskmKisanYmdYear = Mover.getString(bean, KKW01027SFConst.MSKM_KISAN_YMD_YEAR);
		String mskmKisanYmdMon = Mover.getString(bean, KKW01027SFConst.MSKM_KISAN_YMD_MON);
		String mskmKisanYmdDay = Mover.getString(bean, KKW01027SFConst.MSKM_KISAN_YMD_DAY);
		return mskmKisanYmdYear + mskmKisanYmdMon + mskmKisanYmdDay;
	}

	// ANK-3383-09-00 ADD START
	/**
	 * 自治体特別ＣＰ登録時チェックを実行します。
	 * <br>
	 * @param outputMap サービス実行結果
	 * @return チェックエラーの場合はfalse、チェックエラーでない場合はtrue
	 */
	@SuppressWarnings("unchecked")
	private boolean checkJctSpclCp(HashMap<String, Object> outputMap)
	{
		HashMap<String, Object> outMap = (HashMap<String, Object>)outputMap.get("KKSV023801CC");
		if (outMap != null)
		{
			ArrayList<HashMap<String, Object>> jctSpclCpCheckList = (ArrayList<HashMap<String, Object>>)outMap.get("jct_spcl_cp_check_list");
			if (jctSpclCpCheckList != null)
			{
				// メッセージ設定
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBF180_KW);
				return false;
			}
		}
		return true;
	}
	// ANK-3383-09-00 ADD END

	// ANK-3472-00-00 ADD START
	/**
	 * 自治体特別ＣＰ登録時チェックを実行します。
	 * (A)商品券："170016ZZ"、量販特典："170016ZZ","170018ZZ","170025ZZ"、
	 * (B)スマートリンク無料："17005000"、"19000100"、
	 * (C)GoogleHome無料："17008600""19000200"、
	 * (D)お祝いパック割："18000200"、お祝いパック特典："180012ZZ"
	 * (E)のりかえCP："160048ZZ","160049ZZ","160050ZZ", "170021ZZ","170046ZZ","170047ZZ",
	 *    "170039ZZ","170040ZZ","170041ZZ","170042ZZ"
	 * のキャンペーンのチェック処理を実行します。
	 * 
	 * <br>
	 * @param outputMap サービス実行結果
	 * @return チェックエラーの場合はfalse、チェックエラーでない場合はtrue
	 */
	@SuppressWarnings("unchecked")
	private boolean checkCampaign(HashMap<String, Object> outputMap)
	{
		// エラーフラグ
		boolean errFlg = false;
		// ワーニングフラグ
		boolean wrnFlg = false;
		
		// KKSV023801CCで設定したリストによってエラーを表示させる。
		HashMap<String, Object> outMap = (HashMap<String, Object>)outputMap.get("KKSV023801CC");
		if (outMap != null)
		{
			// 割引キャンペーンコード整合性チェックを実行し、登録候補契約情報に各チェックリストをマッピングする。
			// (A)"170016ZZ","170018ZZ","170025ZZ",
			// (B)"17005000","19000100",
			// (C)"17008600","19000200",
			// (D)"18000200","180012ZZ"
			// の各キャンペーンのグループ毎で複数グループ選択されている場合、エラーとする。
			ArrayList<HashMap<String, String>> campaignHukusuSelectChkList = (ArrayList<HashMap<String, String>>)outMap.get("campaignHukusuSelectChkList");
			
			// リストの中が何かわかるように書く
			// 複数回線ある場合に複数メッセージ出すために
			
			if (campaignHukusuSelectChkList != null)
			{
				for (int i = 0; i < campaignHukusuSelectChkList.size(); i++)
				{
					HashMap<String, String> campaignHukusuSelectChkMap = campaignHukusuSelectChkList.get(i);
					
					if (campaignHukusuSelectChkMap != null)
					{
						for (String key : campaignHukusuSelectChkMap.keySet())
						{
							// キャンペーンコードを取得する。
							String campaignCd = campaignHukusuSelectChkMap.get(key);
							
							// メッセージ設定
							String[] messages = {campaignCd, "複数申込不可"};
							// メッセージ表示処理
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB5410_NW, messages);
							
							errFlg = true;
						}
					}
				}
			}
			
			// スマートリンク無料："17005000"またはスマートリンク端末割引："19000100"が選択されているかつスマートリンクの申込がない場合、
			// または、GoogleHome無料："17008600"またはGoogleHome端末割引："19000200"が選択されているかつGoogleHomeの申込がない場合、エラーとする。
			ArrayList<HashMap<String, String>> ghSlChkList = (ArrayList<HashMap<String, String>>)outMap.get("ghSlChkList");
			if (ghSlChkList != null)
			{
				for (int i = 0; i < ghSlChkList.size(); i++)
				{
					HashMap<String, String> ghSlChkMap = ghSlChkList.get(i);
					
					if (ghSlChkMap != null)
					{
						for (String key : ghSlChkMap.keySet())
						{
							// メッセージ設定
							String[] messages = {"スマートリンク無料ＣＰ、ＧｏｏｇｌｅＨｏｍｅ無料ＣＰは対象サービスの申込が必要",
								"登録"};
							// メッセージ表示処理
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB5440_JW, messages);
							
							errFlg = true;
						}
					}
				}
			}
			
			// お祝いパック割："18000200"、お祝いパック特典："180012ZZ"が選択されている、かつ、
			// 申込にｅｏ光ネットがないまたはｅｏ光テレビがない場合、エラーとする。
			ArrayList<HashMap<String, String>> oiwaiPacChkList = (ArrayList<HashMap<String, String>>)outMap.get("oiwaiPacChkList");
			if (oiwaiPacChkList != null)
			{
				for (int i = 0; i < oiwaiPacChkList.size(); i++)
				{
					HashMap<String, String> oiwaiPacChkMap = oiwaiPacChkList.get(i);
					
					if (oiwaiPacChkMap != null)
					{
						for (String key : oiwaiPacChkMap.keySet())
						{
							// キャンペーンコードを取得する。
							String campaignCd = oiwaiPacChkMap.get(key);
							
							// メッセージ設定
							String[] messages = {campaignCd + "は、eo光ネット＋eo光ＴＶの申込必須",
								"登録"};
							// メッセージ表示処理
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB5440_JW, messages);
							
							errFlg = true;
						}
					}
				}
			}
			
			// お祝いパック割："18000200"またはお祝いパック特典："180012ZZ"が選択されている、かつ、
			// のりかえCP："160048ZZ","160049ZZ","160050ZZ","170021ZZ","170046ZZ","170047ZZ","170039ZZ",
			// "170040ZZ","170041ZZ","170042ZZ"が選択されている場合、エラーとする。
			ArrayList<HashMap<String, String>> oiwaiNorikaeChkList = (ArrayList<HashMap<String, String>>)outMap.get("oiwaiNorikaeChkList");
			if (oiwaiNorikaeChkList != null)
			{
				for (int i = 0; i < oiwaiNorikaeChkList.size(); i++)
				{
					HashMap<String, String> oiwaiNorikaeChkMap = oiwaiNorikaeChkList.get(i);
					
					if (oiwaiNorikaeChkMap != null)
					{
						// メッセージ設定
						String[] messages = {"お祝いパック割／お祝いパック特典とのりかえＣＰ",
							"同時申込不可"};
						// メッセージ表示処理
						JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB5410_NW, messages);
						
						errFlg = true;
					}
				}
			}
			
			// のりかえCP："160048ZZ","160049ZZ","160050ZZ","170021ZZ","170046ZZ","170047ZZ","170039ZZ",
			// "170040ZZ","170041ZZ","170042ZZ"が複数選択されている場合のチェックを行う。
			ArrayList<HashMap<String, String>> norikaeHukusuSelectChkList = (ArrayList<HashMap<String, String>>)outMap.get("norikaeHukusuSelectChkList");
			if (norikaeHukusuSelectChkList != null)
			{
				for (int i = 0; i < norikaeHukusuSelectChkList.size(); i++)
				{
					HashMap<String, String> norikaeHukusuSelectChkMap = norikaeHukusuSelectChkList.get(i);
					
					if (norikaeHukusuSelectChkMap != null)
					{
						// メッセージ設定
						String[] messages = {"のりかえＣＰ", "複数登録"};
						// メッセージ表示処理
						JCCWebCommon.setMessageInfo(this, "EKBF250--Q", messages);
						
						wrnFlg = true;
					}
				}
			}
			
			if (errFlg == true)
			{
				// エラー
				return false;
			}
			
			if (wrnFlg == true)
			{
				return true;
			}
		}
		return true;
	}
	// ANK-3472-00-00 ADD END
}
@SuppressWarnings("serial")
class BeanMap extends HashMap<String, Object>
{
	static final int DEFAULT_HASH_SIZE=50;

	public BeanMap(HashMap<String, Object> beanMap)
	{
		super(beanMap);
	}

	public BeanMap()
	{
		super(DEFAULT_HASH_SIZE);
	}

	public BeanMap pair(String item, Object value)
	{
		super.put(item, value);
		return this;
	}

	public Object take(String item)
	{
		return super.get(item);
	}
}

class Mover
{

	enum ValueType
	{
		NULL(null), ARRAY_LIST(ArrayList.class), STRING(String.class), LONG(Long.class), BOOLEAN(Boolean.class), STRINGS(
				String[].class), LONGS(Long[].class), BOOLEANS(Boolean[].class), ;

		Class<?> type;

		private ValueType(Class<?> type)
		{
			this.type = type;
		}

		public boolean isMatch(Object value)
		{
			if (null == value)
			{
				return (this.equals(NULL));
			}
			if (this.equals(NULL))
			{
				return false;
			}
			else
			{
				return this.type.isInstance(value);
			}
		}

		static public ValueType resolve(Object value)
		{
			ValueType[] types = ValueType.values();
			for (ValueType type : types)
			{
				if (type.isMatch(value))
				{
					return type;
				}
			}
			return ValueType.NULL;
		}
	}

	enum StructureType
	{
		NULL(null), DATABEAN(Object[].class), STRING(String.class), LONG(Long.class), BOOLEAN(Boolean.class), STRINGS(
				String[].class), LONGS(Long[].class), BOOLEANS(Boolean[].class), ;

		Class<?> type;

		private StructureType(Class<?> type)
		{
			this.type = type;
		}

		public boolean isMatch(Object value)
		{
			if (null == value)
			{
				return (this.equals(NULL));
			}
			if (this.equals(NULL))
			{
				return false;
			}
			if (value instanceof Class<?>)
			{
				return this.type.equals(value);
			}
			else
			{
				return this.type.equals(value.getClass());
			}
		}

		static public StructureType resolve(Object value)
		{
			StructureType[] types = StructureType.values();
			for (StructureType type : types)
			{
				if (type.isMatch(value))
				{
					return type;
				}
			}
			return StructureType.NULL;
		}
	}

	public static void setString(X31SDataBeanAccess bean, String item, String value)
	{
		bean.sendMessageString(item, X31CWebConst.DATABEAN_SET_VALUE, value);
	}

	public static void setLong(X31SDataBeanAccess bean, String item, Long value)
	{
		bean.sendMessageLong(item, X31CWebConst.DATABEAN_SET_VALUE, value);
	}

	public static void setBoolean(X31SDataBeanAccess bean, String item, Boolean value)
	{
		bean.sendMessageBoolean(item, X31CWebConst.DATABEAN_SET_VALUE, value);
	}

	public static void setStringArrayAt(X31SDataBeanAccess bean, String item, int index, String value)
	{
		bean.sendMessageString(item, X31CWebConst.DATABEAN_SET_VALUE, index, value);
	}

	public static void setLongAt(X31SDataBeanAccess bean, String item, int index, Long value)
	{
		bean.sendMessageLong(item, X31CWebConst.DATABEAN_SET_VALUE, index, value);
	}

	public static void setBooleanAt(X31SDataBeanAccess bean, String item, int index, Boolean value)
	{
		bean.sendMessageBoolean(item, X31CWebConst.DATABEAN_SET_VALUE, index, value);
	}

	public static void setStringArray(X31SDataBeanAccess bean, String item, String[] values)
	{
		X31CVector<String> vector = new X31CVector<String>();
		for (String value : values)
		{
			vector.add(value);
		}
		bean.sendMessageStringArray(item, X31CWebConst.DATABEAN_SET_DEF_VALUE, vector);
	}

	public static void setLongArray(X31SDataBeanAccess bean, String item, Long[] values)
	{
		X31CVector<Long> vector = new X31CVector<Long>();
		for (Long value : values)
		{
			vector.add(value);
		}
		bean.sendMessageLongArray(item, X31CWebConst.DATABEAN_SET_DEF_VALUE, vector);
	}

	public static void setBooleanArray(X31SDataBeanAccess bean, String item, Boolean[] values)
	{
		X31CVector<Boolean> vector = new X31CVector<Boolean>();
		for (Boolean value : values)
		{
			vector.add(value);
		}
		bean.sendMessageBooleanArray(item, X31CWebConst.DATABEAN_SET_DEF_VALUE, vector);
	}

	public static void clearBeanArray(X31SDataBeanAccess bean, String item)
	{
		X31SDataBeanAccessArray beanArray = bean.getDataBeanArray(item);
		beanArray.clearArray();
	}

	public static X31SDataBeanAccessArray getBeanArray(X31SDataBeanAccess bean, String item)
	{
		return bean.getDataBeanArray(item);
	}

	public static String getString(X31SDataBeanAccess bean, String item)
	{
		return bean.sendMessageString(item, X31CWebConst.DATABEAN_GET_VALUE);
	}

	public static Long getLong(X31SDataBeanAccess bean, String item)
	{
		return bean.sendMessageLong(item, X31CWebConst.DATABEAN_GET_VALUE);
	}

	public static Boolean getBoolean(X31SDataBeanAccess bean, String item)
	{
		return bean.sendMessageBoolean(item, X31CWebConst.DATABEAN_GET_VALUE);
	}

	public static String getStringAt(X31SDataBeanAccess bean, String item, int index)
	{
		return bean.sendMessageString(item, X31CWebConst.DATABEAN_GET_VALUE, index);
	}

	public static Long getLongAt(X31SDataBeanAccess bean, String item, int index)
	{
		return bean.sendMessageLong(item, X31CWebConst.DATABEAN_GET_VALUE, index);
	}

	public static Boolean getBooleanAt(X31SDataBeanAccess bean, String item, int index)
	{
		return bean.sendMessageBoolean(item, X31CWebConst.DATABEAN_GET_VALUE, index);
	}

	public static int getArrayCount(X31SDataBeanAccess bean, String item)
	{
		Integer count = (Integer)bean.sendMessage(item, X31CWebConst.DATABEAN_GET_COUNT);
		return count.intValue();
	}

	public static String[] getStringArray(X31SDataBeanAccess bean, String item)
	{
		int count = getArrayCount(bean, item);
		ArrayList<String> result = new ArrayList<String>(count);
		for (int i = 0; i < count; i++)
		{
			String element = getStringAt(bean, item, i);
			result.add(element);
		}
		return (String[])result.toArray(new String[0]);
	}

	public static Long[] getLongArray(X31SDataBeanAccess bean, String item)
	{
		int count = getArrayCount(bean, item);
		ArrayList<Long> result = new ArrayList<Long>(count);
		for (int i = 0; i < count; i++)
		{
			Long element = getLongAt(bean, item, i);
			result.add(element);
		}
		return (Long[])result.toArray(new Long[0]);
	}

	public static Boolean[] getBooleanArray(X31SDataBeanAccess bean, String item)
	{
		int count = getArrayCount(bean, item);
		ArrayList<Boolean> result = new ArrayList<Boolean>(count);
		for (int i = 0; i < count; i++)
		{
			Boolean element = getBooleanAt(bean, item, i);
			result.add(element);
		}
		return (Boolean[])result.toArray(new Boolean[0]);
	}

	public static X31SDataBeanAccess createBeanFromArray(X31SDataBeanAccessArray beanArray)
	{
		return beanArray.addDataBean();
	}

	public static BeanMap getBeanMapFromDataBean(X31SDataBeanAccess bean, Object[] structure)
	{
		BeanMap result = new BeanMap();
		for (Object node : structure)
		{
			Object[] pair = (Object[])node;
			String item = (String)pair[0];
			Object value = pair[1];

			StructureType type = StructureType.resolve(value);

			switch (type)
			{
			case DATABEAN:
			{
				X31SDataBeanAccessArray beanArray = Mover.getBeanArray(bean, item);
				ArrayList<BeanMap> content = getBeanMapListFromDataBeanArray(beanArray, (Object[])value);
				result.pair(item, content);
			}
				break;
			case STRING:
			{
				String content = Mover.getString(bean, item);
				result.pair(item, content);
			}
				break;
			case LONG:
			{
				Long content = Mover.getLong(bean, item);
				result.pair(item, content);
			}
				break;
			case BOOLEAN:
			{
				Boolean content = Mover.getBoolean(bean, item);
				result.pair(item, content);
			}
				break;
			case STRINGS:
			{
				String[] content = Mover.getStringArray(bean, item);
				result.pair(item, content);
			}
				break;
			case LONGS:
			{
				Long[] content = Mover.getLongArray(bean, item);
				result.pair(item, content);
			}
				break;
			case BOOLEANS:
			{
				Boolean[] content = Mover.getBooleanArray(bean, item);
				result.pair(item, content);
			}
				break;

			default:
				break;
			}
		}
		return result;
	}

	public static ArrayList<BeanMap> getBeanMapListFromDataBeanArray(X31SDataBeanAccessArray beanArray, Object[] structure)
	{
		int count = beanArray.getCount().intValue();
		ArrayList<BeanMap> result = new ArrayList<BeanMap>(count);
		for (int i = 0; i < count; i++)
		{
			X31SDataBeanAccess bean = beanArray.getDataBean(i);
			BeanMap content = getBeanMapFromDataBean(bean, structure);
			result.add(content);
		}
		return result;
	}

	@SuppressWarnings("unchecked")
	public static void setBeanMapToDataBean(BeanMap beanMap, X31SDataBeanAccess bean)
	{
		for (String key : beanMap.keySet())
		{
			Object value = beanMap.get(key);
			ValueType type = ValueType.resolve(value);

			switch (type)
			{
			case NULL:
				break;
			case STRING:
				Mover.setString(bean, key, (String)value);
				break;
			case LONG:
				Mover.setLong(bean, key, (Long)value);
				break;
			case BOOLEAN:
				Mover.setBoolean(bean, key, (Boolean)value);
				break;
			case STRINGS:
			{
				X31CVector<String> vec = new X31CVector<String>();
				for (String s : (String[])value)
				{
					vec.add(s);
				}
				bean.sendMessageStringArray(key, X31CWebConst.DATABEAN_SET_DEF_VALUE, vec);
			}
				break;
			case LONGS:
			{
				X31CVector<Long> vec = new X31CVector<Long>();
				for (Long s : (Long[])value)
				{
					vec.add(s);
				}
				bean.sendMessageLongArray(key, X31CWebConst.DATABEAN_SET_DEF_VALUE, vec);
			}
				break;
			case BOOLEANS:
			{
				X31CVector<Boolean> vec = new X31CVector<Boolean>();
				for (Boolean s : (Boolean[])value)
				{
					vec.add(s);
				}
				bean.sendMessageBooleanArray(key, X31CWebConst.DATABEAN_SET_DEF_VALUE, vec);
			}
				break;
			case ARRAY_LIST:
			{
				X31SDataBeanAccessArray subBeanArray = null;
				subBeanArray = bean.getDataBeanArray(key);
				setBeanMapListForDataBeanArray(subBeanArray, (ArrayList<BeanMap>)value);
			}
				break;

			default:
				throw new JCCFrameworkException("JCCWebCommon#getScreenInfoでサポートされていないオブジェクトの型です。");
			}
		}
	}

	public static void setBeanMapListForDataBeanArray(X31SDataBeanAccessArray beanArray, ArrayList<BeanMap> beanMapList)
	{
		beanArray.clearArray();
		for (BeanMap beanMap : beanMapList)
		{
			X31SDataBeanAccess bean = beanArray.addDataBean();
			// 再帰呼び出し
			setBeanMapToDataBean(beanMap, bean);
		}
	}

	public static void addBeanMapForDataBeanArray(X31SDataBeanAccessArray beanArray, BeanMap beanMap)
	{
		X31SDataBeanAccess bean = beanArray.addDataBean();
		setBeanMapToDataBean(beanMap, bean);
	}

}

class Items
{

	interface Transformer<I, O>
	{

		O transform(I input);
	}

	interface Closure<I>
	{

		void execute(I input);
	}

	interface Predicater<I>
	{

		boolean evaluate(I input);
	}

	public static <I, O> ArrayList<O> map(ArrayList<I> in, final Transformer<I, O> transformer)
	{
		final ArrayList<O> result = new ArrayList<O>(in.size());
		each(in, new Closure<I>()
		{

			@Override
			public void execute(I input)
			{
				result.add(transformer.transform(input));
			}
		});
		return result;
	}

	public static <I> void each(ArrayList<I> in, Closure<I> closure)
	{
		for (I item : in)
		{
			closure.execute(item);
		}
	}

	public static <I> ArrayList<I> select(ArrayList<I> in, Predicater<I> predicater)
	{
		ArrayList<I> result = new ArrayList<I>(in.size());
		for (I item : in)
		{
			if (predicater.evaluate(item))
			{
				result.add(item);
			}
		}
		return result;
	}

	public static <I> boolean exist(ArrayList<I> in, Predicater<I> predicater)
	{
		for (I item : in)
		{
			if (predicater.evaluate(item))
			{
				return true;
			}
		}
		return false;
	}

	public static <I> I find(ArrayList<I> in, Predicater<I> predicater)
	{
		for (I item : in)
		{
			if (predicater.evaluate(item))
			{
				return item;
			}
		}
		return null;
	}

}

class TextFilter implements Predicater<HashMap<String, String>>
{

	String key;
	String value;

	public TextFilter(String key, String value)
	{
		this.key = key;
		this.value = value;
	}

	@Override
	public boolean evaluate(HashMap<String, String> item)
	{
		String itemValue = item.get(key);
		return this.value.equals(itemValue);
	}
}

class ObjectFilter implements Predicater<HashMap<String, Object>>
{

	String key;
	Object value;

	public ObjectFilter(String key, Object value)
	{
		this.key = key;
		this.value = value;
	}

	@Override
	public boolean evaluate(HashMap<String, Object> item)
	{
		Object itemValue = item.get(key);
		return this.value.equals(itemValue);
	}
}

class BeanMapListFilter implements Predicater<BeanMap>
{

	String key;
	Object value;

	public BeanMapListFilter(String key, Object value)
	{
		this.key = key;
		this.value = value;
	}

	@Override
	public boolean evaluate(BeanMap item)
	{
		Object itemValue = item.get(key);
		return this.value.equals(itemValue);
	}
}

class BeanMapListMultiFilter implements Predicater<BeanMap>
{
	String key;
	Object[] values;

	public BeanMapListMultiFilter(String key, Object[] values)
	{
		this.key = key;
		this.values = values;
	}

	@Override
	public boolean evaluate(BeanMap item)
	{
		Object itemValue = item.get(key);

		for (Object value : values)
		{
			if (value.equals(itemValue))
			{
				return true;
			}
		}
		return false;
	}
}

class ObjectsFilter implements Predicater<HashMap<String, Object>>
{

	String key;
	Object[] values;

	public ObjectsFilter(String key, Object[] values)
	{
		this.key = key;
		this.values = values;
	}

	@Override
	public boolean evaluate(HashMap<String, Object> item)
	{
		Object itemValue = item.get(key);

		for (Object value : values)
		{
			if (value.equals(itemValue))
			{
				return true;
			}
		}
		return false;
	}
}

class MskmYmdCheckUpdater implements Closure<BeanMap>
{

	String mskmYmd;

	public MskmYmdCheckUpdater(String mskmYmd)
	{
		this.mskmYmd = mskmYmd;
	}

	@Override
	public void execute(BeanMap item)
	{
		String mskmYmd = (String)item.get(KKW01021SFConst.MSKM_YMD_03);
		if (this.mskmYmd.equals(mskmYmd))
		{
			Boolean choice = Boolean.TRUE;
			item.put(KKW01021SFConst.CHOICE_03, choice);
		}
	}
}

class BeanMapValuesPicker implements Transformer<BeanMap, String>
{

	String key;

	public BeanMapValuesPicker(String key)
	{
		this.key = key;
	}

	@Override
	public String transform(BeanMap in)
	{
		String out = (String)in.get(this.key);
		return out;
	}
}
