📄 posls.c
字号:
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 + -