#!/bin/bash
##############################################################
# システム名    ：eo顧客基幹システム
#
# サブシステム名：請求収納
#
# シェル名      ：請求情報登録（請求内訳ローダ）
#
# 機能          ：請求内訳情報ファイルを請求内訳スキーマに登録する。(SQL*Loader)
#
#
# コマンド形式  ：EO60102L0J0.sh
#
# 実行環境      ：.../app/shl
#
# 終了ステータス：ゼロ以外異常
#
# 特記事項      ：特になし
#
# 変更履歴      ：変更日      変更者       障害／仕様変更No.
# v4.00           2013/03/18  FJ）広野     性能改善: ワークファイルの取り扱い方法を揃える修正
# v4.01.01        2013/04/08  FJ) 狭間    【ST4-2013-0000286】性能改善の為、アンロード並列化及び処理見直しと水平展開
# v4.02           2013/05/27  FJ）黒木     【TAI-2013-0000027】オラクルユーザ変更等
# v4.03           2013/06/21  FJ) 小柴     【ST4-2013-0000495】SQLローダーに登録する値を編集する処理を追加
# v5.00           2013/07/26  FJ) 狭間     【LT-2013-0000569】ロード処理直前でテーブルトリガーを無効化し、処理後に有効化するよう修正
# v5.01           2013/08/09  FJ) 吉田     【IT1-2013-0001571】ログ出力不具合対応
# v5.02           2013/10/10  FJ）後藤     【ST4-2013-0000586】JOBIDの末尾空白埋め対応
# v5.03           2013/11/12  FJ）伊藤     【ST4-2013-0000595】ロード時、ADD_TRN_IDの末尾空白除去
# v5.04           2013/11/26  FJ）北端     【OM-2013-0004617】不適切なwait文を削除
# v8.00           2013/12/23  FJ) 後藤     【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））＿項目追加
# v15.00          2015/06/04  FJ）小島     【OM-2015-0001160】処理が異常終了した際もインデックスリビルド処理が実行されるよう修正
# 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

# OM-2015-0001160 ADD START
#
#---リターンコード
#
RTN=${G_RTN_NORMAL}
# OM-2015-0001160 ADD END

#
#---業務で必要な変数定義
#
[ $# -eq 2 ] &&TAJUKIDO="_$2" ;
#---ワークファイル削除モード
WK_RM=true ;

#---システム日時取得
. EOK010410J0.sh "1"
SYSDATE=${RSLT_SYSDATE}

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

#---マッチング処理でLeftjoinがNULL時に"を付けなくする（マッチング使用時は必須）
export ZTLQUOTES=''

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

#
#---パラメタ定義
#

P1="OPD=,"
P2="SVCCTL=,"
P3="JOB=EO60102L0J0,"
P4="IND1=,"
P5="INF1=,"
P6="IND2=,"
P7="INF2=,"
P8="OTD1=,"
P9="OTF1=,"
P10="OTD2=,"
P11="OTF2=,"
P12="TABLENAME=,"
P13="SQLKEY=,"
P14="SQLPARAM=,"
P15="ERRFILE=,"
P16="RECOVERY=,"
P17="BREAKPTN=,"
P18="FREE="
PARA="$P1$P2$P3$P4$P5$P6$P7$P8$P9$P10$P11$P12$P13$P14$P15$P16$P17$P18"

sh ${G_TOOLSH}/EOK010210J0.sh CS00027I $JOBNAME

#
#--- ファイル定義
#
#- 差分抽出
#当日分
INFILE1=${MID_DIR_CH}/CHIFM152001.csv
INFILE1_TEMP_0=${MID_DIR_CH}/${JOBNAME}_CHIFM152001_WK_0$TAJUKIDO.csv
INFILE1_TEMP_1=${MID_DIR_CH}/${JOBNAME}_CHIFM152001_WK_1$TAJUKIDO.csv
#当月分
INFILE2=${MID_DIR_CH}/CHIFM152002.csv
INFILE2_TEMP_1=${MID_DIR_CH}/${JOBNAME}_CHIFM152002_WK_1$TAJUKIDO.csv
INFILE2_TEMP_2=${MID_DIR_CH}/${JOBNAME}_CHIFM152002_WK_2$TAJUKIDO.csv
INFILE2_TEMP_3=${MID_DIR_CH}/${JOBNAME}_CHIFM152002_WK_3$TAJUKIDO.csv
INFILE2_TEMP_4=${MID_DIR_CH}/${JOBNAME}_CHIFM152002_WK_4$TAJUKIDO.csv
LOADFILE=${MID_DIR_CH}/${JOBNAME}_CHIFM152_LOAD.csv
CH_T_SEIKY_DEF_1=${G_TOOLSH}/util/def/CH_CM_0015.def
CH_T_SEIKY_DEF_2=${G_TOOLSH}/util/def/CH_CM_0016.def
DEF_FILE_WK1=${G_TOOLSH}/util/def/${JOBNAME}_DEFINE_WK1$TAJUKIDO.def
DEF_FILE_WK2=${G_TOOLSH}/util/def/${JOBNAME}_DEFINE_WK2$TAJUKIDO.def

#- 当月分削除
SQL_FILE=${SQL_DIR}/CH_D_CH0101_01.sql
SQL_FILE_TEMP1=${SQL_DIR}/${JOBNAME}_CH_D_CH0101_01_WK_1$TAJUKIDO.sql
#イベントコード（請求処理日）
EVENT_CD="'04'"
#バッチ運用日
OPEDATE="'${RSLT_OPEDATE}'"
#SQL実行結果ログ
SQL_LOG=${SQL_LOADER_LOG_DIR}/${JOBNAME}_${SYSDATE}.log

#- SQL*Loader
LOG_FILE=${SQL_LOADER_LOG_DIR}/${JOBNAME}_${SYSDATE}.log
BAD_FILE=${SQL_LOADER_BAD_DIR}/${JOBNAME}_${SYSDATE}.bad
LOAD_SCHEMA=CH_T_SEIKY_UCWK

#SQL*Loaderコントロールファイル
SQLCONTROL=${SQL_LOADER_CTL_DIR}/CH_T_SEIKY_UCWK_01.ctl
SQLCONTROL_WK=${SQL_LOADER_CTL_DIR}/${JOBNAME}_CH_T_SEIKY_UCWK_01_WK.ctl

#トリガー名
TRIGGER_NAME=TRG_CH_T_SEIKY_UCWK

#
#--- 入力チェック
#
if [ ! -s ${INFILE1} ]
then
	sh ${G_TOOLSH}/EOK010210J0.sh CS00028I $JOBNAME
	sh ${G_TOOLSH}/EOK010210J0.sh CS00026I $JOBNAME
    exit ${G_RTN_NORMAL}
fi

#
#--- 当日分再編成(CHIFM152001.csv)
#
#- ADD_TRN_ID:EO60102L0J0,UPD_TRN_ID:EO60102L0J0+半角空白23桁を固定値で再編成
#
(
bsortex \
    -copy \
    -input reclen=350 file=${INFILE1} \
    -record recform=txtcsv \
    -output reconst="0.12,1.10,2.6,3.14,4.10,5.2,6.3,7.12,8.11,9.6,10.8,11.8,12.12,13.1,14.17,15.17,16.8,'${SVC}'.11asc,18.8,'${SVC}                       '.34asc,20.END" \
            file=${INFILE1_TEMP_0}
) &
pid_BSORTEX_M152001_1=$!

#
#--- 差分抽出
#
#- 請求番号で集約する。
#
bsort -su -z450 -Tflt -t, -0.12asca -e0.12 -o ${INFILE1_TEMP_1} ${INFILE1}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " Sort1 Error($SVC sort1:rc=$rc) "
    echo $JOBNAME " Sort1 Error($SVC sort1:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

bsort -su -z450 -Tflt -t, -0.12asca -e0.12 -o ${INFILE2_TEMP_4} ${INFILE2}
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " Sort2 Error($SVC sort2:rc=$rc) "
    echo $JOBNAME " Sort2 Error($SVC sort2:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

#- 当月請求内訳情報と当日分請求内訳情報をマッチングする。
#- マッチング用のdefファイルのファイル名変数を実ファイル名に置き換える。
#
cp ${CH_T_SEIKY_DEF_1} ${DEF_FILE_WK1}

sed -i -e "s%:CH_T_SEIKY_TOJITSU%${INFILE1_TEMP_1}%" ${DEF_FILE_WK1}
sed -i -e "s%:CH_T_SEIKY_TOGETSU%${INFILE2_TEMP_4}%" ${DEF_FILE_WK1}

#
#- マッチング
#
ZTLOUTFILE=${INFILE2_TEMP_1}
export ZTLOUTFILE
${G_TOOLSH}/util/bin/ZTLMAT01 ${DEF_FILE_WK1}

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

#
#- CSVマッチングの結果ファイルから2項目目が空のものを抽出する(当日連携されないデータのみ抽出する)
#
bsortex -record recform=txtflt fldsep=, -summary suppress\
    -input reclen=100 file=${INFILE2_TEMP_1} include="01.12asc.lt.'0'" \
    -output file=${INFILE2_TEMP_2} \
    reconst=0.99
    
rc=$?
if [ $rc -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " Sort3 Error($SVC sort3:rc=$rc) "
    echo $JOBNAME " Sort3 Error($SVC sort3:rc=$rc) "
    exit ${G_RTN_ERROR}
fi

#
#- 抽出した請求番号に、内訳情報を付加する。
#- マッチング用のdefファイルのファイル名変数を実ファイル名に置き換える。
#
cp ${CH_T_SEIKY_DEF_2} ${DEF_FILE_WK2}

sed -i -e "s%:CH_T_SEIKY_TOGETSU%${INFILE2}%"    ${DEF_FILE_WK2}
sed -i -e "s%:CH_T_SEIKY_KEY%${INFILE2_TEMP_2}%" ${DEF_FILE_WK2}

#
#- マッチング
#
ZTLOUTFILE=${INFILE2_TEMP_3}
export ZTLOUTFILE
${G_TOOLSH}/util/bin/ZTLMAT01 ${DEF_FILE_WK2}

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

#- 抽出が終了するのを待つ
wait ${pid_BSORTEX_M152001_1}
rc_BSORTEX_M152001_1=$?

#- エラー処理
if [ ${rc_BSORTEX_M152001_1} -ne 0 ]
then
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " BSORTEX ERROR(${INFILE1_TEMP_0}:rc=${rc_BSORTEX_M152001_1}) "
    echo $JOBNAME "BSORTEX ERROR(${INFILE1_TEMP_0}:rc=${rc_BSORTEX_M152001_1}) "
    #- 異常終了
    exit ${G_RTN_ERROR}
fi

#
#- 当日連携されたデータと、上記処理で抽出した内訳情報をマージする。
#
cat ${INFILE1_TEMP_0} ${INFILE2_TEMP_3} > ${LOADFILE}

#
#--- 当月分削除
#
#- 請求年月取得
. EO3SEIKYYM.sh ${EVENT_CD} ${OPEDATE} ${JOBNAME}
PARTITION_NAME=${LOAD_SCHEMA}_PT_${SEIKY_YM}

#シスログメッセージ出力
msgToSyslog() {
        sh ${G_TOOLSH}/EOK010210J0.sh CS00002E ${JOBNAME} "$1"
        exit ${G_RTN_ERROR}
}

#
#--- 環境判定
#
#RESULT=`sqlplus -s  ${ORACLE_OWNER_USER}/${ORACLE_OWNER_PASS}@${SID_S} <<EOF 
RESULT=`sqlplus -s  ${ORACLE_OWNER_USER}/${ORACLE_OWNER_PASS}@${SID_S} <<EOF

whenever oserror exit 127;
whenever sqlerror exit 127;
set head off;
set termout off;
set trims on;

SELECT 
    COUNT(*)
FROM
    USER_PART_TABLES
WHERE
    TABLE_NAME = '${LOAD_SCHEMA}';
exit 0;
EOF`

RTNCD=$?

#オラクルエラー発生時
if [ ${RTNCD} -ne 0 ]
then
    #シスログにメッセージを出力し処理終了
    msgToSyslog "USER_PART_TABLES取得でエラーが発生しました。（TABLE_NAME=CH_T_SEIKY_UCWK）" 
fi

CNT=`echo ${RESULT} |grep -e "[0-9]"`

#- 取得結果 ＝ 0 の場合DELETE
#- 取得結果 ≠ 0 の場合TRUNCATE 
if [ ${CNT} -eq 0 ]
then
    #- バインド変数置換
    cp ${SQL_FILE} ${SQL_FILE_TEMP1}

    sed -i -e "s%:SQL_LOG%${SQL_LOG}%"     ${SQL_FILE_TEMP1}
    sed -i -e "s%:SEIKY_YM%${SEIKY_YM}%"   ${SQL_FILE_TEMP1}
    
    #- DELETE
    sqlplus -s ${ORACLEUSER}/${ORACLEPASS}@${SID_S} @${SQL_FILE_TEMP1} ${JOBNAME}
    
    rc=$?
    if [ $rc -ne 0 ]
    then
        sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " Delete Error($SVC delete:rc=$rc) "
        echo $JOBNAME " Delete Error($SVC delete:rc=$rc) "
        exit ${G_RTN_ERROR}
    fi
else
    #- TRUNCATE
    sh ${G_TOOLSH}/EO3TRNCPT.sh ${LOAD_SCHEMA} ${PARTITION_NAME} ${JOBNAME}
    
    rc=$?
    if [ $rc -ne 0 ]
    then
        sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME " Truncate Error($SVC truncate:rc=$rc) "
        echo $JOBNAME " Truncate Error($SVC truncate:rc=$rc) "
        exit ${G_RTN_ERROR}
    fi
fi


#
#--- SQL*Loader
#

#トリガー無効化
sh ${G_TOOLSH}/EOKSWITCHTRIGGER.sh ${TRIGGER_NAME} DISABLE
rc=$?
if [ $rc -ne 0 ]
then
    ERRMSG=" トリガー無効化に失敗しました：${TRIGGER_NAME}($SVC EOKSWITCHTRIGGER:rc=$rc) "
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME ${ERRMSG}
    echo $JOBNAME ${ERRMSG}
    exit ${G_RTN_ERROR}
fi

#コントロールファイルの編集
cp -f ${SQLCONTROL} ${SQLCONTROL_WK}

sqlldr ${ORACLEUSER}/${ORACLEPASS}@${SID_S},CONTROL=${SQLCONTROL_WK},DATA=${LOADFILE},LOG=${LOG_FILE},BAD=${BAD_FILE}

rc=$?
if [ $rc -ne 0 ]
then
    ERRMSG=" データロードに失敗しました：${LOAD_SCHEMA}($SVC load:rc=$rc) ログを確認してください。ログファイル：${LOG_FILE}、不良ファイル：${BAD_FILE} "
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME ${ERRMSG}
    echo $JOBNAME ${ERRMSG}
# OM-2015-0001160 MOD START
#    exit ${G_RTN_ERROR}
    RTN=${G_RTN_ERROR}
# OM-2015-0001160 MOD END
fi

#トリガー有効化
sh ${G_TOOLSH}/EOKSWITCHTRIGGER.sh ${TRIGGER_NAME} ENABLE
rc=$?
if [ $rc -ne 0 ]
then
    ERRMSG=" トリガー有効化に失敗しました：${TRIGGER_NAME}($SVC EOKSWITCHTRIGGER:rc=$rc) "
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME ${ERRMSG}
    echo $JOBNAME ${ERRMSG}
# OM-2015-0001160 MOD START
#    exit ${G_RTN_ERROR}
    RTN=${G_RTN_ERROR}
# OM-2015-0001160 MOD END
fi

#
#--- インデックスリビルド
#
sh ${G_TOOLSH}/EOKINDEXREBUILD.sh -t ${LOAD_SCHEMA} -m ${IDX_REBUILD_PARALLEL_CNT} -e

rbldrc=$?
if [ $rbldrc -ne 0 ]
then
    ERRMSG=" インデックスの再作成に失敗しました。ログを確認してください。($SVC rebuild:rbldrc=$rbldrc) "
    sh ${G_TOOLSH}/EOK010210J0.sh CS00002E $JOBNAME ${ERRMSG}
    echo $JOBNAME ${ERRMSG}
# OM-2015-0001160 MOD START
#    exit ${G_RTN_ERROR}
    RTN=${G_RTN_ERROR}
# OM-2015-0001160 MOD END
fi

# ワーク削除
if [ ${WK_RM} = "true" ] ;then 
    rm -f ${INFILE1_TEMP_0}
    rm -f ${INFILE1_TEMP_1}
    rm -f ${INFILE2_TEMP_1}
    rm -f ${INFILE2_TEMP_2}
    rm -f ${INFILE2_TEMP_3}
    rm -f ${INFILE2_TEMP_4}
    rm -f ${LOADFILE}
    rm -f ${SQLCONTROL_WK}
    rm -f ${DEF_FILE_WK1}
    rm -f ${DEF_FILE_WK2}
    rm -f ${SQL_FILE_TEMP1}
fi ;

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

# OM-2015-0001160 MOD START
#exit ${G_RTN_NORMAL}
exit ${RTN}
# OM-2015-0001160 MOD END
