/* @tier easy @module mm @transform master-online */ /* * mm_ol_0008.pgc - 한도 마스터 변경 서비스 (MM_OL_0008) [tier=easy] * * 가맹점 승인한도(mm_limit)의 일한도/월한도를 변경한다. 일한도가 월한도를 * 초과하지 않도록 검증한 뒤 UPDATE 하고, 변경이력(mm_limit_hist) 에 이전/ * 이후 한도를 남긴다. (CRUD + 이력) */ #include #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "mm_core.h" EXEC SQL INCLUDE sqlca; TX_SERVICE(MM_OL_0008, ctx) { EXEC SQL BEGIN DECLARE SECTION; char h_merch_id[16]; char h_chg_date[9]; long h_new_daily; long h_new_monthly; long h_old_daily; long h_old_monthly; EXEC SQL END DECLARE SECTION; char merch_id[16]; long new_daily = 0; long new_monthly = 0; tx_log(TX_LOG_INFO, "[MM_OL_0008] 한도 마스터 변경 서비스 진입"); if (tx_buf_get(ctx->in, "MERCHID", merch_id, sizeof(merch_id)) != TX_OK) { tx_log(TX_LOG_ERROR, "[MM_OL_0008] MERCHID 누락"); tx_buf_sets(ctx->out, "ERRCODE", "MM0800"); tx_return(ctx, TX_EINVAL, ctx->out); return; } tx_buf_getlong(ctx->in, "DAILYLIMIT", &new_daily); tx_buf_getlong(ctx->in, "MONTHLYLIMIT", &new_monthly); /* 검증: 한도는 양수, 일한도 <= 월한도 */ if (new_daily <= 0 || new_monthly <= 0 || new_daily > new_monthly) { tx_log(TX_LOG_WARN, "[MM_OL_0008] 한도값 오류 일=%ld 월=%ld", new_daily, new_monthly); tx_buf_sets(ctx->out, "ERRCODE", "MM0801"); tx_return(ctx, TX_EINVAL, ctx->out); return; } strncpy(h_merch_id, merch_id, sizeof(h_merch_id) - 1); h_merch_id[sizeof(h_merch_id) - 1] = '\0'; h_new_daily = new_daily; h_new_monthly = new_monthly; date_today(h_chg_date); /* 기존 한도 조회 (존재확인 + 이력용) */ EXEC SQL SELECT daily_limit, monthly_limit INTO :h_old_daily, :h_old_monthly FROM mm_limit WHERE merch_id = :h_merch_id; if (sqlca.sqlcode == TX_SQL_NOTFOUND) { tx_log(TX_LOG_WARN, "[MM_OL_0008] 한도 미등록 merch=%s", merch_id); tx_buf_sets(ctx->out, "ERRCODE", "MM0802"); tx_return(ctx, TX_ENOENT, ctx->out); return; } if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("SELECT mm_limit"); tx_buf_sets(ctx->out, "ERRCODE", "MM0803"); tx_return(ctx, TX_EDB, ctx->out); return; } if (tx_begin() != TX_OK) tx_log(TX_LOG_WARN, "[MM_OL_0008] tx_begin 경고"); EXEC SQL UPDATE mm_limit SET daily_limit = :h_new_daily, monthly_limit = :h_new_monthly, upd_date = :h_chg_date WHERE merch_id = :h_merch_id; if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("UPDATE mm_limit"); tx_abort(); tx_buf_sets(ctx->out, "ERRCODE", "MM0804"); tx_return(ctx, TX_EDB, ctx->out); return; } EXEC SQL INSERT INTO mm_limit_hist (merch_id, old_daily, new_daily, old_monthly, new_monthly, chg_date) VALUES (:h_merch_id, :h_old_daily, :h_new_daily, :h_old_monthly, :h_new_monthly, :h_chg_date); if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("INSERT mm_limit_hist"); tx_abort(); tx_buf_sets(ctx->out, "ERRCODE", "MM0805"); tx_return(ctx, TX_EDB, ctx->out); return; } tx_commit(); tx_buf_reset(ctx->out); tx_buf_sets(ctx->out, "MERCHID", merch_id); tx_buf_setlong(ctx->out, "OLDDAILY", h_old_daily); tx_buf_setlong(ctx->out, "DAILYLIMIT", h_new_daily); tx_buf_setlong(ctx->out, "OLDMONTHLY", h_old_monthly); tx_buf_setlong(ctx->out, "MONTHLYLIMIT", h_new_monthly); tx_buf_sets(ctx->out, "CHGDATE", h_chg_date); tx_buf_sets(ctx->out, "ERRCODE", RESP_OK); tx_log(TX_LOG_INFO, "[MM_OL_0008] 한도변경완료 merch=%s 일=%ld 월=%ld", merch_id, h_new_daily, h_new_monthly); tx_return(ctx, TX_OK, ctx->out); }