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

master
dalong306 4 years ago
commit 08e507bdfa

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

@ -551,7 +551,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
}
client.put("enable_alipayplus", false);
MerchantChannelPermissionResolver resolver = this.paymentApi.channelApi(PayChannel.ALIPAY_PLUS.getChannelCode()).getChannelPermissionResolver();
if(!Objects.isNull(resolver)) {
if (!Objects.isNull(resolver)) {
if (resolver.newOrderEnabled(client)) {
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) {
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());
Context ctx = new Context();
ctx.setVariable("bds", bds);
@ -1572,7 +1581,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
@Override
public void switchChannelPermission(JSONObject manager, String clientMoniker, String channel, boolean allow) {
for (PaymentChannelApi channelApi : paymentApi.channels()) {
if (channelApi.channel().equalsIgnoreCase(channel) ) {
if (channelApi.channel().equalsIgnoreCase(channel)) {
JSONObject client = getClientInfoByMoniker(clientMoniker);
if (client == null) {
throw new NotFoundException("Client Not Exists");
@ -1581,7 +1590,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
try {
clientModifySupport.processModify(new SwitchPermissionModify(manager, clientMoniker, "enable_" + channel.toLowerCase(), allow));
} 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);
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, "Rpay", "Rpay_rate_value", org, "min_Rpay_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) {
if (config.containsKey(rateKey)) {
JSONObject newConfig = new JSONObject();
newConfig.putAll(config);
newConfig.put("rate_value", config.getBigDecimal(rateKey));
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()) {
return;
}
@ -2024,10 +2052,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
newConfig.put("ext_rates", extRateParams.toJSONString());
} else {
List<JSONObject> existRate = clientRateMapper.listCurrentClientRates(clientId, config.getDate("active_time"), channel);
for (JSONObject rateLog : existRate) {
existRate.stream().filter(existConfig -> {
if (existConfig.getDate("active_time").equals(config.getDate("active_time")) && existConfig.getDate("expiry_time").equals(config.getDate("expiry_time"))) {
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 (newConfig.getBigDecimal("cb_bankpay_rate_value") != null) {
@ -5800,16 +5835,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
throw new InvalidShortIdException();
}
checkOrgPermission(manager, client);
try {
AlipayMerchantEntity alipayMch = merchantChannelApplicationManager.getRegister(AlipayRetailApi.class).findMerchant(client);
Element resultElement = alipayMch.getRawResponseXml();
if (!StringUtils.equalsIgnoreCase("T", resultElement.elementText("is_success"))) {
return "查询成功:" + resultElement.elementText("error");
}
Element responseElement = resultElement.element("response").element("alipay");
Element responseElement = alipayMch.getRawResponseXml();
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();
}
}
@Override
@ -5940,17 +5975,17 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid
if (client == null) {
throw new InvalidShortIdException();
}
AlipayConfig.AlipayMerchant mch = AlipayEnvironment.getEnv().getAlipayOnlineMerchant();
try {
AlipayMerchantEntity entity = merchantChannelApplicationManager.getRegister(AlipayOnlineApi.class)
.findMerchant(client);
Element resultElement = entity.getRawResponseXml();
if (!StringUtils.equalsIgnoreCase("T", resultElement.elementText("is_success"))) {
return "查询成功:" + resultElement.elementText("error");
}
Element responseElement = resultElement.element("response").element("alipay");
Element responseElement = entity.getRawResponseXml();
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();
}
}
@Override

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

@ -27,6 +27,7 @@ public class OrgInfo {
private Double alipay_rate_value;
private Double wechat_rate_value;
private Double alipayonline_rate_value;
private Double alipayplus_rate_value;
private Double cb_bankpay_rate_value;
// private Double rpaypmt_card_rate_value;
//卡支付-国内卡费率配置
@ -42,6 +43,7 @@ public class OrgInfo {
private String org_id;
private String commission_type;
private Double min_wechat_rate;
private Double min_alipayplus_rate;
private Double min_alipay_rate;
private Double min_alipayonline_rate;
private Double min_cb_bankpay_rate;
@ -79,6 +81,22 @@ public class OrgInfo {
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() {
return is_valid;
}

@ -1,12 +1,12 @@
<style>
.form-control-float {
float: left;
width: 93%; !important;
width: 93% !important;
}
.form-control-span{
.form-control-span {
height: 34px;
}
</style>
<section class="content-header">
<h1 ng-bind="org.name"></h1>
@ -28,28 +28,23 @@
<div class="form-group" ng-class="{'has-error':org_form.name.$invalid && org_form.name.$dirty}">
<label class="control-label col-sm-2" for="org_name_input">Name *</label>
<div class="col-sm-8">
<input class="form-control" ng-model="org.name" id="org_name_input" name="name" required>
<input class="form-control" ng-model="org.name" id="org_name_input" name="name" required />
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Logo</label>
<div class="col-sm-8">
<p class="form-control-static">
<button class="btn btn-primary" type="button" ngf-select="uploadLogo($file)"
accept="image/*">
<i class="fa fa-upload"></i> Upload
</button>
<uib-progressbar value="logoProgress.value" ng-if="logoProgress"></uib-progressbar>
<img ng-src="{{org.logo}}" class="col-sm-3" ng-if="org.logo">
<button class="btn btn-primary" type="button" ngf-select="uploadLogo($file)" accept="image/*"><i class="fa fa-upload"></i> Upload</button>
<uib-progressbar value="logoProgress.value" ng-if="logoProgress"> </uib-progressbar>
<img ng-src="{{org.logo}}" class="col-sm-3" ng-if="org.logo" />
</p>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.state.$invalid && org_form.state.$dirty}">
<label class="control-label col-sm-2" for="org_state_input">State *</label>
<div class="col-sm-8">
<select class="form-control" name="state" required ng-model="org.state"
id="org_state_input"
ng-options="state.value as state.label for state in states">
<select class="form-control" name="state" required ng-model="org.state" id="org_state_input" ng-options="state.value as state.label for state in states">
<option value="">Please Choose</option>
</select>
</div>
@ -57,38 +52,48 @@
<div class="form-group" ng-class="{'has-error':org_form.location.$invalid && org_form.location.$dirty}">
<label class="control-label col-sm-2" for="org_location_input">Location *</label>
<div class="col-sm-8">
<input class="form-control" ng-model="org.location" id="org_location_input" name="location" required>
<input class="form-control" ng-model="org.location" id="org_location_input" name="location" required />
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.type.$invalid && org_form.type.$dirty}"
ng-if="!('1000000000000'|withRole)">
<div class="form-group" ng-class="{'has-error':org_form.type.$invalid && org_form.type.$dirty}" ng-if="!('1000000000000'|withRole)">
<label class="control-label col-sm-2" for="org_type_input">Type *</label>
<div class="col-sm-8">
<!--<select class="form-control" ng-model="org.type" ng-init="org.type=0" id="org_type_input">-->
<!--<option value="0">代理人</option>-->
<!--<option value="1">推荐人</option>-->
<!--</select>-->
<select class="form-control" name="type" required ng-model="org.type"
id="org_type_input"
ng-options="type.value as type.label for type in types">
<select class="form-control" name="type" required ng-model="org.type" id="org_type_input" ng-options="type.value as type.label for type in types">
<!--<option value="">Please Choose</option>-->
</select>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.commission_type_0.$invalid && org_form.commission_type_0.$dirty}"
ng-show="(org.type == 0) || ('1000000000000'|withRole)">
<div
class="form-group"
ng-class="{'has-error':org_form.commission_type_0.$invalid && org_form.commission_type_0.$dirty}"
ng-show="(org.type == 0) || ('1000000000000'|withRole)"
>
<label class="control-label col-sm-2" for="commission_type_0">Commission Type *</label>
<div class="col-sm-8">
<select class="form-control" name="commission_type_0" required ng-model="org.commission_type" id="commission_type_0"
ng-options="commission_type.value as commission_type.label for commission_type in commission_types">
</select>
<select
class="form-control"
name="commission_type_0"
required
ng-model="org.commission_type"
id="commission_type_0"
ng-options="commission_type.value as commission_type.label for commission_type in commission_types"
></select>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="senior_parent_org_id">Senior Partner </label>
<div class="col-sm-8">
<select class="form-control" name="senior_parent_org_id" ng-model="org.senior_parent_org_id" id="senior_parent_org_id"
ng-options="seniorOrg.org_id as seniorOrg.name for seniorOrg in seniorOrgs">
<select
class="form-control"
name="senior_parent_org_id"
ng-model="org.senior_parent_org_id"
id="senior_parent_org_id"
ng-options="seniorOrg.org_id as seniorOrg.name for seniorOrg in seniorOrgs"
>
<option value="-1">noop</option>
</select>
</div>
@ -97,7 +102,7 @@
<div class="form-group" ng-class="{'has-error':org_form.rate_value.$invalid && org_form.rate_value.$dirty}">
<label class="control-label col-sm-2" for="rate_value_input">Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.rate_value" id="rate_value_input" name="rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.rate_value" id="rate_value_input" name="rate_value" max="100" min="0" />
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
@ -107,7 +112,7 @@
<div class="form-group" ng-class="{'has-error':org_form.rate_value.$invalid && org_form.rate_value.$dirty}">
<label class="control-label col-sm-2" for="rate_value_input_3">Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.rate_value" id="rate_value_input_3" name="rate_value" max="100" min="0">
<input class="form-control form-control-float" type="number" ng-model="org.rate_value" id="rate_value_input_3" name="rate_value" max="100" min="0" />
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
@ -116,7 +121,16 @@
<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" required>
<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>
@ -124,7 +138,33 @@
<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" required>
<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>
<div class="form-group" ng-class="{'has-error':org_form.alipayplus_rate_value.$invalid && org_form.alipayplus_rate_value.$dirty}">
<label class="control-label col-sm-2" for="alipayplus_rate_value_input">AlipayPlus Rate *</label>
<div class="col-sm-8">
<input
class="form-control form-control-float"
type="number"
ng-model="org.alipayplus_rate_value"
id="alipayplus_rate_value_input"
name="alipayplus_rate_value"
max="100"
min="0"
required
/>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
@ -132,14 +172,31 @@
<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" required>
<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.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.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.cb_bankpay_rate_value"
id="cb_bankpay_rate_value_input"
name="cb_bankpay_rate_value"
max="100"
min="0"
/>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
@ -155,7 +212,16 @@
<div class="form-group" ng-class="{'has-error':org_form.rpaypmt_domestic_card_rate_value.$invalid && org_form.rpaypmt_domestic_card_rate_value.$dirty}">
<label class="control-label col-sm-2" for="rpaypmt_domestic_card_rate_value_input">Domestic Card Payment Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.rpaypmt_domestic_card_rate_value" id="rpaypmt_domestic_card_rate_value_input" name="rpaypmt_card_rate_value" max="100" min="0" required>
<input
class="form-control form-control-float"
type="number"
ng-model="org.rpaypmt_domestic_card_rate_value"
id="rpaypmt_domestic_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>
@ -164,7 +230,16 @@
<div class="form-group" ng-class="{'has-error':org_form.rpaypmt_overseas_card_rate_value.$invalid && org_form.rpaypmt_overseas_card_rate_value.$dirty}">
<label class="control-label col-sm-2" for="rpaypmt_overseas_card_rate_value_input">International Card Payment Rate *</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.rpaypmt_overseas_card_rate_value" id="rpaypmt_overseas_card_rate_value_input" name="rpaypmt_card_rate_value" max="100" min="0" required>
<input
class="form-control form-control-float"
type="number"
ng-model="org.rpaypmt_overseas_card_rate_value"
id="rpaypmt_overseas_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>
@ -172,48 +247,95 @@
<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.rpaypmt_dd_rate_value" id="rpaypmt_dd_rate_value_input" name="rpaypmt_dd_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"
/>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
</div>
<div>
<div class="form-group"
ng-class="{'has-error':org_form.min_wechat_rate.$invalid && org_form.min_wechat_rate.$dirty}">
<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>
<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">
<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 form-control-span">%</span>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.min_alipay_rate.$invalid && org_form.min_alipay_rate.$dirty}">
<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 form-control-float" type="number" ng-model="org.min_alipay_rate"
id="min_alipay_rate_input" name="min_alipay_rate" max="100" min="0">
<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"
/>
<span class="input-group-addon form-control-span">%</span>
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.min_alipayplus_rate.$invalid && org_form.min_alipayplus_rate.$dirty}">
<label class="control-label col-sm-2" for="min_alipayplus_rate_input">Min AlipayPlus Rate</label>
<div class="col-sm-8">
<input
class="form-control form-control-float"
type="number"
ng-model="org.min_alipayplus_rate"
id="min_alipayplus_rate_input"
name="min_alipayplus_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}">
<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 form-control-float" type="number" ng-model="org.min_alipayonline_rate"
id="min_alipayonline_rate_input" name="min_alipayonline_rate" max="100" min="0">
<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_cb_bankpay_rate.$invalid && org_form.min_cb_bankpay_rate.$dirty}">
<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_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_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>
@ -228,33 +350,51 @@
</div>-->
<!-- 卡支付-国内卡最小费率配置 -->
<div class="form-group"
ng-class="{'has-error':org_form.min_rpaypmt_domestic_card_rate.$invalid && org_form.min_rpaypmt_domestic_card_rate.$dirty}">
<div class="form-group" ng-class="{'has-error':org_form.min_rpaypmt_domestic_card_rate.$invalid && org_form.min_rpaypmt_domestic_card_rate.$dirty}">
<label class="control-label col-sm-2" for="min_rpaypmt_domestic_card_rate_input">Min Domestic Card Payment Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_rpaypmt_domestic_card_rate"
id="min_rpaypmt_domestic_card_rate_input" name="min_rpaypmt_domestic_card_rate" max="100" min="0">
<input
class="form-control form-control-float"
type="number"
ng-model="org.min_rpaypmt_domestic_card_rate"
id="min_rpaypmt_domestic_card_rate_input"
name="min_rpaypmt_domestic_card_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_rpaypmt_overseas_card_rate.$invalid && org_form.min_rpaypmt_overseas_card_rate.$dirty}">
<div class="form-group" ng-class="{'has-error':org_form.min_rpaypmt_overseas_card_rate.$invalid && org_form.min_rpaypmt_overseas_card_rate.$dirty}">
<label class="control-label col-sm-2" for="min_rpaypmt_overseas_card_rate_input">Min International Card Payment Rate</label>
<div class="col-sm-8">
<input class="form-control form-control-float" type="number" ng-model="org.min_rpaypmt_overseas_card_rate"
id="min_rpaypmt_overseas_card_rate_input" name="min_rpaypmt_overseas_card_rate" max="100" min="0">
<input
class="form-control form-control-float"
type="number"
ng-model="org.min_rpaypmt_overseas_card_rate"
id="min_rpaypmt_overseas_card_rate_input"
name="min_rpaypmt_overseas_card_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_rpaypmt_dd_rate.$invalid && org_form.min_rpaypmt_dd_rate.$dirty}">
<div class="form-group" 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_rpaypmt_dd_rate"
id="min_rpaypmt_dd_rate_input" name="min_rpaypmt_dd_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>
@ -264,39 +404,36 @@
<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">
<input class="form-control" ng-model="org.contact_person" id="org_contact_person_input" name="contact_person" required>
<input class="form-control" ng-model="org.contact_person" id="org_contact_person_input" name="contact_person" required />
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.contact_phone.$invalid && org_form.contact_phone.$dirty}">
<label class="control-label col-sm-2" for="org_contact_phone_input">Phone *</label>
<div class="col-sm-8">
<input class="form-control" ng-model="org.contact_phone" id="org_contact_phone_input" name="contact_phone" required>
<input class="form-control" ng-model="org.contact_phone" id="org_contact_phone_input" name="contact_phone" required />
</div>
</div>
<div class="form-group" ng-class="{'has-error':org_form.contact_mail.$invalid && org_form.contact_mail.$dirty}">
<label class="control-label col-sm-2" for="org_contact_mail_input">Mail *</label>
<div class="col-sm-8">
<input class="form-control" ng-model="org.contact_mail" id="org_contact_mail_input" name="contact_mail" required>
<input class="form-control" ng-model="org.contact_mail" id="org_contact_mail_input" name="contact_mail" required />
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="commission_checkbox">Enable Commission</label>
<div class="col-sm-8">
<input id="commission_checkbox" type="checkbox" class="checkbox-inline checkbox" ng-model="org.commission">
<input id="commission_checkbox" type="checkbox" class="checkbox-inline checkbox" ng-model="org.commission" />
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.remark.$invalid && org_form.remark.$dirty}">
<div class="form-group" ng-class="{'has-error':org_form.remark.$invalid && org_form.remark.$dirty}">
<label class="control-label col-sm-2" for="remark-input">Remark</label>
<div class="col-sm-8">
<textarea class="form-control" ng-model="org.remark" name="remark"
id="remark-input" maxlength="500"></textarea>
<textarea class="form-control" ng-model="org.remark" name="remark" id="remark-input" maxlength="500"></textarea>
</div>
</div>
</div>
<div class="btn-group margin-bottom margin-top">
<button class="btn btn-success" type="button" ng-click="update(org_form)">Save
</button>
<button class="btn btn-success" type="button" ng-click="update(org_form)">Save</button>
<a class="btn btn-danger" role="button" ui-sref="^" ui-sref-opts="{reload:true}">Back</a>
</div>
<!--<button class="btn btn-success col-sm-offset-2" ng-click="update()"><i class="fa fa-save"></i> Update</button>-->
@ -308,7 +445,7 @@
<form class="navbar-form navbar-left" role="search">
<div class="form-group">
<label class="control-label" for="username-filter-input">Username</label>
<input type="text" class="form-control" ng-model="params.username" placeholder="Username" id="username-filter-input">
<input type="text" class="form-control" ng-model="params.username" placeholder="Username" id="username-filter-input" />
</div>
<div class="form-group" ng-if="'1'|withRole">
<label class="control-label" for="role-filter-select">Role</label>
@ -327,19 +464,13 @@
</select>
</div>
<div class="form-group">
<button class="btn btn-primary" type="button" ng-click="listManagers(1)">
<i class="fa fa-search"></i> Search
</button>
<button class="btn btn-primary" type="button" ng-click="listManagers(1)"><i class="fa fa-search"></i> Search</button>
</div>
</form>
<div class="navbar-form navbar-right">
<button class="btn btn-success" type="button" ng-click="newManager()">
<i class="fa fa-plus"></i> New Manager Account
</button>
<button class="btn btn-success" type="button" ng-click="newManager()"><i class="fa fa-plus"></i> New Manager Account</button>
</div>
</div>
</div>
</div>
<div class="box">
@ -362,7 +493,9 @@
<tr ng-repeat="manager in managers">
<td ng-bind="manager.username"></td>
<td ng-bind="manager.display_name"></td>
<td style="white-space: nowrap;overflow: hidden;text-overflow:ellipsis;"><img ng-src="{{manager.headimg}}" style="height: 30px;width:30px;" class="img-circle" ng-if="manager.headimg"> {{manager.nickname}}</td>
<td style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis">
<img ng-src="{{manager.headimg}}" style="height: 30px; width: 30px" class="img-circle" ng-if="manager.headimg" /> {{manager.nickname}}
</td>
<td ng-bind="manager.create_time|date:'yyyy-MM-dd'"></td>
<td ng-bind="manager.email"></td>
<td>
@ -387,7 +520,8 @@
</table>
</div>
<div class="box-footer" ng-if="managers.length">
<uib-pagination class="pagination"
<uib-pagination
class="pagination"
total-items="paginationa.totalCount"
boundary-links="true"
ng-model="paginationa.page"
@ -397,7 +531,8 @@
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
last-text="&raquo;"
></uib-pagination>
<div class="row">
<div class="col-xs-12">Total Records:{{paginationa.totalCount}};Total Pages:{{paginationa.totalPages}}</div>
</div>
@ -418,21 +553,16 @@
</p>
</div>
</div>
<div class="form-group"
ng-class="{'has-error':org_form.gateway_short_id.$invalid && org_form.gateway_short_id.$dirty}">
<div class="form-group" ng-class="{'has-error':org_form.gateway_short_id.$invalid && org_form.gateway_short_id.$dirty}">
<label class="col-sm-2 control-label">RoyalPay Public Key</label>
<div class="col-sm-10" style="margin-top: 8px;">
<a role="button" ng-click="refreshPlatformPubliKey()">
View
</a>
<div class="col-sm-10" style="margin-top: 8px">
<a role="button" ng-click="refreshPlatformPubliKey()"> View </a>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Org Public Key</label>
<div class="col-sm-10" style="margin-top: 8px;">
<a role="button" ng-click="resetPartnerPubliKey()">
Upload
</a>
<div class="col-sm-10" style="margin-top: 8px">
<a role="button" ng-click="resetPartnerPubliKey()"> Upload </a>
</div>
</div>
</form>
@ -442,86 +572,98 @@
<div class="form-group">
<label class="col-xs-4 col-sm-2 control-label">Client Rate Editable</label>
<div class="col-xs-8 col-sm-8">
<input type="checkbox" ng-model="org.rate_editable" bs-switch switch-change="toggleRateEditable()">
<input type="checkbox" ng-model="org.rate_editable" bs-switch switch-change="toggleRateEditable()" />
</div>
</div>
</form>
</uib-tab>
<uib-tab heading="商户">
<div class="box box-warning" style="border-top-color:#f06101">
<div class="box box-warning" style="border-top-color: #f06101">
<div class="box-body no-padding table-responsive">
<div>
<span style="float: right;font-size: 14px;" class="del_client">禁用</span>
<span style="float: right;font-size: 14px;" class="pass_timeout">&nbsp;&nbsp;超期提醒&nbsp;&nbsp;</span>
<span style="float: right;font-size: 14px;"
class="bg-red">&nbsp;&nbsp;等待合规&nbsp;&nbsp;</span>
<span style="float: right;font-size: 14px;"
class="bg-green">&nbsp;&nbsp;绿色通道&nbsp;&nbsp;</span>
<span style="float: right;font-size: 14px;">&nbsp;&nbsp;通过&nbsp;&nbsp;</span>
<span style="float: right; font-size: 14px" class="del_client">禁用</span>
<span style="float: right; font-size: 14px" class="pass_timeout">&nbsp;&nbsp;超期提醒&nbsp;&nbsp;</span>
<span style="float: right; font-size: 14px" class="bg-red">&nbsp;&nbsp;等待合规&nbsp;&nbsp;</span>
<span style="float: right; font-size: 14px" class="bg-green">&nbsp;&nbsp;绿色通道&nbsp;&nbsp;</span>
<span style="float: right; font-size: 14px">&nbsp;&nbsp;通过&nbsp;&nbsp;</span>
</div>
<table class="table table-striped">
<thead>
<tr>
<th style="padding: 12px;">Partner Code</th>
<th style="padding: 12px;">Partner Name</th>
<th style="padding: 12px;">Sub Mch ID</th>
<th style="padding: 12px;">Register Time</th>
<th style="padding: 12px;">Compliance Status</th>
<th style="padding: 12px;">Organization</th>
<th style="padding: 12px;">BD</th>
<th style="padding: 12px;" ng-if="'client_detail_by_moniker'|withFunc">Operation</th>
<th style="padding: 12px">Partner Code</th>
<th style="padding: 12px">Partner Name</th>
<th style="padding: 12px">Sub Mch ID</th>
<th style="padding: 12px">Register Time</th>
<th style="padding: 12px">Compliance Status</th>
<th style="padding: 12px">Organization</th>
<th style="padding: 12px">BD</th>
<th style="padding: 12px" ng-if="'client_detail_by_moniker'|withFunc">Operation</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="partner in partners"
ng-class="{pass_timeout:partner.pass_timeout,success:partner.source==5,warning:partner.approve_result==5 && ('100'|withRole)}">
<tr
ng-repeat="partner in partners"
ng-class="{pass_timeout:partner.pass_timeout,success:partner.source==5,warning:partner.approve_result==5 && ('100'|withRole)}"
>
<td>
<a class="text-primary" role="button" title="Detail"
<a
class="text-primary"
role="button"
title="Detail"
ng-click="openClientBoard(partner)"
ng-if="(partner.approve_result==1) || (partner.approve_result == 2 && (partner.source==1 || partner.source==2))">
<span ng-bind="partner.client_moniker"></span></a>
ng-if="(partner.approve_result==1) || (partner.approve_result == 2 && (partner.source==1 || partner.source==2))"
>
<span ng-bind="partner.client_moniker"></span
></a>
<span ng-bind="partner.client_moniker" ng-if="partner.approve_result!=1 && !(partner.approve_result==2 && (partner.source==1 || partner.source==2))"></span>
<span ng-if="partner.is_valid==0" ng-class="{pass_timeout:partner.is_valid==0}">(已禁用)</span>
<i class="fa fa-sitemap" ng-if="partner.parent_client_id"
title="Sub Partner"></i>
<i class="text-danger fa fa-envelope-o"
<i class="fa fa-sitemap" ng-if="partner.parent_client_id" title="Sub Partner"></i>
<i
class="text-danger fa fa-envelope-o"
ng-if="(partner.approve_result==1 || (partner.approve_result == 2 && (partner.source==1 || partner.source==2))) && (partner.approve_email_send==2 || partner.approve_email_send==0)"
title="Init email send failed"></i>
<i class="text-danger fa fa-clock-o" ng-if="partner.temp_sub_merchant"
title="Using temp Sub Merchant ID"></i>
title="Init email send failed"
></i>
<i class="text-danger fa fa-clock-o" ng-if="partner.temp_sub_merchant" title="Using temp Sub Merchant ID"></i>
</td>
<td ng-bind="partner.short_name"></td>
<td ng-bind="partner.sub_merchant_id"></td>
<td ng-bind="partner.create_time"></td>
<td ng-class="{'bg-green':(partner.approve_result==2 && (partner.source==1 || partner.source==2)),'bg-red':((partner.open_status==1||partner.open_status==2||partner.open_status==4) && partner.approve_result!=3)||(partner.approve_result==3 && (!partner.open_status || partner.open_status==1 || partner.open_status == 4))||(partner.approve_result==4 && !partner.open_status)||(partner.open_status==10)}">
<td
ng-class="{'bg-green':(partner.approve_result==2 && (partner.source==1 || partner.source==2)),'bg-red':((partner.open_status==1||partner.open_status==2||partner.open_status==4) && partner.approve_result!=3)||(partner.approve_result==3 && (!partner.open_status || partner.open_status==1 || partner.open_status == 4))||(partner.approve_result==4 && !partner.open_status)||(partner.open_status==10)}"
>
<span ng-if="partner.approve_result==1 && partner.approve_time">通过({{partner.approve_time}})</span>
<span ng-if="!partner.open_status && !partner.approve_result && partner.approve_result!=5 && partner.source!=4">资料完善中</span>
<span ng-if="!partner.open_status && !partner.approve_result && partner.approve_result!=5 && partner.source==4">(自助开通)资料完善中</span>
<span ng-if="!partner.open_status && partner.approve_result==2 && partner.approve_time">自助开通试用中({{partner.approve_time}}~{{partner.expiry_time}})</span>
<span ng-if="!partner.open_status && partner.approve_result==2 && partner.approve_time"
>自助开通试用中({{partner.approve_time}}~{{partner.expiry_time}})</span
>
<span ng-if="partner.approve_result==0 && partner.approve_time">不通过({{partner.approve_time}})</span>
<span ng-if="partner.approve_result==5 && partner.approve_time && partner.refuse_remark">申请打回({{partner.refuse_remark|limitTo:15}})</span>
<span ng-if="(partner.open_status==1||partner.open_status==4) && partner.approve_result!=3"><i ng-if="partner.refuse_remark.length>0" class="fa fa-reply" aria-hidden="true" title="被打回重新提交"></i>等待合规</span>
<span ng-if="(partner.open_status==1||partner.open_status==4) && partner.approve_result!=3"
><i ng-if="partner.refuse_remark.length>0" class="fa fa-reply" aria-hidden="true" title="被打回重新提交"></i>等待合规</span
>
<span ng-if="partner.approve_result==3 && (!partner.open_status || partner.open_status==4)">自助开通(等待合规)</span>
<span ng-if="partner.open_status==2">合同制作完成</span>
<span ng-if="partner.open_status==3 && partner.approve_result!=5">等待BD上传材料审核</span>
<span ng-if="partner.open_status==10">绿色通道申请中</span>
<span ng-if="partner.approve_result==4 && !partner.open_status"><i ng-if="partner.refuse_remark.length>0" class="fa fa-reply" aria-hidden="true" title="被打回重新提交"></i>等待合规</span>
<span ng-if="partner.approve_result==4 && !partner.open_status"
><i ng-if="partner.refuse_remark.length>0" class="fa fa-reply" aria-hidden="true" title="被打回重新提交"></i>等待合规</span
>
</td>
<td ng-bind="partner.org_name"></td>
<td ng-bind="partner.bd_user_name"></td>
<td ng-if="'client_detail_by_moniker'|withFunc">
<a class="text-primary" role="button" title="Detail"
ui-sref="partners.detail({clientMoniker:partner.client_moniker})">
<a class="text-primary" role="button" title="Detail" ui-sref="partners.detail({clientMoniker:partner.client_moniker})">
<i class="fa fa-search"></i> Detail
</a>
</td>
</tr>
</tbody>
</table>
</div>
<div class="box-footer" ng-if="partners.length">
<uib-pagination class="pagination"
<uib-pagination
class="pagination"
total-items="pagination.totalCount"
boundary-links="true"
ng-model="pagination.page"
@ -531,11 +673,10 @@
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
last-text="&raquo;"
></uib-pagination>
<div class="row">
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total
Pages:{{pagination.totalPages}}
</div>
<div class="col-xs-12">Total Records:{{pagination.totalCount}};Total Pages:{{pagination.totalPages}}</div>
</div>
</div>
</div>
@ -546,8 +687,7 @@
<div class="box box-warning">
<div class="box-header with-border">商户新增趋势</div>
<div class="box-body">
<div class="chart" echarts="analysis.clients_line" style="height: 300px"
ng-class="{nodata:analysis.clients_line.nodata}"></div>
<div class="chart" echarts="analysis.clients_line" style="height: 300px" ng-class="{nodata:analysis.clients_line.nodata}"></div>
</div>
</div>
</div>
@ -557,8 +697,7 @@
<div class="box box-warning">
<div class="box-header with-border">交易额趋势</div>
<div class="box-body">
<div class="chart" echarts="analysis.trade_line" style="height: 300px"
ng-class="{nodata:analysis.trade_line.nodata}"></div>
<div class="chart" echarts="analysis.trade_line" style="height: 300px" ng-class="{nodata:analysis.trade_line.nodata}"></div>
</div>
</div>
</div>
@ -573,42 +712,50 @@
<div class="col-sm-10">
<div class="form-control-static form-inline">
<div style="display: inline-block">
<input class="form-control" id="date-from-input" ng-model="params.begin"
uib-datepicker-popup size="10" placeholder="From"
is-open="dateBegin.open" ng-click="dateBegin.open=true"
datepicker-options="{maxDate:params.end||today}">
<input
class="form-control"
id="date-from-input"
ng-model="params.begin"
uib-datepicker-popup
size="10"
placeholder="From"
is-open="dateBegin.open"
ng-click="dateBegin.open=true"
datepicker-options="{maxDate:params.end||today}"
/>
</div>
~
<div style="display: inline-block">
<input class="form-control" id="date-to-input" ng-model="params.end"
uib-datepicker-popup size="10" placeholder="To"
is-open="dateTo.open" ng-click="dateTo.open=true"
datepicker-options="{minDate:params.begin,maxDate:today}">
<input
class="form-control"
id="date-to-input"
ng-model="params.end"
uib-datepicker-popup
size="10"
placeholder="To"
is-open="dateTo.open"
ng-click="dateTo.open=true"
datepicker-options="{minDate:params.begin,maxDate:today}"
/>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm"
ng-click="chooseToday()">Today</a>
<a role="button" class="btn btn-default btn-sm" ng-click="chooseToday()">Today</a>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm"
ng-click="chooseYesterday()">Yesterday</a>
<a role="button" class="btn btn-default btn-sm" ng-click="chooseYesterday()">Yesterday</a>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm"
ng-click="chooseLast7Days()">Last 7 Days</a>
<a role="button" class="btn btn-default btn-sm" ng-click="chooseLast7Days()">Last 7 Days</a>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm" ng-click="thisMonth()">This
Month</a>
<a role="button" class="btn btn-default btn-sm" ng-click="thisMonth()">This Month</a>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm" ng-click="lastMonth()">Last
Month</a>
<a role="button" class="btn btn-default btn-sm" ng-click="lastMonth()">Last Month</a>
</div>
<div class="btn-group">
<a role="button" class="btn btn-default btn-sm" ng-click="thisYear()">This
Year</a>
<a role="button" class="btn btn-default btn-sm" ng-click="thisYear()">This Year</a>
</div>
<button class="btn btn-success" type="button" ng-click="loadTransactionAmountInOrg()">
<i class="fa fa-search"></i>
@ -664,20 +811,16 @@
</thead>
<tbody>
<tr ng-repeat="sale in partnerSalesList">
<td style="text-align: center;font-style: italic;font-size: larger"
ng-bind="$index*2+1+'.'"></td>
<td style="text-align: center; font-style: italic; font-size: larger" ng-bind="$index*2+1+'.'"></td>
<td>
<a class="text-primary" role="button" title="Detail"
ui-sref="partners.detail({clientMoniker:sale[0].client_moniker})">
<a class="text-primary" role="button" title="Detail" ui-sref="partners.detail({clientMoniker:sale[0].client_moniker})">
{{sale[0].client_moniker}}
</a>
</td>
<td ng-bind="sale[0].amount"></td>
<td style="text-align: center;font-style: italic;font-size: larger"
ng-bind="$index * 2 + 2 +'.'"></td>
<td style="text-align: center; font-style: italic; font-size: larger" ng-bind="$index * 2 + 2 +'.'"></td>
<td>
<a class="text-primary" role="button" title="Detail"
ui-sref="partners.detail({clientMoniker:sale[1].client_moniker})">
<a class="text-primary" role="button" title="Detail" ui-sref="partners.detail({clientMoniker:sale[1].client_moniker})">
{{sale[1].client_moniker}}
</a>
</td>
@ -687,14 +830,10 @@
</table>
<loadingbar ng-if="rank_loading"></loadingbar>
</div>
</div>
</div>
</div>
<div class="box-footer">
</div>
<div class="box-footer"></div>
</div>
</div>
</div>
@ -719,20 +858,16 @@
<tbody>
<tr ng-repeat="clientExtracts in client_extarct">
<td ng-bind="clientExtracts.name"></td>
<td>
{{clientExtracts.year|limitTo:10}}
-
{{clientExtracts.month|limitTo:10}}
</td>
<td>{{clientExtracts.year|limitTo:10}} - {{clientExtracts.month|limitTo:10}}</td>
<td ng-bind="clientExtracts.gross_amount|currency:'AUD'"></td>
<td ng-bind="clientExtracts.total_charge|currency:'AUD'"></td>
<td ng-bind="clientExtracts.royalpay_charge|currency:'AUD'"></td>
<td ng-bind="clientExtracts.org_charge|currency:'AUD'"></td>
<td ng-bind="clientExtracts.share_charge|currency:'AUD'"></td>
<td>
<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=="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" />
{{clientExtracts.channel}}
</td>
</tr>
@ -740,7 +875,8 @@
</table>
</div>
<div class="box-footer" ng-if="client_extarct.length">
<uib-pagination class="pagination"
<uib-pagination
class="pagination"
total-items="paginationc.totalCount"
boundary-links="true"
ng-model="paginationc.page"
@ -750,7 +886,8 @@
previous-text="&lsaquo;"
next-text="&rsaquo;"
first-text="&laquo;"
last-text="&raquo;"></uib-pagination>
last-text="&raquo;"
></uib-pagination>
<div class="row">
<div class="col-xs-12">Total Records:{{paginationc.totalCount}};Total Pages:{{paginationc.totalPages}}</div>
</div>
@ -758,21 +895,22 @@
</div>
</uib-tab>
<uib-tab heading="Default Client Profile">
<form name="profileForm" class="form-horizontal">
<div class="form-group" ng-repeat="field in clientProfileFields">
<label class="control-label col-md-3" ng-bind="field.title||field.field"></label>
<div class="col-md-7" ng-class="{'checkbox-inline':field.type=='checkbox'}">
<input ng-class="{'checkbox':field.type=='checkbox','form-control':field.type!='checkbox'}"
ng-model="field.value" ng-input-name="{{field.field}}" type="{{field.type}}">
<input
ng-class="{'checkbox':field.type=='checkbox','form-control':field.type!='checkbox'}"
ng-model="field.value"
ng-input-name="{{field.field}}"
type="{{field.type}}"
/>
<p ng-if="field.detail" ng-bind="field.detail" class="text-success text-sm"></p>
</div>
</div>
</form>
<button class="btn btn-warning" ng-click="loadClientProfile()"><i class="fa fa-refresh"></i> Reset
</button>
<button class="btn btn-success" ng-click="submitClientProfile()"><i class="fa fa-check"></i> Submit
</button>
<button class="btn btn-warning" ng-click="loadClientProfile()"><i class="fa fa-refresh"></i> Reset</button>
<button class="btn btn-success" ng-click="submitClientProfile()"><i class="fa fa-check"></i> Submit</button>
</uib-tab>
</uib-tabset>
</div>

@ -3404,6 +3404,97 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter
}
}
$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', [

@ -124,8 +124,7 @@
<i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.swift_code" id="swiftcode_input"
required
ng-readonly="!bankCtrl.edit">
required ng-readonly="!bankCtrl.edit">
</div>
</div>
<div class="form-group">
@ -210,8 +209,7 @@
<i class="fa fa-check-square-o check-i" aria-hidden="true"
ng-if="$root.complianceCheck.bankAccount"></i>
<input class="form-control bank-input" ng-model="bankaccount.account_no" id="account_no_input"
required
ng-readonly="!bankCtrl.edit">
required ng-readonly="!bankCtrl.edit">
</div>
</div>
<div class="form-group">
@ -236,13 +234,17 @@
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-info">
<div class="panel-heading">
<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-click="newRate()">
<i class="fa fa-plus"></i></a>
</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-12">
<ul class="nav nav-pills margin-bottom">
<li role="presentation" ng-class="{active:bankCtrl.rate_name=='Wechat'}"><a role="button"
ng-click="bankCtrl.rate_name='Wechat'">Wechat</a>
@ -291,7 +293,8 @@
<th>Transaction Fee</th>
<th>Active Time</th>
<th>Expire Time</th>
<th ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">
<th
ng-if="bankCtrl.rate_name=='Wechat' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">
Clean Days
</th>
<th>Update Time</th>
@ -307,11 +310,13 @@
<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.rate + ' %/T+'+rate.ext_rates.overseas_rate_value.clean_days"></td>
ng-bind="rate.ext_rates.overseas_rate_value.rate + ' %/T+'+rate.ext_rates.overseas_rate_value.clean_days">
</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' || bankCtrl.rate_name=='rpaypmt_card' ||bankCtrl.rate_name=='rpaypmt_dd'">
<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>
@ -330,11 +335,73 @@
</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>

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

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

@ -234,7 +234,7 @@ $(function () {
$('.pay_button').css({"background-color":"#eee",}).attr('disabled',true);
$('.bank_button').css({"background-color":"#eee",}).attr('disabled',true);
}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);
}
});

@ -113,6 +113,9 @@ $(document).ready(function () {
} else {
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_http_version 1.1;

Loading…
Cancel
Save