/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKTMPCSvkeiInfoChsht
*	ソースファイル名	：JBSbatKKTMPCSvkeiInfoChsht.java
*	作成者				：富士通　
*	作成日				：2018年10月10日
*＜機能概要＞
*　端末補償サービス契約情報抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v39.00.00	2018/10/10   FJ)王		【ANK-3484-00-00】端末補償サービス導入対応
*********************************************************************/
package eo.business.service;

import java.io.File;
import java.sql.SQLException;
import java.util.HashMap;

import com.fujitsu.futurity.model.common.util.JBSCommonUtil;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatConst;
import eo.business.util.file.JBSbatKKIFM834;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JDKCommonUtil;
import eo.common.util.JKKCommonUtil;
import eo.common.util.JPCDateUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKTmcpSvcKeiInfoCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 入力ファイルパス：端末補償契約情報中間 */
	private String inputFilePath;
	
	/** 出力ファイルパス：端末補償サービス契約情報抽出 */
	private String outputFilePath;
	
	/** 入力ファイルオブジェクト */
	private JBSbatInputFileUtil inPutFile = null;
	
	/** 出力ファイルオブジェクト */
	private JBSbatOutputFileUtil outPutFile = null;

	/** 定義ファイルオブジェクト */
	private JBSbatDefFileUtil defDataUtil = null;
	
	/** 出力ファイル名：端末補償サービス契約情報抽出 */
	private static String TMCP_SVC_KEI_INFO = "KKIFM834";
	
	/** 端末補償サービス契約報抽出ファイル定義 */
	private static String TMCP_SVC_KEI_INFO_DEF = "KKIFM834.def";
	
	/** 改行コード */
	private static final String LF  = "LF";

	/** 端末補償識別コード[02:申込] */
	private static final String TMCP_RNKI_SKCD_MSKM = "02";
	
	/** 端末補償識別コード[03:キャンセル] */
	private static final String TMCP_RNKI_SKCD_CAN = "03";

	/** 端末補償識別コード[04:サービス開始] */
	private static final String TMCP_RNKI_SKCD_SVC_STR = "04";

	/** 端末補償識別コード[05:解約] */
	private static final String TMCP_RNKI_SKCD_DSL = "05";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
		
		String[] freeItem = this.commonItem.getFreeItem().split(";");
		// 入力ファイルパス
		inputFilePath = freeItem[1];
		
		// 出力ファイルパス
		outputFilePath = inputFilePath.replace(freeItem[0], TMCP_SVC_KEI_INFO);
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		File file = new File(this.inputFilePath);
		// 入力ファイルが存在する場合
		if(file.exists())
		{
			try
			{
				try
				{
				// 入力ファイルをオープン
				inPutFile = new JBSbatInputFileUtil(this.inputFilePath);
				inPutFile.setEncode(JKKBatConst.S_CHR_CODE);
				inPutFile.setLine(LF);
				// Readerオブジェクトを生成する。
				inPutFile.createReader();
				// 出力ファイル形式の設定
				outPutFile = new JBSbatOutputFileUtil(outputFilePath);
				outPutFile.setEncode(JKKBatConst.S_CHR_CODE);		// 文字コード
				outPutFile.setLine(LF);			// 改行コード
				
				// 端末補償サービス契約情報ファイルを作成する
				outPutFile.createWriter();
				}
				catch (Exception ex)
				{
					// 端末補償サービス契約情報ファイル作成失敗
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0500CE,
							new String[] {outputFilePath});
					throw ex;
				}
				// 定義ファイル取り込み
				String defFile = JBSbatAplConst.getAplConstValue(JKKStrConst.KK_DIR_IND) + TMCP_SVC_KEI_INFO_DEF;
				defDataUtil = new JBSbatDefFileUtil(defFile, outPutFile);

				// レコードがなくなるまで以降の処理を実行します
				while (inPutFile.ready()) 
				{
					String line = inPutFile.readLine();
					
					if (!JBSCommonUtil.isNull(line) && line.contains("\",\"")){
						// 端末補償サービス契約情報作成
						tmcpSvcKeiInfoCreate(line);
					}
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			// ファイルクローズ
			finally
			{
				if (outPutFile!=null)
				{
					outPutFile.close();
				}
				if (inPutFile!=null)
				{
					inPutFile.close();
				}
			}

		}
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲
	 * @throws Exception */
	
	private void tmcpSvcKeiInfoCreate(String line) throws Exception
	{
		// データ部生成
		JBSbatServiceInterfaceMap outDataMap = new JBSbatServiceInterfaceMap();

		// 入力データ取得
		String[] data = line.split("\",\"");
		data[0] = data[0].substring(1);
		data[data.length-1] = data[data.length-1].substring(0, data[data.length-1].length()-1);

		// バッチ運用日+1
		String opeDateUp = JPCDateUtil.addDay(super.opeDate, 1);
		// オプションサービス契約ステータス
		String opSvcKeiSta = data[2];
		// サービス開始年月日
		String svcStrYmd;
		if (JBSCommonUtil.isNull(data[6]))
		{
			svcStrYmd = "";
		}
		else
		{
			svcStrYmd = data[6];
		}
		// 端末補償連携識別コード（入力）
		String tmcpRnShbCd = data[10];
		// 端末補償連携識別コード（出力）
		String tmcpRnShbCdOut = "";

		// 申込年月日＜ＩＳＰ＞
		String mskmYmdIsp;
		if (JBSCommonUtil.isNull(data[9]))
		{
			mskmYmdIsp = "";
		}
		else
		{
			mskmYmdIsp = data[9];
		}
		// 申込年月日(異動)
		String mskmYmdIdo;
		if (JBSCommonUtil.isNull(data[11]))
		{
			mskmYmdIdo = "";
		}
		else
		{
			mskmYmdIdo = data[11];
		}

		// 端末補償契約番号
		outDataMap.set(JBSbatKKIFM834.TMCP_KEI_NO, data[8]);
		
		// オプションサービス契約番号
		outDataMap.set(JBSbatKKIFM834.OP_SVC_KEI_NO, data[0]);
		
		// サブオプションサービス契約番号
		outDataMap.set(JBSbatKKIFM834.SBOP_SVC_KEI_NO, data[1]);
		
		// オプションサービスコード
		outDataMap.set(JBSbatKKIFM834.OP_SVC_CD, data[3]);
		
		// サブオプションサービスコード
		outDataMap.set(JBSbatKKIFM834.SBOP_SVC_CD, data[4]);
		
		// 端末補償連携識別コード判断
		boolean skcdNonFlg = false;
		if (TMCP_RNKI_SKCD_CAN.equals(tmcpRnShbCd) || TMCP_RNKI_SKCD_DSL.equals(tmcpRnShbCd) || JBSCommonUtil.isNull(tmcpRnShbCd))
		{
			// 端末補償連携識別コードがNULL、キャンセル、解約の場合、TRUEにする。
			skcdNonFlg = true;
		}
		
		// オプションサービス契約ステータス =「020:照査済」,「030:締結済」
		if (JKKStrConst.CD01616_STAT_SHOSAZUMI.equals(opSvcKeiSta) || JKKStrConst.CD01616_STAT_TEIKETSUZUMI.equals(opSvcKeiSta))
		{
			if (skcdNonFlg || (TMCP_RNKI_SKCD_MSKM.equals(tmcpRnShbCd) && !mskmYmdIsp.equals(mskmYmdIdo)))
			{
				// 端末補償連携識別コード：02
				tmcpRnShbCdOut = TMCP_RNKI_SKCD_MSKM;	
			}
		}
		// オプションサービス契約ステータス =「100:サービス提供中」,「210:休止・中断中」,「220:停止中」
		else if (JKKStrConst.CD01616_STAT_SVCTK_CHU.equals(opSvcKeiSta) || JKKStrConst.CD01616_STAT_PAUSE.equals(opSvcKeiSta)
				|| JKKStrConst.CD01616_STAT_STP.equals(opSvcKeiSta))
		{
			// サービス開始年月日 > 運用日付 + 1
			if (opeDateUp.compareTo(svcStrYmd) < 0)
			{
				if (skcdNonFlg)
				{
					// 端末補償連携識別コード：02
					tmcpRnShbCdOut = TMCP_RNKI_SKCD_MSKM;
				}
			}
			else
			{
				// サービス開始年月日 <= 運用日付 + 1,端末補償連携識別コード = 「02:申込」
				if (TMCP_RNKI_SKCD_MSKM.equals(tmcpRnShbCd))
				{
					// 端末補償連携識別コード：04
					tmcpRnShbCdOut = TMCP_RNKI_SKCD_SVC_STR;
				}
				// サービス開始年月日 <= 運用日付、端末補償連携識別コード = NULL、「03:キャンセル」、「05:解約」
				if (super.opeDate.compareTo(svcStrYmd) >= 0 && skcdNonFlg)
				{
					// 申込連携が行われていないデータがサービス開始連携を行う状態の場合、異常データとして出力する。
					commonItem.getLogPrint().printBusinessErrorLog("EKKB1900KW",
							new String[] {"オプションサービス契約番号:" + data[0] + " サブオプションサービス契約番号:" + data[1]});
				}
			}
		}
		// オプションサービス契約ステータス =「910:解約済」、端末補償連携識別コード =「02:申込」
		else if (JKKStrConst.CD01616_STAT_DSLZUMI.equals(opSvcKeiSta) && TMCP_RNKI_SKCD_MSKM.equals(tmcpRnShbCd))
		{
			// 端末補償連携識別コード：03
			tmcpRnShbCdOut = TMCP_RNKI_SKCD_CAN;
		}
		// オプションサービス契約ステータス =「920:キャンセル済」、端末補償連携識別コード =「02:申込」
		else if (JKKStrConst.CD01616_STAT_CANCELZUMI.equals(opSvcKeiSta) && TMCP_RNKI_SKCD_MSKM.equals(tmcpRnShbCd))
		{
			// 端末補償連携識別コード：03
			tmcpRnShbCdOut = TMCP_RNKI_SKCD_CAN;
		}
		
		// 端末補償連携識別コード
		outDataMap.set(JBSbatKKIFM834.TMCP_RNKI_SKCD, tmcpRnShbCdOut);
		
		// 申込年月日
		outDataMap.set(JBSbatKKIFM834.MSKM_YMD, mskmYmdIsp);
		
		// キャンセル年月日
		outDataMap.set(JBSbatKKIFM834.CL_YMD, data[5]);
		
		// サービス開始年月日
		outDataMap.set(JBSbatKKIFM834.SVC_STA_YMD, svcStrYmd);
		
		// 解約年月日
		outDataMap.set(JBSbatKKIFM834.DSL_YMD, data[7]);
		
		// ファイル書き込み
		try {
			
			if (!JBSCommonUtil.isNull(tmcpRnShbCdOut))
			{
				outPutFile.print(outDataMap, defDataUtil);
			}
			
		} catch (Exception ex) {
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0500CE,
					new String[] {outputFilePath});
			throw ex;
		}
	}
}