Merge branch 'develop'

# Conflicts:
#	pom.xml
#	src/main/ui/static/payment/cashiers/templates/cashiers.html
master
luoyang 6 years ago
commit 9cb6a764ce

@ -5,11 +5,11 @@
<parent>
<groupId>au.com.royalpay.payment</groupId>
<artifactId>payment-parent</artifactId>
<version>2.1.13</version>
<version>2.1.25</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>manage</artifactId>
<version>2.1.11</version>
<version>2.2.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jib-maven-plugin.version>1.8.0</jib-maven-plugin.version>

@ -22,6 +22,10 @@
"Miniprogram_Payment",
"NewMobileH5Pay",
"MobileH5Pay",
"CardPayment",
"CardPreOrder",
"CardInputView",
"CardOrder",
"RetailPay",
"RetailMicroPay",
"RetailQRCode",

@ -230,7 +230,119 @@
* @apiError (ERROR_CODE) ORDER_NOT_EXIST 订单不存在
* @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配
*/
/**
* @api {PUT} /api/v1.0/gateway/partners/{partner_code}/pre_card_orders/{order_id} 创建卡支付预订单
* @apiName CardPreOrder
* @apiGroup CardPayment
* @apiVersion 1.0.0
* @apiDescription
* <b>
* 卡支付即消费者输入银行卡信息进行下单的接口接入卡支付需要额外的合规流程<br>
* 卡支付预订单是先下单然后跳转royalpay支付页由消费者输入卡信息并完成支付<br>
* 卡支付预订单允许消费者多次尝试输入因此除非主动关闭订单订单有效期会一直持续到有效期结束
*
* @apiHeader Accept application/json
* @apiHeader Content-Type application/json
* @apiParam (PathVariable) {String} partner_code 必填商户编码由4位大写字母或数字构成
* @apiParam (PathVariable) {String} order_id 必填商户支付订单号要求同一商户唯一
* @apiUse Sign
* @apiParam (JSON) {String} description 必填订单标题最大长度128字符超出自动截取
* @apiParam (JSON) {int} price 必填金额单位为货币最小单位例如使用100表示AUD1.00
* @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码卡支付仅支持AUD下单
* @apiParam (JSON) {String} notify_url 支付通知url详见支付通知api不填则不会推送支付通知
* @apiParam (JSON) {String} operator 操作人员标识
* @apiParam (JSON) {Boolean} domestic_only 默认为false是否只允许本国卡由于境内境外卡支付手续费差异巨大可在此限制
* @apiParam (JSON) {Boolean} disable_credit_card 默认为false如果希望限制消费者使用信用卡支付可传入true
* @apiParam (JSON) {String} customer_id 可选参数如果事先进行了tokenize操作可提供customer id消费者随后仅需输入cvv信息
* @apiParam (JSON) {JSON} customer 可选参数提交消费者基本信息可为charge back发生时提供依据
*
* @apiParam (customer) {String} name 姓名可选如果未提供会自动使用card holder name
* @apiParam (customer) {String} postcode 邮编可选4位数字
* @apiParam (customer) {String} address 地址可选
* @apiParam (customer) {String} city 城市如Sydney
* @apiParam (customer) {String} state 可选三位大写代码如VIC
* @apiParam (customer) {String} country 国家可选ISO-3600-1标准收录的两位国家代码
*
* @apiSuccess {String} return_code 执行结果
* @apiSuccess {String} result_code SUCCESS表示创建订单成功EXISTS表示订单已存在
* @apiSuccess {String} partner_code 商户编码
* @apiSuccess {String} channel 支付渠道
* @apiSuccess {String} full_name 商户注册全名
* @apiSuccess {String} partner_name 商户名称
* @apiSuccess {String} order_id RoyalPay订单ID同时也是支付渠道订单ID最终支付成功的订单ID可能不同
* @apiSuccess {String} partner_order_id 商户订单ID
* @apiSuccess {String} pay_url 跳转URL
*
* @apiUse GlobalError
* @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配
* @apiError (ERROR_CODE) ORDER_PAID 订单已支付
*
*/
/**
* @api {PUT} /api/v1.0/gateway/partners/{partner_code}/card_orders/{order_id} 创建卡支付订单
* @apiName CardOrder
* @apiGroup CardPayment
* @apiVersion 1.0.0
* @apiDescription
* <b>
* 卡支付即消费者输入银行卡信息进行下单的接口接入卡支付需要额外的合规流程<br>
* 卡支付订单需要在商户页面引入js sdk并生成加密卡输入界面消费者输入卡信息后通过回调将加密后的卡信息返回商户请求时带上加密卡信息<br>
* 卡支付下单无需后续消费者交互直接可查询下单结果
*
* @apiHeader Accept application/json
* @apiHeader Content-Type application/json
* @apiParam (PathVariable) {String} partner_code 必填商户编码由4位大写字母或数字构成
* @apiParam (PathVariable) {String} order_id 必填商户支付订单号要求同一商户唯一
* @apiUse Sign
* @apiParam (JSON) {String} description 必填订单标题最大长度128字符超出自动截取
* @apiParam (JSON) {int} price 必填金额单位为货币最小单位例如使用100表示AUD1.00
* @apiParam (JSON) {String=AUD,CNY} currency=AUD 币种代码卡支付仅支持AUD下单
* @apiParam (JSON) {String} notify_url 支付通知url详见支付通知api不填则不会推送支付通知
* @apiParam (JSON) {String} operator 操作人员标识
* @apiParam (JSON) {Boolean} domestic_only 默认为false是否只允许本国卡由于境内境外卡支付手续费差异巨大可在此限制
* @apiParam (JSON) {Boolean} disable_credit_card 默认为false如果希望限制消费者使用信用卡支付可传入true
* @apiParam (JSON) {String} key_id 必填加密卡信息key id
* @apiParam (JSON) {String} card_info 必填加密卡信息secret
* @apiParam (JSON) {JSON} customer 可选参数提交消费者基本信息可为charge back发生时提供依据
*
* @apiParam (customer) {String} name 姓名可选如果未提供会自动使用card holder name
* @apiParam (customer) {String} postcode 邮编可选4位数字
* @apiParam (customer) {String} address 地址可选
* @apiParam (customer) {String} city 城市如Sydney
* @apiParam (customer) {String} state 可选三位大写代码如VIC
* @apiParam (customer) {String} country 国家可选ISO-3600-1标准收录的两位国家代码
*
* @apiSuccess {String} return_code 执行结果
* @apiSuccess {String} result_code SUCCESS表示创建订单成功EXISTS表示订单已存在
* @apiSuccess {String} partner_code 商户编码
* @apiSuccess {String} channel 支付渠道
* @apiSuccess {String} full_name 商户注册全名
* @apiSuccess {String} partner_name 商户名称
* @apiSuccess {String} order_id RoyalPay订单ID同时也是支付渠道订单ID最终支付成功的订单ID可能不同
* @apiSuccess {String} partner_order_id 商户订单ID
* @apiSuccess {String} pay_url 跳转URL
*
* @apiUse GlobalError
* @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配
* @apiError (ERROR_CODE) ORDER_PAID 订单已支付
*
*/
/**
* @api {GET} /api/v1.0/card_payment_view/partners/{partner_code}/orders/{order_id}/view 卡支付跳转页
* @apiName CardInputView
* @apiDescription 必须先调用创建卡支付预订单接口再进行跳转优先使用接口返回地址
* 建议在用户回调到对应页时通过后台查询订单状态接口确认订单的支付状态
* @apiVersion 1.0.0
* @apiGroup CardPayment
* @apiParam (PathVariable) {String} partner_code 必填商户编码由4位大写字母或数字构成
* @apiParam (PathVariable) {String} order_id 必填商户支付订单号要求已预先创建
* @apiUse Sign
* @apiParam (QueryParam) {String} redirect 必填支付成功后跳转页面回调时会带上签名参数用于校验
*
* @apiUse GlobalError
* @apiError (ERROR_CODE) ORDER_NOT_EXIST 订单不存在
* @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配
*/
/**
* @api {PUT} /api/v1.0/jsapi_gateway/partners/{partner_code}/orders/{order_id} 创建JSAPI订单
* @apiName NewJSAPI
@ -1015,6 +1127,7 @@
* @apiError (ERROR_CODE) ORDER_MISMATCH 订单号与商户不匹配
*
*/
/**
* @api {PUT} /api/v1.0/customs/partners/{partner_code}/redeclare/report/{client_report_id} 重新提交报关单
* @apiName redeclare_report

@ -22,6 +22,10 @@
"Miniprogram_Payment",
"NewMobileH5Pay",
"MobileH5Pay",
"CardPayment",
"CardPreOrder",
"CardInputView",
"CardOrder",
"RetailPay",
"RetailMicroPay",
"RetailQRCode",

@ -235,7 +235,119 @@
* @apiError (ERROR_CODE) ORDER_NOT_EXIST Order does not exist
* @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner
*/
/**
* @api {PUT} /api/v1.0/gateway/partners/{partner_code}/pre_card_orders/{order_id} Create Card Pre Order
* @apiName CardPreOrder
* @apiGroup CardPayment
* @apiVersion 1.0.0
* @apiDescription
* <b>
* Card payment method is that customer provider their card information to finish payments. Enable card payment require addition compliance process.<br>
* Card Pre Order is the way merchant create order first and then redirect to the page on royalpay to ask customer input card information and finish payment.<br>
* Card Pre Order allows customer retry multiple times. So unless merchant call the closing api. Order will exists available until hit the expire time.
*
* @apiHeader Accept application/json
* @apiHeader Content-Type application/json
* @apiParam (PathVariable) {String} partner_code Required, Partner code
* @apiParam (PathVariable) {String} order_id Required, Partner order id
* @apiUse Sign
* @apiParam (JSON) {String} description Required, Order description
* @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency.
* @apiParam (JSON) {String=AUD,CNY} currency=AUD currency, Only AUD supported
* @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds
* @apiParam (JSON) {String} operator Note for the operator who created this order.
* @apiParam (JSON) {Boolean} domestic_only Default is false, Due to there is a huge rate difference between domestic cards and international cards. merchants can disable international cards
* @apiParam (JSON) {Boolean} disable_credit_card Default is false, if merchants want to limit customers not using credit cards. this parameter can be helpful
* @apiParam (JSON) {String} customer_id Optional, if merchants tokenized customer's card with a customer id, it can reference the card information and customers will only provide cvv2 code then.
* @apiParam (JSON) {JSON} customer Optional, json object, provide customer's basic information in case there were a charge back happened
*
* @apiParam (customer) {String} name customer's name. optional. if not provided system will use card holder name
* @apiParam (customer) {String} postcode optional
* @apiParam (customer) {String} address optional
* @apiParam (customer) {String} city optional,like Sydney
* @apiParam (customer) {String} state optional, 3-character state name. like NSW
* @apiParam (customer) {String} country optional, nation code, use 2-character code in ISO-3600-1
*
* @apiSuccess {String} return_code Execution result
* @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed.
* @apiSuccess {String} partner_code Partner code
* @apiSuccess {String} channel Payment channel
* @apiSuccess {String} full_name Partner's full company name when registered
* @apiSuccess {String} partner_name Partner's name
* @apiSuccess {String} order_id Order id in RoyalPay, which is also payment channel(Wechat/Alipay) order id.
* @apiSuccess {String} partner_order_id Partner order id
* @apiSuccess {String} pay_url Payment page in RoyalPay.
*
* @apiUse GlobalError
* @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner
* @apiError (ERROR_CODE) ORDER_PAID Order has already been paid
*
*/
/**
* @api {PUT} /api/v1.0/gateway/partners/{partner_code}/card_orders/{order_id} 创建卡支付订单
* @apiName CardOrder
* @apiGroup CardPayment
* @apiVersion 1.0.0
* @apiDescription
* <b>
* Card payment method is that customer provider their card information to finish payments. Enable card payment require addition compliance process.<br>
* Card Order is the way merchant import our sdk in payment page and display a encrypting card input view. then collect the encrypted card info from callback and then pass them to royalpay to create order and finish payments<br>
* Card Order api do not need customers reaction any more. merchants can check payment result directly after created order.
*
* @apiHeader Accept application/json
* @apiHeader Content-Type application/json
* @apiParam (PathVariable) {String} partner_code Required, Partner code
* @apiParam (PathVariable) {String} order_id Required, Partner order id
* @apiUse Sign
* @apiParam (JSON) {String} description Required, Order description
* @apiParam (JSON) {int} price Required, Price of the order. Use the base unit of the currency.
* @apiParam (JSON) {String=AUD,CNY} currency=AUD currency, Only AUD supported
* @apiParam (JSON) {String} notify_url System will call the notify url if provided when the payment succeeds
* @apiParam (JSON) {String} operator Note for the operator who created this order.
* @apiParam (JSON) {String} key_id Required, key_id of encrypted callback
* @apiParam (JSON) {String} card_info Required, secret of encrypted callback
* @apiParam (JSON) {Boolean} domestic_only Default is false, Due to there is a huge rate difference between domestic cards and international cards. merchants can disable international cards
* @apiParam (JSON) {Boolean} disable_credit_card Default is false, if merchants want to limit customers not using credit cards. this parameter can be helpful
* @apiParam (JSON) {JSON} customer Optional, json object, provide customer's basic information in case there were a charge back happened
*
* @apiParam (customer) {String} name customer's name. optional. if not provided system will use card holder name
* @apiParam (customer) {String} postcode optional
* @apiParam (customer) {String} address optional
* @apiParam (customer) {String} city optional,like Sydney
* @apiParam (customer) {String} state optional, 3-character state name. like NSW
* @apiParam (customer) {String} country optional, nation code, use 2-character code in ISO-3600-1
*
* @apiSuccess {String} return_code Execution result
* @apiSuccess {String} result_code SUCCESS means order created successfully, EXISTS means order has already existed.
* @apiSuccess {String} partner_code Partner code
* @apiSuccess {String} channel Payment channel
* @apiSuccess {String} full_name Partner's full company name when registered
* @apiSuccess {String} partner_name Partner's name
* @apiSuccess {String} order_id Order id in RoyalPay, which is also payment channel(Wechat/Alipay) order id.
* @apiSuccess {String} partner_order_id Partner order id
* @apiSuccess {String} pay_url Payment page in RoyalPay.
*
* @apiUse GlobalError
* @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner
* @apiError (ERROR_CODE) ORDER_PAID Order has already been paid
*
*/
/**
* @api {GET} /api/v1.0/card_payment_view/partners/{partner_code}/orders/{order_id}/view 卡支付跳转页
* @apiName CardInputView
* @apiDescription This page mush be called after payment order has been created.
* When jumping back to redirection URL, it is recommended to call the order query API to make sure the payment has succeeded.
* @apiVersion 1.0.0
* @apiGroup CardPayment
* @apiParam (PathVariable) {String} partner_code Required, Partner code
* @apiParam (PathVariable) {String} order_id Required, Partner order id. It shall have already been created
* @apiUse Sign
* @apiParam (QueryParam) {String} redirect Required, Redirect url when payment succeeded. Contain sign parameters for validation.
*
* @apiUse GlobalError
* @apiError (ERROR_CODE) ORDER_NOT_EXIST Order does not exist
* @apiError (ERROR_CODE) ORDER_MISMATCH Order is not belong to this partner
*/
/**
* @api {PUT} /api/v1.0/jsapi_gateway/partners/{partner_code}/orders/{order_id} Create JSAPI Payment Order
* @apiName NewJSAPI

@ -1,5 +1,6 @@
package au.com.royalpay.payment.manage;
import com.alibaba.fastjson.parser.ParserConfig;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
@ -33,6 +34,7 @@ import java.util.concurrent.ScheduledExecutorService;
public class PaymentManageApplication {
public static void main(String[] args) {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
SpringApplication.run(PaymentManageApplication.class, args);
}

@ -5,7 +5,6 @@ import au.com.royalpay.payment.manage.analysis.mappers.CustomerAndOrdersStatisti
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
@ -17,7 +16,6 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@ -45,6 +43,8 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService {
listChannel.add(putParam(params,"Rpay"));
listChannel.add(putParam(params,"Yeepay"));
listChannel.add(putParam(params,"LakalaPay"));
listChannel.add(putParam(params,"rpaypmt_card"));
listChannel.add(putParam(params,"rpaypmt_dd"));
return listChannel;
}
@ -55,7 +55,7 @@ public class ChannelsAnalysisServiceImpl implements ChannelsAnalysisService {
}
List<JSONObject> list = new ArrayList<>();
Map<Date,JSONObject> analysisMap = new TreeMap<>();
String[] channels = {"Wechat","Bestpay","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay","LakalaPay"};
String[] channels = {"Wechat","Bestpay","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay","LakalaPay","rpaypmt_card","rpaypmt_dd"};
for (String channel:channels){
analysisChannelCustomers(params, analysisMap, channel);
}

@ -11,7 +11,6 @@ import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.CustomerMapper;
import au.com.royalpay.payment.manage.mappers.system.ManagerCustomerRelationAlipayMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
import au.com.royalpay.payment.manage.tradelog.beans.TradeLogQuery;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApi;
import au.com.royalpay.payment.tools.connections.mpsupport.MpWechatApiProvider;
import au.com.royalpay.payment.tools.connections.mpsupport.beans.TemplateMessage;
@ -28,7 +27,6 @@ import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@ -100,6 +98,8 @@ public class CustomersAnalysisServiceImp implements CustomersAnalysisService {
channels.add("hf");
channels.add("jd");
channels.add("LakalaPay");
channels.add("rpaypmt_card");
channels.add("rpaypmt_dd");
params.put("channels", channels);
}
result.put("channels", customerAndOrdersStatisticsMapper.getCBBankChannelAmount(params));

@ -334,6 +334,12 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT
res.put("today",today);
res.put("yes",yes);
res.put("not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)));
params.put("channel", "system");
res.put("sys_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)));
params.put("channel", "rpaypmt_card");
res.put("rpaypmt_card_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)));
params.put("channel", "rpaypmt_dd");
res.put("rpaypmt_dd_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)));
res.put("trade_amount_rise",yes.getBigDecimal("trade_amount").compareTo(BigDecimal.ZERO)>0 ? (today.getBigDecimal("trade_amount").subtract(yes.getBigDecimal("trade_amount"))).divide(yes.getBigDecimal("trade_amount"), 4, RoundingMode.HALF_UP):BigDecimal.ZERO);
res.put("trade_count_rise", yes.getIntValue("trade_count") > 0 ? (today.getBigDecimal("trade_count").subtract(yes.getBigDecimal("trade_count"))).divide(yes.getBigDecimal("trade_count"), 4, RoundingMode.HALF_UP) : 0);
res.put("customers_rise", yes.getIntValue("customers") > 0 ? (today.getBigDecimal("customers").subtract(yes.getBigDecimal("customers"))).divide(yes.getBigDecimal("customers"), 4, RoundingMode.HALF_UP) : 0);
@ -604,7 +610,7 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT
}
}
private JSONObject getTodayChannelCount(JSONObject params){
String[] channels = new String[]{"Bestpay","Wechat","Alipay","jd","AlipayOnline","hf", "Rpay","Yeepay","LakalaPay"};
String[] channels = new String[]{"Bestpay", "Wechat", "Alipay", "jd", "AlipayOnline", "hf", "Rpay", "Yeepay", "LakalaPay", "rpaypmt_card", "rpaypmt_dd"};
JSONObject resp = new JSONObject();
for(String channel:channels) {
params.put("channel", channel);

@ -15,11 +15,9 @@ import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
import au.com.royalpay.payment.tools.lock.Locker;
import au.com.royalpay.payment.tools.permission.enums.ManagerRole;
import au.com.royalpay.payment.tools.utils.TimeZoneUtils;
import com.alibaba.fastjson.JSONObject;
import com.github.miemiedev.mybatis.paginator.domain.Order;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
@ -36,21 +34,16 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
/**
* Created by yixian on 2017-02-07.
*/
@ -88,7 +81,7 @@ public class BDPrizeServiceImpl implements BDPrizeService {
private static BigDecimal percent = new BigDecimal(100);
private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf", "Rpay","Yeepay","LakalaPay"};
private static String[] channels = new String[]{"Wechat", "Alipay", "Bestpay", "jd", "AlipayOnline","hf", "Rpay","Yeepay","LakalaPay", "rpaypmt_card", "rpaypmt_dd"};
private static Logger logger = LoggerFactory.getLogger(BDPrizeServiceImpl.class);
@Override

@ -76,6 +76,14 @@ public class PartnerBillServiceImpl implements PartnerBillService {
String code_url = getQRCodeImg(record);
record.put("code_url",code_url);
directedBillCodeMapper.update(record);
if("v1".equals(client.getString("billcode_version"))){
record.put("code_urls",code_url);
record.put("code_url",QRCodeUtils.qrcodeImageCode(code_url, 250, false));
}else{
String url = PlatformEnvironment.getEnv().concatUrl("api/v1.0/share_code/business/bills/"+record.getString("bill_code_id")+"/link/payment");
record.put("code_urls",url);
record.put("code_url",QRCodeUtils.qrcodeImageCode(url, 250, false));
}
return QRCodeUtils.qrcodeImageCode(code_url, 250, false);
}
@ -93,7 +101,18 @@ public class PartnerBillServiceImpl implements PartnerBillService {
JSONObject params = queryBillBean.toJson();
params.put("client_id",client_id);
List<JSONObject> bills = directedBillCodeMapper.findByClientId(params,new PageBounds(queryBillBean.getPage(),queryBillBean.getLimit(), Order.formString("create_time.desc")));
bills.stream().filter(t->StringUtils.isNotEmpty(t.getString("code_url"))).forEach(t->t.put("code_url",QRCodeUtils.qrcodeImageCode(t.getString("code_url"), 250, false)));
// bills.stream().filter(t->StringUtils.isNotEmpty(t.getString("code_url"))).forEach(t->t.put("code_url",QRCodeUtils.qrcodeImageCode(t.getString("code_url"), 250, false)));
for (JSONObject bill : bills) {
switch (client.getString("billcode_version")){
case "v1":
bill.put("code_urls",bill.getString("code_url"));
break;
case "v2":
bill.put("code_urls", PlatformEnvironment.getEnv().concatUrl("api/v1.0/share_code/business/bills/"+bill.getString("bill_code_id")+"/link/payment"));
break;
}
bill.put("code_url",QRCodeUtils.qrcodeImageCode(bill.getString("code_urls"), 250, false));
}
return bills;
}

@ -6,12 +6,9 @@ import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientRateMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientModifySupport;
import au.com.royalpay.payment.manage.merchants.entity.impls.SwitchPermissionModify;
import au.com.royalpay.payment.manage.task.PostponeClientTask;
import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
@ -20,13 +17,12 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
/**
* @author kira
* @date 2018/8/2
@ -103,9 +99,9 @@ public class ManualServiceimpl implements ManualService {
record.put("manager_name", "System");
record.put("remark", "费率到期系统自动延期1年");
clientRateMapper.saveRate(record);
if ("Rpay".equals(o.getString("rate_name"))) {
rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id));
}
// if ("Rpay".equals(o.getString("rate_name"))) {
// rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id));
// }
});
}

@ -0,0 +1,26 @@
package au.com.royalpay.payment.manage.mappers.system;
import com.alibaba.fastjson.JSONObject;
import com.yixsoft.support.mybatis.autosql.annotations.AdvanceSelect;
import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper;
import com.yixsoft.support.mybatis.autosql.annotations.AutoSql;
import com.yixsoft.support.mybatis.autosql.annotations.SqlType;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Created by yishuqian on 06/03/2017.
*/
@AutoMapper(tablename = "sys_merchant_warrior_files", pkName = "file_id")
public interface ClientMWFilesMapper {
@AutoSql(SqlType.INSERT)
void save(JSONObject partner);
@AutoSql(SqlType.UPDATE)
void update(JSONObject partner);
@AutoSql(SqlType.SELECT)
@AdvanceSelect(addonWhereClause = "is_valid = 1")
List<JSONObject> findClientFile(@Param("client_id") int clientId);
}

@ -0,0 +1,88 @@
package au.com.royalpay.payment.manage.merchants.beans;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
/**
* Created by yishuqian on 07/03/2017.
*/
public class ClientMWAuthFilesInfo {
private String upay_application_form;
private String upay_agreement_file;
private String upay_offer_letter;
private String upay_driver_license;
private String upay_residence_certificate;
private String upay_risk_level;
private String upay_risk_remark;
public JSONObject toJson(){
return (JSONObject)JSONObject.toJSON(this);
}
public JSONObject toRiskInfoJson() {
JSONObject params = new JSONObject();
if (StringUtils.isNotBlank(upay_risk_level)) {
params.put("upay_risk_level", upay_risk_level);
}
if (StringUtils.isNotBlank(upay_risk_remark)) {
params.put("upay_risk_remark", upay_risk_remark);
}
return params;
}
public String getUpay_agreement_file() {
return upay_agreement_file;
}
public String getUpay_application_form() {
return upay_application_form;
}
public String getUpay_driver_license() {
return upay_driver_license;
}
public String getUpay_offer_letter() {
return upay_offer_letter;
}
public void setUpay_agreement_file(String upay_agreement_file) {
this.upay_agreement_file = upay_agreement_file;
}
public void setUpay_application_form(String upay_application_form) {
this.upay_application_form = upay_application_form;
}
public String getUpay_residence_certificate() {
return upay_residence_certificate;
}
public String getUpay_risk_level() {
return upay_risk_level;
}
public void setUpay_driver_license(String upay_driver_license) {
this.upay_driver_license = upay_driver_license;
}
public void setUpay_offer_letter(String upay_offer_letter) {
this.upay_offer_letter = upay_offer_letter;
}
public void setUpay_residence_certificate(String upay_residence_certificate) {
this.upay_residence_certificate = upay_residence_certificate;
}
public String getUpay_risk_remark() {
return upay_risk_remark;
}
public void setUpay_risk_level(String upay_risk_level) {
this.upay_risk_level = upay_risk_level;
}
public void setUpay_risk_remark(String upay_risk_remark) {
this.upay_risk_remark = upay_risk_remark;
}
}

@ -4,8 +4,8 @@ import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import org.apache.commons.lang3.time.DateUtils;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Calendar;
import java.util.Date;
@ -39,6 +39,8 @@ public class ClientRateConfig {
@NotNull(message = "error.payment.valid.param_missing")
private Integer cleanDays = 3;
private String remark;
@JSONField(name = "ext_rates")
private String extRates;
public JSONObject toJSON() {
if (expiryTime.before(activeTime)) {
@ -102,4 +104,12 @@ public class ClientRateConfig {
public void setTransactionFee(Double transactionFee) {
this.transactionFee = transactionFee;
}
public String getExtRates() {
return extRates;
}
public void setExtRates(String extRates) {
this.extRates = extRates;
}
}

@ -1,5 +1,6 @@
package au.com.royalpay.payment.manage.merchants.core;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity;
import au.com.royalpay.payment.core.exceptions.EmailException;
import au.com.royalpay.payment.manage.appclient.beans.AppClientBean;
import au.com.royalpay.payment.manage.appclient.beans.AppMerchantBean;
@ -29,6 +30,8 @@ public interface ClientManager {
JSONObject getSysRateConfig();
JSONObject getSysCardRateConfig();
JSONObject getClientInfo(int clientId);
JSONObject getClientInfoIgnoreInvalid(int clientId);
@ -252,12 +255,16 @@ public interface ClientManager {
void updateClientIdInfo(String clientMoniker,JSONObject params, JSONObject manager);
void updateMWRiskInfoByClient(String clientMoniker,JSONObject params, JSONObject manager);
JSONObject getAuthFiles(JSONObject manager, String clientMoniker);
JSONObject getClientViewAuthFiles(JSONObject manager, String clientMoniker);
JSONObject getAllAuthFiles(JSONObject manager, String clientMoniker);
JSONObject getMWAuthFiles(JSONObject manager, String clientMoniker);
JSONObject getAllKycFiles(JSONObject manager, String clientMoniker);
JSONObject getSourceAgreeFiles(JSONObject manage, String clientMoniker);
@ -270,6 +277,8 @@ public interface ClientManager {
void uploadAuthFilesManager(JSONObject manager, String clientMoniker, ClientAuthFilesInfo filesInfo);
void uploadMWAuthFilesManager(JSONObject manager, String clientMoniker, ClientMWAuthFilesInfo filesInfo);
void uploadKycFiles(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo);
List<JSONObject> uploadKycFilesForWaitCompliance(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo);
@ -376,6 +385,8 @@ public interface ClientManager {
void downloadComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception;
void downloadMWComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception;
void configMasterMerchant(JSONObject manager, String clientMoniker, String master_merchant);
JSONObject getSettlementLog(JSONObject manager, String clientMoniker, TradeLogQuery query);
@ -564,4 +575,13 @@ public interface ClientManager {
boolean getMergeSettleStatus(JSONObject client);
void changeExtParams(String clientMoniker,JSONObject manager, JSONObject params);
RPayMerchantEntity applyMWMerchantId(String clientMoniker, JSONObject manager);
RPayMerchantEntity queryMWMerchantIdStatus(String clientMoniker, JSONObject manager);
RPayMerchantEntity queryMWMerchantInfo(String clientMoniker, JSONObject manager);
void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version);
}

@ -5,6 +5,9 @@ import au.com.royalpay.payment.channels.alipay.config.AlipayEnvironment;
import au.com.royalpay.payment.channels.alipay.runtime.AlipayClient;
import au.com.royalpay.payment.channels.rpay.runtime.RpayApi;
import au.com.royalpay.payment.channels.rpay.runtime.beans.SubRpayMerchantInfo;
import au.com.royalpay.payment.channels.rpaypaymentsvc.mappers.RPayMerchantMapper;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.RPayPaymentCardSvcApi;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity;
import au.com.royalpay.payment.channels.wechat.config.WeChatPayConfig;
import au.com.royalpay.payment.channels.wechat.config.WechatPayEnvironment;
import au.com.royalpay.payment.channels.wechat.runtime.MpPaymentApi;
@ -14,6 +17,8 @@ import au.com.royalpay.payment.channels.yeepay.config.YeePayConfig;
import au.com.royalpay.payment.channels.yeepay.mappers.YeePayClientConfigMapper;
import au.com.royalpay.payment.channels.yeepay.runtime.YeePayClient;
import au.com.royalpay.payment.core.PaymentChannelApi;
import au.com.royalpay.payment.core.beans.EmptyMerchantApplication;
import au.com.royalpay.payment.core.beans.MerchantApplicationResult;
import au.com.royalpay.payment.core.exceptions.EmailException;
import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.core.mappers.SysClientMapper;
@ -40,6 +45,7 @@ import au.com.royalpay.payment.manage.mappers.system.*;
import au.com.royalpay.payment.manage.merchants.beans.*;
import au.com.royalpay.payment.manage.merchants.core.*;
import au.com.royalpay.payment.manage.merchants.entity.impls.*;
import au.com.royalpay.payment.manage.merchants.enums.UPayAuthFileEnum;
import au.com.royalpay.payment.manage.notice.core.MailService;
import au.com.royalpay.payment.manage.permission.utils.OrgCheckUtils;
import au.com.royalpay.payment.manage.rservices.core.RServicesApplyService;
@ -232,6 +238,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
@Resource
private ClientFilesMapper clientFilesMapper;
@Resource
private ClientMWFilesMapper clientMWAuthFilesInfo;
@Resource
private TransactionMapper transactionMapper;
@ -314,6 +322,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
private RetailRSvcService retailRSvcService;
@Resource
private RServicesApplyService rServicesApplyService;
@Resource
private RPayPaymentCardSvcApi rPayPaymentCardSvcApi;
@Resource
private RPayMerchantMapper rPayMerchantMapper;
@Resource
@ -352,6 +364,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
return JSONObject.parseObject(rateConfig);
}
@Override
public JSONObject getSysCardRateConfig() {
String rateConfig = sysConfigManager.getSysConfig().getString("sys_card_rates");
return JSONObject.parseObject(rateConfig);
}
@Override
@Cacheable(value = ":app_client_info:", key = "''+#clientId", unless = "#result == null")
public JSONObject getClientInfo(int clientId) {
@ -1940,6 +1958,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
if (rate.get("clean_days") == null) {
rate.put("clean_days", clientConfig.getIntValue("clean_days"));
}
if (StringUtils.equalsIgnoreCase("rpaypmt_card", rate.getString("rate_name"))) {
rate.put("ext_rates", JSONObject.parseObject(rate.getString("ext_rates")));
}
}
} catch (Exception ignore) {
}
@ -2000,6 +2021,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
config.put("active_time", DateFormatUtils.format(config.getDate("active_time"), "yyyy-MM-dd"));
config.put("expiry_time", DateFormatUtils.format(config.getDate("expiry_time"), "yyyy-MM-dd"));
if (isAddCardPaymentRate(config, clientId)) {
return;
}
checkAddRate(config, "Wechat", "wechat_rate_value", org, "min_wechat_rate");
checkAddRate(config, "Alipay", "alipay_rate_value", org, "min_alipay_rate");
checkAddRate(config, "AlipayOnline", "alipayonline_rate_value", org, "min_alipayonline_rate");
@ -2039,6 +2063,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
rateLog.put("expiry_time", DateUtils.addDays(config.getDate("active_time"), -1));
clientRateMapper.updateConfig(rateLog);
}
if (StringUtils.equalsIgnoreCase("rpaypmt_card", config.getString("type"))) {
JSONObject extRateParams = new JSONObject(){{
put("domestic_rate_value", config.getBigDecimal("rate_value"));
put("overseas_rate_value", config.getJSONObject("ext_rates").getBigDecimal("international_rate_value"));
}};
newConfig.put("ext_rates", extRateParams.toJSONString());
}
clientRateMapper.saveRate(newConfig);
logger.info(clientId + "的" + channel + "费率设置成功");
}
@ -2064,13 +2095,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
configJson.put("manager_name", manager.getString("username"));
configJson.put("update_time", new Date());
clientRateMapper.updateConfig(configJson);
if ("Rpay".equals(configJson.getString("rate_name"))) {
rpayApi.modifySurchargeConfig(client);
}
// if ("Rpay".equals(configJson.getString("rate_name"))) {
// rpayApi.modifySurchargeConfig(client);
// }
int clientId = client.getIntValue("client_id");
JSONObject changeRate = merchantInfoProvider.clientCurrentRate(clientId, new Date(), "Wechat");
int cleanDays = changeRate.getIntValue("clean_days");
if (cleanDays != client.getIntValue("clean_days")) {
if (cleanDays != client.getIntValue("clean_days") && StringUtils.equalsIgnoreCase("Wechat",config.getRateName())) {
clientModifySupport.processClientConfigModify(new ClearDaysModify(manager, clientMoniker, cleanDays));
}
// clientMapper.updateCleanDays(clientId, config.getCleanDays());
@ -3348,6 +3379,46 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
}
@Override
public void downloadMWComplianceZip(String clientMoniker, HttpServletResponse response) throws Exception {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
List<JSONObject> files = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id"));
if (files != null && files.size() > 0) {
List<String> filePaths = new ArrayList<>();
for (JSONObject file : files) {
filePaths.add(file.getString("file_value"));
}
try {
String downloadFilename = clientMoniker + "_Compliance_Files_" + DateFormatUtils.format(new Date(), "dd/MM/yyyy HH:mm:ss").toString() + ".zip";// 文件的名称
logger.info("正在下载合规文件=====>" + downloadFilename);
// downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");//转换中文否则可能会产生乱码
response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);// 设置在下载框默认显示的文件名
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
for (String file : filePaths) {
URL url = new URL(file);
zos.putNextEntry(new ZipEntry(file.substring(file.lastIndexOf("/"))));
InputStream fis = url.openConnection().getInputStream();
byte[] buffer = new byte[1024];
int r = 0;
while ((r = fis.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
fis.close();
}
zos.flush();
zos.close();
logger.info("合规文件下载成功=====>" + downloadFilename);
} catch (IOException e) {
logger.error("合规文件下载失败", e);
}
}
}
@Override
public void configMasterMerchant(JSONObject manager, String clientMoniker, String master_merchant) {
@ -3512,6 +3583,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
clientApproveIdInfo(params,client);
}
@Override
public void updateMWRiskInfoByClient(String clientMoniker, JSONObject params, JSONObject manager) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
int clientId = client.getIntValue("client_id");
params.put("client_id", client.getIntValue("client_id"));
clientConfigMapper.update(params);
}
@Override
public void checkTodo(JSONObject manager, List<TodoNotice> notices) {
if (ManagerRole.OPERATOR.hasRole(manager.getIntValue("role"))) {
@ -3621,6 +3703,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
return fileJson;
}
@Override
public JSONObject getMWAuthFiles(JSONObject manager, String clientMoniker) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
List<JSONObject> clientFiles = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id"));
JSONObject fileJson = new JSONObject();
for (JSONObject file : clientFiles) {
fileJson.put(file.getString("file_name"), file.getString("file_value"));
}
return fileJson;
}
@Override
public JSONObject getAllKycFiles(JSONObject manager, String clientMoniker) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
@ -3762,6 +3858,25 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
}
@Override
@Transactional
public void uploadMWAuthFilesManager(JSONObject manager, String clientMoniker, ClientMWAuthFilesInfo filesInfo) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
int clientId = client.getIntValue("client_id");
try {
updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_APPLICATION_FORM.getFileName(), filesInfo.getUpay_application_form());
updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_AGREEMENT_FILE.getFileName(), filesInfo.getUpay_agreement_file());
updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_OFFER_LETTER.getFileName(), filesInfo.getUpay_offer_letter());
updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_DRIVER_LICENSE.getFileName(), filesInfo.getUpay_driver_license());
updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_RESIDENCE_CERTIFICATE.getFileName(), filesInfo.getUpay_residence_certificate());
} catch (Exception e) {
logger.error("上传合规文件失败", e);
}
}
@Override
@Transactional
public void uploadKycFiles(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo) {
@ -4211,6 +4326,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
}
public void updateSysMWClientFiles(JSONObject manager, int clientId, String fileType, String fileValue) {
if (fileValue != null) {
JSONObject fileJson = new JSONObject();
fileJson.put("client_id", clientId);
fileJson.put("last_update_date", new Date());
fileJson.put("last_update_by", manager.getString("display_name"));
fileJson.put("file_name", fileType);
fileJson.put("file_value", fileValue);
fileJson.put("is_valid", 1);
clientMWAuthFilesInfo.save(fileJson);
logger.info(clientId + "的fileType文件上传成功");
}
}
public void updateSysClientFilesWithoutRepeat(JSONObject manager, int clientId, String fileType, String fileValue) {
List<JSONObject> repetitiveFiles = clientFilesMapper.findRepetitiveFilesForDelete(clientId,fileType);
if (fileValue != null) {
@ -6255,9 +6384,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
record.put("manager_name", "System");
record.put("remark", "费率到期系统自动延期1年");
clientRateMapper.saveRate(record);
if ("Rpay".equals(o.getString("rate_name"))) {
rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id));
}
// if ("Rpay".equals(o.getString("rate_name"))) {
// rpayApi.modifySurchargeConfig(clientMapper.findClient(client_id));
// }
}
adminAccounts.forEach(o -> {
sendClientPostponeNotify(o, expireDate);
@ -6812,4 +6941,56 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
clientMapper.update(client);
}
@Override
public RPayMerchantEntity applyMWMerchantId(String clientMoniker, JSONObject manager) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
MerchantApplicationResult result = rPayPaymentCardSvcApi.apply(client, new EmptyMerchantApplication(), manager);
if (result == null) {
throw new ServerErrorException("Failed To Apply For Merchant Warrior Sub Merchant ID");
}
return rPayMerchantMapper.findMerchant(client.getIntValue("client_id"));
}
@Override
public RPayMerchantEntity queryMWMerchantIdStatus(String clientMoniker, JSONObject manager) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
return rPayPaymentCardSvcApi.findMerchant(client);
}
@Override
public RPayMerchantEntity queryMWMerchantInfo(String clientMoniker, JSONObject manager) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
JSONObject bankAccount = getBankAccountByClientId(client.getIntValue("client_id"));
return (new RPayMerchantEntity()).applyClientInfo(client).applyBankAccount(bankAccount);
}
private boolean isAddCardPaymentRate(JSONObject config, int clientId) {
if (!StringUtils.equalsIgnoreCase("rpaypmt_card", config.getString("type"))
&& !StringUtils.equalsIgnoreCase("rpaypmt_dd", config.getString("type"))) {
return false;
}
configNewClientRate(config, clientId, config.getString("type"), "rate_value", null, null);
return true;
}
@Override
public void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version){
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new InvalidShortIdException();
}
client.put("billcode_version", version);
clientMapper.update(client);
clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id"));
}
}

@ -0,0 +1,28 @@
package au.com.royalpay.payment.manage.merchants.enums;
public enum UPayAuthFileEnum {
ALL(""),
UPAY_APPLICATION_FORM("upay_application_form"),
UPAY_AGREEMENT_FILE("upay_agreement_file"),
UPAY_OFFER_LETTER("upay_offer_letter"),
UPAY_DRIVER_LICENSE("upay_driver_license"),
UPAY_RESIDENCE_CERTIFICATE("upay_residence_certificate");
private final String fileName;
public String getFileName() {
return fileName;
}
UPayAuthFileEnum(String fileName) {
this.fileName = fileName;
}
public String[] getFileNameArrays() {
return new String[]{UPAY_APPLICATION_FORM.getFileName(),
UPAY_AGREEMENT_FILE.getFileName(),
UPAY_OFFER_LETTER.getFileName(),
UPAY_DRIVER_LICENSE.getFileName(),
UPAY_RESIDENCE_CERTIFICATE.getFileName()};
}
}

@ -1,5 +1,6 @@
package au.com.royalpay.payment.manage.merchants.web;
import au.com.royalpay.payment.channels.rpaypaymentsvc.runtime.request.entities.RPayMerchantEntity;
import au.com.royalpay.payment.manage.dev.core.MerchantLocationService;
import au.com.royalpay.payment.manage.merchants.beans.*;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
@ -95,6 +96,11 @@ public class PartnerManageController {
clientManager.updateClientIdInfo(clientMoniker, params, manager);
}
@ManagerMapping(value = "/{clientMoniker}/mw_risk_info", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public void updateMWRiskInfoByClient(@PathVariable String clientMoniker, @RequestBody JSONObject params, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.updateMWRiskInfoByClient(clientMoniker, params, manager);
}
@ManagerMapping(value = "/{clientMoniker}/qrcode", method = RequestMethod.GET)
public JSONObject getQrCodeImg(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, QRCodeConfig config) {
return clientManager.getQRCode(manager, clientMoniker, config);
@ -298,6 +304,11 @@ public class PartnerManageController {
clientManager.switchPermission(manager, clientMoniker, "common_sub_merchant_id", pass.getBooleanValue("allow"));
}
@ManagerMapping(value = "/{clientMoniker}/selectBillVersion", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER})
public void selectBillVersion(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.selectBillCodeVersion(manager, clientMoniker, pass.getString("version"));
}
/**
*
*
@ -493,6 +504,11 @@ public class PartnerManageController {
return clientManager.getSysRateConfig();
}
@GetMapping("/sys_card_rates")
public JSONObject getSysCardRate() {
return clientManager.getSysCardRateConfig();
}
@ManagerMapping(value = "/{clientMoniker}/rates/{rateId}", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.FINANCIAL_STAFF})
public void updateRate(@PathVariable String clientMoniker, @PathVariable int rateId, @RequestBody @Valid ClientRateConfig config, Errors errors,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
@ -553,6 +569,11 @@ public class PartnerManageController {
return clientManager.getAllAuthFiles(manager, clientMoniker);
}
@ManagerMapping(value = "/{clientMoniker}/mw_file", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT})
public JSONObject getMWAuthFiles(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return clientManager.getMWAuthFiles(manager, clientMoniker);
}
@ManagerMapping(value = "/{clientMoniker}/kycFile", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT})
public JSONObject getKycFiles(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return clientManager.getAllKycFiles(manager, clientMoniker);
@ -574,6 +595,12 @@ public class PartnerManageController {
clientManager.uploadAuthFilesManager(manager, clientMoniker, filesInfo);
}
@ManagerMapping(value = "/{clientMoniker}/mw_file", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER})
public void uploadMWAuthFiles(@PathVariable String clientMoniker, @RequestBody ClientMWAuthFilesInfo filesInfo,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.uploadMWAuthFilesManager(manager, clientMoniker, filesInfo);
}
@ManagerMapping(value = "/{clientMoniker}/kycFile", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER})
public void uploadKycFiles(@PathVariable String clientMoniker, @RequestBody ClientKycFilesInfo filesInfo,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
@ -636,6 +663,11 @@ public class PartnerManageController {
clientManager.downloadComplianceZip(clientMoniker, response);
}
@ManagerMapping(value = "/{clientMoniker}/download/MWcomplianceAsZIP", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public void downloadMWComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception {
clientManager.downloadMWComplianceZip(clientMoniker, response);
}
@ManagerMapping(value = "/{clientMoniker}/master_configuration", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public void configMasterMerchant(@PathVariable String clientMoniker, @RequestBody JSONObject merchant, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
clientManager.configMasterMerchant(manager, clientMoniker, merchant.getString("master_merchant"));
@ -880,4 +912,21 @@ public class PartnerManageController {
@RequestBody JSONObject params){
clientManager.changeExtParams(clientMoniker,manager,params);
}
@ManagerMapping(value = "/{clientMoniker}/applyMWMerchantId",method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public RPayMerchantEntity applyMWMerchantId(@PathVariable("clientMoniker")String clientMoniker,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){
return clientManager.applyMWMerchantId(clientMoniker,manager);
}
@ManagerMapping(value = "/{clientMoniker}/queryMWMerchantIdStatus",method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR})
public RPayMerchantEntity queryMWMerchantIdStatus(@PathVariable("clientMoniker")String clientMoniker,
@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){
return clientManager.queryMWMerchantIdStatus(clientMoniker,manager);
}
@ManagerMapping(value = "/{clientMoniker}/query/mw_info", method = RequestMethod.GET, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN})
public RPayMerchantEntity queryMWMerchantInfo(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) {
return clientManager.queryMWMerchantInfo(clientMoniker, manager);
}
}

@ -28,10 +28,9 @@ public class OrgInfo {
private Double wechat_rate_value;
private Double bestpay_rate_value;
private Double alipayonline_rate_value;
private Double jd_rate_value;
private Double hf_rate_value;
private Double yeepay_rate_value;
private Double cb_bankpay_rate_value;
private Double rpaypmt_card_rate_value;
private Double rpaypmt_dd_rate_value;
private int is_valid;
private String search_text;
private int page = 1;
@ -41,12 +40,10 @@ public class OrgInfo {
private String commission_type;
private Double min_wechat_rate;
private Double min_alipay_rate;
private Double min_bestpay_rate;
private Double min_jd_rate;
private Double min_alipayonline_rate;
private Double min_hf_rate;
private Double min_yeepay_rate;
private Double min_cb_bankpay_rate;
private Double min_rpaypmt_card_rate;
private Double min_rpaypmt_dd_rate;
private String state;
private String senior_parent_org_id;
@ -201,14 +198,6 @@ public class OrgInfo {
this.alipayonline_rate_value = alipayonline_rate_value;
}
public Double getJd_rate_value() {
return jd_rate_value;
}
public void setJd_rate_value(Double jd_rate_value) {
this.jd_rate_value = jd_rate_value;
}
public String getSearch_text() {
return search_text;
}
@ -273,22 +262,6 @@ public class OrgInfo {
this.min_alipay_rate = min_alipay_rate;
}
public Double getMin_bestpay_rate() {
return min_bestpay_rate;
}
public void setMin_bestpay_rate(Double min_bestpay_rate) {
this.min_bestpay_rate = min_bestpay_rate;
}
public Double getMin_jd_rate() {
return min_jd_rate;
}
public void setMin_jd_rate(Double min_jd_rate) {
this.min_jd_rate = min_jd_rate;
}
public Double getMin_alipayonline_rate() {
return min_alipayonline_rate;
}
@ -297,22 +270,6 @@ public class OrgInfo {
this.min_alipayonline_rate = min_alipayonline_rate;
}
public Double getHf_rate_value() {
return hf_rate_value;
}
public void setHf_rate_value(Double hf_rate_value) {
this.hf_rate_value = hf_rate_value;
}
public Double getMin_hf_rate() {
return min_hf_rate;
}
public void setMin_hf_rate(Double min_hf_rate) {
this.min_hf_rate = min_hf_rate;
}
public String getState() {
return state;
}
@ -328,22 +285,6 @@ public class OrgInfo {
this.senior_parent_org_id = senior_parent_org_id;
}
public Double getYeepay_rate_value() {
return yeepay_rate_value;
}
public void setYeepay_rate_value(Double yeepay_rate_value) {
this.yeepay_rate_value = yeepay_rate_value;
}
public Double getMin_yeepay_rate() {
return min_yeepay_rate;
}
public void setMin_yeepay_rate(Double min_yeepay_rate) {
this.min_yeepay_rate = min_yeepay_rate;
}
public Double getCb_bankpay_rate_value() {
return cb_bankpay_rate_value;
}
@ -360,4 +301,35 @@ public class OrgInfo {
this.min_cb_bankpay_rate = min_cb_bankpay_rate;
}
public Double getRpaypmt_card_rate_value() {
return rpaypmt_card_rate_value;
}
public Double getRpaypmt_dd_rate_value() {
return rpaypmt_dd_rate_value;
}
public void setRpaypmt_card_rate_value(Double rpaypmt_card_rate_value) {
this.rpaypmt_card_rate_value = rpaypmt_card_rate_value;
}
public void setRpaypmt_dd_rate_value(Double rpaypmt_dd_rate_value) {
this.rpaypmt_dd_rate_value = rpaypmt_dd_rate_value;
}
public Double getMin_rpaypmt_card_rate() {
return min_rpaypmt_card_rate;
}
public Double getMin_rpaypmt_dd_rate() {
return min_rpaypmt_dd_rate;
}
public void setMin_rpaypmt_card_rate(Double min_rpaypmt_card_rate) {
this.min_rpaypmt_card_rate = min_rpaypmt_card_rate;
}
public void setMin_rpaypmt_dd_rate(Double min_rpaypmt_dd_rate) {
this.min_rpaypmt_dd_rate = min_rpaypmt_dd_rate;
}
}

@ -498,7 +498,7 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati
"company_phone", "suburb", "postcode", "state", "contact_person", "contact_phone", "contact_email", "short_name", "logo_url", "enable_refund",
"enable_refund_auth", "retail_surcharge", "require_custinfo", "require_remark", "logo_thumbnail", "creator", "create_time", "approver",
"approve_result", "approve_time", "open_status", "timezone", "has_children", "source", "customer_surcharge_rate", "enable_alipay", "enable_wechat",
"enable_bestpay", "manual_settle", "skip_clearing", "mail_confirm", "surcharge_mode", "company_photo", "store_photo", "company_website", "contact_job", "sub_manage"};
"enable_bestpay", "manual_settle", "skip_clearing", "mail_confirm", "surcharge_mode", "company_photo", "store_photo", "company_website", "contact_job", "sub_manage","enable_rpaypmt_card","enable_rpaypmt_dd"};
for (String col : columns) {
simpleClient.put(col, client.get(col));
}

@ -434,6 +434,13 @@ public class TradeLogServiceImpl implements TradeLogService {
break;
}
order.put("status_str", statusStr);
if (StringUtils.equalsIgnoreCase("rpaypmt_card", order.getString("channel"))
|| StringUtils.equalsIgnoreCase("rpaypmt_dd", order.getString("channel"))) {
JSONObject extParams = JSONObject.parseObject(order.getString("ext_params"));
if (extParams != null) {
order.putAll(extParams);
}
}
return order;
}

@ -229,7 +229,7 @@ public class RefundServiceImpl implements RefundService, ApplicationEventPublish
}
boolean requireAudit = type == OperatorType.PARTNER && PartnerRole.getRole(partnerAccount.getIntValue("role")) == PartnerRole.CASHIER
&& clientConfig.getBooleanValue("enable_refund_auth");
logger.debug("applyer type=" + type + "; require audit=" + requireAudit);
logger.debug("applyer type={}; require audit={}",type, requireAudit);
return paymentApi.refundOrder(null, orderId, null, amount, remark, operator, type, requireAudit);
}

@ -1,15 +1,15 @@
spring:
datasource:
master:
host: 192.168.0.4:3306
host: 192.168.0.84:3306
jdbc-url: jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
password: taylor
schema-name: royalpay_production
username: taylor
password: rpayplus
schema-name: royalpay
username: root
slave:
host: 192.168.0.4:3306
host: 192.168.0.84:3306
jdbc-url: jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false
password: taylor
schema-name: royalpay_production
username: taylor
password: rpayplus
schema-name: royalpay
username: root
type: com.zaxxer.hikari.HikariDataSource

@ -18,6 +18,4 @@ spring:
redis:
database: 9
host: 192.168.0.84
port: 6379
app:
debug: true
port: 6379

@ -3,6 +3,8 @@ android:
appkey: ''
secret: ''
app:
crossapp:
enable: true
agreetemplate:
aggregate:
path: https://file.royalpay.com.au/open/2020/04/08/1586313342533_41vI3w9R8OHrhAVYWvdv7S2IyQra4z.pdf
@ -100,7 +102,6 @@ logging:
Statement: debug
pattern:
console: '[%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue}] %clr(%-5level) %logger: %msg%n'
mail:
mailgun:
api_key: api:key-2e67b891a1a7974bf3a40ea440d5a77f

@ -356,6 +356,12 @@
ifnull(sum(CASE WHEN s.channel = 'LakalaPay' THEN s.total ELSE 0 END),0) lakalapayamount,
ifnull(sum(CASE WHEN s.channel = 'LakalaPay' THEN s.orders ELSE 0 END),0) lakalapay_order_count,
ifnull(COUNT(DISTINCT s.client_id,IF(s.channel = 'LakalaPay',TRUE,NULL)),0) lakala_client_count,
ifnull(sum(CASE WHEN s.channel = 'rpaypmt_card' THEN s.total ELSE 0 END),0) rpaypmt_cardamount,
ifnull(sum(CASE WHEN s.channel = 'rpaypmt_card' THEN s.orders ELSE 0 END),0) rpaypmt_card_order_count,
ifnull(COUNT(DISTINCT s.client_id,IF(s.channel = 'rpaypmt_card',TRUE,NULL)),0) rpaypmt_card_client_count,
ifnull(sum(CASE WHEN s.channel = 'rpaypmt_dd' THEN s.total ELSE 0 END),0) rpaypmt_ddamount,
ifnull(sum(CASE WHEN s.channel = 'rpaypmt_dd' THEN s.orders ELSE 0 END),0) rpaypmt_dd_order_count,
ifnull(COUNT(DISTINCT s.client_id,IF(s.channel = 'rpaypmt_dd',TRUE,NULL)),0) rpaypmt_dd_client_count,
ifnull(sum(s.orders), 0) all_count,
ifnull(sum(s.total), 0) all_amount,
ifnull(COUNT(DISTINCT s.client_id),0) all_client_count
@ -409,12 +415,16 @@
ifnull(SUM(IF(channel='jd' and transaction_type='Credit',clearing_amount,0)),0) jdamount,
ifnull(SUM(IF(channel='LakalaPay' and transaction_type='Credit',1,0)),0) lakala_order_count,
ifnull(SUM(IF(channel='LakalaPay' and transaction_type='Credit',clearing_amount,0)),0) lakalapayamount,
ifnull(SUM(IF(channel='rpaypmt_card' and transaction_type='Credit',1,0)),0) rpaypmt_card_order_count,
ifnull(SUM(IF(channel='rpaypmt_card' and transaction_type='Credit',clearing_amount,0)),0) rpaypmt_cardamount,
ifnull(SUM(IF(channel='rpaypmt_dd' and transaction_type='Credit',1,0)),0) rpaypmt_dd_order_count,
ifnull(SUM(IF(channel='rpaypmt_dd' and transaction_type='Credit',clearing_amount,0)),0) rpaypmt_ddamount,
count(distinct order_id) all_count,
count(distinct client_id) all_client_count,
ifnull(SUM(IF(transaction_type='Credit',clearing_amount,0)),0) all_amount
FROM pmt_transactions WHERE
channel IN
('Bestpay','Yeepay','Rpay','hf','jd','LakalaPay')
('Bestpay','Yeepay','Rpay','hf','jd','LakalaPay','rpaypmt_card','rpaypmt_dd')
<if test="begin!=null">and create_time &gt;= #{begin}</if>
<if test="end!=null">and create_time &lt; #{end}</if>
</select>

@ -152,7 +152,8 @@
<select id="analysisNotSettled" resultType="java.lang.Double">
<![CDATA[
SELECT ifnull(sum(if(pt.transaction_type = 'Credit', pt.clearing_amount, -pt.clearing_amount)), 0)
SELECT
ifnull(sum(if(pt.transaction_type = 'Credit', pt.clearing_amount, -pt.clearing_amount)), 0)
FROM pmt_transactions pt
LEFT JOIN sys_clients sc on sc.client_id = pt.client_id
WHERE pt.clearing_status = 0
@ -169,6 +170,13 @@
<if test="hide_sub_mch">
and (sc.client_id=#{client_id} or sc.parent_client_id = #{client_id})
</if>
<if test="channel!=null and channel=='system'">
and pt.channel !='rpaypmt_card'
and pt.channel !='rpaypmt_dd'
</if>
<if test="channel!=null and channel!='system'">
and pt.channel = #{channel}
</if>
</select>
<select id="analysisPreAmount" resultType="java.lang.Double">

@ -739,7 +739,8 @@
ifnull(o.refund_amount, 0) refund_fee,
sum(t.clearing_amount) clearing_amount,
t.exchange_rate,
t.clearing_status = 2 pre_auth
t.clearing_status = 2 pre_auth,
o.ext_params
FROM pmt_orders o
INNER JOIN sys_clients p ON p.client_id = o.client_id AND p.is_valid = 1
LEFT JOIN pmt_transactions t

@ -159,6 +159,26 @@
</div>
</div>
</div>
<div class="col-sm-4 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><img src="/static/images/card_payment_sign.png"/>Card Payment</div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannel.rpaypmt_cardamount|currency: ' $ '"></label></br>
<label class="description-text text-red">交易笔数:{{ totalChannel.rpaypmt_card_order_count }}</label>
</div>
</div>
</div>
<div class="col-sm-4 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><img src="/static/images/direct_debit_sign.png"/>Direct Debit</div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannel.rpaypmt_ddamount|currency: ' $ '"></label></br>
<label class="description-text text-red">交易笔数:{{ totalChannel.rpaypmt_dd_order_count }}</label>
</div>
</div>
</div>
</div>
</div>
</div>

@ -96,7 +96,11 @@ Ye<style>
<a role="button" ng-class="{'bg-primary':params.channel=='Yeepay'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LakalaPay'}"
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';doAnalysis(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';doAnalysis(1)">Direct Debit</a>
</p>
</div>
</div>

@ -106,7 +106,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LakalaPay'}"
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';doAnalysis(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';doAnalysis(1)">Direct Debit</a>
</p>
</div>
</div>

@ -104,7 +104,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';doAnalysis(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';doAnalysis(1)">Direct Debit</a>
</p>
</div>
</div>

@ -108,7 +108,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';doAnalysis(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';doAnalysis(1)">Direct Debit</a>
</p>
</div>
</div>
@ -263,6 +267,28 @@
</div>
</div>
</div>
<div class="col-sm-2 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><small><img src="/static/images/card_payment_sign.png"/>Card Payment</small></div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_cardamount|currency: ' $ '"></label></br>
<label class="description-text text-red">交易笔数:{{ totalChannelAmount.rpaypmt_card_order_count }}</label>
<label class="description-text text-red">交易商户数:{{ totalChannelAmount.rpaypmt_card_client_count }}</label>
</div>
</div>
</div>
<div class="col-sm-2 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><small><img src="/static/images/direct_debit_sign.png"/>Direct Debit</small></div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_ddamount|currency: ' $ '"></label></br>
<label class="description-text text-red">交易笔数:{{ totalChannelAmount.rpaypmt_dd_order_count }}</label>
<label class="description-text text-red">交易商户数:{{ totalChannelAmount.rpaypmt_dd_client_count }}</label>
</div>
</div>
</div>
</div>
<!--<table class="table">
<tr>

@ -87,7 +87,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';doAnalysis(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';doAnalysis(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';doAnalysis(1)">Direct Debit</a>
</p>
</div>
</div>
@ -230,6 +234,28 @@
</div>
</div>
</div>
<div class="col-sm-2 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><img src="/static/images/card_payment_sign.png"/>Card Payment</div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_cardamount|currency: ' $ '"></label></br>
<label class="description-text text-red">交易笔数:{{ totalChannelAmount.rpaypmt_card_order_count }}</label>
<label class="description-text text-red">交易商户数:{{ totalChannelAmount.rpaypmt_card_client_count }}</label>
</div>
</div>
</div>
<div class="col-sm-2 col-xs-6">
<div class="description-block">
<div class="description-header text-bold"><img src="/static/images/direct_debit_sign.png"/>Direct Debit</div>
<div class="description-text">
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_ddamount|currency: ' $ '"></label></br>
<label class="description-text text-red">交易笔数:{{ totalChannelAmount.rpaypmt_dd_order_count }}</label>
<label class="description-text text-red">交易商户数:{{ totalChannelAmount.rpaypmt_dd_client_count }}</label>
</div>
</div>
</div>
</div>

@ -46,7 +46,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';doAnalysis(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';doAnalysis(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';doAnalysis(1)">Direct Debit</a>
</p>
</div>
</div>

@ -586,6 +586,11 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
return 'Native QR Code';
case '14':
return 'Share Link'
case '16':
case '17':
return '银行卡网关'
case '18':
return '银行账户网关'
}
}
});

@ -467,6 +467,11 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
return '原生二维码';
case '14':
return '账单链接'
case '16':
case '17':
return '银行卡网关'
case '18':
return '银行账户网关'
}
}
});
@ -578,4 +583,4 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
};
}]);
return app;
});
});

@ -484,6 +484,11 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
return '原生二维码';
case '14':
return '账单链接'
case '16':
case '17':
return '银行卡网关'
case '18':
return '银行账户网关'
}
}
});
@ -533,4 +538,4 @@ define(['angular', 'angularSanitize', 'angularAnimate', 'angularMessages', 'uiRo
ngModelOptions: {}
});
return app;
});
});

@ -38,14 +38,19 @@ define(['../app'], function (app) {
}
}]);
app.controller('orderDetailDialogCtrl', ['$scope', 'order','$http', function ($scope, order,$http) {
$scope.showPayerCardInfo = true;
$scope.order = order.data;
$scope.getPayLocation=function (ip) {
$http.get('/dev/ip/'+ip).then(function (res) {
$scope.pay_location = res.data.city;
})
}
$scope.hidePayerCardInfo = function () {
$scope.showPayerCardInfo = !$scope.showPayerCardInfo;
}
}]);
app.controller('orderDetailEditCtrl', ['$scope', '$http', 'commonDialog', 'order', function ($scope, $http, commonDialog,order) {
$scope.showPayerCardInfo = true;
$scope.order = order.data;
$scope.updateDetail = function (order) {
$http.put('/client/partner_info/trade_logs/'+$scope.order.order_id, $scope.order).then(function () {
@ -56,6 +61,10 @@ define(['../app'], function (app) {
});
})
};
$scope.hidePayerCardInfo = function () {
$scope.showPayerCardInfo = !$scope.showPayerCardInfo;
}
}]);
});
});

@ -1,3 +1,10 @@
<style>
.tradeCardInfo {
padding-left: 25%;
margin: 0;
color: gray;
}
</style>
<div class="modal-header bg-success">
<h4>Order Detail
<a role="button" class="text-bold text-info pull-right" jsonview="order" title="JSON View" ng-if="'100000000'|withRole">
@ -168,6 +175,18 @@
<p class="form-control-static" ng-bind="order.order_detail"></p>
</div>
</div>
<div class="form-group" ng-if="order.channel=='rpaypmt_card' || order.channel=='rpaypmt_dd'" style="margin: 15px 6%;border: 1px dashed gray;">
<div style="text-align: center;cursor: pointer;color: grey" ng-click="hidePayerCardInfo()">
<p><label class="control-label" style="cursor: pointer">Payer Card Information</label></p>
</div>
<div ng-if="showPayerCardInfo">
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Bank: </label> {{order.card_bank}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Type: </label> {{order.card_type}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Alias: </label> {{order.card_alias}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Scheme: </label> {{order.card_scheme}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Country:</label> {{order.card_country}}</p>
</div>
</div>
<!--<div class="form-group">-->
<!--<label class="control-label col-xs-3">Remark</label>-->
<!--<div class="col-xs-9">-->

@ -124,7 +124,7 @@
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.alipay_rate_value"
id="alipay_rate_value_input" name="alipay_rate_value" max="100" min="0">
id="alipay_rate_value_input" name="alipay_rate_value" max="100" min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
@ -136,32 +136,7 @@
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.wechat_rate_value"
id="wechat_rate_value_input" name="wechat_rate_value" max="100" min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.bestpay_rate_value.$invalid && org_form.bestpay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="bestpay_rate_value_input">Bestpay rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.bestpay_rate_value"
id="bestpay_rate_value_input" name="bestpay_rate_value" max="100"
min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.jd_rate_value.$invalid && org_form.jd_rate_value.$dirty}">
<label class="control-label col-sm-2" for="jd_rate_value_input">JD Pay rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.jd_rate_value"
id="jd_rate_value_input" name="jd_rate_value" max="100" min="0">
id="wechat_rate_value_input" name="wechat_rate_value" max="100" min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
@ -174,35 +149,11 @@
<div class="input-group">
<input class="form-control" type="number" ng-model="org.alipayonline_rate_value"
id="alipayonline_rate_value_input" name="alipayonline_rate_value"
max="100" min="0">
max="100" min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<!--<div class="form-group"
ng-class="{'has-error':org_form.hf_rate_value.$invalid && org_form.hf_rate_value.$dirty}">
<label class="control-label col-sm-2" for="hf_rate_value_input">HF Rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.hf_rate_value"
id="hf_rate_value_input" name="hf_rate_value"
max="100" min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>-->
<!--<div class="form-group"
ng-class="{'has-error':org_form.yeepay_rate_value.$invalid && org_form.yeepay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="yeepay_rate_value_input">Yeepay Rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.yeepay_rate_value"
id="yeepay_rate_value_input" name="yeepay_rate_value"
max="100" min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>-->
<div class="form-group"
ng-class="{'has-error':org_form.cb_bankpay_rate_value.$invalid && org_form.cb_bankpay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="cb_bankpay_rate_value_input">CB BankPay Rate *</label>
@ -210,107 +161,104 @@
<div class="input-group">
<input class="form-control" type="number" ng-model="org.cb_bankpay_rate_value"
id="cb_bankpay_rate_value_input" name="cb_bankpay_rate_value"
max="100" min="0">
max="100" min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
</div>
</div>
<div>
<div class="form-group"
ng-class="{'has-error':org_form.min_wechat_rate.$invalid && org_form.min_wechat_rate.$dirty}">
<label class="control-label col-sm-2" for="min_wechat_rate_input">Min Wechat Rate *</label>
ng-class="{'has-error':org_form.rpaypmt_card_rate_value.$invalid && org_form.rpaypmt_card_rate_value.$dirty}">
<label class="control-label col-sm-2" for="rpaypmt_card_rate_value_input">Card Payment Rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control form-control-float" type="number" ng-model="org.min_wechat_rate"
id="min_wechat_rate_input" name="min_wechat_rate" max="100" min="0">
<input class="form-control" type="number" ng-model="org.rpaypmt_card_rate_value"
id="rpaypmt_card_rate_value_input" name="rpaypmt_card_rate_value"
max="100" min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_alipay_rate.$invalid && org_form.min_alipay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipay_rate_input">Min Alipay Rate *</label>
ng-class="{'has-error':org_form.rpaypmt_dd_rate_value.$invalid && org_form.rpaypmt_dd_rate_value.$dirty}">
<label class="control-label col-sm-2" for="rpaypmt_dd_rate_value_input">Direct Debit Rate *</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_alipay_rate"
id="min_alipay_rate_input" name="min_alipay_rate" max="100" min="0" required>
<input class="form-control" type="number" ng-model="org.rpaypmt_dd_rate_value"
id="rpaypmt_dd_rate_value_input" name="rpaypmt_dd_rate_value"
max="100" min="0" required>
<span class="input-group-addon">%</span>
</div>
</div>
</div>
</div>
<div>
<div class="form-group"
ng-class="{'has-error':org_form.min_bestpay_rate.$invalid && org_form.min_bestpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_bestpay_rate_input">Min Bestpay Rate *</label>
ng-class="{'has-error':org_form.min_wechat_rate.$invalid && org_form.min_wechat_rate.$dirty}">
<label class="control-label col-sm-2" for="min_wechat_rate_input">Min Wechat Rate</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control form-control-float" type="number"
ng-model="org.min_bestpay_rate"
id="min_bestpay_rate_input" name="min_bestpay_rate" max="100" min="0"
required>
<input class="form-control form-control-float" type="number" ng-model="org.min_wechat_rate"
id="min_wechat_rate_input" name="min_wechat_rate" max="100" min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_jd_rate.$invalid && org_form.min_jd_rate.$dirty}">
<label class="control-label col-sm-2" for="min_jd_rate_input">Min Jd Rate *</label>
ng-class="{'has-error':org_form.min_alipay_rate.$invalid && org_form.min_alipay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipay_rate_input">Min Alipay Rate</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_jd_rate"
id="min_jd_rate_input" name="min_jd_rate" max="100" min="0" required>
<input class="form-control" type="number" ng-model="org.min_alipay_rate"
id="min_alipay_rate_input" name="min_alipay_rate" max="100" min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_alipayonline_rate.$invalid && org_form.min_alipayonline_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipayonline_rate_input">Min Alipayonline Rate *</label>
<label class="control-label col-sm-2" for="min_alipayonline_rate_input">Min Alipayonline Rate</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_alipayonline_rate"
id="min_alipayonline_rate_input" name="min_alipayonline_rate" max="100"
min="0" required>
min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>
<!--<div class="form-group"
ng-class="{'has-error':org_form.min_hf_rate.$invalid && org_form.min_hf_rate.$dirty}">
<label class="control-label col-sm-2" for="min_hf_rate_input">Min HF Rate *</label>
<div class="form-group"
ng-class="{'has-error':org_form.min_cb_bankpay_rate.$invalid && org_form.min_cb_bankpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_cb_bankpay_rate_input">Min CB BankPay Rate</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_hf_rate"
id="min_hf_rate_input" name="min_hf_rate" max="100"
min="0" required>
<input class="form-control" type="number" ng-model="org.min_cb_bankpay_rate"
id="min_cb_bankpay_rate_input" name="min_cb_bankpay_rate" max="100"
min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>-->
<!--<div class="form-group"
ng-class="{'has-error':org_form.min_yeepay_rate.$invalid && org_form.min_yeepay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_yeepay_rate_input">Min Yeepay Rate *</label>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_rpaypmt_card_rate.$invalid && org_form.min_rpaypmt_card_rate.$dirty}">
<label class="control-label col-sm-2" for="min_rpaypmt_card_rate_input">Min Card Payment Rate</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_yeepay_rate"
id="min_yeepay_rate_input" name="min_yeepay_rate" max="100"
min="0" required>
<input class="form-control" type="number" ng-model="org.min_rpaypmt_card_rate"
id="min_rpaypmt_card_rate_input" name="min_rpaypmt_card_rate" max="100"
min="0">
<span class="input-group-addon">%</span>
</div>
</div>
</div>-->
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_cb_bankpay_rate.$invalid && org_form.min_cb_bankpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_cb_bankpay_rate_input">Min CB BankPay Rate *</label>
ng-class="{'has-error':org_form.min_rpaypmt_dd_rate.$invalid && org_form.min_rpaypmt_dd_rate.$dirty}">
<label class="control-label col-sm-2" for="min_rpaypmt_dd_rate_input">Min Direct Debit Rate</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="number" ng-model="org.min_cb_bankpay_rate"
id="min_cb_bankpay_rate_input" name="min_cb_bankpay_rate_rate" max="100"
min="0" required>
<input class="form-control" type="number" ng-model="org.min_rpaypmt_dd_rate"
id="min_rpaypmt_dd_rate_input" name="min_rpaypmt_dd_rate" max="100"
min="0">
<span class="input-group-addon">%</span>
</div>
</div>

@ -113,34 +113,18 @@
</div>
</div>
<div ng-if="org.commission_type == 1">
<div class="form-group" ng-class="{'has-error':org_form.alipay_rate_value.$invalid && org_form.alipay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="alipay_rate_value_input">Alipay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.alipay_rate_value" id="alipay_rate_value_input" name="alipay_rate_value" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.wechat_rate_value.$invalid && org_form.wechat_rate_value.$dirty}">
<label class="control-label col-sm-2" for="wechat_rate_value_input">Wechat Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.wechat_rate_value" id="wechat_rate_value_input" name="wechat_rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.wechat_rate_value" id="wechat_rate_value_input" name="wechat_rate_value" max="100" min="0" required>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.bestpay_rate_value.$invalid && org_form.bestpay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="bestpay_rate_value_input">Bestpay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.bestpay_rate_value" id="bestpay_rate_value_input" name="bestpay_rate_value" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.jd_rate_value.$invalid && org_form.jd_rate_value.$dirty}">
<label class="control-label col-sm-2" for="jd_rate_value_input">JD Pay Rate *</label>
<div class="form-group" ng-class="{'has-error':org_form.alipay_rate_value.$invalid && org_form.alipay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="alipay_rate_value_input">Alipay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.jd_rate_value" id="jd_rate_value_input" name="jd_rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.alipay_rate_value" id="alipay_rate_value_input" name="alipay_rate_value" max="100" min="0" required>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
@ -148,28 +132,28 @@
<div class="form-group" ng-class="{'has-error':org_form.alipayonline_rate_value.$invalid && org_form.alipayonline_rate_value.$dirty}">
<label class="control-label col-sm-2" for="alipayonline_rate_value_input">AlipayOnline Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.alipayonline_rate_value" id="alipayonline_rate_value_input" name="alipayonline_rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.alipayonline_rate_value" id="alipayonline_rate_value_input" name="alipayonline_rate_value" max="100" min="0" required>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<!--<div class="form-group" ng-class="{'has-error':org_form.hf_rate_value.$invalid && org_form.hf_rate_value.$dirty}">
<label class="control-label col-sm-2" for="hf_rate_value_input">HF Rate *</label>
<div class="form-group" ng-class="{'has-error':org_form.cb_bankpay_rate_value.$invalid && org_form.cb_bankpay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="cb_bankpay_rate_value_input">CB BankPay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.hf_rate_value" id="hf_rate_value_input" name="hf_rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.cb_bankpay_rate_value" id="cb_bankpay_rate_value_input" name="cb_bankpay_rate_value" max="100" min="0" required>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.yeepay_rate_value.$invalid && org_form.yeepay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="yeepay_rate_value_input">Yeepay Rate *</label>
<div class="form-group" ng-class="{'has-error':org_form.rpaypmt_card_rate_value.$invalid && org_form.rpaypmt_card_rate_value.$dirty}">
<label class="control-label col-sm-2" for="rpaypmt_card_rate_value_input">Card Payment Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.yeepay_rate_value" id="yeepay_rate_value_input" name="yeepay_rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.rpaypmt_card_rate_value" id="rpaypmt_card_rate_value_input" name="rpaypmt_card_rate_value" max="100" min="0" required>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>-->
<div class="form-group" ng-class="{'has-error':org_form.cb_bankpay_rate_value.$invalid && org_form.cb_bankpay_rate_value.$dirty}">
<label class="control-label col-sm-2" for="cb_bankpay_rate_value_input">CB BankPay Rate *</label>
</div>
<div class="form-group" ng-class="{'has-error':org_form.rpaypmt_dd_rate_value.$invalid && org_form.rpaypmt_dd_rate_value.$dirty}">
<label class="control-label col-sm-2" for="rpaypmt_dd_rate_value_input">Direct Debit Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.cb_bankpay_rate_value" id="cb_bankpay_rate_value_input" name="cb_bankpay_rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.rpaypmt_dd_rate_value" id="rpaypmt_dd_rate_value_input" name="rpaypmt_dd_rate_value" max="100" min="0" required>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
@ -179,7 +163,7 @@
<div>
<div class="form-group"
ng-class="{'has-error':org_form.min_wechat_rate.$invalid && org_form.min_wechat_rate.$dirty}">
<label class="control-label col-sm-2" for="min_wechat_rate_input">Min Wechat Rate *</label>
<label class="control-label col-sm-2" for="min_wechat_rate_input">Min Wechat Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_wechat_rate"
id="min_wechat_rate_input" name="min_wechat_rate" max="100" min="0">
@ -188,7 +172,7 @@
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_alipay_rate.$invalid && org_form.min_alipay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipay_rate_input">Min Alipay Rate *</label>
<label class="control-label col-sm-2" for="min_alipay_rate_input">Min Alipay Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_alipay_rate"
id="min_alipay_rate_input" name="min_alipay_rate" max="100" min="0">
@ -196,104 +180,46 @@
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_bestpay_rate.$invalid && org_form.min_bestpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_bestpay_rate_input">Min Bestpay Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_bestpay_rate"
id="min_bestpay_rate_input" name="min_bestpay_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_jd_rate.$invalid && org_form.min_jd_rate.$dirty}">
<label class="control-label col-sm-2" for="min_jd_rate_input">Min Jd Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_jd_rate"
id="min_jd_rate_input" name="min_jd_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_alipayonline_rate.$invalid && org_form.min_alipayonline_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipayonline_rate_input">Min Alipayonline Rate *</label>
<label class="control-label col-sm-2" for="min_alipayonline_rate_input">Min Alipayonline Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_alipayonline_rate"
id="min_alipayonline_rate_input" name="min_alipayonline_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<!--<div class="form-group"
ng-class="{'has-error':org_form.min_hf_rate.$invalid && org_form.min_hf_rate.$dirty}">
<label class="control-label col-sm-2" for="min_hf_rate_input">Min HF Rate *</label>
<div class="form-group"
ng-class="{'has-error':org_form.min_cb_bankpay_rate.$invalid && org_form.min_cb_bankpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_cb_bankpay_rate_input">Min CB BankPay Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_hf_rate"
id="min_hf_rate_input" name="min_hf_rate" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.min_cb_bankpay_rate"
id="min_cb_bankpay_rate_input" name="min_cb_bankpay_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_yeepay_rate.$invalid && org_form.min_yeepay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_yeepay_rate_input">Min Yeepay Rate *</label>
ng-class="{'has-error':org_form.min_rpaypmt_card_rate.$invalid && org_form.min_rpaypmt_card_rate.$dirty}">
<label class="control-label col-sm-2" for="min_rpaypmt_card_rate_input">Min Card Payment Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_yeepay_rate"
id="min_yeepay_rate_input" name="min_yeepay_rate" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.min_rpaypmt_card_rate"
id="min_rpaypmt_card_rate_input" name="min_rpaypmt_card_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>-->
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_cb_bankpay_rate.$invalid && org_form.min_cb_bankpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_yeepay_rate_input">Min CB BankPay Rate *</label>
ng-class="{'has-error':org_form.min_rpaypmt_dd_rate.$invalid && org_form.min_rpaypmt_dd_rate.$dirty}">
<label class="control-label col-sm-2" for="min_rpaypmt_dd_rate_input">Min Direct Debit Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_cb_bankpay_rate"
id="min_cb_bankpay_rate_input" name="min_cb_bankpay_rate" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.min_rpaypmt_dd_rate"
id="min_rpaypmt_dd_rate_input" name="min_rpaypmt_dd_rate" max="100" min="0">
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
</div>
</div>
<!-- <div ng-if="(org.type == 0 || currentUser.org_id !=null)">
<div class="form-group"
ng-class="{'has-error':org_form.min_alipay_rate.$invalid && org_form.min_alipay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipay_rate_input">Min Alipay Rate *</label>
<div class="col-sm-8">
<input class="form-control" type="number" ng-model="org.min_alipay_rate"
id="min_alipay_rate_input" name="min_alipay_rate" max="100">
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_bestpay_rate.$invalid && org_form.min_bestpay_rate.$dirty}">
<label class="control-label col-sm-2" for="min_bestpay_rate_input">Min Bestpay Rate *</label>
<div class="col-sm-8">
<input class="form-control" type="number" ng-model="org.min_bestpay_rate"
id="min_bestpay_rate_input" name="min_bestpay_rate" max="100">
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_jd_rate.$invalid && org_form.min_jd_rate.$dirty}">
<label class="control-label col-sm-2" for="min_jd_rate_input">Min Jd Rate *</label>
<div class="col-sm-8">
<input class="form-control" type="number" ng-model="org.min_jd_rate"
id="min_jd_rate_input" name="min_jd_rate" max="100">
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_alipayonline_rate.$invalid && org_form.min_alipayonline_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipayonline_rate_input">Min Alipayonline Rate *</label>
<div class="col-sm-8">
<input class="form-control" type="number" ng-model="org.min_alipayonline_rate"
id="min_alipayonline_rate_input" name="min_alipayonline_rate" max="100">
</div>
</div>
</div>-->
<div class="form-group" ng-class="{'has-error':org_form.contact_person.$invalid && org_form.contact_person.$dirty}">
<label class="control-label col-sm-2" for="org_contact_person_input">Contact Person *</label>
<div class="col-sm-8">
@ -766,12 +692,6 @@
<img ng-if='clientExtracts.channel=="Alipay"' src="/static/images/alipay_sign_lg.png"/>
<img ng-if='clientExtracts.channel=="AlipayOnline"' style="width: 48px;height: 48px" src="/static/images/alipay_online.png"/>
<img ng-if='clientExtracts.channel=="Wechat"' src="/static/images/wechatpay_sign_lg.png"/>
<img ng-if='clientExtracts.channel=="Bestpay"' src="/static/images/bestpay_sign_lg.png"/>
<img ng-if='clientExtracts.channel=="hf"' src="/static/images/hf_sign_lg.png"/>
<img ng-if='clientExtracts.channel=="jd"' src="/static/images/jd_sign_lg.png"/>
<img ng-if='clientExtracts.channel=="Yeepay"' src="/static/images/yeepay_sign_lg.png"/>
<img ng-if='clientExtracts.channel=="Rpay"' src="/static/images/rpayplus_sign_lg.png"/>
{{clientExtracts.channel}}
</td>
</tr>

@ -1,177 +1,187 @@
.qrpay-background {
position: fixed;
background: #f2f2f2;
top: 0;
bottom: 0;
right: 0;
left: 0;
z-index: -1;
}
section.content {
position: absolute;
top: 70px;
bottom: 64px;
.logo-container {
width: 100%;
overflow: auto;
left: 0;
text-align: center;
padding: 30px 0px;
}
.qrpay-container {
width: 700px;
position: relative;
display: block;
margin: 40px auto;
background: #fff;
overflow: visible;
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.30);
.logo {
width: 137px;
height: 29px;
}
.qrpay-container .qr-brand {
width: 100%;
height: 80px;
padding-top: 20px;
.price {
color: #FF6600;
letter-spacing: 0;
text-align: center;
margin-top: 15px;
}
.qrpay-container .qr-brand.wechat {
background: #09bb07;
.card-pay-table {
padding: 15px;
}
.qrpay-container .qr-brand.alipay {
background: #1eabeb;
.card-pay-title {
font-size: 14px;
color: #9B9B9B;
letter-spacing: 0;
}
.qrpay-container .qr-brand > .wechat-logo {
display: block;
margin: auto;
height: 40px;
.card-pay-content {
font-size: 14px;
color: #202020;
letter-spacing: 0;
}
.qrpay-container .price-box {
position: relative;
display: block;
margin: 15px auto;
width: 240px;
.row-height {
margin-bottom: 10px;
}
.qrpay-container .price-box:after {
content: '';
display: block;
clear: both;
.card-pay-footer {
position: fixed;
font-family: PingFangSC-Regular;
font-size: 14px;
color: #DDDDDD;
letter-spacing: 0;
bottom: 15px;
width: 100%;
text-align: center;
}
.qrpay-container .price-box .exchange-rate {
font-size: 16px;
display: block;
}
@media screen and (max-width: 768px) {
.form-container {
width: 100%;
padding: 22px 20px;
}
.form-content {
width: 100%;
}
.qrpay-container .price-box .price {
font-size: 22px;
float: left;
line-height: 28px;
.card-pay-table-container {
width: 100%;
margin: 0 auto;
}
.card-line {
width: 92%;
margin: 0 auto;
border-bottom: 1px solid #DDDDDD;
}
.form-button {
width: 92%;
margin: 30px 0;
border-radius: 4px;
height: 50px;
}
}
.qrpay-container .price-box .price-left {
font-weight: bold;
border-right: 2px solid #666;
padding-right: 10px;
@media screen and (min-width: 768px) {
.form-container {
width: 50%;
margin: 0 auto;
padding: 22px 20px;
}
.form-content {
width: 50%;
margin: 0 auto;
}
.card-pay-table-container {
width: 40%;
margin: 0 auto;
}
.card-line {
width: 100%;
margin: 0 auto;
border-bottom: 1px solid #DDDDDD;
}
.form-button {
width: 60%;
margin: 30px 0;
border-radius: 4px;
height: 50px;
}
}
.qrpay-container .price-box .price-right {
padding-left: 10px;
width: 49%;
white-space: nowrap;
text-align: left;
.btn-warning {
color: #fff;
background-color: #FF6600 !important;
border-color: #FF6600 !important;
}
.qrpay-container .card-input-box {
.card-input-box {
width: 100%;
text-align: center;
border: none;
}
.qrpay-container .qrcode-img {
width: 140px;
height: 140px;
position: relative;
.loading-container {
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: rgba(255, 255, 255, .8);
display: block;
margin: auto;
}
.loading-container.hide{
display: none;
}
.qrpay-container .qr-footer {
.loading-container > .loading-box {
position: relative;
bottom: 0;
border-radius: 0 0 10px 10px;
width: 100%;
padding: 10px;
background: #f7f7f7;
color: #000;
margin: auto;
top: 50%;
transform: translateY(-50%);
}
.qrpay-container .qr-footer .form-group {
margin-bottom: 2px;
font-size: 12px;
line-height: 12px;
.loading-container > .loading-box > .loading-text {
display: block;
text-align: center;
font-size: 2em;
color: #aaa;
text-shadow: 2px -1px 4px;
}
.qrpay-container .qr-desc {
position: absolute;
height: 150px;
z-index: 999;
top: 140px;
right: 30px;
.loading-container .loading {
position: relative;
margin: 0 auto;
width: 100px;
height: 100px;
}
.qrpay-container .btn{
border-radius: 0;
.loading-container .loading span {
display: inline-block;
width: 20px;
height: 20px;
border-radius: 100%;
background-color: #ff6600;
margin: 35px 5px;
opacity: 0;
}
#footer {
position: absolute;
width: 100%;
bottom: 0;
.loading-container .loading span:nth-child(1) {
animation: opacitychange 1s ease-in-out infinite;
}
@media (max-width: 997px) {
section.content {
width: 100%;
position: relative;
bottom: 0;
top: 0;
overflow: visible;
}
.qrpay-container {
width: 100%;
}
#footer {
position: relative;
}
.qr-desc {
display: none;
}
.loading-container .loading span:nth-child(2) {
animation: opacitychange 1s ease-in-out 0.33s infinite;
}
@media (min-width: 768px) {
.dl-horizontal dd {
margin-left: 180px;
line-height: 32px;
}
.loading-container .loading span:nth-child(3) {
animation: opacitychange 1s ease-in-out 0.66s infinite;
}
@media (min-width: 768px) {
.dl-horizontal dt {
float: left;
width: 160px;
overflow: hidden;
clear: left;
text-align: right;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 32px;
@keyframes opacitychange {
0%, 100% {
opacity: 0;
}
}
60% {
opacity: 1;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

@ -575,8 +575,12 @@ define(['angular','decimal', 'uiRouter', 'uiBootstrap', 'angularEcharts'], funct
}]);
app.controller('partnerDashboardCtrl', ['$scope', '$http', '$filter', '$uibModal','$timeout', 'chartParser','clearingDetailService','commonDialog','company_info', function ($scope, $http, $filter, $uibModal,$timeout, chartParser,clearingDetailService,commonDialog,company_info) {
$scope.showUnSettleDetail = false;
$scope.company_info = company_info.data || {};
$scope.sendMailCount = 0;
$scope.hideNotSettleDetail = function () {
$scope.showUnSettleDetail = !$scope.showUnSettleDetail;
};
$scope.scales = [
{
key: 'today',

@ -200,7 +200,32 @@
<div class="description-header text-bold"><img src="/static/images/lakalapay_sign.png"/>LakalaPay</div>
</div>
</div>
<div class="col-sm-4 col-xs-6">
<div class="description-block">
<div class="description-text">交易额:
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_cardamount|currency: ' $ '"></label>
</div>
<div class="description-text">订单数:
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_card_order_count"></label>
</div>
<div class="description-header text-bold"><img src="/static/images/card_payment_sign.png"/>Card Payment</div>
</div>
</div>
<div class="col-sm-4 col-xs-6">
<div class="description-block">
<div class="description-text">交易额:
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_ddamount|currency: ' $ '"></label>
</div>
<div class="description-text">订单数:
<label class="description-text text-red"
ng-bind="totalChannelAmount.rpaypmt_dd_order_count"></label>
</div>
<div class="description-header text-bold"><img src="/static/images/direct_debit_sign.png"/>Direct Debit</div>
</div>
</div>
</div>
</div>

@ -357,8 +357,19 @@
<span class="mini-stat-icon bg-light"><i class="glyphicon glyphicon-btc text-info"></i></span>
<div class="mini-stat-info text-right text-light f-14">
<span class="counter text-white" style="font-size: 24px">
{{transcommon.not_settled|currency:'AUD '}}
{{transcommon.not_settled|currency:'AUD '}} <i class="fa fa-ellipsis-v" ng-click="hideNotSettleDetail()" style="cursor: pointer"></i>
</span>
<div ng-if="showUnSettleDetail">
<span class="counter text-white" style="font-size: 1px">
Cross-border Payment : {{transcommon.sys_not_settled|currency:'AUD '}}
</span>
<span class="counter text-white" style="font-size: 1px">
Card Payment : {{transcommon.rpaypmt_card_not_settled|currency:'AUD '}}
</span>
<span class="counter text-white" style="font-size: 1px">
Direct Debit : {{transcommon.rpaypmt_dd_not_settled|currency:'AUD '}}
</span>
</div>
UNSETTLED
<br>
<a role="button" id="manual-settle" ng-click="toShowUnSettledDialog()" ng-if="manual_settle&&([1]|withRole)&&(currentUser.client_moniker=='MEGP' ||currentUser.client_moniker=='PINE')">

@ -0,0 +1,498 @@
[
{
"children": [
{
"children": [],
"label": "Veterinary Services",
"mccCode": "0742"
},
{
"children": [],
"label": "Agricultural Cooperatives",
"mccCode": "0763"
},
{
"children": [],
"label": "Horticultural and Landscaping Services",
"mccCode": "0780"
},
{
"children": [],
"label": "General Contractors—Residential and Commercial",
"mccCode": "1520"
},
{
"children": [],
"label": "Air Conditioning, Heating, and Plumbing Contractors",
"mccCode": "1711"
},
{
"children": [],
"label": "Electrical Contractors",
"mccCode": "1731"
},
{
"children": [],
"label": "Insulation, Masonry, Plastering, Stonework, and Tile Setting",
"mccCode": "1740"
}
],
"label": "Extended",
"mccCode": "1"
},
{
"children": [
{
"children": [],
"label": "Carpentry Contractors",
"mccCode": "1750"
},
{
"children": [],
"label": "Roofing and Siding, Sheet Metal Work Contractors",
"mccCode": "1761"
},
{
"children": [],
"label": "Concrete Work Contractors",
"mccCode": "1771"
},
{
"children": [],
"label": "Contractors, Special Trade—not elsewhere classified",
"mccCode": "1799"
},
{
"children": [],
"label": "Miscellaneous Publishing and Printing",
"mccCode": "2741"
},
{
"children": [],
"label": "Typesetting, Plate Making, and Related Services",
"mccCode": "2791"
},
{
"children": [],
"label": "Sanitation, Polishing, and Specialty Cleaning Preparations",
"mccCode": "2842"
},
{
"children": [],
"label": "Airlines, Air Carriers",
"mccCode": "3000"
},
{
"children": [],
"label": "Car Rental Agencies",
"mccCode": "3351"
},
{
"children": [],
"label": "Lodging—Hotels, Motels, Resorts",
"mccCode": "3501"
},
{
"children": [],
"label": "Railroads—Freight",
"mccCode": "4011"
},
{
"children": [],
"label": "Transportation—Suburban and Local Commuter Passenger, including",
"mccCode": "4111"
}
],
"label": "Contractors",
"mccCode": "2"
},
{
"children": [
{
"children": [],
"label": "培训类",
"mccCode": "30001"
},
{
"children": [],
"label": "移民留学",
"mccCode": "30002"
},
{
"children": [],
"label": "私人幼儿园",
"mccCode": "30003"
},
{
"children": [],
"label": "舞厅、舞蹈房和舞蹈学校",
"mccCode": "30004"
}
],
"label": "教育",
"mccCode": "3"
},
{
"children": [
{
"children": [],
"label": "换汇",
"mccCode": "40001"
},
{
"children": [],
"label": "房产",
"mccCode": "40002"
},
{
"children": [],
"label": "会计、审计和记账服务",
"mccCode": "40003"
},
{
"children": [],
"label": "律师,法律服务",
"mccCode": "40004"
},
{
"children": [],
"label": "租房中介",
"mccCode": "40005"
}
],
"label": "商务咨询",
"mccCode": "4"
},
{
"children": [
{
"children": [],
"label": "公众号服务商",
"mccCode": "50001"
},
{
"children": [],
"label": "各种媒体类宣传",
"mccCode": "50002"
},
{
"children": [],
"label": "广告服务",
"mccCode": "50003"
}
],
"label": "传媒",
"mccCode": "5",
"value": "{\"category\":\"SERVICE\",\"code\":\"7542\",\"description\":\"Car Washes\",\"parentCode\":\"S10\"}"
},
{
"children": [
{
"children": [],
"label": "美容院",
"mccCode": "60001"
},
{
"children": [],
"label": "医疗美容",
"mccCode": "60002"
},
{
"children": [],
"label": "药店、药房",
"mccCode": "60003"
},
{
"children": [],
"label": "牙科/实验室/医疗/眼科医院器材和用品",
"mccCode": "60004"
}
],
"label": "医美",
"mccCode": "6"
},
{
"children": [
{
"label": "超市",
"mccCode": "70001"
},
{
"children": [],
"label": "服装店",
"mccCode": "70002"
},
{
"children": [],
"label": "鞋店",
"mccCode": "70003"
},
{
"children": [],
"label": "珠宝店",
"mccCode": "70004"
},{
"children": [],
"label": "箱包",
"mccCode": "70005"
},
{
"children": [],
"label": "自动售卖机",
"mccCode": "70006"
},
{
"children": [],
"label": "文具用品商店、各类办公用品商店",
"mccCode": "70007"
},
{
"children": [],
"label": "报亭、报摊",
"mccCode": "70008"
},
{
"children": [],
"label": "花店",
"mccCode": "70009"
},
{
"children": [],
"label": "宠物商店、宠物食品及用品",
"mccCode": "70010"
},
{
"children": [],
"label": "各类杂货店、便利店",
"mccCode": "70011"
},
{
"children": [],
"label": "电子设备商店",
"mccCode": "70012"
},
{
"children": [],
"label": "礼品、卡片、装饰品、纪念品商店",
"mccCode": "70013"
},
{
"children": [],
"label": "化妆品商店",
"mccCode": "70014"
},
{
"children": [],
"label": "免税店",
"mccCode": "70015"
}
],
"label": "零售",
"mccCode": "7"
},
{
"children": [
{
"children": [],
"label": "桌游吧",
"mccCode": "80001"
},
{
"children": [],
"label": "演唱会",
"mccCode": "80002"
},
{
"children": [],
"label": "马术训练",
"mccCode": "80003"
},
{
"children": [],
"label": "瑜伽",
"mccCode": "80004"
},
{
"children": [],
"label": "健身",
"mccCode": "80005"
},
{
"children": [],
"label": "社团",
"mccCode": "80006"
},
{
"children": [],
"label": "网吧",
"mccCode": "80007"
},
{
"children": [],
"label": "KTV",
"mccCode": "80008"
},
{
"children": [],
"label": "电影",
"mccCode": "80009"
},
{
"children": [],
"label": "按摩店",
"mccCode": "80010"
},
{
"children": [],
"label": "游乐园、马戏团、嘉年华、占卜",
"mccCode": "80011"
},
{
"children": [],
"label": "大型游戏机和游戏场所",
"mccCode": "80012"
},
{
"children": [],
"label": "玩具、游戏店",
"mccCode": "80013"
}
],
"label": "休闲娱乐",
"mccCode": "8"
},
{
"children": [
{
"children": [],
"label": "摄影",
"mccCode": "90001"
},
{
"children": [],
"label": "massage",
"mccCode": "90002"
},
{
"children": [],
"label": "通讯运营商",
"mccCode": "90003"
},
{
"children": [],
"label": "车行",
"mccCode": "90004"
},
{
"children:":[],
"label":"软件服务",
"mccCode":"90005"
},
{
"children:":[],
"label":"计算机网络/信息服务",
"mccCode":"90006"
},
{
"children:":[],
"label":"使领馆",
"mccCode":"90007"
},
{
"children:":[],
"label":"汽车零配件商店",
"mccCode":"90008"
},
{
"children:":[],
"label":"车体维修店",
"mccCode":"90009"
},
{
"children:":[],
"label":"电子修理店",
"mccCode":"90010"
}
],
"label": "其他服务类",
"mccCode": "9"
},
{
"children": [
{
"children": [],
"label": "Hotel",
"mccCode": "100001"
},
{
"children": [],
"label": "Motel",
"mccCode": "100002"
},
{
"children": [],
"label": "住宿服务(旅馆、酒店、汽车旅馆、度假村等)",
"mccCode": "100003"
}
],
"label": "酒店",
"mccCode": "10"
},
{
"children": [
{
"children": [],
"label": "代购",
"mccCode": "110001"
},
{
"children": [],
"label": "物流(大宗出口贸易)",
"mccCode": "110002"
},
{
"children": [],
"label": "红酒出口",
"mccCode": "110003"
},
{
"children": [],
"label": "综合电商",
"mccCode": "110004"
},
{
"children": [],
"label": "酒庄",
"mccCode": "110005"
}
],
"label": "出口贸易",
"mccCode": "11"
},
{
"children": [
{
"children": [],
"label": "建材",
"mccCode": "120001"
},
{
"children": [],
"label": "家居",
"mccCode": "120002"
},
{
"children": [],
"label": "太阳能板",
"mccCode": "120003"
},
{
"children": [],
"label": "五金器具店",
"mccCode": "120004"
}
],
"label": "家居建材",
"mccCode": "12"
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -176,7 +176,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -371,6 +375,8 @@
<img src="/static/images/rpayplus_sign.png" uib-tooltip="RPay+" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png" uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
<img src="/static/images/lakalapay_sign.png" uib-tooltip="LakalaPay" ng-if="trade.channel=='LakalaPay'"/>
<img src="/static/images/card_payment_sign.png" uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png" uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
{{trade.order_id}}
</td>
<td>

@ -75,13 +75,13 @@
<i class="fa fa-pencil-square-o"></i>
</a>
<span ng-if="cashier.is_valid"> |</span>
<a class="text-primary" ng-if="cashier.is_valid" role="button" style="padding-right: 5px" title="Detail"
<a ng-if="cashier.is_valid" class="text-primary" style="padding-right: 5px" role="button" title="Detail"
ui-sref=".detail({cashier_id:cashier.cashier_id})">
<i class="fa fa-search"></i>
</a>
<span ng-if="cashier.is_valid"> |</span>
<a class="text-danger text-bold" ng-click="disableCashier(cashier)" ng-if="cashier.is_valid" role="button">Disable</a>
<a class="text-success text-bold" ng-click="enableCashier(cashier)" ng-if="!cashier.is_valid" role="button">Enable</a>
<a ng-if="cashier.is_valid" role="button" class="text-danger text-bold" ng-click="disableCashier(cashier)">Disable</a>
<a ng-if="!cashier.is_valid" role="button" class="text-success text-bold" ng-click="enableCashier(cashier)">Enable</a>
</td>
</tr>
</tbody>

@ -167,6 +167,15 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/file');
}]
}
}).state('partners.detail.MW_files', {
url: '/mw_files',
templateUrl: '/static/payment/partner/templates/partner_mw_auth_files.html',
controller: 'partnerMWAuthFileCtrl',
resolve: {
file: ['$http', '$stateParams', function ($http, $stateParams) {
return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/mw_file');
}]
}
}).state('partners.detail.kyc_files', {
url: '/kyc_files',
templateUrl: '/static/payment/kyc/templates/partner_kyc_files.html',
@ -2487,6 +2496,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
})
};
$scope.changeBillCodeVersion = function() {
if (!$scope.paymentInfo) {
return;
}
$http.post('/sys/partners/' + $scope.partner.client_moniker + '/selectBillVersion', {version: $scope.paymentInfo.billcode_version}).then(function () {
$scope.loadPartnerPaymentInfo();
}, function (resp) {
commonDialog.alert({
title: 'failed to change require bill version permission status',
content: resp.data.message,
type: 'error'
})
})
};
$scope.extChangeParam = function(name,value){
var flag = true;
$scope.convertExtParams.forEach(function (params) {
@ -2643,9 +2667,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
}
};
$scope.getBalance();
$scope.getBankAccount();
$scope.getRates = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/rates').then(function (resp) {
@ -2656,7 +2678,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
})
});
};
$scope.skipClearing = function (skipClearing) {
if (!$scope.init.skip_clearing) {
$scope.init.skip_clearing = true;
@ -2688,7 +2709,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
})
}
};
$scope.surchargeAccountDetail = function () {
$uibModal.open({
templateUrl: '/static/payment/surchargeaccount/templates/partner_surcharge_account_dialog.html',
@ -2711,7 +2731,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.getBalance();
});
};
$scope.allowSurchargeCredit = function (allowSurchargeCredit) {
if (!$scope.init.allow_surcharge_credit) {
$scope.init.allow_surcharge_credit = true;
@ -2729,7 +2748,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.getBankAccount();
})
};
$scope.switchPreSettle = function (presettle) {
if (!$scope.init.enable_presettle) {
$scope.init.enable_presettle = true;
@ -2739,7 +2757,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.getBankAccount();
})
};
$scope.customerTaxFree = function (customerTaxFree) {
if (!$scope.init.customer_tax_free) {
$scope.init.customer_tax_free = true;
@ -2791,6 +2808,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
})
};
$scope.newCardPaymentRates = function () {
$uibModal.open({
templateUrl: '/static/payment/partner/templates/partner_new_card_payment_rate.html',
controller: 'newCardPaymentRateDialogCtrl',
resolve: {
sys_common_rate: function () {
return $http.get('/sys/partners/sys_card_rates');
},
clientMoniker: function () {
return $scope.partner.client_moniker;
},
cost_rate_channel: function () {
return $scope.cost_rate_channel;
}
}
}).result.then(function () {
$scope.getRates();
});
};
$scope.newRate = function () {
var name = $scope.bankCtrl.rate_name;
$uibModal.open({
@ -2889,6 +2925,74 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
}
}]);
app.controller('newCardPaymentRateDialogCtrl', ['$scope', '$http', 'sys_common_rate', 'clientMoniker', function ($scope, $http, sys_common_rate, clientMoniker) {
$scope.rate = {};
$scope.card_payment_normal = true;
$scope.card_payment_switch_title = "Direct Debit";
$scope.card_payment = [
{
type: "rpaypmt_card",
title: "Card Payment"
}, {
type: "rpaypmt_dd",
title: "Direct Debit"
}];
$scope.cardRateConfig = $scope.card_payment[0];
$scope.switchCardRateConfig = function () {
$scope.card_payment_normal = !$scope.card_payment_normal;
$scope.rate = {};
if ($scope.card_payment_normal) {
$scope.cardRateConfig = $scope.card_payment[0];
$scope.card_payment_switch_title = "Direct Debit";
}else {
$scope.cardRateConfig = $scope.card_payment[1];
$scope.card_payment_switch_title = "Card Payment";
}
};
$scope.sysRateConfig = angular.copy(sys_common_rate.data);
$scope.ctrl = {sending: false};
$scope.saveRate = function (form) {
if (form.$invalid) {
angular.forEach(form, function (item, key) {
if (key.indexOf('$') < 0) {
item.$dirty = true;
}
});
return;
}
$scope.errmsg = null;
$scope.ctrl.sending = true;
$scope.rate.type = $scope.cardRateConfig.type;
$http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then(function () {
$scope.ctrl.sending = false;
$scope.$close();
}, function (resp) {
$scope.ctrl.sending = false;
$scope.errmsg = resp.data.message;
})
}
$scope.changeDays = function () {
if ($scope.rate.clean_days && $scope.card_payment_normal) {
switch ($scope.rate.clean_days) {
case '1': {
$scope.rate.rate_value = parseFloat($scope.sysRateConfig.t1.domestic_rate);
$scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t1.transaction_fee);
break;
}
case '2': {
$scope.rate.rate_value = parseFloat($scope.sysRateConfig.t2.domestic_rate);
$scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t2.transaction_fee);
break;
}
case '3': {
$scope.rate.rate_value = parseFloat($scope.sysRateConfig.t3.domestic_rate);
$scope.rate.transaction_fee = parseFloat($scope.sysRateConfig.t3.transaction_fee);
break;
}
}
}
};
}]);
app.controller('newRateDialogCtrl', ['$scope', '$http', 'rate', 'sys_common_rate', 'clientMoniker', function ($scope, $http, rate, sys_common_rate, clientMoniker) {
$scope.rate = angular.copy(rate);
@ -4283,6 +4387,253 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
}]);
app.controller('partnerMWAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) {
$scope.id_info_form = {edit: false};
$scope.file = file.data || {};
$scope.file.upay_risk_level = $scope.partner.upay_risk_level;
$scope.file.upay_risk_remark = $scope.partner.upay_risk_remark;
$scope.uploadApplyFile = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.bankFileProgress = {value: 0};
Upload.upload({
url: '/attachment/files',
data: {file: file}
}).then(function (resp) {
delete $scope.bankFileProgress;
$scope.file.upay_application_form = resp.data.url;
$scope.updateFile();
if ($scope.file.upay_application_form.endsWith('pdf')) {
$scope.bankIsImage = false;
} else {
$scope.bankIsImage = true;
}
}, function (resp) {
delete $scope.bankFileProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.bankFileProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.agreeIsImage = true;
if ($scope.file.file_agreement_info && $scope.file.file_agreement_info.endsWith('pdf')) {
$scope.agreeIsImage = false;
}
$scope.bankIsImage = true;
if ($scope.file.upay_application_form && $scope.file.upay_application_form.endsWith('pdf')) {
$scope.bankIsImage = false;
}
$scope.companyIsImage = true;
if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) {
$scope.companyIsImage = false;
}
$scope.applyIsImage = true;
if ($scope.file.file_apply_info && $scope.file.file_apply_info.endsWith('pdf')) {
$scope.applyIsImage = false;
}
$scope.idIsImage = true;
if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) {
$scope.idIsImage = false;
}
$scope.uploadAgreementFile = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.companyFileProgress = {value: 0};
Upload.upload({
url: '/attachment/files',
data: {file: file}
}).then(function (resp) {
delete $scope.companyFileProgress;
$scope.file.upay_agreement_file = resp.data.url;
$scope.updateFile();
if ($scope.file.upay_agreement_file.endsWith('pdf')) {
$scope.companyIsImage = false;
} else {
$scope.companyIsImage = true;
}
}, function (resp) {
delete $scope.companyFileProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.companyFileProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadOfferFile = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.idFileProgress = {value: 0};
Upload.upload({
url: '/attachment/files',
data: {file: file}
}).then(function (resp) {
delete $scope.idFileProgress;
$scope.file.upay_offer_letter = resp.data.url;
$scope.updateFile();
if ($scope.file.upay_offer_letter.endsWith('pdf')) {
$scope.idIsImage = false;
} else {
$scope.idIsImage = true;
}
}, function (resp) {
delete $scope.idFileProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.idFileProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadDriverFile = function (file) {
if (file != null) {
if (file.size > 10 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过10MB请压缩后重试', type: 'error'})
} else {
$scope.agreementFileProgress = {value: 0};
Upload.upload({
url: '/attachment/files',
data: {file: file}
}).then(function (resp) {
delete $scope.agreementFileProgress;
$scope.file.upay_driver_license = resp.data.url;
$scope.updateFile();
if ($scope.file.upay_driver_license.endsWith('pdf')) {
$scope.agreeIsImage = false;
} else {
$scope.agreeIsImage = true;
}
}, function (resp) {
delete $scope.agreementFileProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.agreementFileProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.uploadResidenceFile = function (file) {
if (file != null) {
if (file.size > 3 * 1024 * 1024) {
commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB请压缩后重试', type: 'error'})
} else {
$scope.applyFileProgress = {value: 0};
Upload.upload({
url: '/attachment/files',
data: {file: file}
}).then(function (resp) {
delete $scope.applyFileProgress;
$scope.file.upay_residence_certificate = resp.data.url;
$scope.updateFile();
if ($scope.file.upay_residence_certificate.endsWith('pdf')) {
$scope.applyIsImage = false;
} else {
$scope.applyIsImage = true;
}
}, function (resp) {
delete $scope.applyFileProgress;
commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'})
}, function (evt) {
$scope.applyFileProgress.value = parseInt(100 * evt.loaded / evt.total);
})
}
}
};
$scope.saveIdInfo = function () {
if (!$scope.file.upay_risk_level) {
commonDialog.alert({title: 'Error', content: '请选择商户风险等级', type: 'error'});
return;
}
var config = {};
config.upay_risk_level = $scope.file.upay_risk_level;
config.upay_risk_remark = $scope.file.upay_risk_remark;
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_risk_info', config).then(function (resp) {
commonDialog.alert({title: 'Success', content: 'Risk Info Updated', type: 'success'})
$state.reload();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'})
$state.reload();
});
};
$scope.cancelIdInfo = function () {
$state.reload();
$scope.id_info_form.edit=false
};
$scope.downloadAsZip = function () {
var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/MWcomplianceAsZIP';
return url;
};
$scope.deleteComplianceFiles = function (file_id) {
commonDialog.confirm({
title: 'Warning',
content: 'This operation will delete the file, Are you sure?'
}).then(function () {
$http.put('/sys/partners/auth_file/' + file_id + '/delete').then(function (resp) {
commonDialog.alert({
title: 'Success',
content: 'Delete Successful',
type: 'success'
});
$state.reload();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
})
})
};
$scope.updateFile = function () {
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_file', $scope.file).then(function () {
commonDialog.alert({
title: 'Success',
content: 'Upload Successful',
type: 'success'
});
$state.reload();
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
})
}
function commitError() {
commonDialog.alert({
title: 'Error',
content: 'Missing file',
type: 'error'
});
};
$scope.complianceCheck = function () {
if (!$rootScope.complianceCheck) {
$rootScope.complianceCheck = {};
}
$rootScope.complianceCheck.client_id = $scope.partner.client_id;
$rootScope.complianceCheck.authFile = true;
};
$scope.complianceChangeCheck = function () {
if ($rootScope.complianceCheck) {
if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) {
delete $rootScope.complianceCheck;
}
}
};
$scope.complianceChangeCheck();
}]);
app.controller('partnerKycFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) {
$scope.file = file.data || {};
@ -4810,17 +5161,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
}
}
}]);
app.controller('subMerchantIdApplicaitonsCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', function ($scope, $http, $uibModal, $state, commonDialog) {
app.controller('subMerchantIdApplicaitonsCtrl', ['$scope', '$http', '$uibModal', '$state', 'commonDialog', '$sce', function ($scope, $http, $uibModal, $state, commonDialog, $sce) {
$scope.showMoreMerchantInfo = false;
$scope.hideMerchantInfo = function () {
$scope.showMoreMerchantInfo = !$scope.showMoreMerchantInfo;
};
$scope.loadSubMerchantInfos = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_sub_applices', {params: {}}).then(function (resp) {
$scope.subMerchantInfos = resp.data;
});
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) {
$scope.subRpayMerchantInfos = resp.data;
});
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) {
$scope.subYeepayMerchantInfos = resp.data;
// $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_rpay_sub_applices', {params: {}}).then(function (resp) {
// $scope.subRpayMerchantInfos = resp.data;
// });
//
// $http.get('/sys/partners/' + $scope.partner.client_moniker + '/list_yeepay_sub_applices', {params: {}}).then(function (resp) {
// $scope.subYeepayMerchantInfos = resp.data;
// });
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/queryMWMerchantIdStatus').then(function (resp) {
$scope.partner.cardInfo = resp.data;
});
};
$scope.useSubMerchantId = function (sub_merchant_id) {
@ -4875,6 +5234,26 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
$scope.loadSubMerchantInfos();
})
};
$scope.applyMWSubMerchantId = function () {
$http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/mw_info').then(function (resp) {
commonDialog.confirm({
title: 'Apply Merchant Warrior Sub Merchant Id',
contentHtml: $sce.trustAsHtml('Are you sure to apply merchant Warrior sub merchant id for <span style="color: red">[' + $scope.partner.company_name + ']</span>?'),
json: resp.data
}).then(function () {
$http.put('/sys/partners/' + $scope.partner.client_moniker + '/applyMWMerchantId').then(function (res) {
commonDialog.alert({
title: 'Success',
content: 'Apply Merchant Warrior Sub Merchant ID successfully',
type: 'success'
});
$scope.partner.cardInfo = res.data;
}, function (resp) {
commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'});
})
})
});
};
$scope.applyRpaySubMerchantId = function () {
$uibModal.open({
templateUrl: '/static/payment/partner/templates/apply_rpay_sub_merchant_id.html',

@ -108,26 +108,38 @@
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='CB_BankPay'}" ng-if="currentUser.client.enable_cb_bankpay">
<a role="button" ng-click="bankCtrl.rate_name='CB_BankPay'">CB BankPay</a>
</li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_card'}" ng-if="currentUser.client.enable_rpaypmt_card">
<a role="button" ng-click="bankCtrl.rate_name='rpaypmt_card'">Card Payment</a>
</li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_dd'}" ng-if="currentUser.client.enable_rpaypmt_dd">
<a role="button" ng-click="bankCtrl.rate_name='rpaypmt_dd'">Direct Debit</a>
</li>
</ul>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>Rate Name</th>
<th>Rate Value</th>
<th ng-if="bankCtrl.rate_name!='rpaypmt_card'">Rate Value</th>
<th ng-if="bankCtrl.rate_name=='rpaypmt_card'">Domestic Rate Value</th>
<th ng-if="bankCtrl.rate_name=='rpaypmt_card'">International Rate Value</th>
<th>Transaction Fee</th>
<th>Active Time</th>
<th>Expire Time</th>
<th ng-if="bankCtrl.rate_name=='Wechat'">Clean Days</th>
<th ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">Clean Days</th>
<th>Remark</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="rate in rates|filter:{rate_name:bankCtrl.rate_name}:true" ng-class="{'text-bold':rate.current,'success':rate.active}">
<td ng-bind="rate.rate_name"></td>
<td ng-bind="rate.rate_value"></td>
<td ng-if="bankCtrl.rate_name!='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td>
<td ng-if="bankCtrl.rate_name=='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td>
<td ng-if="bankCtrl.rate_name=='rpaypmt_card'" ng-bind="rate.ext_rates.overseas_rate_value + ' %'"></td>
<td ng-bind="'$ '+rate.transaction_fee"></td>
<td ng-bind="rate.active_time|date:'yyyy-MM-dd'"></td>
<td ng-bind="rate.expiry_time|date:'yyyy-MM-dd'"></td>
<td ng-if="bankCtrl.rate_name=='Wechat'">T+{{rate.clean_days}}</td>
<td ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">T+{{rate.clean_days}}</td>
<td ng-bind="rate.remark|limitTo:20" title="{{rate.remark}}"></td>
</tr>
</tbody>

@ -212,17 +212,24 @@
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Rpay'}"><a role="button" ng-click="bankCtrl.rate_name='Rpay'">Rpay+</a></li>
<!--<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Yeepay'}"><a role="button" ng-click="bankCtrl.rate_name='Yeepay'">Yeepay</a></li>-->
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='CB_BankPay'}"><a role="button" ng-click="bankCtrl.rate_name='CB_BankPay'" ng-if="sysconfig.active_channels.indexOf('CB_BankPay')!=-1">CB_BankPay</a></li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_card'}"><a role="button" ng-click="bankCtrl.rate_name='rpaypmt_card'">Card Payment</a></li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_dd'}"><a role="button" ng-click="bankCtrl.rate_name='rpaypmt_dd'">Direct Debit</a></li>
<button class="btn btn-warning" style="float: right" type="button" ng-click="newCardPaymentRates()" ng-if="partner.rate_editable && (('11'|withRole)||((!partner.approve_result||partner.approve_result>4) && ('111'|withRole)))" >
Add Card Payment Rates
</button>
</ul>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>Rate Name</th>
<th>Rate Value</th>
<th ng-if="bankCtrl.rate_name!='rpaypmt_card'">Rate Value</th>
<th ng-if="bankCtrl.rate_name=='rpaypmt_card'">Domestic Rate Value</th>
<th ng-if="bankCtrl.rate_name=='rpaypmt_card'">International Rate Value</th>
<th>Transaction Fee</th>
<th>Active Time</th>
<th>Expire Time</th>
<th ng-if="bankCtrl.rate_name=='Wechat'">Clean Days</th>
<th ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">Clean Days</th>
<th>Update Time</th>
<th>Operator</th>
<th>Remark</th>
@ -233,11 +240,13 @@
<tr ng-repeat="rate in rates|filter:{rate_name:bankCtrl.rate_name}:true"
ng-class="{'text-bold':rate.current,'success':rate.active}">
<td ng-bind="rate.rate_name"></td>
<td ng-bind="rate.rate_value + ' %'"></td>
<td ng-if="bankCtrl.rate_name!='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td>
<td ng-if="bankCtrl.rate_name=='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td>
<td ng-if="bankCtrl.rate_name=='rpaypmt_card'" ng-bind="rate.ext_rates.overseas_rate_value + ' %'"></td>
<td ng-bind="'$ '+rate.transaction_fee"></td>
<td ng-bind="rate.active_time|date:'yyyy-MM-dd'"></td>
<td ng-bind="rate.expiry_time|date:'yyyy-MM-dd'"></td>
<td ng-if="rate.rate_name=='Wechat'">T+{{rate.clean_days}}</td>
<td ng-if="rate.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">T+{{rate.clean_days}}</td>
<td ng-bind="rate.update_time|date:'yyyy-MM-dd'"></td>
<td ng-bind="rate.operator_name||'系统生成'"></td>
<td ng-bind="rate.remark|limitTo:20" title="{{rate.remark}}"></td>

@ -277,6 +277,9 @@
<li ui-sref-active="active" ng-if="partner.show_all_permission && partner.is_valid==1">
<a ui-sref=".files">Compliance Files</a>
</li>
<li ui-sref-active="active" ng-if="partner.show_all_permission && partner.is_valid==1">
<a ui-sref=".MW_files">Merchant Warrior Compliance Files</a>
</li>
<!--<li ui-sref-active="active" ng-if="partner.show_all_permission && partner.is_valid==1">
<a ui-sref=".kyc_files">KYC Files</a>
</li>-->

@ -0,0 +1,194 @@
<style type="text/css">
img {
width: 100%;
}
</style>
<div class="panel panel-default">
<div class="panel-heading">Audit Files &nbsp;&nbsp;&nbsp;
<a class="btn-group btn btn-success" ng-if="file" ng-href="{{downloadAsZip()}}" target="_blank">
<i class="fa fa-cloud-download">一键下载</i>
</a>
</div>
<div class="panel-body">
<div class="form-horizontal">
<div class="panel panel-info">
<div class="panel-heading"><h4>
Merchant Warrior商户风险评级
<a class="small" role="button" ng-if="!id_info_form.edit" ng-click="id_info_form.edit=true">
<i class="fa fa-edit"></i></a>
</h4></div>
<div class="panel-body">
<div class="row form-horizontal">
<div class="form-group" ng-if="id_info_form.edit">
<label class="control-label col-sm-2">* 商户风险等级 </label>
<div class="col-sm-4">
<div class="form-control-static">
<select class="form-control"
ng-model="file.upay_risk_level" style="width: 250px">
<option value="">Please Choose</option>
<option value="low" class="risk-options" style="color: green">低风险</option>
<option value="medium" class="risk-options" style="color: orange">中风险</option>
<option value="high" class="risk-options" style="color: red">高风险</option>
</select>
</div>
</div>
</div>
<div class="form-group" ng-if="id_info_form.edit">
<label class="control-label col-sm-2">风控备注</label>
<div class="col-sm-4">
<div class="form-control-static">
<textarea class="form-control" ng-model="file.upay_risk_remark" style="height: 100px"></textarea>
</div>
</div>
</div>
<div class="form-group" ng-if="!id_info_form.edit">
<label class="control-label col-sm-2">商户风险等级 </label>
<div class="col-sm-4">
<div class="form-control-static">
<span ng-if="file.upay_risk_level=='low'" style="color: green">低风险</span>
<span ng-if="file.upay_risk_level=='medium'" style="color: orange">中风险</span>
<span ng-if="file.upay_risk_level=='high'" style="color: red">高风险</span>
</div>
</div>
</div>
<div class="form-group" ng-if="!id_info_form.edit">
<label class="control-label col-sm-2">风控备注</label>
<div class="col-sm-4">
<div class="form-control-static">
<textarea class="form-control" ng-model="file.upay_risk_remark" style="height: 100px" disabled></textarea>
</div>
</div>
</div>
</div>
</div>
<div class="panel-footer" ng-if="id_info_form.edit">
<button class="btn btn-success" ng-click="saveIdInfo()">保存</button>
<button class="btn btn-danger" ng-click="cancelIdInfo()">取消</button>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">* Merchant Warrior申请表</label>
<div class="col-sm-4">
<div class="form-control-static">
<button class="btn btn-primary" type="button"
ngf-select="uploadApplyFile($file)">
<i class="fa fa-upload"></i> Upload
</button>
<i class="fa fa-check-square-o check-i" aria-hidden="true" style="float: none" ng-if="$root.complianceCheck.authFile"></i>
<a role="button" download="" target="_blank" class="btn-group btn btn-warning" type="button" href="{{file.upay_application_form}}" ><i class="fa fa-download"></i></a>
</div>
<uib-progressbar value="bankFileProgress.value" ng-if="bankFileProgress"></uib-progressbar>
<table>
<tbody>
<tr>
<td><a ng-if="bankIsImage" target="_blank" ng-href="{{file.upay_application_form}}">
<img ng-src="{{file.upay_application_form}}"class="col-sm-6" onerror="this.src='/static/images/file_close.png'">
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">* Letter of Offer邀约信 </label>
<div class="col-sm-4">
<div class="form-control-static">
<button class="btn btn-primary" type="button"
ngf-select="uploadOfferFile($file)">
<i class="fa fa-upload"></i> Upload
</button>
<i class="fa fa-check-square-o check-i" aria-hidden="true" style="float: none" ng-if="$root.complianceCheck.authFile"></i>
<a role="button" download="" target="_blank" class="btn-group btn btn-warning" type="button" href="{{file.upay_offer_letter}}" ><i class="fa fa-download"></i></a>
</div>
<uib-progressbar value="idFileProgress.value" ng-if="idFileProgress"></uib-progressbar>
<table>
<tbody>
<tr>
<td><a ng-if="idIsImage" target="_blank" ng-href="{{file.upay_offer_letter}}">
<img ng-src="{{file.upay_offer_letter}}"class="col-sm-6"onerror="this.src='/static/images/file_close.png'">
</a>
</td>
</tr>
</tbody></table>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">* Merchant Warrior商户签署协议</label>
<div class="col-sm-4">
<div class="form-control-static">
<button class="btn btn-primary" type="button"
ngf-select="uploadAgreementFile($file)">
<i class="fa fa-upload"></i> Upload
</button>
<i class="fa fa-check-square-o check-i" aria-hidden="true" style="float: none" ng-if="$root.complianceCheck.authFile"></i>
<a role="button" download="" target="_blank" class="btn-group btn btn-warning" type="button" href="{{file.upay_agreement_file}}" ><i class="fa fa-download"></i></a>
</div>
<uib-progressbar value="companyFileProgress.value" ng-if="companyFileProgress"></uib-progressbar>
<table><tbody>
<tr>
<td><a ng-if="companyIsImage" target="_blank" ng-href="{{file.upay_agreement_file}}">
<img ng-src="{{file.upay_agreement_file}}"class="col-sm-6" onerror="this.src='/static/images/file_close.png'">
</a>
</td>
</tr>
</tbody></table>
</div>
</div>
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2">* 最终受益人驾驶执照</label>
<div class="col-sm-4">
<div class="form-control-static">
<button class="btn btn-primary" type="button"
ngf-select="uploadDriverFile($file)">
<i class="fa fa-upload"></i> Upload
</button>
<i class="fa fa-check-square-o check-i" aria-hidden="true" style="float: none" ng-if="$root.complianceCheck.authFile"></i>
<a role="button" download="" target="_blank" class="btn-group btn btn-warning" type="button" href="{{file.upay_driver_license}}" ><i class="fa fa-download"></i></a>
</div>
<uib-progressbar value="agreementFileProgress.value" ng-if="agreementFileProgress"></uib-progressbar>
<table>
<tbody>
<tr>
<td><a ng-if="idIsImage" target="_blank" ng-href="{{file.upay_driver_license}}">
<img ng-src="{{file.upay_driver_license}}"class="col-sm-6" onerror="this.src='/static/images/file_close.png'">
</a>
</td>
</tr>
</tbody></table>
</div>
</div>
</div>
<div class="form-horizontal">
<div class="form-group">
<label class="control-label col-sm-2">* 受益人居住证明文件</label>
<div class="col-sm-4">
<div class="form-control-static">
<button class="btn btn-primary" type="button"
ngf-select="uploadResidenceFile($file)">
<i class="fa fa-upload"></i> Upload
</button>
<i class="fa fa-check-square-o check-i" style="float: none" aria-hidden="true"ng-if="$root.complianceCheck.authFile"></i>
<a role="button" download="" target="_blank" class="btn-group btn btn-warning" type="button" href="{{file.upay_residence_certificate}}" ><i class="fa fa-download"></i></a>
</div>
<uib-progressbar value="bankFileProgress.value" ng-if="applyFileProgress"></uib-progressbar>
<table>
<tbody>
<tr>
<td><a ng-if="idIsImage" target="_blank" ng-href="{{file.upay_residence_certificate}}">
<img ng-src="{{file.upay_residence_certificate}}" class="col-sm-6" onerror="this.src='/static/images/file_close.png'">
</a>
</td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,147 @@
<div class="modal-header">
<h4>New {{cardRateConfig.title}} Rate</h4>
<a role="button" ng-click="switchCardRateConfig()"><i class="fa fa-refresh"></i>Switch {{card_payment_switch_title}} Rate Config</a>
</div>
<div class="modal-body">
<div class="alert alert-danger" ng-if="errmsg" ng-bind="errmsg"></div>
<div class="row">
<div class="col-sm-12">
<form class="form-horizontal" novalidate name="rate_form">
<div class="form-group">
<label class="control-label col-sm-4">{{cardRateConfig.title}} Clear Days</label>
<div class="col-sm-6">
<div class="input-group">
<select class="form-control" ng-model="rate.clean_days" id="cleanDays" ng-change="changeDays()">
<option value="1">T+1</option>
<option value="2">T+2</option>
<option value="3">T+3</option>
</select>
<div>{{rateConfig}}</div>
</div>
</div>
</div>
<div class="form-group" ng-if="cardRateConfig.type=='rpaypmt_card'"
ng-class="{'has-error':rate_form.domestic_rate_value.$invalid && rate_form.domestic_rate_value.$dirty}">
<label class="control-label col-sm-4" for="domestic_rate_value_input">Domestic Rate Value</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="domestic_rate_value" stringToNumber2 class="form-control" ng-model="rate.rate_value"
min="0" max="5" step="0.1" id="domestic_rate_value_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.domestic_rate_value.$error" ng-if="rate_form.domestic_rate_value.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No more than 5.0%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0.0%
</div>
<div class="small text-danger" ng-message="required">
<i class="glyphicon glyphicon-alert"></i> Required Field
</div>
</div>
</div>
</div>
<div class="form-group" ng-if="cardRateConfig.type=='rpaypmt_card'"
ng-class="{'has-error':rate_form.international_rate_value.$invalid && rate_form.international_rate_value.$dirty}">
<label class="control-label col-sm-4" for="international_rate_value_input">International Rate Value</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="international_rate_value" stringToNumber2 class="form-control" ng-model="rate.ext_rates.international_rate_value"
min="0" max="5" step="0.1" id="international_rate_value_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.international_rate_value.$error" ng-if="rate_form.international_rate_value.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No more than 5.0%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0.0%
</div>
<div class="small text-danger" ng-message="required">
<i class="glyphicon glyphicon-alert"></i> Required Field
</div>
</div>
</div>
</div>
<div class="form-group" ng-if="cardRateConfig.type=='rpaypmt_dd'"
ng-class="{'has-error':rate_form.direct_debit_rate_value.$invalid && rate_form.direct_debit_rate_value.$dirty}">
<label class="control-label col-sm-4" for="direct_debit_rate_value_input">Direct Debit Rate Value</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="direct_debit_rate_value" stringToNumber2 class="form-control" ng-model="rate.rate_value"
min="0" max="5" step="0.1" id="direct_debit_rate_value_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.direct_debit_rate_value.$error" ng-if="rate_form.rate_value.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No more than 5.0%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0.0%
</div>
<div class="small text-danger" ng-message="required">
<i class="glyphicon glyphicon-alert"></i> Required Field
</div>
</div>
</div>
</div>
<!-- 新增transaction_fee -->
<div class="form-group"
ng-class="{'has-error':rate_form.transaction_fee.$invalid && rate_form.transaction_fee.$dirty}">
<label class="control-label col-sm-4" for="transaction_fee_input">Transaction Fee</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="Transaction_fee_value" stringToNumber2 class="form-control" ng-model="rate.transaction_fee"
min="0" step="0.1" id="transaction_fee_input" required>
<div class="input-group-addon">$</div>
</div>
<div ng-messages="rate_form.transaction_fee.$error" ng-if="rate_form.transaction_fee.$dirty">
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0
</div>
<div class="small text-danger" ng-message="required">
<i class="glyphicon glyphicon-alert"></i> Required Field
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-4" for="active_time_input">Active Date</label>
<div class="col-sm-6">
<input class="form-control" ng-model="rate.active_time" id="active_time_input"
uib-datepicker-popup size="10" placeholder="Active Date"
is-open="activeDate.open" ng-click="activeDate.open=true"
datepicker-options="{maxDate:rate.expiry_time}" required>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-4" for="expire_time_input">Expire Date</label>
<div class="col-sm-6">
<input class="form-control" ng-model="rate.expiry_time" id="expire_time_input"
uib-datepicker-popup size="10" placeholder="Expire Date"
is-open="expireDate.open" ng-click="expireDate.open=true"
datepicker-options="{minDate:rate.active_time}" required>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-4" for="remark_text">Remark</label>
<div class="col-sm-6">
<input class="form-control" ng-model="rate.remark" id="remark_text" type="text">
</div>
</div>
</form>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-success" type="button" ng-click="saveRate(rate_form)" ng-disabled="ctrl.sending">Submit</button>
<button class="btn btn-danger" type="button" ng-click="$dismiss()">Cancel</button>
</div>

@ -154,7 +154,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -357,6 +361,8 @@
<tr ng-repeat="trade in tradeLogs" ng-class="{warning:trade.clearing_status==2}">
<td ng-bind="trade.client_order_id||'NOT PROVIDED'"></td>
<td>
<img src="/static/images/card_payment_sign.png" uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png" uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
<img src="/static/images/wechatpay_sign.png" uib-tooltip="Znyoo" ng-if="trade.channel=='Znyoo'"/>
<img src="/static/images/wechatpay_sign.png" uib-tooltip="WechatPay" ng-if="trade.channel=='Wechat'"/>
<img src="/static/images/bestpay_sign.png" uib-tooltip="BestPay" ng-if="trade.channel=='Bestpay'"/>

@ -242,6 +242,19 @@
</div>
</div>
<div class="form-group col-sm-4">
<label class="col-xs-6 control-label">Card Payment|银行卡支付</label>
<div class="col-xs-6">
<input type="checkbox" ng-model="paymentInfo.enable_rpaypmt_card" bs-switch switch-change="toggleChannel('rpaypmt_card')">
</div>
</div>
<div class="form-group col-sm-4">
<label class="col-xs-6 control-label">Direct Debit|银行账户支付</label>
<div class="col-xs-6">
<input type="checkbox" ng-model="paymentInfo.enable_rpaypmt_dd" bs-switch switch-change="toggleChannel('rpaypmt_dd')">
</div>
</div>
</div>
</div>
</div>
@ -591,6 +604,16 @@
switch-change="toggleRequireRemark()">
</div>
</div>
<div class="form-group" ng-if="'1000000000111'|withRole">
<label class="col-sm-2 control-label">Bill Code Version</label>
<div class="col-sm-2">
<select class="form-control" ng-change="changeBillCodeVersion()" ng-model="paymentInfo.billcode_version"
title="Payment Page">
<option value="v1">v1</option>
<option value="v2">v2</option>
</select>
</div>
</div>
</div>
</div>
</div>

@ -14,7 +14,9 @@
</div>
<div class="form-group"
ng-class="{'has-error':rate_form.rate_value.$invalid && rate_form.rate_value.$dirty}">
<label class="control-label col-sm-4" for="rate_value_input">Rate Value</label>
<label class="control-label col-sm-4" for="rate_value_input">
<span ng-if="rate.rate_name=='rpaypmt_card'">Domestic </span>
Rate Value</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="rate_value" class="form-control" ng-model="rate.rate_value"
@ -22,9 +24,6 @@
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.rate_value.$error" ng-if="rate_form.rate_value.$dirty">
<!--<div class="small text-danger" ng-message="max">-->
<!--<i class="glyphicon glyphicon-alert"></i> No more than 2.2%-->
<!--</div>-->
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0.6%
</div>
@ -35,6 +34,29 @@
</div>
</div>
<div class="form-group" ng-if="rate.rate_name=='rpaypmt_card'"
ng-class="{'has-error':rate_form.international_rate_value.$invalid && rate_form.international_rate_value.$dirty}">
<label class="control-label col-sm-4" for="international_rate_value_input">International Rate Value</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="international_rate_value" stringToNumber2 class="form-control" ng-model="rate.ext_rates.overseas_rate_value"
min="0" max="5" step="0.1" id="international_rate_value_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.international_rate_value.$error" ng-if="rate_form.international_rate_value.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No more than 5.0%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0.0%
</div>
<div class="small text-danger" ng-message="required">
<i class="glyphicon glyphicon-alert"></i> Required Field
</div>
</div>
</div>
</div>
<!-- 新增transaction_fee字段 -->
<div class="form-group"
ng-class="{'has-error':rate_form.transaction_fee.$invalid && rate_form.transaction_fee.$dirty}">
@ -46,9 +68,6 @@
<div class="input-group-addon">$</div>
</div>
<div ng-messages="rate_form.transaction_fee.$error" ng-if="rate_form.transaction_fee.$dirty">
<!--<div class="small text-danger" ng-message="max">-->
<!--<i class="glyphicon glyphicon-alert"></i> No more than 2.2%-->
<!--</div>-->
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No less than 0
</div>
@ -78,7 +97,9 @@
datepicker-options="{minDate:rate.active_time}">
</div>
</div>
<div class="form-group" ng-if="rate.rate_name=='Wechat'">
<div class="form-group" ng-if="rate.rate_name=='Wechat'
|| rate.rate_name=='rpaypmt_card'
|| rate.rate_name=='rpaypmt_dd'">
<label class="control-label col-sm-4" for="clean_days_input">Clean Days</label>
<div class="col-sm-6">
<div class="input-group">
@ -100,4 +121,4 @@
<div class="modal-footer">
<button class="btn btn-success" type="button" ng-click="saveRate()" ng-disabled="ctrl.sending">Submit</button>
<button class="btn btn-danger" type="button" ng-click="$dismiss()">Cancel</button>
</div>
</div>

@ -95,53 +95,100 @@
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<h3 class="box-title pull-left">
Rpay+ Sub Merchant Id : {{partner.rpay_enterprise_id}}
<i class="fa fa-clock-o text-danger" title="Using temp Sub Merchant ID" ng-if="partner.temp_sub_merchant"></i>
<h3 class="box-title pull-left" >
Merchant Warrior Sub Merchant Id :
<span ng-if="partner.cardInfo.rpMerchantId">
<span ng-if="partner.cardInfo.available" style="color:green;">审核通过</span>
<span ng-if="!partner.cardInfo.available && partner.cardInfo.pending" style="color:#f39c12;">审核中</span>
<span ng-if="!partner.cardInfo.available && !partner.cardInfo.pending" style="color:red;">打回</span>
({{partner.cardInfo.rpMerchantId}})</span>
<span ng-if="!partner.cardInfo">未申请</span>
</h3>
<button role="button" ng-if="!partner.rpay_enterprise_id" class="btn btn-info pull-right" title="Apply Sub Merchant Id"
ng-click="applyRpaySubMerchantId()">
<button role="button" class="btn btn-info pull-right" title="Apply MW Sub Merchant Id"
ng-click="applyMWSubMerchantId()">
<i class="fa fa-plus"></i>
Apply Sub Merchant Id
Apply Merchant Warrior Sub Merchant Id
</button>
</div>
</div>
<div class="box">
<div class="box-header">
<h3 class="box-title">List of Sub Merchant Id</h3>
</div>
<div class="box-body col-sm-6" ng-repeat="id_apply in subRpayMerchantInfos">
<ul class="list-group ui_desk">
<li class="list-group-item list-group-item-success">
<b>Sub Merchant Id</b>
<b style="float: right"><span
ng-if="partner.rpay_enterprise_id == id_apply.sub_merchant_id"><small
class="text-red">(当前使用)</small></span>{{id_apply.sub_merchant_id}}</b>
</li>
<li class="list-group-item list-group-item-success">
Apply Time
<span style="float: right" ng-bind="id_apply.create_time"></span>
</li>
<li class="list-group-item list-group-item-success">
Company Short Name
<span style="float:right;">{{id_apply.merchant_shortname | cut:true:20:' ...'}}</span>
</li>
<li class="list-group-item list-group-item-success">
Business Category
<span style="float: right">{{id_apply.business_category | partner_royalpay_industry}}</span>
</li>
<li class="list-group-item list-group-item-success">
Operator
<span style="float: right" ng-bind="id_apply.operator"></span>
</li>
</ul>
<div class="box_desk">
<div class="content_button">
<button role="button" class="btn btn-info" title="use"
ng-click="useRpaySubMerchantId(id_apply.sub_merchant_id)">
USE
</button>
</div>
<div class="box">
<div class="box-body col-sm-6">
<ul class="list-group ui_desk">
<li class="list-group-item list-group-item-success">
<b>Sub Merchant Id</b>
<b style="float: right">
{{partner.cardInfo.rpMerchantId}}</b>
</li>
<li class="list-group-item list-group-item-success">
Name
<span style="float: right" ng-bind="partner.cardInfo.name"></span>
</li>
<li class="list-group-item list-group-item-success">
Company Name
<span style="float:right;">{{partner.cardInfo.company_name}}</span>
</li>
<li class="list-group-item list-group-item-success">
Address
<span style="float: right">{{partner.cardInfo.address}}</span>
</li>
<li class="list-group-item list-group-item-success">
Suburb
<span style="float: right;">{{partner.cardInfo.suburb}}</span>
</li>
<li class="list-group-item list-group-item-success">
Postcode
<span style="float: right" ng-bind="partner.cardInfo.postcode"></span>
</li>
<li class="list-group-item list-group-item-success" style="text-align: center" ng-if="!showMoreMerchantInfo" ng-click="hideMerchantInfo()">
<span> More.....</span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
State
<span style="float: right" ng-bind="partner.cardInfo.state"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Abn
<span style="float: right" ng-bind="partner.cardInfo.abn"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Email
<span style="float: right" ng-bind="partner.cardInfo.email"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Contact Name
<span style="float: right" ng-bind="partner.cardInfo.contact_name"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Phone
<span style="float: right" ng-bind="partner.cardInfo.phone"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
BSB
<span style="float: right" ng-bind="partner.cardInfo.bsb"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Account No
<span style="float: right" ng-bind="partner.cardInfo.accountNo"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Account Name
<span style="float: right" ng-bind="partner.cardInfo.accountName"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Website
<span style="float: right" ng-bind="partner.cardInfo.website"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Timezone
<span style="float: right" ng-bind="partner.cardInfo.timezone"></span>
</li>
<li class="list-group-item list-group-item-success" ng-if="showMoreMerchantInfo">
Category
<span style="float: right" ng-bind="partner.cardInfo.category|partner_royalpay_industry"></span>
</li>
<li class="list-group-item list-group-item-success" style="text-align: center" ng-if="showMoreMerchantInfo" ng-click="hideMerchantInfo()">
<span> Hide.....</span>
</li>
</ul>
</div>
</div>
</div>
@ -150,72 +197,135 @@
</div>
</div>
<div class="content">
<div class="row">
<div class="col-sm-12">
<div class="box-solid">
<div class="box box-warning">
<div class="box-header">
<h3 class="box-title pull-left">
Yeepay Sub Merchant Id : {{partner.yeepay_sub_merchant_id}}
</h3>
<button role="button" class="btn btn-info pull-right" title="Apply Sub Merchant Id"
ng-click="applyYeepaySubMerchantId()">
<i class="fa fa-plus"></i>
Apply Sub Merchant Id
</button>
<button role="button" class="btn btn-success pull-right" title="Add Sub Merchant Id"
ng-click="addYeepaySubMerchantId()">
<i class="fa fa-plus"></i>
Add Sub Merchant Id
</button>
</div>
</div>
<div class="box">
<div class="box-header">
<h3 class="box-title">List of Sub Merchant Id</h3>
</div>
<div class="box-body col-sm-6" ng-repeat="id_apply in subYeepayMerchantInfos">
<ul class="list-group ui_desk">
<li class="list-group-item list-group-item-success">
<b>Sub Merchant Id</b>
<b style="float: right"><span
ng-if="partner.yeepay_sub_merchant_id == id_apply.sub_merchant_id"><small
class="text-red">(当前使用)</small></span>{{id_apply.sub_merchant_id}}</b>
</li>
<li class="list-group-item list-group-item-success">
Apply Time
<span style="float: right" ng-bind="id_apply.create_time"></span>
</li>
<li class="list-group-item list-group-item-success">
Business Content
<span style="float:right;">{{id_apply.business_content | yeepayBusinessContent}}</span>
</li>
<li class="list-group-item list-group-item-success">
Business Category
<span style="float: right">{{id_apply.industry | yeepayIndustry}}</span>
</li>
<li class="list-group-item list-group-item-success">
Operator
<span style="float: right" ng-bind="id_apply.operator"></span>
</li>
</ul>
<div class="box_desk">
<div class="content_button">
<button role="button" class="btn btn-info" title="use"
ng-click="useYeepaySubMerchantId(id_apply.sub_merchant_id)">
USE
</button>
<button role="button" class="btn btn-info" title="update"
ng-click="updateYeepaySubMerchantId(id_apply.sub_merchant_id)" ng-if="partner.yeepay_sub_merchant_id == id_apply.sub_merchant_id">
UPDATE
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--<div class="content">-->
<!-- <div class="row">-->
<!-- <div class="col-sm-12">-->
<!-- <div class="box-solid">-->
<!-- <div class="box box-warning">-->
<!-- <div class="box-header">-->
<!-- <h3 class="box-title pull-left">-->
<!-- Rpay+ Sub Merchant Id : {{partner.rpay_enterprise_id}}-->
<!-- <i class="fa fa-clock-o text-danger" title="Using temp Sub Merchant ID" ng-if="partner.temp_sub_merchant"></i>-->
<!-- </h3>-->
<!-- <button role="button" ng-if="!partner.rpay_enterprise_id" class="btn btn-info pull-right" title="Apply Sub Merchant Id"-->
<!-- ng-click="applyRpaySubMerchantId()">-->
<!-- <i class="fa fa-plus"></i>-->
<!-- Apply Sub Merchant Id-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="box">-->
<!-- <div class="box-header">-->
<!-- <h3 class="box-title">List of Sub Merchant Id</h3>-->
<!-- </div>-->
<!-- <div class="box-body col-sm-6" ng-repeat="id_apply in subRpayMerchantInfos">-->
<!-- <ul class="list-group ui_desk">-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- <b>Sub Merchant Id</b>-->
<!-- <b style="float: right"><span-->
<!-- ng-if="partner.rpay_enterprise_id == id_apply.sub_merchant_id"><small-->
<!-- class="text-red">(当前使用)</small></span>{{id_apply.sub_merchant_id}}</b>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Apply Time-->
<!-- <span style="float: right" ng-bind="id_apply.create_time"></span>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Company Short Name-->
<!-- <span style="float:right;">{{id_apply.merchant_shortname | cut:true:20:' ...'}}</span>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Business Category-->
<!-- <span style="float: right">{{id_apply.business_category | partner_royalpay_industry}}</span>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Operator-->
<!-- <span style="float: right" ng-bind="id_apply.operator"></span>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class="box_desk">-->
<!-- <div class="content_button">-->
<!-- <button role="button" class="btn btn-info" title="use"-->
<!-- ng-click="useRpaySubMerchantId(id_apply.sub_merchant_id)">-->
<!-- USE-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->
<!--<div class="content">-->
<!-- <div class="row">-->
<!-- <div class="col-sm-12">-->
<!-- <div class="box-solid">-->
<!-- <div class="box box-warning">-->
<!-- <div class="box-header">-->
<!-- <h3 class="box-title pull-left">-->
<!-- Yeepay Sub Merchant Id : {{partner.yeepay_sub_merchant_id}}-->
<!-- </h3>-->
<!-- <button role="button" class="btn btn-info pull-right" title="Apply Sub Merchant Id"-->
<!-- ng-click="applyYeepaySubMerchantId()">-->
<!-- <i class="fa fa-plus"></i>-->
<!-- Apply Sub Merchant Id-->
<!-- </button>-->
<!-- <button role="button" class="btn btn-success pull-right" title="Add Sub Merchant Id"-->
<!-- ng-click="addYeepaySubMerchantId()">-->
<!-- <i class="fa fa-plus"></i>-->
<!-- Add Sub Merchant Id-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="box">-->
<!-- <div class="box-header">-->
<!-- <h3 class="box-title">List of Sub Merchant Id</h3>-->
<!-- </div>-->
<!-- <div class="box-body col-sm-6" ng-repeat="id_apply in subYeepayMerchantInfos">-->
<!-- <ul class="list-group ui_desk">-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- <b>Sub Merchant Id</b>-->
<!-- <b style="float: right"><span-->
<!-- ng-if="partner.yeepay_sub_merchant_id == id_apply.sub_merchant_id"><small-->
<!-- class="text-red">(当前使用)</small></span>{{id_apply.sub_merchant_id}}</b>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Apply Time-->
<!-- <span style="float: right" ng-bind="id_apply.create_time"></span>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Business Content-->
<!-- <span style="float:right;">{{id_apply.business_content | yeepayBusinessContent}}</span>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Business Category-->
<!-- <span style="float: right">{{id_apply.industry | yeepayIndustry}}</span>-->
<!-- </li>-->
<!-- <li class="list-group-item list-group-item-success">-->
<!-- Operator-->
<!-- <span style="float: right" ng-bind="id_apply.operator"></span>-->
<!-- </li>-->
<!-- </ul>-->
<!-- <div class="box_desk">-->
<!-- <div class="content_button">-->
<!-- <button role="button" class="btn btn-info" title="use"-->
<!-- ng-click="useYeepaySubMerchantId(id_apply.sub_merchant_id)">-->
<!-- USE-->
<!-- </button>-->
<!-- <button role="button" class="btn btn-info" title="update"-->
<!-- ng-click="updateYeepaySubMerchantId(id_apply.sub_merchant_id)" ng-if="partner.yeepay_sub_merchant_id == id_apply.sub_merchant_id">-->
<!-- UPDATE-->
<!-- </button>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->
</div>

@ -165,7 +165,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -537,6 +541,10 @@
uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
<img src="/static/images/lakalapay_sign.png"
uib-tooltip="LakalaPay" ng-if="trade.channel=='LakalaPay'"/>
<img src="/static/images/card_payment_sign.png"
uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png"
uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
{{trade.order_id2}}<span
ng-if="trade.source!='system' && trade.source!=null && trade.incremental_surcharge != null"><i
class="fa fa-question-circle-o" uib-tooltip-html="trade.htmlTooltip"></i></span>

@ -166,7 +166,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -384,6 +388,10 @@
uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
<img src="/static/images/lakalapay_sign.png"
uib-tooltip="LakalaPay" ng-if="trade.channel=='LakalaPay'"/>
<img src="/static/images/card_payment_sign.png"
uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png"
uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
{{trade.order_id}}
</td>
<td>

@ -146,7 +146,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -341,6 +345,8 @@
<img src="/static/images/rpayplus_sign.png" uib-tooltip="RPay+" ng-if="trade.channel=='Rpay'"/>
<img src="/static/images/yeepay_sign.png" uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
<img src="/static/images/lakalapay_sign.png" uib-tooltip="LakalaPay" ng-if="trade.channel=='LakalaPay'"/>
<img src="/static/images/card_payment_sign.png" uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png" uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
{{trade.order_id}}
</td>
<td>

@ -1,3 +1,11 @@
<style>
.tradeCardInfo {
padding-left: 25%;
margin: 0;
color: gray;
}
</style>
<div class="modal-header bg-success">
<h4>Order Detail</h4>
</div>
@ -140,6 +148,19 @@
</div>
</div>
</div>
<div class="form-group" ng-if="order.channel=='rpaypmt_card' || order.channel=='rpaypmt_dd'" style="margin: 15px 6%;border: 1px dashed gray;">
<div style="text-align: center;cursor: pointer;color: grey" ng-click="hidePayerCardInfo()">
<p><label class="control-label" style="cursor: pointer">Payer Card Information</label></p>
</div>
<div ng-if="showPayerCardInfo">
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Bank: </label> {{order.card_bank}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Type: </label> {{order.card_type}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Alias: </label> {{order.card_alias}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Scheme: </label> {{order.card_scheme}}</p>
<p class="tradeCardInfo"><label style="padding-right: 20%;">Card Country:</label> {{order.card_country}}</p>
</div>
</div>
<!--<div class="form-group">-->
<!--<label class="control-label col-xs-3">Remark</label>-->
<!--<div class="col-xs-9">-->
@ -191,4 +212,4 @@
</table>
</div>
</div>
</div>
</div>

@ -219,7 +219,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -641,6 +645,10 @@
ng-if="trade.channel=='Yeepay'"/>
<img src="/static/images/lakalapay_sign.png" uib-tooltip="LakalaPay"
ng-if="trade.channel=='LakalaPay'"/>
<img src="/static/images/card_payment_sign.png"
uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png"
uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
{{trade.order_id}}<span
ng-if="trade.source!='system' && trade.source!=null && trade.incremental_surcharge != null"><i
class="fa fa-question-circle-o" uib-tooltip-html="trade.htmlTooltip"></i></span>

@ -203,7 +203,11 @@
<a role="button" ng-class="{'bg-primary':params.channel=='YEEPAY'}"
ng-click="params.channel='YEEPAY';loadTradeLogs(1)">Yeepay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='LAKALAPAY'}"
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a>
ng-click="params.channel='LAKALAPAY';loadTradeLogs(1)">LakalaPay</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_CARD'}"
ng-click="params.channel='RPAYPMT_CARD';loadTradeLogs(1)">Card Payment</a> |
<a role="button" ng-class="{'bg-primary':params.channel=='RPAYPMT_DD'}"
ng-click="params.channel='RPAYPMT_DD';loadTradeLogs(1)">Direct Debit</a>
</p>
</div>
</div>
@ -486,6 +490,10 @@
uib-tooltip="Yeepay" ng-if="trade.channel=='Yeepay'"/>
<img src="/static/images/lakalapay_sign.png"
uib-tooltip="LakalaPay" ng-if="trade.channel=='LakalaPay'"/>
<img src="/static/images/card_payment_sign.png"
uib-tooltip="Card Payment" ng-if="trade.channel=='rpaypmt_card'"/>
<img src="/static/images/direct_debit_sign.png"
uib-tooltip="Direct Debit" ng-if="trade.channel=='rpaypmt_dd'"/>
{{trade.order_id}}<span ng-if="trade.source!='system'&& trade.source!=null && trade.incremental_surcharge != null"><i class="fa fa-question-circle-o" uib-tooltip-html="trade.htmlTooltip"></i></span>
</td>
<td>

@ -0,0 +1,47 @@
.commit-button{
width: 100%;
border-radius: 25px;
background-color: #ED2424;
color: #FFFFFF;
font-size: 16px;
line-height: 40px;
border: 0px;
margin-top: 20px;
}
label{
color: #9B9B9B;
margin-bottom: 0px;
}
.bill-info-right{
float: right;
}
.margin-body{
margin: 15px
}
.row-line-height{
height: 20px;
margin: 15px 0px 15px -15px;
}
.row-line-height-plus{
height: 60px;
line-height: 60px;
}
.border-top-line{
border-top: 1px solid #EEEEEE
}
.border-button-line{
border-bottom: 1px solid #EEEEEE;
}
#timer{
font-weight: 600;
color: #ED2424;
}

@ -0,0 +1,129 @@
body{
padding: 3% 10%;
width: 100%;
height: 100%;
margin: 0;
}
.head{
padding-bottom: 20px;
border-bottom: 2px solid #DCDCDC;
}
.pc-cash{
font-size: 28px;
position: absolute;
margin: 15px;
}
.order-box{
text-align: center;
}
.count-down{
text-align: center;
font-size: 20px;
margin: 20px;
line-height: 97px;
background-color: #FEF4F4;
}
label{
color: #ED2424;
font-size: 20px;
margin-bottom: 0px;
}
.bill-info-right{
float: right;
font-size: 20px;
font-weight: 800;
}
.margin-body{
margin: 15px
}
.row-line-height{
height: 20px;
margin: 15px 0px 15px -15px;
}
.row-line-height-plus{
height: 60px;
line-height: 60px;
}
.border-top-line{
border-top: 1px solid #EEEEEE
}
.border-button-line{
border-bottom: 1px solid #EEEEEE;
padding: 20px 5px;
}
#timer{
font-weight: 600;
color: #ED2424;
}
.info-body{
background-color: #FEF4F4;
height: 650px;
margin-top: 20px;
border-radius: 10px 10px 0px 0px;
}
.info-body-title{
background: #ED2424;
line-height: 50px;
font-size: 25px;
color: #FFF;
border-radius: 10px 10px 0px 0px;
}
.pay-fun{
font-family: PingFang-SC-Bold;
font-size: 20px;
color: #ED2424;
font-weight: 600;
margin: 50px;
}
#commit-btn{
width: 30%;
border-radius: 5px;
background-color: #ED2424;
color: #FFFFFF;
font-size: 16px;
line-height: 40px;
border: 0px;
margin: 100px 0px;
text-align: center;
}
.select-pay-fun{
text-align: center;
width: 80%;
height: 120% ;
border: 1px solid #ED2424;
padding: 10px 0px;
margin-top: 5px;
}
.no-select-pay-fun{
text-align: center;
width: 80%;
height: 120% ;
border: 1px solid #EAEAEA;
padding: 10px 0px;
margin: 5px 0px 5px 0px;
}
#qrImg{
margin-top: 40px;
}
.img-size{
height: 58px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="304.5px" height="63.5px" viewBox="0 0 304.5 63.5" enable-background="new 0 0 304.5 63.5" xml:space="preserve">
<g>
<path fill="#ED6B2C" d="M28.416,39.902"/>
</g>
<path fill="#ED6B2C" d="M48.971,50.572c0-3.301-2.532-6.009-5.758-6.29l-7.385-15.836c-0.144-0.309-0.044-0.674,0.234-0.871
c2.709-1.91,4.48-5.06,4.48-8.626c0-5.817-4.711-10.535-10.525-10.544h-0.019c-0.033,0-0.066,0.002-0.098,0.002V8.405h-11.83
c-0.388,0-0.703,0.315-0.703,0.703v4.919c0,0.388,0.315,0.703,0.703,0.703H29.9v0h0.018c2.288,0,4.236,1.779,4.318,4.065
c0.085,2.401-1.837,4.375-4.219,4.375H6.825V6.794c0-0.259-0.21-0.469-0.469-0.469H5.185C2.598,6.325,0.5,8.423,0.5,11.01v38.214
c0,0.049,0.002,0.096,0.003,0.144C0.502,49.415,0.5,49.461,0.5,49.508c0,3.718,2.748,6.794,6.325,7.304
c0.344,0.049,0.696,0.075,1.054,0.075c0.358,0,0.71-0.026,1.054-0.075c2.213-0.316,4.107-1.614,5.231-3.437
c0.693-1.111,1.094-2.419,1.094-3.82V37.948H29.9v-0.002c0.003,0,0.006,0,0.009,0c0.4,0.003,0.664-0.418,0.495-0.781l-2.392-5.136
c-0.115-0.248-0.364-0.406-0.637-0.406H9.636c-0.388,0-0.703,0.315-0.703,0.703v0.001l0,17.139c0,0.551-0.404,1.042-0.953,1.093
c-0.629,0.058-1.156-0.433-1.156-1.049V29.496h22.067c0.273,0,0.522,0.158,0.637,0.406l7.951,17.051
c-0.719,1.026-1.141,2.272-1.141,3.619c0,3.301,2.532,6.009,5.76,6.29l0.002,0.005l0.007-0.005c0.18,0.016,0.361,0.026,0.546,0.026
c2.139,0,4.027-1.064,5.17-2.689l0.009-0.005l-0.002-0.005C48.549,53.163,48.971,51.917,48.971,50.572z"/>
<path fill="#ED6B2C" d="M8.933,20.38V4.685C8.933,2.098,11.031,0,13.619,0h16.398c10.621,0.009,19.198,8.747,18.949,19.429
c-0.139,5.878-2.994,11.102-7.332,14.487c-0.282,0.22-0.696,0.122-0.847-0.202l-2.242-4.806c-0.127-0.272-0.069-0.597,0.15-0.803
c2.402-2.257,3.925-5.427,3.972-8.962c0.091-7.063-5.608-12.819-12.65-12.819H15.853c-0.329,0-0.595,0.266-0.595,0.595v13.46
c0,0.388-0.315,0.703-0.703,0.703H9.636C9.247,21.083,8.933,20.767,8.933,20.38z"/>
<g>
<path fill="#ED6B2C" d="M336.166,39.902"/>
</g>
<path fill="#ED6B2C" d="M84.512,25.763c-0.117-0.199-0.237-0.396-0.361-0.59c-0.78-1.075-2.047-1.776-3.476-1.776
c-2.373,0-4.296,1.923-4.296,4.294c0,0.792,0.213,1.534,0.59,2.172c0.021,0.037,0.047,0.077,0.07,0.117
c0.832,1.394,1.312,3.027,1.312,4.77c0,5.144-4.17,9.314-9.312,9.314c-5.144,0-9.314-4.17-9.314-9.314
c0-5.142,4.17-9.312,9.314-9.312c0.295,0,0.586,0.014,0.874,0.042c0.166,0.014,0.33,0.033,0.492,0.059
c0.084,0.005,0.169,0.007,0.255,0.007c2.371,0,4.294-1.923,4.294-4.296c0-2.071-1.466-3.8-3.418-4.205c-0.002,0-0.007,0-0.012-0.002
c-0.23-0.033-0.461-0.059-0.696-0.082c-0.588-0.059-1.185-0.089-1.79-0.089c-9.888,0-17.902,8.016-17.902,17.902
s8.014,17.902,17.902,17.902c9.886,0,17.902-8.016,17.902-17.902C86.942,31.488,86.056,28.41,84.512,25.763z"/>
<path fill="#ED6B2C" d="M115.331,17.272l-9.279,21.534l-9.33-21.536c-0.111-0.257-0.365-0.423-0.645-0.423h-7.493
c-0.337,0-0.564,0.345-0.43,0.655l13.655,30.979h0.073l-2.078,4.822c-0.393,0.912-1.291,1.503-2.284,1.503h-4.501
c-0.388,0-0.703,0.315-0.703,0.703v7.028c0,0.388,0.315,0.703,0.703,0.703h4.947c3.635,0,6.921-2.162,8.36-5.501L123.9,17.502
c0.133-0.309-0.094-0.654-0.43-0.654h-7.493C115.696,16.848,115.442,17.015,115.331,17.272z"/>
<path fill="#ED6B2C" d="M158.638,44.233V17.478c0-0.388-0.315-0.703-0.703-0.703h-15.11c-9.943,0-17.994,8.097-17.92,18.057
c0.073,9.881,8.264,17.785,18.145,17.785h0.844c2.319,0,4.199-1.88,4.199-4.199v0c0-2.319-1.88-4.199-4.199-4.199h-0.902
c-5.252,0-9.688-4.296-9.655-9.548c0.016-2.595,1.074-4.945,2.778-6.649c1.717-1.717,4.088-2.778,6.709-2.778h7.377v21.8
c0,3.105,2.517,5.622,5.622,5.622h4.45c0.259,0,0.469-0.21,0.469-0.469v-7.496c0-0.259-0.21-0.469-0.469-0.469H158.638z"/>
<path fill="#ED6B2C" d="M158.622,44.255"/>
<path fill="#ED6B2C" d="M175.502,44.233V4.87c0-0.388-0.315-0.703-0.703-0.703h-7.028c-0.388,0-0.703,0.315-0.703,0.703v39.363
v2.808c0,3.103,2.515,5.62,5.618,5.622l4.221,0.003c0.388,0,0.703-0.315,0.703-0.703v-7.028c0-0.388-0.315-0.703-0.703-0.703
H175.502z"/>
<path fill="#ED6B2C" d="M183.972,9.094v42.869c0,0.388,0.315,0.703,0.703,0.703h7.028c0.388,0,0.703-0.315,0.703-0.703V17.645
c0-0.388,0.315-0.703,0.703-0.703h13.109c4.011,0,7.262,3.251,7.262,7.262v0c0,4.011-3.251,7.262-7.262,7.262h-5.329
c-2.361,0-4.275,1.914-4.275,4.275v0c0,2.361,1.914,4.275,4.275,4.275h5.212c8.733,0,15.813-7.079,15.813-15.813v0
c0-8.733-7.079-15.813-15.813-15.813h-21.425C184.287,8.391,183.972,8.706,183.972,9.094z"/>
<path fill="#ED6B2C" d="M259.848,44.233V17.478c0-0.388-0.315-0.703-0.703-0.703h-15.11c-9.943,0-17.994,8.097-17.92,18.057
c0.073,9.881,8.264,17.785,18.145,17.785h0.844c2.319,0,4.199-1.88,4.199-4.199v0c0-2.319-1.88-4.199-4.199-4.199h-0.902
c-5.252,0-9.688-4.296-9.655-9.548c0.016-2.595,1.074-4.945,2.778-6.649c1.717-1.717,4.088-2.778,6.709-2.778h7.377v21.8
c0,3.105,2.517,5.622,5.622,5.622h4.45c0.259,0,0.469-0.21,0.469-0.469v-7.496c0-0.259-0.21-0.469-0.469-0.469H259.848z"/>
<path fill="#ED6B2C" d="M295.507,17.236l-9.279,21.534l-9.33-21.536c-0.111-0.257-0.365-0.423-0.645-0.423h-7.493
c-0.337,0-0.564,0.345-0.43,0.655l13.655,30.979h0.073l-2.078,4.822c-0.393,0.912-1.291,1.503-2.284,1.503h-4.501
c-0.388,0-0.703,0.315-0.703,0.703V62.5c0,0.388,0.315,0.703,0.703,0.703h4.947c3.635,0,6.921-2.162,8.36-5.501l17.573-40.237
c0.133-0.309-0.094-0.654-0.43-0.654h-7.493C295.871,16.811,295.618,16.978,295.507,17.236z"/>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

@ -0,0 +1,252 @@
/**
* Created by dulingling on 2020-03-25.
*/
$(document).ready(function () {
var paymentFun = '';
var selectPaymentHTML = " <img src='/static/templates/billCode/img/bill_select.png'>";
var maxtime = window.maxtime;
var hasPayment =true;//可支付
if(window.openmobilefun == 'wechat'|| window.openmobilefun == 'other'){
paymentFun = 'Wechat'
}else{
paymentFun = 'Alipay'
$(".select_wechat").empty();
$(".select_alipay").append(selectPaymentHTML);
$(".select_bank").empty();
}
setInterval(function(){
if(maxtime>0){
var countdown=document.getElementById("timer");
maxtime=maxtime-1;
var minute=parseInt(maxtime/60);
var second=parseInt(maxtime%60);
countdown.innerHTML=minute+'分'+second+'秒';
}else{
$('#commit-btn').css({"background-color":"#eee",});
hasPayment = false;
}
},1000);
$("#select_wechat").click(function(){
if(paymentFun != 'Wechat'){
paymentFun = 'Wechat'
$(".select_wechat").append(selectPaymentHTML);
$(".select_alipay").empty();
$(".select_bank").empty();
}
})
$("#select_alipay").click(function(){
if(paymentFun != 'Alipay'){
paymentFun = 'Alipay'
$(".select_wechat").empty();
$(".select_alipay").append(selectPaymentHTML);
$(".select_bank").empty();
}
})
$("#select_bank").click(function(){
if(paymentFun != 'Bank'){
paymentFun = 'Bank'
$(".select_wechat").empty();
$(".select_alipay").empty();
$(".select_bank").append(selectPaymentHTML);
}
})
$("#commit-btn").click(function () {
if(hasPayment){
if(window.openmobilefun != 'other'){
appPayment()
}
}
})
function appPayment(){
var payUrl = getShareLink();
$("#commit-btn").css({"background-color":"#eee",});
$("#commit-btn").val("订单创建中...");
hasPayment = false;
$.ajax({
url: payUrl,
method: 'get',
contentType: 'application/json',
dataType: 'json',
success: function (res) {
if(paymentFun == 'Wechat'){
if( window.openmobilefun == 'wechat'){
invokePay(res.order_id,res.jsapi);
}else{
redirectH5Payment(res.partner_order_id,res.client_moniker)
}
}
if(paymentFun == 'Alipay'){
if(window.openmobilefun == 'alipay'){
callPayment(res);
}else{
redirectH5Payment(res.partner_order_id,res.client_moniker)
}
}
if(paymentFun == 'Bank'){
cbbankPayment(res);
}
},
error: function (jqXHR) {
alert(jqXHR.responseJSON.message);
$("#commit-btn").css({"background-color":"#ED2424",});
$("#commit-btn").val("支付");
if(maxtime>0){
hasPayment = true;
}else{
hasPayment = false;
}
}
})
}
function redirectH5Payment(orderId,clientMoniker){
window.location.href='/api/v1.0/share_code/business/bills/'+clientMoniker+'/orders/'+orderId+'/pay';
}
function getShareLink(){
var paymentLink = ''
if(window.sharetype != 'app'){
//PC端扫码访问
if(paymentFun == 'Wechat'){
if(window.openmobilefun == 'wechat'){
paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/wechat/mobile';
}else{
paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Wechat';
}
}
if(paymentFun == 'Alipay'){
if(window.openmobilefun == 'alipay'){
paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/alipay/mobile';
}else{
paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Alipay';
}
}
if(paymentFun == 'Bank'){
paymentLink = '/api/v1.0/share_code/business/bills/'+window.billInfo.bill_code_id+'/cbbank/mobile?partner_moniker='+window.clientmoniker;
}
}else{
//app扫码访问
if(paymentFun == 'Wechat'){
if(window.openmobilefun == 'wechat'){
paymentLink = '/api/v1.0/share_code/bills/payment/orders/'+window.billInfo.bill_code_id+'/wechat/share_link';
}else{
paymentLink = '/api/v1.0/share_code/bills/payment/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Wechat';
}
}
if(paymentFun == 'Alipay'){
if(window.openmobilefun == 'alipay'){
paymentLink = '/api/v1.0/share_code/bills/payment/orders/'+window.billInfo.bill_code_id+'/alipay/share_link'
}else{
paymentLink = '/api/v1.0/share_code/bills/payment/'+window.billInfo.bill_code_id+'/alipay/mobile/redirectApp?priorityChannel=Alipay';
}
}
if(paymentFun == 'Bank'){
paymentLink = '/api/v1.0/share_code/bills/payment/orders/'+window.billInfo.bill_code_id+'/cbbank/share_link?partner_moniker='+window.clientmoniker;
}
}
return paymentLink;
}
//微信支付方式
function invokePay(orderId,paydata) {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
'appId': paydata.appId,
'timeStamp': paydata.timeStamp,
'nonceStr': paydata.nonceStr,
'package': paydata.package,
'signType': paydata.signType,
'paySign': paydata.paySign
}, function (res) {
var redirect = "/api/payment/v1.0/wechat_jsapi_payment/partners/" + window.clientmoniker + "/orders/" + orderId+"?";
if (res.err_msg == 'get_brand_wcpay_request:ok') {
startCheckOrder(orderId,redirect + (redirect.indexOf('?') < 0 ? '?' : '&') + 'success=true')
} else {
if (res.err_msg == 'get_brand_wcpay_request:cancel') {
hasPayment = true;
$("#commit-btn").css({"background-color":"#ED2424",});
$("#commit-btn").val("支付");
}
if( res.err_msg == 'get_brand_wcpay_request:fail'){
hasPayment = true;
$("#commit-btn").css({"background-color":"#ED2424",});
$("#commit-btn").val("支付");
location.href = redirect + (redirect.indexOf('?') < 0 ? '?' : '&') + 'success=false';
}
}
})
}
//支付宝支付方式
function callPayment(paydata) {
try {
if(typeof paydata.trade_no == 'undefined'){
window.location.href = paydata.mweb_url
}else {
AlipayJSBridge.call('tradePay', {
tradeNO: paydata.trade_no
}, function (res) {
if (res.resultCode == '9000') {
AlipayJSBridge.call('startApp', {
appId: '20000056',
param: {
actionType: 'showSuccPage',
payResult: res.result
},
closeCurrentApp: false
});
startCheckOrder(paydata.order_id, '/api/v1.0/alipay_direct/partners/' + window.clientmoniker + '/orders/' + paydata.order_id + '/result');
} else {
hasPayment = true;
$("#commit-btn").css({"background-color": "#ED2424",});
$("#commit-btn").val("支付");
}
})
}
} catch (err) {
alert(err);
$('#wdiv').hide();
}
}
//银联支付方式
function cbbankPayment(res){
if('SUCCESS' !== res.return_code && typeof res.return_code !== 'undefined'){
$("#commit-btn").css({"background-color":"#ED2424",});
if(maxtime>0){
hasPayment = true;
}else{
hasPayment = false;
}
}else {
location.href = res.pay_url;
}
}
//调用查询订单状态方法
function startCheckOrder(orderId, url) {
function checkOrderStd() {
$.ajax({
url: '/api/v1.0/payment/orders/' + orderId + '/status',
method: 'GET',
dataType: 'json',
success: function (res) {
if (res.paid) {
location.href = url;
} else {
setTimeout(checkOrderStd, 500);
}
}
})
}
checkOrderStd();
}
});

@ -0,0 +1,159 @@
/**
* Created by dulingling on 2020-03-25.
*/
$(document).ready(function () {
var paymentFun = 'Wechat';
var maxtime = window.maxtime;
var hasPayment =true;//可支付
if(document.documentElement.clientWidth<500){
$('.img-size').css({"height":"28px",})
}
if(window.clientInfo.enable_wechat){
var paymentFun = 'Wechat';
showQRcode();
}else if(window.clientInfo.enable_alipay){
var paymentFun = 'Alipay';
showQRcode();
}else if(window.clientInfo.enable_cb_bankpay){
var paymentFun = 'Bank';
showQRcode();
}
startCheckOrder();
setInterval(function(){
if(maxtime>0){
var countdown=document.getElementById("timer");
maxtime=maxtime-1;
var minute=parseInt(maxtime/60);
var second=parseInt(maxtime%60);
countdown.innerHTML=minute+'分'+second+'秒';
}else{
hasPayment = false;
$('#qrImg').empty();
}
},1000);
$("#select_wechat").click(function(){
if(paymentFun != 'Wechat'){
paymentFun = 'Wechat'
$("#select_wechat").removeClass("no-select-pay-fun").addClass("select-pay-fun");
$("#select_alipay").removeClass("select-pay-fun").addClass("no-select-pay-fun");
$("#select_bank").removeClass("select-pay-fun").addClass("no-select-pay-fun");
showQRcode();
}
})
$("#select_alipay").click(function(){
if(paymentFun != 'Alipay'){
paymentFun = 'Alipay'
$("#select_wechat").removeClass("select-pay-fun").addClass("no-select-pay-fun");
$("#select_alipay").removeClass("no-select-pay-fun").addClass("select-pay-fun");
$("#select_bank").removeClass("select-pay-fun").addClass("no-select-pay-fun");
showQRcode();
}
})
$("#select_bank").click(function(){
if(paymentFun != 'Bank'){
paymentFun = 'Bank'
$("#select_wechat").removeClass("select-pay-fun").addClass("no-select-pay-fun");
$("#select_alipay").removeClass("select-pay-fun").addClass("no-select-pay-fun");
$("#select_bank").removeClass("no-select-pay-fun").addClass("select-pay-fun");
showQRcode();
}
})
function showQRcode() {
if (hasPayment) {
var payUrl = '';
var orderId = window.clientmoniker + dateFormat() + String(Math.random()).substring(2, 8).toUpperCase();
var channelName = paymentFun == 'Wechat' ? '微信' : '支付宝'
if (paymentFun == 'Wechat') {
$('#qrImg').empty();
document.getElementById("qrImg").style.display = 'block';
var selectPaymentHTML =
"<p style='font-size: 20px;font-weight: 800'>请使用" + channelName + "客户端扫码支付</p>" +
"<img src='" + window.wechatqrcode + "'>";
$('#qrImg').append(selectPaymentHTML)
} else if (paymentFun == 'Alipay') {
$('#qrImg').empty();
document.getElementById("qrImg").style.display = 'block';
var selectPaymentHTML =
"<p style='font-size: 20px;font-weight: 800'>请使用" + channelName + "客户端扫码支付</p>" +
"<img src='" + window.alipayqrcode + "'>";
$('#qrImg').append(selectPaymentHTML)
} else if (paymentFun == 'Bank') {
$('#qrImg').empty();
document.getElementById("qrImg").style.display = 'block';
if( hasPayment){
createCBBankOrder();
}
}
}
}
function createCBBankOrder() {
$.ajax({
url: window.cbbankpaymentlink,
method: 'get',
contentType: 'application/json',
dataType: 'json',
success: function (res) {
cbbankPayment(res);
},
error: function (jqXHR) {
alert(jqXHR.responseJSON.message);
if(maxtime>0){
hasPayment = true;
}else{
hasPayment = false;
}
}
})
}
function cbbankPayment(res){
if('SUCCESS' !== res.return_code && typeof res.return_code !== 'undefined'){
}else {
location.href = res.pay_url;
}
}
//做个每5秒查询查询一次订单状态
function startCheckOrder(orderId) {
//通知URL
function checkOrderStd() {
$.ajax({
url: '/api/v1.0/payment/billOrder/' + window.billInfo.client_order_id + '/status',
method: 'GET',
dataType: 'json',
success: function (res) {
if (res.paid) {
location.href = res.redirect;
} else {
setTimeout(checkOrderStd, 500);
}
}
})
}
checkOrderStd();
}
function dateFormat() {
var date = new Date();
var formatTimeStr = '';
formatTimeStr += date.getFullYear();
formatTimeStr += date.getMonth()+1;
formatTimeStr += date.getDate();
formatTimeStr += date.getHours();
formatTimeStr += date.getMinutes();
formatTimeStr += date.getSeconds();
return formatTimeStr;
}
});

@ -1,6 +1,9 @@
$(function () {
let $container = $('.card-input-box')[0];
let ctrl = {ready: false, pending: false}
let cardFrame = window.channel_account_id ? new TokenInputFrame($container, window.channel_account_id) : new CardInputFrame($container);
let $errorMsgBox = $('#errorMsgBox');
let loading = $('.loading-container');
cardFrame.onSuccess = function (secretData) {
$.ajax({
url: 'commit',
@ -11,10 +14,12 @@ $(function () {
startCheckOrder(window.client_moniker, window.partner_order_id);
},
error: function (jqXHR) {
ctrl.pending = false;
loading.addClass('hide')
let errorText = jqXHR.responseText;
let err = JSON.parse(errorText);
if(err){
$('#errorMsgBox').text(err.message).show();
if (err) {
$errorMsgBox.text(err.message).show();
}
}
})
@ -25,13 +30,31 @@ $(function () {
border: 'none',
borderRadius: '10px'
};
cardFrame.onReady = function () {
$('#readyModal').hide();
$('#payBtn').removeAttr('disabled');
ctrl.ready = true;
loading.addClass('hide');
};
cardFrame.onError = function (msg) {
$('#errorMsgBox').text(msg).show();
$errorMsgBox.text(msg).show();
ctrl.pending = false;
loading.addClass('hide')
};
cardFrame.show();
$('#payBtn').click(function () {
$('#errorMsgBox').hide();
if (!ctrl.ready) {
$errorMsgBox.text('Loading...').show();
return;
}
if (ctrl.pending) {
$errorMsgBox.text('Pending...').show();
return;
}
ctrl.pending = true;
loading.removeClass('hide');
$errorMsgBox.hide();
cardFrame.commit();
});
@ -51,6 +74,10 @@ $(function () {
})
}
if (ctrl.checking) {
return;
}
ctrl.checking = true;
checkOrderStd();
}
});

@ -219,9 +219,9 @@ public class GatewayApplicationMerchantDemoTest {
@Test
public void updateFile() throws Exception{
String originUrl = "https://sandbox.royalpay.com.au/api/v1.0/org_gateway/partners/" + SHORTID + "/attachment/files";
String originUrl = "http://127.0.0.1:9002/attachment/secret_files";
String url = addSignUrl(originUrl, null, SPDEMOPRIKEY);
File file = new File("/Users/1/Downloads/banner_eshop.jpg");
File file = new File("/Users/luoyang/Downloads/banner_eshop.jpg");
InputStream stream = new FileInputStream(file);
HttpRequestGenerator gen = new HttpRequestGenerator(url, RequestMethod.POST);
gen.setTimeout(10000);

Loading…
Cancel
Save