/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JCHCHSV0027MappingParts
 *   ソースファイル名：JCHCHSV0027MappingParts.java
 *   作成者          ：富士通
 *   日付            ：2011年09月27日
 *＜機能概要＞
 *   請求内訳追加情報取得サービスのBPマッピング呼出部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/09/27	富士通		新規作成
 *
 **********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;

import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;

import eo.common.constant.JACStrConst;

/**
 * 請求内訳追加情報取得サービスにおけるBP-サービスIFマッピング処理で呼び出される部品です。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
public class JCHCHSV0027MappingParts
{

	/** 最大長(サービスコード) */
	private static final int MAX_LEN_SVC_CD = 2;

	/** 最大長(料金コースコード) */
	private static final int MAX_LEN_PRC_GRP_CD = 2;

	/** 最大長(料金コースコード) */
	private static final int MAX_LEN_PCRS_CD = 3;

	/** 最大長(料金プランコード) */
	private static final int MAX_LEN_PPLAN_CD = 6;

	/** 最大長(料金サービスコード) */
	private static final int MAX_LEN_PRC_SVC_CD = 12;

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに
	 * マッピングするサービスコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース
	 * の下り明細の先頭行から取得する。
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、
	 * 指定値がないものとして、空文字(サービスコードの最大桁)を取得する。
	 * <br>
	 * @param param             リクエストパラメータ操作クラス
	 * @param scNamePrcKmk      料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey サービスコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs        料金コース一覧照会SC名
	 * @param listNamePcrs      料金コース一覧照会明細名
	 * @param itemNamePcrsCd    サービスコード項目名(料金コース一覧照会)
	 * @return サービスコード
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	public static String getSvcCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNameSvcCdKey,
									String scNameSvc, String listNameSvc, String itemNameSvcCd) throws RequestParameterException {
		String svcCd = null;

		// 料金項目出力名称一覧照会マップよりサービスコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keySvcCd = (String)dataMap.get(itemNameSvcCdKey);
			if (keySvcCd != null && JACStrConst.KARA_MOJI.equals(keySvcCd) == false)
			{
				svcCd = keySvcCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行よりサービスコードを取得する
		if (svcCd == null)
		{
			try
			{
				svcCd = JPCBPCommon.getBPListValueString(param, scNameSvc, listNameSvc, 0, itemNameSvcCd);
			}
			catch (NullPointerException ex)
			{
				svcCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (svcCd == null)
		{
			svcCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_SVC_CD);
		}

		return svcCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに マッピングする料金グループコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、 <br>
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース の下り明細の先頭行から取得する。 <br>
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、 指定値がないものとして、空文字(料金コースコードの最大桁)を取得する。 <br>
	 * 
	 * @param param リクエストパラメータ操作クラス
	 * @param scNamePrcKmk 料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey 料金グループコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs 料金コース一覧照会（サービス契約番号）のSC名
	 * @param listNamePcrs 料金コース一覧照会明細名
	 * @param itemNamePcrsCd 料金コースコード項目名(料金コース一覧照会)
	 * @return 料金グループコード
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static String getPrcGrpCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePrcGrpCdKey, 
			String scNamePcrs, String listNamePcrs, String itemNamePrcGrpCd) throws RequestParameterException
	{
		String prcGrpCd = null;

		// 料金項目出力名称一覧照会マップより料金コースコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPrcGrpCd = (String)dataMap.get(itemNamePrcGrpCdKey);
			if (keyPrcGrpCd != null && JACStrConst.KARA_MOJI.equals(keyPrcGrpCd) == false)
			{
				prcGrpCd = keyPrcGrpCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金グループコードを取得する
		if (prcGrpCd == null)
		{
			try
			{
				prcGrpCd = JPCBPCommon.getBPListValueString(param, scNamePcrs, listNamePcrs, 0, itemNamePrcGrpCd);
			}
			catch (NullPointerException ex)
			{
				prcGrpCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (prcGrpCd == null)
		{
			prcGrpCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PRC_GRP_CD);
		}

		return prcGrpCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに マッピングする料金コースコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、 <br>
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース の下り明細の先頭行から取得する。<br>
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、 指定値がないものとして、空文字(料金コースコードの最大桁)を取得する。 <br>
	 * 
	 * @param param リクエストパラメータ操作クラス
	 * @param scNamePrcKmk 料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey 料金コースコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs 料金コース一覧照会SC名
	 * @param listNamePcrs 料金コース一覧照会明細名
	 * @param itemNamePcrsCd 料金コースコード項目名(料金コース一覧照会)
	 * @return 料金コースコード
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static String getPcrsCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePcrsCdKey, 
			String scNamePcrs, String listNamePcrs, String itemNamePcrsCd) throws RequestParameterException
	{
		String pcrsCd = null;

		// 料金項目出力名称一覧照会マップより料金コースコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPcrsCd = (String)dataMap.get(itemNamePcrsCdKey);
			if (keyPcrsCd != null && JACStrConst.KARA_MOJI.equals(keyPcrsCd) == false)
			{
				pcrsCd = keyPcrsCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金コースコードを取得する
		if (pcrsCd == null)
		{
			try
			{
				pcrsCd = JPCBPCommon.getBPListValueString(param, scNamePcrs, listNamePcrs, 0, itemNamePcrsCd);
			}
			catch (NullPointerException ex)
			{
				pcrsCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (pcrsCd == null)
		{
			pcrsCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PCRS_CD);
		}

		return pcrsCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに マッピングする料金コースコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、 <br>
	 * または料金コース一覧照会（サービス契約番号）サービスインターフェース の下り明細の先頭行から取得する。<br>
	 * ユーザリクエスト値、料金コース一覧照会の何れからも取得できない場合は、 指定値がないものとして、空文字(料金プランコードの最大桁)を取得する。 <br>
	 * 
	 * @param param リクエストパラメータ操作クラス
	 * @param scNamePrcKmk 料金項目出力名称一覧照会SC名
	 * @param itemNamePcrsCdKey 料金コースコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePcrs 料金コース一覧照会SC名
	 * @param listNamePcrs 料金コース一覧照会明細名
	 * @param itemNamePcrsCd 料金コースコード項目名(料金コース一覧照会)
	 * @return 料金プランコード
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static String getPplanCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePcrsCdKey, 
			String scNamePcrs, String listNamePcrs, String itemNamePcrsCd) throws RequestParameterException
	{
		String pcrsCd = null;

		// 料金項目出力名称一覧照会マップより料金プランコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPcrsCd = (String)dataMap.get(itemNamePcrsCdKey);
			if (keyPcrsCd != null && JACStrConst.KARA_MOJI.equals(keyPcrsCd) == false)
			{
				pcrsCd = keyPcrsCd;
			}
		}

		// マップより取得できなかった場合、料金コース一覧照会下り先頭行より料金プランコードを取得する
		if (pcrsCd == null)
		{
			try
			{
				pcrsCd = JPCBPCommon.getBPListValueString(param, scNamePcrs, listNamePcrs, 0, itemNamePcrsCd);
			}
			catch (NullPointerException ex)
			{
				pcrsCd = null;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (pcrsCd == null)
		{
			pcrsCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PPLAN_CD);
		}

		return pcrsCd;
	}

	/**
	 * 料金項目出力名称一覧照会サービスインターフェイスの上りに マッピングする料金サービスコードを料金項目出力名称一覧照会マップ(ユーザリクエスト値)、 <br>
	 * または料金サービス一覧照会(キャンペーン情報一覧照会)サービスインターフェース の下り明細の先頭行から取得する。 <br>
	 * ユーザリクエスト値、料金サービス一覧照会の何れからも取得できない場合は、 指定値がないものとして、空文字(料金サービスコードの最大桁)を取得する。 <br>
	 * 
	 * @param param リクエストパラメータ操作クラス
	 * @param scNamePrcKmk 料金項目出力名称一覧照会SC名
	 * @param itemNamePrcSvcCdKey 料金コースコードキー項目名(料金項目出力名称一覧照会)
	 * @param scNamePrcSvc 料金サービス一覧照会SC名
	 * @param listNamePrcSvc 料金サービス一覧照会明細名
	 * @param itemNamePrcSvcCd 料金サービスコード項目名(料金サービス一覧照会)
	 * @return 料金サービスコード
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public static String getPrcSvcCd(IRequestParameterReadOnly param, String scNamePrcKmk, String itemNamePrcSvcCdKey, 
			String scNamePrcSvc, String listNamePrcSvc, String itemNamePrcSvcCd) throws RequestParameterException
	{
		String prcSvcCd = null;

		// 料金項目出力名称一覧照会マップより料金サービスコードを取得する
		HashMap dataMap = (HashMap)param.getData(scNamePrcKmk);
		if (dataMap != null)
		{
			String keyPrcSvcCd = (String)dataMap.get(itemNamePrcSvcCdKey);
			if (keyPrcSvcCd != null && JACStrConst.KARA_MOJI.equals(keyPrcSvcCd) == false)
			{
				prcSvcCd = keyPrcSvcCd;
			}
		}

		// マップ、料金コース一覧より取得できなかった場合、半角スペース文字を返却する
		if (prcSvcCd == null)
		{
			prcSvcCd = padLeft(null, JACStrConst.SPACE_1, MAX_LEN_PRC_SVC_CD);
		}

		return prcSvcCd;
	}

	/**
	 * 指定された文字列に対して、指定された長さになるまで左側に文字を埋めます。 <br>
	 * 
	 * @param source 対象文字列
	 * @param value 埋める文字
	 * @param length 長さ
	 * @return 結果文字列
	 */
	private 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();
	}

}
