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

📄 addadv.ec

📁 界面库
💻 EC
📖 第 1 页 / 共 2 页
字号:
/*=============================================================
功能: 		
作者:		
2001/03/25:王永忠:规范程序设计
2001/03/31:王永忠:修改程序中原来tran_ls_no and old_trans_ls_no为
	trace_no and old_tran_no
	SAF文件中的信息由系统自动完成如何???
2001/04/02:王永忠:向addadv_acq()中增加ADJUST交易
2001/08/21:王永忠:使用$(WORKDIR)/etc/sysparam.tab文件中ADVICE_ENABLE
	组中ACQ_ADVICE和ISS_ADVICE项来控制是否发送通知
2001/12/07:王永忠:修改原只有自己收单发收单通知为自己或金卡收单
	可发收单通知
===============================================================*/
#include <stdio.h>
#include <stdlib.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;

EXEC SQL BEGIN DECLARE SECTION;
extern	S_sys_param G_sys_param;
extern	S_bank_base *G_bank_tab;
extern	int	G_bank_base_num;
EXEC SQL END DECLARE SECTION;

/*=================================================================
功能:
将收单行通知交易的PUBLIC结构中的内容填入SAF表结构中

ENTRY:  PUBLIC结构 *pcs
	S_saf_ls *adv
RETURN: 0	SUCC 
===================================================================*/

int pcs2adv_acq(PUBLIC *pcs, S_saf_ls *adv)
{

char 	wdate[11];
char 	wtime[9];

	memset(adv, '\0', sizeof(S_saf_ls));

	strcpy(adv->card_no, pcs->Card_no);
	strcpy(adv->exp_date, pcs->Exp_date);

	strcpy(adv->trans_acct_no, pcs->Trans_card_no);

	//设置行号和主机号
	//增加对数据库中非空字段的处理
	if (pcs->Acq_bank_id[0] == '\0' ||
	    pcs->Acq_bank_id[0] == ' ') {
		sprintf(pcs->Acq_bank_id, "0000");
	}
	if (pcs->Acq_host_id[0] == '\0' ||
	    pcs->Acq_host_id[0] == ' ') {
		sprintf(pcs->Acq_host_id, "00");
	}
	if (pcs->Iss_bank_id[0] == '\0' ||
	    pcs->Iss_bank_id[0] == ' ') {
		sprintf(pcs->Iss_bank_id, "0000");
	}

	strcpy(adv->acq_bank_id, pcs->Acq_bank_id);
	strcpy(adv->acq_host_id, pcs->Acq_host_id);
	strcpy(adv->iss_bank_id, pcs->Iss_bank_id);

	strcpy(adv->snd_bank_id, pcs->Snd_bank_id);
	strcpy(adv->snd_host_id, pcs->Snd_host_id);
	strcpy(adv->rcv_bank_id, pcs->Rcv_bank_id);
	strcpy(adv->rcv_host_id, pcs->Rcv_host_id);

	//设置各个方向的逻辑日
	strcpy(adv->adv_logic_date, pcs->Host_settle_date);
	strcpy(adv->snd_logic_date, pcs->Snd_settle_date);
	strcpy(adv->rcv_logic_date, pcs->Rcv_settle_date);
	strcpy(adv->agt_logic_date, pcs->Agent_settle_date);

	//设置本地系统日期和时间
	//增加对数据库中非空字段的处理
	if (pcs->Local_sys_date[0] == '\0' ||
	    pcs->Local_sys_date[0] == ' ') {
		getdatef(wdate, "");
		strcpy(pcs->Local_sys_date, wdate);
	}
	if (pcs->Local_sys_time[0] == '\0' ||
	    pcs->Local_sys_time[0] == ' ') {
		getdatef(wtime, "");
		strcpy(pcs->Local_sys_time, wtime);
	}
	if (pcs->Tran_sys_time[0] == '\0' ||
	    pcs->Tran_sys_time[0] == ' ') {
		sprintf(pcs->Tran_sys_time, "%04s%06s",
			pcs->Local_sys_date+4,
			pcs->Local_sys_time);
	}

	strcpy(adv->local_sys_date, pcs->Local_sys_date);
	strcpy(adv->local_sys_time, pcs->Local_sys_time);

	//设置交易系统时间
	strcpy(adv->tran_sys_time, pcs->Tran_sys_time);

	strcpy(adv->terminal_id, pcs->Terminal_id);
	strcpy(adv->merchant_id, pcs->Merchant_id);
	strcpy(adv->merchant_name, pcs->Merchant_name);
	strcpy(adv->mcc, pcs->Mcc);

	strcpy(adv->bank_type, pcs->Bank_type);
	strcpy(adv->card_type, pcs->Card_type);

	strcpy(adv->ccy_code, pcs->Ccy_code);

	if (pcs->Person_id_type == '\0')
		adv->id_type[0] = '1';
	strcpy(adv->person_id, pcs->Person_id);

	switch(pcs->Tran_type) {
	case REVERSAL:
		adv->tran_type = ACQ_REV_ADVICE;
		adv->void_tran_type = pcs->Void_tran_type;
		adv->void_old_tran_type = pcs->Void_old_tran_type;
		break;

	default:
		adv->tran_type = ACQ_ADVICE;
		adv->void_tran_type = pcs->Tran_type;
		adv->void_old_tran_type = pcs->Void_tran_type;
		break;
	}
	
	adv->rcv_module_id = pcs->Module_id;

	adv->trace_no = pcs->Trace_no;
	adv->void_trace_no = pcs->Void_trace_no;

	adv->invoice_no = pcs->Invoice_no; 
	adv->void_invoice_no = pcs->Void_invoice_no;

	adv->host_ls_no = pcs->Host_tran_ls;
	adv->batch_no = pcs->Batch_no;

	strcpy(adv->tran_rrn, pcs->Rrn);
	strcpy(adv->auth_no, pcs->Auth_no);

	adv->tran_amt = atol(pcs->Tran_amount)/100.;
	adv->void_amt = atol(pcs->Void_amount)/100.;

	//保存这些信息后,存储转发模块处理时如何区分
	//附加金额为手续费还是小费
	if (atol(pcs->Fee) > 0)
		adv->add_amount = atol(pcs->Fee)/100.;
	if (atol(pcs->Tip) > 0)
		adv->add_amount = atol(pcs->Tip)/100.;
	
	//设置和转账交易相关的标志
	strcpy(adv->agent_tran_type, pcs->Agent_type);
	strcpy(adv->trans_acct_type, pcs->Virement_type);
	strcpy(adv->acct_type, pcs->Accnt_type);
	strcpy(adv->acct_no_type, pcs->Accounts_type);

	adv->adv_flag[0] = '1';	//通知标志置为'1',需通知
	adv->saf_flag[0] = 'R';	//转发标志置为'R',请求转发

	strcpy(adv->resp_code, pcs->Resp_code);
	strcpy(adv->resp_bank_id, pcs->Resp_bank_id);
	strcpy(adv->resp_host_id, pcs->Resp_host_id);

#ifdef wyz020503_mod
	strcpy(adv->void_resp_code, pcs->Old_resp_code);
	strcpy(adv->void_resp_bank_id, pcs->Old_resp_bank_id);
	strcpy(adv->void_resp_host_id, pcs->Old_resp_host_id);
#else
	strcpy(adv->void_resp_bank_id, pcs->Sign_bankid);
#endif

	strcpy(adv->oper_no, pcs->Oper_no);

	adv->snd_settle_flag[0] = 'N';
	adv->rcv_settle_flag[0] = 'N';
	adv->agt_settle_flag[0] = 'N';
	adv->adv_settle_flag[0] = 'N';
	
	memcpy(adv->add_data, pcs->Add_data, 250);
	adv->add_data[250] = '\0';

	memcpy(adv->track2, pcs->Card_track2, TRACK2_LEN);
	memcpy(adv->track3, pcs->Card_track3, TRACK3_LEN);
	adv->track2[TRACK2_LEN] = '\0';
	adv->track3[TRACK3_LEN] = '\0';

	getdatef(wdate,"");
	sprintf(adv->update_date,"%8.8s",wdate);
	gettimef(wtime,"");
	sprintf(adv->update_time,"%6.6s",wtime);
	
	return 0;
}


/*=================================================================
功能:
根据情况将收单行通知交易的PUBLIC结构中的内容,插入SAF表中,
如果表操作不成功,则写入SAF文件中。

ENTRY:  PUBLIC结构 *pcs
RETURN:
===================================================================*/
void addadv_acq(PUBLIC *pcs)
{
$S_saf_ls	adv;

char 		bankno[5], buf[80];
int 		flag=0;
FILE 		*fp;


	if (!memcmp( pcs->Terminal_id, "TRM", 3 )) 
		return;

	if (strcmp(pcs->Resp_code, SUCCESS))
		return;

	//总行不发收单行通知
	if (!(strcmp(G_sys_param.bank_id, G_sys_param.adm_bank_id) ||
	      strcmp(G_sys_param.host_id, G_sys_param.adm_host_id)))
		return;

	//如果为本地卡, 不发送收单行通知
	if (juste_bank_relation(pcs->Iss_bank_id, G_sys_param.bank_id)>=1 ||
		!strcmp(pcs->Iss_bank_id, G_sys_param.bank_id))
		return;

	//如果不是自己收单且不是金卡收单
	if (!(juste_bank_relation(pcs->Acq_bank_id, G_sys_param.bank_id)>=1 ||
		!strcmp(pcs->Acq_bank_id, G_sys_param.bank_id)		  ||
		!strcmp(pcs->Acq_bank_id, "GOLD")))
		return;

	//如果地市行也发通知,则只有本地收单才发
	readtab("sysparam.tab", "ADVICE_ENABLE", "ADV_FLAG", buf);
	if (buf[0] == '1') 
	if ((strcmp(pcs->Acq_bank_id, G_sys_param.bank_id)	||
	     strcmp(pcs->Acq_host_id, G_sys_param.host_id))	&&
	     strcmp(pcs->Acq_bank_id, "GOLD"))
		return;
	

	//如果交易不是消费、预授权、取款、退货、存款、预授确认、
	//调整、撤销、离线、冲正交易,则不发送收单行通知
	if (pcs->Tran_type != PURCHASE   &&
	    pcs->Tran_type != WITHDRAWAL &&
	    pcs->Tran_type != REFUND     &&
	    pcs->Tran_type != DEPOSIT    &&
	    pcs->Tran_type != CONFIRM    &&
	    pcs->Tran_type != PRE_AUTH   &&
	    pcs->Tran_type != ADJUST     &&
	    pcs->Tran_type != OFFLINE    &&
	    pcs->Tran_type != POS_VOID   &&
	    pcs->Tran_type != REVERSAL) 
		return;

	//消费-存款-退货-取款-确认-调整-预授-离线-撤消-冲正 
	memset(buf, '\0', sizeof(buf));
	if (!strcmp(pcs->Card_type, CREDIT_CARD)) {
		readtab("sysparam.tab", "ADVICE_ENABLE", 
			"CREDIT_ACQ_ADVICE", buf);

		switch(pcs->Tran_type){
		case PURCHASE:
			if (buf[0] != '1') 
				return;
			break;
		case WITHDRAWAL:
			if (buf[1] != '1') 
				return;
			break;
		case REFUND:
			if (buf[2] != '1') 
				return;
			break;
		case DEPOSIT:
			if (buf[3] != '1') 
				return;
			break;
		case CONFIRM:
			if (buf[4] != '1') 
				return;
			break;
		case ADJUST:
			if (buf[5] != '1') 
				return;
			break;
		case PRE_AUTH:
			if (buf[6] != '1') 
				return;
			break;
		case OFFLINE:
			if (buf[7] != '1') 
				return;
			break;
		case POS_VOID:
			if (buf[8] != '1' || pcs->Void_tran_type == PRE_AUTH) 
				return;
			break;
		case REVERSAL:
			if (buf[9] != '1') 
				return;
			break;
		default:
			return;
		}
	}
	else if (!strcmp(pcs->Card_type, DEBIT_CARD)) {
		readtab("sysparam.tab", "ADVICE_ENABLE", 
			"DEBIT_ACQ_ADVICE", buf);

		switch(pcs->Tran_type){
		case PURCHASE:
			if (buf[0] != '1') 
				return;
			break;
		case WITHDRAWAL:
			if (buf[1] != '1') 
				return;
			break;
		case REFUND:
			if (buf[2] != '1') 
				return;
			break;
		case DEPOSIT:
			if (buf[3] != '1') 
				return;
			break;
		case CONFIRM:
			if (buf[4] != '1') 
				return;
			break;
		case ADJUST:
			if (buf[5] != '1') 
				return;
			break;
		case PRE_AUTH:
			if (buf[6] != '1') 
				return;
			break;
		case OFFLINE:
			if (buf[7] != '1') 
				return;
			break;
		case POS_VOID:
			if (buf[8] != '1' || pcs->Void_tran_type == PRE_AUTH) 
				return;
			break;
		case REVERSAL:
			if (buf[9] != '1') 
				return;
			break;
		default:
			return;
		}
	}
	else {
		readtab("sysparam.tab", "ADVICE_ENABLE", 
			"FOREIGN_ACQ_ADVICE", buf);

		switch(pcs->Tran_type){
		case PURCHASE:
			if (buf[0] != '1') 
				return;
			break;
		case WITHDRAWAL:
			if (buf[1] != '1') 
				return;
			break;
		case REFUND:
			if (buf[2] != '1') 
				return;
			break;
		case DEPOSIT:
			if (buf[3] != '1') 
				return;
			break;
		case CONFIRM:
			if (buf[4] != '1') 
				return;
			break;
		case ADJUST:
			if (buf[5] != '1') 
				return;
			break;
		case PRE_AUTH:
			if (buf[6] != '1') 
				return;
			break;
		case OFFLINE:
			if (buf[7] != '1') 
				return;
			break;
		case POS_VOID:
			if (buf[8] != '1') 
				return;
			break;
		case REVERSAL:
			if (buf[9] != '1' || pcs->Void_tran_type == PRE_AUTH) 
				return;
			break;
		default:
			return;
		}
	}

	errcall(DEBUG, "t_v_o type{%d[%d(%d)]}",
		pcs->Tran_type,
		pcs->Void_tran_type,
		pcs->Void_old_tran_type);

	//将PUBLIC结构转换成SAF表结构
	pcs2adv_acq(pcs, &adv);

	$insert into saf_ls values (:adv);
	if (SQLCODE) {
		errcall(ERROR, "Error insert into table saf_adv_acq![%d]",
			SQLCODE);
		advfile(pcs);
	}

	return;
}


/*=================================================================
功能:
根据情况将发卡行通知交易的PUBLIC结构中的内容,插入SAF表中,
如果表操作不成功,则写入SAF文件中。

ENTRY:  PUBLIC结构 *pcs
RETURN:
===================================================================*/
void addadv_iss(PUBLIC *pcs)
{

$S_saf_ls 	adv;
char 		buf[80];
int 		flag=0;
int		i;
FILE 		*fp;

	//如果为本地卡,不发送发卡行通知
	if ((!strcmp(pcs->Rcv_bank_id, G_sys_param.bank_id)) &&
	    (!strcmp(pcs->Rcv_host_id, G_sys_param.host_id)))
		return;

	DelSpace(pcs->Iss_bank_id);

⌨️ 快捷键说明

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