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

@ -118,6 +118,33 @@ void VL_AMOUNT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_AMOUNT", 0L);
userlog("VL_AMOUNT: 금액 검증결과 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_AMOUNT: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9020); Bchg(b, T_MSG, 0, "금액 검증결과 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_AMOUNT: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -144,6 +144,37 @@ void VL_ANOMALY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_ANOMALY", 0L);
if (v_metric < 3) {
userlog("VL_ANOMALY: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_ANOMALY: 이상거래 탐지 연계 연계 -> FRAUD_DETECT pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("FRAUD_DETECT", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_ANOMALY: tpcall(FRAUD_DETECT) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9051); Bchg(b, T_MSG, 0, "이상거래 탐지 연계 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_ANOMALY: FRAUD_DETECT 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -144,6 +144,33 @@ void VL_APPRAMT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_APPRAMT", 0L);
userlog("VL_APPRAMT: 승인금액 검증결과 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_APPRAMT: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9012); Bchg(b, T_MSG, 0, "승인금액 검증결과 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_APPRAMT: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -116,6 +116,37 @@ void VL_APPRNOPUR(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_APPRNOPUR", 0L);
if (v_flag == 0) {
userlog("VL_APPRNOPUR: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_APPRNOPUR: 승인이력 대조 연계 -> AUTH_HISTORY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("AUTH_HISTORY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_APPRNOPUR: tpcall(AUTH_HISTORY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9013); Bchg(b, T_MSG, 0, "승인이력 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_APPRNOPUR: AUTH_HISTORY 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,33 @@ void VL_APPR_ACQ(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_APPR_ACQ", 0L);
userlog("VL_APPR_ACQ: 승인-매입 검증결과 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_APPR_ACQ: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9011); Bchg(b, T_MSG, 0, "승인-매입 검증결과 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_APPR_ACQ: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_AXPURAPPR(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_AXPURAPPR", 0L);
userlog("VL_AXPURAPPR: 매입-승인 축 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_AXPURAPPR: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9016); Bchg(b, T_MSG, 0, "매입-승인 축 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_AXPURAPPR: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_AXSETTPAY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_AXSETTPAY", 0L);
userlog("VL_AXSETTPAY: 정산-지급 축 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_AXSETTPAY: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9024); Bchg(b, T_MSG, 0, "정산-지급 축 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_AXSETTPAY: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -137,6 +137,37 @@ void VL_BALANCE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_BALANCE", 0L);
if (v_flag == 0) {
userlog("VL_BALANCE: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_BALANCE: 잔액 정합성 대조 연계 -> LG_BALCHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_BALCHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_BALANCE: tpcall(LG_BALCHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9044); Bchg(b, T_MSG, 0, "잔액 정합성 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_BALANCE: LG_BALCHK 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -113,6 +113,33 @@ void VL_BATCH_CHK(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_BATCH_CHK", 0L);
userlog("VL_BATCH_CHK: 배치 검증결과 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_BATCH_CHK: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9019); Bchg(b, T_MSG, 0, "배치 검증결과 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_BATCH_CHK: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,41 @@ void VL_BIN(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_BIN", 0L);
userlog("VL_BIN: BIN 자릿수 Luhn 검증 연계 -> CM_LUHN pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LUHN", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_BIN: tpcall(CM_LUHN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9062); Bchg(b, T_MSG, 0, "BIN 자릿수 Luhn 검증 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_BIN: CM_LUHN 이상 회신 rc=%ld", c_sub);
userlog("VL_BIN: BIN 라우팅 조회 연계 -> BIN_ROUTE_INQ pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("BIN_ROUTE_INQ", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_BIN: tpcall(BIN_ROUTE_INQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9063); Bchg(b, T_MSG, 0, "BIN 라우팅 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_BIN: BIN_ROUTE_INQ 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_CARD(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_CARD", 0L);
userlog("VL_CARD: 카드번호 Luhn 검증 연계 -> CM_LUHN pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LUHN", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_CARD: tpcall(CM_LUHN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9061); Bchg(b, T_MSG, 0, "카드번호 Luhn 검증 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_CARD: CM_LUHN 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,49 @@ void VL_CROSSCHK(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_CROSSCHK", 0L);
userlog("VL_CROSSCHK: 승인 축 조회 연계 -> AUTH_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("AUTH_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_CROSSCHK: tpcall(AUTH_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9030); Bchg(b, T_MSG, 0, "승인 축 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_CROSSCHK: AUTH_STATUS 이상 회신 rc=%ld", c_sub);
userlog("VL_CROSSCHK: 정산 축 조회 연계 -> ST_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("ST_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_CROSSCHK: tpcall(ST_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9031); Bchg(b, T_MSG, 0, "정산 축 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_CROSSCHK: ST_STATUS 이상 회신 rc=%ld", c_sub);
userlog("VL_CROSSCHK: 원장 축 조회 연계 -> LG_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_CROSSCHK: tpcall(LG_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9032); Bchg(b, T_MSG, 0, "원장 축 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_CROSSCHK: LG_STATUS 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -136,6 +136,37 @@ void VL_DAYLIMIT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DAYLIMIT", 0L);
if (v_metric < 3) {
userlog("VL_DAYLIMIT: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_DAYLIMIT: 일한도 확인 연계 -> LIMIT_CHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LIMIT_CHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DAYLIMIT: tpcall(LIMIT_CHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9093); Bchg(b, T_MSG, 0, "일한도 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DAYLIMIT: LIMIT_CHK 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -143,6 +143,41 @@ void VL_DUP(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUP", 0L);
if (v_flag == 0) {
userlog("VL_DUP: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_DUP: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_DUP: 중복거래 대사 확인 연계 -> RC_DUPCHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_DUPCHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUP: tpcall(RC_DUPCHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9071); Bchg(b, T_MSG, 0, "중복거래 대사 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUP: RC_DUPCHK 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,37 @@ void VL_DUPAPPR(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUPAPPR", 0L);
if (v_flag == 0) {
userlog("VL_DUPAPPR: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_DUPAPPR: 승인 요약 대조 연계 -> AUTH_SUMMARY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("AUTH_SUMMARY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUPAPPR: tpcall(AUTH_SUMMARY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9075); Bchg(b, T_MSG, 0, "승인 요약 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUPAPPR: AUTH_SUMMARY 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,41 @@ void VL_DUPAUTH(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUPAUTH", 0L);
if (v_flag == 0) {
userlog("VL_DUPAUTH: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_DUPAUTH: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_DUPAUTH: 중복승인 미매칭 대사 연계 -> RC_UNMATCH pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_UNMATCH", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUPAUTH: tpcall(RC_UNMATCH) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9072); Bchg(b, T_MSG, 0, "중복승인 미매칭 대사 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUPAUTH: RC_UNMATCH 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -137,6 +137,37 @@ void VL_DUPLEDGR(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUPLEDGR", 0L);
if (v_flag == 0) {
userlog("VL_DUPLEDGR: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_DUPLEDGR: 원장 중복 스캔 연계 -> LG_DUPSCAN pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_DUPSCAN", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUPLEDGR: tpcall(LG_DUPSCAN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9076); Bchg(b, T_MSG, 0, "원장 중복 스캔 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUPLEDGR: LG_DUPSCAN 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,41 @@ void VL_DUPPAY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUPPAY", 0L);
if (v_flag == 0) {
userlog("VL_DUPPAY: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_DUPPAY: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_DUPPAY: 중복지급 대사 확인 연계 -> RC_DUPCHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_DUPCHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUPPAY: tpcall(RC_DUPCHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9074); Bchg(b, T_MSG, 0, "중복지급 대사 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUPPAY: RC_DUPCHK 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -137,6 +137,33 @@ void VL_DUPPURCH(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUPPURCH", 0L);
userlog("VL_DUPPURCH: 중복매입 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUPPURCH: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9028); Bchg(b, T_MSG, 0, "중복매입 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUPPURCH: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -142,6 +142,41 @@ void VL_DUPSETTLE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_DUPSETTLE", 0L);
if (v_flag == 0) {
userlog("VL_DUPSETTLE: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_DUPSETTLE: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_DUPSETTLE: 중복정산 미매칭 대사 연계 -> RC_UNMATCH pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_UNMATCH", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_DUPSETTLE: tpcall(RC_UNMATCH) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9073); Bchg(b, T_MSG, 0, "중복정산 미매칭 대사 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_DUPSETTLE: RC_UNMATCH 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -113,6 +113,41 @@ void VL_EXPIRY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_EXPIRY", 0L);
userlog("VL_EXPIRY: 카드번호 유효성 선검증 연계 -> CM_LUHN pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LUHN", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_EXPIRY: tpcall(CM_LUHN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9064); Bchg(b, T_MSG, 0, "카드번호 유효성 선검증 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_EXPIRY: CM_LUHN 이상 회신 rc=%ld", c_sub);
userlog("VL_EXPIRY: 카드 유효기간 확인 연계 -> CARD_EXPIRE_CHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CARD_EXPIRE_CHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_EXPIRY: tpcall(CARD_EXPIRE_CHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9065); Bchg(b, T_MSG, 0, "카드 유효기간 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_EXPIRY: CARD_EXPIRE_CHK 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,33 @@ void VL_FEE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_FEE", 0L);
userlog("VL_FEE: 수수료 검증결과 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_FEE: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9021); Bchg(b, T_MSG, 0, "수수료 검증결과 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_FEE: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,33 @@ void VL_FEERECALC(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_FEERECALC", 0L);
userlog("VL_FEERECALC: 수수료 재계산 라운딩 대조 연계 -> CM_AMT_ROUND pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_AMT_ROUND", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_FEERECALC: tpcall(CM_AMT_ROUND) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9095); Bchg(b, T_MSG, 0, "수수료 재계산 라운딩 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_FEERECALC: CM_AMT_ROUND 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
v_step = 8;

View file

@ -136,6 +136,33 @@ void VL_FORMAT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_FORMAT", 0L);
userlog("VL_FORMAT: 번호형식 체크디지트 검증 연계 -> CM_LUHN pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LUHN", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_FORMAT: tpcall(CM_LUHN) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9066); Bchg(b, T_MSG, 0, "번호형식 체크디지트 검증 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_FORMAT: CM_LUHN 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -137,6 +137,33 @@ void VL_FXCHK(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_FXCHK", 0L);
userlog("VL_FXCHK: 적용환율 유효성 확인 연계 -> CM_FX_VALID pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_FX_VALID", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_FXCHK: tpcall(CM_FX_VALID) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9023); Bchg(b, T_MSG, 0, "적용환율 유효성 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_FXCHK: CM_FX_VALID 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
v_step = 8;

View file

@ -113,6 +113,37 @@ void VL_LEDGBAL(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_LEDGBAL", 0L);
if (v_flag == 0) {
userlog("VL_LEDGBAL: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_LEDGBAL: 원장 잔액 대조 연계 -> LG_BALCHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_BALCHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_LEDGBAL: tpcall(LG_BALCHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9043); Bchg(b, T_MSG, 0, "원장 잔액 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_LEDGBAL: LG_BALCHK 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -143,6 +143,33 @@ void VL_LEDGENTRY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_LEDGENTRY", 0L);
userlog("VL_LEDGENTRY: 원장 전표 조회 연계 -> LG_INQUIRY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_INQUIRY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_LEDGENTRY: tpcall(LG_INQUIRY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9096); Bchg(b, T_MSG, 0, "원장 전표 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_LEDGENTRY: LG_INQUIRY 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -139,6 +139,33 @@ void VL_LEDGER(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_LEDGER", 0L);
userlog("VL_LEDGER: 원장 검증결과 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_LEDGER: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9017); Bchg(b, T_MSG, 0, "원장 검증결과 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_LEDGER: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -142,6 +142,37 @@ void VL_LIMIT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_LIMIT", 0L);
if (v_metric < 3) {
userlog("VL_LIMIT: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_LIMIT: 한도 확인 연계 -> LIMIT_CHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LIMIT_CHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_LIMIT: tpcall(LIMIT_CHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9091); Bchg(b, T_MSG, 0, "한도 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_LIMIT: LIMIT_CHK 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_MDRRATE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_MDRRATE", 0L);
userlog("VL_MDRRATE: 가맹점 요율표 조회 연계 -> ST_RATECARD pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("ST_RATECARD", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_MDRRATE: tpcall(ST_RATECARD) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9094); Bchg(b, T_MSG, 0, "가맹점 요율표 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_MDRRATE: ST_RATECARD 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,41 @@ void VL_NEGBAL(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_NEGBAL", 0L);
if (v_flag == 0) {
userlog("VL_NEGBAL: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_NEGBAL: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_NEGBAL: 음수잔액 대사예외 등록 연계 -> RC_EXCEPTION pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_EXCEPTION", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_NEGBAL: tpcall(RC_EXCEPTION) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9045); Bchg(b, T_MSG, 0, "음수잔액 대사예외 등록 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_NEGBAL: RC_EXCEPTION 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -117,6 +117,41 @@ void VL_NEGFEE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_NEGFEE", 0L);
if (v_flag == 0) {
userlog("VL_NEGFEE: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_NEGFEE: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_NEGFEE: 음수수수료 대사예외 등록 연계 -> RC_EXCEPTION pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_EXCEPTION", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_NEGFEE: tpcall(RC_EXCEPTION) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9047); Bchg(b, T_MSG, 0, "음수수수료 대사예외 등록 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_NEGFEE: RC_EXCEPTION 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,41 @@ void VL_NEGNET(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_NEGNET", 0L);
if (v_flag == 0) {
userlog("VL_NEGNET: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_NEGNET: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_NEGNET: 음수정산액 대사예외 등록 연계 -> RC_EXCEPTION pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_EXCEPTION", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_NEGNET: tpcall(RC_EXCEPTION) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9046); Bchg(b, T_MSG, 0, "음수정산액 대사예외 등록 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_NEGNET: RC_EXCEPTION 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,37 @@ void VL_NIGHTTXN(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_NIGHTTXN", 0L);
if (v_metric < 3) {
userlog("VL_NIGHTTXN: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_NIGHTTXN: 심야거래 룰 평가 연계 -> FRAUD_RULE_NIGHT pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("FRAUD_RULE_NIGHT", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_NIGHTTXN: tpcall(FRAUD_RULE_NIGHT) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9055); Bchg(b, T_MSG, 0, "심야거래 룰 평가 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_NIGHTTXN: FRAUD_RULE_NIGHT 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
v_step = 8;

View file

@ -112,6 +112,37 @@ void VL_OUTLIER(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_OUTLIER", 0L);
if (v_metric < 3) {
userlog("VL_OUTLIER: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_OUTLIER: 이상치 부정탐지 연계 연계 -> FRAUD_DETECT pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("FRAUD_DETECT", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_OUTLIER: tpcall(FRAUD_DETECT) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9053); Bchg(b, T_MSG, 0, "이상치 부정탐지 연계 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_OUTLIER: FRAUD_DETECT 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
v_step = 8;

View file

@ -112,6 +112,37 @@ void VL_OVERLIMIT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_OVERLIMIT", 0L);
if (v_metric < 3) {
userlog("VL_OVERLIMIT: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_OVERLIMIT: 한도 초과 확인 연계 -> LIMIT_CHK pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LIMIT_CHK", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_OVERLIMIT: tpcall(LIMIT_CHK) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9092); Bchg(b, T_MSG, 0, "한도 초과 확인 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_OVERLIMIT: LIMIT_CHK 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -117,6 +117,37 @@ void VL_PURNOAPPR(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_PURNOAPPR", 0L);
if (v_flag == 0) {
userlog("VL_PURNOAPPR: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_PURNOAPPR: 무승인 매입 승인이력 대조 연계 -> AUTH_HISTORY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("AUTH_HISTORY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_PURNOAPPR: tpcall(AUTH_HISTORY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9014); Bchg(b, T_MSG, 0, "무승인 매입 승인이력 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_PURNOAPPR: AUTH_HISTORY 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,33 @@ void VL_REFINTEG(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_REFINTEG", 0L);
userlog("VL_REFINTEG: 원장 참조 조회 연계 -> LG_INQUIRY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_INQUIRY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_REFINTEG: tpcall(LG_INQUIRY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9081); Bchg(b, T_MSG, 0, "원장 참조 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_REFINTEG: LG_INQUIRY 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -111,6 +111,33 @@ void VL_RIAPPR(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RIAPPR", 0L);
userlog("VL_RIAPPR: 승인 상태 조회 연계 -> AUTH_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("AUTH_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RIAPPR: tpcall(AUTH_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9015); Bchg(b, T_MSG, 0, "승인 상태 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RIAPPR: AUTH_STATUS 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_RICANCEL(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RICANCEL", 0L);
userlog("VL_RICANCEL: 취소 상태 조회 연계 -> CANCEL_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CANCEL_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RICANCEL: tpcall(CANCEL_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9086); Bchg(b, T_MSG, 0, "취소 상태 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RICANCEL: CANCEL_STATUS 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -111,6 +111,33 @@ void VL_RIFX(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RIFX", 0L);
userlog("VL_RIFX: 환율 참조 조회 연계 -> CM_FX_CONV pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_FX_CONV", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RIFX: tpcall(CM_FX_CONV) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9087); Bchg(b, T_MSG, 0, "환율 참조 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RIFX: CM_FX_CONV 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -111,6 +111,33 @@ void VL_RIINSTALL(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RIINSTALL", 0L);
userlog("VL_RIINSTALL: 할부 원승인 조회 연계 -> PREAUTH_INQ pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("PREAUTH_INQ", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RIINSTALL: tpcall(PREAUTH_INQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9088); Bchg(b, T_MSG, 0, "할부 원승인 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RIINSTALL: PREAUTH_INQ 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_RILEDGER(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RILEDGER", 0L);
userlog("VL_RILEDGER: 원장 상태 조회 연계 -> LG_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RILEDGER: tpcall(LG_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9085); Bchg(b, T_MSG, 0, "원장 상태 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RILEDGER: LG_STATUS 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -117,6 +117,33 @@ void VL_RIMERCH(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RIMERCH", 0L);
userlog("VL_RIMERCH: 가맹점 코드 조회 연계 -> CM_CODE pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_CODE", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RIMERCH: tpcall(CM_CODE) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9082); Bchg(b, T_MSG, 0, "가맹점 코드 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RIMERCH: CM_CODE 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -116,6 +116,33 @@ void VL_RIPAY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RIPAY", 0L);
userlog("VL_RIPAY: 지급 원장 조회 대조 연계 -> LG_INQUIRY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("LG_INQUIRY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RIPAY: tpcall(LG_INQUIRY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9025); Bchg(b, T_MSG, 0, "지급 원장 조회 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RIPAY: LG_INQUIRY 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -117,6 +117,33 @@ void VL_RIPURCH(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RIPURCH", 0L);
userlog("VL_RIPURCH: 매입 원승인 조회 연계 -> AUTH_HISTORY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("AUTH_HISTORY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RIPURCH: tpcall(AUTH_HISTORY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9083); Bchg(b, T_MSG, 0, "매입 원승인 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RIPURCH: AUTH_HISTORY 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,33 @@ void VL_RISETTLE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RISETTLE", 0L);
userlog("VL_RISETTLE: 정산 상태 조회 연계 -> ST_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("ST_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RISETTLE: tpcall(ST_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9084); Bchg(b, T_MSG, 0, "정산 상태 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RISETTLE: ST_STATUS 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -111,6 +111,33 @@ void VL_RITAXINV(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_RITAXINV", 0L);
userlog("VL_RITAXINV: 세금계산서 부가세 명세 대조 연계 -> ST_VATDETAIL pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("ST_VATDETAIL", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_RITAXINV: tpcall(ST_VATDETAIL) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9089); Bchg(b, T_MSG, 0, "세금계산서 부가세 명세 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_RITAXINV: ST_VATDETAIL 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -139,6 +139,41 @@ void VL_SALES(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SALES", 0L);
if (v_flag == 0) {
userlog("VL_SALES: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_SALES: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_SALES: 매출 검증위반 대사예외 등록 연계 -> RC_EXCEPTION pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_EXCEPTION", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SALES: tpcall(RC_EXCEPTION) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9041); Bchg(b, T_MSG, 0, "매출 검증위반 대사예외 등록 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SALES: RC_EXCEPTION 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -138,6 +138,41 @@ void VL_SETTLE(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SETTLE", 0L);
if (v_flag == 0) {
userlog("VL_SETTLE: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_SETTLE: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_SETTLE: 정산 검증위반 대사예외 등록 연계 -> RC_EXCEPTION pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_EXCEPTION", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SETTLE: tpcall(RC_EXCEPTION) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9042); Bchg(b, T_MSG, 0, "정산 검증위반 대사예외 등록 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SETTLE: RC_EXCEPTION 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,37 @@ void VL_SPIKEAMT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SPIKEAMT", 0L);
if (v_metric < 3) {
userlog("VL_SPIKEAMT: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_SPIKEAMT: 금액 급증 룰 평가 연계 -> FRAUD_RULE_AMT pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("FRAUD_RULE_AMT", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SPIKEAMT: tpcall(FRAUD_RULE_AMT) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9054); Bchg(b, T_MSG, 0, "금액 급증 룰 평가 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SPIKEAMT: FRAUD_RULE_AMT 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
v_step = 8;

View file

@ -138,6 +138,33 @@ void VL_STATUS_CHK(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_STATUS_CHK", 0L);
userlog("VL_STATUS_CHK: 공통 상태코드 대조 연계 -> CM_STATUS pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_STATUS", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_STATUS_CHK: tpcall(CM_STATUS) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9018); Bchg(b, T_MSG, 0, "공통 상태코드 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_STATUS_CHK: CM_STATUS 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,33 @@ void VL_SUMFEECHK(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SUMFEECHK", 0L);
userlog("VL_SUMFEECHK: 수수료합계 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SUMFEECHK: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9022); Bchg(b, T_MSG, 0, "수수료합계 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SUMFEECHK: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -136,6 +136,33 @@ void VL_SUMGROSS(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SUMGROSS", 0L);
userlog("VL_SUMGROSS: 총액합계 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SUMGROSS: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9026); Bchg(b, T_MSG, 0, "총액합계 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SUMGROSS: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -136,6 +136,33 @@ void VL_SUMRECON(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SUMRECON", 0L);
userlog("VL_SUMRECON: 합계대사 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SUMRECON: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9029); Bchg(b, T_MSG, 0, "합계대사 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SUMRECON: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -136,6 +136,33 @@ void VL_SUMTXNCNT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SUMTXNCNT", 0L);
userlog("VL_SUMTXNCNT: 건수합계 검증 감사적재 연계 -> CM_LOG pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("CM_LOG", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SUMTXNCNT: tpcall(CM_LOG) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9027); Bchg(b, T_MSG, 0, "건수합계 검증 감사적재 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SUMTXNCNT: CM_LOG 이상 회신 rc=%ld", c_sub);
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -143,6 +143,37 @@ void VL_SUSPACT(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SUSPACT", 0L);
if (v_flag == 0) {
userlog("VL_SUSPACT: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
userlog("VL_SUSPACT: 위험도 조회 연계 -> RISK_SCORE_INQ pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RISK_SCORE_INQ", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SUSPACT: tpcall(RISK_SCORE_INQ) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9057); Bchg(b, T_MSG, 0, "위험도 조회 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SUSPACT: RISK_SCORE_INQ 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -116,6 +116,41 @@ void VL_SUSPESCAL(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_SUSPESCAL", 0L);
if (v_flag == 0) {
userlog("VL_SUSPESCAL: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_SUSPESCAL: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_SUSPESCAL: 의심거래 대사 상향 연계 -> RC_ESCALATE pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_ESCALATE", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_SUSPESCAL: tpcall(RC_ESCALATE) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9058); Bchg(b, T_MSG, 0, "의심거래 대사 상향 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_SUSPESCAL: RC_ESCALATE 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -120,6 +120,37 @@ void VL_THRESHOLD(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_THRESHOLD", 0L);
if (v_metric < 3) {
userlog("VL_THRESHOLD: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_THRESHOLD: 임계 초과 부정탐지 연계 연계 -> FRAUD_DETECT pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("FRAUD_DETECT", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_THRESHOLD: tpcall(FRAUD_DETECT) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9052); Bchg(b, T_MSG, 0, "임계 초과 부정탐지 연계 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_THRESHOLD: FRAUD_DETECT 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);

View file

@ -112,6 +112,37 @@ void VL_VELOCITY(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_VELOCITY", 0L);
if (v_metric < 3) {
userlog("VL_VELOCITY: 임계 미달 — 후속 연계 생략 base=%ld thr=%ld", v_base, v_thr);
} else {
userlog("VL_VELOCITY: 일별 속도(빈도) 대조 연계 -> VELOCITY_DAY pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("VELOCITY_DAY", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_VELOCITY: tpcall(VELOCITY_DAY) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9056); Bchg(b, T_MSG, 0, "일별 속도(빈도) 대조 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_VELOCITY: VELOCITY_DAY 이상 회신 rc=%ld", c_sub);
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
v_step = 8;

View file

@ -112,6 +112,41 @@ void VL_ZERONET(TPSVCINFO *p)
}
v_step = 7;
/* --- 7-1) 후속 업무 체인(tpcall) — CHAIN-BEGIN ---------------------
* 검증 결과를 후속 업무 서비스로 연계한다. 하위는 다른 XA 브랜치라
* 이 브랜치의 미커밋 행이 보이지 않으므로 판단값은 전문(T_*)으로 넘기고,
* 최종 응답(T_RC/1차 산출)은 아래 응답부·원 처리부가 재확정한다. --- */
{
long c_rlen = 0, c_sub = 0, c_keep = getl(b, T_RC);
long c_pid = getl(b, T_PURCHASE_ID);
char c_date[16];
gets_(b, T_BIZDATE, c_date, sizeof(c_date));
if (c_date[0] == 0 && v_bizdate[0]) {
strncpy(c_date, v_bizdate, sizeof(c_date) - 1);
c_date[sizeof(c_date) - 1] = 0;
Bchg(b, T_BIZDATE, 0, c_date, 0L);
}
setl(b, T_ARG2, v_flag); setl(b, T_AMT1, v_base); setl(b, T_AMT3, v_thr);
Bchg(b, T_SVCNAME, 0, "VL_ZERONET", 0L);
if (v_flag == 0) {
userlog("VL_ZERONET: 위반 없음 — 후속 연계 생략 metric=%ld", v_metric);
} else {
if (c_pid <= 0 || strlen(c_date) < 8) {
userlog("VL_ZERONET: 매입키 미지정 — 대사 연계 생략 pid=%ld", c_pid);
} else {
userlog("VL_ZERONET: 정산액 영(0) 대사예외 등록 연계 -> RC_EXCEPTION pid=%ld date=[%s]", c_pid, c_date);
if (tpcall("RC_EXCEPTION", (char *)b, 0L, (char **)&b, &c_rlen, 0L) < 0) {
userlog("VL_ZERONET: tpcall(RC_EXCEPTION) 실패: %s", tpstrerror(tperrno));
setl(b, T_RC, 9048); Bchg(b, T_MSG, 0, "정산액 영(0) 대사예외 등록 연계 실패", 0L);
FAIL(b);
}
c_sub = getl(b, T_RC);
if (c_sub != 0) userlog("VL_ZERONET: RC_EXCEPTION 이상 회신 rc=%ld", c_sub);
}
}
setl(b, T_RC, c_keep); /* 기존 계약 복원 — 응답부/원 처리부가 최종 확정 */
}
/* --- 8) 응답부(보조): 진단 필드 세팅. 최종 T_RC/1차 산출은 원 처리부 확정 --- */
setl(b, T_ARG2, v_flag);
setl(b, T_ARG1, v_metric);