⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yl_gw_rpt.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 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 + -