#!/bin/bash
##############################################################
# システム名    ：eo顧客基幹システム
#
# サブシステム名：契約管理
#
# シェル名      ：対象契約一時金抽出
#
# 機能          ：１．一時金請求年月調整
#（１）料金計算月/直近請求月取得
#・運用日より料金スケジュール定義TBLを参照し、「料金計算月」と直近の「請求月」を取得する。
#
#（２）一時金設定適用月決定
#・契約一時金TBLの料金計算Sへの未連携データを対象に「一時金設定適用月」を元のサービス契約のステータスや各種日付項目の状態により決定する。
#
#（３）中間ファイル KKIFM055「対象契約一時金更新」ファイル出力
#・対象の契約一時金TBLレコードに対して決定した「一時金設定適用月」をセットして中間ファイル KKIFM055「対象契約一時金更新」ファイルを出力する。
#
# コマンド形式  ：EO2090605J0.sh
#
# 実行環境      ：.../app/shl
#
# 終了ステータス：ゼロ以外異常
#
# 特記事項      ：特になし
#
# 変更履歴      ：変更日      変更者       障害／仕様変更No.
# v8.00.01        2014/05/09  FJ)団        OM-2014-0001657（出力ファイルに項目追加）
# v8.00.02        2014/06/17  FJ)古内      TAI-2014-0000019（ＩＯ分散化）
# v10.00.00       2014/10/07  YSK)柿坂     ST4-2014-0000064（アンロード統合対応）
#
##############################################################

##############################################################
# 環境変数定義
##############################################################

#
#---ツール格納場所
#
G_TOOLSH=.

#
#---環境変数定義Shell呼び出し
#
. EOK010110J0.sh

#
#---ＪＯＢ名
#
JOBNAME=`basename $0 | sed -e "s/\.sh//g"`

#
#---サービス（業務プロセス）
#
SVC=$JOBNAME

#
#---OPD
#
OPD=$1

#
#---運用日付取得
#
if [ "${OPD}" = "" ];then
	. EOK010310J0.sh "BDATE"
else
	RSLT_OPEDATE=${OPD}
fi

#
#---業務で必要な変数定義
#
#xxx=xxxxxxx
##############################################################
# 業務処理
##############################################################
sh ${G_TOOLSH}/EOK010210J0.sh CS00025I $JOBNAME

#
#--- アンロード関数
#       p1：テーブル名／クエリファイル名
#       p2：出力ファイル名
EXEC_UNLOAD()
{
	# 出力ファイルの初期化
	cat /dev/null > $2
	
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File cat error($2:rc=$rc)"
		echo $JOBNAME " File cat error($2:rc=$rc)"
		exit ${G_RTN_ERROR}
	fi
	
	# unload(KK_T_CRECARD)
	sh ${G_TOOLSH}/EOKULD02.sh $1 $2
	
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " unload error($2:rc=$rc) "
		echo $JOBNAME " unload error($2:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi
}

#
#--- クエリ編集
#       p1：ＳＱＬ定義ファイル名
#       p2：バインド変数置換文字
EDIT_ULD_QUERY()
{
	SQL_FILE=$1
	SQL_WORK_FILE=${ULD_WORK_DIR}/${JOBNAME}_QUERY.tmp
	cat /dev/null > ${SQL_WORK_FILE}
	
	# SQL定義ファイルの編集
	if [ ! -r ${SQL_FILE} ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File is nonexist(${SQL_FILE}:rc=$rc) "
		echo $JOBNAME " File is nonexist(${SQL_FILE}:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi

	# バインド変数を置き換える
	cat ${SQL_FILE} > ${SQL_WORK_FILE}
	
	for bind in $2
	do
		sed -i, -e 0,/?/s/?/"'"$bind"'"/ ${SQL_WORK_FILE}
	done
	
	export SQL_WORK_FILE
}

FILE_LEN()
{
    # ファイルサイズ出力（運用時は固定で「0」を返却するように変えておくこと。）
	echo "[debug] ファイル行数($1):`cat $1 | wc -l`"
}


#
#--- マッチング処理
#      p1：ＳＱＬ定義ファイル名
#      p2：バインド変数置換文字
#      p3：出力ファイルパス
EXEC_MATCHING()
{
	echo "***************************************** マッチング開始 *****************************************"
	echo "■ マッチング入力情報"
	echo "   マッチングファイル:$1"
	echo "   バインド情報：$2"
	echo "   出力ファイル：$3"
	
	MATCHING_FILE=$1
	MATCHING_QUERY_WORK=${ULD_WORK_DIR}/${JOBNAME}_MATCH_QUERY.tmp
	cat /dev/null > ${MATCHING_QUERY_WORK}
	
	# SQL定義ファイルの編集
	if [ ! -r ${MATCHING_FILE} ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File is nonexist(${MATCHING_FILE}:rc=$rc) "
		echo $JOBNAME " File is nonexist(${MATCHING_FILE}:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi

	# バインド変数を置き換える
	cat ${MATCHING_FILE} > ${MATCHING_QUERY_WORK}
	
	for bind in $2
	do
	    FILE_LEN $bind
		bind_escape=`echo $bind | sed "s/\//\\\\\\\\\//g"`
		sed -i, -e 0,/#FILE#/s/#FILE#/$bind_escape/ ${MATCHING_QUERY_WORK}
	done

	# 出力ファイルの初期化
	OUTFILE=$3
	cat /dev/null > ${OUTFILE}
	
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File cat error(${OUTFILE}:rc=$rc) "
		echo $JOBNAME " File cat error(${OUTFILE}:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi

	# マッチング実行
	export ZTLOUTFILE=${OUTFILE}
	${G_TOOLSH}/util/bin/ZTLMAT01 ${MATCHING_QUERY_WORK}
	
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " matching error(${QUERY_FILE}:rc=$rc)"
		echo $JOBNAME " matching error(${QUERY_FILE}:rc=$rc)"
		exit ${G_RTN_ERROR}
	fi
	FILE_LEN $3
	echo "***************************************** マッチング終了 *****************************************"
}

# アンロードクエリ
# 契約一時金
KK1051_ULD_QUERY=${SQL_DIR}/KK_U_KK1051_02.sql
# 一時金設定
KK1021_ULD_QUERY=${SQL_DIR}/KK_U_KK1021_01.sql

# マッチング定義
KK_CM_0448=${G_TOOLSH}/util/def/KK_CM_0448.def
KK_CM_0449=${G_TOOLSH}/util/def/KK_CM_0449.def
KK_CM_0450=${G_TOOLSH}/util/def/KK_CM_0450.def

# アンロードクエリ
# +++++++++++++++++++++ v10.00.00 del start +++++++++++++++++++
#SQL_FILE_U_KK0081_37=${SQL_DIR}/KK_U_KK0081_37.sql
# +++++++++++++++++++++ v10.00.00 del end +++++++++++++++++++++
SQL_FILE_U_KK0161_07=${SQL_DIR}/KK_U_KK0161_07.sql

# +++++++++++++++++++++ v8.00.02 mod start +++++++++++++++++++++
# 当ジョブで利用且つ、「EO2B00105J」にて利用するファイル
#KK_U_KK0081_37_OTF=${MID_DIR_KK}/KK_U_KK0081_37.csv
#KK_U_KK0161_07_OTF=${MID_DIR_KK}/KK_U_KK0161_07.csv
#
## 当ジョブで利用するワークファイル
#KK1051_OTF=${MID_DIR_KK}/${JOBNAME}.KK1051_ULD.csv
#KK1021_OTF=${MID_DIR_KK}/${JOBNAME}.KK1021_ULD.csv
#KK1051_KOJI=${MID_DIR_KK}/${JOBNAME}.KK1051_KOJI.csv
#KK1051_ICJKN_SETTE=${MID_DIR_KK}/${JOBNAME}.KK1051_ICJKN_SETTE.csv
#KK1051_ELSE=${MID_DIR_KK}/${JOBNAME}.KK1051_ELSE.csv
#
#MATCH_WORK=${MID_DIR_KK}/${JOBNAME}.MATCH_WORK.csv
#TMP_WORK=${MID_DIR_KK}/${JOBNAME}.TMP_WORK.csv

# ジョブを跨るアンロードファイルをLOC_DIRに変更
# 当ジョブで利用且つ、「EO2B00105J」にて利用するファイル
KK_U_KK0081_37_OTF=${LOC_DIR_KK}/KK_U_KK0081_37.csv
KK_U_KK0161_07_OTF=${LOC_DIR_KK}/KK_U_KK0161_07.csv

# 当ジョブで完結するファイルをTMP_DIRに変更
# 当ジョブで利用するワークファイル
KK1051_OTF=${TMP_DIR_KK}/${JOBNAME}.KK1051_ULD.csv
KK1021_OTF=${TMP_DIR_KK}/${JOBNAME}.KK1021_ULD.csv
KK1051_KOJI=${TMP_DIR_KK}/${JOBNAME}.KK1051_KOJI.csv
KK1051_ICJKN_SETTE=${TMP_DIR_KK}/${JOBNAME}.KK1051_ICJKN_SETTE.csv
KK1051_ELSE=${TMP_DIR_KK}/${JOBNAME}.KK1051_ELSE.csv

MATCH_WORK=${TMP_DIR_KK}/${JOBNAME}.MATCH_WORK.csv
TMP_WORK=${TMP_DIR_KK}/${JOBNAME}.TMP_WORK.csv
# +++++++++++++++++++++ v8.00.02 mod end +++++++++++++++++++++

# +++++++++++++++++++++ v10.00.00 add start +++++++++++++++++++
# 統合アンロードファイル
KK0081_COM_OTF=${LOC_DIR_KK}/KKIFM608001.csv
# +++++++++++++++++++++ v10.00.00 add end +++++++++++++++++++++

# アプリ入力ファイル
APL_IN_FILE=${MID_DIR_KK}/KKIFM581001.csv

# ++++++++++++++ v10.00.01 add start ++++++++++++
#
#--- 各ファイルの存在チェックを行う
#

# 統合アンロードファイル
#KK0081_COM_OTF
if [ ! -r $KK0081_COM_OTF ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " File is nonexist($KK0081_COM_OTF) "
    echo $JOBNAME " File is nonexist($KK0081_COM_OTF) "
    exit ${G_RTN_ERROR}
fi
# ++++++++++++++ v10.00.01 add end ++++++++++++++

# +++++++++++++++++++++ v10.00.00 mod start +++++++++++++++++++++
## KK0081(KK_T_SVC_KEI)の全カレントデータをアンロード
##  KK0081のカレント AND サービス契約ステータス = '100' AND サービスコード = '03'
##  - SELECT(reconst)項目は以下
##      0 - 0.10 ：サービス契約番号
##      1 - 1.17 ：世代登録年月日時分秒
##      2 - 2.3  ：サービス契約ステータス
##      3 - 3.2  ：サービスコード
##      4 - 4.2  ：料金グループコード
##      5 - 5.8  ：予約適用年月日
##      6 - 6.1  ：予約適用コード
##      7 - 7.1  ：無効フラグ
#EDIT_ULD_QUERY ${SQL_FILE_U_KK0081_37} "${RSLT_OPEDATE}"
#EXEC_UNLOAD ${SQL_WORK_FILE} ${KK_U_KK0081_37_OTF}

# KK0081の統合アンローダファイル（カレント）から必要な項目を抽出する
#  - SELECT(reconst)項目は以下
#      0 - 0.10   ：サービス契約番号
#      1 - 1.17   ：世代登録年月日時分秒
#      2 - 2.3    ：サービス契約ステータス
#      3 - 4.2    ：サービスコード
#      4 - 8.2    ：料金グループコード
#      5 - 33.8   ：予約適用年月日
#      6 - 35.1   ：予約適用コード
#      7 - 96.1   ：無効フラグ
#      8 - 38.8   ：サービス開始年月日
#      9 - 39.8   ：サービス課金開始年月日
#     10 - 57.8   ：サービス課金終了年月日
#     11 - 58.8   ：サービス解約起算年月日
#     12 - 59.8   ：サービス解約年月日
#     13 - 9.3    ：料金コースコード
#     14 - 10.6   ：料金プランコード
#     15 - 3.10   ：ＳＹＳＩＤ
gawk 'BEGIN {FS=",";OFS=","}
            {print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' ${KK0081_COM_OTF} > ${KK_U_KK0081_37_OTF}
# +++++++++++++++++++++ v10.00.00 mod end +++++++++++++++++++++


# KK0161(KK_T_SVC_KEI_UCWK)の全データをアンロード
# KK0161のカレントデータ取得
#  - SELECT(reconst)項目は以下
#      0 - 0.12 ：サービス契約内訳番号
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.3  ：サービス契約内訳ステータス
#      3 - 3.10 ：サービス契約番号
#      4 - 4.3  ：料金コースコード
#      5 - 5.8  ：プラン開始年月日
#      6 - 6.8  ：サービス開始年月日
#      7 - 7.8  ：予約適用年月日
#      8 - 8.1  ：予約適用コード
#      9 - 9.1  ：無効フラグ
#      10- 10.2 ：マージ用区分
#      11- 11.8 ：登録運用年月日
#      12- 12.5 ：異動区分
EDIT_ULD_QUERY ${SQL_FILE_U_KK0161_07} "${RSLT_OPEDATE}"
EXEC_UNLOAD ${SQL_WORK_FILE} ${KK_U_KK0161_07_OTF}

# 出力ファイルの初期化
cat /dev/null > ${APL_IN_FILE}

# KK1051(KK_T_KICJKN)の対象データをアンロード
EXEC_UNLOAD ${KK1051_ULD_QUERY} ${KK1051_OTF}

# 一時金設定
EXEC_UNLOAD ${KK1021_ULD_QUERY} ${KK1021_OTF}

# サービス契約・サービス契約内訳とマッチング
EXEC_MATCHING ${KK_CM_0448} "${KK1051_OTF} ${KK_U_KK0081_37_OTF} ${KK_U_KK0161_07_OTF}" ${MATCH_WORK}

# 発生起因工事案件有り、一時金設定番号有り、それ以外のファイルに分割する。
bsortex -sort key="0.12asc" -record recform=txtcsv -input reclen=300 \
   -output file=${KK1051_KOJI} case="3.12asc.ne.' '" \
   -output file=${KK1051_ICJKN_SETTE} case="1.12asc.ne.' '" \
   -output file=${KK1051_ELSE} case=other < ${MATCH_WORK} 

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# アプリ入力ファイルに以下の項目順で出力
#  1:契約一時金番号
#  2:一時金設定番号（NULL）
#  3:一時金発生年月日（NULL）
#  4:申込明細番号（NULL）
#  5:サービスコード
#  6:サービス契約番号
#  7:サービス契約ステータス
#  8:サービス契約内訳番号
#  9:サービス契約内訳ステータス
# 10:発生起因工事案件番号（NULL）
# 11:更新年月日時分秒（契約一時金）
# 12:発生コード
# 13:料金グループコード
# 14:サービス開始年月日
# 15:サービス課金開始年月日
# 16:サービス課金終了年月日
# 17:サービス解約起算年月日
# 18:サービス解約年月日
# 19:料金コースコード
# 20:料金プランコード
# 21:サービス開始年月日（サービス契約内訳）
# 22:サービス解約年月日（サービス契約内訳）
# 23:サービス課金開始年月日（サービス契約内訳）
# 24:サービス課金終了年月日（サービス契約内訳）
# 25:サービス解約起算年月日（サービス契約内訳）
# 26:機器提供サービス契約番号（NULL）v8.00.01追加
# 27:オプションサービス契約番号（NULL）v8.00.01追加
#
gawk 'BEGIN {FS=",";OFS=","}
            {print $1,"","","",$8,$3,$9,$5,$10,"",$6,$7,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,"",""}' ${KK1051_ELSE} | perl -pe 's/"//g' > ${APL_IN_FILE}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# 一時金設定で紐付ける、一時金設定・工事案件とマッチング
# アプリ入力ファイルに以下の項目順で出力
#  1:契約一時金番号
#  2:一時金設定番号
#  3:一時金発生年月日
#  4:申込明細番号
#  5:サービスコード
#  6:サービス契約番号
#  7:サービス契約ステータス
#  8:サービス契約内訳番号
#  9:サービス契約内訳ステータス
# 10:発生起因工事案件番号（NULL）
# 11:更新年月日時分秒（契約一時金）
# 12:発生コード
# 13:料金グループコード
# 14:サービス開始年月日
# 15:サービス課金開始年月日
# 16:サービス課金終了年月日
# 17:サービス解約起算年月日
# 18:サービス解約年月日
# 19:料金コースコード
# 20:料金プランコード
# 21:サービス開始年月日（サービス契約内訳）
# 22:サービス解約年月日（サービス契約内訳）
# 23:サービス課金開始年月日（サービス契約内訳）
# 24:サービス課金終了年月日（サービス契約内訳）
# 25:サービス解約起算年月日（サービス契約内訳）
# 26:機器提供サービス契約番号（契約一時金）v8.00.01追加
# 27:オプションサービス契約番号（契約一時金）v8.00.01追加
#
EXEC_MATCHING ${KK_CM_0449} "${KK1051_ICJKN_SETTE} ${KK1021_OTF}" ${MATCH_WORK}
gawk 'BEGIN {FS=",";OFS=","}
            {print $1,$2,$3,$4,$5,$6,$7,$8,$9,"",$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26}' ${MATCH_WORK} | perl -pe 's/"//g' >> ${APL_IN_FILE}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# 発生起因工事案件で紐付ける契約一時金と工事案件でマッチング
# アプリ入力ファイルに以下の項目順で出力
#  1:契約一時金番号
#  2:一時金設定番号（NULL）
#  3:一時金発生年月日（NULL）
#  4:申込明細番号（NULL）
#  5:サービスコード
#  6:サービス契約番号
#  7:サービス契約ステータス
#  8:サービス契約内訳番号
#  9:サービス契約内訳ステータス
# 10:発生起因工事案件番号
# 11:更新年月日時分秒（契約一時金）
# 12:発生コード
# 13:料金グループコード
# 14:サービス開始年月日
# 15:サービス課金開始年月日
# 16:サービス課金終了年月日
# 17:サービス解約起算年月日
# 18:サービス解約年月日
# 19:料金コースコード
# 20:料金プランコード
# 21:サービス開始年月日（サービス契約内訳）
# 22:サービス解約年月日（サービス契約内訳）
# 23:サービス課金開始年月日（サービス契約内訳）
# 24:サービス課金終了年月日（サービス契約内訳）
# 25:サービス解約起算年月日（サービス契約内訳）
# 26:機器提供サービス契約番号（NULL）v8.00.01追加
# 27:オプションサービス契約番号（NULL）v8.00.01追加
#
gawk 'BEGIN {FS=",";OFS=","}
            {print $1,"","","",$8,$3,$9,$5,$10,$4,$6,$7,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,"",""}' ${KK1051_KOJI} | perl -pe 's/"//g' >> ${APL_IN_FILE}

rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    echo $JOBNAME " SORT Error($SVC sort:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

# 一時ファイルの削除
rm -f ${MATCH_WORK}
rm -f ${KK1051_OTF}
rm -f ${KK1051_KOJI}
rm -f ${KK1051_ICJKN_SETTE}
rm -f ${KK1051_ELSE}
rm -f ${KK1021_OTF}
rm -f ${TMP_WORK}

#
#--- ジョブの終了メッセージを出力する
#
sh ${G_TOOLSH}/EOK010210J0.sh CS00026I $JOBNAME

exit ${G_RTN_NORMAL}
