/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：KKSV0904_KKSV0904OPDBMapper
*	ソースファイル名：KKSV0904_KKSV0904OPDBMapper.java
*	作成者			：FJ
*	日付			：2018年04月23日
*＜機能概要＞
*	BP（工事費割賦契約ステータス更新）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/04/23	FJ)柳川		【ANK-3383-00-00】標準工事費分割請求（STEP2）新規作成
*
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

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.JKKStringUtil;
import eo.web.webview.KKW21901SF.KKW21901SFConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class KKSV0904_KKSV0904OPDBMapper {
	
	/**
	 * コンストラクタ
	 */
	public KKSV0904_KKSV0904OPDBMapper(){
	}

	/** 進捗特記事項１ 登録可能文字数 */
	private static final int PRG_TKJK_1_LENGTH = 128;

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：工事費割賦契約参照更新
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV090401CC(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("kojihi_kap_kei_no", bean[0].sendMessageString(KKW21901SFConst.CNC_KOJIHI_KAP_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
		// 締結済世代登録年月日時分秒
		parentMap.put("gene_add_dtm", bean[0].sendMessageString(KKW21901SFConst.CNC_GENE_ADD_DTM, X31CWebConst.DATABEAN_GET_VALUE));
		// サービス契約回線内訳番号
		parentMap.put("svc_kei_kaisen_ucwk_no", bean[0].sendMessageString(KKW21901SFConst.SVC_KEI_KAISEN_UCWK_NO, X31CWebConst.DATABEAN_GET_VALUE));
		// 更新年月日時分秒（更新前）
		parentMap.put("upd_dtm_bf", bean[0].sendMessageString(KKW21901SFConst.UPD_DTM_BF, X31CWebConst.DATABEAN_GET_VALUE));

		// 進捗特記事項１
		parentMap.put("prg_tkjk_1", getPrgTkjk1(bean));
		
		// 進捗特記事項２
		parentMap.put("prg_tkjk_2", "割賦契約ステータス更新：（変更前）請求済 （変更後）締結済 （残債一括の場合、引き続き分割で請求）");
		
		X31SDataBeanAccessArray custKeiHktgiList = bean[0].getDataBeanArray(KKW21901SFConst.CUST_KEI_HKTGI_LIST);
		X31SDataBeanAccess custKeiHktgiSubbean = custKeiHktgiList.getDataBean(0);
		String idoDiv = custKeiHktgiSubbean.sendMessageString(KKW21901SFConst.IDO_DIV_01, X31CWebConst.DATABEAN_GET_VALUE);

		// 異動区分
		parentMap.put("ido_div", idoDiv);

		ArrayList list = new ArrayList();
		if (parentMap.containsKey("ido_rsn_cd_list"))
		{
			list = (ArrayList)parentMap.get("ido_rsn_cd_list");
		}
		
		Integer maxIndex = (Integer)custKeiHktgiSubbean.sendMessage(KKW21901SFConst.IDO_RSN_CD_01, X31CWebConst.DATABEAN_GET_COUNT);
		for (int i = 0; i < maxIndex; i++)
		{
			Map childMap = new HashMap();
			if (list.size() > i)
			{
				childMap = (Map)list.get(i);
			}
			
			// 異動理由コード
			childMap.put("ido_rsn_cd", custKeiHktgiSubbean.sendMessageString(KKW21901SFConst.IDO_RSN_CD_01, X31CWebConst.DATABEAN_GET_VALUE, i));
			// 異動理由メモ
			childMap.put("ido_rsn_memo", custKeiHktgiSubbean.sendMessageString(KKW21901SFConst.IDO_RSN_MEMO_01, X31CWebConst.DATABEAN_GET_VALUE));

			list.add(childMap);
		}
		parentMap.put("ido_rsn_cd_list", list);

		outputMap.put("KKSV090401CC", parentMap);
						
		return outputMap;
	}

	/**
	 * 進捗特記事項1を取得する
	 * @param bean　[0]：工事費割賦契約参照更新
	 * @return String
	 */
	private String getPrgTkjk1(X31SDataBeanAccess[] bean) 
	{
		String prgTkjk1 = "";
		
		// 割賦基準日
		// 完了済割賦基準日
		String kapKeiChrgStdardYmd = bean[0].sendMessageString(KKW21901SFConst.KAP_KEI_CHRG_STDARD_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuKapKeiChrgStdardYmd = new StringBuffer();
		if (!JKKStringUtil.isNullBlank(kapKeiChrgStdardYmd))
		{
			String hikakukapKeiChrgStdardYear = kapKeiChrgStdardYmd.substring(0, 4);
			String hikakukapKeiChrgStdardMonth = kapKeiChrgStdardYmd.substring(4, 6);
			String hikakukapKeiChrgStdardDate = kapKeiChrgStdardYmd.substring(6, 8);
			
			hikakuKapKeiChrgStdardYmd.append(hikakukapKeiChrgStdardYear);
			hikakuKapKeiChrgStdardYmd.append("/");
			hikakuKapKeiChrgStdardYmd.append(hikakukapKeiChrgStdardMonth);
			hikakuKapKeiChrgStdardYmd.append("/");
			hikakuKapKeiChrgStdardYmd.append(hikakukapKeiChrgStdardDate);
		}
		else
		{
			hikakuKapKeiChrgStdardYmd.append("-");
		}
		
		// 締結済割賦基準日
		String CncKapKeiChrgStdardYmd = bean[0].sendMessageString(KKW21901SFConst.CNC_KAP_KEI_CHRG_STDARD_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuCncKapKeiChrgStdardYmd = new StringBuffer();
		
		if (!JKKStringUtil.isNullBlank(CncKapKeiChrgStdardYmd))
		{
			String hikakuCncKapKeiChrgStdardYear = CncKapKeiChrgStdardYmd.substring(0, 4);
			String hikakuCncKapKeiChrgStdardMonth = CncKapKeiChrgStdardYmd.substring(4, 6);
			String hikakuCncKapKeiChrgStdardDate = CncKapKeiChrgStdardYmd.substring(6, 8);
			
			hikakuCncKapKeiChrgStdardYmd.append(hikakuCncKapKeiChrgStdardYear);
			hikakuCncKapKeiChrgStdardYmd.append("/");
			hikakuCncKapKeiChrgStdardYmd.append(hikakuCncKapKeiChrgStdardMonth);
			hikakuCncKapKeiChrgStdardYmd.append("/");
			hikakuCncKapKeiChrgStdardYmd.append(hikakuCncKapKeiChrgStdardDate);
		}
		else
		{
			hikakuCncKapKeiChrgStdardYmd.append("-");
		}
		
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, hikakuKapKeiChrgStdardYmd.toString(), hikakuCncKapKeiChrgStdardYmd.toString(), "割賦基準日");
		
		// 割賦起算月
		// 完了済割賦起算月
		String kapSeikyStaYm = bean[0].sendMessageString(KKW21901SFConst.KAP_SEIKY_STA_YM, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuKapSeikyStaYm = new StringBuffer();
		
		if(!JKKStringUtil.isNullBlank(kapSeikyStaYm))
		{
			String kapSeikyStaYmYear = kapSeikyStaYm.substring(0, 4);
			String kapSeikyStaYmMonth = kapSeikyStaYm.substring(4, 6);
			
			hikakuKapSeikyStaYm.append(kapSeikyStaYmYear);
			hikakuKapSeikyStaYm.append("年");
			hikakuKapSeikyStaYm.append(kapSeikyStaYmMonth);
			hikakuKapSeikyStaYm.append("月");
		}
		else
		{
			hikakuKapSeikyStaYm.append("-");
		}
		// 締結済割賦起算月
		String CncKapSeikyStaYm = bean[0].sendMessageString(KKW21901SFConst.CNC_KAP_SEIKY_STA_YM, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuCncKapSeikyStaYm = new StringBuffer();
		
		if(!JKKStringUtil.isNullBlank(CncKapSeikyStaYm))
		{
			String CncKapSeikyStaYmYear = CncKapSeikyStaYm.substring(0, 4);
			String CnckapSeikyStaYmMonth = CncKapSeikyStaYm.substring(4, 6);
			
			hikakuCncKapSeikyStaYm.append(CncKapSeikyStaYmYear);
			hikakuCncKapSeikyStaYm.append("年");
			hikakuCncKapSeikyStaYm.append(CnckapSeikyStaYmMonth);
			hikakuCncKapSeikyStaYm.append("月");
		}
		else
		{
			hikakuCncKapSeikyStaYm.append("-");
		}
		
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, hikakuKapSeikyStaYm.toString(), hikakuCncKapSeikyStaYm.toString(), "割賦起算月");
		
		// 割賦残回数
		String kapPayZanCnt = bean[0].sendMessageString(KKW21901SFConst.KAP_PAY_ZAN_CNT, X31CWebConst.DATABEAN_GET_VALUE);
		String CncKapPayZanCnt = bean[0].sendMessageString(KKW21901SFConst.CNC_KAP_PAY_ZAN_CNT, X31CWebConst.DATABEAN_GET_VALUE);
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, kapPayZanCnt, CncKapPayZanCnt, "割賦残回数");
		
		// 販売形態
		String bkKapHambaiFormNm = getKapHambaiFormNm(bean, KKW21901SFConst.BK_KAP_HAMBAI_FORM_CD);
		String CncKapHambaiFormNm = getKapHambaiFormNm(bean, KKW21901SFConst.CNC_KAP_HAMBAI_FORM_CD);
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, bkKapHambaiFormNm, CncKapHambaiFormNm, "販売形態");
		
		// 一括請求月
		// 完了済一括請求月
		StringBuffer bkKapHambaiFormSwchYm = new StringBuffer();
		String bkKapHambaiFormSwchYmYear = bean[0].sendMessageString(KKW21901SFConst.BK_KAP_HAMBAI_FORM_SWCH_YM_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
		if (!JKKStringUtil.isNullBlank(bkKapHambaiFormSwchYmYear))
		{
			bkKapHambaiFormSwchYm.append(bkKapHambaiFormSwchYmYear);
			bkKapHambaiFormSwchYm.append("年");
		}
		String bkKapHambaiFormSwchYmMonth = bean[0].sendMessageString(KKW21901SFConst.BK_KAP_HAMBAI_FORM_SWCH_YM_MONTH, X31CWebConst.DATABEAN_GET_VALUE);
		if (!JKKStringUtil.isNullBlank(bkKapHambaiFormSwchYmMonth))
		{
			bkKapHambaiFormSwchYm.append(bkKapHambaiFormSwchYmMonth);
			bkKapHambaiFormSwchYm.append("月");
		}
		
		if(JKKStringUtil.isNullBlank(bkKapHambaiFormSwchYmYear) && JKKStringUtil.isNullBlank(bkKapHambaiFormSwchYmMonth))
		{
			bkKapHambaiFormSwchYm.append("-");
		}
		
		// 締結済一括請求月
		String cncKapIktSikySwchYm = bean[0].sendMessageString(KKW21901SFConst.CNC_KAP_IKT_SIKY_SWCH_YM, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer cncKapHambaiFormSwchYm = new StringBuffer();
		
		if(!JKKStringUtil.isNullBlank(cncKapIktSikySwchYm))
		{
			String cncKapIktSikySwchYmYear = cncKapIktSikySwchYm.substring(0, 4);
			String cncKapIktSikySwchYmMonth = cncKapIktSikySwchYm.substring(4, 6);
			
			cncKapHambaiFormSwchYm.append(cncKapIktSikySwchYmYear);
			cncKapHambaiFormSwchYm.append("年");
			cncKapHambaiFormSwchYm.append(cncKapIktSikySwchYmMonth);
			cncKapHambaiFormSwchYm.append("月");
		}
		else
		{
			cncKapHambaiFormSwchYm.append("-");
		}
		
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, bkKapHambaiFormSwchYm.toString(), cncKapHambaiFormSwchYm.toString(), "一括請求月");
		
		// 割賦終了日
		// 完了済割賦終了日
		String kapKeiEndymd = bean[0].sendMessageString(KKW21901SFConst.KAP_INFO_SEIKY_END_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuKapKeiEndymd = new StringBuffer();
		if (!JKKStringUtil.isNullBlank(kapKeiEndymd))
		{
			String hikakuKapKeiEndymdYear = kapKeiEndymd.substring(0, 4);
			String hikakuKapKeiEndymdMonth = kapKeiEndymd.substring(4, 6);
			String hikakuKapKeiEndymdDate = kapKeiEndymd.substring(6, 8);
			
			hikakuKapKeiEndymd.append(hikakuKapKeiEndymdYear);
			hikakuKapKeiEndymd.append("/");
			hikakuKapKeiEndymd.append(hikakuKapKeiEndymdMonth);
			hikakuKapKeiEndymd.append("/");
			hikakuKapKeiEndymd.append(hikakuKapKeiEndymdDate);
		}
		else
		{
			hikakuKapKeiEndymd.append("-");
		}
		
		// 締結済割賦終了日
		String CnckapKeiEndymd = bean[0].sendMessageString(KKW21901SFConst.CNC_KAP_KEI_ENDYMD, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuCncKapKeiEndymd = new StringBuffer();
		if (!JKKStringUtil.isNullBlank(CnckapKeiEndymd))
		{
			String hikakuCncKapKeiEndymdYear = CnckapKeiEndymd.substring(0, 4);
			String hikakuCncKapKeiEndymdMonth = CnckapKeiEndymd.substring(4, 6);
			String hikakuCncKapKeiEndymdDate = CnckapKeiEndymd.substring(6, 8);
			
			hikakuCncKapKeiEndymd.append(hikakuCncKapKeiEndymdYear);
			hikakuCncKapKeiEndymd.append("/");
			hikakuCncKapKeiEndymd.append(hikakuCncKapKeiEndymdMonth);
			hikakuCncKapKeiEndymd.append("/");
			hikakuCncKapKeiEndymd.append(hikakuCncKapKeiEndymdDate);
		}
		else
		{
			hikakuCncKapKeiEndymd.append("-");
		}
		
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, hikakuKapKeiEndymd.toString(), hikakuCncKapKeiEndymd.toString(), "割賦終了日");
		
		// キャンセル日
		// 完了済キャンセル日
		String kapKeiCancelYmd = bean[0].sendMessageString(KKW21901SFConst.KAP_INFO_CANCEL_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuKapKeiCancelYmd = new StringBuffer();
		if (!JKKStringUtil.isNullBlank(kapKeiCancelYmd))
		{
			String hikakuKapKeiCancelYmdYear = kapKeiCancelYmd.substring(0, 4);
			String hikakuKapKeiCancelYmdMonth = kapKeiCancelYmd.substring(4, 6);
			String hikakuKapKeiCancelYmdDate = kapKeiCancelYmd.substring(6, 8);
			
			hikakuKapKeiCancelYmd.append(hikakuKapKeiCancelYmdYear);
			hikakuKapKeiCancelYmd.append("/");
			hikakuKapKeiCancelYmd.append(hikakuKapKeiCancelYmdMonth);
			hikakuKapKeiCancelYmd.append("/");
			hikakuKapKeiCancelYmd.append(hikakuKapKeiCancelYmdDate);
		}
		else
		{
			hikakuKapKeiCancelYmd.append("-");
		}
		
		// 締結済キャンセル日
		String CnckapKeiCancelYmd = bean[0].sendMessageString(KKW21901SFConst.CNC_KAP_KEI_CANCEL_YMD, X31CWebConst.DATABEAN_GET_VALUE);
		StringBuffer hikakuCncKapKeiCancelYmd = new StringBuffer();
		if (!JKKStringUtil.isNullBlank(CnckapKeiCancelYmd))
		{
			String hikakuCncKapKeiCancelYmdYear = CnckapKeiCancelYmd.substring(0, 4);
			String hikakuCncKapKeiCancelYmdMonth = CnckapKeiCancelYmd.substring(4, 6);
			String hikakuCncKapKeiCancelYmdDate = CnckapKeiCancelYmd.substring(6, 8);
			
			hikakuCncKapKeiCancelYmd.append(hikakuCncKapKeiCancelYmdYear);
			hikakuCncKapKeiCancelYmd.append("/");
			hikakuCncKapKeiCancelYmd.append(hikakuCncKapKeiCancelYmdMonth);
			hikakuCncKapKeiCancelYmd.append("/");
			hikakuCncKapKeiCancelYmd.append(hikakuCncKapKeiCancelYmdDate);
		}
		else
		{
			hikakuCncKapKeiCancelYmd.append("-");
		}
		
		prgTkjk1 = getPrgTkjk1Item(prgTkjk1, hikakuKapKeiCancelYmd.toString(), hikakuCncKapKeiCancelYmd.toString(), "キャンセル日");
		
		// 生成した文字列が進捗特記事項１のサイズを超えないように長さを調節する
		if(prgTkjk1.length() > PRG_TKJK_1_LENGTH)
		{
			String prgTkjk1_128 = prgTkjk1.substring(0,PRG_TKJK_1_LENGTH);
			
			return prgTkjk1_128;
		}
		else
		{
			return prgTkjk1;
		}
	}

	/**
	 * 変更前と変更後から進捗特記事項1を1項目分取得する
	 * @param prgTkjk1　進捗特記事項1
	 * @param before　変更前
	 * @param after　変更後
	 * @param fieldName　項目名
	 * @return String
	 */
	private String getPrgTkjk1Item(String prgTkjk1, String before, String after, String fieldName) 
	{
		StringBuffer sb = new StringBuffer();
		sb.append(JKKStringUtil.nullToBlank(prgTkjk1));

		if (!JKKStringUtil.nullToBlank(before).equals(JKKStringUtil.nullToBlank(after)))
		{
			if (!JKKStringUtil.isNullEmpty(prgTkjk1))
			{
				sb.append(" ");
			}
			sb.append(JKKStringUtil.nullToBlank(fieldName));
			sb.append("：(変更前)");
			sb.append(JKKStringUtil.nullToBlank(before));
			sb.append("(変更後)");
			sb.append(JKKStringUtil.nullToBlank(after));
		}

		return sb.toString();
	}

	/**
	 * 割賦販売形態名取得処理
	 * 
	 * @param bean サービスフォームBean
	 * @param key ビーンから値を取り出すためのキー
	 * @return 割賦販売形態名
	 */
	private String getKapHambaiFormNm(X31SDataBeanAccess[] bean, String key)
	{
		String kapHambaiFormNm = "";

		X31SDataBeanAccessArray pulldownInfList = bean[0].getDataBeanArray(KKW21901SFConst.KAP_HAMBAI_FORM);
		X31SDataBeanAccess pulldownInf = pulldownInfList.getDataBean(0);
		String kapHambaiFormCd = JKKStringUtil.nullToBlank(bean[0].sendMessageString(key, X31CWebConst.DATABEAN_GET_VALUE));;

		if (!JKKStringUtil.isNullEmpty(kapHambaiFormCd))
		{
			int count = (Integer)pulldownInf.sendMessage(KKW21901SFConst.CD_DIV_LIST_02, X31CWebConst.DATABEAN_GET_COUNT);
			for (int i = 0 ; i < count ; i++)
			{
				String cd = pulldownInf.sendMessageString(KKW21901SFConst.CD_DIV_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, i);
				if (cd.equals(kapHambaiFormCd))
				{
					kapHambaiFormNm = JKKStringUtil.nullToBlank(pulldownInf.sendMessageString(KKW21901SFConst.CD_DIV_NM_LIST_02,
							X31CWebConst.DATABEAN_GET_VALUE, i));
					kapHambaiFormNm = kapHambaiFormNm.replaceFirst("^\\d+\\.", "");
					break;
				}
			}
		}

		return kapHambaiFormNm;
	}

}
