📄 yl_gw_rpt.ec
字号:
/*=====================================
银联长城卡全国联行交易清算报表
相关数据库: cur_settle_ls, his_settle_ls
函数名:yl_gw_rpt()
程 序:Wubin 2001/09/15
=====================================*/
#include <stdio.h>
#include <math.h>
#include "all.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;
/* defined in cglfx.ec */
extern struct {
char bankid[12];
char hostid[3];
int count;
double amount;
} bankids[400];
typedef struct {
double tran_amt;
double settle_amt; /* 清算金额 给发卡行 */
double income_amt; /* 收单行收益 */
double merch_amt; /* 净计金额 给商户 */
double acq_income_amt; /* 我行收益 */
int tran_cnt;
} S_yl_gw;
extern double get_qs_tip(), get_bank_name(), type2buf();
int yl_gw_rpt(file, logic_date,iss_bank_id)
char *file;
$parameter char *logic_date, *iss_bank_id;
{
FILE *fp;
S_yl_gw total;
int page_no, i, ret;
$S_tran_ls ls, ls1;
$double card_discount_tmp, tran_amt_tmp;
$char sqlstr[1024], bankid[18], hostid[3], bankname[50];
$int count, bank_num;
$short indi;
double tip;
$S_sys_param sy;
page_no = i = 1;
bank_num = ret = 0;
if ( ret = select_sys_param(&sy) ) {
errcall(ERROR, "查本地参数表错误[%d]!",ret);
return ( -1 );
}
/***************
* 统计发卡行数
***************/
memset(&bankids, 0, sizeof(bankids));
if (iss_bank_id[0] == 0 ) {
sprintf(sqlstr,
"select distinct iss_bank_id, count(*) \
from cur_settle_ls \
where iss_bank_id != \'VOID\' \
and tran_type in (1,2,3,5,6,7,8,9,10,14) \
and saf_flag = \'0\' \
and tran_flag = \'0\' \
and manual_flag = \'N\' \
and resp_code like \'00\' \
and snd_settle_date = \'%s\' \
and acq_bank_id =\'%s\' \
and card_type = \'01\' and bank_type = \'04\' \
and card_no[1] in (4,5) group by iss_bank_id", \
logic_date, sy.bank_id);
$prepare yl_iss from $sqlstr;
$declare yl_iss_cur cursor for yl_iss;
$open yl_iss_cur;
if ( SQLCODE ) {
errcall ( ERROR, "open yl_iss_cur err[%d]",SQLCODE );
return ( -1 );
}
while ( bank_num < 400 ) {
$fetch yl_iss_cur into $bankid, $count:indi;
if ( SQLCODE == SQLNOTFOUND )
break;
if ( SQLCODE ) {
$close yl_iss_cur;
errcall ( ERROR, "fetch yl_iss_cur err[%d]",SQLCODE );
return ( -1 );
}
if ( indi != -1 && count ) {
DelSpace(bankid);
strcpy ( bankids[bank_num].bankid, bankid );
strcpy ( bankids[bank_num].hostid, "00" );
bankids[bank_num].count = count;
bank_num ++;
}
}
$close yl_iss_cur;
sprintf(sqlstr,
"select distinct iss_bank_id, count(*) \
from his_settle_ls \
where iss_bank_id != \'VOID\' \
and tran_type in (1,2,3,5,6,7,8,9,10,14) \
and saf_flag = \'0\' \
and tran_flag = \'0\' \
and manual_flag = \'N\' \
and resp_code like \'00\' \
and snd_settle_date = \'%s\' \
and acq_bank_id =\'%s\' \
and card_type = \'01\' and bank_type = \'04\' \
and card_no[1] in (4,5) group by iss_bank_id", \
logic_date, sy.bank_id);
$prepare yl_iss2 from $sqlstr;
$declare yl_iss_cur2 cursor for yl_iss2;
$open yl_iss_cur2;
if ( SQLCODE ) {
errcall ( ERROR, "open yl_iss_cur2 err[%d]",SQLCODE );
return ( -1 );
}
while ( bank_num < 400 ) {
$fetch yl_iss_cur2 into $bankid, $count:indi;
if ( SQLCODE == SQLNOTFOUND )
break;
if ( SQLCODE ) {
$close yl_iss_cur2;
errcall ( ERROR, "fetch yl_iss_cur2 err[%d]",SQLCODE );
return ( -1 );
}
if ( indi != -1 && count ) {
DelSpace(bankid);
for ( i=0; i<bank_num; i++ )
if ( !strcmp ( bankids[i].bankid, bankid) )
break;
if ( i >= bank_num ) {
strcpy ( bankids[bank_num].bankid, bankid );
strcpy ( bankids[bank_num].hostid, "00" );
bankids[bank_num].count = count;
bank_num ++;
} else {
bankids[i].count += count;
}
}
}
$close yl_iss_cur2;
} else {
strcpy(bankids[0].bankid, iss_bank_id);
}
/****************/
if (!(fp = fopen(file, "w"))) {
daylog(ERROR, "Open %s error!", file);
return(-1); /* File operate error */
}
bank_num = 0;
while (bankids[bank_num].bankid[0] != 0) {
strcpy(iss_bank_id, bankids[bank_num].bankid);
if (FileHead_yl_gw(fp, logic_date,iss_bank_id /*,page_no */)) {
fclose(fp);
return(-2); /* Database operate error */
}
memset(&total, 0, sizeof(S_yl_gw));
$declare yl_cur cursor for
select * from cur_settle_ls
where iss_bank_id = :iss_bank_id
and tran_type in (1,2,3,5,6,7,8,9,10,14)
and saf_flag = '0'
and tran_flag = '0'
and manual_flag = 'N'
and resp_code like '00%'
and snd_settle_date = :logic_date
and acq_bank_id = :sy.bank_id
and card_type = '01' and card_no[1] in (4,5)
order by card_no;
$open yl_cur;
if (SQLCODE) {
daylog(ERROR, "Open yl_cur error![%d]", SQLCODE);
fclose(fp);
return(-2);
}
while (1) {
$fetch yl_cur into :ls;
if (SQLCODE == 100) break;
if (SQLCODE) {
daylog(ERROR, "Fetch yl_cur error![%d]", SQLCODE);
$close yl_cur;
fclose(fp);
return(-2);
}
tip = 0.0;
card_discount_tmp = 0.0;
/* 根据商户号获得商户回扣率 */
EXEC SQL SELECT card_discount INTO :card_discount_tmp
FROM merchant_card
WHERE merchant_id=:ls.merchant_id and card_type='01' and bank_type='04';
tip = ((card_discount_tmp / 100) * ls.tran_amt); /* 手续费(交易金额×商户回扣率) */
del_st_space("tran_ls", &ls);
FileDetail_yl_gw(fp, ls, &total, sy.bank_id,/**, hostid*/ tip);
}
$close yl_cur;
$declare yl_cur2 cursor for
select * from his_settle_ls
where iss_bank_id = :iss_bank_id
and tran_type in (1,2,3,5,6,7,8,9,10,14)
and saf_flag = '0'
and tran_flag = '0'
and manual_flag = 'N'
and resp_code like '00%'
and snd_settle_date = :logic_date
and acq_bank_id = :sy.bank_id
and card_type = '01' and card_no[1] in (4,5)
order by card_no;
$open yl_cur2;
if (SQLCODE) {
daylog(ERROR, "Open yl_cur2 error![%d]", SQLCODE);
fclose(fp);
return(-2);
}
while (1) {
$fetch yl_cur2 into :ls1;
if (SQLCODE == 100) break;
if (SQLCODE) {
daylog(ERROR, "Fetch yl_cur2 error![%d]", SQLCODE);
$close yl_cur;
fclose(fp);
return(-2);
}
tip = 0.0;
card_discount_tmp = 0.0;
/* 根据商户号获得商户回扣率 */
EXEC SQL SELECT card_discount INTO :card_discount_tmp
FROM merchant_card
WHERE merchant_id=:ls1.merchant_id and card_type='01' and bank_type='04';
tip = ((card_discount_tmp / 100) * ls1.tran_amt); /* 手续费(交易金额×商户回扣率) */
del_st_space("tran_ls", &ls1);
FileDetail_yl_gw(fp, ls1, &total, sy.bank_id,/**, hostid*/ tip);
}
$close yl_cur2;
FileTail_yl_gw(fp, &total);
bank_num++;
}
fclose(fp);
return(0);
}
int FileHead_yl_gw(FILE *fp, char *logic_date, char *bankid /* ,int page_no */)
{
char date[11],bank_name[21], tmp_logic_date[11];
$S_sys_param sys;
$select * into :sys from sys_param;
if (SQLCODE) {
daylog(ERROR, "Select sys_param error!");
return(-1);
}
del_st_space("sys_param", &sys);
getdatef(date, "/");
get_bank_name(bankid,"00", bank_name);
str2date(tmp_logic_date,logic_date,"/");
fprintf(fp, "%47s 中国银行 BTS 系统\n", " ");
fprintf(fp, "%47s银联长城卡全国联行交易清算报表\n", " ");
fprintf(fp, "记账日期:%s\n",tmp_logic_date);
/*================== WuBin 2001-9-18 9:45 ======Start==============
fprintf(fp, "出表日期:%s %128s页号: %d\n",date," ",page_no);
===========================2001-9-18 9:45=======End==============*/
fprintf(fp, "出表日期:%s %128s\n",date," ");
fprintf(fp, "==============================================================================================================================================================================\n");
fprintf(fp, "发卡行联行号:%s 发卡行名: %s\n",bankid,bank_name);
fprintf(fp, "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
fprintf(fp, "%-21s %-8s %8s %14s %6s %14s %14s %6s %-15s %-40s %14s\n", "卡 号", "交易类别","交易日期", "交易金额", "手续费", "净计金额", "发卡行收益", "授权码", "商户号", "商户名称", "清算金额");
fprintf(fp, "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
return(0);
}
int FileDetail_yl_gw(FILE *fp, S_tran_ls ls, S_yl_gw *ptotal, char *center, double tip)
{
double acq_income,iss_income, income, merch_amt;
int income_i = 0;
char buf[16], merchant_name[41], income_rebate[14];
int flag;
char tmp_date[11]; /* YYYY/MM/DD */
#ifdef Wubin20010920mod
memset(income_rebate, '\0', sizeof(income_rebate));
readtab("sysparam.tab", "INCOME", "INCOME_REBATE", income_rebate);
DelSpace(income_rebate);
if (income_rebate[0] == 0)
strcpy(income_rebate,"5");
income_i = atoi(income_rebate);
iss_income = ls.tran_amt * (((double)income_i) / 1000); /* 发卡行收益比例(交易金额×0.005) */
#endif
income = ls.tran_amt * 0.005;/* 发卡行收益(交易金额×0.005) */
iss_income = income;
acq_income = (tip - iss_income);/* 收单行收益(手续费-发卡行收益) */
merch_amt = ls.tran_amt - tip; /* 净计金额 */
str2date(tmp_date, ls.local_sys_date, "/");
get_merchant_name(ls.merchant_id, merchant_name);
type2buf(ls.tran_type, buf);
if (ls.tran_amt != 0) {
fprintf(fp, "%-6.6s-%-4.4s-%-9.9s %-8s %8s %14.2lf %6.2lf %14.2lf %14.2lf %6s %-15.15s %-40.40s %14.2lf \n", ls.card_no, ls.card_no + 6, ls.card_no + 10, buf, ls.local_sys_date,ls.tran_amt, tip, merch_amt, income ,ls.auth_no, ls.merchant_id, merchant_name, ls.tran_amt - income);
}
flag = strcmp(ls.iss_bank_id, center);
switch (ls.tran_type) {
case PURCHASE:
case WITHDRAWAL:
case CONFIRM:
case TRANS_OUT:
if (flag) {
if (ls.tran_amt != 0) {
ptotal->tran_cnt++;
ptotal->tran_amt += ls.tran_amt;
ptotal->settle_amt += ls.tran_amt - income;
ptotal->income_amt += income;
ptotal->merch_amt += merch_amt;
ptotal->acq_income_amt += acq_income;
}
}
break;
case REFUND:
case DEPOSIT:
if (flag) {
if (ls.tran_amt != 0) {
ptotal->tran_cnt++;
ptotal->tran_amt += ls.tran_amt;
ptotal->settle_amt += ls.tran_amt - income;
ptotal->income_amt += income;
ptotal->merch_amt += merch_amt;
ptotal->acq_income_amt += acq_income;
}
}
break;
}
return(0);
}
int FileTail_yl_gw(FILE *fp, S_yl_gw *ptotal)
{
fprintf(fp, "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
if (ptotal->tran_cnt)
fprintf(fp, "%s %s %6d %s %-14.2lf %s %-14.2lf %s %-14.2lf %s %-14.2lf\n\n\n\n\n\n\n\n\n\n\n\f", "小计: ", "交易笔数: ", ptotal->tran_cnt, "交易金额: ", ptotal->tran_amt, "净计金额: ", ptotal->merch_amt, "清算金额: ", ptotal->settle_amt, "收单行收益: ", ptotal->acq_income_amt);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -