/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKTgWribSvcKeiYmdJdg
*	ソースファイル名	：JBSbatKKTgWribSvcKeiYmdJdg.java
*	作成者				：富士通　
*	作成日				：2013年02月17日
*＜機能概要＞
*　対象割引サービス契約サービス課金開始年月日判定部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/02/17   富士通		新規作成
*	v5.00.01	2013/02/25   富士通		IT2-2013-0000216
*	v5.00.02	2013/03/02   富士通		IT2-2013-0000238
*	v5.00.03	2013/03/03   富士通		IT2-2013-0000238
*	v5.00.04	2013/09/02   富士通		OM-2013-0001240
*	v5.00.05	2013/10/15   富士通		OM-2013-0003112
*	v5.00.06	2013/11/08   富士通		OM-2013-0003780
*	v5.00.07	2013/11/20   富士通		OM-2013-0003969
*	v6.00.00	2013/12/04   富士通		OM-2013-0004765
*	v6.00.01	2014/01/08   富士通		OM-2013-0005403
*	v22.00.00	2015/11/19	 FJ)杉本	ANK-2732-00-00 プロジェクト正常化 サービス開始に関するソース可読性向上
*	v25.00.00	2016/02/29	 FJ)黒田	【ANK-2683-00-00】ネット・テレビ追加時のセット割１日適用撤廃について
*	v40.00.00	2019/01/30	 FJ)舘山	【ANK-3412-03-00】【５ギガ・１０ギガ】特約プログラム対応
*	v71.00.00	2024/06/12	 FJ)御崎	【ANK-4543-05-00】 NTT卸対応 NTT卸（メアド）に付与した長割をサービス開始の対象とする。
*********************************************************************/
package eo.business.service;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

import com.fujitsu.futurity.rule.common.JRuleXMLHandler;
import com.fujitsu.futurity.rule.xml.compare.JRuleXMLPattern;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JCCBatCommon;
import eo.business.common.JKKBatCommon;
import eo.business.util.file.JBSbatKKIFM385;
import eo.business.util.file.JBSbatKKIFM386;
import eo.business.util.file.JBSbatKKIFM387;
import eo.business.util.table.JBSbatKK_T_ADCHG_DTL;
import eo.business.util.table.JBSbatKU_T_KOJIAK;
import eo.common.constant.JKKStrConst;
import eo.common.util.JPCDateUtil;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKTgWribSvcKeiYmdJdg extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(割引サービス契約)*/
	private static final String D_TBL_NAME_KK_T_WRIB_SVC_KEI = "KK_T_WRIB_SVC_KEI";
	
	/** テーブル(住所変更明細)*/
	private static final String D_TBL_NAME_KK_T_ADCHG_DTL = "KK_T_ADCHG_DTL";
	
	/** テーブル(工事案件)*/
	private static final String D_TBL_NAME_KU_T_KOJIAK = "KU_T_KOJIAK";
		
	/** SQL定義キー(KK_SELECT_052)*/
	private static final String KK_T_WRIB_SVC_KEI_KK_SELECT_052 = "KK_SELECT_052";

	/** SQL定義キー(KK_SELECT_053)*/
	private static final String KK_T_WRIB_SVC_KEI_KK_SELECT_053 = "KK_SELECT_053";
	
	/** SQL定義キー(KK_SELECT_056)*/
	private static final String KK_T_WRIB_SVC_KEI_KK_SELECT_056 = "KK_SELECT_056";
	
	/** SQL定義キー(KK_SELECT_036)*/
	private static final String KK_T_ADCHG_DTL_KK_SELECT_036 = "KK_SELECT_036";
	
	/** SQL定義キー(KK_SELECT_036)*/
	private static final String KU_T_KOJIAK_KK_SELECT_033 = "KK_SELECT_033";
	
	/** テーブルアクセスクラス(割引サービス契約)*/
	private JBSbatSQLAccess db_KK_T_WRIB_SVC_KEI = null;
	/** テーブルアクセスクラス(住所変更明細)*/
	private JBSbatSQLAccess db_KK_T_ADCHG_DTL = null;
	/** テーブルアクセスクラス(工事案件)*/
	private JBSbatSQLAccess db_KU_T_KOJIAK = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 単項目チェック項目マップ */
	private HashMap<String, String> singleChkKmkMap = null;

	/** キャンペーン開始コードセット */
	private HashSet<String> campaignStaCdSet = null;

	/** 処理中の割引サービス契約番号格納ストレージ */
	private ThreadLocal<String> currentWribSvcKeiNoStorage=new ThreadLocal<String>();
// ▽▽▽ ANK-3412-00-00 ADD START
	
	/** 高速割対象の料金コースを保持する */
	private  List<String> kosokuwriPcrsCdList = null;
// ▲▲▲ ANK-3412-00-00 ADD END
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_WRIB_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_WRIB_SVC_KEI);
		db_KK_T_ADCHG_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_ADCHG_DTL);
		db_KU_T_KOJIAK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_KOJIAK);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// 単項目チェック用Map生成
		singleChkKmkMap = new HashMap<String, String>();
		singleChkKmkMap.put("TXT-KKIFM386-INF1.WRIB_SVC_KEI_NO","割引サービス契約サービス課金開始日判定用ファイル（集約）.割引サービス契約番号");
		singleChkKmkMap.put("TXT-KKIFM386-INF1.CAMPAIGN_STA_CD","割引サービス契約サービス課金開始日判定用ファイル（集約）.キャンペーン開始コード");
		singleChkKmkMap.put("TXT-KKIFM386-INF1.WRIB_ADD_YMD","割引サービス契約サービス課金開始日判定用ファイル（集約）.割引登録年月日");

		// キャンペーン開始コードセット設定
		campaignStaCdSet = new HashSet<String>();
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//		for(CampaignStaCdEnum cd:CampaignStaCdEnum.values()){
//			campaignStaCdSet.add(cd.name());
//		}
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_CHOKI_USE_WRIB);
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_SOKU_WARI);
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_CHOKZUWRI);
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_TV);
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_TEL);
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_TEL_TV);
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_MBL);
// ▽▽▽ ANK-3412-03-00 ADD START
		campaignStaCdSet.add(JBSbatKKConst.CAMPAIGN_STA_CD_KOSOKU_WRIB);
		
		// 高速割の料金コースコードを保持する。
		kosokuwriPcrsCdList = Arrays.asList(JKKBatCommon.getWorkParamSetteValue(commonItem, JKKStrConst.PARAM_ID_KK_KOSOKUWRI_PCRS).split(","));
// ▲▲▲ ANK-3412-03-00 ADD END
		// ++++++++++ v22.00.00 変更終了 ++++++++++

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		if(!isSingleCheckKKIFM386_INF1(inMap.getMap(), singleChkKmkMap)){
			return null;
		};
		String wribSvcKeiNo=inMap.getString(JBSbatKKIFM386.WRIB_SVC_KEI_NO);
		String campaignStaCd=inMap.getString(JBSbatKKIFM386.CAMPAIGN_STA_CD);
		String wribAddYmd=inMap.getString(JBSbatKKIFM386.WRIB_ADD_YMD);
	    String wribAmntSnstStdardymd=inMap.getString(JBSbatKKIFM386.WRIB_AMNT_SNST_STDARDYMD);
		String wribChrgStaMonStiCd=inMap.getString(JBSbatKKIFM386.WRIB_CHRG_STA_MON_STI_CD);
		String svcShosaYmdNet=inMap.getString(JBSbatKKIFM386.SVC_SHOSA_YMD_NET);
		String svcStaYmdNet=inMap.getString(JBSbatKKIFM386.SVC_STA_YMD_NET);
		String svcChrgStaymdNet=inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_NET);
		String svcStaYmdTel=inMap.getString(JBSbatKKIFM386.SVC_STA_YMD_TEL);
		String svcChrgStaymdTel=inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_TEL);
		String svcStaYmdTv=inMap.getString(JBSbatKKIFM386.SVC_STA_YMD_TV);
		String svcChrgStaymdMob=inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_MOB);
		
// ▽▽▽ ANK-3412-03-00 ADD START
		// 料金コースコードとプラン課金開始日を連携する
		String pcrsCdNet=inMap.getString(JBSbatKKIFM386.PCRS_CD_NET);
		String planChrgStaymdNet=inMap.getString(JBSbatKKIFM386.PLAN_CHRG_STAYMD_NET);
// ▲▲▲ ANK-3412-03-00 ADD END
		
		//キャンペーン開始コードが処理対象のものであることをチェック。
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//		if(!campaignStaCdSet.contains("CD" + campaignStaCd)){
		if(!campaignStaCdSet.contains(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			return null;
		}
		// ++++++++++ v22.00.00 削除開始 ++++++++++
//		CampaignStaCdEnum campaignStaCdEnum;
//		
//		campaignStaCdEnum = CampaignStaCdEnum.valueOf("CD" + campaignStaCd);
		// ++++++++++ v22.00.00 削除終了 ++++++++++

		//割引サービス契約サービス課金開始年月日
		String wribSvcKeiChrgStaymd;
		
		//キャンペーン開始コードに応じた入力に対して、
		//項目チェックを行い、
		//割引サービス課金開始年月日のルールによる導出を行う。
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//		switch(campaignStaCdEnum){
//		case CD51:
		if(JBSbatKKConst.CAMPAIGN_STA_CD_CHOKI_USE_WRIB.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			//項目チェックエラーの場合は導出対象としない
			if(!isSingleCheck(svcChrgStaymdNet,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス課金開始年月日（ネット）")){
				return null;
			}
//v5.00.05 2013.10.15 OM-2013-0003112 ADD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, svcChrgStaymdNet, "", wribAddYmd, "");
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcChrgStaymdNet, "", wribAddYmd, "");
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcChrgStaymdNet, "", wribAddYmd, "", inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		case CD52:
		}
		else if(JBSbatKKConst.CAMPAIGN_STA_CD_SOKU_WARI.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			//項目チェックエラーの場合は導出対象としない
			if(!isSingleCheck(svcChrgStaymdNet,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス課金開始年月日（ネット）")){
				return null;
			}
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, svcChrgStaymdNet, "", wribAddYmd, "");
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcChrgStaymdNet, "", wribAddYmd, "");
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcChrgStaymdNet, "", wribAddYmd, "", inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		case CD53:
		}
		else if(JBSbatKKConst.CAMPAIGN_STA_CD_CHOKZUWRI.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			
	    	// ANK-4543-05-00 MOD START
		    String prcGrpCd=inMap.getString(JBSbatKKIFM386.PRC_GRP_CD_MOB);
			String svcStaymdMob=inMap.getString(JBSbatKKIFM386.SVC_STA_YMD_MOB);			
		    
			super.logPrint.printDebugLog("割引サービス契約番号：：：：：：：" +  wribSvcKeiNo + "-------------------------------");
			super.logPrint.printDebugLog("料金グループモバイル　　　：：：：" +  prcGrpCd);
			super.logPrint.printDebugLog("ネットサービス開始日：：：：：：：" +  svcStaYmdNet);
			super.logPrint.printDebugLog("モバイルサービス開始日：：：：：：" +  svcStaymdMob);
			super.logPrint.printDebugLog("割引額算定基準年月日：：：：：：：" +  wribAmntSnstStdardymd);
			
			//メアド契約(=16)でない　且つ　項目チェックエラーの場合は導出対象としない（メアド以外は従来通りサービス開始年月日（ネット）の設定内容を検査する）
			//if(!isSingleCheck(svcStaYmdNet,"8", "割引サービス契約サービス開始日判定用ファイル（集約）.サービス開始年月日（ネット）")
			//		|!isSingleCheck(wribChrgStaMonStiCd,"1", "割引サービス契約サービス課金開始日判定用ファイル（集約）.割引課金開始月指定コード")){
			//	return null;
			//}
			if(!JBSbatKKConst.PGRP_MOB_16.equals(prcGrpCd)
				&& (!isSingleCheck(svcStaYmdNet,"8", "割引サービス契約サービス開始日判定用ファイル（集約）.サービス開始年月日（ネット）")
					|!isSingleCheck(wribChrgStaMonStiCd,"1", "割引サービス契約サービス課金開始日判定用ファイル（集約）.割引課金開始月指定コード"))){
				return null;
			}

			//割引額算定基準年月日が空ではなくかつ項目チェックエラーの場合は導出対象としない
			boolean isEmptyWribAmntSnstStdardymd=(null==wribAmntSnstStdardymd)||("".equals(wribAmntSnstStdardymd));
			
			if(!isEmptyWribAmntSnstStdardymd&&!isSingleCheck(wribAmntSnstStdardymd,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.割引額算定基準年月日")){
				return null;
			}
			
			//メアド契約(=16)の場合、サービス開始年月日（モバイル）が未設定or不正であれば導出対象としない
			if(JBSbatKKConst.PGRP_MOB_16.equals(prcGrpCd)){
				boolean isEmptySvcStaymdMob=(null==svcStaymdMob)||("".equals(svcStaymdMob));
				if (isEmptySvcStaymdMob||!isSingleCheck(svcStaymdMob,"8", "割引サービス契約サービス開始日判定用ファイル（集約）.サービス開始年月日（モバイル）")){
					return null;
				} else {
					// 正しい日付が設定されている場合、モバイルサービス開始日をネットサービス開始日とする（割引額算定基準年月日の置換用）
					svcStaYmdNet = svcStaymdMob;
				}
			}
			
	    	// ANK-4543-05-00 MOD END
			
			//割引額算定基準年月日が空の場合はサービス開始年月日を割引額算定基準年月日とする。
			wribAmntSnstStdardymd=isEmptyWribAmntSnstStdardymd?svcStaYmdNet:wribAmntSnstStdardymd;
			super.logPrint.printDebugLog("[判定後]割引額算定基準年月日：：：：：" +  wribAmntSnstStdardymd);
			
			
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, wribAmntSnstStdardymd, "", wribAddYmd, wribChrgStaMonStiCd);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, wribAmntSnstStdardymd, "", wribAddYmd, wribChrgStaMonStiCd);
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, wribAmntSnstStdardymd, "", wribAddYmd, wribChrgStaMonStiCd, inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		case CD54:
		}
		else if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_TV.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			//全て評価するために||演算子ではなく|演算子を使用する。
			if(!isSingleCheck(svcStaYmdNet,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス開始年月日（ネット）")
					|!isSingleCheck(svcStaYmdTv,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス開始年月日（ＴＶ）")){
				
// v5.00.06 2013.11.08 OM-2013-0003780 ADD Start
//				return null;
				
				// ダミーセット割の場合に基準日１・基準日２ともに日付が設定されている状態にする
				String baseDate = setDummySetWribStaDate(wribSvcKeiNo, svcStaYmdNet, svcStaYmdTv);
				svcStaYmdNet = baseDate;
				svcStaYmdTv  = baseDate;
				if(isNullBlank(baseDate))
				{
					// 基準日１・基準日２のいずれかが未設定（通常セット割）の場合はnullを返却
					return null;
				}
// v5.00.06 2013.11.08 OM-2013-0003780 ADD End
				
			}
// v6.00.01 add start
			// 住変（解約⇒新規）時は別観点で設定処理を実施
			wribSvcKeiChrgStaymd = retAddChgModStaYmd(inMap);
			
			// 設定済の場合は処理終了
			// ++++++++++ v22.00.00 変更開始 ++++++++++
//			if (isRequired(wribSvcKeiChrgStaymd, ""))
//				break;
			if (!isRequired(wribSvcKeiChrgStaymd, ""))
			// ++++++++++ v22.00.00 変更終了 ++++++++++
//v6.00.01 add end

//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, svcStaYmdNet, svcStaYmdTv, wribAddYmd, "");
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcStaYmdNet, svcStaYmdTv, wribAddYmd, "");
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcStaYmdNet, svcStaYmdTv, wribAddYmd, "", inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		case CD55:
		}
		else if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_TEL.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			//全て評価するために||演算子ではなく|演算子を使用する。
			if(!isSingleCheck(svcChrgStaymdNet,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス課金開始年月日（ネット）")
					|!isSingleCheck(svcChrgStaymdTel,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス課金開始年月日（電話）")){
				
// v5.00.06 2013.11.08 OM-2013-0003780 ADD Start
//				return null;
				
				// ダミーセット割の場合に基準日１・基準日２ともに日付が設定されている状態にする
				String baseDate = setDummySetWribStaDate(wribSvcKeiNo, svcChrgStaymdNet, svcChrgStaymdTel);
				svcChrgStaymdNet = baseDate;
				svcChrgStaymdTel = baseDate;
				if(isNullBlank(svcChrgStaymdNet) && isNullBlank(svcChrgStaymdTel))
				{
					// 基準日１・基準日２のいずれかが未設定（通常セット割）の場合はnullを返却
					return null;
				}
// v5.00.06 2013.11.08 OM-2013-0003780 ADD End

			}
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, svcChrgStaymdNet, svcChrgStaymdTel, wribAddYmd, "");
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcChrgStaymdNet, svcChrgStaymdTel, wribAddYmd, "");
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcChrgStaymdNet, svcChrgStaymdTel, wribAddYmd, "", inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		case CD56:
		}
		else if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_TEL_TV.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			//全て評価するために||演算子ではなく|演算子を使用する。
			if(!isSingleCheck(svcStaYmdTel,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス開始年月日（電話）")
					|!isSingleCheck(svcStaYmdTv,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス開始年月日（ＴＶ）")){
				
// v5.00.06 2013.11.08 OM-2013-0003780 ADD Start
//				return null;
				
				// ダミーセット割の場合に基準日１・基準日２ともに日付が設定されている状態にする
				String baseDate = setDummySetWribStaDate(wribSvcKeiNo, svcStaYmdTel, svcStaYmdTv);
				svcStaYmdTel = baseDate;
				svcStaYmdTv  = baseDate;
				if(isNullBlank(svcStaYmdTel) && isNullBlank(svcStaYmdTv))
				{
					// 基準日１・基準日２のいずれかが未設定（通常セット割）の場合はnullを返却
					return null;
				}
// v5.00.06 2013.11.08 OM-2013-0003780 ADD End

			}
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, svcStaYmdTel, svcStaYmdTv, wribAddYmd, "");
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcStaYmdTel, svcStaYmdTv, wribAddYmd, "");
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcStaYmdTel, svcStaYmdTv, wribAddYmd, "", inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		case CD57:
		}
		else if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_MBL.equals(campaignStaCd)){
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			//全て評価するために||演算子ではなく|演算子を使用する。
			if(!isSingleCheck(svcShosaYmdNet,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス照査年月日（ネット）")
					|!isSingleCheck(svcChrgStaymdMob,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.サービス課金開始年月日（モバイル）")){
				
// v5.00.06 2013.11.08 OM-2013-0003780 ADD Start
//				return null;
				
				// ダミーセット割の場合に基準日１・基準日２ともに日付が設定されている状態にする
				String baseDate = setDummySetWribStaDate(wribSvcKeiNo, svcShosaYmdNet, svcChrgStaymdMob);
				svcShosaYmdNet   = baseDate;
				svcChrgStaymdMob = baseDate;
				
				if(isNullBlank(svcShosaYmdNet) && isNullBlank(svcChrgStaymdMob))
				{
					// 基準日１・基準日２のいずれかが未設定（通常セット割）の場合はnullを返却
					return null;
				}
// v5.00.06 2013.11.08 OM-2013-0003780 ADD End

			}
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(campaignStaCd, svcShosaYmdNet, svcChrgStaymdMob, wribAddYmd, "");
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcShosaYmdNet, svcChrgStaymdMob, wribAddYmd, "");
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcShosaYmdNet, svcChrgStaymdMob, wribAddYmd, "", inMap);
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
//v5.00.05 2013.10.15 OM-2013-0003112 ADD End
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//			break;
//		default:
		}
// ▽▽▽ ANK-3412-03-00 ADD START
		else if (JBSbatKKConst.CAMPAIGN_STA_CD_KOSOKU_WRIB.equals(campaignStaCd))
		{
			if(!isSingleCheck(planChrgStaymdNet,"8", "割引サービス契約サービス課金開始日判定用ファイル（集約）.プラン課金開始年月日（ネット）")){
				return null;
			}
			// 対象の料金コースでない場合、処理しない。（ワーニングメッセージを表示させない）
			if(!kosokuwriPcrsCdList.contains(pcrsCdNet)){
				return null;
			}
			
			// 基準日をルールから算出する
			wribSvcKeiChrgStaymd=resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, planChrgStaymdNet, "", wribAddYmd, "", inMap);
		}
// ▲▲▲ ANK-3412-03-00 ADD END
		else{
		// ++++++++++ v22.00.00 変更終了 ++++++++++
			return null;
		}
		
		//割引サービス課金開始年月日のルールによる導出が失敗した場合
		if(null==wribSvcKeiChrgStaymd||"".equals(wribSvcKeiChrgStaymd)){
			//エラー内容をログ出力
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0010CW", new String[]{
				"割引サービス課金開始年月日のルールによる導出が失敗。当該レコードは破棄。"});
			return null;
		}
		
		//出力値編集
		JBSbatServiceInterfaceMap outMap=new JBSbatServiceInterfaceMap();
		outMap.setString(JBSbatKKIFM387.WRIB_SVC_KEI_NO,wribSvcKeiNo);
		outMap.setString(JBSbatKKIFM387.CAMPAIGN_STA_CD,campaignStaCd);
		outMap.setString(JBSbatKKIFM387.SVC_CHRG_STAYMD_WRIB,wribSvcKeiChrgStaymd);
		outMap.setOutFlg(true);
		// 出力ファイルオブジェクトを生成
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		//出力として設定
		outputItem.addOutMapList(outMap);
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_WRIB_SVC_KEI.close();
		db_KK_T_ADCHG_DTL.close();
		db_KU_T_KOJIAK.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（割引サービス契約サービス課金開始日判定用ファイル（集約））の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-KKIFM386-INF1.WRIB_SVC_KEI_NO			割引サービス契約サービス課金開始日判定用ファイル（集約）.割引サービス契約番号
	 *			 TXT-KKIFM386-INF1.CAMPAIGN_STA_CD			割引サービス契約サービス課金開始日判定用ファイル（集約）.キャンペーン開始コード
	 *			 TXT-KKIFM386-INF1.WRIB_ADD_YMD			割引サービス契約サービス課金開始日判定用ファイル（集約）.割引登録年月日
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckKKIFM386_INF1(HashMap rsMap, HashMap itemvalueMap)
	{
	    String wribSvcKeiNo=(String)rsMap.get(JBSbatKKIFM386.WRIB_SVC_KEI_NO);
	    setCurrentWribSvcKeiNo(wribSvcKeiNo);

		// 単項目チェックを行います
		String strValue = null;

		// 割引サービス契約番号項目チェック
		strValue = (String)rsMap.get("WRIB_SVC_KEI_NO");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.WRIB_SVC_KEI_NO")+toStringCurrentWribSvcKeiNo()});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "12", "12"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.WRIB_SVC_KEI_NO")+toStringCurrentWribSvcKeiNo()});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.WRIB_SVC_KEI_NO")+toStringCurrentWribSvcKeiNo()});
			return false;
		}

		// キャンペーン開始コード項目チェック
		strValue = (String)rsMap.get("CAMPAIGN_STA_CD");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.CAMPAIGN_STA_CD")+toStringCurrentWribSvcKeiNo()});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "2", "2"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.CAMPAIGN_STA_CD")+toStringCurrentWribSvcKeiNo()});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.CAMPAIGN_STA_CD")+toStringCurrentWribSvcKeiNo()});
			return false;
		}

		// 割引登録年月日項目チェック
		strValue = (String)rsMap.get("WRIB_ADD_YMD");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.WRIB_ADD_YMD")+toStringCurrentWribSvcKeiNo()});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "8", "8"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.WRIB_ADD_YMD")+toStringCurrentWribSvcKeiNo()});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{
															(String)itemvalueMap.get("TXT-KKIFM386-INF1.WRIB_ADD_YMD")+toStringCurrentWribSvcKeiNo()});
			return false;
		}

		return true;
	}

	/**
	 * SQLKEY(KK_SELECT_052)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	割引サービス契約番号
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_WRIB_SVC_KEI_KK_SELECT_052(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_WRIB_SVC_KEI.selectBySqlDefine(paramList, KK_T_WRIB_SVC_KEI_KK_SELECT_052);
	}

	/**
	 * SQLKEY(KK_SELECT_053)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	予約適用年月日
	 *		 	割引サービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_WRIB_SVC_KEI_KK_SELECT_053(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_WRIB_SVC_KEI.selectBySqlDefine(paramList, KK_T_WRIB_SVC_KEI_KK_SELECT_053);
	}
	
	/**
	 * SQLKEY(KK_SELECT_056)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	割引サービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_WRIB_SVC_KEI_KK_SELECT_056(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_WRIB_SVC_KEI.selectBySqlDefine(paramList, KK_T_WRIB_SVC_KEI_KK_SELECT_056);
	}
	
	/**
	 * SQLKEY(KK_SELECT_056)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	割引サービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_ADCHG_DTL_KK_SELECT_036(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_ADCHG_DTL.selectBySqlDefine(paramList, KK_T_ADCHG_DTL_KK_SELECT_036);
	}
	
	/**
	 * SQLKEY(KK_SELECT_056)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	割引サービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_KOJIAK_KK_SELECT_033(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KU_T_KOJIAK.selectBySqlDefine(paramList, KU_T_KOJIAK_KK_SELECT_033);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
//v5.00.05 2013.10.15 OM-2013-0003112 ADD Start
//	/**
//	 * 相関ルール：課金開始日設定定義（割引サービス）の呼び出しを行い、
//	 * サービス課金開始年月日を算出し返却します。
//	 * <br>
//	 * @return String RULE89の結果により算出した日付
//	 * @throws Exception メソッド内で発生した例外全般。
//	 */
//	private String resolveChrgStaYmdRule0089(String wribSvcKeiNo, String campaignStaCd,String baseYmd1,String baseYmd2,String wribAddYmd,String wribChrgStaMonStiCd) throws Exception
//	private String resolveChrgStaYmdRule0089(String campaignStaCd,String baseYmd1,String baseYmd2,String wribAddYmd,String wribChrgStaMonStiCd) throws Exception
//v5.00.05 2013.10.15 OM-2013-0003112 ADD End
	/**
	 * 相関ルール：課金開始日設定定義（割引サービス）の呼び出しを行い、
	 * サービス課金開始年月日を算出し返却します。
	 * <br>
	 * @param wribSvcKeiNo 割引サービス契約番号
	 * @param campaignStaCd キャンペーン開始コード
	 * @param baseYmd1 基準日１
	 * @param baseYmd2 基準日２
	 * @param wribAddYmd 割引登録年月日
	 * @param wribChrgStaMonStiCd 割引課金開始月指定コード
	 * @param inMap 入力ファイル情報
	 * @return String RULE89の結果により算出した日付
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private String resolveChrgStaYmdRule0089(String wribSvcKeiNo, String campaignStaCd,String baseYmd1,String baseYmd2,String wribAddYmd,String wribChrgStaMonStiCd, JBSbatServiceInterfaceMap inMap) throws Exception
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
	{
// ▽▽▽ ANK-3412-03-00 ADD START
		String pcrsCdNet=inMap.getString(JBSbatKKIFM386.PCRS_CD_NET);
// ▲▲▲ ANK-3412-03-00 ADD END
		//割引適用基準年月日判定情報
// ▽▽▽  ANK-3412-03-00 Modify START
//		String judgeWribTekioStdardymd= callRule0089001(campaignStaCd, baseYmd1, baseYmd2,wribAddYmd);
		String judgeWribTekioStdardymd= callRule0089001(campaignStaCd, baseYmd1, baseYmd2,wribAddYmd, pcrsCdNet);
// ▲▲▲  ANK-3412-03-00 Modify END
		//割引適用基準年月日
		String wribTekioStdardymd="";
		
		//割引適用基準年月日判定情報 基準日１
		final String RULE_0089001_RESULT_1_BASE_YMD_1="1";
		//割引適用基準年月日判定情報 基準日２
		final String RULE_0089001_RESULT_2_BASE_YMD_2="2";
		//割引適用基準年月日判定情報 基準日１の26ヶ月目の1日
		final String RULE_0089001_RESULT_9_BASE_YMD_1_AFTER="9";
		
		if(RULE_0089001_RESULT_1_BASE_YMD_1.equals(judgeWribTekioStdardymd)){
			//基準日１
			wribTekioStdardymd=baseYmd1;
		}
		if(RULE_0089001_RESULT_2_BASE_YMD_2.equals(judgeWribTekioStdardymd)){
			//基準日２
			wribTekioStdardymd=baseYmd2;
		}
		if(RULE_0089001_RESULT_9_BASE_YMD_1_AFTER.equals(judgeWribTekioStdardymd)){
			//基準日１の26ヶ月目の1日
			
//v5.00.02 2013/03/02 IT1-2013-0000238 mod start
			//基準日１の26ヶ月目(25か月加算後の日付)
			//String afterMonthYmd=JCCBatCommon.addMonth(baseYmd1, 26);
			String afterMonthYmd=JCCBatCommon.addMonth(baseYmd1, 25);
//v5.00.02 2013/03/02 IT1-2013-0000238 mod end
			//基準日１の26ヶ月目の1日
			wribTekioStdardymd=toFirstMonthDayYmd(afterMonthYmd);
		}
		
//v5.00.03 2013/03/03 IT1-2013-0000238 mod start
//		if("".equals(wribTekioStdardymd) ){
		if( null == wribTekioStdardymd || "".equals(wribTekioStdardymd)  ){
//v5.00.03 2013/03/03 IT1-2013-0000238 mod start
			return "";
		}

//v5.00.02 2013/03/02 IT1-2013-0000238 mod start
		//割引サービス課金開始年月日判定情報
		//String judgeChrgStaYmd= callRule0089002(campaignStaCd,wribAddYmd,wribTekioStdardymd,wribChrgStaMonStiCd);
//		String judgeChrgStaYmd = callRule0089002(campaignStaCd, wribAddYmd, wribTekioStdardymd, wribChrgStaMonStiCd, toFirstMonthDayYmd(wribAddYmd));
//v5.00.02 2013/03/02 IT1-2013-0000238 mod end
//v5.00.03 2013/03/03 IT1-2013-0000238 mod start
// v5.00.04 OM-2013-0001240 START
//		String judgeChrgStaYmd = callRule0089002(campaignStaCd, wribAddYmd, wribTekioStdardymd, wribChrgStaMonStiCd, wribTekioStdardymd.substring(wribTekioStdardymd.length()-2));
		String judgeChrgStaYmd = callRule0089002(campaignStaCd, wribAddYmd, wribTekioStdardymd, wribChrgStaMonStiCd, wribTekioStdardymd.substring(wribTekioStdardymd.length()-2), toFirstMonthDayYmd(wribAddYmd));
// v5.00.04 OM-2013-0001240 END
//v5.00.03 2013/03/03 IT1-2013-0000238 mod end

		//割引サービス課金開始年月日
		String chrgStaYmd="";
		
		//割引適用基準年月日判定情報 割引適用基準年月日
		final String RULE_0089002_RESULT_1_WRIB_TEKIO_STDARDYMD="1";
		//割引適用基準年月日判定情報 割引登録年月日の翌月１日
		final String RULE_0089002_RESULT_2_WRIB_ADD_YMD_NEXT_MONTH_FIRST_DAY="2";
		//割引適用基準年月日判定情報 割引登録年月日の前月１日
		final String RULE_0089002_RESULT_3_WRIB_ADD_YMD_PREV_MONTH_FIRST_DAY="3";
		//割引適用基準年月日判定情報 割引登録年月日の当月１日
		final String RULE_0089002_RESULT_4_WRIB_ADD_YMD_FIRST_DAY="4";
		//割引適用基準年月日判定情報 割引適用基準年月日の当月１日
		final String RULE_0089002_RESULT_5_WRIB_TEKIO_STDARDYMD_FIRST_DAY="5";
//v5.00.02 2013/03/02 IT1-2013-0000238 add start
		//割引適用基準年月日判定情報 割引適用基準年月日の翌月１日
		final String RULE_0089002_RESULT_6_WRIB_TEKIO_STDARDYMD_NEXT_FIRST_DAY="6";
//v5.00.02 2013/03/02 IT1-2013-0000238 madd end
		
		
		if(RULE_0089002_RESULT_1_WRIB_TEKIO_STDARDYMD.equals(judgeChrgStaYmd)){
			//割引適用基準年月日
			chrgStaYmd=wribTekioStdardymd;
		}
		if(RULE_0089002_RESULT_2_WRIB_ADD_YMD_NEXT_MONTH_FIRST_DAY.equals(judgeChrgStaYmd)){
//v5.00.05 2013.10.15 OM-2013-0003112 ADD Start
//			//割引登録年月日の翌月１日
//			chrgStaYmd=toFirstMonthDayYmd(JCCBatCommon.addMonth(wribAddYmd, 1));
			
			String[] param = {wribSvcKeiNo, this.opeDate, this.opeDate};
			executeKK_T_WRIB_SVC_KEI_KK_SELECT_052(param);
			if(db_KK_T_WRIB_SVC_KEI.selectNext() != null)
			{
//v6.00.00 2013.12.04 OM-2013-0004765 MOD Start
				//割引年月日の当月１日
//				chrgStaYmd = toFirstMonthDayYmd(JCCBatCommon.addMonth(wribAddYmd, 0));
				String currentMonth1st = toFirstMonthDayYmd(JCCBatCommon.addMonth(wribAddYmd, 0));
				
				// セット割で遅いほうの課金開始日を取得する
				// ++++++++++ v22.00.00 変更開始 ++++++++++
//				CampaignStaCdEnum cpStaCdEnum = CampaignStaCdEnum.valueOf("CD" + campaignStaCd);
//				if(cpStaCdEnum.equals(CampaignStaCdEnum.CD54))
				if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_TV.equals(campaignStaCd))
				// ++++++++++ v22.00.00 変更終了 ++++++++++
				{
					chrgStaYmd = getChrgStaYmdSnstForSetWrib(baseYmd1, inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_NET), 
														baseYmd2, inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_TV), currentMonth1st);
				}
				// ++++++++++ v22.00.00 変更開始 ++++++++++
//				else if(cpStaCdEnum.equals(CampaignStaCdEnum.CD56))
				else if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_TEL_TV.equals(campaignStaCd))
				// ++++++++++ v22.00.00 変更終了 ++++++++++
				{
					chrgStaYmd = getChrgStaYmdSnstForSetWrib(baseYmd1, inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_TEL), 
														baseYmd2, inMap.getString(JBSbatKKIFM386.SVC_CHRG_STAYMD_TV), currentMonth1st);
				}
				else
				{
					chrgStaYmd = currentMonth1st;
				}
//v6.00.00 2013.12.04 OM-2013-0004765 MOD End
			}
			else
			{
				//割引登録年月日の翌月１日
				chrgStaYmd=toFirstMonthDayYmd(JCCBatCommon.addMonth(wribAddYmd, 1));
			}
//v5.00.05 2013.10.15 OM-2013-0003112 ADD End
		}
		if(RULE_0089002_RESULT_3_WRIB_ADD_YMD_PREV_MONTH_FIRST_DAY.equals(judgeChrgStaYmd)){
			//割引登録年月日の前月１日
			chrgStaYmd=toFirstMonthDayYmd(JCCBatCommon.addMonth(wribAddYmd, -1));
		}
		if(RULE_0089002_RESULT_4_WRIB_ADD_YMD_FIRST_DAY.equals(judgeChrgStaYmd)){
			//割引登録年月日の当月１日
			chrgStaYmd=toFirstMonthDayYmd(wribAddYmd);
		}
		if(RULE_0089002_RESULT_5_WRIB_TEKIO_STDARDYMD_FIRST_DAY.equals(judgeChrgStaYmd)){
			//割引適用月の当月１日(割引適用基準年月日の当月１日)
			chrgStaYmd=toFirstMonthDayYmd(wribTekioStdardymd);
		}
//v5.00.02 2013/03/02 IT1-2013-0000238 add start
		if(RULE_0089002_RESULT_6_WRIB_TEKIO_STDARDYMD_NEXT_FIRST_DAY.equals(judgeChrgStaYmd)){
			//割引適用月の翌月１日(割引適用基準年月日の翌月１日)
			chrgStaYmd=toFirstMonthDayYmd(JCCBatCommon.addMonth(wribTekioStdardymd, 1));
		}
//v5.00.02 2013/03/02 IT1-2013-0000238 add end
//v5.00.07 2013/11/20 OM-2013-0003969 add start
		// ++++++++++ v22.00.00 変更開始 ++++++++++
//		CampaignStaCdEnum campaignStaCdEnum = CampaignStaCdEnum.valueOf("CD" + campaignStaCd);
//		if(campaignStaCdEnum.equals(CampaignStaCdEnum.CD54) && RULE_0089002_RESULT_6_WRIB_TEKIO_STDARDYMD_NEXT_FIRST_DAY.equals(judgeChrgStaYmd) &&
//			wribTekioStdardymd.endsWith("01")){
// ANK-2683-00-00 DEL START
//		if(JBSbatKKConst.CAMPAIGN_STA_CD_SET_WRIB_NET_TV.equals(campaignStaCd) && RULE_0089002_RESULT_6_WRIB_TEKIO_STDARDYMD_NEXT_FIRST_DAY.equals(judgeChrgStaYmd) &&
//			wribTekioStdardymd.endsWith("01")){
//		// ++++++++++ v22.00.00 変更終了 ++++++++++
//			
//			// ネット・ＴＶセット割の場合で、ルールの算出結果が、"割引適用基準年月日の翌月１日"で割引適用基準日が月初の場合は割引適用基準日を設定する
//			chrgStaYmd=wribTekioStdardymd;
//		}
// ANK-2683-00-00 DEL END
//v5.00.07 2013/11/20 OM-2013-0003969 add end
		return chrgStaYmd;
	}

	/**
	 * @param ymd
	 * @return
	 */
	private String toFirstMonthDayYmd(String ymd) {
		return JCCBatCommon.toYearFromYmd(ymd)+JCCBatCommon.toMonthFromYmd(ymd)+"01";
	}

	/**
	 * @param campaignStaCd
	 * @param baseYmd1
	 * @param baseYmd2
	 * @param wribAddYmd
	 * @return
	 * @throws ParseException
	 */
	private String callRule0089001(String campaignStaCd, String baseYmd1,
// ▽▽▽ ANK-3412-03-00 Modify START
//			String baseYmd2, String wribAddYmd) throws ParseException {
			String baseYmd2, String wribAddYmd, String pcrsCd) throws ParseException {
// ▲▲▲ ANK-3412-03-00 Modify END
		//割引サービス契約の割引登録年月日の月初
		String wribAddYmdFirst=toFirstMonthDayYmd(wribAddYmd);
		//割引サービス契約の割引登録年月日の翌月月初
		String wribAddYmdYkgtuFirst=JCCBatCommon.addMonth(wribAddYmdFirst, 1);

		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("CAMPAIGN_STA_CD", campaignStaCd);
		map.put("BASE_YMD_1", baseYmd1);
		map.put("BASE_YMD_2", baseYmd2);
		map.put("WRIB_ADD_YMD_FIRST", wribAddYmdFirst);
		map.put("WRIB_ADD_YMD_YKGTU_FIRST", wribAddYmdYkgtuFirst);
// ▽▽▽ ANK-3412-03-00 ADD START
		// ルールに料金コースコードを追加する。
		map.put("PCRS_CD", pcrsCd);
// ▲▲▲ ANK-3412-03-00 ADD END
		
		// ルールの呼び出し
		JRuleXMLHandler xmlHandler = JCCBatCommon.createSokanRuleEngine("RULE0089001", JRuleXMLPattern.SINGLE_MODE_TYPE);
		ArrayList<ArrayList<HashMap<String, Object>>> resultList = JCCBatCommon.getCheckResultArray(xmlHandler, map);
		
		if(resultList.get(0)==null){
			return "";
		}
		//ルール出力(割引適用基準年月日)
		String judgeRslt=(String)resultList.get(0).get(0).get("JUDGE_RSLT");
		return judgeRslt;
	}
	/**
	 * @param campaignStaCd
	 * @param wribAddYmd
	 * @param wribTekioStdardymd
	 * @param wribChrgStaMonStiCd
	 * @param wribAddYmdTgOneDay
	 * @return
	 * @throws ParseException
	 */

//v5.00.02 2013/03/02 IT1-2013-0000238 mod start
//	private String callRule0089002(String campaignStaCd,String wribAddYmd,String wribTekioStdardymd,String wribChrgStaMonStiCd) throws ParseException {
//	private String callRule0089002(String campaignStaCd, 
//									String wribAddYmd,
//									String wribTekioStdardymd, 
//									String wribChrgStaMonStiCd,
//									String wribAddYmdTgOneDay )throws ParseException {
//v5.00.02 2013/03/02 IT1-2013-0000238 mod end
//v5.00.03 2013/03/03 IT1-2013-0000238 mod start
		private String callRule0089002(String campaignStaCd, 
				String wribAddYmd,
				String wribTekioStdardymd, 
				String wribChrgStaMonStiCd,
// v5.00.04 OM-2013-0001240 START
//				String wribTekioStdardymdDd )throws ParseException {
				String wribTekioStdardymdDd,
				String wribAddYmdTgOneDay)throws ParseException {
// v5.00.04 OM-2013-0001240 END
//v5.00.03 2013/03/03 IT1-2013-0000238 mod end

		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("CAMPAIGN_STA_CD", campaignStaCd);
		map.put("WRIB_ADD_YMD", wribAddYmd);
		map.put("WRIB_TEKIO_STDARDYMD", wribTekioStdardymd);
		map.put("WRIB_CHRG_STA_MON_STI_CD", wribChrgStaMonStiCd);
//v5.00.02 2013/03/02 IT1-2013-0000238 add start
		map.put("WRIB_ADD_YMD_TG_ONE_DAY", wribAddYmdTgOneDay);//割引サービス契約の割引登録年月日の1日
//v5.00.02 2013/03/02 IT1-2013-0000238 add end
//v5.00.03 2013/03/03 IT1-2013-0000238 add start
		map.put("WRIB_TEKIO_STDARDYMD_DD", wribTekioStdardymdDd);//割引適用基準年月日の日
//v5.00.03 2013/03/03 IT1-2013-0000238 add end
		// ルールの呼び出し
		JRuleXMLHandler xmlHandler = JCCBatCommon.createSokanRuleEngine("RULE0089002", JRuleXMLPattern.SINGLE_MODE_TYPE);
		ArrayList<ArrayList<HashMap<String, Object>>> resultList = JCCBatCommon.getCheckResultArray(xmlHandler, map);
		
		if(resultList.get(0)==null){
			return "";
		}
		//ルール出力(割引サービス課金開始年月日)
		String judgeRslt=(String)resultList.get(0).get(0).get("JUDGE_RSLT");
		return judgeRslt;
	}
	
	private boolean isRequired(String strValue,String replacement){
		if(strValue == null || "".equals(strValue))
		{
//v5.00.01 2013/02/25 del start 相関ルールによる算出を行うか判定用であるため、エラーログは出力しない
			//commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{replacement+toStringCurrentWribSvcKeiNo()});
//v5.00.01 2013/02/25 del end
			return false;
		}
		return true;
	}

	private boolean isSized(String strValue,String size,String replacement){
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", size, size}))
		{
//v5.00.01 2013/02/25 del start 相関ルールによる算出を行うか判定用であるため、エラーログは出力しない
			//commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{replacement+toStringCurrentWribSvcKeiNo()});
//v5.00.01 2013/02/25 del end
			return false;
		}
		return true;
	}

	private boolean isFormed(String strValue,String replacement){
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
//v5.00.01 2013/02/25 del start 相関ルールによる算出を行うか判定用であるため、エラーログは出力しない
			//commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{replacement+toStringCurrentWribSvcKeiNo()});
//v5.00.01 2013/02/25 del end
			return false;
		}
		return true;
	}
	private boolean isSingleCheck(String strValue,String size,String replacement){
		if(!isRequired(strValue, replacement)||!isSized(strValue, size, replacement)||!isFormed(strValue, replacement))
		{
			return false;
		}
		return true;
	}
	
	private void setCurrentWribSvcKeiNo(String currentWribSvcKeiNo){
		currentWribSvcKeiNoStorage.set(currentWribSvcKeiNo);
	}

	private String toStringCurrentWribSvcKeiNo(){
		String currentWribSvcKeiNo=currentWribSvcKeiNoStorage.get();
		currentWribSvcKeiNo=(currentWribSvcKeiNo==null)?"":currentWribSvcKeiNo;
		
		return "(割引サービス契約番号:"+currentWribSvcKeiNo+")";
	}

// v5.00.06 2013.11.08 OM-2013-0003780 ADD Start
	/**
	 * ダミーセット割の場合で基準日がNULLの場合、もう片方の日付を設定する
	 * @param baseDate1 基準日１
	 * @param baseDate2 基準日２
	 * @throws Exception 
	 */
	private String setDummySetWribStaDate(String wribSvcKeiNo, String baseDate1, String baseDate2) throws Exception
	{
		String[] param = {this.opeDate, wribSvcKeiNo, this.opeDate};
		executeKK_T_WRIB_SVC_KEI_KK_SELECT_053(param);
		
		String baseDate = null;
		if(db_KK_T_WRIB_SVC_KEI.selectNext() != null)
		{
			if(isNullBlank(baseDate1))
			{
				baseDate = baseDate2;
			}
			else
			{
				baseDate = baseDate1;
			}
		}
		return baseDate;
	}

	private boolean isNullBlank(String value)
	{
		if(value == null || value.isEmpty())
		{
			return true;
		}
		return false;
	}
// v5.00.06 2013.11.08 OM-2013-0003780 ADD End
// v6.00.00 2013.12.04 OM-2013-0004765 ADD Start
	/**
	 * セット割の設定すべき課金開始日を算出する（基準日がサービス開始日のもの）
	 * ・対象となるサービス契約のサービス課金開始日の遅い方と割引登録日の当月１日と比較し、遅い方の日付を返却する。
	 * ・なお、サービス契約のサービス開始日とサービス課金開始日が同月である場合、翌月１日をサービス課金開始日とする。
	 * 
	 * @param staYmd1     基準日１のサービス開始日
	 * @param chrgStaYmd1 基準日１のサービス課金開始日
	 * @param staYmd2     基準日２のサービス開始日
	 * @param chrgStaYmd2 基準日２のサービス課金開始日
	 * @param curMon1st   割引登録日の当月１日
	 * @return chrgStaYmd 算出された課金開始日
	 * @throws ParseException 
	 */
	private String getChrgStaYmdSnstForSetWrib(String staYmd1, String chrgStaYmd1, String staYmd2, String chrgStaYmd2, String curMon1st) throws ParseException
	{
		String chrgStaYmd = "";
		if(chrgStaYmd1.compareTo(chrgStaYmd2) < 0)
		{
			if(chrgStaYmd2.substring(0, 6).equals(staYmd2.substring(0, 6)))
			{
				// サービス開始日と課金開始日が同月のため、翌月１日を設定する
				chrgStaYmd = JPCDateUtil.addMonth(staYmd2.substring(0, 6) + "01", 1);
			}
			else
			{
				// 課金開始日が月中であることを考慮し、月初日を設定する
				chrgStaYmd = chrgStaYmd2.substring(0, 6) + "01";
			}
		}
		else
		{
			if(chrgStaYmd1.substring(0, 6).equals(staYmd1.substring(0, 6)))
			{
				// サービス開始日と課金開始日が同月のため、翌月１日を設定する
				chrgStaYmd = JPCDateUtil.addMonth(staYmd1.substring(0, 6) + "01", 1);
			}
			else
			{
				// 課金開始日が月中であることを考慮し、月初日を設定する
				chrgStaYmd = chrgStaYmd1.substring(0, 6) + "01";
			}
		}
		
		// 上で算出した日付より、課金開始日より割引登録日当月１日の方が遅い場合、日付を上書きする
		if(curMon1st.compareTo(chrgStaYmd) > 0)
		{
			chrgStaYmd = curMon1st;
		}
		
		return chrgStaYmd;
	}
// v6.00.00 2013.12.04 OM-2013-0004765 ADD End
	
// v6.00.01 add start
	
	/**
	 * 
	 * 住所変更による割引の特定を行う.
	 * 
	 * @param  wribSvcKeiNo
	 * @param  netSvcKeiNo
	 * @param  tvSvcKeiNo
	 * @return 
	 * @throws Exception 
	 */
	private boolean isWribAddrChgModDelForNew(String wribSvcKeiNo) throws Exception {
		
		// 住所変更対象のセット割かどうか
		executeKK_T_WRIB_SVC_KEI_KK_SELECT_056(new String[] {wribSvcKeiNo, this.opeDate});
		
		if(this.db_KK_T_WRIB_SVC_KEI.selectNext() == null) {
			return false;
		}
		
		return true;
	}
	
	/** 
	 * 
	 * 該当サービスが住変で解約／新規されているかどうか
	 * 
	 * @param  tgSvcKeiNo
	 * @return 
	 * @throws Exception 
	 */
	private boolean isAddrDelNew(String tgSvcKeiNo) throws Exception {
		
		JBSbatCommonDBInterface tgInf = new JBSbatCommonDBInterface();
		
		executeKK_T_ADCHG_DTL_KK_SELECT_036(new String[] {tgSvcKeiNo});
		
		while(null != (tgInf = this.db_KK_T_ADCHG_DTL.selectNext())) {
			
			// 一致しない場合は,解約新規
			if (isRequired(tgInf.getString(JBSbatKK_T_ADCHG_DTL.CHBF_SKBT_NO), "") && 
					!tgSvcKeiNo.equals(tgInf.getString(JBSbatKK_T_ADCHG_DTL.CHBF_SKBT_NO)))
				return true;
		}
		return false;
	}
	
	/**
	 * 
	 * 住変を考慮したサービス課金開始年月日を返却する.
	 * 
	 * @paramm tgMap
	 * @throws Exception 
	 */
	private String retAddChgModStaYmd(JBSbatServiceInterfaceMap tgMap) throws Exception {
		
		String wribSvcKeiNo   = tgMap.getString(JBSbatKKIFM386.WRIB_SVC_KEI_NO);
		String netSvcKeiNo    = tgMap.getString(JBSbatKKIFM386.SVC_KEI_NO_NET);
		String tvSvcKeiNo     = tgMap.getString(JBSbatKKIFM386.SVC_KEI_NO_TV);
		
		String campaignStaCd  = tgMap.getString(JBSbatKKIFM386.CAMPAIGN_STA_CD);
		String wribAddYmd     = tgMap.getString(JBSbatKKIFM386.WRIB_ADD_YMD);
		
		// 住変で対象外
		if (!isWribAddrChgModDelForNew(wribSvcKeiNo))
			return "";
		
		// 解約／新規判定
		boolean isNetAddrMod = isAddrDelNew(netSvcKeiNo);
		boolean isTvAddrMod  = isAddrDelNew(tvSvcKeiNo);
		
		// 以降は解約新規の住変として扱う
		if (isNetAddrMod || isTvAddrMod) {
			
			// 解約新規    ：工事有⇒工事案件実施年月日、工事無⇒オンライン運用日
			// 解約新規以外：サービス開始日
			String svcStaYmdNet   = isNetAddrMod ? retKijunYmd(netSvcKeiNo) : tgMap.getString(JBSbatKKIFM386.SVC_STA_YMD_NET);
			String svcStaYmdTv    = isTvAddrMod  ? retKijunYmd(tvSvcKeiNo)  : tgMap.getString(JBSbatKKIFM386.SVC_STA_YMD_TV);
			
			return resolveChrgStaYmdRule0089(wribSvcKeiNo, campaignStaCd, svcStaYmdNet, svcStaYmdTv, wribAddYmd, "", tgMap);
		}
		
		return "";
	}
	
	/** 
	 * 
	 * 工事有無を判断し、基準日を返却する.
	 * 
	 * @param  tgSvcKeiNo
	 * @throws Exception 
	 */
	private String retKijunYmd(String tgSvcKeiNo) throws Exception {
		
		JBSbatCommonDBInterface tgInf = new JBSbatCommonDBInterface();
		
		executeKU_T_KOJIAK_KK_SELECT_033(new String[] {tgSvcKeiNo});
		
		while(null != (tgInf = this.db_KU_T_KOJIAK.selectNext())) {
			
			if (isRequired(tgInf.getString(JBSbatKU_T_KOJIAK.KOJIAK_JSSI_YMD), ""))
				return tgInf.getString(JBSbatKU_T_KOJIAK.KOJIAK_JSSI_YMD);
		}
		
		return this.opeDate;
	}
//v6.00.01 add end
	
}
// ++++++++++ v22.00.00 削除開始 ++++++++++
//enum CampaignStaCdEnum{CD51,CD52,CD53,CD54,CD55,CD56,CD57}
// ++++++++++ v22.00.00 削除終了 ++++++++++