/* Processed by ecpg (15.18 (Debian 15.18-0+deb12u1)) */ /* These include files are added by the preprocessor */ #include #include #include /* End of automatic include section */ #line 1 "app/online/ac_ol_0001.pgc" /* @tier easy @module ac @transform acquire-online */ /* * ac_ol_0001.pgc - 매입 상태조회 서비스 (AC_OL_0001) [tier=easy] * * 처리키(KEY)로 ac_ledger 를 단건조회하여 상태/금액/수수료/가맹점번호를 * 반환한다. 상태코드는 화면 표시용 한글 라벨로 매핑하여 함께 내려준다. */ #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "ac_core.h" #line 1 "/usr/include/postgresql/sqlca.h" #ifndef POSTGRES_SQLCA_H #define POSTGRES_SQLCA_H #ifndef PGDLLIMPORT #if defined(WIN32) || defined(__CYGWIN__) #define PGDLLIMPORT __declspec (dllimport) #else #define PGDLLIMPORT #endif /* __CYGWIN__ */ #endif /* PGDLLIMPORT */ #define SQLERRMC_LEN 150 #ifdef __cplusplus extern "C" { #endif struct sqlca_t { char sqlcaid[8]; long sqlabc; long sqlcode; struct { int sqlerrml; char sqlerrmc[SQLERRMC_LEN]; } sqlerrm; char sqlerrp[8]; long sqlerrd[6]; /* Element 0: empty */ /* 1: OID of processed tuple if applicable */ /* 2: number of rows processed */ /* after an INSERT, UPDATE or */ /* DELETE statement */ /* 3: empty */ /* 4: empty */ /* 5: empty */ char sqlwarn[8]; /* Element 0: set to 'W' if at least one other is 'W' */ /* 1: if 'W' at least one character string */ /* value was truncated when it was */ /* stored into a host variable. */ /* * 2: if 'W' a (hopefully) non-fatal notice occurred */ /* 3: empty */ /* 4: empty */ /* 5: empty */ /* 6: empty */ /* 7: empty */ char sqlstate[5]; }; struct sqlca_t *ECPGget_sqlca(void); #ifndef POSTGRES_ECPG_INTERNAL #define sqlca (*ECPGget_sqlca()) #endif #ifdef __cplusplus } #endif #endif #line 16 "app/online/ac_ol_0001.pgc" TX_SERVICE(AC_OL_0001, ctx) { /* exec sql begin declare section */ #line 21 "app/online/ac_ol_0001.pgc" char h_key [ 16 ] ; #line 22 "app/online/ac_ol_0001.pgc" char h_status [ 2 ] ; #line 23 "app/online/ac_ol_0001.pgc" char h_merch_id [ 16 ] ; #line 24 "app/online/ac_ol_0001.pgc" char h_card_no [ 20 ] ; #line 25 "app/online/ac_ol_0001.pgc" char h_biz_date [ 9 ] ; #line 26 "app/online/ac_ol_0001.pgc" long h_amount ; #line 27 "app/online/ac_ol_0001.pgc" long h_fee ; /* exec sql end declare section */ #line 28 "app/online/ac_ol_0001.pgc" char key[16]; char status_nm[16]; char amount_won[32]; char card_masked[20]; char settle_due[9]; size_t clen; long peer_cnt; tx_log(TX_LOG_INFO, "[AC_OL_0001] 매입 상태조회 서비스 진입"); if (tx_buf_get(ctx->in, "KEY", key, sizeof(key)) != TX_OK) { tx_log(TX_LOG_ERROR, "[AC_OL_0001] KEY 누락"); tx_return(ctx, TX_EINVAL, ctx->out); return; } strncpy(h_key, key, sizeof(h_key) - 1); h_key[sizeof(h_key) - 1] = '\0'; { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select status , amount , fee , merch_id , card_no , biz_date from ac_ledger where key = $1 ", ECPGt_char,(h_key),(long)16,(long)1,(16)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_char,(h_status),(long)2,(long)1,(2)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_long,&(h_amount),(long)1,(long)1,sizeof(long), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_long,&(h_fee),(long)1,(long)1,sizeof(long), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_char,(h_merch_id),(long)16,(long)1,(16)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_char,(h_card_no),(long)20,(long)1,(20)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_char,(h_biz_date),(long)9,(long)1,(9)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} #line 52 "app/online/ac_ol_0001.pgc" if (sqlca.sqlcode == TX_SQL_NOTFOUND) { tx_log(TX_LOG_WARN, "[AC_OL_0001] 대상 없음 key=%s", key); tx_return(ctx, TX_ENOENT, ctx->out); return; } if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("SELECT ac_ledger"); tx_return(ctx, TX_EDB, ctx->out); return; } if (strcmp(h_status, AC_ST_RECV) == 0) { strncpy(status_nm, "접수", sizeof(status_nm) - 1); } else if (strcmp(h_status, AC_ST_DONE) == 0) { strncpy(status_nm, "처리완료", sizeof(status_nm) - 1); } else if (strcmp(h_status, AC_ST_FAIL) == 0) { strncpy(status_nm, "불일치", sizeof(status_nm) - 1); } else if (strcmp(h_status, AC_ST_SETTLED) == 0) { strncpy(status_nm, "정산완료", sizeof(status_nm) - 1); } else { strncpy(status_nm, "알수없음", sizeof(status_nm) - 1); } status_nm[sizeof(status_nm) - 1] = '\0'; /* 카드번호 뒷자리 마스킹 (앞 6자리만 노출) */ clen = strlen(h_card_no); strncpy(card_masked, h_card_no, sizeof(card_masked) - 1); card_masked[sizeof(card_masked) - 1] = '\0'; if (clen > 6) { size_t j; for (j = 6; j < clen && j < sizeof(card_masked) - 1; j++) card_masked[j] = '*'; } /* 접수 상태면 정산예정일(다음 영업일)을 함께 안내 */ settle_due[0] = '\0'; if (strcmp(h_status, AC_ST_RECV) == 0) { if (date_next_business(h_biz_date, settle_due) != 0) settle_due[0] = '\0'; } amount_format_won(h_amount, amount_won, sizeof(amount_won)); /* 참고정보: 동일 영업일/동일 상태 건수 (표준 DBIO 재사용) */ peer_cnt = ac_rec_count(h_biz_date, h_status); if (peer_cnt < 0) { tx_log(TX_LOG_WARN, "[AC_OL_0001] 동일상태 건수조회 실패 rc=%ld", peer_cnt); peer_cnt = 0; } tx_buf_reset(ctx->out); tx_buf_sets(ctx->out, "KEY", key); tx_buf_sets(ctx->out, "MERCHID", h_merch_id); tx_buf_sets(ctx->out, "CARDNO", card_masked); tx_buf_setlong(ctx->out, "AMOUNT", h_amount); tx_buf_sets(ctx->out, "AMOUNTWON", amount_won); tx_buf_setlong(ctx->out, "FEE", h_fee); tx_buf_sets(ctx->out, "STATUS", h_status); tx_buf_sets(ctx->out, "STATUSNM", status_nm); tx_buf_sets(ctx->out, "BIZDATE", h_biz_date); tx_buf_setlong(ctx->out, "PEERCNT", peer_cnt); if (settle_due[0] != '\0') tx_buf_sets(ctx->out, "SETTLEDUE", settle_due); tx_log(TX_LOG_INFO, "[AC_OL_0001] 조회완료 key=%s status=%s(%s) amount=%ld 동일상태건수=%ld", key, h_status, status_nm, h_amount, peer_cnt); tx_return(ctx, TX_OK, ctx->out); }