/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPrcTaiKrkIktAdd
*	ソースファイル名	：JBSbatCHPrcTaiKrkIktAdd.java
*	作成者				：富士通　
*	作成日				：2013年12月17日
*＜機能概要＞
*　料金対応記録一括登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v6.00.00	2013/12/20   FJ) 早崎	【ANK-1749-00-00】新規作成
*	v8.00.00	2014/04/24   FJ) 狭間	【OM-2014-0001572】SORT処理（EO6290111D0.sh）の削除に伴い、キーブレイクと重複チェックを削除
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCHbatPrcTaiokrkAdd;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatCheckUtil;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatCHIFM096;
import eo.business.util.file.JBSbatCHIFM118;
import eo.business.util.file.JBSbatCHIFM226;
import eo.business.util.file.JBSbatCHIFM227;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.common.constant.JACStrConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPrcTaiKrkIktAdd extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(請求契約)*/
	private static final String D_TBL_NAME_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";

	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";

	/** テーブル(ディレイド処理依頼)*/
	private static final String D_TBL_NAME_CC_T_DLYD_TRN_REQ = "CC_T_DLYD_TRN_REQ";

	/** SQL定義キー(AC_SELECT_002)*/
	private static final String KK_T_SEIKY_KEI_AC_SELECT_002 = "AC_SELECT_002";

	/** SQL定義キー(CH_SELECT_005)*/
	private static final String KK_T_KAKINS_CH_SELECT_005 = "CH_SELECT_005";

	/** テーブルアクセスクラス(請求契約)*/
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;

	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;

	/** テーブルアクセスクラス(ディレイド処理依頼)*/
	private JBSbatSQLAccess db_CC_T_DLYD_TRN_REQ = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 料金対応記録登録部品 */
	private JCHbatPrcTaiokrkAdd jCHbatPrcTaiokrkAdd = null;

	/** エラーマップ */
	private HashMap<String, String> errMap = null;
	
	/** ユーザーID */
	private String userId = null;
	
	/** エンコード */
	private String encode = null;

	/** エラーコード */
	private String tmpErrCd = null;

	/** ヘッダ部出力済みフラグ */
	private boolean headInfoOutFlg = false;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_KEI);
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		db_CC_T_DLYD_TRN_REQ = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_DLYD_TRN_REQ);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][onlineOpeDate=" + super.onlineOpeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");

		// 業務パラメータ値を取得する
		getWorkParaValue();

		// フリー項目を取得
		String[] freeItems = super.freeItem.split(JACStrConst.FREE_DIV);

		// ユーザID取得
		this.getUserId(freeItems[0]);
		
		// エンコード取得
		this.encode = freeItems[1];
		
		// 料金対応記録登録部品の初期処理
		jCHbatPrcTaiokrkAdd = new JCHbatPrcTaiokrkAdd(super.commonItem, userId);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務パラメータ管理及び、システムパラメータ管理から値を取得します。
	 * 
	 * @return int 未来指定上限月数
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getWorkParaValue() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getWorkParaValue]");
		
		// エラーマップ初期化
		this.errMap = new HashMap<String, String>();
		
		// 業務パラメータ取得
		JACbatParamUtil pu = new JACbatParamUtil(commonItem);
		try
		{
			// エラーマップに値を設定（キー：エラーコード、値：エラー内容）
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_0000, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_0000)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_H001, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_H001)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E001, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E001)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E002, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E002)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E003, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E003)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E004, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E004)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E005, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E005)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E006, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E006)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E007, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E007)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E008, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E008)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E009, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E009)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E010, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E010)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E011, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E011)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E012, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E012)));
			this.errMap.put(JACStrConst.WKPRA_CH_TAIOADD_MSG_E013, pu.getGyoumuParameter(makeWorkParaIDErr(JACStrConst.WKPRA_CH_TAIOADD_MSG_E013)));

			assert this.errMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getWorkParaValue][errMap=" + this.errMap.toString() + "]") : true;
			
		}
		finally
		{
			pu.close();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getWorkParaValue]");
	}
	
	/**
	 * エラー内容取得用業務パラメータIDを作成します。
	 * 
	 * @param errCd エラーコード
	 * @return String 業務パラメータID
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String makeWorkParaIDErr(String errCd) throws Exception
	{
		StringBuffer buf = new StringBuffer();
		
		buf.append(JACStrConst.SYS_CD_CH);
		buf.append(JACStrConst.UNDER_BAR);
		buf.append(JACStrConst.PRC_TOKRK_IKT_ADD_CH_TAIOADD);
		buf.append(JACStrConst.UNDER_BAR);
		buf.append(errCd);
		
		return buf.toString();
	}

	
	/**
	 * ユーザーIDを取得します。
	 * 
	 * @param dlydTrnReqNo ディレイド処理依頼番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getUserId(String dlydTrnReqNo) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getUserId]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getUserId]dlydTrnReqNo=" + dlydTrnReqNo + "]");
		
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		
		whereMap.setValue(dlydTrnReqNo);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getUserId][whereparam=" + whereMap.getList().toString() + "]");
		
		// SQL実行
		JBSbatCommonDBInterface dbMap = executeCC_T_DLYD_TRN_REQ_PKSELECT(whereMap.getList().toArray());
		
		this.userId = dbMap.getString(JBSbatCC_T_DLYD_TRN_REQ.ADD_OPEACNT);				// 登録オペレータアカウント
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getUserId]");
		
		return;
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;
		
		// トランファイル処理フラグを設定する
		this.setTranProcFlg(true);
		// マスタファイル処理フラグを設定する
		this.setMastProcFlg(true);
		
		// 入力情報のチェックを行う
		if(formatChk(mastMap)
						&& isSingleCheckCHIFM226_INF1(mastMap)
						&& isSingleKnrnChk(mastMap)
						&& isKnrnKmkChk(mastMap))
		{
			// 料金対応記録登録処理を行う
			prcTaiokrkAdd(mastMap);
		}
		else
		{
			// エラーファイル作成
			makeErrFile(outputInItem, tranMap);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 入力情報の形式チェックを行います。
	 * 
	 * @param mastMap 入力情報
	 * @return boolean チェック結果（true：正常、false：異常あり）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean formatChk(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][formatChk]");
		
		// csv形式チェック
		// 入力情報＝nullの場合
		if(mastMap.getMap().size() == 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][formatChk][入力情報＝null]");

			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_H001;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][formatChk]");
			return false;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][formatChk]");
		return true;
	}
	
	/**
	 *入力情報（料金対応記録一括登録指示ファイル）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-CHIFM226-INF1.SEIKY_KEI_NO			料金対応記録一括登録指示ファイル.請求契約番号
	 *			 TXT-CHIFM226-INF1.SEIKY_KEI_NO			料金対応記録一括登録指示ファイル.請求契約番号
	 *			 TXT-CHIFM226-INF1.SEIKY_KEI_NO			料金対応記録一括登録指示ファイル.請求契約番号
	 *			 TXT-CHIFM226-INF1.KIROK_TG_YM			料金対応記録一括登録指示ファイル.記録対象年月
	 *			 TXT-CHIFM226-INF1.KIROK_TG_YM			料金対応記録一括登録指示ファイル.記録対象年月
	 *			 TXT-CHIFM226-INF1.CUST_TOAK_DSP_FLG			料金対応記録一括登録指示ファイル.顧客対応履歴表示フラグ
	 *			 TXT-CHIFM226-INF1.TOIAWASE_TITLE			料金対応記録一括登録指示ファイル.問合せタイトル
	 *			 TXT-CHIFM226-INF1.TOIAWASE_TITLE			料金対応記録一括登録指示ファイル.問合せタイトル
	 *			 TXT-CHIFM226-INF1.KIJI			料金対応記録一括登録指示ファイル.記事
	 *			 TXT-CHIFM226-INF1.KIJI			料金対応記録一括登録指示ファイル.記事
	 *			 TXT-CHIFM226-INF1.KIJI			料金対応記録一括登録指示ファイル.記事
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 * @throws Exception 
	 */
	private boolean isSingleCheckCHIFM226_INF1(JBSbatServiceInterfaceMap rsMap) throws Exception
	{
		// 単項目チェックを行います
		String strValue = null;

		// 文字コード変換後対象項目値
		String enCodeStrValue = JACStrConst.KARA_MOJI;
		
		// 請求契約番号項目チェック
		strValue = (String)rsMap.get("SEIKY_KEI_NO");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][請求契約番号＝空文字]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E001;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}
		// 桁数チェック
		// 請求契約番号の桁数≠10の場合
		if(strValue.length() != 10)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][請求契約番号の桁数≠10]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E001;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}
		// 属性チェック
		// 請求契約番号の属性≠半角英数字１の場合
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][請求契約番号の属性≠半角英数字１]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E001;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}

		// 記録対象年月項目チェック
		strValue = (String)rsMap.get("KIROK_TG_YM");
		// 桁数チェック
		// 記録対象年月の桁数≠6の場合
		if(!strValue.equals(JACStrConst.KARA_MOJI) && strValue.length() != 6)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][記録対象年月の桁数≠6]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E005;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}
		// 属性チェック
		// 記録対象年月の属性≠年月１の場合
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"year_month1"}))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][記録対象年月の属性≠年月1]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E005;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}

		// 顧客対応履歴表示フラグ項目チェック
		strValue = (String)rsMap.get("CUST_TOAK_DSP_FLG");
		// 顧客対応履歴表示フラグ≠0かつ≠1の場合
		if(!JACStrConst.CUST_TOAK_DSP_FLG_DISP_ON.equals(strValue) && !JACStrConst.CUST_TOAK_DSP_FLG_DISP_OFF.equals(strValue))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][顧客対応履歴表示フラグ≠1 且つ ≠0]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E006;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}

		// 問合せタイトル項目チェック
		strValue = (String)rsMap.get("TOIAWASE_TITLE");
		// 桁数チェック
		// 問合せタイトル≠空文字　かつ　問合せタイトルのバイト数＞30の場合
		if(!strValue.equals(JACStrConst.KARA_MOJI) && JACbatRknBusinessUtil.getBytes(strValue, this.encode) > 30)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][問合せタイトル≠空文字　かつ　問合せタイトルのバイト数＞30]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E009;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;

		}
		// 属性チェック
		// 問合せタイトルの属性≠全角の場合
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"zenkaku"}))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][問合せタイトルの属性≠全角]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E010;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}
		// 問合せタイトルの文字コード≠MS932(SJIS)の場合
		enCodeStrValue = new String(strValue.getBytes(this.encode), this.encode);
		if(!strValue.equals(enCodeStrValue))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][問合せタイトルの文字コード≠MS932(SJIS)]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E010;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;

		}

		// 記事項目チェック
		strValue = (String)rsMap.get("KIJI");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][記事＝空文字]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E011;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}
		// 桁数チェック
		// 記事≠空文字　かつ　記事のバイト数＞200の場合
		if(!strValue.equals(JACStrConst.KARA_MOJI) && JACbatRknBusinessUtil.getBytes(strValue, this.encode) > 200)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][記事≠空文字　かつ　記事のバイト数＞200]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E012;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;

		}
		// 属性チェック
		// 記事の属性≠MIXの場合
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"mix"}))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][記事の属性≠MIX]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E013;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;
		}
		// 記事の文字コード≠MS932(SJIS)の場合
		enCodeStrValue = new String(strValue.getBytes(this.encode), this.encode);
		if(!strValue.equals(enCodeStrValue))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleCheckCHIFM226_INF1][記事の文字コード≠MS932(SJIS)]");
			
			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E013;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleCheckCHIFM226_INF1]");
			return false;

		}
		return true;
	}
	
	/**
	 * 単項目関連チェックを行います。
	 * 
	 * @param mastMap 入力情報
	 * @return boolean チェック結果（true：正常、false：異常あり）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean isSingleKnrnChk(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isSingleKnrnChk]");
		
		// 問合せタイトル入力値チェック
		// 顧客対応履歴表示フラグ=0(非表示) 且つ 問合せタイトル≠空の場合
		if(JACStrConst.CUST_TOAK_DSP_FLG_DISP_OFF.equals(mastMap.getString(JBSbatCHIFM226.CUST_TOAK_DSP_FLG))
						&& !JACStrConst.KARA_MOJI.equals(mastMap.getString(JBSbatCHIFM226.TOIAWASE_TITLE))
						&& null != mastMap.getString(JBSbatCHIFM226.TOIAWASE_TITLE))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleKnrnChk][顧客対応履歴表示フラグ=0(非表示) 且つ 問合せタイトル≠空]");

			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E007;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleKnrnChk]");
			return false;

		}

		// 問合せタイトル入力値チェック
		// 顧客対応履歴表示フラグ=1(表示) 且つ 問合せタイトル＝空の場合
		if(JACStrConst.CUST_TOAK_DSP_FLG_DISP_ON.equals(mastMap.getString(JBSbatCHIFM226.CUST_TOAK_DSP_FLG))
						&& (JACStrConst.KARA_MOJI.equals(mastMap.getString(JBSbatCHIFM226.TOIAWASE_TITLE))) || null == mastMap.getString(JBSbatCHIFM226.TOIAWASE_TITLE))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isSingleKnrnChk][顧客対応履歴表示フラグ=1(表示) 且つ 問合せタイトル＝空]");

			this.tmpErrCd = JACStrConst.WKPRA_CH_TAIOADD_MSG_E008;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleKnrnChk]");
			return false;

		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSingleKnrnChk]");
		return true;
	}

	/**
	 * 関連チェックを行います。
	 * 
	 * @param mastMap 入力情報
	 * @return boolean チェック結果（true：正常、false：異常あり）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean isKnrnKmkChk(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isKnrnKmkChk]");

		// 請求契約番号妥当性チェック
		// 請求契約番号が請求契約スキーマに未存在の場合
		if(!isSikyKeiNo(mastMap))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isKnrnKmkChk][請求契約番号が請求契約スキーマに未存在]");
		
			this.tmpErrCd = JACStrConst.ICJKN_IKT_ADD_E002;
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKnrnKmkChk]");
			return false;
		}
		
		// 請求契約番号妥当性チェック
		// 顧客対応履歴表示フラグ=1(表示) 且つ 請求契約番号が課金先スキーマに未存在の場合
		if(JACStrConst.CUST_TOAK_DSP_FLG_DISP_ON.equals(mastMap.getString(JBSbatCHIFM226.CUST_TOAK_DSP_FLG))
						&& !isKknsChk(mastMap))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isKnrnKmkChk][請求契約番号が課金先スキーマに未存在]");
		
			this.tmpErrCd = JACStrConst.ICJKN_IKT_ADD_E004;

			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKnrnKmkChk]");
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKnrnKmkChk]");
		return true;
	}
	
	/**
	 * 請求契約スキーマを入力情報の請求契約番号で検索し、取得の有無のチェックを行います。
	 * 
	 * @param mastMap 入力情報
	 * @return boolean 判定結果（true：あり、false：なし）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean isSikyKeiNo(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		
		whereMap.setValue(mastMap.getString(JBSbatCHIFM226.SEIKY_KEI_NO));		// 請求契約番号
		whereMap.setValue(super.onlineOpeDate);									// 予約適用年月日
		
		// SQL実行
		executeKK_T_SEIKY_KEI_AC_SELECT_002(whereMap.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_KK_T_SEIKY_KEI.selectNext();
		
		// 取得なしの場合
		if(dbMap == null)
		{
			return false;
		}
		
		return true;
	}

	/**
	 * 課金先スキーマを入力情報の請求契約番号で検索し、取得の有無のチェックを行います。
	 * 
	 * @param mastMap 入力情報
	 * @return boolean 判定結果（true：あり、false：なし）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean isKknsChk(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		
		whereMap.setValue(mastMap.getString(JBSbatCHIFM226.SEIKY_KEI_NO));		// 請求契約番号
		whereMap.setValue(super.onlineOpeDate);									// 適用開始終了年月日
		
		// SQL実行
		executeKK_T_KAKINS_CH_SELECT_005(whereMap.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_KK_T_KAKINS.selectNext();
		
		// 取得なしの場合
		if(dbMap == null)
		{
			return false;
		}
		
		return true;
	}
	

	/**
	 * 引数で渡されたリストを引数で渡された文字で囲み、
	 * その結果を返却します。
	 * 
	 * @param trgList 対象リスト
	 * @param leftMoji 左囲み文字
	 * @param rightMoji 右囲み文字
	 * @return resulaValue 編集後文字列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String quoteList(ArrayList<String> trgList, String leftMoji, String rightMoji) throws Exception
	{
		// 編集後文字列
		StringBuffer resulaValue = new StringBuffer();

		if (!trgList.isEmpty() && !leftMoji.isEmpty() && !rightMoji.isEmpty())
		{
			int size = trgList.size();

			StringBuffer buf = null;

			for (int i = 0; size > i; i++)
			{
				buf = new StringBuffer();

				buf.append(leftMoji);
				buf.append(trgList.get(i));
				buf.append(rightMoji);
				
				// 最終項目以外の場合
				if(size - 1 != i)
				{
					buf.append(JACStrConst.COMMA);
				}

				resulaValue.append(buf.toString());
			}
		}

		return resulaValue.toString();
	}

	/**
	 * エラーレコードのヘッダ部分を作成します。
	 * 
	 * @param  outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeHeadInfo(JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeHeadInfo]");
		
		JBSbatServiceInterfaceMap headInf = new JBSbatServiceInterfaceMap();
		
		headInf.set(JBSbatCHIFM227.IKT_ADD_ERR_CD,		"一括登録エラーコード");	// 一括エラーコード
		headInf.set(JBSbatCHIFM227.ERR_NAIYO,			"エラー内容");				// エラー内容
		
		// 出力内容を項目ごとにダブルクォーテーション（""）で囲む
		headInf.setMap(JCHbatSeikyKaknoBusinessUtil.quote(headInf.getMap(), JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE));

		// 項目名表示部分
		ArrayList<String> list = new ArrayList<String>();
		list.add("請求先番号");
		list.add("記録対象年月");
		list.add("顧客対応記録表示フラグ");
		list.add("問合わせタイトル");
		list.add("記事");
		
		// 項目ヘッダ部分各々をダブルクォーテーション（""）で囲む
		headInf.set(JBSbatCHIFM227.PRC_TOKRK_ADD_LIST,	quoteList(list, JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE)); 

		headInf.setOutFlg(true);
		outputInItem.addOutMapList(headInf);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeHeadInfo]");
		return;
	}
	
	/**
	 * エラーレコードを作成します。
	 * 
	 * @param outputInItem 出力情報
	 * @param tranMap 入力電文
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeErrFile(JBSbatOutputItem outputInItem, JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeErrFile]");

		if(!this.headInfoOutFlg)
		{
			makeHeadInfo(outputInItem);
			
			this.headInfoOutFlg = true;
		}

		JBSbatServiceInterfaceMap errInf = new JBSbatServiceInterfaceMap();
		
		errInf.set(JBSbatCHIFM227.IKT_ADD_ERR_CD,		this.tmpErrCd);						// 一括エラーコード
		errInf.set(JBSbatCHIFM227.ERR_NAIYO,			this.errMap.get(this.tmpErrCd));	// エラー内容

		// 出力内容を項目ごとにダブルクォーテーション（""）で囲む
		errInf.setMap(JCHbatSeikyKaknoBusinessUtil.quote(errInf.getMap(), JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE));

		// ダブルクォーテーション（""）で囲まずそのまま出力する
		errInf.set(JBSbatCHIFM227.PRC_TOKRK_ADD_LIST,	tranMap.getString(JBSbatCHIFM118.IKT_ADD_FILE));	// 料金対応記録一括登録リスト 

		errInf.setOutFlg(true);
		outputInItem.addOutMapList(errInf);

		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeErrFile]");
		return;
	}

	/**
	 * 料金対応記録を登録します。
	 * 
	 * @param mastMap      一時金一括登録リスト
	 * @param prcGrpCd     料金グループコード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void prcTaiokrkAdd(JBSbatServiceInterfaceMap mastMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][prcTaiokrkAdd]");
		assert 	mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][prcTaiokrkAdd][mastMap=" + mastMap.toString() + "]") : true;
		
		// 料金対応記録登録データの設定
		JBSbatServiceInterfaceMap prcTaioInMap = new JBSbatServiceInterfaceMap();
		{
			// 請求契約番号
			prcTaioInMap.setString(JBSbatCHIFM096.SEIKY_KEI_NO, mastMap.get(JBSbatCHIFM226.SEIKY_KEI_NO));
			// 対応年月日時分秒
			prcTaioInMap.setString(JBSbatCHIFM096.TAIO_DTM, super.onlineOpeDate.concat(JCCBatCommon.getSysDateTimeStamp().substring(8)));
			// 料金対応記録種別コード
			prcTaioInMap.setString(JBSbatCHIFM096.PRC_TAIO_KIROK_SBT_CD, JACStrConst.TKRK_SBT_KIJI_ADD);
			// 料金対応記録種別詳細コード
			prcTaioInMap.setString(JBSbatCHIFM096.PRC_TAIO_KIROK_SBT_DTL_CD, JACStrConst.TKRK_SBTD_KIJI_ADD_BATCH);
			// 記録対象年月
			prcTaioInMap.setString(JBSbatCHIFM096.KIROK_TG_YM, mastMap.get(JBSbatCHIFM226.KIROK_TG_YM));
			// 対応履歴連動対象フラグ
			prcTaioInMap.setString(JBSbatCHIFM096.TAIORRKI_RENDO_TG_FLG, mastMap.get(JBSbatCHIFM226.CUST_TOAK_DSP_FLG));
			// 記事
			prcTaioInMap.setString(JBSbatCHIFM096.KIJI, mastMap.getString(JBSbatCHIFM226.KIJI));
			// タイトル
			prcTaioInMap.setString(JACStrConst.TAIO_KRK_TITLE, mastMap.getString(JBSbatCHIFM226.TOIAWASE_TITLE));
		}
		
		// 料金対応記録登録を実行
		jCHbatPrcTaiokrkAdd.prcTaiokrkAdd(prcTaioInMap);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][prcTaiokrkAdd]");
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// 料金対応記録登録部品をクローズする
		jCHbatPrcTaiokrkAdd.close();
		
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SEIKY_KEI.close();
		db_KK_T_KAKINS.close();
		db_CC_T_DLYD_TRN_REQ.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(AC_SELECT_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 executeKK_T_SEIKY_KEI_AC_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_AC_SELECT_002);
	}

	/**
	 * SQLKEY(CH_SELECT_005)で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_CH_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KAKINS.selectBySqlDefine(paramList, KK_T_KAKINS_CH_SELECT_005);
	}
	
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	DLYD_TRN_REQ_NO
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeCC_T_DLYD_TRN_REQ_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("DLYD_TRN_REQ_NO", whereParam[0]);

		// DBアクセスを実行します
		return db_CC_T_DLYD_TRN_REQ.selectByPrimaryKeys(whereMap);
	}

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
