/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKAtchakuYoksiChk
*	ソースファイル名	：JBSbatKKAtchakuYoksiChk.java
*	作成者				：FJ)藤本
*	作成日				：2017年09月02日
*＜機能概要＞
*　圧着ハガキ抑止対象チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v33.00.00	2017/09/02	FJ)藤本		【ANK-3233-00-00】(契アシRDSツール改善）圧着請求書拒否抽出
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCbatDenshiFileUtil;
import eo.business.common.JKKBatConst;
import eo.business.common.JKKBatOutputUtil;
import eo.business.util.file.JBSbatKKIFM741;
import eo.business.util.file.JBSbatKKIFM742;
import eo.business.util.file.JBSbatKKIFM743;
import eo.business.util.table.JBSbatCR_T_QUE_BOX;
import eo.business.util.table.JBSbatCR_T_TAIOKRK_DTL;
import eo.business.util.table.JBSbatKK_T_KAKINS;
import eo.business.util.table.JBSbatKK_T_SEIKY_YOKSI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.log.JBSbatLogPrintControl;
import eo.framework.util.JBSbatDateUtil;

/**
* 圧着ハガキ抑止対象チェック部品です。 <p>
*<BR>
* @author FJ
*/
public class JBSbatKKAtchakuYoksiChk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";

	/** テーブル(請求抑止)*/
	private static final String D_TBL_NAME_KK_T_SEIKY_YOKSI = "KK_T_SEIKY_YOKSI";

	/** テーブル(キューBOX)*/
	private static final String D_TBL_NAME_CR_T_QUE_BOX = "CR_T_QUE_BOX";

	/** テーブル(対応記録明細)*/
	private static final String D_TBL_NAME_CR_T_TAIOKRK_DTL = "CR_T_TAIOKRK_DTL";

	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";

	/** SQL定義キー(KK_SELECT_044)*/
	private static final String KK_T_KAKINS_KK_SELECT_044 = "KK_SELECT_044";

	/** SQL定義キー(KK_SELECT_001)*/
	private static final String CR_T_TAIOKRK_DTL_KK_SELECT_001 = "KK_SELECT_001";

	/** SQL定義キー(KK_INSERT_002)*/
	private static final String ZM_T_DL_FILE_KANRI_KK_INSERT_002 = "KK_INSERT_002";

	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;

	/** テーブルアクセスクラス(請求抑止)*/
	private JBSbatSQLAccess db_KK_T_SEIKY_YOKSI = null;

	/** テーブルアクセスクラス(キューBOX)*/
	private JBSbatSQLAccess db_CR_T_QUE_BOX = null;

	/** テーブルアクセスクラス(対応記録明細)*/
	private JBSbatSQLAccess db_CR_T_TAIOKRK_DTL = null;

	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 電子ファイル管理：ファイルコード */
	private static final String EFILE_KANRI_FILE_CD_DEFAULT = "0000";

	/** 圧着ハガキ抑止チェック結果ファイルの処理管理番号 */
	private static final String TRN_KANRI_NO_ATCHAKU = "000000000167";

	/** ダウンロードファイル名 */
	private static final String DL_FILE_NM = "圧着ハガキ抑止チェック結果_%s.csv";

	/** ダウンロード期間(月数)：3ヶ月 */
	private static final int DL_PRD_MONTH = 3;

	/** キューBOX番号：圧着請求書拒否 */
	private static final String QUE_BOX_NO_ATCHAKU_KYOHI = "0000012542";

	/** 抑止対象となるタイトルのキーワード */
	private static final String TITLE_KEYWORD = "圧着請求";

	/** 拒否理由の区切り文字：全角空白 */
	private static final String KYOHI_RSN_DELIMITER = "　";

	/** チェック結果：OK */
	private static final String CHK_RSLT_OK = "OK";

	/** チェック結果：NG */
	private static final String CHK_RSLT_NG = "NG";

	/** チェック結果メッセージ：キューBOXが圧着請求書拒否以外 */
	private static final String MSG_NOT_ATCHAKU_KYOHI_QUE = "キューBOX番号が圧着請求書拒否ではありません。";

	/** チェック結果メッセージ：タイトルにキーワードなし */
	private static final String MSG_NO_TITLE_KEYWORD = "タイトルに「圧着請求」が含まれていません。";

	/** チェック結果メッセージ：請求契約番号なし */
	private static final String MSG_NO_SEIKY_KEI_NO = "請求契約番号を取得できません。";

	/** チェック結果メッセージ：クローズ不可コードが設定あり */
	private static final String MSG_CLOSE_FAIL = "クローズ不可コードが設定されています。";

	/** チェック結果メッセージ：請求書ハガキ化抑止が登録済み */
	private static final String MSG_YOKSI_ZM = "請求書ハガキ化抑止が登録済みです。";

	/** 抑止処理区分：全ての登録処理を行う */
	private static final String YOKSI_TRAN_DIV_ALL = "1";

	/** 抑止処理区分：対応記録クローズ処理のみを行う */
	private static final String YOKSI_TRAN_DIV_CLOSE_ONLY = "2";

	/** 拒否理由の接頭辞 */
	private static final String PREFIX_KYOHI_RSN = "拒否理由→【";

	/** 拒否理由の接尾辞 */
	private static final String SUFFIX_KYOHI_RSN = "】";

	/** 圧着ハガキ抑止対象チェック結果ファイルの出力先ディレクトリ */
	private String chkRsltFileDir = null;

	/** 圧着ハガキ抑止対象チェック結果ファイルのファイルID */
	private String chkRsltFileId = null;

	/** 圧着ハガキ抑止対象チェック結果ファイルのファイル名 */
	private String chkRsltFileNm = null;

	/** チェック結果リスト */
	private List<JBSbatServiceInterfaceMap> chkRsltList = null;

	/**
	 * 初期処理
	 * @param commonItem バッチ共通パラメータ電文
	 * @throws Exception 例外が発生した場合
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		db_KK_T_SEIKY_YOKSI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_YOKSI);
		db_CR_T_QUE_BOX = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_QUE_BOX);
		db_CR_T_TAIOKRK_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CR_T_TAIOKRK_DTL);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// フリー項目を区切り文字で分割
		String[] freeItem = commonItem.getFreeItem().split(JKKBatConst.S_PARAM_DELIM);
		if (freeItem == null || freeItem.length < 2)
		{
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0130CE,
				new String[]{"圧着ハガキ抑止対象チェック結果ファイルの出力先ディレクトリ、ファイルID"});
			throw new JBSbatBusinessError(JPCBatchMessageConstant.EKKB0130CE);
		}

		chkRsltFileDir = freeItem[0];
		chkRsltFileId = freeItem[1];
		chkRsltFileNm = chkRsltFileId + "001.csv";

		// チェック結果リストを生成
		chkRsltList = new ArrayList<JBSbatServiceInterfaceMap>();
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception 例外が発生した場合
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文を生成
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		// 圧着ハガキ抑止対象チェック
		JBSbatServiceInterfaceMap chkRsltMap = chkAtchakuYoksi(inMap);

		// 圧着ハガキ抑止対象ファイル出力
		writeYoksiFile(chkRsltMap, outputBean);

		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception 例外が発生した場合
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		try
		{
			// 圧着ハガキ抑止対象チェック結果ファイル出力
			writeChkRsltFile() ;
	
			// 電子ファイル管理・ダウンロードファイル管理登録
			addEfileKanriDlFileKanri(chkRsltList.size(), EFILE_KANRI_FILE_CD_DEFAULT,
					JBSbatDateUtil.adjustMonth(super.opeDate, DL_PRD_MONTH),
					String.format(DL_FILE_NM, JBSbatDateUtil.getSystemDateTimeStamp()));
		}
		finally
		{
			/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
			// DBアクセスクラスをクローズします
			db_KK_T_KAKINS.close();
			db_KK_T_SEIKY_YOKSI.close();
			db_CR_T_QUE_BOX.close();
			db_CR_T_TAIOKRK_DTL.close();
			db_ZM_T_DL_FILE_KANRI.close();
			/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		}
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 圧着ハガキ抑止対象チェックを行い、チェック結果リストにチェック結果情報を追加します。
	 * <br>
	 * @param inMap 入力電文
	 * @return チェック結果情報
	 * @throws Exception 例外が発生した場合
	 */
	private JBSbatServiceInterfaceMap chkAtchakuYoksi(JBSbatServiceInterfaceMap inMap)
	throws Exception
	{
		// チェック結果情報
		JBSbatServiceInterfaceMap chkRsltMap = new JBSbatServiceInterfaceMap();

		// 請求契約番号を取得
		String seikyKeiNo = getSeikyKeiNo(inMap);

		// チェック結果：OK(デフォルト値)
		chkRsltMap.setString(JBSbatKKIFM742.CHK_RSLT, CHK_RSLT_OK);
		// 備考：空(デフォルト値)
		chkRsltMap.setString(JBSbatKKIFM742.BIKO, "");
		// 対応記録番号
		chkRsltMap.setString(JBSbatKKIFM742.TAIO_KIROK_NO, inMap.getString(JBSbatKKIFM741.TAIO_KIROK_NO));
		// サービス契約番号
		chkRsltMap.setString(JBSbatKKIFM742.SVC_KEI_NO, inMap.getString(JBSbatKKIFM741.SVC_KEI_NO));
		// 請求契約番号
		chkRsltMap.setString(JBSbatKKIFM742.SEIKY_KEI_NO, seikyKeiNo);
		// 受付年月日時分秒
		chkRsltMap.setString(JBSbatKKIFM742.UK_DTM, inMap.getString(JBSbatKKIFM741.UK_DTM));
		// タイトル
		chkRsltMap.setString(JBSbatKKIFM742.TITLE, inMap.getString(JBSbatKKIFM741.TITLE));
		// 拒否理由
		chkRsltMap.setString(JBSbatKKIFM742.KYOHI_RSN, getKyohiRsn(inMap));
		// キューBOX番号
		chkRsltMap.setString(JBSbatKKIFM742.QUE_BOX_NO, inMap.getString(JBSbatKKIFM741.QUE_BOX_NO));
		// キューBOX名
		chkRsltMap.setString(JBSbatKKIFM742.QUE_BOX_NM, getQueBoxNm(inMap));
		// チェック年月日
		chkRsltMap.setString(JBSbatKKIFM742.CHK_YMD, super.opeDate);
		// 抑止処理区分：「全ての登録処理を行う」(デフォルト値)
		chkRsltMap.setString(JBSbatKKIFM743.YOKSI_TRAN_DIV, YOKSI_TRAN_DIV_ALL);

		// チェック@
		// 入力ファイルの「キューBOX番号」が「圧着請求書拒否」以外の場合
		if (!QUE_BOX_NO_ATCHAKU_KYOHI.equals(inMap.getString(JBSbatKKIFM741.QUE_BOX_NO)))
		{
			// チェック結果：NG
			chkRsltMap.setString(JBSbatKKIFM742.CHK_RSLT, CHK_RSLT_NG);
			// 備考
			chkRsltMap.setString(JBSbatKKIFM742.BIKO, MSG_NOT_ATCHAKU_KYOHI_QUE);
		}
		// チェックA
		// 入力ファイルの「キューBOX番号」が「圧着請求書拒否」で、入力ファイルの「タイトル」に"圧着請求"が含まれていない場合
		else if (!inMap.getString(JBSbatKKIFM741.TITLE).contains(TITLE_KEYWORD))
		{
			// チェック結果：NG
			chkRsltMap.setString(JBSbatKKIFM742.CHK_RSLT, CHK_RSLT_NG);
			// 備考
			chkRsltMap.setString(JBSbatKKIFM742.BIKO, MSG_NO_TITLE_KEYWORD);
		}
		// チェックB
		// 入力ファイルの「サービス契約番号」から課金先の請求契約番号が取得できない場合
		else if (JKKStringUtil.isNullBlank(seikyKeiNo))
		{
			// チェック結果：NG
			chkRsltMap.setString(JBSbatKKIFM742.CHK_RSLT, CHK_RSLT_NG);
			// 備考
			chkRsltMap.setString(JBSbatKKIFM742.BIKO, MSG_NO_SEIKY_KEI_NO);
		}
		// チェックC
		// 入力ファイルの「クローズ不可コード」が"1"(不可能(対応記録))、または"2"(不可能(対応記録明細))の場合
		else if (JCRStrConst.CD_DIV_CLOSE_FAIL_CD_HUKANOU.equals(inMap.getString(JBSbatKKIFM741.CLOSE_FAIL_CD))
				|| JCRStrConst.CD_DIV_CLOSE_FAIL_CD_HUKANOU_DTL.equals(inMap.getString(JBSbatKKIFM741.CLOSE_FAIL_CD)))
		{
			// チェック結果：NG
			chkRsltMap.setString(JBSbatKKIFM742.CHK_RSLT, CHK_RSLT_NG);
			// 備考
			chkRsltMap.setString(JBSbatKKIFM742.BIKO, MSG_CLOSE_FAIL);
		}
		// チェックD
		// 入力ファイルの「請求契約番号」の請求書ハガキ化抑止が抑止済みの場合
		else if (isYoksiZm(seikyKeiNo))
		{
			// チェック結果：OK
			// 備考
			chkRsltMap.setString(JBSbatKKIFM742.BIKO, MSG_YOKSI_ZM);
			// 抑止処理区分：「対応記録クローズ処理のみを行う」
			chkRsltMap.setString(JBSbatKKIFM743.YOKSI_TRAN_DIV, YOKSI_TRAN_DIV_CLOSE_ONLY);
		}

		// チェック結果リストに追加
		chkRsltList.add(chkRsltMap);

		return chkRsltMap;
	}

	/**
	 * 圧着ハガキ抑止対象ファイルを出力します。
	 * <br>
	 * @param chkRsltMap チェック結果情報
	 * @param outputBean 入力情報
	 * @throws Exception 例外が発生した場合
	 */
	private void writeYoksiFile(JBSbatServiceInterfaceMap chkRsltMap, JBSbatOutputItem outputBean)
	throws Exception
	{
		// チェック結果OKの場合のみ出力する
		if (CHK_RSLT_OK.equals(chkRsltMap.getString(JBSbatKKIFM742.CHK_RSLT)))
		{
			chkRsltMap.setOutFlg(true);
			outputBean.addOutMapList(chkRsltMap);
		}
	}

	/**
	 * 圧着ハガキ抑止対象チェック結果ファイルを出力します。
	 * <br>
	 * @throws Exception ファイル出力に失敗した場合
	 */
	private void writeChkRsltFile()
	throws Exception
	{
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		// ヘッダー行
		JBSbatServiceInterfaceMap headerMap = new JBSbatServiceInterfaceMap();
		headerMap.setString(JBSbatKKIFM742.CHK_RSLT, "チェック結果");
		headerMap.setString(JBSbatKKIFM742.BIKO, "備考");
		headerMap.setString(JBSbatKKIFM742.TAIO_KIROK_NO, "問合せID");
		headerMap.setString(JBSbatKKIFM742.SVC_KEI_NO, "サービス契約番号");
		headerMap.setString(JBSbatKKIFM742.SEIKY_KEI_NO, "請求契約番号");
		headerMap.setString(JBSbatKKIFM742.UK_DTM, "受付年月日時分秒");
		headerMap.setString(JBSbatKKIFM742.TITLE, "タイトル");
		headerMap.setString(JBSbatKKIFM742.KYOHI_RSN, "拒否理由");
		headerMap.setString(JBSbatKKIFM742.QUE_BOX_NO, "キューBOX番号");
		headerMap.setString(JBSbatKKIFM742.QUE_BOX_NM, "キューBOX名");
		headerMap.setString(JBSbatKKIFM742.CHK_YMD, "チェック年月日");
		headerMap.setOutFlg(true);
		outputBean.addOutMapList(headerMap);

		// ソート
		sortChkRsltList();

		for (JBSbatServiceInterfaceMap outMap : chkRsltList)
		{
			outMap.setOutFlg(true);
			outputBean.addOutMapList(outMap);
		}

		// ファイル出力
		JKKBatOutputUtil.editOutFile(super.commonItem, outputBean, chkRsltFileId, chkRsltFileDir, chkRsltFileNm);
	}

	
	/**
	 * チェック結果リストを次の順でソートします。<br>
	 * 1．チェック結果("NG"を前) 2．備考(昇順) 3．問合せID(昇順)
	 */
	private void sortChkRsltList()
	{
		if (chkRsltList == null || chkRsltList.isEmpty())
		{
			return;
		}

		Collections.sort(chkRsltList, new Comparator<JBSbatServiceInterfaceMap>()
		{

			/**
			 * <p>
			 * ソート用。
			 * </p>
			 * @param map1 入力1
			 * @param map2 入力2
			 * @return int compareTo結果
			 */
			@Override
			public int compare(JBSbatServiceInterfaceMap map1, JBSbatServiceInterfaceMap map2) 
			{
				try
				{
					String chkRslt1 = map1.getString(JBSbatKKIFM742.CHK_RSLT);
					String chkRslt2 = map2.getString(JBSbatKKIFM742.CHK_RSLT);
					if (!chkRslt1.equals(chkRslt2))
					{
						return chkRslt1.compareTo(chkRslt2);
					}
					String biko1 = map1.getString(JBSbatKKIFM742.BIKO);
					String biko2 = map2.getString(JBSbatKKIFM742.BIKO);
					if (!biko1.equals(biko2))
					{
						return biko1.compareTo(biko2);
					}
					String taioKirokNo1 = map1.getString(JBSbatKKIFM742.TAIO_KIROK_NO);
					String taioKirokNo2 = map2.getString(JBSbatKKIFM742.TAIO_KIROK_NO);
					if (!taioKirokNo1.equals(taioKirokNo2))
					{
						return taioKirokNo1.compareTo(taioKirokNo2);
					}
				}
				catch (Exception e)
				{
					// 発生しえないため何もしない
				}

				return 0;
			}
		});

		return;
	}

	/**
	 * 請求契約番号を取得します。
	 * <br>
	 * @param inMap 入力電文
	 * @return 請求契約番号
	 * @throws Exception DBアクセス処理で例外が発生した場合
	 */
	private String getSeikyKeiNo(JBSbatServiceInterfaceMap inMap)
	throws Exception
	{
		String seikyKeiNo = "";

		// サービス契約番号を取得
		String svcKeiNo = inMap.getString(JBSbatKKIFM741.SVC_KEI_NO);
		if (!JKKStringUtil.isNullBlank(svcKeiNo))
		{
			// 課金先を検索
			executeKK_T_KAKINS_KK_SELECT_044(new String[]{
					svcKeiNo,
					super.opeDate,
					super.opeDate
			});
	
			JBSbatCommonDBInterface resultMap = db_KK_T_KAKINS.selectNext();
			if (resultMap != null)
			{
				seikyKeiNo = resultMap.getString(JBSbatKK_T_KAKINS.SEIKY_KEI_NO);
			}
		}

		return seikyKeiNo;
	}

	/**
	 * 拒否理由を取得します。
	 * <br>
	 * @param inMap 入力電文
	 * @return 拒否理由
	 * @throws Exception DBアクセス処理で例外が発生した場合
	 */
	private String getKyohiRsn(JBSbatServiceInterfaceMap inMap)
	throws Exception
	{
		StringBuilder kyohiRsn = new StringBuilder();

		// 対応記録明細を検索(更新年月日時分秒の降順)
		executeCR_T_TAIOKRK_DTL_KK_SELECT_001(new String[]{
				inMap.getString(JBSbatKKIFM741.TAIO_KIROK_NO)
		});

		JBSbatCommonDBInterface resultMap = null;
		while ((resultMap = db_CR_T_TAIOKRK_DTL.selectNext()) != null)
		{
			List<String> kyohiRsnList = new ArrayList<String>();
			// 問合せ内容
			kyohiRsnList.add(cutKyohiRsn(resultMap.getString(JBSbatCR_T_TAIOKRK_DTL.TOIAWASE_NAIYO)));
			// 回答内容
			kyohiRsnList.add(cutKyohiRsn(resultMap.getString(JBSbatCR_T_TAIOKRK_DTL.ANS_NAIYO)));
			// メモ内容
			kyohiRsnList.add(cutKyohiRsn(resultMap.getString(JBSbatCR_T_TAIOKRK_DTL.MEMO_NAIYO)));

			// それぞれの拒否理由を連結する
			for (int i = 0; i < kyohiRsnList.size(); i++)
			{
				if (!JKKStringUtil.isNullBlank(kyohiRsnList.get(i)))
				{
					if (!JKKStringUtil.isNullBlank(kyohiRsn.toString()))
					{
						kyohiRsn.append(KYOHI_RSN_DELIMITER);
					}
					kyohiRsn.append(kyohiRsnList.get(i));
				}
			}

			// 拒否理由を取得できた場合
			if (!JKKStringUtil.isNullBlank(kyohiRsn.toString()))
			{
				// 最新の拒否理由となるので終了
				break;
			}
		}

		return kyohiRsn.toString();
	}

	/**
	 * 拒否理由部分を切り出して返します。
	 * <br>
	 * @param contents 内容
	 * @return 拒否理由
	 */
	private String cutKyohiRsn(String contents)
	{
		// 拒否理由
		String kyohiRsn = "";
		if (!JKKStringUtil.isNullBlank(contents))
		{
			// 接頭辞で始まる文字列を取得 ※改行、または行末まで取得
			String regex = PREFIX_KYOHI_RSN + ".*";
			Matcher matcher = Pattern.compile(regex).matcher(contents);
			if (matcher.find())
			{
				// 接頭辞と接尾辞以降を削除
				kyohiRsn = matcher.group().replaceFirst(PREFIX_KYOHI_RSN, "")
										.replaceFirst(SUFFIX_KYOHI_RSN + ".*", "");
			}
		}

		return kyohiRsn;
	}

	/**
	 * キューBOX名を取得します。
	 * <br>
	 * @param inMap 入力電文
	 * @return キューBOX名
	 * @throws Exception DBアクセス処理で例外が発生した場合
	 */
	private String getQueBoxNm(JBSbatServiceInterfaceMap inMap)
	throws Exception
	{
		String queBoxNm = "";

		// キューBOX番号を取得
		String queBoxNo = inMap.getString(JBSbatKKIFM741.QUE_BOX_NO);
		if (!JKKStringUtil.isNullBlank(queBoxNo))
		{
			// キューBOXを検索
			JBSbatCommonDBInterface resultMap = executeCR_T_QUE_BOX_PKSELECT(new String[]{
					inMap.getString(JBSbatKKIFM741.QUE_BOX_NO)
			});
	
			if (resultMap != null)
			{
				queBoxNm = resultMap.getString(JBSbatCR_T_QUE_BOX.QUE_BOX_NM);
			}
		}

		return queBoxNm;
	}

	/**
	 * 請求書ハガキ化抑止が抑止済みかどうかを返します。
	 * <br>
	 * @param seikyKeiNo 請求契約番号
	 * @return 抑止済みの場合はtrue、それ以外はfalse
	 * @throws Exception DBアクセス処理で例外が発生した場合
	 */
	private boolean isYoksiZm(String seikyKeiNo)
	throws Exception
	{
		// 請求抑止を検索
		JBSbatCommonDBInterface resultMap = executeKK_T_SEIKY_YOKSI_PKSELECT(new String[]{
				seikyKeiNo,
				JACStrConst.SEIKY_YOKSI_CD_SKS_HAGAKI
		});

		if (resultMap != null)
		{
			// 請求抑止フラグが「抑止あり」の場合
			if (JACStrConst.YOKSI_FLG_ARI.equals(resultMap.getString(JBSbatKK_T_SEIKY_YOKSI.SEIKY_YOKSI_FLG)))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * 電子ファイル管理・ダウンロードファイル管理テーブルに登録します。
	 * <br>
	 * @param dataCnt データ件数
	 * @param fileCd ファイルコード
	 * @param fileDelYmd ファイル削除日付
	 * @param dlFileNm ダウンロードファイル名
	 * @throws Exception 例外が発生した場合
	 */
	private void addEfileKanriDlFileKanri(int dataCnt, String fileCd, String fileDelYmd, String dlFileNm)
	throws Exception
	{
		// 電子ファイル登録
		String[] ret = JCCbatDenshiFileUtil.createDenshiFile(this.commonItem, fileCd, chkRsltFileDir + chkRsltFileNm, fileDelYmd);

		super.logPrint.printDebugLog(JBSbatLogPrintControl.getMessage(JPCBatchMessageConstant.EKKB0110AI, new String[]{ret[0], ret[1]}));

		// ダウンロードファイル登録
		String[] setParam = new String[]{
				TRN_KANRI_NO_ATCHAKU,				// 処理管理番号
				dlFileNm,							// ダウンロードファイル名
				String.valueOf(dataCnt),			// データ件数
				ret[0],								// 電子ファイル管理番号
				ret[1]								// 世代登録年月日時分秒
		};
		executeZM_T_DL_FILE_KANRI_KK_INSERT_002(setParam);
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_044)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 *		 	運用日
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KAKINS_KK_SELECT_044(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_KK_SELECT_044);
	}

	/**
	 * SQLKEY(KK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	対応記録番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCR_T_TAIOKRK_DTL_KK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_CR_T_TAIOKRK_DTL.selectBySqlDefine(paramList, CR_T_TAIOKRK_DTL_KK_SELECT_001);
	}

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	QUE_BOX_NO
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeCR_T_QUE_BOX_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("QUE_BOX_NO", whereParam[0]);

		// DBアクセスを実行します
		return db_CR_T_QUE_BOX.selectByPrimaryKeys(whereMap);
	}

	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SEIKY_KEI_NO
	 *		 	SEIKY_YOKSI_CD
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_SEIKY_YOKSI_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SEIKY_KEI_NO", whereParam[0]);
		whereMap.setValue("SEIKY_YOKSI_CD", whereParam[1]);

		// DBアクセスを実行します
		return db_KK_T_SEIKY_YOKSI.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(KK_INSERT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	処理管理番号
	 *		 	ファイル名
	 *		 	データ件数
	 *		 	電子ファイル管理番号
	 *		 	世代登録年月日時分秒
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_DL_FILE_KANRI_KK_INSERT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_ZM_T_DL_FILE_KANRI.executeBySqlDefine(paramList, ZM_T_DL_FILE_KANRI_KK_INSERT_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
