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

📄 posls.c

📁 界面库
💻 C
📖 第 1 页 / 共 4 页
字号:
		return 0;

	}//End of switch(){

}

/*************************************************************************
功能:
根据交易流水号invoice_no在cur_tran_ls流水表中查找交易标志tran_flag为'1', 
即已撤销的交易;修改该交易的原交易的交易标志tran_flag为'0',即正常交易
并且对原交易作相应的处理。
RETURN:		-1	FAIL
		0	SUCC
**************************************************************************/
int update_void_reversal()
{
S_tran_ls	po;
int		i=0;

	//查找POS_VOID交易的原交易
	sprintf(sqlstr, "				\
		SELECT	*	FROM	cur_tran_ls 	\
		WHERE	acq_bank_id	=	\'%s\'	\
		AND	acq_host_id	=	\'%s\'	\
		AND	card_no		=	\'%s\'	\
		AND	merchant_id	=	\'%s\'	\
		AND	terminal_id	=	\'%s\'	\
		AND	invoice_no	= 	%ld	\
		AND	tran_type	= 	%d	\
		AND	tran_flag	=	\'1\'	\
		AND	resp_code	=	\'00\'",
		pcs.Acq_bank_id,
		pcs.Acq_host_id,
		pcs.Card_no,
		pcs.Merchant_id,
		pcs.Terminal_id,
		pcs.Invoice_no,
		pcs.Void_old_tran_type);

	if (select_ls_record(sqlstr, &po) != 0) {
		errcall(DEBUG, "NOT Found void tran of POS_VOID in cur_tran_ls");
		return 0;
	}

	/* 找到POS_VOID交易的原交易,将已撤销改为正常*/
	sprintf(sqlstr, "				\
		UPDATE 	cur_tran_ls  			\
		SET tran_flag 		= \'0\' 	\
		WHERE	acq_bank_id 	= \'%s\'	\
		AND	acq_host_id 	= \'%s\'	\
		AND	card_no		= \'%s\'	\
		AND	merchant_id 	= \'%s\'	\
		AND	terminal_id 	= \'%s\'	\
		AND	trace_no	= %ld		\
		AND	resp_code	= \'00\'	\
		AND     tran_flag       = \'1\'",
		po.acq_bank_id, 
		po.acq_host_id,
		po.card_no,
		po.merchant_id,
		po.terminal_id,
		po.trace_no );

	i = update_table(sqlstr);

	if (i < 0) {
		return -1; 
	}
	return 0;
}

/*=======================================================
功能:
"自动冲正" / "冲正" 修改REFUND, POS_VOID 交易的原交易标志
RETURN:		-1	FAIL
		0	SUCC
=======================================================*/
int iss_update_refund_void( invoice )
long	invoice;
{
S_tran_ls	po;
int		i=0;
	
	sprintf(sqlstr, "			\
	SELECT	*	FROM	cur_tran_ls 	\
	WHERE	acq_bank_id	= \'%s\'	\
	AND	acq_host_id	= \'%s\'	\
	AND	card_no		= \'%s\'	\
	AND	merchant_id	= \'%s\'	\
	AND	terminal_id	= \'%s\'	\
	AND	invoice_no	= %ld		\
	AND	tran_type	= %d		\
	AND 	( tran_flag 	= \'1\'   	\
		OR tran_flag 	= \'4\' ) 	\
	AND	resp_code	= \'00\'",
	pcs.Acq_bank_id,
	pcs.Acq_host_id,
	pcs.Card_no,
	pcs.Merchant_id,
	pcs.Terminal_id,
	invoice,
	pcs.Void_old_tran_type);

	/* 查 refund, confirm, pos_void 交易 */
	if (select_ls_record(sqlstr, &po) != 0) {
		return 0;
	}

	/* 查 REFUND, CONFFIRM, POS_VOID 交易 的原交易 */
	po.trace_no = po.void_trace_no;

	switch(pcs.Void_old_tran_type) {
	case	REFUND:
	case	POS_VOID:
		po.tran_flag[0] = '0';
		break;	
	}

	sprintf(sqlstr, "				\
		UPDATE 	cur_tran_ls  			\
		SET 	tran_flag	= \'%s\'	\
		WHERE	acq_bank_id	= \'%s\'	\
		AND	acq_host_id 	= \'%s\'	\
		AND	card_no		= \'%s\'	\
		AND	merchant_id	= \'%s\'	\
		AND	terminal_id	= \'%s\'	\
		AND	trace_no	= %ld		\
		AND	resp_code	= \'00\'	\
		AND     tran_flag	= \'%s\'",	
		po.tran_flag, 		
		po.acq_bank_id,	
		po.acq_host_id,
		po.card_no,
		po.merchant_id,	 
		po.terminal_id,	 
		po.trace_no, "4" );

	i = update_table(sqlstr);

	if (i == 0) {
		return 0; 
	}

	if (pcs.Void_old_tran_type == POS_VOID) {
		errcall(DEBUG, "此自动冲正已成功, 但本地修改标志错, \
			此记录-->$(WORK)/log/recovery_err中");
		return -1;
	}

	sprintf(sqlstr, "				\
		UPDATE 	his_tran_ls  			\
		SET 	tran_flag	= \'%s\' 	\
		WHERE	acq_bank_id	= \'%s\'	\
		AND	acq_host_id 	= \'%s\'	\
		AND	card_no		= \'%s\'	\
		AND	merchant_id	= \'%s\'	\
		AND	terminal_id	= \'%s\'	\
		AND	resp_code	= \'00\'	\
		AND	trace_no	= %ld",
		po.tran_flag,
		po.acq_bank_id, 
		po.acq_host_id,
		po.card_no,
		po.merchant_id,
		po.terminal_id,
		po.trace_no);

	i = update_table(sqlstr);

	if (i != 0) {
		errcall(DEBUG, "此自动冲正已成功, 但本地修改标志错, \
			此记录-->$(WORK)/log/recovery_err中");
		return -1;
	}

	return 0;	
}

/*******************************************************************
在 REFUND, CONFIRM, POS_POS_VOID 时查询原交易是否在 posls表中存在,
查 posls 表中原交易记录是否存在

RETURN:		-1	FAIL
		0	FOUND, posls.hostls --> PUBLIC.void_hostls
********************************************************************/
int check_ls()
{
S_tran_ls	po;
int		i=0;
double		amt=0.;
double		void_amt=0.;
double		adjust_amt=0.;
char		tmp_str[14];

	G_reversal_flag = 0;

	if (pcs.Saf_flag == 1)
		return 0;
	
	if (pcs.Saf_flag == 2) {
		if (pcs.Tran_type == REVERSAL) {
			sprintf(pcs.Add_data,
			"%06ld%010.10s%011.11s%02.2s%011.11s%02.2s%012.12s%06ld",
			pcs.Trace_no,		//TRACE_NO:	11
			pcs.Tran_sys_time,	//交易系统时间: 7
			pcs.Acq_bank_id,	//收单行行号:	32
			pcs.Acq_host_id,	//收单行主机号:
			pcs.Snd_bank_id,	//发送行行号:	33
			pcs.Snd_host_id,	//
			pcs.Rrn,		//RRN:		37
			pcs.Host_tran_ls);	//主机流水号
			return 0;
		}
		else
			return 0;
	}
	
	if (!strcmp(pcs.Card_no + 5, "00000000000"))
		return 0;

	if (pack_sqlstr_new(sqlstr, "cur_tran_ls") == 1) {/* ==1 无需查流水 */ 
		//errcall(DEBUG, "check_ls(), no need");
		return 0;
	}
	
#ifdef DEBUG1
	add_log(&pcs, "Before select_tran_ls()");
#endif
	i = select_tran_ls(sqlstr, &po, &pcs);

	if (i==-1) {
		errcall(DEBUG, "检查交易流水失败");
		strcpy(pcs.Resp_code, SYS_FAIL);
		strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
		strcpy(pcs.Resp_host_id, G_sys_param.host_id);
		return -1;
	}

	if (i==-2) {		/* select not found */
		//是否需要去查询SAF表???
		switch(pcs.Tran_type) {
		case	REVERSAL:
			G_reversal_flag = 1;
			errcall(DEBUG, "冲正交易没有找到原交易");
			strcpy(pcs.Resp_code, SUCCESS);
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return 0;

		case	POS_VOID:
		case	ADJUST:
		case	CONFIRM: 
			errcall(ERROR, "撤销,调整,确认交易没有找到原交易");
			strcpy(pcs.Resp_code, INVALID_TRANS);
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return -1;

		case	REFUND:
			pack_sqlstr_new( sqlstr, "his_tran_ls" );
			if( select_tran_ls( sqlstr, &po, &pcs) != 0 ) {
				errcall(ERROR, "退货交易没有找到原交易");
				strcpy(pcs.Resp_code, INVALID_TRANS);
				strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
				strcpy(pcs.Resp_host_id, G_sys_param.host_id);
				return -1;
			}
		}//end of switch
	}

#ifdef DEBUG1
	add_log1(&po, "After select_tran_ls()");
#endif

	/* 找到流水后的处理 */

	pcs.Void_tran_type = po.tran_type;
	pcs.Void_old_tran_type = po.void_tran_type;

	switch(pcs.Tran_type) {

	case	ADJUST:
	//做调整交易金额判断. 现在按照ADJUST交易的Tran_amount为调整后的金额,
	//Void_amount存放的是原交易金额。

		amt = atol(pcs.Tran_amount) / 100.;
		//添加该段处理,以支持调整交易没有上送原交易金额
		if (atol(pcs.Void_amount) == 0){
			void_amt = po.tran_amt;
			printf(tmp_str, "%013.02f", po.tran_amt);
			memcpy(pcs.Void_amount, tmp_str, 10);
			strcat(pcs.Void_amount, tmp_str+11);
		}
		else
			void_amt = atol(pcs.Void_amount) / 100.;

		adjust_amt = fabs(amt - void_amt);

		if (adjust_amt > (po.tran_amt * G_sys_param.adjust_rate)) {
			//调整金额的比率大于系统参数表规定的比率
			errcall(WARN, "调整交易的调整金额超出了系统允许的金额");
			strcpy(pcs.Resp_code, UNACCEPT_AMOUNT);
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return -1;
		}

		pcs.Void_invoice_no = po.invoice_no;
		pcs.Void_trace_no = po.trace_no;
		pcs.Void_host_ls = po.host_ls_no;
		strcpy(pcs.Auth_no, po.auth_no);

		break;

	case	REVERSAL:

		pcs.Void_invoice_no = po.invoice_no;
		strcpy(pcs.Auth_no, po.auth_no);
		strcpy(pcs.Rrn, po.tran_rrn);
		pcs.Void_host_ls = po.host_ls_no;

		/*解决冲正时不送有效期问题*/
		if (pcs.Exp_date[0] == '\0' ||
		    pcs.Exp_date[0] == ' ')
			strcpy(pcs.Exp_date, po.exp_date);
		break;

	case	POS_VOID:

		if(pcs.Void_tran_type == PRE_AUTH && po.tran_flag[0] == '2'){
			errcall(ERROR, "已确认的预授权不让撤消");
			strcpy( pcs.Resp_code, INVALID_TRANS );
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return -1;
		}

		amt = atol( pcs.Tran_amount ) / 100.;

		if (fabs(amt) > 0.001) {
		if (fabs( amt-po.tran_amt ) > 0.001) {
			errcall(ERROR, "撤销交易要求金额一致");
			strcpy(pcs.Resp_code, INVALID_AMOUNT);
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return -1;
		} 
		}
		else {
			sprintf(pcs.Tran_amount, "%012f", po.tran_amt*100);
		}
		
		pcs.Void_invoice_no = po.invoice_no;
		pcs.Void_trace_no = po.trace_no;
		strcpy( pcs.Auth_no, po.auth_no);
		pcs.Void_host_ls = po.host_ls_no;
#ifdef wyz_mod_011121
	  	strcpy( pcs.Rrn, po.tran_rrn);
#else
		//
#endif

		//原交易为预授权确认,且offline_flag为'1'
		if(pcs.Void_tran_type == CONFIRM && po.offline_flag[0] == '1'){
			strcpy(pcs.Iss_bank_id, po.iss_bank_id);
			pcs.Msg_id[2]++;
			strcpy(pcs.Resp_code, SUCCESS);
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			posls_handle();
			pcs.Msg_id[2]--;
			G_special_flag = 1;
			return -1;
		}

		break;

	case	REFUND:

		amt = atol( pcs.Tran_amount ) / 100.;

		if (fabs(amt - po.tran_amt)  > 0.001) {
			/* 金额不能大于原金额 */
			errcall(ERROR, "退货交易交易金额不能大于原金额");
			strcpy( pcs.Resp_code, INVALID_AMOUNT );
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return -1;
		}

		pcs.Void_invoice_no = po.invoice_no;
		pcs.Void_trace_no = po.trace_no;
		pcs.Void_host_ls = po.host_ls_no;
		strcpy(pcs.Auth_no, po.auth_no);

		break;
	
	case	CONFIRM:
		//增加对0金额CONFIRM的支持
		if (atol(pcs.Tran_amount) == 0)
			break;

		amt = atol(pcs.Tran_amount) / 100.;

		if ((amt - po.tran_amt - po.tran_amt * G_sys_param.confirm_rate)  > 0.001) {
			strcpy(pcs.Resp_code, UNACCEPT_AMOUNT);
			strcpy(pcs.Resp_bank_id, G_sys_param.bank_id);
			strcpy(pcs.Resp_host_id, G_sys_param.host_id);
			return -1;
		}

		pcs.Void_invoice_no = po.invoice_no;
		pcs.Void_trace_no = po.trace_no;
		pcs.Void_host_ls = po.host_ls_no;
		sprintf(pcs.Void_amount, "%012.f", po.tran_amt*100.);
		break;

	}//end of switch

	errcall(DEBUG, "检查交易流水成功...");

	//如果需要查找原交易信息, 则在Add_data域中保存原交易的信息, 
	//包括原TRACE_NO, 原交易系统时间,
	//原收单行和发送行信息, 原交易RRN和原主机流水号
	sprintf(pcs.Add_data, "%06ld%010.10s%011.11s%02.2s%011.11s%02.2s%012.12s%06ld",
		po.trace_no,		//TRACE_NO:	11
		po.tran_sys_time,	//交易系统时间: 7
		po.acq_bank_id,		//收单行行号:	32
		po.acq_host_id,		//收单行主机号:
		po.snd_bank_id,		//发送行行号:	33
		po.snd_host_id,		//
		po.tran_rrn,		//RRN:		37
		po.host_ls_no);		//主机流水号

	return 0;

}

/************************************************************
为查 cur_tran_ls, his_tran_ls 组查询包
REFUND,ADJUST,POS_VOID,CONFIRM,RESERVAL交易,
需要组织查询流水数据包。
ENTRY:		table_name = "cur_tran_ls" / "his_tran_ls"
RETURN:		0	OK	--> sqlstr
		1	NEED NOT PACK
*************************************************************/
int pack_sqlstr_new( sqlstr, table_name )
char	*sqlstr;
char	*table_name;
{

	switch(pcs.Tran_type) {

	case	CONFIRM:
#ifdef wyz_mod_020329_for_adjust_index
		sprintf(sqlstr, "SELECT * FROM  %s		\
			WHERE	acq_bank_id	=	\'%s\'	\
			AND	acq_host_id	=	\'%s\'	\
			AND	card_no		=	\'%s\'	\
			AND	merchant_id	=	\'%s\'",
			table_name,
			pcs.Acq_bank_id,
			pcs.Acq_host_id,
			pcs.Card_no,
		 	pcs.Merchant_id);
#else
		sprintf(sqlstr, "SELECT * FROM  %s		\
			WHERE	merchant_id	=	\'%s\'	\
			AND	card_no		=	\'%s\'	\
			AND	acq_bank_id	=	\'%s\'	\
			AND	acq_host_id	=	\'%s\'",
			table_name,
		 	pcs.Merchant_id,
			pcs.Card_no,
			pcs.Acq_bank_id,
			pcs.Acq_host_id);
#endif

		return 0;

	case	REFUND:
	case	POS_VOID:
	case	REVERSAL:
	case	ADJUST:
#ifdef wyz_mod_020329_for_adjust_index
		sprintf(sqlstr, "SELECT * FROM  %s		\
			WHERE	acq_bank_id	=	\'%s\'	\
			AND	acq_host_id	=	\'%s\'	\
			AND	card_no		=	\'%s\'	\
			AND	merchant_id	=	\'%s\'	\
			AND	terminal_id	=	\'%s\'",
			table_name,
			pcs.Acq_bank_id,
			pcs.Acq_host_id,
			pcs.Card_no,
		 	pcs.Merchant_id,
		 	pcs.Terminal_id);
#else
		sprintf(sqlstr, "SELECT * FROM  %s		\
			WHERE	merchant_id	=	\'%s\'	\
			AND	terminal_id	=	\'%s\'	\
			AND	card_no		=	\'%s\'	\
			AND	acq_bank_id	=	\'%s\'	\
			AND	acq_host_id	=	\'%s\'",
			table_name,
		 	pcs.Merchant_id,
		 	pcs.Terminal_id,
			pcs.Card_no,
			pcs.Acq_bank_id,

⌨️ 快捷键说明

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