/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddMskmDmenCC
*   ソースファイル名：JFUAddMskmDmenCC.java
*   作成者          ：富士通
*   日付            ：2012年08月09日
*＜機能概要＞
*   申込断面登録コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/08/09   FJ)山下     新規作成
*	v4.01       2012/09/10   FJ)岩元     申込断面更新に更新前更新年月日時分秒を追加
*   v4.02  		2012/11/13   FJ)大村    【IT2-20120001671】申込断面種別コードの設定障害対応
*   v4.03       2012/11/26   FJ)橋本    【IT2-2012-0001798】オーダリングサービス選択コード設定障害対応
*   v4.04		2012/11/27   FJ)大塚    【IT2-2012-0001790】
*   v4.05  		2012/11/13   FJ)大村    「IT2-2012-0001949」対応（更新漏れ項目追加）
*   V4.06       2012/12/18   FJ)長沢    【TAI-2012-0000136-129】申込断面スキーマ追加項目対応
*   V4.07       2013/03/25   FJ)楠本    【ST3-2013-0000817】契約者情報・氏名結合対応
*   V4.08       2013/09/19   FJ)岡井    【OM-2013-0002330】量販訪販承認フラグ対応
*   V20.00      2015/11/20   FJ)岡井    【ANK-2565-00-00】クレカ番号預かりサービス導入(STEP3)
*   V24.00      2016/04/19   FJ) 横山    変更【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応
*   v29.00.00   2017/02/15   FJ) 謝     【ANK-3112-00-00】訪販チャネルのタブレット対応
*   v39.00.00   2018/11/16   FJ) 謝     【ANK-3518-00-00】量販・訪販Webのサービス追加
*   v50.00.00   2020/06/03   FJ) 美濃原 【ANK-3825-00-00】メッシュWiFi導入対応
*   v58.00.00   2022/05/09   FJ) 新谷   【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
*   v66.00.00   2023/4/8	 FJ) 西川   【ANK-4397-00-00】価格COM経由申込のフロンティア巻取り対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.common.JCMConstants;

import eo.common.constant.JFUStrConst;
import eo.common.util.JCCMapConvXml;
import eo.common.util.JPCConvertString;
import eo.ejb.cbs.cbsmsg.EKK0531B501CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK2501C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2501D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2511C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2511D010CBSMsg;

/**
 * 申込断面登録コモンコンポーネント部品.
 * <br>
 * @author 富士通
 */
public class JFUChgMskmDmenCC extends JFUBaseCC
{
	/** サービスインターフェイスID：申込断面登録 */
	private static final String SVIF_ID_EKK2501C010 = "EKK2501C010";
	/** サービスインターフェイスID：申込断面明細登録 */
	private static final String SVIF_ID_EKK2511C010 = "EKK2511C010";

	/** 申込断面登録 IN項目リスト */
	private static final List<String> IN_COLUMN_LIST_EKK2501C010 = Arrays.asList(EKK2501C010CBSMsg.MSKMSHO_NO, // 申込書番号
			EKK2501C010CBSMsg.AGNT_CD_1_1, // 代理店コード1-1
			EKK2501C010CBSMsg.AGNT_CD_1_2, // 代理店コード1-2
			EKK2501C010CBSMsg.AGNT_CD_2_1, // 代理店コード2-1
			EKK2501C010CBSMsg.AGNT_CD_2_2, // 代理店コード2-2
			EKK2501C010CBSMsg.MKM_UK_SBT_CD, // 申込受付種別コード
			EKK2501C010CBSMsg.MSKMSHO_SBT_CD, // 申込書種別コード
			EKK2501C010CBSMsg.NEW_ADD_SKBT_FLG, // 新規追加識別フラグ
			// IT2-2012-0001798 2012/11/27 k.hashimoto start
			EKK2501C010CBSMsg.ORDERING_SVC_CHOICE_CD, // オーダリングサービス選択
			// IT2-2012-0001798 2012/11/27 k.hashimoto end
			EKK2501C010CBSMsg.SHONIN_ZUMI_FLG, // 承認済フラグ
// ANK-3112-00-00 ADD START
			EKK2501C010CBSMsg.MSKM_DMEN_COMMENT, // 申込断面コメント
// ANK-3112-00-00 ADD END
			EKK2501C010CBSMsg.UPD_DTM_BF,		// 更新前更新年月日時分秒
			// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa start
			EKK2501C010CBSMsg.CUST_KANA, // お客様カナ名
			EKK2501C010CBSMsg.KEISHA_TELNO, // 契約者電話番号
			EKK2501C010CBSMsg.KAISEN_PLACE_ADRTTM // 回線場所住所補記・建物名
			// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa end
			);
	/** 申込断面明細登録 IN項目リスト */
	private static final List<String> IN_COLUMN_LIST_EKK2511C010 = Arrays.asList(EKK2511C010CBSMsg.MSKMSHO_NO, // 申込書番号
			EKK2511C010CBSMsg.MSKM_DMEN_DTL_NO, // 申込断面明細番号
			EKK2511C010CBSMsg.MSKM_DMEN_SBT_CD, // 申込断面種別コード
			//「IT2-2012-0001949」対応（更新漏れ項目追加） >>>
			EKK2511D010CBSMsg.MSKM_DMEN_DTL_STKU_DTM,// 申込断面明細取得年月日時分秒
			//「IT2-2012-0001949」対応（更新漏れ項目追加） <<<
			EKK2511C010CBSMsg.MSKM_DMEN_DTL_CHG_DTM, // 申込断面明細変更年月日時分秒
			EKK2511C010CBSMsg.MSKM_NAIYO, // 申込内容
			//「IT2-2012-0001949」対応（更新漏れ項目追加） >>>
			EKK2511D010CBSMsg.CHOHYO_OPUT_FLG // 帳票出力済フラグ
			//「IT2-2012-0001949」対応（更新漏れ項目追加） <<<
			);

	/** オーソリ初回依頼CC作業領域キー */
	private static final String CC_WORK_AREA_NAME = "JFUAuthCheckCCWork";

	/** クレジットカード番号預りID(クリアパス) */
	private static final String CR_SAVE_ID = "cr_save_id";
	/** 申込断面XML変換タグ：クレジットカード番号預りID 開始 */
	private static final String DMEN_CRECARD_NO_AZKRI_ID_START = "<crecard_no_azkri_id>";
	/** 申込断面XML変換タグ：クレジットカード番号預りID 終了 */
	private static final String DMEN_CRECARD_NO_AZKRI_ID_END = "</crecard_no_azkri_id>";
	//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 start
	/** 問合せ用カード番号(クリアパス) */
	private static final String CR_INQUIRE_CARD_NO = "cr_inquire_card_no";
	/** 申込断面XML変換タグ：クレジットカード番号1 開始 */
	private static final String DMEN_CRECARD_NO_1_START = "<crecard_no1>";
	/** 申込断面XML変換タグ：クレジットカード番号1 終了 */
	private static final String DMEN_CRECARD_NO_1_END = "</crecard_no1>";
	/** 申込断面XML変換タグ：クレジットカード番号2 開始 */
	private static final String DMEN_CRECARD_NO_2_START = "<crecard_no2>";
	/** 申込断面XML変換タグ：クレジットカード番号2 終了 */
	private static final String DMEN_CRECARD_NO_2_END = "</crecard_no2>";
	/** 申込断面XML変換タグ：クレジットカード番号3 開始 */
	private static final String DMEN_CRECARD_NO_3_START = "<crecard_no3>";
	/** 申込断面XML変換タグ：クレジットカード番号3 終了 */
	private static final String DMEN_CRECARD_NO_3_END = "</crecard_no3>";
	/** 申込断面XML変換タグ：クレジットカード番号4 開始 */
	private static final String DMEN_CRECARD_NO_4_START = "<crecard_no4>";
	/** 申込断面XML変換タグ：クレジットカード番号4 終了 */
	private static final String DMEN_CRECARD_NO_4_END = "</crecard_no4>";
	//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 end

	/** 連携用文言マップ */
	private static final String WORK_STRCONST_MAP = "WORK_STRCONST_MAP";
	/** eo光ネットオプション[申込断面明細]：通信機器レンタルサービス */
	private static final String NET_OP_KKTKSVC_DMEN_MNGN = "NET_OP_KKTKSVC_DMEN_MNGN";
	/** 申込断面XML変換タグ：PLC申込（通信機器レンタルサービス） 開始 */
	private static final String DMEN_PLC_MSKM_START = "<plc_mskm>";
	/** 申込断面XML変換タグ：PLC申込（通信機器レンタルサービス） 終了 */
	private static final String DMEN_PLC_MSKM_END = "</plc_mskm>";

	/** クレジットカード会社一覧スキーマ */
	private static final String EKK0531B501CBSMsg1_List = "EKK0531B501CBSMsg1List";
	/** クレジットカード番号預りID(顧客ID)(ペイジェント) */
	private static final String PY_CUSTOMER_ID = "py_customer_id";
	/** マスクされたカード番号(ペイジェント) */
	private static final String PY_MASKED_CARD_NUMBER = "py_masked_card_number";
	/** カードブランド(ペイジェント) */
	private static final String PY_CARD_BRAND = "py_card_brand";
	/** 申込断面XML変換タグ：クレジットカード会社コード 開始 */
	private static final String DMEN_CRECARD_COMP_CD_START = "<crecard_comp_cd>";
	/** 申込断面XML変換タグ：クレジットカード会社コード 終了 */
	private static final String DMEN_CRECARD_COMP_CD_END = "</crecard_comp_cd>";
	/** 申込断面XML変換タグ：クレジットカード会社名 開始 */
	private static final String DMEN_CRECARD_COMP_NM_START = "<crecard_comp_nm>";
	/** 申込断面XML変換タグ：クレジットカード会社名 終了 */
	private static final String DMEN_CRECARD_COMP_NM_END = "</crecard_comp_nm>";

	/**
	 * 申込断面登録処理.<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	public IRequestParameterReadWrite chgMskmDmen(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		JFUBPCommon.printBpDebugLog(this.getClass(), "■■■ chgMskmDmen start ■■■");

		// EKK2501C010 上りマッピング
		this.setEKK2501C010(param, fixedText);

		// EKK2501C010 実行
		super.executeSC(handle, param, SVIF_ID_EKK2501C010, SVIF_ID_EKK2501C010, BLANK, IN_COLUMN_LIST_EKK2501C010, BLANK);

		// EKK2511C0101 上りマッピング
		this.setEKK2511C010(param, fixedText);

		// EKK2511C010 実行
		super.executeSC(handle, param, SVIF_ID_EKK2511C010, SVIF_ID_EKK2511C010, BLANK, IN_COLUMN_LIST_EKK2511C010, BLANK);

		JFUBPCommon.printBpDebugLog(this.getClass(), "■■■ chgMskmDmen end ■■■");

		return param;
	}

	/**
	 *  申込断面XMLCCの結果から取得したテンプレートXMLを取得する。
	 *  
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return 申込断面XMLコモンコンポーネント部品から取得したXML
	 * @throws RequestParameterException フレームワーク例外
	 * @throws CCException 申込断面XMLコンポーネント部品から結果を取得できない場合スローする。
	 */
	@SuppressWarnings("unchecked")
	private String getMskmDmenXml(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException, CCException
	{
		// 申込断面XMLCCの結果を取得する。
		HashMap mskmDmenCCResultMap = (HashMap)param.getData(fixedText);

		if (mskmDmenCCResultMap == null)
		{
			throw new CCException("申込断面XMLの結果が取得できません。", new Exception());
		}

		if (!mskmDmenCCResultMap.containsKey(JFUStrConst.MSKM_DMEN_XMLCC_OUT_MSKM_NAIYO))
		{
			throw new CCException("申込断面XMLの結果からテンプレートXMLが取得できません。", new Exception());
		}

		// 申込内容(申込断面XML)
		String mskmNaiyo = (String)mskmDmenCCResultMap.get(JFUStrConst.MSKM_DMEN_XMLCC_OUT_MSKM_NAIYO);

		// 特殊マッピング
		HashMap<String, Object> workStrMap = (HashMap<String, Object>)param.getData(WORK_STRCONST_MAP);
		mskmNaiyo = specialMapping(param, mskmNaiyo, workStrMap);

		// テンプレート化された結果を返却
		return mskmNaiyo;
	}

	/**
	 * 申込断面XMLコモンコンポーネント部品の結果から取得したテンプレートXMLをHashMapに変換する。
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return 申込断面XMLコモンコンポーネント部品の結果から取得したテンプレートXMLをHashMapに変換したオブジェクト
	 * @throws RequestParameterException
	 * @throws SAXException
	 * @throws ParserConfigurationException
	 * @throws IOException
	 * @throws CCException 
	 */
	private HashMap getMskmDmenXmlMap(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException, SAXException,
			ParserConfigurationException, IOException, CCException
	{

		// テンプレート化された結果を取得
		String templateXml = this.getMskmDmenXml(param, fixedText);

		// テンプレートXMLからHashMapに変換
		JCCMapConvXml conv = new JCCMapConvXml();
		return conv.getParseXmlToMap(templateXml);
	}

	/**
	 * 申込断面XMLCCの結果から申込書番号を取得する。
	 * @param param
	 * @return
	 * @throws RequestParameterException
	 * @throws CCException
	 * @throws IOException 
	 * @throws ParserConfigurationException 
	 * @throws SAXException 
	 */
	private String getMskmshoNo(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException, CCException, SAXException, ParserConfigurationException, IOException
	{

		// WEB新規情報を取得
		HashMap web_new_info_map = this.getTargetDataBeanInfo(this.getMskmDmenXmlMap(param, fixedText), "web_new_info");

		if (web_new_info_map == null) {
			throw new CCException("申込断面XMLから、WEB新規情報を取得できません。", new Exception());
		}

		// 契約サービス情報を取得
		HashMap keiyaku_svc_info_map = (HashMap)web_new_info_map.get("keiyaku_svc_info");

		if (keiyaku_svc_info_map == null) {
			throw new CCException("WEB新規情報から、契約サービス情報を取得できません。", new Exception());
		}

		if (!keiyaku_svc_info_map.containsKey("mskmsho_no")) {
			throw new CCException("サービス契約情報から、申込書番号を取得できません。", new Exception());
		}

		// 申込書番号を取得
		return (String)keiyaku_svc_info_map.get("mskmsho_no");
	}

	/**
	 * EKK2501C0101へ上りマッピング
	 * @param templateMap 
	 * @param param
	 * @throws RequestParameterException
	 * @throws CCException
	 * @throws IOException 
	 * @throws ParserConfigurationException 
	 * @throws SAXException 
	 */
	private void setEKK2501C010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException, CCException, SAXException,
			ParserConfigurationException, IOException
	{

		// 上りマッピング
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SVIF_ID_EKK2501C010);

		if (inMap == null)
		{
			inMap = new HashMap();

			param.setData(SVIF_ID_EKK2501C010, inMap);
		}

		// 機能コード 1固定
		inMap.put(JCMConstants.FUNC_CODE_KEY, "1");

		// 申込断面XMLコモンコンポーネント部品の結果から、テンプレートを取得する。
		HashMap templateMap = this.getMskmDmenXmlMap(param, fixedText);

		// WEB新規情報を取得
		HashMap web_new_info_map = this.getTargetDataBeanInfo(templateMap, "web_new_info");

		if (web_new_info_map == null) {
			throw new CCException("申込断面XMLから、WEB新規情報を取得できません。", new Exception());
		}

		// その他情報を取得
		HashMap else_info_map = (HashMap)web_new_info_map.get("else_info");
		// リダイレクト情報を取得
		HashMap redirect_info_map = (HashMap)web_new_info_map.get("redirect_info");
		// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa start
		// 契約者情報を取得
		HashMap keiyakusha_info_map = (HashMap)web_new_info_map.get("keiyakusha_info");
		// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa end
		
		// IT2-2012-0001798 2012/11/27 k.hashimoto START
		// 契約サービス情報を取得
		HashMap keiyaku_svc_info_map = (HashMap)web_new_info_map.get("keiyaku_svc_info");
		// ｅｏ光テレビを取得
		HashMap eotv_map = (HashMap)web_new_info_map.get("eotv");
		// IT2-2012-0001798 2012/11/27 k.hashimoto END
		
		
		// 采番SCの結果から申込書番号を取得し、設定する。
		inMap.put(EKK2501C010CBSMsg.MSKMSHO_NO, this.getMskmshoNo(param, fixedText));
		// その他情報.取扱店用取扱コード→代理店コード1-1 toriten_toriatsukai_cd
		inMap.put(EKK2501C010CBSMsg.AGNT_CD_1_1, (String)else_info_map.get("toriten_toriatsukai_cd"));
		// その他情報.担当者用取扱コード→代理店コード1-2 tntsha_toriatsukai_cd
		inMap.put(EKK2501C010CBSMsg.AGNT_CD_1_2, (String)else_info_map.get("tntsha_toriatsukai_cd"));
		// その他情報.取扱店用取扱コード→代理店コード2-1 toriten_toriatsukai_cd2
		inMap.put(EKK2501C010CBSMsg.AGNT_CD_2_1, (String)else_info_map.get("toriten_toriatsukai_cd2"));
		// NULL→代理店コード2-2
		inMap.put(EKK2501C010CBSMsg.AGNT_CD_2_2, JFUBPCommon.nvl((String)else_info_map.get("toriten_toriatsukai_cd2_2"), JFUStrConst.EMPTY));

		// WEB新規情報.販売タイプを取得
		String hanbai_type = (String)web_new_info_map.get("hanbai_type");

		// 申込受付種別コード
		String mkm_uk_sbt_cd = null;

		// TODO 定数
		// 販売タイプがコンシューマの場合
		if (JFUStrConst.HNBAI_TYPE_CON.equals(hanbai_type))
		{
			mkm_uk_sbt_cd = "4";
		}
		// 販売タイプが量販の場合
		else if (JFUStrConst.HNBAI_TYPE_RYOHAN.equals(hanbai_type))
		{
			mkm_uk_sbt_cd = "2";
		}
		// 販売タイプが訪販の場合
		else if (JFUStrConst.HNBAI_TYPE_HOHAN.equals(hanbai_type))
		{
			mkm_uk_sbt_cd = "5";
		}
		// 販売タイプが提携住宅会社の場合
		else if (JFUStrConst.HNBAI_TYPE_TKJCOMP.equals(hanbai_type))
		{
			mkm_uk_sbt_cd = "0";
		}

		inMap.put(EKK2501C010CBSMsg.MKM_UK_SBT_CD, mkm_uk_sbt_cd);

		// リダイレクト情報.ナビゲーションパターンを取得
		String navigator_ptn = (String)redirect_info_map.get("navigator_ptn");
		// WEB新規情報.申込回線サービスを取得
		String mskm_ksn_svc = (String)web_new_info_map.get("mskm_ksn_svc");
		// WEB新規情報.申込マンションタイプを取得
		String mskm_mns_type = (String)web_new_info_map.get("mskm_mns_type");

		// 申込書種別コード
		String mskmsho_sbt_cd = null;

		// ナビゲーションパターンがモバイル単独の場合
		if (JFUStrConst.NAVI_PTN_MOBILE_SNGL.equals(navigator_ptn)) // IT2-2012-1790 2012/11/26 Otsuka
		{
			mskmsho_sbt_cd = "5";
		}
		// 申込回線サービスがホームタイプの場合
		else if (JFUStrConst.MSKM_KSN_SVC_HOME.equals(mskm_ksn_svc))
		{
			mskmsho_sbt_cd = "1";
		}
		// 申込回線サービスがマンションタイプの場合
		else if (JFUStrConst.MSKM_KSN_SVC_MANSION.equals(mskm_ksn_svc))
		{

			// 申込マンションタイプがマンションの場合
			if (JFUStrConst.MSKM_MNS_TYPE_MANSION.equals(mskm_mns_type))
			{
				mskmsho_sbt_cd = "2";
			}
			// 申込マンションタイプがメゾンの場合
			else if (JFUStrConst.MSKM_MNS_TYPE_MEZON.equals(mskm_mns_type))
			{
				mskmsho_sbt_cd = "3";
			}
		}

		inMap.put(EKK2501C010CBSMsg.MSKMSHO_SBT_CD, mskmsho_sbt_cd);

		// WEB新規情報.申込区分（種別）を取得
		String mskm_kbn = (String)web_new_info_map.get("mskm_kbn");

		// 新規追加識別フラグ
		String new_add_skbt_flg = null;

		// 申込区分（種別）が"1"(新規申込)の場合
		if (JFUStrConst.MSKM_KBN_NEW.equals(mskm_kbn))
		{
			new_add_skbt_flg = "1";
		}

		// 申込区分（種別）が"2"(追加申込)の場合
		else if (JFUStrConst.MSKM_KBN_ADD.equals(mskm_kbn))
		{
			new_add_skbt_flg = "2";
		}

		inMap.put(EKK2501C010CBSMsg.NEW_ADD_SKBT_FLG, new_add_skbt_flg);

		
		// オーダリングサービス選択コード
		// IT2-2012-0001798 2012/11/27 k.hashimoto START
		//inMap.put(EKK2501D010CBSMsg.ORDERING_SVC_CHOICE_CD, null);
		// 契約サービス情報.選択サービス（ネット）を取得
		String select_svc_net = (String)keiyaku_svc_info_map.get("select_svc_net");
		// 契約サービス情報.選択サービス（電話）を取得
		String select_svc_tel = (String)keiyaku_svc_info_map.get("select_svc_tel");
		// 契約サービス情報.選択サービス（テレビ）を取得
		String select_svc_tv = (String)keiyaku_svc_info_map.get("select_svc_tv");
		// 契約サービス情報.選択サービス（モバイル）を取得
		String select_svc_mobile = (String)keiyaku_svc_info_map.get("select_svc_mobile");
		// ｅｏ光テレビ.テレビコースを取得
		String tv_course = (String)eotv_map.get("tv_course");
		
		// オーダリングサービス選択コード
		String ordering_svc_choice_cd = null;
	
		if (JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋電話＋テレビの場合
			ordering_svc_choice_cd = "01";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋電話の場合
			ordering_svc_choice_cd = "02";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋テレビの場合
			ordering_svc_choice_cd = "03";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// 電話＋テレビの場合
			ordering_svc_choice_cd = "04";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネットの場合
			ordering_svc_choice_cd = "05";
			
		}else if( !JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile) && !JFUStrConst.TV_COURSE_KCN.equals(tv_course)) {
			// テレビ(KCN単独以外)の場合
			ordering_svc_choice_cd = "06";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋電話＋テレビ＋モバイルの場合
			ordering_svc_choice_cd = "07";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋電話＋モバイルの場合
			ordering_svc_choice_cd = "08";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋テレビ＋モバイルの場合
			ordering_svc_choice_cd = "09";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// 電話＋テレビ＋モバイルの場合
			ordering_svc_choice_cd = "10";
			
		}else if(JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// ネット＋モバイルの場合
			ordering_svc_choice_cd = "11";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net)  && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// テレビ＋モバイルの場合
			ordering_svc_choice_cd = "12";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net)  && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// モバイルの場合
			ordering_svc_choice_cd = "13";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net)  && !JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile) && JFUStrConst.TV_COURSE_KCN.equals(tv_course)) {
			// テレビ(KCN)の場合
			ordering_svc_choice_cd = "14";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && !JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// 電話の場合
			ordering_svc_choice_cd = "15";
			
		}else if(!JFUStrConst.SELECT_SVC_NET_CHOICE.equals(select_svc_net) && JFUStrConst.SELECT_SVC_TEL_CHOICE.equals(select_svc_tel) 
				&& !JFUStrConst.SELECT_SVC_TV_CHOICE.equals(select_svc_tv) && JFUStrConst.SELECT_SVC_MOBILE_CHOICE.equals(select_svc_mobile)) {
			// 電話＋モバイルの場合
			ordering_svc_choice_cd = "16";
			
		}
		inMap.put(EKK2501D010CBSMsg.ORDERING_SVC_CHOICE_CD, ordering_svc_choice_cd);
		
		// 承認済フラグ
		// inMap.put(EKK2501C010CBSMsg.SHONIN_ZUMI_FLG, "1");
		String shonin_zumi_flg = null;
		// 申込区分２が"1"(本申込)の場合
		if (JFUStrConst.MSKM_KBN_HON.equals((String)web_new_info_map.get("mskm_kbn2")))
		{
			shonin_zumi_flg = "1";

			// OM-2013-0002330：販売タイプが量販訪販の場合、未承認で登録する
			if (JFUStrConst.HNBAI_TYPE_RYOHAN.equals(hanbai_type) || JFUStrConst.HNBAI_TYPE_HOHAN.equals(hanbai_type))
			{
				shonin_zumi_flg = "0";
// ANK-3518-00-00 ADD START
				// 申込区分（種別）が"2"(追加申込)の場合
				if (JFUStrConst.MSKM_KBN_ADD.equals(mskm_kbn))
				{
					shonin_zumi_flg = "1";
				}
// ANK-3518-00-00 ADD END
			}
		}

		// 申込区分２が"2"(仮申込)の場合
		else if (JFUStrConst.MSKM_KBN_KARI.equals((String)web_new_info_map.get("mskm_kbn2")))
		{
			shonin_zumi_flg = "0";

			// OM-2013-0002330：販売タイプが量販訪販の場合、未承認で登録する
			if (JFUStrConst.HNBAI_TYPE_RYOHAN.equals(hanbai_type) || JFUStrConst.HNBAI_TYPE_HOHAN.equals(hanbai_type))
			{
				shonin_zumi_flg = "0";
			}
		}

		inMap.put(EKK2501D010CBSMsg.SHONIN_ZUMI_FLG, shonin_zumi_flg);
		// IT2-2012-0001798 2012/11/27 k.hashimoto END

		// 申込断面システム情報取得
		HashMap mskm_dmen_sys_info = (HashMap)param.getData("mskm_dmen_sys_info");

// ANK-3112-00-00 ADD START
		// 申込断面コメント
		inMap.put(EKK2501C010CBSMsg.MSKM_DMEN_COMMENT, mskm_dmen_sys_info.get("mskm_dmen_comment"));
// ANK-3112-00-00 ADD END

		// 更新前更新年月日時分秒
		inMap.put(EKK2501C010CBSMsg.UPD_DTM_BF, mskm_dmen_sys_info.get("upd_dtm_bf"));

		// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa start
		// WEB新規情報.契約種別を取得
		String kei_sbt = (String)web_new_info_map.get("kei_sbt");
		// お客様カナ名
		String cust_kana = null;
		if (JFUStrConst.KEI_SBT_KOJINCD.equals(kei_sbt))
		{
			// 個人の場合、契約者情報.氏名かな（姓）＋（名）を設定する
			cust_kana = getKshNm(keiyakusha_info_map);
		} else if (JFUStrConst.KEI_SBT_HOJINCD.equals(kei_sbt))
		{
			// 法人の場合、契約者情報.法人名（かな）を設定する
			cust_kana = JPCConvertString.convFullHiraToFullKata((String)keiyakusha_info_map.get("hojinkn"));
		}
		inMap.put(EKK2501C010CBSMsg.CUST_KANA, cust_kana);
		
		// 契約者電話番号
		String ksh_telno1 = (String)keiyakusha_info_map.get("ksh_telno1");
		String ksh_telno2 = (String)keiyakusha_info_map.get("ksh_telno2");
		String ksh_telno3 = (String)keiyakusha_info_map.get("ksh_telno3");
		String ksh_telno = "";
		if(!isNullOrEmpty(ksh_telno1))
		{
			ksh_telno = ksh_telno + ksh_telno1;
		}
		if(!isNullOrEmpty(ksh_telno2))
		{
			ksh_telno = ksh_telno + ksh_telno2;
		}
		if(!isNullOrEmpty(ksh_telno3))
		{
			ksh_telno = ksh_telno + ksh_telno3;
		}
		
		inMap.put(EKK2501D010CBSMsg.KEISHA_TELNO, ksh_telno);
		
		// 回線場所住所補記・建物名
		inMap.put(EKK2501C010CBSMsg.KAISEN_PLACE_ADRTTM, (String)keiyakusha_info_map.get("ksh_ttm"));
		// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa end
	}

	/**
	 * 申込断面XMLMapから、指定したデータタイプBean名の指定した項目の値を取得する。
	 * @param templateMap 申込断面XMLをHashMapに変換したオブジェクト
	 * @param dataTypeName データタイプBean名
	 * @param columnName データタイプBeanの項目名
	 * @return 指定したデータタイプBeanの項目値
	 */
	private HashMap getTargetDataBeanInfo(HashMap templateMap, String dataTypeName)
	{

		// テンプレートMapがNULLの場合
		if (templateMap == null)
		{
			// NULLを返却する。
			return null;
		}

		// データタイプBean名が指定されていない場合
		if (dataTypeName == null || "".equals(dataTypeName))
		{
			// NULLを返却する。
			return null;
		}

		// テンプレートMapの要素分繰り返す。
		Iterator ite = templateMap.entrySet().iterator();

		// 第1階層(申込断面XMLヘッダ階層)ループ
		while (ite.hasNext())
		{
			// テンプレートMapの要素を取得
			Object tempObj = ite.next();

			// Entry型でない場合
			if (!(tempObj instanceof Entry))
			{
				// 次の要素へ以降する。
				continue;
			}

			// Entry型にキャストする。
			Entry tempEntry = (Entry)tempObj;

			// keyを取得
			String entryKey = (String)tempEntry.getKey();

			// valueを取得
			Object entryValue = tempEntry.getValue();

			// keyが"VALUE"で、かつ、valueがArrayListである場合以外
			if (!("VALUE".equals(entryKey) && entryValue instanceof ArrayList))
			{
				// 次の要素へ以降する。
				continue;
			}

			// valueをArrayListへキャスト
			ArrayList entryList = (ArrayList)entryValue;

			// リストの要素分繰り返す。
			Iterator entryIte = entryList.iterator();

			// 第2階層(データタイプBean階層)ループ
			while (entryIte.hasNext())
			{

				// リストの要素を取得
				Object entryObj = entryIte.next();

				// リストの要素がHashMapでない場合
				if (!(entryObj instanceof HashMap))
				{
					// 次のリストの要素へ以降。
					continue;
				}

				// リストの要素をHashMapへキャスト
				HashMap entryDtlMap = (HashMap)entryObj;

				// HashMapに"ELEMENT"と"VALUE"が格納されていない場合
				if (!(entryDtlMap.containsKey("ELEMENT") && entryDtlMap.containsKey("VALUE")))
				{
					// 次の要素へ以降
					continue;
				}

				// ELEMENTを取得
				String targetDataBeanName = (String)entryDtlMap.get("ELEMENT");

				// コメントの場合
				if (targetDataBeanName.length() > 0 && targetDataBeanName.equals("<")) {
					continue;
				}

				// ELEMENTが指定されたデータタイプBean名の場合
				if (dataTypeName.equals(targetDataBeanName))
				{
					// VALUEを取得
					Object entryDtlValue = entryDtlMap.get("VALUE");

					if (!(entryDtlValue instanceof ArrayList))
					{
						continue;
					}

					ArrayList columnList = (ArrayList)entryDtlValue;

					Iterator columnIte = columnList.iterator();

					// 取得するデータタイプBeanの項目情報を格納するMap
					HashMap targetBeanMap = new HashMap();

					// 第3階層(データタイプBeanの項目階層)ループ
					while (columnIte.hasNext())
					{

						// 項目要素を取得
						Object columnObj = columnIte.next();

						// HashMap型でない場合
						if (!(columnObj instanceof HashMap))
						{

							// 次の要素へ以降
							continue;
						}

						// HashMapへキャスト
						HashMap columnMap = (HashMap)columnObj;

						//
						String columnElement = (String)columnMap.get("ELEMENT");

						if (columnElement == null || columnElement.length() == 0) {
							continue;
						}

						// コメント無視
						if (columnElement.equals("<")) {
							continue;
						}

						ArrayList columnValueList = (ArrayList)columnMap.get("VALUE");

						if (columnValueList == null || columnValueList.size() == 0) {

							// 返却用Mapに項目名をkey、値をvalueとして格納する。
							targetBeanMap.put((String)columnMap.get("ELEMENT"), null);

							continue;
						}

						if (columnValueList.get(0) instanceof String) {

							// 返却用Mapに項目名をkey、値をvalueとして格納する。
							targetBeanMap.put((String)columnMap.get("ELEMENT"), (String)columnValueList.get(0));
						}

						else {

							HashMap childDataBeanMap = new HashMap();

							Iterator childDataBeanIte = columnValueList.iterator();

							while (childDataBeanIte.hasNext()) {
								HashMap c = (HashMap)childDataBeanIte.next();

								Object cValue = c.get("VALUE");

								String childDataBeanValue = null;
								if (cValue != null && cValue instanceof ArrayList) {
									ArrayList cList = (ArrayList)cValue;

									if (cList != null && cList.size() > 0 && cList.get(0) instanceof String) {
										childDataBeanValue = (String)cList.get(0);
									}
								}

								childDataBeanMap.put(c.get("ELEMENT"), childDataBeanValue);
							}

							// 返却用Mapに項目名をkey、値をvalueとして格納する。
							targetBeanMap.put((String)columnMap.get("ELEMENT"), childDataBeanMap);
						}
					}

					return targetBeanMap;
				}
			}
		}

		// 指定したデータタイプBean名、項目名で値が取得できなかった場合、NULLを返却する。
		return null;
	}

	/**
	 * EKK2511C0101へ上りマッピング
	 * @param param
	 * @throws RequestParameterException
	 * @throws CCException
	 * @throws IOException 
	 * @throws ParserConfigurationException 
	 * @throws SAXException 
	 */
	private void setEKK2511C010(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException, CCException, SAXException,
			ParserConfigurationException, IOException
	{

		// 上りマッピング
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(SVIF_ID_EKK2511C010);

		if (inMap == null)
		{
			inMap = new HashMap();

			param.setData(SVIF_ID_EKK2511C010, inMap);
		}

		HashMap templateMap = this.getMskmDmenXmlMap(param, fixedText);

		// WEB新規情報を取得
		HashMap web_new_info_map = this.getTargetDataBeanInfo(templateMap, "web_new_info");

		if (web_new_info_map == null) {
			throw new CCException("申込断面XMLから、WEB新規情報を取得できません。", new Exception());
		}

		// 機能コード→1固定
		inMap.put(JCMConstants.FUNC_CODE_KEY, "1");

		// 申込書番号
		inMap.put(EKK2511C010CBSMsg.MSKMSHO_NO, this.getMskmshoNo(param, fixedText));

		// 申込書明細番号→"01"固定
		inMap.put(EKK2511C010CBSMsg.MSKM_DMEN_DTL_NO, "01");

		// 申込断面種別コード
		String mskm_dmen_sbt_cd = null;

		// 申込区分２が"1"(本申込)の場合
		if (JFUStrConst.MSKM_KBN_HON.equals((String)web_new_info_map.get("mskm_kbn2")))
		{
			mskm_dmen_sbt_cd = "2";
		}

		// 申込区分２が"2"(仮申込)の場合
		else if (JFUStrConst.MSKM_KBN_KARI.equals((String)web_new_info_map.get("mskm_kbn2")))
		{
			mskm_dmen_sbt_cd = "1";
		}

		inMap.put(EKK2511C010CBSMsg.MSKM_DMEN_SBT_CD, mskm_dmen_sbt_cd);

		//「IT2-2012-0001949」対応（更新漏れ項目追加） >>>
		// 申込断面明細取得年月日時分秒→運用日付
		inMap.put(EKK2511C010CBSMsg.MSKM_DMEN_DTL_STKU_DTM, JFUBPCommon.getOpeDateTime(null));
		// 「IT2-2012-0001949」対応（更新漏れ項目追加） <<<

		// 申込断面明細変更年月日時分秒→運用日付
		inMap.put(EKK2511C010CBSMsg.MSKM_DMEN_DTL_CHG_DTM, JFUBPCommon.getOpeDateTime(null));

		// 申込内容→申込断面XMLコンポーネントからXMLを取得
		inMap.put(EKK2511C010CBSMsg.MSKM_NAIYO, this.getMskmDmenXml(param, fixedText));
		
		//「IT2-2012-0001949」対応（更新漏れ項目追加） EKK2511D010CBSMsg をEKK2511C010CBSMsgに変更>>>
		// IT2-2012-0001798 2012/11/27 k.hashimoto START
		// 帳票出力済フラグ→0固定
		inMap.put(EKK2511C010CBSMsg.CHOHYO_OPUT_FLG, "0");
		// IT2-2012-0001798 2012/11/27 k.hashimoto END
		//「IT2-2012-0001949」対応（更新漏れ項目追加） <<
		
	}

	/**
	 * 申込断面XML特殊マッピング処理
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param mskmDmenXmlStr 申込断面XML文字列
	 * @param workStrMap 連携用文言マップ
	 * @return
	 * @throws RequestParameterException 
	 */
	private String specialMapping(IRequestParameterReadWrite param, String mskmDmenXmlStr, HashMap<String, Object> workStrMap) throws RequestParameterException
	{
		// クレジットカード番号預りID
		//if(!JFUBPCommon.isNull(getWorkMapValue(param, CR_SAVE_ID, CC_WORK_AREA_NAME)))
		//{
			//mskmDmenXmlStr = mskmDmenXmlStr.replace(DMEN_CRECARD_NO_AZKRI_ID_START + DMEN_CRECARD_NO_AZKRI_ID_END,
			//		DMEN_CRECARD_NO_AZKRI_ID_START + getWorkMapValue(param, CR_SAVE_ID, CC_WORK_AREA_NAME) + DMEN_CRECARD_NO_AZKRI_ID_END);
		//}
		if(!JFUBPCommon.isNull(getWorkMapValue(param, PY_CUSTOMER_ID, CC_WORK_AREA_NAME)))
		{
			mskmDmenXmlStr = mskmDmenXmlStr.replace(DMEN_CRECARD_NO_AZKRI_ID_START + DMEN_CRECARD_NO_AZKRI_ID_END,
					DMEN_CRECARD_NO_AZKRI_ID_START + getWorkMapValue(param, PY_CUSTOMER_ID, CC_WORK_AREA_NAME) + DMEN_CRECARD_NO_AZKRI_ID_END);
		}

		//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 start
		// クレジットカード番号
		//if(!JFUBPCommon.isNull(getWorkMapValue(param, CR_INQUIRE_CARD_NO, CC_WORK_AREA_NAME)))
		//{
			//String creNo = getWorkMapValue(param, CR_INQUIRE_CARD_NO, CC_WORK_AREA_NAME);
			//Pattern creNoP = Pattern.compile(DMEN_CRECARD_NO_1_START + ".*" + DMEN_CRECARD_NO_1_END);
			//mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
			//		DMEN_CRECARD_NO_1_START + creNo.substring(0, 4) + DMEN_CRECARD_NO_1_END);
			//creNoP = Pattern.compile(DMEN_CRECARD_NO_2_START + ".*" + DMEN_CRECARD_NO_2_END);
			//mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
			//		DMEN_CRECARD_NO_2_START + creNo.substring(4, 8) + DMEN_CRECARD_NO_2_END);
			//creNoP = Pattern.compile(DMEN_CRECARD_NO_3_START + ".*" + DMEN_CRECARD_NO_3_END);
			//mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
			//		DMEN_CRECARD_NO_3_START + creNo.substring(8, 12) + DMEN_CRECARD_NO_3_END);
			//creNoP = Pattern.compile(DMEN_CRECARD_NO_4_START + ".*" + DMEN_CRECARD_NO_4_END);
			//mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
			//		DMEN_CRECARD_NO_4_START + creNo.substring(12, 16) + DMEN_CRECARD_NO_4_END);
		//}
		//【ANK-2810-00-00】クレジットカード番号並行保持期間終了に伴うマスク化対応】 2016/04/19 end
		if(!JFUBPCommon.isNull(getWorkMapValue(param, PY_MASKED_CARD_NUMBER, CC_WORK_AREA_NAME)))
		{
			String maskedCardNo = getWorkMapValue(param, PY_MASKED_CARD_NUMBER, CC_WORK_AREA_NAME);

			// 16桁未満の場合は16桁になるまで先頭0埋め
			for (int i = maskedCardNo.length(); i < 16; i++)
			{
				maskedCardNo = "0" + maskedCardNo;
			}

			Pattern creNoP = Pattern.compile(DMEN_CRECARD_NO_1_START + ".*" + DMEN_CRECARD_NO_1_END);
			mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_NO_1_START + maskedCardNo.substring(0, 4) + DMEN_CRECARD_NO_1_END);
			creNoP = Pattern.compile(DMEN_CRECARD_NO_2_START + ".*" + DMEN_CRECARD_NO_2_END);
			mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_NO_2_START + maskedCardNo.substring(4, 8) + DMEN_CRECARD_NO_2_END);
			creNoP = Pattern.compile(DMEN_CRECARD_NO_3_START + ".*" + DMEN_CRECARD_NO_3_END);
			mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_NO_3_START + maskedCardNo.substring(8, 12) + DMEN_CRECARD_NO_3_END);
			creNoP = Pattern.compile(DMEN_CRECARD_NO_4_START + ".*" + DMEN_CRECARD_NO_4_END);
			mskmDmenXmlStr = creNoP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_NO_4_START + maskedCardNo.substring(12, 16) + DMEN_CRECARD_NO_4_END);
		}

		// [plc_mskm]通信機器レンタルサービス：申込機器（無線LAN中継機、eoメッシュWi-Fi）の内容によって再編集を行う。
		if (workStrMap != null)
		{
			String netOpKktksvcDmenMngn = (String)workStrMap.get(NET_OP_KKTKSVC_DMEN_MNGN);
			if (!JFUBPCommon.isNull(netOpKktksvcDmenMngn))
			{
				Pattern plcMngn = Pattern.compile(DMEN_PLC_MSKM_START + ".*" + DMEN_PLC_MSKM_END);
				mskmDmenXmlStr = plcMngn.matcher(mskmDmenXmlStr).replaceAll(DMEN_PLC_MSKM_START + netOpKktksvcDmenMngn + DMEN_PLC_MSKM_END);
			}
		}

		// クレジット会社コード
		if(!JFUBPCommon.isNull(getWorkMapValue(param, PY_CARD_BRAND, CC_WORK_AREA_NAME)))
		{
			String cardBrand = getWorkMapValue(param, PY_CARD_BRAND, CC_WORK_AREA_NAME);
			Pattern compCdP = Pattern.compile(DMEN_CRECARD_COMP_CD_START + ".*" + DMEN_CRECARD_COMP_CD_END);
			mskmDmenXmlStr = compCdP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_COMP_CD_START + cardBrand + DMEN_CRECARD_COMP_CD_END);

			// クレジット会社名
			String cardName = "";
			ArrayList childList = getWorkMapArrayList(param, EKK0531B501CBSMsg1_List, CC_WORK_AREA_NAME);
			if (!JFUBPCommon.isNull(childList))
			{
				for (int i = 0; i < childList.size(); i++)
				{
					HashMap childMap = (HashMap)childList.get(i);
					if (cardBrand.equals((String)childMap.get(EKK0531B501CBSMsg1List.CRECARD_COMP_CD)))
					{
						cardName = (String)childMap.get(EKK0531B501CBSMsg1List.CRECARD_COMP_NM);
						break;
					}
				}
			}

			Pattern compNmP = Pattern.compile(DMEN_CRECARD_COMP_NM_START + ".*" + DMEN_CRECARD_COMP_NM_END);
			mskmDmenXmlStr = compNmP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_COMP_NM_START + cardName + DMEN_CRECARD_COMP_NM_END);
		}
		else
		{
			Pattern compCdP = Pattern.compile(DMEN_CRECARD_COMP_CD_START + ".*" + DMEN_CRECARD_COMP_CD_END);
			mskmDmenXmlStr = compCdP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_COMP_CD_START + DMEN_CRECARD_COMP_CD_END);
			Pattern compNmP = Pattern.compile(DMEN_CRECARD_COMP_NM_START + ".*" + DMEN_CRECARD_COMP_NM_END);
			mskmDmenXmlStr = compNmP.matcher(mskmDmenXmlStr).replaceAll(
					DMEN_CRECARD_COMP_NM_START + DMEN_CRECARD_COMP_NM_END);
		}

		return mskmDmenXmlStr;
	}

	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa start
	/**
	 * 契約者情報・氏名を取得する
	 * 
	 * <br>
	 * 
	 * @param keiyakusha_info
	 * @return String
	 */
	public String getKshNm(HashMap keiyakusha_info)
	{
		StringBuilder sb = new StringBuilder();

		// カナ変換した契約者情報．姓＋契約者情報．名を全角空白で連結
		sb.append(JPCConvertString.convFullHiraToFullKata((String)keiyakusha_info.get("kshkn_sei")));

		// 2013/03/25 ST3-2013-0000817 start
		if (!isNullOrEmpty((String)keiyakusha_info.get("kshkn_nm")))
		{
			sb.append(JFUStrConst.SPACE);
			sb.append(JPCConvertString.convFullHiraToFullKata((String)keiyakusha_info.get("kshkn_nm")));
		}
		// 2013/03/25 ST3-2013-0000817 end

		return sb.toString();
	}
	private boolean isNullOrEmpty(String value)
	{
		return null == value || "".equals(value) || "null".equals(value);
	}
	// 「TAI-2012-0000136-129」【申込断面スキーマ追加項目対応】 2012.12.19 Nagasawa end

	/**
	 * 作業領域から指定(キー)の値を取得
	 */
	@SuppressWarnings("unchecked")
	private String getWorkMapValue(IRequestParameterReadWrite param, String key, String fixText) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(fixText);
		}

		String result = null;
		if (inMap != null)
		{
			result = (String)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}

	/**
	 * 作業領域から指定(キー)のリストを取得
	 */
	@SuppressWarnings("unchecked")
	private ArrayList getWorkMapArrayList(IRequestParameterReadWrite param, String key, String fixText) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(fixText);
		}

		ArrayList result = null;
		if (inMap != null)
		{
			result = (ArrayList)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}
}
