/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKHiChrgJdgUtil
*   ソースファイル名：JKKHiChrgJdgUtil.java
*   作成者          ：富士通
*   日付            ：2012年10月22日
*＜機能概要＞
*   非課金判定処理クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/10/22   FJ)近藤     新規作成
*   v5.00       2013/07/16   FJ)砂川     【TG1-2013-0000704】サービス契約の遡及解約対応
*	v37.00.00   2018/03/09   FJ) 澤田    【ANK-3366-00-00】eo光設備卸対応
**********************************************************************/
package eo.common.util;

import java.text.ParseException;
import java.util.HashMap;

public class JKKHiChrgJdgUtil {
	
	/** 課金フラグ */
	private static final String CHRG = "1";
	/** 非課金フラグ */
	private static final String HICHRG = "0";
	/** 解約種別フラグ：サービス契約解約 */
	private static final String SVCKEI_DSL = "1";
	/** 解約種別フラグ：オプションサービス契約解約 */
	private static final String OPSVCKEI_DSL = "2";
	/** 解約種別フラグ：サブオプションサービス契約解約 */
	private static final String SBOPSVCKEI_DSL = "3";
	/** オプションサービスコード：通知明細送付 */
	private static final String B028 = "B028";
	
	/**
	 * 非課金判定処理<br>
	 * <br>
	 * @param jdgHiChrgMap 非課金判定マップ
	 * @return jdgHiChrgMap 非課金判定マップ
	 * @throws ParseException 
	 * @exception Exceptionがスローされます。
	 */
	public static HashMap<String, Object> jdgHiChrg(HashMap<String, Object> jdgHiChrgMap) throws IllegalArgumentException, ParseException
	{
		// パラメータチェック
		if (paramCheack(jdgHiChrgMap))
		{
			// サービス課金終了日
			jdgHiChrgMap.put("svcChrgEndYmd", "");
			// 課金フラグ
			jdgHiChrgMap.put("chrgFlg", "");
			
			return jdgHiChrgMap;
		}
		
		// 非課金判定処理
		// 初期値設定
		String chrgFlg = CHRG; // 課金フラグ
		// 解約種別フラグ
		String dslSbtFlg = (String)jdgHiChrgMap.get("dslSbtFlg");
		// サービス契約サービス課金開始日
		String svcChrgStaYmd = "";
		// サービス課金終了年月日
		String svcChrgEndYmd = "";
		
		// 解約種別フラグが"1":サービス契約解約
		if (SVCKEI_DSL.equals(dslSbtFlg))
		{
			// サービス課金終了年月日
			svcChrgEndYmd = (String)jdgHiChrgMap.get("svcKeiChrgEndYmd");
			// サービス契約サービス課金開始日
			svcChrgStaYmd = (String)jdgHiChrgMap.get("svcKeiChrgStaYmd");
			
			// 解約時期判定
			// サービス契約課金開始前解約
			if (0 < JPCDateUtil.subtractDay(svcChrgStaYmd, svcChrgEndYmd))
			{
				// 非課金
				chrgFlg = HICHRG;
			}
			// サービス契約課金開始後解約
			// 初期値（課金）
		}
		
		// 解約種別フラグが"2":オプションサービス契約解約
		if (OPSVCKEI_DSL.equals(dslSbtFlg))
		{
			// オプションサービス契約サービス利用開始日
			String opSvcUseStaYmd = (String)jdgHiChrgMap.get("opSvcUseStaYmd");
			// オプションサービス契約サービス利用終了日
			String opSvcUseEndYmd = (String)jdgHiChrgMap.get("opSvcUseEndYmd");
			
			// オプションサービスコードが通知明細送付でない
			if (!B028.equals((String)jdgHiChrgMap.get("opSvcCd")))
			{
				
				// サービス課金終了年月日
				// 2013/7/16 TG1-2013-0000704 Mod Start
//				svcChrgEndYmd = JPCDateUtil.addDay((String)jdgHiChrgMap.get("opSvcUseEndYmd"), -1);
				if(null != jdgHiChrgMap.get("svcKeiChrgEndYmd") && !("".equals(jdgHiChrgMap.get("svcKeiChrgEndYmd"))))
				{
					// サービス契約サービス課金終了年月日が設定されている場合
					// サービス契約の解約が契機による解約
					svcChrgEndYmd = (String)jdgHiChrgMap.get("svcKeiChrgEndYmd");
				}
				else
				{
					// サービス契約サービス課金終了年月日が設定されていない場合
					// オプションサービス契約の単独解約が契機による解約
					svcChrgEndYmd = JPCDateUtil.addDay((String)jdgHiChrgMap.get("opSvcUseEndYmd"), -1);
				}
				// 2013/7/16 TG1-2013-0000704 Mod End
				// サービス契約サービス課金開始日
				svcChrgStaYmd = (String)jdgHiChrgMap.get("svcKeiChrgStaYmd");
				
				// 解約時期判定
				// サービス契約課金開始前解約
				if (0 < JPCDateUtil.subtractDay(svcChrgStaYmd, svcChrgEndYmd))
				{
					// 非課金
					chrgFlg = HICHRG;
				}
				// サービス契約課金開始後解約
				else
				{
					// 解約時期判定
					// 登録日と同日の解約
					if (0 == JPCDateUtil.subtractDay(opSvcUseStaYmd, opSvcUseEndYmd))
					{
						// 非課金
						chrgFlg = HICHRG;
					}
					// 登録日と同日でない
					// 初期値（課金）
				}
			}
			// オプションサービスコードが通知明細送付
			else
			{
				// サービス契約サービス課金終了日の有無チェック
				if (null != (String)jdgHiChrgMap.get("svcKeiChrgEndYmd") 
						&& !"".equals((String)jdgHiChrgMap.get("svcKeiChrgEndYmd")))
				{
					// サービス契約解約
					// オプションサービス利用開始日よりサービス契約課金終了日が後の場合
					if (0 <= JPCDateUtil.subtractDay((String)jdgHiChrgMap.get("svcKeiChrgEndYmd"), opSvcUseStaYmd))
					{
						// 課金
						chrgFlg = CHRG;
						// サービス課金終了日
						svcChrgEndYmd = (String)jdgHiChrgMap.get("svcKeiChrgEndYmd");
					}
				}
				else
				{
					// オプションサービス契約サービス利用終了日の前月日取得
					String zngtuDate = JPCDateUtil.addMonth((String)jdgHiChrgMap.get("opSvcUseEndYmd"), -1);
					// 前月の末日取得
					String lastDate = JPCDateUtil.getEndOfMonth(zngtuDate);
					// サービス課金終了年月日
					svcChrgEndYmd = zngtuDate.substring(0, 6) + lastDate;
					
					// 解約時期判定
					// 登録月の同月内解約
					if (0 == JPCDateUtil.subtractMonth(opSvcUseStaYmd, opSvcUseEndYmd))
					{
						// 非課金
						chrgFlg = HICHRG;
					}
					// 登録日の翌月以降解約
					// 初期値（課金）	
				}
			}
		}
		
		// 解約種別フラグが"3":サブオプションサービス契約解約
		if (SBOPSVCKEI_DSL.equals(dslSbtFlg))
		{
			// サービス課金終了年月日
			// 2013/7/16 TG1-2013-0000704 Mod Start
//			svcChrgEndYmd = JPCDateUtil.addDay((String)jdgHiChrgMap.get("subOpSvcUseEndYmd"), -1);
			if(null != jdgHiChrgMap.get("svcKeiChrgEndYmd") && !("".equals(jdgHiChrgMap.get("svcKeiChrgEndYmd"))))
			{
				// サービス契約サービス課金終了年月日が設定されている場合
				// サービス契約の解約が契機による解約
				svcChrgEndYmd = (String)jdgHiChrgMap.get("svcKeiChrgEndYmd");
			}
			else
			{
				// サービス契約サービス課金終了年月日が設定されていない場合
				// オプションサービス契約の解約またはサブオプションサービス契約の単独解約が契機による解約
				svcChrgEndYmd = JPCDateUtil.addDay((String)jdgHiChrgMap.get("subOpSvcUseEndYmd"), -1);
			}
			// 2013/7/16 TG1-2013-0000704 Mod End
			
			// 解約時期判定
			// オプションサービス契約課金開始前解約
			if (0 < JPCDateUtil.subtractDay((String)jdgHiChrgMap.get("svcKeiChrgStaYmd"), svcChrgEndYmd))
			{
				// 非課金
				chrgFlg = HICHRG;
			}
			// オプションサービス契約課金開始後解約
			else
			{
				// 登録日と同日解約
				if (0 == JPCDateUtil.subtractDay((String)jdgHiChrgMap.get("subOpSvcUseStaYmd"), 
						(String)jdgHiChrgMap.get("subOpSvcUseEndYmd")))
				{
					// 非課金
					chrgFlg = HICHRG;
				}
			}
		}
		
		// サービス課金終了日
		jdgHiChrgMap.put("svcChrgEndYmd", svcChrgEndYmd);
		// 課金フラグ
		jdgHiChrgMap.put("chrgFlg", chrgFlg);
		
		return jdgHiChrgMap;
		
	}
	
	private static boolean paramCheack(HashMap<String, Object> jdgHiChrgMap) throws IllegalArgumentException
	{
		// チェックエラーフラグ
		boolean chkErr = false;
		// 解約種別フラグ
		if (null == jdgHiChrgMap.get("dslSbtFlg") || "".equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			chkErr = true;
			
			return chkErr;
		}
		// 解約種別フラグ値チェック
		else if (!SVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")) && 
					!OPSVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")) && 
					!SBOPSVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			chkErr = true;
			
			return chkErr;
		}
		
		// 解約種別フラグが"1"：サービス契約解約の場合
		if (SVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			// サービス契約サービス課金開始日
			if (null == jdgHiChrgMap.get("svcKeiChrgStaYmd") || "".equals(jdgHiChrgMap.get("svcKeiChrgStaYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// サービス契約サービス課金終了日
			if (null == jdgHiChrgMap.get("svcKeiChrgEndYmd") || "".equals(jdgHiChrgMap.get("svcKeiChrgEndYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
		}
		
		// 解約種別フラグが"2"：オプションサービス契約解約の場合
		if (OPSVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			// オプションサービスコード
			if (null == jdgHiChrgMap.get("opSvcCd") || "".equals(jdgHiChrgMap.get("opSvcCd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// オプションサービス契約サービス利用開始日
			if (null == jdgHiChrgMap.get("opSvcUseStaYmd") || "".equals(jdgHiChrgMap.get("opSvcUseStaYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// オプションサービス契約サービス利用終了日
			if (null == jdgHiChrgMap.get("opSvcUseEndYmd") || "".equals(jdgHiChrgMap.get("opSvcUseEndYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
		}
		// 解約種別フラグが"3"：サブオプションサービス契約解約の場合
		if (SBOPSVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			// オプションサービス契約サービス課金開始日
			if (null == jdgHiChrgMap.get("svcKeiChrgStaYmd") || "".equals(jdgHiChrgMap.get("svcKeiChrgStaYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// サブオプションサービス契約サービス利用開始日
			if (null == jdgHiChrgMap.get("subOpSvcUseStaYmd") || "".equals(jdgHiChrgMap.get("subOpSvcUseStaYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// サブオプションサービス契約サービス利用終了日
			if (null == jdgHiChrgMap.get("subOpSvcUseEndYmd") || "".equals(jdgHiChrgMap.get("subOpSvcUseEndYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
		}
		return chkErr;
	}

	// ANK-3366-00-00 ADD START
	/**
	 * 非課金判定処理(eo光卸用)<br>
	 * <br>
	 * @param jdgHiChrgMap 非課金判定マップ
	 * @return jdgHiChrgMap 非課金判定マップ
	 */
	public static HashMap<String, Object> jdgHiChrgOrs(HashMap<String, Object> jdgHiChrgMap)
	{
		// パラメータチェック
		if (paramCheackOrs(jdgHiChrgMap))
		{
			// サービス課金開始日
			jdgHiChrgMap.put("svcChrgStaYmd", "");
			// 課金フラグ
			jdgHiChrgMap.put("chrgFlg", "");

			return jdgHiChrgMap;
		}

		// 非課金判定処理
		// 初期値設定
		String chrgFlg = CHRG; // 課金フラグ
		// 解約種別フラグ
		String dslSbtFlg = (String)jdgHiChrgMap.get("dslSbtFlg");
		// サービス課金開始日
		String svcChrgStaYmd = "";

		// 解約種別フラグが"1":サービス契約解約
		if (SVCKEI_DSL.equals(dslSbtFlg))
		{
			// サービス契約サービス利用開始日
			String svcKeiUseStaYmd = (String)jdgHiChrgMap.get("svcKeiUseStaYmd");
			// サービス契約サービス利用終了日
			String svcKeiUseEndYmd = (String)jdgHiChrgMap.get("svcKeiUseEndYmd");
			// サービス契約サービス課金開始日
			String svcKeiChrgStaYmd = (String)jdgHiChrgMap.get("svcKeiChrgStaYmd");

			// 解約時期判定
			// サービス契約開始前解約
			if (0 < JPCDateUtil.subtractDay(svcKeiUseStaYmd, svcKeiUseEndYmd))
			{
				// 非課金
				chrgFlg = HICHRG;
			}
			// サービス契約開始後解約
			else
			{
				// サービス利用開始日と同日の解約
				if (0 == JPCDateUtil.subtractDay(svcKeiUseStaYmd, svcKeiUseEndYmd))
				{
					// 非課金
					chrgFlg = HICHRG;
				}
				// サービス利用開始日 ＜ サービス利用終了日
				else
				{
					// 課金(初期値)
					// 遡及解約(サービス利用終了日 ≦ サービス課金開始日)の場合
					if (0 <= JPCDateUtil.subtractDay(svcKeiChrgStaYmd, svcKeiUseEndYmd))
					{
						// サービス課金開始日にサービス開始年月日を設定する
						svcChrgStaYmd = svcKeiUseStaYmd;
					}
				}
			}
		}

		// サービス課金開始日
		jdgHiChrgMap.put("svcChrgStaYmd", svcChrgStaYmd);
		// 課金フラグ
		jdgHiChrgMap.put("chrgFlg", chrgFlg);

		return jdgHiChrgMap;
	}

	/**
	 * パラメータチェック(eo光卸用)を行います。
	 * <br>
	 * @param jdgHiChrgMap 非課金判定マップ
	 * @return チェックエラーの場合はtrue、チェックOKの場合はfalse
	 */
	private static boolean paramCheackOrs(HashMap<String, Object> jdgHiChrgMap)
	{
		// チェックエラーフラグ
		boolean chkErr = false;
		// 解約種別フラグ
		if (null == jdgHiChrgMap.get("dslSbtFlg") || "".equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			chkErr = true;
			
			return chkErr;
		}
		// 解約種別フラグ値チェック
		else if (!SVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			chkErr = true;
			
			return chkErr;
		}
		
		// 解約種別フラグが"1"：サービス契約解約の場合
		if (SVCKEI_DSL.equals(jdgHiChrgMap.get("dslSbtFlg")))
		{
			// サービス契約サービス利用開始日
			if (null == jdgHiChrgMap.get("svcKeiUseStaYmd") || "".equals(jdgHiChrgMap.get("svcKeiUseStaYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// サービス契約サービス利用終了日
			if (null == jdgHiChrgMap.get("svcKeiUseEndYmd") || "".equals(jdgHiChrgMap.get("svcKeiUseEndYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
			// サービス契約サービス課金開始日
			if (null == jdgHiChrgMap.get("svcKeiChrgStaYmd") || "".equals(jdgHiChrgMap.get("svcKeiChrgStaYmd")))
			{
				chkErr = true;
				
				return chkErr;
			}
		}
		return chkErr;
	}
	// ANK-3366-00-00 ADD END
}
