/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPkozaNyukinAdd
*	ソースファイル名	：JBSbatCHPkozaNyukinAdd.java
*	作成者				：富士通　
*	作成日				：2020年11月19日
*＜機能概要＞
*　パーフェクト口座入金登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v52.00.00	2020/11/19	FJ)吉田		【ANK-3838-00-00】窓口払い手数料の顧客負担方式導入
*********************************************************************/
package eo.business.service;

import java.util.Arrays;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatCHIFM369;
import eo.business.util.file.JBSbatCHIFM371;
import eo.business.util.table.JBSbatCH_T_NYUKIN;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;
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;

/**
* パーフェクト口座入金登録 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPkozaNyukinAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(入金)*/
	private static final String D_TBL_NAME_CH_T_NYUKIN = "CH_T_NYUKIN";

	/** テーブルアクセスクラス(入金)*/
	private JBSbatSQLAccess db_CH_T_NYUKIN = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 登録項目インデックス：入金番号 */
	private static final int INS_IDX_NYUKIN_NO = 0;
	
	/** 登録項目インデックス：入金ステータス */
	private static final int INS_IDX_NYUKIN_STAT = 1;
	
	/** 登録項目インデックス：入金経路コード */
	private static final int INS_IDX_NYUKIN_ROUTE_CD = 2;
	
	/** 登録項目インデックス：収納機関コード */
	private static final int INS_IDX_SHUNOKIKAN_CD = 3;
	
	/** 登録項目インデックス：外部組織収納年月日 */
	private static final int INS_IDX_OUT_ORG_SHUNO_YMD = 4;
	
	/** 登録項目インデックス：入金処理年月日 */
	private static final int INS_IDX_NYUKIN_TRN_YMD = 5;
	
	/** 登録項目インデックス：入金処理時分秒 */
	private static final int INS_IDX_NYUKIN_TRN_HMS = 6;
	
	/** 登録項目インデックス：領収年月日 */
	private static final int INS_IDX_RECEIPT_YMD = 7;
	
	/** 登録項目インデックス：領収時分秒 */
	private static final int INS_IDX_RECEIPT_HMS = 8;
	
	/** 登録項目インデックス：入金額 */
	private static final int INS_IDX_NYUKIN_AMNT = 9;
	
	/** 登録項目インデックス：請求契約番号 */
	private static final int INS_IDX_SEIKY_KEI_NO = 13;
	
	/** 登録項目インデックス：入金登録方法コード */
	private static final int INS_IDX_NYUKIN_ADD_WAY_CD = 14;
	
	/** 登録項目インデックス：入金処理済フラグ  */
	private static final int INS_IDX_NYUKIN_SYRZM_FLG = 15;
	
	/** 登録項目インデックス：受取組織コード */
	private static final int INS_IDX_UKETORI_ORG_CD = 25;
	
	/** 登録項目インデックス：無効フラグ */
	private static final int INS_IDX_MK_FLG = 50;
	
	/** 登録項目数 */
	private static final int INS_KMK_NUM = 51;

	/** 入金スキーマ更新件数 */
	private int updateCnt = 0;

	/** 入金番号文字長 */
	private static final int SEQ_LEN_NYUKIN = 12;
	
	/** 請求契約存在有無（無） */
	private static final String SEIKY_KEI_UMU_NASI = "0";
	
	/** 退避用請求契約番号 */
	private static String taihiSeikyKeiNo = JACStrConst.KARA_MOJI;
	
	/** 退避フラグ */
	private static boolean taihiFlg = false;

	/**
	 * 初期処理
	 * @param commonItem バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_NYUKIN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_NYUKIN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		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 JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][inMap=" + inMap.getMap().toString() + "]");
		
		// 新規登録時に使用する入金番号を取得
		String nyukinNo = null;
		
		JBSbatOutputItem outputInItem = new JBSbatOutputItem();
		String seikyKeiUmu = inMap.getString(JBSbatCHIFM369.SEIKY_KEI_UMU);
		
		//請求契約有無フラグが無しならば
		if(SEIKY_KEI_UMU_NASI.equals(seikyKeiUmu))
		{
			//請求契約番号を退避し
			taihiSeikyKeiNo = inMap.getString(JBSbatCHIFM369.SEIKY_KEI_NO);
			
			//退避フラグを設定
			taihiFlg = true;
			
			//スキーマ登録用に""(空)を設定
			inMap.setString(JBSbatCHIFM369.SEIKY_KEI_NO, JACStrConst.KARA_MOJI);
		}
		
		// シーケンス１件毎に取得
		String nyukinNo_wk = JCCBatCommon.getNextSeq(commonItem, JACStrConst.SEQ_NYUKIN_NO);
		nyukinNo = JPCUtilCommon.fillZero(String.valueOf(nyukinNo_wk), SEQ_LEN_NYUKIN, false);
		
		// 入金スキーマ登録
		insertNyukin(inMap, nyukinNo);
		
		// 入金情報を出力する
		createOutputFile(outputInItem, nyukinNo, inMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 入金スキーマに登録します。
	 * 
	 * @param inMap 入力電文
	 * @param nyukinNo 入金番号
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void insertNyukin(JBSbatServiceInterfaceMap inMap, String nyukinNo) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][insertNyukin]");
		
		// 設定値
		Object[] setArray = new Object[INS_KMK_NUM];
		// 入金番号
		setArray[INS_IDX_NYUKIN_NO] = nyukinNo;
		// 入金ステータス
		setArray[INS_IDX_NYUKIN_STAT] = JACStrConst.NYUKIN_STAT_ZUMI;
		// 入金経路コード
		setArray[INS_IDX_NYUKIN_ROUTE_CD] = inMap.get(JBSbatCHIFM369.NYUKIN_ROUTE_CD);
		// 収納機関コード
		setArray[INS_IDX_SHUNOKIKAN_CD] = inMap.get(JBSbatCHIFM369.SHUNOKIKAN_CD);
		// 外部組織収納年月日
		setArray[INS_IDX_OUT_ORG_SHUNO_YMD] = inMap.get(JBSbatCHIFM369.OUT_ORG_SHUNO_YMD);
		// 入金処理年月日
		setArray[INS_IDX_NYUKIN_TRN_YMD] = super.opeDate;
		// 入金処理時分秒
		setArray[INS_IDX_NYUKIN_TRN_HMS] = JCCBatCommon.getSysDateTimeStamp().substring(8, 17);
		// 領収年月日
		setArray[INS_IDX_RECEIPT_YMD] = inMap.get(JBSbatCHIFM369.RECEIPT_YMD);
		// 領収時分秒
		setArray[INS_IDX_RECEIPT_HMS] = inMap.get(JBSbatCHIFM369.RECEIPT_HMS);
		// 入金額
		setArray[INS_IDX_NYUKIN_AMNT] = inMap.get(JBSbatCHIFM369.NYUKIN_AMNT);
		// 請求契約番号
		setArray[INS_IDX_SEIKY_KEI_NO] = inMap.get(JBSbatCHIFM369.SEIKY_KEI_NO);
		// 入金登録方法コード
		setArray[INS_IDX_NYUKIN_ADD_WAY_CD] = JACStrConst.NYUKIN_ADD_WAY_AUTO;
		// 入金処理済フラグ 
		setArray[INS_IDX_NYUKIN_SYRZM_FLG] = inMap.get(JBSbatCHIFM369.NYUKIN_SYRZM_FLG);
		// 受取組織コード
		setArray[INS_IDX_UKETORI_ORG_CD] = JACStrConst.SPACE_1;
		// 無効フラグ
		setArray[INS_IDX_MK_FLG] = JACStrConst.MK_FLG_MK;

		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][insertNyukin][setArray=" + Arrays.asList(setArray).toString() + "]");
		
		// 入金スキーマ登録処理実行
		executeCH_T_NYUKIN_PKINSERT(setArray);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][insertNyukin]");
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/

		db_CH_T_NYUKIN.clearBatch();

		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_NYUKIN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		// 入金スキーマ更新件数をログ出力
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB1190AI,
				new String[] {JBSbatCH_T_NYUKIN.TABLE_NAME, String.valueOf(updateCnt)});
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * PK(全項目登録)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	入金番号				NYUKIN_NO
	 *		 	入金ステータス				NYUKIN_STAT
	 *		 	入金経路コード				NYUKIN_ROUTE_CD
	 *		 	収納機関コード				SHUNOKIKAN_CD
	 *		 	外部組織収納年月日				OUT_ORG_SHUNO_YMD
	 *		 	入金処理年月日				NYUKIN_TRN_YMD
	 *		 	入金処理時分秒				NYUKIN_TRN_HMS
	 *		 	領収年月日				RECEIPT_YMD
	 *		 	領収時分秒				RECEIPT_HMS
	 *		 	入金額				NYUKIN_AMNT
	 *		 	入金取消年月日				NYUKIN_CL_YMD
	 *		 	入金取消理由コード				NYUKIN_CLRE_CD
	 *		 	請求番号				SEIKY_NO
	 *		 	請求契約番号				SEIKY_KEI_NO
	 *		 	入金登録方法コード				NYUKIN_ADD_WAY_CD
	 *		 	入金処理済フラグ				NYUKIN_SYRZM_FLG
	 *		 	窓口金融機関コード				MADOGUCHI_BANK_CD
	 *		 	窓口金融機関支店コード				MADOGUCHI_BANK_SHITEN_CD
	 *		 	口座振替金融機関コード				KHRI_BANK_CD
	 *		 	口座振替金融機関支店コード				KHRI_BANK_SHITEN_CD
	 *		 	クレジットカード会社コード				CRECARD_COMP_CD
	 *		 	債権回収委託会社コード				SKNKSITKCM_CD
	 *		 	指定口座コード				SHITEIKOZA_CD
	 *		 	払込先金融機関コード				HRAKMISAKI_BANK_CD
	 *		 	払込先金融機関支店コード				HRAKMISAKI_BANK_SHITEN_CD
	 *		 	受取組織コード				UKETORI_ORG_CD
	 *		 	社内使用分組織コード				SYAYOBUN_ORG_CD
	 *		 	コンビニエンスストアコード				CVSTORE_CD
	 *		 	コンビニ受付店コード				CVSTORE_UK_TEN_CD
	 *		 	ＥＡＮメーカーコード				EAN_MAKER_CD
	 *		 	コンビニリアル業務コード				CVSTORE_REAL_WORK_CD
	 *		 	コンビニリアル速報通知年月日				CVSTORE_REAL_SOKHO_TCH_YMD
	 *		 	コンビニリアル速報通知時分秒				CVSTORE_REAL_SOKHO_TCH_HMS
	 *		 	コンビニリアル速報処理済フラグ				CVS_REAL_SOKHO_SYRZM_FLG
	 *		 	コンビニ速報通知年月日				CVSTORE_SOKHO_TCH_YMD
	 *		 	コンビニ速報処理済フラグ				CVSTORE_SOKHO_SYRZM_FLG
	 *		 	コンビニ確報通知年月日				CVSTORE_KAKHO_TCH_YMD
	 *		 	コンビニ支払予定年月日				CVSTORE_PAY_RSV_YMD
	 *		 	コンビニ速報取消通知年月日				CVSTORE_SOKHO_CL_TCH_YMD
	 *		 	郵券受取組織コード				YUKEN_UKETORI_ORG_CD
	 *		 	郵便自動振込金融機関コード				YJHRI_BANK_CD
	 *		 	郵便自動振込金融機関支店コード				YJHRI_BANK_SHITEN_CD
	 *		 	郵便振込金融機関コード				YHRIKOMI_BANK_CD
	 *		 	郵便振込金融機関支店コード				YHRIKOMI_BANK_SHITEN_CD
	 *		 	登録年月日時分秒				ADD_DTM
	 *		 	登録オペレータアカウント				ADD_OPEACNT
	 *		 	更新年月日時分秒				UPD_DTM
	 *		 	更新オペレータアカウント				UPD_OPEACNT
	 *		 	削除年月日時分秒				DEL_DTM
	 *		 	削除オペレータアカウント				DEL_OPEACNT
	 *		 	無効フラグ				MK_FLG
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_NYUKIN_PKINSERT(Object[] setParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("NYUKIN_NO", setParam[0]);
		setMap.setValue("NYUKIN_STAT", setParam[1]);
		setMap.setValue("NYUKIN_ROUTE_CD", setParam[2]);
		setMap.setValue("SHUNOKIKAN_CD", setParam[3]);
		setMap.setValue("OUT_ORG_SHUNO_YMD", setParam[4]);
		setMap.setValue("NYUKIN_TRN_YMD", setParam[5]);
		setMap.setValue("NYUKIN_TRN_HMS", setParam[6]);
		setMap.setValue("RECEIPT_YMD", setParam[7]);
		setMap.setValue("RECEIPT_HMS", setParam[8]);
		setMap.setValue("NYUKIN_AMNT", setParam[9]);
		setMap.setValue("NYUKIN_CL_YMD", setParam[10]);
		setMap.setValue("NYUKIN_CLRE_CD", setParam[11]);
		setMap.setValue("SEIKY_NO", setParam[12]);
		setMap.setValue("SEIKY_KEI_NO", setParam[13]);
		setMap.setValue("NYUKIN_ADD_WAY_CD", setParam[14]);
		setMap.setValue("NYUKIN_SYRZM_FLG", setParam[15]);
		setMap.setValue("MADOGUCHI_BANK_CD", setParam[16]);
		setMap.setValue("MADOGUCHI_BANK_SHITEN_CD", setParam[17]);
		setMap.setValue("KHRI_BANK_CD", setParam[18]);
		setMap.setValue("KHRI_BANK_SHITEN_CD", setParam[19]);
		setMap.setValue("CRECARD_COMP_CD", setParam[20]);
		setMap.setValue("SKNKSITKCM_CD", setParam[21]);
		setMap.setValue("SHITEIKOZA_CD", setParam[22]);
		setMap.setValue("HRAKMISAKI_BANK_CD", setParam[23]);
		setMap.setValue("HRAKMISAKI_BANK_SHITEN_CD", setParam[24]);
		setMap.setValue("UKETORI_ORG_CD", setParam[25]);
		setMap.setValue("SYAYOBUN_ORG_CD", setParam[26]);
		setMap.setValue("CVSTORE_CD", setParam[27]);
		setMap.setValue("CVSTORE_UK_TEN_CD", setParam[28]);
		setMap.setValue("EAN_MAKER_CD", setParam[29]);
		setMap.setValue("CVSTORE_REAL_WORK_CD", setParam[30]);
		setMap.setValue("CVSTORE_REAL_SOKHO_TCH_YMD", setParam[31]);
		setMap.setValue("CVSTORE_REAL_SOKHO_TCH_HMS", setParam[32]);
		setMap.setValue("CVS_REAL_SOKHO_SYRZM_FLG", setParam[33]);
		setMap.setValue("CVSTORE_SOKHO_TCH_YMD", setParam[34]);
		setMap.setValue("CVSTORE_SOKHO_SYRZM_FLG", setParam[35]);
		setMap.setValue("CVSTORE_KAKHO_TCH_YMD", setParam[36]);
		setMap.setValue("CVSTORE_PAY_RSV_YMD", setParam[37]);
		setMap.setValue("CVSTORE_SOKHO_CL_TCH_YMD", setParam[38]);
		setMap.setValue("YUKEN_UKETORI_ORG_CD", setParam[39]);
		setMap.setValue("YJHRI_BANK_CD", setParam[40]);
		setMap.setValue("YJHRI_BANK_SHITEN_CD", setParam[41]);
		setMap.setValue("YHRIKOMI_BANK_CD", setParam[42]);
		setMap.setValue("YHRIKOMI_BANK_SHITEN_CD", setParam[43]);
		setMap.setValue("ADD_DTM", setParam[44]);
		setMap.setValue("ADD_OPEACNT", setParam[45]);
		setMap.setValue("UPD_DTM", setParam[46]);
		setMap.setValue("UPD_OPEACNT", setParam[47]);
		setMap.setValue("DEL_DTM", setParam[48]);
		setMap.setValue("DEL_OPEACNT", setParam[49]);
		setMap.setValue("MK_FLG", setParam[50]);
	
		// DBアクセスを実行します
		db_CH_T_NYUKIN.insertByPrimaryKeysBatch(setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * ファイルに出力する値を設定します。
	 * @param outputInItem 出力ファイル
	 * @param nyukinNo 入金番号
	 * @param inMap 入力電文
	 * @throws Exception
	 */
	private void createOutputFile(JBSbatOutputItem outputInItem, String nyukinNo, JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createOutputFile]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][createOutputFile][出力対象入金番号＝" + nyukinNo + "]");
		
		//請求契約番号がALL空白に設定されていたら、退避していた番号と差し替え。
		if(taihiFlg)
		{
			inMap.setString(JBSbatCHIFM369.SEIKY_KEI_NO, taihiSeikyKeiNo);
			taihiFlg = false;
		}
		
		// ファイルに出力する値を設定します。
		inMap.setString(JBSbatCHIFM371.NYUKIN_NO,				nyukinNo);												// 入金番号
		inMap.setString(JBSbatCHIFM371.SHUNO_YMD,				inMap.getString(JBSbatCHIFM369.OUT_ORG_SHUNO_YMD));		// 収納年月日
		
		inMap.setOutFlg(true);
		outputInItem.addOutMapList(inMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][createOutputFile]");
	}
}
