📄 comp.ec
字号:
/*******************************************************
* 核对交易明细(check_mx)
*
* 最后修改: 周国祥 2001/08/19
*******************************************************/
#include <stdio.h>
#include <curses.h>
#include "all.h"
#include "tool.h"
#include "macro_def.h"
$include "db_struct.h"
$include sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
int check_mx()
{
WINDOW *my_win;
$S_debit_mx mx;
$S_sys_param sys;
$char center[128];
char local[128], local_out[128], center_out[128];
char path[64], filename[128], today[11], cmd[2000];
char normal[80] = "(", rev[80] = "(", buf[160] = "";
/* old:2消费3退货4取现5存款8转帐9代收11确认21授权消费 */
/* now:1消费9退货3取现7存款6转出10转入14双转5确认2授权消费8调帐 */
/* old:6撤销 */
/* now:12撤销 */
/***
char *p, *trans[] = { "2,4,11,", "3,5,", "8,9,", "21,10," };
***/
char *p, *trans[] = { "1,3,5,8,", "9,7,", "6,10,14,", "2,4," };
int i;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Unable select sys_param table!");
return(-1);
}
del_st_space("sys_param", &sys);
/* 若是总行则退出 */
if (!strcmp(sys.bank_id, sys.adm_bank_id) &&
!strcmp(sys.host_id, sys.adm_host_id) )
return(0);
getdatef(today, "");
strcpy(path, getenv("WORKDIR"));
sprintf(center, "%s/box/mx/R/Debit%4.4s.%2.2s%2.2s%2.2s",
path, sys.adm_bank_id, today + 2, today + 4, today + 6);
$select * into :mx from debit_mx
where filename = :center;
if (SQLCODE < 0) {
daylog(ERROR, "Select debit_mx error!");
return(-1);
}
if (SQLCODE == 100 || mx.flag[0] == '0') {
daylog(ERROR, "Debit mx has not reached!");
return(-1);
}
del_st_space("debit_mx", &mx);
sprintf(filename, "/tmp/.check_mx.%d", getpid());
scr_dump(filename);
disp_below("核对交易明细");
clear_wline(stdscr, LINES-1);
h_prompt(LINES-1, 1, " < ESC 退出 > ", 0, 0);
h_prompt(LINES-1, 1, "核对交易明细", 0, 0);
my_win = newwin(19, 80, 3, 0);
mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
mvwprintw(my_win, 2, 4, "处理中, 请稍候 ...");
wrefresh(my_win);
sprintf(local, "/tmp/.debit_mx.%d", getpid());
for (i = 0; i < 7; i++) {
if (!(mx.items & (1 << (7 - i)))) continue;
if (i % 2) p = rev;
else p = normal;
strcat(p, trans[i / 2]);
}
if (strlen(rev) > 1) {
rev[strlen(rev) - 1] = ')';
if (strlen(normal) > 1) strcat(buf, "(");
sprintf(buf + strlen(buf),
"(tran_type=%d and void_tran_type in %s)",
POS_VOID, rev);
if (strlen(normal) > 1) strcat(buf, "or ");
}
if (strlen(normal) > 1) {
normal[strlen(normal) - 1] = ')';
sprintf(buf + strlen(buf),
"(tran_type in %s and void_tran_type=0)", normal);
if (strlen(rev) > 1) strcat(buf, ")");
}
/***********
sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nunload to \"%s\" select merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), local);
sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, gcc_trace, adjust_amount, currency_code, res_flag, flag1, err_flag, ret_code, refunded, oper_no, down_flag, up_flag, manunal_flag, dac from posls ");
sprintf(cmd + strlen(cmd), "where ((fk_bankid != \"%s\" and fk_bankid not in (select bankid from jgbm_basic where headquarter = \"%s\")) or authno like \"____HO\" or (sd_bankid != \"%s\" and sd_bankid not in (select bankid from jgbm_basic where headquarter = \"%s\"))) and %s ", sys.center, sys.center, sys.center, sys.center, buf);
sprintf(cmd + strlen(cmd), "and ret_code like \"00%%\" and res_flag = \"O\" and refunded = \"N\" and manunal_flag = \"N\" and remote_date = \"%s\" and card_type = \"01\" order by merchant_id, terminal_id, trace;\n!", mx.logic_date);
***********/
sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nunload to \"%s\" select merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), local);
sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, void_amt, ccy_code, tran_flag, saf_flag, offline_flag, edc_err_flag, resp_code, oper_no, snd_settle_flag, rcv_settle_flag, manual_flag from cur_tran_ls ");
sprintf(cmd + strlen(cmd), "where ((iss_bank_id != \"%s\" and iss_bank_id not in (select bank_id from bank_info where adm_bank_id = \"%s\")) or auth_no like \"____HO\" or (acq_bank_id != \"%s\" and acq_bank_id not in (select bank_id from bank_info where adm_bank_id = \"%s\"))) and %s ", sys.bank_id, sys.bank_id, sys.bank_id, sys.bank_id, buf);
sprintf(cmd + strlen(cmd), "and resp_code like \"00%%\" and saf_flag = \"0\" and tran_flag != '4' and manual_flag = \"N\" and rcv_settle_date = \"%s\" and card_type = \"%s\" order by merchant_id, terminal_id, trace_no;\n!", mx.logic_date, DEBIT_CARD);
i = system(cmd);
if (i) {
daylog(ERROR, "Debit mx unload error!");
h_winprompt(my_win, 17, 4, "数据库操作错误!", 1, 0);
goto end;
}
sprintf(center_out, "%s/box/mx/diff/%4.4s.%2.2s%2.2s%2.2s",
path, sys.adm_bank_id, today + 2, today + 4, today + 6);
sprintf(local_out, "%s/box/mx/diff/%4.4s.%2.2s%2.2s%2.2s",
path, sys.bank_id, today + 2, today + 4, today + 6);
i = comp(local, center, local_out, center_out);
switch (i) {
case -1:
daylog(ERROR, "Read %s error!", local);
break;
case -2:
daylog(ERROR, "Read %s error!", center);
break;
case -3:
daylog(ERROR, "Write %s error!", local_out);
break;
case -4:
daylog(ERROR, "Write %s error!", center_out);
break;
}
if (i) {
h_winprompt(my_win, 17, 4, "文件操作错误!", 1, 0);
unlink(local_out);
unlink(center_out);
} else {
mvwprintw(my_win, 4, 4, "交易明细核对完成!");
mvwprintw(my_win, 6, 4, "本地多出的交易明细显示在文件 %s 中",
local_out);
mvwprintw(my_win, 7, 4, "中心多出的交易明细显示在文件 %s 中",
center_out);
if (fool(local_out, center_out))
mvwprintw(my_win, 17, 4, "交易明细调整失败!");
else
mvwprintw(my_win, 9, 4, "交易明细调整完成!");
wgetch(my_win);
}
unlink(local);
end:
delwin(my_win);
scr_restore(filename);
unlink(filename);
return(0);
}
int comp(char *local, char *center, char *local_out, char *center_out)
{
FILE *fpl, *fpc, *fplo, *fpco;
char bufl[512], bufc[512];
if (!(fpl = fopen(local, "r")))
return(-1);
if (!(fpc = fopen(center, "r"))) {
fclose(fpl);
return(-2);
};
if (!(fplo = fopen(local_out, "w+"))) {
fclose(fpl);
fclose(fpc);
return(-3);
}
if (!(fpco = fopen(center_out, "w+"))) {
fclose(fpl);
fclose(fpc);
fclose(fplo);
return(-4);
}
fgets(bufl, 512, fpl);
fgets(bufc, 512, fpc);
while (!feof(fpl) && !feof(fpc)) {
switch (compare(bufl, bufc)) {
case 0:
fgets(bufl, 512, fpl);
fgets(bufc, 512, fpc);
break;
case 1:
fputs(bufl, fplo);
fgets(bufl, 512, fpl);
break;
case 2:
fputs(bufc, fpco);
fgets(bufc, 512, fpc);
break;
case 3:
fputs(bufl, fplo);
fputs(bufc, fpco);
fgets(bufl, 512, fpl);
fgets(bufc, 512, fpc);
break;
}
}
if (!feof(fpl)) {
fputs(bufl, fplo);
addall(fpl, fplo);
}
if (!feof(fpc)) {
fputs(bufc, fpco);
addall(fpc, fpco);
}
fclose(fpl);
fclose(fpc);
fclose(fplo);
fclose(fpco);
return(0);
}
int compare(char *str1, char *str2)
{
int i, trace1, trace2, type1, type2, oldtype1, oldtype2;
double amt1, amt2;
i = memcmp(str1, str2, 20);
if (i < 0) return(1);
if (i > 0) return(2);
sscanf(str1 + 20, "%d|%d|%d|%lf|", &trace1, &type1, &oldtype1, &amt1);
sscanf(str2 + 20, "%d|%d|%d|%lf|", &trace2, &type2, &oldtype2, &amt2);
if (trace1 < trace2) return(1);
if (trace1 > trace2) return(2);
if (type1 != type2) return(3);
if (oldtype1 != oldtype2) return(3);
if (amt1 != amt2) return(3);
return(0);
}
int addall(FILE *fpin, FILE *fpout)
{
char buf[512];
fgets(buf, 512, fpin);
while (!feof(fpin)) {
fputs(buf, fpout);
fgets(buf, 512, fpin);
}
return(0);
}
int fool(char *local_out, char *center_out)
{
$S_sys_param sys;
$S_tran_ls local, center;
$short indi;
$int count;
$char flag;
char cmd[512], tmp[11];
int i;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Select sys_param error!");
return(-1);
}
del_st_space("sys_param", &sys);
$delete from local_ls;
if (SQLCODE) {
daylog(ERROR, "Delete local_ls error!");
return(-1);
}
$delete from center_ls;
if (SQLCODE) {
daylog(ERROR, "Delete center_ls error!");
return(-1);
}
/***********
sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase boc_db;\nload from \"%s\" insert into local_ls (merchant_id, terminal_id, trace, trans_type, old_type, amount, sd_bankid, fk_bankid, source_bankid, target_bankid, local_date, remote_date, equip_date, equip_time, mcc, bank_type, card_type, ", local_out);
sprintf(cmd + strlen(cmd), "card_no, expire, person_id, card_no2, invoice, void_invoice, hostls, batch_no, authno, rrn, gcc_trace, adjust_amount, currency_code, res_flag, flag1, err_flag, ret_code, refunded, oper_no, down_flag, up_flag, manunal_flag, dac);\n!");
************/
sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nload from \"%s\" insert into local_ls (merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), local_out);
sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, void_amt, ccy_code, saf_flag, tran_flag, offline_flag, edc_err_flag, resp_code, oper_no, snd_settle_flag, rcv_settle_flag, manual_flag);\n!");
i = system(cmd);
if (i) {
daylog(ERROR, "load %s error!", local_out);
return(-1);
}
/********
sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase boc_db;\nload from \"%s\" insert into center_ls (merchant_id, terminal_id, trace, trans_type, old_type, amount, sd_bankid, fk_bankid, source_bankid, target_bankid, local_date, remote_date, equip_date, equip_time, mcc, bank_type, card_type, ", center_out);
sprintf(cmd + strlen(cmd), "card_no, expire, person_id, card_no2, invoice, void_invoice, hostls, batch_no, authno, rrn, gcc_trace, adjust_amount, currency_code, res_flag, flag1, err_flag, ret_code, refunded, oper_no, down_flag, up_flag, manunal_flag, dac);\n!");
********/
sprintf(cmd, "dbaccess - - >/dev/null 2>&1 <<!\ndatabase %s;\nload from \"%s\" insert into center_ls (merchant_id, terminal_id, trace_no, tran_type, void_tran_type, tran_amt, acq_bank_id, acq_host_id, iss_bank_id, snd_bank_id, snd_host_id, rcv_bank_id, rcv_host_id, snd_settle_date, rcv_settle_date, local_sys_date, local_sys_time, mcc, bank_type, card_type, ", getenv("DBNAME"), center_out);
sprintf(cmd + strlen(cmd), "card_no, exp_date, person_id, trans_acct_no, invoice_no, void_invoice_no, host_ls_no, batch_no, auth_no, tran_rrn, void_amt, ccy_code, saf_flag, tran_flag, offline_flag, edc_err_flag, resp_code, oper_no, snd_settle_flag, rcv_settle_flag, manual_flag);\n!");
i = system(cmd);
if (i) {
daylog(ERROR, "load %s error!", center_out);
return(-1);
}
begin_tran();
$declare local_cur cursor for
select * from local_ls
where void_tran_type = 0;
$open local_cur;
if (SQLCODE) {
rollback_tran();
daylog(ERROR, "Open local_cur error!");
return(-1);
}
while (1) {
$fetch local_cur into :local;
if (SQLCODE == 100) break;
if (SQLCODE) {
$close local_cur;
rollback_tran();
daylog(ERROR, "Fetch local_cur error!");
return(-1);
}
del_st_space("tran_ls", &local);
i = s_chk(sys.bank_id, sys.host_id, center.acq_bank_id, center.acq_host_id);
if (i < 0) {
$close local_cur;
rollback_tran();
daylog(ERROR, "Check depend error!");
return(-1);
}
$select count(*) into :count:indi from center_ls
where merchant_id = :local.merchant_id
and terminal_id = :local.terminal_id
and void_invoice_no = :local.invoice_no;
if (SQLCODE < 0) {
$close local_cur;
rollback_tran();
daylog(ERROR, "Select center_ls error!");
return(-1);
}
if (count == 0 || indi == -1) flag = 'K'; /* 已冲正 */
else flag = 'C'; /* 已撤消 */
if (i) {
if (flag == 'K') {
$update cur_tran_ls set
saf_flag = '1',
rcv_settle_flag = 'Y',
offline_flag = '0'
where merchant_id = :local.merchant_id
and terminal_id = :local.terminal_id
and invoice_no = :local.invoice_no
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -