/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbRule0059001
*	ソースファイル名：JKKejbRule0059001.java
*	作成者			：富士通
*	日付			：2011年08月15日
*＜機能概要＞
*	事務手数料判定相関ルール部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/15	FJ)			新規作成
*   v5.00.00    2012/01/14  FJ)寺本     ANK-1306-00-00
*   v5.00.01    2013/04/24  FJ)寺園     IT1-2013-0000991
*   v5.00.02    2013/08/30  FJ)沖田     OM-2013-0001041
*   v5.00.03    2013/11/06  FJ)大山     OM-2013-0003497
*   v5.00.04    2013/11/25  FJ)寺園     OM-2013-0004571
**********************************************************************/

package eo.ejb.common.rule;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;

import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK1021ETMsg;
import eo.ejb.cbm.entity.KK1021LE;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0021DBABase;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0251DBABase;
import eo.ejb.common.edit.JKKejbKK1021NumberParts;

/**
 * <p>
 * 事務手数料判定相関ルール部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbRule0059001 extends JKKejbRuleBase
{

	/** ルールID */
	private static final String RULE_ID = "RULE0059001";

	/** 異動区分 */
	private static final String IDO_DIV = "IDO_DIV";

	/** 申込料金グループコード */
	private static final String MSKM_PRC_GRP_CD = "MSKM_PRC_GRP_CD";

	/** ネット同時申込有無 */
	private static final String NET_DOJI_MSKM_UM = "NET_DOJI_MSKM_UM";

	/** 料金コースコード */
	private static final String PCRS_CD = "PCRS_CD";

	/** 工事有無 */
	private static final String KOJI_UM = "KOJI_UM";

	/** 異動理由コード */
	private static final String IDO_RSN_CD = "IDO_RSN_CD";

	/** オプションサービスコード */
	private static final String OP_SVC_CD = "OP_SVC_CD";

	/** 割引サービスコード */
	private static final String WRIB_SVC_CD = "WRIB_SVC_CD";

	/** ID通知書手数料有無 */
	private static final String ID_TCHISHO_CMS_UM = "ID_TCHISHO_CMS_UM";

	/** マンション識別有無 */
	private static final String MANS_SKB_UM = "MANS_SKB_UM";

	/** 掲載手数料識別コード */
	private static final String KEISAI_CMS_SKBT_CD = "KEISAI_CMS_SKBT_CD";
	
	/** 判定結果 */
	public static final String JUDGE_RSLT = "JUDGE_RSLT";

	/** 一時支払料金番号 */
	public static final String TMP_PAY_PRC_NO = "TMP_PAY_PRC_NO";

	/** 発生単位 */
	public static final String HASSEI_TANI = "HASSEI_TANI";

	/** 一時金設定コード */
	public static final String ICJKN_SETTE_CD = "ICJKN_SETTE_CD";

	/** 一時金分類コード */
	public static final String ICJKN_BRI_CD = "ICJKN_BRI_CD";

	/** 多重不可一時支払料金番号 */
	public static final String TAJU_FAIL_TMP_PAY_PRC_NO = "TAJU_FAIL_TMP_PAY_PRC_NO";

	/** 番ポ有無 */
	public static final String BMP_UM = "BMP_UM";

	/** 提供方式 */
	public static final String TK_HOSHIKI = "TK_HOSHIKI";

	/** 提供料金種別コード */
	public static final String TK_PRC_SBT_CD = "TK_PRC_SBT_CD";
	
	/** モデムレンタル区分 */
	public static final String MODEM_RENTAL_KBN = "MODEM_RENTAL_KBN";

	/** 判定結果(徴収対象) */
	private static final String JDG_RSLT_CLCT_TRGT = "1";

	/** 一時金設定作成単位(サービス契約内訳) */
	private static final String SKSI_TANI_SVKEIUW = "1";

	/** 発生単位(申込) */
	private static final String HSI_TANI_MSKM = "01";

	/** 発生単位(Wi-FiスポットID) */
	private static final String HSI_TANI_WIFI_SPOT_ID = "02";

	/** 発生単位(モバイル端末台数) */
	private static final String HSI_TANI_MBL_TNMT_CNT = "03";

	/** 発生単位(内訳単位（電話番号単位）) */
	private static final String HSI_TANI_UCWK = "05";

	/** ネット同時申込有無(同時申込なし) */
	private static final String NET_DOJI_MSKM_UM_OFF = "0";

	/** ネット同時申込有無(同時申込あり) */
	private static final String NET_DOJI_MSKM_UM_ON = "1";

	/** eo光ネット系料金グループ */
	private static final String[] EO_NET_GRP = {
		JKKModelConst.PRC_GRP_CD_EOHNT_HOME_TYPE,
		JKKModelConst.PRC_GRP_CD_EOHNT_MAISON_TYPE,
		JKKModelConst.PRC_GRP_CD_EOHNT_MANS_TYPE};
	
	/** 完了状態コード：未完了  */
	private static final String FIN_STAT_CD_MIKANRYOU = "0";
	
	/** 処理対象のCBSMsg */
	private CAANMsg inCBSMsg = null;

	/** 異動区分 */
	private String ido_div = null;

	/** 申込料金グループコード */
	private String mskm_prc_grp_cd = null;

	/** ネット同時申込有無 */
	private String net_doji_mskm_um = null;

	/** 料金コースコード */
	private String pcrs_cd = null;

	/** 工事有無 */
	private String koji_um = null;

	/** 異動理由コード */
	private String ido_rsn_cd = null;

	/** オプションサービスコード */
	private String op_svc_cd = null;

	/** 割引サービスコード */
	private String wrib_svc_cd = null;

	/** ID通知書手数料有無 */
	private String id_tchisho_cms_um = null;

	/** 申込明細番号 */
	private String mskm_dtl_no = null;

	/** サービス契約番号 */
	private String svc_kei_no = null;

	/** サービス契約内訳番号 */
	private String svc_kei_ucwk_no = null;

	/** オプションサービス契約番号 */
	private String op_svc_kei_no = null;

	/** 割引サービス契約番号 */
	private String wrib_svc_kei_no = null;

	/** サービス契約回線内訳番号 */
	private String svc_kei_kaisen_ucwk_no = null;

	/** 一時金設定作成単位
	 * (現時点では、「EKK1021D011_一時金設定登録（事務手数料判定）」からの呼出時にのみ使用し、指定された区分値における「一時金設定」作成要否を判別する。) */
	private String icjkn_sette_sksi_tani = null;

	/** 番ポ有無 */
	private String bmp_um = null;
	
	/** マンション識別有無 */
	private String mans_skb_um = null;

	/** 掲載手数料識別コード */
	private String keisai_cms_skbt_cd = null;
	
	/** 提供方式 */
	private String tk_hoshiki = null;

	/** 提供料金種別コード */
	private String tk_prc_sbt_cd = null;
	
	/** モデムレンタル区分 */
	private String modem_rental_kbn = null;

	/**
	 * <p>
	 * JKKejbRule0059001クラスのコンストラクタです。
	 * </p>
	 * @param inMsg 処理対象のCBSMsg
	 */
	public JKKejbRule0059001(CAANMsg inMsg)
	{
		super();
		this.inCBSMsg = inMsg;
	}

	/**
	 * <p>
	 * 処理対象のCBSMsgを取得します。
	 * </p>
	 * @return 処理対象のCBSMsg
	 */
	protected CAANMsg getCBSMsg()
	{
		return this.inCBSMsg;
	}

	/**
	 * <p>
	 * ルールIDを取得します。
	 * </p>
	 * @return ルールID
	 */
	protected String getRuleId()
	{
		return RULE_ID;
	}

	/**
	 * <p>
	 * ルールエンジンを複数条件モードで実行するか設定します。
	 * </p>
	 * @return 複数条件モードで実行する場合はtrue
	 */
	protected boolean isMultiMode()
	{
		return true;
	}
	
	/**
	 * <p>
	 * 異動区分を取得します。
	 * </p>
	 * @return 異動区分
	 */
	private String getIdo_div()
	{
		return this.ido_div;
	}

	/**
	 * <p>
	 * 申込料金グループコードを取得します。
	 * </p>
	 * @return 申込料金グループコード
	 */
	private String getMskm_prc_grp_cd()
	{
		return this.mskm_prc_grp_cd;
	}

	/**
	 * <p>
	 * ネット同時申込有無を取得します。
	 * </p>
	 * @return ネット同時申込有無
	 */
	private String getNet_doji_mskm_um()
	{
		return this.net_doji_mskm_um;
	}

	/**
	 * <p>
	 * 料金コースコードを取得します。
	 * </p>
	 * @return 料金コースコード
	 */
	private String getPcrs_cd()
	{
		return this.pcrs_cd;
	}

	/**
	 * <p>
	 * 工事有無を取得します。
	 * </p>
	 * @return 工事有無
	 */
	private String getKoji_um()
	{
		return this.koji_um;
	}

	/**
	 * <p>
	 * 異動理由コードを取得します。
	 * </p>
	 * @return 異動理由コード
	 */
	private String getIdo_rsn_cd()
	{
		return this.ido_rsn_cd;
	}

	/**
	 * <p>
	 * オプションサービスコードを取得します。
	 * </p>
	 * @return オプションサービスコード
	 */
	private String getOp_svc_cd()
	{
		return this.op_svc_cd;
	}

	/**
	 * <p>
	 * 割引サービスコードを取得します。
	 * </p>
	 * @return 割引サービスコード
	 */
	private String getWrib_svc_cd()
	{
		return this.wrib_svc_cd;
	}

	/**
	 * <p>
	 * ID通知書手数料有無を取得します。
	 * </p>
	 * @return ID通知書手数料有無
	 */
	private String getId_tchisho_cms_um()
	{
		return this.id_tchisho_cms_um;
	}

	/**
	 * <p>
	 * 申込明細番号を取得します。
	 * </p>
	 * @return 申込明細番号
	 */
	private String getMskm_dtl_no()
	{
		return this.mskm_dtl_no;
	}

	/**
	 * <p>
	 * サービス契約番号を取得します。
	 * </p>
	 * @return サービス契約番号
	 */
	private String getSvc_kei_no()
	{
		return this.svc_kei_no;
	}

	/**
	 * <p>
	 * サービス契約内訳番号を取得します。
	 * </p>
	 * @return サービス契約内訳番号
	 */
	private String getSvc_kei_ucwk_no()
	{
		return this.svc_kei_ucwk_no;
	}

	/**
	 * <p>
	 * オプションサービス契約番号を取得します。
	 * </p>
	 * @return オプションサービス契約番号
	 */
	private String getOp_svc_kei_no()
	{
		return this.op_svc_kei_no;
	}

	/**
	 * <p>
	 * 割引サービス契約番号を取得します。
	 * </p>
	 * @return 割引サービス契約番号
	 */
	private String getWrib_svc_kei_no()
	{
		return this.wrib_svc_kei_no;
	}

	/**
	 * <p>
	 * 一時金設定作成単位を取得します。
	 * </p>
	 * @return 一時金設定作成単位
	 */
	private String getIcjkn_sette_sksi_tani()
	{
		return this.icjkn_sette_sksi_tani;
	}

	/**
	 * <p>
	 * 番ポ有無を取得します。
	 * </p>
	 * @return 番ポ有無
	 */
	private String getBmp_um()
	{
		return this.bmp_um;
	}
	
	/**
	 * <p>
	 * マンション識別有無を取得します。
	 * </p>
	 * @return マンション識別有無
	 */
	public String getMans_skb_um()
	{
		return mans_skb_um;
	}
	
	/**
	 * <p>
	 * 掲載手数料識別コードを取得します。
	 * </p>
	 * @return 掲載手数料識別コード
	 */
	public String getKeisai_cms_skbt_cd()
	{
		return keisai_cms_skbt_cd;
	}

	/**
	 * <p>
	 * 異動区分を設定します。
	 * </p>
	 * @param p_ido_div 異動区分
	 */
	public void setIdo_div(String p_ido_div)
	{
		this.ido_div = p_ido_div;
	}

	/**
	 * <p>
	 * 申込料金グループコードを設定します。
	 * </p>
	 * @param p_mskm_prc_grp_cd 申込料金グループコード
	 */
	public void setMskm_prc_grp_cd(String p_mskm_prc_grp_cd)
	{
		this.mskm_prc_grp_cd = p_mskm_prc_grp_cd;
	}

	/**
	 * <p>
	 * ネット同時申込有無を設定します。
	 * </p>
	 * @param p_net_doji_mskm_um ネット同時申込有無
	 */
	public void setNet_doji_mskm_um(String p_net_doji_mskm_um)
	{
		this.net_doji_mskm_um = p_net_doji_mskm_um;
	}

	/**
	 * <p>
	 * 料金コースコードを設定します。
	 * </p>
	 * @param p_pcrs_cd 料金コースコード
	 */
	public void setPcrs_cd(String p_pcrs_cd)
	{
		this.pcrs_cd = p_pcrs_cd;
	}

	/**
	 * <p>
	 * 工事有無を設定します。
	 * </p>
	 * @param p_koji_um 工事有無
	 */
	public void setKoji_um(String p_koji_um)
	{
		this.koji_um = p_koji_um;
	}

	/**
	 * <p>
	 * 異動理由コードを設定します。
	 * </p>
	 * @param p_ido_rsn_cd 異動理由コード
	 */
	public void setIdo_rsn_cd(String p_ido_rsn_cd)
	{
		this.ido_rsn_cd = p_ido_rsn_cd;
	}

	/**
	 * <p>
	 * オプションサービスコードを設定します。
	 * </p>
	 * @param p_op_svc_cd オプションサービスコード
	 */
	public void setOp_svc_cd(String p_op_svc_cd)
	{
		this.op_svc_cd = p_op_svc_cd;
	}

	/**
	 * <p>
	 * 割引サービスコードを設定します。
	 * </p>
	 * @param p_wrib_svc_cd 割引サービスコード
	 */
	public void setWrib_svc_cd(String p_wrib_svc_cd)
	{
		this.wrib_svc_cd = p_wrib_svc_cd;
	}

	/**
	 * <p>
	 * ID通知書手数料有無を設定します。
	 * </p>
	 * @param p_id_tchisho_cms_um ID通知書手数料有無
	 */
	public void setId_tchisho_cms_um(String p_id_tchisho_cms_um)
	{
		this.id_tchisho_cms_um = p_id_tchisho_cms_um;
	}

	/**
	 * <p>
	 * 申込明細番号を設定します。
	 * </p>
	 * @param p_mskm_dtl_no 申込明細番号
	 */
	public void setMskm_dtl_no(String p_mskm_dtl_no)
	{
		this.mskm_dtl_no = p_mskm_dtl_no;
	}

	/**
	 * <p>
	 * サービス契約番号を設定します。
	 * </p>
	 * @param p_svc_kei_no サービス契約番号
	 */
	public void setSvc_kei_no(String p_svc_kei_no)
	{
		this.svc_kei_no = p_svc_kei_no;
	}

	/**
	 * <p>
	 * サービス契約内訳番号を設定します。
	 * </p>
	 * @param p_svc_kei_ucwk_no サービス契約内訳番号
	 */
	public void setSvc_kei_ucwk_no(String p_svc_kei_ucwk_no)
	{
		this.svc_kei_ucwk_no = p_svc_kei_ucwk_no;
	}

	/**
	 * <p>
	 * オプションサービス契約番号を設定します。
	 * </p>
	 * @param p_op_svc_kei_no オプションサービス契約番号
	 */
	public void setOp_svc_kei_no(String p_op_svc_kei_no)
	{
		this.op_svc_kei_no = p_op_svc_kei_no;
	}

	/**
	 * <p>
	 * 割引サービス契約番号を設定します。
	 * </p>
	 * @param p_wrib_svc_kei_no 割引サービス契約番号
	 */
	public void setWrib_svc_kei_no(String p_wrib_svc_kei_no)
	{
		this.wrib_svc_kei_no = p_wrib_svc_kei_no;
	}

	/**
	 * <p>
	 * 一時金設定作成単位を設定します。
	 * </p>
	 * @return p_icjkn_sette_sksi_tani 一時金設定作成単位
	 */
	public void setIcjkn_sette_sksi_tani(String p_icjkn_sette_sksi_tani)
	{
		this.icjkn_sette_sksi_tani = p_icjkn_sette_sksi_tani;
	}

	/**
	 * <p>
	 * 番ポ有無を設定します。
	 * </p>
	 * @param p_bmp_um 番ポ有無
	 */
	public void setBmp_um(String p_bmp_um)
	{
		this.bmp_um = p_bmp_um;
	}

	/**
	 * <p>
	 * マンション識別有無を設定します。
	 * </p>
	 * @param p_mans_skb_um マンション識別有無
	 */
	public void setMans_skb_um(String p_mans_skb_um)
	{
		this.mans_skb_um = p_mans_skb_um;
	}

	/**
	 * <p>
	 * 掲載手数料識別コードを設定します。
	 * </p>
	 * @param p_mans_skb_um 掲載手数料識別コード
	 */
	public void setKeisai_cms_skbt_cd(String p_keisai_cms_skbt_cd)
	{
		this.keisai_cms_skbt_cd = p_keisai_cms_skbt_cd;
	}

	
	/**
	 * <p>
	 * 提供方式を取得します。
	 * </p>
	 * @return 提供方式
	 */
	public String getTk_hoshiki()
	{
		return tk_hoshiki;
	}

	/**
	 * <p>
	 * 提供方式を設定します。
	 * </p>
	 * @param p_tk_hoshiki 提供方式
	 */
	public void setTk_hoshiki(String p_tk_hoshiki)
	{
		this.tk_hoshiki = p_tk_hoshiki;
	}
	
	/**
	 * <p>
	 * 提供料金種別コードを取得します。
	 * </p>
	 * @return 提供料金種別コード
	 */
	public String getTk_prc_sbt_cd()
	{
		return tk_prc_sbt_cd;
	}

	/**
	 * <p>
	 * 提供料金種別コードを設定します。
	 * </p>
	 * @param p_tk_prc_sbt_cd 提供料金種別コード
	 */
	public void setTk_prc_sbt_cd(String p_tk_prc_sbt_cd)
	{
		this.tk_prc_sbt_cd = p_tk_prc_sbt_cd;
	}
	
	/**
	 * <p>
	 * モデムレンタル区分を取得します。
	 * </p>
	 * @return モデムレンタル区分
	 */
	public String getModem_rental_kbn()
	{
		return modem_rental_kbn;
	}

	/**
	 * <p>
	 * モデムレンタル区分を設定します。
	 * </p>
	 * @param p_modem_rental_kbn モデムレンタル区分
	 */
	public void setModem_rental_kbn(String p_modem_rental_kbn)
	{
		this.modem_rental_kbn = p_modem_rental_kbn;
	}

	/**
	 * <p>
	 * サービス契約回線内訳番号を取得します。
	 * </p>
	 * @return サービス契約回線内訳番号
	 */
	public String getSvc_kei_kaisen_ucwk_no()
	{
		return svc_kei_kaisen_ucwk_no;
	}

	/**
	 * <p>
	 * サービス契約回線内訳番号を設定します。
	 * </p>
	 * @param p_modem_rental_kbn サービス契約回線内訳番号
	 */
	public void setSvc_kei_kaisen_ucwk_no(String p_svc_kei_kaisen_ucwk_no)
	{
		this.svc_kei_kaisen_ucwk_no = p_svc_kei_kaisen_ucwk_no;
	}
	
	/**
	 * <p>
	 * 事務手数料判定相関ルールの参照を行います。
	 * </p>
	 * @return ルールエンジンの実行結果リスト
	 */
	public ArrayList<HashMap<String, Object>> referRuleEngine()
	{
		// ルールエンジンで使用する値を設定
		set(IDO_DIV, getIdo_div());
		set(MSKM_PRC_GRP_CD, getMskm_prc_grp_cd());
		set(NET_DOJI_MSKM_UM, getNet_doji_mskm_um());
		set(PCRS_CD, getPcrs_cd());
		set(KOJI_UM, getKoji_um());
		set(OP_SVC_CD, getOp_svc_cd());
		set(WRIB_SVC_CD, getWrib_svc_cd());
		set(ID_TCHISHO_CMS_UM, getId_tchisho_cms_um());
		set(IDO_RSN_CD, getIdo_rsn_cd());
		set(BMP_UM, getBmp_um());
		set(MANS_SKB_UM, getMans_skb_um());
		set(KEISAI_CMS_SKBT_CD, getKeisai_cms_skbt_cd());
		set(TK_HOSHIKI, getTk_hoshiki());
		set(TK_PRC_SBT_CD, getTk_prc_sbt_cd());
		set(MODEM_RENTAL_KBN, getModem_rental_kbn());

		// ルールエンジンの実行
		super.execRuleEngine();

		if (!hasNext())
		{
			// 実行結果が存在しない場合
			return null;
		}

		// 実行結果を返却
		return super.getResultList();
	}

	/**
	 * <p>
	 * 事務手数料判定相関ルールを実行します。
	 * </p>
	 * @return 登録内容のリスト
	 */
	public CAANMsg[] invoke()
	{
		// ルールエンジンで使用する値を設定
		set(IDO_DIV, getIdo_div());
		set(MSKM_PRC_GRP_CD, getMskm_prc_grp_cd());
		set(NET_DOJI_MSKM_UM, getNet_doji_mskm_um());
		set(PCRS_CD, getPcrs_cd());
		set(KOJI_UM, getKoji_um());
		set(OP_SVC_CD, getOp_svc_cd());
		set(WRIB_SVC_CD, getWrib_svc_cd());
		set(ID_TCHISHO_CMS_UM, getId_tchisho_cms_um());
		set(IDO_RSN_CD, getIdo_rsn_cd());
		set(BMP_UM, getBmp_um());
		set(MANS_SKB_UM, getMans_skb_um());
		set(TK_HOSHIKI, getTk_hoshiki());
		set(TK_PRC_SBT_CD, getTk_prc_sbt_cd());
		set(MODEM_RENTAL_KBN, getModem_rental_kbn());

		// ルールエンジンの実行
		super.execRuleEngine();

		// 更新内容格納用変数
		ArrayList<CAANMsg> arList = new ArrayList<CAANMsg>();

		// 実行結果のデータ件数分処理を実行
		while (hasNext())
		{
			HashMap<String, Object> retMap = getResultMap();

			// 実行結果が「0：徴収対象外」の場合は一時金設定を登録しない
			if (!JDG_RSLT_CLCT_TRGT.equals(retMap.get(JUDGE_RSLT)))
			{
				continue;
			}

			// 一時金設定作成単位が"サービス契約内訳"の場合、
			if (SKSI_TANI_SVKEIUW.equals(getIcjkn_sette_sksi_tani()))
			{
				// ルール実行結果Map.発生単位が"内訳単位(電話番号単位)"以外の事務手数料は、一時金設定を登録しない
				if (!HSI_TANI_UCWK.equals((String)retMap.get(HASSEI_TANI)))
				{
					continue;
				}
			}

			// 多重不可一時支払料金番号
			String tajuFailTmpPayPrcNo = (String)retMap.get(TAJU_FAIL_TMP_PAY_PRC_NO);
			// 多重不可一時支払料金番号が指定されている場合
			if (tajuFailTmpPayPrcNo != null && !"".equals(tajuFailTmpPayPrcNo))
			{
				// 一時金設定対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)を取得する。
				CAANMsg sameKisnKK0081Msg = getSameKisnUseNetTelSvcKei(false);
				
				if (sameKisnKK0081Msg != null)
				{
					
					if(JKKModelConst.IDO_DIV_KIKI_KEI_CHG.equals(getIdo_div()))
					{
						
						// サービス契約ステータスが「サービス提供中」、以上「解約」以下の場合、「一時金設定」を作成しない
						if (JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_STP_CHU.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT)))
						{
							continue;
						}
						// サービス契約ステータスが「受付済」または「照査済」または「締結済み」かつ
						// 同一回線を使用する「サービス契約」が存在し、多重不可となる「一時金設定」が登録済の場合は、処理対象外
						if ((JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT)) || JKKModelConst.SVC_KEI_STAT_SHOSA_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT)) || JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))) 
								&& istajuFailIcjknSette(tajuFailTmpPayPrcNo, sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_NO)))
						{
							continue;
						}
					}
					else 
					{
						
						// サービス契約ステータスが「照査済」、以上「解約」以下の場合、「一時金設定」を作成しない
						if (JKKModelConst.SVC_KEI_STAT_SHOSA_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_CNC_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_SVCTK_CHU.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_PAUSE_STP_CHU.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_STP_CHU.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								|| JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT)))
						{
							continue;
						}
						// サービス契約ステータスが「受付済」かつ
						// 同一回線を使用する「サービス契約」が存在し、多重不可となる「一時金設定」が登録済の場合は、処理対象外
						if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT))
								&& istajuFailIcjknSette(tajuFailTmpPayPrcNo, sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_NO)))
						{
							continue;
						}
					}
				}
			}
			// 一時金設定の登録
			CAANMsg msg = createKK1021(retMap);
			
			// 登録内容を積む
			arList.add(msg);
		}
		// CAANMsgの配列に詰めて返却する
		return arList.toArray(new CAANMsg[0]);
	}

	/**
	 * <p>
	 * 一時金設定の登録を行います。
	 * </p>
	 * @param retMap ルールエンジン実行結果のMap
	 * @return 登録内容
	 */
	private CAANMsg createKK1021(HashMap<String, Object> retMap)
	{
		// 一時金設定登録メッセージの作成
		CAANMsg inETMsg = new CAANMsg(KK1021ETMsg.class.getName());
		// 一時金設定番号 <= 採番部品戻り値
		inETMsg.set(KK1021ETMsg.ICJKN_SETTE_NO, new JKKejbKK1021NumberParts().getIcjknSetteNo());
		// 一時支払料金番号 <= ルール実行結果Map.一時支払料金番号
		inETMsg.set(KK1021ETMsg.TMP_PAY_PRC_NO, (String)retMap.get(TMP_PAY_PRC_NO));
		// 一時金設定コード <= ルール実行結果Map.一時金設定コード
		inETMsg.set(KK1021ETMsg.ICJKN_SETTE_CD, (String)retMap.get(ICJKN_SETTE_CD));
		// 一時金指定率 <= NULL値
		inETMsg.setNull(KK1021ETMsg.ICJKN_SHITEI_RT);
		// 一時支払料金額 <= NULL値
		inETMsg.setNull(KK1021ETMsg.ICJKN_SHITEI_AMNT);

		// 申込明細番号 <= 入力値.申込明細番号
		inETMsg.set(KK1021ETMsg.MSKM_DTL_NO, getMskm_dtl_no());
		// サービス契約番号 <= 入力値.サービス契約番号
		inETMsg.set(KK1021ETMsg.SVC_KEI_NO, getSvc_kei_no());

		// サービス契約のステータスが"照査済"の場合
		if (this.isKK0081StatusChk())
		{
			// 完了状態コード <= 完了状態コード(未設定) 
			inETMsg.set(KK1021ETMsg.FIN_STAT_CD, FIN_STAT_CD_MIKANRYOU);
		}
		
		// 一時金発生単位
		String hasseiTani = (String)retMap.get(HASSEI_TANI);

		if (HSI_TANI_MSKM.equals(hasseiTani))
		{
			// 発生単位が"申込単位"の場合
			// サービス契約内訳番号 <= 入力値.サービス契約内訳番号
			inETMsg.set(KK1021ETMsg.SVC_KEI_UCWK_NO, getSvc_kei_ucwk_no());
			// オプションサービス契約番号 <= 入力値.オプションサービス契約番号
			inETMsg.set(KK1021ETMsg.OP_SVC_KEI_NO, getOp_svc_kei_no());
			// 割引サービス契約番号 <= 入力値.割引サービス契約番号
			inETMsg.set(KK1021ETMsg.WRIB_SVC_KEI_NO, getWrib_svc_kei_no());
		}
		else if (HSI_TANI_WIFI_SPOT_ID.equals(hasseiTani))
		{
			// 発生単位がWi-FiスポットIDの場合
			// サービス契約内訳番号 <= 入力値.サービス契約内訳番号
			inETMsg.set(KK1021ETMsg.SVC_KEI_UCWK_NO, getSvc_kei_ucwk_no());
		}
		else if (HSI_TANI_MBL_TNMT_CNT.equals(hasseiTani))
		{
			// 発生単位がモバイル端末台数の場合
			// サービス契約内訳番号 <= 入力値.サービス契約内訳番号
			inETMsg.set(KK1021ETMsg.SVC_KEI_UCWK_NO, getSvc_kei_ucwk_no());
		}
		else if (HSI_TANI_UCWK.equals(hasseiTani))
		{
			// 発生単位が内訳単位（電話番号単位）の場合
			// サービス契約内訳番号 <= 入力値.サービス契約内訳番号
			inETMsg.set(KK1021ETMsg.SVC_KEI_UCWK_NO, getSvc_kei_ucwk_no());
		}
		// 一時金発生年月日 <= 運用日付
		inETMsg.set(KK1021ETMsg.ICJKN_HASSEI_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// 登録処理の実行
		super.create(inETMsg);
		
		return inETMsg;
	}

	/**
	 * <p>
	 * ネット同時申込有無を取得します。
	 * </p>
	 * @param p_mskm_dtl_no 申込明細番号
	 * @return ネットが同時に申し込まれている場合は"同時申込あり"、それ以外の場合は"同時申込なし"
	 */
	public String getNetDojiMskmUm(String p_mskm_dtl_no)
	{
		JKKejbKK0021DBABase kk0021dba = new JKKejbKK0021DBABase();
		JKKejbKK0081DBABase kk0081dba = new JKKejbKK0081DBABase();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// 申込料金グループコードが"ｅｏ光電話"以外の場合は無関係のため、"同時申込なし"とする。
		if (!JKKModelConst.PRC_GRP_CD_EOHTL.equals(getMskm_prc_grp_cd()))
		{
			return NET_DOJI_MSKM_UM_OFF;
		}

		// 申込明細番号が設定されていない場合、"同時申込なし"とする。
		if (p_mskm_dtl_no == null)
		{
			return NET_DOJI_MSKM_UM_OFF;
		}

		// 対象の電話契約に紐づく「申込明細」のカレント(最新世代)を取得する。
		CAANMsg kk0021 = kk0021dba.getKK0021Current(p_mskm_dtl_no);

		// 同一の「申込」配下の「申込明細」を取得する。
		CAANMsg[] kk0021List = kk0021dba.getKK0021byMskm(kk0021.getString(KK0021ETMsg.MSKM_NO), null);
		for (CAANMsg kk0021Data : kk0021List)
		{
			String mskmDtlNo = kk0021Data.getString(KK0021ETMsg.MSKM_DTL_NO);

			if (p_mskm_dtl_no.equals(mskmDtlNo))
			{
				// 入力と同じ申込明細番号は処理対象外
				continue;
			}

			// 該当の「申込明細」に紐づく「サービス契約」を取得する。
			CAANMsg[] kk0081List = kk0081dba.getKK0081byMskmDtl(mskmDtlNo, null, opeDate, "1");
			// サービス契約ステータスが「解約済」 or 「キャンセル済」を除外する
			kk0081List = kk0081dba.getKK0081OutDsLCl(kk0081List);

			// ネット契約に紐づく「申込明細」が存在する場合、"同時申込あり"
			for (CAANMsg kk0081Data : kk0081List)
			{
				if (isEoNetTypeGroup(kk0081Data.getString(KK0081ETMsg.PRC_GRP_CD)))
				{
					return NET_DOJI_MSKM_UM_ON;
				}
			}
		}

		/* ----------------------------------------------------------------------------------------------------
		 * 「申込」が同一でない場合でも、同一回線上のネット契約、電話契約がともに"受付済"の場合は、同時申込として扱う。
		 * ---------------------------------------------------------------------------------------------------- */
		// 対象の電話契約を取得する。
		CAANMsg kk0081MsgTel = kk0081dba.getKK0081Current(getSvc_kei_no(), opeDate);

		// 対象の電話契約と同一回線を使用するネット契約を取得する。
		CAANMsg kk0081MsgNet = getSameKisnUseNetTelSvcKei(true);

		// 対象の電話契約と同一回線を使用するネット契約が存在する場合
		if (kk0081MsgNet != null)
		{
			// ネット契約、電話契約ともに【受付済】の場合、"同時申込あり"
			if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(kk0081MsgTel.getString(KK0081ETMsg.SVC_KEI_STAT))
					&& JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(kk0081MsgNet.getString(KK0081ETMsg.SVC_KEI_STAT)))
			{
				return NET_DOJI_MSKM_UM_ON;
			}
		}

		return NET_DOJI_MSKM_UM_OFF;
	}

	/**
	 * <p>
	 * 一時金設定対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)を取得します。
	 * </p>
	 * @param dslKbn 解約済区分
	 * @return 一時金設定対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)のメッセージキャリア
	 */
	public CAANMsg getSameKisnUseNetTelSvcKei(boolean dslKbn)
	{
		// 一時金設定対象サービス契約
		String tgSvcKeiNo = getSvc_kei_no();
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// 一時金設定対象の「サービス契約」のカレントレコードを取得する。
		JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
		CAANMsg tgKK0081Msg = kk0081Dba.getKK0081Current(tgSvcKeiNo, opeDate);
		
		// 一時金設定対象の「サービス契約」のサービスコード
		String tgSvcCd = tgKK0081Msg.getString(KK0081ETMsg.SVC_CD);
		
		CAANMsg[] kk0251MsgList = null;
		// サービス契約回線内訳番号に値が設定されていない場合
		if (getSvc_kei_kaisen_ucwk_no() == null || getSvc_kei_kaisen_ucwk_no().isEmpty())
		{
			// 一時金設定対象の「サービス契約」が使用する「サービス契約回線内訳」を取得する
			JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
			kk0251MsgList = kk0251Dba.getKK0251bySvcKei(tgSvcKeiNo, null, opeDate, "1");
		}
		else
		{
			// サービス契約回線内訳番号が設定されている場合は指定されたサービス契約回線内訳番号で
			// サービス契約回線内訳をカレント検索する
			CAANMsg searchKey = new CAANMsg(KK0251ETMsg.class.getName());
			searchKey.set(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO, getSvc_kei_kaisen_ucwk_no());

			CAANMsg kk0251Msg = new JKKejbKK0251DBABase().findByCurrent(searchKey);
			kk0251MsgList = new CAANMsg[1];
			kk0251MsgList[0] = kk0251Msg;
		}

		for (CAANMsg kk0251Msg : kk0251MsgList)
		{
			// 該当の「サービス契約回線内訳」で使用する「サービス契約」を取得する
			CAANMsg[] sameKisnKK0081MsgList = kk0081Dba.getKK0081bySvcKeiKaisenUcwk(
					kk0251Msg.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO), null, opeDate, "1");

			if (dslKbn) 
			{
				// 解約済、キャンセル済を除外する
				sameKisnKK0081MsgList = kk0081Dba.getKK0081OutDsLCl(sameKisnKK0081MsgList);
			}
			
			for (CAANMsg sameKisnKK0081Msg : sameKisnKK0081MsgList)
			{
				String sameKisnSvcKeiNo = sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_NO);
				String sameKisnSvcCd = sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_CD);
				// 一時金設定対象の「サービス契約」を除外する
				if (tgSvcKeiNo.equals(sameKisnSvcKeiNo))
				{
					continue;
				}
				
				// 一時金設定対象の「サービス契約」がネット(または電話)で、同一回線を使用する「サービス契約」が電話(またはネット)の場合
				if ((JKKModelConst.SVC_CD_NET.equals(tgSvcCd) && JKKModelConst.SVC_CD_TEL.equals(sameKisnSvcCd))
					|| (JKKModelConst.SVC_CD_TEL.equals(tgSvcCd) && JKKModelConst.SVC_CD_NET.equals(sameKisnSvcCd)))
				{
					return sameKisnKK0081Msg;
				}
			}
		}

		return null;
	}

	/**
	 * <p>
	 * 入力のサービス契約番号に対して、多重不可一時支払料金番号の一時金が設定済かどうか判定します。
	 * </p>
	 * @param tajuFailTmpPayPrcNo 多重不可一時支払料金番号
	 * @param inSvcKeiNo サービス契約番号
	 * @return true:該当の一時金が設定済(一時金設定コードが"無"以外)、false:それ以外
	 */
	private boolean istajuFailIcjknSette(String tajuFailTmpPayPrcNo, String inSvcKeiNo)
	{
		// 入力のサービス契約番号が指定されない場合は、falseを返却する。
		if (inSvcKeiNo == null || "".equals(inSvcKeiNo))
		{
			return false;
		}

		// 対象の一時支払料金番号、サービス契約番号に紐づく「一時金設定」を取得する。
		CAANMsg msg = new CAANMsg(KK1021ETMsg.class.getName());
		msg.set(KK1021ETMsg.TMP_PAY_PRC_NO, tajuFailTmpPayPrcNo);
		msg.set(KK1021ETMsg.SVC_KEI_NO, inSvcKeiNo);
		msg.set(KK1021ETMsg.MK_FLG, "0");

		CAANMsg[] kk1021MsgList = null;
		try
		{
			kk1021MsgList = new KK1021LE().findByCondition(msg);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		for (CAANMsg kk1021Msg : kk1021MsgList)
		{
			// 一時金設定コードが"無"以外("有"、"半額"、"指定額")の場合、対象の一時金が設定済と判定する。
			if (!JKKModelConst.ICJKN_SETTE_CD_M.equals(kk1021Msg.getString(KK1021ETMsg.ICJKN_SETTE_CD)))
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * <p>
	 * eo光ネット系料金グループか判定します。
	 * </p>
	 * @param p_prc_grp_cd 料金グループコード
	 * @return eo光ネット系料金グループの場合はtrue
	 */
	private boolean isEoNetTypeGroup(String p_prc_grp_cd)
	{
		for (String value : EO_NET_GRP)
		{
			if (value.equals(p_prc_grp_cd))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * <p>
	 * サービス契約のステータスが照査済か否かを判断します
	 * </p>
	 * @return true：照査済 false：照査済でない
	 */
	private boolean isKK0081StatusChk()
	{
		// サービス契約番号を元にステータスを取得する
		CAANMsg kk0081Info = new JKKejbKK0081DBABase().getKK0081Current(this.getSvc_kei_no(), JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約.サービス契約ステータスを取得
		String status = kk0081Info.getString(KK0081ETMsg.SVC_KEI_STAT);
		// サービス契約.サービスコードを取得
		String svcCd = kk0081Info.getString(KK0081ETMsg.SVC_CD);

		// サービス契約のサービスコードが電話かつサービス契約内訳番号が設定されている場合、サービス契約内訳のステータスで判定する
		if (JKKModelConst.SVC_CD_TEL.equals(svcCd) && this.getSvc_kei_ucwk_no() != null)
		{
			// サービス契約内訳番号を元にステータスを取得する
			CAANMsg kk0161Info = new JKKejbKK0161DBABase().getKK0161Current(this.getSvc_kei_ucwk_no(), JKKModelCommon.getOpeDate(inCBSMsg));

			// サービス契約内訳.サービス契約内訳ステータスを取得
			status = kk0161Info.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT);
		}
		
		// ステータスが照査済以降の場合
		if (!JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(status))
		{
			return true;
		}
		return false;
	}
	
}
