/*********************************************************************
* All Rights reserved, Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム共通（請求収納）
*   モジュール名    ：CHA001SFLogic
*   ソースファイル名：CHA001SFLogic.java
*   作成者          ：富士通
*   日付            ：2012年06月21日
*＜機能概要＞
*   請求書料金情報参照APIのビューロジッククラスです。
*＜修正履歴＞
*   バージョン	修正日		修正者		修正内容
*   v3.00		2012/06/21	FJ）松本	新規作成
*   v5.00		2013/09/09  FJ)小野     【随時-2013-000XXX4】当月の請求ステータスが"仮計算"、"仮確定"の場合、エラーコード"007010"を返すように変更。
*   v17.0.0     2015/07/13  FJ)山岡     【ANK-2557-00-00_PMP再構築対応】リクエスト、レスポンス時のログ出力を追加
*	v33.00.00	2017/06/20	FJ)西面		【ANK-3179-00-00】解約済み契約の請求明細表示
*	v33.00.01	2017/09/27	FJ)清原		【OM-2017-0001007】SYSIDに半角英数字が含まれている場合に単項目チェックエラーとなる
*	v39.00.00	2018/07/25  FJ)岡		【ANK-2829-00-00】【CMP】請求書内訳情報参照APIの改修１
*	v62.00.00	2022/10/17	FJ)吉村		【ANK-4350-00-00】マイページの0円請求表示改善対応
**********************************************************************/
package eo.web.webview.CHA001SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.model.common.check.DatetimeCheck;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.util.JCKLcsDataConverter;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCEditString;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCKLcsApiCommonUtil;
import eo.web.webview.common.JCKWebCommon;
import eo.web.webview.common.JKKApiCommon;
import eo.web.webview.mapping.CHSV0068_CHSV0068OPDBMapper;

/**
 * 請求書料金情報参照APIのビューロジッククラスです。
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CHA001SFLogic extends JCCWebBusinessLogic
{
	/** 業務処理名 */
	private static final String BUSINESS_LOGIC_NM = "請求書料金情報参照";
	
	/** サービスID */
	private static final String SERVICE_ID = "CHSV0068";

	/** 返却データ */
	private static final String RETURN_DATA = "返却データ";

	/** 請求先番号 */
	private static final String SIKYUSK_BNGU = "SIKYUSK_BNGU";

	// ANK-2829-00-00 2018/07/25 DEL START
	// /** 対象テーブル指定値 */
	// private static final String TARGET_VALUE = "TARGET_VALUE";
	// ANK-2829-00-00 2018/07/25 DEL END
	
	// ANK-2829-00-00 2018/07/25 ADD START
	/** 請求年月 */
	private static final String SIKYU_YM = "SIKYU_YM";
	// ANK-2829-00-00 2018/07/25 ADD END
	
//v33.00.00 2017/06/26 Add Start
	/** SYSID */
	private static final String  SYSID = "SYSID";
//v33.00.00 2017/06/26 Add End
	
	/** 結果種別（メンテナンス中） */
	private static final String RTYPE_CD_MAINTE = "M";
	
	/** 結果種別（エラー） */
	private static final String RTYPE_CD_ERROR = "E";
	
	/** 正常終了 */
	private static final String RSLT_CD_NOMAL = "000000";

	/** メンテナンス中エラー */
	private static final String RSLT_CD_MAINTE = "007001";

	/** 請求抑止対象エラー */
	private static final String RSLT_CD_SEIKY_YOKSI = "007010";

	/** データ不整合エラー */
	private static final String RSLT_CD_DATAHUSEI = "009002";

	/** 致命的なエラー */
	private static final String RSLT_CD_CRITICAL = "009003";

	/** 必須エラー */
	private static final String RSLT_CD_MUST = "009008";
	
	/** 数値属性エラー */
	private static final String RSLT_CD_NUMBER = "009009";

	/** 最大桁数エラー */
	private static final String RSLT_CD_KETA = "009010";
	
	// ANK-2829-00-00 2018/07/26 ADD START
	/** 課金開始前 */
	private static final String RSLT_CD_BF_CHRGSTA = "009011";
	// ANK-2829-00-00 2018/07/26 ADD END
	
	// ANK-2829-00-00 2018/07/26 ADD START
	/** 請求未確定 */
	private static final String RSLT_CD_SEIKY_CONFIRMED = "009012";
	// ANK-2829-00-00 2018/07/26 ADD END
	
	// ANK-2829-00-00 2018/07/27 ADD START
	/** 請求未確定 */
	private static final String RSLT_CD_SEIKY_GK_AMNT_0YEN = "009013";
	// ANK-2829-00-00 2018/07/27 ADD END
	
	/** フラグON */
	private static final String FLG_ON = "1";
	
	/** メンテナンス中エラーメッセージ */
	private static final String EX_MSG_MAINTE = "メンテナンス中です。";

	/** 必須エラーメッセージ */
	private static final String EX_MSG_MUST = "必須項目が設定されていません。";
	
	/** 数値属性エラーメッセージ */
	private static final String EX_MSG_NUMBER = "数値属性ではありません。";

	/** 最大桁数エラーメッセージ */
	private static final String EX_MSG_KETA = "最大桁数を超えています。";
	
	/** 整合性エラーメッセージ（料金スケジュール取得エラー） */
	private static final String EX_MSG_RESULT_1 = "料金スケジュール定義取得エラー";
	
	/** 整合性エラーメッセージ（請求情報取得エラー） */
	private static final String EX_MSG_RESULT_2 = "請求情報取得エラー";
	
	/** 整合性エラーメッセージ（請求抑止対象エラー） */
	private static final String EX_MSG_RESULT_3 = "システム都合による請求抑止対象です。";
	
	// ANK-2829-00-00 2018/07/30 ADD START
	/** 整合性エラーメッセージ（課金開始前エラー） */
	private static final String EX_MSG_RESULT_11 = "請求年月が課金開始前のため参照不可です。";
	
	/** 整合性エラーメッセージ（請求未確定エラー） */
	private static final String EX_MSG_RESULT_12 = "請求年月の請求が未確定ため参照不可です。";
	// ANK-2829-00-00 2018/07/30 ADD END

	/** サーバー名（顧客サーバ） */
	private static final String SERVER_NM = "顧客サーバ";
	
	/** マルチパートセクタ名称 */
	private static final String MULTIPLE_SECTOR_NM = "M1";
	
	/** 請求料金情報マップ */
	private static final String SEIKY_PRC_INF_MAP = "SeikyPrcInfMap";
	
	/** 結果コード */
	private static final String RESULT_CD = "result_cd";
	
	/** 結果コード（通常） */
	private static final String RETURN_CD_NORMAL = "0";
	
	/** 結果コード（料金スケジュール一意照会結果0件） */
	private static final String RETURN_CD_ECH0501A010 = "1";
	
	/** 結果コード（請求一覧照会（請求書料金情報）結果0件） */
	private static final String RETURN_CD_ECH0051B040 = "2";
	
	/** 結果コード（請求抑止） */
	private static final String RETURN_CD_SEIKY_YOKSI = "3";
	
	// ANK-2829-00-00 2018/07/26 ADD START
	/** 結果コード（課金開始前） */
	private static final String RETURN_CD_BF_CHRGSTA = "11";
	// ANK-2829-00-00 2018/07/26 ADD END
	
	// ANK-2829-00-00 2018/07/26 ADD START
	/** 結果コード（請求未確定） */
	private static final String RETURN_CD_SEIKY_CONFIRMED = "12";
	
	/** 結果コード（請求金額合計0円） */
	private static final String RETURN_CD_SEIKY_GK_AMNT_0YEN = "13";
	// ANK-2829-00-00 2018/07/26 ADD END
	
	/**
	 * 請求書料金情報参照APIを行います。<BR/>
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	public boolean init() throws Exception
	{
		// サービス結果格納用サービスフォームBean
		X31SDataBeanAccess bean = null;
		
		try 
		{
			// サービス結果格納用サービスフォームBean取得
			bean = getServiceFormBean();
			
			// -------------------------------------------------- //
			// 業務規制チェック
			// -------------------------------------------------- //
			if (restrictionCheck())
			{
				return true;
			}
			
			// -------------------------------------------------- //
			// リクエスト情報取得(処理要求電文より、パラメータを取得)
			// -------------------------------------------------- //
			HashMap<String, Object> reqMap = getRequestParams();
			
			// -------------------------------------------------- //
			// 必須入力チェック
			// -------------------------------------------------- //
			if (requireCheck(reqMap))
			{
				return true;
			}
			
			// -------------------------------------------------- //
			// 数値属性チェック
			// -------------------------------------------------- //
			if (numberCheck(reqMap))
			{
				return true;
			}
			
			// -------------------------------------------------- //
			// 最大桁数チェック
			// -------------------------------------------------- //
			if (lengthCheck(reqMap))
			{
				return true;
			}
			
/*---< ANK-2557-00-00 add start >---*/
			//Map→xml形式に変換しログ出力する
			String xml = JCKWebCommon.parseMapToXmlForPmp(reqMap,1);
/*---< ANK-2557-00-00 add end   >---*/
			
			// ******* 以下 サービス呼出処理 *********
			
			HashMap<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);
			
			HashMap<String, HashMap<String, Object>> inputMap = new HashMap<String, HashMap<String, Object>>();
			HashMap<String, HashMap<String, Object>> outputMap = new HashMap<String, HashMap<String, Object>>();
			
			// 上りマッピング処理
			CHSV0068_CHSV0068OPDBMapper mapper = new CHSV0068_CHSV0068OPDBMapper();
			mapper.setCHSV006801CC(reqMap, inputMap);
			
			// ■ サービス呼出
			invokeService(paramMap, inputMap, outputMap);
			
			// ■ サービス結果の転記
			// 下りマッピング処理
			HashMap<String, Object> comMap = mapper.getCHSV006801CC(outputMap);
			
			// ******* ここまで サービス呼出処理 *********
			
			// -------------------------------------------------- //
			// 結果チェック（請求抑止対象エラー）
			// -------------------------------------------------- //
			if (yoksiCheck(comMap))
			{
				return true;
			}

			// -------------------------------------------------- //
			// 結果チェック（データ不整合エラー）
			// -------------------------------------------------- //
			if (resultCheck(comMap))
			{
				return true;
			}
			
			// ANK-2829-00-00 2018/07/30 ADD START
			// -------------------------------------------------- //
			// 結果チェック（課金開始前エラー）
			// -------------------------------------------------- //
			if (bfChrgStaCheck(comMap))
			{
				return true;
			}

			// -------------------------------------------------- //
			// 結果チェック（請求未確定エラー）
			// -------------------------------------------------- //
			if (seikyConfirmedCheck(comMap))
			{
				return true;
			}
			// ANK-2829-00-00 2018/07/30 ADD END
			
			// ******* 正常の場合 *********
			StringBuilder rspMsg = new StringBuilder();
			// *** 処理応答電文（共通セクタ）の形式に変換 ***
			// ANK-2829-00-00 2018/07/30 MOD START
			// rspMsg.append(JKKApiCommon.getCommonSector(RSLT_CD_NOMAL));
			// 結果コードを取得する
			String result_cd = (String)comMap.get(RESULT_CD);
			if (RETURN_CD_SEIKY_GK_AMNT_0YEN.equals(result_cd))
			{
				// ANK-4350-00-00 MOD START
			//	rspMsg.append(JKKApiCommon.getCommonSector(RSLT_CD_SEIKY_GK_AMNT_0YEN));
				rspMsg.append(JKKApiCommon.getCommonSector(RSLT_CD_NOMAL));
				// ANK-4350-00-00 MOD END
			}
			else if (RETURN_CD_NORMAL.equals(result_cd))
			{
				rspMsg.append(JKKApiCommon.getCommonSector(RSLT_CD_NOMAL));
			}
			// ANK-2829-00-00 2018/07/30 MOD END
			
			// *** 処理応答電文（個別セクタ）の形式に変換 ***
			ArrayList<HashMap<String, Object>> multipleSectorList = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> seikyPrcInfMap = (HashMap<String, Object>)comMap.get(SEIKY_PRC_INF_MAP);
			if (null != seikyPrcInfMap)
			{
				multipleSectorList.add(seikyPrcInfMap);
			}
			rspMsg.append(JKKApiCommon.getSimpleSector(new HashMap<String, Object>()));
			rspMsg.append(JKKApiCommon.getMultipleSector(multipleSectorList, MULTIPLE_SECTOR_NM));
			
			// 正常データの設定
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, rspMsg.toString());
			
/*---< ANK-2557-00-00 add start >---*/
			//正常データをログ出力する
			String xml_rsp = JCKWebCommon.parseMapToXmlForPmp(seikyPrcInfMap,1);
/*---< ANK-2557-00-00 add end   >---*/

		}
		catch (Exception e)
		{
			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String lineNum = JPCEditString.fillZero(String.valueOf(e.getStackTrace()[1].getLineNumber()), 5, false);
			// エラー情報を作成
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_CRITICAL, lineNum, "", "", e.toString());
			// エラー情報の設定
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
		}
		return true;
	}
	
	/**
	 * 業務規制エラーがあるかどうか判定します。
	 * <br>
	 * @param returnData 返却電文
	 * @return boolean true：業務規制エラーあり、false：業務規制エラーなし
	 */
	private boolean restrictionCheck() 
	{
		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// リクエスト業務規制リスト
		X31SDataBeanAccessArray restrictionBeanArray =
				commonInfoBean.getDataBeanArray(CommonInfoCFConst.REQUEST_RESTRICTION_LIST);

		// 共有フォームBeanの業務規制フラグ(REQUEST_RESTRICTION_FLG_04)が１つでも、"1:規制中"となっている場合
		for (int i = 0; i < restrictionBeanArray.getCount(); i++)
		{
			X31SDataBeanAccess commonSubbean = restrictionBeanArray.getDataBean(i);

			// 業務規制フラグが立っていた場合
			if (FLG_ON.equals(commonSubbean.sendMessageString(
					CommonInfoCFConst.REQUEST_RESTRICTION_FLG_04, X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// "M" "007001" "メンテナンス中です。"
				DEBUG_LOG.debug(EX_MSG_MAINTE);

				// 処理応答電文（共通セクタ）の形式に変換
				String errorInfo = makeErrorInfo(RTYPE_CD_MAINTE, RSLT_CD_MAINTE, "", "", "", SERVER_NM);

				// 返却値の設定
				bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
				return true;
			}
		}

		return false;
	}

	/**
	 * 必須チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return boolean true：必須チェックエラーあり、false：必須チェックエラーなし
	 */
	private boolean requireCheck(HashMap<String, Object> reqMap) 
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		String chkErrorItem = getRequireErrItem(reqMap);

		if (!JCRUtilCommon.isNull(chkErrorItem))
		{
			// "E" "009008"（必須項目が未設定の場合）
			Exception ex = new Exception(EX_MSG_MUST);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_MUST, line_num, chkErrorItem, "", "");

			// 返却値の設定
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}

		return false;
	}
	
	/**
	 * 数値属性チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return boolean true：必須チェックエラーあり、false：必須チェックエラーなし
	 */
	private boolean numberCheck(HashMap<String, Object> reqMap) 
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		String chkErrorItem = getNumberErrItem(reqMap);

		if (!JCRUtilCommon.isNull(chkErrorItem))
		{
			// "E" "009009"（数値属性でない場合）
			Exception ex = new Exception(EX_MSG_NUMBER);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_NUMBER, line_num, chkErrorItem, "", (String)reqMap.get(chkErrorItem));

			// 返却値の設定
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}

		return false;
	}

	/**
	 * 最大桁数エラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return boolean true：最大桁数エラーあり、false：最大桁数エラーなし
	 */
	private boolean lengthCheck(HashMap<String, Object> reqMap) 
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();

		String chkErrorItem = getLengthErrItem(reqMap);
		
		if (!JCRUtilCommon.isNull(chkErrorItem))
		{
			// "E" "009010"（パラメータ値の最大桁数を超えた場合）
			Exception ex = new Exception(EX_MSG_KETA);

			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);

			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_KETA, line_num, chkErrorItem, "", (String)reqMap.get(chkErrorItem));

			// 返却値の設定
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}

		return false;
	}
	
	/**
	 * サービス呼出結果に請求抑止対象エラーが存在するか判定します。
	 * <br>
	 * @param resultMap サービス呼出結果が格納されているMap
	 * @return boolean true：不整合あり、false：不整合なし
	 */
	private boolean yoksiCheck(HashMap<String, Object> resultMap)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// 結果コードを取得する
		String result_cd = (String)resultMap.get(RESULT_CD);
		// データ不整合エラーの判定
		// ANK-2829-00-00 2018/07/30 MOD START
		// if (!RETURN_CD_NORMAL.equals(result_cd))
		if (!(RETURN_CD_NORMAL.equals(result_cd) || RETURN_CD_BF_CHRGSTA.equals(result_cd) 
				|| RETURN_CD_SEIKY_CONFIRMED.equals(result_cd) || RETURN_CD_SEIKY_GK_AMNT_0YEN.equals(result_cd)))
		// ANK-2829-00-00 2018/07/30 MOD END
		{
			Exception ex = null;
			if (RETURN_CD_SEIKY_YOKSI.equals(result_cd))
			{
				ex = new Exception(EX_MSG_RESULT_3);
			}
			
			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
			
			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_SEIKY_YOKSI, line_num, "", "", ex.toString());
			
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}
		
		return false;
	}

	/**
	 * サービス呼出結果に不整合エラーが存在するか判定します。
	 * <br>
	 * @param resultMap サービス呼出結果が格納されているMap
	 * @return boolean true：不整合あり、false：不整合なし
	 */
	private boolean resultCheck(HashMap<String, Object> resultMap)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// 結果コードを取得する
		String result_cd = (String)resultMap.get(RESULT_CD);
		// データ不整合エラーの判定
		// ANK-2829-00-00 2018/07/30 MOD START
		//if (!RETURN_CD_NORMAL.equals(result_cd))
		if (!(RETURN_CD_NORMAL.equals(result_cd) || RETURN_CD_BF_CHRGSTA.equals(result_cd) 
				|| RETURN_CD_SEIKY_CONFIRMED.equals(result_cd) || RETURN_CD_SEIKY_GK_AMNT_0YEN.equals(result_cd)))
		// ANK-2829-00-00 2018/07/30 MOD END
		{
			Exception ex = null;
			if (RETURN_CD_ECH0501A010.equals(result_cd))
			{
				ex = new Exception(EX_MSG_RESULT_1);
			}
			else if (RETURN_CD_ECH0051B040.equals(result_cd))
			{
				ex = new Exception(EX_MSG_RESULT_2);
			}
			
			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
			
			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_DATAHUSEI, line_num, "", "", ex.toString());
			
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}
		
		return false;
	}

	/**
	 * 項目の必須チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return String 必須チェックでエラーが発生した場合、エラーとなった項目を設定する、エラーでない場合は、nullを返却
	 */
	private String getRequireErrItem(HashMap<String, Object> reqMap) 
	{
		// -------------------------------------------------- //
		// リクエスト情報取得(処理要求電文より、パラメータを取得)
		// -------------------------------------------------- //
		// 請求先番号を取得
		String sikyuskBngu = (String)reqMap.get(SIKYUSK_BNGU);
		// ANK-2829-00-00 2018/07/25 DEL START
		// 対象テーブル指定値を取得
		// String targetValue = (String)reqMap.get(TARGET_VALUE);
		// ANK-2829-00-00 2018/07/25 DEL END
		// ANK-2829-00-00 2018/07/25 ADD START
		// 請求年月を取得
		String sikyuYm = (String)reqMap.get(SIKYU_YM);
		// ANK-2829-00-00 2018/07/25 ADD END
		
//v33.00.00 2017/06/26 Add Start
		// ＳＹＳＩＤを取得
		String sysid = (String)reqMap.get(SYSID);
//v33.00.00 2017/06/26 ADD End

		// 請求先番号の必須チェックを行う
		if (JCRUtilCommon.isNull(sikyuskBngu))
		{
			return SIKYUSK_BNGU;
		}

		// ANK-2829-00-00 2018/07/25 DEL START
		// 対象テーブル指定値の必須チェックを行う
		// if (JCRUtilCommon.isNull(targetValue))
		// {
		// 	return TARGET_VALUE;
		// }
		// ANK-2829-00-00 2018/07/25 DEL END
		
		// ANK-2829-00-00 2018/07/25 ADD START
		// 請求年月の必須チェックを行う
		if (JCRUtilCommon.isNull(sikyuYm))
		{
			return SIKYU_YM;
		}
		// ANK-2829-00-00 2018/07/25 ADD END
		
//v33.00.00 2017/06/26 Add Start
		// ＳＹＳＩＤの必須チェックを行う
		if (JCRUtilCommon.isNull(sysid))
		{
			return SYSID;
		}
//v33.00.00 2017/06/26 Add End

		return null;
	}

	/**
	 * 項目の数値属性チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return String 数値属性チェックでエラーが発生した場合、エラーとなった項目を設定する、エラーでない場合は、nullを返却
	 */
	private String getNumberErrItem(HashMap<String, Object> reqMap)
	{
		// -------------------------------------------------- //
		// リクエスト情報取得(処理要求電文より、パラメータを取得)
		// -------------------------------------------------- //
		// 請求先番号を取得
		String sikyuskBngu = (String)reqMap.get(SIKYUSK_BNGU);
		// ANK-2829-00-00 2018/07/25 DEL START
		// 対象テーブル指定値を取得
		// String targetValue = (String)reqMap.get(TARGET_VALUE);
		// ANK-2829-00-00 2018/07/25 DEL END
		// ANK-2829-00-00 2018/07/25 ADD START
		// 請求年月を取得
		String sikyuYm = (String)reqMap.get(SIKYU_YM);
		// ANK-2829-00-00 2018/07/25 ADD END
		
//v33.00.00 2017/06/26 Add Start
		// ＳＹＳＩＤを取得
		String sysid = (String)reqMap.get(SYSID);
//v33.00.00 2017/06/26 ADD End
		
		// 請求先番号の数値属性チェックを行う
		//v33.00.01 2017/09/27 OM-2017-0001007 Mod Start
//		if (!isNumber(sikyuskBngu))
		if(!HalfCharCheck.isEnNumber1Check(sikyuskBngu))
		//v33.00.01 2017/09/27 OM-2017-0001007 Mod End
		{
			return SIKYUSK_BNGU;
		}

		// ANK-2829-00-00 2018/07/25 DEL START
		// 対象テーブル指定値の数値属性チェックを行う
		// if (!isNumber(targetValue))
		// {
		// 	return TARGET_VALUE;
		// }
		// ANK-2829-00-00 2018/07/25 DEL END
		
		// ANK-2829-00-00 2018/07/25 ADD START
		// 請求年月の数値属性チェックを行う
		if(!DatetimeCheck.isYearMonthCheck(sikyuYm))
		{
			return SIKYU_YM;
		}
		// ANK-2829-00-00 2018/07/25 ADD END

//v33.00.00 2017/06/26 Add Start
		// ＳＹＳＩＤの数値属性チェックを行う
		//v33.00.01 2017/09/27 OM-2017-0001007 Mod Start
//		if (!isNumber(sysid))
		if(!HalfCharCheck.isEnNumber1Check(sysid))
		//v33.00.01 2017/09/27 OM-2017-0001007 Mod End
		{
			return SYSID;
		}
//v33.00.00 2017/06/26 Add End

		return null;
	}
	
	/**
	 * 項目の最大桁数チェックエラーがあるかどうか判定します。
	 * <br>
	 * @param reqMap リクエスト情報が格納されているMap
	 * @return String 最大桁数チェックでエラーが発生した場合、エラーとなった項目を設定する、エラーでない場合は、nullを返却
	 */
	private String getLengthErrItem(HashMap<String, Object> reqMap)
	{
		// -------------------------------------------------- //
		// リクエスト情報取得(処理要求電文より、パラメータを取得)
		// -------------------------------------------------- //
		// 請求先番号を取得
		String sikyuskBngu = (String)reqMap.get(SIKYUSK_BNGU);
		// ANK-2829-00-00 2018/07/25 DEL START
		// 対象テーブル指定値を取得
		// String targetValue = (String)reqMap.get(TARGET_VALUE);
		// ANK-2829-00-00 2018/07/25 DEL END
		// ANK-2829-00-00 2018/07/25 ADD START
		// 請求年月を取得
		String sikyuYm = (String)reqMap.get(SIKYU_YM);
		// ANK-2829-00-00 2018/07/25 ADD END
		
//v33.00.00 2017/06/26 Add Start
		// ＳＹＳＩＤを取得
		String sysid = (String)reqMap.get(SYSID);
//v33.00.00 2017/06/26 ADD End
		
		// 請求先番号の最大桁数チェックを行う
		if (10 < sikyuskBngu.length())
		{
			return SIKYUSK_BNGU;
		}

		// ANK-2829-00-00 2018/07/25 DEL START
		// 対象テーブル指定値の最大桁数チェックを行う
		// if (2 < targetValue.length())
		// {
		// 	return TARGET_VALUE;
		// }
		// ANK-2829-00-00 2018/07/25 DEL END
		
		// ANK-2829-00-00 2018/07/25 ADD START
		// 請求年月の最大桁数チェックを行う
		if (6 < sikyuYm.length())
		{
			return SIKYU_YM;
		}
		// ANK-2829-00-00 2018/07/25 ADD END
		
//v33.00.00 2017/06/26 Add Start
		// ＳＹＳＩＤの最大桁数チェックを行う
		if (10 < sysid.length())
		{
			return SYSID;
		}
//v33.00.00 2017/06/26 Add End
		
		return null;
	}

	/**
	 * エラー情報を作成します。
	 * <br>
	 * @param type    結果種別に設定する値
	 * @param result  結果コードに設定する値
	 * @param line    行数に設定する値
	 * @param detail4 詳細情報4に設定する値
	 * @param detail5 詳細情報5に設定する値
	 * @param detail6 詳細情報6に設定する値
	 * @return エラー情報電文
	 */
	private String makeErrorInfo(String type, String result, String line, String detail4, String detail5, String detail6)
	{
		HashMap<String, Object> errMap = new HashMap<String, Object>();

		errMap.put("WDA_COM_RTYPE", type);
		errMap.put("WDA_COM_RESULT", result);
		errMap.put("WDA_COM_DETAIL1", this.getClass().getName());
		errMap.put("WDA_COM_DETAIL2", line);
		errMap.put("WDA_COM_DETAIL3", BUSINESS_LOGIC_NM);
		errMap.put("WDA_COM_DETAIL4", detail4);
		errMap.put("WDA_COM_DETAIL5", detail5);
		errMap.put("WDA_COM_DETAIL6", detail6);

/*---< ANK-2557-00-00 add start >---*/
		//xml形式でログを出力
		String xml = JCKWebCommon.parseMapToXmlForPmp(errMap,1);
/*---< ANK-2557-00-00 add end >---*/
		
		return JKKApiCommon.getCommonSector(errMap);

	}
	
	/**
	 * 値が数値項目か判定します。
	 * <br>
	 * @param value 処理要求電文の数値項目の値
	 * @return 数値変換に成功した場合はtrue、それ以外はfalseを返却する。
	 */
	public boolean isNumber(String value)
	{
		if (value == null)
		{
			return false;
		}
		
		try
		{
			Long.parseLong(value);
		}
		catch (NumberFormatException e)
		{
			return false;
		}
		return true;
	}
	
	// ANK-2829-00-00 2018/07/30 ADD START
	/**
	 * サービス呼出結果に課金開始前エラーが存在するか判定します。
	 * <br>
	 * @param resultMap サービス呼出結果が格納されているMap
	 * @return boolean true：課金開始前、false：課金開始後
	 */
	private boolean bfChrgStaCheck(HashMap<String, Object> resultMap)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// 結果コードを取得する
		String result_cd = (String)resultMap.get(RESULT_CD);
		// 課金開始前エラーの判定
		// ANK-2829-00-00 2018/07/30 MOD START
		// if (!RETURN_CD_NORMAL.equals(result_cd))
		if (!(RETURN_CD_NORMAL.equals(result_cd) || RETURN_CD_SEIKY_CONFIRMED.equals(result_cd) 
				|| RETURN_CD_SEIKY_GK_AMNT_0YEN.equals(result_cd)))
		// ANK-2829-00-00 2018/07/30 MOD END
		{
			Exception ex = null;
			if (RETURN_CD_BF_CHRGSTA.equals(result_cd))
			{
				ex = new Exception(EX_MSG_RESULT_11);
			}
			
			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
			
			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_BF_CHRGSTA, line_num, "", "", ex.toString());
			
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}
		return false;
	}
	
	/**
	 * サービス呼出結果に請求未確定エラーが存在するか判定します。
	 * <br>
	 * @param resultMap サービス呼出結果が格納されているMap
	 * @return boolean true：請求未確定、false：請求確定
	 */
	private boolean seikyConfirmedCheck(HashMap<String, Object> resultMap)
	{
		// サービスフォームBean取得
		X31SDataBeanAccess bean = getServiceFormBean();
		
		// 結果コードを取得する
		String result_cd = (String)resultMap.get(RESULT_CD);
		// 請求未確定エラーの判定
		// ANK-2829-00-00 2018/07/30 MOD START
		// if (!RETURN_CD_NORMAL.equals(result_cd))
		if (!(RETURN_CD_NORMAL.equals(result_cd) || RETURN_CD_BF_CHRGSTA.equals(result_cd) 
				|| RETURN_CD_SEIKY_GK_AMNT_0YEN.equals(result_cd)))
		// ANK-2829-00-00 2018/07/30 MOD END
		{
			Exception ex = null;
			if (RETURN_CD_SEIKY_CONFIRMED.equals(result_cd))
			{
				ex = new Exception(EX_MSG_RESULT_12);
			}
			
			// 例外発生したソースコードの行番号を取得し５桁となるようにゼロ埋め
			String line_num = JPCEditString.fillZero(String.valueOf(ex.getStackTrace()[0].getLineNumber()), 5, false);
			
			// 処理応答電文（共通セクタ）の形式に変換
			String errorInfo = makeErrorInfo(RTYPE_CD_ERROR, RSLT_CD_SEIKY_CONFIRMED, line_num, "", "", ex.toString());
			
			bean.sendMessageString(RETURN_DATA, X31CWebConst.DATABEAN_SET_VALUE, errorInfo);
			return true;
		}
		return false;
	}
	// ANK-2829-00-00 2018/07/30 ADD END
	
}
