/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW07801SFLogic
*   ソースファイル名：FUW07801SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年04月01日
*＜機能概要＞
*    請求書送付要否設定画面サービスフォームBeanビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00       2011/12/01   FJ）今村    新規作成
*   v3.00       2012/03/30   FJ) 谷本    【ANK-0041-00-00】 申込完了メール対応
*   v4.00       2012/06/26   FJ) 西村    【ANK-0381-00-00】 ＩＰｖ６無料文言不備対応
*   v4.00       2012/09/28   FJ) 井口    【ANK-1163-00-00】 変更系申込が可能となるタイミングについて
*   v8.00       2014/01/27   FJ) 文元    【ANK-1589-00-00】消費増税に伴う料金施策
*  v15.00       2015/05/15   FJ) 谷本    【ANK-2581-00-00】フロント請求書送付要否の未来予約取消対応
*   v17.00      2015/07/03   FJ) 岡井    【ANK-2557-00-00】PMP再構築対応
*   v27.00      2016/10/14   FJ) 森脇    【OM-2016-0001537】サーバー側での必須チェックを追加
*   v34.00      2017/09/21   FJ) 張本    【ANK-3210-00-00】電気単独対応
*   v37.00      2018/02/19   FJ) 美濃原  【ANK-3366-00-00】eo光設備卸対応
*   v47.00      2019/11/25   FJ) 吉田    【OM-2018-0000579】全戸一括のお客さまが支払方法変更受付できない
*   v74.00      2025/03/05   FJ)西川葵   【ANK-4670-00-00】各種発行手数料値上げ対応
**********************************************************************/
package eo.web.webview.FUW07801SF;

import static com.fujitsu.futurity.web.x31.X31CWebConst.TELEGRAM_INFO_USECASE_ID;
import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;
import static eo.common.constant.JFUStrConst.ERROR_CODE_0002;
import static eo.common.constant.JFUStrConst.ERROR_CODE_0102;
import static eo.common.constant.JFUStrConst.ERROR_CODE_0110;
import static eo.common.constant.JFUStrConst.ERROR_CODE_0201;
import static eo.common.constant.JPCModelConstant.FUNC_CD_1;
import static eo.common.constant.JPCModelConstant.FUNC_CD_2;
import static eo.web.webview.CommonInfoCF.CommonInfoCFConst.NEXT_SCREEN_ID;
import static eo.web.webview.CommonInfoCF.CommonInfoCFConst.NEXT_SCREEN_NAME;
import static eo.web.webview.common.JFUScreenConst.SCREEN_ID_FUW07801;
import static eo.web.webview.common.JFUScreenConst.SCREEN_ID_FUW07802;
import static eo.web.webview.common.JFUScreenConst.SCREEN_ID_FUW07803;
import static eo.web.webview.common.JFUScreenConst.SCREEN_NAME_FUW07801;
import static eo.web.webview.common.JFUScreenConst.SCREEN_NAME_FUW07802;
import static eo.web.webview.common.JFUScreenConst.SCREEN_NAME_FUW07803;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31CMessageResult.X31CMessageMoreInfo;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JFUCommonUtil;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0062_FUSV0062OPDBMapper;
import eo.web.webview.mapping.FUSV0063_FUSV0063OPDBMapper;

/**
 * 請求書送付要否設定画面サービスフォームBeanビューロジック
 * <BR>
 * @author 富士通
 */
@SuppressWarnings( { "serial", "unchecked" })
public class FUW07801SFLogic extends JCCWebBusinessLogic
{

	/** 申込完了メール 変更 */
	private static final String MSKM_FIN_MAIL_FUW078_1 = "FUW078_1";

	/** DataBean操作種別：項目値設定 */
	private static final String SET = X31CWebConst.DATABEAN_SET_VALUE;
	/** DataBean操作種別：項目値取得 */
	private static final String GET = X31CWebConst.DATABEAN_GET_VALUE;

	/** サービスユースケースID：請求書送付要否設定(初期表示) */
	private static final String SVC_USECASE_ID_FUSV0062 = "FUSV0062";
	/** サービスユースケースID：請求書送付要否設定(申し込む) */
	private static final String SVC_USECASE_ID_FUSV0063 = "FUSV0063";
	/** サービスユースケースID：請求書送付要否設定(申し込む) */
	private static final String SVC_USECASE_ID_FUSV0063_1 = "FUSV0063_1";
	/** サービスユースケースID：請求書送付要否設定(申し込む) */
	private static final String SVC_USECASE_ID_FUSV0063_2 = "FUSV0063_2";

	/** SCタイトル：料金プラン固定単価一覧照会 */
	private static final String SC_TITLE_FUSV006201SC = "FUSV006201SC";
	/** SCタイトル：異動予約一覧照会 */
	private static final String SC_TITLE_FUSV006202SC = "FUSV006202SC";
	/** SCタイトル：請求契約一意照会 */
	private static final String SC_TITLE_FUSV006204SC = "FUSV006204SC";
	/** SCタイトル：申込明細一意照会 */
	private static final String SC_TITLE_FUSV006205SC = "FUSV006205SC";
	/** SCタイトル：同一請求先照会 */
	private static final String SC_TITLE_FUSV006206SC = "FUSV006206SC";

	/** テンプレートID(請求契約内容変更) */
	private static final String TEMPLATE_ID_EKK0491C060 = "EKK0491C060";
	/** アイテムID(upd_dtm_bf) */
	private static final String ITEM_ID_UPD_DTM_BF = "upd_dtm_bf";
	/** ゼロ */
	private static final String ZERO = "0";

	/** 請求書発行要否：否 */
	private static final String SEIKYUS_HAKKO_YH_0 = "0";
	/** 請求書発行要否：要 */
	private static final String SEIKYUS_HAKKO_YH_1 = "1";

	/** Mapキー：料金プラン固定単価一覧照会明細 */
	private static final String MAP_KEY_SC1CBSMSGLIST = "EKK0601B001CBSMsg1List";
	/** Mapキー：異動予約一覧照会明細 */
	private static final String MAP_KEY_SC2CBSMSGLIST = "EKK1681B001CBSMsg1List";
	/** Mapキー：請求契約一意照会明細 */
	private static final String MAP_KEY_SC4CBSMSGLIST = "EKK0491A010CBSMsg1List";
	/** Mapキー：申込明細一意照会照会明細 */
	private static final String MAP_KEY_SC5CBSMSGLIST = "EKK0021A010CBSMsg1List";
	/** Mapキー：同一請求先照会 */
	private static final String MAP_KEY_SC6CBSMSGLIST = "EKK0321B501CBSMsg1List";
	/** Mapキー：料金プラン固定金額 */
	private static final String MAP_KEY_PPLAN_KOTEI_AMNT = "pplan_kotei_amnt";
	/** Mapキー：料金プラン固定単位コード名 */
	private static final String MAP_KEY_PPLAN_KOTEI_TANI_CD_NM = "pplan_kotei_tani_cd_nm";
	/** Mapキー：異動予約状態コード */
	private static final String MAP_KEY_PIDO_RSV_STAT_CD = "ido_rsv_stat_cd";
	/** Mapキー：予約適用年月日 */
	private static final String MAP_KEY_PRSV_APLY_YMD = "rsv_aply_ymd";
	/** Mapキー：申込年月日 */
	private static final String MAP_KEY_PMSKM_YMD = "mskm_ymd";
	/** Mapキー：請求書発行要否 */
	private static final String MAP_KEY_PSEIKYUS_HAKKO_YH = "seikyus_hakko_yh";
	/** Mapキー：世代登録年月日時分秒 */
	private static final String MAP_KEY_GENE_ADD_DTM = "gene_add_dtm";
	/** Mapキー：最終更新年月日時分秒 */
	private static final String MAP_KEY_LAST_UPD_DTM = "last_upd_dtm";
	/** Mapキー：料金グループコード */
	private static final String PRC_GRP_CD = "prc_grp_cd";
	/** Mapキー：送付先名 */
	private static final String SOHUS_NM = "sohus_nm";
	/** Mapキー：送付先郵便番号 */
	private static final String SOHUS_PCD = "sohus_pcd";
	/** Mapキー：送付先都道府県名 */
	private static final String SOHUS_STATE_NM = "sohus_state_nm";
	/** Mapキー：送付先市区町村名 */
	private static final String SOHUS_CITY_NM = "sohus_city_nm";
	/** Mapキー：送付先大字通称名 */
	private static final String SOHUS_OAZTSU_NM = "sohus_oaztsu_nm";
	/** Mapキー：送付先字丁目名 */
	private static final String SOHUS_AZCHO_NM = "sohus_azcho_nm";
	/** Mapキー：送付先住所補記・建物名 */
	private static final String SOHUS_ADRTTM = "sohus_adrttm";
	/** Mapキー：送付先住所補記・部屋番号 */
	private static final String SOHUS_ADRRM = "sohus_adrrm";
	/** Mapキー：送付先番地号 */
	private static final String SOHUS_BNCHIGO = "sohus_bnchigo";
	/** Mapキー：送付先電話番号 */
	private static final String SOHUS_TELNO = "sohus_telno";

	/** 支払方法申込請求番号エラー(テンプレートID) */
	private static final String REL_CHK_TMP_ID_NO_CHG_PCRS = "EKK0491B508";

//ANK-4670-00-00 ADD START
	/** フロント用画面表示定義ファイル取得用パス(前) */
	private static final String QUERY_PATH = "DISPSETTING/SETTING[@screenId='FUW07801']/DISPCTL[@groupid='PRC_BASIC_INFO']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** 画面表示定義取得用キー 備考 */
	private static final String BIKO = "biko";
	/** 画面表示定義取得用キー 備考表示終了日 */
	private static final String BIKONM1_BIKO_ENDYMD = "bikoNm1_biko_endymd";
//ANK-4670-00-00 ADD END
	
	// OM-2018-0000579 DEL START
//	/** 支払方法申込マンションオーナーＩＤ存在チェックエラー(テンプレートID) */
//	private static final String REL_CHK_TMP_ID_MANSION_OWN_ID = "EKK0491B030";
//	/** 支払方法申込マンションオーナーＩＤ存在チェックエラー(アイテム) */
//	private static final String RELATION_CHECK_MANSION_OWN_ID = "mansion_owner_id";
	// OM-2018-0000579 DEL END

	/**
	 * 初期処理
	 * <br>
	 * @return	処理結果
	 * @throws Exception	例外
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(INIT) START★★★★★");

		// 初期設定
		JCCWebCommon.getScreenInfo(this);
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		// 運用日付の設定
		setFuOpedate(commonInfoBean);

		// サービスフォームBean初期値設定
		initSFBean(commonInfoBean, serviceInfoBean);

		// 共通関連チェック処理
		checkCommonRelation(serviceInfoBean);

		// ■設備卸チェック
		JFUWebCommon.checkOrosi(this);

		// サービス呼出処理
		callFUSV0062(serviceInfoBean, commonInfoBean);

		// 料金表表示現在日設定処理
		JFUWebCommon.setPrcDspNowDay(this);

		// 遷移先画面情報の設定
		commonInfoBean.sendMessageString(NEXT_SCREEN_ID, SET, SCREEN_ID_FUW07801);
		commonInfoBean.sendMessageString(NEXT_SCREEN_NAME, SET, SCREEN_NAME_FUW07801);

		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(INIT) END★★★★★");
		return true;
	}

	/**
	 * 確認するボタン押下処理
	 * <br>
	 * @return	処理結果
	 * @throws Exception 例外
	 */
	public boolean kakunin() throws Exception
	{
		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(KAKUNIN) START★★★★★");

		// 初期設定
		JCCWebCommon.getScreenInfo(this);
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		if (!checkSingleError(serviceInfoBean))
		{
			return true;
		}

		// サービス呼出処理
		callFUSV0063(serviceInfoBean, FUNC_CD_2);

		// 遷移先画面情報の設定(請求書送付要否設定確認画面へ遷移)
		commonInfoBean.sendMessageString(NEXT_SCREEN_ID, SET, SCREEN_ID_FUW07802);
		commonInfoBean.sendMessageString(NEXT_SCREEN_NAME, SET, SCREEN_NAME_FUW07802);

		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(KAKUNIN) END★★★★★");
		return true;
	}

	/**
	 * 戻るボタン押下処理
	 * <br>
	 * @return	処理結果
	 * @throws Exception 例外
	 */
	public boolean back() throws Exception
	{
		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(BACK) START★★★★★");

		// 初期設定
		JCCWebCommon.getScreenInfo(this);
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// 遷移先画面情報の設定(請求書送付要否設定画面へ遷移)
		commonInfoBean.sendMessageString(NEXT_SCREEN_ID, SET, SCREEN_ID_FUW07801);
		commonInfoBean.sendMessageString(NEXT_SCREEN_NAME, SET, SCREEN_NAME_FUW07801);

		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(BACK) END★★★★★");
		return true;
	}

	/**
	 * 申し込むボタン押下処理
	 * <br>
	 * @return	処理結果
	 * @throws Exception 例外
	 */
	public boolean mskm() throws Exception
	{
		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(MOSHIKOMU) START★★★★★");

		// 初期設定
		JCCWebCommon.getScreenInfo(this);
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		X31SDataBeanAccess serviceInfoBean = super.getServiceFormBean();

		// 共通関連チェック処理
		checkCommonRelation(serviceInfoBean);

		// サービス呼出処理
		callFUSV0063(serviceInfoBean, FUNC_CD_1);

		// 申込完了メール送信部品呼出処理
		JFUWebCommon.sendMskmFinMail(this, MSKM_FIN_MAIL_FUW078_1);

		// 遷移先画面情報の設定(請求書送付要否設定結果画面へ遷移)
		commonInfoBean.sendMessageString(NEXT_SCREEN_ID, SET, SCREEN_ID_FUW07803);
		commonInfoBean.sendMessageString(NEXT_SCREEN_NAME, SET, SCREEN_NAME_FUW07803);

		DEBUG_LOG.debug("★★★★★請求書送付要否設定のビューロジック処理(MOSHIKOMU) END★★★★★");
		return true;
	}

	/**
	 * サービスフォームBean初期値設定
	 * <br>
	 * @param commonInfoBean 共有フォームBean
	 * @param serviceInfoBean サービスフォームBean
	 */
	private void initSFBean(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess serviceInfoBean)
	{
		// サービスフォームBean ← 共有フォームBean.ＳＳＯ情報
		X31SDataBeanAccess ssoInfo = commonInfoBean.getDataBeanArray(JFUWebCommon.SSO_INFO).getDataBean(0);
		copyValue(ssoInfo, serviceInfoBean, CommonInfoCFConst.SYSID_21, FUW07801SFConst.SYSID);
		copyValue(ssoInfo, serviceInfoBean, CommonInfoCFConst.SVC_KEI_NO_21, FUW07801SFConst.SVC_KEI_NO);

		// サービスフォームBean ← 共有フォームBean.請求契約情報
		X31SDataBeanAccess seikyKeiInfo = commonInfoBean.getDataBeanArray(JFUWebCommon.SEIKY_KEI_INFO).getDataBean(0);
		copyValue(seikyKeiInfo, serviceInfoBean, CommonInfoCFConst.SEIKY_KEI_NO_32, FUW07801SFConst.SEIKY_KEI_NO);
	}

	/**
	 * サービス呼出処理(請求書送付要否設定(初期表示))
	 * <br>
	 * @param serviceInfoBean サービスフォームBean
	 * @param commonInfoBean 共有フォームBean
	 * @throws Exception
	 */
	private void callFUSV0062(X31SDataBeanAccess serviceInfoBean, X31SDataBeanAccess commonInfoBean) throws Exception
	{
		FUSV0062_FUSV0062OPDBMapper mapper = new FUSV0062_FUSV0062OPDBMapper();
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(TELEGRAM_INFO_USECASE_ID, SVC_USECASE_ID_FUSV0062);
		X31SDataBeanAccess[] bean = new X31SDataBeanAccess[] { serviceInfoBean, commonInfoBean };
		HashMap inputMap = new HashMap();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// DataBean-BP上りマッピング
		//JFUChgSvcPaywayRelCheckCC 支払方法変更受付関連チェックCC
		mapper.setFUSV006201CC(bean, inputMap);

		mapper.setFUSV006201SC(bean, inputMap, FUNC_CD_1);
		mapper.setFUSV006202SC(bean, inputMap, FUNC_CD_1);
		mapper.setFUSV006203SC(bean, inputMap, FUNC_CD_1);
		mapper.setFUSV006204SC(bean, inputMap, FUNC_CD_1);
		mapper.setFUSV006205SC(bean, inputMap, FUNC_CD_2);
		mapper.setFUSV006206SC(bean, inputMap, FUNC_CD_1);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			checkInitErr(se);
		}

		// DataBean-BP下りマッピング
		getFUSV006201SC(serviceInfoBean, outputMap);
		getFUSV006204SC(serviceInfoBean, outputMap);
		getFUSV006206SC(serviceInfoBean, outputMap);
		// 異動予約存在チェック
		checkIdoRsvExists(outputMap, serviceInfoBean);
//ANK-4670-00-00 ADD START
		// 料金表備考欄マッピング
		getPriceBikoAreaBean(serviceInfoBean, this);
//ANK-4670-00-00 ADD END
	}

	/**
	 * サービス呼出処理(請求書送付要否設定(申し込む))
	 * <br>
	 * @param serviceInfoBean サービスフォームBean
	 * @param funcCode 機能コード
	 */
	private void callFUSV0063(X31SDataBeanAccess serviceInfoBean, String funcCode)
	{
		FUSV0063_FUSV0063OPDBMapper mapper = new FUSV0063_FUSV0063OPDBMapper();
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(TELEGRAM_INFO_USECASE_ID, SVC_USECASE_ID_FUSV0063);
		X31SDataBeanAccess[] bean = new X31SDataBeanAccess[] { serviceInfoBean };
		HashMap inputMap = new HashMap();
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// DataBean-BP上りマッピング
		mapper.setFUSV006301CC(bean, inputMap, funcCode);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			checkInsertErr(se);
		}
	}

	/**
	 * 共通関連チェック処理
	 * <br>
	 * @param serviceInfoBean サービスフォームBean
	 */
	private void checkCommonRelation(X31SDataBeanAccess serviceInfoBean)
	{
		// 共通関連チェック
		String serviceId = SVC_USECASE_ID_FUSV0063_1;
		String seikysHakkoYh = serviceInfoBean.sendMessageString(FUW07801SFConst.SEIKYUS_HAKKO_YH_OLD, GET);
		if (SEIKYUS_HAKKO_YH_1.equals(seikysHakkoYh))
		{
			// 請求書発行要否「1:要」の場合、督促チェックなし
			serviceId = SVC_USECASE_ID_FUSV0063_2;
		}
		JFUWebCommon.checkCommonRelation(this, serviceId);
	}

	/**
	 *  登録時のエラー内容判定
	 * @param se JCCWebServiceException
	 */
	private void checkInsertErr(JCCWebServiceException se)
	{
		// 例外情報を取得
		X31CMessageMoreInfo info = se.getMessageList().getMessageMoreInfoList()[0];
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		// ステータスが"1100"（内部スキーマ関連チェックエラー）または"1400"（概念スキーマの関連チェックでエラー発生)
		// または"1300"（外部スキーマの相関チェックでエラー発生)の場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status) || String.valueOf(JPCModelConstant.ENTITY_RELATION_ERR).equals(status)
				|| String.valueOf(JPCModelConstant.STATUSTRANS_ERR).equals(status)
				|| String.valueOf(JPCModelConstant.TEMPLATE_CORRELATION_ERR).equals(status))
		{
			// テンプレートIDが"EKK0491C060"(請求契約内容変更)かつエラーフラグが"EA"の場合
			if (TEMPLATE_ID_EKK0491C060.equals(templateid) && JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
			{
				// アイテムIDが"upd_dtm_bf"(更新年月日時分秒(更新前))の場合
				if (ITEM_ID_UPD_DTM_BF.equals(itemid))
				{
					// 業務共通例外クラス："0201"（お客様情報変更エラー）
					DEBUG_LOG.info("----- FUW07801_checkInsertErr() お客様情報変更エラー -----");
					throw new JCCBusinessException(ERROR_CODE_0201);
				}
			}
		}
		// 業務共通例外クラス："0002"（システムエラー）
		DEBUG_LOG.info("----- FUW07801_checkInsertErr() システムエラー -----");
		throw new JCCBusinessException(ERROR_CODE_0002);
	}

	/**
	 * 料金プラン固定単価一覧照会の下りマッピング
	 * <br/>
	 * @param serviceInfoBean サービスフォームBean
	 * @param outputMap       サービス検索結果マップ
	 * @throws Exception
	 */
	private void getFUSV006201SC(X31SDataBeanAccess serviceInfoBean, HashMap<String, Object> outputMap) throws Exception
	{
		if (!existsOutPutMap(outputMap, SC_TITLE_FUSV006201SC, MAP_KEY_SC1CBSMSGLIST))
		{
			// 料金プラン固定単価データが存在しないためエラー
			DEBUG_LOG.info("----- FUW07801_getFUSV006201SC() 料金プラン固定単価データ未存在エラー -----");
			throw new JCCBusinessException(ERROR_CODE_0102);
		}
		HashMap parentMap = (HashMap)outputMap.get(SC_TITLE_FUSV006201SC);
		ArrayList childList = (ArrayList)parentMap.get(MAP_KEY_SC1CBSMSGLIST);
		HashMap<String, String> childMap = (HashMap<String, String>)childList.get(0);
		serviceInfoBean.sendMessageString(FUW07801SFConst.SEIKYUS_SOFU_PRC, SET, childMap.get(MAP_KEY_PPLAN_KOTEI_AMNT));
		serviceInfoBean.sendMessageString(FUW07801SFConst.SEIKYUS_SOFU_TANI, SET, childMap.get(MAP_KEY_PPLAN_KOTEI_TANI_CD_NM));

		String pplanKoteiAmnt = childMap.get(MAP_KEY_PPLAN_KOTEI_AMNT);

		// 無料の場合
		// 無料表示用の基本料金情報を設定する。
		if (ZERO.equals(pplanKoteiAmnt))
		{
			JFUWebCommon.setFreePrcInfoMap(outputMap, SC_TITLE_FUSV006201SC);
		}

		// 料金情報をサービスフォームBeanに格納
		JFUWebCommon.setPrcInfoArea(serviceInfoBean, outputMap, SC_TITLE_FUSV006201SC, JFUStrConst.EMPTY, SCREEN_ID_FUW07801);

		// 請求契約情報
		HashMap seikyMap = (HashMap)((ArrayList)((HashMap)outputMap.get(SC_TITLE_FUSV006204SC)).get(MAP_KEY_SC4CBSMSGLIST)).get(0);

		// 世代登録年月日時分秒
		serviceInfoBean.sendMessageString(FUW07801SFConst.GENE_ADD_DTM_SEIKY, SET, (String)seikyMap.get(MAP_KEY_GENE_ADD_DTM));
		// 最終更新年月日時分秒
		serviceInfoBean.sendMessageString(FUW07801SFConst.LAST_UPD_DTM_SEIKY, SET, (String)seikyMap.get(MAP_KEY_LAST_UPD_DTM));
		// 請求書発行要否
		String seikyusHakkoYh = (String)seikyMap.get(MAP_KEY_PSEIKYUS_HAKKO_YH);
		if (JFUWebCommon.isNull(seikyusHakkoYh))
		{
			seikyusHakkoYh = SEIKYUS_HAKKO_YH_0;
		}
		serviceInfoBean.sendMessageString(FUW07801SFConst.SEIKYUS_HAKKO_YH_OLD, SET, seikyusHakkoYh);
	}

	/**
	 * 請求契約一意照会SCの下りマッピングを行います。
	 * 
	 * <br>
	 * @param bean サービスフォームBean
	 * @param outputMap 結果マップ
	 * @return サービスフォームBean
	 * @throws Exception
	 */
	public void getFUSV006204SC(X31SDataBeanAccess bean, HashMap outputMap) throws Exception
	{
		HashMap parentMap = null;
		if (outputMap.containsKey(SC_TITLE_FUSV006204SC))
		{
			parentMap = (HashMap)outputMap.get(SC_TITLE_FUSV006204SC);
		}

		if (null != parentMap && parentMap.containsKey(MAP_KEY_SC4CBSMSGLIST))
		{
			ArrayList childList = (ArrayList)parentMap.get(MAP_KEY_SC4CBSMSGLIST);

			for (int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);

				// 送付先名
				bean.sendMessageString(FUW07801SFConst.SOFU_NM, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get(SOHUS_NM));
				// 送付先郵便番号
				bean.sendMessageString(FUW07801SFConst.SOFU_ZIP, X31CWebConst.DATABEAN_SET_VALUE, 
										JPCUtilCommon.hyhunPcd((String)childMap.get(SOHUS_PCD)));
				// 送付先電話番号
				bean.sendMessageString(FUW07801SFConst.SOFU_TELNO, X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get(SOHUS_TELNO));

				// 送付先都道府県名、送付先市区町村名、送付先大字通称名、送付先字丁目名、送付先番地号、
				// 送付先住所補記・建物名、送付先住所補記・部屋番号
				String sofuAddr = (String)childMap.get(SOHUS_STATE_NM) + (String)childMap.get(SOHUS_CITY_NM)
								+ (String)childMap.get(SOHUS_OAZTSU_NM) + (String)childMap.get(SOHUS_AZCHO_NM)
								+ (String)childMap.get(SOHUS_BNCHIGO) + (String)childMap.get(SOHUS_ADRTTM)
								+ (String)childMap.get(SOHUS_ADRRM);

				// 送付先住所
				bean.sendMessageString(FUW07801SFConst.SOFU_ADDR, X31CWebConst.DATABEAN_SET_VALUE, sofuAddr);
			}
		}
	}

	/**
	 * 同一請求先照会の下りマッピング
	 * <br/>
	 * @param serviceInfoBean サービスフォームBean
	 * @param outputMap       サービス検索結果マップ
	 * @throws Exception
	 */
	private void getFUSV006206SC(X31SDataBeanAccess serviceInfoBean, HashMap<String, Object> outputMap) throws Exception
	{

		HashMap parentMap = (HashMap)outputMap.get(SC_TITLE_FUSV006206SC);
		ArrayList childList = (ArrayList)parentMap.get(MAP_KEY_SC6CBSMSGLIST);

		int mineoOnly = 0;
		int elecOnly = 0;
		int other = 0;
		
		for (int i = 0; i < childList.size(); i++)
		{
			HashMap<String, String> childMap = (HashMap<String, String>)childList.get(i);
			String prcGrpCd = childMap.get(PRC_GRP_CD);

			//mineo・電気単独フラグ処理
			
			if (JFUStrConst.CD00133_51.equals(prcGrpCd))
			{
				mineoOnly++;
			}			
			else if (JFUStrConst.CD00133_17.equals(prcGrpCd))
			{
				elecOnly++;
			}
			else
			{
				other++;
			}
		}
		
		if (mineoOnly >= 1 && other >=1 || other >=1)
		{

		}
		else if (mineoOnly >= 1)
		{
			throw new JCCBusinessException(ERROR_CODE_0102); //契約状態エラーを設定
		}
		else if (elecOnly >= 1)
		{
			throw new JCCBusinessException(ERROR_CODE_0102); //契約状態エラーを設定
		}
	}

	/**
	 * 異動予約の存在チェックを行います。
	 * <br/>
	 * @param outputMap サービス検索結果マップ
	 * @param bean サービスフォームBean
	 */
	private void checkIdoRsvExists(HashMap<String, Object> outputMap, X31SDataBeanAccess bean)
	{
		// 申込年月日
		String mskmYmd =
				(String)((HashMap)((ArrayList)((HashMap)outputMap.get(SC_TITLE_FUSV006205SC)).get(MAP_KEY_SC5CBSMSGLIST)).get(0))
						.get(MAP_KEY_PMSKM_YMD);

		// 同日内の変更は許可
		if (JCCWebCommon.getOpeDate(this, null).equals(mskmYmd))
		{
			return;
		}

		// 異動予約が存在する場合はエラー(未来適用日付の請求先情報が存在する場合はエラー)
		ArrayList<HashMap> idoRsvList = (ArrayList)((HashMap)outputMap.get(SC_TITLE_FUSV006202SC)).get(MAP_KEY_SC2CBSMSGLIST);
		for (HashMap<String, String> idoRsvMap : idoRsvList)
		{
			// 異動予約状態コード
			String idoRsvStatCd = idoRsvMap.get(MAP_KEY_PIDO_RSV_STAT_CD);
			// 予約適用年月日
			String rsvAplyYmd = idoRsvMap.get(MAP_KEY_PRSV_APLY_YMD);

			// 取消済以外はチェック対象
			if (!JFUStrConst.CD01168_02.equals(idoRsvStatCd))
			{
				// 予約適用年月日が未来の場合
				if (JCCWebCommon.getOpeDate(this, null).compareTo(rsvAplyYmd) < 0)
				{
					// 同日内の変更以外の場合はエラー
					DEBUG_LOG.info("----- FUW07801_getFUSV006202SC() 同日内の変更以外で未来適用日付の請求契約情報が存在する場合はエラー -----");
					throw new JCCBusinessException(ERROR_CODE_0102);
				}
			}
		}
	}

	/**
	 * サービス検索結果マップの値が存在するか判定します。
	 * <br>
	 * @param outputMap サービス検索結果マップ
	 * @param keySC SCタイトルキー
	 * @param keyCBSMsg CBSMsgキー
	 * @return サービス検索結果マップの値が存在する場合は、TRUE
	 */
	private boolean existsOutPutMap(HashMap<String, Object> outputMap, String keySC, String keyCBSMsg)
	{
		HashMap parentMap = null;
		if (outputMap.containsKey(keySC))
		{
			parentMap = (HashMap)outputMap.get(keySC);
		}
		if (parentMap == null || !parentMap.containsKey(keyCBSMsg))
		{
			// パラメータ異常ならば終了
			return false;
		}
		ArrayList childList = (ArrayList)parentMap.get(keyCBSMsg);
		if (childList == null || childList.isEmpty())
		{
			// パラメータ異常ならば終了
			return false;
		}
		return true;
	}

	/**
	 * コピー元DataBean項目をコピー先DataBeanへコピーします
	 * <br>
	 * @param srcBean コピー元DataBean
	 * @param destBean コピー先DataBean
	 * @param srcName コピー元項目名
	 * @param destName コピー先項目名
	 */
	private void copyValue(X31SDataBeanAccess srcBean, X31SDataBeanAccess destBean, String srcName, String destName)
	{
		String value = srcBean.sendMessageString(srcName, GET);
		destBean.sendMessageString(destName, SET, value);
	}

	/**
	 * 例外の判定処理です。 <BR>
	 * 
	 * @param se
	 */
	private void checkInitErr(JCCWebServiceException se)
	{
		// 例外情報を取得
		X31CMessageResult msgResult = se.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		// エラーを判定
		// 業務エラー
		// 関連チェック
		// エラーを判定
		// システムエラー
		// 関連チェック
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// 支払方法変更申込予約存在チェック
			if (REL_CHK_TMP_ID_NO_CHG_PCRS.equals(templateid) && JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(errFlg))
			{
				// 業務共通例外クラス："0110"（支払方法未来予約存在エラー）
				DEBUG_LOG.info("----- FUW07801_checkInitErr() 支払方法未来予約存在エラー -----");
				throw new JCCBusinessException(ERROR_CODE_0110);
			}

			// OM-2018-0000579 DEL START
//			// マンションオーナーＩＤ存在チェック
//			if (REL_CHK_TMP_ID_MANSION_OWN_ID.equals(templateid) && RELATION_CHECK_MANSION_OWN_ID.equals(itemid)
//					&& JFUStrConst.RELATION_CHECK_ITEM_CHECK_ERR.equals(errFlg))
//			{
//				// 業務共通例外クラス："0102"（契約状態エラー）
//				DEBUG_LOG.info("----- FUW07801_checkInitErr() 契約状態エラー -----");
//				throw new JCCBusinessException(ERROR_CODE_0102);
//			}
			// OM-2018-0000579 DEL END
		}

		// 業務共通例外クラス："0002"（システムエラー）
		DEBUG_LOG.info("----- FUW07801_checkInsertErr() システムエラー -----");
		throw new JCCBusinessException(ERROR_CODE_0002);
	}

	/**
	 * 単項目チェックを行います。
	 * <br>
	 * @param serviceInfoBean サービスフォームBean
	 * @return エラーがある場合はfalse
	 */
	private boolean checkSingleError(X31SDataBeanAccess serviceInfoBean)
	{
		X31SDataBeanAccess[] bean = new X31SDataBeanAccess[] { serviceInfoBean };
		String seikyus_hakko_yh_new = bean[0].sendMessageString("請求書発行要否＿変更後", X31CWebConst.DATABEAN_GET_VALUE);
		if (JFUCommonUtil.isNull(seikyus_hakko_yh_new)) {
			
			JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKF0420_TW, new String []{"変更後の請求書送付要否","選択"}, "seikyus_sofu_yh_choice");
			return false;
		}
		
		return true;
	}

	/**
	 * 運用日付(OPEDATE)の設定
	 *
	 * 共通フォームBean.フロント共有情報.フロント運用日付に運用日付(OPEDATE)を設定。
	 *
	 * @param commonInfoBean
	 * @return 運用日付(OPEDATE:yyyyMMdd)
	 */
	private String setFuOpedate(X31SDataBeanAccess commonInfoBean)
	{
		String opeDate = JCCWebCommon.getOpeDate(this, null);

		//=====================================================================
		// 運用日付の設定
		//=====================================================================
		setFuOpedate(commonInfoBean, opeDate);
		return opeDate;
	}

	/**
	 * 運用日付(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);

	}
//ANK-4670-00-00 ADD START
	/**
	 * 料金表備考欄の下り処理です。
	 * <br>
	 * @param bean データBean
	 * @param inMap マップ
	 * @param bl ビジネスロジック
	 * @throws Exception
	 * @return データBean
	 */
	private X31SDataBeanAccess getPriceBikoAreaBean(X31SDataBeanAccess bean, X31BWebBusinessLogic bl) throws Exception
	{
		List<String> setBikoSkbtList = new ArrayList<String>();
		List<String> setBikoList = new ArrayList<String>();
		
		// ●プロパティより情報取得
		Map<String, String> pcrsNmMap =
				JFUWebCommon.getDispItemsAsMap(QUERY_PATH,QUERY_ATTR_NAME);

		//備考リストの備考と備考表示終了日の年月日を取得
		String biko = getMapValue(pcrsNmMap, BIKO, 1);
		String bikoEndymd = getMapValue(pcrsNmMap, BIKONM1_BIKO_ENDYMD, 0);
		
		//備考リストの備考がnullでない場合
		if (!JFUWebCommon.isNull(biko))
		{
			//運用日付が備考表示終了日の年月日を超過している場合
			if (isDispText(bl, bikoEndymd))
			{
				X31SDataBeanAccessArray prcInfoAreaListArray = bean.getDataBeanArray(JFUStrConst.PRC_INFO_PRC_INFO_AREA_LIST);
				X31SDataBeanAccess titleListArrayAccess = prcInfoAreaListArray.getDataBean(0);
				
				//  サービスフォームBeanに備考リストを格納済みのため、備考をクリアする。
				JFUWebCommon.setBikoList(titleListArrayAccess, setBikoSkbtList, setBikoList);
			}
		}
		// メモリー開放
		setBikoSkbtList = null;
		setBikoList = null;
		
		return bean;
	}
	
	/**
	 * マップのテキストが表示対象かを判定します。
	 *
	 * <br>
	 * @param bl　ビジネスロジッククラス
	 * @param map　表示テキスト対象のマップ
	 * @param keyText　表示テキストのキー
	 * @param keyEndymd　表示テキストの終了日
	 * @return true/false
	 */
	private boolean isDispText(X31BWebBusinessLogic bl, String keyEndymd)
	{
		if (!JFUWebCommon.isNull(keyEndymd))
		{
			if (Integer.parseInt(keyEndymd) < Integer.parseInt(JFUWebCommon.getOpeDate(bl, null)))
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * マップ値を取得します。
	 *
	 * <br>
	 * @param map マップ情報
	 * @param key 取得キー
	 * @param index 要素番号
	 * @param value 値
	 * @return マップ値を返却します。未取得の場合は初期値を返却します。
	 */
	private static String getMapValue(Map<String, String> map, String key, int index)
	{
		if (null != map && 0 != map.size())
		{
			String mapValue = map.get(key);
			if (!JFUWebCommon.isNull(mapValue))
			{
				String[] mapValues = mapValue.split(JFUStrConst.COMMA);
				if (index <= mapValues.length - 1 && !JFUWebCommon.isNull(mapValues[index]))
				{
					return mapValues[index];
				}
			}
		}
		return null;
	}
//ANK-4670-00-00 ADD END
}