/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：CNSV0014_CNSV0014OPDBMapper
*	ソースファイル名：CNSV0014_CNSV0014OPDBMapper.java
*	作成者			：FJ
*	日付			：2011年09月14日
*＜機能概要＞
*	BP（月・日別課金照会(初期表示)）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/09/14	FJ		新規作成
*
**********************************************************************/
package eo.web.webview.mapping;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.web.webview.CNW00601SF.CNW00601SFConst;
import eo.web.webview.common.JCNWebCommon;

/**
 * DataBean-BPマッピングをする。
 * 
 * <br>
 * @author 富士通
 */
public class CNSV0014_CNSV0014OPDBMapper
{
	/** 機能コード */
	private static final String FUNC_CODE = "func_code";

	/** GS明細一覧照会(月別合計照会)ＳＣ */
	private static final String SC_TITLE_CNSV001401 = "CNSV001401SC";
	/** GS明細一覧照会(日別合計照会)ＳＣ */
	private static final String SC_TITLE_CNSV001402 = "CNSV001402SC";
	/** 税率マスタ一覧ＳＣ */
	private static final String SC_TITLE_CNSV001403 = "CNSV001403SC";

	/** ＧＳ明細月別合計照会明細 */
	private static final String ECN0111B001_LIST = "ECN0111B001CBSMsg1List";
	/** ＧＳ明細日別合計照会明細 */
	private static final String ECN0111B002_LIST = "ECN0111B002CBSMsg1List";

	/** ＫＥＹ＿コンテンツ契約番号 */
	private static final String KEY_CONT_KEI_NO = "key_cont_kei_no";
	/** ＫＥＹ_利用開始年月 */
	private static final String KEY_USE_STA_YM = "key_use_sta_ym";

	/** コンテンツサービスコード */
	private static final String CONT_SVC_CD = "cont_svc_cd";
	/** コンテンツコード */
	private static final String CONT_CD = "cont_cd";
	/** コンテンツ名 */
	private static final String CONT_NM = "cont_nm";
	/** 税率 */
	private static final String TAX_RT = "tax_rt";
	/** 金額 */
	private static final String AMNT = "amnt";
	/** 利用開始年月日 */
	private static final String USE_STA_YMD = "use_sta_ymd";
	/** ＧＳ利用契約番号 */
	private static final String GS_USE_KEI_NO = "gs_use_kei_no";

	/** 画面表示用 又は金額算出用(0) */
	private static final String ZERO = "0";

	/** 金額算出用(100) */
	private static final String ONE_HUNDRED = "100";
	/** 金額算出用(100) */
	private static final BigDecimal BIG_DECIMAL_100 = new BigDecimal(ONE_HUNDRED);

	/** 日別リンククリック時のイベント関数 */
	private static final String YMD_LINK_CLICK_EVENT_1 = "clickLinkGsMesisai('";

	/** 日別リンククリック時のイベント関数 */
	private static final String YMD_LINK_CLICK_EVENT_2 = "');execute('CNW006010PJP_B_CLICK_LINK_USE_DATE');";

	/** 金額単位（円） */
	private static final String UNIT_JPN_MONEY = "円";

	/** 空文字 */
	private static final String EMPTY = "";

	/**
	 * コンストラクタ
	 */
	public CNSV0014_CNSV0014OPDBMapper()
	{
	}

	/**
	 * 上りマッピングをする
	 * 
	 * <br>
	 * @param bean　[0]：月・日別課金照会
	 * @param outputMap
	 * @param func_code　機能コード
	 * @return 送信情報
	 */
	@SuppressWarnings("unchecked")
	public HashMap setCNSV001401SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// コンテンツ契約番号 → ＧＳ明細一覧照会利用対象月取得マップ.ＫＥＹ＿コンテンツ契約番号
		parentMap.put(KEY_CONT_KEI_NO, bean[0].sendMessageString(CNW00601SFConst.CONT_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
		// 対象月 → ＧＳ明細一覧照会利用対象月取得マップ.KEY_利用開始年月
		parentMap.put(KEY_USE_STA_YM, bean[0].sendMessageString(CNW00601SFConst.TRGT_YM, X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put(SC_TITLE_CNSV001401, parentMap);
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * 
	 * <br>
	 * @param bean　[0]：月・日別課金照会
	 * @param outputMap
	 * @param func_code　機能コード
	 * @return 送信情報
	 */
	@SuppressWarnings("unchecked")
	public HashMap setCNSV001402SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// コンテンツ契約番号 → ＧＳ明細一覧照会利用対象月取得マップ.ＫＥＹ＿コンテンツ契約番号
		parentMap.put(KEY_CONT_KEI_NO, bean[0].sendMessageString(CNW00601SFConst.CONT_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
		// 対象月 → ＧＳ明細一覧照会利用対象月取得マップ.KEY_利用開始年月
		parentMap.put(KEY_USE_STA_YM, bean[0].sendMessageString(CNW00601SFConst.TRGT_YM, X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put(SC_TITLE_CNSV001402, parentMap);
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * 
	 * <br>
	 * @param bean　[0]：月・日別課金照会
	 * @param outputMap
	 * @param func_code　機能コード
	 * @return 送信情報
	 */
	@SuppressWarnings("unchecked")
	public HashMap setCNSV001403SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code, String opeDate)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		// 共通情報のマッピング
		parentMap.put(FUNC_CODE, func_code);
		// 基準日
		parentMap.put("key_stdardymd", opeDate);

		outputMap.put(SC_TITLE_CNSV001403, parentMap);
		return outputMap;
	}

	/**
	 * 下りマッピング
	 * 
	 * <br>
	 * @param bean [0]：月・日別課金照会
	 * @param outputMap
	 * @return bean [0]：月・日別課金照会
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getCNSV001401SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		String tax_rt = null;
		HashMap<String, Object> parentMap = null;
		if (outputMap.containsKey(SC_TITLE_CNSV001401))
		{
			parentMap = (HashMap<String, Object>)outputMap.get(SC_TITLE_CNSV001401);
		}
		
		/** 20130311 品質強化
		 * 税率取得処理*/
		HashMap taxParentMap = null;
		if(outputMap.containsKey(SC_TITLE_CNSV001403))
		{
			taxParentMap = (HashMap)outputMap.get(SC_TITLE_CNSV001403);
		}

		// 税率マスタ一覧照会の実行結果を取得
		ArrayList taxList = new ArrayList();
		taxList = (ArrayList)taxParentMap.get("EAC0271B010CBSMsg1List");
		
		String tax_calc_skbt_cd = "";
		
		HashMap taxMap = new HashMap();
		if(taxList.size() != 0)
		{
			for (int i = 0; i < taxList.size(); i++)
			{
				taxMap = (HashMap) taxList.get(i);
				tax_calc_skbt_cd = (String) taxMap.get("tax_calc_skbt_cd");
				tax_rt = (String) taxMap.get("tax_rt");
				if("01".equals(tax_calc_skbt_cd))
				{
					break;
				}
			}
		}
		else
		{
			tax_rt = "0";
		}

		X31SDataBeanAccessArray tkbt_chrg_list = bean[0].getDataBeanArray(CNW00601SFConst.TKBT_CHRG_LIST);

		if (parentMap != null && parentMap.containsKey(ECN0111B001_LIST))
		{
			ArrayList<Object> childList = (ArrayList<Object>)parentMap.get(ECN0111B001_LIST);

			if (0 < childList.size())
			{
				HashMap<String, String> childMap = (HashMap<String, String>)childList.get(0);

				X31SDataBeanAccess subbean = tkbt_chrg_list.addDataBean();

				// 月別課金一覧.ｅｏデータベースサービス利用登録契約番号 ←
				// ＧＳ明細一覧照会（月別合計照会）マップ.ＧＳ明細月別合計照会明細.ＧＳ利用契約番号
				subbean.sendMessageString(CNW00601SFConst.EODBS_USE_KEI_NO_02, X31CWebConst.DATABEAN_SET_VALUE, getMapValueOrEmpty(childMap,
						GS_USE_KEI_NO));

				// 月別課金一覧.コンテンツサービスコード ←
				// ＧＳ明細一覧照会（月別合計照会）マップ.ＧＳ明細月別合計照会明細.コンテンツサービスコード
				subbean.sendMessageString(CNW00601SFConst.CONT_SVC_CD_02, X31CWebConst.DATABEAN_SET_VALUE, getMapValueOrEmpty(childMap, CONT_SVC_CD)
						+ getMapValueOrEmpty(childMap, CONT_CD));

				// 月別課金一覧.コンテンツコード ←
				// ＧＳ明細一覧照会（月別合計照会）マップ.ＧＳ明細月別合計照会明細.コンテンツコード
				subbean.sendMessageString(CNW00601SFConst.CONT_CD_02, X31CWebConst.DATABEAN_SET_VALUE, getMapValueOrEmpty(childMap, CONT_CD));

				// 月別課金一覧.コンテンツ名 ← ＧＳ明細一覧照会（月別合計照会）マップ.ＧＳ明細月別合計照会明細.コンテンツ名
				subbean.sendMessageString(CNW00601SFConst.CONT_NM_02, X31CWebConst.DATABEAN_SET_VALUE, getMapValueOrEmpty(childMap, CONT_NM));

				// 月別課金一覧.利用料金（税抜） ← ＧＳ明細一覧照会（月別合計照会）マップ.ＧＳ明細月別合計照会明細.金額
				String amnt = getMapValueOrZero(childMap, AMNT);
				subbean.sendMessageString(CNW00601SFConst.USE_PRC_TAXOUT_02, X31CWebConst.DATABEAN_SET_VALUE, getDispKingakuFormat(amnt));

//				tax_rt = getMapValueOrZero(childMap, TAX_RT);
				// 月別課金一覧.税率 ← ＧＳ明細一覧照会（月別合計照会）マップ.ＧＳ明細月別合計照会明細.税率
//				subbean.sendMessageString(CNW00601SFConst.TAX_RT_02, X31CWebConst.DATABEAN_SET_VALUE, getMapValueOrZero(childMap, TAX_RT));
				subbean.sendMessageString(CNW00601SFConst.TAX_RT_02, X31CWebConst.DATABEAN_SET_VALUE, tax_rt);

				long stax = 0;
				if (!ZERO.equals(tax_rt))
				{
					BigDecimal big = new BigDecimal(tax_rt).divide(BIG_DECIMAL_100, 20, BigDecimal.ROUND_DOWN);
					stax = big.multiply(new BigDecimal(amnt)).longValue();
				}
				long taxin = Long.parseLong(amnt) + stax;

				// 月別課金一覧.消費税
				subbean.sendMessageString(CNW00601SFConst.STAX_02, X31CWebConst.DATABEAN_SET_VALUE, getDispKingakuFormat(String.valueOf(stax)));

				// 月別課金一覧.利用料金（税込）
				subbean.sendMessageString(CNW00601SFConst.USE_PRC_GOKEI_TAXIN_02, X31CWebConst.DATABEAN_SET_VALUE, getDispKingakuFormat(String
						.valueOf(taxin)));
			}
			else
			{
				tkbt_chrg_list.addDataBean();
			}
		}
		else
		{
			tkbt_chrg_list.addDataBean();
		}

		if (outputMap.containsKey(SC_TITLE_CNSV001402))
		{
			parentMap = (HashMap<String, Object>)outputMap.get(SC_TITLE_CNSV001402);
		}

		X31SDataBeanAccessArray hibt_chrg_Array = bean[0].getDataBeanArray(CNW00601SFConst.HIBT_CHRG_LIST);

		if (parentMap != null && parentMap.containsKey(ECN0111B002_LIST))
		{
			ArrayList<Object> childList = (ArrayList<Object>)parentMap.get(ECN0111B002_LIST);
			if (0 < childList.size())
			{
				for (int i = 0; i < childList.size(); i++)
				{
					HashMap<String, String> childMap = (HashMap<String, String>)childList.get(i);
					X31SDataBeanAccess subbean = hibt_chrg_Array.addDataBean();
					String use_sta_ymd = getMapValueOrEmpty(childMap, USE_STA_YMD);
					subbean.sendMessageString(CNW00601SFConst.LINK_HIZUKE_03, X31CWebConst.DATABEAN_SET_VALUE, new StringBuffer(16).append(
							YMD_LINK_CLICK_EVENT_1).append(use_sta_ymd).append(YMD_LINK_CLICK_EVENT_2).toString());
					// 日別課金一覧.日付 ← ＧＳ明細一覧照会（日別合計照会）マップ.ＧＳ明細日別合計照会明細.利用開始年月日
					subbean.sendMessageString(CNW00601SFConst.HIZUKE_03, X31CWebConst.DATABEAN_SET_VALUE, JCNWebCommon.formatDate(use_sta_ymd));

					// 日別課金一覧.利用料金 ← ＧＳ明細一覧照会（日別合計照会）マップ.ＧＳ明細日別合計照会明細.金額
					String amnt = getMapValueOrZero(childMap, AMNT);
					BigDecimal big = null;
					if (!ZERO.equals(tax_rt))
					{
						big = BigDecimal.ONE.add(new BigDecimal(tax_rt).divide(BIG_DECIMAL_100, 20, BigDecimal.ROUND_DOWN));
						amnt = String.valueOf(big.multiply(new BigDecimal(amnt)).longValue());
					}
					subbean.sendMessageString(CNW00601SFConst.USE_PRC_TAXIN_03, X31CWebConst.DATABEAN_SET_VALUE, getDispKingakuFormat(amnt));
				}
			}
			else
			{
				hibt_chrg_Array.addDataBean();
			}
		}
		else
		{
			hibt_chrg_Array.addDataBean();
		}

		return bean;
	}

	/**
	 * 金額表示文言編集処理
	 * 
	 * <br>
	 * @param value 金額
	 * @return ##,###円
	 */
	private static String getDispKingakuFormat(String value)
	{
		return new StringBuffer(16).append(isNull(value) ? ZERO : JCNWebCommon.formatNumber(value)).append(UNIT_JPN_MONEY).toString();
	}

	/**
	 * 項目値取得処理
	 * 
	 * <br>
	 * @param map 項目情報
	 * @param key 項目値取得キー
	 * @return 項目値 マップ項目値がnullの場合は空文字を返却
	 */
	private static String getMapValueOrEmpty(HashMap<String, String> map, String key)
	{
		return null == map || null == (String)map.get(key) ? EMPTY : (String)map.get(key);
	}

	/**
	 * 項目値取得処理
	 * 
	 * <br>
	 * @param map 項目情報
	 * @param key 項目値取得キー
	 * @return 項目値 マップ項目値がnullの場合は"0"を返却
	 */
	private static String getMapValueOrZero(HashMap<String, String> map, String key)
	{
		return null == map || isNull((String)map.get(key)) ? ZERO : (String)map.get(key);
	}

	/**
	 * オブジェクトに値が設定されているか判定します。
	 * <br>
	 * @param arg0 判定するオブジェクト
	 * @return オブジェクトに値が設定されていない場合はtrue
	 */
	private static boolean isNull(Object arg0)
	{
		return null == arg0 || EMPTY.equals(arg0);
	}

}