/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom                        *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKWebStpprmlFileKoji
*	ソースファイル名	：JBSbatKKWebStpprmlFileKoji.java
*	作成者				：富士通　
*	作成日				：2011年08月31日
*＜機能概要＞
*　ＷＥＢ工程進捗情報ファイル（etv6）_工事工程進捗部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/08/31  FJ)倉上		新規作成
*	v3.00.00	2012/10/12  FJ)藤本		【IT1-2012-0001309】障害対応
*	v3.01.00	2012/10/26  FJ)藤本		【ST1-2012-0000713】障害対応
*	v5.00.00	2013/04/12  FJ)藤本		【IT1-2013-0000890】障害対応
*	v5.00.01	2013/04/21  FJ)岡田		【IT1-2013-0000987】障害対応
*	v5.00.02	2013/06/20  FJ)柳		【IT1_2013_0001271】対応
*********************************************************************/
package eo.business.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM046;
import eo.business.util.table.JBSbatKK_T_KJ_FIN_WK;
import eo.business.util.table.JBSbatKK_T_MSKM_DTL;
import eo.business.util.table.JBSbatKU_T_KOJIAK;
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.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKWebStpprmlFileKoji extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(工事案件)*/
	private static final String D_TBL_NAME_KU_T_KOJIAK = "KU_T_KOJIAK";

	/** SQL定義キー(KK_SELECT_014)*/
	private static final String KU_T_KOJIAK_KK_SELECT_014 = "KK_SELECT_014";

	/** SQL定義キー(KK_SELECT_015)*/
	private static final String KU_T_KOJIAK_KK_SELECT_015 = "KK_SELECT_015";

	/** SQL定義キー(KK_SELECT_025)*/
	private static final String KU_T_KOJIAK_KK_SELECT_025 = "KK_SELECT_025";

	/** テーブルアクセスクラス(工事案件)*/
	private JBSbatSQLAccess db_KU_T_KOJIAK = null;

	/** テーブルアクセスクラス(工事案件(KK_SELECT_015用))*/
	private JBSbatSQLAccess db_KU_T_KOJIAK_015 = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 工事案件種別コード(プラン変更（収容替）)*/
	private static final String KOJIAK_SBT_CD_009 = "009";
	
	/** WEB工程ステータス判定用　取得元工事完了ワーク */
	private static final String STKUMT_KJFINWK = "KK1471";
	
	/** WEB工程ステータス判定用　取得元工事情報ファイル（宅内調査結果情報） */
	private static final String STKUMT_TKINF = "10";
	
	/** WEB工程ステータス判定用　取得元工事情報ファイル（設計結果情報） */
	private static final String STKUMT_DSGNINF = "20";
	
	/** WEB工程ステータス判定用　取得元工事情報ファイル（伝送設備情報） */
	private static final String STKUMT_DENSO = "30";
	
	/** データ出力リスト */
	private ArrayList<String> dataList = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KU_T_KOJIAK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_KOJIAK);
		db_KU_T_KOJIAK_015 = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KU_T_KOJIAK);
		
		// データ出力リストの初期化を行う。
		dataList = new ArrayList<String>();
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		super.logPrint.printDebugLog("execute_START");
		
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		// ■工事完了ワーク、工事取消ワークより対象データの抽出を行う。
		String[] param = {super.opeDate, super.opeDate,super.opeDate,super.opeDate,super.opeDate,super.opeDate};
		this.executeKU_T_KOJIAK_KK_SELECT_014(param);
		JBSbatCommonDBInterface kojiWkMap = null;
		for(kojiWkMap = db_KU_T_KOJIAK.selectNext(); null != kojiWkMap; kojiWkMap = db_KU_T_KOJIAK.selectNext())
		{
			// 工事案件番号の取得
			String kojiak_no = JBSbatStringUtil.Rtrim(kojiWkMap.getString(JBSbatKU_T_KOJIAK.KOJIAK_NO));
			
			// 申込書番号 → 工事案件番号で初期化する
			String mskmsho_no = kojiak_no;
			
			// 工事案件種別コードの取得
			String kojiak_sbt_cd = JBSbatStringUtil.Rtrim(kojiWkMap.getString(JBSbatKU_T_KOJIAK.KOJIAK_SBT_CD));
			// プラン変更（収容替）以外の場合
			if(!KOJIAK_SBT_CD_009.equals(kojiak_sbt_cd))
			{
				// 工事案件番号より「申込書番号」を取得する。
				String[] param2 = {kojiak_no};
				this.executeKU_T_KOJIAK_KK_SELECT_015(param2);
				JBSbatCommonDBInterface mskmKojiMap = db_KU_T_KOJIAK_015.selectNext();
				if(null != mskmKojiMap)
				{
					// 申込書番号が設定されていない場合は工事案件番号を申込書番号とする。
					mskmsho_no = JBSbatStringUtil.Rtrim(mskmKojiMap.getString(JBSbatKK_T_MSKM_DTL.MSKMSHO_NO));
					if("".equals(mskmsho_no))
					{
						// 申込書番号は「工事案件番号」を設定
						mskmsho_no = kojiak_no;
					}
				}
			}
			
			// 郵便番号 → 工事案件の「転宅先郵便番号」を設定
			String tentaku_saki_pcd = JBSbatStringUtil.Rtrim(kojiWkMap.getString(JBSbatKU_T_KOJIAK.TENTAKU_SAKI_PCD));
			
			// ステータス更新日付 →
			// 「工事完了ワーク」の場合、「工事完了ワーク」の「工事案件実施年月日」
			// 「工事取消ワーク」の場合、「工事取消ワーク」の「工事案件中止受付年月日」
			String stat_upd_ymd = JBSbatStringUtil.Rtrim(kojiWkMap.getString("STAT_UP_DAY"));
			
			// ステータス
			String stat = "";
			
			// 取得元が工事取消ワークの場合
			if("KK1481".equals(JBSbatStringUtil.Rtrim(kojiWkMap.getString("STKUMT"))))
			{
				// 「090：工事取消」を設定
				stat = "090";
			}
			else
			{
				// WEB工程ステータスの取得
				stat = this.getWebStepStat(STKUMT_KJFINWK, this.isNewChange(JBSbatStringUtil.Rtrim(kojiWkMap.getString(JBSbatKK_T_KJ_FIN_WK.NEW_CHGE_CD))));
			}
			
			// 出力ファイルの設定を行う。
			this.createOutPutFile(outputBean, mskmsho_no, tentaku_saki_pcd, stat_upd_ymd, stat, "");
		}
		
		// ■工事情報内部ファイルより対象データの抽出を行う。
		ArrayList<String[]> kojiInfList = this.getKojiInfFileData();
		for(int i = 0; i < kojiInfList.size(); i++)
		{
			// 設定されている工事情報を取得
			String[] kojiInf = kojiInfList.get(i);
			
			// レコード区分の取得
			String recKbn = JBSbatStringUtil.Rtrim(kojiInf[0].replaceAll("\"", ""));
			
			// 工事案件番号の取得
			String kojiak_no = JBSbatStringUtil.Rtrim(kojiInf[7].replaceAll("\"", ""));
			
			// 申込書番号 → 工事案件番号で初期化する
			String mskmsho_no = kojiak_no;
			
			super.logPrint.printDebugLog("レコード区分：" + recKbn);
			super.logPrint.printDebugLog("工事案件番号：" + kojiak_no);
			
			// 工事案件番号より「申込書番号」を取得する。
			String[] param2 = {super.opeDate, kojiak_no,super.opeDate, kojiak_no,super.opeDate};
			this.executeKU_T_KOJIAK_KK_SELECT_025(param2);
			JBSbatCommonDBInterface mskmKojiMap = db_KU_T_KOJIAK.selectNext();
			
			// 工事案件、申込明細工事案件、申込明細がない場合はスキップする
			if(null == mskmKojiMap)
			{
				continue;
			}
			
			// 郵便番号
			String tentaku_saki_pcd = "";
			
			// 工事案件種別コードの取得
			String kojiak_sbt_cd = JBSbatStringUtil.Rtrim(kojiInf[6].replaceAll("\"", ""));
			// プラン変更（収容替）以外の場合
			if(!KOJIAK_SBT_CD_009.equals(kojiak_sbt_cd))
			{
				// 申込書番号が設定されていない場合は工事案件番号を申込書番号とする。
				mskmsho_no = JBSbatStringUtil.Rtrim(mskmKojiMap.getString(JBSbatKK_T_MSKM_DTL.MSKMSHO_NO));
				if("".equals(mskmsho_no))
				{
					// 申込書番号は「工事案件番号」を設定
					mskmsho_no = kojiak_no;
				}
				// 郵便番号 → 工事案件の「転宅先郵便番号」を設定
				tentaku_saki_pcd = JBSbatStringUtil.Rtrim(mskmKojiMap.getString(JBSbatKU_T_KOJIAK.TENTAKU_SAKI_PCD));
			}
			
			// ステータス更新日付 → 運用日で初期化する
			String stat_upd_ymd = super.opeDate;
			
			// 「宅内調査結果情報」または「設計結果情報」の場合
			if(STKUMT_TKINF.equals(recKbn) || STKUMT_DSGNINF.equals(recKbn))
			{
				// 「宅内調査結果情報」の場合、「宅内調査結果情報」の「宅内調査実施年月日」
				// 「設計結果情報」の場合、「設計結果情報」の「設計結果見積設計報告年月日」
				stat_upd_ymd = JBSbatStringUtil.Rtrim(kojiInf[9].replaceAll("\"", ""));
			}
			
			// 承諾書受領日
			String sdaks_rcp_ymd = "";
			
			// 「宅内調査結果情報」の場合、「宅内調査結果情報」の「宅内調査承諾書受領年月日」
			if(STKUMT_TKINF.equals(recKbn))
			{
				sdaks_rcp_ymd = JBSbatStringUtil.Rtrim(kojiInf[11].replaceAll("\"", ""));
			}
			
			// ステータス
			String stat = this.getWebStepStat(recKbn, this.isNewChange(JBSbatStringUtil.Rtrim(kojiInf[5].replaceAll("\"", ""))));
			
			// 出力ファイルの設定を行う。
			this.createOutPutFile(outputBean, mskmsho_no, tentaku_saki_pcd, stat_upd_ymd, stat, sdaks_rcp_ymd);
		}
		
		super.logPrint.printDebugLog("execute_END");
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KU_T_KOJIAK.close();
		db_KU_T_KOJIAK_015.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KK_SELECT_014)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_KOJIAK_KK_SELECT_014(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());

		// DBアクセスを実行します
		db_KU_T_KOJIAK.selectBySqlDefine(paramList, KU_T_KOJIAK_KK_SELECT_014);
	}

	/**
	 * SQLKEY(KK_SELECT_015)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	工事案件番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_KOJIAK_KK_SELECT_015(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KU_T_KOJIAK_015.selectBySqlDefine(paramList, KU_T_KOJIAK_KK_SELECT_015);
	}

	/**
	 * SQLKEY(KK_SELECT_025)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	予約適用年月日
	 *		 	工事案件番号
	 *		 	予約適用年月日
	 *			工事案件番号
	 *			予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKU_T_KOJIAK_KK_SELECT_025(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_KU_T_KOJIAK.selectBySqlDefine(paramList, KU_T_KOJIAK_KK_SELECT_025);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * WEB工程ステータスを判定し返却します。<br>
	 * <p>
	 * @param String 取得元
	 * @param boolean true：新規、false：変更
	 * @return String 判定結果のWEB工程ステータス
	 */	
	private String getWebStepStat(String stkumt, boolean isNew)
	{
		// 取得元が工事情報ファイル（宅内調査結果情報） の場合
		if(STKUMT_TKINF.equals(stkumt))
		{
			// 「新規」の場合
			if(isNew)
			{
				// 「010：宅内調査結果」を返却
				return "010";
			}
			else
			{
				// 「015：宅内調査結果変更」を返却
				return "015";
			}
		}
		// 取得元が工事情報ファイル（設計結果情報） の場合
		else if(STKUMT_DSGNINF.equals(stkumt))
		{
			// 「新規」の場合
			if(isNew)
			{
				// 「020：設計結果」を返却
				return "020";
			}
			else
			{
				// 「025：設計結果変更」を返却
				return "025";
			}
		}
		// 取得元が工事情報ファイル（伝送設備情報） の場合
		else if(STKUMT_DENSO.equals(stkumt))
		{
			// 「新規」の場合
			if(isNew)
			{
				// 「030：伝送設備情報」を返却
				return "030";
			}
			else
			{
				// 「035：伝送設備情報変更」を返却
				return "035";
			}
		}
		// 取得元が工事完了ワークの場合
		else if(STKUMT_KJFINWK.equals(stkumt))
		{
			// 「新規」の場合
			if(isNew)
			{
				// 「040：工事完了情報」を返却
				return "040";
			}
			else
			{
				// 「045：工事完了情報変更」を返却
				return "045";
			}
		}
		return "";
	}
	
	/**
	 * 引数の新規変更コードより新規か変更かを判定し返却します。<br>
	 * 変更(1)以外は新規と判定します。
	 * <p>
	 * @param String 新規変更コード
	 * @return boolean true：新規、false：変更
	 */
	private boolean isNewChange(String new_chge_cd)
	{
		// 「1：変更」の場合
		if("1".equals(new_chge_cd))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * 出力ファイルの編集を行います。
	 * <p>
	 * @param JBSbatOutputItem 出力共通電文
	 * @param mskmsho_no 申込書番号
	 * @param tentaku_saki_pcd 転宅先郵便番号
	 * @param stat_upd_ymd ステータス更新日付
	 * @param stat ステータス
	 * @param sdaks_rcp_ymd 承諾書受領日
	 * @return boolean true：新規、false：変更
	 */
	private void createOutPutFile(JBSbatOutputItem outputBean, String mskmsho_no, String tentaku_saki_pcd, String stat_upd_ymd, String stat, String sdaks_rcp_ymd)
	{
		// 設定するデータを文字列連結する
		StringBuilder dataValue = new StringBuilder();
		dataValue.append(mskmsho_no).append(tentaku_saki_pcd).append(stat_upd_ymd).append(stat);
		
		// データリストに存在しない場合は出力対象とする。
		if(!dataList.contains(dataValue.toString()))
		{
			// 入出力インターフェースオブジェクトを生成(WEB工程進捗情報(工事工程進捗)ファイル送信用)
			JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();
			
			// 申込書番号
			outmap.set(JBSbatKKIFM046.MSKMSHO_NO, mskmsho_no);
			
			// 郵便番号
			outmap.set(JBSbatKKIFM046.KAISEN_PLACE_PCD, tentaku_saki_pcd);
			
			// ステータス更新日付
			outmap.set(JBSbatKKIFM046.MSKMSHO_ARIV_YMD, stat_upd_ymd);
			
			// ステータス
			outmap.set(JBSbatKKIFM046.STAT, stat);
			
			// 承諾書受領日
			outmap.set(JBSbatKKIFM046.SDAKS_RCP_YMD, sdaks_rcp_ymd);
			
			// ファイルに出力する
			outmap.setOutFlg(true);
			outputBean.addOutMapList(outmap);
			
			// データリストに追加する
			dataList.add(dataValue.toString());
		}
	}
	
	/**
	 * 工場関連情報受信ファイル情報を読み込み、対象となるデータをリストに設定し、返却します。<br>
	 * <p>
	 * @return 工事関連情報リスト
	 * @throws JBSbatBusinessException 
	 * @throws IOException 業務サービス内で発生した例外全般。
	 */	
	private ArrayList<String[]> getKojiInfFileData() throws JBSbatBusinessException, IOException
	{
		super.logPrint.printDebugLog("getInputFile_START");
		
		// 読み込みファイル名取得
		String file_name = commonItem.getFreeItem() + "KKIFI023001_" + super.opeDate + ".csv";
		
		// 工事関連情報リスト
		ArrayList<String[]> data_list = new ArrayList<String[]>();
		BufferedReader br = null;
		
		// 工事関連情報受信ファイルを読み込みます。
		try
		{
			InputStreamReader is = new InputStreamReader(new FileInputStream(file_name), "Shift-JIS");
			br = new BufferedReader(is);
			
			while (br.ready())
			{
				// １行読込み
				String strLine = br.readLine();
				
				// カンマで分割、配列に設定する。
				String[] data = strLine.split(",");
				
				// 先頭のレコード区分を取得し
				// 「10：宅内調査結果情報」または「20：設計結果情報」または「30：伝送設備情報」の場合
				String recKbn = JBSbatStringUtil.Rtrim(data[0].replaceAll("\"", ""));
				if("10".equals(recKbn) || "20".equals(recKbn) || "30".equals(recKbn))
				{
					// 工事関連情報リストに配列データを追加する。
					data_list.add(data);
				}
			}
		}
		catch (IOException e)
		{
			// 工事関連情報受信ファイルがない場合はエラー。
			throw new JBSbatBusinessException("EKKB0020CE", new String[]{file_name});
		}
		finally
		{
			if (null != br)
			{
				br.close();
			}
		}
		
		super.logPrint.printDebugLog("getInputFile_END");

		return data_list;
	}
}