/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHDbleNkinSknJutoSksi
*	ソースファイル名	：JBSbatCHDbleNkinSknJutoSksi.java
*	作成者				：富士通　
*	作成日				：2011年09月05日
*＜機能概要＞
*　重複入金債権充当データ作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/09/05   富士通		新規作成
*	v3.00		2012/08/03   FJ)本多	【TG-2012-0000052】対応、請求書情報なしエラー追加
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JPCBatCommon;
import eo.business.util.file.JBSbatCHIFM068;
import eo.business.util.file.JBSbatCHIFM093;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
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;

/**
* 重複入金債権充当データ作成 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHDbleNkinSknJutoSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(CH_SELECT_004)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_004 = "CH_SELECT_004";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 料金項目コード */
	private String prcKmkCd = null;

	/** 入金登録結果エラー内容（収納済みエラー） */
	private String nkinShunoZumiErr = null;
	
	/** クレジット結果エラー内容（収納済） */
	private String creShunoZumi = null;
	
	/** 仮入金一覧表エラー内容（収納済エラー） */
	private String kariShunoZumiErr = null;
	
	/** 仮入金一覧表エラー内容（請求書情報なしエラー） */
	private String kariSksInfNasiErr = null;
	
	/** 退避.フリー項目 */
	private String freeItem = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 業務機能識別コード（仮受金）取得
		String workKinoSkbtCd = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_WKS_KARIUKE_AMNT);
		
		// 入金登録結果エラー内容（収納済みエラー）
		nkinShunoZumiErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_NKIN_KAKNO_ZUMI);
		
		// クレジット結果エラー内容（収納済）
		creShunoZumi = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_CRE_KAKNO_ZUMI);
		
		// 仮入金一覧表エラー内容（収納済エラー）
		kariShunoZumiErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_KARI_KAKNO_ZUMI);
		
		// 仮入金一覧表エラー内容（請求書情報なしエラー）
		kariSksInfNasiErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_KARI_SEIKY_NSI);
		
		paramUtil.close();

		// 料金項目コード取得
		selectRyokinKomokuCd(workKinoSkbtCd);
		
		// フリー項目の値を退避
		this.freeItem = super.freeItem;
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][inMap = " + inMap.getMap().toString() + "]") : true;
		
		// 債権充当データ
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 入力．サービス識別 ＝ "2"（入金情報）の場合
		if(inMap.get(JBSbatCHIFM068.SVC_SKBT).equals(JACStrConst.SVC_SKBT_NYUKIN))
		{
			// フリー項目＝"0"(債権充当)の場合
			if(JACStrConst.NKIN_STAT_SKN_JUTO.equals(this.freeItem))
			{
				// 金庫登録データ作成
				setKnkMap(inMap, outputItem);
			}
			
			// 入金データ作成
			setNkinMap(inMap, outputItem);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 料金項目抽出変換スキーマ検索処理を呼び出し、料金項目コードを取得します。
	 * 
	 * @param workKinoSkbtCd 業務機能識別コード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	@SuppressWarnings("unchecked")
	private void selectRyokinKomokuCd(String workKinoSkbtCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selectRyokinKomokuCd]");
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		// 検索条件値設定
		// システムコード
		paramList.setValue(super.systemCode);
		// 業務機能識別コード
		paramList.setValue(workKinoSkbtCd);
		// 抽出変換コード
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CST);
		// 適用開始年月日
		paramList.setValue(super.opeDate);
		// 適用終了年月日
		paramList.setValue(super.opeDate);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][selectRyokinKomokuCd][paramList=" + paramList.getList().toString() + "]");
		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_004(paramList.getList().toArray());
		
		// 取得結果判定
		JBSbatCommonDBInterface prcKmkCsChgeMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		if (prcKmkCsChgeMap == null)
		{
			// マスタ未存在エラー
			String[] msgParam = new String[]
			{
				JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME,
				JPCBatCommon.convListToString(paramList.getList()),
			};
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0270CH, msgParam);
		}
		prcKmkCd =  prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectRyokinKomokuCd][prcKmkCd=" + prcKmkCd + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectRyokinKomokuCd]");
	}
	
	/**
	 * 金庫登録データを作成します。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力情報
	 * @throws Exception 務サービス内で発生した例外全般
	 */
	private void setKnkMap(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setKnkMap]");
		JBSbatServiceInterfaceMap outMapKnk = new JBSbatServiceInterfaceMap();
		
		// 項目設定
		outMapKnk.setString(JBSbatCHIFM093.SEIKY_KEI_NO, 				inMap.getString(JBSbatCHIFM068.SEIKY_KEI_NO));						// 請求契約番号
		outMapKnk.setString(JBSbatCHIFM093.NYUKIN_NO, 					inMap.getString(JBSbatCHIFM068.NYUKIN_NO));							// 入金番号
		outMapKnk.setString(JBSbatCHIFM093.SEIKY_NO, 					inMap.getString(JBSbatCHIFM068.SEIKY_NO));							// 請求番号
		outMapKnk.setString(JBSbatCHIFM093.SEIKY_YM, 					inMap.getString(JBSbatCHIFM068.SEIKY_YM));							// 請求年月
		outMapKnk.setString(JBSbatCHIFM093.SAIKEN_NO, 					inMap.getString(JBSbatCHIFM068.SAIKEN_NO));							// 債権番号
		outMapKnk.setString(JBSbatCHIFM093.SEIRI_NO, 					inMap.getString(JBSbatCHIFM068.SEIRI_NO));							// 整理番号
		outMapKnk.setString(JBSbatCHIFM093.SVC_NO, 						inMap.getString(JBSbatCHIFM068.SVC_NO));							// サービス番号
		outMapKnk.setString(JBSbatCHIFM093.SVC_SKBT, 					inMap.getString(JBSbatCHIFM068.SVC_SKBT));							// サービス識別
		outMapKnk.setString(JBSbatCHIFM093.PRC_GRP_CD, 					JACStrConst.PRC_GRP_CD_SP);											// 料金グループコード
		outMapKnk.setString(JBSbatCHIFM093.PCRS_CD, 					JACStrConst.PCRS_CD_SP);											// 料金コースコード
		outMapKnk.setString(JBSbatCHIFM093.PRC_SVC_CD, 					JACStrConst.PRC_SVC_CD_SP);											// 料金サービスコード
		outMapKnk.setString(JBSbatCHIFM093.PRC_KMK_CD, 					prcKmkCd);															// 料金項目コード
		outMapKnk.setString(JBSbatCHIFM093.AMNT, 						String.valueOf(inMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT)));	// 金額
		outMapKnk.setString(JBSbatCHIFM093.KAGEN_SKBT_CD, 				JACStrConst.KARA_MOJI);												// 加減識別コード
		outMapKnk.setString(JBSbatCHIFM093.NYUKIN_STAT, 				inMap.getString(JBSbatCHIFM068.NYUKIN_STAT));						// 入金状態コード
		outMapKnk.setString(JBSbatCHIFM093.NYUKIN_ROUTE_CD, 			inMap.getString(JBSbatCHIFM068.NYUKIN_ROUTE_CD));					// 入金経路コード 
		outMapKnk.setString(JBSbatCHIFM093.NYUKIN_TG_SAIKEN_YM, 		inMap.getString(JBSbatCHIFM068.NYUKIN_TG_SAIKEN_YM));				// 入金対象債権年月 
		outMapKnk.setString(JBSbatCHIFM093.TOKUSOKU_NO, 				inMap.getString(JBSbatCHIFM068.TOKUSOKU_NO));						// 督促番号
		outMapKnk.setString(JBSbatCHIFM093.KNK_NO, 						JACStrConst.KARA_MOJI);												// 金庫番号
		outMapKnk.setString(JBSbatCHIFM093.RSLT, 						JACStrConst.KARA_MOJI);												// 結果
		outMapKnk.setString(JBSbatCHIFM093.DATA, 						JACStrConst.KARA_MOJI);												// データ種類
		outMapKnk.setString(JBSbatCHIFM093.ERR_NAIYO, 					JACStrConst.KARA_MOJI);												// エラー内容
		
		// 出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setKnkMap][outMapKnk=" + outMapKnk.getMap().toString() + "]");
		outMapKnk.setOutFlg(true);
		outputItem.addOutMapList(outMapKnk);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setKnkMap]");
	}
	
	/**
	 * 入金データを作成します。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力情報
	 * @throws Exception 務サービス内で発生した例外全般
	 */
	private void setNkinMap(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setNkinMap]");
		JBSbatServiceInterfaceMap outMapNkin = new JBSbatServiceInterfaceMap();
		
		String nyukinStatCd 	= inMap.getString(JBSbatCHIFM068.NYUKIN_STAT);	// 入金ステータス
		String nyukinRouteCd 	= inMap.getString(JBSbatCHIFM068.NYUKIN_ROUTE_CD);	// 入金経路コード 
		
		// 項目設定
		outMapNkin.setString(JBSbatCHIFM093.SEIKY_KEI_NO, 				inMap.getString(JBSbatCHIFM068.SEIKY_KEI_NO));						// 請求契約番号
		outMapNkin.setString(JBSbatCHIFM093.NYUKIN_NO, 					inMap.getString(JBSbatCHIFM068.NYUKIN_NO));							// 入金番号
		outMapNkin.setString(JBSbatCHIFM093.SEIKY_NO, 					inMap.getString(JBSbatCHIFM068.SEIKY_NO));							// 請求番号
		outMapNkin.setString(JBSbatCHIFM093.SEIKY_YM, 					inMap.getString(JBSbatCHIFM068.SEIKY_YM));							// 請求年月
		outMapNkin.setString(JBSbatCHIFM093.SAIKEN_NO, 					inMap.getString(JBSbatCHIFM068.SAIKEN_NO));							// 債権番号
		outMapNkin.setString(JBSbatCHIFM093.SEIRI_NO, 					inMap.getString(JBSbatCHIFM068.SEIRI_NO));							// 整理番号
		outMapNkin.setString(JBSbatCHIFM093.SVC_NO, 					inMap.getString(JBSbatCHIFM068.SVC_NO));							// サービス番号
		outMapNkin.setString(JBSbatCHIFM093.SVC_SKBT, 					inMap.getString(JBSbatCHIFM068.SVC_SKBT));							// サービス識別
		outMapNkin.setString(JBSbatCHIFM093.PRC_GRP_CD, 				inMap.getString(JBSbatCHIFM068.PRC_GRP_CD));						// 料金グループコード
		outMapNkin.setString(JBSbatCHIFM093.PCRS_CD, 					inMap.getString(JBSbatCHIFM068.PCRS_CD));							// 料金コースコード
		outMapNkin.setString(JBSbatCHIFM093.PRC_SVC_CD, 				inMap.getString(JBSbatCHIFM068.PRC_SVC_CD));						// 料金サービスコード
		outMapNkin.setString(JBSbatCHIFM093.PRC_KMK_CD, 				inMap.getString(JBSbatCHIFM068.PRC_KMK_CD));						// 料金項目コード
		outMapNkin.setString(JBSbatCHIFM093.AMNT, 						String.valueOf(inMap.getBigDecimal(JBSbatCHIFM068.NYUKIN_AMNT)));	// 金額
		outMapNkin.setString(JBSbatCHIFM093.KAGEN_SKBT_CD, 				JACStrConst.KARA_MOJI);												// 加減識別コード
		outMapNkin.setString(JBSbatCHIFM093.NYUKIN_STAT, 				nyukinStatCd);														// 入金状態コード  
		outMapNkin.setString(JBSbatCHIFM093.NYUKIN_ROUTE_CD, 			nyukinRouteCd);														// 入金経路コード 
		outMapNkin.setString(JBSbatCHIFM093.NYUKIN_TG_SAIKEN_YM, 		inMap.getString(JBSbatCHIFM068.NYUKIN_TG_SAIKEN_YM));				// 入金対象債権年月 
		outMapNkin.setString(JBSbatCHIFM093.TOKUSOKU_NO, 				inMap.getString(JBSbatCHIFM068.TOKUSOKU_NO));						// 督促番号
		outMapNkin.setString(JBSbatCHIFM093.KNK_NO, 					JACStrConst.KARA_MOJI);												// 金庫番号
		outMapNkin.setString(JBSbatCHIFM093.RSLT, 						JACStrConst.RSLT_ERR);												// 結果
		outMapNkin.setString(JBSbatCHIFM093.DATA, 						JACStrConst.KARA_MOJI);												// データ種類

		// エラー内容
		// 請求番号　＝　""（空文字）の場合
		if(inMap.getString(JBSbatCHIFM068.SEIKY_NO).trim().isEmpty())
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setNkinMap][請求番号　＝　\"\"（空文字）]");
			outMapNkin.setString(JBSbatCHIFM093.ERR_NAIYO, 	kariSksInfNasiErr);	// 請求書情報なしエラー
		}
		// 入金状態＝"010" （入金済）且つ 入金経路 ≠ "70" （クレジット）の場合
		else if(nyukinStatCd.equals(JACStrConst.NYUKIN_STAT_CD_NYUKIN_SUMI) && !nyukinRouteCd.equals(JACStrConst.NYKNKEIRCD_CREDIT))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setNkinMap][入金状態＝\"010\"（入金済） 且つ 入金経路 ≠ \"70\"（クレジット）]");
			outMapNkin.setString(JBSbatCHIFM093.ERR_NAIYO, 	nkinShunoZumiErr);	// 収納済エラー
		}
		// 入金状態＝"010" （入金済）且つ 入金経路 ＝ "70" （クレジット）の場合
		else if (nyukinStatCd.equals(JACStrConst.NYUKIN_STAT_CD_NYUKIN_SUMI) && nyukinRouteCd.equals(JACStrConst.NYKNKEIRCD_CREDIT))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setNkinMap][入金状態＝\"010\" （入金済）且つ 入金経路 ＝ \"70\"（クレジット）]");
			outMapNkin.setString(JBSbatCHIFM093.ERR_NAIYO, 	creShunoZumi);		// 収納済
		}
		// 入金状態≠"010" （入金済）の場合
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setNkinMap][入金状態≠\"010\"（入金済）]");
			outMapNkin.setString(JBSbatCHIFM093.ERR_NAIYO, 	kariShunoZumiErr);	// 収納済エラー
		}
		
		// 出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setNkinMap][outMapNkin=" + outMapNkin.getMap().toString() + "]");
		outMapNkin.setOutFlg(true);
		outputItem.addOutMapList(outMapNkin);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setNkinMap]");
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CH_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	料金項目抽出変換．システムコード
	 *		 	料金項目抽出変換．業務機能識別コード
	 *		 	料金項目抽出変換．抽出変換コード
	 *		 	料金項目抽出変換．適用開始年月日
	 *		 	料金項目抽出変換．適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_004(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_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
