/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：顧客契約
*	モジュール名	：KKSV0240_KKSV0240OPDBMapper
*	ソースファイル名：KKSV0240_KKSV0240OPDBMapper.java
*	作成者			：伊吹
*	日付			：2011年11月01日
*＜機能概要＞
*	BP（割引サービス契約解約キャンセル更新確認）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/11/01	伊吹		新規作成
*   v3.01.00    2012/07/13   富士通     IT2-2012-0001262
*   v5.00.07    2013/03/07   富士通     OT-2013-0000303
*   v5.00.08    2013/03/08   富士通     IT1-2013-0001375
*   v7.00.00    2014/02/01   富士通     ANK-1756-00-00 紹介対応
*   v10.00.00   2014/07/01   FJ)福岡    ANK-2135-00-00
*   v10.00.01   2014/10/04   FJ)岡田    ANK-2260-00-00
*   v37.00.00   2018/05/21   FJ)謝      【ANK-3383-00-00】標準工事費分割請求（STEP2）
*   v37.00.01   2018/07/25   FJ)謝      【IT1-2018-0000125】対応
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.ListIterator;

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.KKW01030SF.KKW01030SFConst;
import eo.web.webview.KKW01033SF.KKW01033SFConst;
import eo.web.webview.common.JKKCommonConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class KKSV0240_KKSV0240OPDBMapper {
	
	/**
	 * コンストラクタ
	 */
	public KKSV0240_KKSV0240OPDBMapper(){
	}
	

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：割引サービス契約解約／キャンセル
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV024001CC(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 list = null;

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);


		beanTemp = bean[0];
		arraybean = beanTemp.getDataBeanArray("選択キャンペーン一覧");
		if(parentMap.containsKey("target_list")){
			list = (ArrayList)parentMap.get("target_list");
		}else{
			list = new ArrayList();
		}
		if(arraybean.getCount() > 0){
			for(int i = 0; i < arraybean.getCount(); i++){
				X31SDataBeanAccess subbean = arraybean.getDataBean(i);
				HashMap childMap = null;
				if(list.size() -1 >= i){
					childMap = (HashMap)list.get(i);
				}else{
					childMap = new HashMap();
				}

				// 選択キャンペーン一覧.番号 → 更新対象情報.更新対象明細.番号
				childMap.put("no", subbean.sendMessageString("番号", X31CWebConst.DATABEAN_GET_VALUE));
				// 選択キャンペーン一覧.契約種別 → 更新対象情報.更新対象明細.契約種別
				childMap.put("kei_kind", subbean.sendMessageString("契約種別", X31CWebConst.DATABEAN_GET_VALUE));
				// 選択キャンペーン一覧.課金要否フラグ → 更新対象情報.更新対象明細.課金要否フラグ
				childMap.put("kakin_yohi", subbean.sendMessageString("課金要否フラグ", X31CWebConst.DATABEAN_GET_VALUE));
				
// v10.00.00 ADD START
				setPnltyCd(childMap, subbean, beanTemp);
// v10.00.00 ADD END
				
				list.add(childMap);
			}
		}
		parentMap.put("target_list", list);

		outputMap.put("KKSV024001CC", parentMap);
						
		return outputMap;
	}

// v10.00.00 ADD START
	/**
	 * 違約金コード設定
	 */
	@SuppressWarnings("unchecked")
	private void setPnltyCd(HashMap map, X31SDataBeanAccess subBean, X31SDataBeanAccess beanTemp) {
		
		X31SDataBeanAccessArray arraybean = beanTemp.getDataBeanArray("キャンペーン一覧");
		
		if(arraybean.getCount() <= 0) return;
		for(int i = 0; i < arraybean.getCount(); i++){
			X31SDataBeanAccess cBean = arraybean.getDataBean(i);
			
			Boolean isC  = cBean.sendMessageBoolean("選択",         X31CWebConst.DATABEAN_GET_VALUE);
			String  no   = cBean.sendMessageString("番号",          X31CWebConst.DATABEAN_GET_VALUE);
			Boolean pnCd = cBean.sendMessageBoolean("違約金コード", X31CWebConst.DATABEAN_GET_VALUE);
			
//10.00.01 ADD START
			Boolean isKChkBox = cBean.sendMessageBoolean("前月解約", X31CWebConst.DATABEAN_GET_VALUE);
//10.00.01 ADD END
			
			// 軸で一致
//10.00.01 MOD START
//			if (isC && no.equals(subBean.sendMessageString("番号", X31CWebConst.DATABEAN_GET_VALUE)))
			if (isC && no.equals(subBean.sendMessageString("番号", X31CWebConst.DATABEAN_GET_VALUE))) {
//10.00.01 MOD END
				map.put("pnlty_cd", pnCd);
//10.00.01 ADD START
				map.put("wrib_svc_kei_zengetu_kaiyaku", isKChkBox);
			}
//10.00.01 ADD END
		}
	}
	
//v10.00.00 ADD END

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：割引サービス契約解約／キャンセル
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV024002CC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) {
		
		if(null==bean || bean.length != 1){
			return null;
		}
		X31SDataBeanAccess sfBean=bean[0];
		// SFBean書き出し
		// ++++++++++++++ 2012/07/13 v3.02.00 変更開始 ++++++++++++++++ //
		BeanMap beanMap = Mover.getBeanMapFromDataBean(sfBean, KKW01030SFConst.SFBEAN);
		// ++++++++++++++ 2012/07/13 v3.02.00 変更終了 ++++++++++++++++ //
		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// 申込番号 → 付加情報.申込番号
		parentMap.put("mskm_no", beanMap.take("申込番号"));
		// 申込年月日 → 付加情報.申込年月日
		// ++++++++++++++ 2012/07/13 v3.02.00 変更開始 ++++++++++++++++ //
		parentMap.put("mskm_ymd", beanMap.take("申込日"));
		// ++++++++++++++ 2012/07/13 v3.02.00 変更終了 ++++++++++++++++ //
		// 異動区分 → 付加情報.異動区分
		parentMap.put("ido_div", beanMap.take("異動区分"));
		// ＳＹＳＩＤ → 付加情報.SYSID
		parentMap.put("sysid", beanMap.take("ＳＹＳＩＤ"));

		String[] beanIdoRsnCdList=(String[])beanMap.take("異動理由コード");
		ArrayList<HashMap<String,Object>> idoRsnCdList=new ArrayList<HashMap<String,Object>>(10);
		for(String idoRsnCd:beanIdoRsnCdList)
		{
			HashMap<String,Object> item=new HashMap<String, Object>(10);
			item.put("ido_rsn_cd", idoRsnCd);
			idoRsnCdList.add(item);
		}
		parentMap.put("ido_rsn_cd_list", idoRsnCdList);
		// 異動理由メモ → 付加情報.異動理由メモ
		parentMap.put("ido_rsn_memo", bean[0].sendMessageString("異動理由メモ", X31CWebConst.DATABEAN_GET_VALUE));
		
// v7.00.00 add start
		
		// サービス契約番号
		parentMap.put("svc_kei_no", bean[0].sendMessageString("サービス契約番号", X31CWebConst.DATABEAN_GET_VALUE));
// v7.00.00 add end
		
		outputMap.put("KKSV024002CC", parentMap);

		return outputMap;
	}

	/**
	 * 下りマッピング
	 * @param bean　[0]：割引サービス契約解約／キャンセル
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV024001CC(X31SDataBeanAccess[] bean, HashMap outputMap){
		HashMap<?,?> contentMap=(HashMap<?, ?>)outputMap.get("KKSV024001CC");
		ArrayList<?> targetList=(ArrayList<?>)contentMap.get("target_list");
		
		X31SDataBeanAccess sfBean=bean[0];
		// SFBean書き出し
		BeanMap beanMap = Mover.getBeanMapFromDataBean(sfBean, KKW01030SFConst.SFBEAN);
		ArrayList<BeanMap> selectCampaignIcrn=(ArrayList<BeanMap>)beanMap.take(KKW01030SFConst.SELECT_CAMPAIGN_ICRN);
		
		for(int i=0;i<targetList.size()&&i<selectCampaignIcrn.size();i++){
			HashMap<?,?> target=(HashMap<?,?>)targetList.get(i);
			BeanMap campaign=selectCampaignIcrn.get(i);
			//更新後終了年月日を取得。キーが存在しない場合は空を設定。
			String endymdAf=target.containsKey("endymd_af")?(String)target.get("endymd_af"):"";
			campaign.pair(KKW01030SFConst.ENDYMD_AF_03, endymdAf);
			
//IT1-2013-0001375 START
			String stat = (String)campaign.take(KKW01030SFConst.STAT_03);
			if(JKKCommonConst.WRIB_SVC_KEI_STAT_UK_ZM.equals(stat))
			{
				campaign.pair(KKW01030SFConst.ENDYMD_AF_03, "");
			}
//IT1-2013-0001375 END
		}
		
		
		// SFBean書き戻し
		Mover.setBeanMapToDataBean(beanMap, sfBean);

		return bean;
	}
// ++++++++++++++ 2013/03/07 v5.00.07 OT-2013-0000303 追加開始 ++++++++++++++++ //
	
	/**
	 * 下りマッピング
	 * @param bean　[0]：割引サービス契約解約／キャンセル
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV024003CC(X31SDataBeanAccess[] bean, HashMap outputMap){

		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV024003CC")){
			parentMap = (HashMap)outputMap.get("KKSV024003CC");
		}
//2013/03/09 add start
		//KKSV024003CCmapが取得できない = エラーがない　なので、空文字を返却する
		if (parentMap == null){ 
			bean[0].sendMessageString("違約金ワーニング", X31CWebConst.DATABEAN_SET_VALUE, "");
			return bean; 
		}
//2013/03/09 add End

		// エラー情報 ← エラー情報
		bean[0].sendMessageString("違約金ワーニング", X31CWebConst.DATABEAN_SET_VALUE, (String) parentMap.get("penaltyHasseiCdWarning"));
		
		return bean;
	}
	
// ++++++++++++++ 2013/03/07 v5.00.07 OT-2013-0000303 追加終了 ++++++++++++++++ //
// ANK-3383-00-00 ADD START
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：割引サービス解約・キャンセル選択
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV024004CC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 1)
		{
			return null;
		}
		
		// 自治体特別ＣＰの登録有無　true:有　false:無
		boolean isJctSpclCpAdd = false;
		// 自治体特別ＣＰの削除有無　true:有　false:無
		boolean isJctSpclCpDel = false;
		
		// 自治体割引サービスコードリスト
		X31SDataBeanAccessArray jctWribSvcCdList = bean[0].getDataBeanArray(KKW01030SFConst.JCT_WRIB_SVC_CD_LIST);
		HashSet<String> jctWribSvcCdSet = new HashSet<String>();
		for (int i = 0; i < jctWribSvcCdList.getCount(); i++)
		{
			jctWribSvcCdSet.add(jctWribSvcCdList.getDataBean(i).sendMessageString(KKW01030SFConst.JCT_WRIB_SVC_CD_04, X31CWebConst.DATABEAN_GET_VALUE));
		}
		
		// 選択キャンペーン一覧
		X31SDataBeanAccessArray selectCampaignIcrn = bean[0].getDataBeanArray(KKW01030SFConst.SELECT_CAMPAIGN_ICRN);
		HashSet<String> selectWribSvcCdSet = new HashSet<String>();
		for (int i = 0; i < selectCampaignIcrn.getCount(); i++)
		{
			// 割引サービスコード
			String wribSvcCd = selectCampaignIcrn.getDataBean(i).sendMessageString(KKW01030SFConst.WRIB_SVC_CD_03, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 割引サービスコードが自治体割引サービスコードリストに存在する場合
			if (jctWribSvcCdSet.contains(wribSvcCd))
			{
				isJctSpclCpDel = true;
			}
			selectWribSvcCdSet.add(wribSvcCd);
		}
		
		// 自治体特別ＣＰが削除されていない場合
		if (!isJctSpclCpDel)
		{
			return null;
		}
		
		// キャンペーン一覧
// IT1-2018-0000125 MOD START
//		X31SDataBeanAccessArray campaignIcrn = bean[0].getDataBeanArray(KKW01030SFConst.CAMPAIGN_ICRN);
		X31SDataBeanAccessArray campaignIcrn = null;
		// 選択内容
		String selectType = bean[0].sendMessageString(KKW01030SFConst.SELECT_TYPE, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 選択内容が"0"(解約／キャンセル)の場合
		if(JKKCommonConst.WRIB_DSL_CNCL.equals(selectType))
		{
			campaignIcrn = bean[0].getDataBeanArray(KKW01030SFConst.CAMPAIGN_ICRN_ALL);
		}
		else
		{
			campaignIcrn = bean[0].getDataBeanArray(KKW01030SFConst.CAMPAIGN_ICRN);
		}
// IT1-2018-0000125 MOD END
		for (int i = 0; i < campaignIcrn.getCount(); i++)
		{
			// 割引サービスコード
			String wribSvcCd = campaignIcrn.getDataBean(i).sendMessageString(KKW01030SFConst.WRIB_SVC_CD_02, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 割引サービスコードが選択キャンペーン一覧に存在する場合
			if (selectWribSvcCdSet.contains(wribSvcCd))
			{
				continue;
			}
// IT1-2018-0000125 ADD START
			// 同一回線フラグ
			String sameKaisenFlg = campaignIcrn.getDataBean(i).sendMessageString(KKW01030SFConst.SAME_KAISEN_FLG_02, X31CWebConst.DATABEAN_GET_VALUE);
			
			// 同一回線フラグがON以外の場合
			if (!"1".equals(sameKaisenFlg))
			{
				continue;
			}
// IT1-2018-0000125 ADD END
			
			// 割引サービスコードが自治体割引サービスコードリストに存在する場合
			if (jctWribSvcCdSet.contains(wribSvcCd))
			{
				isJctSpclCpAdd = true;
				break;
			}
		}
		
		// 自治体特別ＣＰが登録されている場合
		if (isJctSpclCpAdd)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// ＳＹＳＩＤ → 工事費割賦契約操作前処理CCマップ.ＫＥＹ＿ＳＹＳＩＤ
		parentMap.put("key_sysid", bean[0].sendMessageString("ＳＹＳＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// サービス契約番号 → 工事費割賦契約操作前処理CCマップ.ＫＥＹ＿サービス契約番号
		parentMap.put("key_svc_kei_no", bean[0].sendMessageString("サービス契約番号", X31CWebConst.DATABEAN_GET_VALUE));
		
		outputMap.put("KKSV024004CC", parentMap);
		
		return outputMap;
	}
// ANK-3383-00-00 ADD END

}
