/********************************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：FUW10501SFLogic
 *   ソースファイル名：FUW10501SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2012年05月30日
 *＜機能概要＞
 *   eo光ネット長割申込のビューロジッククラスです。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v4.00       2012/05/30   FJ）南岡    【ANK-0392-00-00】長期割引契約制度対応
 *   v4.00       2012/10/09   FJ）岡井    【ANK-1223-00-00】進捗補足事項編集対応
 *   v4.00       2012/11/21   FJ) 中谷    【IT1-2012-0001900】割引サービス契約の開始対応
 *   v4.00       2012/11/23   FJ) 岡井    【IT2-2012-0001761】課金先スキーマにレコード作成しない対応
 *   v4.00       2012/12/01   FJ) 岡井    【IT1-2012-0002214】長割解約精算金対応
 *   v4.00       2012/12/13   FJ) 岡井    【IT2-2012-0002075】長割適用開始年月日不正対応
 *   v4.00       2012/12/16   FJ) 岡井    【IT2-2012-0002101】長割不正対応
 *   v4.00       2012/12/18   FJ) 岡井    【TAI-2012-0000136】不要な呼び出しを削除
 *   v4.00       2012/12/19   FJ) 岡井    【IT1-2012-0002299】割引サービス契約スキーマ更新項目追加対応
 *   v4.00       2012/12/26   FJ) 岡井    【TAI-2012-0000136】料金表制御修正
 *   v4.00       2013/01/07   FJ）岡井    【ST4-2012-0000250】性能障害対応
 *   v5.00       2013/09/09   FJ) 岡井    【OM-2013-0001849】長割課金終了日修正(前月末日対応)
 *   v8.00       2014/01/27   FJ) 文元    【ANK-1589-00-00】消費増税に伴う料金施策
 *   v7.00       2014/02/25   FJ) 谷本    【OM-2014-0000838】長割初期表示エラー対応
 *   v10.00      2014/08/25   FJ) 畑中    【ANK-2172-00-00】フロントＳ変更系料金表記の見直し対応
 *   v26.00      2016/08/04   FJ)横山     【ANK-2894-00-00】消費者保護ルール見直し追加対応（長割／即割の契約内容通知書）
 *   v27.00      2016/11/09   FJ) 森脇    【OM-2016-0001633】自動継続：無で長割適用終了日を迎えた契約に対しての申込を抑止
 *   v37.00      2018/02/19   FJ)美濃原   【ANK-3366-00-00】eo光設備卸対応
 *   v47.0.0     2019/06/28   FJ) 大島    【ANK-3636-00-00】消費増税対応（8%⇒10%）
 *   v47.0.0     2019/11/30   FJ) 大島    【ANK-3733-00-00】長割メールの連携タイミング見直し他
 *   v53.00.00   2021/04/13   FJ) 新谷    【ANK-4009-00-00】CX戦略WG方針対応
 *   v53.0.0     2021/04/28   FJ) 星野    【ANK-3951-00-00】「競争ルールの検証に関するWG」に関するシステム対応
 *   v59.00      2022/04/25   FJ) 張本    【ANK-4248-00-00】消費者保護ガイドライン改正対応
 *   v66.00.00   2023/05/01   FJ)西川     【ANK-4411-00-00】長期継続利用割引見直し対応
 *   v71.00      2024/04/02   FJ) 張本    【ANK-4468-00-00】eo光ネット「シンプルプラン」追加対応
 *   v73.00      2025/01/21   FJ) 浅井    【ANK-4427-35-00】フロント（量販・訪販）申込時に、旧長割の自動付与抑制
 *   v73.01      2025/01/21   FJ) 浅井    【ANK-4427-41-00】NTT卸対応【仕変41】長割申込画面への遷移制御
 *   v75.00      2025/05/15   FJ)西川葵   【ANK-4678-00-00】eoサポートダイヤル受付時間短縮
 ********************************************************************************/
package eo.web.webview.FUW10501SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JFUCommonUtil;
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.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0237_FUSV0237OPDBMapper;
import eo.web.webview.mapping.FUSV0238_FUSV0238OPDBMapper;
import eo.web.webview.mapping.FUSV0239_FUSV0239OPDBMapper;
import eo.web.webview.mapping.FUSV0248_FUSV0248OPDBMapper;
import eo.web.webview.mapping.FUSV0371_FUSV0371OPDBMapper;

/**
 * eo光ネット長割申込のビューロジッククラスです。
 * <p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW10501SFLogic extends JCCWebBusinessLogic
{

	/** DataBean操作種別：項目値設定 */
	private static final String SET = X31CWebConst.DATABEAN_SET_VALUE;
	/** DataBean操作種別：項目値取得 */
	private static final String GET = X31CWebConst.DATABEAN_GET_VALUE;

	/** サービスID：eo光ネット長割申込(初期表示) */
	private static final String USECASE_ID_FUSV0237 = "FUSV0237";
	/** サービスID：eo光ネット長割申込(申込) */
	private static final String USECASE_ID_FUSV0238 = "FUSV0238";
	/** サービスID：eo光ネット長割申込(解約) */
	private static final String USECASE_ID_FUSV0239 = "FUSV0239";
	/** サービスID：eo光ネット長割申込(変更) */
	private static final String USECASE_ID_FUSV0248 = "FUSV0248";
	/** サービスID：eo光ネット長割申込(更新前照会) */
	private static final String USECASE_ID_FUSV0371 = "FUSV0371";

	/** eo光ネットホームタイププラン変更基本料金一覧照会CC名 */
	private static final String FUSV023701CC = "FUSV023701CC";
	/** 初期費用一覧照会CC */
	private static final String FUSV023702CC = "FUSV023702CC";
	/** 割引サービス契約一意照会SC */
	private static final String FUSV023703SC = "FUSV023703SC";
	/** 割引サービス契約一意照会SC（運用日指定） */
	private static final String FUSV023704SC = "FUSV023704SC";
	/** JFUHTPlanChgPrcShokaiCCMsg1List */
	private static final String JFUHTPLANCHGPRCSHOKAICCLIST = "JFUHTPlanChgPrcShokaiCCMsg1List";
	/** JACPrcSimulationList */
	private static final String JACPRCSIMULATIONLIST = "JACPrcSimulationList";
	/** JACPrcSimulationDslPrcList */
	private static final String JACPRCSIMULATIONDSLPRCLIST = "JACPrcSimulationDslPrcList";
	/** JACPrcSimulationMsg2List */
	private static final String JACPRCSIMULATIONMSG2LIST = "JACPrcSimulationMsg2List";
	/** EKK0721A010CBSMsg1List */
	private static final String EKK0721A010CBSMSG1LIST = "EKK0721A010CBSMsg1List";
	/** 割引サービス契約一意照会明細 */
	private static final String EKK0451A010CBSMSG1LIST = "EKK0451A010CBSMsg1List";
	/** pcrs_cd */
	private static final String PCRS_CD = "pcrs_cd";
	/** pplan_cd */
	private static final String PPLAN_CD = "pplan_cd";
	/** seiky_amnt */
	private static final String SEIKY_AMNT = "seiky_amnt";
	/** prc_kmk_cd */
	private static final String PRC_KMK_CD = "prc_kmk_cd";
	/** key_prc_kmk_cd */
	private static final String KEY_PRC_KMK_CD = "key_prc_kmk_cd";
	/** tmp_pay_prc_nm */
	private static final String TMP_PAY_PRC_NM = "tmp_pay_prc_nm";
	/** tmp_pay_prc_amnt */
	private static final String TMP_PAY_PRC_AMNT = "tmp_pay_prc_amnt";
	/** wrib_amnt_snst_stdardymd */
	private static final String WRIB_AMNT_SNST_STDARDYMD = "wrib_amnt_snst_stdardymd";
	/** wrib_svc_kei_at_keizk_skcd */
	private static final String WRIB_SVC_KEI_AT_KEIZK_SKCD = "wrib_svc_kei_at_keizk_skcd";

// ANK-3636-00-00 MOD START
	/** 料金項目コード：基本料金 */
	private static final String PRC_KMK_CD_KIHON = "21001101601";
	/** 料金項目コードリスト(通常割1年目、通常割2年目、通常割3年目、長割3年目〜、長割6年目〜、即割) */
	private static final List<String> KIHON_PRC_KMK_CD_LIST =
			Arrays.asList("S1200100101", "S1200100201", "S1200100301", "S1200300101", "S1200300201", "S1200200101");
	/** 料金項目コードリスト(解約精算金0ヶ月、解約精算金12ヶ月、解約精算金24ヶ月、長解約精算金36ヶ月) */
	private static final List<String> DSL_PRC_KMK_CD_LIST = Arrays.asList("S1202000001", "S1202001201", "S1202002401", "S1202003601");
// ANK-3636-00-00 MOD END

	/** エラー判定用アイテム：更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";

	/** 申し込み完了メール(申込)ID */
	private static final String MAIL_ID_FUW105_1 = "FUW105_1";
	/** 申し込み完了メール(解約)ID */
	private static final String MAIL_ID_FUW105_2 = "FUW105_2";
	/** 申し込み完了メール(自動継続申込)ID */
	private static final String MAIL_ID_FUW105_3 = "FUW105_3";
// ANK-3733-00-00 ADD START
	/** 申し込み完了メール(自動継続取消)ID */
	private static final String MAIL_ID_FUW105_4 = "FUW105_4";
// ANK-3733-00-00 ADD END

	/** 申込区分("1":新規申込) */
	private static final String MSKM_DIV_1 = "1";
	/** 申込区分("2":自動継続区分変更) */
	private static final String MSKM_DIV_2 = "2";
	/** 申込区分("3":解約・解約清算金無し) */
	private static final String MSKM_DIV_3 = "3";
	/** 申込区分("4":解約・解約清算金有り) */
	private static final String MSKM_DIV_4 = "4";

	/** 1年月数 */
	private static final int YEAR_GETU_CNT = 12;
	/** 1年目最終月末 */
	private static final int YEAR_END_GETUMATU = 12;
	/** オリジナル機能コード：1 */
	private static final String FUNC_CODE_1 = "1";
	/** オリジナル機能コード：2 */
	private static final String FUNC_CODE_2 = "2";
	/** オリジナル機能コード：3 */
	private static final String FUNC_CODE_3 = "3";

	/** 定義取得パス 文言 */
	private static final String PATH_PA_MONGON = "DISPSETTING/SETTING[@screenId='FUW10501']/DISPTEXT[@groupid='MONGON']";
	/** 定義取得パス コース名 */
	private static final String PATH_PA_PPLAN_NM = "DISPSETTING/SETTING[@screenId='FUW10501']/DISPTEXT[@groupid='PPLAN_NM']";
	/** 定義取得パス 料金関係文言 */
	private static final String PATH_PA_PRC_IFNO_MONGON = "DISPSETTING/SETTING[@screenId='FUW10501']/DISPTEXT[@groupid='PRC_INFO_MONGON']";
	/** 定義取得パス 料金関係クラス */
	private static final String PATH_PA_PRC_INFO_TABLE_STYLE = "DISPSETTING/SETTING[@screenId='FUW10501']/DISPCTL[@groupid='PRC_INFO_TABLE_STYLE']";
	/** 定義取得パス 期間関係文言 */
	private static final String PATH_PA_KIKAN_IFNO_MONGON = "DISPSETTING/SETTING[@screenId='FUW10501']/DISPTEXT[@groupid='KIKAN_INFO_MONGON']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";

	/** 定義取得ID 年 */
	private static final String ID_YEAR = "year";
	/** 定義取得ID 月 */
	private static final String ID_MONTH = "month";
	/** 定義取得ID 日 */
	private static final String ID_DAY = "day";
	/** 定義取得ID 月末 */
	private static final String ID_GETSUMATSU = "getsumatsu";
	/** 定義取得ID カ月 */
	private static final String ID_KAGETSU = "kagetsu";
	/** 定義取得ID 契約中 */
	private static final String ID_KEI = "kei";
	/** 定義取得ID 未契約 */
	private static final String ID_MIKEI = "mikei";
	/** 定義取得ID する */
	private static final String ID_SURU = "suru";
	/** 定義取得ID しない */
	private static final String ID_SHINAI = "shinai";
	/** 定義取得ID 見出し */
	private static final String ID_MIDASHI = "midashi";
	/** 定義取得ID 基本料金 */
	private static final String ID_KIHON_PRICE = "kihon_price";
	/** 定義取得ID 長割適用期間 */
	private static final String ID_CHO_TEKI_KIKAN = "cho_teki_kikan";
	/** 定義取得ID 解約清算金期間 */
	private static final String ID_KAI_SEI_KIKAN = "kai_sei_kikan";

	/** 定義取得ID 単価単位 */
	private static final String ID_TNK_TANI = "tnk_tani";
	/** 定義取得ID 基本料金(適用後) */
	private static final String ID_TITLE_1 = "title_1";
	/** 定義取得ID 初期費用 */
	private static final String ID_TITLE_3 = "title_3";
	/** 基本料金デザインクラス取得キー */
	private static final String TITLE_STYLE_1 = "TITLE_STYLE_1";
	/** 初期費用デザインクラス取得キー */
	private static final String TITLE_STYLE_2 = "TITLE_STYLE_2";
	/** 基本料金幅クラス取得キー */
	private static final String TABLE_HABA_1 = "TABLE_HABA_1";
	/** 初期費用幅クラス取得キー */
	private static final String TABLE_HABA_2 = "TABLE_HABA_2";

	/** タイトル div id */
	private static final String DIV_TITLE = "title";
	/** テーブル左値リスト設定キー */
	private static final String KEY_TABLE_LEFT_VALUE_LIST = "KEY_TABLE_LEFT_VALUE_LIST";
	/** テーブル右値リスト設定キー */
	private static final String KEY_TABLE_RIGHT_VALUE_LIST = "KEY_TABLE_RIGHT_VALUE_LIST";
	/** テーブル値識別リスト設定キー */
	private static final String KEY_TABLE_VALUE_SKBT_LIST = "KEY_TABLE_VALUE_SKBT_LIST";

	/** 料金表 TR ID show */
	private static final String TR_ID_SHOW = "show";
	/** 料金表 TR ID hide */
	private static final String TR_ID_HIDDEN = "hidden";

	/** 日付フォーマット：yyyyMMdd */
	private static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";
	/** 日付フォーマット：yyyyMM */
	private static final String DATE_FORMAT_YYYYMM = "yyyyMM";
	/** 置換文字列：%1% */
	private static final String REPLACE_STR_1 = "%1%";
	/** 置換文字列：%2% */
	private static final String REPLACE_STR_2 = "%2%";

	/** URL:longplan */
	private static final String LONGPLAN = "longplan";
	/** URL:longplan_dissolution */
	private static final String LONGPLAN_DISSOLUTION = "longplan_dissolution";

	/**
	 * 初期処理です。
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- ★★★長割申込/変更/解約　初期表示開始★★★ -----");

		// ■設備卸チェック
		JFUWebCommon.checkOrosi(this);

		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// ●共有フォームBeanより現顧客契約情報を取得
		Map<String, Object> commonInfoMap = getCommoninfoBeanInfo(commonInfoBean, null);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess wribKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_KEI_INFO);
		X31SDataBeanAccess wribTgKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_TRGT_KEI_INFO);

		// 配列に各Beanを格納
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, wribKeiInfoBean, wribTgKeiInfoBean };

		// ●100Mライトコースチェック
		chk100MLight(beanArray);

		// ●契約情報の設定
		setKeiInfo(beanArray);

// ANK-4427-35-00 MOD START
		// ●申込区分設定
		setMskmDiv(beanArray);
// ANK-4427-35-00 MOD END

		// ●初期表示のサービス実行(上り下りマッピング処理も含む)
		HashMap outPutMap = executeInitService(beanArray);

// ANK-4427-35-00 MOD START
//		// ●申込区分設定
//		setMskmDiv(beanArray);
// ANK-4427-35-00 MOD END

		// ●各値をデータBeanに設定
		setSvcFormBeanOfInit(beanArray, outPutMap);

		// ●申込区分設定(解約のみ)
		setMskmDivDsl(beanArray);

		// ●料金情報設定処理
		setPriceInfo(beanArray, outPutMap);

		// ●有料フラグ設定
		setPayFlg(bean, outPutMap);

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUWebCommon.getScreenId(this));
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW10501);
		
		// オンライン運用日取得＆設定
		String opeDate = JFUWebCommon.getOpeDate(this, null);
		setFuOpedate(commonInfoBean, opeDate);

		return true;
	}

	/**
	 * 確認画面の確認するボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean cfm() throws Exception
	{
		DEBUG_LOG.info("----- ★★★長割申込/変更/解約　確認するボタン押下処理開始★★★ -----");

		// 共有フォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 変更後自動継続有無コード
		String afAutoKeiCd = bean.sendMessageString(FUW10501SFConst.BEFOR_WRIB_SVC_KEI_AT_KEIZK_SKCD, GET);

		// 自動継続を申し込む場合
		if (bean.sendMessageBoolean(FUW10501SFConst.MSKM_AUTO_KEIZK, GET))
		{
			afAutoKeiCd = JFUStrConst.CD01436_1;
		}

		// 自動継続取り消しを申し込む場合
		if (bean.sendMessageBoolean(FUW10501SFConst.CL_AUTO_KEIZK, GET))
		{
			afAutoKeiCd = JFUStrConst.CD01436_0;
		}

		// 変更後割引サービス契約自動継続識別コード
		bean.sendMessageString(FUW10501SFConst.AFTER_WRIB_SVC_KEI_AT_KEIZK_SKCD, SET, afAutoKeiCd);

		// ●サービス実行
		// 申込区分
		String mskmDiv = bean.sendMessageString(FUW10501SFConst.MSKM_DIV, GET);

		if (MSKM_DIV_2.equals(mskmDiv))
		{
			// 変更サービス実行(上り下りマッピング処理も含む)
			executeChgService(commonInfoBean, bean, JPCModelConstant.FUNC_CD_2);
		}
		else if (MSKM_DIV_3.equals(mskmDiv))
		{
			// 解約サービス実行(上り下りマッピング処理も含む)
			executeDslService(commonInfoBean, bean, JPCModelConstant.FUNC_CD_2);
		}

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW10502);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW10502);

		return true;
	}

	/**
	 * 確認画面の戻るボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		DEBUG_LOG.info("----- ★★★長割申込/変更/解約　戻るボタン押下処理開始★★★ -----");

		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 文言一覧取得
		Map<String, String> mongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_MONGON, QUERY_ATTR_NAME);
		// 変更前の自動継続コード
		String bfAutoKeiSkCd = bean.sendMessageString(FUW10501SFConst.BEFOR_WRIB_SVC_KEI_AT_KEIZK_SKCD, GET);

		if (JFUStrConst.CD01436_0.equals(bfAutoKeiSkCd))
		{
			// 自動継続状態文言設定：しない
			bean.sendMessageString(FUW10501SFConst.AUTO_KEI_JT, SET, mongonMap.get(ID_SHINAI));
		}
		else if (JFUStrConst.CD01436_1.equals(bfAutoKeiSkCd))
		{
			// 自動継続状態文言設定：する
			bean.sendMessageString(FUW10501SFConst.AUTO_KEI_JT, SET, mongonMap.get(ID_SURU));
		}

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW10501);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW10501);

		return true;
	}

	/**
	 * 確認画面の申し込むボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean mskm() throws Exception
	{
		DEBUG_LOG.info("----- ★★★長割申込/変更/解約　申し込むボタン押下処理開始★★★ -----");

		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 申込区分
		String mskmDiv = bean.sendMessageString(FUW10501SFConst.MSKM_DIV, GET);

		// ●共通関連チェックの呼び出し処理
		JFUWebCommon.checkCommonRelation(this, USECASE_ID_FUSV0238);

		// ●各サービス実行
		if (MSKM_DIV_1.equals(mskmDiv))
		{
			// 申込サービス(上り下りマッピング処理も含む)
			executeMskmService(commonInfoBean, bean, JPCModelConstant.FUNC_CD_1);
		}
		else if (MSKM_DIV_2.equals(mskmDiv))
		{
			// 変更サービス(上り下りマッピング処理も含む)
			executeChgService(commonInfoBean, bean, JPCModelConstant.FUNC_CD_1);
		}

		// ●申込完了メール送信部品呼出
		if (MSKM_DIV_1.equals(mskmDiv))
		{
			// 申込完了メール
			JFUWebCommon.sendMskmFinMail(this, MAIL_ID_FUW105_1);
		}
		else if (MSKM_DIV_2.equals(mskmDiv))
		{
// ANK-3733-00-00 MOD START
			if (bean.sendMessageBoolean(FUW10501SFConst.CL_AUTO_KEIZK, GET))
			{
				// 自動継続取消メール
				JFUWebCommon.sendMskmFinMail(this, MAIL_ID_FUW105_4);
			}
			else
			{
				// 自動継続申込メール
				JFUWebCommon.sendMskmFinMail(this, MAIL_ID_FUW105_3);
			}
		}
// ANK-3733-00-00 MOD END

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW10503);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW10503);

		return true;
	}

	/**
	 * 確認画面の解約するボタン押下
	 * 
	 * @return 処理結果
	 * @throws Exception
	 */
	public boolean dsl() throws Exception
	{
		DEBUG_LOG.info("----- ★★★長割申込/変更/解約　解約するボタン押下処理開始★★★ -----");

		// 共有フォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// ●共通関連チェックの呼び出し処理
		JFUWebCommon.checkCommonRelation(this, USECASE_ID_FUSV0238);

		// ●解約サービス実行(上り下りマッピング処理も含む)
		executeDslService(commonInfoBean, bean, JPCModelConstant.FUNC_CD_1);

		// ●申込完了メール送信部品呼出
		// 解約完了メール
		JFUWebCommon.sendMskmFinMail(this, MAIL_ID_FUW105_2);

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW10503);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW10503);

		return true;
	}

	/**
	 * eo光ネット長割申込(初期表示)サービス実行処理です。
	 * 
	 * @param beanArray データBean配列
	 * @return サービス実行結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private HashMap executeInitService(X31SDataBeanAccess[] beanArray) throws Exception
	{
		// サービス検索条件格納用マップ
		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0237);

		// DataBean-BPマッピングクラス生成
		FUSV0237_FUSV0237OPDBMapper mapper = new FUSV0237_FUSV0237OPDBMapper();

		// ●上りマッピング
		// eo光ネットホームタイププラン変更基本料金一覧照会CC
		mapper.setFUSV023701CC(beanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 初期費用一覧照会CC
		mapper.setFUSV023702CC(beanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 業務パラメータ管理一意照会SC
		mapper.setFUSV023701SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 業務パラメータ管理一意照会SC
		mapper.setFUSV023702SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_1);
// ANK-4427-35-00 MOD START
//		//割引サービス契約一意照会SC
//		mapper.setFUSV023703SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_2);
//		//割引サービス契約一意照会SC（運用日指定）
//		mapper.setFUSV023704SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_2, JPCDateUtil.addDay((JFUWebCommon.getOpeDate(this, null)), -1));
		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[0];
		// 申込区分
		String mskmDiv = bean.sendMessageString(FUW10501SFConst.MSKM_DIV, GET);
		// 新規申込の場合、割引サービスがない場合がある為、以下は実行しない
		if (!MSKM_DIV_1.equals(mskmDiv))
		{
			//割引サービス契約一意照会SC
			mapper.setFUSV023703SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_2);
			//割引サービス契約一意照会SC（運用日指定）
			mapper.setFUSV023704SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_2, JPCDateUtil.addDay((JFUWebCommon.getOpeDate(this, null)), -1));
		}
// ANK-4427-35-00 MOD END

		// ●eo光ネット長割申込(初期表示)サービス呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// JCCWebServiceExceptionの場合、システムエラー画面に遷移
			DEBUG_LOG.info("----- ■■■初期表示サービスエラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●下りマッピング
		// 業務パラメータ管理一意照会SC
		mapper.getFUSV023701SC(beanArray[0], outputMap);
		// 業務パラメータ管理一意照会SC
		mapper.getFUSV023702SC(beanArray[0], outputMap);

		return outputMap;
	}

	/**
	 * eo光ネット長割申込(申込)サービス実行処理です。
	 * 
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 * @param bean サービスフォームBean
	 * @param func_code 機能コード
	 * @throws Exception
	 */
	private void executeMskmService(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess bean, String func_code) throws Exception
	{
		// ●共有フォームBeanより現顧客契約情報を取得
		Map<String, Object> commonInfoMap = getCommoninfoBeanInfo(commonInfoBean, null);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess wribKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_KEI_INFO);
		X31SDataBeanAccess wribTgKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_TRGT_KEI_INFO);
		/** ANK-2894-00-00 add start */
		X31SDataBeanAccess kisnTgtSvcInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.KAISEN_TRGT_SVC_KEI_INFO);
		/** ANK-2894-00-00 add end */

		// 配列に各Beanを格納
		/** ANK-2894-00-00 add start */
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, wribKeiInfoBean, wribTgKeiInfoBean,
				kisnTgtSvcInfoBean };
		/** ANK-2894-00-00 add end */

		// サービス検索条件格納用マップ
		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();

		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0238);

		FUSV0238_FUSV0238OPDBMapper mapper = new FUSV0238_FUSV0238OPDBMapper();

		// ●上りマッピング
		// 申込内容承認登録SC
		mapper.setFUSV023801SC(beanArray, inputMap, func_code);
		// 割引サービス対象サービス一覧照会SC
		mapper.setFUSV023802SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_1);
		// 割引サービス契約登録SC
		mapper.setFUSV023803SC(beanArray, inputMap, func_code);
		// 割引サービス契約課金開始日変更SC
		mapper.setFUSV023804SC(beanArray, inputMap, func_code);
		// 進捗登録SC
		mapper.setFUSV023806SC(beanArray, inputMap, func_code);
		// 申込明細照査・後続業務依頼SC
		mapper.setFUSV023807SC(beanArray, inputMap, func_code);
		/** ANK-2894-00-00 add start */
		// サービスIF結果データ移送CC
		mapper.setFUSV023801CC(beanArray, inputMap, func_code);
		// 契約内容通知書登録CC
		mapper.setFUSV023802CC(beanArray, inputMap, func_code, this);
		/** ANK-2894-00-00 add end */

		// ●eo光ネット長割申込(申込)サービス呼び出し(チェックのみ)
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックエラー処理
			DEBUG_LOG.info("----- ■■■申込(申込)サービス関連チェックエラー■■■ -----");
			chkSvcRelException(se);
		}
	}

	/**
	 * eo光ネット長割申込(変更)サービス実行処理です。
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param bean サービスフォームBean
	 * @param func_code 機能コード
	 * @throws Exception
	 */
	private void executeChgService(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess bean, String func_code) throws Exception
	{
		// ●共有フォームBeanより現顧客契約情報を取得
		Map<String, Object> commonInfoMap = getCommoninfoBeanInfo(commonInfoBean, null);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess wribKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_KEI_INFO);
		X31SDataBeanAccess wribSvcTgKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_TRGT_KEI_INFO);

		// ●長割適用終了年月チェック
		String svcKeiStat = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_STAT_23, GET);
		if (!JFUStrConst.CD00037_020.equals(svcKeiStat) && !JFUStrConst.CD00037_030.equals(svcKeiStat))
		{
			chkCkkzWribAplyEndMonth(bean);
		}

		// 配列に各Beanを格納
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, wribKeiInfoBean, wribSvcTgKeiInfoBean };

		// サービス検索条件格納用マップ
		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0248);

		FUSV0248_FUSV0248OPDBMapper mapper = new FUSV0248_FUSV0248OPDBMapper();

		// ●上りマッピング
		// 申込内容承認登録SC
		mapper.setFUSV024801SC(beanArray, inputMap, func_code);
		// 割引サービス契約一意照会SC
		mapper.setFUSV024805SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_2);
		// 割引サービス契約変更SC
		mapper.setFUSV024802SC(beanArray, inputMap, func_code);
		// 進捗登録SC
		mapper.setFUSV024803SC(beanArray, inputMap, func_code);
		// 申込明細照査・後続業務依頼SC
		mapper.setFUSV024804SC(beanArray, inputMap, func_code);

		// ●eo光ネット長割申込(変更)サービス呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックエラー処理
			DEBUG_LOG.info("----- ■■■申込(変更)サービス関連チェックエラー■■■ -----");
			chkSvcRelException(se);
		}
	}

	/**
	 * eo光ネット長割申込(解約)サービス実行処理です。
	 *
	 * @param commonInfoBean  共有フォームBean
	 * @param bean サービスフォームBean
	 * @param func_code 機能コード
	 * @throws Exception 例外
	 */
	private void executeDslService(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess bean, String func_code) throws Exception
	{

		// ●共有フォームBeanより現顧客契約情報を取得
		Map<String, Object> commonInfoMap = getCommoninfoBeanInfo(commonInfoBean, null);

		// 各Beanを取得
		X31SDataBeanAccess ssoInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess svcKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess wribKeiInfoBean = (X31SDataBeanAccess)commonInfoMap.get(CommonInfoCFConst.WRIB_SVC_KEI_INFO);

		// 配列に各Beanを格納
		X31SDataBeanAccess[] beanArray = { bean, ssoInfoBean, svcKeiInfoBean, seikyKeiInfoBean, wribKeiInfoBean };

		
		// サービス検索条件格納用マップ
		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0371);

		// DataBean-BPマッピングクラス生成
		FUSV0371_FUSV0371OPDBMapper mapperFUSV0371 = new FUSV0371_FUSV0371OPDBMapper();

		// ●上りマッピング
		// 割引サービス契約一意照会SC
		mapperFUSV0371.setFUSV037101SC(beanArray, inputMap, JPCModelConstant.FUNC_CD_2);

		// ●eo光ネット長割申込(更新前照会)サービス呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// JCCWebServiceExceptionの場合、システムエラー画面に遷移
			DEBUG_LOG.info("----- ■■■申込(解約:更新前照会)サービス関連チェックエラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// ●下りマッピング
		// 割引サービス契約一意照会SC
		String mskmKisanYmd =mapperFUSV0371.getFUSV037101SC(outputMap);

		// サービス検索条件格納用マップ
		inputMap = new HashMap<String, Map<String, String>>();
		// サービス処理結果格納用マップ
		outputMap = new HashMap<String, HashMap<String, Object>>();

		// サービスパラメータ生成
		paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0239);

		FUSV0239_FUSV0239OPDBMapper mapperFUSV0239 = new FUSV0239_FUSV0239OPDBMapper();

		// ●上りマッピング
		// 申込内容承認登録SC
		mapperFUSV0239.setFUSV023901SC(beanArray, inputMap, func_code);
		// 割引サービス契約キャンセルSC
		mapperFUSV0239.setFUSV023902SC(beanArray, inputMap, func_code);
		// 割引サービス契約解約SC
		mapperFUSV0239.setFUSV023903SC(beanArray, inputMap, JFUWebCommon.getOpeDate(this, null), mskmKisanYmd, func_code);
		// 割引サービス契約解約確定SC
		mapperFUSV0239.setFUSV023904SC(beanArray, inputMap, JFUWebCommon.getOpeDate(this, null), mskmKisanYmd, func_code);
		// 進捗登録SC
		mapperFUSV0239.setFUSV023905SC(beanArray, inputMap, func_code);
		// 申込明細照査・後続業務依頼SC
		mapperFUSV0239.setFUSV023906SC(beanArray, inputMap, func_code);

		// ●eo光ネット長割申込(解約)サービス呼び出し
		try
		{
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 関連チェックエラー処理
			DEBUG_LOG.info("----- ■■■申込(解約)サービス関連チェックエラー■■■ -----");
			chkSvcRelException(se);
		}
	}

	/**
	 * 長割適用終了年月チェック処理（初期表示時）です。
	 *
	 * @param beanArray データBean配列
	 * @param svcStaYmd サービス利用開始日
	 * @param choTekiKikanStaYMD 長割適用開始日
	 * @param outMap アウトマップ
	 * @throws Exception
	 */
	private void chkCkkzWribAplyEndMonthInit(X31SDataBeanAccess[] beanArray, String svcStaYmd, String choTekiKikanStaYMD, HashMap outMap) throws Exception
	{
		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[0];

		// 申込区分
		String mskmDiv = bean.sendMessageString(FUW10501SFConst.MSKM_DIV, GET);
		// 変更前の自動継続コード
		String bfAutoKeiSkCd = bean.sendMessageString(FUW10501SFConst.BEFOR_WRIB_SVC_KEI_AT_KEIZK_SKCD, GET);
		// サービス利用開始日から月差を算出
		int useMonth = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), svcStaYmd);
		// 長割適用可能月数(2年)
		int choYear = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_1, GET));
		// 自動継続更新月数(3年)
		int autoKeiMaxYear = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_2, GET));
		// 長割適用開始日
		String choStaYMD = JFUWebCommon.getBeginOfNextMonthDate(choTekiKikanStaYMD);
		// オンライン運用日付
		String opeDate = JFUWebCommon.getOpeDate(this, null);

		// 申込区分が自動継続区分変更の場合
		if (MSKM_DIV_2.equals(mskmDiv)
				// 変更前が自動継続なしの場合
				&& JFUStrConst.CD01436_0.equals(bfAutoKeiSkCd)
				// 長割適用経過月数が1回目の適用可能月数を超過している場合
				&& useMonth > choYear + autoKeiMaxYear
				// 長割適用開始日が運用日と同日の場合
				&& opeDate.equals(choStaYMD)
				// 運用日前日の時点で自動継続がなしの場合
				&& getWribSvcKeiAtKeizkSkcd(outMap).equals(JFUStrConst.CD01436_0)
		)
		{
			DEBUG_LOG.info("----- ■■■申込(変更)契約状態エラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
	}

	/**
	 * 長割適用終了年月チェック処理です。
	 *
	 * @param bean サービスフォームBean
	 * @throws Exception
	 */
	private void chkCkkzWribAplyEndMonth(X31SDataBeanAccess bean) throws Exception
	{

		// 変更前の自動継続コード
		String bfAutoKeiSkCd = bean.sendMessageString(FUW10501SFConst.BEFOR_WRIB_SVC_KEI_AT_KEIZK_SKCD, GET);

		// 自動継続なしから自動継続を申し込む場合
		if (JFUStrConst.CD01436_0.equals(bfAutoKeiSkCd))
		{
			// オンライン運用年月
			String unyoYm = JCCWebCommon.getOpeDate(this, null).substring(0, 6);
			// 長割適用終了年月
			String ckkzWribAplyEndym = bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_APLY_ENDYM, GET);

			// 文言一覧取得
			Map<String, String> mongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_MONGON, QUERY_ATTR_NAME);

			ckkzWribAplyEndym = toFormatDate(ckkzWribAplyEndym, "yyyy" + mongonMap.get(ID_YEAR) + "MM" + mongonMap.get(ID_GETSUMATSU), DATE_FORMAT_YYYYMM);

			// 運用日 ＞ 長割満了日の場合エラー
			if (unyoYm.compareTo(ckkzWribAplyEndym) > 0)
			{
				DEBUG_LOG.info("----- ■■■申込(変更)契約状態エラー■■■ -----");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
		}
	}

	/**
	 * 日付オブジェクトを指定された形式の文字列に編集します。
	 * <br>
	 * @param arg0 編集する日付オブジェクト
	 * @param arg1 java.util.Date型の日付書式
	 * @param arg2 編集する文字列の日付書式
	 * @return String 指定された形式に編集された文字列
	 */
	private String toFormatDate(String arg0, String arg1, String arg2)
	{
		try
		{
			SimpleDateFormat instance = new SimpleDateFormat(arg1);

			return new SimpleDateFormat(arg2).format(instance.parse(arg0));

		}
		catch (ParseException pe)
		{
			return arg0;
		}
	}

	/**
	 * サービス関連チェック処理です。
	 * 
	 * <br/>
	 * @param se JCCWebServiceException
	 * @throws JCCBusinessException
	 */
	private void chkSvcRelException(final JCCWebServiceException se) throws JCCBusinessException
	{

		// 例外詳細情報を取得
		X31CMessageMoreInfo[] moreInfo = se.getMessageList().getMessageMoreInfoList();
		// メッセージ詳細情報クラスを取得
		X31CMessageMoreInfo info = moreInfo[0];
		String status = info.getStatus();
		String itemId = info.getItemId();
		String errFlg = info.getItemCheckErr();

		// ステータスが"1100"(内部スキーマ関連チェックエラー)の場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// タイプスタンプチェック
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && UPD_DTM_BF.equals(itemId))
			{
				// 更新不可エラー
				DEBUG_LOG.info("----- ■■■サービス関連チェックエラー：タイムスタンプエラー■■■ -----");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0204);
			}
			else
			{
				// システムエラー
				DEBUG_LOG.info("----- ■■■サービス関連チェックエラー：その他のエラー■■■ -----");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
			}
		}
		else
		{
			// システムエラー
			DEBUG_LOG.info("----- ■■■サービス関連チェックエラー：その他のエラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}
	}

	/**
	 * 初期表示時に各情報をサービスフォームBeanに設定します。
	 *
	 * @param beanArray Bean配列
	 * @param outPutMap アウトプットマップ
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void setSvcFormBeanOfInit(X31SDataBeanAccess[] beanArray, HashMap outPutMap) throws Exception
	{
		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[0];
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = beanArray[2];
		// 割引サービス契約情報
		X31SDataBeanAccess wribSvcKeiInfoBean = beanArray[4];
		// サービス契約ステータス
		String svcKeiStat = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_STAT_23, GET);

		// サービス利用開始日
		String svcStaYmd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_23, GET);
		// 申込区分
		String mskmDiv = bean.sendMessageString(FUW10501SFConst.MSKM_DIV, GET);
		// 自動継続更新年数
		int autoKeiMaxYear = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_2, GET)) / YEAR_GETU_CNT;

		// 契約中の料金コースコード
		bean.sendMessageString(FUW10501SFConst.KEI_PCRS_CD, SET, svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, GET));
		// 契約中の料金プランコード
		bean.sendMessageString(FUW10501SFConst.KEI_PPLAN_CD, SET, svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_23, GET));
		// サービス名
		bean.sendMessageString(FUW10501SFConst.KEI_SVC_NAME, SET, getSvcNm(svcKeiInfoBean));
		// コース名
		bean.sendMessageString(FUW10501SFConst.KEI_PCRS_NAME, SET, getCrsNm(svcKeiInfoBean));

		if (JFUStrConst.CD00037_020.equals(svcKeiStat) || JFUStrConst.CD00037_030.equals(svcKeiStat))
		{
			// サービス契約ステータスが「照査済」か「締結済」の場合、サービス開始年月日は運用日として解約精算金を計算する。
			svcStaYmd = JFUWebCommon.getOpeDate(this, null);

			// 長割適用日
			String choStaYMD = getChoTekiStaYMD(bean, svcStaYmd, 0);
			choStaYMD = JFUWebCommon.getBeginOfNextMonthDate(choStaYMD);

			// 長割適用経過月数
			int nowChoTekiKeiMonthCnt = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), choStaYMD);

			// 長割適用期間開始日
			String choTekiKikanStaYMD = JFUWebCommon.getBeginOfNextMonthDate(JPCDateUtil.addMonth(getChoTekiStaYMD(bean, svcStaYmd, nowChoTekiKeiMonthCnt), -1));

			// 長割適用開始日(自動継続後)
			String afAutoKeiChoStaYMD = JFUWebCommon.getBeginOfNextMonthDate(JPCDateUtil.addYear(choTekiKikanStaYMD, autoKeiMaxYear));

			// 長割満了日
			String choManryoDate = JPCDateUtil.addYear(choTekiKikanStaYMD, autoKeiMaxYear);

			// 長割適用経過月数(長割適用期間開始日と現在日付の差)
			int allChoTekiKeiMonthCnt = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), choTekiKikanStaYMD);

			// ●解約精算金情報(通常＆自動継続後)
			setKaiyakuKinInfo(bean, choTekiKikanStaYMD, afAutoKeiChoStaYMD, allChoTekiKeiMonthCnt, outPutMap, choStaYMD, choManryoDate, svcKeiStat);

			// 長割適用期間
			Map<String, String> kikanMongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_KIKAN_IFNO_MONGON, QUERY_ATTR_NAME);
			String choTekiKikan = kikanMongonMap.get(ID_CHO_TEKI_KIKAN);
			int choStaYear = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_1, GET)) / YEAR_GETU_CNT + 1;
			choTekiKikan = choTekiKikan.replace(REPLACE_STR_1, JFUCommonUtil.convertToZenkaku(String.valueOf(choStaYear)));
			choTekiKikan = choTekiKikan.replace(REPLACE_STR_2, JFUCommonUtil.convertToZenkaku(String.valueOf(autoKeiMaxYear)));
			bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_APLY_KIKAN, SET, choTekiKikan);

			// 長割適用期間(自動継続後)
			String autoChoTekiKikan = kikanMongonMap.get(ID_CHO_TEKI_KIKAN);
			autoChoTekiKikan = autoChoTekiKikan.replace(REPLACE_STR_1, JFUCommonUtil.convertToZenkaku(String.valueOf(choStaYear + autoKeiMaxYear)));
			autoChoTekiKikan = autoChoTekiKikan.replace(REPLACE_STR_2, JFUCommonUtil.convertToZenkaku(String.valueOf(autoKeiMaxYear)));
			bean.sendMessageString(FUW10501SFConst.AUTO_KEIZK_CKKZ_WRIB_APLY_KIKAN, SET, autoChoTekiKikan);

			return;
		}
		
		// サービス開始日(サービス契約)
		bean.sendMessageString(FUW10501SFConst.SVC_USE_STAYMD, SET, editDateFormat(svcStaYmd, FUNC_CODE_1));

		// 月差を算出
		int useMonth = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), svcStaYmd);

		// 長割適用期間開始日
		String choTekiKikanStaYMD = JFUStrConst.EMPTY;
		// 長割適用日または申込日
		String choStaYMD = JFUStrConst.EMPTY;
		// 適用期間状態
		Boolean tkKikanJt = false;

		// 適用期間状態(サービス利用継続期間 > サービス利用最低利用月数(24ヶ月))
		if (useMonth > Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_1, GET)))
		{
			// サービス利用継続期間(月数)がサービス利用最低利用月数以上の場合、適用期間状態に"true"(適用期間中)を設定
			tkKikanJt = true;
		}

		// 申込区分判定
		if (MSKM_DIV_1.equals(mskmDiv))
		{
			// ★申込の場合

			// 適用期間判定
			if (tkKikanJt)
			{
				// 即適用
				choStaYMD = JFUWebCommon.getOpeDate(this, null);
			}
			else
			{
				// 開始日適用
				choStaYMD = getChoTekiStaYMD(bean, svcStaYmd, 0);
				choStaYMD = JFUWebCommon.getBeginOfNextMonthDate(choStaYMD);
			}
		}
		else if (MSKM_DIV_2.equals(mskmDiv))
		{
			// ★変更申込の場合

			// 長割適用開始日(表示用)取得
			if (!JFUWebCommon.isNull(getWribAmntSnsttdardymd(outPutMap)) && getWribAmntSnsttdardymd(outPutMap).length() > 0)
			{
				// 長割適用可能、かつ、割引サービス契約の割引額算出基準年月日に値が設定されている場合、
				// 割引サービス契約の割引額算出基準年月日を設定
				svcStaYmd =getWribAmntSnsttdardymd(outPutMap);
			}
			if (wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_30, GET) != null
					&& wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_30, GET).length() > 0 && tkKikanJt)
			{
				// 長割適用可能、かつ、割引サービス契約のサービス開始年月日に値が設定されている場合、
				// 割引サービス契約のサービス開始年月日を設定
				choStaYMD = wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_30, GET);
			}
			else if (tkKikanJt)
			{
				// 上記以外かつ長割適用可能の場合、割引サービス契約の予約適用年月日を設定
				choStaYMD = wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.RSV_APLY_YMD_30, GET);
			}
			else
			{
				// 長割適用外の場合
				choStaYMD = getChoTekiStaYMD(bean, svcStaYmd, 0);
				choStaYMD = JFUWebCommon.getBeginOfNextMonthDate(choStaYMD);
			}
		}
		else if (MSKM_DIV_3.equals(mskmDiv))
		{
			// ★解約申込の場合

			// 長割適用開始日(表示用)取得
			if (!JFUWebCommon.isNull(getWribAmntSnsttdardymd(outPutMap)) && getWribAmntSnsttdardymd(outPutMap).length() > 0)
			{
				// 長割適用可能、かつ、割引サービス契約の割引額算出基準年月日に値が設定されている場合、
				// 割引サービス契約の割引額算出基準年月日を設定
				svcStaYmd =getWribAmntSnsttdardymd(outPutMap);
			}
			if (wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_30, GET) != null
					&& wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_30, GET).length() > 0 && tkKikanJt)
			{
				// 長割適用可能、かつ、割引サービス契約のサービス開始年月日に値が設定されている場合、
				// 割引サービス契約のサービス開始年月日を設定
				choStaYMD = wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_STA_YMD_30, GET);
			}
			else if (tkKikanJt)
			{
				// 上記以外かつ長割適用可能の場合、割引サービス契約の予約適用年月日を設定
				choStaYMD = wribSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.RSV_APLY_YMD_30, GET);
			}
			else
			{
				// 長割適用外の場合
				choStaYMD = getChoTekiStaYMD(bean, svcStaYmd, 0);
				choStaYMD = JFUWebCommon.getBeginOfNextMonthDate(choStaYMD);
			}
		}
		else
		{
			// 上条件以外申込区分の場合、契約状態エラー
			DEBUG_LOG.info("----- ■■■申込区分対象無しエラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		// 長割適用経過月数
		int nowChoTekiKeiMonthCnt = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), choStaYMD);

		// 長割適用開始日取得
		choTekiKikanStaYMD = JFUWebCommon.getBeginOfNextMonthDate(JPCDateUtil.addMonth(getChoTekiStaYMD(bean, svcStaYmd, nowChoTekiKeiMonthCnt), -1));

		// サービス利用継続期間
		bean.sendMessageString(FUW10501SFConst.SVC_USE_KEI_YM, SET, editPrt(useMonth));

		// 長割適用期間フラグ
		bean.sendMessageBoolean(FUW10501SFConst.APLY_PRD_STAT, SET, tkKikanJt);

		// 長割適用開始日
		bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_APLY_STAYMD, SET, editDateFormat(choStaYMD, FUNC_CODE_1));
		// 長割適用期間開始日
		bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_APLY_KIKAN_STAYMD, SET, editDateFormat(choStaYMD, FUNC_CODE_1));

		// 長割適用経過月数
		bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_APLY_KIK_GETU_CNT, SET, editPrt(nowChoTekiKeiMonthCnt));
		// 長割適用経過月数(長割適用期間開始日と現在日付の差)
		int allChoTekiKeiMonthCnt = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), choTekiKikanStaYMD);

		// 長割満了日
		String choManryoDate = JPCDateUtil.addYear(choTekiKikanStaYMD, autoKeiMaxYear);
		choManryoDate = JFUCommonUtil.getEndOfMonthDate(choManryoDate);
		bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_MANRYO_YMD, SET, editDateFormat(choManryoDate, FUNC_CODE_1));

		// 長割適用終了年月
		String ckkzWribAplyEndMonth = choManryoDate;
		bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_APLY_ENDYM, SET, editDateFormat(ckkzWribAplyEndMonth, FUNC_CODE_2));

		// 解約精算金未発生月 // ANK-3951-00-00対応に伴い、2021年7月以降は未使用項目となる想定
		String dslSsnknMihasseiYm = JPCDateUtil.addMonth(choManryoDate, 1);
		bean.sendMessageString(FUW10501SFConst.DSL_SSNKN_MIHASSEI_YM, SET, editDateFormat(dslSsnknMihasseiYm, FUNC_CODE_3));

		// 長割適用開始日(自動継続後)
		String afAutoKeiChoStaYMD = JFUWebCommon.getBeginOfNextMonthDate(JPCDateUtil.addYear(choTekiKikanStaYMD, autoKeiMaxYear));
		bean.sendMessageString(FUW10501SFConst.AUTO_KEIZK_CKKZ_WRIB_APLY_STAYMD, SET, editDateFormat(afAutoKeiChoStaYMD, FUNC_CODE_1));

		// 長割適用終了年月(自動継続後)
		String afAutoKeiChoEndYMD = JPCDateUtil.addMonth(JPCDateUtil.addYear(afAutoKeiChoStaYMD, autoKeiMaxYear), -1);
		bean.sendMessageString(FUW10501SFConst.AUTO_KEIZK_CKKZ_WRIB_APLY_ENDYM, SET, editDateFormat(afAutoKeiChoEndYMD, FUNC_CODE_2));

		// ●解約精算金情報(通常＆自動継続後)
		setKaiyakuKinInfo(bean, choTekiKikanStaYMD, afAutoKeiChoStaYMD, allChoTekiKeiMonthCnt, outPutMap, choStaYMD, choManryoDate, svcKeiStat);

		// ●長割適用終了年月チェック（初期表示時）
		chkCkkzWribAplyEndMonthInit(beanArray, svcStaYmd, choTekiKikanStaYMD, outPutMap);

		// オンライン運用日
		bean.sendMessageString(FUW10501SFConst.OPE_DATE, SET, JFUWebCommon.getOpeDate(this, null));

	}

	/**
	 * 有料フラグ設定処理です。
	 * <br>
	 * @param bean データBean
	 * @param outputMap アウトマップ
	 * @return true:初期費用有り / false:初期費用無し
	 */
	@SuppressWarnings("unchecked")
	private void setPayFlg(X31SDataBeanAccess bean, HashMap outputMap)
	{
		// 有料フラグ
		Boolean result = false;

		// 初期費用有無判定
		HashMap shokiMap = (HashMap)outputMap.get(FUSV023702CC);
		ArrayList shokiList = null;
		if (shokiMap != null && shokiMap.size() > 0)
		{
			shokiList = (ArrayList)shokiMap.get(EKK0721A010CBSMSG1LIST);
		}
		if (shokiList != null && shokiList.size() > 0)
		{
			// 初期費用有り(有料フラグ：true)
			result = true;
		}

		// Beanに結果を設定
		bean.sendMessageBoolean(FUW10501SFConst.PAY_FLG, SET, result);
	}

	/**
	 * 共有フォームBeanの情報を取得します。
	 * 
	 * @param commoninfoBean
	 * @param fixMlad
	 * @return 取得した情報を保持したマップ
	 */
	private Map<String, Object> getCommoninfoBeanInfo(X31SDataBeanAccess commoninfoBean, String fixMlad)
	{
		// 結果マップ
		Map<String, Object> resultMap = new HashMap<String, Object>();

		// ★WEB変更情報
		X31SDataBeanAccess webChgInfoBean = getX31SDataBeanAccess(commoninfoBean, CommonInfoCFConst.WEB_CHG_INFO);

		// ★SSO情報(WEB変更情報の子階層)
		X31SDataBeanAccessArray ssoInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO);
		X31SDataBeanAccess ssoInfoBean = ssoInfoArray.getDataBean(0);

		// ★現顧客情報(WEB変更情報の子階層)
		X31SDataBeanAccessArray genCustKeiInfoArray = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO);
		X31SDataBeanAccess genCustKeiInfoBean = genCustKeiInfoArray.getDataBean(0);

		// ★サービス契約情報
		X31SDataBeanAccessArray svcKeiInfoArray = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO);
		X31SDataBeanAccess svcKeiInfoBean = svcKeiInfoArray.getDataBean(0);

		// ★サービス契約内訳情報
		X31SDataBeanAccessArray svcKeiUcwkInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO);
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiUcwkInfoArray.getDataBean(0);

		// ★請求契約情報
		X31SDataBeanAccessArray seikyKeiInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO);
		X31SDataBeanAccess seikyKeiInfoBean = seikyKeiInfoArray.getDataBean(0);

		// ★割引サービス契約情報
		X31SDataBeanAccessArray wribKeiInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.WRIB_SVC_KEI_INFO);
		X31SDataBeanAccess wribKeiInfoBean = null;

		// 割引サービス契約番号
		String wribSvcKeiNoNormal = JFUStrConst.EMPTY;

		// ●長割の情報を持った割引サービス契約情報Beanを取得
		for (int i = 0; i < wribKeiInfoArray.getCount(); i++)
		{
			wribKeiInfoBean = wribKeiInfoArray.getDataBean(i);

			// 割引サービス契約番号
			wribSvcKeiNoNormal = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_KEI_NO_30, GET);
			// 割引サービスコード
			String wribSvcCd = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_CD_30, GET);
			// 割引サービス契約ステータス
			String wribSvcKeiStat = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_KEI_STAT_30, GET);

			if (JFUStrConst.KK0841_WRIB_SVC_CD_CHOKEIWARI.equals(wribSvcCd)
					&& (JFUStrConst.CD00055_010.equals(wribSvcKeiStat) || JFUStrConst.CD00055_100.equals(wribSvcKeiStat)))
			{
				break;
			}
		}

		// ★割引サービス対象契約情報
		X31SDataBeanAccessArray wribTgKeiInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.WRIB_SVC_TRGT_KEI_INFO);
		X31SDataBeanAccess wribTgKeiInfoBean = null;

		// 長割の情報を持った割引サービス対象契約情報Beanを取得
		for (int i = 0; i < wribTgKeiInfoArray.getCount(); i++)
		{
			wribTgKeiInfoBean = wribTgKeiInfoArray.getDataBean(i);

			// 割引サービス契約番号
			String wribSvcKeiNoTg = wribTgKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_KEI_NO_31, GET);

			if (wribSvcKeiNoNormal.equals(wribSvcKeiNoTg))
			{
				break;
			}
		}

		// 各Bean情報を設定
		resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean);
		resultMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean);
		resultMap.put(CommonInfoCFConst.SVC_KEI_UCWK_INFO, svcKeiUcwkInfoBean);
		resultMap.put(CommonInfoCFConst.SEIKY_KEI_INFO, seikyKeiInfoBean);
		resultMap.put(CommonInfoCFConst.WRIB_SVC_KEI_INFO, wribKeiInfoBean);
		resultMap.put(CommonInfoCFConst.WRIB_SVC_TRGT_KEI_INFO, wribTgKeiInfoBean);

		return resultMap;
	}

	/**
	 * データBeanリストから0番目のデータBeanを取得します。
	 * 
	 * @param bean
	 * @param componentID
	 * @return 取得したデータBean
	 */
	private X31SDataBeanAccess getX31SDataBeanAccess(X31SDataBeanAccess bean, String componentID)
	{
		X31SDataBeanAccessArray subBeanArray = bean.getDataBeanArray(componentID);
		X31SDataBeanAccess subBean = subBeanArray.getDataBean(0);
		if (null == subBean)
		{
			subBeanArray.addDataBean();
			subBean = subBeanArray.getDataBean(0);
		}
		return subBean;
	}

	/**
	 * 100Mライトコース(ホーム/メゾン)チェック処理です。
	 *
	 * @param beanArray データBean配列
	 * @throws Exception
	 */
	private void chk100MLight(X31SDataBeanAccess[] beanArray) throws Exception
	{
		// 料金プランコード
		String pplanCd = beanArray[2].sendMessageString(CommonInfoCFConst.PPLAN_CD_23, GET);

		// 料金プランが100Mライトコース(ホーム/メゾン)の場合
		if (JFUStrConst.CD00565_PA0311.equals(pplanCd) || JFUStrConst.CD00565_PA0811.equals(pplanCd))
		{
			// 契約状態エラー
			DEBUG_LOG.info("----- ■■■100ライトコース(ホーム/メゾン)契約エラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
	}

	/**
	 * 契約情報設定処理です。
	 * 
	 * <br>
	 * @param beanArray データBean配列
	 * @throws Exception
	 */
	private void setKeiInfo(X31SDataBeanAccess[] beanArray) throws Exception
	{
		// サービス契約情報取得
		X31SDataBeanAccess svcKeiInfoBean = beanArray[2];
		// 割引サービス契約情報リスト
		X31SDataBeanAccessArray wribKeiInfoArray = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.WRIB_SVC_KEI_INFO);

		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[0];

		if (JFUStrConst.PCRS_CD_SIMPLE.contains(svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, GET)))
		{
			// シンプルプランの場合、契約状態エラー
			DEBUG_LOG.info("----- ■■■シンプルプラン抑止エラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

// ANK-4427-41-00 ADD START
		// NTT卸区分
		String nttOrsDiv = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.NTTORS_DIV_23, GET);
		if(JFUStrConst.KK0791_NTTORS_DIV_02.equals(nttOrsDiv))
		{
			// typeNのマンションの場合、契約状態エラー
			DEBUG_LOG.info("----- ■■■typeNマンション抑止エラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
// ANK-4427-41-00 ADD END

		// 文言一覧取得
		Map<String, String> mongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_MONGON, QUERY_ATTR_NAME);

		// 即割契約フラグ(デフォルト：false)
		Boolean sokuKeiFlg = false;
		// 長割契約フラグ(デフォルト：false)
		Boolean choKeiFlg = false;
		// 自動継続有無(デフォルト：0)
		String autoKeiUmCd = JFUStrConst.CD01436_0;

		// 割引サービス契約情報処理
		for (int i = 0; i < wribKeiInfoArray.getCount(); i++)
		{
			X31SDataBeanAccess wribKeiInfoBean = wribKeiInfoArray.getDataBean(i);

			// 割引サービス契約番号
			String wribSvcKeiNo = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_KEI_NO_30, GET);
			// 割引サービスコード
			String wribSvcCd = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_CD_30, GET);
			// 割引サービス契約自動継続識別コード
			String wribAtKeizkSkCd = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_KEI_AT_KEIZK_SKCD_30, GET);
			// 割引サービス契約ステータス
			String wribSvcKeiStat = wribKeiInfoBean.sendMessageString(CommonInfoCFConst.WRIB_SVC_KEI_STAT_30, GET);

			// ●即割契約チェック
			if (JFUStrConst.KK0841_WRIB_SVC_CD_SOKUWARI.equals(wribSvcCd)
					&& (JFUStrConst.CD00055_010.equals(wribSvcKeiStat) || JFUStrConst.CD00055_100.equals(wribSvcKeiStat)))
			{
				// 契約中
				sokuKeiFlg = true;
				// 即割契約文言設定
				bean.sendMessageString(FUW10501SFConst.SOKU_WRIB_KEI_JT, SET, mongonMap.get(ID_KEI));
			}

			// ●長割契約チェック(割引サービス契約ステータス："010"(受付済)、"100"(サービス提供中))
			if (JFUStrConst.KK0841_WRIB_SVC_CD_CHOKEIWARI.equals(wribSvcCd)
					&& (JFUStrConst.CD00055_010.equals(wribSvcKeiStat) || JFUStrConst.CD00055_100.equals(wribSvcKeiStat)))
			{
				// 契約中
				choKeiFlg = true;
				// 割引サービス契約番号設定
				bean.sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_NO, SET, wribSvcKeiNo);
				// 割引サービス契約ステータス設定
				bean.sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_STAT, SET, wribSvcKeiStat);
				// 長割契約文言設定
				bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_KEI_JT, SET, mongonMap.get(ID_KEI));

				// ●自動継続有無チェック
				if (JFUStrConst.CD01436_1.equals(wribAtKeizkSkCd))
				{
					// 自動継続有り
					autoKeiUmCd = JFUStrConst.CD01436_1;
					// 自動継続有り文言
					bean.sendMessageString(FUW10501SFConst.AUTO_KEI_JT, SET, mongonMap.get(ID_SURU));
				}
			}
		}

		// 長割契約フラグ設定
		bean.sendMessageBoolean(FUW10501SFConst.CKKZ_WRIB_KEI_FLG, SET, choKeiFlg);
		// 即割契約フラグ設定
		bean.sendMessageBoolean(FUW10501SFConst.SOKU_WRIB_KEI_FLG, SET, sokuKeiFlg);
		// 自動継続有無設定
		bean.sendMessageString(FUW10501SFConst.BEFOR_WRIB_SVC_KEI_AT_KEIZK_SKCD, SET, autoKeiUmCd);

		// 即割契約文言設定
		if (!sokuKeiFlg)
		{
			// 即割未契約文言
			bean.sendMessageString(FUW10501SFConst.SOKU_WRIB_KEI_JT, SET, mongonMap.get(ID_MIKEI));
		}
		// 長割契約文言設定
		if (!choKeiFlg)
		{
			// 長割未契約文言
			bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_KEI_JT, SET, mongonMap.get(ID_MIKEI));
		}
		// 自動契約有無文言設定
		if (JFUStrConst.CD01436_0.equals(autoKeiUmCd))
		{
			// 自動契約しない文言
			bean.sendMessageString(FUW10501SFConst.AUTO_KEI_JT, SET, mongonMap.get(ID_SHINAI));
		}
	}

	/**
	 * 申込区分設定処理です。
	 * 
	 * <br>
	 * @param beanArray データBean配列
	 */
	private void setMskmDiv(X31SDataBeanAccess[] beanArray)
	{
		// SSO情報取得
		X31SDataBeanAccess ssoInfoBean = beanArray[1];
		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[0];

		// URL取得
		String url = ssoInfoBean.sendMessageString(CommonInfoCFConst.URL_SCREEN_ID_21, GET);
		// 長割契約フラグ
		Boolean choKeiFlg = bean.sendMessageBoolean(FUW10501SFConst.CKKZ_WRIB_KEI_FLG, GET);

		// ●申込区分判定
		if (LONGPLAN.equals(url))
		{
			// 新規・変更
			if (choKeiFlg)
			{
				// 長割を契約中の場合、区分「2」(変更申込)を設定
				bean.sendMessageString(FUW10501SFConst.MSKM_DIV, SET, MSKM_DIV_2);
			}
			else
			{
				// 長割が未契約の場合、区分「1」(新規申込)を設定
				bean.sendMessageString(FUW10501SFConst.MSKM_DIV, SET, MSKM_DIV_1);
				bean.sendMessageBoolean(FUW10501SFConst.MSKM_CKKZ, SET, true);
			}
		}
		else if (LONGPLAN_DISSOLUTION.equals(url))
		{
			// 解約
			if (choKeiFlg)
			{
				// 長割を契約中、かつ、解約申込の場合、区分「3」(解約)を設定
				bean.sendMessageString(FUW10501SFConst.MSKM_DIV, SET, MSKM_DIV_3);
			}
			else
			{
				// 解約で長割が未契約の場合、契約状態エラー
				DEBUG_LOG.info("----- ■■■解約処理：長割未契約エラー■■■ -----");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
			}
		}
		else
		{
			// 上条件以外のURLの場合、契約状態エラー
			DEBUG_LOG.info("----- ■■■申込区分対象無しエラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
	}

	/**
	 * 解約区分設定処理です。
	 * 
	 * <br>
	 * @param beanArray
	 */
	private void setMskmDivDsl(X31SDataBeanAccess[] beanArray)
	{
		// サービスフォームBean
		X31SDataBeanAccess bean = beanArray[0];

		// 申込区分
		String mskmDiv = bean.sendMessageString(FUW10501SFConst.MSKM_DIV, GET);
		// 現在の解約清算金
		String nowDslPrc = bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_DSL_SSNKN_NOW, GET);
		// 現在の解約清算金有無フラグを設定(0円以外：true / 0円：false)
		Boolean dslPrcUmFlg = nowDslPrc.length() > 0 && !nowDslPrc.equals(String.valueOf(0) + JFUStrConst.HALF_SPACE + JFUStrConst.YEN);

		if(JFUWebCommon.isNull(nowDslPrc) || nowDslPrc.trim().equals(JFUStrConst.YEN))
		{
			// 解約精算金不正の場合、システムエラーとする
			DEBUG_LOG.info("----- ■■■解約精算金不正エラー■■■ -----");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// 区分が「解約」かつ解約精算金が存在する場合、以下の区分を設定する
		if (MSKM_DIV_3.equals(mskmDiv) && dslPrcUmFlg)
		{
			// 解約申込、かつ、解約清算金有りの場合、区分「4」(解約・解約清算金有り)を設定
			bean.sendMessageString(FUW10501SFConst.MSKM_DIV, SET, MSKM_DIV_4);
		}
	}

	/**
	 * 料金関連情報をサービスフォームBeanに設定します。
	 * 
	 * <br>
	 * @param bean
	 * @param outMap
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void setPriceInfo(X31SDataBeanAccess[] bean, HashMap outMap) throws Exception
	{
		// ******************************************************************
		// コメント div id
		List<String> setCommentSkbtList = new ArrayList<String>();
		// コメント テキスト
		List<String> setCommentList = new ArrayList<String>();

		// タイトル div id
		List<String> setTableTitleSkbtList = new ArrayList<String>();
		// タイトル テキスト
		List<String> setTableTitleList = new ArrayList<String>();

		// 月額料金 テーブル tr id
		List<String> setTableValueSkbtList = new ArrayList<String>();
		// 初期費用 テーブル tr id
		List<String> setTableValueSkbtList2 = new ArrayList<String>();
		// テーブル スタイル
		List<String> setTableStyleClass1List = new ArrayList<String>();
		// テーブル 幅
		List<String> setTableStyleClass2List = new ArrayList<String>();

		// 月額料金 左値
		List<String> setTableLeftValueList = new ArrayList<String>();
		// 月額料金 右値
		List<String> setTableRightValueList = new ArrayList<String>();

		// 初期費用 左値
		List<String> setTableLeftValueList2 = new ArrayList<String>();
		// 初期費用 右値
		List<String> setTableRightValueList2 = new ArrayList<String>();

		// 備考 div id
		List<String> setBikoSkbtList = new ArrayList<String>();
		// 備考 テキスト
		List<String> setBikoList = new ArrayList<String>();

		// テーブルの値、左値、右値の各リストを格納
		Map<String, List<String>> tableValueMap = new LinkedHashMap<String, List<String>>();
		// ******************************************************************

		// 料金関係文言一覧取得
		Map<String, String> prcMongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_PRC_IFNO_MONGON, QUERY_ATTR_NAME);
		// 料金関係クラス一覧取得
		Map<String, String> prcClassMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_PRC_INFO_TABLE_STYLE, QUERY_ATTR_NAME);

		// 基本料金格納用変数
		HashMap koteiAmntMap = null;
		ArrayList koteiAmntList = null;
		// 初期費用格納用変数
		HashMap shokiAmntMap = null;
		ArrayList shokiAmntList = null;

		// 契約中の料金コースコード
		String nowPcrsCd = bean[2].sendMessageString(CommonInfoCFConst.PCRS_CD_23, GET);
		// 契約中の料金プランコード
		String nowPplanCd = bean[2].sendMessageString(CommonInfoCFConst.PPLAN_CD_23, GET);

		// サービス契約ステータス
		String svcKeiStat = bean[2].sendMessageString(CommonInfoCFConst.SVC_KEI_STAT_23, GET);
		// サービス開始年月日
		String svcStaYmd = null;
		if (JFUStrConst.CD00037_020.equals(svcKeiStat) || JFUStrConst.CD00037_030.equals(svcKeiStat))
		{
			// サービス契約ステータスが「照査済」か「締結済」の場合、サービス開始年月日は運用日として計算する。
			svcStaYmd = JFUWebCommon.getOpeDate(this, null);
		}
		else
		{
			svcStaYmd = bean[2].sendMessageString(CommonInfoCFConst.SVC_STA_YMD_23, GET);
		}

		// 継続月数
		int kzMonth = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), svcStaYmd);
		// 継続年数
		int kzYear = JPCDateUtil.subtractYear(JFUWebCommon.getOpeDate(this, null), svcStaYmd);

		if (kzMonth % 12 != 0)
		{
			kzYear += 1;
		}

		// 3年目開始月数
		int threeMonth = Integer.parseInt(bean[0].sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_1, GET)) + 1;
		// 6年目開始月数
		int sixMonth = threeMonth + Integer.parseInt(bean[0].sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_2, GET));
		// 即割契約フラグ(現在)
		Boolean sokuwariFlg = bean[0].sendMessageBoolean(FUW10501SFConst.SOKU_WRIB_KEI_FLG, GET);
		// 申込区分
		String mskmDiv = bean[0].sendMessageString(FUW10501SFConst.MSKM_DIV, GET);
		// 自動継続有無(変更前＝現在)
		String nowAutoKeiUm = bean[0].sendMessageString(FUW10501SFConst.BEFOR_WRIB_SVC_KEI_AT_KEIZK_SKCD, GET);

		// ●基本料金を設定
		if (outMap != null && outMap.size() > 0 && outMap.containsKey(FUSV023701CC))
		{
			koteiAmntMap = (HashMap)outMap.get(FUSV023701CC);
		}
		if (koteiAmntMap != null && koteiAmntMap.size() > 0 && koteiAmntMap.containsKey(JFUHTPLANCHGPRCSHOKAICCLIST))
		{
			// 明細リスト取得
			koteiAmntList = (ArrayList)koteiAmntMap.get(JFUHTPLANCHGPRCSHOKAICCLIST);
		}

		if (koteiAmntList == null || koteiAmntList.size() == 0)
		{
			// 明細リストが無い場合、空のリストを作成する(NullPointerException回避)
			koteiAmntList = new ArrayList(0);
		}

		for (int i = 0; i < koteiAmntList.size(); i++)
		{
			HashMap childMap = (HashMap)koteiAmntList.get(i);
			ArrayList childList = (ArrayList)childMap.get(JACPRCSIMULATIONLIST);

			// 契約情報と異なる、または、100Mライトコースの場合、以降の処理を行わない
			if (!nowPcrsCd.equals(childMap.get(PCRS_CD)) || !nowPplanCd.equals(childMap.get(PPLAN_CD))
					|| JFUStrConst.CD00565_PA0311.equals(nowPplanCd))
			{
				continue;
			}

			for (int j = 0; j < childList.size(); j++)
			{
				HashMap sonMap = (HashMap)childList.get(j);
				ArrayList sonList = (ArrayList)sonMap.get(JACPRCSIMULATIONMSG2LIST);

				// 料金科目コード1
				String prcKmkCd1 = JFUStrConst.EMPTY;
				// 料金科目コード2
				String prcKmkCd2 = JFUStrConst.EMPTY;

				for (int k = 0; k < sonList.size(); k++)
				{
					HashMap prcInfoMapt = (HashMap)sonList.get(k);

					// 料金科目コード1
					prcKmkCd1 = (String)prcInfoMapt.get(KEY_PRC_KMK_CD);
					// 料金科目コード2
					prcKmkCd2 = (String)prcInfoMapt.get(PRC_KMK_CD);

					// 請求金額取得
					String seikyAmnt = (String)prcInfoMapt.get(SEIKY_AMNT);

					if (seikyAmnt == null || seikyAmnt.length() == 0 || Integer.parseInt(seikyAmnt) < 0)
					{
						// 請求金額が正常に取得できていない場合、以降の処理を行わない
						continue;
					}
					else
					{
						// 金額編集
						seikyAmnt = JFUWebCommon.formatNumber(seikyAmnt) + JFUStrConst.HALF_SPACE + prcMongonMap.get(ID_TNK_TANI);
					}

					// id値格納
					String idVal = JFUStrConst.EMPTY;
					// 左値格納
					String leftVal = JFUStrConst.EMPTY;

					// 設定する料金を判定
					if (kzMonth < threeMonth && sokuwariFlg && MSKM_DIV_1.equals(mskmDiv))
					{
						// 1〜2年目、即割有り、新規申込
						if (KIHON_PRC_KMK_CD_LIST.get(5).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(3));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(TR_ID_HIDDEN + JFUStrConst.HALF_UNDER_BAR + (j + 1));
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(6));
						}
					}
					else if (kzMonth < threeMonth && sokuwariFlg && MSKM_DIV_2.equals(mskmDiv) && JFUStrConst.CD01436_1.endsWith(nowAutoKeiUm))
					{
						// 1〜2年目、即割有り、変更申込、自動継続有り
						if (KIHON_PRC_KMK_CD_LIST.get(5).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(3));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
					}
					else if (kzMonth < threeMonth && sokuwariFlg && MSKM_DIV_2.equals(mskmDiv) && JFUStrConst.CD01436_0.endsWith(nowAutoKeiUm))
					{
						// 1〜2年目、即割有り、変更申込、自動継続無し
						if (KIHON_PRC_KMK_CD_LIST.get(5).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(3));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(6));
						}
					}
					else if (kzMonth < threeMonth && sokuwariFlg && (MSKM_DIV_3.equals(mskmDiv) || MSKM_DIV_4.equals(mskmDiv)))
					{
						// 1〜2年目、即割有り、解約申込
						if (KIHON_PRC_KMK_CD_LIST.get(2).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_KIHON_PRICE);
						}
					}
					else if (kzMonth < threeMonth && !sokuwariFlg && MSKM_DIV_1.equals(mskmDiv))
					{
						// 1〜2年目、即割無し、新規申込
						if (KIHON_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(1));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(1).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(2));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(TR_ID_HIDDEN + JFUStrConst.HALF_UNDER_BAR + (j + 1));
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(6));
						}
					}
					else if (kzMonth < threeMonth && !sokuwariFlg && MSKM_DIV_2.equals(mskmDiv) && JFUStrConst.CD01436_1.endsWith(nowAutoKeiUm))
					{
						// 1〜2年目、即割無し、変更申込、自動継続有り
						if (KIHON_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(1));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(1).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(2));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
					}
					else if (kzMonth < threeMonth && !sokuwariFlg && MSKM_DIV_2.equals(mskmDiv) && JFUStrConst.CD01436_0.endsWith(nowAutoKeiUm))
					{
						// 1〜2年目、即割無し、変更申込、自動継続無し
						if (KIHON_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(1));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(1).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(2));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(6));
						}
					}
					else if (kzMonth < threeMonth && !sokuwariFlg && (MSKM_DIV_3.equals(mskmDiv) || MSKM_DIV_4.equals(mskmDiv)))
					{
						// 1〜2年目、即割無し、解約申込
						if (KIHON_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(1));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(1).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(2));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(2).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(4));
						}
					}
					else if (kzMonth >= threeMonth && kzMonth < sixMonth && MSKM_DIV_1.equals(mskmDiv))
					{
						// 3〜5年目、新規申込
						if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(TR_ID_HIDDEN + JFUStrConst.HALF_UNDER_BAR + (j + 1));
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(6));
						}
					}
					else if (kzMonth >= threeMonth && kzMonth < sixMonth && MSKM_DIV_2.equals(mskmDiv)
							&& JFUStrConst.CD01436_1.endsWith(nowAutoKeiUm))
					{
						// 3〜5年目、新規申込、自動継続有り
						if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
					}
					else if (kzMonth >= threeMonth && kzMonth < sixMonth && MSKM_DIV_2.equals(mskmDiv)
							&& JFUStrConst.CD01436_0.endsWith(nowAutoKeiUm))
					{
						// 3〜5年目、新規申込、自動継続無し
						if (KIHON_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(5));
						}
						else if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(6));
						}
					}
					else if (kzMonth >= threeMonth && kzMonth < sixMonth && (MSKM_DIV_3.equals(mskmDiv) || MSKM_DIV_4.equals(mskmDiv)))
					{
						// 3〜5年目、解約申込
						if (KIHON_PRC_KMK_CD_LIST.get(2).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_KIHON_PRICE);
						}
					}
					else if (kzMonth >= sixMonth && MSKM_DIV_1.equals(mskmDiv))
					{
						// 6年目〜以降、新規申込
						if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(TR_ID_SHOW + JFUStrConst.HALF_UNDER_BAR + (j + 1));
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(7));
							leftVal = leftVal.replace(REPLACE_STR_1, String.valueOf((kzYear / 3) * 3));
							leftVal = leftVal.replace(REPLACE_STR_2, String.valueOf((kzYear / 3) * 3 + 2));

							// tr id
							setTableValueSkbtList.add(idVal);
							// 左値
							setTableLeftValueList.add(leftVal);
							// 右値
							setTableRightValueList.add(seikyAmnt);
						}
						if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(TR_ID_HIDDEN + JFUStrConst.HALF_UNDER_BAR + (j + 1));
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(8));
							leftVal = leftVal.replace(REPLACE_STR_1, String.valueOf((kzYear / 3) * 3));

							// tr id
							setTableValueSkbtList.add(idVal);
							// 左値
							setTableLeftValueList.add(leftVal);
							// 右値
							setTableRightValueList.add(seikyAmnt);
						}

						continue;
					}
					else if (kzMonth >= sixMonth && MSKM_DIV_2.equals(mskmDiv) && JFUStrConst.CD01436_1.endsWith(nowAutoKeiUm))
					{
						// 6年目〜以降、新規申込、自動継続有り
						if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(7));
							leftVal = leftVal.replace(REPLACE_STR_1, String.valueOf((kzYear / 3) * 3));
							leftVal = leftVal.replace(REPLACE_STR_2, String.valueOf((kzYear / 3) * 3 + 2));
						}
					}
					else if (kzMonth >= sixMonth && MSKM_DIV_2.equals(mskmDiv) && JFUStrConst.CD01436_0.endsWith(nowAutoKeiUm))
					{
						// 6年目〜以降、新規申込、自動継続無し
						if (KIHON_PRC_KMK_CD_LIST.get(4).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_MIDASHI + JFUStrConst.HALF_UNDER_BAR + String.valueOf(8));
							leftVal = leftVal.replace(REPLACE_STR_1, String.valueOf((kzYear / 3) * 3));
						}
					}
					else if (kzMonth >= sixMonth && (MSKM_DIV_3.equals(mskmDiv) || MSKM_DIV_4.equals(mskmDiv)))
					{
						// 6年目〜以降、解約申込
						if (KIHON_PRC_KMK_CD_LIST.get(2).equals(prcKmkCd1) && PRC_KMK_CD_KIHON.equals(prcKmkCd2))
						{
							idVal = String.valueOf(j + 1);
							leftVal = prcMongonMap.get(ID_KIHON_PRICE);
						}
					}

					// 即割契約無しかつ即割料金科目コードでないかつ料金が0円以上の場合
					if (idVal.length() > 0 && leftVal.length() > 0)
					{
						// tr id
						setTableValueSkbtList.add(idVal);
						// 左値
						setTableLeftValueList.add(leftVal);
						// 右値
						setTableRightValueList.add(seikyAmnt);
					}
				}
			}
		}

		// ●初期費用を設定
		if (outMap != null && outMap.size() > 0 && outMap.containsKey(FUSV023702CC))
		{
			shokiAmntMap = (HashMap)outMap.get(FUSV023702CC);
		}
		if (shokiAmntMap != null && shokiAmntMap.size() > 0 && shokiAmntMap.containsKey(EKK0721A010CBSMSG1LIST))
		{
			// 明細リスト取得
			shokiAmntList = (ArrayList)shokiAmntMap.get(EKK0721A010CBSMSG1LIST);
		}

		if (shokiAmntList == null || shokiAmntList.size() == 0)
		{
			// 明細リストが無い場合、空のリストを作成する(NullPointerException回避)
			shokiAmntList = new ArrayList(0);
		}

		for (int i = 0; i < shokiAmntList.size(); i++)
		{
			HashMap childMap = (HashMap)shokiAmntList.get(i);

			// tr id
			setTableValueSkbtList2.add(String.valueOf(i + 1));

			// 左値(料金名)
			String leftVal = (String)childMap.get(TMP_PAY_PRC_NM);
			// 右値(金額)
			String rightVal = JFUWebCommon.formatNumber((String)childMap.get(TMP_PAY_PRC_AMNT)) + JFUStrConst.HALF_SPACE + JFUStrConst.YEN;

			// 左値設定
			setTableLeftValueList2.add(leftVal);
			// 右値設定
			setTableRightValueList2.add(rightVal);
		}

		// 基本料金有無フラグ
		Boolean kihonPrcFlg = setTableValueSkbtList.size() > 0 && setTableLeftValueList.size() > 0 && setTableRightValueList.size() > 0;
		// 初期費用有無フラグ
		Boolean shokiPrcFlg = setTableValueSkbtList2.size() > 0 && setTableLeftValueList2.size() > 0 && setTableRightValueList2.size() > 0;

		// 基本料金がある場合
		if (kihonPrcFlg)
		{
			// テーブルタイトルエリア
			setTableTitleSkbtList.add(DIV_TITLE);
			// タイトル名
			setTableTitleList.add(prcMongonMap.get(ID_TITLE_1));

			// テーブルスタイル(タイトルの背景色)に値を入れたい場合に設定する
			setTableStyleClass1List.add(prcClassMap.get(TITLE_STYLE_1));
			// テーブルスタイル(テーブルの幅)に値を入れたい場合に設定する
			setTableStyleClass2List.add(prcClassMap.get(TABLE_HABA_1));
		}
		// 初期費用がある場合
		if (shokiPrcFlg)
		{
			// テーブルタイトルエリア
			setTableTitleSkbtList.add(DIV_TITLE);
			// タイトル名
			setTableTitleList.add(prcMongonMap.get(ID_TITLE_3));

			// テーブルスタイル(タイトルの背景色)に値を入れたい場合に設定する
			setTableStyleClass1List.add(prcClassMap.get(TITLE_STYLE_2));
			// テーブルスタイル(テーブルの幅)に値を入れたい場合に設定する
			setTableStyleClass2List.add(prcClassMap.get(TABLE_HABA_2));
		}

		// KEYは『タイトル名 + タイトル番号(0から始まる連番) + テーブル左値リスト設定キー』
		// KEYは『タイトル名 + タイトル番号(0から始まる連番) + テーブル右値リスト設定キー』
		// KEYは『タイトル名 + タイトル番号(0から始まる連番) + テーブル値識別リスト設定キー』
		if (kihonPrcFlg)
		{
			// 基本料金がある場合、設定する
			tableValueMap.put(prcMongonMap.get(ID_TITLE_1) + 0 + KEY_TABLE_LEFT_VALUE_LIST, setTableLeftValueList);
			tableValueMap.put(prcMongonMap.get(ID_TITLE_1) + 0 + KEY_TABLE_RIGHT_VALUE_LIST, setTableRightValueList);
			tableValueMap.put(prcMongonMap.get(ID_TITLE_1) + 0 + KEY_TABLE_VALUE_SKBT_LIST, setTableValueSkbtList);
		}
		if (shokiPrcFlg)
		{
			// 初期費用がある場合、設定する
			tableValueMap.put(prcMongonMap.get(ID_TITLE_3) + 1 + KEY_TABLE_LEFT_VALUE_LIST, setTableLeftValueList2);
			tableValueMap.put(prcMongonMap.get(ID_TITLE_3) + 1 + KEY_TABLE_RIGHT_VALUE_LIST, setTableRightValueList2);
			tableValueMap.put(prcMongonMap.get(ID_TITLE_3) + 1 + KEY_TABLE_VALUE_SKBT_LIST, setTableValueSkbtList2);
		}

		// ************************************************************************************************************************
		// ●コメントエリア情報設定処理呼び出し
		// ●備考エリア情報設定処理呼び出し
		// ●タイトル・テーブルエリア情報設定処理呼び出し
		// ************************************************************************************************************************
		X31SDataBeanAccessArray prcInfoAreaListArray = bean[0].getDataBeanArray(JFUStrConst.PRC_INFO_PRC_INFO_AREA_LIST);
		X31SDataBeanAccess titleListArrayAccess = prcInfoAreaListArray.addDataBean();

		// コメントエリア表示用リスト設定
		JFUWebCommon.setCommentList(titleListArrayAccess, setCommentSkbtList, setCommentList);
		// 備考エリア表示用リスト設定
		JFUWebCommon.setBikoList(titleListArrayAccess, setBikoSkbtList, setBikoList);
		// テーブルタイトルエリア表示用リスト設定
		JFUWebCommon.setTableTitleList(titleListArrayAccess, setTableTitleSkbtList, setTableTitleList, setTableStyleClass1List,
				setTableStyleClass2List, tableValueMap);
	}

	/**
	 * 解約金情報をサービスフォームBeanに設定します。
	 * <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param choTekiStaYMD 長割適用開始年月日
	 * @param afAutoKeiChoStaYMD 自動継続後長割適用開始年月日
	 * @param choTekiKeiMonthCnt 長割適用月数
	 * @param outMap アウトマップ
	 * @param choStaYMD 長割適用日
	 * @param choManryoDate 長割満了日
	 * @param svcKeiStat サービス契約ステータス
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private void setKaiyakuKinInfo(X31SDataBeanAccess bean, String choTekiStaYMD, String afAutoKeiChoStaYMD, int choTekiKeiMonthCnt, HashMap outMap,
			String choStaYMD, String choManryoDate, String svcKeiStat) throws Exception
	{
		HashMap dslPrcMap = null;
		ArrayList dslPrcList = null;

		if (outMap != null && outMap.size() > 0 && outMap.containsKey(FUSV023701CC))
		{
			// 基本料金取得CCの結果を取得
			dslPrcMap = (HashMap)outMap.get(FUSV023701CC);
		}

		if (dslPrcMap != null && dslPrcMap.size() > 0 && dslPrcMap.containsKey(JFUHTPLANCHGPRCSHOKAICCLIST))
		{
			// 明細リスト取得
			dslPrcList = (ArrayList)dslPrcMap.get(JFUHTPLANCHGPRCSHOKAICCLIST);
		}

		// 結果が正常に取得できていない場合、処理を終了する。
		if (dslPrcList == null || dslPrcList.size() == 0)
		{
			return;
		}

		// 契約中の料金コースコード
		String nowPcrsCd = bean.sendMessageString(FUW10501SFConst.KEI_PCRS_CD, GET);
		// 契約中の料金プランコード
		String nowPplanCd = bean.sendMessageString(FUW10501SFConst.KEI_PPLAN_CD, GET);

		// 24ヶ月
		int autoKeiMonth24 = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_1, GET));
		// 36ヶ月
		int autoKeiMonth36 = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_2, GET));

		// 解約精算金情報取得
		X31SDataBeanAccessArray normalKiykKinArray = bean.getDataBeanArray(FUW10501SFConst.DSL_SSNKN_INFO);
		// 解約精算金情報(自動継続)取得
		X31SDataBeanAccessArray autoKeiKiykKinArray = bean.getDataBeanArray(FUW10501SFConst.AUTO_KEIZK_DSL_SSNKN_INFO);

		// 日付文字列をカレンダー型に変換
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_YYYYMMDD);
		Date choStaYmd = sdf.parse(choStaYMD);

		// 解約清算金期間文言取得
		Map<String, String> kikanMongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_KIKAN_IFNO_MONGON, QUERY_ATTR_NAME);
		String kaiSeiKikan = kikanMongonMap.get(ID_KAI_SEI_KIKAN);

// ANK-3951-06-00対応 20210428 星野 DEL START
//		// 初回フラグ
//		Boolean firstFlg = true;
// ANK-3951-06-00対応 20210428 星野 DEL END
		// 期間計算用カウント
		int cnt = 0;
		int autoKeiCnt = 0;

		for (int i = 0; i < dslPrcList.size(); i++)
		{
			HashMap childMap = (HashMap)dslPrcList.get(i);
			ArrayList childList = (ArrayList)childMap.get(JACPRCSIMULATIONDSLPRCLIST);

			// 契約情報と異なる、または、100Mライトコースの場合、以降の処理を行わない
			if (!nowPcrsCd.equals(childMap.get(PCRS_CD)) || !nowPplanCd.equals(childMap.get(PPLAN_CD))
					|| JFUStrConst.CD00565_PA0311.equals(nowPplanCd))
			{
				continue;
			}

			for (int j = 0; j < childList.size(); j++)
			{
				HashMap sonMap = (HashMap)childList.get(j);
				ArrayList sonList = (ArrayList)sonMap.get(JACPRCSIMULATIONMSG2LIST);

				// 料金科目コード
				String prcKmkCd = JFUStrConst.EMPTY;

				for (int k = 0; k < sonList.size(); k++)
				{
					HashMap prcInfoMapt = (HashMap)sonList.get(k);

					// 料金科目コード
					prcKmkCd = (String)prcInfoMapt.get(PRC_KMK_CD);
					// 請求金額取得
					String seikyAmnt = (String)prcInfoMapt.get(SEIKY_AMNT);

					if (seikyAmnt == null || seikyAmnt.length() == 0 || Integer.parseInt(seikyAmnt) < 0 || !DSL_PRC_KMK_CD_LIST.contains(prcKmkCd))
					{
						// 請求金額が正常に取得できていない、または、対象の料金科目コードがリストに存在しない場合、以降の処理を行わない
						continue;
					}
					else
					{
						// 上条件以外の場合は、請求金額を画面表示用に編集する
						seikyAmnt = JFUWebCommon.formatNumber(seikyAmnt) + JFUStrConst.HALF_SPACE + JFUStrConst.YEN;
					}

					// ●現在の解約精算金を設定
// IT2-2021-0000018対応 20210521 星野 MOD START
//// ANK-3951-06-00対応 20210428 星野 MOD START
////					if (DSL_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd) && (choTekiKeiMonthCnt <= 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 0))
//					if (DSL_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd) && (choTekiKeiMonthCnt <= 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 0 || choTekiKeiMonthCnt % autoKeiMonth36 == 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 35))
//// ANK-3951-06-00対応 20210428 星野 MOD END
					if (DSL_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd) && (choTekiKeiMonthCnt <= 2 || choTekiKeiMonthCnt % autoKeiMonth36 == 0 || choTekiKeiMonthCnt % autoKeiMonth36 == 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 2))
// IT2-2021-0000018対応 20210521 星野 MOD END
					{
						// 料金科目コードが「精算金0ヶ月」、かつ、長割未適用期間、または、解約精算金未発生月の場合、金額を設定する
						bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_DSL_SSNKN_NOW, SET, seikyAmnt);
					}
					else if (DSL_PRC_KMK_CD_LIST.get(1).equals(prcKmkCd) && choTekiKeiMonthCnt > 1 && choTekiKeiMonthCnt <= YEAR_GETU_CNT
// IT2-2021-0000018対応 20210521 星野 MOD START
							// 未発生月の場合の上書きを抑止
							&& !(choTekiKeiMonthCnt <= 2 || choTekiKeiMonthCnt % autoKeiMonth36 == 0 || choTekiKeiMonthCnt % autoKeiMonth36 == 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 2)
// IT2-2021-0000018対応 20210521 星野 MOD END
					)
					{
						// 料金科目コードが「精算金12ヶ月」、かつ、長割未適用期間、または、解約精算金未発生月の場合、金額を設定する
						bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_DSL_SSNKN_NOW, SET, seikyAmnt);
					}
					else if (DSL_PRC_KMK_CD_LIST.get(2).equals(prcKmkCd) && choTekiKeiMonthCnt > YEAR_GETU_CNT
							&& choTekiKeiMonthCnt <= autoKeiMonth24
// IT2-2021-0000018対応 20210521 星野 MOD START
							// 未発生月の場合の上書きを抑止
							&& !(choTekiKeiMonthCnt <= 2 || choTekiKeiMonthCnt % autoKeiMonth36 == 0 || choTekiKeiMonthCnt % autoKeiMonth36 == 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 2)
// IT2-2021-0000018対応 20210521 星野 MOD END
					)
					{
						// 料金科目コードが「精算金24ヶ月」、かつ、長割未適用期間、または、解約精算金未発生月の場合、金額を設定する
						bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_DSL_SSNKN_NOW, SET, seikyAmnt);
					}
					else if (DSL_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd) && choTekiKeiMonthCnt > autoKeiMonth24
							&& choTekiKeiMonthCnt <= autoKeiMonth36
// IT2-2021-0000018対応 20210521 星野 MOD START
							// 未発生月の場合の上書きを抑止
							&& !(choTekiKeiMonthCnt <= 2 || choTekiKeiMonthCnt % autoKeiMonth36 == 0 || choTekiKeiMonthCnt % autoKeiMonth36 == 1 || choTekiKeiMonthCnt % autoKeiMonth36 == 2)
// IT2-2021-0000018対応 20210521 星野 MOD END
					)
					{
						// 料金科目コードが「精算金36ヶ月」、かつ、長割未適用期間、または、解約精算金未発生月の場合、金額を設定する
						bean.sendMessageString(FUW10501SFConst.CKKZ_WRIB_DSL_SSNKN_NOW, SET, seikyAmnt);
					}

					// 0ヶ月目の解約精算金は解約精算金リストに表示させない
					if (DSL_PRC_KMK_CD_LIST.get(0).equals(prcKmkCd))
					{
						continue;
					}

					// 通常FROM
					String kikanFromYMD = JPCDateUtil.addMonth(choTekiStaYMD, YEAR_GETU_CNT * cnt);
// ANK-3951-06-00対応 20210428 星野 DEL START
//					if (!firstFlg)
//					{
// ANK-3951-06-00対応 20210428 星野 DEL END
					kikanFromYMD = JFUWebCommon.getBeginOfNextMonthDate(kikanFromYMD);
// ANK-3951-06-00対応 20210428 星野 DEL START
//					}
//					else
//					{
//						kikanFromYMD = JFUWebCommon.getBeginOfNextMonthDate(JPCDateUtil.addMonth(kikanFromYMD, -1));
//					}
// ANK-3951-06-00対応 20210428 星野 DEL END

					// 通常TO
					String kikanToYMD = JFUCommonUtil.getEndOfMonthDate(JPCDateUtil.addMonth(kikanFromYMD, YEAR_END_GETUMATU));
// ANK-3951-06-00対応 20210428 星野 DEL START
//					if (!firstFlg)
//					{
// ANK-3951-06-00対応 20210428 星野 DEL END
					kikanToYMD = JFUCommonUtil.getEndOfMonthDate(JPCDateUtil.addMonth(kikanToYMD, -1));
// ANK-3951-06-00対応 20210428 星野 DEL START
//					}
// ANK-3951-06-00対応 20210428 星野 DEL END
// ANK-3951-06-00対応 20210428 星野 DEL START
// 下に移動
//					Date toDslEndYmd = sdf.parse(kikanToYMD);
// ANK-3951-06-00対応 20210428 星野 DEL END

					// 自動継続後の日付は無条件で設定する
					// 自動継続後FROM
					String afAutoKikanFromYMD = JFUWebCommon.getBeginOfNextMonthDate(JPCDateUtil.addMonth(choManryoDate, YEAR_GETU_CNT * autoKeiCnt));
					// 自動継続後TO
					String afAutoKikanToYMD = JPCDateUtil.addMonth(JPCDateUtil.addMonth(afAutoKikanFromYMD, YEAR_GETU_CNT), -1);

// ANK-3951-06-00対応 20210428 星野 ADD START
					// 料金科目コードが「精算金12ヶ月」の場合、1,2ヶ月目が精算金無料となることを考慮し、期間開始を2ヶ月ずらす
					if( DSL_PRC_KMK_CD_LIST.get(1).equals(prcKmkCd) )
					{
						kikanFromYMD = JPCDateUtil.addMonth(kikanFromYMD, 2);
						afAutoKikanFromYMD = JPCDateUtil.addMonth(afAutoKikanFromYMD, 2);
					}
					
					// 料金科目コードが「精算金36ヶ月」の場合、36ヶ月目が精算金無料となることを考慮し、期間終了を1ヶ月ずらす
					if( DSL_PRC_KMK_CD_LIST.get(3).equals(prcKmkCd) )
					{
						kikanToYMD = JPCDateUtil.addMonth(kikanToYMD, -1);
						afAutoKikanToYMD = JPCDateUtil.addMonth(afAutoKikanToYMD, -1);
					}
					
					Date fromDslStartYmd = sdf.parse(kikanFromYMD);
					Date toDslEndYmd = sdf.parse(kikanToYMD);
// ANK-3951-06-00対応 20210428 星野 ADD END

					
					// ●自動継続後の解約金
					X31SDataBeanAccess afAutoKeiBean = autoKeiKiykKinArray.addDataBean();

					if (JFUStrConst.CD00037_020.equals(svcKeiStat) || JFUStrConst.CD00037_030.equals(svcKeiStat))
					{
						// 解約清算期間
						afAutoKeiBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_PRD_01, SET, kaiSeiKikan.replace(REPLACE_STR_1, String.valueOf(autoKeiMonth24 / YEAR_GETU_CNT + 1 + autoKeiCnt)));
					}
					else
					{
						// 解約精算期間FROM
						afAutoKeiBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_PRD_FROM_01, SET, editDateFormat(afAutoKikanFromYMD, FUNC_CODE_1));
						// 解約精算期間TO
						afAutoKeiBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_PRD_TO_01, SET, editDateFormat(afAutoKikanToYMD, FUNC_CODE_2));
					}
					// 解約精算金
					afAutoKeiBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_01, SET, seikyAmnt);

					autoKeiCnt++;

					// 申込日が各解約金終了日より未来日なら表示しない
					if (choStaYmd.after(toDslEndYmd))
					{
						cnt++;
						continue;
					}

// ANK-3951-06-00対応 20210428 星野 MOD START
//					// この位置の初回通過のみ、通常FROMに長割開始日を設定
//					if (firstFlg)
//					{
					// 申込日が各解約金開始日より未来日なら、開始日を補正する
					if( choStaYmd.after(fromDslStartYmd) )
					{
// ANK-3951-06-00対応 20210428 星野 MOD END
						kikanFromYMD = choStaYMD;
// ANK-3951-06-00対応 20210428 星野 DEL START
//						firstFlg = false;
// ANK-3951-06-00対応 20210428 星野 DEL END
					}

					// ●通常の解約金
					X31SDataBeanAccess kiykKinBean = normalKiykKinArray.addDataBean();

					if (JFUStrConst.CD00037_020.equals(svcKeiStat) || JFUStrConst.CD00037_030.equals(svcKeiStat))
					{
						// 解約清算期間
						kiykKinBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_PRD_01, SET, kaiSeiKikan.replace(REPLACE_STR_1, String.valueOf(autoKeiMonth24 / YEAR_GETU_CNT + 1 + cnt)));
					}
					else
					{
						// 解約精算期間FROM
						kiykKinBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_PRD_FROM_01, SET, editDateFormat(kikanFromYMD, FUNC_CODE_1));
						// 解約精算期間TO
						kiykKinBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_PRD_TO_01, SET, editDateFormat(kikanToYMD, FUNC_CODE_2));
					}
					// 解約精算金
					kiykKinBean.sendMessageString(FUW10501SFConst.DSL_SSNKN_01, SET, seikyAmnt);

					// カウントアップ
					cnt++;
				}
			}
		}
	}

	/**
	 * 月数をY年Mカ月に編集します。
	 * <br>
	 * @param monthCnt 月カウント
	 * @return 編集期間(Y年Mヵ月)
	 * @throws Exception
	 */
	private String editPrt(int monthCnt) throws Exception
	{
		// 返却変数
		StringBuffer result = new StringBuffer();

		int month = 0;
		int year = 0;

		// 文言一覧取得
		Map<String, String> textMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_MONGON, QUERY_ATTR_NAME);

		// 月数をY年Mカ月に編集
		if (monthCnt > 0)
		{
			// 期間月が12カ月より少ない場合
			if (monthCnt < YEAR_GETU_CNT)
			{
				// 月数を取得
				month = monthCnt;
			}
			else
			{
				// 年数を取得
				year = monthCnt / YEAR_GETU_CNT;
				// 月数を取得
				month = monthCnt % YEAR_GETU_CNT;
			}
		}
		else if (monthCnt <= 0)
		{
			month = 0;
			year = 0;
		}

		// 年が0以外の場合
		if (year != 0)
		{
			// 年数を作成
			result.append(String.valueOf(year));
			result.append(textMap.get(ID_YEAR));
		}

		// 月数を作成
		result.append(String.valueOf(month));
		result.append(textMap.get(ID_KAGETSU));

		// 結合結果を返却する
		return result.toString();
	}

	/**
	 * サービス名取得処理です。
	 * 
	 * <br>
	 * @param svcKeiInfoBean サービス契約情報
	 * @return サービス名
	 * @throws Exception
	 */
	private String getSvcNm(X31SDataBeanAccess svcKeiInfoBean) throws Exception
	{
		// 料金グループコード
		String prcGrpCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PRC_GRP_CD_23, GET);

		// サービス名一覧取得
		Map<String, String> svcNmMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_PPLAN_NM, QUERY_ATTR_NAME);

		// 指定のサービス名を返却
		return svcNmMap.get(prcGrpCd);
	}

	/**
	 * コース名取得処理です。
	 * 
	 * <br>
	 * @param svcKeiInfoBean サービス契約情報
	 * @return コース名
	 * @throws Exception
	 */
	private String getCrsNm(X31SDataBeanAccess svcKeiInfoBean) throws Exception
	{
		// 料金コースコード
		String pcrsCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, GET);
		// 料金プランコード
		String pplanCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_23, GET);

		// コース名一覧取得
		Map<String, String> crsNmMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_PPLAN_NM, QUERY_ATTR_NAME);

		// 指定のコース名を返却
		return crsNmMap.get(pcrsCd + JFUStrConst.HALF_UNDER_BAR + pplanCd);
	}

	/**
	 * 長割適用開始年月日を取得します。
	 * 
	 * <br>
	 * @param bean データBean
	 * @param svcStaYmd サービス開始日
	 * @return 長割適用開始年月日
	 * @throws Exception
	 */
	private String getChoTekiStaYMD(X31SDataBeanAccess bean, String svcStaYmd, int cnt) throws Exception
	{
		// 結果返却用変数
		String result = JFUStrConst.EMPTY;

		// 月差
		int month = JPCDateUtil.subtractMonth(JFUWebCommon.getOpeDate(this, null), svcStaYmd);
		// 長割適用可能年数
		int choYear = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_1, GET)) / YEAR_GETU_CNT;		// 最初(2年)
		// 自動継続更新年数
		int autoKeiMaxYear = Integer.parseInt(bean.sendMessageString(FUW10501SFConst.AUTO_KEI_MONTH_2, GET)) / YEAR_GETU_CNT;	// 2回目以降(3年)
		// 更新回数
		int koshinCnt = 0;
		// 年数
		int allYear = YEAR_GETU_CNT * choYear + YEAR_GETU_CNT * autoKeiMaxYear;		// 総月数(60ヵ月)

		// 更新回数計算
		koshinCnt = ((month / YEAR_GETU_CNT) - choYear) / autoKeiMaxYear;	// 更新回数

		// 初回満了日（最初の満了日の時）
		if (month == allYear)
		{
			koshinCnt--;
		}

		// 継続後満了日
		if (koshinCnt > 0 && month > allYear && (month - YEAR_GETU_CNT * choYear) % (YEAR_GETU_CNT * autoKeiMaxYear) == 0)
		{
			koshinCnt--;
		}

		if (koshinCnt < 1)
		{
			// 長割適用がまだ適用されない場合、サービス開始年月日の2年後の日付を取得
			result = JPCDateUtil.addYear(svcStaYmd, choYear);
		}
		else if (koshinCnt >= 1)
		{
			// 長割適用が可能な場合(サービス継続年数が2年以上)

			// 次の長割適用年月日を取得
			int nextTkYear = (koshinCnt * autoKeiMaxYear) + choYear;
			result = JPCDateUtil.addYear(svcStaYmd, nextTkYear);
		}

		// デバッグ用ログ出力
		DEBUG_LOG.info("★★★★ サービス利用開始日 ★★★★：" + svcStaYmd);
		DEBUG_LOG.info("★★★★ 更新回数　　　　　 ★★★★：" + koshinCnt);
		DEBUG_LOG.info("★★★★ 総月数　　　　　　 ★★★★：" + allYear);
		DEBUG_LOG.info("★★★★ 長割適用開始年月日 ★★★★：" + result);

		return result;
	}

	/**
	 * 割引サービス契約一意照会SCの下りマッピング処理です。
	 *
	 * <br>
	 * @param bean サービスフォームBean
	 * @param outputMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	private String getWribAmntSnsttdardymd(HashMap outputMap)
	{
		String res = null;
		HashMap parentMap = null;
		ArrayList childList = null;
		if (outputMap.containsKey(FUSV023703SC))
		{
			parentMap = (HashMap)outputMap.get(FUSV023703SC);
		}
		if(parentMap != null && parentMap.containsKey(EKK0451A010CBSMSG1LIST))
		{
			childList = (ArrayList)parentMap.get(EKK0451A010CBSMSG1LIST);
		}

		if(childList != null && childList.size() > 0)
		{
			for (int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);
				res = (String)childMap.get(WRIB_AMNT_SNST_STDARDYMD);

			}
		}
		return res;
	}

	/**
	 * 割引サービス契約一意照会SC（運用日指定）の下りマッピング処理です。
	 *
	 * <br>
	 * @param bean サービスフォームBean
	 * @param outputMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	private String getWribSvcKeiAtKeizkSkcd(HashMap outputMap)
	{
		String res = null;
		HashMap parentMap = null;
		ArrayList childList = null;
		if (outputMap.containsKey(FUSV023704SC))
		{
			parentMap = (HashMap)outputMap.get(FUSV023704SC);
		}
		if(parentMap != null && parentMap.containsKey(EKK0451A010CBSMSG1LIST))
		{
			childList = (ArrayList)parentMap.get(EKK0451A010CBSMSG1LIST);
		}

		if(childList != null && childList.size() > 0)
		{
			for (int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);
				res = (String)childMap.get(WRIB_SVC_KEI_AT_KEIZK_SKCD);

			}
		}
		return res;
	}

	/**
	 * 日付を各形式に変換します。
	 * 
	 * <br>
	 * @param date 日付文字列
	 * @param func_code 機能コード
	 * @return 変換された文字列
	 * @throws Exception
	 */
	private String editDateFormat(String date, String func_code) throws Exception
	{
		// 結果格納
		String result = date;

		// 文言一覧取得
		Map<String, String> mongonMap = JFUWebCommon.getDispItemsAsMap(PATH_PA_MONGON, QUERY_ATTR_NAME);

		// 日付文字列をカレンダー型に変換
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_YYYYMMDD);
		Date pDate = sdf.parse(date);

		Calendar cal = Calendar.getInstance();
		cal.setTime(pDate);

		if (FUNC_CODE_1.equals(func_code))
		{
			// ●「年月日」形式に変換
			StringBuffer sbf = new StringBuffer();

			// 年
			int year = cal.get(Calendar.YEAR);
			// 月
			int month = cal.get(Calendar.MONTH) + 1;
			// 日
			int day = cal.get(Calendar.DATE);

			sbf.append(String.valueOf(year));
			sbf.append(mongonMap.get(ID_YEAR));
			sbf.append(String.valueOf(month));
			sbf.append(mongonMap.get(ID_MONTH));
			sbf.append(String.valueOf(day));
			sbf.append(mongonMap.get(ID_DAY));

			result = sbf.toString();
		}
		else if (FUNC_CODE_2.equals(func_code))
		{
			// ●「年月末」形式に変換
			StringBuffer sbf = new StringBuffer();

			// 年
			int year = cal.get(Calendar.YEAR);
			// 月
			int month = cal.get(Calendar.MONTH) + 1;

			sbf.append(String.valueOf(year));
			sbf.append(mongonMap.get(ID_YEAR));
			sbf.append(String.valueOf(month));
			sbf.append(mongonMap.get(ID_GETSUMATSU));

			result = sbf.toString();
		}
		else if (FUNC_CODE_3.equals(func_code))
		{
			// ●「年月」形式に変換
			StringBuffer sbf = new StringBuffer();

			// 年
			int year = cal.get(Calendar.YEAR);
			// 月
			int month = cal.get(Calendar.MONTH) + 1;

			sbf.append(String.valueOf(year));
			sbf.append(mongonMap.get(ID_YEAR));
			sbf.append(String.valueOf(month));
			sbf.append(mongonMap.get(ID_MONTH));

			result = sbf.toString();
		}

		return result;
	}

	/**
	 * 運用日付(OPEDATE)の設定です。
	 *
	 * 共通フォームBean.フロント共有情報.フロント運用日付に運用日付(OPEDATE)を設定。
	 *
	 * @param commonInfoBean 共通フォームBean
	 * @param opeDate 運用日付(OPEDATE)
	 */
	private void setFuOpedate(X31SDataBeanAccess commonInfoBean, String opeDate)
	{
		//=====================================================================
		// 運用日付の設定
		//=====================================================================
		// 共通フォームBean.フロント共有情報
		X31SDataBeanAccess frontInfo = commonInfoBean.getDataBeanArray(CommonInfoCFConst.FRONT_COMMON_INFO).getDataBean(0);
		// フロント共有情報.フロント運用日付を設定します。
		frontInfo.sendMessageString(CommonInfoCFConst.FU_OPEDATE_05, X31CWebConst.DATABEAN_SET_VALUE, opeDate);
	}
}
