end_day_rpt.ec

来自「在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便」· EC 代码 · 共 2,216 行 · 第 1/4 页

EC
2,216
字号
/****************************************************
 *	商户入帐明细报表 shop_r_rpt(), gen_shop_r_rpt()
 *	银行对帐明细报表 bank_d_rpt(), gen_bank_d_rpt_cre(),
				       gen_bank_d_rpt_fg(),
 
 * zgx010817_NOTE
 * 原仅处理长城信用卡、长城借记卡以及五种外卡。
 * 现暂加上他行信用卡、他行借记卡;
 * 以后最好区分各银行的信用卡、借记卡。
 *
 * 最后修改:	周国祥 2001/08/16
 ****************************************************/
#include <stdio.h>
#include <curses.h>
#include <fcntl.h>
#include <signal.h>
#include "all.h"
#include "tool.h"
#include "macro_def.h"

#include "credit_rpt.h"

$include "db_struct.h"
$include sqlca;
$include sqlhdr;

/* use for cards[] */
#define CARD_VISA		0	/* 51 */
#define CARD_MC			1	/* 52 */
#define CARD_AE			2	/* 53 */
#define CARD_DINER		3	/* 54 */
#define CARD_JCB		4	/* 55 */
#define CARD_BOC_CRE	5	/* 长城信用卡 */
#define CARD_BOC_DE		6	/* 长城借记卡 */
#define CARD_BOC_UN_CRE	7	/* 银联信用卡 */
#define CARD_OTH_CRE	8	/* 他行信用卡 */
#define CARD_OTH_DE		9	/* 他行借记卡 */

#define	SETTLE_CARDS_NUM	10	/* 五种外卡、长城信用卡、借记卡以及 */
					/* 银联信用卡、他行信用卡、借记卡	            */


typedef struct {
	char	name[11];
	int		cnt;
	double	amt;
	double	fee;
	double	rebate;
} Edc_shop_dz;

EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

$S_sys_param	sy;
$S_tran_ls	ls;

char s_date[11], e_date[11];	/* YYYYMMDD */
char s_date1[11], e_date1[11];	/* YYYY/MM/DD */
int ch;

void FileHead_shop_r_rpt(FILE *fp, S_sys_param sy)
{
char date[11], time[9];
char bank_name[128];

	getdatef( date, "/" );
	gettimef( time, ":" );
	fprintf(fp, "%33s%s\n", " ", GV_filehead);
	fprintf(fp, "%33s商户入帐明细报表\n", " ");
	fprintf(fp, "%26s清算日期: %s--%s\n", " ", s_date1, e_date1 );
#ifdef wyz020427_mod
	get_bank_name(sy.bank_id, sy.host_id, bank_name);
	fprintf(fp, "%-11.11s%-50s%s %s\n\n", sy.bank_id, bank_name, date, time);
#else
	get_bank_name1(G_bankid, bank_name);
	fprintf(fp, "%-11.11s %-50s%s %s\n\n", G_bankid, bank_name, date, time);
#endif
}

void FileHead_bank_d_rpt(FILE *fp, S_sys_param sy, void *title)
{
char date[11], time[9];
char bank_name[128];

	getdatef( date, "/" );
	gettimef( time, ":" );
	fprintf(fp, "%33s中国银行BTS系统%s\n", " ", title);
	fprintf(fp, "%33s   银行对帐明细报表\n", " ");
	fprintf(fp, "%26s清算日期: %s--%s\n", " ", s_date1, e_date1 );
#ifdef wyz020427_mod
	get_bank_name(sy.bank_id, sy.host_id, bank_name);
	fprintf(fp, "%-11.11s%-56s%s %s\n\n", sy.bank_id, bank_name, date, time);
#else
	get_bank_name1(G_bankid, bank_name);
	fprintf(fp, "%-11.11s%-56s%s %s\n\n", G_bankid, bank_name, date, time);
#endif
	fprintf(fp, "--------------------------------------------------------------------------------------\n");

	fprintf(fp, "%-15.15s  %6s  %-19s  %8s  %14s  %6s  %-10s \n", "  商户号", "批次号", "      卡  号",  "交易类型", "交易金额   ", "授权码", " 交易日期" );

	fprintf(fp, "--------------------------------------------------------------------------------------\n");
}

void FileSubHead_shop_r_rpt(FILE *fp, S_tran_ls ls, char *tmp)
{
	fprintf(fp, "商户号: %-15.15s 商户名称: %s\n", ls.merchant_id, tmp); 
	fprintf(fp, "--------------------------------------------------------------------------------------\n");

	fprintf(fp, "%8s  %-19s  %8s  %14s  %6s  %-10s  %-8s\n", " EDC 号 ", "      卡  号", "交易类型",  "交易金额   ", "授权码", " 交易日期", "交易时间");

	fprintf(fp, "--------------------------------------------------------------------------------------\n");
}

void FileSubHead_bank_d_rpt(FILE *fp, void *merch, int count_bs, double count_je)
{
	fprintf(fp, "%-15s          (%6d)  %35.2lf \n\n\n", merch, count_bs, count_je );
}

void FileDetail_shop_r_rpt(FILE *fp, S_tran_ls ls)
{
	char tran_name[9];
	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, ":");

	type2buf( ls.tran_type, tran_name );
	fprintf(fp, "%8s  %-19s  %8s  %14.2lf  %6s  %-15s  %-8s\n",
		ls.terminal_id, ls.card_no, tran_name, 
		(ls.tran_type==ADJUST)?ls.tran_amt-ls.void_amt:ls.tran_amt,
		ls.auth_no, tmp_date, tmp_time);

}

void FileDetail_bank_d_rpt(FILE *fp, S_tran_ls ls)
{
	char tran_name[9];
	char tmp_date[11];	/* YYYY/MM/DD */
	
	str2date(tmp_date, ls.local_sys_date, "/");
	
	type2buf( ls.tran_type, tran_name );
	fprintf(fp, "%-15.15s  %06d  %-19s  %8s  %14.2lf  %6s  %-10s  \n",
		ls.merchant_id, ls.batch_no, ls.card_no, tran_name,
		(ls.tran_type==ADJUST)?ls.tran_amt-ls.void_amt:ls.tran_amt,
		ls.auth_no, tmp_date);

}

void FileTail_shop_r_rpt(FILE *fp, Edc_shop_dz *cards)
{
	int i;
	double tmp_db, inout();

	fprintf(fp, "\n======================================================================================\n");
	fprintf(fp, "%-10s   %6s   %14s   %8s   %8s   %14s\n", "  卡  类", "笔数 ", "交易金额   ", " 回扣率 ", "手续费  ", "交易净额   " );

	fprintf(fp, "--------------------------------------------------------------------------------------\n");
	/*
	 * zgx010817_NOTE
	 * 每种卡类一条,原仅处理长城信用卡、长城借记卡以及五种外卡。
	 * 现暂加上银联卡信用卡、他行信用卡、他行借记卡;
	 * 以后最好区分各银行的信用卡、借记卡。
	 */
	for ( i = 0; i < SETTLE_CARDS_NUM/*7*/; i ++ ) {
		tmp_db = 0.0;
		if ( cards[i].cnt > 0 ) {
			tmp_db = inout(cards[i].fee); /* 四舍五入 */	
			cards[i].fee = tmp_db;
			fprintf( fp, "%-10s   %6d   %14.2lf   %6.2f%%   %8.2lf   %14.2lf\n", cards[i].name, cards[i].cnt, cards[i].amt, cards[i].rebate * 100, cards[i].fee, cards[i].amt - cards[i].fee );
		}
		cards[SETTLE_CARDS_NUM].cnt += cards[i].cnt;
		cards[SETTLE_CARDS_NUM].amt += cards[i].amt;
		cards[SETTLE_CARDS_NUM].fee += cards[i].fee;	
	} 

	fprintf(fp, "--------------------------------------------------------------------------------------\n");
	fprintf(fp, "%-10s   %6d   %14.2lf   %8s   %8.2lf   %14.2lf\n", cards[SETTLE_CARDS_NUM].name, cards[SETTLE_CARDS_NUM].cnt, cards[SETTLE_CARDS_NUM].amt, " ", cards[SETTLE_CARDS_NUM].fee, cards[SETTLE_CARDS_NUM].amt - cards[SETTLE_CARDS_NUM].fee);
	fprintf(fp, "======================================================================================\n\n\f");

}

void FileTail_bank_d_rpt(FILE *fp)
{
	
	fprintf(fp, "--------------------------------------------------------------------------------------\n");

}

void FileTail_bank_d_rpt_total( FILE *fp, int total_bs, double total_je )
{
	fprintf(fp, "               总交易量:%6d	      	总交易金额:%14.2lf\n\n", total_bs, total_je );
}

void FileTail_bank_d_rpt_fg_total( FILE *fp, int total_bs, double total_je ,double total_dzje)
{
	fprintf(fp, "               总交易量:%6d	      	总交易金额:%14.2lf\n\n", total_bs, total_je );
	fprintf(fp, "                        %6s	      	(对帐金额) %14.2lf\n\n", " ", total_dzje);
}

void add_rpt_total(S_tran_ls ls, Edc_shop_dz *cards)
{
	int i;
	
#ifdef zgx010817_modi
	i = atoi(ls.card_type) - 51;
	
	if ( i == -50 /*-51*/ ) {
		i = 5;
		cards[5].cnt ++;
	}
	else
	if ( i == -49 /*-50*/ ) {
		i = 6;
		cards[6].cnt ++;
	}
	else
		cards[i].cnt ++;
#else
	i = atoi(ls.card_type) - atoi(VISA_CARD);	/* 外卡从VISA始 */
	
	if (i < 0) {	/* 非外卡 */
		if (!strcmp(ls.card_type, CREDIT_CARD)) {
			if (!strcmp(ls.bank_type, BOC_BANK)) {
				if ((ls.card_no[0] == '4') || (ls.card_no[0] == '5')) {
					/* 银联信用卡 */
					i = CARD_BOC_UN_CRE;
					cards[CARD_BOC_UN_CRE].cnt ++;
				} else {
					/* 中行信用卡 */
					i = CARD_BOC_CRE;
					cards[CARD_BOC_CRE].cnt ++;
				}
			} else {
				/* 他行信用卡 */
				i = CARD_OTH_CRE;
				cards[CARD_OTH_CRE].cnt ++;
			}
		} else {	/* DEBIT_CARD */
			if (!strcmp(ls.bank_type, BOC_BANK)) {
				/* 中行借记卡 */
				i = CARD_BOC_DE;
				cards[CARD_BOC_DE].cnt ++;
			} else {
				/* 他行借记卡 */
				i = CARD_OTH_DE;
				cards[CARD_OTH_DE].cnt ++;
			}
		}
	} else	/* 外卡 */
		cards[i].cnt ++;
#endif
	
	switch (ls.tran_type) {
		case REFUND:
			cards[i].amt -= ls.tran_amt;
			break;
		case ADJUST:
#ifdef wyz_mod_011229
			cards[i].amt += ls.tran_amt - ls.void_amt;
			cards[i].fee += (ls.tran_amt - ls.void_amt) * cards[i].rebate;	
			break;
#else
#endif
		default:
			cards[i].amt += ls.tran_amt;
			cards[i].fee += ls.tran_amt * cards[i].rebate;
			break;
	}
}

/*
 * 商户入帐明细报表
 * prt/shop_r_rpt
 */
int shop_r_rpt()
{
	$S_sys_param sys;
	WINDOW *my_win;
	SETTLE_RESULT	s_r;
	FILE	*fp;
	char	tmp_file[128];
	char	filename[128], path[80];
	char	mer_id[16], ter_id[9];
	char	rpt[120];	
	char	tmp_str[128];
	int mer_cnt, ret, i, ter_cnt;

	static char pflag[5]={0,0,0,0,0}, first = 1;
	long card_enable;

	if ( first ) {
		first = 0;
		memset ( pflag , 1 , 5 );
	}

	sprintf(filename, "/tmp/.shop_r_rpt.%d", getpid());
	scr_dump(filename);

	$select * into :sys from sys_param;
	if (SQLCODE) {
		daylog(ERROR, "Select sys_param error![%d]", SQLCODE);
		h_winprompt(my_win, 17,4,"取本地逻辑日失败, 按任意键继续",1, 0);
		goto end_shdz;
	}
	del_st_space("sys_param", &sys);
	/*总行不产生商户入帐明细报表*/
	if (!strcmp(sys.bank_id, sys.adm_bank_id))
		return(0);

	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, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);

	set_prompt(PROMPT_OFF);
	
#ifndef wyz_mod_020408
	getdatef(s_date,"");
	getdatef(e_date,"");
#else
	/*默认值为上次成功清算的日期*/
	sprintf(tmp_file, "%s/etc/settle_result", getenv("WORKDIR"));
	if ((fp = fopen(tmp_file, "r")) == NULL) {
		daylog(ERROR, "Open etc/settle_result failed");
		goto end_shdz;
	}
	
	if ((fread(&s_r, sizeof(SETTLE_RESULT), 1, fp)) != 1) {
		daylog(ERROR, "Read etc/settle_result failed");
		goto end_shdz;
	}

	if (s_r.result == 0) {
		strcpy(s_date, s_r.settle_date);
	}
	else 
		getdatef(s_date, "");

	fclose(fp);
#endif

	/*改原输入起始日期和结束日期为输入日期然后确认*/
	mvwprintw(my_win, 2, 4, "请输入清算日期: [%s]", s_date);
	if (in_item(my_win, "", 2, 21, s_date, 8, NULL, NULL, 0, 0) != ENTER)
		goto end_shdz;
	str2date(s_date1, s_date, "/");

	strcpy(e_date, s_date);
	mvwprintw(my_win, 3, 4, "请确认清算日期: [%s]", e_date);
	if (in_item(my_win, "", 3, 21, e_date, 8, NULL, NULL, 0, 0) != ENTER)
		goto end_shdz;
	str2date(e_date1, e_date, "/");

#ifdef Wubin2002087_del
	if (strcmp(s_date, e_date) != 0) {
		mvwprintw(stdscr,LINES-3, 6, "输入的清算日期不一致"); 
		getch();
		goto end_shdz;
	}

	if (strcmp(s_date, s_r.settle_date) > 0) { 
		sprintf(tmp_str, "[%s]还没有进行清算", s_date); 
		mvwprintw(stdscr,LINES-3, 6, tmp_str);
		getch();
		goto end_shdz;
	}
#endif
	strcpy ( mer_id , "" );	
	mvwprintw(my_win, 4, 4, "请输入商户编号: [%15s]", " ");
	if (in_item(my_win, "", 4, 21, mer_id, 15, NULL, NULL, 0, 0) !=
	    ENTER) goto end_shdz;
		
	if ( mer_id[0] > '9' || mer_id[0] < '0' )
		mer_cnt = 0;
	else
		mer_cnt = 1;

	createsbox ( 10 , 20 , 8 , 1 , 1 , "请选择卡类型      " );
	
	additem ( 0 , "国际卡" , pflag[0] );
	additem ( 0 , "信用卡" , pflag[1] );
	additem ( 0 , "借记卡" , pflag[2] );
	
	clear_wline(stdscr, LINES-1);
	mvwprintw(stdscr,LINES-1, 23, "切换: Space  确认: Enter  取消: ESC");
	refresh();

	ret = dispsbox();
	
	if ( ret != 0 ) {
		freesbox();
	        goto end_shdz;
	}
	else {
		card_enable = 0;
		for ( i=0 ; i < 3 ; i++ ) {
			getitemflag ( 0 , i , &(pflag[i]) );
			if ( pflag[i] == 1 ) {
				switch ( i ) {
				case 0:
				card_enable |= FOREIGN;
				break;
				case 1:
				card_enable |= CREDIT;
				break;
				case 2:
				card_enable |= DEBIT;
				break;
				}
			}
		}
		freesbox();
	}

	if ( card_enable == 0 )
	        goto end_shdz;

	daylog(DEBUG, "正在生成商户入帐报表, 清算日期: %s--%s, 请稍候 ...", s_date1, e_date1 );

	mvwprintw(my_win, 6, 4, "正在生成商户入帐明细报表, 请稍候 ...");
	
	wrefresh(my_win);
	
	strcpy(path, getenv("WORKDIR"));
#ifdef wyz020427_mod
	sprintf(rpt, "%s/prt/shop_r_rpt", path);
#else
	sprintf(rpt, "%s/prt/%s/shop_r_rpt", path, G_bankid);
#endif

#ifdef 	Wubin20010918mod
	if(!func_enable(SETT_ENABLE_FLAG)) 
		ret = ah_gen_shop_r_rpt( rpt, mer_id, mer_cnt, card_enable );
	else
		ret = gen_shop_r_rpt( rpt, mer_id, mer_cnt, card_enable );
#else
	ret = gen_shop_r_rpt( rpt, mer_id, mer_cnt, card_enable );
#endif
	
	if (ret < 0) {
		h_winprompt(my_win, 17, 4, "生成商户入帐明细报表出错!", 1, 0);
		goto end_shdz;
	}

	print_file( my_win, 9, 17, 1, rpt );
	/* viewfile( 24, 80, 0, 0, rpt, "" ); */
	wrefresh( my_win );
			
end_shdz:
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	return(0);
}


int gen_shop_r_rpt ( char *filename, void * mer_list, int mer_cnt, long card_enable )
{
	Edc_shop_dz cards[SETTLE_CARDS_NUM+1] = {
			{"威士卡",  }, {"万事达卡",},
			{"运通卡",  }, {"大莱卡",  },
			{"JCB 卡",  },
			{"长城信用卡",}, {"长城借计卡",},
			{"银联信用卡",}, {"他行信用卡",}, {"他行借计卡",},
			{"总  计",} };
	$char	sql[1024];
	$char	tmp[128];
	$int	cnt;
	$S_merchant_card s_c;
	$char	s_s_date[11],e_s_date[11];
	$char	card_type[50];
	$char	sign_bankid[12];
	char	foreign[40],credit[5],debit[5],unite[40];
	char	mer_id[16], ter_id[9];	
	int	i;
	int	ret=0;
	long	enable; 
	long	batch_no;
	FILE	*fp;
	
	if ( ! ( fp = fopen( filename, "w") ) ) {
		daylog ( ERROR, "Open %s file error !", filename );
		return( -1 );
	}

	enable = card_enable;
	memset( card_type, 0, sizeof( card_type ) );
	memset( foreign, 0, sizeof( foreign ) );
	memset( credit, 0, sizeof( credit ) );
	memset( debit, 0, sizeof( debit ) );
	memset( unite, 0, sizeof( unite ) );

	if ( enable & FOREIGN ){
		sprintf( foreign, "%s", "\'51\',\'52\',\'53\',\'54\',\'55\'" );
		strcat( card_type, foreign );
	}

	if ( enable & CREDIT ){
		if( card_type[0] == 0 )
			strcpy( credit, "\'01\'" );
		else
			strcpy( credit, ",\'01\'");
		strcat( card_type, credit );
	}

	if ( enable & DEBIT ){
		if( card_type[0] == 0 )
			strcpy( debit, "\'02\'");
		else
			strcpy( debit, ",\'02\'");
		strcat( card_type, debit );
	}

	$select * into $sy from sys_param;
	if (SQLCODE) {
		daylog(ERROR, "Error select sys_param![%d]", SQLCODE);
		fclose(fp);	
		return(-1);
	}
	del_st_space("sys_param", &sy);
	
		
	strcpy( s_s_date, s_date );
	strcpy( e_s_date, e_date );

$ifndef wyz_mod_020408;
	/*修改通过数据库查询判断使用库表名为通过上次清算结果文件查询*/
	daylog(ERROR, "justy which table begin...");
	$select count(*) into $cnt from cur_settle_ls
	where snd_settle_date >= $s_s_date
	and snd_settle_date <= $e_s_date;

	daylog(ERROR, "justy which table end.");
	
	if ( SQLCODE < 0 ) {
		daylog( ERROR, "Fetch cur_settle_ls error!" );
		fclose( fp );
		return( -1 );
	}
	
	if ( SQLCODE == 100 )
		strcpy( tmp, "his_settle_ls" );
	else {
		if ( cnt == 0 )
			strcpy( tmp, "his_settle_ls" );
		else
			strcpy( tmp, "cur_settle_ls" );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?