/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHSeikyusPulloutDataRef
*	ソースファイル名	：JBSbatCHSeikyusPulloutDataRef.java
*	作成者				：富士通　
*	作成日				：2011年05月26日
*＜機能概要＞
*　請求書引抜きデータ反映部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/26   富士通		新規作成
*	v4.00.00	2013/01/23	 FJ)早崎	【内部管理番号-0000616】スキーマ更新不備
*	v5.00.00	2013/11/06	 FJ)早崎	【OM-2013-0003314,3420】対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM220;
import eo.common.constant.JACStrConst;
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 JBSbatCHSeikyusPulloutDataRef extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(請求書引抜)*/
	private static final String D_TBL_NAME_CH_T_SKS_HIKINUKI = "CH_T_SKS_HIKINUKI";

	/** テーブル(請求)*/
	private static final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";

	/** テーブルアクセスクラス(請求書引抜)*/
	private JBSbatSQLAccess db_CH_T_SKS_HIKINUKI = null;

	/** テーブルアクセスクラス(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 作業領域．キー*/
	private String wkKey = null;
	
	/** 退避．キー*/
	private String beforeKey = null;
	
	/** 退避．請求書引抜き番号*/
	private String beforeSeikyHikinukiNo = null;

	/** 送信済みフラグ*/
	private boolean sendZumiFlg = false;
	
	/** 引抜き送信コード*/
	private String hikinukiSendCd = JACStrConst.KARA_MOJI;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_SKS_HIKINUKI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SKS_HIKINUKI);
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// FREEITEMの取得
		String[] freeItems = super.freeItem.split(JACStrConst.SEMI_COLON);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItems=" + freeItems[0] + "]");
		
		// 引抜き送信コードをfree項目より取得する
		this.hikinukiSendCd = freeItems[0];
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][hikinukiSendCd=" + this.hikinukiSendCd + "]");

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		
		// 最終レコードではない場合
		if(inMap != null)
		{
			// 請求番号
			String seikyNo = inMap.getString(JBSbatCHIFM220.SEIKY_NO);
			
			// 送信区分
			String sendKbn = inMap.getString(JBSbatCHIFM220.SEND_KBN);
			
			// 作業領域．キー設定
			this.wkKey = inMap.getString(JBSbatCHIFM220.SEIKY_KEI_NO);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] [SEIKY_KEI_NO=" + this.wkKey + "]");
			
			// 送信区分が送信済みの場合
			if(this.hikinukiSendCd.equals(sendKbn))
			{
				// 送信済みフラグ ← true
				this.sendZumiFlg = true;
			}
			
			// 送信区分 = 送信済　かつ　請求番号 ≠ null の場合
			if(this.hikinukiSendCd.equals(sendKbn) && !JACStrConst.KARA_MOJI.equals(seikyNo) && null != seikyNo)
			{
				// 請求テーブル更新
				updateSeiky(seikyNo);
			}
			

			// 1レコード目の場合
			if(this.beforeKey == null)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] レコード1件目");
				
				// ダミーレコードを設定する
				outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
				
				// 退避．キー ← 作業領域．キー
				this.beforeKey = this.wkKey;
				
				// 退避．請求書引抜き番号 ← 入力.請求書引抜き番号
				this.beforeSeikyHikinukiNo = inMap.getString(JBSbatCHIFM220.SKS_HIKINUKI_NO);
			}
		}
		
		// 退避．キー≠作業領域．キー(キーブレイク) または 最終レコード の場合
		if(!this.beforeKey.equals(this.wkKey) || inMap == null)
		{
			// 引抜き送信区分更新値
			String updHikinukiSendCd = JACStrConst.KARA_MOJI;
			
			// 送信済みフラグ = true の場合
			if(this.sendZumiFlg)
			{
				// 引抜き送信区分更新値 ← 引抜き送信コード
				updHikinukiSendCd = this.hikinukiSendCd;
			}
			// 上記以外の場合
			else
			{
				// 引抜き送信区分更新値 ← "9"(未送信)
				updHikinukiSendCd = JACStrConst.PULLOUT_SEND_CD_MI_SEND;
			}
			
			// 請求書引抜きテーブル更新
			updateHikinuki(updHikinukiSendCd);
			
			// 送信済みフラグを初期化
			this.sendZumiFlg = false;
			
			// 最終レコードの場合
			if(inMap == null)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute] [最終レコード]");
				
				// 処理を終了する
				return  outputInItem;
			}
			// 最終レコードではない場合
			else
			{
				// 退避．キー ← 作業領域．キー
				this.beforeKey = this.wkKey;
				
				// 退避．請求書引抜き番号 ← 入力.請求書引抜き番号
				this.beforeSeikyHikinukiNo = inMap.getString(JBSbatCHIFM220.SKS_HIKINUKI_NO);
				
				// 送信区分が送信済みの場合
				if(this.hikinukiSendCd.equals(inMap.getString(JBSbatCHIFM220.SEND_KBN)))
				{
					// 送信済みフラグ ← true
					this.sendZumiFlg = true;
				}
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 請求書引抜きテーブルを更新します。
	 * 
	 * @param updHikinukiSendCd    引抜送信コード
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void updateHikinuki(String updHikinukiSendCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][updateHikinuki]");
		
		// 設定値
		Object[] setParam = {updHikinukiSendCd};
		
		// 条件値
		Object[] whereParam = {this.beforeSeikyHikinukiNo};

		assert setParam != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][setParam=" + setParam.toString() + "]") : true;
		assert whereParam != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][whereParam=" + whereParam.toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][updateHikinuki]");
		
		// 更新実行
		executeCH_T_SKS_HIKINUKI_PKUPDATE(setParam, whereParam);
	}

	/**
	 * 請求テーブルを更新します。
	 * 
	 * @param seikyNo 請求番号
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void updateSeiky(String seikyNo) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][updateSeiky]");
		
//		// ＤＢアクセス用のパラメータ定義
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
//
//		// 設定項目
//		// 請求書引抜きフラグ（引抜き対象）
//		paramList.setValue(JACStrConst.SEIKYUS_PULLOUT_FLG);
//		
//		// 条件項目
//		// 入力電文．請求契約番号
//		paramList.setValue(seikyKeiNo);
//		// 入力電文．請求年月
//		paramList.setValue(seikyYm);
		
		
		// 設定値
		Object[] setParam = {JACStrConst.SEIKYUS_PULLOUT_FLG};
		
		// 条件値
		Object[] whereParam = {seikyNo};
		
		assert setParam != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][setParam=" + setParam.toString() + "]") : true;
		assert whereParam != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][whereParam=" + whereParam.toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][updateSeiky]");
		
		// 請求テーブル更新
		executeCH_T_SEIKY_PKUPDATE(setParam, whereParam);
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SKS_HIKINUKI.close();
		db_CH_T_SEIKY.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	引抜送信コード				HIKINUKI_SEND_CD
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SKS_HIKINUKI_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SKS_HIKINUKI_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("HIKINUKI_SEND_CD", setParam[0]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SKS_HIKINUKI_NO", whereParam[0]);

		// DBアクセスを実行します
		db_CH_T_SKS_HIKINUKI.updateByPrimaryKeys(whereMap, setMap);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	請求書引抜フラグ				SEIKYUS_HIKINUKI_FLG
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SEIKY_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SEIKY_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("SEIKYUS_HIKINUKI_FLG", setParam[0]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SEIKY_NO", whereParam[0]);

		// DBアクセスを実行します
		db_CH_T_SEIKY.updateByPrimaryKeys(whereMap, setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
