/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：KKW21801SFLogic
 *   ソースファイル名：KKW21801SFLogic.java
 *   作成者          ：FJ）澤田
 *   日付            ：2017年09月23日
 *＜機能概要＞
 *   解約レター登録画面を表示する。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v33.00.00   2017/09/23   FJ）澤田    新規作成
 *   v39.00.00   2018/07/20   FJ)柳       【ANK-3427-00-00】【解約精算金チェック機能拡張】工事費割賦関連チェックの実装
 *   v54.00.00   2021/07/09   FJ)吉村     【ANK-4013-00-00】定額サービスゲーミングデバイス導入
 *   v56.00.00   2021/10/22   FJ)吉村     【ANK-4151-00-00】解約レター登録画面「レター送付先住所」項目の表示・入力制御変更対応
 **********************************************************************/
package eo.web.webview.KKW21801SF;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.fujitsu.futurity.common.JSYwebLog;
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.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JZMCommonUtil;
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.JKKScreenConst;
import eo.web.webview.mapping.KKSV0871_KKSV0871OPDBMapper;
import eo.web.webview.mapping.KKSV0872_KKSV0872OPDBMapper;
import eo.web.webview.mapping.KKSV0875_KKSV0875OPDBMapper;

/**
 * 解約レター登録画面を表示する。
 * <p>
 * <BR>
 * 
 * @author FJ
 */
@SuppressWarnings("serial")
public class KKW21801SFLogic extends JCCWebBusinessLogic
{
	/**
	 * 料金グループコード
	 */
	private static final String[][] PRC_GRP_CD = {
		// 料金グループコード
		{"02", "03", "04"}, //ネット
		{"10"}, //電話
		{"11", "12", "13"}//テレビ
	};

	/**
	 * Array項目リスト
	 */
	private static final Set<String> ARRAY_ITEM_SET = new HashSet<String>();

	/**
	 * クリア不要項目リスト
	 */
	private static final Set<String> NON_CLEAR_ITEM_SET = new HashSet<String>();
	
	/**
	 * Boolean項目リスト
	 */
	private static final Set<String> BOOLEAN_ITEM_SET = new HashSet<String>();

	static {
		// Array項目リスト
		Collections.addAll(ARRAY_ITEM_SET
				, KKW21801SFConst.DSL_LETTER_SEARCH_LIST);

		// クリア不要項目
		Collections.addAll(NON_CLEAR_ITEM_SET
				, KKW21801SFConst.DSL_LETTER_SOHUS_STATE_CHOICE_LIST
				, KKW21801SFConst.DSL_LETTER_COMMENT_BIKO_CD_LIST
				, KKW21801SFConst.SEARCH_SYSID
				, KKW21801SFConst.SEARCH_SEIKY_KEI_NO
				, KKW21801SFConst.SEARCH_SVC_KEI_NO
				, KKW21801SFConst.SEARCH_DISP_FLG
				, KKW21801SFConst.DSL_SEISAN_PRC_KMK_LIST);
		// Boolean項目リスト
		Collections.addAll(BOOLEAN_ITEM_SET
				, KKW21801SFConst.RSLT_CHOICE_02);
	}
	
	/**
	 * 初期表示処理を行います。<br>
	 * <br>
	 * @return	true:正常
	 * @throws	Exception
	 */
	public boolean actionInit() throws Exception
	{

		// 引き継ぎの情報MAPを取得する。
		HashMap<String, Object> hktgParamMap  = new HashMap<String, Object>(); // 

		hktgParamMap = JCCWebCommon.getScreenInfo(this);
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };
		
		// 引継情報を取得
		if (hktgParamMap != null)
		{
			HashMap<String, Object> hktgMap  = new HashMap<String, Object>(); // 
			List<HashMap<String, Object>> dataList = new ArrayList<HashMap<String, Object>>();
			dataList = (List<HashMap<String, Object>>)hktgParamMap.get(JKKCommonConst.HKTGI_CUST_KEI_HKTGI_LIST);
			hktgMap = dataList.get(0);
			String sysid = (String)hktgMap.get(JKKCommonConst.HKTGI_SYSID);
			if(sysid != null && !"".equals(sysid))
			{
				paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_SYSID, X31CWebConst.DATABEAN_SET_VALUE, sysid);
				paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
			}
		} 
		else 
		{
			// 検索部表示フラグ
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_SYSID, X31CWebConst.DATABEAN_SET_VALUE, "");
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "1");
		}
		//登録画面初期表示処理
		actionInitKKW21801();
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		return true;
	}
	
	/**
	 * 登録画面初期表示処理(画面ごと個別処理）
	 * 
	 * @return 正常終了:true 異常終了:false
	 * @throws Exception
	 */
	private boolean actionInitKKW21801() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };

		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0871_KKSV0871OPDBMapper mapper = new KKSV0871_KKSV0871OPDBMapper();
		// 変数の定義
		HashMap<String, Object> paramMap  = new HashMap<String, Object>(); // 
		
		HashMap<String, Object> inputMap  = new HashMap<String, Object>(); // 
		HashMap<String, Object> outputMap  = new HashMap<String, Object>(); // 
		// パラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0871");
		
		mapper.setKKSV087101CC(paramBean, inputMap);
		
		invokeService(paramMap, inputMap, outputMap);
		
		mapper.getKKSV087101CC(paramBean, outputMap);

		// リスト取得処理
		searchListGetMap(paramBean, outputMap);
		
		
		// 自画面の画面名を設定
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW21801);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		return true;
	}

	/**
	 * 検索ボタン処理を行います。<br>
	 * <br>
	 * @return	true:正常
	 * @throws	Exception
	 */
	public boolean actionSearch() throws Exception
	{

		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };

		// 検索の場合は選択状態をクリアする。
		X31SDataBeanAccessArray selectionList = paramBean[0].getDataBeanArray(KKW21801SFConst.DSL_LETTER_SEARCH_LIST);
		if (selectionList != null)
		{
			selectionList.clearArray();
		}
		
		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0875_KKSV0875OPDBMapper mapper = new KKSV0875_KKSV0875OPDBMapper();
		// 変数の定義
		HashMap<String, Object> paramMap  = new HashMap<String, Object>(); // 
		
		HashMap<String, Object> inputMap  = new HashMap<String, Object>(); // 
		HashMap<String, Object> outputMap  = new HashMap<String, Object>(); // 
		// パラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0875");
		
		// 運用日付の取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		
		// 取得情報の上がりマッピング
		mapper.setKKSV087501CC(paramBean, inputMap, JKKCommonConst.FUNC_CODE_1);
		
		//一覧情報取得サービス
		invokeService(paramMap, inputMap, outputMap);
		
		// 取得情報の下りマッピング
		mapper.getKKSV087501CC(paramBean, outputMap);
		
		// リスト取得処理
		searchListGetMap(paramBean, outputMap);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

		return true;
	}
	
	/**
	 * 一覧検索サービス呼出処理を行います。<br>
	 * <br>
	 * @param	paramBean	DataBean項目の配列
	 * @param	outputMap	
	 * @return	なし
	 */
	private void searchListGetMap(X31SDataBeanAccess[] paramBean, HashMap<String, Object> outputMap)
	{
		String searchErrFlg = null;
		HashMap parentMap = null;
		// 検索エラーフラグの取得
		if(outputMap.containsKey("KKSV087501CC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV087501CC");
			searchErrFlg = JCCWebCommon.getSearchErrFlg("KKSV087501CC", outputMap);
		}
		else if(outputMap.containsKey("KKSV087101CC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV087101CC");
			searchErrFlg = JCCWebCommon.getSearchErrFlg("KKSV087101CC", outputMap);
		}
		else 
		{
			// 一覧表示フラグ
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_RSLT_LIST_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
			return;
		}
		
		if(!parentMap.containsKey("dsl_letter_search_list"))
		{	
			// 一覧表示フラグ
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_RSLT_LIST_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
			return;
		}
		
		// 一覧表示フラグ
		paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_RSLT_LIST_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "1");

		// 検索結果が0件の場合の処理
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
		{
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0330__I);

			// 一覧表示フラグ
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_RSLT_LIST_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
		}
		// 検索結果が最大検索件数超えの場合の処理
		else if (JPCModelConstant.SEARCH_ERR_FLG_OVERMAX.equals(searchErrFlg))
		{
			String[] str = { JCCWebCommon.getSearchConst("KKW21801_MAX_SHOW_CNT") };
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0340__I, str);

			// 一覧表示フラグ
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_RSLT_LIST_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "0");
		}
		// 表示ページに該当するデータがない場合の処理
		else if (JPCModelConstant.SEARCH_ERR_FLG_NODATA.equals(searchErrFlg))
		{
			// 再検索にて1ページ目を表示する
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0350__I);

			// 一覧表示フラグ
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_RSLT_LIST_DISP_FLG, X31CWebConst.DATABEAN_SET_VALUE, "1");
		}
	}
	
	/**
	 * 3.8 登録確認ボタン
	 * 
	 * @return 処理結果
	 * @throws Exception 
	 */
	public boolean actionCfm() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		
		////////////////////////////////////////////////////////////////////////////////
		X31SDataBeanAccessArray arraybean = null;
		X31SDataBeanAccess beanTemp = null;
		beanTemp = paramBean[0];
		arraybean = beanTemp.getDataBeanArray(KKW21801SFConst.DSL_LETTER_SEARCH_LIST);

		String netDelYmdYear = paramBean[0].sendMessageString(KKW21801SFConst.NET_DEL_YMD_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		String netDelYmdMon = paramBean[0].sendMessageString(KKW21801SFConst.NET_DEL_YMD_MON, X31CWebConst.DATABEAN_GET_VALUE);
		String netDelYmdDay = paramBean[0].sendMessageString(KKW21801SFConst.NET_DEL_YMD_DAY, X31CWebConst.DATABEAN_GET_VALUE);
		String netDelYmd =  JZMCommonUtil.nullToBlank(netDelYmdYear + netDelYmdMon + netDelYmdDay);
		//解約年月日（ネット）をセット
		paramBean[0].sendMessageString("解約年月日（ネット）", X31CWebConst.DATABEAN_SET_VALUE, netDelYmd);
		String telDelYmdYear = paramBean[0].sendMessageString(KKW21801SFConst.TEL_DEL_YMD_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		String telDelYmdMon = paramBean[0].sendMessageString(KKW21801SFConst.TEL_DEL_YMD_MON, X31CWebConst.DATABEAN_GET_VALUE);
		String telDelYmdDay = paramBean[0].sendMessageString(KKW21801SFConst.TEL_DEL_YMD_DAY, X31CWebConst.DATABEAN_GET_VALUE);
		String telDelYmd =  JZMCommonUtil.nullToBlank(telDelYmdYear + telDelYmdMon + telDelYmdDay);
		//解約年月日（電話）をセット
		paramBean[0].sendMessageString("解約年月日（電話）", X31CWebConst.DATABEAN_SET_VALUE, telDelYmd);
		String tvDelYmdYear = paramBean[0].sendMessageString(KKW21801SFConst.TV_DEL_YMD_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		String tvDelYmdMon = paramBean[0].sendMessageString(KKW21801SFConst.TV_DEL_YMD_MON, X31CWebConst.DATABEAN_GET_VALUE);
		String tvDelYmdDay = paramBean[0].sendMessageString(KKW21801SFConst.TV_DEL_YMD_DAY, X31CWebConst.DATABEAN_GET_VALUE);
		String tvDelYmd =  JZMCommonUtil.nullToBlank(tvDelYmdYear + tvDelYmdMon + tvDelYmdDay);
		//解約年月日（テレビ）をセット
		paramBean[0].sendMessageString("解約年月日（テレビ）", X31CWebConst.DATABEAN_SET_VALUE, tvDelYmd);
		
		// *************************************************************
		// 解約レター送付先住所選択リスト取得
		// *************************************************************
		X31SDataBeanAccessArray dsl_letter_sohus_state_choice_list = paramBean[0].getDataBeanArray(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_CHOICE_LIST);
		X31SDataBeanAccess dsl_letter_sohus_subbean = dsl_letter_sohus_state_choice_list.getDataBean(0);
		// 添え字の取得
		String dsl_letter_sohus_index = dsl_letter_sohus_subbean.sendMessageString(KKW21801SFConst.INDEX_01, X31CWebConst.DATABEAN_GET_VALUE);
		// 添え字からコードを取得
		String dsl_letter_sohus_cd_value = dsl_letter_sohus_subbean.sendMessageString(KKW21801SFConst.CD_DIV_LIST_01, 
				X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(dsl_letter_sohus_index));
		// 添え字から名称を取得
		String dsl_letter_sohus_nm_value = dsl_letter_sohus_subbean.sendMessageString(KKW21801SFConst.CD_DIV_NM_LIST_01, 
				X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(dsl_letter_sohus_index));
		// 解約レター送付先住所コード＿選択＿選択の設定
		paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_NM_CD_CHOICE, X31CWebConst.DATABEAN_SET_VALUE, dsl_letter_sohus_cd_value);
		// 解約レター送付先住所名称＿選択の設定
		paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_NM_CHOICE, X31CWebConst.DATABEAN_SET_VALUE, dsl_letter_sohus_nm_value);

		// *************************************************************
		// 解約レターコメント備考コードリスト取得
		// *************************************************************
		X31SDataBeanAccessArray dsl_letter_comment_biko_cd_list = paramBean[0].getDataBeanArray(KKW21801SFConst.DSL_LETTER_COMMENT_BIKO_CD_LIST);
		X31SDataBeanAccess dsl_letter_comment_subbean = dsl_letter_comment_biko_cd_list.getDataBean(0);
		// 添え字の取得
		String dsl_letter_comment_index = dsl_letter_comment_subbean.sendMessageString(KKW21801SFConst.INDEX_01, X31CWebConst.DATABEAN_GET_VALUE);
		// 添え字からコードを取得
		String dsl_letter_comment_cd_value = dsl_letter_comment_subbean.sendMessageString(KKW21801SFConst.CD_DIV_LIST_01, 
				X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(dsl_letter_comment_index));
		// 添え字から名称を取得
		String dsl_letter_comment_nm_value = dsl_letter_comment_subbean.sendMessageString(KKW21801SFConst.CD_DIV_NM_LIST_01, 
				X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(dsl_letter_comment_index));
		//解約レターコメント備考コード＿選択＿選択の設定
		paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_COMMENT_BIKO_CD_CHOICE, X31CWebConst.DATABEAN_SET_VALUE, dsl_letter_comment_cd_value);
		//解約レターコメント備考コード名称＿選択の設定
		paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_COMMENT_BIKO_CD_NM_CHOICE, X31CWebConst.DATABEAN_SET_VALUE, dsl_letter_comment_nm_value);
		
		//ANK-4151-00-00 ADD START
		////////////////////////////////////////////////////////////////////////////////
		String dslLetterHakYh = paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_HAK_YH, X31CWebConst.DATABEAN_GET_VALUE);
		String dslLetterSohusStatePcdBf = paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_PCD_BF, X31CWebConst.DATABEAN_GET_VALUE);
		String dslLetterSohusStatePcdAf = paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_PCD_AF, X31CWebConst.DATABEAN_GET_VALUE);
		String dslLetterSohusStateAd = paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_AD, X31CWebConst.DATABEAN_GET_VALUE);
		//ANK-4151-00-00 ADD END
		
		//単項目関連チェック処理
		if(arraybean.getCount() > 0)
		{
			for(int i = 0; i < arraybean.getCount(); i++)
			{
				X31SDataBeanAccess subbean = arraybean.getDataBean(i);
				boolean chkkBox = false;
				// 選択
				chkkBox = subbean.sendMessageBoolean("選択", X31CWebConst.DATABEAN_GET_VALUE);
				//選択状態
				if (chkkBox == true) 
				{
					//サービスが解約済みレコード
					if ("1".equals(subbean.sendMessageString("解約フラグ", X31CWebConst.DATABEAN_GET_VALUE)))
					{
						//解約日入力チェック（ネット）
						if ("".equals(netDelYmd) && checkArray(PRC_GRP_CD, 0, subbean.sendMessageString("料金グループコード", X31CWebConst.DATABEAN_GET_VALUE)))
						{
							//相違があった場合、エラー
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(ネット)"}, "net_del_ymd_year");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(ネット)"}, "net_del_ymd_mon");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(ネット)"}, "net_del_ymd_day");
							return false;
						}
						//解約日入力チェック（電話）
						if ("".equals(telDelYmd) && checkArray(PRC_GRP_CD, 1, subbean.sendMessageString("料金グループコード", X31CWebConst.DATABEAN_GET_VALUE)))
						{
							//相違があった場合、エラー
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(電話)"}, "tel_del_ymd_year");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(電話)"}, "tel_del_ymd_mon");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(電話)"}, "tel_del_ymd_day");
							return false;
						}
						//解約日入力チェック（テレビ）
						if ("".equals(tvDelYmd) && checkArray(PRC_GRP_CD, 2, subbean.sendMessageString("料金グループコード", X31CWebConst.DATABEAN_GET_VALUE)))
						{
							//相違があった場合、エラー
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(テレビ)"}, "tv_del_ymd_year");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(テレビ)"}, "tv_del_ymd_mon");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKK0830_TW, 
									new String[]{ "解約種別が設定済の, 解約年月日(テレビ)"}, "tv_del_ymd_day");
							return false;
						}
					}
					//ANK-4151-00-00 ADD START
					//書面発行要否が「要」の場合
					if ("1".equals(dslLetterHakYh))
					{
						//「レター送付先住所_郵便番号_前」、「レター送付先住所_郵便番号_後」、「レター送付先住所_住所」が入力されていない場合
						if ("".equals(dslLetterSohusStatePcdBf) || "".equals(dslLetterSohusStatePcdAf) || "".equals(dslLetterSohusStateAd))
						{
							//相違があった場合、エラー
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE830_NW, 
									new String[]{ "書面発行要否が要の", "レター送付先住所"}, "dsl_letter_sohus_state_pcd_bf");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE830_NW, 
									new String[]{ "書面発行要否が要の", "レター送付先住所"}, "dsl_letter_sohus_state_pcd_af");
							JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE830_NW, 
									new String[]{ "書面発行要否が要の", "レター送付先住所"}, "dsl_letter_sohus_state_ad");
							return false;
						}
					}
					//ANK-4151-00-00 ADD END
				}
			}
		}
		
		String hashSvcKeiKaisenUcwkNo = "";
		//ネット数
		int netCount = 0;
		//電話数
		int telCount = 0;
		//テレビ数
		int tvCount = 0;
		//回線チェック・同一サービスチェック
		if(arraybean.getCount() > 0)
		{
			for(int i = 0; i < arraybean.getCount(); i++)
			{
				X31SDataBeanAccess subbean = arraybean.getDataBean(i);
				boolean chkkBox = false;
				// 選択
				chkkBox = subbean.sendMessageBoolean(KKW21801SFConst.RSLT_CHOICE_02, X31CWebConst.DATABEAN_GET_VALUE);
				//選択状態
				if (chkkBox == true) 
				{
					if ("".equals(hashSvcKeiKaisenUcwkNo)) 
					{
						hashSvcKeiKaisenUcwkNo = subbean.sendMessageString("サービス契約回線内訳番号", X31CWebConst.DATABEAN_GET_VALUE);
						continue;
					}
					
					//回線重複チェック
					if (!(hashSvcKeiKaisenUcwkNo.equals(subbean.sendMessageString("サービス契約回線内訳番号", X31CWebConst.DATABEAN_GET_VALUE))))
					{
						//相違があった場合、エラー
						JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB1320_NW, new String[]{ "同一回線グループ番号単位で解約レター対象"});
						return false;
					}
					
					if (checkArray(PRC_GRP_CD, 0, subbean.sendMessageString("料金グループコード", X31CWebConst.DATABEAN_GET_VALUE)))
					{
						netCount++;
					}
					if (checkArray(PRC_GRP_CD, 1, subbean.sendMessageString("料金グループコード", X31CWebConst.DATABEAN_GET_VALUE)))
					{
						telCount++;
					}
					if (checkArray(PRC_GRP_CD, 2, subbean.sendMessageString("料金グループコード", X31CWebConst.DATABEAN_GET_VALUE)))
					{
						tvCount++;
					}
				}
			}
		}
		
		//サービスが複数存在する場合
		if (netCount > 1 || telCount > 1 || tvCount > 1)
		{
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB1320_NW, new String[]{ "異なるサービス毎で解約レター対象"});
			return false;
		}
		
		//解約精算金フォーマットチェック
		String dslSeisanPrc = (String)paramBean[0].sendMessageString("解約精算金", X31CWebConst.DATABEAN_GET_VALUE);
		//解約清算金項目リスト
		X31SDataBeanAccessArray dslSeisanPrcKmkList = paramBean[0].getDataBeanArray("解約清算金項目リスト");

		String[] dslSeisanPrcWork = dslSeisanPrc.split("\r\n");
		String work = "";
		boolean bol = false;
		//解約精算金のチェックリストを作成
		String[] dslSeisanPrcKmkMoney = new String[dslSeisanPrcKmkList.getCount()];
		
		//解約清算金のチェックを行う。
		for (int i = 0; i < dslSeisanPrcWork.length; i++)
		{
			work =  dslSeisanPrcWork[i];
			//空の場合は、処理をしない
			if(null == work || "".equals(work))
			{
				continue;
			}
			bol = false;
			for (int j = 0; j < dslSeisanPrcKmkList.getCount(); j++)
			{
				X31SDataBeanAccess subbean = null;

				subbean = dslSeisanPrcKmkList.getDataBean(j);
				//解約清算金項目名称
				String dslSeisanPrcKmkNm = subbean.sendMessageString("解約清算金項目名称", X31CWebConst.DATABEAN_GET_VALUE);

				//マスタ存在チェック 「：」チェック
				if (!(work.indexOf(dslSeisanPrcKmkNm) == -1) && !(work.indexOf("：") == -1)) 
				{
					String money = "";
					//「：」から末尾まで取得
					money = work.substring(work.indexOf("：") + 1);
					//「,」⇒「」に変換
					money = money.replaceAll(",", "");
					//正規表現チェック
					if (money.matches("^[0-9]+$") || "".equals(money))
					{
						//最大12桁チェック
						if (money.length() < 13)
						{
							//金額がブランクの場合、「0」に変換する。
							if ("".equals(money))
							{
								money = "0";
							}
							dslSeisanPrcKmkMoney[j] = Long.valueOf(money).toString();
							bol = true;
							break;
						}	
					}
					//フォーマットチェック
					if (bol == false) 
					{
						//相違があった場合、エラー
						JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE840_KW, new String[]{ "編集形式"}, "dsl_seisan_prc");
						return false;
					}
				}
			}
		}
		
		for (int i = 0; i < dslSeisanPrcKmkMoney.length; i++)
		{
			String money = dslSeisanPrcKmkMoney[i];
			//空の場合は、エラー
			if(null == money || "".equals(money))
			{
				//相違があった場合、エラー
				JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE840_KW, new String[]{ "項目構成"}, "dsl_seisan_prc");
				return false;
			}
		}
		
		//解約清算金（ネット）の金額セット
		paramBean[0].sendMessageString("解約清算金（ネット）", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[0]);
		//解約清算金（テレビ）の金額セット
		paramBean[0].sendMessageString("解約清算金（テレビ）", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[1]);
		//ＶＤＳＬレンタル違約金の金額セット
		paramBean[0].sendMessageString("ＶＤＳＬレンタル違約金", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[2]);
		//プレミアムオプション違約金の金額セット
		paramBean[0].sendMessageString("プレミアムオプション違約金", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[3]);
		//ＳＴＢレンタル違約金の金額セット
		paramBean[0].sendMessageString("ＳＴＢレンタル違約金", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[4]);
		// ANK-3427-00-00 2018/07/20 ADD START
		// 工事費残債の金額セット
		paramBean[0].sendMessageString("工事費残債", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[5]);
		// ANK-3427-00-00 2018/07/20 ADD END
		// ANK-4013-00-00 ADD START
		// 定額テレビ精算金の金額セット
		paramBean[0].sendMessageString("定額テレビ精算金", X31CWebConst.DATABEAN_SET_VALUE, dslSeisanPrcKmkMoney[6]);
		// ANK-4013-00-00 ADD END
		
		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0872_KKSV0872OPDBMapper mapper = new KKSV0872_KKSV0872OPDBMapper();
		// 変数の定義
		HashMap<String, Object> paramMap  = new HashMap<String, Object>(); // 
		
		HashMap<String, Object> inputMap  = new HashMap<String, Object>(); // 
		HashMap<String, Object> outputMap  = new HashMap<String, Object>(); // 
		// パラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0872");
		
		// 運用日付の取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		
		//登録確認を行う
		mapper.setKKSV087201CC(paramBean, inputMap, opeDate, JKKCommonConst.FUNC_CODE_2);
		
		invokeService(paramMap, inputMap, outputMap);
		
		//////////////////////////////////////////////////////////////////////////////////
		// (5)遷移先画面の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW21802);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW21802);

		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

		return true;
	}
	
	/**
	 * 修正ボタン押下処理
	 * 
	 * @return	true : 正常終了
	 */
	public boolean actionRevise()
	{
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 編集画面を表示
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW21801);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW21801);
		return true;
	}
	
	/**
	 * 登録画面へボタン押下処理
	 * 
	 * @return	true : 正常終了
	 * @throws Exception 
	 */
	public boolean actionToAdd() throws Exception
	{
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		
		//クリアボタン処理
		actionClear();
		//初期処理
		actionInit();
		
		// 編集画面を表示
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW21801);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW21801);
		return true;
	}
	
	/**
	 * 完了ボタン押下処理
	 * 
	 * @return	true : 正常終了
	 * @throws Exception 
	 */
	public boolean actionFix() throws Exception
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };
		X31SDataBeanAccessArray arraybean = null;
		X31SDataBeanAccess beanTemp = null;
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		beanTemp = paramBean[0];
		arraybean = beanTemp.getDataBeanArray(KKW21801SFConst.DSL_LETTER_SEARCH_LIST);
		
		//利用場所住所桁数チェック
		if(arraybean.getCount() > 0)
		{
			for(int i = 0; i < arraybean.getCount(); i++)
			{
				X31SDataBeanAccess subbean = arraybean.getDataBean(i);
				boolean chkkBox = false;
				// 選択
				chkkBox = subbean.sendMessageBoolean(KKW21801SFConst.RSLT_CHOICE_02, X31CWebConst.DATABEAN_GET_VALUE);
				//選択状態
				if (chkkBox == true) 
				{
					String uePcad = JZMCommonUtil.nullToBlank(subbean.sendMessageString(KKW21801SFConst.RSLT_UEPCAD_02, X31CWebConst.DATABEAN_GET_VALUE));

					if (uePcad.length() > 121) 
					{
						//利用場所が121文字超えている場合
						JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKBE195_KW, new String[]{ "利用場所住所が１２１文字を越えている"}, "");
						return false;
					}
				}
			}
		}

		// 上りマッピング(サービス項目-DataBean項目マッピング)
		KKSV0872_KKSV0872OPDBMapper mapper = new KKSV0872_KKSV0872OPDBMapper();
		// 変数の定義
		HashMap<String, Object> paramMap  = new HashMap<String, Object>(); // 
		
		HashMap<String, Object> inputMap  = new HashMap<String, Object>(); // 
		HashMap<String, Object> outputMap  = new HashMap<String, Object>(); // 
		// パラメタ設定
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "KKSV0872");
		
		// 運用日付の取得
		String opeDate = JCCWebCommon.getOpeDate(this, null);
		
		mapper.setKKSV087201CC(paramBean, inputMap, opeDate, JKKCommonConst.FUNC_CODE_1);
		
		invokeService(paramMap, inputMap, outputMap);
		
		// 完了メッセージ
		JCCWebCommon.setMessageInfo(this, "EKB4390--I", new String[] { "解約レター登録" });

		// 完了画面を表示
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_ID_KKW21803);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JKKScreenConst.SCREEN_NAME_KKW21803);

		return true;
	}
	
	/**
	 * 配列の比較処理を行います。<br>
	 * <br>
	 * @param	workArray
	 * @param	syoriKbn
	 * @param	prcGrpCd
	 * @return	true:正常
	 * @throws	Exception
	 */
	public boolean checkArray(String[][] workArray, int syoriKbn, String prcGrpCd) throws Exception
	{
		for (int i = 0; i < workArray[syoriKbn].length; i++)
		{
			if (workArray[syoriKbn][i].equals(prcGrpCd))
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * クリアボタン処理を行います。<br>
	 * <br>
	 * @return	true:正常
	 * @throws	Exception
	 */
	public boolean actionClear() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();
		X31SDataBeanAccess[] paramBean = { bean };
		// (1) 項目名のリストを取得する。
		String[] itemNameList = bean.getItemNameList();

		// (a) 値のクリアを行う。
		for (int i = 0; i < itemNameList.length; i++)
		{
			// (ｱ) Boolean型の場合、初期値の設定を行う。
			if (isBooleanItem(itemNameList[i]))
			{
				bean.sendMessageBoolean(itemNameList[i], X31CWebConst.DATABEAN_SET_VALUE, Boolean.TRUE);
			}
			// (ｲ) Array項目の場合、リストのクリアを行う。
			else if (isArrayItem(itemNameList[i]))
			{
				bean.getDataBeanArray(itemNameList[i]).clearArray();
			}
			// (ｲ) クリア外項目の場合、リストのクリアを行わない
			else if (isNonClearItem(itemNameList[i]))
			{
				continue;
			}
			// (ｳ) 上記以外の場合、値のクリアを行う。
			else
			{
				bean.sendMessage(itemNameList[i], X31CWebConst.DATABEAN_CLEAR);
			}
		}
		
		// 解約レター送付先住所選択リストリセット
		// *************************************************************
		X31SDataBeanAccessArray dslLetterSohusStateChoiceList = paramBean[0].getDataBeanArray(KKW21801SFConst.DSL_LETTER_SOHUS_STATE_CHOICE_LIST);
		X31SDataBeanAccess  dslLetterSohusStateSubbean = dslLetterSohusStateChoiceList.getDataBean(0);
		dslLetterSohusStateSubbean.sendMessageString(KKW21801SFConst.INDEX_01, X31CWebConst.DATABEAN_SET_VALUE, "0");
		// *************************************************************
		// 解約レターコメント備考コードリストリセット
		// *************************************************************
		X31SDataBeanAccessArray dslLetterCommentBikoCdList = paramBean[0].getDataBeanArray(KKW21801SFConst.DSL_LETTER_COMMENT_BIKO_CD_LIST);
		X31SDataBeanAccess dslLetterCommentBikoCdSubbean = dslLetterCommentBikoCdList.getDataBean(0);
		dslLetterCommentBikoCdSubbean.sendMessageString(KKW21801SFConst.INDEX_01, X31CWebConst.DATABEAN_SET_VALUE, "0");
		//解約レター登録:解約レター発行要否 要設定
		paramBean[0].sendMessageString(KKW21801SFConst.DSL_LETTER_HAK_YH, X31CWebConst.DATABEAN_SET_VALUE, "1");

		String searchDispFlg = paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_DISP_FLG, X31CWebConst.DATABEAN_GET_VALUE);
		
		//子画面からの呼出の場合、検索条件はクリアしない
		if ("1".equals(searchDispFlg))
		{
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_SYSID, X31CWebConst.DATABEAN_SET_VALUE, "");
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_SEIKY_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, "");
			paramBean[0].sendMessageString(KKW21801SFConst.SEARCH_SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, "");
		}
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);

		actionInitKKW21801();
		
		return true;

	}
	
	/**
	 * Boolean項目判定処理.<br>
	 * Boolean項目の判定を行う。
	 * 
	 * @param itemName 項目ID
	 * @return true:Boolean項目、false：Boolean項目以外
	 */
	private boolean isBooleanItem(String itemName)
	{
		// (1) 項目名の判定を行い、Boolean項目の場合は、trueを返却し、Boolean項目以外の場合は、falseを返却する。
		return BOOLEAN_ITEM_SET.contains(itemName);
	}
	
	/**
	 * Array項目判定処理.<br>
	 * Array項目の判定を行う。
	 * 
	 * @param itemName 項目ID
	 * @return true:Array項目、false：Array項目以外
	 */
	private boolean isArrayItem(String itemName)
	{
		// (1) 項目名の判定を行い、Array項目の場合は、trueを返却し、Array項目以外の場合は、falseを返却する。
		return ARRAY_ITEM_SET.contains(itemName);
	}
	
	/**
	 * NonClearItem項目判定処理.<br>
	 * NonClearItem項目の判定を行う。
	 * 
	 * @param itemName 項目ID
	 * @return true:Array項目、false：Array項目以外
	 */
	private boolean isNonClearItem(String itemName)
	{
		// (1) 項目名の判定を行い、Array項目の場合は、trueを返却し、Array項目以外の場合は、falseを返却する。
		return NON_CLEAR_ITEM_SET.contains(itemName);
	}
}
