/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom                        *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKWebStpprmlFileSvc
*	ソースファイル名	：JBSbatKKWebStpprmlFileSvc.java
*	作成者				：富士通　
*	作成日				：2011年08月31日
*＜機能概要＞
*　ＷＥＢ工程進捗情報ファイル（etv6）_サービス契約部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/31  FJ)倉上		新規作成
*	v3.00.00	2012/07/10  FJ)藤本		【SGY-2012-0000037】住所変更対応
*	v3.01.00	2012/09/06  FJ)藤本		【ST1-2012-0000518】運用日の前日を対象とするように修正
*	v3.02.00	2012/10/26  FJ)藤本		【ST1-2012-0000713】運用日で抽出するように修正
*	v4.00.00	2013/01/17  FJ)団		【ST2-2013-0000113】連携ファイル制御で範囲指定するよう修正
*	v4.01.00	2013/03/22  FJ)柳		【IT1-2013-0000498】対応
*	v4.02.00	2013/06/20  FJ)柳		【IT1_2013_0001271】対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM046;
import eo.business.util.table.JBSbatKK_T_MSKM;
import eo.business.util.table.JBSbatKK_T_MSKM_DTL;
import eo.business.util.table.JBSbatKK_T_RNKI_FILE_CTRL;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVKEI_KAISEN_UW;
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;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKWebStpprmlFileSvc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(連携ファイル制御)*/
	private static final String D_TBL_NAME_KK_T_RNKI_FILE_CTRL = "KK_T_RNKI_FILE_CTRL";

	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブル(回線対象サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAISEN_TG_SVKEI = "KK_T_KAISEN_TG_SVKEI";

	/** SQL定義キー(KK_SELECT_063)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_063 = "KK_SELECT_063";

	/** SQL定義キー(KK_SELECT_017)*/
	private static final String KK_T_KAISEN_TG_SVKEI_KK_SELECT_017 = "KK_SELECT_017";

	/** テーブルアクセスクラス(連携ファイル制御)*/
	private JBSbatSQLAccess db_KK_T_RNKI_FILE_CTRL = null;

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;

	/** テーブルアクセスクラス(回線対象サービス契約)*/
	private JBSbatSQLAccess db_KK_T_KAISEN_TG_SVKEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 物理バッチID（KKPRC01601）*/
	private static final String BAT_ID = "KKPRC01601";
	
	/** ファイルID（KKIFE044）*/
	private static final String FILE_ID = "KKIFE044  ";
	
	/** サービス契約ステータス(受付済み：０１０)*/
	private static final String SVC_KEI_STAT_010 = "010";
	
	/** サービス契約ステータス(キャンセル済み：９２０)*/
	private static final String SVC_KEI_STAT_920 = "920";
		
	/** ステータス(新規申込受付中：０００)*/
	private static final String STAT_000 = "000";
	
	/** ステータス(キャンセル：０８０)*/
	private static final String STAT_080 = "080";
	
	/** データ出力リスト */
	private ArrayList<String> dataList = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_RNKI_FILE_CTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_RNKI_FILE_CTRL);
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_T_KAISEN_TG_SVKEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAISEN_TG_SVKEI);
		
		// データ出力リストの初期化を行う。
		dataList = new ArrayList<String>();
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		JBSbatCommonDBInterface db_map = null;
		String znkiJssiDate = "";

		// 連携ファイル制御を検索します。
		String[] para1 = {BAT_ID, FILE_ID};
		db_map = executeKK_T_RNKI_FILE_CTRL_PKSELECT(para1);
		// 前回実施日が取得できた場合
		if (null != db_map)
		{
			String znkiJssiTimestamp = JBSbatStringUtil.Rtrim(db_map.getString(JBSbatKK_T_RNKI_FILE_CTRL.ZNKI_TRAN_RUN_DTM));
			try{
				// バッチ運用日と同日でない場合、先頭8桁を「前回運用日」とします。
				if (!super.opeDate.equals(znkiJssiTimestamp.substring(0, 8)))
				{
					znkiJssiDate = znkiJssiTimestamp.substring(0, 8);
				}
				// バッチ運用日と同日の場合、バッチ運用日-1日を「前回運用日」とします。
				else
				{
					znkiJssiDate = JBSbatDateUtil.adjustDate(super.opeDate, -1);
				}
			} catch (Exception e) {
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0090TE, new String[] {"ZNKI_TRAN_RUN_DTM:" + znkiJssiTimestamp});
			}
		}
		// 前回実施日が取得できなかった場合、バッチ運用日-1日を「前回運用日」とします。
		else
		{
			znkiJssiDate = JBSbatDateUtil.adjustDate(super.opeDate, -1);
		}
		// 対象となるサービス契約の検索を行います。
		String[] para2 = {znkiJssiDate, super.opeDate, super.opeDate,znkiJssiDate, super.opeDate, super.opeDate,super.opeDate};
		this.executeKK_T_SVC_KEI_KK_SELECT_063(para2);
		JBSbatCommonDBInterface svkeiResult = db_KK_T_SVC_KEI.selectNext();
		if(null == svkeiResult)
		{
			super.logPrint.printDebugLog("サービスキャンセル年月日＞＝「" + znkiJssiDate + "」、サービスキャンセル年月日＜＝「" + super.opeDate + "」の工程進捗情報の検索結果がありませんでした。");
		}
		else
		{
			while(null != svkeiResult)
			{
				
				//入出力インターフェースオブジェクトを生成(WEB工程進捗情報(工事工程進捗)ファイル送信用)
				JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
				
				// 申込書番 → 号申込明細の「申込書番号」を設定
				String mskmsho_no = JBSbatStringUtil.Rtrim(svkeiResult.getString(JBSbatKK_T_MSKM_DTL.MSKMSHO_NO));
				
				// 郵便番号 → サービス契約回線内訳の「回線場所郵便番号」を設定します。
				String kaisen_place_pcd = "";
				String[] param = {JBSbatStringUtil.Rtrim(svkeiResult.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO)), super.opeDate};
				this.executeKK_T_KAISEN_TG_SVKEI_KK_SELECT_017(param);
				JBSbatCommonDBInterface kaisenMap = db_KK_T_KAISEN_TG_SVKEI.selectNext();
				if(null != kaisenMap)
				{
					kaisen_place_pcd = JBSbatStringUtil.Rtrim(kaisenMap.getString(JBSbatKK_T_SVKEI_KAISEN_UW.KAISEN_PLACE_PCD));
				}
				
				// ステータス更新日付
				String stat_upd_ymd = "";
				
				// ステータス
				String stat = "";
				
				// サービス契約ステータスを取得
				String svc_kei_stat = JBSbatStringUtil.Rtrim(svkeiResult.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT));
				
				// サービス契約ステータスが受付済の場合。（契約手続き中）
				if (SVC_KEI_STAT_010.equals(svc_kei_stat))
				{
					// ステータス更新日付 → 申込の「申込書到着年月日」を設定します。
					stat_upd_ymd = JBSbatStringUtil.Rtrim(svkeiResult.getString(JBSbatKK_T_MSKM.MSKMSHO_ARIV_YMD));
					
					// ステータス → "000"：新規申込受付中を設定します。
					stat = STAT_000;
				}
				// サービス契約ステータスがキャンセル済の場合。
				else if(SVC_KEI_STAT_920.equals(svc_kei_stat))
				{
					// ステータス更新日付 → サービス契約の「サービスキャンセル年月日」を設定します。
					stat_upd_ymd = JBSbatStringUtil.Rtrim(svkeiResult.getString(JBSbatKK_T_SVC_KEI.SVC_CANCEL_YMD));
					
					// ステータス → "080"：キャンセルを設定します。
					stat = STAT_080;
				}
				
				// 設定するデータを文字列連結する
				StringBuilder dataValue = new StringBuilder();
				dataValue.append(mskmsho_no).append(kaisen_place_pcd).append(stat_upd_ymd).append(stat);
				
				// データリストに存在しない場合は出力対象とする。
				if(!dataList.contains(dataValue.toString()))
				{
					// 申込明細
					outmap.set(JBSbatKKIFM046.MSKMSHO_NO, mskmsho_no);
					
					// 郵便番号
					outmap.set(JBSbatKKIFM046.KAISEN_PLACE_PCD, kaisen_place_pcd);
					
					// ステータス更新日付
					outmap.set(JBSbatKKIFM046.MSKMSHO_ARIV_YMD, stat_upd_ymd);
					
					// ステータス
					outmap.set(JBSbatKKIFM046.STAT, stat);
					
					// 承諾受領日を設定します。
					outmap.set(JBSbatKKIFM046.SDAKS_RCP_YMD, "");
					
					// ファイルに出力する
					outmap.setOutFlg(true);
					outputBean.addOutMapList(outmap);
					
					// データリストに追加する
					dataList.add(dataValue.toString());
				}
				
				svkeiResult = db_KK_T_SVC_KEI.selectNext();
			}
		}
		
		super.logPrint.printDebugLog("execute_END");
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_KK_T_RNKI_FILE_CTRL.close();
		db_KK_T_SVC_KEI.close();
		// DBアクセスクラスをクローズします
		db_KK_T_KAISEN_TG_SVKEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(ＰＫ　検索)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で条件マップを作ります。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	BUTSURI_BAT_ID
	 *		 	FILE_ID
	 * </pre>
	 * <p>
	 * @param whereParam 条件項目の値。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface executeKK_T_RNKI_FILE_CTRL_PKSELECT(Object[] whereParam) throws Exception
	{
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("BUTSURI_BAT_ID", whereParam[0]);
		whereMap.setValue("FILE_ID", whereParam[1]);

		// DBアクセスを実行します
		return db_KK_T_RNKI_FILE_CTRL.selectByPrimaryKeys(whereMap);
	}

	/**
	 * SQLKEY(KK_SELECT_063)で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_SVC_KEI_KK_SELECT_063(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());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_063);
	}

	/**
	 * SQLKEY(KK_SELECT_017)で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_KAISEN_TG_SVKEI_KK_SELECT_017(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_KAISEN_TG_SVKEI.selectBySqlDefine(paramList, KK_T_KAISEN_TG_SVKEI_KK_SELECT_017);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
