/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：FUSV0304_FUSV0304OPDBMapper
*	ソースファイル名：FUSV0304_FUSV0304OPDBMapper.java
*	作成者			：富士通
*	日付			：2017年02月06日
*＜機能概要＞
*	BP（オプション選択内容確認）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v29.00.00	2017/02/06	FJ)黒田		【ANK-3112-00-00】訪販チャネルのタブレット対応
*   v39.0.0     2018/11/18  FJ) 大島    【ANK-3473-00-00】選択性CPシステム改修
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JFUStrConst;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW00116SF.FUW00116SFConst;
import eo.web.webview.FUW00928SF.FUW00928SFConst;
import eo.web.webview.common.JFUWebCommon;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class FUSV0304_FUSV0304OPDBMapper
{
	/** 決算金額 */
	private static final String AMOUNT = "1";

// ANK-3436-00-00 ADD START
	/** mineoセット割適用可否照会・変更依頼CC */
	private static final String JFUMINEO_SETPLANR_ENKEI_CC = "JFUMineoSetPlanRenkeiCC";
	/** 更新区分 */
	private static final String KSN_KBN = "1";
	/** 処理区分 */
	private static final String PROCESSING_TYPE = "1";

	/** ＫＥＹ＿更新区分 */
	private static final String KEY_KSN_KBN = "key_ksnKbn";
	/** ＫＥＹ＿リクエストID */
	private static final String KEY_REQUEST_ID = "key_requestID";
	/** ＫＥＹ＿運用日時 */
	private static final String KEY_OPERATE_DATETIME = "key_operateDateTime";
	/** ＫＥＹ＿処理区分 */
	private static final String KEY_PROCESSING_TYPE = "key_processingType";
	/** ＫＥＹ＿キャンペーンコード */
	private static final String KEY_DISCOUT_CODE = "key_discoutCode";
	/** ＫＥＹ＿サービス契約番号 */
	private static final String KEY_SERIVCE_NUM = "key_serivceNum";
	/** ＫＥＹ＿SYSID */
	private static final String KEY_SYSID = "key_sysid";
	/** ＫＥＹ＿請求先番号 */
	private static final String KEY_INVOICE_NUM = "key_invoiceNum";
	/** ＫＥＹ＿契約者住所コード */
	private static final String KEY_CONTRACTOR_ADDRESS_CODE = "key_contractorAddressCode";
	/** ＫＥＹ＿サービス */
	private static final String KEY_SERVICE = "key_service";
	/** ＫＥＹ＿料金グループ */
	private static final String KEY_FEE_GROUP = "key_feeGroup";
	/** ＫＥＹ＿料金コース */
	private static final String KEY_FEE_COURCE = "key_feeCource";
	/** ＫＥＹ＿料金プラン */
	private static final String KEY_FEE_PLAN = "key_feePlan";
	/** ＫＥＹ＿契約形態コード */
	private static final String KEY_CONTRACT_FORM = "key_contractForm";
	/** ＫＥＹ＿申込日 */
	private static final String KEY_SUBSCRIPTION_DATE = "key_subscriptionDate";
	/** ＫＥＹ＿照査日 */
	private static final String KEY_INSPECTION_DATE = "key_inspectionDate";
	/** ＫＥＹ＿受付番号 */
	private static final String KEY_ACCEPTANCE_NUM = "key_acceptanceNum";
	/** ＫＥＹ＿契約状態 */
	private static final String KEY_CONTRACT_CONDITION = "key_contractCondition";
	/** ＫＥＹ＿利用場所住所コード */
	private static final String KEY_USINGPLACE_ADDRESS_CODE = "key_usingPlaceAddressCode";
	/** ＫＥＹ＿回線内訳番号 */
	private static final String KEY_LINE_NUM = "key_lineNum";
	/** ＫＥＹ＿入力mineo受付番号・電話番号 */
	private static final String KEY_INPUT_MINE_NUM = "key_inputMineNum";
	/** ＫＥＹ＿入力解除メール通知有無1 */
	private static final String KEY_KEI_1_MAIL_SEND_FLAG = "key_kei_1_mail_send_flag";
	/** ＫＥＹ＿入力解除メール通知有無2 */
	private static final String KEY_KEI_2_MAIL_SEND_FLAG = "key_kei_2_mail_send_flag";
// ANK-3436-00-00 ADD END
// ANK-3473-00-00 ADD START
	/** JFUGetCampaignListCC */
	private static final String JFUGETCAMPAIGNLISTCC = "JFUGetCampaignListCC";
	/** キャンペーンコード */
	private static final String IN_CAMPAIGN_CD = "campaign_cd";
	/** キャンペーン種別コード 1:商品券 2:割引サービス */
	private static final String IN_CAMPAIGN_SBTCD = "campaign_sbt_cd";
// ANK-3473-00-00 ADD END
	
	/**
	 * コンストラクタ
	 */
	public FUSV0304_FUSV0304OPDBMapper()
	{
	}

	/**
	 * 上りマッピングをする（電子署名イメージ一意照会）
	 * @param bean　[0]：WEB新規情報
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setFUSV030401SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{

		if (bean == null)
		{
			return null;
		}

		if (bean.length != 2)
		{
			return null;
		}

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		X31SDataBeanAccess web_new_infobean = getWebInfo(bean[0]);
		
		// 契約サービス情報
		X31SDataBeanAccess keiyakuSvcInfoBean = getKeiyakusvcinfo(web_new_infobean);

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// 申込回線サービス
		String mskm_ksn_svc = web_new_infobean.sendMessageString(CommonInfoCFConst.MSKM_KSN_SVC_06, X31CWebConst.DATABEAN_GET_VALUE);
		// 申込マンションタイプ
		String mskm_mansion_typ = web_new_infobean.sendMessageString(CommonInfoCFConst.MSKM_MNS_TYPE_06, X31CWebConst.DATABEAN_GET_VALUE);

		// 申込書種別コード
		String mskmsho_sbt_cd = "";
		
		if (JFUStrConst.MSKM_KSN_SVC_HOME.equals(mskm_ksn_svc))
		{
			// ホーム
			mskmsho_sbt_cd = JFUStrConst.CD00752_1;
		}
		else if (JFUStrConst.MSKM_KSN_SVC_MANSION.equals(mskm_ksn_svc) && JFUStrConst.MSKM_MNS_TYPE_MANSION.equals(mskm_mansion_typ))
		{
			// マンション
			mskmsho_sbt_cd = JFUStrConst.CD00752_2;
		}
		else if (JFUStrConst.MSKM_KSN_SVC_MANSION.equals(mskm_ksn_svc) && JFUStrConst.MSKM_MNS_TYPE_MEZON.equals(mskm_mansion_typ))
		{
			// メゾン
			mskmsho_sbt_cd = JFUStrConst.CD00752_3;
		}

		// 申込書番号 → 電子署名イメージ一意照会.ＫＥＹ＿申込書番号
		parentMap.put("key_mskmsho_no", keiyakuSvcInfoBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_10, X31CWebConst.DATABEAN_GET_VALUE));

		// 申込書種別コード → 電子署名イメージ一意照会.ＫＥＹ＿申込書種別コード
		parentMap.put("key_mskmsho_sbt_cd", mskmsho_sbt_cd);
		
		outputMap.put("FUSV030401SC", parentMap);

		return outputMap;
	}

	/**
	 * 下りマッピングをする（電子署名イメージ一意照会）
	 * 
	 * @param outputMap
	 * @return result
	 */
	@SuppressWarnings("unchecked")
	public boolean getFUSV030401SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		// 電子署名存在チェックフラグ
		boolean result = true;
		
		HashMap parentMap = null;
		ArrayList list = null;

		parentMap = (HashMap)outputMap.get("FUSV030401SC");

		list = (ArrayList)parentMap.get("EKK3091A010CBSMsg1List");

		if (list.size() > 0)
		{
			// 電子署名あり
			result = false;
		}

		return result;
	}

	/**
	 * WEB新規情報
	 * 
	 * @param bean
	 * @return bn
	 */
	private X31SDataBeanAccess getWebInfo(X31SDataBeanAccess bean)
	{
		X31SDataBeanAccessArray arr = bean.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO);
		if (arr.getCount() == 0)
		{
			arr.addDataBean();
		}
		X31SDataBeanAccess bn = arr.getDataBean(0);

		return bn;
	}
	
	/**
	 * 契約サービス情報
	 * 
	 * @param bn
	 * @return bn1
	 */
	private X31SDataBeanAccess getKeiyakusvcinfo(X31SDataBeanAccess bn)
	{
		X31SDataBeanAccessArray arr = bn.getDataBeanArray(CommonInfoCFConst.KEIYAKU_SVC_INFO);
		if (arr.getCount() == 0)
		{
			arr.addDataBean();
		}
		X31SDataBeanAccess bn1 = arr.getDataBean(0);

		return bn1;
	}

// ANK-3436-00-00 ADD START
	/**
	 * 上りマッピングをする
	 * @param bean [0]：共有フォームBean
	 * @param bean [1]：サービスフォームBean
	 * @param outputMap 設定値格納マップ
	 * @param argKsnKbn 更新区分
	 * @param argProcessingType 処理区分
	 * @param argOpeDateTimeStamp 運用日時分秒ミリ秒
	 * @return HashMap 結果マップ
	 */
	public HashMap<String, Object> setFUSV030401CC(X31SDataBeanAccess[] bean, HashMap<String, Object> outputMap, String argOpeDateTimeStamp) 
	{

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共有フォームBean
		X31SDataBeanAccess commonInfoBean = bean[0];
		// サービスフォームBean
		X31SDataBeanAccess serviceFormBean = bean[1];
		
		// ■ＷＥＢ新規情報
		X31SDataBeanAccess webNewBean = commonInfoBean.getDataBeanArray(CommonInfoCFConst.WEB_NEW_INFO).getDataBean(0);
		// ■契約サービス情報
		X31SDataBeanAccess keiSvcBean = webNewBean.getDataBeanArray(CommonInfoCFConst.KEIYAKU_SVC_INFO).getDataBean(0);
		// ■eo光ネット
		X31SDataBeanAccess eoNetBean = webNewBean.getDataBeanArray(CommonInfoCFConst.EONET).getDataBean(0);
		// ■PASCO
		X31SDataBeanAccess pascoBean = webNewBean.getDataBeanArray(CommonInfoCFConst.PASCO_INFO).getDataBean(0);
		// ■マンション情報
		X31SDataBeanAccess mansionBean = webNewBean.getDataBeanArray(CommonInfoCFConst.MANSION_INFO).getDataBean(0);
		// 申込時mineo番号を取得
		String strMineoSetPlanKbn = serviceFormBean.sendMessageString(FUW00928SFConst.MINEO_SETPLAN_KBN, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuilder strMineoSetPlanNo = new StringBuilder();
		if ("1".equals(strMineoSetPlanKbn)) {
			// 受付番号で申請
			strMineoSetPlanNo.append(serviceFormBean.sendMessageString(FUW00928SFConst.MINEO_UKTK_NO, X31CWebConst.DATABEAN_GET_VALUE));
		} else if ("2".equals(strMineoSetPlanKbn)) {
			// 電話番号で申請
			strMineoSetPlanNo.append(serviceFormBean.sendMessageString(FUW00928SFConst.MINEO_TELNO_AREACD, X31CWebConst.DATABEAN_GET_VALUE))
					.append(serviceFormBean.sendMessageString(FUW00928SFConst.MINEO_TELNO_CITYCD, X31CWebConst.DATABEAN_GET_VALUE))
					.append(serviceFormBean.sendMessageString(FUW00928SFConst.MINEO_TELNO_LOCAL, X31CWebConst.DATABEAN_GET_VALUE));
		}

		// ＫＥＹ＿更新区分
		parentMap.put(KEY_KSN_KBN, KSN_KBN);
		// ＫＥＹ＿リクエストID
		StringBuilder sbRequestID = new StringBuilder();
		sbRequestID.append("1")
			.append(PROCESSING_TYPE)
			.append(webNewBean.sendMessageString(CommonInfoCFConst.SYSID_06, X31CWebConst.DATABEAN_GET_VALUE))
			.append(argOpeDateTimeStamp);
		parentMap.put(KEY_REQUEST_ID, sbRequestID.toString());
		// ＫＥＹ＿運用日時
		parentMap.put(KEY_OPERATE_DATETIME, argOpeDateTimeStamp);
		// ＫＥＹ＿処理区分
		parentMap.put(KEY_PROCESSING_TYPE, PROCESSING_TYPE);
		// ＫＥＹ＿キャンペーンコード
		parentMap.put(KEY_DISCOUT_CODE, serviceFormBean.sendMessageString(FUW00928SFConst.MINEO_SETPLAN_WRIB_CD, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿サービス契約番号
		parentMap.put(KEY_SERIVCE_NUM, eoNetBean.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_11, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿SYSID
		parentMap.put(KEY_SYSID, webNewBean.sendMessageString(CommonInfoCFConst.SYSID_06, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿請求先番号
		parentMap.put(KEY_INVOICE_NUM, "");
		// ＫＥＹ＿料金グループ
		String strFeeGroup = eoNetBean.sendMessageString(CommonInfoCFConst.PRC_GRP_CD_11, X31CWebConst.DATABEAN_GET_VALUE);
		parentMap.put(KEY_FEE_GROUP, strFeeGroup);
		// ＫＥＹ＿契約者住所コード
		if (JFUStrConst.CD00133_02.equals(strFeeGroup)) {
			// 料金グループコード eo光ネットホームタイプの場合は、ＰＡＳＣＯ情報 住所コード
			parentMap.put(KEY_CONTRACTOR_ADDRESS_CODE, pascoBean.sendMessageString(CommonInfoCFConst.ADDCD_07, X31CWebConst.DATABEAN_GET_VALUE));
		} else {
			// 料金グループコード eo光ネットホームタイプ以外の場合は、マンション情報 マンション物件住所コード
			parentMap.put(KEY_CONTRACTOR_ADDRESS_CODE, mansionBean.sendMessageString(CommonInfoCFConst.MANSION_BUKKEN_AD_CD_16, X31CWebConst.DATABEAN_GET_VALUE));
		}
		// ＫＥＹ＿サービス
		parentMap.put(KEY_SERVICE, JFUStrConst.CD00130_01);
		// ＫＥＹ＿料金コース
		parentMap.put(KEY_FEE_COURCE, eoNetBean.sendMessageString(CommonInfoCFConst.PCRS_CD_11, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿料金プラン
		parentMap.put(KEY_FEE_PLAN, eoNetBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_11, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿契約形態コード
		parentMap.put(KEY_CONTRACT_FORM, mansionBean.sendMessageString(CommonInfoCFConst.PAYWAY_CD_16, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿申込日
		parentMap.put(KEY_SUBSCRIPTION_DATE, argOpeDateTimeStamp.substring(0, 8));
		// ＫＥＹ＿照査日
		parentMap.put(KEY_INSPECTION_DATE, argOpeDateTimeStamp.substring(0, 8));
		// ＫＥＹ＿受付番号
		parentMap.put(KEY_ACCEPTANCE_NUM, keiSvcBean.sendMessageString(CommonInfoCFConst.MSKMSHO_NO_10, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿契約状態
		parentMap.put(KEY_CONTRACT_CONDITION, JFUStrConst.CD00037_020);
		// ＫＥＹ＿利用場所住所コード
		parentMap.put(KEY_USINGPLACE_ADDRESS_CODE, "");
		// ＫＥＹ＿回線内訳番号
		parentMap.put(KEY_LINE_NUM, keiSvcBean.sendMessageString(CommonInfoCFConst.SVC_KEI_KAISEN_UCWK_NO_10, X31CWebConst.DATABEAN_GET_VALUE));
		// ＫＥＹ＿入力mineo受付番号・電話番号 */
		parentMap.put(KEY_INPUT_MINE_NUM, strMineoSetPlanNo.toString());
		// ＫＥＹ＿入力解除メール通知有無1
		parentMap.put(KEY_KEI_1_MAIL_SEND_FLAG, JFUStrConst.EMPTY);
		// ＫＥＹ＿入力解除メール通知有無2
		parentMap.put(KEY_KEI_2_MAIL_SEND_FLAG, JFUStrConst.EMPTY);
		
		outputMap.put(JFUMINEO_SETPLANR_ENKEI_CC, parentMap);

		return outputMap;
	}

	/**
	 * 下りマッピングをする
	 * @param bean [0]：サービスフォームBean
	 * @param outputMap 設定値格納マップ
	 * @return X31SDataBeanAccess[] サービスフォームBean
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getFUSV030401CC(X31SDataBeanAccess[] bean, HashMap<String, Object> outputMap)
	{
		return bean;
	}
// ANK-3436-00-00 ADD END
// ANK-3473-00-00 ADD START
	/**
	 * キャンペーンチェックCC上りマッピングをする
	 * 
	 * @param bean　[0]：共有フォームBean　[1]：サービスフォームBean
	 * @param outputMap
	 * @param func_code　機能コード
	 * @return outputMap
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public HashMap setJFUGetCampaignListCC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) throws Exception
	{
		if (bean == null)
		{
			return null;
		}
		if (bean.length != 2)
		{
			return null;
		}
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		// WEB新規情報
		X31SDataBeanAccess bnWebinfo = getWebInfo(bean[0]);
		// パラメータ設定
		// 汎用コードリストを取得
		X31SDataBeanAccessArray hanyoInfoBeanList = bnWebinfo.getDataBeanArray(CommonInfoCFConst.HANYO_CD_LIST);
		for (int i = 0; i < hanyoInfoBeanList.getCount(); i++)
		{
			X31SDataBeanAccess hanyoInfoBean = hanyoInfoBeanList.getDataBean(i);
			if(!JFUStrConst.EMPTY.equals((String)hanyoInfoBean.sendMessageString(CommonInfoCFConst.HANYO_CD_46, X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// 選択されているキャンペーンコード
				parentMap.put(IN_CAMPAIGN_CD, (String)hanyoInfoBean.sendMessageString(CommonInfoCFConst.HANYO_CD_46, X31CWebConst.DATABEAN_GET_VALUE));
				// 選択されているキャンペーンの種別
				parentMap.put(IN_CAMPAIGN_SBTCD, (String)hanyoInfoBean.sendMessageString(CommonInfoCFConst.HANYO_SBT_CD_46, X31CWebConst.DATABEAN_GET_VALUE));
			}
		}
		outputMap.put(JFUGETCAMPAIGNLISTCC, parentMap);

		return outputMap;
	}
// ANK-3473-00-00 ADD END
}