/* @tier medium @module st @transform settlement-online */ /* * st_ol_0002.pgc - 정산대상 접수 집계 (ST_OL_0002) [tier=medium] * * 신규 정산대상 건을 접수(status=R)로 원장에 등록하고, 당일 접수 건수와 * 접수 총액을 재집계하여 응답한다. */ #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "st_core.h" EXEC SQL INCLUDE sqlca; TX_SERVICE(ST_OL_0002, ctx) { EXEC SQL BEGIN DECLARE SECTION; char h_bizdate[9]; long h_daycnt; long h_daysum; EXEC SQL END DECLARE SECTION; st_rec_t rec; char key[16], merch[16], bizdate[16]; long amount = 0, daycnt = 0, daysum = 0; int rc; tx_log(TX_LOG_INFO, "[ST_OL_0002] 정산대상 접수 집계 진입"); if (tx_buf_get(ctx->in, "KEY", key, sizeof(key)) != TX_OK || tx_buf_get(ctx->in, "MERCHID", merch, sizeof(merch)) != TX_OK || tx_buf_get(ctx->in, "BIZDATE", bizdate, sizeof(bizdate)) != TX_OK) { tx_return(ctx, TX_EINVAL, ctx->out); return; } tx_buf_getlong(ctx->in, "AMOUNT", &amount); if (!amount_is_valid(amount) || !date_is_valid(bizdate)) { tx_log(TX_LOG_WARN, "[ST_OL_0002] 입력 검증 실패 amount=%ld date=%s", amount, bizdate); tx_buf_reset(ctx->out); tx_buf_sets(ctx->out, "RESPCODE", RESP_INVALID); tx_return(ctx, TX_EINVAL, ctx->out); return; } /* 접수 등록 (표준 DBIO) 를 트랜잭션 경계 안에서 수행 */ if (tx_begin() != TX_OK) tx_log(TX_LOG_WARN, "[ST_OL_0002] tx_begin 경고"); memset(&rec, 0, sizeof(rec)); strncpy(rec.key, key, sizeof(rec.key) - 1); strncpy(rec.merch_id, merch, sizeof(rec.merch_id) - 1); strncpy(rec.biz_date, bizdate, sizeof(rec.biz_date) - 1); strncpy(rec.status, ST_ST_RECV, sizeof(rec.status) - 1); rec.amount = amount; rec.fee = 0; rc = st_rec_insert(&rec); if (rc != TX_OK) { tx_log(TX_LOG_ERROR, "[ST_OL_0002] 접수 등록 실패 rc=%d(%s)", rc, tx_strerror(rc)); tx_abort(); tx_return(ctx, rc, ctx->out); return; } tx_commit(); /* 당일 접수(status=R) 건수/합계 재집계 (임베디드 집계) */ strncpy(h_bizdate, bizdate, sizeof(h_bizdate) - 1); h_bizdate[sizeof(h_bizdate) - 1] = '\0'; h_daycnt = 0; h_daysum = 0; EXEC SQL SELECT count(*), coalesce(sum(amount), 0) INTO :h_daycnt, :h_daysum FROM st_ledger WHERE biz_date = :h_bizdate AND status = 'R'; if (sqlca.sqlcode == TX_SQL_OK) { daycnt = h_daycnt; daysum = h_daysum; } else if (sqlca.sqlcode != TX_SQL_NOTFOUND) { TX_DBIO_LOG_ERR("SELECT 당일접수집계"); } tx_buf_reset(ctx->out); tx_buf_sets(ctx->out, "RESPCODE", RESP_OK); tx_buf_sets(ctx->out, "KEY", key); tx_buf_setlong(ctx->out, "DAYCNT", daycnt); tx_buf_setlong(ctx->out, "DAYSUM", daysum); tx_log(TX_LOG_INFO, "[ST_OL_0002] 접수완료 key=%s 당일건수=%ld 당일합=%ld", key, daycnt, daysum); tx_return(ctx, TX_OK, ctx->out); }