/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUSV0239_FUSV0239OPDBMapper
*	ソースファイル名：FUSV0239_FUSV0239OPDBMapper.java
*	作成者			：FJ
*	日付			：2012年06月07日
*＜機能概要＞
*	BP（eo光ネット長割申込(解約)）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00		2012/06/07	FJ)南岡	   【ANK-0392-00-00】長期割引契約制度対応
*	v4.00		2012/10/09	FJ)岡井	   【ANK-1223-00-00】進捗補足事項編集対応
*	v4.00		2012/11/13	FJ)岡井	   【IT1-2012-0001952】割引サービス契約解約：IT1障害対応
*	v5.00		2013/09/09	FJ)岡井	   【OM-2013-0001849】長割課金終了日修正(前月末日対応)
*	v66.00		2023/05/01	FJ)西川	   【ANK-4411-00-00】長期継続利用割引見直し対応
**********************************************************************/
package eo.web.webview.mapping;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JFUStrConst;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW10501SF.FUW10501SFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * DataBean-BPマッピングをする。
 *
 * @author 富士通
 */
public class FUSV0239_FUSV0239OPDBMapper
{

	/** DataBean操作種別：項目値取得 */
	private static final String GET = X31CWebConst.DATABEAN_GET_VALUE;

	// ■SC名
	/** 申込内容承認登録SC */
	private static final String FUSV023901SC = "FUSV023901SC";
	/** 割引サービス契約キャンセルSC */
	private static final String FUSV023902SC = "FUSV023902SC";
	/** 割引サービス契約解約SC */
	private static final String FUSV023903SC = "FUSV023903SC";
	/** 割引サービス契約解約確定SC */
	private static final String FUSV023904SC = "FUSV023904SC";
	/** 進捗登録SC */
	private static final String FUSV023905SC = "FUSV023905SC";
	/** 申込明細照査・後続業務依頼SC */
	private static final String FUSV023906SC = "FUSV023906SC";

	// ■SCリスト名
	/** 申込内容承認登録明細 */
	private static final String EKK0011D020CBSMSG1LIST = "EKK0011D020CBSMsg1List";
	/** 異動理由明細 */
	private static final String EKK1091D010CBSMSG1LIST = "EKK1091D010CBSMsg1List";

	// ■項目ID
	/** SYSID */
	private static final String SYSID = "sysid";
	/** サービス契約番号 */
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** 更新年月日時分秒(更新前) */
	private static final String UPD_DTM_BF = "upd_dtm_bf";
	/** サービス課金終了年月日 */
	private static final String SVC_CHRG_ENDYMD = "svc_chrg_endymd";
	/** 請求契約番号 */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";
	/** 割引サービス契約番号 */
	private static final String WRIB_SVC_KEI_NO = "wrib_svc_kei_no";
	/** 割引サービス契約ステータス */
	private static final String WRIB_SVC_KEI_STAT = "in_wrib_svc_kei_stat";
	/** サービス課金開始年月日 */
	private static final String SVC_CHRG_STAYMD = "svc_chrg_staymd";
	/** 進捗特記事項1 */
	private static final String PRG_TKJK_1 = "prg_tkjk_1";
	/** 機能コード */
	private static final String FUNC_CODE = "func_code";

	// ■その他
	/** 特記事項１要素を取得する際のid */
	private static final String PRGADD_ID = "0";
	/** 定義取得パス 進捗特記事項1 */
	private static final String PATH_SHINCHOKU = "DISPSETTING/SETTING[@screenId='FUW10502']/DISPTEXT[@groupid='SHINCHOKU']";
	/** 属性名 */
	private static final String QUERY_ATTR_NAME = "id";
	/** 置換文字列：%0% */
	private static final String REPLACE_STR_0 = "%0%";
	/** 置換文字列：%1% */
	private static final String REPLACE_STR_1 = "%1%";
	/** 定義XML項目取得ID：解除 */
	private static final String XML_ID_KAIJO = "kaijo";
	/** 定義XML項目取得ID：自動継続しない */
	private static final String JDKEI_SHINAI = "jdkei_shinai";

	/**
	 * コンストラクタ
	 */
	public FUSV0239_FUSV0239OPDBMapper()
	{
	}

	/**
	 * 申込内容承認登録の上りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap アウトマップ
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 */
	public HashMap setFUSV023901SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// SYSID
		parentMap.put(SYSID, bean[1].sendMessageString(CommonInfoCFConst.SYSID_21, GET));

		// 申込内容承認登録明細
		ArrayList arrayList = new ArrayList<HashMap>();
		HashMap detailMap = new HashMap();
		arrayList.add(detailMap);
		parentMap.put(EKK0011D020CBSMSG1LIST, arrayList);

		outputMap.put(FUSV023901SC, parentMap);

		return outputMap;
	}

	/**
	 * 割引サービス契約キャンセルSCの上りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap アウトマップ
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 */
	public HashMap setFUSV023902SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// 割引サービス契約番号
		parentMap.put(WRIB_SVC_KEI_NO, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_NO, GET));
		// 更新年月日時分秒(更新前)
		parentMap.put(UPD_DTM_BF, bean[4].sendMessageString(CommonInfoCFConst.LAST_UPD_DTM_30, GET));

		// (実行判定)割引サービス契約ステータス
		parentMap.put(WRIB_SVC_KEI_STAT, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_STAT, GET));

		outputMap.put(FUSV023902SC, parentMap);

		return outputMap;
	}

	/**
	 * 割引サービス契約解約SCの上りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap アウトマップ
	 * @param opeDate 運用日付
	 * @param mskmKisanYmd 申込起算年月日（割引サービス契約）
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 * @throws Exception 例外
	 */
	public HashMap setFUSV023903SC(X31SDataBeanAccess[] bean, HashMap outputMap, String opeDate, String mskmKisanYmd, String func_code) throws Exception
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// 割引サービス契約番号
		parentMap.put(WRIB_SVC_KEI_NO, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_NO, GET));
		// サービス課金開始年月日
		parentMap.put(SVC_CHRG_STAYMD, bean[4].sendMessageString(CommonInfoCFConst.SVC_CHRG_STAYMD_30, GET));
		// 更新年月日時分秒(更新前)
		parentMap.put(UPD_DTM_BF, bean[4].sendMessageString(CommonInfoCFConst.LAST_UPD_DTM_30, GET));
		// サービス課金終了年月日
		parentMap.put(SVC_CHRG_ENDYMD, getJudgeMonthEnd(opeDate, mskmKisanYmd));

		// (実行判定)割引サービス契約ステータス
		parentMap.put(WRIB_SVC_KEI_STAT, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_STAT, GET));

		outputMap.put(FUSV023903SC, parentMap);

		return outputMap;
	}

	/**
	 * 割引サービス契約解約確定SCの上りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap アウトマップ
	 * @param opeDate 運用日付
	 * @param mskmKisanYmd 申込起算年月日（割引サービス契約）
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 * @throws Exception 例外
	 */
	public HashMap setFUSV023904SC(X31SDataBeanAccess[] bean, HashMap outputMap, String opeDate, String mskmKisanYmd, String func_code) throws Exception
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// 割引サービス契約番号
		parentMap.put(WRIB_SVC_KEI_NO, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_NO, GET));
		// サービス課金終了年月日
		parentMap.put(SVC_CHRG_ENDYMD, getJudgeMonthEnd(opeDate, mskmKisanYmd));

		// (実行判定)割引サービス契約ステータス
		parentMap.put(WRIB_SVC_KEI_STAT, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_STAT, GET));

		outputMap.put(FUSV023904SC, parentMap);

		return outputMap;
	}

	/**
	 * 進捗登録SCの上りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap アウトマップ
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	public HashMap setFUSV023905SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// 請求契約番号
		parentMap.put(SEIKY_KEI_NO, bean[3].sendMessageString(CommonInfoCFConst.SEIKY_KEI_NO_32, GET));
		// サービス契約番号
		parentMap.put(SVC_KEI_NO, bean[1].sendMessageString(CommonInfoCFConst.SVC_KEI_NO_21, GET));
		// 割引サービス契約番号
		parentMap.put(WRIB_SVC_KEI_NO, bean[0].sendMessageString(FUW10501SFConst.WRIB_SVC_KEI_NO, GET));

		// 進捗特記事項1
		try
		{
			// クラス名を取得
			Map<String, String> shinchokuMap = JFUWebCommon.getDispItemsAsMap(PATH_SHINCHOKU, QUERY_ATTR_NAME);
			// 文言格納用変数
			String mongon1 = JFUStrConst.EMPTY;
			String mongon2 = JFUStrConst.EMPTY;
			// 項目値設定用変数
			String prgTkjk1 = JFUStrConst.EMPTY;

			if (shinchokuMap != null && shinchokuMap.size() > 0)
			{
				// 申込種別文言取得
				mongon1 = shinchokuMap.get(XML_ID_KAIJO);
				// 自動継続しない場合
				mongon2 = shinchokuMap.get(JDKEI_SHINAI);
			}

			// 文字列
			if (mongon1 != null && mongon1.length() > 0 && mongon2 != null && mongon2.length() > 0)
			{
				prgTkjk1 = JFUWebCommon.getPrgAddTkjkFst(JFUScreenConst.SCREEN_ID_FUW10502, PRGADD_ID);
				prgTkjk1 = prgTkjk1.replace(REPLACE_STR_0, mongon1);
				prgTkjk1 = prgTkjk1.replace(REPLACE_STR_1, mongon2);
			}

			if (prgTkjk1 != null && prgTkjk1.length() > 0)
			{
				parentMap.put(PRG_TKJK_1, prgTkjk1);
			}
			else
			{
				DEBUG_LOG.debug("※進捗特記事項1がXMLから正常に取得できませんでした。処理は続行します。");
			}
		}
		catch (Exception e)
		{
			DEBUG_LOG.debug("※進捗特記事項1がXMLから正常に取得できませんでした。処理は続行します。");
		}

		// 異動理由明細
		ArrayList arrayList = new ArrayList<HashMap>();
		HashMap detailMap = new HashMap();
		arrayList.add(detailMap);
		parentMap.put(EKK1091D010CBSMSG1LIST, arrayList);

		outputMap.put(FUSV023905SC, parentMap);

		return outputMap;
	}

	/**
	 * 申込明細照査・後続業務依頼SCの上りマッピング処理です。
	 *
	 * <br>
	 * @param bean データBean配列
	 * @param outputMap アウトマップ
	 * @param func_code 機能コード
	 * @return HashMap 結果マップ
	 */
	@SuppressWarnings("unchecked")
	public HashMap setFUSV023906SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);

		outputMap.put(FUSV023906SC, parentMap);

		return outputMap;
	}

	/**
	 * 同月の場合、前月末日。それ以外は当月末日を取得します。
	 *
	 * <br>
	 * @param bl X31BWebBusinessLogic
	 * @return 長割解約時に設定するサービス課金終了日
	 * @throws Exception 例外
	 */
	private String getJudgeMonthEnd(String opeDate, String mskmKisanYmd) throws Exception
	{
		String svcChrgEndYmd = null;
		if (opeDate != null && opeDate.length() == 8 && mskmKisanYmd != null && mskmKisanYmd.length() == 8 && opeDate.substring(0, 6).equals(mskmKisanYmd.substring(0, 6)))
		{
			// 同月の場合

			// 前月
			String bfMonth = JPCUtilCommon.addMonth(opeDate, -1);
			// 前月末日
			svcChrgEndYmd = JFUWebCommon.getEndOfMonthDate(bfMonth);

		}
		else
		{
			// 上記以外の場合

			// 当月末日
			svcChrgEndYmd = JFUWebCommon.getEndOfMonthDate(opeDate);
		}

		return svcChrgEndYmd;
	}
}