/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：CHSV0006_CHSV0006OPDBMapper
*	ソースファイル名：CHSV0006_CHSV0006OPDBMapper.java
*	作成者			：富士通
*	日付			：2012年03月28日
*＜機能概要＞
*	BP（請求詳細照会）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/03/28	富士通		新規作成
*	v5.00.00	2013/07/28  FJ) 林     【LT-2013-0000600】 請求額・債権額が取得できない場合0を出力する
*	v5.00.01	2013/08/12  FJ) 早崎   【IT1-2013-0001583】「充当額」に「前受金充当額」を含めるよう対応
*	v8.00.00	2014/01/31	FJ) 江森   【ANK-1589-00-00】未収金額、充当額不正対応
*	v67.00.00	2023/08/03	FJ) 中川   【ANK-4415-00-00】口振請求及びWeb申込システム移行 STEP1
**********************************************************************/
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.web.webview.common.JCHWebCommon;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class CHSV0006_CHSV0006OPDBMapper {
	
// ANK-4415-00-00 ADD START
	/** 支払期限日判定失敗時表示日 */
	private static final String PAYKIGENDAY_JUDGE_ERR_DSP_DAY = "20991231";
// ANK-4415-00-00 ADD END

	/**
	 * コンストラクタ
	 */
	public CHSV0006_CHSV0006OPDBMapper(){
	}
	

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：請求詳細照会
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setCHSV000601SC(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);

		// 請求番号 → 請求一意照会マップ.ＫＥＹ＿請求番号
		parentMap.put("key_seiky_no", bean[0].sendMessageString("請求番号", X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put("CHSV000601SC", parentMap);
						
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：請求詳細照会
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setCHSV000602SC(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);

		// 請求番号 → 債権一覧照会マップ.ＫＥＹ＿請求番号
		parentMap.put("key_seiky_no", bean[0].sendMessageString("請求番号", X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put("CHSV000602SC", parentMap);
						
		return outputMap;
	}


	/**
	 * 下りマッピング
	 * @param bean　[0]：請求詳細照会
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getCHSV000601SC(X31SDataBeanAccess[] bean, HashMap outputMap){

		HashMap parentMap = null;
		if(outputMap.containsKey("CHSV000601SC")){
			parentMap = (HashMap)outputMap.get("CHSV000601SC");
		}

		ArrayList childList = null;

// ANK-4415-00-00 ADD START
		HashMap payKigenMap = null;
		if (outputMap.containsKey("SEIKYDTAILPAYKIGENCC"))
		{
			payKigenMap = (HashMap)outputMap.get("SEIKYDTAILPAYKIGENCC");
		}
		// 料金スケジュール定義一意明細
		ArrayList payKigenList1 = null;
		// 口座一覧照会（口座支払方法受付区分）明細
		ArrayList payKigenList2 = null;
// ANK-4415-00-00 ADD END
		

		X31SDataBeanAccessArray listCHSV000601SC_seiky_detail_info_ECH0051A010CBSMsg1List = bean[0].getDataBeanArray("請求詳細情報");
		childList = null;
		if(listCHSV000601SC_seiky_detail_info_ECH0051A010CBSMsg1List != null && parentMap != null && parentMap.containsKey("ECH0051A010CBSMsg1List")){
			childList = (ArrayList)parentMap.get("ECH0051A010CBSMsg1List");

			for(int i = 0; i < childList.size(); i++){
				X31SDataBeanAccess subbean = null;
				if(listCHSV000601SC_seiky_detail_info_ECH0051A010CBSMsg1List.getCount() -1 >= i){
					subbean = listCHSV000601SC_seiky_detail_info_ECH0051A010CBSMsg1List.getDataBean(i);
				}else{
					subbean = listCHSV000601SC_seiky_detail_info_ECH0051A010CBSMsg1List.addDataBean();
				}
				HashMap childMap = (HashMap)childList.get(i);
				if (subbean == null) {
					continue;
				}
			
				// 請求詳細情報.請求状態 ← 請求一意照会マップ.請求一意明細.請求ステータス名称
				if (childMap != null) {
					subbean.sendMessageString("請求状態", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seiky_stat_nm"));
				} else {
					subbean.sendMessageString("請求状態", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.請求書発行日 ← 請求一意照会マップ.請求一意明細.請求確定年月日
				if (childMap != null) {
					subbean.sendMessageString("請求書発行日", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seiky_fix_ymd"));
				} else {
					subbean.sendMessageString("請求書発行日", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.請求種別 ← 請求一意照会マップ.請求一意明細.請求種別コード名称
				if (childMap != null) {
					subbean.sendMessageString("請求種別", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seiky_sbt_cd_nm"));
				} else {
					subbean.sendMessageString("請求種別", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.請求書様式 ← 請求一意照会マップ.請求一意明細.請求方法コード名称
				if (childMap != null) {
					subbean.sendMessageString("請求書様式", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seiky_way_cd_nm"));
				} else {
					subbean.sendMessageString("請求書様式", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.強制窓口 ← 請求一意照会マップ.請求一意明細.強制窓口フラグ
				if (childMap != null) {
					subbean.sendMessageString("強制窓口", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("kyosei_madoguchi_flg"));
				} else {
					subbean.sendMessageString("強制窓口", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
// ANK-4415-00-00 MOD START
				//// 請求詳細情報.支払期限日 ← 請求一意照会マップ.請求一意明細.支払期限年月日
				//if (childMap != null) {
				//	subbean.sendMessageString("支払期限日", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("pay_kigen_ymd"));
				//} else {
				//	subbean.sendMessageString("支払期限日", X31CWebConst.DATABEAN_SET_VALUE, new String());
				//}
				if(payKigenMap != null && payKigenMap.containsKey("ECH0501A010CBSMsg1List") && payKigenMap.containsKey("EKK0501B002CBSMsg1List"))
				{
					payKigenList1 = (ArrayList)payKigenMap.get("ECH0501A010CBSMsg1List");
					payKigenList2 = (ArrayList)payKigenMap.get("EKK0501B002CBSMsg1List");
					HashMap payKigenChildMap1 = (HashMap)payKigenList1.get(i);
					HashMap payKigenChildMap2 = (HashMap)payKigenList2.get(i);
					// 支払期限日判定結果フラグ
					boolean payKigenDayJudgeRsltFlg = true;

					// 請求ステータスが"000"、"010"かつ請求方法コードが"2"or"3"を満たさない場合
					if(!(("000".equals((String)childMap.get("seiky_stat")) 
						|| "010".equals((String)childMap.get("seiky_stat")))
							&& (("2".equals((String)childMap.get("seiky_way_cd")))
								|| ("3".equals((String)childMap.get("seiky_way_cd"))))))
					{
						// 請求一意情報.支払期限日 ← 請求一意照会マップ.請求一意明細.支払期限日
						subbean.sendMessageString("支払期限日", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("pay_kigen_ymd"));
					}
					else
					{
						// 支払情報受付区分が"1"、"2"以外の場合
						if(!("1".equals((String)payKigenChildMap2.get("koza_payway_uk_div")) ||
							"2".equals((String)payKigenChildMap2.get("koza_payway_uk_div"))))
						{
							payKigenDayJudgeRsltFlg = false;
						}

						// 取得した口座番号もしくは通帳番号が請求情報のものと一致していない場合
						if(!((("2".equals((String)childMap.get("seiky_way_cd"))) 
							&& (((String)childMap.get("kofuri_koza_no")).equals((String)payKigenChildMap2.get("koza_no")))) || 
						   (("3".equals((String)childMap.get("seiky_way_cd")))
							&& (((String)childMap.get("kofuri_tsucho_no")).equals((String)payKigenChildMap2.get("tsucho_no")))))
						)
						{
							payKigenDayJudgeRsltFlg = false;
						}

						// マップの内容がnullの場合
						if(payKigenChildMap1.size() == 0)
						{
							payKigenDayJudgeRsltFlg = false;
						}

						if(payKigenDayJudgeRsltFlg)
						{
							// 口座支払方法受付区分の値によって支払期限日を設定する
							if("1".equals((String)payKigenChildMap2.get("koza_payway_uk_div")))
							{
								// 請求一意情報.支払期限日 ← 支払期限日取得マップ.料金スケジュール一意明細.イベント年月日
								subbean.sendMessageString("支払期限日", X31CWebConst.DATABEAN_SET_VALUE, (String)payKigenChildMap1.get("event_ymd"));
							}
							else if("2".equals((String)payKigenChildMap2.get("koza_payway_uk_div")))
							{
								// 請求一意情報.支払期限日 ← 請求一意照会マップ.請求一意明細.支払期限日
								subbean.sendMessageString("支払期限日", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("pay_kigen_ymd"));
							}
						}
						else
						{
							// 請求一意情報.支払期限日 ← "20991231"
							subbean.sendMessageString("支払期限日", X31CWebConst.DATABEAN_SET_VALUE, PAYKIGENDAY_JUDGE_ERR_DSP_DAY);
						}
					}
				}
//ANK-4415-00-00 MOD END
				// 請求詳細情報.引抜き ← 請求一意照会マップ.請求一意明細.請求書引抜きフラグ
				if (childMap != null) {
					subbean.sendMessageString("引抜き", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seikyus_hikinuki_flg"));
				} else {
					subbean.sendMessageString("引抜き", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.バーコード様式 ← 請求一意照会マップ.請求一意明細.窓口＿ＥＡＮメーカーコード
				if (childMap != null) {
					subbean.sendMessageString("バーコード様式", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("madoguchi_ean_maker_cd"));
				} else {
					subbean.sendMessageString("バーコード様式", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.取扱期限日 ← 請求一意照会マップ.請求一意明細.窓口＿ＥＡＮ取扱期限年月日
				if (childMap != null) {
					subbean.sendMessageString("取扱期限日", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("madoguchi_ean_trat_limit_ymd"));
				} else {
					subbean.sendMessageString("取扱期限日", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 請求詳細情報.請求額 ← 請求一意照会マップ.請求一意明細.請求額
				String seikyAmnt = (String)childMap.get("seiky_amnt");
				if (JCHWebCommon.isNullOrEmpty(seikyAmnt))
				{
					subbean.sendMessageString("請求額", X31CWebConst.DATABEAN_SET_VALUE, "0");
				}
				else
				{
					subbean.sendMessageString("請求額", X31CWebConst.DATABEAN_SET_VALUE, seikyAmnt);
				}
				// 請求詳細情報.合算有無 ← 請求一意照会マップ.請求一意明細.合算フラグ
				if (childMap != null) {
					subbean.sendMessageString("合算有無", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("gsan_flg"));
				} else {
					subbean.sendMessageString("合算有無", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
			}
		}


		return bean;
	}

	/**
	 * 下りマッピング
	 * @param bean　[0]：請求詳細照会
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getCHSV000602SC(X31SDataBeanAccess[] bean, HashMap outputMap){

		HashMap parentMap = null;
		if(outputMap.containsKey("CHSV000602SC")){
			parentMap = (HashMap)outputMap.get("CHSV000602SC");
		}

		ArrayList childList = null;
		

		X31SDataBeanAccessArray listCHSV000602SC_saiken_icrn_info_ECH0011B010CBSMsg1List = bean[0].getDataBeanArray("債権一覧情報");
		childList = null;
		if(listCHSV000602SC_saiken_icrn_info_ECH0011B010CBSMsg1List != null && parentMap != null && parentMap.containsKey("ECH0011B010CBSMsg1List")){
			childList = (ArrayList)parentMap.get("ECH0011B010CBSMsg1List");

			for(int i = 0; i < childList.size(); i++){
				X31SDataBeanAccess subbean = null;
				if(listCHSV000602SC_saiken_icrn_info_ECH0011B010CBSMsg1List.getCount() -1 >= i){
					subbean = listCHSV000602SC_saiken_icrn_info_ECH0011B010CBSMsg1List.getDataBean(i);
				}else{
					subbean = listCHSV000602SC_saiken_icrn_info_ECH0011B010CBSMsg1List.addDataBean();
				}
				HashMap childMap = (HashMap)childList.get(i);
				if (subbean == null) {
					continue;
				}
			
				// 債権一覧情報.請求年月 ← 債権一覧照会マップ.債権一覧明細.債権確定年月
				if (childMap != null) {
					subbean.sendMessageString("請求年月", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("saiken_fix_ym"));
				} else {
					subbean.sendMessageString("請求年月", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 債権一覧情報.支払方法 ← 債権一覧照会マップ.債権一覧明細.請求方法コード名称
				if (childMap != null) {
					subbean.sendMessageString("支払方法", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seiky_way_cd_nm"));
				} else {
					subbean.sendMessageString("支払方法", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 債権一覧情報.請求種別 ← 債権一覧照会マップ.債権一覧明細.請求種別コード名称
				if (childMap != null) {
					subbean.sendMessageString("請求種別", X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get("seiky_sbt_cd_nm"));
				} else {
					subbean.sendMessageString("請求種別", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
				// 債権一覧情報.債権額 ← 債権一覧照会マップ.債権一覧明細.債権額
				String saikenAmnt = (String)childMap.get("saiken_amnt");
				if (JCHWebCommon.isNullOrEmpty(saikenAmnt))
				{
					subbean.sendMessageString("債権額", X31CWebConst.DATABEAN_SET_VALUE, "0");
				}
				else
				{
					subbean.sendMessageString("債権額", X31CWebConst.DATABEAN_SET_VALUE, saikenAmnt);
				}
				
				// 債権一覧情報.充当額 ← 債権一覧照会マップ.債権一覧明細.充当額
				if (childMap != null)
				{
					
					// 充当額
					String jytoAmnt = "0";
					
					if ((String)childMap.get("jyto_amnt") != null && "".equals((String)childMap.get("jyto_amnt")) == false)
					{
						jytoAmnt = (String)childMap.get("jyto_amnt");
					}
					
					// 前受金充当額
					String maeujytoAmnt = "0";
					
					if ((String)childMap.get("maeu_jyto_amnt") != null && "".equals((String)childMap.get("maeu_jyto_amnt")) == false)
					{
						maeujytoAmnt = (String)childMap.get("maeu_jyto_amnt");
					}
					
					// 貸倒後入金額
					String ksdAfNyknAmnt = "0";
					
					if ((String)childMap.get("ksd_af_nk_amnt") != null && "".equals((String)childMap.get("ksd_af_nk_amnt")) == false)
					{
						ksdAfNyknAmnt = (String)childMap.get("ksd_af_nk_amnt");
					}
					
					// 充当額と前受金充当額と貸倒後入金額を加算
					String jytoAmntAdd =  JCHWebCommon.calcAdd(ksdAfNyknAmnt, JCHWebCommon.calcAdd(jytoAmnt, maeujytoAmnt, true), true);

					subbean.sendMessageString("充当額", X31CWebConst.DATABEAN_SET_VALUE, jytoAmntAdd);
				}
				else
				{
					subbean.sendMessageString("充当額", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}

				// 債権一覧情報.再発行 ← 債権一覧照会マップ.債権一覧明細.請求再発行回数
				if (childMap != null) {
					String seikyReHakkoCnt = "0";
					if ((String)childMap.get("seiky_re_hakko_cnt") != null && "".equals((String)childMap.get("seiky_re_hakko_cnt")) == false)
					{
						seikyReHakkoCnt = (String)childMap.get("seiky_re_hakko_cnt");
					}
					subbean.sendMessageString("再発行", X31CWebConst.DATABEAN_SET_VALUE, seikyReHakkoCnt);
				} else {
					subbean.sendMessageString("再発行", X31CWebConst.DATABEAN_SET_VALUE, new String());
				}
			}
		}


		return bean;
	}


}