/* @tier easy @module cl @transform closing-batch */ /* * cl_bt_0011.pgc - 마감 리포트 배치 (상태별 집계표) [tier=easy] * * 지정 영업일의 상태별(R/M/U/S) 건수와 금액합계를 개별 SELECT 로 조회하여 * 리포트표 형태로 출력한다. 전체 합계와 마감률(S/전체)을 함께 표시한다. * 배치 main 엔트리 포함. * * 실행: cl_bt_0011 [db@host] */ #include #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "cl_core.h" EXEC SQL INCLUDE sqlca; static int query_status_0011(const char *biz_date, const char *status, long *out_cnt, long *out_sum) { EXEC SQL BEGIN DECLARE SECTION; char h_biz_date[9]; char h_status[2]; int h_cnt; long h_sum; EXEC SQL END DECLARE SECTION; strncpy(h_biz_date, biz_date, sizeof(h_biz_date) - 1); h_biz_date[sizeof(h_biz_date) - 1] = '\0'; strncpy(h_status, status, sizeof(h_status) - 1); h_status[sizeof(h_status) - 1] = '\0'; EXEC SQL SELECT count(*), coalesce(sum(amount), 0) INTO :h_cnt, :h_sum FROM cl_ledger WHERE biz_date = :h_biz_date AND status = :h_status; if (sqlca.sqlcode != TX_SQL_OK && sqlca.sqlcode != TX_SQL_NOTFOUND) { TX_DBIO_LOG_ERR("SELECT 상태집계 cl_bt_0011"); return TX_EDB; } *out_cnt = (long)h_cnt; *out_sum = h_sum; return TX_OK; } static int run_cl_bt_0011(const char *biz_date) { static const char *codes[4] = { "R", "M", "U", "S" }; static const char *labels[4] = { "접수(R) ", "완료(M) ", "불일치(U)", "정산(S) " }; long cnt[4], sum[4]; long tot_cnt = 0, tot_sum = 0; int i, pct = 0; char won[32]; for (i = 0; i < 4; i++) { if (query_status_0011(biz_date, codes[i], &cnt[i], &sum[i]) != TX_OK) return TX_EDB; tot_cnt += cnt[i]; tot_sum += sum[i]; } if (tot_cnt > 0) pct = (int)((cnt[3] * 100) / tot_cnt); /* 마감률 = S / 전체 */ tx_log(TX_LOG_INFO, "[cl_bt_0011] 요약 date=%s R=%ld M=%ld U=%ld S=%ld 전체=%ld 마감률=%d%%", biz_date, cnt[0], cnt[1], cnt[2], cnt[3], tot_cnt, pct); printf("========== 마감 리포트 배치 [cl_bt_0011] ==========\n"); printf(" 영업일 : %s\n", biz_date); printf(" ---------------------------------------------\n"); printf(" %-10s %8s %18s\n", "상태", "건수", "금액합계"); printf(" ---------------------------------------------\n"); for (i = 0; i < 4; i++) { amount_format_won(sum[i], won, sizeof(won)); printf(" %-10s %8ld %18s\n", labels[i], cnt[i], won); } amount_format_won(tot_sum, won, sizeof(won)); printf(" ---------------------------------------------\n"); printf(" %-10s %8ld %18s\n", "합계", tot_cnt, won); printf(" 마감률(S/전체) : %d%%\n", pct); printf("=================================================\n"); return TX_OK; } int main(int argc, char **argv) { const char *biz_date; const char *target; int rc; tx_set_loglevel(TX_LOG_INFO); if (argc < 2) { fprintf(stderr, "사용법: %s [db@host]\n", argv[0]); return 2; } biz_date = argv[1]; target = (argc >= 3) ? argv[2] : NULL; if (!date_is_valid(biz_date)) { fprintf(stderr, "오류: 유효하지 않은 영업일 '%s'\n", biz_date); return 2; } tx_log(TX_LOG_INFO, "[cl_bt_0011] 배치 시작 date=%s", biz_date); rc = cl_dbio_connect(target); if (rc != TX_OK) { tx_log(TX_LOG_ERROR, "[cl_bt_0011] DB 접속 실패 rc=%d", rc); return 1; } rc = run_cl_bt_0011(biz_date); cl_dbio_disconnect(); tx_log(TX_LOG_INFO, "[cl_bt_0011] 배치 종료 rc=%d(%s)", rc, tx_strerror(rc)); return (rc == TX_OK) ? 0 : 1; }