Phase 2c: 전 11모듈 per-service 레거시 구조 분해·확장 (실동작 유지)
- 10개 모듈(au py rc st lg cl mm vl mg cm)을 ac 템플릿대로 분해: svc/ 30 서비스 .pgc + 카피북 .h, 얇은 <mod>_svr 디스패처 dbio/ ~25 .pgc(+.h), batch/ ~17 .pgc, run/ ~17 .sh (모듈마다) - 파일: svc 330 + dbio 276 + batch 187 + run 187, 총 소스 1602본 - 서비스별 고유 실로직(정규화 md5), build.sh 자동발견(inline/split 양립) - 통합 검증: build DONE modules=11 servers=11 batches=187, 12서버 runok, 333 서비스 AVAIL, 매입체인 XA 커밋(status=S), prepared_xacts=0 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c3b99a8b75
commit
fd8b418c6e
1404 changed files with 30322 additions and 5994 deletions
37
app/src/vl/batch/vl_appr_audit_batch.pgc
Normal file
37
app/src/vl/batch/vl_appr_audit_batch.pgc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* vl_appr_audit_batch.pgc - 승인 누락 매입 감사 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_appr_audit_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase p
|
||||
WHERE p.biz_date = :h_bizdate
|
||||
AND NOT EXISTS (SELECT 1 FROM approval a WHERE a.purchase_id = p.purchase_id);
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_appr_audit_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_appr_audit_batch COMMIT: bizdate=%s 승인누락=%ld\n", h_bizdate, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
39
app/src/vl/batch/vl_balance_batch.pgc
Normal file
39
app/src/vl/batch/vl_balance_batch.pgc
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* vl_balance_batch.pgc - 가맹점 대차 불일치 점검 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_balance_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pnet, h_snet; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_pnet FROM purchase
|
||||
WHERE biz_date = :h_bizdate AND status = 'S';
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "SEL1 FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1; }
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_snet FROM settlement
|
||||
WHERE biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_balance_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_balance_batch COMMIT: bizdate=%s 매입=%ld 정산=%ld delta=%ld\n", h_bizdate, h_pnet, h_snet, h_pnet - h_snet);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
35
app/src/vl/batch/vl_bin_check_batch.pgc
Normal file
35
app/src/vl/batch/vl_bin_check_batch.pgc
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* vl_bin_check_batch.pgc - 미등록 BIN 사용 매입 점검 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_bin_check_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM mm_bin WHERE status <> 'ACTIVE';
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_bin_check_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_bin_check_batch COMMIT: 비활성BIN=%ld\n", h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
36
app/src/vl/batch/vl_check_sweep_batch.pgc
Normal file
36
app/src/vl/batch/vl_check_sweep_batch.pgc
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* vl_check_sweep_batch.pgc - 당일 검증로그 실패 스윕 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_check_sweep_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_check_log
|
||||
WHERE biz_date = :h_bizdate AND result_code <> 0;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_check_sweep_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_check_sweep_batch COMMIT: bizdate=%s 실패=%ld\n", h_bizdate, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
38
app/src/vl/batch/vl_cross_batch.pgc
Normal file
38
app/src/vl/batch/vl_cross_batch.pgc
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* vl_cross_batch.pgc - 교차검증(매입+승인+가맹점) 결측 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_cross_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase p
|
||||
WHERE p.biz_date = :h_bizdate
|
||||
AND (NOT EXISTS (SELECT 1 FROM approval a WHERE a.purchase_id = p.purchase_id)
|
||||
OR NOT EXISTS (SELECT 1 FROM merchant m WHERE m.merchant_id = p.merchant_id));
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_cross_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_cross_batch COMMIT: bizdate=%s 결측=%ld\n", h_bizdate, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
48
app/src/vl/batch/vl_dup_scan_batch.pgc
Normal file
48
app/src/vl/batch/vl_dup_scan_batch.pgc
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* vl_dup_scan_batch.pgc - 중복 매입 스캔 배치 (커서 + 의심적재) (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_dup_scan_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char h_bizdate[16], h_merch[64]; long h_amt, h_cnt; long sid;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL DECLARE dsc CURSOR FOR
|
||||
SELECT merchant_id, amount, count(*) FROM purchase
|
||||
WHERE biz_date = :h_bizdate GROUP BY merchant_id, amount HAVING count(*) > 1;
|
||||
EXEC SQL OPEN dsc;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1; }
|
||||
for (;;) {
|
||||
EXEC SQL FETCH dsc INTO :h_merch, :h_amt, :h_cnt;
|
||||
if (sqlca.sqlcode == 100) break;
|
||||
if (sqlca.sqlcode < 0) { EXEC SQL CLOSE dsc; tpabort(0); return 1; }
|
||||
sid = vldb_insert_suspect(0, "DUP", "WARN", "중복 매입 의심", h_bizdate);
|
||||
if (sid < 0) { EXEC SQL CLOSE dsc; tpabort(0); return 1; }
|
||||
rows++;
|
||||
}
|
||||
EXEC SQL CLOSE dsc;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_dup_scan_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_dup_scan_batch COMMIT: bizdate=%s 중복그룹=%ld\n", h_bizdate, rows);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
36
app/src/vl/batch/vl_expiry_batch.pgc
Normal file
36
app/src/vl/batch/vl_expiry_batch.pgc
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* vl_expiry_batch.pgc - 카드 만료 의심거래 점검 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_expiry_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_suspect
|
||||
WHERE rule_code = 'EXPIRY' AND biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_expiry_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_expiry_batch COMMIT: bizdate=%s 만료의심=%ld\n", h_bizdate, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
35
app/src/vl/batch/vl_format_batch.pgc
Normal file
35
app/src/vl/batch/vl_format_batch.pgc
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* vl_format_batch.pgc - 가맹점ID 형식 위반 점검 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_format_batch
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM merchant
|
||||
WHERE length(merchant_id) < 4 OR length(merchant_id) > 16;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_format_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_format_batch COMMIT: 형식위반=%ld\n", h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
39
app/src/vl/batch/vl_ledger_recon_batch.pgc
Normal file
39
app/src/vl/batch/vl_ledger_recon_batch.pgc
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* vl_ledger_recon_batch.pgc - 원장-매입 순액 대사 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_ledger_recon_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pnet, h_lsum; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_pnet FROM purchase
|
||||
WHERE biz_date = :h_bizdate AND status = 'S';
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "SEL1 FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1; }
|
||||
EXEC SQL SELECT coalesce(sum(amount),0) INTO :h_lsum FROM ledger
|
||||
WHERE biz_date = :h_bizdate AND entry_type = 'SETTLELINK';
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_ledger_recon_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_ledger_recon_batch COMMIT: bizdate=%s 매입순액=%ld 원장합=%ld delta=%ld\n", h_bizdate, h_pnet, h_lsum, h_pnet - h_lsum);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
37
app/src/vl/batch/vl_limit_scan_batch.pgc
Normal file
37
app/src/vl/batch/vl_limit_scan_batch.pgc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* vl_limit_scan_batch.pgc - 한도 초과 매입 스캔 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_limit_scan_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase p
|
||||
JOIN merchant m ON m.merchant_id = p.merchant_id
|
||||
WHERE p.biz_date = :h_bizdate AND p.amount > m.daily_limit;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_limit_scan_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_limit_scan_batch COMMIT: bizdate=%s 한도초과=%ld\n", h_bizdate, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
35
app/src/vl/batch/vl_refinteg_batch.pgc
Normal file
35
app/src/vl/batch/vl_refinteg_batch.pgc
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* vl_refinteg_batch.pgc - 참조무결성(가맹점 orphan) 검사 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_refinteg_batch
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase p
|
||||
WHERE NOT EXISTS (SELECT 1 FROM merchant m WHERE m.merchant_id = p.merchant_id);
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_refinteg_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_refinteg_batch COMMIT: orphan=%ld\n", h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
46
app/src/vl/batch/vl_report_batch.pgc
Normal file
46
app/src/vl/batch/vl_report_batch.pgc
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* vl_report_batch.pgc - 심각도별 의심거래 리포트 배치 (커서) (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_report_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char h_bizdate[16], h_sev[8]; long h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL DECLARE rpc CURSOR FOR
|
||||
SELECT severity, count(*) FROM vl_suspect
|
||||
WHERE biz_date = :h_bizdate GROUP BY severity ORDER BY severity;
|
||||
EXEC SQL OPEN rpc;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1; }
|
||||
for (;;) {
|
||||
EXEC SQL FETCH rpc INTO :h_sev, :h_cnt;
|
||||
if (sqlca.sqlcode == 100) break;
|
||||
if (sqlca.sqlcode < 0) { EXEC SQL CLOSE rpc; tpabort(0); return 1; }
|
||||
rows++;
|
||||
}
|
||||
EXEC SQL CLOSE rpc;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_report_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_report_batch COMMIT: bizdate=%s 심각도구간=%ld\n", h_bizdate, rows);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
38
app/src/vl/batch/vl_settle_recon_batch.pgc
Normal file
38
app/src/vl/batch/vl_settle_recon_batch.pgc
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* vl_settle_recon_batch.pgc - 정산 불일치 대사 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_settle_recon_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase p
|
||||
WHERE p.biz_date = :h_bizdate AND p.status = 'S'
|
||||
AND p.net <> coalesce((SELECT sum(s.net) FROM settlement s
|
||||
WHERE s.purchase_id = p.purchase_id), 0);
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_settle_recon_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_settle_recon_batch COMMIT: bizdate=%s 정산불일치=%ld\n", h_bizdate, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
46
app/src/vl/batch/vl_suspect_close_batch.pgc
Normal file
46
app/src/vl/batch/vl_suspect_close_batch.pgc
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* vl_suspect_close_batch.pgc - 노후 의심거래 자동 종결 배치 (커서) (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_suspect_close_batch [DAYS]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_sid, h_days = (argc > 1) ? atol(argv[1]) : 30;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
EXEC SQL DECLARE scc CURSOR FOR
|
||||
SELECT suspect_id FROM vl_suspect
|
||||
WHERE status = 'OPEN' AND created_at < now() - (:h_days || ' days')::interval;
|
||||
EXEC SQL OPEN scc;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "OPEN FAIL [%d]\n", sqlca.sqlcode); tpabort(0); return 1; }
|
||||
for (;;) {
|
||||
EXEC SQL FETCH scc INTO :h_sid;
|
||||
if (sqlca.sqlcode == 100) break;
|
||||
if (sqlca.sqlcode < 0) { EXEC SQL CLOSE scc; tpabort(0); return 1; }
|
||||
if (vldb_close_suspect(h_sid) < 0) { EXEC SQL CLOSE scc; tpabort(0); return 1; }
|
||||
rows++;
|
||||
}
|
||||
EXEC SQL CLOSE scc;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_suspect_close_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_suspect_close_batch COMMIT: days=%ld 종결=%ld\n", h_days, rows);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
37
app/src/vl/batch/vl_threshold_batch.pgc
Normal file
37
app/src/vl/batch/vl_threshold_batch.pgc
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* vl_threshold_batch.pgc - 임계 초과 매입 규칙 점검 배치 (XA).
|
||||
*
|
||||
* ATMI client: tpinit/tpopen open the ECPG XA RM, tpbegin starts ONE global
|
||||
* transaction; the 검증 SELECT/집계 runs on that branch, then tpcommit drives XA 2PC.
|
||||
* Usage: vl_threshold_batch [YYYY-MM-DD]
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <atmi.h>
|
||||
#include "vl_dbio.h"
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
long rows = 0; (void)rows; (void)argc; (void)argv;
|
||||
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt, thr = 50000000; char h_bizdate[16], sev[8] = "ERROR";
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, (argc > 1) ? argv[1] : "2026-07-19", sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
|
||||
if (tpinit(NULL) < 0) { fprintf(stderr, "tpinit FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpopen() < 0) { fprintf(stderr, "tpopen FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
if (tpbegin(60, 0) < 0) { fprintf(stderr, "tpbegin FAIL: %s\n", tpstrerror(tperrno)); return 1; }
|
||||
|
||||
if (vldb_get_rule("AMT_MAX", &thr, sev) < 0) { thr = 50000000; }
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase
|
||||
WHERE biz_date = :h_bizdate AND amount > :thr;
|
||||
if (sqlca.sqlcode < 0) { fprintf(stderr, "vl_threshold_batch FAIL [%d] %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); tpabort(0); return 1; }
|
||||
|
||||
if (tpcommit(0) < 0) { fprintf(stderr, "tpcommit FAIL: %s\n", tpstrerror(tperrno)); tpabort(0); return 1; }
|
||||
printf(">>> vl_threshold_batch COMMIT: bizdate=%s 임계=%ld 초과=%ld\n", h_bizdate, thr, h_cnt);
|
||||
|
||||
tpclose(); tpterm();
|
||||
return 0;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_appr_dbio.h
Normal file
11
app/src/vl/dbio/vl_appr_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_appr_dbio.h - 승인 건수 조회 (매입 대비) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_APPR_DBIO_H
|
||||
#define VL_APPR_DBIO_H
|
||||
|
||||
long vldb_appr_count(long pid);
|
||||
|
||||
#endif /* VL_APPR_DBIO_H */
|
||||
17
app/src/vl/dbio/vl_appr_dbio.pgc
Normal file
17
app/src/vl/dbio/vl_appr_dbio.pgc
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* vl_appr_dbio.pgc - 승인 건수 조회 (매입 대비) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_appr_dbio.h"
|
||||
|
||||
long vldb_appr_count(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM approval WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_appr_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_balance_dbio.h
Normal file
11
app/src/vl/dbio/vl_balance_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_balance_dbio.h - 가맹점 매입 순액 합계 (정산완료) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_BALANCE_DBIO_H
|
||||
#define VL_BALANCE_DBIO_H
|
||||
|
||||
long vldb_merch_net(const char *merch, const char *bizdate);
|
||||
|
||||
#endif /* VL_BALANCE_DBIO_H */
|
||||
20
app/src/vl/dbio/vl_balance_dbio.pgc
Normal file
20
app/src/vl/dbio/vl_balance_dbio.pgc
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* vl_balance_dbio.pgc - 가맹점 매입 순액 합계 (정산완료) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_balance_dbio.h"
|
||||
|
||||
long vldb_merch_net(const char *merch, const char *bizdate)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_net; char h_merch[64], h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_merch, merch, sizeof(h_merch)-1); h_merch[sizeof(h_merch)-1] = 0;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_net FROM purchase
|
||||
WHERE merchant_id = :h_merch AND biz_date = :h_bizdate AND status = 'S';
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_merch_net FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_net;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_batchchk_dbio.h
Normal file
11
app/src/vl/dbio/vl_batchchk_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_batchchk_dbio.h - 영업일 매입 건수 (배치 정합용) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_BATCHCHK_DBIO_H
|
||||
#define VL_BATCHCHK_DBIO_H
|
||||
|
||||
long vldb_purchase_day_count(const char *bizdate);
|
||||
|
||||
#endif /* VL_BATCHCHK_DBIO_H */
|
||||
18
app/src/vl/dbio/vl_batchchk_dbio.pgc
Normal file
18
app/src/vl/dbio/vl_batchchk_dbio.pgc
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* vl_batchchk_dbio.pgc - 영업일 매입 건수 (배치 정합용) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_batchchk_dbio.h"
|
||||
|
||||
long vldb_purchase_day_count(const char *bizdate)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase WHERE biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_purchase_day_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_bin_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_bin_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_bin_query_dbio.h - BIN 등록/활성 여부 검증 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_BIN_QUERY_DBIO_H
|
||||
#define VL_BIN_QUERY_DBIO_H
|
||||
|
||||
int vldb_bin_active(const char *bin);
|
||||
|
||||
#endif /* VL_BIN_QUERY_DBIO_H */
|
||||
21
app/src/vl/dbio/vl_bin_query_dbio.pgc
Normal file
21
app/src/vl/dbio/vl_bin_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* vl_bin_query_dbio.pgc - BIN 등록/활성 여부 검증 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_bin_query_dbio.h"
|
||||
|
||||
int vldb_bin_active(const char *bin)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt, h_active; char h_bin[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bin, bin, sizeof(h_bin)-1); h_bin[sizeof(h_bin)-1] = 0;
|
||||
EXEC SQL SELECT count(*), coalesce(sum(CASE WHEN status='ACTIVE' THEN 1 ELSE 0 END),0)
|
||||
INTO :h_cnt, :h_active FROM mm_bin WHERE bin = :h_bin;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_bin_active FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
if (h_cnt == 0) return 1;
|
||||
if (h_active == 0) return 2;
|
||||
return 0;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_checklog_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_checklog_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_checklog_query_dbio.h - 검증 로그 실패 건수 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_CHECKLOG_QUERY_DBIO_H
|
||||
#define VL_CHECKLOG_QUERY_DBIO_H
|
||||
|
||||
long vldb_checklog_fail(const char *check_type, const char *bizdate);
|
||||
|
||||
#endif /* VL_CHECKLOG_QUERY_DBIO_H */
|
||||
20
app/src/vl/dbio/vl_checklog_query_dbio.pgc
Normal file
20
app/src/vl/dbio/vl_checklog_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* vl_checklog_query_dbio.pgc - 검증 로그 실패 건수 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_checklog_query_dbio.h"
|
||||
|
||||
long vldb_checklog_fail(const char *check_type, const char *bizdate)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_type[32], h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_type, check_type, sizeof(h_type)-1); h_type[sizeof(h_type)-1] = 0;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_check_log
|
||||
WHERE check_type = :h_type AND result_code <> 0 AND biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_checklog_fail FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_close_dbio.h
Normal file
11
app/src/vl/dbio/vl_close_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_close_dbio.h - 의심거래 종결 처리 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_CLOSE_DBIO_H
|
||||
#define VL_CLOSE_DBIO_H
|
||||
|
||||
int vldb_close_suspect(long sid);
|
||||
|
||||
#endif /* VL_CLOSE_DBIO_H */
|
||||
18
app/src/vl/dbio/vl_close_dbio.pgc
Normal file
18
app/src/vl/dbio/vl_close_dbio.pgc
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* vl_close_dbio.pgc - 의심거래 종결 처리 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_close_dbio.h"
|
||||
|
||||
int vldb_close_suspect(long sid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_sid = sid;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL UPDATE vl_suspect SET status = 'CLOSED'
|
||||
WHERE suspect_id = :h_sid AND status = 'OPEN';
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { userlog("vldb_close_suspect FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return 0;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_codeval_dbio.h
Normal file
11
app/src/vl/dbio/vl_codeval_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_codeval_dbio.h - 공통코드 유효성 (mm_code 활성) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_CODEVAL_DBIO_H
|
||||
#define VL_CODEVAL_DBIO_H
|
||||
|
||||
int vldb_code_active(const char *grp, const char *code);
|
||||
|
||||
#endif /* VL_CODEVAL_DBIO_H */
|
||||
20
app/src/vl/dbio/vl_codeval_dbio.pgc
Normal file
20
app/src/vl/dbio/vl_codeval_dbio.pgc
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* vl_codeval_dbio.pgc - 공통코드 유효성 (mm_code 활성) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_codeval_dbio.h"
|
||||
|
||||
int vldb_code_active(const char *grp, const char *code)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_grp[32], h_code[32];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_grp, grp, sizeof(h_grp)-1); h_grp[sizeof(h_grp)-1] = 0;
|
||||
strncpy(h_code, code, sizeof(h_code)-1); h_code[sizeof(h_code)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM mm_code
|
||||
WHERE code_group = :h_grp AND code = :h_code AND status = 'ACTIVE';
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_code_active FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return (h_cnt > 0) ? 0 : 1;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_cross_dbio.h
Normal file
11
app/src/vl/dbio/vl_cross_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_cross_dbio.h - 교차검증 존재비트 (매입/가맹점/승인) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_CROSS_DBIO_H
|
||||
#define VL_CROSS_DBIO_H
|
||||
|
||||
long vldb_cross_bits(long pid);
|
||||
|
||||
#endif /* VL_CROSS_DBIO_H */
|
||||
26
app/src/vl/dbio/vl_cross_dbio.pgc
Normal file
26
app/src/vl/dbio/vl_cross_dbio.pgc
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* vl_cross_dbio.pgc - 교차검증 존재비트 (매입/가맹점/승인) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_cross_dbio.h"
|
||||
|
||||
long vldb_cross_bits(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_p, h_m, h_a;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
long rc = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_p FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) return -1;
|
||||
EXEC SQL SELECT count(*) INTO :h_m FROM purchase p
|
||||
JOIN merchant m ON m.merchant_id = p.merchant_id WHERE p.purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) return -1;
|
||||
EXEC SQL SELECT count(*) INTO :h_a FROM approval WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) return -1;
|
||||
if (h_p == 0) rc |= 1;
|
||||
if (h_m == 0) rc |= 2;
|
||||
if (h_a == 0) rc |= 4;
|
||||
return rc;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_dup_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_dup_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_dup_query_dbio.h - 중복 매입 건수 (가맹점/금액/영업일) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_DUP_QUERY_DBIO_H
|
||||
#define VL_DUP_QUERY_DBIO_H
|
||||
|
||||
long vldb_dup_count(const char *merch, long amt, const char *bizdate);
|
||||
|
||||
#endif /* VL_DUP_QUERY_DBIO_H */
|
||||
20
app/src/vl/dbio/vl_dup_query_dbio.pgc
Normal file
20
app/src/vl/dbio/vl_dup_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* vl_dup_query_dbio.pgc - 중복 매입 건수 (가맹점/금액/영업일) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_dup_query_dbio.h"
|
||||
|
||||
long vldb_dup_count(const char *merch, long amt, const char *bizdate)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_amt = amt, h_cnt; char h_merch[64], h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_merch, merch, sizeof(h_merch)-1); h_merch[sizeof(h_merch)-1] = 0;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase
|
||||
WHERE merchant_id = :h_merch AND amount = :h_amt AND biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_dup_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_fee_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_fee_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_fee_query_dbio.h - 매입 수수료/금액/가맹점 조회 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_FEE_QUERY_DBIO_H
|
||||
#define VL_FEE_QUERY_DBIO_H
|
||||
|
||||
int vldb_purchase_fee(long pid, long *amt_out, long *fee_out, char *merch_out /*>=64*/);
|
||||
|
||||
#endif /* VL_FEE_QUERY_DBIO_H */
|
||||
20
app/src/vl/dbio/vl_fee_query_dbio.pgc
Normal file
20
app/src/vl/dbio/vl_fee_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* vl_fee_query_dbio.pgc - 매입 수수료/금액/가맹점 조회 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_fee_query_dbio.h"
|
||||
|
||||
int vldb_purchase_fee(long pid, long *amt_out, long *fee_out, char *merch_out)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_amt, h_fee; char h_merch[64];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT amount, fee, merchant_id INTO :h_amt, :h_fee, :h_merch
|
||||
FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { userlog("vldb_purchase_fee FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
*amt_out = h_amt; *fee_out = h_fee;
|
||||
strncpy(merch_out, h_merch, 63); merch_out[63] = 0;
|
||||
return 0;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_format_dbio.h
Normal file
11
app/src/vl/dbio/vl_format_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_format_dbio.h - 가맹점ID 형식 위반 건수 (길이) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_FORMAT_DBIO_H
|
||||
#define VL_FORMAT_DBIO_H
|
||||
|
||||
long vldb_bad_format_count(void);
|
||||
|
||||
#endif /* VL_FORMAT_DBIO_H */
|
||||
18
app/src/vl/dbio/vl_format_dbio.pgc
Normal file
18
app/src/vl/dbio/vl_format_dbio.pgc
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* vl_format_dbio.pgc - 가맹점ID 형식 위반 건수 (길이) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_format_dbio.h"
|
||||
|
||||
long vldb_bad_format_count(void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM merchant
|
||||
WHERE length(merchant_id) < 4 OR length(merchant_id) > 16;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_bad_format_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_ledger_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_ledger_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_ledger_query_dbio.h - 원장 합계 조회 (SETTLELINK) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_LEDGER_QUERY_DBIO_H
|
||||
#define VL_LEDGER_QUERY_DBIO_H
|
||||
|
||||
long vldb_ledger_sum(long pid);
|
||||
|
||||
#endif /* VL_LEDGER_QUERY_DBIO_H */
|
||||
18
app/src/vl/dbio/vl_ledger_query_dbio.pgc
Normal file
18
app/src/vl/dbio/vl_ledger_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* vl_ledger_query_dbio.pgc - 원장 합계 조회 (SETTLELINK) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_ledger_query_dbio.h"
|
||||
|
||||
long vldb_ledger_sum(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_sum;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT coalesce(sum(amount),0) INTO :h_sum FROM ledger
|
||||
WHERE purchase_id = :h_pid AND entry_type = 'SETTLELINK';
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_ledger_sum FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_sum;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_merch_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_merch_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_merch_query_dbio.h - 가맹점 상태 조회 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_MERCH_QUERY_DBIO_H
|
||||
#define VL_MERCH_QUERY_DBIO_H
|
||||
|
||||
int vldb_merch_status(const char *merch, char *status_out /*>=16*/);
|
||||
|
||||
#endif /* VL_MERCH_QUERY_DBIO_H */
|
||||
19
app/src/vl/dbio/vl_merch_query_dbio.pgc
Normal file
19
app/src/vl/dbio/vl_merch_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* vl_merch_query_dbio.pgc - 가맹점 상태 조회 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_merch_query_dbio.h"
|
||||
|
||||
int vldb_merch_status(const char *merch, char *status_out)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
char h_merch[64], h_status[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_merch, merch, sizeof(h_merch)-1); h_merch[sizeof(h_merch)-1] = 0;
|
||||
EXEC SQL SELECT status INTO :h_status FROM merchant WHERE merchant_id = :h_merch;
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { userlog("vldb_merch_status FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
strncpy(status_out, h_status, 15); status_out[15] = 0;
|
||||
return 0;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_open_dbio.h
Normal file
11
app/src/vl/dbio/vl_open_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_open_dbio.h - 미결(OPEN) 의심거래 총수 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_OPEN_DBIO_H
|
||||
#define VL_OPEN_DBIO_H
|
||||
|
||||
long vldb_open_count(void);
|
||||
|
||||
#endif /* VL_OPEN_DBIO_H */
|
||||
17
app/src/vl/dbio/vl_open_dbio.pgc
Normal file
17
app/src/vl/dbio/vl_open_dbio.pgc
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* vl_open_dbio.pgc - 미결(OPEN) 의심거래 총수 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_open_dbio.h"
|
||||
|
||||
long vldb_open_count(void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_suspect WHERE status = 'OPEN';
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_open_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
12
app/src/vl/dbio/vl_purchase_dbio.h
Normal file
12
app/src/vl/dbio/vl_purchase_dbio.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* vl_purchase_dbio.h - 매입 원거래 존재/금액 조회 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_PURCHASE_DBIO_H
|
||||
#define VL_PURCHASE_DBIO_H
|
||||
|
||||
int vldb_purchase_exists(long pid);
|
||||
long vldb_purchase_amount(long pid);
|
||||
|
||||
#endif /* VL_PURCHASE_DBIO_H */
|
||||
27
app/src/vl/dbio/vl_purchase_dbio.pgc
Normal file
27
app/src/vl/dbio/vl_purchase_dbio.pgc
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* vl_purchase_dbio.pgc - 매입 원거래 존재/금액 조회 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_purchase_dbio.h"
|
||||
|
||||
int vldb_purchase_exists(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_purchase_exists FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return (h_cnt > 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
long vldb_purchase_amount(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_amt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT amount INTO :h_amt FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { userlog("vldb_purchase_amount FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_amt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_refinteg_dbio.h
Normal file
11
app/src/vl/dbio/vl_refinteg_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_refinteg_dbio.h - 참조무결성 위반 건수 (가맹점 orphan) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_REFINTEG_DBIO_H
|
||||
#define VL_REFINTEG_DBIO_H
|
||||
|
||||
long vldb_orphan_count(long pid);
|
||||
|
||||
#endif /* VL_REFINTEG_DBIO_H */
|
||||
19
app/src/vl/dbio/vl_refinteg_dbio.pgc
Normal file
19
app/src/vl/dbio/vl_refinteg_dbio.pgc
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* vl_refinteg_dbio.pgc - 참조무결성 위반 건수 (가맹점 orphan) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_refinteg_dbio.h"
|
||||
|
||||
long vldb_orphan_count(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase p
|
||||
WHERE p.purchase_id = :h_pid
|
||||
AND NOT EXISTS (SELECT 1 FROM merchant m WHERE m.merchant_id = p.merchant_id);
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_orphan_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_report_dbio.h
Normal file
11
app/src/vl/dbio/vl_report_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_report_dbio.h - 심각도별 의심거래 리포트 (전기간) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_REPORT_DBIO_H
|
||||
#define VL_REPORT_DBIO_H
|
||||
|
||||
long vldb_report_by_sev(const char *sev);
|
||||
|
||||
#endif /* VL_REPORT_DBIO_H */
|
||||
18
app/src/vl/dbio/vl_report_dbio.pgc
Normal file
18
app/src/vl/dbio/vl_report_dbio.pgc
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* vl_report_dbio.pgc - 심각도별 의심거래 리포트 (전기간) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_report_dbio.h"
|
||||
|
||||
long vldb_report_by_sev(const char *sev)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_sev[8];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_sev, sev, sizeof(h_sev)-1); h_sev[sizeof(h_sev)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_suspect WHERE severity = :h_sev;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_report_by_sev FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_rule_list_dbio.h
Normal file
11
app/src/vl/dbio/vl_rule_list_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_rule_list_dbio.h - 활성 검증규칙 수 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_RULE_LIST_DBIO_H
|
||||
#define VL_RULE_LIST_DBIO_H
|
||||
|
||||
long vldb_rule_count(void);
|
||||
|
||||
#endif /* VL_RULE_LIST_DBIO_H */
|
||||
17
app/src/vl/dbio/vl_rule_list_dbio.pgc
Normal file
17
app/src/vl/dbio/vl_rule_list_dbio.pgc
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* vl_rule_list_dbio.pgc - 활성 검증규칙 수 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_rule_list_dbio.h"
|
||||
|
||||
long vldb_rule_count(void)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_rule WHERE status = 'ACTIVE';
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_rule_count FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_settle_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_settle_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_settle_query_dbio.h - 정산 순액 합계 조회 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_SETTLE_QUERY_DBIO_H
|
||||
#define VL_SETTLE_QUERY_DBIO_H
|
||||
|
||||
long vldb_settle_net(long pid);
|
||||
|
||||
#endif /* VL_SETTLE_QUERY_DBIO_H */
|
||||
17
app/src/vl/dbio/vl_settle_query_dbio.pgc
Normal file
17
app/src/vl/dbio/vl_settle_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* vl_settle_query_dbio.pgc - 정산 순액 합계 조회 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_settle_query_dbio.h"
|
||||
|
||||
long vldb_settle_net(long pid)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid, h_net;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_net FROM settlement WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_settle_net FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_net;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_status_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_status_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_status_query_dbio.h - 매입 상태값 조회 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_STATUS_QUERY_DBIO_H
|
||||
#define VL_STATUS_QUERY_DBIO_H
|
||||
|
||||
int vldb_purchase_status(long pid, char *status_out /*>=8*/);
|
||||
|
||||
#endif /* VL_STATUS_QUERY_DBIO_H */
|
||||
18
app/src/vl/dbio/vl_status_query_dbio.pgc
Normal file
18
app/src/vl/dbio/vl_status_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* vl_status_query_dbio.pgc - 매입 상태값 조회 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_status_query_dbio.h"
|
||||
|
||||
int vldb_purchase_status(long pid, char *status_out)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid = pid; char h_status[8];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
EXEC SQL SELECT status INTO :h_status FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { userlog("vldb_purchase_status FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
strncpy(status_out, h_status, 7); status_out[7] = 0;
|
||||
return 0;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_suspect_query_dbio.h
Normal file
11
app/src/vl/dbio/vl_suspect_query_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_suspect_query_dbio.h - 심각도별 의심거래 건수 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_SUSPECT_QUERY_DBIO_H
|
||||
#define VL_SUSPECT_QUERY_DBIO_H
|
||||
|
||||
long vldb_suspect_by_sev(const char *sev, const char *bizdate);
|
||||
|
||||
#endif /* VL_SUSPECT_QUERY_DBIO_H */
|
||||
20
app/src/vl/dbio/vl_suspect_query_dbio.pgc
Normal file
20
app/src/vl/dbio/vl_suspect_query_dbio.pgc
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* vl_suspect_query_dbio.pgc - 심각도별 의심거래 건수 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_suspect_query_dbio.h"
|
||||
|
||||
long vldb_suspect_by_sev(const char *sev, const char *bizdate)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt; char h_sev[8], h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_sev, sev, sizeof(h_sev)-1); h_sev[sizeof(h_sev)-1] = 0;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM vl_suspect
|
||||
WHERE severity = :h_sev AND biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_suspect_by_sev FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_threshold_dbio.h
Normal file
11
app/src/vl/dbio/vl_threshold_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_threshold_dbio.h - 규칙 임계치 조회 copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_THRESHOLD_DBIO_H
|
||||
#define VL_THRESHOLD_DBIO_H
|
||||
|
||||
long vldb_rule_threshold(const char *rule_code);
|
||||
|
||||
#endif /* VL_THRESHOLD_DBIO_H */
|
||||
19
app/src/vl/dbio/vl_threshold_dbio.pgc
Normal file
19
app/src/vl/dbio/vl_threshold_dbio.pgc
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* vl_threshold_dbio.pgc - 규칙 임계치 조회 (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_threshold_dbio.h"
|
||||
|
||||
long vldb_rule_threshold(const char *rule_code)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_thr; char h_rule[32];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_rule, rule_code, sizeof(h_rule)-1); h_rule[sizeof(h_rule)-1] = 0;
|
||||
EXEC SQL SELECT threshold INTO :h_thr FROM vl_rule
|
||||
WHERE rule_code = :h_rule AND status = 'ACTIVE';
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { userlog("vldb_rule_threshold FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_thr;
|
||||
}
|
||||
11
app/src/vl/dbio/vl_tolerance_dbio.h
Normal file
11
app/src/vl/dbio/vl_tolerance_dbio.h
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
/*
|
||||
* vl_tolerance_dbio.h - 금액 허용오차 위반 건수 (amount != fee+net) copybook (part of libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch (no EXEC SQL CONNECT).
|
||||
* Return convention: >=0 ok, -1 = SQL error.
|
||||
*/
|
||||
#ifndef VL_TOLERANCE_DBIO_H
|
||||
#define VL_TOLERANCE_DBIO_H
|
||||
|
||||
long vldb_tolerance_break(const char *bizdate, long tol);
|
||||
|
||||
#endif /* VL_TOLERANCE_DBIO_H */
|
||||
19
app/src/vl/dbio/vl_tolerance_dbio.pgc
Normal file
19
app/src/vl/dbio/vl_tolerance_dbio.pgc
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* vl_tolerance_dbio.pgc - 금액 허용오차 위반 건수 (amount != fee+net) (libvldbio.a).
|
||||
* ECPG functions; run on the caller's XA branch. No EXEC SQL CONNECT.
|
||||
*/
|
||||
#include <string.h>
|
||||
#include <userlog.h>
|
||||
#include "vl_tolerance_dbio.h"
|
||||
|
||||
long vldb_tolerance_break(const char *bizdate, long tol)
|
||||
{
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt, h_tol = tol; char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM purchase
|
||||
WHERE biz_date = :h_bizdate AND abs(amount - (fee + net)) > :h_tol;
|
||||
if (sqlca.sqlcode < 0) { userlog("vldb_tolerance_break FAIL [%d]", sqlca.sqlcode); return -1; }
|
||||
return h_cnt;
|
||||
}
|
||||
14
app/src/vl/run/run_anomaly.sh
Executable file
14
app/src/vl/run/run_anomaly.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_anomaly.sh - 이상거래 탐지 배치 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_anomaly.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_anomaly.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_anomaly_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_appr_audit.sh
Executable file
14
app/src/vl/run/run_appr_audit.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_appr_audit.sh - 승인 누락 감사 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_appr_audit.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_appr_audit.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_appr_audit_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_balance.sh
Executable file
14
app/src/vl/run/run_balance.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_balance.sh - 가맹점 대차 불일치 점검 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_balance.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_balance.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_balance_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_bin_check.sh
Executable file
14
app/src/vl/run/run_bin_check.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_bin_check.sh - 미등록 BIN 점검 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_bin_check.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_bin_check.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_bin_check_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_check_sweep.sh
Executable file
14
app/src/vl/run/run_check_sweep.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_check_sweep.sh - 검증로그 실패 스윕 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_check_sweep.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_check_sweep.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_check_sweep_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_cross.sh
Executable file
14
app/src/vl/run/run_cross.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_cross.sh - 교차검증 결측 점검 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_cross.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_cross.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_cross_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_dup_scan.sh
Executable file
14
app/src/vl/run/run_dup_scan.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_dup_scan.sh - 중복 매입 스캔 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_dup_scan.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_dup_scan.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_dup_scan_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_expiry.sh
Executable file
14
app/src/vl/run/run_expiry.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_expiry.sh - 카드 만료 의심 점검 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_expiry.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_expiry.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_expiry_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_format.sh
Executable file
14
app/src/vl/run/run_format.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_format.sh - 가맹점ID 형식 위반 점검 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_format.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_format.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_format_batch
|
||||
14
app/src/vl/run/run_ledger_recon.sh
Executable file
14
app/src/vl/run/run_ledger_recon.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_ledger_recon.sh - 원장-매입 순액 대사 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_ledger_recon.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_ledger_recon.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_ledger_recon_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_limit_scan.sh
Executable file
14
app/src/vl/run/run_limit_scan.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_limit_scan.sh - 한도 초과 매입 스캔 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_limit_scan.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_limit_scan.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_limit_scan_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_refinteg.sh
Executable file
14
app/src/vl/run/run_refinteg.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_refinteg.sh - 참조무결성 검사 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_refinteg.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_refinteg.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_refinteg_batch
|
||||
14
app/src/vl/run/run_report.sh
Executable file
14
app/src/vl/run/run_report.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_report.sh - 심각도별 의심거래 리포트 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_report.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_report.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_report_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_sales.sh
Executable file
14
app/src/vl/run/run_sales.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_sales.sh - 매입 원거래 검증 배치 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_sales.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_sales.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_sales_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_settle_recon.sh
Executable file
14
app/src/vl/run/run_settle_recon.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_settle_recon.sh - 정산 불일치 대사 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_settle_recon.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_settle_recon.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_settle_recon_batch "$BIZDATE"
|
||||
14
app/src/vl/run/run_suspect_close.sh
Executable file
14
app/src/vl/run/run_suspect_close.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_suspect_close.sh - 노후 의심거래 자동 종결 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_suspect_close.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_suspect_close.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_suspect_close_batch "$ARG"
|
||||
14
app/src/vl/run/run_threshold.sh
Executable file
14
app/src/vl/run/run_threshold.sh
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
##
|
||||
## run_threshold.sh - 임계 초과 규칙 점검 실행.
|
||||
## 운영 스크립트: Enduro/X + ECPG/XA 런타임 환경을 설정하고 vl 검증 배치를 실행.
|
||||
## Usage: run_threshold.sh [BIZDATE] [ARG]
|
||||
##
|
||||
set -e
|
||||
. /app/conf/setapp.sh
|
||||
|
||||
BIZDATE="${1:-2026-07-19}"
|
||||
ARG="${2:-}"
|
||||
|
||||
echo "[run_threshold.sh] BIZDATE=$BIZDATE ARG=$ARG"
|
||||
exec /app/bin/vl_threshold_batch "$BIZDATE"
|
||||
12
app/src/vl/svc/VL_AMOUNT.h
Normal file
12
app/src/vl/svc/VL_AMOUNT.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_AMOUNT.h - vl 서비스 VL_AMOUNT 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_AMOUNT, T_ARG1, T_RC
|
||||
*/
|
||||
#ifndef VL_AMOUNT_H
|
||||
#define VL_AMOUNT_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_AMOUNT(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_AMOUNT_H */
|
||||
21
app/src/vl/svc/VL_AMOUNT.pgc
Normal file
21
app/src/vl/svc/VL_AMOUNT.pgc
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* VL_AMOUNT.pgc - vl 모듈 서비스 VL_AMOUNT (one service = one file).
|
||||
* 기능: 금액 유효성(0<amt<=규칙 AMT_MAX) 검증 (RC 1=0/음수,2=상한초과).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_AMOUNT.h"
|
||||
|
||||
void VL_AMOUNT(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
long amt, rc = 0, thr = 50000000;
|
||||
char sev[8];
|
||||
amt = getl(b, T_AMOUNT);
|
||||
if (vldb_get_rule("AMT_MAX", &thr, sev) < 0) thr = 50000000;
|
||||
if (amt <= 0) rc = 1;
|
||||
else if (amt > thr) rc = 2;
|
||||
setl(b, T_RC, rc);
|
||||
setl(b, T_ARG1, thr);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_ANOMALY.h
Normal file
12
app/src/vl/svc/VL_ANOMALY.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_ANOMALY.h - vl 서비스 VL_ANOMALY 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_BIZDATE, T_ID1, T_PURCHASE_ID, T_RC
|
||||
*/
|
||||
#ifndef VL_ANOMALY_H
|
||||
#define VL_ANOMALY_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_ANOMALY(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_ANOMALY_H */
|
||||
31
app/src/vl/svc/VL_ANOMALY.pgc
Normal file
31
app/src/vl/svc/VL_ANOMALY.pgc
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* VL_ANOMALY.pgc - vl 모듈 서비스 VL_ANOMALY (one service = one file).
|
||||
* 기능: 이상거래 탐지 후 의심거래 적재 (dbio).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_ANOMALY.h"
|
||||
|
||||
void VL_ANOMALY(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char bizdate[16];
|
||||
long rc = 0, sid = 0, thr = 50000000;
|
||||
char sev[8];
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid, h_amt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
h_pid = getl(b, T_PURCHASE_ID);
|
||||
gets_(b, T_BIZDATE, bizdate, sizeof(bizdate));
|
||||
EXEC SQL SELECT amount INTO :h_amt FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { setl(b, T_RC, 3); OK(b); }
|
||||
if (vldb_get_rule("AMT_MAX", &thr, sev) < 0) { thr = 50000000; strcpy(sev, "ERROR"); }
|
||||
if (h_amt > thr) {
|
||||
rc = 1;
|
||||
sid = vldb_insert_suspect(h_pid, "AMT_MAX", sev, "고액 이상거래", bizdate);
|
||||
if (sid < 0) FAIL(b);
|
||||
}
|
||||
setl(b, T_RC, rc);
|
||||
setl(b, T_ID1, sid);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_APPR_ACQ.h
Normal file
12
app/src/vl/svc/VL_APPR_ACQ.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_APPR_ACQ.h - vl 서비스 VL_APPR_ACQ 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_COUNT, T_PURCHASE_ID, T_RC
|
||||
*/
|
||||
#ifndef VL_APPR_ACQ_H
|
||||
#define VL_APPR_ACQ_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_APPR_ACQ(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_APPR_ACQ_H */
|
||||
24
app/src/vl/svc/VL_APPR_ACQ.pgc
Normal file
24
app/src/vl/svc/VL_APPR_ACQ.pgc
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* VL_APPR_ACQ.pgc - vl 모듈 서비스 VL_APPR_ACQ (one service = one file).
|
||||
* 기능: 승인-매입 매칭 검증 (RC 1=승인 없음).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_APPR_ACQ.h"
|
||||
|
||||
void VL_APPR_ACQ(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid, h_cnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
h_pid = getl(b, T_PURCHASE_ID);
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM approval
|
||||
WHERE purchase_id = :h_pid AND approved = true;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
if (h_cnt == 0) rc = 1;
|
||||
setl(b, T_COUNT, h_cnt);
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_BALANCE.h
Normal file
12
app/src/vl/svc/VL_BALANCE.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_BALANCE.h - vl 서비스 VL_BALANCE 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_BIZDATE, T_DELTA, T_GROSS, T_MERCHANT, T_NET, T_RC
|
||||
*/
|
||||
#ifndef VL_BALANCE_H
|
||||
#define VL_BALANCE_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_BALANCE(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_BALANCE_H */
|
||||
34
app/src/vl/svc/VL_BALANCE.pgc
Normal file
34
app/src/vl/svc/VL_BALANCE.pgc
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* VL_BALANCE.pgc - vl 모듈 서비스 VL_BALANCE (one service = one file).
|
||||
* 기능: 가맹점 순액 대차 검증 (sum(purchase.net) vs sum(settlement.net)).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_BALANCE.h"
|
||||
|
||||
void VL_BALANCE(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char merch[64], bizdate[16];
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pnet, h_snet;
|
||||
char h_merch[64], h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
gets_(b, T_MERCHANT, merch, sizeof(merch));
|
||||
gets_(b, T_BIZDATE, bizdate, sizeof(bizdate));
|
||||
strncpy(h_merch, merch, sizeof(h_merch)-1); h_merch[sizeof(h_merch)-1] = 0;
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_pnet FROM purchase
|
||||
WHERE merchant_id = :h_merch AND biz_date = :h_bizdate AND status = 'S';
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
EXEC SQL SELECT coalesce(sum(net),0) INTO :h_snet FROM settlement
|
||||
WHERE merchant_id = :h_merch AND biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
if (h_pnet != h_snet) rc = 1;
|
||||
setl(b, T_GROSS, h_pnet);
|
||||
setl(b, T_NET, h_snet);
|
||||
setl(b, T_DELTA, h_pnet - h_snet);
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_BATCH_CHK.h
Normal file
12
app/src/vl/svc/VL_BATCH_CHK.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_BATCH_CHK.h - vl 서비스 VL_BATCH_CHK 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_BIZDATE, T_COUNT, T_GROSS, T_RC
|
||||
*/
|
||||
#ifndef VL_BATCH_CHK_H
|
||||
#define VL_BATCH_CHK_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_BATCH_CHK(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_BATCH_CHK_H */
|
||||
30
app/src/vl/svc/VL_BATCH_CHK.pgc
Normal file
30
app/src/vl/svc/VL_BATCH_CHK.pgc
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* VL_BATCH_CHK.pgc - vl 모듈 서비스 VL_BATCH_CHK (one service = one file).
|
||||
* 기능: 배치 정합(purchase 건수 vs merchant_summary.txn_count).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_BATCH_CHK.h"
|
||||
|
||||
void VL_BATCH_CHK(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char bizdate[16];
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pcnt, h_scnt;
|
||||
char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
gets_(b, T_BIZDATE, bizdate, sizeof(bizdate));
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_pcnt FROM purchase WHERE biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
EXEC SQL SELECT coalesce(sum(txn_count),0) INTO :h_scnt FROM merchant_summary
|
||||
WHERE biz_date = :h_bizdate;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
if (h_pcnt != h_scnt) rc = 1; /* 집계 누락/불일치 */
|
||||
setl(b, T_COUNT, h_pcnt);
|
||||
setl(b, T_GROSS, h_scnt);
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_BIN.h
Normal file
12
app/src/vl/svc/VL_BIN.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_BIN.h - vl 서비스 VL_BIN 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_KEY1, T_RC
|
||||
*/
|
||||
#ifndef VL_BIN_H
|
||||
#define VL_BIN_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_BIN(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_BIN_H */
|
||||
27
app/src/vl/svc/VL_BIN.pgc
Normal file
27
app/src/vl/svc/VL_BIN.pgc
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* VL_BIN.pgc - vl 모듈 서비스 VL_BIN (one service = one file).
|
||||
* 기능: BIN 유효성 검증 vs mm_bin (RC 1=미등록,2=비활성).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_BIN.h"
|
||||
|
||||
void VL_BIN(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char bin[16];
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt, h_active;
|
||||
char h_bin[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
gets_(b, T_KEY1, bin, sizeof(bin));
|
||||
strncpy(h_bin, bin, sizeof(h_bin)-1); h_bin[sizeof(h_bin)-1] = 0;
|
||||
EXEC SQL SELECT count(*), coalesce(sum(CASE WHEN status='ACTIVE' THEN 1 ELSE 0 END),0)
|
||||
INTO :h_cnt, :h_active FROM mm_bin WHERE bin = :h_bin;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
if (h_cnt == 0) rc = 1;
|
||||
else if (h_active == 0) rc = 2;
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_CARD.h
Normal file
12
app/src/vl/svc/VL_CARD.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_CARD.h - vl 서비스 VL_CARD 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_RC, T_STR1
|
||||
*/
|
||||
#ifndef VL_CARD_H
|
||||
#define VL_CARD_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_CARD(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_CARD_H */
|
||||
19
app/src/vl/svc/VL_CARD.pgc
Normal file
19
app/src/vl/svc/VL_CARD.pgc
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* VL_CARD.pgc - vl 모듈 서비스 VL_CARD (one service = one file).
|
||||
* 기능: 카드번호 Luhn 검증 (RC 1=체크섬 불일치).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_CARD.h"
|
||||
|
||||
void VL_CARD(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char pan[32];
|
||||
long rc;
|
||||
gets_(b, T_STR1, pan, sizeof(pan));
|
||||
if (pan[0] == 0) { setl(b, T_RC, 2); OK(b); } /* 2=번호 없음 */
|
||||
rc = acq_luhn_ok(pan) ? 0 : 1;
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_CODEVAL.h
Normal file
12
app/src/vl/svc/VL_CODEVAL.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_CODEVAL.h - vl 서비스 VL_CODEVAL 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_KEY1, T_RC, T_STR3
|
||||
*/
|
||||
#ifndef VL_CODEVAL_H
|
||||
#define VL_CODEVAL_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_CODEVAL(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_CODEVAL_H */
|
||||
28
app/src/vl/svc/VL_CODEVAL.pgc
Normal file
28
app/src/vl/svc/VL_CODEVAL.pgc
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* VL_CODEVAL.pgc - vl 모듈 서비스 VL_CODEVAL (one service = one file).
|
||||
* 기능: 공통코드 유효성 검증 vs mm_code (RC 1=미존재).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_CODEVAL.h"
|
||||
|
||||
void VL_CODEVAL(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char grp[32], code[32];
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_cnt;
|
||||
char h_grp[32], h_code[32];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
gets_(b, T_STR3, grp, sizeof(grp)); if (grp[0] == 0) strcpy(grp, "CARD_TYPE");
|
||||
gets_(b, T_KEY1, code, sizeof(code));
|
||||
strncpy(h_grp, grp, sizeof(h_grp)-1); h_grp[sizeof(h_grp)-1] = 0;
|
||||
strncpy(h_code, code, sizeof(h_code)-1); h_code[sizeof(h_code)-1] = 0;
|
||||
EXEC SQL SELECT count(*) INTO :h_cnt FROM mm_code
|
||||
WHERE code_group = :h_grp AND code = :h_code AND status = 'ACTIVE';
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
if (h_cnt == 0) rc = 1;
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_CONFIRM.h
Normal file
12
app/src/vl/svc/VL_CONFIRM.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_CONFIRM.h - vl 서비스 VL_CONFIRM 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_ID1, T_RC
|
||||
*/
|
||||
#ifndef VL_CONFIRM_H
|
||||
#define VL_CONFIRM_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_CONFIRM(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_CONFIRM_H */
|
||||
21
app/src/vl/svc/VL_CONFIRM.pgc
Normal file
21
app/src/vl/svc/VL_CONFIRM.pgc
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* VL_CONFIRM.pgc - vl 모듈 서비스 VL_CONFIRM (one service = one file).
|
||||
* 기능: 의심거래 종결 확정 (status CLOSED by suspect_id).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_CONFIRM.h"
|
||||
|
||||
void VL_CONFIRM(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_sid;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
h_sid = getl(b, T_ID1);
|
||||
EXEC SQL UPDATE vl_suspect SET status = 'CLOSED'
|
||||
WHERE suspect_id = :h_sid AND status = 'OPEN';
|
||||
if (sqlca.sqlcode < 0 || sqlca.sqlcode == 100) { setl(b, T_RC, 1); OK(b); }
|
||||
setl(b, T_RC, 0);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_CROSSCHK.h
Normal file
12
app/src/vl/svc/VL_CROSSCHK.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_CROSSCHK.h - vl 서비스 VL_CROSSCHK 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_PURCHASE_ID, T_RC
|
||||
*/
|
||||
#ifndef VL_CROSSCHK_H
|
||||
#define VL_CROSSCHK_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_CROSSCHK(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_CROSSCHK_H */
|
||||
29
app/src/vl/svc/VL_CROSSCHK.pgc
Normal file
29
app/src/vl/svc/VL_CROSSCHK.pgc
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* VL_CROSSCHK.pgc - vl 모듈 서비스 VL_CROSSCHK (one service = one file).
|
||||
* 기능: 교차검증(매입+가맹점+승인 동시 존재, RC 비트합).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_CROSSCHK.h"
|
||||
|
||||
void VL_CROSSCHK(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_pid, h_pcnt, h_mcnt, h_acnt;
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
h_pid = getl(b, T_PURCHASE_ID);
|
||||
EXEC SQL SELECT count(*) INTO :h_pcnt FROM purchase WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
EXEC SQL SELECT count(*) INTO :h_mcnt FROM purchase p
|
||||
JOIN merchant m ON m.merchant_id = p.merchant_id WHERE p.purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
EXEC SQL SELECT count(*) INTO :h_acnt FROM approval WHERE purchase_id = :h_pid;
|
||||
if (sqlca.sqlcode < 0) FAIL(b);
|
||||
if (h_pcnt == 0) rc |= 1; /* 매입 없음 */
|
||||
if (h_mcnt == 0) rc |= 2; /* 가맹점 참조 깨짐 */
|
||||
if (h_acnt == 0) rc |= 4; /* 승인 없음 */
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
12
app/src/vl/svc/VL_DATE.h
Normal file
12
app/src/vl/svc/VL_DATE.h
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/*
|
||||
* VL_DATE.h - vl 서비스 VL_DATE 카피북 (copybook / record header).
|
||||
* 사용 UBF 필드: T_BIZDATE, T_RC
|
||||
*/
|
||||
#ifndef VL_DATE_H
|
||||
#define VL_DATE_H
|
||||
|
||||
#include "vl_svc.h"
|
||||
|
||||
void VL_DATE(TPSVCINFO *p);
|
||||
|
||||
#endif /* VL_DATE_H */
|
||||
26
app/src/vl/svc/VL_DATE.pgc
Normal file
26
app/src/vl/svc/VL_DATE.pgc
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* VL_DATE.pgc - vl 모듈 서비스 VL_DATE (one service = one file).
|
||||
* 기능: 영업일 유효성(미래일자 금지) 검증 (RC 1=미래).
|
||||
* 기존 인라인 vl_svr.pgc에서 분리; caller의 XA 브랜치에서 실행(EXEC SQL CONNECT 없음).
|
||||
* vl_svr가 tpsvrinit에서 이 서비스를 tpadvertise 한다.
|
||||
*/
|
||||
#include "VL_DATE.h"
|
||||
|
||||
void VL_DATE(TPSVCINFO *p)
|
||||
{
|
||||
UBFH *b = (UBFH *)p->data;
|
||||
char bizdate[16];
|
||||
long rc = 0;
|
||||
EXEC SQL BEGIN DECLARE SECTION;
|
||||
long h_future;
|
||||
char h_bizdate[16];
|
||||
EXEC SQL END DECLARE SECTION;
|
||||
gets_(b, T_BIZDATE, bizdate, sizeof(bizdate));
|
||||
if (bizdate[0] == 0) { setl(b, T_RC, 2); OK(b); } /* 2=일자 없음 */
|
||||
strncpy(h_bizdate, bizdate, sizeof(h_bizdate)-1); h_bizdate[sizeof(h_bizdate)-1] = 0;
|
||||
EXEC SQL SELECT CASE WHEN :h_bizdate::date > current_date THEN 1 ELSE 0 END INTO :h_future;
|
||||
if (sqlca.sqlcode < 0) { setl(b, T_RC, 3); OK(b); } /* 3=형식 오류 */
|
||||
if (h_future) rc = 1;
|
||||
setl(b, T_RC, rc);
|
||||
OK(b);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue