/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatCHKsdAddTgSeikyUcwkCst
 *	ソースファイル名	：JBSbatCHKsdAddTgSeikyUcwkCst.java
 *	作成者				：富士通　
 *	作成日				：2014年07月14日
 *＜機能概要＞
 *　貸倒登録対象情報請求内訳抽出部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v10.00.00	2014/07/14   富士通		新規作成
 *********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM178;
import eo.business.util.file.JBSbatCHIFM231;
import eo.business.util.table.JBSbatCH_M_KSHKM_JUN_TEIGI;
import eo.business.util.table.JBSbatCH_T_SAIKEN;
import eo.business.util.table.JBSbatCH_T_SEIKY_UCWK;
import eo.common.constant.JACStrConst;
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;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatCHKsdAddTgSeikyUcwkCst extends JBSbatBusinessService
{
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** テーブル(請求内訳) */
	private static final String D_TBL_NAME_CH_T_SEIKY_UCWK = "CH_T_SEIKY_UCWK";

	/** SQL定義キー(CH_SELECT_021) */
	private static final String CH_T_SEIKY_UCWK_CH_SELECT_021 = "CH_SELECT_021";

	/** SQL定義キー(CH_SELECT_022) */
	private static final String CH_T_SEIKY_UCWK_CH_SELECT_022 = "CH_SELECT_022";

	/** テーブルアクセスクラス(請求内訳) */
	private JBSbatSQLAccess db_CH_T_SEIKY_UCWK = null;
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/** 処理モード_貸倒登録対象の請求明細の抽出 */
	private static final String KSD_ADD_TG = "0";

	/** 処理モード_貸倒れ対象者の請求明細の抽出 */
	private static final String KSD_TRGTS = "1";

	/** 課税免税区分位置 */
	private static final int KAZEI_HIKAZEI_DIV_IDX = 8;

	/** 消費税区分位置 */
	private static final int TAX_DIV_IDX = 0;

	/** 請求元会社位置 */
	private static final int SIKY_MT_COMP_CD_IDX = 1;

	/** 請求元会社(1桁) KOPT全体 */
	private static final String SIKY_MT_COMP_LAST_DIGIT_0 = "0";
	
	/** 請求元会社コード(KOPT) **/
	private static final String SIKY_MT_COMP_CD_01 = "01";

	/** 料金詳細下1桁(非課税) */
	private static final String PRC_DTL_LAST_DIGIT_5 = "5";

	/** 処理モード */
	private String prcMode = null;

	/** 業務機能識別コード(訂正可能料金項目) */
	private String workKinoSkbCd = null;

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem commonItem バッチ共通パラメータ電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");

		// DBアクセスクラスを生成します
		db_CH_T_SEIKY_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY_UCWK);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */

		// 処理モード取得
		this.prcMode = super.freeItem;

		// 業務パラメータ取得
		// パラメータ取得部品の初期処理
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		// 業務機能識別コード(訂正可能料金項目)取得
		this.workKinoSkbCd = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_TEISE_PSB_PRC);
		// パラメータ取得部品のクローズ処理
		paramUtil.close();

		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][prcMode=" + this.prcMode + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][workKinoSkbCd=" + this.workKinoSkbCd + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	}

	/**
	 * 主処理
	 * 
	 * @param inMap 入力電文
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */

		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// 請求契約番号
		paramList.setValue(inMap.getString(JBSbatCHIFM178.SEIKY_KEI_NO));
		// 債権償却年月日
		if (KSD_ADD_TG.equals(prcMode))
		{
			// 処理モードが 貸倒登録対象の請求明細の抽出 の場合
			paramList.setValue(super.opeDate);
		}
		// 業務機能識別コード
		paramList.setValue(workKinoSkbCd);
		// 料金項目抽出変換適用開始年月日
		paramList.setValue(super.opeDate);
		// 料金項目抽出変換適用終了年月日
		paramList.setValue(super.opeDate);
		// 請求契約番号
		paramList.setValue(inMap.getString(JBSbatCHIFM178.SEIKY_KEI_NO));
		// 債権償却年月日
		if (KSD_ADD_TG.equals(prcMode))
		{
			// 処理モードが 貸倒登録対象の請求明細の抽出 の場合
			paramList.setValue(super.opeDate);
		}
		// 業務機能識別コード
		paramList.setValue(workKinoSkbCd);
		// 料金項目抽出変換適用開始年月日
		paramList.setValue(super.opeDate);
		// 料金項目抽出変換適用終了年月日
		paramList.setValue(super.opeDate);

		if (KSD_ADD_TG.equals(prcMode))
		{
			// 処理モードが 貸倒登録対象の請求明細の抽出 の場合
			executeCH_T_SEIKY_UCWK_CH_SELECT_021(paramList.getList().toArray());

		}
		else if (KSD_TRGTS.equals(prcMode))
		{
			// 処理モードが 貸倒れ対象者の請求明細の抽出 の場合
			executeCH_T_SEIKY_UCWK_CH_SELECT_022(paramList.getList().toArray());
		}
		else
		{
			// 上記以外はシステムエラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0530CE, new String[] { "パラメータが不正です。(パラメータ名:FREE)" });
		}

		// レコード読み込み
		JBSbatCommonDBInterface record = db_CH_T_SEIKY_UCWK.selectNext();

		// 出力共通電文オブジェクト生成/
		JBSbatOutputItem outputItem = new JBSbatOutputItem();

		while (record != null)
		{
			// 取得結果が存在する場合

			// 出力データ編集
			JBSbatServiceInterfaceMap outputMap = makeOutPutMap(record);
			// 出力フラグ設定
			outputMap.setOutFlg(true);
			// ファイル出力
			outputItem.addOutMapList(outputMap);

			// 次レコード取得
			record = db_CH_T_SEIKY_UCWK.selectNext();
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public void terminal() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_CH_T_SEIKY_UCWK.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/**
	 * SQLKEY(CH_SELECT_021)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数でバイント変数を設定します。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * 	 	請求契約番号
	 * 	 	債権償却年月日
	 * 	 	業務機能識別コード
	 * 	 	料金項目抽出変換適用開始年月日
	 * 	 	料金項目抽出変換適用終了年月日
	 * 	 	請求契約番号
	 * 	 	債権償却年月日
	 * 	 	業務機能識別コード
	 * 	 	料金項目抽出変換適用開始年月日
	 * 	 	料金項目抽出変換適用終了年月日
	 * </pre>
	 * <p>
	 * 
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SEIKY_UCWK_CH_SELECT_021(Object[] param) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][executeCH_T_SEIKY_UCWK_CH_SELECT_021]");

		// バイント変数のリストを生成します
		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());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SEIKY_UCWK_CH_SELECT_021][paramList=" + paramList.getList().toString() + "]");

		// DBアクセスを実行します
		db_CH_T_SEIKY_UCWK.selectBySqlDefine(paramList, CH_T_SEIKY_UCWK_CH_SELECT_021);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][executeCH_T_SEIKY_UCWK_CH_SELECT_021]");
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/**
	 * SQLKEY(CH_SELECT_022)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数でバイント変数を設定します。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * 	 	請求契約番号
	 * 	 	業務機能識別コード
	 * 	 	料金項目抽出変換適用開始年月日
	 * 	 	料金項目抽出変換適用終了年月日
	 * 	 	請求契約番号
	 * 	 	業務機能識別コード
	 * 	 	料金項目抽出変換適用開始年月日
	 * 	 	料金項目抽出変換適用終了年月日
	 * </pre>
	 * <p>
	 * 
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_T_SEIKY_UCWK_CH_SELECT_022(Object[] param) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][executeCH_T_SEIKY_UCWK_CH_SELECT_022]");

		// バイント変数のリストを生成します
		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());
		paramList.setValue(param[7].toString());

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SEIKY_UCWK_CH_SELECT_022][paramList=" + paramList.getList().toString() + "]");

		// DBアクセスを実行します
		db_CH_T_SEIKY_UCWK.selectBySqlDefine(paramList, CH_T_SEIKY_UCWK_CH_SELECT_022);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][executeCH_T_SEIKY_UCWK_CH_SELECT_022]");
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * 出力データ編集
	 * 
	 * @param record 抽出結果
	 * @return 編集結果
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatServiceInterfaceMap makeOutPutMap(JBSbatCommonDBInterface record) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutPutMap]");

		// 編集結果
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();

		// 請求契約番号
		outputMap.setString(JBSbatCHIFM231.SEIKY_KEI_NO, record.getString(JBSbatCH_T_SAIKEN.SEIKY_KEI_NO));
		// 債権番号
		outputMap.setString(JBSbatCHIFM231.SAIKEN_NO, record.getString(JBSbatCH_T_SAIKEN.SAIKEN_NO));
		// 処理順
		outputMap.setInt(JBSbatCHIFM231.TRN_JUN, record.getString(JBSbatCH_M_KSHKM_JUN_TEIGI.TRN_JUN));
		// 料金グループコード
		outputMap.setString(JBSbatCHIFM231.PRC_GRP_CD, record.getString(JBSbatCH_T_SEIKY_UCWK.PRC_GRP_CD));
		// 料金コースコード
		outputMap.setString(JBSbatCHIFM231.PCRS_CD, record.getString(JBSbatCH_T_SEIKY_UCWK.PCRS_CD));
		// 料金サービスコード
		outputMap.setString(JBSbatCHIFM231.PRC_SVC_CD, record.getString(JBSbatCH_T_SEIKY_UCWK.PRC_SVC_CD));
		// 料金項目コード
		outputMap.setString(JBSbatCHIFM231.PRC_KMK_CD, record.getString(JBSbatCH_T_SEIKY_UCWK.PRC_KMK_CD));
		// 未収額変換後料金グループコード
		outputMap.setString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_GRP_CD, record.getString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_GRP_CD));
		// 未収額変換後料金コースコード
		outputMap.setString(JBSbatCHIFM231.MISHU_AMNT_CHG_PCRS_CD, record.getString(JBSbatCHIFM231.MISHU_AMNT_CHG_PCRS_CD));
		// 未収額変換後料金サービスコード
		outputMap.setString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_SVC_CD, record.getString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_SVC_CD));
		// 未収額変換後料金項目コード
		outputMap.setString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_KMK_CD, record.getString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_KMK_CD));
		// 債権年月
		outputMap.setString(JBSbatCHIFM231.SAIKEN_YM, record.getString(JBSbatCH_T_SAIKEN.SAIKEN_YM));
		// 請求種別コード
		outputMap.setString(JBSbatCHIFM231.SEIKY_SBT_CD, record.getString(JBSbatCH_T_SAIKEN.SEIKY_SBT_CD));
		// 課税免税区分
		outputMap.setString(JBSbatCHIFM231.KAZEI_HIKAZEI_DIV, getKazeiHikazeiDiv(record));
		// 消費税区分
		outputMap.setString(JBSbatCHIFM231.TAX_DIV, getTaxDiv(record));
		// 請求元会社コード
		outputMap.setString(JBSbatCHIFM231.SIKY_MT_COMP_CD, getSikyMtCompCd(record));
		// 金額
		outputMap.setBigDecimal(JBSbatCHIFM231.AMNT, record.getString(JBSbatCH_T_SEIKY_UCWK.AMNT));

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutPutMap]");
		return outputMap;
	}

	/**
	 * 課税免税区分取得
	 * 
	 * @param record 抽出結果
	 * @return 課税免税区分
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getKazeiHikazeiDiv(JBSbatCommonDBInterface record) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKazeiHikazeiDiv]");

		// 未収額変換後料金項目コードの9桁目(料金詳細下1桁)
		String prcKmkCd = record.getString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_KMK_CD);

		if (prcKmkCd == null || prcKmkCd.trim().length() == 0)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0530CE, new String[] { "課税免税区分が取得できません。" });
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKazeiHikazeiDiv]");
		return prcKmkCd.substring(KAZEI_HIKAZEI_DIV_IDX, KAZEI_HIKAZEI_DIV_IDX + 1);
	}

	/**
	 * 消費税区分取得
	 * 
	 * @param record 抽出結果
	 * @return 消費税区分
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getTaxDiv(JBSbatCommonDBInterface record) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTaxDiv]");

		// 未収額変換後料金項目コードの1桁目(消費税区分)を設定。ただし、課税免税区分が「非課税：5」の場合は、" "半角スペース１桁に変換する。
		String prcKmkCd = record.getString(JBSbatCHIFM231.MISHU_AMNT_CHG_PRC_KMK_CD);

		if (prcKmkCd == null || prcKmkCd.trim().length() == 0)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0530CE, new String[] { "消費税区分が取得できません。" });
		}

		if (PRC_DTL_LAST_DIGIT_5.equals(getKazeiHikazeiDiv(record)))
		{
			return JACStrConst.SPACE_1;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTaxDiv]");
		return prcKmkCd.substring(TAX_DIV_IDX, TAX_DIV_IDX + 1);
	}

	/**
	 * 請求元会社コード取得
	 * 
	 * @param record 抽出結果
	 * @return 請求元会社コード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getSikyMtCompCd(JBSbatCommonDBInterface record) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSikyMtCompCd]");

		// "0"＋請求内訳．料金項目コードの2桁目を設定。ただし、料金項目コードの2桁目が"0"の場合は"1"に変換する（KOPT：01）。
		String prcKmkCd = record.getString(JBSbatCH_M_KSHKM_JUN_TEIGI.PRC_KMK_CD);

		if (prcKmkCd == null || prcKmkCd.trim().length() == 0)
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0530CE, new String[] { "請求元会社コードが取得できません。" });
		}

		String sikyMtCompCd = prcKmkCd.substring(SIKY_MT_COMP_CD_IDX, SIKY_MT_COMP_CD_IDX + 1);
		if (SIKY_MT_COMP_LAST_DIGIT_0.equals(sikyMtCompCd))
		{
			return SIKY_MT_COMP_CD_01;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSikyMtCompCd]");
		return SIKY_MT_COMP_LAST_DIGIT_0 + sikyMtCompCd;
	}
}
