/*********************************************************************
*   All Right reserved,Copyright (c) Fujitsu, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム構築
*   モジュール名    ：JECH0101D011TPMA
*   ソースファイル名：JECH0101D011TPMA.java
*   作成者          ：富士通
*   日付            ：2011年09月12日
*＜機能概要＞
*   料金調整登録顧客独自処理部品
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/09/12  富士通      新規作成
*   v5.00.00    2013/07/15  FJ) 林     【LT-2013-0000293】【LT-2013-0000355】 工事遅延明細に対する対応
*   v5.00.01    2013/07/23  FJ) 文元   【LT-2013-0000596】全行取消の時、預り金(後)への編集処理を追加
*   v5.00.02    2013/07/24  FJ) 林     【LT-2013-0000517】工事遅延明細に対する残対応
*	v5.00.03    2013/07/28  FJ) 林     【LT-2013-0000600】調整前データを債権内訳に登録する対応
*	v5.00.04    2013/07/30  FJ) 垣内   【LT-2013-0000595】前受け充当金対応
*	v5.00.05    2013/08/14  FJ) 林     【LT-2013-0000517 再】料金調整画面にて免税の内訳を含む集計計算時、システムエラー
*	v5.00.06    2013/08/27  FJ) 林     【IT1-2013-0001612】請求取消仕様変更。請求取消後、再度料金調整を可能とする。
*	v5.00.07    2013/08/31  FJ) 林     【OM-2013-0001137】料金再調整バッチからの呼び出し用に機能コード4を追加。
*	v5.00.08    2013/09/06  FJ) 林     【OM-2013-0001718/1769/1773】
*                                       会社別合計チェック変更・相殺額２重計上不備修正・調整前データ生成不備修正・債権内訳集計結果反映不備修正
*	v5.00.09    2013/09/12  FJ) 林     【OM-2013-0001890】前受け充当金対応 請求取消時、サマリ用＿請求内訳情報に前受金充当額（後）を設定するよう修正
*	v5.00.10    2013/09/17  FJ) 林     【随時-13-5005】抱き合わせ。不要につき請求取消チェックを削除。
*	v8.00.00    2014/02/14  FJ) 林     【OM-2013-0005255】料金調整画面、請求作成機能追加。
*	v8.00.01	2014/03/12	FJ) 林     【TG1-2014-0000004】消費税に伴う料金施策（増税対応）
*	v8.00.02	2014/04/25	FJ) 林     【OM-2014-0001671】会社別合計内訳マイナス金額チェック削除対応
*	v8.00.03	2014/06/09	FJ) 中井   【OM-2014-0001815】前受金取り消したら料金再調整でABEND
*	v9.00.00	2014/05/08	FJ) 林     【ANK-2054-00-00】スマートリンク端末補償対応
*	v9.00.01	2014/05/29	FJ）江森   【IT1-2014-000164】製造番号を取得する基準日を修正。
*	v12.00.00	2015/02/16	FJ）川島   【OM-2015-0000053】工事遅延分存在チェック追加。
*	v24.00.00	2016/03/01  FJ）宇野   【OM-2016-0000569】性能障害対応
*	v32.00.00	2017/07/28  FJ）江藤   【OM-2017-0000509】料金調整データ不備により請求書発行ABEND
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.base.CAANSQLFacility;
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.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCHCommonFormatUtil;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.CH0011ETMsg;
import eo.ejb.cbm.entity.CH0051ETMsg;
import eo.ejb.cbm.entity.CH0101ETMsg;
import eo.ejb.cbm.entity.CH0501ETMsg;
import eo.ejb.cbm.entity.KK0491ETMsg;
import eo.ejb.cbm.entity.KK0501ETMsg;
import eo.ejb.cbm.entity.KK0521ETMsg;
import eo.ejb.cbm.entity.KK0541ETMsg;
import eo.ejb.cbs.cbsmsg.ECH0101D011CBSMsg;
import eo.ejb.cbs.cbsmsg.ECH0101D011CBSMsg7List;
import eo.ejb.common.JCHModelCommon;
import eo.ejb.common.JPCModelCommon;
import eo.ejb.common.db.JCHejbCH0011SecProc;
import eo.ejb.common.db.JCHejbCH0041SecProc;
import eo.ejb.common.db.JCHejbCH0051SecProc;
import eo.ejb.common.db.JCHejbCH0101SecProc;
import eo.ejb.common.entity.JCHejbCH0101KRCK;

/**
 * <p>
 * 料金調整登録時に副次処理を呼び出す部品
 * </p>
 * @author 富士通
 * 
 */
public class JECH0101D011TPMA extends CAANSQLFacility implements TemplateMainHandler{
	
	/**
	 * コンストラクタです。
	 */
	public JECH0101D011TPMA()
	{
		super();
	}
	
	/** 基準日 */
	private static final String STANDARD_DAY = "standard_day";
	
	/**
	 * <p>
	 * 料金調整登録時に各チェックを行い
	 * 請求内訳、債権内訳、請求、債権、一時金の更新を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public static void invoke(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANException
	{
		// 機能コード別処理詳細
		//   1：登録
		//   2：返却リスト作成
		//   3：返却リスト作成 + 登録
		//   4：返却リスト作成 + 登録（一時金登録なし）
		//   5：請求作成
		String funcCd = inCBSMsg.getObject(ECH0101D011CBSMsg.FUNC_CODE).toString();
		
		if(JPCModelConstant.FUNC_CD_5.equals(funcCd))
		{
			/** 請求作成処理 */
			seikyAdd(inCBSMsg, inContext);
			return;
		}
		
		// 基準日取得（料金スケジュール定義の利用終了日）
		String useYmdArray[] = JCHModelCommon.getUseYmd(inCBSMsg, "2", inCBSMsg.getString("seiky_ym"));
		inCBSMsg.setPrivate(STANDARD_DAY, useYmdArray[1]);
		
		JCHejbCH0101SecProc CH0101 = new JCHejbCH0101SecProc();
		
		/** InputListマージ処理 */
		CAANMsg[] caECH0101CBSMsg5List = inCBSMsg.getCAANMsgList(ECH0101D011CBSMsg.ECH0101D011CBSMSG5LIST);
		if (caECH0101CBSMsg5List!= null)
		{
			CH0101.margeInputList(inCBSMsg,  ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST,  ECH0101D011CBSMsg.ECH0101D011CBSMSG5LIST);
		}
		
		/** 料金集計 初期処理 */
		HashMap<String, Object> initMsp = CH0101.init(inCBSMsg, inContext, ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST);
		
		/** 料金集計 主処理 */
		ArrayList<CAANMsg> alPrcShukResltList = CH0101.main(inCBSMsg, inContext, initMsp);
		
		/** チェック処理 */
		if(!isCheck(inCBSMsg, inContext, alPrcShukResltList) ){
			return;
		}
		
		JECH0101DTPMA CH0101D = new JECH0101DTPMA();
		
		if (JPCModelConstant.FUNC_CD_2.equals(funcCd) || JPCModelConstant.FUNC_CD_3.equals(funcCd) || JPCModelConstant.FUNC_CD_4.equals(funcCd))
		{
			/** 返却リスト作成処理（ECH0101D011CBSMsg2List） */
			ArrayList<CAANMsg> alOutPutList = CH0101.makeOutPutMsgList(inCBSMsg, inContext, initMsp, alPrcShukResltList);
			
			/** 返却リスト作成処理（ECH0101D011CBSMsg6List） */
			CAANMsg[] outMsg = (CAANMsg[])alOutPutList.toArray(new CAANMsg[0]);
			if (caECH0101CBSMsg5List!= null)
			{
				/** OutputList分離処理 */
				CH0101.divideOutputList(inCBSMsg, outMsg, ECH0101D011CBSMsg.ECH0101D011CBSMSG5LIST, ECH0101D011CBSMsg.ECH0101D011CBSMSG2LIST,  ECH0101D011CBSMsg.ECH0101D011CBSMSG6LIST);
			}
			else
			{
				inCBSMsg.set(ECH0101D011CBSMsg.ECH0101D011CBSMSG2LIST, outMsg);
			}
			
			/** 返却リスト作成処理（ECH0101D011CBSMsg3List・ECH0101D011CBSMsg4List） */
			if (alPrcShukResltList.size() > 0) 
			{
				CH0101D.makeOutPutMsgList(inCBSMsg, inContext, alPrcShukResltList, initMsp);
			} 
			else 
			{
				// 請求取消時
				CH0101D.makeOutPutMsgList(inCBSMsg, inContext);
			}
		}
		if (JPCModelConstant.FUNC_CD_1.equals(funcCd) || JPCModelConstant.FUNC_CD_3.equals(funcCd) || JPCModelConstant.FUNC_CD_4.equals(funcCd))
		{
			/** 登録初期処理 */
			HashMap<String, Object> execInitMap = CH0101D.executeInit(inCBSMsg, inContext, initMsp, alPrcShukResltList, !JPCModelConstant.FUNC_CD_4.equals(funcCd));
			
			/** 登録処理 */
			CH0101D.execute(inCBSMsg, inContext, execInitMap);
		}
	}

	/**
	 * <p>
	 * 請求調整登録時に以下のチェックを行う。
	 * ・請求契約番号存在チェック
	 * ・請求番号存在チェック
	 * ・債権番号存在チェック
	 * ・サービス契約番号存在チェック
	 * ・請求先合計内訳マイナス金額チェック
	 * ・明細前受金充当額チェック
	 * ・調整後前受金充当額チェック
	 * ・請求取消チェック
	 * ・請求情報排他チェック
	 * ・債権情報排他チェック
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	private static boolean isCheck(CAANMsg inCBSMsg, AgentDispatchContext inContext, ArrayList<CAANMsg> alPrcShukResltList)
	{
		// 請求契約番号
		String sSeiKeiNo = inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SEIKY_KEI_NO);
		// 請求番号
		String sSeikyNo = inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SEIKY_NO);
		// 請求年月
		String sSeikyYm = inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SEIKY_YM);
		// 債権番号
		String sSaikenNo = inCBSMsg.getString(JACStrConst.ECH0101CBSMSG_SAIKEN_NO);

		// 登録一覧
		CAANMsg[] caECH0101DCBSMsg1List = inCBSMsg.getCAANMsgList(ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST);

		// 請求契約番号の存在チェック
		if (!JCHejbCH0101KRCK.isPrcAdjCheck001(inCBSMsg, inContext, sSeiKeiNo))
		{
			// 請求契約番号が存在しない場合、請求契約番号エラー項目に"EA"を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_KEI_NO_ERR, "EA");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return false;
		}

		// 請求番号チェック
		String[] checkRsult2 = JCHejbCH0101KRCK.isPrcAdjCheck002(inCBSMsg, inContext, sSeikyYm, sSeikyNo);

		// ＮＧの場合（falseの場合）
		if (checkRsult2[0] != null)
		{
			// 請求番号エラー項目を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_NO_ERR, checkRsult2[0]);
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return false;
		}

		// 債権番号チェック
		String[] checkRsult3 = JCHejbCH0101KRCK.isPrcAdjCheck003(inCBSMsg, inContext, sSeikyYm, sSaikenNo);

		// ＮＧの場合（falseの場合）
		if (checkRsult3[0] != null)
		{
			// 債権番号エラー項目を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.SAIKEN_NO_ERR, checkRsult3[0]);
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return false;
		}

		// サービス契約番号存在チェック
		boolean checkRsult4 = JCHejbCH0101KRCK.isPrcAdjCheck004(inCBSMsg, inContext, caECH0101DCBSMsg1List);
		
		// ＮＧの場合（falseの場合）
		if (!checkRsult4)
		{
			// 料金調整登録一覧明細エラー項目に"ED"を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST_ERR, "ED");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}

		// 請求先合計内訳マイナス金額チェック
		if (!JCHejbCH0101KRCK.isPrcAdjCheck005(inCBSMsg, inContext, alPrcShukResltList))
		{
			// 請求先合計が0以下である場合、料金調整登録一覧明細のエラー項目に"EE"を設定する。
			inCBSMsg.set(ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST_ERR, "EE");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return false;
		}

		/** 請求情報排他チェック */
		boolean checkRsult10 = JCHejbCH0101KRCK.isPrcAdjCheck010(inCBSMsg, inContext, checkRsult2[1]);
		
		// ＮＧの場合（falseの場合）
		if (!checkRsult10)
		{
			// 請求が更新されている場合、料金調整登録一覧明細エラー項目に"EJ"を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_UPD_DTM_AF_ERR, "EJ");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}
		
		/** 債権情報排他チェック */
		boolean checkRsult11 = JCHejbCH0101KRCK.isPrcAdjCheck011(inCBSMsg, inContext, checkRsult3[1]);
		
		// ＮＧの場合（falseの場合）
		if (!checkRsult11)
		{
			// 債権が更新されている場合、料金調整登録一覧明細エラー項目に"EJ"を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.SAIKEN_UPD_DTM_AF_ERR, "EJ");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}
		
		/** 機器製造番号チェック */
		if (!JCHejbCH0101KRCK.isPrcAdjCheck012(inCBSMsg, inContext, ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST, inCBSMsg.getString(STANDARD_DAY)))
		{
			// 機器提供サービス契約にデータが存在しない場合、料金調整登録一覧明細のエラー項目に"EN"を設定する。
			inCBSMsg.set(ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST_ERR, "EN");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return false;
		}
		
		/** 前受金充当額訂正期間チェック */
		boolean checkRsult13 = JCHejbCH0101KRCK.isPrcAdjCheck013(inCBSMsg, inContext, sSeikyYm, caECH0101DCBSMsg1List);
		
		// ＮＧの場合（falseの場合）
		if (!checkRsult13)
		{
			// 前受金充当額訂正可能期間でない場合、料金調整登録一覧明細エラー項目に"EO"を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST_ERR, "EO");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}
		
		/** 工事遅延分存在チェック */
		if(!JCHejbCH0101KRCK.isExistKojiDly(inCBSMsg, inContext, sSeikyNo, sSeiKeiNo, sSeikyYm))
		{
			// 工事遅延分存在チェックエラーの場合、料金調整登録一覧明細エラー項目に"EP"を設定し処理を終了する。
			inCBSMsg.set(ECH0101D011CBSMsg.ECH0101D011CBSMSG1LIST_ERR, "EP");
			inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			
			return false;
		}
		
		return true;
	}

	/**
	 * <p> 請求作成処理
	 * <p> 請求作成チェックを行い、請求・債権・請求債権関連を登録する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	private static void seikyAdd(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws CAANRuntimeException
	{
		try 
		{
			// 請求作成チェック
			if (!checkSeikyAdd(inCBSMsg, inContext))
			{
				return;
			}
			
			// 請求作成情報設定
			setSeikyAddInfo(inCBSMsg, inContext);
			
			// 請求の副次問い合わせ
			JCHejbCH0051SecProc CH0051 = new JCHejbCH0051SecProc();
			
			// 債権の副次問い合わせ
			JCHejbCH0011SecProc CH0011 = new JCHejbCH0011SecProc();
			
			// 請求債権関連副次問い合わせ
			JCHejbCH0041SecProc CH0041 = new JCHejbCH0041SecProc();
			
			// 請求登録
			CH0051.createSeiky(inCBSMsg, inContext);
			
			// 債権登録
			CH0011.createSaiken(inCBSMsg, inContext);
			
			// 請求債権関連登録
			CH0041.createSeikySaikenKnrn(inCBSMsg);
		} 
		catch (Exception e)
		{
			inCBSMsg.set(CH0101ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
	}

	/**
	 * <p> 請求作成チェック処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	private static boolean checkSeikyAdd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		try
		{
			CAANMsg[] msgList = inCBSMsg.getCAANMsgList(ECH0101D011CBSMsg.ECH0101D011CBSMSG7LIST);

			/* 請求作成可否チェック */
			String svcKeiStat =  msgList[0].getString(ECH0101D011CBSMsg7List.SVC_KEI_STAT);
			if (JCHCommonFormatUtil.isNull((svcKeiStat))
					|| JACStrConst.SVC_KEI_STAT_UKTK.equals(svcKeiStat)
					|| JACStrConst.SVC_KEI_STAT_SYOSA.equals(svcKeiStat)
					|| JACStrConst.SVC_KEI_STAT_TIKT.equals(svcKeiStat)
					|| JACStrConst.SVC_KEI_STAT_CNCL_ZUMI.equals(svcKeiStat))

			{
				// 契約状態（※）がサービス提供中〜解約済の範囲外の場合エラー
				// （※）請求先配下のサービス契約群のうち請求作成用サービス契約ステータス優先順(CD01622)が最も高い契約状態
				inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_KEI_NO_ERR, "EK");
				inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				return false;
			}

			/* 請求可能期限チェック */
			if (JACStrConst.SKHK_SVKEI_STAT_CD_DSL.equals(msgList[0].getString(ECH0101D011CBSMsg7List.SKHK_SVKEI_STAT_CD)))
			{
				// 請求契約配下サービス契約状態コードが910:解約済の場合のみチェックを実施
				String svcChrgEndYmd =  msgList[0].getString(ECH0101D011CBSMsg7List.SVC_CHRG_ENDYMD);
				String seikyYm = inCBSMsg.getString("seiky_ym");

				// 解約後請求可能期間取得
				 String seikyKan = JCHModelCommon.getWorkParam(JACStrConst.WKPRA_AC_DSL_AF_SEIKY_KAN);
				
				if (JCHCommonFormatUtil.isNull(seikyKan) || JCHCommonFormatUtil.isNull(svcChrgEndYmd))
				{
					// 解約後請求可能期間が取得できなかった場合、サービス課金終了年月日が取得できなかった場合エラー
					inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_KEI_NO_ERR, "EL");
					inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
					return false;
				}
				else
				{
					// サービス課金終了年月日 + 36ケ月
					String setTgYm = JPCUtilCommon.addMonth(svcChrgEndYmd, Integer.parseInt(seikyKan)).substring(0,6);
					if (setTgYm.compareTo(seikyYm) < 0)
					{
						// サービス課金終了年月日 + 36ケ月 < 請求年月の場合エラー
						inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_KEI_NO_ERR, "EL");
						inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
						return false;
					}
				}
			}

			/* 督促ステータスチェック */
			String tokusokuStat =  msgList[0].getString(ECH0101D011CBSMsg7List.TOKUSOKU_STAT);
			if (JACStrConst.TOKUSOKU_STAT_LAW_TAISHO.equals(tokusokuStat)
					|| JACStrConst.TOKUSOKU_STAT_NSAIKEN_ITK_ZUMI.equals(tokusokuStat)
					|| JACStrConst.TOKUSOKU_STAT_SMALL_SKN.equals(tokusokuStat)
					|| JACStrConst.TOKUSOKU_STAT_KASHID_ZUMI.equals(tokusokuStat))
			{
				// 督促ステータスが60:法的措置対象 or 61:ニッテレ債権委託済 or 62:小額債権 or 90:貸倒登録済の場合エラー
				inCBSMsg.set(ECH0101D011CBSMsg.SEIKY_KEI_NO_ERR, "EM");
				inCBSMsg.set(ECH0101D011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
				return false;
			}
		}
		catch (Exception e)
		{
			inCBSMsg.set(CH0101ETMsg.STATUS, StatusCodes.RELATION_ERR);
			throw new CAANRuntimeException(e);
		}
		return true;
	}
	
	/**
	 * <p> 請求作成情報を設定する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @throws CAANCreateException 
	 */
	private static void setSeikyAddInfo(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{
		String seikyKeiNo = inCBSMsg.getString("seiky_kei_no");
		String seikyYm = inCBSMsg.getString("seiky_ym");

		inCBSMsg.setPrivate(CH0051ETMsg.SEIKY_KEI_NO, seikyKeiNo);
		inCBSMsg.setPrivate(CH0051ETMsg.SEIKY_YM, seikyYm);
		inCBSMsg.setPrivate(CH0011ETMsg.SAIKEN_YM, seikyYm);

		// スケジュール定義取得（料金計算日）
		CAANMsg msgCH0501 = new CAANMsg(KK0501ETMsg.class.getName());
		msgCH0501 = JCHModelCommon.getEventYmd(inCBSMsg, seikyYm, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);

		// 請求契約取得（料金計算日）
		CAANMsg msgKK0491 = new CAANMsg(KK0491ETMsg.class.getName());
		msgKK0491 = new CAANMsg(KK0491ETMsg.class.getName());
		msgKK0491 = JCHModelCommon.getSeikyKeiCurrent(inCBSMsg, seikyKeiNo, msgCH0501.getString(CH0501ETMsg.EVENT_YMD));

		inCBSMsg.setPrivate(CH0051ETMsg.KEI_SEIKY_WAY_CD, msgKK0491.getString(KK0491ETMsg.SEIKY_WAY_CD));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_AD_CD, msgKK0491.getString(KK0491ETMsg.SOHUS_AD_CD));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_PCD, msgKK0491.getString(KK0491ETMsg.SOHUS_PCD));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_STATE_NM, msgKK0491.getString(KK0491ETMsg.SOHUS_STATE_NM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_CITY_NM, msgKK0491.getString(KK0491ETMsg.SOHUS_CITY_NM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_OAZTSU_NM, msgKK0491.getString(KK0491ETMsg.SOHUS_OAZTSU_NM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_AZCHO_NM, msgKK0491.getString(KK0491ETMsg.SOHUS_AZCHO_NM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_AD_BNCHIGO, msgKK0491.getString(KK0491ETMsg.SOHUS_BNCHIGO));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_ADRTTM, msgKK0491.getString(KK0491ETMsg.SOHUS_ADRTTM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_ADRRM, msgKK0491.getString(KK0491ETMsg.SOHUS_ADRRM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_TELNO, msgKK0491.getString(KK0491ETMsg.SOHUS_TELNO));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_NM, msgKK0491.getString(KK0491ETMsg.SOHUS_NM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_BKM, msgKK0491.getString(KK0491ETMsg.SOHUS_BKM));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_TNTSHA_NM, msgKK0491.getString(KK0491ETMsg.SOHUS_TNTSHA_NM));
		inCBSMsg.setPrivate(CH0051ETMsg.SHS_HOJIN_SBT_CD, msgKK0491.getString(KK0491ETMsg.SHS_HOJIN_SBT_CD));
		inCBSMsg.setPrivate(CH0051ETMsg.SHS_HOJIN_ZENGO_SHITEI_CD, msgKK0491.getString(KK0491ETMsg.SHS_HOJIN_ZENGO_SHITEI_CD));
		inCBSMsg.setPrivate(CH0051ETMsg.SHS_KANA, msgKK0491.getString(KK0491ETMsg.SHS_KANA));
		inCBSMsg.setPrivate(CH0051ETMsg.SOHUS_MLAD, msgKK0491.getString(KK0491ETMsg.SOHUS_MLAD));
		inCBSMsg.setPrivate(CH0051ETMsg.NEXT_SEIKY_WAY_DIV, msgKK0491.getString(KK0491ETMsg.NEXT_SEIKY_WAY_DIV));

		// 口座・クレジットカード取得
		CAANMsg msgKK0501 = new CAANMsg(KK0501ETMsg.class.getName());
		CAANMsg msgKK0521 = new CAANMsg(KK0521ETMsg.class.getName());

		String kozaStat = JACStrConst.KARA_MOJI;
		String crecaStat = JACStrConst.KARA_MOJI;
		String crecaMkYm = JACStrConst.KARA_MOJI;

		if (!JCHCommonFormatUtil.isNull(msgKK0491.getObject(KK0491ETMsg.SEIKY_WAY_NO_KOZA)))
		{
			// 口座取得
			msgKK0501 = JCHModelCommon.getKoza(inCBSMsg, inContext, msgKK0491.getString(KK0491ETMsg.SEIKY_WAY_NO_KOZA));
			if (msgKK0501 != null)
			{
				kozaStat = msgKK0501.getString(KK0501ETMsg.KOZA_STAT);
			}
		}
		else if  (!JCHCommonFormatUtil.isNull(msgKK0491.getObject(KK0491ETMsg.SEIKY_WAY_NO_CRECARD)))
		{
			// クレジットカード取得
			msgKK0521 = JCHModelCommon.getCreCard(inCBSMsg, inContext, msgKK0491.getString(KK0491ETMsg.SEIKY_WAY_NO_CRECARD));
			if (msgKK0521 != null)
			{
				crecaStat = msgKK0521.getString(KK0521ETMsg.CRECARD_STAT);
				crecaMkYm = msgKK0521.getString(KK0521ETMsg.CRECA_MK_YM);
			}
		}

		// 請求抑止取得
		CAANMsg msgKK0541 = new CAANMsg(KK0501ETMsg.class.getName());
		msgKK0541 = JCHModelCommon.getSeikyYoksi(inCBSMsg, inContext, seikyKeiNo, JACStrConst.SEIKY_YOKSI_CD_KYOSEI_MDGC);

		String seikyYoksiFlg = JACStrConst.KARA_MOJI;
		if (msgKK0541 != null)
		{
			seikyYoksiFlg = msgKK0541.getString(KK0541ETMsg.SEIKY_YOKSI_FLG);
		}

		// 請求方法コード判定
		String seikyWayCd = JCHCommonFormatUtil.seikyWayJudge(msgKK0491.getString(KK0491ETMsg.SEIKY_WAY_CD)
															, kozaStat
															, crecaStat
															, crecaMkYm
															, seikyYm
															, msgKK0491.getString(KK0491ETMsg.SEIKY_WAY_APLY_ADJ_YMD));

		String ret[] = JCHCommonFormatUtil.seikyWayJudge(seikyWayCd
													   , seikyYoksiFlg
													   , msgKK0491.getString(KK0491ETMsg.KYOSEI_MADOGUCHI_FLG));

		// 判定後請求方法コード
		String judgeSeikyWayCd = ret[0];
		inCBSMsg.setPrivate(CH0051ETMsg.SEIKY_WAY_CD, judgeSeikyWayCd);
		if(JACStrConst.SEIKY_KHRI.equals(judgeSeikyWayCd) || JACStrConst.SEIKY_YUFUIRI.equals(judgeSeikyWayCd))
		{
			// 判定後請求方法コード="2"（口振）または"3"（郵振）の場合
			if (msgKK0501 != null)
			{
				inCBSMsg.setPrivate(CH0051ETMsg.BANK_CD, msgKK0501.getString(KK0501ETMsg.BANK_CD));
				inCBSMsg.setPrivate(CH0051ETMsg.BANK_SHITEN_CD, msgKK0501.getString(KK0501ETMsg.BANK_SHITEN_CD));
				inCBSMsg.setPrivate(CH0051ETMsg.YOKIN_SHUMOKU_CD, msgKK0501.getString(KK0501ETMsg.YOKIN_SHUMOKU_CD));
				inCBSMsg.setPrivate(CH0051ETMsg.KOZA_NO, msgKK0501.getString(KK0501ETMsg.KOZA_NO));
				inCBSMsg.setPrivate(CH0051ETMsg.NEW_CD, msgKK0501.getString(KK0501ETMsg.NEW_CD));
				inCBSMsg.setPrivate(CH0051ETMsg.TSUCHO_SYMBOL, msgKK0501.getString(KK0501ETMsg.TSUCHO_SYMBOL));
				inCBSMsg.setPrivate(CH0051ETMsg.TSUCHO_NO, msgKK0501.getString(KK0501ETMsg.TSUCHO_NO));
				inCBSMsg.setPrivate(CH0051ETMsg.KOZA_MEIGIN_KANA, msgKK0501.getString(KK0501ETMsg.KOZA_MEIGIN_KANA));
			}
		}
		else if(JACStrConst.SEIKY_CREDIT.equals(judgeSeikyWayCd))
		{
			// 判定後請求方法コード="4"（クレジット）の場合
			if (msgKK0521 != null)
			{
				inCBSMsg.setPrivate(CH0051ETMsg.CRECARD_COMP_CD, msgKK0521.getString(KK0521ETMsg.CRECARD_COMP_CD));
				inCBSMsg.setPrivate(CH0051ETMsg.CRECARD_NM_KANA, msgKK0521.getString(KK0521ETMsg.CRECARD_NM_KANA));
				inCBSMsg.setPrivate(CH0051ETMsg.CRECARD_NM_ROMAJI, msgKK0521.getString(KK0521ETMsg.CRECARD_NM_ROMAJI));
				inCBSMsg.setPrivate(CH0051ETMsg.CRECARD_NO, msgKK0521.getString(KK0521ETMsg.CRECARD_NO));
				inCBSMsg.setPrivate(CH0051ETMsg.CRECARD_YK_KIGEN, msgKK0521.getString(KK0521ETMsg.CRECARD_YK_KIGEN));
				inCBSMsg.setPrivate(CH0051ETMsg.CREDIT_KOKAN_CD, msgKK0521.getString(KK0521ETMsg.CREDIT_KOKAN_CD));
				// v24.00.00 MOD START
				inCBSMsg.setPrivate(CH0051ETMsg.SHIKOSAKI_COMP_CD, msgKK0521.getString(KK0521ETMsg.SHIKOSAKI_COMP_CD));
				inCBSMsg.setPrivate(CH0051ETMsg.CRECARD_NO_AZKRI_ID, msgKK0521.getString(KK0521ETMsg.CRECARD_NO_AZKRI_ID));
				// v24.00.00 MOD END
			}
		}

		// 抑止情報作成判定フラグ
		String yoksiInfoAddJudgeFlg = ret[1];
		if (JACStrConst.CTL_VALUE_TRUE.equals(yoksiInfoAddJudgeFlg))
		{
			inCBSMsg.setPrivate(CH0051ETMsg.KYOSEI_MADOGUCHI_FLG, JACStrConst.KYOSEI_MDGC_YOKSI_FLG_TRGT_GAI);
		}
		else
		{
			inCBSMsg.setPrivate(CH0051ETMsg.KYOSEI_MADOGUCHI_FLG, msgKK0491.getString(KK0491ETMsg.KYOSEI_MADOGUCHI_FLG));
		}

		// 請求契約取得（利用終了日）
		String useYmdArray[] = JCHModelCommon.getUseYmd(inCBSMsg, "2", seikyYm);
		msgKK0491 = new CAANMsg(KK0491ETMsg.class.getName());
		msgKK0491 = JCHModelCommon.getSeikyKeiCurrent(inCBSMsg, seikyKeiNo, useYmdArray[1]);

		String seikyusHakkoYh = JACStrConst.KARA_MOJI;
		if (msgKK0491 != null)
		{
			seikyusHakkoYh = msgKK0491.getString(KK0491ETMsg.SEIKYUS_HAKKO_YH);
		}
		
		// OM-2017-0000509 2017/07/28 ADD START
		// 請求書発行要否（利用終了日）が取得できない場合、運用日時点の請求書発行要否を取得し設定
		if (JCHCommonFormatUtil.isNull(seikyusHakkoYh))
		{
			// 請求契約取得（運用日）
			msgKK0491 = new CAANMsg(KK0491ETMsg.class.getName());
			msgKK0491 = JCHModelCommon.getSeikyKeiCurrent(inCBSMsg, seikyKeiNo, JPCModelCommon.getOpeDate(inCBSMsg, inContext, null));
			if (msgKK0491 != null)
			{
				seikyusHakkoYh = msgKK0491.getString(KK0491ETMsg.SEIKYUS_HAKKO_YH);
			}
		}
		// OM-2017-0000509 2017/07/28 ADD END
		
		inCBSMsg.setPrivate(CH0051ETMsg.SEIKYUS_HAKKO_YH, seikyusHakkoYh);

		// スケジュール定義取得（支払期限日）
		msgCH0501 = new CAANMsg(KK0501ETMsg.class.getName());
		msgCH0501 = JCHModelCommon.getEventYmd(inCBSMsg, seikyYm, JACStrConst.EVENT_CD_KOUZA_PAY_KIGEN_YMD);
		inCBSMsg.setPrivate(CH0051ETMsg.PAY_KIGEN_YMD, msgCH0501.getString(CH0501ETMsg.EVENT_YMD));

		CAANMsg[] msgList = inCBSMsg.getCAANMsgList(ECH0101D011CBSMsg.ECH0101D011CBSMSG7LIST);

		// 社内使用識別フラグ
		if(JACStrConst.USE_KEI_DIV_JSH.equals(msgList[0].getString(ECH0101D011CBSMsg7List.KEISHA_TYPE_CD)))
		{
			// 契約者タイプコード="4"（自社利用）の場合
			inCBSMsg.setPrivate(CH0051ETMsg.SHANAIUSE_SKBT_FLG, "1");
		}
		else
		{
			inCBSMsg.setPrivate(CH0051ETMsg.SHANAIUSE_SKBT_FLG, "0");
		}
		
		inCBSMsg.setPrivate(CH0051ETMsg.TOKUSOKU_NO, msgList[0].getString(ECH0101D011CBSMsg7List.TOKUSOKU_NO));
		inCBSMsg.setPrivate(CH0051ETMsg.SKHK_SVKEI_STAT_CD, msgList[0].getString(ECH0101D011CBSMsg7List.SKHK_SVKEI_STAT_CD));
		inCBSMsg.setPrivate(CH0051ETMsg.SKHK_SVKEI_DLRE_SKBT_CD, msgList[0].getString(ECH0101D011CBSMsg7List.SKHK_SVKEI_DLRE_SKBT_CD));
	}
}
