/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNContcdRkkmcdChg
*	ソースファイル名	：JBSbatCNContcdRkkmcdChg.java
*	作成者				：富士通　
*	作成日				：2013年02月25日
*＜機能概要＞
*　コンテンツコード・料金項目コード変換処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/02/25   富士通		新規作成
*	v8.00.00	2014/01/10   FJ)鄭		【ANK-1585-00-00】050電話番号付与処理を追加
*	v45.00.00	2019/06/13   FJ)謝		【ANK-3636-00-00】消費増税対応（8%⇒10%）
*	v45.00.01	2019/09/05   FJ)王		【ANK-3682-05-00】軽減税率対応
*********************************************************************/
package eo.business.service;

import java.io.IOException;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.common.constant.JCNStrConst;
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;
import eo.framework.file.JBSbatInputFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCNContcdRkkmcdChg extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(システムパラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_SYS_PARAM_KNRI = "ZM_M_SYS_PARAM_KNRI";

	/** テーブル(コード名称管理)*/
	private static final String D_TBL_NAME_ZM_M_CD_NM_KANRI = "ZM_M_CD_NM_KANRI";

	/** SQL定義キー(CN_SELECT_001)*/
	private static final String ZM_M_SYS_PARAM_KNRI_CN_SELECT_001 = "CN_SELECT_001";

	/** SQL定義キー(CN_SELECT_002)*/
	private static final String ZM_M_CD_NM_KANRI_CN_SELECT_002 = "CN_SELECT_002";

	/** テーブルアクセスクラス(システムパラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_SYS_PARAM_KNRI = null;

	/** テーブルアクセスクラス(コード名称管理)*/
	private JBSbatSQLAccess db_ZM_M_CD_NM_KANRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** 課金対象年月 */
	private static final String CHRG_TRGT_YM = "CHRG_TRGT_YM";
	/** ＩＳＰ決済サービス契約番号 */
	private static final String ISP_KSSAI_SVC_KEI_NO = "ISP_KSSAI_SVC_KEI_NO";
	/** コンテンツサービスコード */
	private static final String CONT_SVC_CD = "CONT_SVC_CD";
	/** 税区分 */
	private static final String TAXAREA = "TAXAREA";
	/** 料金項目コード */
	private static final String PRC_KMK_CD = "PRC_KMK_CD";
	/** 課金額 */
	private static final String CHRG_AMNT = "CHRG_AMNT";
	/** 売上減額 */
	private static final String SALES_GEN_AMNT = "SALES_GEN_AMNT";
	/** 補償費 */
	private static final String COMPENSATION = "COMPENSATION";
	/** コンテンツ契約番号 */
	private static final String CONT_KEI_NO = "CONT_KEI_NO";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_SYS_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_SYS_PARAM_KNRI);
		db_ZM_M_CD_NM_KANRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_CD_NM_KANRI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 出力情報
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// システムパラメータ管理テーブル検索用パラメータ
		String[] param1 = {JCNStrConst.ZM0311_SYS_PARAM_BUNRUI_CD_CN_CD
							, commonItem.getOpeDate()
							, commonItem.getOpeDate()};
		
		// コード名称管理テーブル検索用パラメータ
		String[] param2 = {JCNStrConst.CN_EO_ID_CNT_DISP_CD
							, "1"};
		
		// システムパラメータ管理テーブル検索
		executeZM_M_SYS_PARAM_KNRI_CN_SELECT_001(param1);
		JBSbatCommonDBInterface resultMap1 = new JBSbatCommonDBInterface();
		JBSbatCommonDBInterface resultMap2 = new JBSbatCommonDBInterface();
		
		ArrayList<String> retListCntCd = new ArrayList<String>();
		ArrayList<String> retList = new ArrayList<String>();
// ANK-3636-00-00 ADD START
		ArrayList<String> retTaxRtList = new ArrayList<String>();
// ANK-3636-00-00 ADD END
		
		// システムパラメータより取得した値をセットする。
		for (resultMap1 = db_ZM_M_SYS_PARAM_KNRI.selectNext(); null != resultMap1; resultMap1 = db_ZM_M_SYS_PARAM_KNRI.selectNext())
		{
			retListCntCd.add(resultMap1.getString("SYS_PARAM_SETTE_VALUE_1"));
			retList.add(resultMap1.getString("SYS_PARAM_SETTE_VALUE_3"));
// ANK-3636-00-00 ADD START
			// 課金時税率
			retTaxRtList.add(resultMap1.getString("SYS_PARAM_SETTE_VALUE_2"));
// ANK-3636-00-00 ADD END
		}
		
		// コード名称管理テーブル検索
		executeZM_M_CD_NM_KANRI_CN_SELECT_002(param2);
		for (resultMap2 = db_ZM_M_CD_NM_KANRI.selectNext(); null != resultMap2; resultMap2 = db_ZM_M_CD_NM_KANRI.selectNext())
		{
			retList.add(resultMap2.getString("CD_DIV_NM"));
		}
		
// ANK-3682-05-00 ADD START
		// システムパラメータ管理テーブル検索用パラメータ
		String[] param3 = {JCNStrConst.ZM0311_SYS_PARAM_BUNRUI_CD_CN_0083
							, commonItem.getOpeDate()
							, commonItem.getOpeDate()};
		
		// システムパラメータ管理テーブル検索
		executeZM_M_SYS_PARAM_KNRI_CN_SELECT_001(param3);
		JBSbatCommonDBInterface resultMap3 = new JBSbatCommonDBInterface();
		
		// 「eoショッピングモール」のコンテンツ料金コード変換リスト
		ArrayList<String> retListCntCd2 = new ArrayList<String>();
		ArrayList<String> retList2 = new ArrayList<String>();
		ArrayList<String> retTaxRtList2 = new ArrayList<String>();
		
		// システムパラメータより取得した値をセットする。
		for (resultMap3 = db_ZM_M_SYS_PARAM_KNRI.selectNext(); null != resultMap3; resultMap3 = db_ZM_M_SYS_PARAM_KNRI.selectNext())
		{
			retListCntCd2.add(resultMap3.getString("SYS_PARAM_SETTE_VALUE_1"));
			retList2.add(resultMap3.getString("SYS_PARAM_SETTE_VALUE_3"));
			retTaxRtList2.add(resultMap3.getString("SYS_PARAM_SETTE_VALUE_2"));
		}
		executeZM_M_CD_NM_KANRI_CN_SELECT_002(param2);
		for (resultMap2 = db_ZM_M_CD_NM_KANRI.selectNext(); null != resultMap2; resultMap2 = db_ZM_M_CD_NM_KANRI.selectNext())
		{
			retList2.add(resultMap2.getString("CD_DIV_NM"));
		}
// ANK-3682-05-00 ADD END
		// パラメータ読み出し
		String strFreeParam = commonItem.getFreeItem();
		// パラメータを区切り文字で分割する
		String[] lines = strFreeParam.split(JCNStrConst.S_PARAM_DELIM);
		
		String strFreeParam1 = lines[0];	// ISP請求集計ファイル

		// ISP請求集計ファイル読み込み
		ArrayList<String> ispList = readFile(strFreeParam1);
		
		for(int i = 0; i < ispList.size(); i++)
		{
			// ファイルレコードを区切り文字で分割する
			String[] strRec = ispList.get(i).split(JCNStrConst.S_SEP_CAM);

			// 出力情報用マップ
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
			
			// 1件目がNO_DATAの場合、以降の処理は行わない
			if ("NO_DATA".equals(strRec[0]))
			{
				outMap.set(CHRG_TRGT_YM, strRec[0]);
				outputItem.addOutMapList(outMap);
				break;
			}
			
			// コンテンツコード以外の値を設定する。
			outMap.set(CHRG_TRGT_YM, strRec[0]);
			outMap.set(ISP_KSSAI_SVC_KEI_NO, strRec[1]);
			outMap.set(CONT_SVC_CD, strRec[2]);
			outMap.set(TAXAREA, strRec[3]);
			outMap.set(PRC_KMK_CD, strRec[4]);
			outMap.set(CHRG_AMNT, strRec[5]);
			outMap.set(SALES_GEN_AMNT, strRec[6]);
			outMap.set(COMPENSATION, strRec[7]);
			outMap.set(CONT_KEI_NO, strRec[9]);
			
			// コンテンツサービスコードが「050IP電話サービス」の場合
			if (JCNStrConst.CN0011_CONT_SVC_CD_050.equals(strRec[2]))
			{
				// 料金項目コード変換処理
				for (int j = 0; j < retList.size(); j++)
				{
					// コンテンツ項目コードに対応する料金項目コードが存在する場合
// ANK-3636-00-00 MOD START
//					if (j < retListCntCd.size()
//							&& strRec[8].equals(retListCntCd.get(j)))
					if (j < retListCntCd.size()
							&& strRec[8].equals(retListCntCd.get(j))
							&& strRec[10].equals(retTaxRtList.get(j)))
// ANK-3636-00-00 MOD END
					{
//						outMap.set(PRC_KMK_CD, retList.get(j).substring(3, 11));
						outMap.set(PRC_KMK_CD, retList.get(j));
						break;
					}
					
					// コンテンツ項目コードに対応する料金項目コードが存在しない場合
					if (retListCntCd.size() <= j)
					{
//						outMap.set(PRC_KMK_CD, retList.get(j).substring(3, 11));
						outMap.set(PRC_KMK_CD, retList.get(j));
						break;
					}
				}
			}
// ANK-3682-05-00 ADD START
			// コンテンツサービスコードが「eoショッピングモール」の場合
			else if (JCNStrConst.CN0011_CONT_SVC_CD_EO_MALL.equals(strRec[2]))
			{
				// 料金項目コード変換処理
				for (int j = 0; j < retList2.size(); j++)
				{
					// コンテンツ項目コードに対応する料金項目コードが存在する場合
					if (j < retListCntCd2.size()
							&& strRec[8].equals(retListCntCd2.get(j))
							&& strRec[10].equals(retTaxRtList2.get(j)))
					{
						outMap.set(PRC_KMK_CD, retList2.get(j));
						break;
					}
					
					// コンテンツ項目コードに対応する料金項目コードが存在しない場合
					if (retListCntCd2.size() <= j)
					{
						outMap.set(PRC_KMK_CD, retList2.get(j));
						break;
					}
				}
			}
// ANK-3682-05-00 ADD END
			outputItem.addOutMapList(outMap);
		}
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_SYS_PARAM_KNRI.close();
		db_ZM_M_CD_NM_KANRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CN_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムパラメータ分類コード
	 *		 	システムパラメータ適用開始年月日
	 *		 	システムパラメータ適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_SYS_PARAM_KNRI_CN_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_ZM_M_SYS_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_SYS_PARAM_KNRI_CN_SELECT_001);
	}

	/**
	 * SQLKEY(CN_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	コード種別コード
	 *		 	コード区分
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_CD_NM_KANRI_CN_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_M_CD_NM_KANRI.selectBySqlDefine(paramList, ZM_M_CD_NM_KANRI_CN_SELECT_002);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * ファイル読み込み処理を行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で読込ファイルディレクトリ(フルパス)を設定します。<br>
	 *
	 * 2.引数を元にファイル読込を行い、行をListへ格納します。<br>
	 * 
	 * </pre>
	 * <p>
	 * @param strFileDir    出力ディレクトリ(フルパス)。
	 * @return resultList   返却用List
	 * @throws Exception    業務サービス内で発生した例外全般。
	 */
	private static ArrayList<String> readFile(String strFileDir) throws Exception
	{
		ArrayList<String> resultList = new ArrayList<String>();
		
		// 外部出力ファイルパス
		JBSbatInputFileUtil inFile = new JBSbatInputFileUtil(strFileDir);
		inFile.setEncode(JCNStrConst.SJIS);						// 文字コード
		inFile.setLine(JCNStrConst.S_LINE_SEPARAOR_LF);			// 改行コード
		inFile.createReader();
		
		try
		{
			while(true)
			{
				String line = inFile.readLine();
				if(null == line)
				{
					inFile.close();
					break;
				}
				resultList.add(line);
			}
			
			return resultList;
		}
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			inFile.close();
		}
	}
}
