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 + -
显示快捷键?