/* 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/cm_ol_0020.pgc" /* @tier medium @module cm @transform common-online */ /* * cm_ol_0020.pgc - 금액 한글 표기 서비스 (CM_OL_0020) [tier=medium] * * 요청의 금액(AMOUNT)을 만/억/조 단위 절(節)로 분해하여 한글 금액표기 * (예: 123000000 -> "일억이천삼백만")로 변환하여 응답한다. 증서/전표 * 출력용 변환 서비스. 변환 결과는 증서 발급 감사이력(cm_amt_hangeul_log) * 에 적재하여 발급 근거로 남긴다. (ATMI void SVC(TPSVCINFO*) 대응) */ #include #include #include "txcore.h" #include "txcore_dbio.h" #include "acq_util.h" #include "cm_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 18 "app/online/cm_ol_0020.pgc" /* 0~9999 한 절(節)을 천/백/십 단위 한글로 변환하여 out 에 누적 */ static void hangeul_group(int val, char *out, int outlen) { static const char *DIG[10] = { "", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구" }; static const char *POS[4] = { "", "십", "백", "천" }; int unit[4]; int i; unit[3] = (val / 1000) % 10; unit[2] = (val / 100) % 10; unit[1] = (val / 10) % 10; unit[0] = val % 10; for (i = 3; i >= 0; i--) { if (unit[i] == 0) continue; /* 십/백/천 자리의 '일'은 관용상 생략 (예: 15 -> 십오) */ if (!(unit[i] == 1 && i > 0)) strncat(out, DIG[unit[i]], outlen - strlen(out) - 1); strncat(out, POS[i], outlen - strlen(out) - 1); } } TX_SERVICE(CM_OL_0020, ctx) { static const char *GUNIT[4] = { "", "만", "억", "조" }; /* exec sql begin declare section */ #line 50 "app/online/cm_ol_0020.pgc" long h_amount ; #line 51 "app/online/cm_ol_0020.pgc" char h_hangeul [ 128 ] ; /* exec sql end declare section */ #line 52 "app/online/cm_ol_0020.pgc" char hangeul[128]; char won_fmt[48]; long amount = 0; long n; long logged = 0; int neg = 0; int groups[4]; int i; tx_log(TX_LOG_INFO, "[CM_OL_0020] 금액 한글 표기 서비스 진입"); if (tx_buf_getlong(ctx->in, "AMOUNT", &amount) != TX_OK) { tx_log(TX_LOG_ERROR, "[CM_OL_0020] AMOUNT 누락"); tx_return(ctx, TX_EINVAL, ctx->out); return; } hangeul[0] = '\0'; n = amount; if (n < 0) { neg = 1; n = -n; } if (n == 0) { strncpy(hangeul, "영", sizeof(hangeul) - 1); } else { /* 4자리 절 단위 분해: 일/만/억/조 (조 단위까지 지원) */ for (i = 0; i < 4; i++) { groups[i] = (int)(n % 10000); n /= 10000; } for (i = 3; i >= 0; i--) { if (groups[i] == 0) continue; hangeul_group(groups[i], hangeul, sizeof(hangeul)); strncat(hangeul, GUNIT[i], sizeof(hangeul) - strlen(hangeul) - 1); } } strncat(hangeul, "원", sizeof(hangeul) - strlen(hangeul) - 1); if (neg) { char tmp[128]; snprintf(tmp, sizeof(tmp), "마이너스%s", hangeul); strncpy(hangeul, tmp, sizeof(hangeul) - 1); hangeul[sizeof(hangeul) - 1] = '\0'; } /* 교차표시용: 콤마 구분 숫자표기 */ amount_format_won(amount, won_fmt, sizeof(won_fmt)); /* 변환 결과 증서 감사이력 적재 */ h_amount = amount; strncpy(h_hangeul, hangeul, sizeof(h_hangeul) - 1); h_hangeul[sizeof(h_hangeul) - 1] = '\0'; if (tx_begin() != TX_OK) { tx_log(TX_LOG_WARN, "[CM_OL_0020] tx_begin 경고"); } else { { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into cm_amt_hangeul_log ( amount , hangeul_txt , conv_ts ) values ( $1 , $2 , now ( ) )", ECPGt_long,&(h_amount),(long)1,(long)1,sizeof(long), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_char,(h_hangeul),(long)128,(long)1,(128)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);} #line 112 "app/online/cm_ol_0020.pgc" if (sqlca.sqlcode != TX_SQL_OK) { TX_DBIO_LOG_ERR("CM_OL_0020 INSERT cm_amt_hangeul_log"); tx_abort(); } else { logged = (long)sqlca.sqlerrd[2]; tx_commit(); } } tx_buf_reset(ctx->out); tx_buf_setlong(ctx->out, "AMOUNT", amount); tx_buf_sets(ctx->out, "HANGEUL", hangeul); tx_buf_sets(ctx->out, "WON", won_fmt); tx_buf_setlong(ctx->out, "LOGGED", logged); tx_log(TX_LOG_INFO, "[CM_OL_0020] 변환완료 amount=%ld -> %s", amount, hangeul); tx_return(ctx, TX_OK, ctx->out); }