/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0081C310TPMA
*	ソースファイル名：JEKK0081C310TPMA.java
*	作成者			：富士通
*	日付			：2014年01月28日
*＜機能概要＞
*	サービス契約情報変更(紹介コード)の副次処理を呼び出す部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v7.00.00	2014/01/28	富士通		新規作成
*	v7.00.01	2014/02/04	FJ）小島	ANK-1756-00-00
*	v7.00.02	2014/02/12	FJ）小島	ANK-1756-00-00
*	v10.00.00	2014/07/23	FJ）寺園	ANK-2137-00-00
*	v63.00.00	2022/11/25	FJ）小竹	ANK-4294-00-00
*	v64.00.00	2023/02/28	FJ）小竹	OM-2023-0000019
*
********************************************************************************/

package eo.ejb.cbs.mainproc;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JKKStrConst;
import eo.ejb.cbm.entity.KK0011ETMsg;
import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C310CBSMsg;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0011DBABase;
import eo.ejb.common.db.JKKejbKK0021DBABase;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0081SubTypeCreate;

/**
 * <p>
 * サービス契約情報変更(紹介コード)の顧客独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C310TPMA implements TemplateMainHandler
{

	/**
	 * <p>
	 * サービス契約情報変更(紹介コード)の副次処理部品の呼び出しを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	public void createSubTypeKK0081(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0081C310TPMA#createSubTypeKK0081");

		// サービス契約サブタイプ登録処理の呼び出し
		JKKejbKK0081SubTypeCreate instance = new JKKejbKK0081SubTypeCreate(inCBSMsg);
		instance.setSvcKeiNo(inCBSMsg.getString(EKK0081C310CBSMsg.SVC_KEI_NO));
		instance.setGeneAddDtm(inCBSMsg.getString(EKK0081C310CBSMsg.GENE_ADD_DTM));
		instance.createSubTypeKK0081();

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0081C310TPMA#createSubTypeKK0081");
	}

	/**
	 * <p>
	 * サービス契約情報変更(紹介コード)の副次処理部品の呼び出しを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	public void intrCdChk(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0081C310TPMA#intrCdChk");
		
		StringBuilder svcKeiNoStb = new StringBuilder();
		StringBuilder errFlgStb = new StringBuilder();
		boolean errFlg = false;
		boolean warningFlg = false;

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		JKKejbKK0081DBABase kk0081DBABase = new JKKejbKK0081DBABase();

		String intrCd = inCBSMsg.getString(EKK0081C310CBSMsg.INTR_CD);
		String svcKeiNo = inCBSMsg.getString(EKK0081C310CBSMsg.SVC_KEI_NO);
		
		// OM-2023-0000019 ADD START
		// 紹介コード"が設定された場合のみチェックする
		if (intrCd == null || intrCd.equals(""))
		{
			return;
		}
		// OM-2023-0000019 ADD END

		// 最も古いサービス契約レコードの申込明細番号を取得
		CAANMsg retOldKK0081 = kk0081DBABase.getOldestKK0081(svcKeiNo, opeDate);
		if (retOldKK0081 == null)
		{
			return;
		}
		String mskmDtlNo = retOldKK0081.getString(KK0081ETMsg.MSKM_DTL_NO);
		String mskmNo = null;
		
		if (mskmDtlNo != null)
		{
			CAANMsg retKK0021 = new JKKejbKK0021DBABase().getKK0021Current(mskmDtlNo);
			mskmNo = retKK0021.getString(KK0021ETMsg.MSKM_NO);
		}
		
		// SYSIDを取得
		CAANMsg retNewKK0081 = kk0081DBABase.getKK0081Current(svcKeiNo, opeDate);
		String sysid = retNewKK0081.getString(KK0081ETMsg.SYSID);

		// ANK-4294-00-00 ADD START
		String retintrcdChkTg = JCHModelCommon.getWorkParam("KK_INTRCD_CHK_TG");
		String[] intrcdChkTgAry = retintrcdChkTg.split(",");
		// 業務パラメータに設定された文字列から始まる紹介コードかチェック
		boolean isIntrcdChkTg = false;
		if (!intrCd.equals("") && intrCd.length() >= 4)
		{
			for(String intrcdChkTg : intrcdChkTgAry)
			{
				if(intrCd.substring(0,4).equals(intrcdChkTg)){
					// 設定された紹介コードで始まるため、フラグをＯＮ
					isIntrcdChkTg = true;
					break;
				}
			}
		}
		// ANK-4294-00-00 ADD END
		
		// 紹介コードに紐づくサービス契約明細を取得
		CAANMsg[] retKK0081List = kk0081DBABase.getKK0081byIntrCd(intrCd, opeDate);
		
		// 紹介コードに紐づくサービス契約が存在する場合はエラーまたはワーニング
		if (retKK0081List.length > 0)
		{
			for (CAANMsg retKK0081: retKK0081List)
			{
				// 更新対象のサービス契約の場合はチェック対象外
				if (svcKeiNo.equals(retKK0081.getString(KK0081ETMsg.SVC_KEI_NO)))
				{
					continue;
				}
				
				if (mskmNo != null)
				{
					// 最も古いサービス契約レコードの申込明細番号を取得
					CAANMsg retKK0081Chk = kk0081DBABase.getOldestKK0081(retKK0081.getString(KK0081ETMsg.SVC_KEI_NO), opeDate);
					
					if (retKK0081Chk.getString(KK0081ETMsg.MSKM_DTL_NO) != null)
					{
						CAANMsg retKK0021 = new JKKejbKK0021DBABase().getKK0021Current(retKK0081Chk.getString(KK0081ETMsg.MSKM_DTL_NO));
						
						// 更新対象の申込番号と同一の場合、チェック対象外
						if (mskmNo.equals(retKK0021.getString(KK0021ETMsg.MSKM_NO)))
						{
							continue;
						}
					}					
				}
				String svcKeiStat = retKK0081.getString(KK0081ETMsg.SVC_KEI_STAT);
				
				// 更新対象のSYSIDと同一の場合、ワーニング
				if (sysid != null && sysid.equals(retKK0081.getString(KK0081ETMsg.SYSID)))
				{
					setString(errFlgStb, "WA");
					warningFlg = true;
				}
				// ANK-4294-00-00 ADD START
				else if (isIntrcdChkTg)
				{
					// 設定された紹介コードで始まる場合
					// エラー条件
					// サービス契約ステータスが受付済み 或いは
					// サービス契約ステータスが照査済以上かつ、解約済未満の場合 或いは
					// サービス契約ステータスが解約済 或いは
					// サービス契約ステータスがキャンセル済
					
					if (JKKStrConst.CD00037_UK_ZM.equals(svcKeiStat)
							|| (JKKStrConst.CD00037_SHOSA_ZUMI.compareTo(svcKeiStat) <= 0 && 0 < JKKStrConst.CD00037_DSL_ZM.compareTo(svcKeiStat)) 
							|| JKKStrConst.CD00037_DSL_ZM.equals(svcKeiStat) 
							|| JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiStat))
					{
						setString(errFlgStb, "EC");
						errFlg = true;
					}
					
				}
				// ANK-4294-00-00 ADD END
				else if (JKKModelConst.SVC_KEI_STAT_UK_ZM.equals(svcKeiStat)
						&& retKK0081.getString(KK0081ETMsg.MSKM_DTL_NO) != null)
				{	
					// サービス契約ステータスが受付済かつ申込明細番号が設定されている場合
					// 申込明細番号より申込明細を取得
					CAANMsg retKK0021 = new JKKejbKK0021DBABase().getKK0021Current(retKK0081.getString(KK0081ETMsg.MSKM_DTL_NO));
					
					/* ++++++++++ v10.00.00 【ANK-2137-00-00 】mod start ++++++++++ */
//					// 申込番号が設定されているかつ申込形態コードがWEBの場合
//					if (!retKK0021.isNull(KK0021ETMsg.MSKM_NO) && ("01".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD))
//							|| "02".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD)) || "03".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD))))
					// 申込番号が設定されているかつ申込形態コードが「WEB」「量販」「訪販」「住宅専用WEB」の場合
					if (!retKK0021.isNull(KK0021ETMsg.MSKM_NO) && ("01".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD))
							|| "02".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD)) || "03".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD))
							|| "06".equals(retKK0021.getString(KK0021ETMsg.MSKM_FORM_CD))))
					/* ++++++++++ v10.00.00 【ANK-2137-00-00 】mod end ++++++++++ */
					{
						// 申込番号より申込を取得
						CAANMsg retKK0011 = new JKKejbKK0011DBABase().getKK0011Current(retKK0021.getString(KK0021ETMsg.MSKM_NO));
						
						if ("1".equals(retKK0011.getString(KK0011ETMsg.KARI_MSKM_FLG)))
						{	
							// 仮申込フラグが"1"（仮申込）の場合、ワーニング
							setString(errFlgStb, "WA");
							warningFlg = true;
						}
						else
						{
							setString(errFlgStb, "EC");
							errFlg = true;
						}
					}
					else
					{
						setString(errFlgStb, "EC");
						errFlg = true;
					}
				}
				else if (JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(svcKeiStat)
						|| JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(svcKeiStat))
				{
					// サービス契約ステータスが解約済、キャンセル済の場合
					setString(errFlgStb, "WA");
					warningFlg = true;
				}
				else
				{
					// サービス契約ステータスが受付済（仮申込以外）、締結済、照査済、サービス提供中、休止・中断中、停止中の場合
					setString(errFlgStb, "EC");
					errFlg = true;
				}
				
				// サービス契約番号を設定
				setString(svcKeiNoStb, retKK0081.getString(KK0081ETMsg.SVC_KEI_NO));
			}

			// ワーニングが1件でもあればワーニングを返す
			if (warningFlg)
			{
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.WARNING);
			}

			// エラーが1件でもあればエラーを返す（ワーニングがある場合でもエラーを優先）
			if (errFlg)
			{
				inCBSMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
			}
			// サービス契約番号（エラー分）、エラーフラグ（エラー出力用）を設定
			inCBSMsg.set(EKK0081C310CBSMsg.SVC_KEI_NO_ERR_O, svcKeiNoStb.toString());
			inCBSMsg.set(EKK0081C310CBSMsg.ERR_FLG_O, errFlgStb.toString());
		}
		
		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0081C310TPMA#intrCdChk");
	}
	
	/**
	 * <p>
	 * 文字列にカンマ区切りで設定します。
	 * </p>
	 * @param stb 被結合対象の文字列
	 * @param st 結合対象の文字列
	*/
	private void setString(StringBuilder stb, String st)
	{
		if (stb.length() > 0)
		{
			stb.append(",");
		}
		stb.append(st);
	}
}
