/*********************************************************************
 *	All Rights reserved,Copyright K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JCHWebCommon
 *	ソースファイル名：JCHWebCommon.java
 *	作成者			：富士通
 *	日付			：2012年01月31日
 *＜機能概要＞
 *	請求・収納システムWeb共通部品アクセッサ
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/01/31	富士通		新規作成
 *	v5.00.00	2013/07/31	FJ) 垣内   【LT-2013-0000595】前受け充当金対応
 *	v5.00.01	2013/08/02	FJ) 林     【LT-2013-0000598】請求取消チェック追加
 *	v5.00.02    2013/08/06  FJ) 林     【IT1-2013-0001502】通信料（従量制）の場合のみFTTH通信量訂正画面を起動する対応
 *  v5.00.03    2013/08/06  FJ) 米谷   【IT1-2013-0001612】確認完了ボタン押下時のチェック修正
 *	v5.00.04    2013/08/27  FJ) 林     【IT1-2013-0001612】請求取消仕様変更。請求取消チェックを削除。
 *	v5.00.05	2013/09/10	FJ)小野    【OM-2013-0001907】請求内訳の検索時の動作不具合につき、子画面クローズ時の制御を変更。
 *	v5.00.06    2013/09/12  FJ) 林     【OM-2013-0001890】前受け充当金対応 前受金充当額入力チェックを追加。
 *	v8.00.00	2013/12/25  FJ)小野    【ANK-1584-00-00】MVNO（本体）対応
 *	v8.00.01	2014/03/06  FJ)小野    【IT2-2014-0000149】料金内訳チェック制御を修正。
 *	v9.00.00	2014/04/16	FJ)小野    【ANK-2054-00-00】eoスマートリンク改修(端末補償)。
 *	v9.00.01	2014/05/29	FJ)江森     【IT1-2014-0000164】製造番号を取得する基準日を修正。
 *
 **********************************************************************/

package eo.web.webview.commonOneStop;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JACStrConst;
import eo.web.webview.JCCWebBusinessLogic;

/**
 * 請求・収納システムWeb共通アクセッサー部品
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
public class JCHWebCommon extends JCCWebCommon
{
	/**
	 * 年月日書式(yyyyMMdd)の桁数
	 */
	private static final int YMD = 8;

	/**
	 * 日時書式(yyyyMMddHHmmss)の桁数
	 */
	private static final int YMDHMS = 14;

	/**
	 * NULLか空文字の判定処理.<br>
	 * <br>
	 * 
	 * @param strMoji 判定文字
	 * @return 判定結果 true:Null か 空文字
	 */
	public static boolean isNullOrEmpty(String strMoji)
	{
		boolean isEmpty = false;

		if (strMoji == null || JACStrConst.KARA_MOJI.equals(strMoji))
		{
			isEmpty = true;
		}

		return isEmpty;
	}

	/**
	 * NULL 且つ 空文字の判定処理.<br>
	 * <br>
	 * 
	 * @param strMoji 判定文字
	 * @return 判定結果 true:Nullでない 且つ 空でない
	 */
	public static boolean isNotNullOrEmpty(String strMoji)
	{
		boolean isEmpty = false;

		if (strMoji != null && !JACStrConst.KARA_MOJI.equals(strMoji))
		{
			isEmpty = true;
		}

		return isEmpty;
	}

	/**
	 * 左辺と右辺を加算します。
	 * 
	 * @param str1 計算値（左辺）
	 * @param str2 計算値（右辺）
	 * @param isNullToZero Nullを0に置き換えて計算するかを判断
	 * @return 計算結果
	 */
	public static String calcAdd(String str1, String str2, Boolean isNullToZero)
	{

		if (isNullToZero)
		{
			if (isNullOrEmpty(str1))
			{
				str1 = "0";
			}

			if (isNullOrEmpty(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNullOrEmpty(str1) || isNullOrEmpty(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.add(val2);

		return rtnValue.toString();
	}

	/**
	 * 左辺から右辺を減算します。
	 * 
	 * @param str1 計算値（左辺）
	 * @param str2 計算値（右辺）
	 * @param isNullToZero Nullを0に置き換えて計算するかを判断
	 * @return 計算結果
	 */
	public static String calcSubtract(String str1, String str2, Boolean isNullToZero)
	{

		if (isNullToZero)
		{
			if (isNullOrEmpty(str1))
			{
				str1 = "0";
			}

			if (isNullOrEmpty(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNullOrEmpty(str1) || isNullOrEmpty(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.subtract(val2);

		return rtnValue.toString();
	}

	/**
	 * 左辺と右辺を乗算します。
	 * 
	 * @param str1 計算値（左辺）
	 * @param str2 計算値（右辺）
	 * @param isNullToZero Nullを0に置き換えて計算するかを判断
	 * @return 計算結果
	 */
	public static String calcMultiply(String str1, String str2, Boolean isNullToZero)
	{

		if (isNullToZero)
		{
			if (isNullOrEmpty(str1))
			{
				str1 = "0";
			}

			if (isNullOrEmpty(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNullOrEmpty(str1) || isNullOrEmpty(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.multiply(val2);

		return rtnValue.toString();
	}

	/**
	 * 左辺と右辺を除算します。<br>
	 * 小数値はscale値で切り上げ
	 * 
	 * @param str1 計算値（左辺）
	 * @param str2 計算値（右辺）
	 * @param scale scale値
	 * @param isNullToZero Nullを0に置き換えて計算するかを判断
	 * @return 計算結果
	 */
	public static String calcDivide_ROUND_UP(String str1, String str2, int scale, Boolean isNullToZero)
	{

		if (isNullToZero)
		{
			if (isNullOrEmpty(str1))
			{
				return "0";
			}

			if (isNullOrEmpty(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNullOrEmpty(str1) || isNullOrEmpty(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.divide(val2, scale, BigDecimal.ROUND_UP);

		return rtnValue.toString();
	}

	/**
	 * 左辺と右辺を除算します。<br>
	 * 小数値はscale値で切り捨て
	 * 
	 * @param str1 計算値（左辺）
	 * @param str2 計算値（右辺）
	 * @param scale scale値
	 * @param isNullToZero Nullを0に置き換えて計算するかを判断
	 * @return 計算結果
	 */
	public static String calcDivide_ROUND_DOWN(String str1, String str2, int scale, Boolean isNullToZero)
	{

		if (isNullToZero)
		{
			if (isNullOrEmpty(str1))
			{
				return "0";
			}

			if (isNullOrEmpty(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNullOrEmpty(str1) || isNullOrEmpty(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.divide(val2, scale, BigDecimal.ROUND_DOWN);

		return rtnValue.toString();
	}

	/**
	 * 左辺と右辺を除算します。<br>
	 * 小数値はscale値で四捨五入
	 * 
	 * @param str1 計算値（左辺）
	 * @param str2 計算値（右辺）
	 * @param scale scale値
	 * @param isNullToZero Nullを0に置き換えて計算するかを判断
	 * @return 計算結果
	 */
	public static String calcDivide_ROUND_HALF_UP(String str1, String str2, int scale, Boolean isNullToZero)
	{

		if (isNullToZero)
		{
			if (isNullOrEmpty(str1))
			{
				return "0";
			}

			if (isNullOrEmpty(str2))
			{
				str2 = "0";
			}
		}
		else
		{
			if (isNullOrEmpty(str1) || isNullOrEmpty(str2))
			{
				return null;
			}
		}

		BigDecimal val1 = new BigDecimal(str1);
		BigDecimal val2 = new BigDecimal(str2);

		BigDecimal rtnValue = val1.divide(val2, scale, BigDecimal.ROUND_HALF_UP);

		return rtnValue.toString();
	}

	/**
	 * 月数を加減算します。 <br>
	 * 
	 * @param arg0 対象日付(yyyyMMddまたはyyyyMMddHHmmss)
	 * @param arg1 加減算値
	 * @return String 加減算された日付
	 * @throws ParseException 月の加減算処理にて、例外が発生した場合
	 */
	public static String addMonth(String arg0, int arg1)
	{
		if (!isValidParameter(arg0, YMD) && !isValidParameter(arg0, YMDHMS))
		{
			return null;
		}

		return addSubtractMonth(arg0, arg1);
	}

	/**
	 * 料金対応記録に設定する連動フラグを対応履歴表示から取得します。
	 * 
	 * @param bean フォームDataBean
	 * @param componentID コンポーネントID
	 * @return 連動フラグ
	 */
	public static String getRendoFlg(X31SDataBeanAccess bean, String componentID)
	{

		String rendoFlg = JACStrConst.TAIORRKI_RENDO_TG_FLG_HIHYOJI;
		// 対応履歴表示がONの場合、"1"を返却
		if (bean.sendMessageBoolean(componentID, X31CWebConst.DATABEAN_GET_VALUE))
		{
			rendoFlg = JACStrConst.TAIORRKI_RENDO_TG_FLG_HYOJI;
		}

		return rendoFlg;
	}

	/**
	 * ソート処理
	 * 
	 * @param sortList
	 * @param workObj
	 * @param SORT_KEY:ソートKey
	 * @return int
	 */
	@SuppressWarnings("unchecked")
	public static int compare(Object sortList, Object workObj, String[] SORT_KEY)
	{
		for (String key : SORT_KEY)
		{
			HashMap<String, Comparable<String>> o1 = (HashMap<String, Comparable<String>>)sortList;
			HashMap<String, Comparable<String>> o2 = (HashMap<String, Comparable<String>>)workObj;

			Comparable c1 = o1.get(key);
			Comparable c2 = o2.get(key);

			int check = c1.compareTo(c2);
			if (check != 0)
			{
				return check;
			}
		}

		return 0;
	}

	/**
	 * ラジオボタン用の初期表示コードリストから初期選択番号を取得します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param keyInfoMei 取得するinfo名称
	 * @param keyShkDspCdMei 初期表示コードを示すキー名称
	 * @return 初期表示コード番号
	 */
	public static String getRadioBtnShkDspCd(X31SDataBeanAccess[] bean, String keyInfoMei, String keyShkDspCdMei)
	{

		String rtnVal = JACStrConst.SHK_DSP_CD_OFF;

		X31SDataBeanAccessArray infoBean = bean[0].getDataBeanArray(keyInfoMei);
		int cnt = infoBean.getCount();

		for (int i = 0; i < cnt; i++)
		{
			X31SDataBeanAccess subBean = infoBean.getDataBean(i);
			String shkDspCd = subBean.sendMessageString(keyShkDspCdMei, X31CWebConst.DATABEAN_GET_VALUE);

			if (isNotNullOrEmpty(shkDspCd) && JACStrConst.SHK_DSP_CD_ON.equals(shkDspCd))
			{
				rtnVal = String.valueOf(i);
			}
		}

		return rtnVal;
	}

	/**
	 * 指定された文字列に対して、指定された長さになるまで左側に文字を埋めます。 <br>
	 * 
	 * @param source 対象文字列
	 * @param value 埋める文字
	 * @param length 長さ
	 * @return 結果文字列
	 */
	public static String padLeft(String source, String value, int length)
	{
		String sourceValue = null;
		if (source == null)
		{
			sourceValue = JACStrConst.KARA_MOJI;
		}
		else
		{
			sourceValue = new String(source);
		}

		StringBuffer editor = new StringBuffer(sourceValue);

		int len = sourceValue.length();
		if (len < length)
		{
			int padLen = length - len;
			for (int i = 0; i < padLen; i++)
			{
				editor.insert(0, value);
			}
		}

		return editor.toString();
	}

	/**
	 * 情報Beanのカウントを判定します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 * @param String Bean名称
	 * @return boolean 1件以上の場合:true、0件の場合:false
	 */
	public static boolean isExistInfoBean(X31SDataBeanAccess[] bean, String infoName)
	{
		boolean isExist = false;

		X31SDataBeanAccessArray infoBean = bean[0].getDataBeanArray(infoName);
		if (infoBean.getCount().intValue() > 0)
		{
			isExist = true;
		}

		return isExist;
	}

	/**
	 * 請求契約情報の存在を判定します。 <br>
	 * 請求契約の存在有無を請求契約ステータス(NotNull項目)で判定<br>
	 * 
	 * @param bean サービスフォームBean
	 * @return boolean Null・空文字以外場合:true、Null・空文字の場合:false
	 */
	public static  boolean isExistSeikySakiInfo(X31SDataBeanAccess[] bean)
	{
		boolean isExist = false;

		X31SDataBeanAccess seikySakiInfo = bean[0].getDataBeanArray(JCHCommonConst.SEIKY_INFO).getDataBean(0);
		String keiStat = seikySakiInfo.sendMessageString(JCHCommonConst.SEIKY_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE);

		if (JCHWebCommon.isNotNullOrEmpty(keiStat))
		{
			isExist = true;
		}

		return isExist;
	}

	/**
	 * 料金履歴情報の存在を判定します。 <br>
	 * 
	 * @param bean サービスフォームBean
	 */
	public static boolean isExistPrcRirekiInfo(X31SDataBeanAccess[] bean)
	{
		boolean isExist = false;

		X31SDataBeanAccessArray rirekiInfo = bean[0].getDataBeanArray(JCHCommonConst.PRC_RIREKI_INFO);
		if (rirekiInfo.getCount().intValue() > 0)
		{
			isExist = true;
		}

		return isExist;
	}

//ANK-2694-00-00 DEL START 【W07】ワンストップ案件(ＳＴＥＰ２)
//	/**
//	 * 選択された料金内訳を内訳明細追加します。<br>
//	 * 料金調整／料金変更で使用します。
//	 * 
//	 * @param bl ビューロジックインスタンス
//	 * @param paramBeans サービスフォームBean
//	 * @return boolean
//	 */
//	public static boolean addPrcUw(JCCWebBusinessLogic bl, X31SDataBeanAccess bean)
//	{
//		return JCHPrcAjstChgCommonUtil.addPrcUw(bl, bean);
//	}
//
//	/**
//	 * 選択された料金内訳を内訳明細追加します。<br>
//	 * 料金調整／料金変更で使用します。
//	 * 
//	 * @param bl ビューロジックインスタンス
//	 * @param paramBeans サービスフォームBean
//	 * @param inMap 料金内訳情報
//	 * @return boolean
//	 */
//	public static int getPrcUwIndex(JCCWebBusinessLogic bl, X31SDataBeanAccess bean, HashMap<String, Object> inMap)
//	{
//		return JCHPrcAjstChgCommonUtil.getPrcUwIndex(bl, bean, inMap);
//	}
//
//	/**
//	 * 追加するレコードを請求内訳情報に追加し、請求内訳情報Beanを作成します。 <br>
//	 * 
//	 * @param bean 料金変更Bean
//	 * @param inList 選択値のMapを格納したList
//	 * @param addRowNo 追加行の位置
//	 */
//	public static void makeSeikyUcwkAddByList(X31SDataBeanAccess[] bean, List<HashMap<String, Object>> inList, int addRowNo)
//	{
//		JCHPrcAjstChgCommonUtil.makeSeikyUcwkAddByList(bean, inList, addRowNo);
//	}
//
//	/**
//	 * 削除するレコードを請求内訳情報から削除し、請求内訳情報Beanを作成します。 <br>
//	 * 
//	 * @param bean 料金変更Bean
//	 * @param delIndex 削除行（請求取消の場合は、-1を指定して下さい）
//	 */
//	public static void makeSeikyUcwkDel(X31SDataBeanAccess[] bean, int delIndex, String componentID)
//	{
//		JCHPrcAjstChgCommonUtil.makeSeikyUcwkDel(bean, delIndex, componentID);
//	}
//
//	/**
//	 * ID番号情報のリストを設定します。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 */
//	public static void makeIdNoList(X31SDataBeanAccess[] bean)
//	{
//		JCHPrcAjstChgCommonUtil.makeIdNoList(bean);
//	}
//
//	/**
//	 * ID番号／サービス契約番号／料金内訳リストの初期選択値を設定します。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 */
//	public static void initPrcUwList(X31SDataBeanAccess[] bean)
//	{
//		JCHPrcAjstChgCommonUtil.initPrcUwList(bean);
//	}
//
//	/**
//	 * 請求内訳の変更チェックを行います。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 */
//	public static boolean chkSeikyUcwkData(X31SDataBeanAccess[] bean)
//	{
//		return JCHPrcAjstChgCommonUtil.chkSeikyUcwkData(bean);
//	}
//	
//	/**
//	 * 補償費の変更チェックを行います。
//	 * @param bean サービスフォームBean
//	 * @return 判定結果
//	 * 				変更あり:true
//	 * 				変更なし:false
//	 */
//	public static boolean chkCahgeHoshohiCheckBox(X31SDataBeanAccess[] bean)
//	{
//		return JCHPrcAjstChgCommonUtil.chkCahgeHoshohiCheckBox(bean);
//	}
//
//	/**
//	 * 請求内訳の工事遅延チェックを行います。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 */
//	public static boolean chkSeikyUcwkDataKojiDly(X31SDataBeanAccess[] bean)
//	{
//		return JCHPrcAjstChgCommonUtil.chkSeikyUcwkDataKojiDly(bean);
//	}
//
//	/**
//	 * ご利用期間の編集 <br>
//	 * 
//	 * @param startYmd 開始日
//	 * @param endYmd   終了日
//	 */
//	public static String editUseKikan(String startYmd, String endYmd)
//	{
//		return JCHPrcAjstChgCommonUtil.editUseKikan(startYmd, endYmd);
//	}
//
//	/**
//	 * 料金調整 / 料金変更画面用<br>
//	 * 入力された請求内訳明細に対して調整区分を設定します。 <br>
//	 * 
//	 * @param bean 料金調整サービスフォームBean
//	 */
//	public static void setAjstDiv(X31SDataBeanAccess[] bean, String componentID)
//	{
//		JCHPrcAjstChgCommonUtil.setAjstDiv(bean, componentID);
//	}
//
//	/**
//	 * 料金調整 / 料金変更画面用<br>
//	 * 入力された前受金充当額の入力チェックを行います。 <br>
//	 * 
//	 * @param bean 料金調整サービスフォームBean
//	 */
//	@SuppressWarnings("unchecked")
//	public static String[] chkInputMaeJtAmnt(HashMap outputMap, String mapKey, String listKey)
//	{
//		return JCHPrcAjstChgCommonUtil.chkInputMaeJtAmnt(outputMap, mapKey, listKey);
//	}
//	
//	/**
//	 * 料金調整 / 料金変更画面用<br>
//	 * 入力された前受金充当額のチェックを行います。 <br>
//	 * 
//	 * @param bean 料金調整サービスフォームBean
//	 */
//	@SuppressWarnings("unchecked")
//	public static boolean chkMaeJtAmnt(HashMap outputMap, String mapKey, String listKey)
//	{
//		return JCHPrcAjstChgCommonUtil.chkMaeJtAmnt(outputMap, mapKey, listKey);
//	}
//
//	/**
//	 * 請求内訳情報の合計額(後)桁数チェック <br>
//	 * 
//	 * @param outputMap ハッシュマップ
//	 * @param mapKey マップキー
//	 * @param listKey コンテンツキー
//	 */
//	@SuppressWarnings("unchecked")
//	public static boolean checkAmntAfSumLength(HashMap outputMap, String mapKey, String listKey)
//	{
//		return JCHPrcAjstChgCommonUtil.checkAmntAfSumLength(outputMap, mapKey, listKey);
//	}
//	
//	/**
//	 * 請求内訳情報の合計額を計算します。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param parentMap ハッシュマップ
//	 * @param listKey コンテンツキー
//	 */
//	@SuppressWarnings("unchecked")
//	public static void calcSeikyUwInfoGokei(X31SDataBeanAccess[] bean, HashMap parentMap, String listKey)
//	{
//		JCHPrcAjstChgCommonUtil.calcSeikyUwInfoGokei(bean, parentMap, listKey);
//	}
//
//	/**
//	 * 金庫情報の合計額を計算します。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param parentMap ハッシュマップ
//	 * @param listKey コンテンツキー
//	 */
//	@SuppressWarnings("unchecked")
//	public static void calcKnkInfoGokei(X31SDataBeanAccess[] bean, HashMap parentMap, String listKey)
//	{
//		JCHPrcAjstChgCommonUtil.calcKnkInfoGokei(bean, parentMap, listKey);
//	}
//
//	/**
//	 * 請求内訳情報引継処理<br>
//	 * <br>
//	 * FTTH通信量訂正画面から引継いだ請求内訳情報(list)をBean.請求内訳情報(データタイプBean)に移送する。
//	 * 
//	 * @param seikyUwInfo 請求内訳情報(データタイプBean)
//	 * @param hktgList 引継リスト
//	 */
//	public static void setUwList2Bean(X31SDataBeanAccessArray seikyUwInfo, List<HashMap<String, Object>> hktgList)
//	{
//		JCHPrcAjstChgCommonUtil.setUwList2Bean(seikyUwInfo, hktgList);
//	}
//
//	/**
//	 * FTTH通信量訂正画面起動チェック処理。<br>
//	 * <br>
//	 * 訂正ボタンが押下された時、同一ID番号内に通信料訂正の料金項目の存在チェックを実行します。
//	 * 同一ID番号内に通信料の料金項目の存在する場合、エラー。
//	 * 戻り値：「正常：true」、「エラー：false」。
//	 * 
//	 * @param bl ビューロジックインスタンス
//	 * @param bean サービスフォームBean
//	 * @param teiseiIndex 訂正押下行番号
//	 * @return boolean
//	 */
//	public static boolean checkFtthTeisei(JCCWebBusinessLogic bl, X31SDataBeanAccess bean, final int teiseiIndex)
//	{
//		return JCHPrcAjstChgCommonUtil.checkFtthTeisei(bl, bean, teiseiIndex);
//	}
//
//	/**
//	 * 引継リスト作成処理。<br>
//	 * <br>
//	 * 訂正ボタンが押下された時、該当行のインデックスから下方に走査し、
//	 * 同じサービス契約番号内の通信料関連の情報をデータタイプBeanからListに移送する。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param listName データタイプBean名
//	 * @param idxSelValue インデックス
//	 */
//	public static List<HashMap<String, Object>> makeHktgList(X31SDataBeanAccess bean, String listName, int idxSelValue)
//	{
//		return JCHPrcAjstChgCommonUtil.makeHktgList(bean, listName, idxSelValue);
//	}
//
//	/**
//	 * 請求内訳情報Bean取得処理<br>
//	 * <br>
//	 * 請求内訳情報からパラメータの料金項目コードに一致するデータを取得する。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param beanListName 料金項目コード
//	 * @param prcKmkCd 料金項目コード
//	 * @return X31SDataBeanAccess
//	 */
//	public static X31SDataBeanAccess getSeikyUwBean(X31SDataBeanAccess bean, String beanListName, String prcKmkCd)
//	{
//		return JCHPrcAjstChgCommonUtil.getSeikyUwBean(bean, beanListName, prcKmkCd);
//	}
//
//	/**
//	 * 料金項目出力名称情報取得処理<br>
//	 * <br>
//	 * 料金項目出力名称情報からパラメータの料金項目コードに一致するデータを取得する。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param beanListName 料金項目コード
//	 * @param prcKmkCd 料金項目コード
//	 * @return X31SDataBeanAccess
//	 */
//	public static X31SDataBeanAccess getPrcKmkCdBean(X31SDataBeanAccess bean, String beanListName, String prcKmkCd)
//	{
//		return JCHPrcAjstChgCommonUtil.getPrcKmkCdBean(bean, beanListName, prcKmkCd);
//	}
//
//	// TODO メソッド名がいまいち‥‥--------------------------------------↓↓--------------
//	public static int getUwAddPosition(X31SDataBeanAccess bean, int teiseiIndex)
//	{
//		return JCHPrcAjstChgCommonUtil.getUwAddPosition(bean, teiseiIndex);
//	}
//
//	/**
//	 * モーダル反映画面またはモーダレス反映画面に遷移して画面を閉じます。<br>
//	 * 
//	 * @param bl Viewロジックインスタンス
//	 * @param nextScreenId 遷移先の画面ID
//	 * @param openMode 自画面（子画面）が開かれているモード
//	 * @return 実行結果
//	 * @throws Exception 例外が発生した場合
//	 */
//	public static boolean closeTransfer(JCCWebBusinessLogic bl, String nextScreenId, String openMode)
//	{
//		return JCHPageTransferUtil.closeTransfer(bl, nextScreenId, openMode);
//	}
//
//	/**
//	 * FTTH通信量判定処理。<br>
//	 * <br>
//	 * 請求内訳がFTTH通信量関連レコードであるか判定し結果を返す。
//	 * 
//	 * @param paramBeans サービスフォームBean
//	 * @param key マッチング用キー
//	 * @return 判定結果（true:FTTH通信量関連レコード、false:FTTH通信量関連レコードでない）
//	 */
//	public static boolean isFtth(X31SDataBeanAccess[] paramBeans, String key)
//	{
//		return 	JCHPrcAjstChgCommonUtil.isFtth(paramBeans, key);
//	}
//
//	/**
//	 * FTTH通信量訂正画面起動判定処理。<br>
//	 * <br>
//	 * 選択した請求内訳がFTTH通信量訂正画面起動対象であるか判定し結果を返す。
//	 * 
//	 * @param paramBeans サービスフォームBean
//	 * @return 判定結果（true:FTTH通信量訂正画面起動対象、false:FTTH通信量訂正画面起動対象外）
//	 */
//	public static boolean isFtthKido(X31SDataBeanAccess[] paramBeans)
//	{
//		return 	JCHPrcAjstChgCommonUtil.isFtthKido(paramBeans);
//	}
//
//	/**
//	 * 料金項目コード判定処理。<br>
//	 * <br>
//	 * 第2引数の料金項目コードが通信料＿金額のものであるかどうか判定し、結果を返す。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param prcKmkCd 料金項目コード
//	 * @return 判定結果（true:prcKmkCdが通信料＿金額である、false:prcKmkCdが通信料＿金額でない）
//	 */
//	public static boolean hasGroup(X31SDataBeanAccess bean, String prcKmkCd)
//	{
//		return 	JCHPrcAjstChgCommonUtil.hasGroup(bean, prcKmkCd);
//	}
//
//	/**
//	 * 料金項目コード判定処理。<br>
//	 * <br>
//	 * 第2引数、第3引数の料金項目コードが通信料＿金額関連のものであるかどうか判定し、結果を返す。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param keyPrcKmkCd 料金項目コード
//	 * @param prcKmkCd 料金項目コード
//	 * @return 判定結果（true:keyPrcKmkCdが通信料＿金額であり、かつ、
//	 *          prcKmkCdが通信料＿金額、利用通信量＿数量、無料通信量＿数量、補正通信量＿数量、訂正通信量＿金額のいづれかである。
//	 *          false:それ以外）
//	 */
//	public static boolean isGroup(X31SDataBeanAccess bean, String keyPrcKmkCd, String prcKmkCd)
//	{
//		return 	JCHPrcAjstChgCommonUtil.isGroup(bean, keyPrcKmkCd, prcKmkCd);
//	}
//
//	
//	/**
//	 * 数量料金項目コード取得処理。<br>
//	 * <br>
//	 * 第2引数の料金項目コードに対応する数量の料金項目コードが存在する場合、それを返す。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param keyPrcKmkCd 料金項目コード
//	 * @return 数量の料金項目コード
//	 */
//	public static String getSuryou(X31SDataBeanAccess bean, String keyPrcKmkCd)
//	{
//		return 	JCHPrcAjstChgCommonUtil.getSuryou(bean, keyPrcKmkCd);
//	}
//
//	/**
//	 * 料金項目コード判定処理。<br>
//	 * <br>
//	 * 第2引数の料金項目コードが通信料＿金額または訂正通信量＿金額であるかどうか判定する。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param prcKmkCd 料金項目コード
//	 * @return 判定結果（true:料金項目コードが通信料＿金額または訂正通信量＿金額である、false:それ以外）
//	 */
//	public static boolean hasSuryou(X31SDataBeanAccess bean, String prcKmkCd)
//	{
//		return 	JCHPrcAjstChgCommonUtil.hasSuryou(bean, prcKmkCd);
//	}
//
//	/**
//	 * 料金項目コード判定処理。<br>
//	 * <br>
//	 * 第2引数の料金項目コードが通信料＿数量または訂正通信量＿数量であるかどうか判定する。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param prcKmkCd 料金項目コード
//	 * @return 判定結果（true:料金項目コードが通信料＿数量または訂正通信量＿数量である、false:それ以外）
//	 */
//	public static boolean isSuryou(X31SDataBeanAccess bean, String prcKmkCd)
//	{
//		return 	JCHPrcAjstChgCommonUtil.isSuryou(bean, prcKmkCd);
//	}
//
//	
//	/**
//	 * 料金項目コード判定処理。<br>
//	 * <br>
//	 * 第2引数の料金項目コードが利用通信量＿数量または無料通信量＿数量または補正通信量＿数量であるかどうか判定する。
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param prcKmkCd 料金項目コード
//	 * @return 判定結果（true:料金項目コードが利用通信量＿数量または無料通信量＿数量または補正通信量＿数量である、false:それ以外）
//	 */
//	public static boolean isSuryouOnry(X31SDataBeanAccess bean, String prcKmkCd)
//	{
//		return 	JCHPrcAjstChgCommonUtil.isSuryouOnly(bean, prcKmkCd);
//	}
//
//	/**
//	 * サービス詳細識別番号のチェックを行います。 <br>
//	 * 
//	 * @param bl ビューロジックインスタンス
//	 * @param paramBeans サービスフォームBean
//	 * @param dtlReqKbnUwPtn 詳細必須料金項目区分（内訳パターン用）
//	 * @param tabDtlReqKbnUwPtn 詳細必須料金項目フラグ（タブレット）（内訳パターン用）
//	 * @param svcDtlSkbtNoInputUwPtn サービス詳細識別番号入力（内訳パターン用）
//	 * @param itmeId 項目ID
//	 * @return boolean [正常:true、エラー:false]
//	 */
//	public static boolean chkSvcDtlSkbtNo(JCCWebBusinessLogic bl, X31SDataBeanAccess[] paramBeans, String dtlReqKbnUwPtn, String tabDtlReqKbnUwPtn, String svcDtlSkbtNoInputUwPtn, String itmeId, String kijunDay)
//	{
//		return 	JCHPrcAjstChgCommonUtil.chkSvcDtlSkbtNo(bl, paramBeans, dtlReqKbnUwPtn, tabDtlReqKbnUwPtn, svcDtlSkbtNoInputUwPtn, itmeId, kijunDay);
//	}
//
//	/**
//	 * 内訳パターン追加上限チェックを行います。 <br>
//	 * 
//	 * @param bl ビューロジックインスタンス
//	 * @param bean サービスフォームBean
//	 * @param addListCount 内訳追加数
//	 * @return boolean [正常:true、エラー:false]
//	 */
//	public static boolean chkUcwkAddCnt(X31BWebBusinessLogic bl, X31SDataBeanAccess bean, int addListCount)
//	{
//		return 	JCHPrcAjstChgCommonUtil.chkUcwkAddCnt(bl, bean, addListCount);
//	}
//
//	/**
//	 * beanのリストに入っている料金項目コードをmapに格納し返します。 <br>
//	 * 
//	 * @param bean サービスフォームBean
//	 * @param listName リスト名称
//	 * @param itemName 項目名称
//	 * @return HashMap [key:料金項目コード、value:null(未使用)]
//	 */
//	public static HashMap<String, String> getPrcKmkCdMap(X31SDataBeanAccess bean, String listName, String itemName)
//	{
//		return 	JCHPrcAjstChgCommonUtil.getPrcKmkCdMap(bean, listName, itemName);
//	}
//
//	/**
//	 * サービス詳細識別番号情報（プルダウン）コピー処理（随時請求、随時入金）。
//	 * サービス詳細識別番号情報（プルダウン）の内容をサービス詳細識別番号情報（内訳パターン用）に写します。
//	 * 
//	 * @param bean　[0]：サービスフォームBean
//	 */
//	public static void copySvcDtlSkbtNoBean(X31SDataBeanAccess bean)
//	{
//		JCHPrcAjstChgCommonUtil.copySvcDtlSkbtNoBean(bean);
//	}
//
//	/**
//	 * サービス詳細識別番号情報、サービス詳細識別番号情報（内訳パターン用）プルダウン要素追加処理。
//	 * 識別番号（テキスト）に値が入力され、追加ボタンが押された時に、
//	 * サービス詳細識別番号情報、および、サービス詳細識別番号情報（内訳パターン用）に要素を追加します。
//	 * 料金調整、料金変更から呼ばれる時は、引数の内訳追加区分はnull、随時請求、随時入金から呼ばれる時は、内訳追加区分を指定します。
//	 * <br>
//	 * @param bean　[0]：サービスフォームBean
//	 * @param ucwkAddKbn 内訳追加区分[1:料金内訳、2:内訳パターン]
//	 * @throws Exception 例外が発生した場合
//	 */
//	public static void addSvcDtlSkbtNoList(X31SDataBeanAccess bean, String ucwkAddKbn) throws Exception
//	{
//		JCHPrcAjstChgCommonUtil.addSvcDtlSkbtNoList(bean, ucwkAddKbn);
//	}
//ANK-2694-00-00 DEL END 【W07】ワンストップ案件(ＳＴＥＰ２)
	
	/**
	 * 日付に対し、月の加減算を行い、結果の日付を返します。 <br>
	 * 
	 * @param arg0 加減算する日付 （８桁、１４桁、１７桁）
	 * @param arg1 加算する月数 （負値は減算）
	 * @return String 加減算された日付
	 * @throws ParseException 日付書式の変換処理にて、例外が発生した場合
	 */
	private static String addSubtractMonth(String arg0, int arg1)
	{
		// 日付チェックを行う
		if (!dateCheck(arg0))
		{
			return null;
		}

		int arg0Length = arg0.length();

		Calendar calendar = transCalendar(arg0, arg0Length);

		SimpleDateFormat form = transFormat(arg0Length);

		calendar.add(Calendar.MONTH, arg1);

		return form.format(calendar.getTime());
	}

	/**
	 * String型で渡された日付をCalendar型に変換します。 <br>
	 * 
	 * @param date 変換する日付
	 * @param length 変換する日付書式の桁数
	 * @return Calendar 日付書式に変換された文字列
	 * @exception ParseException 日付書式の変換処理にて、例外が発生した場合
	 * */
	private static Calendar transCalendar(String date, int length)
	{
		SimpleDateFormat form = transFormat(length);

		Calendar carender = Calendar.getInstance();

		try
		{
			carender.setTime(form.parse(date));
		}
		catch (Exception e)
		{
			return null;
		}
		return carender;
	}

	/**
	 * int型で渡された桁数からSimpleDateFormat型を返します。 <br>
	 * 
	 * @param length 変換する日付書式の桁数
	 * @return SimpleDateFormat 日付書式に変換された文字列
	 */
	private static SimpleDateFormat transFormat(int length)
	{
		SimpleDateFormat form;

		if (length == 8)
		{
			form = new SimpleDateFormat("yyyyMMdd");
		}
		else if (length == 14)
		{
			form = new SimpleDateFormat("yyyyMMddHHmmss");
		}
		else
		{
			form = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		}

		return form;
	}

	/**
	 * 日付のチェックを行います。 <br>
	 * 
	 * @param arg0 チェックを行う文字列
	 * @return boolean チェック結果
	 */
	private static boolean dateCheck(String arg0)
	{
		if (Integer.parseInt(arg0.substring(0, 8)) == 0)
		{
			return false;
		}

		if (arg0.indexOf('-') != -1 || arg0.indexOf('.') != -1)
		{
			return false;
		}

		int arg0Length = arg0.length();

		if (arg0Length != 8 && arg0Length != 14 && arg0Length != 17)
		{
			return false;
		}

		return true;
	}

	/**
	 * 有効なパラメータか判定します。 文字列に値が設定されていない場合、及び指定された桁数と 一致しない場合はエラーとします。 <br>
	 * 
	 * @param arg0 判定する文字列
	 * @param arg1 文字列として有効な桁数
	 * @return パラメータが不正な場合はfalse
	 */
	protected static boolean isValidParameter(String arg0, int arg1)
	{
		if (isNullOrEmpty(arg0))
		{
			return false;
		}

		return arg1 == arg0.length();
	}
}
