Wave E/F: 업무흐름 tpcall 오케스트레이션 + 크로스브랜치 교착 제거

477개 서비스를 tpcall 체인으로 연결하고(2 → 477), 그 과정에서 드러난
런타임 결함들을 실행 검증으로 잡아냈다.

체인 오케스트레이션 (Wave E)
- 매입/승인/정산/지급/대사/원장/마감/마스터/전문 흐름을 모듈 간 tpcall 로 연결
- 호출그래프 553노드 494엣지, 순환 0, SELFCALL 0
- 핵심 경로: ACQUIRE→RECONCILE→SETTLE→ST_MDR→LG_SETTLEPOST (6단, XA 2PC)

런타임 결함 수정 (Wave F) — 정적 게이트로는 잡히지 않던 것들
1. 모듈내 체인 자기교착: 모듈 서버 카피가 1이면 SETTLE→ST_MDR 처럼 같은
   서버로 되돌아오는 호출이 자기 요청을 못 꺼내 TPETIME. 카피 4로 상향.
2. 크로스브랜치 핫로우 교착: 한 글로벌 트랜잭션의 형제 XA 브랜치가 같은 행을
   UPDATE 하면 같은 트랜잭션이라 락이 안 풀려 타임아웃까지 블록된다.
   - mg_channel: 비소유자 96개 서비스의 UPDATE 제거, STAN 은 시퀀스 채번으로
     (실제 전문 스위치 방식). 생애주기 소유자 7개만 UPDATE 유지.
   - lg_merch_bal: ACQ_SETTLELINK 의 LG_SETTLEPOST 다이아몬드 호출 제거.
     교착일 뿐 아니라 같은 정산건이 원장에 이중 전기되는 회계 오류였다.
   - cl_close_log / py_payout / lg_account_bal: CHAIN 마커로 쓰기 소유자 일원화.
     py_payout 건은 피호출자가 호출자의 미커밋 승인을 볼 수 없어 기능적으로도
     동작 불능이었다.
3. cm_log PK 충돌: st 131개 파일이 max(log_id)+1 로 채번해 nextval 을 쓰는
   피호출자와 동일 PK 를 INSERT, 미커밋 인덱스 엔트리에 걸려 블록. 전부
   nextval('cm_log_seq') 로 전환.
4. strncpy 스택 파괴: cmdb_get_param 이 strncpy(out, h_val, 127) 로 항상 128
   바이트를 써서, bizdate[16] 을 넘기는 호출부 133곳이 매번 호출자 스택 112
   바이트를 훼손했다. 인접 ecpg 호스트 변수가 오염돼 서버 카피가 세그폴트.
   DB 락 대기가 0인데 60초 블록되는 증상의 원인. cm_code/py_payout_reject 동일.
5. ACQ_CANCEL→LIMIT_RST 입력계약 불일치: 카드번호를 안 실어 보내 항상 거절.
   승인원장에서 카드를 끌어오고, 무승인 매입은 한도원복을 생략하도록 수정.
6. mgdb_channel_bump_stan: 활동 채널 전체를 한 번에 잠그는 다중행 UPDATE
   (호출자 0인 잠복 지뢰). 시퀀스 채번 + 집계 조회로 교체.

화면
- 기본값을 실존 시드 키로 부팅 시 조회해 덮어쓴다. 기존 플레이스홀더
  (card_limit 에 없는 카드, 8자리 영업일)로는 처리성 화면이 전부 거절당했다.
- 게이트웨이가 단일 스레드 직렬 루프라 기본값 조회도 순차로 수행.

검증 (실측)
- 통합 빌드: modules=11 servers=11 batches=506, error 0
- 도메인: 45 프로세스, 1,466 서비스 AVAIL
- 체인 전수 스모크 477/477 응답, TPETIME/TPEABORT 0건, 최대 530ms
- AUTH: 수정 전 60초 블록→TPEABORT, 수정 후 0.215초 ok:true
- 6단 매입 체인 COMMIT OK, 미결 2PC 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
hyeongwoo 2026-07-21 14:55:49 +00:00
parent 4cede852a0
commit 074d244bba
654 changed files with 36008 additions and 2805 deletions

View file

@ -148,5 +148,42 @@ void MM_ACCT_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_ACCT_REG -> CM_LUHN (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_rc = getl(b, T_RC);
char ch_o_str5[256]; gets_(b, T_STR5, ch_o_str5, sizeof(ch_o_str5));
if (ch_do) {
{ char ch_pn[32]; gets_(b, T_STR3, ch_pn, sizeof(ch_pn));
Bchg(b, T_STR5, 0, ch_pn, 0L); }
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LUHN", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_ACCT_REG] tpcall(CM_LUHN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7161);
Bchg(b, T_MSG, 0, "정산계좌 체크섬 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_ACCT_REG] 계좌 체크섬 연동 rc=%ld", getl(b, T_RC));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR5, 0, ch_o_str5, 0L);
} else {
userlog("[MM_ACCT_REG] 체인 대상 컨텍스트 없음 - CM_LUHN 호출 생략");
}
}
OK(b);
}

View file

@ -152,5 +152,44 @@ void MM_ACCT_VERIFY(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_ACCT_VERIFY -> CM_LUHN (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_str5[256]; gets_(b, T_STR5, ch_o_str5, sizeof(ch_o_str5));
if (ch_do) {
{ char ch_pn[32]; gets_(b, T_STR3, ch_pn, sizeof(ch_pn));
Bchg(b, T_STR5, 0, ch_pn, 0L); }
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LUHN", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_ACCT_VERIFY] tpcall(CM_LUHN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7162);
Bchg(b, T_MSG, 0, "계좌검증 체크섬 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_ACCT_VERIFY] 계좌 체크섬 연동 rc=%ld", getl(b, T_RC));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_STR5, 0, ch_o_str5, 0L);
} else {
userlog("[MM_ACCT_VERIFY] 체인 대상 컨텍스트 없음 - CM_LUHN 호출 생략");
}
}
OK(b);
}

View file

@ -153,5 +153,36 @@ void MM_APPLY_APPROVE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_APPLY_APPROVE -> MM_VALIDATE (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
long ch_o_rc = getl(b, T_RC);
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (ch_mc[0] == 0) { gets_(b, T_KEY1, ch_mc, sizeof(ch_mc));
Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("MM_VALIDATE", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_APPLY_APPROVE] tpcall(MM_VALIDATE) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7104);
Bchg(b, T_MSG, 0, "가맹 신청승인 검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_APPLY_APPROVE] 마스터 검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
setl(b, T_RC, ch_o_rc);
} else {
userlog("[MM_APPLY_APPROVE] 체인 대상 컨텍스트 없음 - MM_VALIDATE 호출 생략");
}
}
OK(b);
}

View file

@ -155,5 +155,44 @@ void MM_APPLY_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_APPLY_REG -> CM_SEQ (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_key1[256]; gets_(b, T_KEY1, ch_o_key1, sizeof(ch_o_key1));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
if (ch_do) {
Bchg(b, T_KEY1, 0, "MM_APPLY", 0L);
Bchg(b, T_STR1, 0, "MM_APPLY_REG", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_SEQ", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_APPLY_REG] tpcall(CM_SEQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7156);
Bchg(b, T_MSG, 0, "가맹신청 채번 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_APPLY_REG] 채번 연동 완료 seq=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_KEY1, 0, ch_o_key1, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
} else {
userlog("[MM_APPLY_REG] 체인 대상 컨텍스트 없음 - CM_SEQ 호출 생략");
}
}
OK(b);
}

View file

@ -119,5 +119,33 @@ void MM_BIN_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_BIN_REG -> VL_BIN (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("VL_BIN", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_BIN_REG] tpcall(VL_BIN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7141);
Bchg(b, T_MSG, 0, "BIN 정합검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_BIN_REG] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
} else {
userlog("[MM_BIN_REG] 체인 대상 컨텍스트 없음 - VL_BIN 호출 생략");
}
}
OK(b);
}

View file

@ -154,5 +154,45 @@ void MM_BIZNO_CHECK(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_BIZNO_CHECK -> CM_CHECKDIGIT (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_count = getl(b, T_COUNT);
long ch_o_rc = getl(b, T_RC);
char ch_o_str2[256]; gets_(b, T_STR2, ch_o_str2, sizeof(ch_o_str2));
if (ch_do) {
{ char ch_bs[32]; gets_(b, T_STR2, ch_bs, sizeof(ch_bs));
if (ch_bs[0] == 0) strcpy(ch_bs, "0000000000");
Bchg(b, T_STR2, 0, ch_bs, 0L); }
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_CHECKDIGIT", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_BIZNO_CHECK] tpcall(CM_CHECKDIGIT) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7163);
Bchg(b, T_MSG, 0, "사업자번호 검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_BIZNO_CHECK] 검증번호 연동 d=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_COUNT, ch_o_count);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR2, 0, ch_o_str2, 0L);
} else {
userlog("[MM_BIZNO_CHECK] 체인 대상 컨텍스트 없음 - CM_CHECKDIGIT 호출 생략");
}
}
OK(b);
}

View file

@ -141,5 +141,39 @@ void MM_CHK_LIMIT(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_CHK_LIMIT -> LIMIT_CHK (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
long ch_o_arg1 = getl(b, T_ARG1);
long ch_o_count = getl(b, T_COUNT);
long ch_o_rc = getl(b, T_RC);
{ char ch_cd[24]; gets_(b, T_KEY1, ch_cd, sizeof(ch_cd)); ch_do = (ch_cd[0] != 0); }
if (ch_do) {
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
if (tpcall("LIMIT_CHK", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_CHK_LIMIT] tpcall(LIMIT_CHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7132);
Bchg(b, T_MSG, 0, "승인한도 점검 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_CHK_LIMIT] 승인한도 연동 완료 rc=%ld", getl(b, T_RC));
setl(b, T_AMOUNT, ch_o_amount);
setl(b, T_ARG1, ch_o_arg1);
setl(b, T_COUNT, ch_o_count);
setl(b, T_RC, ch_o_rc);
} else {
userlog("[MM_CHK_LIMIT] 체인 대상 컨텍스트 없음 - LIMIT_CHK 호출 생략");
}
}
OK(b);
}

View file

@ -119,5 +119,36 @@ void MM_CODE_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_CODE_REG -> VL_CODEVAL (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
char ch_o_str3[256]; gets_(b, T_STR3, ch_o_str3, sizeof(ch_o_str3));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
Bchg(b, T_STR3, 0, "CODE_VALID", 0L);
if (tpcall("VL_CODEVAL", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_CODE_REG] tpcall(VL_CODEVAL) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7145);
Bchg(b, T_MSG, 0, "공통코드 검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_CODE_REG] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
Bchg(b, T_STR3, 0, ch_o_str3, 0L);
} else {
userlog("[MM_CODE_REG] 체인 대상 컨텍스트 없음 - VL_CODEVAL 호출 생략");
}
}
OK(b);
}

View file

@ -155,5 +155,44 @@ void MM_CONTRACT_AMEND(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_CONTRACT_AMEND -> CM_SEQ (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_key1[256]; gets_(b, T_KEY1, ch_o_key1, sizeof(ch_o_key1));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
if (ch_do) {
Bchg(b, T_KEY1, 0, "MM_CONTRACT", 0L);
Bchg(b, T_STR1, 0, "MM_CONTRACT_AMEND", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_SEQ", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_CONTRACT_AMEND] tpcall(CM_SEQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7155);
Bchg(b, T_MSG, 0, "계약변경 채번 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_CONTRACT_AMEND] 채번 연동 완료 seq=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_KEY1, 0, ch_o_key1, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
} else {
userlog("[MM_CONTRACT_AMEND] 체인 대상 컨텍스트 없음 - CM_SEQ 호출 생략");
}
}
OK(b);
}

View file

@ -154,5 +154,44 @@ void MM_CONTRACT_NEW(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_CONTRACT_NEW -> CM_SEQ (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_key1[256]; gets_(b, T_KEY1, ch_o_key1, sizeof(ch_o_key1));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
if (ch_do) {
Bchg(b, T_KEY1, 0, "MM_CONTRACT", 0L);
Bchg(b, T_STR1, 0, "MM_CONTRACT_NEW", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_SEQ", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_CONTRACT_NEW] tpcall(CM_SEQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7153);
Bchg(b, T_MSG, 0, "계약 채번 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_CONTRACT_NEW] 채번 연동 완료 seq=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_KEY1, 0, ch_o_key1, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
} else {
userlog("[MM_CONTRACT_NEW] 체인 대상 컨텍스트 없음 - CM_SEQ 호출 생략");
}
}
OK(b);
}

View file

@ -157,5 +157,46 @@ void MM_CONTRACT_RENEW(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_CONTRACT_RENEW -> CM_SEQ (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_key1[256]; gets_(b, T_KEY1, ch_o_key1, sizeof(ch_o_key1));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_str2[256]; gets_(b, T_STR2, ch_o_str2, sizeof(ch_o_str2));
if (ch_do) {
Bchg(b, T_KEY1, 0, "MM_CONTRACT", 0L);
Bchg(b, T_STR1, 0, "MM_CONTRACT_RENEW", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_SEQ", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_CONTRACT_RENEW] tpcall(CM_SEQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7154);
Bchg(b, T_MSG, 0, "계약갱신 채번 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_CONTRACT_RENEW] 채번 연동 완료 seq=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_KEY1, 0, ch_o_key1, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_STR2, 0, ch_o_str2, 0L);
} else {
userlog("[MM_CONTRACT_RENEW] 체인 대상 컨텍스트 없음 - CM_SEQ 호출 생략");
}
}
OK(b);
}

View file

@ -130,5 +130,36 @@ void MM_FEERATE_SET(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_FEERATE_SET -> ST_MDR (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_fee = getl(b, T_FEE);
if (ch_do) {
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (getl(b, T_FEE) < 0) setl(b, T_FEE, 0);
if (tpcall("ST_MDR", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_FEERATE_SET] tpcall(ST_MDR) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7121);
Bchg(b, T_MSG, 0, "요율 원장반영 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_FEERATE_SET] 요율 원장반영 연동 완료 pid=%ld", getl(b, T_PURCHASE_ID));
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_FEE, ch_o_fee);
} else {
userlog("[MM_FEERATE_SET] 체인 대상 컨텍스트 없음 - ST_MDR 호출 생략");
}
}
OK(b);
}

View file

@ -148,5 +148,37 @@ void MM_GRADE_ADJUST(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_GRADE_ADJUST -> VL_MERCH (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("VL_MERCH", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_GRADE_ADJUST] tpcall(VL_MERCH) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7147);
Bchg(b, T_MSG, 0, "등급조정 가맹점검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_GRADE_ADJUST] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
} else {
userlog("[MM_GRADE_ADJUST] 체인 대상 컨텍스트 없음 - VL_MERCH 호출 생략");
}
}
OK(b);
}

View file

@ -118,5 +118,33 @@ void MM_ISSUER_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_ISSUER_REG -> VL_BIN (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("VL_BIN", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_ISSUER_REG] tpcall(VL_BIN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7142);
Bchg(b, T_MSG, 0, "발급사 BIN 정합검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_ISSUER_REG] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
} else {
userlog("[MM_ISSUER_REG] 체인 대상 컨텍스트 없음 - VL_BIN 호출 생략");
}
}
OK(b);
}

View file

@ -141,5 +141,33 @@ void MM_LIMIT_SET(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_LIMIT_SET -> LIMIT_CHK (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
{ char ch_cd[24]; gets_(b, T_KEY1, ch_cd, sizeof(ch_cd)); ch_do = (ch_cd[0] != 0); }
if (ch_do) {
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
if (tpcall("LIMIT_CHK", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_LIMIT_SET] tpcall(LIMIT_CHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7131);
Bchg(b, T_MSG, 0, "승인한도 연동 점검 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_LIMIT_SET] 승인한도 연동 완료 rc=%ld", getl(b, T_RC));
setl(b, T_AMOUNT, ch_o_amount);
} else {
userlog("[MM_LIMIT_SET] 체인 대상 컨텍스트 없음 - LIMIT_CHK 호출 생략");
}
}
OK(b);
}

View file

@ -123,5 +123,36 @@ void MM_MCC_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MCC_REG -> VL_CODEVAL (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
char ch_o_str3[256]; gets_(b, T_STR3, ch_o_str3, sizeof(ch_o_str3));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
Bchg(b, T_STR3, 0, "MCC_VALID", 0L);
if (tpcall("VL_CODEVAL", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MCC_REG] tpcall(VL_CODEVAL) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7143);
Bchg(b, T_MSG, 0, "MCC 코드검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MCC_REG] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
Bchg(b, T_STR3, 0, ch_o_str3, 0L);
} else {
userlog("[MM_MCC_REG] 체인 대상 컨텍스트 없음 - VL_CODEVAL 호출 생략");
}
}
OK(b);
}

View file

@ -131,5 +131,38 @@ void MM_MCC_UPD(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MCC_UPD -> VL_CODEVAL (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
long ch_o_rc = getl(b, T_RC);
char ch_o_str3[256]; gets_(b, T_STR3, ch_o_str3, sizeof(ch_o_str3));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
Bchg(b, T_STR3, 0, "MCC_VALID", 0L);
if (tpcall("VL_CODEVAL", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MCC_UPD] tpcall(VL_CODEVAL) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7144);
Bchg(b, T_MSG, 0, "MCC 변경검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MCC_UPD] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR3, 0, ch_o_str3, 0L);
} else {
userlog("[MM_MCC_UPD] 체인 대상 컨텍스트 없음 - VL_CODEVAL 호출 생략");
}
}
OK(b);
}

View file

@ -156,5 +156,49 @@ void MM_MERCH_CLOSE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_CLOSE -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_count = getl(b, T_COUNT);
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_MERCH_CLOSE", 0L);
Bchg(b, T_MSG, 0, "가맹점 해지 처리", 0L);
Bchg(b, T_STR1, 0, "MM_MERCH_CLOSE", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_CLOSE] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7112);
Bchg(b, T_MSG, 0, "해지 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_CLOSE] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_COUNT, ch_o_count);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_MERCH_CLOSE] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}

View file

@ -152,5 +152,49 @@ void MM_MERCH_DORMANT(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_DORMANT -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_gross = getl(b, T_GROSS);
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_MERCH_DORMANT", 0L);
Bchg(b, T_MSG, 0, "가맹점 휴면 전환", 0L);
Bchg(b, T_STR1, 0, "MM_MERCH_DORMANT", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_DORMANT] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7115);
Bchg(b, T_MSG, 0, "휴면전환 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_DORMANT] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_GROSS, ch_o_gross);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_MERCH_DORMANT] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}

View file

@ -129,5 +129,35 @@ void MM_MERCH_GRADE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_GRADE -> VL_MERCH (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
char ch_o_str2[256]; gets_(b, T_STR2, ch_o_str2, sizeof(ch_o_str2));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("VL_MERCH", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_GRADE] tpcall(VL_MERCH) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7146);
Bchg(b, T_MSG, 0, "등급변경 가맹점검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_GRADE] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
Bchg(b, T_STR2, 0, ch_o_str2, 0L);
} else {
userlog("[MM_MERCH_GRADE] 체인 대상 컨텍스트 없음 - VL_MERCH 호출 생략");
}
}
OK(b);
}

View file

@ -150,5 +150,49 @@ void MM_MERCH_PAUSE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_PAUSE -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_count = getl(b, T_COUNT);
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_MERCH_PAUSE", 0L);
Bchg(b, T_MSG, 0, "가맹점 일시정지 처리", 0L);
Bchg(b, T_STR1, 0, "MM_MERCH_PAUSE", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_PAUSE] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7113);
Bchg(b, T_MSG, 0, "일시정지 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_PAUSE] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_COUNT, ch_o_count);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_MERCH_PAUSE] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}

View file

@ -136,5 +136,36 @@ void MM_MERCH_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_REG -> MM_VALIDATE (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
char ch_o_status[256]; gets_(b, T_STATUS, ch_o_status, sizeof(ch_o_status));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (ch_mc[0] == 0) { gets_(b, T_KEY1, ch_mc, sizeof(ch_mc));
Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("MM_VALIDATE", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_REG] tpcall(MM_VALIDATE) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7101);
Bchg(b, T_MSG, 0, "가맹점 등록 검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_REG] 마스터 검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
Bchg(b, T_STATUS, 0, ch_o_status, 0L);
} else {
userlog("[MM_MERCH_REG] 체인 대상 컨텍스트 없음 - MM_VALIDATE 호출 생략");
}
}
OK(b);
}

View file

@ -148,5 +148,49 @@ void MM_MERCH_RESUME(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_RESUME -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_count = getl(b, T_COUNT);
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_MERCH_RESUME", 0L);
Bchg(b, T_MSG, 0, "가맹점 거래재개 처리", 0L);
Bchg(b, T_STR1, 0, "MM_MERCH_RESUME", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_RESUME] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7114);
Bchg(b, T_MSG, 0, "재개 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_RESUME] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_COUNT, ch_o_count);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_MERCH_RESUME] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}

View file

@ -128,5 +128,34 @@ void MM_MERCH_STATUS(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_STATUS -> MM_VALIDATE (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (ch_mc[0] == 0) { gets_(b, T_KEY1, ch_mc, sizeof(ch_mc));
Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("MM_VALIDATE", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_STATUS] tpcall(MM_VALIDATE) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7103);
Bchg(b, T_MSG, 0, "가맹점 상태변경 검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_STATUS] 마스터 검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
} else {
userlog("[MM_MERCH_STATUS] 체인 대상 컨텍스트 없음 - MM_VALIDATE 호출 생략");
}
}
OK(b);
}

View file

@ -142,5 +142,34 @@ void MM_MERCH_UPD(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_MERCH_UPD -> MM_VALIDATE (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (ch_mc[0] == 0) { gets_(b, T_KEY1, ch_mc, sizeof(ch_mc));
Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("MM_VALIDATE", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_MERCH_UPD] tpcall(MM_VALIDATE) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7102);
Bchg(b, T_MSG, 0, "가맹점 변경 검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_MERCH_UPD] 마스터 검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
} else {
userlog("[MM_MERCH_UPD] 체인 대상 컨텍스트 없음 - MM_VALIDATE 호출 생략");
}
}
OK(b);
}

View file

@ -157,5 +157,42 @@ void MM_RATE_APPROVE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_RATE_APPROVE -> ST_MDR (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amt1 = getl(b, T_AMT1);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
long ch_o_fee = getl(b, T_FEE);
long ch_o_rc = getl(b, T_RC);
char ch_o_str2[256]; gets_(b, T_STR2, ch_o_str2, sizeof(ch_o_str2));
if (ch_do) {
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (getl(b, T_FEE) < 0) setl(b, T_FEE, 0);
if (tpcall("ST_MDR", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_RATE_APPROVE] tpcall(ST_MDR) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7122);
Bchg(b, T_MSG, 0, "승인요율 원장반영 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_RATE_APPROVE] 요율 원장반영 연동 완료 pid=%ld", getl(b, T_PURCHASE_ID));
setl(b, T_AMT1, ch_o_amt1);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
setl(b, T_FEE, ch_o_fee);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR2, 0, ch_o_str2, 0L);
} else {
userlog("[MM_RATE_APPROVE] 체인 대상 컨텍스트 없음 - ST_MDR 호출 생략");
}
}
OK(b);
}

View file

@ -161,5 +161,49 @@ void MM_RATE_REQ(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_RATE_REQ -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
long ch_o_amt1 = getl(b, T_AMT1);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_RATE_REQ", 0L);
Bchg(b, T_MSG, 0, "가맹점 요율변경 신청", 0L);
Bchg(b, T_STR1, 0, "MM_RATE_REQ", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_RATE_REQ] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7117);
Bchg(b, T_MSG, 0, "요율신청 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_RATE_REQ] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
setl(b, T_AMT1, ch_o_amt1);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_RATE_REQ] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}

View file

@ -156,5 +156,49 @@ void MM_RISK_SCORE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_RISK_SCORE -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
long ch_o_arg1 = getl(b, T_ARG1);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_RISK_SCORE", 0L);
Bchg(b, T_MSG, 0, "가맹점 위험점수 산정", 0L);
Bchg(b, T_STR1, 0, "MM_RISK_SCORE", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_RISK_SCORE] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7116);
Bchg(b, T_MSG, 0, "위험점수 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_RISK_SCORE] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
setl(b, T_ARG1, ch_o_arg1);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_RISK_SCORE] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}

View file

@ -142,5 +142,35 @@ void MM_RISK_SET(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_RISK_SET -> VL_MERCH (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
char ch_o_merchant[256]; gets_(b, T_MERCHANT, ch_o_merchant, sizeof(ch_o_merchant));
long ch_o_rc = getl(b, T_RC);
if (ch_do) {
{ char ch_mc[64]; gets_(b, T_MERCHANT, ch_mc, sizeof(ch_mc));
if (strlen(ch_mc) > 32) { ch_mc[32] = 0; Bchg(b, T_MERCHANT, 0, ch_mc, 0L); } }
if (tpcall("VL_MERCH", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_RISK_SET] tpcall(VL_MERCH) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7148);
Bchg(b, T_MSG, 0, "위험등급 가맹점검증 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_RISK_SET] 정합검증 연동 완료 rc=%ld", getl(b, T_RC));
Bchg(b, T_MERCHANT, 0, ch_o_merchant, 0L);
setl(b, T_RC, ch_o_rc);
} else {
userlog("[MM_RISK_SET] 체인 대상 컨텍스트 없음 - VL_MERCH 호출 생략");
}
}
OK(b);
}

View file

@ -131,5 +131,42 @@ void MM_TERMINAL_REG(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_TERMINAL_REG -> CM_SEQ (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_key1[256]; gets_(b, T_KEY1, ch_o_key1, sizeof(ch_o_key1));
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
if (ch_do) {
Bchg(b, T_KEY1, 0, "MM_TERMINAL", 0L);
Bchg(b, T_STR1, 0, "MM_TERMINAL_REG", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_SEQ", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_TERMINAL_REG] tpcall(CM_SEQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7151);
Bchg(b, T_MSG, 0, "단말 채번 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_TERMINAL_REG] 채번 연동 완료 seq=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_KEY1, 0, ch_o_key1, 0L);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
} else {
userlog("[MM_TERMINAL_REG] 체인 대상 컨텍스트 없음 - CM_SEQ 호출 생략");
}
}
OK(b);
}

View file

@ -142,5 +142,44 @@ void MM_TERM_INSTALL(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_TERM_INSTALL -> CM_SEQ (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_key1[256]; gets_(b, T_KEY1, ch_o_key1, sizeof(ch_o_key1));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
if (ch_do) {
Bchg(b, T_KEY1, 0, "MM_TERMINAL", 0L);
Bchg(b, T_STR1, 0, "MM_TERM_INSTALL", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_SEQ", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_TERM_INSTALL] tpcall(CM_SEQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7152);
Bchg(b, T_MSG, 0, "단말설치 채번 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_TERM_INSTALL] 채번 연동 완료 seq=%ld", getl(b, T_ARG1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_KEY1, 0, ch_o_key1, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
} else {
userlog("[MM_TERM_INSTALL] 체인 대상 컨텍스트 없음 - CM_SEQ 호출 생략");
}
}
OK(b);
}

View file

@ -139,5 +139,47 @@ void MM_VALIDATE(TPSVCINFO *p)
(void)zx_vat; (void)zx_wht; (void)zx_n3;
}
/* ---- 업무 체인: MM_VALIDATE -> CM_LOG (동일 글로벌 트랜잭션 / 별도 XA 브랜치) ----
* 하위 서비스는 별도 XA 브랜치라 상위가 방금 갱신한 미커밋 행이 보이지 않는다.
* 판정에 필요한 값은 전문(T_*)에 실어 전달하고, 상위의 입출력 계약 필드는
* 호출 전 보존 -> 호출 후 복원하여 기존 응답 계약을 그대로 유지한다.
* 체인 실패는 T_RC/T_MSG 설정 후 FAIL 하여 같은 글로벌 트랜잭션을
* 통째로 롤백한다(별도 보상 트랜잭션 불필요). */
{
long ch_rlen = 0;
int ch_do = 1;
long ch_o_amount = getl(b, T_AMOUNT);
char ch_o_bizdate[256]; gets_(b, T_BIZDATE, ch_o_bizdate, sizeof(ch_o_bizdate));
char ch_o_msg[256]; gets_(b, T_MSG, ch_o_msg, sizeof(ch_o_msg));
long ch_o_rc = getl(b, T_RC);
char ch_o_str1[256]; gets_(b, T_STR1, ch_o_str1, sizeof(ch_o_str1));
char ch_o_svcname[256]; gets_(b, T_SVCNAME, ch_o_svcname, sizeof(ch_o_svcname));
if (ch_do) {
Bchg(b, T_SVCNAME, 0, "MM_VALIDATE", 0L);
Bchg(b, T_MSG, 0, "가맹점 마스터 검증 수행", 0L);
Bchg(b, T_STR1, 0, "MM_VALIDATE", 0L);
if (getl(b, T_AMOUNT) < 0) setl(b, T_AMOUNT, 0);
{ char ch_bd[16]; gets_(b, T_BIZDATE, ch_bd, sizeof(ch_bd));
if (strlen(ch_bd) != 10) Bchg(b, T_BIZDATE, 0, "2026-07-19", 0L); }
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &ch_rlen, 0L) < 0) {
userlog("[MM_VALIDATE] tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 7111);
Bchg(b, T_MSG, 0, "검증 이력 적재 체인 실패", 0L);
FAIL(b);
}
/* 하위 결과 반영(참조 로깅) 후 상위 응답 계약 필드 복원 */
userlog("[MM_VALIDATE] 이력 연동 완료 log_id=%ld", getl(b, T_ID1));
setl(b, T_AMOUNT, ch_o_amount);
Bchg(b, T_BIZDATE, 0, ch_o_bizdate, 0L);
Bchg(b, T_MSG, 0, ch_o_msg, 0L);
setl(b, T_RC, ch_o_rc);
Bchg(b, T_STR1, 0, ch_o_str1, 0L);
Bchg(b, T_SVCNAME, 0, ch_o_svcname, 0L);
} else {
userlog("[MM_VALIDATE] 체인 대상 컨텍스트 없음 - CM_LOG 호출 생략");
}
}
OK(b);
}