📄 addadv.ec
字号:
/*=============================================================
功能:
作者:
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 + -