Merge remote-tracking branch 'origin/develop' into develop

master
dalong306 4 years ago
commit 08e507bdfa

@ -9,10 +9,11 @@
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>manage</artifactId> <artifactId>manage</artifactId>
<version>2.3.78</version> <version>2.3.80</version>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jib-maven-plugin.version>2.4.0</jib-maven-plugin.version> <jib-maven-plugin.version>2.4.0</jib-maven-plugin.version>
<yixsoft-batis.version>1.0.12</yixsoft-batis.version>
</properties> </properties>
<dependencies> <dependencies>

@ -327,7 +327,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
@Resource @Resource
private SysClientUpayProfileMapper sysClientUpayProfileMapper; private SysClientUpayProfileMapper sysClientUpayProfileMapper;
@Resource @Resource
private PaymentApi paymentApi; private PaymentApi paymentApi;
@Resource @Resource
private MerchantChannelPermissionManager merchantChannelPermissionManager; private MerchantChannelPermissionManager merchantChannelPermissionManager;
@ -551,7 +551,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
} }
client.put("enable_alipayplus", false); client.put("enable_alipayplus", false);
MerchantChannelPermissionResolver resolver = this.paymentApi.channelApi(PayChannel.ALIPAY_PLUS.getChannelCode()).getChannelPermissionResolver(); MerchantChannelPermissionResolver resolver = this.paymentApi.channelApi(PayChannel.ALIPAY_PLUS.getChannelCode()).getChannelPermissionResolver();
if(!Objects.isNull(resolver)) { if (!Objects.isNull(resolver)) {
if (resolver.newOrderEnabled(client)) { if (resolver.newOrderEnabled(client)) {
client.put("enable_alipayplus", true); client.put("enable_alipayplus", true);
} }
@ -1371,6 +1371,15 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
public void sendInitEmail(final JSONObject client, String username, String pwd, boolean isUpayAuditPass) { public void sendInitEmail(final JSONObject client, String username, String pwd, boolean isUpayAuditPass) {
logger.debug("sending email after comply"); logger.debug("sending email after comply");
// 配置了部分组织不发送邮件
JSONObject sysConfig = sysConfigManager.getSysConfig();
String[] orgs = sysConfig.getString("no_send_email_org").split(",");
for (String org : orgs) {
if (client.getString("org_id").equals(org)) {
logger.info("Merchant of organization does not send email.(org_id:" + org + ")");
return;
}
}
List<JSONObject> bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); List<JSONObject> bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date());
Context ctx = new Context(); Context ctx = new Context();
ctx.setVariable("bds", bds); ctx.setVariable("bds", bds);
@ -1572,7 +1581,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
@Override @Override
public void switchChannelPermission(JSONObject manager, String clientMoniker, String channel, boolean allow) { public void switchChannelPermission(JSONObject manager, String clientMoniker, String channel, boolean allow) {
for (PaymentChannelApi channelApi : paymentApi.channels()) { for (PaymentChannelApi channelApi : paymentApi.channels()) {
if (channelApi.channel().equalsIgnoreCase(channel) ) { if (channelApi.channel().equalsIgnoreCase(channel)) {
JSONObject client = getClientInfoByMoniker(clientMoniker); JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) { if (client == null) {
throw new NotFoundException("Client Not Exists"); throw new NotFoundException("Client Not Exists");
@ -1581,7 +1590,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
try { try {
clientModifySupport.processModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), allow)); clientModifySupport.processModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), allow));
} catch (Exception e) { } catch (Exception e) {
logger.error("Failed to change channel switch:{}" ,channel); logger.error("Failed to change channel switch:{}", channel);
} }
logger.info("{}({}) switched client {} channel {} to {}", manager.getString("display_name"), manager.getString("manager_id"), clientMoniker, channel, allow); logger.info("{}({}) switched client {} channel {} to {}", manager.getString("display_name"), manager.getString("manager_id"), clientMoniker, channel, allow);
if (allow && (StringUtils.equalsAnyIgnoreCase("Wechat", channel) || StringUtils.equalsAnyIgnoreCase("Alipay", channel))) { if (allow && (StringUtils.equalsAnyIgnoreCase("Wechat", channel) || StringUtils.equalsAnyIgnoreCase("Alipay", channel))) {
@ -2004,14 +2013,33 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
configNewClientRate(config, clientId, "AlipayOnline", "alipayonline_rate_value", org, "min_alipayonline_rate"); configNewClientRate(config, clientId, "AlipayOnline", "alipayonline_rate_value", org, "min_alipayonline_rate");
configNewClientRate(config, clientId, "Rpay", "Rpay_rate_value", org, "min_Rpay_rate"); configNewClientRate(config, clientId, "Rpay", "Rpay_rate_value", org, "min_Rpay_rate");
configNewClientRate(config, clientId, "CB_BankPay", "cb_bankpay_rate_value", org, "min_cb_bankpay_rate"); configNewClientRate(config, clientId, "CB_BankPay", "cb_bankpay_rate_value", org, "min_cb_bankpay_rate");
addAlipayPlusRateConfig(config, clientId, PayChannel.ALIPAY_PLUS.getChannelCode());
}
private void addAlipayPlusRateConfig(JSONObject config, int clientId, String channel) {
if (config.getString("alipay_cn_retail") != null) {
config.put("pay_type", "alipay_cn_retail");
configNewClientRate(config, clientId, channel, "alipay_cn_retail", null, null);
}
if (config.getString("alipay_cn_online") != null) {
config.put("pay_type", "alipay_cn_online");
configNewClientRate(config, clientId, channel, "alipay_cn_online", null, null);
}
if (config.getString("alipay_other") != null) {
config.put("pay_type", "alipay_other");
configNewClientRate(config, clientId, channel, "alipay_other", null, null);
}
config.remove("pay_type");
} }
private void configNewClientRate(JSONObject config, int clientId, String channel, String rateKey, JSONObject org, String rateValueKey) { private void configNewClientRate(JSONObject config, int clientId, String channel, String rateKey, JSONObject org, String rateValueKey) {
if (config.containsKey(rateKey)) { if (config.containsKey(rateKey)) {
JSONObject newConfig = new JSONObject(); JSONObject newConfig = new JSONObject();
newConfig.putAll(config); newConfig.putAll(config);
newConfig.put("rate_value", config.getBigDecimal(rateKey)); newConfig.put("rate_value", config.getBigDecimal(rateKey));
newConfig.put("rate_name", channel); newConfig.put("rate_name", channel);
newConfig.put("pay_type", config.getString("pay_type"));
if (!clientRateMapper.listClientRatesForSaving(clientId, config.getDate("active_time"), config.getDate("expiry_time"), config.getBigDecimal("rate_value"), config.getInteger("clean_days"), channel).isEmpty()) { if (!clientRateMapper.listClientRatesForSaving(clientId, config.getDate("active_time"), config.getDate("expiry_time"), config.getBigDecimal("rate_value"), config.getInteger("clean_days"), channel).isEmpty()) {
return; return;
} }
@ -2024,10 +2052,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
newConfig.put("ext_rates", extRateParams.toJSONString()); newConfig.put("ext_rates", extRateParams.toJSONString());
} else { } else {
List<JSONObject> existRate = clientRateMapper.listCurrentClientRates(clientId, config.getDate("active_time"), channel); List<JSONObject> existRate = clientRateMapper.listCurrentClientRates(clientId, config.getDate("active_time"), channel);
for (JSONObject rateLog : existRate) { existRate.stream().filter(existConfig -> {
rateLog.put("expiry_time", DateUtils.addDays(config.getDate("active_time"), -1)); if (existConfig.getDate("active_time").equals(config.getDate("active_time")) && existConfig.getDate("expiry_time").equals(config.getDate("expiry_time"))) {
clientRateMapper.updateConfig(rateLog); return false;
} }
return true;
}
)
.forEach((rateLog) -> {
rateLog.put("expiry_time", DateUtils.addDays(config.getDate("active_time"), -1));
clientRateMapper.updateConfig(rateLog);
});
} }
if ("cb_bankpay".equalsIgnoreCase(channel)) { if ("cb_bankpay".equalsIgnoreCase(channel)) {
if (newConfig.getBigDecimal("cb_bankpay_rate_value") != null) { if (newConfig.getBigDecimal("cb_bankpay_rate_value") != null) {
@ -5800,16 +5835,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
throw new InvalidShortIdException(); throw new InvalidShortIdException();
} }
checkOrgPermission(manager, client); checkOrgPermission(manager, client);
AlipayMerchantEntity alipayMch = merchantChannelApplicationManager.getRegister(AlipayRetailApi.class).findMerchant(client); try {
Element resultElement = alipayMch.getRawResponseXml(); AlipayMerchantEntity alipayMch = merchantChannelApplicationManager.getRegister(AlipayRetailApi.class).findMerchant(client);
if (!StringUtils.equalsIgnoreCase("T", resultElement.elementText("is_success"))) { Element responseElement = alipayMch.getRawResponseXml();
return "查询成功:" + resultElement.elementText("error"); String rejectReason = responseElement.elementText("reject_reason");
return "查询成功:" + responseElement.elementText("secondary_merchant_id") +
"报备状态:" + responseElement.elementText("status") + StringUtils.defaultString(rejectReason, "");
}catch (BadRequestException e){
logger.error(e.getMessage(),e);
return e.getMessage();
} }
Element responseElement = resultElement.element("response").element("alipay");
String rejectReason = responseElement.elementText("reject_reason");
return "查询成功:" + responseElement.elementText("secondary_merchant_id") +
"报备状态:" + responseElement.elementText("status") + StringUtils.defaultString(rejectReason, "");
} }
@Override @Override
@ -5940,17 +5975,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
if (client == null) { if (client == null) {
throw new InvalidShortIdException(); throw new InvalidShortIdException();
} }
AlipayConfig.AlipayMerchant mch = AlipayEnvironment.getEnv().getAlipayOnlineMerchant(); try {
AlipayMerchantEntity entity = merchantChannelApplicationManager.getRegister(AlipayOnlineApi.class) AlipayMerchantEntity entity = merchantChannelApplicationManager.getRegister(AlipayOnlineApi.class)
.findMerchant(client); .findMerchant(client);
Element resultElement = entity.getRawResponseXml(); Element responseElement = entity.getRawResponseXml();
if (!StringUtils.equalsIgnoreCase("T", resultElement.elementText("is_success"))) { String rejectReason = responseElement.elementText("reject_reason");
return "查询成功" + resultElement.elementText("error"); return "查询成功:" + responseElement.elementText("secondary_merchant_id") +
} "报备状态:" + responseElement.elementText("status") + StringUtils.defaultString(rejectReason, "");
Element responseElement = resultElement.element("response").element("alipay"); } catch (BadRequestException e) {
String rejectReason = responseElement.elementText("reject_reason"); logger.error(e.getMessage(), e);
return "查询成功:" + responseElement.elementText("secondary_merchant_id") + return e.getMessage();
"报备状态:" + responseElement.elementText("status") + StringUtils.defaultString(rejectReason, ""); }
} }
@Override @Override

@ -10,13 +10,18 @@ import com.yixsoft.support.mybatis.utils.FieldDescription;
import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.Range;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotatedElementUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@JSONType(naming = PropertyNamingStrategy.SnakeCase) @JSONType(naming = PropertyNamingStrategy.SnakeCase)
public class DefaultClientProfile { public class DefaultClientProfile {
private final Logger logger = LoggerFactory.getLogger(getClass());
@ProfileDesc(value = "周末延迟清算", detail = "周末交易延迟到周二清算") @ProfileDesc(value = "周末延迟清算", detail = "周末交易延迟到周二清算")
private boolean weekendDelay = true; private boolean weekendDelay = true;
@ProfileDesc("手续费包含GST") @ProfileDesc("手续费包含GST")
@ -35,40 +40,46 @@ public class DefaultClientProfile {
return new ClassFieldsDescription<>(getClass()).getFields().stream() return new ClassFieldsDescription<>(getClass()).getFields().stream()
.filter(field -> !"class".equalsIgnoreCase(field.getFieldName())) .filter(field -> !"class".equalsIgnoreCase(field.getFieldName()))
.map(this::convertFieldInfo) .map(this::convertFieldInfo)
.filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private JSONObject convertFieldInfo(FieldDescription field) { private JSONObject convertFieldInfo(FieldDescription field) {
Object value = field.readField(this); try {
String fieldName = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.LOWER_UNDERSCORE).convert(field.getFieldName()); Object value = field.readField(this);
JSONObject info = new JSONObject(); String fieldName = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.LOWER_UNDERSCORE).convert(field.getFieldName());
info.put("field", fieldName); JSONObject info = new JSONObject();
info.put("value", value); info.put("field", fieldName);
Class<?> fieldType = field.getMethod().getReturnType(); info.put("value", value);
if (ClassUtils.isPrimitiveOrWrapper(fieldType)) { Class<?> fieldType = field.getMethod().getReturnType();
if (ClassUtils.isPrimitiveWrapper(fieldType)) { if (ClassUtils.isPrimitiveOrWrapper(fieldType)) {
fieldType = ClassUtils.wrapperToPrimitive(fieldType); if (ClassUtils.isPrimitiveWrapper(fieldType)) {
} fieldType = ClassUtils.wrapperToPrimitive(fieldType);
if (fieldType.equals(boolean.class)) { }
info.put("type", "checkbox"); if (fieldType.equals(boolean.class)) {
info.put("type", "checkbox");
} else {
info.put("type", "number");
}
} else { } else {
info.put("type", "number"); info.put("type", "text");
} }
} else {
info.put("type", "text");
}
ProfileDesc getterDesc = AnnotatedElementUtils.findMergedAnnotation(field.getMethod(), ProfileDesc.class); ProfileDesc getterDesc = AnnotatedElementUtils.findMergedAnnotation(field.getMethod(), ProfileDesc.class);
try { try {
ProfileDesc fieldDesc = AnnotatedElementUtils.findMergedAnnotation(getClass().getDeclaredField(field.getFieldName()), ProfileDesc.class); ProfileDesc fieldDesc = AnnotatedElementUtils.findMergedAnnotation(getClass().getDeclaredField(field.getFieldName()), ProfileDesc.class);
ProfileDesc desc = ObjectUtils.defaultIfNull(getterDesc, fieldDesc); ProfileDesc desc = ObjectUtils.defaultIfNull(getterDesc, fieldDesc);
if (desc != null) { if (desc != null) {
info.put("title", desc.value()); info.put("title", desc.value());
info.put("detail", desc.detail()); info.put("detail", desc.detail());
}
} catch (NoSuchFieldException e) {
} }
} catch (NoSuchFieldException e) { return info;
} catch (IllegalAccessException | InvocationTargetException e) {
logger.error("failed to access getter of field {}", field.getFieldName(), e);
return null;
} }
return info;
} }
public void applyToClientConfig(JSONObject client) { public void applyToClientConfig(JSONObject client) {

@ -27,6 +27,7 @@ public class OrgInfo {
private Double alipay_rate_value; private Double alipay_rate_value;
private Double wechat_rate_value; private Double wechat_rate_value;
private Double alipayonline_rate_value; private Double alipayonline_rate_value;
private Double alipayplus_rate_value;
private Double cb_bankpay_rate_value; private Double cb_bankpay_rate_value;
// private Double rpaypmt_card_rate_value; // private Double rpaypmt_card_rate_value;
//卡支付-国内卡费率配置 //卡支付-国内卡费率配置
@ -42,6 +43,7 @@ public class OrgInfo {
private String org_id; private String org_id;
private String commission_type; private String commission_type;
private Double min_wechat_rate; private Double min_wechat_rate;
private Double min_alipayplus_rate;
private Double min_alipay_rate; private Double min_alipay_rate;
private Double min_alipayonline_rate; private Double min_alipayonline_rate;
private Double min_cb_bankpay_rate; private Double min_cb_bankpay_rate;
@ -79,6 +81,22 @@ public class OrgInfo {
return param; return param;
} }
public Double getAlipayplus_rate_value() {
return alipayplus_rate_value;
}
public void setAlipayplus_rate_value(Double alipayplus_rate_value) {
this.alipayplus_rate_value = alipayplus_rate_value;
}
public Double getMin_alipayplus_rate() {
return min_alipayplus_rate;
}
public void setMin_alipayplus_rate(Double min_alipayplus_rate) {
this.min_alipayplus_rate = min_alipayplus_rate;
}
public int getIs_valid() { public int getIs_valid() {
return is_valid; return is_valid;
} }

@ -3404,6 +3404,97 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
} }
} }
$scope.complianceChangeCheck() $scope.complianceChangeCheck()
// 是否为alipayplus
$scope.isAlipayCN = true
// 修改渠道
$scope.changeAlipayPlusRateState = function (flag) {
$scope.isAlipayCN = flag
}
// 过滤渠道
$scope.isAlipayPlus = function (item) {
if ($scope.isAlipayCN) {
return item.rate_name === 'AlipayPlus' && (item.pay_type === 'alipay_cn_retail' || item.pay_type === 'alipay_cn_online')
} else {
return item.rate_name === 'AlipayPlus' && item.pay_type === 'alipay_other'
}
}
// 新增alipay+费率
$scope.newAlipayPlusRate = function () {
$uibModal
.open({
templateUrl: '/static/payment/partner/templates/partner_new_alipayplus_rate.html',
resolve: {
rate: function () {
return {
rate_name: 'AlipayPlus',
clean_days: '3',
}
},
sys_common_rate: function () {
return $http.get('/sys/partners/sys_rates')
},
clientMoniker: function () {
return $scope.partner.client_moniker
},
},
controller: [
'$scope',
'$http',
'rate',
'sys_common_rate',
'clientMoniker',
function ($scope, $http, rate, sys_common_rate, clientMoniker) {
$scope.rate = angular.copy(rate)
$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
$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) {
// switch ($scope.rate.clean_days) {
// case '1': {
// $scope.rate.alipayplus = parseFloat($scope.sysRateConfig.t1.AlipayPlus)
// break
// }
// case '2': {
// $scope.rate.alipayplus = parseFloat($scope.sysRateConfig.t2.AlipayPlus)
// break
// }
// case '3': {
// $scope.rate.alipayplus = parseFloat($scope.sysRateConfig.t3.AlipayPlus)
// break
// }
// }
// }
}
},
],
})
.result.then(function () {
$scope.getRates()
})
}
}, },
]) ])
app.controller('surchargeAccountDetailCtrl', [ app.controller('surchargeAccountDetailCtrl', [

@ -8,7 +8,7 @@
<div class="col-sm-12"> <div class="col-sm-12">
<h3>Bank Account <h3>Bank Account
<a class="small" role="button" ng-click="bankCtrl.edit=true" <a class="small" role="button" ng-click="bankCtrl.edit=true"
ng-if="!bankCtrl.edit && (('11'|withRole)||((!partner.approve_result||partner.approve_result>4) && ('111'|withRole)))"> ng-if="!bankCtrl.edit && (('11'|withRole)||((!partner.approve_result||partner.approve_result>4) && ('111'|withRole)))">
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>
</a> </a>
</h3> </h3>
@ -18,15 +18,15 @@
<label class="col-sm-4">手续费账户余额</label> <label class="col-sm-4">手续费账户余额</label>
<div class="col-sm-6" style="font-size: 25px"> <div class="col-sm-6" style="font-size: 25px">
<p>{{surcharge.balance|currency:'AUD'}}<i class="fa fa-bars" <p>{{surcharge.balance|currency:'AUD'}}<i class="fa fa-bars"
style="font-size: 15px;color: #3c8dbc;cursor: pointer;padding-left: 15px" style="font-size: 15px;color: #3c8dbc;cursor: pointer;padding-left: 15px"
ng-click="surchargeAccountDetail()"></i></p> ng-click="surchargeAccountDetail()"></i></p>
</div> </div>
</div> </div>
<div class="form-group" ng-if="partner.surcharge_mode=='distributed'"> <div class="form-group" ng-if="partner.surcharge_mode=='distributed'">
<label class="col-sm-4">允许手续费账户欠款</label> <label class="col-sm-4">允许手续费账户欠款</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="checkbox" ng-model="partner.allow_surcharge_credit" bs-switch <input type="checkbox" ng-model="partner.allow_surcharge_credit" bs-switch
switch-change="allowSurchargeCredit(partner.allow_surcharge_credit)"> switch-change="allowSurchargeCredit(partner.allow_surcharge_credit)">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -34,12 +34,12 @@
<div class="col-sm-6"> <div class="col-sm-6">
<p> <p>
<span ng-if="partner.surcharge_mode=='balance'">balance <span ng-if="partner.surcharge_mode=='balance'">balance
<i class="fa fa-sort" style="color: #3c8dbc;cursor: pointer" <i class="fa fa-sort" style="color: #3c8dbc;cursor: pointer"
ng-click="switchSurchargeMode()"></i> ng-click="switchSurchargeMode()"></i>
</span> </span>
<span ng-if="partner.surcharge_mode=='distributed'">distributed <span ng-if="partner.surcharge_mode=='distributed'">distributed
<i class="fa fa-sort" style="color: #3c8dbc;cursor: pointer" <i class="fa fa-sort" style="color: #3c8dbc;cursor: pointer"
ng-click="switchSurchargeMode()"></i> ng-click="switchSurchargeMode()"></i>
</span> </span>
<p class="text-info"> <p class="text-info">
<i class="fa fa-info"></i>启用到收支分离(distributed)模式,将使消费者支付手续费模式失效<br> <i class="fa fa-info"></i>启用到收支分离(distributed)模式,将使消费者支付手续费模式失效<br>
@ -52,28 +52,28 @@
<label class="col-sm-4">RoyalPay Pay GST</label> <label class="col-sm-4">RoyalPay Pay GST</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="checkbox" ng-model="partner.tax_in_surcharge" bs-switch <input type="checkbox" ng-model="partner.tax_in_surcharge" bs-switch
switch-change="taxInSurcharge(partner.tax_in_surcharge)"> switch-change="taxInSurcharge(partner.tax_in_surcharge)">
</div> </div>
</div> </div>
<div class="form-group" ng-if="('10'|withRole)"> <div class="form-group" ng-if="('10'|withRole)">
<label class="col-sm-4">Merchant Pay GST &ensp;<small><em>(消费者承担手续费时生效)</em></small></label> <label class="col-sm-4">Merchant Pay GST &ensp;<small><em>(消费者承担手续费时生效)</em></small></label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="checkbox" ng-model="partner.customer_tax_free" bs-switch <input type="checkbox" ng-model="partner.customer_tax_free" bs-switch
switch-change="customerTaxFree(partner.customer_tax_free)"> switch-change="customerTaxFree(partner.customer_tax_free)">
</div> </div>
</div> </div>
<div class="form-group" ng-if="'modify_skip_clear'|withFunc"> <div class="form-group" ng-if="'modify_skip_clear'|withFunc">
<label class="col-sm-4">Skip Clearing</label> <label class="col-sm-4">Skip Clearing</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="checkbox" ng-model="partner.skip_clearing" bs-switch <input type="checkbox" ng-model="partner.skip_clearing" bs-switch
switch-change="skipClearing(partner.skip_clearing)"> switch-change="skipClearing(partner.skip_clearing)">
</div> </div>
</div> </div>
<div class="form-group" ng-if="'modify_skip_clear'|withFunc"> <div class="form-group" ng-if="'modify_skip_clear'|withFunc">
<label class="col-sm-4">Pre Settle</label> <label class="col-sm-4">Pre Settle</label>
<div class="col-sm-6"> <div class="col-sm-6">
<input type="checkbox" ng-model="partner.enable_presettle" bs-switch <input type="checkbox" ng-model="partner.enable_presettle" bs-switch
switch-change="switchPreSettle(partner.enable_presettle)"> switch-change="switchPreSettle(partner.enable_presettle)">
</div> </div>
</div> </div>
<div class="form-group" ng-if="'modify_min_settle'|withFunc"> <div class="form-group" ng-if="'modify_min_settle'|withFunc">
@ -86,7 +86,7 @@
<div class="input-group" ng-if="bankCtrl.modify_min_settle"> <div class="input-group" ng-if="bankCtrl.modify_min_settle">
<div class="input-group-addon">AU$</div> <div class="input-group-addon">AU$</div>
<input class="form-control" ng-model="partner.min_settle" type="number" id="minSettleEdit" <input class="form-control" ng-model="partner.min_settle" type="number" id="minSettleEdit"
min="0"> min="0">
<div class="input-group-btn"> <div class="input-group-btn">
<button class="btn btn-danger" ng-click="bankCtrl.modify_min_settle=false"><i <button class="btn btn-danger" ng-click="bankCtrl.modify_min_settle=false"><i
class="fa fa-close"></i> class="fa fa-close"></i>
@ -114,27 +114,26 @@
<label class="col-sm-4">Settle Hour</label> <label class="col-sm-4">Settle Hour</label>
<div class="col-sm-6"> <div class="col-sm-6">
<select ng-model="partner.settle_hour" class="form-control" <select ng-model="partner.settle_hour" class="form-control"
ng-options="hour.value as hour.label for hour in settleHours" ng-options="hour.value as hour.label for hour in settleHours"
ng-change="settleHourConfig()"></select> ng-change="settleHourConfig()"></select>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="swiftcode_input">Swift Code</label> <label class="col-sm-4" for="swiftcode_input">Swift Code</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.swift_code" id="swiftcode_input" <input class="form-control bank-input" ng-model="bankaccount.swift_code" id="swiftcode_input"
required required ng-readonly="!bankCtrl.edit">
ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="bsb_no_input">BSB No</label> <label class="col-sm-4" for="bsb_no_input">BSB No</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.bsb_no" id="bsb_no_input" required <input class="form-control bank-input" ng-model="bankaccount.bsb_no" id="bsb_no_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
<div class="col-sm-2" ng-if="bankCtrl.edit"> <div class="col-sm-2" ng-if="bankCtrl.edit">
<a class="btn btn-success" role="button" ng-click="getBankInfo(bankaccount.bsb_no)"><i <a class="btn btn-success" role="button" ng-click="getBankInfo(bankaccount.bsb_no)"><i
@ -145,82 +144,81 @@
<label class="col-sm-4" for="bank_input">Bank</label> <label class="col-sm-4" for="bank_input">Bank</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.bank" id="bank_input" required <input class="form-control bank-input" ng-model="bankaccount.bank" id="bank_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="city_input">City</label> <label class="col-sm-4" for="city_input">City</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.city" id="city_input" required <input class="form-control bank-input" ng-model="bankaccount.city" id="city_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="address_input">Address</label> <label class="col-sm-4" for="address_input">Address</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.address" id="address_input" required <input class="form-control bank-input" ng-model="bankaccount.address" id="address_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="system_input">System</label> <label class="col-sm-4" for="system_input">System</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.system" id="system_input" required <input class="form-control bank-input" ng-model="bankaccount.system" id="system_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="postcode_input">Postcode</label> <label class="col-sm-4" for="postcode_input">Postcode</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.postcode" id="postcode_input" required <input class="form-control bank-input" ng-model="bankaccount.postcode" id="postcode_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="state_input">State</label> <label class="col-sm-4" for="state_input">State</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.state" id="state_input" required <input class="form-control bank-input" ng-model="bankaccount.state" id="state_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="branch_input">Branch</label> <label class="col-sm-4" for="branch_input">Branch</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.branch" id="branch_input" required <input class="form-control bank-input" ng-model="bankaccount.branch" id="branch_input" required
ng-readonly="!bankCtrl.edit"> ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="account_no_input">Account No</label> <label class="col-sm-4" for="account_no_input">Account No</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.account_no" id="account_no_input" <input class="form-control bank-input" ng-model="bankaccount.account_no" id="account_no_input"
required required ng-readonly="!bankCtrl.edit">
ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-4" for="account_name_input">Account Name</label> <label class="col-sm-4" for="account_name_input">Account Name</label>
<div class="col-sm-6"> <div class="col-sm-6">
<i class="fa fa-check-square-o check-i" aria-hidden="true" <i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i> ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" maxlength="50" ng-model="bankaccount.account_name" <input class="form-control bank-input" maxlength="50" ng-model="bankaccount.account_name"
id="account_name_input" required ng-readonly="!bankCtrl.edit"> id="account_name_input" required ng-readonly="!bankCtrl.edit">
</div> </div>
</div> </div>
<div class="btn-group"> <div class="btn-group">
@ -236,105 +234,174 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="panel panel-info">
<div class="col-sm-12"> <div class="panel-heading">
<h3>Rates <a class="text-success" role="button" <h3>Rates <a class="text-success" role="button"
ng-if="partner.rate_editable && (('11'|withRole)||((!partner.approve_result||partner.approve_result>4) && ('111'|withRole)))" ng-if="partner.rate_editable && (('11'|withRole)||((!partner.approve_result||partner.approve_result>4) && ('111'|withRole)))"
ng-click="newRate()"> ng-click="newRate()">
<i class="fa fa-plus"></i></a> <i class="fa fa-plus"></i></a>
</h3> </h3>
<ul class="nav nav-pills margin-bottom"> </div>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Wechat'}"><a role="button" <div class="panel-body">
ng-click="bankCtrl.rate_name='Wechat'">Wechat</a> <div class="row">
</li> <div class="col-sm-12">
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Alipay'}"><a role="button" <ul class="nav nav-pills margin-bottom">
ng-click="bankCtrl.rate_name='Alipay'">Alipay(Retail)</a> <li role="presentation" ng-class="{active:bankCtrl.rate_name=='Wechat'}"><a role="button"
</li> ng-click="bankCtrl.rate_name='Wechat'">Wechat</a>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='AlipayOnline'}"><a role="button" </li>
ng-click="bankCtrl.rate_name='AlipayOnline'">Alipay(Online)</a> <li role="presentation" ng-class="{active:bankCtrl.rate_name=='Alipay'}"><a role="button"
</li> ng-click="bankCtrl.rate_name='Alipay'">Alipay(Retail)</a>
<!-- <li role="presentation" ng-class="{active:bankCtrl.rate_name=='Bestpay'}"><a role="button" </li>
ng-click="bankCtrl.rate_name='Bestpay'">Bestpay</a> <li role="presentation" ng-class="{active:bankCtrl.rate_name=='AlipayOnline'}"><a role="button"
</li> ng-click="bankCtrl.rate_name='AlipayOnline'">Alipay(Online)</a>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='jd'}"><a role="button" </li>
ng-click="bankCtrl.rate_name='jd'">JDpay</a> <!-- <li role="presentation" ng-class="{active:bankCtrl.rate_name=='Bestpay'}"><a role="button"
</li>--> ng-click="bankCtrl.rate_name='Bestpay'">Bestpay</a>
<!--<li role="presentation" ng-class="{active:bankCtrl.rate_name=='hf'}"><a role="button" ng-click="bankCtrl.rate_name='hf'">HFpay</a></li>--> </li>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Rpay'}"><a role="button" <li role="presentation" ng-class="{active:bankCtrl.rate_name=='jd'}"><a role="button"
ng-click="bankCtrl.rate_name='Rpay'">Rpay+</a> ng-click="bankCtrl.rate_name='jd'">JDpay</a>
</li> </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=='hf'}"><a role="button" ng-click="bankCtrl.rate_name='hf'">HFpay</a></li>-->
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='CB_BankPay'}"><a role="button" <li role="presentation" ng-class="{active:bankCtrl.rate_name=='Rpay'}"><a role="button"
ng-click="bankCtrl.rate_name='CB_BankPay'" ng-click="bankCtrl.rate_name='Rpay'">Rpay+</a>
ng-if="sysconfig.active_channels.indexOf('CB_BankPay')!=-1">CB_BankPay</a> </li>
</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=='rpaypmt_card'}"><a role="button" <li role="presentation" ng-class="{active:bankCtrl.rate_name=='CB_BankPay'}"><a role="button"
ng-click="bankCtrl.rate_name='rpaypmt_card'">Card ng-click="bankCtrl.rate_name='CB_BankPay'"
Payment</a></li> ng-if="sysconfig.active_channels.indexOf('CB_BankPay')!=-1">CB_BankPay</a>
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_dd'}"><a role="button" </li>
ng-click="bankCtrl.rate_name='rpaypmt_dd'">Direct <li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_card'}"><a role="button"
Debit</a></li> ng-click="bankCtrl.rate_name='rpaypmt_card'">Card
<a id="addCardPaymentRate" class="btn btn-warning" style="float: right" type="button" Payment</a></li>
ng-click="newCardPaymentRates()" <li role="presentation" ng-class="{active:bankCtrl.rate_name=='rpaypmt_dd'}"><a role="button"
ng-if="(partner.card_rate_editable && ('100'|withRole)) || ('11'|withRole)"> ng-click="bankCtrl.rate_name='rpaypmt_dd'">Direct
Add Card Payment Rates Debit</a></li>
</a> <a id="addCardPaymentRate" class="btn btn-warning" style="float: right" type="button"
</ul> ng-click="newCardPaymentRates()"
<div class="table-responsive"> ng-if="(partner.card_rate_editable && ('100'|withRole)) || ('11'|withRole)">
<table class="table table-bordered"> Add Card Payment Rates
<thead> </a>
<tr> </ul>
<th>Rate Name</th> <div class="table-responsive">
<th ng-if="bankCtrl.rate_name!='rpaypmt_card'">Rate Value</th> <table class="table table-bordered">
<th ng-if="bankCtrl.rate_name=='rpaypmt_card'">Domestic Rate Value</th> <thead>
<th ng-if="bankCtrl.rate_name=='rpaypmt_card'">International Rate Value</th> <tr>
<th>Transaction Fee</th> <th>Rate Name</th>
<th>Active Time</th> <th ng-if="bankCtrl.rate_name!='rpaypmt_card'">Rate Value</th>
<th>Expire Time</th> <th ng-if="bankCtrl.rate_name=='rpaypmt_card'">Domestic Rate Value</th>
<th ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'"> <th ng-if="bankCtrl.rate_name=='rpaypmt_card'">International Rate Value</th>
Clean Days <th>Transaction Fee</th>
</th> <th>Active Time</th>
<th>Update Time</th> <th>Expire Time</th>
<th>Operator</th> <th
<th>Remark</th> ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">
<th style="text-align: center">Operation</th> Clean Days
</tr> </th>
</thead> <th>Update Time</th>
<tbody> <th>Operator</th>
<tr ng-repeat="rate in rates|filter:{rate_name:bankCtrl.rate_name}:true" <th>Remark</th>
ng-class="{'text-bold':rate.current,'success':rate.active}"> <th style="text-align: center">Operation</th>
<td ng-bind="rate.rate_name"></td> </tr>
<td ng-if="bankCtrl.rate_name!='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td> </thead>
<td ng-if="bankCtrl.rate_name=='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td> <tbody>
<td ng-if="bankCtrl.rate_name=='rpaypmt_card'" <tr ng-repeat="rate in rates|filter:{rate_name:bankCtrl.rate_name}:true"
ng-bind="rate.ext_rates.overseas_rate_value.rate + ' %/T+'+rate.ext_rates.overseas_rate_value.clean_days"></td> ng-class="{'text-bold':rate.current,'success':rate.active}">
<td ng-bind="'$ '+rate.transaction_fee"></td> <td ng-bind="rate.rate_name"></td>
<td ng-bind="rate.active_time|date:'yyyy-MM-dd'"></td> <td ng-if="bankCtrl.rate_name!='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td>
<td ng-bind="rate.expiry_time|date:'yyyy-MM-dd'"></td> <td ng-if="bankCtrl.rate_name=='rpaypmt_card'" ng-bind="rate.rate_value + ' %'"></td>
<td ng-if="rate.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'"> <td ng-if="bankCtrl.rate_name=='rpaypmt_card'"
T+{{rate.clean_days}} ng-bind="rate.ext_rates.overseas_rate_value.rate + ' %/T+'+rate.ext_rates.overseas_rate_value.clean_days">
</td> </td>
<td ng-bind="rate.update_time|date:'yyyy-MM-dd'"></td> <td ng-bind="'$ '+rate.transaction_fee"></td>
<td ng-bind="rate.operator_name||'系统生成'"></td> <td ng-bind="rate.active_time|date:'yyyy-MM-dd'"></td>
<td ng-bind="rate.remark|limitTo:20" title="{{rate.remark}}"></td> <td ng-bind="rate.expiry_time|date:'yyyy-MM-dd'"></td>
<td style="text-align: center"> <td
<a role="button" ng-click="editRate(rate)" style="padding-right: 10px;" ng-if="rate.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">
ng-if="'011'|withRole"><i class="fa fa-edit"></i></a> T+{{rate.clean_days}}
<span ng-if="(bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd') </td>
&& partner.upay_approve_result"> <td ng-bind="rate.update_time|date:'yyyy-MM-dd'"></td>
<span style="color: orange">(Promotional Offer)</span> <td ng-bind="rate.operator_name||'系统生成'"></td>
<a class="fa fa-cloud-download" target="_blank" <td ng-bind="rate.remark|limitTo:20" title="{{rate.remark}}"></td>
ng-href="/sys/partners/{{partner.client_moniker}}/export/aggregate/card_promotion_agree_pdf?rateid={{rate.client_rate_id}}"></a> <td style="text-align: center">
</span> <a role="button" ng-click="editRate(rate)" style="padding-right: 10px;"
</td> ng-if="'011'|withRole"><i class="fa fa-edit"></i></a>
</tr> <span ng-if="(bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd')
</tbody> && partner.upay_approve_result">
</table> <span style="color: orange">(Promotional Offer)</span>
<div style="text-align: center"> <a class="fa fa-cloud-download" target="_blank"
<a role="button" style="margin-bottom: 25px;" class="btn btn-success btn-sm ng-scope" ng-href="/sys/partners/{{partner.client_moniker}}/export/aggregate/card_promotion_agree_pdf?rateid={{rate.client_rate_id}}"></a>
ng-if="('10'|withRole)" ng-click="complianceCheck()">check</a> </span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- AlipayPlus费率设置 -->
<div class="row">
<div class="col-sm-12">
<h4>AlipayPlus Rates <a class="text-success" role="button"
ng-if="partner.rate_editable && (('11'|withRole)||((!partner.approve_result||partner.approve_result>4||(partner.approve_result==4&&partner.open_status==3)) && ('111'|withRole)))"
ng-click="newAlipayPlusRate()">
<i class="fa fa-plus"></i></a>
</h4>
<ul class="nav nav-pills margin-bottom">
<li role="presentation" ng-class="{active:isAlipayCN}"><a role="button"
ng-click="changeAlipayPlusRateState(true)"
ng-if="sysconfig.active_channels.indexOf('AlipayPlus')!=-1">AlipayCN</a>
</li>
<li role="presentation" ng-class="{active:!isAlipayCN}"><a role="button"
ng-click="changeAlipayPlusRateState(false)">Other Wallets</a>
</li>
</ul>
<div class="table-responsive">
<table class="table table-bordered">
<thead>
<tr>
<th>Rate Name</th>
<th>Rate Value</th>
<th>Transaction Fee</th>
<th>Active Time</th>
<th>Expire Time</th>
<th>Clean Days</th>
<th>Update Time</th>
<th>Operator</th>
<th>Remark</th>
<th style="text-align: center">Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="rate in rates|filter:isAlipayPlus"
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-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>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>
<td style="text-align: center">
<a role="button" ng-click="editRate(rate)" style="padding-right: 10px;"
ng-if="'011'|withRole"><i class="fa fa-edit"></i></a>
<span ng-if="(bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd')
&& partner.upay_approve_result">
<span style="color: orange">(Promotional Offer)</span>
<a class="fa fa-cloud-download" target="_blank"
ng-href="/sys/partners/{{partner.client_moniker}}/export/aggregate/card_promotion_agree_pdf?rateid={{rate.client_rate_id}}"></a>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div style="text-align: center">
<a role="button" style="margin-bottom: 25px;" class="btn btn-success btn-sm ng-scope"
ng-if="('10'|withRole)" ng-click="complianceCheck()">check</a>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

@ -0,0 +1,150 @@
<div class="modal-header">
<h4>New AlipayPlus Rate</h4>
</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">Clear Days</label>
<div class="col-sm-6">
<div class="input-group">
<select class="form-control" ng-model="rate.clean_days" id="citySelect"
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-class="{'has-error':rate_form.alipay_cn_retail.$invalid && rate_form.alipay_cn_retail.$dirty}">
<label class="control-label col-sm-4" for="alipay_cn_retail_input">Alipay CN Retail
Rate</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="alipay_cn_retail" stringToNumber2 class="form-control"
ng-model="rate.alipay_cn_retail" min="0.7" max="3" step="0.1"
id="alipay_cn_retail_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.alipay_cn_retail.$error" ng-if="rate_form.alipay_cn_retail.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No More Than 3%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No Less Than
0.7%
</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-class="{'has-error':rate_form.alipay_cn_online.$invalid && rate_form.alipay_cn_online.$dirty}">
<label class="control-label col-sm-4" for="alipay_cn_online_input">Alipay CN Online
Rate</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="alipay_cn_online" stringToNumber2 class="form-control"
ng-model="rate.alipay_cn_online" min="0.7" max="3" step="0.1"
id="alipay_cn_online_input" required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.alipay_cn_online.$error" ng-if="rate_form.alipay_cn_online.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No More Than 3%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No Less Than
0.7%
</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-class="{'has-error':rate_form.alipay_other.$invalid && rate_form.alipay_other.$dirty}">
<label class="control-label col-sm-4" for="alipay_other_input">Other Wallets
Rate</label>
<div class="col-sm-6">
<div class="input-group">
<input type="number" name="alipay_other" stringToNumber2 class="form-control"
ng-model="rate.alipay_other" min="1.9" max="3" step="0.1" id="alipay_other_input"
required>
<div class="input-group-addon">%</div>
</div>
<div ng-messages="rate_form.alipay_other.$error" ng-if="rate_form.alipay_other.$dirty">
<div class="small text-danger" ng-message="max">
<i class="glyphicon glyphicon-alert"></i> No More Than 3%
</div>
<div class="small text-danger" ng-message="min">
<i class="glyphicon glyphicon-alert"></i> No Less Than
1.9%
</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-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" max="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>

@ -24,7 +24,7 @@ $(document).ready(function () {
dataCache.paying = true; dataCache.paying = true;
$.ajax({ $.ajax({
url: '/api/v1.0/alipay/partners/' + window.client_moniker + '/orders/'+window.order_id+'/order_params', url: '../order_params',
method: 'GET', method: 'GET',
dataType: 'json', dataType: 'json',
success: function (pay) { success: function (pay) {
@ -32,6 +32,11 @@ $(document).ready(function () {
location.href = window.redirect; location.href = window.redirect;
return; return;
} }
if (pay.web_from) {
$('#alipay_plus').html(pay.web_from)
location.href = window.redirect;
return;
}
if (window.AlipayJSBridge) { if (window.AlipayJSBridge) {
callPayment(); callPayment();
} else { } else {

@ -24,7 +24,7 @@ $(document).ready(function () {
dataCache.paying = true; dataCache.paying = true;
$.ajax({ $.ajax({
url: '/api/v1.0/alipay/partners/' + window.client_moniker + '/orders/'+window.order_id+'/order_params', url: './order_params',
method: 'GET', method: 'GET',
dataType: 'json', dataType: 'json',
success: function (pay) { success: function (pay) {
@ -32,6 +32,11 @@ $(document).ready(function () {
location.href = window.redirect; location.href = window.redirect;
return; return;
} }
if (pay.web_from) {
$('#alipay_plus').html(pay.web_from)
startCheckOrder(window.order_id, window.redirect);
return;
}
if (window.AlipayJSBridge) { if (window.AlipayJSBridge) {
callPayment(); callPayment();
} else { } else {
@ -88,6 +93,9 @@ $(document).ready(function () {
} else { } else {
setTimeout(checkOrderStd, 500); setTimeout(checkOrderStd, 500);
} }
},
error:function (){
setTimeout(checkOrderStd, 500);
} }
}) })
} }

@ -234,7 +234,7 @@ $(function () {
$('.pay_button').css({"background-color":"#eee",}).attr('disabled',true); $('.pay_button').css({"background-color":"#eee",}).attr('disabled',true);
$('.bank_button').css({"background-color":"#eee",}).attr('disabled',true); $('.bank_button').css({"background-color":"#eee",}).attr('disabled',true);
}else{ }else{
$('.pay_button').css({"background-color":"#19AD18",}).attr('disabled',false); $('.pay_button').css({"background-color":"#108ee9",}).attr('disabled',false);
$('.bank_button').css({"background-color":"#FF6600",}).attr('disabled',false); $('.bank_button').css({"background-color":"#FF6600",}).attr('disabled',false);
} }
}); });

@ -113,6 +113,9 @@ $(document).ready(function () {
} else { } else {
setTimeout(checkOrderStd, 500); setTimeout(checkOrderStd, 500);
} }
},
error:function (){
setTimeout(checkOrderStd, 500);
} }
}) })
} }

@ -68,7 +68,7 @@ server {
} }
location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment))/ { location ~ ^/api/v1.0/((alipay\w*)|(customs)|(rpay)|(yeepay)|(card_payment_view)|(lakala_pay)|(cb_bankpay)|(bestpay)|(hf)|(\w*gateway)|(micropay)|(retail_qrcode)|(share_code)|(payment)|(h5_payment))/ {
proxy_pass http://rppaycenter; proxy_pass http://rppaycenter;
proxy_http_version 1.1; proxy_http_version 1.1;

Loading…
Cancel
Save