wk_rpt.ec
来自「在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便」· EC 代码 · 共 415 行
EC
415 行
/****************************************************
* 外卡报表处理 wk_rpt()
* called by gen_wr() -- in gen_rpt.ec
* EDC 批次统计报表
* EDC 批次明细报表
* EDC 批次明细对帐单
*
* 最后修改: 周国祥 2001/08/26
****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "macro_def.h"
#include "all.h"
$include sqlca;
$include "db_struct.h";
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
typedef struct {
double normal_amt;
int normal_cnt;
double refund_amt;
int refund_cnt;
double adjust_amt;
int adjust_cnt;
double amt;
int cnt;
} Edc_tj;
typedef struct {
char name[9];
int cnt;
double amt;
double fee;
double rebate;
} Edc_dz;
void FileHead_tj(FILE *fp, char *e_date, S_sys_param sy, char *date, char *time)
{
char bank_name[128];
char e_date1[11]; /* YYYY/MM/DD */
fprintf(fp, "%45s中国银行BTS系统信用卡\n", " ");
fprintf(fp, "%45sEDC 批次统计报表\n", " ");
str2date(e_date1, e_date, "/");
fprintf(fp, "BTS-300%85s清算日期: %s\n", " ", e_date1);
get_bank_name(sy.bank_id, sy.host_id, bank_name);
fprintf(fp, "%-5.5s%-88s%s %s\n", sy.bank_id, bank_name, date, time);
fprintf(fp, "----------------------------------------------------------------------------------------------------------------\n");
fprintf(fp, "%-8s %7s %14s %8s %14s %8s %14s %8s %14s %8s\n", "EDC 号", "批次号", "交易金额", "交易笔数", "退货金额", "退货笔数", "调帐金额", "调帐笔数", "总金额", "总笔数");
fprintf(fp, "----------------------------------------------------------------------------------------------------------------\n");
}
void FileHead_mx(FILE *fp, char *e_date, S_sys_param sy, char *date, char *time)
{
char bank_name[128];
char e_date1[11]; /* YYYY/MM/DD */
fprintf(fp, "%27s中国银行BTS系统信用卡\n", " ");
fprintf(fp, "%27sEDC 批次明细报表\n", " ");
str2date(e_date1, e_date, "/");
fprintf(fp, "BTS-301%49s清算日期: %s\n", " ", e_date1);
get_bank_name(sy.bank_id, sy.host_id, bank_name);
fprintf(fp, "%-5.5s%-52s%s %s\n\n\n", sy.bank_id, bank_name, date, time);
}
void FileHead_dz(FILE *fp, char *e_date, S_sys_param sy, char *date, char *time)
{
char bank_name[128];
char e_date1[11]; /* YYYY/MM/DD */
fprintf(fp, "%28s中国银行BTS系统信用卡\n", " ");
fprintf(fp, "%28sEDC 批次明细对帐单\n", " ");
str2date(e_date1, e_date, "/");
fprintf(fp, "BTS-302%50s清算日期: %s\n", " ", e_date1);
get_bank_name(sy.bank_id, sy.host_id, bank_name);
fprintf(fp, "%-5.5s%-53s%s %s\n\n\n", sy.bank_id, bank_name, date, time);
}
void FileSubHead_mx(FILE *fp, S_tran_ls ls, char *tmp)
{
fprintf(fp, "商户号: %-15.15s 商户名称: %s\n", ls.merchant_id, tmp);
fprintf(fp, "EDC 号: %-15.15s 批 次 号: %ld\n", ls.terminal_id, ls.batch_no);
fprintf(fp, "----------------------------------------------------------------------------\n");
fprintf(fp, "%-19s %6s %14s %14s %-10s %-8s\n", "卡 号", "授权码", "交易金额", "原 金 额", "交易日期", "交易时间");
fprintf(fp, "----------------------------------------------------------------------------\n");
}
void FileSubHead_dz(FILE *fp, S_tran_ls ls, char *tmp)
{
fprintf(fp, "商户号: %-15.15s 商户名称: %s\n", ls.merchant_id, tmp);
fprintf(fp, "EDC 号: %-15.15s 批 次 号: %ld\n", ls.terminal_id, ls.batch_no);
fprintf(fp, "-----------------------------------------------------------------------------\n");
fprintf(fp, "%-19s %-6s %6s %14s %-8s %-10s %-8s\n", "卡 号", "有效期", "授权码", "交易金额", "交易类型", "交易日期", "交易时间");
fprintf(fp, "-----------------------------------------------------------------------------\n");
}
void add_batch(Edc_tj *pbatch, S_tran_ls ls)
{
switch (ls.tran_type) {
case REFUND:
pbatch->refund_amt += ls.tran_amt;
pbatch->refund_cnt ++;
pbatch->amt -= ls.tran_amt;
pbatch->cnt ++;
break;
case ADJUST:
pbatch->adjust_amt += ls.tran_amt - ls.void_amt;
pbatch->adjust_cnt ++;
pbatch->amt += ls.tran_amt - ls.void_amt;
pbatch->cnt ++;
break;
default:
pbatch->normal_amt += ls.tran_amt;
pbatch->normal_cnt ++;
pbatch->amt += ls.tran_amt;
pbatch->cnt ++;
break;
}
}
void FileDetail_tj(FILE *fp, char *ter_id, long batch_no,
Edc_tj batch, Edc_tj *ptotal)
{
ptotal->normal_amt += batch.normal_amt;
ptotal->normal_cnt += batch.normal_cnt;
ptotal->refund_amt += batch.refund_amt;
ptotal->refund_cnt += batch.refund_cnt;
ptotal->adjust_amt += batch.adjust_amt;
ptotal->adjust_cnt += batch.adjust_cnt;
ptotal->amt += batch.amt;
ptotal->cnt += batch.cnt;
fprintf(fp, "%-8s %7ld %14.2lf %8d %14.2lf %8d %14.2lf %8d %14.2lf %8d\n", ter_id, batch_no, batch.normal_amt, batch.normal_cnt, batch.refund_amt, batch.refund_cnt, batch.adjust_amt, batch.adjust_cnt, batch.amt, batch.cnt);
}
void FileDetail_mx(FILE *fp, S_tran_ls ls)
{
char tmp_date[11]; /* YYYY/MM/DD */
char tmp_time[9]; /* hh:mm:ss */
str2date(tmp_date, ls.local_sys_date, "/");
str2time(tmp_time, ls.local_sys_time, ":");
fprintf(fp, "%-19s %6s %14.2lf %14.2lf %-10s %-8s\n",
ls.card_no, ls.auth_no,
(ls.tran_type==ADJUST)?ls.tran_amt-ls.void_amt:ls.tran_amt,
(ls.tran_type==ADJUST)?ls.tran_amt:ls.tran_amt-ls.void_amt,
tmp_date, tmp_time);
}
void FileDetail_dz(FILE *fp, S_tran_ls ls, Edc_dz *cards)
{
char buf[16];
int i;
char tmp_date[11]; /* YYYY/MM/DD */
char tmp_time[9]; /* hh:mm:ss */
type2buf(ls.tran_type, buf);
i = atoi(ls.card_type) - 51;
cards[i].cnt++;
switch (ls.tran_type) {
case REFUND:
cards[i].amt -= ls.tran_amt;
break;
case ADJUST:
cards[i].amt += ls.tran_amt - ls.void_amt;
cards[i].fee += (ls.tran_amt - ls.void_amt) * cards[i].rebate;
break;
default:
cards[i].amt += ls.tran_amt;
cards[i].fee += ls.tran_amt * cards[i].rebate;
break;
}
str2date(tmp_date, ls.local_sys_date, "/");
str2time(tmp_time, ls.local_sys_time, ":");
fprintf(fp, "%-19s %-6s %6s %14.2lf %-8.8s %-10s %-8s\n",
ls.card_no, ls.exp_date, ls.auth_no,
(ls.tran_type==ADJUST)?ls.tran_amt-ls.void_amt:ls.tran_amt,
buf, tmp_date, tmp_time);
}
void FileTail_tj(FILE *fp, Edc_tj total)
{
fprintf(fp, "----------------------------------------------------------------------------------------------------------------\n");
if (total.cnt) fprintf(fp, "%-16s %14.2lf %8d %14.2lf %8d %14.2lf %8d %14.2lf %8d\n", "合 计", total.normal_amt, total.normal_cnt, total.refund_amt, total.refund_cnt, total.adjust_amt, total.adjust_cnt, total.amt, total.cnt);
}
void FileTail_mx(FILE *fp, Edc_tj batch)
{
fprintf(fp, "----------------------------------------------------------------------------\n");
fprintf(fp, "%-16s %14s %8s %14s %8s\n", "合 计", "交易金额", "交易笔数", "退货金额", "退货笔数");
fprintf(fp, "%-16s %14.2lf %8d %14.2lf %8d\n", " ", batch.normal_amt, batch.normal_cnt, batch.refund_amt, batch.refund_cnt);
fprintf(fp, "%-16s %14s %8s %14s %8s\n", " ", "调帐金额", "调帐笔数", "总 金 额", "总 笔 数");
fprintf(fp, "%-16s %14.2lf %8d %14.2lf %8d\n\n\n", " ", batch.adjust_amt, batch.adjust_cnt, batch.amt, batch.cnt);
}
void FileTail_dz(FILE *fp, Edc_dz *cards, int flag)
{
int i;
fprintf(fp, "-----------------------------------------------------------------------------\n\n");
fprintf(fp, "----------------------------------------------------------------\n");
fprintf(fp, "%-8s %7s %8s %14s %8s %14s\n", "卡 种", "回扣率", "交易笔数", "交易金额", "手续费", "净金额");
fprintf(fp, "----------------------------------------------------------------\n");
for (i = 0; i < 5; i++) {
fprintf(fp, "%-8.8s %5.2f %% %8d %14.2lf %8.2lf %14.2lf\n", cards[i].name, cards[i].rebate * 100, cards[i].cnt, cards[i].amt, cards[i].fee, cards[i].amt - cards[i].fee);
cards[5].cnt += cards[i].cnt;
cards[5].amt += cards[i].amt;
cards[5].fee += cards[i].fee;
cards[6].cnt += cards[i].cnt;
cards[6].amt += cards[i].amt;
cards[6].fee += cards[i].fee;
}
fprintf(fp, "----------------------------------------------------------------\n");
fprintf(fp, "%-8.8s %7s %8d %14.2lf %8.2lf %14.2lf\n", cards[5].name, " ", cards[5].cnt, cards[5].amt, cards[5].fee, cards[5].amt - cards[5].fee);
if (flag) fprintf(fp, "%-8.8s %7s %8d %14.2lf %8.2lf %14.2lf\n", cards[6].name, " ", cards[6].cnt, cards[6].amt, cards[6].fee, cards[6].amt - cards[6].fee);
fprintf(fp, "\n\n");
}
int wk_rpt(char *e_date, char *tj, char *mx, char *dz)
{
Edc_dz cards[7] = { {"威士卡", }, {"万事达卡",},
{"运通卡", }, {"大莱卡", },
{"JCB 卡", }, {"批次总计",},
{"商户总计",} };
Edc_tj batch, total;
FILE *fp_tj, *fp_mx, *fp_dz;
char mer_id[16], ter_id[9];
char date[11], time[9];
$char sql[320], tmp[32];
long batch_no;
int i;
$S_tran_ls ls;
$S_sys_param sy;
$S_merchant_card s_c;
$select * into :sy from sys_param;
if (SQLCODE) {
daylog(ERROR, "Fetch sys_param error!");
return(-1);
}
del_st_space("sys_param", &sy);
$select distinct snd_settle_date into :tmp from cur_settle_ls;
if (SQLCODE < 0) {
daylog(ERROR, "Fetch cur_settle_ls error!");
return(-1);
}
if (SQLCODE == 100)
tmp[0] = 0;
if (strcmp(e_date, tmp))
strcpy(tmp, "his_settle_ls");
else
strcpy(tmp, "cur_settle_ls");
getdatef(date, "/");
gettimef(time, ":");
fp_tj = fopen(tj, "w");
if (!fp_tj) {
daylog(ERROR, "Open %s error!", tj);
return(-1);
}
FileHead_tj(fp_tj, e_date, sy, date, time);
if (mx[0]) {
fp_mx = fopen(mx, "w");
if (!fp_mx) {
daylog(ERROR, "Open %s error!", mx);
fclose(fp_tj);
return(-1);
}
FileHead_mx(fp_mx, e_date, sy, date, time);
}
if (dz[0]) {
fp_dz = fopen(dz, "w");
if (!fp_dz) {
daylog(ERROR, "Open %s error!", dz);
fclose(fp_tj);
if (mx[0]) fclose(fp_mx);
return(-1);
}
FileHead_dz(fp_dz, e_date, sy, date, time);
}
sprintf(sql, "select * from %s where acq_bank_id = '%s' and card_type > '50' and snd_settle_date = '%s' order by merchant_id, terminal_id, batch_no, card_no", tmp, sy.bank_id, e_date);
$prepare s_sql from :sql;
$declare stl_cur cursor for s_sql;
$open stl_cur;
if (SQLCODE) {
daylog(ERROR, "Open stl_cur error!");
fclose(fp_tj);
if (mx[0]) fclose(fp_mx);
if (dz[0]) fclose(fp_dz);
return(-1);
}
memset(&total, 0, sizeof(Edc_tj));
mer_id[0] = ter_id[0] = 0;
batch_no = -1;
while (1) {
$fetch stl_cur into :ls;
if (SQLCODE == 100)
break;
if (SQLCODE < 0) {
daylog(ERROR, "Fetch stl_cur error!");
$close stl_cur;
fclose(fp_tj);
if (mx[0]) fclose(fp_mx);
if (dz[0]) fclose(fp_dz);
return(-1);
}
del_st_space("tran_ls", &ls);
if (strcmp(ls.merchant_id, mer_id) ||
strcmp(ls.terminal_id, ter_id) ||
ls.batch_no != batch_no) {
if (batch_no != -1) {
if (mx[0]) FileTail_mx(fp_mx, batch);
if (dz[0]) FileTail_dz(fp_dz, cards,
strcmp(ls.merchant_id, mer_id));
FileDetail_tj(fp_tj, ter_id, batch_no,
batch, &total);
}
if (strcmp(ls.merchant_id, mer_id)) {
$select merchant_cname
into :tmp from merchant_base
where merchant_id = :ls.merchant_id;
if (SQLCODE) {
daylog(WARN, "Fetch name of %s error!",
ls.merchant_id);
strcpy(tmp, "Unknown");
}
DelSpace(&tmp);
for (i = 0; i < 7; i++) {
cards[i].cnt = 0;
cards[i].amt = 0.0;
cards[i].fee = 0.0;
cards[i].rebate = 0.0;
}
#ifdef zgx010826_modi
$select * into :s_c from merchant_card
where merchant_id = :ls.merchant_id;
if (SQLCODE) {
daylog(WARN, "Fetch fee of %s error!",
ls.merchant_id);
}
del_st_space("merchant_card", &s_c);
cards[0].rebate = s_c.visa_rebate / 100;
cards[1].rebate = s_c.master_rebate / 100;
cards[2].rebate = s_c.ae_rebate / 100;
cards[3].rebate = s_c.dinner_rebate / 100;
cards[4].rebate = s_c.jcb_rebate / 100;
#else
get_rebate(ls.merchant_id, VISA_CARD, &cards[0].rebate);
get_rebate(ls.merchant_id, MC_CARD, &cards[1].rebate);
get_rebate(ls.merchant_id, AE_CARD, &cards[2].rebate);
get_rebate(ls.merchant_id, DINER_CARD, &cards[3].rebate);
get_rebate(ls.merchant_id, JCB_CARD, &cards[4].rebate);
#endif
}
for (i = 0; i < 6; i++) {
cards[i].cnt = 0;
cards[i].amt = 0.0;
cards[i].fee = 0.0;
}
memset(&batch, 0, sizeof(Edc_tj));
strcpy(mer_id, ls.merchant_id);
strcpy(ter_id, ls.terminal_id);
batch_no = ls.batch_no;
if (mx[0]) FileSubHead_mx(fp_mx, ls, tmp);
if (dz[0]) FileSubHead_dz(fp_dz, ls, tmp);
}
add_batch(&batch, ls);
if (fp_mx) FileDetail_mx(fp_mx, ls);
if (fp_dz) FileDetail_dz(fp_dz, ls, cards);
}
$close stl_cur;
if (batch_no != -1)
FileDetail_tj(fp_tj, ter_id, batch_no, batch, &total);
FileTail_tj(fp_tj, total);
if (batch_no != -1) {
if (mx[0]) FileTail_mx(fp_mx, batch);
if (dz[0]) FileTail_dz(fp_dz, cards, 1);
}
fclose(fp_tj);
if (mx[0]) fclose(fp_mx);
if (dz[0]) fclose(fp_dz);
return(0);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?