📄 ah_settle.ec
字号:
sprintf(buf, \
"header.card_type error![%s]",header.card_type);
}
/* end add by psj 2000.05.28 */
/* delete by psj 2000.05.28
if( !strcmp(header.card_type, "D", 1) )
sprintf(buf,"向主机发送借记卡清算明细成功! 共[%d]笔",atoi(header.count));
else
sprintf(buf,"向主机发送信用卡清算明细成功! 共[%d]笔",atoi(header.count));
*/
new_repos(MSG_OTHER, buf, strlen(buf));
daylog(DEBUG, "%s", buf);
return(0);
}
PreProcPhare( char *str ,int flag ,char *logic_d ,int *num)
{
$S_sys_param sys;
$char local_date[10];
int count;
char debnum[2], tmpstr[MAX_DEBIT*100];
int i, deb_num, ret, len;
char deb_card[MAX_DEBIT][19];
if( select_sys_param(&sys) ) {
daylog(ERROR,"select sys_param error!");
return ( -1 );
}
sprintf( local_date, "%10.10s", logic_d );
if( flag == DEB ) { /* 借记卡 bdb */
memset(tmpstr, 0, sizeof(tmpstr));
if( get_debit_str( tmpstr ) ) {
daylog(ERROR,"get_debit_str error!");
return ( -1 );
}
sprintf( str, " select count(*) from posls where %s sd_bankid = '%s' and local_date = '%s' and trans_type in (2,3,4,5,8) and res_flag = 'O' and manunal_flag = 'N' and ret_code like '00' and card_type = '01' and bank_type = '04' ", tmpstr, sys.center, local_date);
// errcall(DEBUG,"Pre_deb select_num[%s]", str);
count = 0;
select_num( str, &count );
*num = count;
memset(str, 0, sizeof(str));
sprintf( str, " select * from posls where %s sd_bankid = '%s' and local_date = '%s' and trans_type in (2,3,4,5,8) and res_flag = 'O' and manunal_flag = 'N' and ret_code like '00' and card_type = '01' and bank_type = '04' order by local_date, card_no ", tmpstr, sys.center, local_date);
// errcall(DEBUG,"PreSend_deb select [%s] count[%d]",str,count);
} else { /* 信用卡 bdb bdt */
sprintf(str," select count(*) from settle_line where settle_date = '%s' and trans_type in (2,3,4,5,8,11) and res_flag = 'O' and manunal_flag = 'N' and ret_code like '00' and card_type = '00' and bank_type = '04' and err_flag = '0' and ( sd_bankid = '%s' ) ", local_date, sys.center);
// errcall(DEBUG,"Pre_cre select_num[%s]", str);
count = 0;
select_num( str, &count );
*num = count;
memset(str, 0, sizeof(str));
sprintf( str, " select * from settle_line where settle_date = '%s' and trans_type in (2,3,4,5,8,11) and res_flag = 'O' and manunal_flag = 'N' and ret_code like '00' and card_type = '00' and bank_type = '04' and err_flag = '0' and ( sd_bankid = '%s' ) order by local_date, card_no ", local_date, sys.center);
// errcall(DEBUG,"PreSele_cre[%s] count[%d]",str,count);
}
if ( flag == DEB )
strcpy(header.card_type, "D");
else
strcpy(header.card_type, "C");
sprintf( header.count, "%06d", count);
sprintf( header.bankid, "%4.4s", sys.center);
getdatef( header.settle_date, "/");
/* add by psj */
// errcall(DEBUG,"send mx head: \nbankid[%s]\n count[%s]\n card_type[%s]\n settle_date[%s]\n",header.bankid, header.count, header.card_type, header.settle_date);
return ( 0 );
}
struct hostent *e_gethostbyname(char *hostname)
{
static struct hostent host;
static unsigned long addr;
static char *paddr;
rm_tail_space(hostname);
if (!strlen(hostname)) return((struct hostent *)0);
if ((addr = inet_addr(hostname)) != (unsigned)-1) {
memset(&host, 0, sizeof(host));
host.h_length = sizeof(addr);
host.h_addr_list = &paddr;
paddr = (char *)&addr;
return(&host);
} else
return(gethostbyname(hostname));
}
struct servent *e_getservbyname(char *servname, char *proto)
{
static struct servent serv;
struct servent *sp;
int i;
rm_tail_space(servname);
if (!strlen(servname)) return((struct servent *)0);
sp = getservbyname(servname, proto);
if (!sp) {
for (i = 0; i < strlen(servname); i++)
if ((servname[i] < '0') || (servname[i] > '9')) break;
if (i == strlen(servname)) {
memset(&serv, 0, sizeof(serv));
serv.s_port = htons(atoi(servname));
sp = &serv;
}
}
return(sp);
}
int tcp_connect(char *hostname, char *servicename)
{
int sock;
struct hostent *hp;
struct servent *sp;
struct sockaddr_in remote;
if (!(sp = e_getservbyname(servicename, "tcp"))) return(-1);
if (!(hp = e_gethostbyname(hostname))) return(-1);
bzero(&remote, sizeof(remote));
remote.sin_family = AF_INET;
bcopy(hp->h_addr, &remote.sin_addr, hp->h_length);
remote.sin_port = sp->s_port;
if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) return(-1);
if (connect(sock, (struct sockaddr *)&remote, sizeof(remote)) < 0) return(-1);
return(sock);
}
int cutoff_finish()
{
$S_sys_param sys;
$char max_date[11];
$char ret_code[3];
$int cnt;
$char cur_date[11];
$char cur_time[9];
$char local_date[10];
int ret;
if( select_sys_param(&sys) ) {
daylog(ERROR,"select sys_param error!");
return ( -1 );
}
dateadd(sys.local_date, -1, local_date);
$select max( logic_date ) into :max_date from net_settle
where source_bankid = :sys.center;
if ( SQLCODE ) {
daylog(ERROR,"select max (local_date ) fail! [%d] ", SQLCODE);
return ( -1 );
}
if ( max_date[0] == '\0' ) { /* init use settle default is settled */
daylog(ERROR," 主机对帐记录空, 初次使用对帐. ");
getdatef( cur_date, "/");
gettimef( cur_time, ":");
$insert into net_settle
values( :sys.center, :local_date, :cur_date,
:cur_time, "OK", 0, 0.0, 0, 0.0,
0, 0.0, 0, 0.0, 0, 0, 0, 0,
0.0, 0, 0.0, 0, 0.0, 0, 0.0, 0, 0, 0
);
if ( SQLCODE ) {
daylog(ERROR,"insert init net_settle err[%d]", SQLCODE);
return ( -1 );
}
return ( SETTLE_YES );
}
ret = strcmp(local_date, max_date);
// daylog(ERROR,"l_d[%s] m_d[%s] ret[%d]",local_date,max_date,ret);
switch( ret ) {
case 0: /* already settle to host */
$select count(*) into :cnt from net_settle
where logic_date = :max_date
/* and ( ret_code = '95' or ret_code = '00' ) */
and source_bankid = :sys.center;
if( SQLCODE < 0) return ( -1 );
if( SQLCODE == 100 ) cnt = 0;
if ( cnt )
return( SETTLE_YES );
else
return( SETTLE_NO );
break;
case 1: /* no settle to host */
return( SETTLE_NO );
break;
case -1: /* local_date error */
return( SETTLE_ERR );
break;
}
}
int get_debit_str( char *str )
{
char debnum[2], no[2], tmp[50];
int i, deb_num, ret, len;
char deb_card[19];
if(readtab(C_FILE, DEB_PAR, DEB_NUM, debnum) < 0) {
errcall(ERROR,"Read %s err!",C_FILE);
return(-1);
}
deb_num = atoi(debnum);
if ( deb_num > 0 ) { /* 只包含本地借记卡 */
strcpy(str, "( ");
for(i=0; i < deb_num; i++) {
sprintf(no, "%d", i+1);
memset(deb_card, 0, sizeof(deb_card));
ret=readtab(C_FILE, DEB_PAR, no, deb_card);
if ( ret < 0 ) {
errcall(ERROR,"Read %s err!",C_FILE);
return(-1);
}
rm_tail_space(deb_card);
len = strlen(deb_card);
sprintf(tmp, " card_no[1,%d] = \'%s\' ",
len, deb_card);
strcat(str, tmp);
if(i < (deb_num - 1)) strcat(str, " or ");
}
strcat(str," or card_type = \'00\' ) and ");
}
return(0);
}
/*---------------- posls 表 ----------------------------------
从posls表中获得交易统计
ENTRY: sqlstring 此串中必须使用 select count(*) from
RETURN: -1, FAIL
0, SUCC, RESULT-->num
-------------------------------------------------------------*/
select_num( sqlstring, num )
char *sqlstring;
int *num;
{
EXEC SQL BEGIN DECLARE SECTION;
char sqlstr[1024];
int num0;
EXEC SQL END DECLARE SECTION;
strcpy( sqlstr, sqlstring );
num0 = 0;
EXEC SQL PREPARE sel_num FROM :sqlstr;
if( SQLCODE < 0 ) {
errcall(ERROR, "PREPARE sel_num err[%ld][%s]",SQLCODE, sqlstr);
return(-1);
}
EXEC SQL DECLARE sel_num_ls CURSOR FOR sel_num;
if( SQLCODE < 0 ) {
errcall(ERROR,"DECLARE sel_num_ls err[%ld][%s]",SQLCODE,sqlstr);
return(-1);
}
EXEC SQL OPEN sel_num_ls;
if( SQLCODE < 0 ) {
errcall(ERROR, "OPEN sel_num_ls err[%ld][%s]",SQLCODE, sqlstr);
return(-1);
}
EXEC SQL FETCH sel_num_ls INTO :num0;
if( SQLCODE < 0 ) {
errcall(ERROR, "FETCH sel_num_ls err[%ld][%s]",SQLCODE, sqlstr);
EXEC SQL CLOSE sel_num_ls;
return(-1);
}
EXEC SQL CLOSE sel_num_ls;
*num = num0;
return( 0 );
}
/*---------------- posls 表 ----------------------------------
从posls表中获得交易统计
ENTRY: sqlstring 此串中必须使用 select count(*), sum(amount) from
RETURN: -1, FAIL
0, SUCC, RESULT-->num, amt
-------------------------------------------------------------*/
select_amt_num( sqlstring, num, amt )
char *sqlstring;
int *num;
double *amt;
{
EXEC SQL BEGIN DECLARE SECTION;
char sqlstr[1024];
int num0;
double amt0;
EXEC SQL END DECLARE SECTION;
strcpy( sqlstr, sqlstring );
num0 = 0; amt0 = 0;
EXEC SQL PREPARE sel_amt_num FROM :sqlstr;
if( SQLCODE<0 ) {
errcall(ERROR, "PRE sel_amt_mum err[%ld][%s]", SQLCODE, sqlstr);
return(-1);
}
EXEC SQL DECLARE sel_amt_num_ls CURSOR FOR sel_amt_num;
if( SQLCODE<0 ) {
errcall(ERROR,"DECLARE sel_amt_num err[%ld][%s]", SQLCODE, sqlstr);
return(-1);
}
EXEC SQL OPEN sel_amt_num_ls;
if( SQLCODE<0 ) {
errcall(ERROR,"OPEN sel_amt_num err[%ld][%s]", SQLCODE, sqlstr);
return(-1);
}
EXEC SQL FETCH sel_amt_num_ls INTO :num0, :amt0:indi;
if( SQLCODE<0 ) {
errcall(ERROR, "FETCH sel_ls err[%ld][%s]", SQLCODE, sqlstr);
EXEC SQL CLOSE sel_amt_num_ls;
return(-1);
}
EXEC SQL CLOSE sel_amt_num_ls;
if(num0 == 0) amt0 = 0;
*num = num0;
*amt = amt0;
return( 0 );
}
double ah_get_qs_tip(S_posls ls, double *t_fee)
{
double c_fee, d_fee;
double tip;
$S_sys_param sys;
if( select_sys_param(&sys) ) {
daylog(ERROR,"select sys_param error!");
return ( -1 );
}
if (memcmp(sys.center, ls.sd_bankid, 4)) return(0);
c_fee = 0.00; d_fee = 0.00;
if(get_rebate(ls.merchant_id, &c_fee, &d_fee) != 0) {
daylog(ERROR," get shop_card table rmbc_rebate,debit_rebate error!! ");
return(-1);
}
switch (ls.trans_type) {
case PURCHASE:
case CONFIRM:
if( !memcmp(ls.card_type, "00", 2) )
tip = (c_fee / 100) * ls.amount;
else
tip = (d_fee / 100) * ls.amount;
*t_fee = (double)(long)((tip + 0.005) * 100) / 100;
break;
default:
*t_fee = 0.00;
break;
}
// errcall(DEBUG,"get_fee:t_type[%d]c_fee[%f]d_fee[%f]amount[%f]tip[%f]fee[%f]", ls.trans_type,c_fee,d_fee,ls.amount,tip,*t_fee);
return(0);
}
int get_rebate( char *merch_id, double *cre_rate, double *deb_rate)
{
$char merchant_id[15];
$short indi;
$double rmbc_rebate, debit_rebate;
memcpy(merchant_id, merch_id, 15);
rmbc_rebate = 0.00; debit_rebate = 0.00;
EXEC SQL SELECT rmbc_rebate, debit_rebate
INTO :rmbc_rebate:indi, :debit_rebate:indi
FROM shop_card
WHERE merchant_id = :merchant_id;
if ((indi != -1) && !sqlca.sqlcode) {
*cre_rate = rmbc_rebate;
*deb_rate = debit_rebate;
}
return(sqlca.sqlcode);
}
int re_settle()
{
char str[1024], l_date[20];
int num;
$S_sys_param sys;
if(select_sys_param(&sys) < 0) return(-1);
dateadd(sys.local_date, -1, l_date);
sprintf( str, "select count(*) from settle_line where (sd_bankid = '%s' or fk_bankid = '%s') and settle_date = '%s' and down_flag = 'Y' and res_flag in ('O','C') and ret_code[1,2] = '00' and terminal_id[1,3] != 'TRM' and card_type != '01' ", sys.center, sys.center, l_date);
if(select_num(str, num) < 0) return(-1);
if( num > 0 ) return(1); /* current local_date settle succ */
/* current local_date settle fail */
if ( posls_to_settle() < 0 ) return(-1);
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -