/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCKSV902301MappingCC
*   ソースファイル名：JCKSV902301MappingCC.java
*   作成者          ：富士通
*   日付            ：2017年04月17日
*＜機能概要＞
*   PMP連携お客様情報本登録マッピングCCです。
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v29.00.00	2017/04/17	FJ)辻本		新規作成【ANK-3132-00-00】バックヤード画面へのコンテンツ同意登録機能の追加
*	v73.00.00	2024/11/22	FJ)丸田	【ANK-4570-00-00】コンテンツ新規同時申込み時契約仕様見直し対応
*	v74.00.00	2025/03/03	FJ)佐々木	【ANK-4668-00-00】コンテンツ新規同時申込み時契約仕様見直し対応 メール文面変更対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import static com.fujitsu.futurity.bp.custom.common.JCKPmpCommonUtil.*;
import static com.fujitsu.futurity.bp.custom.common.JCKPmpScParamHenshu.*;
import static eo.common.constant.JCKStrConst.MMB_SBT_CD_MASTER_HOJIN;
import static eo.common.constant.JCKStrConst.PMP_ERR_MMB_DUP;
import static eo.common.constant.JCKStrConst.PMP_ERR_SYSTEM;
import static eo.common.constant.JCKStrConst.PMP_NORMAL_END;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.CKSV9022_CKSV9022OP_CKSV902201CC;
import com.fujitsu.futurity.bp.custom.constant.CKSV9022_CKSV9022OP_CKSV902201CC_mail_rcv_sette_list;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011B050CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0131B020CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0131B020CBSMsg1List;

/**
 * お客様情報取得、標準コンテンツ契約存在チェック、オプトインメールマスタ情報の取得を行い、<br>
 * PMP連携お客様情報本登録へマッピングします。<p>
 * <br>
 * @author FJ
 */
public class JCKSV902301MappingCC extends AbstractCommonComponent
{
	/** コンテンツ同意済みエラーコード */
	private static final String PMP_ERR_CONTENTS_AGREEMENT = "97";
	
	/**
	 * PMP連携お客様情報本登録マッピングを行います。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @throws Throwable 例外が発生した場合
	 * @return モデルグループ、コントロールマップを含むパラメータオブジェクト
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeMain(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 入力パラメータ取得
		Map inMap = (Map)param.getData(fixedText);
		String sysid = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.SYSID);
		String rrksMlad = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.RRKS_MLAD);
		String ispKssaiSvcKeiNo = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.ISP_KSSAI_SVC_KEI_NO);
		String ckUpdDtm = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.CK_UPD_DTM);
		String kkUpdDtm = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.KK_UPD_DTM);
// ANK-4570-00-00 ADD START
		String ispKssaiAddNasiFlg = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.ISP_KSSAI_ADD_NASI_FLG);
// ANK-4570-00-00 ADD END
// ANK-4668-00-00 ADD START
		String optinmRcvstHaneiJgiFlg = (String)inMap.get(CKSV9022_CKSV9022OP_CKSV902201CC.OPTINM_RCVST_HANEI_JGI_FLG);
// ANK-4668-00-00 ADD END

		// リターンコード初期化
		String returnCd = PMP_NORMAL_END;
		
		//***************************************************
		// 内部で使用する変数の初期化
		//***************************************************
		Map<String, Object> nowCustMap = new HashMap<String, Object>();
		String eoid = null;
		String memberSbtCd = null;
		String sei = null;
		String nm = null;
		String kanaSei = null;
		String kanaNm = null;
		String sex = null;
		String pcd = null;
		String adStateCity = null;
		String adOther = null;
		String birthd = null;
		String contSvcKeiNo = null;
		List<Map<String, String>> mailRcvSetteList = new ArrayList<Map<String, String>>();
		
		//***************************************************
		// お客様情報照会（PMP連携用）SC呼出
		//***************************************************
		Map result = callECK0011B050(handle, param, JPCModelConstant.FUNC_CD_1, sysid);
		if (isSuccess(result))
		{
			CAANMsg[] dataList = getResultMsgList(result, ECK0011B050CBSMsg.ECK0011B050CBSMSG1LIST);
			if (dataList == null || dataList.length == 0)
			{
				returnCd = PMP_ERR_SYSTEM;   // システムエラー
			}
			else
			{
				// お客様情報照会(PMP連携用)結果マップを取得
				nowCustMap = copyMsgToMap(dataList[0], ECK0011B050CBSMsg1List.class, ECK0011B050CBSMsg1List.class);
				
				//標準コンテンツサービス契約番号
				contSvcKeiNo = (String)nowCustMap.get(ECK0011B050CBSMsg1List.SVC_KEI_NO);
				
				// 標準コンテンツ契約が設定済みの場合
				if (!JCKBPCommon.isNullOrBlank(contSvcKeiNo))
				{
					returnCd = PMP_ERR_CONTENTS_AGREEMENT;	// コンテンツ同意済みエラー
				}
			}
		}
		else
		{
			returnCd = PMP_ERR_SYSTEM;   // システムエラー
		}

		//***************************************************
		// オプトインメール一覧照会(PMP連携用)SC呼出
		//***************************************************
		if (PMP_NORMAL_END.equals(returnCd))
		{
			// 公開分を取得
			result = callECK0131B020(handle, param, JPCModelConstant.FUNC_CD_1);
			if (isSuccess(result))
			{
				CAANMsg[] msgList = getResultMsgList(result, ECK0131B020CBSMsg.ECK0131B020CBSMSG1LIST);
				if (msgList != null)
				{
					for (CAANMsg msg : msgList)
					{
						String retOptinmNo = msg.getString(ECK0131B020CBSMsg1List.OPTINM_NO);   // オプトインメール番号
						
						Map<String, String> rcvSette = new HashMap<String, String>();
						rcvSette.put(CKSV9022_CKSV9022OP_CKSV902201CC_mail_rcv_sette_list.KMK_NUMBER, retOptinmNo);
						rcvSette.put(CKSV9022_CKSV9022OP_CKSV902201CC_mail_rcv_sette_list.RCV_DIV, "0");   // 受信なし
						mailRcvSetteList.add(rcvSette);
					}
				}
			}
			else
			{
				returnCd = PMP_ERR_SYSTEM;   // システムエラー
			}
		}
		
		eoid = (String)nowCustMap.get(ECK0011B050CBSMsg1List.EOID);
		memberSbtCd = (String)nowCustMap.get(ECK0011B050CBSMsg1List.MEMBER_SBT_CD);

		// 法人の場合、PMP連携お客様情報本登録CCで必須項目チェックがあるため以下の値をセット
		if (MMB_SBT_CD_MASTER_HOJIN.equals(memberSbtCd))
		{
			sei = (String)nowCustMap.get(ECK0011B050CBSMsg1List.CUST_NM);   // お客様名
			nm = "　";   // 全角スペース
			kanaSei = (String)nowCustMap.get(ECK0011B050CBSMsg1List.CUST_KANA);   // お客様カナ名
			kanaNm = "　";   // 全角スペース
			sex = "3";   // 不明
			pcd = (String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_PCD);   // 契約者郵便番号
			adStateCity = (String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_STATE_NM) + (String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_CITY_NM);   // 契約者都道府県名＋契約者市区町村名
// ANK-4668-00-00 MOD START
//			adOther = (String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_OAZTSU_NM) + (String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_AZCHO_NM) + (String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_BNCHIGO);   // 契約者大字通称名＋契約者字丁目名＋契約者番地号
			adOther = nullToEmpty((String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_OAZTSU_NM)) + 
						nullToEmpty((String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_AZCHO_NM)) + 
						nullToEmpty((String)nowCustMap.get(ECK0011B050CBSMsg1List.KEISHA_BNCHIGO));   // 契約者大字通称名＋契約者字丁目名＋契約者番地号
// ANK-4668-00-00 MOD END
			birthd = (String)nowCustMap.get(ECK0011B050CBSMsg1List.CUST_BIRTHD);   // お客様生年月日
			if (JCKBPCommon.isNullOrBlank(birthd))
			{
				// お客様生年月日が存在しない場合は19000101をセット
				birthd = "19000101";
			}
			
			// 法人の場合、同一人チェック
			if (PMP_NORMAL_END.equals(returnCd))
			{
				boolean chkResult = checkSameMmb(handle, param, kanaSei, birthd, rrksMlad, sysid);
				if (!chkResult)
				{
					returnCd = PMP_ERR_MMB_DUP;	// フリガナ氏名、生年月日、連絡用アドレス重複エラー
				}
			}
		}
		
		//***************************************************
		// 返却パラメータ設定
		//***************************************************
		
		// 最後に実行したSCの実行結果を取得
		result = getLastResult(param);

		// 下りコントロールマップのセット
		setResultCtrlData(param, result, fixedText);

		// 下りユーザデータマップのセット
		Map<String, Object> resultMap = new HashMap<String, Object>();
		
		// コンテンツ同意済みエラー、同一人エラーはエラーコードをビューロジックまで返す
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.RETURN_CD, returnCd);
		
		// PMP連携お客様情報本登録CCへのマッピング
		// 業務区分：「3」（マスター会員）
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.WORK_DIV, "3");
		// ＳＹＳＩＤ
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.SYSID, sysid);
		// ＥＯＩＤ
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.EOID, eoid);
		 // 連絡先メールアドレス
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.RRKS_MLAD, rrksMlad);
		// サービス契約番号
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.SVC_KEI_NO, "ZZZZZZZZZZ");
		// メール受信設定リスト
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.MAIL_RCV_SETTE_LIST, mailRcvSetteList);
		// 氏名（姓）
		if (!JCKBPCommon.isNullOrBlank(sei))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.SEI, sei);
		}
		// 氏名（名）
		if (!JCKBPCommon.isNullOrBlank(nm))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.NM, nm);
		}
		// カナ名（姓）
		if (!JCKBPCommon.isNullOrBlank(kanaSei))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.KANA_SEI, kanaSei);
		}
		// カナ名（名）
		if (!JCKBPCommon.isNullOrBlank(kanaNm))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.KANA_NM, kanaNm);
		}
		// 性別
		if (!JCKBPCommon.isNullOrBlank(sex))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.SEX, sex);
		}
		// 郵便番号
		if (!JCKBPCommon.isNullOrBlank(pcd))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.PCD, pcd);
		}
		// 住所（都道府県／市区町村）
		if (!JCKBPCommon.isNullOrBlank(adStateCity))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.AD_STATE_CITY, adStateCity);
		}
		// 住所（上記以外）
		if (!JCKBPCommon.isNullOrBlank(adOther))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.AD_OTHER, adOther);
		}
		// 生年月日
		if (!JCKBPCommon.isNullOrBlank(birthd))
		{
			resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.BIRTHD, birthd);
		}
		// サービス契約番号（ISP決済）
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.ISP_KSSAI_SVC_KEI_NO, ispKssaiSvcKeiNo);
		// 他システム連携サービス契約コード通番は「0」固定
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.TSYRN_SVKEI_CD_SEQ, "0");
		// 更新日時（お客様）
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.CK_UPD_DTM, ckUpdDtm);
		// 更新日時（サービス契約）
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.KK_UPD_DTM, kkUpdDtm);
		
// ANK-4570-00-00 ADD START
		// ISP決済登録なしフラグ
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.ISP_KSSAI_ADD_NASI_FLG, ispKssaiAddNasiFlg);
// ANK-4570-00-00 ADD END
		
// ANK-4668-00-00 ADD START
		// オプトインメール受信設定反映除外フラグ
		resultMap.put(CKSV9022_CKSV9022OP_CKSV902201CC.OPTINM_RCVST_HANEI_JGI_FLG, optinmRcvstHaneiJgiFlg);
// ANK-4668-00-00 ADD END
		setResultUserData(param, "CKSV006002CC", resultMap);
		
		return param;
	}
// ANK-4668-00-00 ADD START
	/**
	 * NULLを空文字に変換する。
	 * @param value
	 * @return 変換後の文字列
	 */
	private String nullToEmpty(String value)
	{
		return (value == null) ? "" : value;
	}
// ANK-4668-00-00 ADD END
}
