#!/bin/bash
##############################################################
# システム名    ：eo顧客基幹システム
#
# サブシステム名：契約管理
#
# シェル名      ：主契約判断対象抽出処理
#
# 機能          ：eo光TV契約データを読み、1サービスで複数STB契約のうち、TVプランの変更があったデータに対して一番高い料金プランには主となる料金設定を行い、
#                 ２台目以降のデータには従となる料金設定を行う。
#
# コマンド形式  ：EO2B00105J0.sh
#
# 実行環境      ：.../app/shl
#
# 終了ステータス：ゼロ以外異常
#
# 特記事項      ：特になし
#
# 変更履歴      ：変更日      変更者       障害／仕様変更No.
# v8.00.01        2014/06/17  FJ)古内      TAI-2014-0000019（ＩＯ分散化）
# v8.00.02        2014/07/22  FAP)古内     ST4-2014-0000043
# v54.00.00       2021/07/27  FJ)寺川      ANK-4069-00-00 バッチ・DBサーバーリプレース対応
#
##############################################################

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

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

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

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

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

#
#---OPD
#
OPD=$1

#
#---業務で必要な変数定義
#
SQL_FILE_U_KK0791_01=${SQL_DIR}/KK_U_KK0791_01.sql

DEF_FILE_KK_CM_0072=${G_TOOLSH}/util/def/KK_CM_0072.def
DEF_FILE_KK_CM_0073=${G_TOOLSH}/util/def/KK_CM_0073.def

# +++++++++++++++++++++ v8.00.02 mod start +++++++++++++++++++++
#UNLOAD_OUTFILE=${MID_DIR_KK}/${JOBNAME}.ULD_TMP.csv
UNLOAD_OUTFILE=${TMP_DIR_KK}/${JOBNAME}.ULD_TMP.csv
# +++++++++++++++++++++ v8.00.02 mod start +++++++++++++++++++++

# +++++++++++++++++++++ v8.00.01 mod start +++++++++++++++++++++
# 別ジョブからの引継ぎファイル（先行ジョブ「EO2090605J」にて出力）
#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
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
# +++++++++++++++++++++ v8.00.01 mod end +++++++++++++++++++++

# 当ジョブで利用するワークファイル
# +++++++++++++++++++++ v8.00.02 mod start +++++++++++++++++++++
#KK0081_CUR_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK0081_CUR.csv
#KK0161_CUR_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK0161_CUR.csv
#KK0081_EXE_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK0081_EXE.csv
#KK0161_EXE_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK0161_EXE.csv
#KK0791_CUR_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK0791_CUR.csv
#KK0791_UCWK_OUTFILE=${MID_DIR_KK}/${JOBNAME}.KK0791_UCWK.csv
KK0081_CUR_OUTFILE=${LOC_DIR_KK}/${JOBNAME}.KK0081_CUR.csv
KK0161_CUR_OUTFILE=${LOC_DIR_KK}/${JOBNAME}.KK0161_CUR.csv
KK0081_EXE_OUTFILE=${LOC_DIR_KK}/${JOBNAME}.KK0081_EXE.csv
KK0161_EXE_OUTFILE=${LOC_DIR_KK}/${JOBNAME}.KK0161_EXE.csv
KK0791_CUR_OUTFILE=${LOC_DIR_KK}/${JOBNAME}.KK0791_CUR.csv
KK0791_UCWK_OUTFILE=${LOC_DIR_KK}/${JOBNAME}.KK0791_UCWK.csv

#MATCH_TMP_OUT_FILE=${MID_DIR_KK}/${JOBNAME}.MATCH_TMP.csv
MATCH_TMP_OUT_FILE=${LOC_DIR_KK}/${JOBNAME}.MATCH_TMP.csv
# +++++++++++++++++++++ v8.00.02 mod end +++++++++++++++++++++
APL_IN_FILE=${MID_DIR_KK}/KKIFM418.csv

##############################################################
# 業務処理
##############################################################
sh ${G_TOOLSH}/EOK010210J0.sh CS00025I $JOBNAME

if [ "${OPD}" = "" ];then
    # 運用日付の前日取得
    . EOK010310J0.sh BDATE DEC 0 0 1
    LASTDATE=`echo $RSLT_OPEDATE`

    # 運用日付取得
    . EOK010310J0.sh BDATE
    OPEDATE=`echo $RSLT_OPEDATE`

    # 運用日付の翌日取得
    . EOK010310J0.sh BDATE ADD 0 0 1
    NEXTDATE=`echo $RSLT_OPEDATE`
else
    # 運用日設定
    OPEDATE=${OPD}

    # 運用日の前日取得
    LASTDATE=`$ORACLE_HOME/bin/sqlplus -s $ORACLEUSER/$ORACLEPASS@$SID_S <<EOF
		SET LINE 10000
		SET PAGESIZE 0
		SET FEED OFF
		SET VERIFY OFF

		SELECT TO_CHAR(TO_DATE('${OPEDATE}', 'yyyymmdd') -1, 'yyyymmdd') FROM dual;
		exit 0;
EOF`

    RTNCD=$?

    #オラクルエラー発生時
    if [ ${RTNCD} -ne 0 ]; then
        #シスログにメッセージを出力し処理終了
        sh ${G_TOOLSH}/EOK010210J0.sh CS00002E ${JOBNAME} "運用日前日取得処理でエラーが発生しました。"
        exit ${G_RTN_ERROR}
    fi

    # 運用日の翌日取得
    NEXTDATE=`$ORACLE_HOME/bin/sqlplus -s $ORACLEUSER/$ORACLEPASS@$SID_S <<EOF
		SET LINE 10000
		SET PAGESIZE 0
		SET FEED OFF
		SET VERIFY OFF

		SELECT TO_CHAR(TO_DATE('${OPEDATE}', 'yyyymmdd') +1, 'yyyymmdd') FROM dual;
		exit 0;
EOF`

    RTNCD=$?

    #オラクルエラー発生時
    if [ ${RTNCD} -ne 0 ]; then
        #シスログにメッセージを出力し処理終了
        sh ${G_TOOLSH}/EOK010210J0.sh CS00002E ${JOBNAME} "運用日前日取得処理でエラーが発生しました。"
        exit ${G_RTN_ERROR}
    fi
fi

#
#--- アンロード関数
#       p1：テーブル名／クエリファイル名
EXEC_UNLOAD()
{
	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
}

#
#--- クエリ編集
#       p1：ＳＱＬ定義ファイル名
#       p2：バインド変数置換文字
EDIT_MATCHING_QUERY()
{
	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
		bind_escape=`echo $bind | sed "s/\//\\\\\\\\\//g"`
		sed -i, -e 0,/#FILE#/s/#FILE#/$bind_escape/ ${MATCHING_QUERY_WORK}
	done
	
	export MATCHING_QUERY_WORK
}

#
#--- マッチング処理
#      p1：出力ファイルパス
#      p2：マッチングクエリファイルパス
EXEC_MATCHING()
{
	# 出力ファイルの初期化
	OUTFILE=$1
	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 $2
	rc=$?
	if [ $rc -ne 0 ]
	then
		sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " matching error($2:rc=$rc) "
		echo $JOBNAME " matching error($2:rc=$rc) "
		exit ${G_RTN_ERROR}
	fi
}

#
#--- 最小ファイルサイズ取得
#       1：最小ファイルサイズが0よりも大きい
#       0：最小ファイルサイズが0
#
GET_MIN_FILESIZE()
{

	MINSIZE=-1
	for bind in $1
	do
		filesize=`cat ${bind} | wc -l`
		
		if [ ${MINSIZE} -eq -1 ]
		then
			MINSIZE=${filesize}
		else
			if [ ${filesize} -lt ${MINSIZE} ]
			then
				MINSIZE=${filesize}
			fi
		fi
	done
	
	if [ ${MINSIZE} -gt 0 ]
	then
		return 1
	else
		return 0
	fi

}

#
# 業務パラメータ（KK_SETP_PRC_GRP_CD）でeo光テレビ主従料金設定対象のグループコードを取得する。
#
SQL_FILE_U_ZM0321_02=${SQL_DIR}/KK_U_ZM0321_02.sql
# +++++++++++++++++++++ v8.00.02 mod start +++++++++++++++++++++
#ZM0321_OUTFILE=${MID_DIR_KK}/${JOBNAME}.ZM0321_OUT.csv
ZM0321_OUTFILE=${TMP_DIR_KK}/${JOBNAME}.ZM0321_OUT.csv
# +++++++++++++++++++++ v8.00.02 mod start +++++++++++++++++++++
WORK_PARAM_ID=KK_SETP_PRC_GRP_CD

EDIT_ULD_QUERY ${SQL_FILE_U_ZM0321_02} "${WORK_PARAM_ID} ${OPEDATE} ${OPEDATE}"
EXEC_UNLOAD ${SQL_WORK_FILE} ${ZM0321_OUTFILE}

read EXECDATE_DQ < ${ZM0321_OUTFILE}

# ダブルクォーテーション削除
WORK_PARAM_VALUE=`echo ${EXECDATE_DQ} | sed -e 's/"//g'`

rm ${ZM0321_OUTFILE}

if [ -z ${WORK_PARAM_VALUE} ]; then
    #シスログにメッセージを出力し処理終了
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E ${JOBNAME} "業務パラメータ参照処理でエラーが発生しました。（WORK_PARAM_ID=${WORK_PARAM_ID}）"
    exit ${G_RTN_ERROR}
fi


# 業務パラメータの編集
END_VALUE="')"
STA_VALUE=".and.(2.2asc.eq.'"
EDIT_VALUE=`echo $WORK_PARAM_VALUE | sed -e s/,/"'.or.2.2asc.eq.'"/`
PARAM_PCRS=`echo ${STA_VALUE}${EDIT_VALUE}${END_VALUE}`

#
#--- KK0791(KK_M_PCRS)データの編集
#
# KK0791(KK_M_PCRS)の全データをアンロード
EDIT_ULD_QUERY ${SQL_FILE_U_KK0791_01} "${OPEDATE}"
EXEC_UNLOAD ${SQL_WORK_FILE} ${UNLOAD_OUTFILE}

# KK0791のカレントデータ取得
#  KK0791のカレント AND 料金コース適用開始年月日 <= 処理日 AND 処理日 <= 料金コース適用終了年月日 AND 料金グループコード IN (業務パラメータ取得値)
#  - SELECT(reconst)項目は以下
#      0 - 0.3  ：料金コースコード
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.2  ：料金グループコード
#      3 - 3.1  ：料金コース種別コード
#      4 - 4.8  ：料金コース適用開始年月日
#      5 - 5.8  ：料金コース適用終了年月日
#      6 - 6.8  ：予約適用年月日
#      7 - 7.1  ：無効フラグ
bsortex -sort key="2.2asc" -record recform=txtcsv -input reclen=100 file=${UNLOAD_OUTFILE} include="4.8asc.le.'${OPEDATE}'.and.5.8asc.ge.'${OPEDATE}'${PARAM_PCRS}" \
  | bsortex -merge key="2.2asc" -record recform=txtcsv -input reclen=100 -summary suppress last -output file=${KK0791_CUR_OUTFILE}

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

# KK0791のカレントデータ取得
#  KK0791のカレント AND 料金コース適用開始年月日 <= 処理日 <= 料金コース適用終了年月日 AND 料金グループコード IN (業務パラメータ取得値) AND 料金コース種別コード = '2'
#  - SELECT(reconst)項目は以下
#      0 - 0.3  ：料金コースコード
#      1 - 1.17 ：世代登録年月日時分秒
#      2 - 2.2  ：料金グループコード
#      3 - 3.1  ：料金コース種別コード
#      4 - 4.8  ：料金コース適用開始年月日
#      5 - 5.8  ：料金コース適用終了年月日
#      6 - 6.8  ：予約適用年月日
#      7 - 7.1  ：無効フラグ
bsortex -sort key="0.3asc" -record recform=txtcsv -input reclen=100 file=${UNLOAD_OUTFILE} include="4.8asc.le.'${OPEDATE}'.and.5.8asc.ge.'${OPEDATE}'.and.3.1asc.eq.'2'${PARAM_PCRS}"  -output file=${KK0791_UCWK_OUTFILE}

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

# KK0081(KK_T_SVC_KEI)の全カレントデータをアンロード
#  - 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  ：無効フラグ
#  KK0081のカレント AND サービス契約ステータス = '100' AND サービスコード = '03'
bsortex -sort key="0.12asc" -record recform=txtcsv -input reclen=300 include="2.3asc.eq.'100'.and.3.2asc.eq.'03'"  -output file=${KK0081_CUR_OUTFILE} < ${KK_U_KK0081_37_OTF}

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

# 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 ：異動区分
#  KK0161のカレント AND サービス契約内訳ステータス IN ('100','210','220','910')
bsortex -sort key="0.12asc" -record recform=txtcsv -input reclen=300 include="2.3asc.eq.'100'.or.2.3asc.eq.'210'.or.2.3asc.eq.'220'.or.2.3asc.eq.'910'"  -output file=${KK0161_CUR_OUTFILE} < ${KK_U_KK0161_07_OTF}

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

# KK0161のカレントデータ（処理対象）取得
#  KK0161のカレント AND サービス契約内訳ステータス NOTIN ('100','910') OR (サービス契約内訳ステータス IN ('100','910') AND 前日運用年月日 <= 登録運用年月日 <= 運用年月日) OR
#                       (サービス開始年月日 < 処理日 AND (プラン開始年月日 = 処理日 OR プラン開始年月日 = 翌日処理日) OR (サービス契約内訳ステータス NOT IN ('910') AND 異動区分 = コース変更)
#  - 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 ：異動区分
CUR_INCLUDE="(2.3asc.eq.'210'.or.2.3asc.eq.'220').or.(11.8asc.ge.'${LASTDATE}'.and.11.8asc.le.'${OPEDATE}'.and.(2.3asc.eq.'100'.or.2.3asc.eq.'910')).or.(6.8asc.lt.'${OPEDATE}'.and.(5.8asc.eq.'${OPEDATE}'.or.5.8asc.eq.'${NEXTDATE}')).or.(2.3asc.ne.'910'.and.12.5asc.eq.'00009')"
bsortex -sort key="0.12asc" -record recform=txtcsv -input reclen=300 include="${CUR_INCLUDE}" < ${KK0161_CUR_OUTFILE} -output file=${KK0161_EXE_OUTFILE}

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

# カレントデータのマッチング実行
#  - SELECT項目は以下
#      0 - 0.10 ：サービス契約番号
#      1 - 1.12 ：サービス契約内訳番号
#      2 - 2.2  ：マージ用区分
EDIT_MATCHING_QUERY ${DEF_FILE_KK_CM_0072} "${KK0081_CUR_OUTFILE} ${KK0791_CUR_OUTFILE} ${KK0161_CUR_OUTFILE} ${KK0791_UCWK_OUTFILE}"
EXEC_MATCHING ${APL_IN_FILE} ${MATCHING_QUERY_WORK}

# ワークファイル削除
rm -f ${UNLOAD_OUTFILE}
rm -f ${KK0161_CUR_OUTFILE}
rm -f ${KK0791_CUR_OUTFILE}
rm -f ${KK0791_UCWK_OUTFILE}

GET_MIN_FILESIZE "${APL_IN_FILE}"
MIN_SIZE=$?
if [ ${MIN_SIZE} -gt 0 ]
then
    # サービス契約に紐づくサービス契約内訳が複数のレコード抽出
    bsortex -merge key="0.10asc" -record recform=txtcsv -input reclen=50 -summary field="2.2asc" < ${APL_IN_FILE} \
      | bsortex -sort key="0.10asc" -record recform=txtcsv -input reclen=50 include="2.2asc.gt.'01'"  -output file=${KK0081_EXE_OUTFILE}

    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

    # マッチング実行
    #  - SELECT項目は以下
    #      0 - 0.10 ：サービス契約番号
    EDIT_MATCHING_QUERY ${DEF_FILE_KK_CM_0073} "${KK0081_EXE_OUTFILE} ${KK0161_EXE_OUTFILE}"
    EXEC_MATCHING ${MATCH_TMP_OUT_FILE} ${MATCHING_QUERY_WORK}

    # マージ実行
    bsortex -merge key="0.10asc" -record recform=txtcsv -input reclen=30 -summary suppress < ${MATCH_TMP_OUT_FILE} -output file=${APL_IN_FILE}

    # ワークファイル削除
    rm ${KK0081_EXE_OUTFILE}
fi

# ワークファイル削除
rm -f ${MATCH_TMP_OUT_FILE}
rm -f ${KK0161_EXE_OUTFILE}
rm -f ${KK0341_CUR_OUTFILE}
rm -f ${KK0081_CUR_OUTFILE}
#
#--- ジョブの終了メッセージを出力する
#
sh ${G_TOOLSH}/EOK010210J0.sh CS00028I $JOBNAME
sh ${G_TOOLSH}/EOK010210J0.sh CS00026I $JOBNAME

exit ${G_RTN_NORMAL}
