/*******************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JZMejbZM0081SecProc
 *	ソースファイル名：JZMejbZM0081SecProc.java
 *	作成者			：富士通
 *	日付			：2011年05月31日
 *＜機能概要＞
 *	住所に対する副次処理を行う部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00		2011/05/31	FJ) 山本	新規作成
 *
 ********************************************************************************/

package eo.ejb.common.db;

import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.ZM0081ETMsg;
import eo.ejb.cbm.entity.ZM0081LE;
import eo.ejb.cbs.cbsmsg.EZM0081C010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0081C012CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0081E010CBSMsg;
import eo.ejb.common.JZMModelCommon;
import eo.ejb.common.edit.JZMejbTEndYmdParts;

/**
 * <p>
 * 住所副次処理部品です。
 * </p>
 * @author 富士通
 */
public class JZMejbZM0081SecProc extends JPCejbDBABase
{
	/**
	 * <p>
	 * 新しいJZMejbZM0081SecProcを作成します。
	 * </p>
	 */
	public JZMejbZM0081SecProc()
	{
		super(ZM0081ETMsg.class.getName());
	}

	/**
	 * <p>
	 * 世代を管理するカラム名を取得します。
	 * </p>
	 * @return 世代を管理するカラム名
	 */
	protected String getGenerationColumn()
	{
		return ZM0081ETMsg.GENE_ADD_DTM;
	}

	/**
	 * <p>
	 * 無効状態を管理するカラム名を取得します。
	 * </p>
	 * @return 無効状態を管理するカラム名
	 */
	protected String getInvalidColumn()
	{
		return ZM0081ETMsg.MK_FLG;
	}

	/**
	 * <p>
	 * 予約管理エンティティか判定します。
	 * </p>
	 * @return 予約管理エンティティの場合はtrue
	 */
	protected boolean isReserveMgr()
	{
		return false;
	}

	/**
	 * <p>
	 * 予約適用基準日となるカラム名を取得します。
	 * </p>
	 * @return 予約適用基準日となるカラム名
	 */
	protected String getCurrentColumn()
	{
		return null;
	}

	/**
	 * <p>
	 * 予約の状態を管理するエンティティか判定します。
	 * </p>
	 * @return 予約の状態を管理するエンティティの場合はtrue
	 */
	protected boolean isReserveStateMgr()
	{
		return false;
	}

	/**
	 * <p>
	 * 予約の状態を管理するカラム名を取得します。
	 * </p>
	 * @return 予約の状態を管理するカラム名
	 */
	protected String getReserveStateColumn()
	{
		return null;
	}



	/**
	 * <p>
	 * 住所変更時、カレントレコードの削除を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param adCd 住所コード
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @return 処理が正常に完了した場合trueを返却
	 */
	public boolean updateAdInfo(CAANMsg inMsg, AgentDispatchContext inContext, String adCd, String geneAddDtm)
	{
		
		String tmpAdCd = adCd;
		String tmpGeneAddDtm = geneAddDtm;
			
		// 検索条件の設定
		CAANMsg msg = new CAANMsg(ZM0081ETMsg.class.getName());
		msg.set(ZM0081ETMsg.AD_CD, tmpAdCd);
		msg.set(ZM0081ETMsg.GENE_ADD_DTM, tmpGeneAddDtm);

		// 検索処理の実行
		CAANMsg ret = super.findByPrimaryKey(msg);
		
		// 更新情報(論理削除)設定
		// 更新オペレータカウント
		ret.set(ZM0081ETMsg.UPD_OPEACNT, inMsg.getString(EZM0081C010CBSMsg.UPD_OPEACNT));
		// 更新年月日時分秒
		ret.set(ZM0081ETMsg.UPD_DTM,     JZMModelCommon.getSysDateTimeStamp());
		// 削除オペレータアカウント
		ret.set(ZM0081ETMsg.DEL_OPEACNT, inMsg.getString(EZM0081C010CBSMsg.UPD_OPEACNT));
		// 削除年月日時分秒
		ret.set(ZM0081ETMsg.DEL_DTM,     JZMModelCommon.getSysDateTimeStamp());
		// 無効フラグ
		ret.set(ZM0081ETMsg.MK_FLG,      "1");
		
		try
		{
			super.update(ret);
		}
		catch (CAANFinderException e1)
		{
			throw new RuntimeException(e1);
		}

		return true;
	}

	/**
	 * <p>
	 * 同一キーで有効なレコードに対して、適用終了年月日の変更を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param adCd	      住所コード
	 * @param adTendymd  適用終了年月日
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @return 処理が正常に完了した場合trueを返却
	 */
	public boolean updateAdTendymd(CAANMsg inMsg, AgentDispatchContext inContext, String adCd, String adTendymd, String geneAddDtm)
	{
		
		String tmpAdCd = adCd;
		
		CAANMsg msg = new CAANMsg(ZM0081ETMsg.class.getName());
		CAANMsg[] ret = null;
		String maxGeneAddDtm = null;
		
		String updateAdTendymd = adTendymd;
		
		if(inMsg.getSchemaName().equals(EZM0081E010CBSMsg.class.getName()))
		{
			// 検索条件の設定
			msg.set(ZM0081ETMsg.AD_CD, tmpAdCd);
			msg.set(ZM0081ETMsg.GENE_ADD_DTM, geneAddDtm);
			
			// 検索処理の実行
			ret = null;
			try 
			{
				ret = new ZM0081LE().findByCondition(msg);
			}
			catch (CAANException e1) 
			{
				throw new RuntimeException(e1);
			}
			
			CAANMsg target = ret[0];
			
			if(target.getString(ZM0081ETMsg.HAISHI_YM) == null)
			{
				return true;
			}
			
			// 検索条件の設定
			msg.clear();
			msg.set(ZM0081ETMsg.AD_CD, tmpAdCd);
			msg.set(ZM0081ETMsg.MK_FLG, "0");

			// 検索処理の実行
			ret = null;
			try 
			{
				ret = new ZM0081LE().findByCondition(msg);
			}
			catch (CAANException e1) 
			{
				throw new RuntimeException(e1);
			}
			updateAdTendymd = null;
		}
		else
		{
			// 検索条件の設定
			msg.set(ZM0081ETMsg.AD_CD, tmpAdCd);
			msg.set(ZM0081ETMsg.MK_FLG, "0");

			// 検索処理の実行
			ret = null;
			try 
			{
				ret = new ZM0081LE().findByCondition(msg);
			}
			catch (CAANException e1) 
			{
				throw new RuntimeException(e1);
			}
			int listCnt = ret.length;
			maxGeneAddDtm = "";
			// 最大の世代登録年月日時分秒を取得
			for (int index = 0; index < listCnt; index++) 
			{
				CAANMsg target = ret[index];
				if(maxGeneAddDtm.compareTo(target.getString(ZM0081ETMsg.GENE_ADD_DTM)) < 0) 
				{
					maxGeneAddDtm = target.getString(ZM0081ETMsg.GENE_ADD_DTM);
				}
			}
		}
		int listCnt = ret.length;
		// 適用終了年月日を設定したデータの登録を行い、合わせて論理削除を行う。
		try
		{
			for (int index = 0; index < listCnt; index++) 
			{
				CAANMsg target = ret[index];
				// 最大の世代登録年月日が設定されているレコードは処理対象外
				if(maxGeneAddDtm != null && maxGeneAddDtm.compareTo(target.getString(ZM0081ETMsg.GENE_ADD_DTM)) == 0) 
				{
					continue;
				}
				
				// 更新情報(論理削除)設定
				
				// 更新オペレータアカウント
				target.set(ZM0081ETMsg.UPD_OPEACNT, inMsg.getString(EZM0081C012CBSMsg.UPD_OPEACNT));
				// 更新年月日時分秒
				target.set(ZM0081ETMsg.UPD_DTM,     JZMModelCommon.getSysDateTimeStamp());
				// 削除オペレータアカウント
				target.set(ZM0081ETMsg.DEL_OPEACNT, inMsg.getString(EZM0081C012CBSMsg.UPD_OPEACNT));
				// 削除年月日時分秒
				target.set(ZM0081ETMsg.DEL_DTM,     JZMModelCommon.getSysDateTimeStamp());
				// 無効フラグ
				target.set(ZM0081ETMsg.MK_FLG,      "1");
				
	
				super.update(target);
				
				// 適用終了年月日の再設定をし、登録を行う。
				String nullObj = null;
				// 世代登録年月日時分秒
				target.set(ZM0081ETMsg.GENE_ADD_DTM, JZMModelCommon.getSysDateTimeStamp());
				// 適用終了年月日
				target.set(ZM0081ETMsg.AD_TENDYMD,   JZMejbTEndYmdParts.getTEndYmd(inMsg, inContext, updateAdTendymd));
				// 登録オペレータアカウント
				target.set(ZM0081ETMsg.ADD_OPEACNT,  inMsg.getString(EZM0081C012CBSMsg.UPD_OPEACNT));
				// 登録年月日時分秒
				target.set(ZM0081ETMsg.ADD_DTM,      JZMModelCommon.getSysDateTimeStamp());
				// 更新オペレータアカウント
				target.set(ZM0081ETMsg.UPD_OPEACNT,  inMsg.getString(EZM0081C012CBSMsg.UPD_OPEACNT));
				// 更新年月日時分秒
				target.set(ZM0081ETMsg.UPD_DTM,      JZMModelCommon.getSysDateTimeStamp());
				// 削除オペレータアカウント
				target.set(ZM0081ETMsg.DEL_OPEACNT,  nullObj);
				// 削除年月日時分秒
				target.set(ZM0081ETMsg.DEL_DTM,      nullObj);
				// 無効フラグ
				target.set(ZM0081ETMsg.MK_FLG,       "0");
				
				super.create(target);

			}
		}
		catch (CAANFinderException e1)
		{
			throw new RuntimeException(e1);
		}
		catch (CAANCreateException e2)
		{
			throw new RuntimeException(e2);
		}
		return true;
	}
	
	/**
	 * <p>
	 * 有効な住所データの論理削除を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param adCd	      住所コード
	 * @return 処理が正常に完了した場合trueを返却
	 */
	public boolean deleteAdInfo(CAANMsg inMsg, AgentDispatchContext inContext, String adCd)
	{
		
		String tmpAdCd = adCd;
		
		// 検索条件の設定
		CAANMsg msg = new CAANMsg(ZM0081ETMsg.class.getName());
		msg.set(ZM0081ETMsg.AD_CD, tmpAdCd);
		msg.set(ZM0081ETMsg.MK_FLG, "0");

		// 検索処理の実行
		CAANMsg[] ret = null;
		try 
		{
			ret = new ZM0081LE().findByCondition(msg);
		}
		catch (CAANException e1) 
		{
			throw new RuntimeException(e1);
		}

		int listCnt = ret.length;

		// 有効なレコード全件の論理削除を行う。
		try
		{
			for (int index = 0; index < listCnt; index++) 
			{
				CAANMsg target = ret[index];
				
				// 更新情報(論理削除)設定
				
				// 更新オペレータアカウント
				target.set(ZM0081ETMsg.UPD_OPEACNT, inMsg.getString(EZM0081E010CBSMsg.UPD_OPEACNT));
				// 更新年月日時分秒
				target.set(ZM0081ETMsg.UPD_DTM,     JZMModelCommon.getSysDateTimeStamp());
				// 削除オペレータアカウント
				target.set(ZM0081ETMsg.DEL_OPEACNT, inMsg.getString(EZM0081E010CBSMsg.UPD_OPEACNT));
				// 削除年月日時分秒
				target.set(ZM0081ETMsg.DEL_DTM,     JZMModelCommon.getSysDateTimeStamp());
				// 無効フラグ
				target.set(ZM0081ETMsg.MK_FLG,      "1");
				
	
				super.update(target);
			}
		}
		catch (CAANFinderException e1)
		{
			throw new RuntimeException(e1);
		}
		return true;
	}
}
