/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：ACSV0034_ACSV0034OPDBMapper
*	ソースファイル名：ACSV0034_ACSV0034OPDBMapper.java
*	作成者			：FJ
*	日付			：2012年09月14日
*＜機能概要＞
*	BP（料金スケジュールマスタ保守情報登録）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/09/14	FJ		新規作成
*
**********************************************************************/
package eo.web.webview.mapping;

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.common.constant.JACStrConst;
import eo.web.webview.ACW01501SF.ACW01501SFConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class ACSV0034_ACSV0034OPDBMapper {
	
	private static final String[][] ITEMS_PRC_EVENT = {
		// 利用開始日
		{
			JACStrConst.EVENT_CD_USE_STAYMD
			, ACW01501SFConst.RIYOU_STA_YMD
			, ACW01501SFConst.RIYOU_STA_YMD_UPD_DTM
		}
		// 利用終了日
		, {
			JACStrConst.EVENT_CD_USE_ENDYMD
			, ACW01501SFConst.RIYOU_END_YMD
			, ACW01501SFConst.RIYOU_END_YMD_UPD_DTM
		}
		// 料金計算日
		, {
			JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD
			, ACW01501SFConst.PRC_CALC_YMD
			, ACW01501SFConst.PRC_CALC_YMD_UPD_DTM
		}
		// 請求処理日
		, {
			JACStrConst.EVENT_CD_SEIKY_SHORI_YMD
			, ACW01501SFConst.SEIKYU_TRN_YMD
			, ACW01501SFConst.SEIKYU_TRN_YMD_UPD_DTM
		}
		// クレジット請求依頼日
		, {
			JACStrConst.EVENT_CD_CREDIT_SEIKY_REQ_YMD
			, ACW01501SFConst.CRESEIKYU_IRAI_YMD
			, ACW01501SFConst.CRESEIKYU_IRAI_YMD_UPD_DTM
		}
		// 口座振替請求依頼日
		, {
			JACStrConst.EVENT_CD_KOUZA_SEIKYU_IRAI_YMD
			, ACW01501SFConst.KOUZA_SEIKYU_IRAI_YMD
			, ACW01501SFConst.KOUZA_SEIKYU_IRAI_YMD_UPD_DTM
		}
		// 請求書データ送信日
		, {
			JACStrConst.EVENT_CD_SKS_DATA_SND_YMD
			, ACW01501SFConst.SKS_DATA_SND_YMD
			, ACW01501SFConst.SKS_DATA_SND_YMD_UPD_DTM
		}
		// 請求書引抜きデータ送信日(1回目)
		, {
			JACStrConst.EVENT_CD_SEIKYUS_HIKINUKI_DATA_SND_YMD_1
			, ACW01501SFConst.SEIKYUS_HIKINUKI_DATA_SND_YMD_1
			, ACW01501SFConst.SEIKYUS_HIKINUKI_DATA_SND_YMD_1_UPD_DTM
		}
		// 請求書引抜きデータ送信日(2回目)
		, {
			JACStrConst.EVENT_CD_SEIKYUS_HIKINUKI_DATA_SND_YMD_2
			, ACW01501SFConst.SEIKYUS_HIKINUKI_DATA_SND_YMD_2
			, ACW01501SFConst.SEIKYUS_HIKINUKI_DATA_SND_YMD_2_UPD_DTM
		}
		// 請求書引抜きデータ送信日(3回目)
		, {
			JACStrConst.EVENT_CD_SEIKYUS_HIKINUKI_DATA_SND_YMD_3
			, ACW01501SFConst.SEIKYUS_HIKINUKI_DATA_SND_YMD_3
			, ACW01501SFConst.SEIKYUS_HIKINUKI_DATA_SND_YMD_3_UPD_DTM
		}
		// 利用停止予告メール作成日
		, {
			JACStrConst.EVENT_CD_USE_STOP_YOTEI_ML_MAKE_YMD
			, ACW01501SFConst.RIYOU_STOP_MAIL_YMD
			, ACW01501SFConst.RIYOU_STOP_MAIL_YMD_UPD_DTM
		}
		// 利用停止日
		, {
			JACStrConst.EVENT_CD_USE_STOP_YMD
			, ACW01501SFConst.RIYOU_STOP_YMD
			, ACW01501SFConst.RIYOU_STOP_YMD_UPD_DTM
		}
		// 支払期限日
		, {
			JACStrConst.EVENT_CD_KOUZA_PAY_KIGEN_YMD
			, ACW01501SFConst.SIHARAI_KIGEN_YMD
			, ACW01501SFConst.SIHARAI_KIGEN_YMD_UPD_DTM
		}
		// 督促支払期限日
		, {
			JACStrConst.EVENT_CD_TOKSIHARAI_KIGEN_YMD
			, ACW01501SFConst.TOKSIHARAI_KIGEN_YMD
			, ACW01501SFConst.TOKSIHARAI_KIGEN_YMD_UPD_DTM
		}
		// 口座振替日
		, {
			JACStrConst.EVENT_CD_KOUZA_HURIKAE_YMD
			, ACW01501SFConst.KOUZA_FURIKAE_YMD
			, ACW01501SFConst.KOUZA_FURIKAE_YMD_UPD_DTM
		}
		// クレジット有効性チェック依頼日
		, {
			JACStrConst.EVENT_CD_CRDT_YK_CHK_IRAI_YMD
			, ACW01501SFConst.CRDT_YK_CHK_IRAI_YMD
			, ACW01501SFConst.CRDT_YK_CHK_IRAI_YMD_UPD_DTM
		}
		// クレジット有効性チェック結果受信日
		, {
			JACStrConst.EVENT_CD_CRDT_YK_CHK_IRAI_RSLT_RCV_YMD
			, ACW01501SFConst.CRDT_YK_CHK_IRAI_RSLT_RCV_YMD
			, ACW01501SFConst.CRDT_YK_CHK_IRAI_RSLT_RCV_YMD_UPD_DTM
		}
		// 強制解除予告メール作成日
		, {
			JACStrConst.EVENT_CD_TKSK_LIMIT_TOMORROW_YMD
			, ACW01501SFConst.KSI_RLS_YKK_ML_SKSI_YMD
			, ACW01501SFConst.KSI_RLS_YKK_ML_SKSI_YMD_UPD_DTM
		}
		// 強制解約日
		, {
			JACStrConst.EVENT_CD_KYOSEI_KAIYAKU_YMD
			, ACW01501SFConst.KYOUSEI_KAIYAKU_YMD
			, ACW01501SFConst.KYOUSEI_KAIYAKU_YMD_UPD_DTM
		}
		// 振込票取扱期限日
		, {
			JACStrConst.EVENT_CD_FURIKOMI_KIGEN_YMD
			, ACW01501SFConst.FURIKOMI_KIGEN_YMD
			, ACW01501SFConst.FURIKOMI_KIGEN_YMD_UPD_DTM
		}
		// 会計処理日
		, {
			JACStrConst.EVENT_CD_KAIK_SHORI_YMD
			, ACW01501SFConst.KAIK_TRN_YMD
			, ACW01501SFConst.KAIK_TRN_YMD_UPD_DTM
		}
		// 債権回収依頼日
		, {
			JACStrConst.EVENT_CD_SAIKEN_ITK_SHORI_YMD
			, ACW01501SFConst.SAIKEN_IRAI_YMD
			, ACW01501SFConst.SAIKEN_IRAI_YMD_UPD_DTM
		}
		// 債権切り離し抽出日
		, {
			JACStrConst.EVENT_CD_SAIKEN_KRHBS_CHT_YMD
			, ACW01501SFConst.SKN_KRHNS_CST_YMD
			, ACW01501SFConst.SKN_KRHNS_CST_YMD_UPD_DTM
		}
		// 貸倒れ対象者抽出日
		, {
			JACStrConst.EVENT_CD_KASHI_TRGT_YMD
			, ACW01501SFConst.KASHID_TGSYA_CST_YMD
			, ACW01501SFConst.KASHID_TGSYA_CST_YMD_UPD_DTM
		}
		// 利用停止処理日
		, {
			JACStrConst.EVENT_CD_USE_STOP_TRN_YMD
			, ACW01501SFConst.USE_STP_TRN_YMD
			, ACW01501SFConst.USE_STP_TRN_YMD_UPD_DTM
		}
		// 強制解約処理日
		, {
			JACStrConst.EVENT_CD_KYOSEI_KAIYAKU_TRN_YMD
			, ACW01501SFConst.KSI_DSL_TRN_YMD
			, ACW01501SFConst.KSI_DSL_TRN_YMD_UPD_DTM
		}
		// コンビニ締日
		, {
			JACStrConst.EVENT_CD_CVS_SIME_YMD
			, ACW01501SFConst.CVS_SIME_YMD
			, ACW01501SFConst.CVS_SIME_YMD_UPD_DTM
		}
		// 会計処理日(1日実行)
		, {
			JACStrConst.EVENT_CD_KAIK_TRN_YMD1
			, ACW01501SFConst.KAIK_TRN_YMD1
			, ACW01501SFConst.KAIK_TRN_YMD1_UPD_DTM
		}
		// 会計処理日(2日実行)
		, {
			JACStrConst.EVENT_CD_KAIK_TRN_YMD2
			, ACW01501SFConst.KAIK_TRN_YMD2
			, ACW01501SFConst.KAIK_TRN_YMD2_UPD_DTM
		}
		// 会計処理日(3日実行)
		, {
			JACStrConst.EVENT_CD_KAIK_TRN_YMD3
			, ACW01501SFConst.KAIK_TRN_YMD3
			, ACW01501SFConst.KAIK_TRN_YMD3_UPD_DTM
		}
		// 撤去解約予定日
		, {
			JACStrConst.EVENT_CD_TEKKYO_DSL_REG_YMD
			, ACW01501SFConst.TEKKYO_KAIYAKU_YMD
			, ACW01501SFConst.TEKKYO_KAIYAKU_YMD_UPD_DTM
		}
	};

	/**
	 * コンストラクタ
	 */
	public ACSV0034_ACSV0034OPDBMapper(){
	}
	

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：料金スケジュールマスタ保守
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setJACCHECKPRCEVENTBUSIDAYCC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) {
		
		if(bean == null){
			return null;
		}
		
		if(bean.length != 1){
			return null;
		}

		X31SDataBeanAccessArray arraybean = null;
		X31SDataBeanAccess beanTemp = null;
		ArrayList prcEventList = null;
		ArrayList busidayList = null;

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// 処理区分 → 料金スケジュール定義・営業日管理更新チェックマップ.処理区分
		parentMap.put("trn_kbn", bean[0].sendMessageString("処理区分", X31CWebConst.DATABEAN_GET_VALUE));
		// 暦月 → 料金スケジュール定義・営業日管理更新チェックマップ.請求年月
		parentMap.put("seiky_ym", bean[0].sendMessageString("暦月", X31CWebConst.DATABEAN_GET_VALUE));
		// 再実行フラグ → 料金スケジュール定義・営業日管理更新チェックマップ.再実行フラグ
		parentMap.put("rerun_flg", bean[0].sendMessageString("再実行フラグ", X31CWebConst.DATABEAN_GET_VALUE));

		beanTemp = bean[0];

		if(parentMap.containsKey("PRC_EVENT_List")){
			prcEventList = (ArrayList)parentMap.get("PRC_EVENT_List");
		}else{
			prcEventList = new ArrayList();
		}

		// 料金イベントリストの組み立て
		for (int i = 0; i < ITEMS_PRC_EVENT.length; i++)
		{
			// 対象の料金イベントが設定されていない場合　※削除の場合のみ発生
			if ("".equals(bean[0].sendMessageString(ITEMS_PRC_EVENT[i][1], X31CWebConst.DATABEAN_GET_VALUE)))
			{
				continue;
			}
			prcEventList.add(getPrcEventMap(ITEMS_PRC_EVENT[i][0]
				, bean[0].sendMessageString(ITEMS_PRC_EVENT[i][1], X31CWebConst.DATABEAN_GET_VALUE)
				, bean[0].sendMessageString(ITEMS_PRC_EVENT[i][2], X31CWebConst.DATABEAN_GET_VALUE)));
		}

		parentMap.put("PRC_EVENT_List", prcEventList);

		arraybean = beanTemp.getDataBeanArray("営業日カレンダー");
		if(parentMap.containsKey("BUSIDAY_List")){
			busidayList = (ArrayList)parentMap.get("BUSIDAY_List");
		}else{
			busidayList = new ArrayList();
		}
		if(arraybean != null && arraybean.getCount() > 0){
			int lstIdx = 0;
			for(int i = 0; i < arraybean.getCount(); i++){
				X31SDataBeanAccess subbean = arraybean.getDataBean(i);
				if (!subbean.sendMessageBoolean(ACW01501SFConst.DSP_FLG_02, X31CWebConst.DATABEAN_GET_VALUE))
				{
					continue;
				}
					
				HashMap childMap = null;
				if(busidayList.size() -1 >= lstIdx){
					childMap = (HashMap)busidayList.get(lstIdx);
				}else{
					childMap = new HashMap();
				}

				// 営業日カレンダー.営業日 → 料金スケジュール定義・営業日管理更新チェックマップ.営業日カレンダーリスト.対象年月日
				if (subbean != null) {
					childMap.put("trgt_ymd", subbean.sendMessageString("営業日", X31CWebConst.DATABEAN_GET_VALUE));
				}
				// 営業日カレンダー.営業／休業日選択コード → 料金スケジュール定義・営業日管理更新チェックマップ.営業日カレンダーリスト.営業日フラグ
				if (subbean != null) {
					childMap.put("busiday_flg", subbean.sendMessageString("営業／休業日選択コード", X31CWebConst.DATABEAN_GET_VALUE));
				}
				// 営業日カレンダー.休日選択コード → 料金スケジュール定義・営業日管理更新チェックマップ.営業日カレンダーリスト.祝日フラグ
				if (subbean != null) {
					childMap.put("holiday_flg", subbean.sendMessageString("休日選択コード", X31CWebConst.DATABEAN_GET_VALUE));
				}
				// 営業日カレンダー.更新年月日時分秒 → 料金スケジュール定義・営業日管理更新チェックマップ.営業日カレンダーリスト.更新年月日時分秒
				if (subbean != null) {
					childMap.put("upd_dtm", subbean.sendMessageString("更新年月日時分秒", X31CWebConst.DATABEAN_GET_VALUE));
				}

				busidayList.add(childMap);
				lstIdx++;
			}
		}
		parentMap.put("BUSIDAY_List", busidayList);

		outputMap.put("JACCHECKPRCEVENTBUSIDAYCC", parentMap);
						
		return outputMap;
	}


	/**
	 * 上りマッピングをする
	 * @param bean　[0]：料金スケジュールマスタ保守
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setJACUPDPRCEVENTBUSIDAYCC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) {
		
		if(bean == null){
			return null;
		}
		
		if(bean.length != 1){
			return null;
		}

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		outputMap.put("JACUPDPRCEVENTBUSIDAYCC", parentMap);
		
		return outputMap;
	}

	/**
	 * 下りマッピング
	 * @param bean　[0]：一時金登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getJACCHECKPRCEVENTBUSIDAYCC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		if(outputMap.containsKey("JACCHECKPRCEVENTBUSIDAYCC")){
			parentMap = (HashMap)outputMap.get("JACCHECKPRCEVENTBUSIDAYCC");
		}

		// 警告フラグ ← 料金スケジュール定義・営業日管理更新チェックマップ.警告フラグ
		bean[0].sendMessageString(ACW01501SFConst.WARNING_FLG, X31CWebConst.DATABEAN_SET_VALUE, (String) parentMap.get("warning_flg"));
		
		// 警告料金イベントコード ← 料金スケジュール定義・営業日管理更新チェックマップ.警告料金イベントコード
		bean[0].sendMessageString(ACW01501SFConst.WARNING_EVENT_CD, X31CWebConst.DATABEAN_SET_VALUE, (String) parentMap.get("warning_event_cd"));

		return bean;
	}

	/**
	 * 料金イベントマップ取得.<br>
	 * 
	 * @param eventCd イベントコード
	 * @param eventYmd イベント年月日
	 * @param updDtm 更新年月日時分秒
	 * @return 料金イベントマップ
	 */
	private HashMap getPrcEventMap(String eventCd, String eventYmd, String updDtm)
	{
		HashMap rpcEventMap = new HashMap();
		rpcEventMap.put("event_cd", eventCd);
		rpcEventMap.put("event_ymd", eventYmd);
		rpcEventMap.put("upd_dtm", updDtm);
		return rpcEventMap;
	}
	

}