/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSkkeiHmzkInfoCksYoksiIktAdd
*	ソースファイル名	：JBSbatCHSkkeiHmzkInfoCksYoksiIktAdd.java
*	作成者				：富士通　
*	作成日				：2025年03月27日
*＜機能概要＞
*　請求契約紐付け情報蓄積抑止一括登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v75.00.00	2025/03/27  FJ)古村		【ANK-4664-00-00】月別請求先作成の指定分抑止対応
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JACBatCommon;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.common.JCCbatShoriIraiUtil;
import eo.business.common.JCHBatNameStkuUtil;
import eo.business.common.JPCBatCommon;
import eo.business.util.file.JBSbatCHIFM490;
import eo.business.util.file.JBSbatCHIFM491;
import eo.business.util.table.JBSbatCC_T_DLYD_TRN_REQ;
import eo.common.constant.JACStrConst;
import eo.common.constant.JZM0171Constant;
import eo.framework.application.JBSbatBusinessBase;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;
import eo.framework.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHSkkeiHmzkInfoCksYoksiIktAdd extends JBSbatBusinessService
{
	/** テーブル(ディレイド処理依頼)*/
	private static final String D_TBL_NAME_CC_T_DLYD_TRN_REQ = "CC_T_DLYD_TRN_REQ";
	
	/** テーブル(請求契約)*/
	private static final String D_TBL_NAME_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";
	
	/** テーブル(請求契約_お客様_除外設定)*/
	private static final String D_TBL_NAME_CH_T_SKKEI_CUST_JGST = "CH_T_SKKEI_CUST_JGST";
	
	/** テーブル(お客様)*/
	private static final String D_TBL_NAME_CK_T_CUST = "CK_T_CUST";
	
	/** テーブル(課金先)*/
	private static final String D_TBL_NAME_KK_T_KAKINS = "KK_T_KAKINS";
	
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	
	/** テーブル(ダウンロードファイル管理)*/
	private static final String D_TBL_NAME_ZM_T_DL_FILE_KANRI = "ZM_T_DL_FILE_KANRI";
	
	/** SQL定義キー(CH_SELECT_021)_請求契約番号の存在チェック*/
	private static final String KK_T_SEIKY_KEI_CH_SELECT_021 = "CH_SELECT_021";
	
	/** SQL定義キー(CH_SELECT_003)_SYSIDの存在チェック*/
	private static final String CK_T_CUST_CH_SELECT_003 = "CH_SELECT_003";
	
	/** SQL定義キー(CH_SELECT_001)_請求契約_お客様_除外設定スキーマの存在チェック*/
	private static final String CH_T_SKKEI_CUST_JGST_CH_SELECT_001 = "CH_SELECT_001";
	
	/** SQL定義キー(CH_SELECT_010)_妥当性チェック*/
	private static final String KK_T_KAKINS_CH_SELECT_010 = "CH_SELECT_010";
	
	/** SQL定義キー(CH_INSERT_001)*/
	private static final String ZM_T_DL_FILE_KANRI_CH_INSERT_001 = "CH_INSERT_001";
	
	/** テーブルアクセスクラス(ディレイド処理依頼)*/
	private JBSbatSQLAccess db_CC_T_DLYD_TRN_REQ = null;
	
	/** テーブルアクセスクラス(請求契約)*/
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;
	
	/** テーブルアクセスクラス(請求契約_お客様_除外設定)*/
	private JBSbatSQLAccess db_CH_T_SKKEI_CUST_JGST = null;
	
	/** テーブルアクセスクラス(お客様)*/
	private JBSbatSQLAccess db_CK_T_CUST = null;
	
	/** テーブルアクセスクラス(課金先)*/
	private JBSbatSQLAccess db_KK_T_KAKINS = null;
	
	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	
	/** テーブルアクセスクラス(ダウンロードファイル管理)*/
	private JBSbatSQLAccess db_ZM_T_DL_FILE_KANRI = null;
	
	/** ファイルコード */
	private static final String FILE_CD = "0000";
	
	/** 処理管理番号 請求契約紐付け情報蓄積抑止登録ファイル */
	private static final String TRN_KANRI_NO_IKT_NYUKIN_ADD = "000000000286";
	
	/** 件数取得項目名 */
	private static final String CNT = "CNT";
	
	/** 共通設定_ファイルパス項目名 */
	private static final String IND = "IND";
	
	/** defファイル名 */
	private static final String DEFFILE_NAME ="CHIFM490.def";
	
	/** システム日付*/
	private static final String RESULT_FILENAME = "請求契約紐付け情報蓄積抑止登録結果ファイル_";
	
	/** CSV拡張子*/
	private static final String EXT_CSV = ".csv";
	
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E010 */
	private static final String ERR_CD_E010 = "E010";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E020 */
	private static final String ERR_CD_E020 = "E020";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E030 */
	private static final String ERR_CD_E030 = "E030";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E100 */
	private static final String ERR_CD_E100 = "E100";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E110 */
	private static final String ERR_CD_E110 = "E110";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E120 */
	private static final String ERR_CD_E120 = "E120";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード W130 */
	private static final String ERR_CD_W130 = "W130";
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード E200 */
	private static final String ERR_CD_E200 = "E200";
	
	/** 請求契約紐付け情報蓄積抑止一括登録エラーコード格納マップ */
	private HashMap<String, String> skkeiHmzkInfoCksYoksiIktAddErrCdMap  = null;
	
	/** 結果ファイルオブジェクト*/
	private JBSbatBusinessFileUtil rsltFileObj = null;
	
	/** 結果ファイル名*/
	private String rsltFileName = null;
	
	/** 結果ファイルフルパス */
	private String rsltFileFullPass = null;
	
	/** 請求契約紐付け情報蓄積抑止登録結果ファイルのレコード件数*/
	private int rsltFileCount = 0;
	
	/** システム日付*/
	private String sysDateTime = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_CC_T_DLYD_TRN_REQ = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CC_T_DLYD_TRN_REQ);
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_KEI);
		db_CH_T_SKKEI_CUST_JGST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SKKEI_CUST_JGST);
		db_CK_T_CUST = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CK_T_CUST);
		db_KK_T_KAKINS = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAKINS);
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_ZM_T_DL_FILE_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_DL_FILE_KANRI);
		
		// 初期化
		skkeiHmzkInfoCksYoksiIktAddErrCdMap  = new HashMap<String, String>();
		
		// コード名称管理から該当の名称マップを作成する
		JCHBatNameStkuUtil nameStkuUtil = new JCHBatNameStkuUtil();
		
		// 請求契約紐付け情報蓄積抑止一括登録エラーコード
		skkeiHmzkInfoCksYoksiIktAddErrCdMap = nameStkuUtil.getCdNmMap(commonItem, JZM0171Constant.CD01858);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// ディレイド処理依頼情報を取得する
		List<HashMap<String, Object>> shoriIraiList = JCCbatShoriIraiUtil.getShoriIraiInfo(commonItem, this.jobid);
		if (shoriIraiList == null)
		{
			// 対象データが存在しないため処理終了
			return null;
		}
		
		for (HashMap<String, Object> shoriIrai : shoriIraiList)
		{
			// 業務エラー存在フラグ false:エラーなし、true:エラーあり
			boolean isAppErr = false;
			
			// ディレイド処理依頼番号
			String shoriIraiNo = (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.DLYD_TRN_REQ_NO);
			
			// 入力ファイルの定義取得
			String chlst10701DefFileName = JBSbatAplConst.getAplConstValue(IND) + DEFFILE_NAME;
			
			// 入力電子ファイル管理番号
			String fileKanriNo = (String)shoriIrai.get(JBSbatCC_T_DLYD_TRN_REQ.INPUT_EFILE_KANRI_NO);
			
			// 電子ファイル管理より請求契約紐付け情報蓄積抑止登録ファイルの復元
			String chlst10701Path = JCCBatCommon.searchDenshiFile(commonItem, fileKanriNo);
			JBSbatInputFileUtil inFileUtil = new JBSbatInputFileUtil(chlst10701Path);
			JBSbatDefFileUtil chlst10701Def = new JBSbatDefFileUtil(chlst10701DefFileName, inFileUtil);
			
			// Readerオブジェクトを生成する
			inFileUtil.createReader();
			
			// システム日時取得
			sysDateTime = JCCBatCommon.getSysDateTimeStamp();
			
			// 結果リスト作成
			createRsltFile();
			
			// 結果リストのレコード件数
			rsltFileCount = 0;
			
			// 請求契約紐付け情報蓄積抑止登録ファイル取込結果
			JBSbatServiceInterfaceMap recordMap = null;
			
			// ディレイド処理結果コード
			String resultCd = JACStrConst.DLYD_TRN_RSLT_CD_FIN;
			
			while (inFileUtil.ready()) 
			{
				// ファイルから１レコード取得
				String chlst10501Line = inFileUtil.readLine();
				
				// １レコードの情報をマップに格納
				recordMap = chlst10701Def.lineToObject(chlst10501Line, inFileUtil, 0);
				
				// 登録チェック処理
				boolean isCheckErr = isCheckErr(recordMap);
				if(isCheckErr)
				{
					// 何れかのチェックでエラーがある場合は次のレコードへ
					isAppErr = true;
					continue;
				}
				
				// 妥当性チェック
				boolean isCheckDatouErr = isCheckDatou(recordMap);
				if(isCheckDatouErr)
				{
					// 妥当性チェックはワーニングで登録対象のため、後続処理も行う
					isAppErr = true;
				}
				
				// 登録処理
				boolean isInsertErr = isInsertSkkeiCustJgst(recordMap.getMap());
				// 登録に成功していたらコミット、失敗していたらロールバックと結果ファイル出力
				if(isInsertErr)
				{
					// DBロールバック処理
					JBSbatBusinessBase.dbcon.rollback();
					outputRsltFile(recordMap.getMap(), ERR_CD_E200);
					isAppErr = true;
				}else{
					// DBコミット処理
					JBSbatBusinessBase.dbcon.commit();
					// 妥当性チェックでワーニングがなければ正常終了行を出力
					if (!isCheckDatouErr)
					{
						outputRsltFile(recordMap.getMap(), JACStrConst.KARA_MOJI);
					}
				}
			}
			// ファイルクローズ
			if (inFileUtil != null)
			{
				inFileUtil.close();
			}
			// ファイルクローズ
			if (rsltFileObj != null)
			{
				rsltFileObj.close();
				rsltFileObj = null;
			}
			
			// エラーレコードかワーニングレコードが1件以上存在した場合、ディレイド処理依頼結果コードは"2"(業務エラー)
			if (isAppErr)
			{
				resultCd = JACStrConst.DLYD_TRN_RSLT_CD_WORK_ERR;
			}
			
			// ディレイド処理依頼結果更新
			JPCBatCommon.updateShoriIraiResult(commonItem, shoriIraiNo, resultCd, null);
			
			// 電子ファイル管理登録処理
			String[] resultInfo = insertDenshiFileKanri();
			
			// ダウンロードファイル管理登録処理
			insertDlFikeKanri(resultInfo);
			
			// DBコミット処理
			JBSbatBusinessBase.dbcon.commit();
			
			// 一時ファイルを削除する
			File chufm491 = new File(rsltFileFullPass);
			if (chufm491.exists())
			{
				chufm491.delete();
			}
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CC_T_DLYD_TRN_REQ.close();
		db_KK_T_SEIKY_KEI.close();
		db_CH_T_SKKEI_CUST_JGST.close();
		db_CK_T_CUST.close();
		db_KK_T_KAKINS.close();
		db_KK_T_SVC_KEI.close();
		db_ZM_T_DL_FILE_KANRI.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 入力ファイルのエラーチェックを行います。
	 * <br>
	 * @param recordMap 請求契約紐付け情報蓄積抑止登録ファイルの１レコードの情報
	 * @return 請求契約紐付け情報蓄積抑止登録ファイルのエラーチェック結果
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private boolean isCheckErr(JBSbatServiceInterfaceMap recordMap)throws Exception
	{
		// フォーマットチェック
		if (recordMap.isInputErrorFlg())
		{
			ArrayList<String> outputInfo = new ArrayList<String>();
			
			outputInfo.add(JACStrConst.KARA_MOJI);											// 請求契約番号
			outputInfo.add(JACStrConst.KARA_MOJI);											// SYSID
			outputInfo.add(ERR_CD_E010);													// エラーコード
			outputInfo.add(skkeiHmzkInfoCksYoksiIktAddErrCdMap.get(ERR_CD_E010));			// エラーメッセージ
			
			JCCBatCommon.printDoubleQuoteBusinessFileUtil(rsltFileObj, outputInfo);
			
			// 出力件数カウントアップ
			rsltFileCount++;
			
			return true;
		}
		
		// 各種チェックの結果フラグ
		boolean isSingleCheckErr_SEIKY_KEI_NO = false;
		boolean isSingleCheckErr_SYSID = false;
		boolean isExistenceCheckErr_SEIKY_KEI_NO = false;
		boolean isExistenceCheckErr_SYSID = false;
		
		// 単項目チェック(属性・桁数)_請求契約番号
		String resultSingleCheckCode_SEIKY_KEI_NO = singleCheck_SEIKY_KEI_NO(recordMap.getMap());
		if (!JACBatCommon.isNull(resultSingleCheckCode_SEIKY_KEI_NO))
		{
			outputRsltFile(recordMap.getMap(), resultSingleCheckCode_SEIKY_KEI_NO);
			isSingleCheckErr_SEIKY_KEI_NO = true;
		}
		
		// 単項目チェック(属性・桁数)_SYSID
		String resultSingleCheckCode_SYSID = singleCheck_SYSID(recordMap.getMap());
		if (!JACBatCommon.isNull(resultSingleCheckCode_SYSID))
		{
			outputRsltFile(recordMap.getMap(), resultSingleCheckCode_SYSID);
			isSingleCheckErr_SYSID = true;
		}
		
		// 存在チェック_請求契約番号
		if(!isSingleCheckErr_SEIKY_KEI_NO)
		{
			String resultExistenceCheckCode_SEIKY_KEI_NO = existenceCheck_SEIKY_KEI_NO(recordMap.getMap());
			if (!JACBatCommon.isNull(resultExistenceCheckCode_SEIKY_KEI_NO))
			{
				outputRsltFile(recordMap.getMap(), resultExistenceCheckCode_SEIKY_KEI_NO);
				isExistenceCheckErr_SEIKY_KEI_NO = true;
			}
		}
		
		// 存在チェック_SYSID
		if(!isSingleCheckErr_SYSID)
		{
			String resultExistenceCheckCode_SYSID = existenceCheck_SYSID(recordMap.getMap());
			if (!JACBatCommon.isNull(resultExistenceCheckCode_SYSID))
			{
				outputRsltFile(recordMap.getMap(), resultExistenceCheckCode_SYSID);
				isExistenceCheckErr_SYSID = true;
			}
		}
		
		// 単項目チェック、存在チェックの何れかでエラーになっていたらチェック処理終了
		if(isSingleCheckErr_SEIKY_KEI_NO
				|| isSingleCheckErr_SYSID
				|| isExistenceCheckErr_SEIKY_KEI_NO
				|| isExistenceCheckErr_SYSID)
		{
			return true;
		}
		
		// 存在チェック_請求契約_お客様_除外設定スキーマ
		String resultExistenceCheckCode = existenceCheck_SKKEI_CUST_JGST(recordMap.getMap());
		if (!JACBatCommon.isNull(resultExistenceCheckCode))
		{
			outputRsltFile(recordMap.getMap(), resultExistenceCheckCode);
			return true;
		}
		
		return false;
	}
	
	/**
	 * 入力情報（請求契約紐付け情報蓄積抑止登録ファイル）の請求契約番号の単項目チェックを行います。
	 * <br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return エラー内容に該当する請求契約紐付け情報蓄積抑止一括登録エラーコード。エラーなしの場合には空文字を返却。
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private String singleCheck_SEIKY_KEI_NO(HashMap rsMap) throws Exception
	{
		// 単項目チェックを行います
		String strValue = (String)rsMap.get(JBSbatCHIFM490.SEIKY_KEI_NO);
		
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1","10"}))
		{
			return ERR_CD_E020;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			return ERR_CD_E020;
		}
		
		return JACStrConst.KARA_MOJI;
	}
	
	/**
	 * 入力情報（請求契約紐付け情報蓄積抑止登録ファイル）のSYSIDの単項目チェックを行います。
	 * <br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return エラー内容に該当する請求契約紐付け情報蓄積抑止一括登録エラーコード。エラーなしの場合には空文字を返却。
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private String singleCheck_SYSID(HashMap rsMap) throws Exception
	{
		// 単項目チェックを行います
		String strValue = (String)rsMap.get(JBSbatCHIFM490.SYSID);
		
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu1","10"}))
		{
			return ERR_CD_E030;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			return ERR_CD_E030;
		}
		
		return JACStrConst.KARA_MOJI;
	}
	
	/**
	 * 入力情報（請求契約紐付け情報蓄積抑止登録ファイル）の存在チェックを行います。
	 * <br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return エラー内容に該当する請求契約紐付け情報蓄積抑止一括登録エラーコード。エラーなしの場合には空文字を返却。
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private String existenceCheck_SEIKY_KEI_NO(HashMap rsMap) throws Exception
	{
		// 存在チェックを行います
		String strValue = (String)rsMap.get(JBSbatCHIFM490.SEIKY_KEI_NO);
		
		// 請求契約マップ
		executeKK_T_SEIKY_KEI_CH_SELECT_021(strValue);
		JBSbatCommonDBInterface seikyKeiInfo = db_KK_T_SEIKY_KEI.selectNext();
		
		// 取得結果を確認
		if (seikyKeiInfo == null)
		{
			return ERR_CD_E100;
		}
		int count = seikyKeiInfo.getBigDecimal(CNT).intValue();
		if (count == 0)
		{
			return ERR_CD_E100;
		}
		
		return JACStrConst.KARA_MOJI;
	}
	
	/**
	 * 入力情報（請求契約紐付け情報蓄積抑止登録ファイル）の存在チェックを行います。
	 * <br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return エラー内容に該当する請求契約紐付け情報蓄積抑止一括登録エラーコード。エラーなしの場合には空文字を返却。
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private String existenceCheck_SYSID(HashMap rsMap) throws Exception
	{
		// 存在チェックを行います
		String strValue = (String)rsMap.get(JBSbatCHIFM490.SYSID);
		
		// お客様マップ
		executeCK_T_CUST_CH_SELECT_003(strValue);
		JBSbatCommonDBInterface custInfo = db_CK_T_CUST.selectNext();
		
		// 取得結果を確認
		if (custInfo == null)
		{
			return ERR_CD_E110;
		}
		int count = custInfo.getBigDecimal(CNT).intValue();
		if (count == 0)
		{
			return ERR_CD_E110;
		}
		
		return JACStrConst.KARA_MOJI;
	}
	
	/**
	 * 入力情報（請求契約紐付け情報蓄積抑止登録ファイル）の存在チェックを行います。
	 * <br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return エラー内容に該当する請求契約紐付け情報蓄積抑止一括登録エラーコード。エラーなしの場合には空文字を返却。
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private String existenceCheck_SKKEI_CUST_JGST(HashMap rsMap) throws Exception
	{
		// 請求契約番号
		String seikyKeiNo = (String)rsMap.get(JBSbatCHIFM490.SEIKY_KEI_NO);
		// 請求年月
		String sysid = (String)rsMap.get(JBSbatCHIFM490.SYSID);
		
		// お客様マップ
		executeCH_T_SKKEI_CUST_JGST_CH_SELECT_001(new String[]{seikyKeiNo, sysid});
		JBSbatCommonDBInterface custInfo = db_CH_T_SKKEI_CUST_JGST.selectNext();
		
		// 取得結果を確認
		if (custInfo == null)
		{
			return ERR_CD_E120;
		}
		int count = custInfo.getBigDecimal(CNT).intValue();
		if (count == 1)
		{
			return ERR_CD_E120;
		}
		
		return JACStrConst.KARA_MOJI;
	}
	
	/**
	 * 入力ファイルの妥当性チェックを行います。
	 * <br>
	 * @param recordMap 請求契約紐付け情報蓄積抑止登録ファイルの１レコードの情報
	 * @return 請求契約紐付け情報蓄積抑止登録ファイルの妥当性チェック結果
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private boolean isCheckDatou(JBSbatServiceInterfaceMap recordMap)throws Exception
	{
		String resultDatouCheckCode = datouCheck_KK_T_KAKINS(recordMap.getMap());
		if (!JACBatCommon.isNull(resultDatouCheckCode))
		{
			// 妥当性チェックはワーニングで登録対象のため、後続処理も行う
			outputRsltFile(recordMap.getMap(), resultDatouCheckCode);
			return true;
		}
		
		return false;
	}
	
	/**
	 * 入力情報（請求契約紐付け情報蓄積抑止登録ファイル）の妥当性チェックを行います。
	 * <br>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return エラー内容に該当する請求契約紐付け情報蓄積抑止一括登録エラーコード。エラーなしの場合には空文字を返却。
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private String datouCheck_KK_T_KAKINS(HashMap rsMap) throws Exception
	{
		// 請求契約番号
		String seikyKeiNo = (String)rsMap.get(JBSbatCHIFM490.SEIKY_KEI_NO);
		// 請求年月
		String sysid = (String)rsMap.get(JBSbatCHIFM490.SYSID);
		
		// 課金先マップ
		executeKK_T_KAKINS_CH_SELECT_010(new String[]{seikyKeiNo, sysid, super.opeDate});
		JBSbatCommonDBInterface kakinsInfo = db_KK_T_KAKINS.selectNext();
		
		// 取得結果を確認
		if (kakinsInfo == null)
		{
			return ERR_CD_W130;
		}
		int count = kakinsInfo.getBigDecimal(CNT).intValue();
		if (count == 0)
		{
			return ERR_CD_W130;
		}
		
		return JACStrConst.KARA_MOJI;
	}
	
	/**
	 * SQLKEY(CH_SELECT_021)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		seiky_kei_no:請求契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SEIKY_KEI_CH_SELECT_021(String seiky_kei_no) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(seiky_kei_no);
		
		// DBアクセスを実行します
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_CH_SELECT_021);
	}
	
	/**
	 * SQLKEY(CH_SELECT_003)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		sysid:SYSID
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCK_T_CUST_CH_SELECT_003(String sysid) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(sysid);
		
		// DBアクセスを実行します
		db_CK_T_CUST.selectBySqlDefine(paramList, CK_T_CUST_CH_SELECT_003);
	}
	
	/**
	 * SQLKEY(CH_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	請求契約番号
	 *		 	SYSID
	 *		 	運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KAKINS_CH_SELECT_010(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_CH_SELECT_010);
	}
	
	/**
	 * SQLKEY(CH_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	請求契約番号
	 *		 	SYSID
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SKKEI_CUST_JGST_CH_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_CH_T_SKKEI_CUST_JGST.selectBySqlDefine(paramList, CH_T_SKKEI_CUST_JGST_CH_SELECT_001);
	}
	
	/**
	 * ダウンロードファイル管理登録
	 * @param rsMap 電子ファイル登録情報
	 * @return 処理結果
	 * @throws Exception
	 */
	private String[] insertDenshiFileKanri() throws Exception
	{
		JBSbatCommonItem arg0 = commonItem;								// 業務共通電文
		String arg1 = FILE_CD;											// ファイルコード
		String arg2 = rsltFileFullPass;									// ファイルパス
		String arg3 = JBSbatDateUtil.adjustMonth(super.opeDate, 6);		// ファイル削除年月日（運用日付 + 6ヶ月）
		String[] resultInfo = JCCBatCommon.createDenshiFile(arg0, arg1, arg2, arg3);
		
		return resultInfo;
	}
	
	/**
	 * ダウンロードファイル管理登録
	 * @param resultInfo 電子ファイル登録情報
	 * @throws Exception
	 */
	private void insertDlFikeKanri(String[] resultInfo) throws Exception
	{
		// ダウンロードファイル管理登録処理
		String[] dlFileKanriParam = new String[5];
		dlFileKanriParam[0] = TRN_KANRI_NO_IKT_NYUKIN_ADD;				// 処理管理番号
		dlFileKanriParam[1] = rsltFileName;								// ファイル名
		dlFileKanriParam[2] = String.valueOf(rsltFileCount);			// データ件数
		dlFileKanriParam[3] = resultInfo[0];							// 電子ファイル管理番号
		dlFileKanriParam[4] = resultInfo[1];							// 世代登録年月日時分秒
		executeZM_T_DL_FILE_KANRI_CH_INSERT_001(dlFileKanriParam);
	}
	
	/**
	 * SQLKEY(CH_INSERT_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 executeZM_T_DL_FILE_KANRI_CH_INSERT_001(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_CH_INSERT_001);
	}
	
	/**
	 * 請求契約_お客様_除外設定登録
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @return データ登録結果
	 * @throws Exception
	 */
	private boolean isInsertSkkeiCustJgst(HashMap<String, String> rsMap) throws Exception
	{
		Object [] setParam = new Object[15];
		
		// 請求契約番号
		setParam[0] = (String)rsMap.get(JBSbatCHIFM490.SEIKY_KEI_NO);
		// SYSID
		setParam[1] = (String)rsMap.get(JBSbatCHIFM490.SYSID);
		// 登録年月日時分秒
		setParam[2] = JACStrConst.KARA_MOJI;
		// 登録オペレータアカウント
		setParam[3] = JACStrConst.KARA_MOJI;
		// 更新年月日時分秒
		setParam[4] = JACStrConst.KARA_MOJI;
		// 更新オペレータアカウント
		setParam[5] = JACStrConst.KARA_MOJI;
		// 削除年月日時分秒
		setParam[6] = JACStrConst.KARA_MOJI;
		// 削除オペレータアカウント
		setParam[7] = JACStrConst.KARA_MOJI;
		// 無効フラグ
		setParam[8] = JACStrConst.KARA_MOJI;
		// 登録運用年月日
		setParam[9] = JACStrConst.KARA_MOJI;
		// 登録処理ＩＤ
		setParam[10] = JACStrConst.KARA_MOJI;
		// 更新運用年月日
		setParam[11] = JACStrConst.KARA_MOJI;
		// 更新処理ＩＤ
		setParam[12] = JACStrConst.KARA_MOJI;
		// 削除運用年月日
		setParam[13] = JACStrConst.KARA_MOJI;
		// 削除処理ＩＤ
		setParam[14] = JACStrConst.KARA_MOJI;
		
		try
		{
			executeCH_T_SKKEI_CUST_JGST_PKINSERT(setParam);
		}
		catch (Exception ex)
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	SEIKY_KEI_NO	請求契約番号
	 *		 	SYSID			SYSID
	 *		 	ADD_DTM			登録年月日時分秒
	 *		 	ADD_OPEACNT		登録オペレータアカウント
	 *		 	UPD_DTM			更新年月日時分秒
	 *		 	UPD_OPEACNT		更新オペレータアカウント
	 *		 	DEL_DTM			削除年月日時分秒
	 *		 	DEL_OPEACNT		削除オペレータアカウント
	 *		 	MK_FLG			無効フラグ
	 *		 	ADD_UNYO_YMD	登録運用年月日
	 *		 	ADD_TRN_ID		登録処理ID
	 *		 	UPD_UNYO_YMD	更新運用年月日
	 *		 	UPD_TRN_ID		更新処理ID
	 *		 	DEL_UNYO_YMD	削除運用年月日
	 *		 	DEL_TRN_ID		削除処理ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SKKEI_CUST_JGST_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SEIKY_KEI_NO", setParam[0]);
		setMap.setValue("SYSID", setParam[1]);
		setMap.setValue("ADD_DTM", setParam[2]);
		setMap.setValue("ADD_OPEACNT", setParam[3]);
		setMap.setValue("UPD_DTM", setParam[4]);
		setMap.setValue("UPD_OPEACNT", setParam[5]);
		setMap.setValue("DEL_DTM", setParam[6]);
		setMap.setValue("DEL_OPEACNT", setParam[7]);
		setMap.setValue("MK_FLG", setParam[8]);
		setMap.setValue("ADD_UNYO_YMD", setParam[9]);
		setMap.setValue("ADD_TRN_ID", setParam[10]);
		setMap.setValue("UPD_UNYO_YMD", setParam[11]);
		setMap.setValue("UPD_TRN_ID", setParam[12]);
		setMap.setValue("DEL_UNYO_YMD", setParam[13]);
		setMap.setValue("DEL_TRN_ID", setParam[14]);
		
		// DBアクセスを実行します
		db_CH_T_SKKEI_CUST_JGST.insertByPrimaryKeys(setMap);
	}
	
	/**
	 * 請求契約紐付け情報蓄積抑止登録結果ファイルを出力する。<br>
	 * @param rsMap 入力データを格納されたHashMap。
	 * @param errCd エラーコード
	 * @throws Exception メソッド内で発生した例外全般。
	 */
	private void outputRsltFile(HashMap<String,String> rsMap, String errCd) throws Exception
	{
		ArrayList<String> outputInfo = new ArrayList<String>();
		String errMsg = JACStrConst.KARA_MOJI;
		
		// エラーコードが設定されている場合、コード名称管理からエラーメッセージを取得する
		if (!JACBatCommon.isNull(errCd))
		{
			errMsg = skkeiHmzkInfoCksYoksiIktAddErrCdMap.get(errCd);
		}
		
		outputInfo.add((String)rsMap.get(JBSbatCHIFM491.SEIKY_KEI_NO));			// 請求契約番号
		outputInfo.add((String)rsMap.get(JBSbatCHIFM491.SYSID));				// SYSID
		outputInfo.add(errCd);													// エラーコード
		outputInfo.add(errMsg);													// エラーメッセージ
		
		JCCBatCommon.printDoubleQuoteBusinessFileUtil(rsltFileObj, outputInfo);
		
		// 出力件数カウントアップ
		rsltFileCount++;
	}
	
	/**
	 * 結果リスト作成
	 * @throws Exception
	 */
	private void createRsltFile() throws Exception
	{
		if (rsltFileObj == null)
		{
			// 請求契約紐付け情報蓄積抑止登録結果ファイルのファイル名を編集
			rsltFileName = RESULT_FILENAME + sysDateTime + EXT_CSV;
			
			// フリー項目からファイル出力パスを取得
			String chMidDir = commonItem.getFreeItem();
			
			// 請求契約紐付け情報蓄積抑止登録結果ファイルのフルパス
			rsltFileFullPass = chMidDir + JACStrConst.SLASH + rsltFileName;
			
			// 請求契約紐付け情報蓄積抑止登録結果ファイルのオブジェクトを生成する
			rsltFileObj = JCCBatCommon.createBusinessFileUtil(rsltFileFullPass,
					JACStrConst.ENCODE_SJIS, JACStrConst.LINE_SEPARATOR, JACStrConst.COMMA);
		}
	}
}
