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

📄 hz_rpt.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
字号:
/****************************************************
 *	回扣利益分配报表 hz_rpt()
 *	called by gen_hr() -- in gen_rpt.ec
 *
 * 最后修改:	周国祥 2001/08/24
 ****************************************************/
#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;

typedef struct {
	char bankid[12];
	char hostid[3];
	int cnt;
	double amt;
	double tip;
} S_reb;

extern int get_son();
extern int check_son();

extern double in_out(double);

void get_tip(pls, p_sd, p_fk)
	$parameter S_tran_ls *pls;
	double *p_sd;
	double *p_fk;
{
	switch (pls->tran_type) {
	    case PURCHASE:
	    case TRANS_OUT:
/****
	    case AGENT:
****/
	    case CONFIRM:
		*p_sd = in_out(0.005 * pls->tran_amt);
		*p_fk = 0.3 - *p_sd;
		if (*p_fk > 0) *p_fk = 0;
		break;
	    case WITHDRAWAL:
		if (pls->terminal_id[0] == '9') {
			*p_sd = 1.5;
			*p_fk = 0;
		} else {
			if (pls->tran_amt < 101) {
				*p_sd = 0.5;
				*p_fk = - 0.2;
			} else {
				*p_sd = in_out(0.005 * (pls->tran_amt / 1.01));
				*p_fk = 0.3 - *p_sd;
				if (*p_fk > 0) *p_fk = 0;
			}
		}
		break;
	}
}

void add_tip(S_reb *preb, S_tran_ls ls, double tip)
{
	preb->cnt++;
	preb->amt += ls.tran_amt;
	preb->tip += tip;
}

/*
 * 回扣利益分配表
 * called by gen_hr()(in gen_rpt.ec)
 */
int hz_rpt(filename, logic_date, bankid, hostid)
char *filename;
$parameter char *logic_date;
char *bankid, *hostid;
{
	FILE *fp;
	double sd, fk;
	int flag1, flag2, i, j, num = 0;
	S_reb *reb = NULL, mid;
	char son_bankid[48][12];
	char son_hostid[48][3];
	$S_tran_ls ls;
	void *tmp;

	/* get_son() defined in net_stat.ec */
	if (get_son(bankid, hostid, son_bankid, son_hostid) < 0)
		return(-2);

	if (!(fp = fopen(filename, "w"))) {
		daylog(ERROR, "Open %s for write error!", filename);
		return(-1);	/* File operate error */
	}

	if (FileHead_HR(fp, logic_date)) {
		fclose(fp);
		return(-2);	/* Database operate error */
	}

$ifdef zgx010824_modi;
	$declare hz_cur cursor for
	select * from cur_tran_ls
	where acq_bank_id != iss_bank_id
	and tran_type in (2,4,8,9,11)
	and res_flag = 'O'
	and refunded = 'N'
	and card_type = '01'
	and manual_flag = 'N'
	and ret_code like '00%'
	and local_date = :logic_date;
$else;
	$declare hz_cur cursor for
	select * from cur_tran_ls
	where acq_bank_id != iss_bank_id
	and tran_type in (1,3,6,5)	/* 消费 取现 转出 (代收费) 确认 */
	and saf_flag = '0'	/* 冲正标志为'正常' */
	and tran_flag not in ('2','3','4')	/* not 已撤消已冲正已退货 */
	and card_type = '02'	/* 借记卡 */
	and manual_flag = 'N'
	and resp_code like '00%'
	and snd_settle_date = :logic_date;
$endif;
	$open hz_cur;
	if (SQLCODE) {
		daylog(ERROR, "Open hz_cur error![%d]", SQLCODE);
		fclose(fp);
		return(-2);	/* Database operate error */
	}
	while (1) {
		$fetch hz_cur into :ls;
		if (SQLCODE == 100) break;
		if (SQLCODE) {
			daylog(ERROR, "Fetch hz_cur error![%d]", SQLCODE);
			free((void *)reb);
			$close hz_cur;
			fclose(fp);
			return(-2);	/* Database operate error */
		}
		del_st_space("tran_ls", &ls);
		/* check_son() defined in net_stat.ec */
		if (!check_son(ls.acq_bank_id, ls.acq_host_id, son_bankid, son_hostid)) {
			strcpy(ls.acq_bank_id, BOC_CENTER /*"0004"*/);
			strcpy(ls.acq_host_id, "00");
		}
		if (!check_son(ls.iss_bank_id, "00", son_bankid, son_hostid)) {
			strcpy(ls.iss_bank_id, BOC_CENTER /*"0004"*/);
		}
		get_tip(&ls, &sd, &fk);
		flag1 = flag2 = 1;
		for (i = 0; (flag1 || flag2) && (i < num); i++) {
			if (flag1 && !strcmp(reb[i].bankid, ls.acq_bank_id)) {
				add_tip(reb + i, ls, sd);
				flag1 = 0;
			}
			if (flag2 && !strcmp(reb[i].bankid, ls.iss_bank_id)) {
				add_tip(reb + i, ls, fk);
				flag2 = 0;
			}
		}
		if (flag1 || flag2) {
			tmp = realloc((void *)reb,
				      (num + flag1 + flag2) * sizeof(S_reb));
			if (!tmp) {
				daylog(ERROR, "Memory allocate error!");
				free((void *)reb);
				$close hz_cur;
				fclose(fp);
				return(-1);	/* Memory operate error */
			}
			reb = (S_reb *)tmp;
			memset((void *)(reb + num), 0,
			       (flag1 + flag2) * sizeof(S_reb));
		}
		if (flag1) {
			strcpy(reb[num].bankid, ls.acq_bank_id);
			strcpy(reb[num].hostid, ls.acq_host_id);
			add_tip(reb + num, ls, sd);
		}
		if (flag2) {
			strcpy(reb[num + flag1].bankid, ls.iss_bank_id);
			strcpy(reb[num + flag1].hostid, ls.acq_host_id);
			add_tip(reb + num + flag1, ls, fk);
		}
		num += flag1 + flag2;
	}
	$close hz_cur;

	for (i = 0; i < num - 1; i++) {
		flag1 = flag2 = 0;
		for (j = 1; j < num - i; j++) {
			if (strcmp(reb[flag1].bankid, reb[j].bankid) > 0)
				flag2 = 1;
			else	flag1 = j;
		}
		if (!flag2) break;
		flag2 = num - i - 1;
		if (flag1 != flag2) {
			memcpy(&mid, reb + flag1, sizeof(S_reb));
			memcpy(reb + flag1, reb + flag2, sizeof(S_reb));
			memcpy(reb + flag2, &mid, sizeof(S_reb));
		}
	}

	memset((void *)&mid, 0, sizeof(S_reb));
	for (i = 0; i < num; i++) {
		mid.cnt += reb[i].cnt;
		mid.amt += reb[i].amt;
		mid.tip += reb[i].tip;
		FileDetail_HR(fp, reb + i);
	}
	free((void *)reb);

	FileTail_HR(fp, &mid);
	fclose(fp);
	return(0);
}

int FileHead_HR(FILE *fp, char *logic_date)
{
	$S_sys_param sys;
	char date[11], time[9];
	char	bank_name[128];
	char	logic_date1[11];	/* YYYY/MM/DD */

	$select * into :sys from sys_param;
	if (SQLCODE) {
		daylog(ERROR, "Select sys_param error!");
		return(-1);
	}
	del_st_space("sys_param", &sys);

	getdatef(date, "/");
	gettimef(time, ":");
	fprintf(fp, "%25s中国银行BTS系统\n", " ");
	fprintf(fp, "%25s回扣利益分配报表\n", " ");
	str2date(logic_date1, logic_date, "/");
	fprintf(fp, "BTS-503%36s清算逻辑日: %s\n", " ", logic_date1);
	get_bank_name(sys.bank_id, sys.host_id, bank_name);
	fprintf(fp, "%-5.5s%-41s%s %s\n", sys.bank_id, bank_name, date, time);
	fprintf(fp, "-----------------------------------------------------------------\n");
	fprintf(fp, "%s %18s %18s %18s\n", "联行行号", "交易总笔数", "交易总金额", "应付手续费");
	fprintf(fp, "-----------------------------------------------------------------\n");
	return(0);
}

int FileDetail_HR(FILE *fp, S_reb *preb)
{
	fprintf(fp, "%-8.8s %18ld %18.2lf %18.2lf\n",
		preb->bankid, preb->cnt, preb->amt, preb->tip);
	return(0);
}

int FileTail_HR(FILE *fp, S_reb *preb)
{
	fprintf(fp, "-----------------------------------------------------------------\n");
	if (preb->cnt) fprintf(fp, "%-8.8s %18ld %18.2lf %18.2lf\n", "合    计", preb->cnt / 2, preb->amt / 2, - preb->tip);
	return(0);
}

⌨️ 快捷键说明

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