From 812b2474d61a461646fd638c0539bb3d06387bda Mon Sep 17 00:00:00 2001 From: "taylor.dang" Date: Tue, 21 Apr 2020 18:11:34 +0800 Subject: [PATCH 001/110] =?UTF-8?q?[Y]=20apple=20=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../appclient/beans/AppleLoginBean.java | 28 +++++ .../appclient/core/RetailAppService.java | 11 +- .../core/impls/RetailAppServiceImp.java | 108 ++++++++++++------ .../appclient/web/RetailAppController.java | 49 +++++--- .../web/RetailValidationController.java | 91 ++++++++++----- .../mappers/system/ClientAccountMapper.java | 17 ++- .../signin/core/SignInAccountService.java | 2 + .../signin/core/SignInStatusManager.java | 3 + .../core/impls/SignInAccountServiceImpl.java | 13 ++- .../core/impls/SignInStatusManagerImpl.java | 70 ++++++++---- 11 files changed, 282 insertions(+), 112 deletions(-) create mode 100644 src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppleLoginBean.java diff --git a/pom.xml b/pom.xml index 5c1bb14a2..d469de5c8 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.5 + 2.2.6 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppleLoginBean.java b/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppleLoginBean.java new file mode 100644 index 000000000..34f3474e7 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/beans/AppleLoginBean.java @@ -0,0 +1,28 @@ +package au.com.royalpay.payment.manage.appclient.beans; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotEmpty; + +/** + * @author taylor.dang + * @date 2020-04-20 21:26 + */ +@Getter +@Setter +public class AppleLoginBean { + @JSONField(name = "identityToken") + @NotEmpty + private String identityToken; + @JSONField(name = "user") + @NotEmpty + private String user; + @JSONField(name = "devId") + @NotEmpty + private String devId; + @JSONField(name = "authorizationCode") + @NotEmpty + private String authorizationCode; +} diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java index 0f2e8bdf9..df98abc54 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailAppService.java @@ -1,9 +1,6 @@ package au.com.royalpay.payment.manage.appclient.core; -import au.com.royalpay.payment.manage.appclient.beans.AppClientBean; -import au.com.royalpay.payment.manage.appclient.beans.AppPaymentConfigBean; -import au.com.royalpay.payment.manage.appclient.beans.AppQueryBean; -import au.com.royalpay.payment.manage.appclient.beans.RetailAppMessage; +import au.com.royalpay.payment.manage.appclient.beans.*; import au.com.royalpay.payment.manage.merchants.beans.ClientAuthFilesInfo; import au.com.royalpay.payment.manage.merchants.beans.ClientKycFilesInfo; import au.com.royalpay.payment.manage.merchants.beans.ClientUpdateInfo; @@ -201,6 +198,8 @@ public interface RetailAppService { void updateLoginClientAccountPhone(JSONObject account,String contactPhone, String nationCode); void updateLoginClientAccountOpenId(JSONObject client,JSONObject params); + + void updateLoginClientAccountAppleId(JSONObject client,JSONObject params); /** * 退款密码 */ @@ -251,6 +250,10 @@ public interface RetailAppService { JSONObject bindAccountWechat(JSONObject device, JSONObject params); + JSONObject unbindAccountApple(JSONObject device); + + JSONObject bindAccountApple(JSONObject device, AppleLoginBean appleLoginBean); + JSONObject getAccountBindInfos(JSONObject device); JSONObject postAppMessage(JSONObject device, RetailAppMessage message); diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index 67690a50f..19e4fc2f2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -6,10 +6,7 @@ import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.manage.activities.app_index.core.AppActService; import au.com.royalpay.payment.manage.analysis.mappers.CustomerAndOrdersStatisticsMapper; import au.com.royalpay.payment.manage.analysis.mappers.TransactionAnalysisMapper; -import au.com.royalpay.payment.manage.appclient.beans.AppClientBean; -import au.com.royalpay.payment.manage.appclient.beans.AppPaymentConfigBean; -import au.com.royalpay.payment.manage.appclient.beans.AppQueryBean; -import au.com.royalpay.payment.manage.appclient.beans.RetailAppMessage; +import au.com.royalpay.payment.manage.appclient.beans.*; import au.com.royalpay.payment.manage.appclient.core.RetailAppService; import au.com.royalpay.payment.manage.appclient.extend.GatewayOAuthRegister; import au.com.royalpay.payment.manage.cashback.core.CashbackService; @@ -73,6 +70,8 @@ import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import au.com.royalpay.payment.tools.permission.enums.PartnerRole; import au.com.royalpay.payment.tools.threadpool.RoyalThreadPoolExecutor; import au.com.royalpay.payment.tools.utils.*; +import au.com.royalpay.payment.tools.utils.apple.AppleAuthUtils; +import au.com.royalpay.payment.tools.utils.apple.UserClaim; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -1782,7 +1781,7 @@ public class RetailAppServiceImp implements RetailAppService { if (geekShowActVersion(device.getString("version"))) { newActs.add(act); } - }else { + } else { newActs.add(act); } } @@ -2322,6 +2321,14 @@ public class RetailAppServiceImp implements RetailAppService { clientAccountMapper.update(updateAccount); } + @Override + public void updateLoginClientAccountAppleId(JSONObject account, JSONObject params) { + JSONObject updateAccount = new JSONObject(); + updateAccount.put("account_id", account.getString("account_id")); + updateAccount.put("apple_userid", params.getString("apple_userid")); + clientAccountMapper.update(updateAccount); + } + @Override public JSONObject unbindAccountPhone(JSONObject device, JSONObject params) { String codeKeyValueRedis = stringRedisTemplate.boundValueOps(getUpdateAccountPhoneKey(device.getString("account_id"))).get(); @@ -2379,6 +2386,36 @@ public class RetailAppServiceImp implements RetailAppService { return result; } + @Override + public JSONObject unbindAccountApple(JSONObject device) { + JSONObject account = new JSONObject(); + account.put("account_id", device.getString("account_id")); + account.put("apple_userid", null); + clientAccountMapper.update(account); + JSONObject result = new JSONObject(); + result.put("status", "success"); + return result; + } + + @Override + public JSONObject bindAccountApple(JSONObject device, AppleLoginBean appleLoginBean) { + UserClaim userClaim = AppleAuthUtils.verifyIdentifyToken(appleLoginBean.getIdentityToken()); + if (!StringUtils.equalsIgnoreCase(userClaim.getSub(), appleLoginBean.getUser())) { + throw new ForbiddenException("apple userinfo is error"); + } + JSONObject account = clientAccountMapper.findByAppleUserId(userClaim.getSub()); + if (account != null) { + throw new BadRequestException("Apple UserID has been bound to other accounts, please unbind it before binding"); + } + JSONObject updateAccount = new JSONObject(); + updateAccount.put("account_id", device.getString("account_id")); + updateAccount.put("apple_userid", userClaim.getSub()); + clientAccountMapper.update(updateAccount); + JSONObject result = new JSONObject(); + result.put("status", "success"); + return result; + } + @Override public JSONObject getAccountBindInfos(JSONObject device) { JSONObject account = clientAccountMapper.findById(device.getString("account_id")); @@ -2391,6 +2428,7 @@ public class RetailAppServiceImp implements RetailAppService { result.put("nation_code", account.getString("nation_code")); } result.put("wechat_bind_status", account.containsKey("wx_unionid")); + result.put("apple_bind_status", account.containsKey("apple_userid")); if (account.containsKey("wx_unionid")) { result.put("wechat_name", account.getString("wechat_name")); } @@ -2536,7 +2574,7 @@ public class RetailAppServiceImp implements RetailAppService { } JSONObject compliance = clientComplianceCompanyMapper.findFileByClientId(account.getIntValue("client_id")); if (compliance != null) { - if (compliance.getIntValue("status")==0 || compliance.getIntValue("status")==1) { + if (compliance.getIntValue("status") == 0 || compliance.getIntValue("status") == 1) { authFileStatus.put("client_less_file", false); } } @@ -2555,14 +2593,14 @@ public class RetailAppServiceImp implements RetailAppService { authFileStatus.put("content", messageSource.getMessage("client.auth.file.title", null, RequestEnvironment.getLocale())); List supplement_array = new ArrayList<>(); - JSONObject complianceFilesNotice = complianceFilesNotice(client,account); - JSONObject kycFilesNotice = kycFilesNotice(client,account); - - if(complianceFilesNotice != null && kycFilesNotice != null){ - if( !kycFilesNotice.getBoolean("client_less_file") && !complianceFilesNotice.getBoolean("client_less_file")){ - authFileStatus.put("isNeedShowKycAlert",false); - }else{ - authFileStatus.put("isNeedShowKycAlert",true); + JSONObject complianceFilesNotice = complianceFilesNotice(client, account); + JSONObject kycFilesNotice = kycFilesNotice(client, account); + + if (complianceFilesNotice != null && kycFilesNotice != null) { + if (!kycFilesNotice.getBoolean("client_less_file") && !complianceFilesNotice.getBoolean("client_less_file")) { + authFileStatus.put("isNeedShowKycAlert", false); + } else { + authFileStatus.put("isNeedShowKycAlert", true); } } if (PartnerRole.getRole(account.getIntValue("role")) == PartnerRole.CASHIER) { @@ -2652,20 +2690,20 @@ public class RetailAppServiceImp implements RetailAppService { complianceFilesNotice.put("auth_type", FilesAuthTypeEnum.COMPLIANCE.getAuthType()); complianceFilesNotice.put("type", messageSource.getMessage("client.auth.file.compliance.type", null, RequestEnvironment.getLocale())); - complianceFilesNotice.put("client_less_file",complianceFileStatus.getBoolean("client_less_file")); - if(compliance != null){ - if (compliance.getIntValue("status")==0 || compliance.getIntValue("status")==1) { + complianceFilesNotice.put("client_less_file", complianceFileStatus.getBoolean("client_less_file")); + if (compliance != null) { + if (compliance.getIntValue("status") == 0 || compliance.getIntValue("status") == 1) { complianceFilesNotice.put("client_less_file", false); } - if(complianceFileStatus.getBoolean("client_less_file")){ - complianceFilesNotice.put("client_refuse_reason",compliance.getString("description")); + if (complianceFileStatus.getBoolean("client_less_file")) { + complianceFilesNotice.put("client_refuse_reason", compliance.getString("description")); } - complianceFilesNotice.put("status",compliance.getString("status")); - complianceFilesNotice.put( "status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(compliance.getIntValue("status")) ); - }else if( !complianceFileStatus.getBoolean("client_less_file")){ - complianceFilesNotice.put( "status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(1) ); - }else{ - complianceFilesNotice.put( "status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(-1) ); + complianceFilesNotice.put("status", compliance.getString("status")); + complianceFilesNotice.put("status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(compliance.getIntValue("status"))); + } else if (!complianceFileStatus.getBoolean("client_less_file")) { + complianceFilesNotice.put("status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(1)); + } else { + complianceFilesNotice.put("status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(-1)); } complianceFilesNotice.put("status_type_description", messageSource.getMessage("client.auth.file.status." + complianceFilesNotice.getString("status_type").toLowerCase(), null, RequestEnvironment.getLocale())); return complianceFilesNotice; @@ -2683,15 +2721,15 @@ public class RetailAppServiceImp implements RetailAppService { kycFilesNotice.put("auth_type", FilesAuthTypeEnum.KYC.getAuthType()); kycFilesNotice.put("type", messageSource.getMessage("client.auth.file.kyc.type", null, RequestEnvironment.getLocale())); - kycFilesNotice.put("client_less_file",kycFileStatus.getBoolean("client_less_file")); - if(compliance != null){ - if(kycFilesNotice.getBoolean("client_less_file")){ - kycFilesNotice.put("client_refuse_reason",compliance.getString("description")); + kycFilesNotice.put("client_less_file", kycFileStatus.getBoolean("client_less_file")); + if (compliance != null) { + if (kycFilesNotice.getBoolean("client_less_file")) { + kycFilesNotice.put("client_refuse_reason", compliance.getString("description")); } - kycFilesNotice.put("status",compliance.getString("status")); - kycFilesNotice.put( "status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(compliance.getIntValue("status")) ); - }else{ - kycFilesNotice.put( "status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(-1) ); + kycFilesNotice.put("status", compliance.getString("status")); + kycFilesNotice.put("status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(compliance.getIntValue("status"))); + } else { + kycFilesNotice.put("status_type", FilesAuthStatusEnum.STATUS.getAuthStatus(-1)); } kycFilesNotice.put("status_type_description", messageSource.getMessage("client.auth.file.status." + kycFilesNotice.getString("status_type").toLowerCase(), null, RequestEnvironment.getLocale())); return kycFilesNotice; @@ -3103,7 +3141,7 @@ public class RetailAppServiceImp implements RetailAppService { int clientId = account.getIntValue("client_id"); JSONObject displayInfo = actPartnerReadMapper.displayInfo(actId, clientId, accountId); if (displayInfo == null) { - displayInfo = new JSONObject(){{ + displayInfo = new JSONObject() {{ put("display_client_id", UUID.randomUUID().toString()); put("act_id", actId); put("client_id", clientId); @@ -3117,7 +3155,7 @@ public class RetailAppServiceImp implements RetailAppService { int accountDisplayCount = displayInfo.getIntValue("display_count"); if (accountDisplayCount < displayCount) { displayInfo.put("last_read_time", new Date()); - displayInfo.put("display_count", (accountDisplayCount+1)); + displayInfo.put("display_count", (accountDisplayCount + 1)); actPartnerReadMapper.update(displayInfo); return false; } diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java index 24810e092..d92cf4dd7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailAppController.java @@ -3,10 +3,7 @@ package au.com.royalpay.payment.manage.appclient.web; import au.com.royalpay.payment.core.exceptions.ParamInvalidException; import au.com.royalpay.payment.manage.activities.app_index.core.AppActService; import au.com.royalpay.payment.manage.activities.monsettledelay.core.ActMonDelaySettleService; -import au.com.royalpay.payment.manage.appclient.beans.AppClientBean; -import au.com.royalpay.payment.manage.appclient.beans.AppPaymentConfigBean; -import au.com.royalpay.payment.manage.appclient.beans.AppQueryBean; -import au.com.royalpay.payment.manage.appclient.beans.RetailAppMessage; +import au.com.royalpay.payment.manage.appclient.beans.*; import au.com.royalpay.payment.manage.appclient.core.RetailAppService; import au.com.royalpay.payment.manage.bill.bean.NewBillBean; import au.com.royalpay.payment.manage.bill.bean.QueryBillBean; @@ -206,7 +203,7 @@ public class RetailAppController { @GetMapping("/notice/unread") public List latestNotice(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device) { - return retailAppService.getLatestNotice(device,device.getIntValue("client_id")); + return retailAppService.getLatestNotice(device, device.getIntValue("client_id")); } /* 消息模块end */ @@ -774,32 +771,53 @@ public class RetailAppController { * @throws Exception */ @PutMapping("/account/phone/unbind") - public JSONObject unbindAccountPhone(@ModelAttribute(RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject params) throws Exception { + public JSONObject unbindAccountPhone(@ModelAttribute(RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject params) throws Exception { return retailAppService.unbindAccountPhone(device, params); } /** * 微信绑定 - * @param device + * + * @param device * @param params */ @PutMapping("/account/wechat/bind") - public JSONObject bindAccountWechat(@ModelAttribute(RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject params){ - return retailAppService.bindAccountWechat(device,params); + public JSONObject bindAccountWechat(@ModelAttribute(RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject params) { + return retailAppService.bindAccountWechat(device, params); } /** * 微信解绑 + * * @param device */ @PutMapping("/account/wechat/unbind") - public JSONObject unbindAccountWechat(@ModelAttribute(RETAIL_DEVICE) JSONObject device){ + public JSONObject unbindAccountWechat(@ModelAttribute(RETAIL_DEVICE) JSONObject device) { return retailAppService.unbindAccountWechat(device); } + /** + * Apple绑定 + * + * @param device + */ + @PutMapping("/account/apple/bind") + public JSONObject bindAccountApple(@ModelAttribute(RETAIL_DEVICE) JSONObject device, @Valid @RequestBody AppleLoginBean appleLoginBean) { + return retailAppService.bindAccountApple(device, appleLoginBean); + } + /** + * Apple解绑 + * + * @param device + */ + @PutMapping("/account/apple/unbind") + public JSONObject unbindAccountApple(@ModelAttribute(RETAIL_DEVICE) JSONObject device) { + return retailAppService.unbindAccountApple(device); + } + /** * 验证退款密码 @@ -918,9 +936,9 @@ public class RetailAppController { * @param device */ @PostMapping("/client/kyc_auth_file") - public JSONObject uploadKycAuthFiles(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, @RequestParam MultipartFile file, @RequestParam("fileType") String fileType)throws Exception{ + public JSONObject uploadKycAuthFiles(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, @RequestParam MultipartFile file, @RequestParam("fileType") String fileType) throws Exception { JSONObject fileInfo = attachmentClient.uploadFile(file, false); - retailAppService.uploadKycAuthFilesForApp(device, fileInfo,fileType); + retailAppService.uploadKycAuthFilesForApp(device, fileInfo, fileType); return fileInfo; } @@ -930,7 +948,7 @@ public class RetailAppController { * @param device */ @PostMapping("/client/auth_file/commit_to_kyc") - public void commitToKycAuthFiles(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device,@RequestBody JSONObject params) { + public void commitToKycAuthFiles(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device, @RequestBody JSONObject params) { retailAppService.commitAuthFilesToKyc(device, params); } @@ -960,12 +978,13 @@ public class RetailAppController { /** * 登录用户绑定信息(手机、第三方) + * * @param device * @return */ @GetMapping("/client/account/bind/infos") - public JSONObject findClientAccountBindStatusInfos(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device){ - return retailAppService.getAccountBindInfos(device); + public JSONObject findClientAccountBindStatusInfos(@ModelAttribute(CommonConsts.RETAIL_DEVICE) JSONObject device) { + return retailAppService.getAccountBindInfos(device); } } diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailValidationController.java b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailValidationController.java index 909e0ab93..54fb00fff 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailValidationController.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RetailValidationController.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage.appclient.web; +import au.com.royalpay.payment.manage.appclient.beans.AppleLoginBean; import au.com.royalpay.payment.manage.appclient.beans.RetailLoginInfo; import au.com.royalpay.payment.manage.appclient.core.ManageAppService; import au.com.royalpay.payment.manage.appclient.core.RetailAppService; @@ -138,6 +139,35 @@ public class RetailValidationController implements ApplicationEventPublisherAwar return res; } + @PostMapping("/apple_signin") + public JSONObject mchAppleSignIn(@Valid @RequestBody AppleLoginBean appleLoginBean) { + return signInStatusManager.mchAppleSignIn(appleLoginBean); + } + + /** + * 微信绑定登录账号 + * + * @param params + * @return + */ + @PostMapping("/login/apple_bind") + public JSONObject appleLoginBind(@RequestBody JSONObject params) { + LoginInfo loginInfo = new LoginInfo(); + loginInfo.setLoginId(params.getString("loginId")); + loginInfo.setPassword(params.getString("password")); + String signKey = signInStatusManager.verifyClientAccountLogin(loginInfo, "apple"); + JSONObject account = signInStatusManager.getCurrentClient(signKey); + retailAppService.updateLoginClientAccountAppleId(account, params); + account = JSON.parseObject(account.toJSONString()); + JSONObject result = new JSONObject(); + account.put("sign_key", signKey); + result.put("account", account); + result.put("bind_status", true); + result.put("status", "success"); + this.publisher.publishEvent(new ClientLoginEvent(this, account.getIntValue("client_id"), account.getString("account_id"), RequestEnvironment.getClientIp(), "wechat")); + return result; + } + @GetMapping("/captcha") public JSONObject getCaptchaForDevice(@RequestParam(defaultValue = "false") boolean imgurl) throws IOException { String capText = RandomStringUtils.random(4, false, true); @@ -186,9 +216,9 @@ public class RetailValidationController implements ApplicationEventPublisherAwar @PostMapping("/send/{phone_number}/verify_code") @ResponseBody public JSONObject sendLoginMobileVerifyCode(@PathVariable("phone_number") String phoneNumber, - @RequestParam("nation_code") @NotEmpty(message = "nation code can't be null") String nationCode, - HttpServletRequest request) { - simpleClientApplyService.getAndSendLoginSmsCode(phoneNumber, nationCode, request); + @RequestParam("nation_code") @NotEmpty(message = "nation code can't be null") String nationCode, + HttpServletRequest request) { + simpleClientApplyService.getAndSendLoginSmsCode(phoneNumber, nationCode, request); return new JSONObject(); } @@ -201,58 +231,59 @@ public class RetailValidationController implements ApplicationEventPublisherAwar */ @PostMapping("/login/verify/{contact_phone}/verify_code") public JSONObject verifyLoginMobileCode(@PathVariable("contact_phone") String contactPhone, - @RequestParam("nation_code") @NotEmpty(message = "nation code can't be null") String nationCode, - @RequestBody JSONObject params, - @ModelAttribute(CommonConsts.MANAGER_DEVICE) JSONObject device, + @RequestParam("nation_code") @NotEmpty(message = "nation code can't be null") String nationCode, + @RequestBody JSONObject params, + @ModelAttribute(CommonConsts.MANAGER_DEVICE) JSONObject device, Errors errors) { HttpUtils.handleValidErrors(errors); JSONObject result = new JSONObject(); simpleClientApplyService.verifyLoginSMSCode(params.getString("verify_code"), contactPhone); String signKey = signInStatusManager.getClientInfoByPhoneStatusKey(contactPhone, nationCode); - if(signKey!=null){ + if (signKey != null) { JSONObject account = signInStatusManager.getCurrentClient(signKey); account = JSON.parseObject(account.toJSONString()); if (params.getString("devId") != null) { deviceSupport.validDeviceWithClient(account, params.getString("devId")); } account.put("sign_key", signKey); - result.put("account",account); - result.put("status","success"); + result.put("account", account); + result.put("status", "success"); result.put("bind_status", true); this.publisher.publishEvent(new ClientLoginEvent(this, account.getIntValue("client_id"), account.getString("account_id"), RequestEnvironment.getClientIp(), "MOBILE")); - }else{ - result.put("status","success"); + } else { + result.put("status", "success"); result.put("bind_status", false); - result.put("contact_phone",contactPhone); - result.put("nation_code",nationCode); + result.put("contact_phone", contactPhone); + result.put("nation_code", nationCode); } return result; } /** * 手机登录-绑定账号 + * * @param contactPhone * @param nationCode * @param params */ @PostMapping("/login/mobile/{contact_phone}/bind") - public JSONObject mobileLoginBind(@PathVariable("contact_phone")String contactPhone, - @RequestParam("nation_code") @NotEmpty(message = "nation code can't be null") String nationCode, - @RequestBody JSONObject params, - Errors errors){ + public JSONObject mobileLoginBind(@PathVariable("contact_phone") String contactPhone, + @RequestParam("nation_code") @NotEmpty(message = "nation code can't be null") String nationCode, + @RequestBody JSONObject params, + Errors errors) { HttpUtils.handleValidErrors(errors); LoginInfo loginInfo = new LoginInfo(); loginInfo.setLoginId(params.getString("loginId")); loginInfo.setPassword(params.getString("password")); - String signKey = signInStatusManager.verifyClientAccountLogin(loginInfo,"phone"); - signInStatusManager.verifyClientLoginPhoneBindCode(contactPhone,nationCode); + String signKey = signInStatusManager.verifyClientAccountLogin(loginInfo, "phone"); + signInStatusManager.verifyClientLoginPhoneBindCode(contactPhone, nationCode); JSONObject account = signInStatusManager.getCurrentClient(signKey); - retailAppService.updateLoginClientAccountPhone(account, contactPhone,nationCode); + retailAppService.updateLoginClientAccountPhone(account, contactPhone, nationCode); account.put("sign_key", signKey); account = JSON.parseObject(account.toJSONString()); JSONObject result = new JSONObject(); - result.put("account",account); + result.put("account", account); result.put("bind_status", true); this.publisher.publishEvent(new ClientLoginEvent(this, account.getIntValue("client_id"), account.getString("account_id"), RequestEnvironment.getClientIp(), "MOBILE")); return result; @@ -260,6 +291,7 @@ public class RetailValidationController implements ApplicationEventPublisherAwar /** * 商戶端App微信授权登录 + * * @param params * @return */ @@ -268,7 +300,7 @@ public class RetailValidationController implements ApplicationEventPublisherAwar Errors errors) { HttpUtils.handleValidErrors(errors); JSONObject account = signInStatusManager.clientAppWechatSignIn(params.getString("code")); - if(!account.getBoolean("bind_status")){ + if (!account.getBoolean("bind_status")) { deviceSupport.validDeviceWithClient(account, params.getString("app_openid")); return account; } @@ -278,26 +310,27 @@ public class RetailValidationController implements ApplicationEventPublisherAwar /** * 微信绑定登录账号 + * * @param params * @return */ @PostMapping("/login/wechat_bind") - public JSONObject wechatLoginBind(@RequestBody JSONObject params){ + public JSONObject wechatLoginBind(@RequestBody JSONObject params) { LoginInfo loginInfo = new LoginInfo(); loginInfo.setLoginId(params.getString("loginId")); loginInfo.setPassword(params.getString("password")); - String signKey = signInStatusManager.verifyClientAccountLogin(loginInfo,"wechat"); + String signKey = signInStatusManager.verifyClientAccountLogin(loginInfo, "wechat"); JSONObject wechatInfo = signInStatusManager.verifyClientLoginWechatBindCode(params.getString("wechat_openid")); JSONObject account = signInStatusManager.getCurrentClient(signKey); - params.put("nick_name",wechatInfo.getString("nick_name")); - params.put("union_id",wechatInfo.getString("union_id")); - retailAppService.updateLoginClientAccountOpenId(account,params); + params.put("nick_name", wechatInfo.getString("nick_name")); + params.put("union_id", wechatInfo.getString("union_id")); + retailAppService.updateLoginClientAccountOpenId(account, params); account = JSON.parseObject(account.toJSONString()); JSONObject result = new JSONObject(); account.put("sign_key", signKey); - result.put("account",account); + result.put("account", account); result.put("bind_status", true); - result.put("status","success"); + result.put("status", "success"); this.publisher.publishEvent(new ClientLoginEvent(this, account.getIntValue("client_id"), account.getString("account_id"), RequestEnvironment.getClientIp(), "wechat")); return result; } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java index 854e38c19..fc868bd32 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAccountMapper.java @@ -28,7 +28,7 @@ public interface ClientAccountMapper { @AutoSql(SqlType.SELECT) @AdvanceSelect(addonWhereClause = "is_valid=1") - List findByPhone(@Param("contact_phone") String contact_phone,@Param("nation_code")String nation_code); + List findByPhone(@Param("contact_phone") String contact_phone, @Param("nation_code") String nation_code); @AutoSql(SqlType.SELECT) JSONObject findDetail(@Param("account_id") String accountId); @@ -51,6 +51,10 @@ public interface ClientAccountMapper { @AdvanceSelect(addonWhereClause = "is_valid=1", excludeColumns = {"salt", "password_hash"}) JSONObject findByAppOpenId(@Param("wxapp_openid") String openId); + @AutoSql(SqlType.SELECT) + @AdvanceSelect(addonWhereClause = "is_valid=1", excludeColumns = {"salt", "password_hash"}) + JSONObject findByAppleUserId(@Param("apple_userid") String appleUserId); + @AutoSql(SqlType.SELECT) @AdvanceSelect(addonWhereClause = "is_valid=1", excludeColumns = {"salt", "password_hash"}) JSONObject findByWxUnioinId(@Param("wx_unionid") String wx_unionid); @@ -85,22 +89,23 @@ public interface ClientAccountMapper { /** * 获取绑定微信的最新账号 + * * @param unionId * @return */ - JSONObject findOneByUnionIdAndCreateTimeDesc(@Param("wx_unionid")String unionId); + JSONObject findOneByUnionIdAndCreateTimeDesc(@Param("wx_unionid") String unionId); - JSONObject findOneByPhoneAndCreateTimeDesc(@Param("contact_phone")String contactPhone,@Param("nation_code")String nationCode); + JSONObject findOneByPhoneAndCreateTimeDesc(@Param("contact_phone") String contactPhone, @Param("nation_code") String nationCode); @AutoSql(SqlType.SELECT) @AdvanceSelect(addonWhereClause = "is_valid=1", excludeColumns = {"salt", "password_hash"}) - List findByWechatOpenId(@Param("wechat_openid")String openid); + List findByWechatOpenId(@Param("wechat_openid") String openid); @AutoSql(SqlType.SELECT) @AdvanceSelect(addonWhereClause = "is_valid=1", excludeColumns = {"salt", "password_hash"}) - List findByWechatUnionId(@Param("wx_unionid")String unionId); + List findByWechatUnionId(@Param("wx_unionid") String unionId); @AutoSql(SqlType.SELECT) - JSONObject findRSvcClientInfo(@Param("account_id")String accountId); + JSONObject findRSvcClientInfo(@Param("account_id") String accountId); } diff --git a/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInAccountService.java b/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInAccountService.java index 7e44371cd..5cc63f8a7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInAccountService.java +++ b/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInAccountService.java @@ -48,6 +48,8 @@ public interface SignInAccountService { JSONObject clientWechatAppSignIn(String openId); + JSONObject clientAppleSignIn(String appleUserId); + JSONObject clientWechatAppSignInByUnionId(String unionId); String ForgetPassword(String partner_code) throws Exception; diff --git a/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInStatusManager.java b/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInStatusManager.java index 94ada22e5..b6ef0c88e 100644 --- a/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInStatusManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/signin/core/SignInStatusManager.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage.signin.core; +import au.com.royalpay.payment.manage.appclient.beans.AppleLoginBean; import au.com.royalpay.payment.manage.signin.beans.LoginInfo; import com.alibaba.fastjson.JSONObject; import org.springframework.web.servlet.ModelAndView; @@ -50,6 +51,8 @@ public interface SignInStatusManager { JSONObject partnerWechatAppSignIn(String code); + JSONObject mchAppleSignIn(AppleLoginBean appleLoginBean); + String clientWechatSignIn(String openid); JSONObject newClientWechatSignInQRCode(); diff --git a/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java index 47176c010..d8d6fd340 100644 --- a/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInAccountServiceImpl.java @@ -394,6 +394,17 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati return account; } + @Override + public JSONObject clientAppleSignIn(String appleUserId) { + JSONObject account = clientAccountMapper.findByAppleUserId(appleUserId); + if (account == null) { + return null; + } + publisher.publishEvent( + new ClientLoginEvent(this, account.getIntValue("client_id"), account.getString("account_id"), RequestEnvironment.getClientIp(), "wechat")); + return account; + } + @Override public JSONObject clientWechatAppSignInByUnionId(String unionId) { if (StringUtils.isBlank(unionId) || unionId == "" || unionId == null) { @@ -498,7 +509,7 @@ public class SignInAccountServiceImpl implements SignInAccountService, Applicati "company_phone", "suburb", "postcode", "state", "contact_person", "contact_phone", "contact_email", "short_name", "logo_url", "enable_refund", "enable_refund_auth", "retail_surcharge", "require_custinfo", "require_remark", "logo_thumbnail", "creator", "create_time", "approver", "approve_result", "approve_time", "open_status", "timezone", "has_children", "source", "customer_surcharge_rate", "enable_alipay", "enable_wechat", - "enable_bestpay", "manual_settle", "skip_clearing", "mail_confirm", "surcharge_mode", "company_photo", "store_photo", "company_website", "contact_job", "sub_manage","enable_rpaypmt_card","enable_rpaypmt_dd"}; + "enable_bestpay", "manual_settle", "skip_clearing", "mail_confirm", "surcharge_mode", "company_photo", "store_photo", "company_website", "contact_job", "sub_manage", "enable_rpaypmt_card", "enable_rpaypmt_dd"}; for (String col : columns) { simpleClient.put(col, client.get(col)); } diff --git a/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInStatusManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInStatusManagerImpl.java index 2acc88797..0f9952ecc 100644 --- a/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInStatusManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/signin/core/impls/SignInStatusManagerImpl.java @@ -1,5 +1,6 @@ package au.com.royalpay.payment.manage.signin.core.impls; +import au.com.royalpay.payment.manage.appclient.beans.AppleLoginBean; import au.com.royalpay.payment.manage.mappers.system.ClientAccountMapper; import au.com.royalpay.payment.manage.signin.beans.LoginInfo; import au.com.royalpay.payment.manage.signin.core.SignInAccountService; @@ -10,6 +11,8 @@ import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.ForbiddenException; import au.com.royalpay.payment.tools.permission.enums.ManagerRole; import au.com.royalpay.payment.tools.utils.QRCodeUtils; +import au.com.royalpay.payment.tools.utils.apple.AppleAuthUtils; +import au.com.royalpay.payment.tools.utils.apple.UserClaim; import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; @@ -38,7 +41,7 @@ public class SignInStatusManagerImpl implements SignInStatusManager { @Resource private ClientAccountMapper clientAccountMapper; private final String CLIENT_LOGIN_WECHAT_BIND_PREFIX = "CLIENT_LOGIN_WECHAT_BIND_PREFIX"; - private final String CLIENT_LOGIN_PHONE_BIND_PREFIX = "CLIENT_LOGIN_PHONE_BIND_PREFIX"; + private final String CLIENT_LOGIN_PHONE_BIND_PREFIX = "CLIENT_LOGIN_PHONE_BIND_PREFIX"; @Override public JSONObject getCurrentManager(String statusKey) { @@ -63,9 +66,7 @@ public class SignInStatusManagerImpl implements SignInStatusManager { return null; } op.expire(30, TimeUnit.MINUTES); - - JSONObject account = signInAccountService.getClient(accountId); - return account; + return signInAccountService.getClient(accountId); } private String partnerLoginRedisKey(String statusKey) { @@ -86,7 +87,7 @@ public class SignInStatusManagerImpl implements SignInStatusManager { JSONObject account = clientAccountMapper.findOneByPhoneAndCreateTimeDesc(phone, "+" + nationCode); if (account == null) { String expireMin = "5"; - stringRedisTemplate.boundValueOps(getClientLoginPhoneBindRedisKey(phone,nationCode)).set(phone, Long.parseLong(expireMin), TimeUnit.MINUTES); + stringRedisTemplate.boundValueOps(getClientLoginPhoneBindRedisKey(phone, nationCode)).set(phone, Long.parseLong(expireMin), TimeUnit.MINUTES); return null; } stringRedisTemplate.boundValueOps(partnerLoginRedisKey(statusKey)).set(account.getString("account_id") + "", 30, TimeUnit.MINUTES); @@ -99,11 +100,14 @@ public class SignInStatusManagerImpl implements SignInStatusManager { @Override public String verifyClientAccountLogin(LoginInfo loginInfo, String verfiyType) { - JSONObject account = signInAccountService.clientAccountCheck(loginInfo);; + JSONObject account = signInAccountService.clientAccountCheck(loginInfo); if ("phone".equals(verfiyType)) { if (account.containsKey("contact_phone")) { throw new BadRequestException("The account has been linked to the phone number!"); } + } else if (StringUtils.equalsIgnoreCase("apple", verfiyType) + && StringUtils.isNotEmpty(account.getString("apple_userid"))) { + throw new BadRequestException("The account has been binded and exist appleId!"); } else { if (account.containsKey("wechat_openid")) { throw new BadRequestException("The account has been linked to the wechat!"); @@ -286,6 +290,31 @@ public class SignInStatusManagerImpl implements SignInStatusManager { return account; } + @Override + public JSONObject mchAppleSignIn(AppleLoginBean appleLoginBean) { + UserClaim userClaim = AppleAuthUtils.verifyIdentifyToken(appleLoginBean.getIdentityToken()); + if (!StringUtils.equalsIgnoreCase(userClaim.getSub(), appleLoginBean.getUser())) { + throw new ForbiddenException("apple userinfo is error"); + } + JSONObject account = signInAccountService.clientAppleSignIn(userClaim.getSub()); + if (account == null || account.isEmpty()) { + return new JSONObject() {{ + put("apple_userid", userClaim.getSub()); + put("bind_status", false); + }}; + } + String statusKey = newStatusKey(); + JSONObject result = new JSONObject(); + stringRedisTemplate.boundValueOps(partnerLoginRedisKey(statusKey)).set(account.getString("account_id") + "", 30, TimeUnit.MINUTES); + account = getCurrentClient(statusKey); + account.put("sign_key", statusKey); + result.put("account", account); + account.put("apple_userid", userClaim.getSub()); + result.put("bind_status", true); + result.put("status", "success"); + return result; + } + @Override public String clientWechatSignIn(String openid) { JSONObject account = signInAccountService.clientWechatSignIn(openid); @@ -391,21 +420,21 @@ public class SignInStatusManagerImpl implements SignInStatusManager { @Override public JSONObject clientAppWechatSignIn(String code) { JSONObject user = mpClientAppWechatApiProvider.getApi("merchant-app").appLoginUser(code); - if(user==null){ + if (user == null) { throw new BadRequestException("WeChat users do not exist"); } String unionId = user.getString("unionid"); String openId = user.getString("openid"); JSONObject account = signInAccountService.clientWechatOneSignIn(unionId); if (account == null) { - JSONObject wechatUserInfo = mpClientAppWechatApiProvider.getApi("merchant-app").appUserInfo(openId,user.getString("access_token")); + JSONObject wechatUserInfo = mpClientAppWechatApiProvider.getApi("merchant-app").appUserInfo(openId, user.getString("access_token")); JSONObject res = new JSONObject(); String nickName = wechatUserInfo.getString("nickname"); res.put("bind_status", false); res.put("app_openid", openId); res.put("status", "success"); String expireMin = "5"; - stringRedisTemplate.boundValueOps(getClientLoginWechatBindRedisKey(openId)).set(openId+"&"+nickName+"&"+unionId, Long.parseLong(expireMin), TimeUnit.MINUTES); + stringRedisTemplate.boundValueOps(getClientLoginWechatBindRedisKey(openId)).set(openId + "&" + nickName + "&" + unionId, Long.parseLong(expireMin), TimeUnit.MINUTES); return res; } String statusKey = newStatusKey(); @@ -413,20 +442,20 @@ public class SignInStatusManagerImpl implements SignInStatusManager { stringRedisTemplate.boundValueOps(partnerLoginRedisKey(statusKey)).set(account.getString("account_id") + "", 30, TimeUnit.MINUTES); account = getCurrentClient(statusKey); account.put("sign_key", statusKey); - result.put("account",account); + result.put("account", account); result.put("app_openid", unionId); result.put("bind_status", true); result.put("status", "success"); return result; } - private String getClientLoginWechatBindRedisKey(String openId){ - return "login:"+":"+CLIENT_LOGIN_WECHAT_BIND_PREFIX + "&"+openId; + private String getClientLoginWechatBindRedisKey(String openId) { + return "login:" + ":" + CLIENT_LOGIN_WECHAT_BIND_PREFIX + "&" + openId; } @Override - public JSONObject verifyClientLoginWechatBindCode(String openId){ + public JSONObject verifyClientLoginWechatBindCode(String openId) { String rediskey = getClientLoginWechatBindRedisKey(openId); String codeValue = stringRedisTemplate.boundValueOps(rediskey).get(); if (codeValue == null || !codeValue.split("&")[0].equals(openId)) { @@ -435,18 +464,18 @@ public class SignInStatusManagerImpl implements SignInStatusManager { String nickName = codeValue.split("&")[1]; String unionId = codeValue.split("&")[2]; stringRedisTemplate.delete(rediskey); - return new JSONObject(){{ - put("nick_name",nickName); - put("union_id",unionId); + return new JSONObject() {{ + put("nick_name", nickName); + put("union_id", unionId); }}; } - private String getClientLoginPhoneBindRedisKey(String phone,String nationCode){ - return "login:"+CLIENT_LOGIN_PHONE_BIND_PREFIX + "&"+nationCode+"&"+phone; + private String getClientLoginPhoneBindRedisKey(String phone, String nationCode) { + return "login:" + CLIENT_LOGIN_PHONE_BIND_PREFIX + "&" + nationCode + "&" + phone; } - public void verifyClientLoginPhoneBindCode(String phone,String nationCode){ - String rediskey = getClientLoginPhoneBindRedisKey(phone,nationCode); + public void verifyClientLoginPhoneBindCode(String phone, String nationCode) { + String rediskey = getClientLoginPhoneBindRedisKey(phone, nationCode); String codeValue = stringRedisTemplate.boundValueOps(rediskey).get(); if (codeValue == null || !codeValue.equals(phone)) { throw new BadRequestException("The phone number is for application binding"); @@ -455,7 +484,6 @@ public class SignInStatusManagerImpl implements SignInStatusManager { } - private void lockRandomCodeId(String codeId) { stringRedisTemplate.boundValueOps(redisPrefix + "partner_signin" + codeId).set(codeId, 30, TimeUnit.SECONDS); } From abd0df8d5edcca70fc73d7e18ed961e59034f19e Mon Sep 17 00:00:00 2001 From: "taylor.dang" Date: Tue, 21 Apr 2020 18:17:37 +0800 Subject: [PATCH 002/110] update --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d469de5c8..1c886dbbc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ au.com.royalpay.payment payment-parent - 2.1.25 + 2.1.26 4.0.0 manage From ff33494391099b7b2dcc36142a84443787767476 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 22 Apr 2020 11:36:35 +0800 Subject: [PATCH 003/110] =?UTF-8?q?Upd:=E4=BF=AE=E5=A4=8D=E5=95=86?= =?UTF-8?q?=E6=88=B7=E6=94=AF=E4=BB=98=E9=85=8D=E7=BD=AE-=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=AD=90=E5=95=86=E6=88=B7id=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8E=E5=BC=B9=E6=A1=86=E4=B8=8D=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1c886dbbc..19eca1053 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.6 + 2.2.7 UTF-8 1.8.0 From 4fa6d70ee1277e9d9d7ef57564fe9f8dff79f349 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 22 Apr 2020 11:36:58 +0800 Subject: [PATCH 004/110] =?UTF-8?q?Upd:=E4=BF=AE=E5=A4=8D=E5=95=86?= =?UTF-8?q?=E6=88=B7=E6=94=AF=E4=BB=98=E9=85=8D=E7=BD=AE-=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=AD=90=E5=95=86=E6=88=B7id=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8E=E5=BC=B9=E6=A1=86=E4=B8=8D=E6=B6=88=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/ui/static/payment/partner/partner-manage.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index d0394b4a5..2db44bf3f 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -1958,6 +1958,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.saveSubMerchantId = function () { $http.put('/sys/partners/' + $scope.partner.client_moniker + '/payment_config', {sub_merchant_id: $scope.paymentInfo.sub_merchant_id}).then(function (resp) { $scope.refreshWechatInstitutionMerchantId(); + $scope.ctrl.editSubMerchant = false; }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) }); @@ -1965,8 +1966,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.refreshWechatInstitutionMerchantId = function () { $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_institution_merchant_id', {wechat_institution_merchant_id: $scope.paymentInfo.wechat_institution_merchant_id}).then(function (resp) { + debugger $scope.loadPartnerPaymentInfo(); }, function (resp) { + debugger commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) }); }; From 9bc63da27b6aaa3c44e57b80337993d6a2368af6 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 22 Apr 2020 11:50:17 +0800 Subject: [PATCH 005/110] =?UTF-8?q?Upd:=E5=95=86=E6=88=B7=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=A2=9E=E5=8A=A0IT=E8=81=94=E7=B3=BB=E4=BA=BA?= =?UTF-8?q?=E9=82=AE=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/merchants/beans/ClientRegisterInfo.java | 10 ++++++++++ .../payment/partner/templates/add_partner.html | 10 ++++++++++ .../payment/partner/templates/partner_detail.html | 10 ++++++++++ .../payment/partner/templates/partner_edit.html | 12 +++++++++++- 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java index 5a961a42b..8ccdcc9c3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java @@ -112,6 +112,8 @@ public class ClientRegisterInfo { private String client_pay_type; @NotEmpty(message = "error.payment.valid.param_missing") private String client_pay_desc; + @JSONField(name = "it_contact_person_email") + private String itContactPersonEmail; public JSONObject insertObject() { JSONObject res = (JSONObject) JSON.toJSON(this); @@ -550,4 +552,12 @@ public class ClientRegisterInfo { public void setMarketingWechatId(String marketingWechatId) { this.marketingWechatId = marketingWechatId; } + + public String getItContactPersonEmail() { + return itContactPersonEmail; + } + + public void setItContactPersonEmail(String itContactPersonEmail) { + this.itContactPersonEmail = itContactPersonEmail; + } } diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 1bec9f8b7..6ebd8ff88 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -669,6 +669,16 @@ Characters(including symbols and spaces)

+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index 2c2a33896..d9a07d714 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -578,7 +578,16 @@ Characters(including symbols and spaces)

- + +
+ +
+ +
+
+
From 0f7f855ffad0b5995d3d19126974edb5674033ac Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 22 Apr 2020 13:48:17 +0800 Subject: [PATCH 006/110] =?UTF-8?q?Upd:=E5=95=86=E6=88=B7=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=A2=9E=E5=8A=A0IT=E8=81=94=E7=B3=BB=E4=BA=BA?= =?UTF-8?q?=E9=82=AE=E7=AE=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../partner/templates/client_partner_detail.html | 10 +++++++++- .../payment/partner/templates/client_partner_edit.html | 9 +++++++++ .../payment/partner/templates/partner_detail.html | 6 +++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/client_partner_detail.html b/src/main/ui/static/payment/partner/templates/client_partner_detail.html index 2a1f185f7..e13c7127f 100644 --- a/src/main/ui/static/payment/partner/templates/client_partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/client_partner_detail.html @@ -390,9 +390,17 @@
+ +
+ +
+

+ +

+
+
-

diff --git a/src/main/ui/static/payment/partner/templates/client_partner_edit.html b/src/main/ui/static/payment/partner/templates/client_partner_edit.html index 7cb3edb4f..40b9b1cbf 100644 --- a/src/main/ui/static/payment/partner/templates/client_partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/client_partner_edit.html @@ -392,6 +392,15 @@ Characters(including symbols and spaces)

+ +
+ +
+ +
+
+ +
+
Card Payment Config
+
+
+ +
+ +
+ +
+
+
+
+
+
Retail In Store Payment(App, WePayLite, Albert)
From 9d4f6375cf3994dace9e408f56de1c000f03bcf4 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 23 Apr 2020 16:59:22 +0800 Subject: [PATCH 014/110] update 2.1.28 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4b1215746..d9906ee3d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.26 + 2.1.28 4.0.0 manage - 2.2.8 + 2.2.9 UTF-8 1.8.0 From c952aab8ce904bc4146e5049faf5dab9f661a1fb Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 23 Apr 2020 18:05:27 +0800 Subject: [PATCH 015/110] add synchronizedScheduler citypartner prize --- pom.xml | 2 +- .../manage/task/OrgCommissionTask.java | 24 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index d9906ee3d..3b96f3bfc 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.9 + 2.2.10 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/task/OrgCommissionTask.java b/src/main/java/au/com/royalpay/payment/manage/task/OrgCommissionTask.java index 614ef9212..1a7a42647 100644 --- a/src/main/java/au/com/royalpay/payment/manage/task/OrgCommissionTask.java +++ b/src/main/java/au/com/royalpay/payment/manage/task/OrgCommissionTask.java @@ -5,10 +5,12 @@ import au.com.royalpay.payment.tools.scheduler.SynchronizedScheduler; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Calendar; import java.util.Date; +import java.util.List; @Component @ConditionalOnProperty(value = "app.run-tasks", havingValue = "true") @@ -21,16 +23,18 @@ public class OrgCommissionTask { @Scheduled(cron = "0 15 0 1 * ?") public void generateOrgCommission() { - Calendar monthCal = Calendar.getInstance(); - monthCal.setTime(new Date()); - int year = monthCal.get(Calendar.YEAR); - int month = monthCal.get(Calendar.MONTH); - if (month == 0) { - year = year - 1; - month = 12; - } - String monthStr = year + "-" + month; - cityPartnerPrizeService.generate(monthStr); + synchronizedScheduler.executeProcess("manage_task:cityPartnerPrize", 120_000, () -> { + Calendar monthCal = Calendar.getInstance(); + monthCal.setTime(new Date()); + int year = monthCal.get(Calendar.YEAR); + int month = monthCal.get(Calendar.MONTH); + if (month == 0) { + year = year - 1; + month = 12; + } + String monthStr = year + "-" + month; + cityPartnerPrizeService.generate(monthStr); + }); } } From d98f927d16b2b38dfa355926d8b2c08702d1ac00 Mon Sep 17 00:00:00 2001 From: yixian Date: Fri, 24 Apr 2020 11:42:44 +1000 Subject: [PATCH 016/110] send settle email notify details --- .../management/clearing/core/impl/CleanServiceImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java index 927780431..ed54117d0 100644 --- a/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/management/clearing/core/impl/CleanServiceImpl.java @@ -3,6 +3,7 @@ package au.com.royalpay.payment.manage.management.clearing.core.impl; import au.com.royalpay.payment.core.PaymentApi; import au.com.royalpay.payment.core.exceptions.InvalidShortIdException; import au.com.royalpay.payment.core.tasksupport.SettlementSupport; +import au.com.royalpay.payment.core.utils.ExtParamsUtils; import au.com.royalpay.payment.manage.management.clearing.core.CleanService; import au.com.royalpay.payment.manage.mappers.log.*; import au.com.royalpay.payment.manage.mappers.payment.TaskManualSettleMapper; @@ -1433,7 +1434,12 @@ public class CleanServiceImpl implements CleanService, ManagerTodoNoticeProvider settleMailRecord.put("notice_status", 0); logSettleMailMapper.save(settleMailRecord); } - sendTaskFinishMessages(ManagerRole.FINANCIAL_STAFF, "清算文件已发送清算方", "发送清算通知"); + String detailDescription = clearLogs.stream() + .map(log -> String.format("[%s]%s", log.getString("clearing_id"), + ExtParamsUtils.getExtParamsValue(log.getString("plan_detail"), + detail -> StringUtils.defaultIfEmpty(detail.getString("remark"), detail.getString("plan_id"))))) + .collect(Collectors.joining(",")); + sendTaskFinishMessages(ManagerRole.FINANCIAL_STAFF, "清算文件已发送清算方:"+detailDescription, "发送清算通知"); if (autoMarkSent) { if (!clearIds.isEmpty()) { clearingLogMapper.lockSettlementsById(clearLogs.stream().map(log -> log.getString("clearing_id")).collect(Collectors.toList())); From 33dd59d2237665499ee7ea0e1f1a368c894ce35b Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 24 Apr 2020 14:21:09 +0800 Subject: [PATCH 017/110] =?UTF-8?q?add=20gateway=E3=80=81channel=20analysi?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../core/impls/DashboardServiceImpl.java | 6 +- .../CustomerAndOrdersStatisticsMapper.xml | 2 +- .../mappers/TransactionAnalysisMapper.xml | 8 + .../ui/static/analysis/channels_analysis.js | 77 ++++- .../config/organizations/organizations.js | 13 + .../templates/org_detail_parent.html | 274 ++++-------------- 7 files changed, 154 insertions(+), 228 deletions(-) diff --git a/pom.xml b/pom.xml index 3b96f3bfc..b48a6e73a 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.10 + 2.2.11 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java index b248cb2e6..98c6fb3b3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/analysis/core/impls/DashboardServiceImpl.java @@ -16,6 +16,7 @@ import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import com.alibaba.fastjson.JSONObject; import com.github.miemiedev.mybatis.paginator.domain.Order; import com.github.miemiedev.mybatis.paginator.domain.PageBounds; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DurationFormatUtils; import org.slf4j.Logger; @@ -558,7 +559,10 @@ public class DashboardServiceImpl implements DashboardService,DashboardAnalysisT record.put("new_customers",newCustomers); record.put("old_customers",oldCustomers); record.put("client_id",client.getIntValue("client_id")); - customerAndOrdersStatisticsMapper.save(record); + if (StringUtils.equalsIgnoreCase("rpaypmt_card", record.getString("channel")) || StringUtils.equalsIgnoreCase("rpaypmt_dd", record.getString("channel"))) { + record.put("single_amount", record.getBigDecimal("total").divide(record.getBigDecimal("orders"), 2, RoundingMode.HALF_UP)); + } + customerAndOrdersStatisticsMapper.save(record); } } } diff --git a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml index 0cd8a813d..24eea92c2 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/analysis/mappers/CustomerAndOrdersStatisticsMapper.xml @@ -145,7 +145,7 @@
- -
@@ -462,88 +325,65 @@
-
-
-
- +
From 42ec49784d1f142e2c7297195082b6b2c135fb5f Mon Sep 17 00:00:00 2001 From: dulingling Date: Fri, 24 Apr 2020 15:21:35 +0800 Subject: [PATCH 018/110] =?UTF-8?q?Upd:=E8=A1=A5=E5=85=85=E5=8D=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=B8=A0=E9=81=93=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/RetailAppServiceImp.java | 8 +++++++- src/main/resources/application-common.yml | 2 +- src/main/resources/application-dev.yml | 16 ++++++++-------- src/main/resources/application.yml | 14 +++++++------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index 19e4fc2f2..c919abc30 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -289,6 +289,12 @@ public class RetailAppServiceImp implements RetailAppService { res.put("rate", paymentApi.channelApi("Wechat").queryExchangeRateDecimal(clientId)); res.put("alipay_rate", paymentApi.channelApi("Alipay").queryExchangeRateDecimal(clientId)); } + params.put("channel", "system"); + res.put("sys_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + params.put("channel", "rpaypmt_card"); + res.put("rpaypmt_card_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + params.put("channel", "rpaypmt_dd"); + res.put("rpaypmt_dd_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); return res; } @@ -864,7 +870,7 @@ public class RetailAppServiceImp implements RetailAppService { String clientType = device.getString("client_type"); deviceSupport.findRegister(clientType); int clientId = device.getIntValue("client_id"); - JSONObject client = clientManager.getClientInfo(clientId); + JSONObject client = clientManager.getClientInfo(9); String timezoneClient = client.getString("timezone"); if (timezoneClient != null && !timezone.isEmpty()) { timezone = timezoneClient; diff --git a/src/main/resources/application-common.yml b/src/main/resources/application-common.yml index 238e4f272..f508af2eb 100644 --- a/src/main/resources/application-common.yml +++ b/src/main/resources/application-common.yml @@ -64,7 +64,7 @@ spring: time-between-eviction-runs-millis: 500 validation-query: select 1 mail: - host: smtp.office365.com + host: smtp.o11ffice365.com port: 587 thymeleaf: mode: HTML diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 3beef053f..8952c6aee 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,15 +1,15 @@ spring: datasource: master: - host: 192.168.0.84:3306 + host: 119.28.3.196:3310 jdbc-url: jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: rpayplus - schema-name: royalpay - username: root + password: read0nly + schema-name: royalpay_production + username: readonly slave: - host: 192.168.0.84:3306 + host: 119.28.3.196:3310 jdbc-url: jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: rpayplus - schema-name: royalpay - username: root + password: read0nly + schema-name: royalpay_production + username: readonly type: com.zaxxer.hikari.HikariDataSource diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 91c8f2a2f..0bde059ef 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -17,7 +17,7 @@ app: cms: host: http://127.0.0.1:9533 customer: - host: https://customer.royalpay.com.au/ + host: http://192.168.0.33:9008/ foreign-currency: AUD hanyin-secure: pid: ROYALPAY @@ -26,10 +26,10 @@ app: sftp-pwd: royalpay sftp-username: royalpay host: - main: http://192.168.0.8:9009/ + main: http://192.168.0.33:9009/ regions: - au: http://192.168.0.8:9009/ - cn: http://192.168.0.8:9009/ + au: http://192.168.0.33:9009/ + cn: http://192.168.0.33:9009/ mail: appid: 1 host: https://mailsupport.royalpay.com.au @@ -114,7 +114,7 @@ royalpay: appkey: 43390d81e20c5191c278fbf4cd275be2 server: - port: 5000 + port: 5555 settle: abafile: @@ -143,8 +143,8 @@ settle: remains-to: ANZ spring: mail: - host: smtp.office365.com - port: 587 + host: '' + port: '' profiles: active: dev,alipay,bestpay,jd,wechat,rpay,yeepay,rppaysvc,common redis: From cb08cd7546fb981376a03acb0e6a6e3be2cca28b Mon Sep 17 00:00:00 2001 From: luoyang Date: Sun, 26 Apr 2020 11:03:33 +0800 Subject: [PATCH 019/110] add customer_rage_title --- .../manage/appclient/core/impls/RetailAppServiceImp.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index c919abc30..9ca43cbfb 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -3116,6 +3116,10 @@ public class RetailAppServiceImp implements RetailAppService { channels.add(cbBankPay); } res.put("channels", channels); + if (res.containsKey("rate_value")) { + BigDecimal minRate = res.getBigDecimal("rate_value").add(new BigDecimal(0.01)).setScale(2, RoundingMode.DOWN); + res.put("customer_rage_title", (minRate.toPlainString() + "~" + res.getString("max_customer_surcharge_rate"))); + } return res; } From a5680a8aa4d3888d7bfe2da2b72aae65470cdfe0 Mon Sep 17 00:00:00 2001 From: yixian Date: Sun, 26 Apr 2020 19:01:11 +1000 Subject: [PATCH 020/110] card pay ui --- src/main/ui/static/templates/payment/v1/card_pay.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/ui/static/templates/payment/v1/card_pay.js b/src/main/ui/static/templates/payment/v1/card_pay.js index b8ccf86aa..8506924ab 100644 --- a/src/main/ui/static/templates/payment/v1/card_pay.js +++ b/src/main/ui/static/templates/payment/v1/card_pay.js @@ -1,7 +1,7 @@ $(function () { let $container = $('.card-input-box')[0]; let ctrl = {ready: false, pending: false} - let cardFrame = window.channel_account_id ? new TokenInputFrame($container, window.channel_account_id) : new CardInputFrame($container); + let cardFrame = new CardInputFrame($container, window.card_input_appid, window.card_input_token); let $errorMsgBox = $('#errorMsgBox'); let loading = $('.loading-container'); cardFrame.onSuccess = function (secretData) { From db974f69e22a3ef0b01f7221506a6e35ddb466f2 Mon Sep 17 00:00:00 2001 From: luoyang Date: Sun, 26 Apr 2020 17:43:46 +0800 Subject: [PATCH 021/110] =?UTF-8?q?add=20=E5=8D=A1=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=95=86=E6=88=B7=E8=BF=9B=E4=BB=B6=E3=80=81=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E3=80=81=E5=90=88=E8=A7=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../system/SysClientUpayProfileMapper.java | 19 + .../merchants/beans/ClientRegisterInfo.java | 69 + .../core/impls/ClientManagerImpl.java | 69 +- src/main/resources/application-dev.yml | 16 +- src/main/ui/static/commons/commons.js | 1 + .../commons/services/upayIndustryMap.js | 81 ++ .../ui/static/payment/partner/add-partner.js | 884 ++++++++++++ .../static/payment/partner/partner-manage.js | 1239 +++-------------- .../partner/templates/add_partner.html | 333 ++--- .../partner/templates/partner_auth_files.html | 374 +---- .../templates/partner_cp_auth_files.html | 363 +++++ .../partner/templates/partner_detail.html | 3 - .../partner/templates/partner_edit.html | 247 ++-- .../templates/partner_mw_auth_files.html | 274 ++-- 15 files changed, 2092 insertions(+), 1882 deletions(-) create mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/system/SysClientUpayProfileMapper.java create mode 100644 src/main/ui/static/commons/services/upayIndustryMap.js create mode 100644 src/main/ui/static/payment/partner/add-partner.js create mode 100644 src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html diff --git a/pom.xml b/pom.xml index 19eca1053..4e24bd556 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ au.com.royalpay.payment payment-parent - 2.1.26 + 2.1.28 4.0.0 manage diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/SysClientUpayProfileMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/SysClientUpayProfileMapper.java new file mode 100644 index 000000000..2e9842a40 --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/SysClientUpayProfileMapper.java @@ -0,0 +1,19 @@ +package au.com.royalpay.payment.manage.mappers.system; + +import com.alibaba.fastjson.JSONObject; +import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper; +import com.yixsoft.support.mybatis.autosql.annotations.AutoSql; +import com.yixsoft.support.mybatis.autosql.annotations.SqlType; +import org.apache.ibatis.annotations.Param; + +@AutoMapper(tablename = "sys_client_upay_profile", pkName = "client_id") +public interface SysClientUpayProfileMapper { + @AutoSql(SqlType.INSERT) + void save(JSONObject info); + + @AutoSql(SqlType.UPDATE) + void update(JSONObject info); + + @AutoSql(SqlType.SELECT) + JSONObject findInfo(@Param("client_id") int clientId); +} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java index 8ccdcc9c3..e6d7d0dbe 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java @@ -3,6 +3,7 @@ package au.com.royalpay.payment.manage.merchants.beans; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; +import org.apache.commons.lang3.StringUtils; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; @@ -114,8 +115,24 @@ public class ClientRegisterInfo { private String client_pay_desc; @JSONField(name = "it_contact_person_email") private String itContactPersonEmail; + @JSONField(name = "client_type") + private String clientType; + @JSONField(name = "acceptor_name") + private String acceptorName; + @JSONField(name = "expected_card_revenue") + private String expectCardRevenue; + @JSONField(name = "average_card_transaction") + private String averageCardTransaction; + @JSONField(name = "mw_industry") + private String mwIndustry; + @JSONField(name = "enable_international_card") + private boolean enableInternaltionCard; + public JSONObject insertObject() { + if (industry == null) { + setIndustry("331"); + } JSONObject res = (JSONObject) JSON.toJSON(this); if (client_apply_id==null){ res.remove("client_apply_id"); @@ -123,6 +140,10 @@ public class ClientRegisterInfo { return res; } + public boolean enableCardPayment() { + return StringUtils.equalsIgnoreCase("card-payment", clientType) || StringUtils.equalsIgnoreCase("all", clientType); + } + public JSONObject updateObject() { JSONObject obj = insertObject(); obj.remove("client_moniker"); @@ -560,4 +581,52 @@ public class ClientRegisterInfo { public void setItContactPersonEmail(String itContactPersonEmail) { this.itContactPersonEmail = itContactPersonEmail; } + + public void setAcceptorName(String acceptorName) { + this.acceptorName = acceptorName; + } + + public String getAcceptorName() { + return acceptorName; + } + + public boolean isEnableInternaltionCard() { + return enableInternaltionCard; + } + + public String getAverageCardTransaction() { + return averageCardTransaction; + } + + public String getExpectCardRevenue() { + return expectCardRevenue; + } + + public String getMwIndustry() { + return mwIndustry; + } + + public void setAverageCardTransaction(String averageCardTransaction) { + this.averageCardTransaction = averageCardTransaction; + } + + public void setEnableInternaltionCard(boolean enableInternaltionCard) { + this.enableInternaltionCard = enableInternaltionCard; + } + + public void setExpectCardRevenue(String expectCardRevenue) { + this.expectCardRevenue = expectCardRevenue; + } + + public void setMwIndustry(String mwIndustry) { + this.mwIndustry = mwIndustry; + } + + public String getClientType() { + return clientType; + } + + public void setClientType(String clientType) { + this.clientType = clientType; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 3edd05647..b77ff85ce 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -326,8 +326,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid private RPayPaymentCardSvcApi rPayPaymentCardSvcApi; @Resource private RPayMerchantMapper rPayMerchantMapper; - - + @Resource + private SysClientUpayProfileMapper sysClientUpayProfileMapper; @Resource private SmsSender smsSender; private static final String SOURCE_AGREE_FILE = "source_agree_file"; @@ -433,6 +433,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientConfig.put("ext_params",client.getString("ext_params")); } client.putAll(clientConfig); + JSONObject upayInfo = sysClientUpayProfileMapper.findInfo(client.getIntValue("client_id")); + client.putAll(upayInfo); client.put("unsubscribe", mailUnsubMapper.findOneByClientMoniker(clientMoniker) == null ? false : true); client.put("show_all_permission", true); int role = manager != null ? manager.getIntValue("role") : 0; @@ -782,10 +784,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid partner.put("ali_sub_merchant_id", registery.getClientMoniker()); partner.put("credential_code", RandomStringUtils.random(32, true, true)); partner.put("creator", manager.getString("manager_id")); - // if (manager.getIntValue("org_id") == 0) { - // throw new ForbiddenException("You were not belong to any organizations so that you cannot create new - // client"); - // } partner.put("org_id", manager.getIntValue("org_id")); if (StringUtils.isNotEmpty(registery.getLogoId())) { partner.put("logo_url", attachmentClient.getFileUrl(registery.getLogoId())); @@ -807,7 +805,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid //isRiskyMerchant(partner, null); try { - clientMapper.save(partner); JSONObject clientConfig = new JSONObject(); clientConfig.put("client_id", partner.getIntValue("client_id")); @@ -817,33 +814,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientConfigService.save(clientConfig); permissionPartnerManagerImpl.permissionClientModuleSave(partner.getIntValue("client_id"), partner.getString("client_moniker")); + saveLegalAndMarketingInfo(partner); + if (registery.enableCardPayment()) { + sysClientUpayProfileMapper.save(partner); + } } catch (Exception e) { throw new BadRequestException("error.partner.valid.dumplicate_client_moniker"); } - - try { - JSONObject representativeInfo = new JSONObject(); - representativeInfo.put("client_id", partner.getIntValue("client_id")); - representativeInfo.put("representative_person", partner.getString("legal_representative_person")); - representativeInfo.put("phone", partner.getString("legal_representative_phone")); - representativeInfo.put("email", partner.getString("legal_representative_email")); - representativeInfo.put("job_title", partner.getString("legal_representative_job")); - representativeInfo.put("address", partner.getString("registered_address")); - representativeInfo.put("suburb", partner.getString("registered_suburb")); - representativeInfo.put("postcode", partner.getString("registered_postcode")); - representativeInfo.put("state", partner.getString("registered_state")); - representativeInfo.put("legal_representative_wechatid", partner.getString("legal_representative_wechatid")); -// marking联系人 - representativeInfo.put("marketing_person", partner.getString("marketing_person")); - representativeInfo.put("marketing_phone", partner.getString("marketing_phone")); - representativeInfo.put("marketing_email", partner.getString("marketing_email")); - representativeInfo.put("marketing_job_title", partner.getString("marketing_job")); - representativeInfo.put("marketing_wechatid", partner.getString("marketing_wechatid")); - sysClientLegalPersonMapper.save(representativeInfo); - } catch (Exception e) { - throw new BadRequestException("error.partner.valid.dumplicate_client_moniker"); - } - if (ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { JSONObject client_bd = new JSONObject(); client_bd.put("client_id", partner.getIntValue("client_id")); @@ -917,6 +894,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid sysClientLegalPersonMapper.save(representativeInfo); } + if (info.enableCardPayment()) { + JSONObject upay = sysClientUpayProfileMapper.findInfo(clientId); + if (upay == null) { + sysClientUpayProfileMapper.save(updateInfo); + }else { + upay.putAll(updateInfo); + sysClientUpayProfileMapper.update(upay); + } + } + int originReferrerId = client.getIntValue("referrer_id"); int updateReferrerId = Integer.parseInt(info.getReferrer_id() == null ? "0" : info.getReferrer_id()); if (originReferrerId == 0 && updateReferrerId != 0) { @@ -7128,4 +7115,24 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return day+" "+ months[month]+" "+ year; } + public void saveLegalAndMarketingInfo(JSONObject partner) { + JSONObject representativeInfo = new JSONObject(); + representativeInfo.put("client_id", partner.getIntValue("client_id")); + representativeInfo.put("representative_person", partner.getString("legal_representative_person")); + representativeInfo.put("phone", partner.getString("legal_representative_phone")); + representativeInfo.put("email", partner.getString("legal_representative_email")); + representativeInfo.put("job_title", partner.getString("legal_representative_job")); + representativeInfo.put("address", partner.getString("registered_address")); + representativeInfo.put("suburb", partner.getString("registered_suburb")); + representativeInfo.put("postcode", partner.getString("registered_postcode")); + representativeInfo.put("state", partner.getString("registered_state")); + representativeInfo.put("legal_representative_wechatid", partner.getString("legal_representative_wechatid")); + representativeInfo.put("marketing_person", partner.getString("marketing_person")); + representativeInfo.put("marketing_phone", partner.getString("marketing_phone")); + representativeInfo.put("marketing_email", partner.getString("marketing_email")); + representativeInfo.put("marketing_job_title", partner.getString("marketing_job")); + representativeInfo.put("marketing_wechatid", partner.getString("marketing_wechatid")); + sysClientLegalPersonMapper.save(representativeInfo); + } + } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8952c6aee..3beef053f 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,15 +1,15 @@ spring: datasource: master: - host: 119.28.3.196:3310 + host: 192.168.0.84:3306 jdbc-url: jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: read0nly - schema-name: royalpay_production - username: readonly + password: rpayplus + schema-name: royalpay + username: root slave: - host: 119.28.3.196:3310 + host: 192.168.0.84:3306 jdbc-url: jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: read0nly - schema-name: royalpay_production - username: readonly + password: rpayplus + schema-name: royalpay + username: root type: com.zaxxer.hikari.HikariDataSource diff --git a/src/main/ui/static/commons/commons.js b/src/main/ui/static/commons/commons.js index 1f764d66c..51e7b3204 100644 --- a/src/main/ui/static/commons/commons.js +++ b/src/main/ui/static/commons/commons.js @@ -13,6 +13,7 @@ define(['./app', './services/yeepayIndustryMap', './services/stateMap', './services/industryMap', + './services/upayIndustryMap', './services/wechatGoodMcc', './services/sectorMap', './services/countryMap', diff --git a/src/main/ui/static/commons/services/upayIndustryMap.js b/src/main/ui/static/commons/services/upayIndustryMap.js new file mode 100644 index 000000000..ebc3c6cfb --- /dev/null +++ b/src/main/ui/static/commons/services/upayIndustryMap.js @@ -0,0 +1,81 @@ +define(['../app'], function (app) { + 'use strict'; + + var upayIndustry = [ + { + "label": "Professional Services", + "value": "Professional Services" + }, + { + "label": "Mail/Telephone Order", + "value": "Mail/Telephone Order" + }, + { + "label": "Business Services", + "value": "Business Services" + }, + { + "label": "Retail Store", + "value": "Retail Store" + }, + { + "label": "Airline Services", + "value": "Airline Services" + }, + { + "label": "Entertainment", + "value": "Entertainment" + }, + { + "label": "Automobiles", + "value": "Automobiles" + }, + { + "label": "Clothing", + "value": "Clothing" + }, + { + "label": "Contracted Services", + "value": "Contracted Services" + }, + { + "label": "Government", + "value": "Government" + }, + { + "label": "Hotel", + "value": "Hotel" + }, + { + "label": "Personal Services", + "value": "Personal Services" + }, + { + "label": "Repair Services", + "value": "Repair Services" + }, + { + "label": "Transportation", + "value": "Transportation" + }, + { + "label": "Utilities", + "value": "Utilities" + }, + { + "label": "Wholesale", + "value": "Wholesale" + }, + { + "label": "Other", + "value": "Other" + } + ]; + app.factory('upayIndustryMap', function () { + return { + configs: function () { + return upayIndustry; + } + } + }); +}); diff --git a/src/main/ui/static/payment/partner/add-partner.js b/src/main/ui/static/payment/partner/add-partner.js new file mode 100644 index 000000000..8f2e8ae34 --- /dev/null +++ b/src/main/ui/static/payment/partner/add-partner.js @@ -0,0 +1,884 @@ +/** + * Created by yixian on 2016-06-29. + */ +define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootSwitch', 'ngFileUpload', 'uiSelect'], function (angular, Decimal) { + 'use strict'; + var removeClientPayDesc = function (items, key) { + for (var i = 0; i < items.length; i++) { + var item = items[i]; + if (item.indexOf(key) >= 0) { + items.splice(items.indexOf(item), 1); + i = i - 1; + } + } + }; + + + var app = angular.module('addPartnerApp', ['ui.bootstrap', 'ui.router', 'frapontillo.bootstrap-switch', 'ui.select', 'ngFileUpload']); + app.config(['$stateProvider', function ($stateProvider) { + $stateProvider.state('newPartners', { + url: '/partners/new', + templateUrl: '/static/payment/partner/templates/add_partner.html', + controller: 'addPartnerCtrl' + }).state('partners.edit', { + url: '/{clientMoniker}/edit', + templateUrl: '/static/payment/partner/templates/partner_edit.html', + controller: 'partnerEditCtrl', + resolve: { + partner: ['$http', '$stateParams', function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker); + }] + } + }) + }]); + app.controller('addPartnerCtrl', ['$rootScope', '$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', 'businessStructuresMap', 'upayIndustryMap', 'industryMap', 'stateMap', 'sectorMap', 'countryMap', function ($rootScope, $scope, $http, $state, Upload, commonDialog, timezone, businessStructuresMap, upayIndustryMap, industryMap, stateMap, sectorMap, countryMap) { + if ($scope.partner_application) { + $scope.partner = angular.copy($scope.partner_application); + delete $rootScope.partner_application; + } else { + $scope.partner = {timezone: 'Australia/Melbourne'}; + } + $scope.partner.client_type = 'cross-border'; + $scope.initMerchantCode = function () { + $http.get('/sys/partners/init/merchant_code').then(function (response) { + $scope.partner.client_moniker = response.data.partner_code; + $scope.merchantCodeChecked = true; + $scope.merchantIsValid = true; + }); + }; + $scope.initMerchantCode(); + $scope.partner.company_phone_c = 61; + $scope.partner.contact_phone_c = 61; + $scope.partner.client_pay_type = []; + $scope.partner.client_pay_desc = []; + var resetClientPayDescByTpey = function (type) { + type = parseInt(type); + if (type == 1) { + removeClientPayDesc($scope.partner.client_pay_desc, '10'); + } + if (type == 2) { + removeClientPayDesc($scope.partner.client_pay_desc, '20'); + } + }; + $scope.partner.sameAsContactPerson = false; + $scope.checkboxOnclick = function (){ + $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); + if($scope.partner.sameAsContactPerson) { + $scope.partner.legal_representative_person = $scope.partner.contact_person; + $scope.partner.legal_representative_phone_a = $scope.partner.contact_phone_a; + $scope.partner.legal_representative_phone_c = $scope.partner.contact_phone_c; + $scope.partner.legal_representative_phone_p = $scope.partner.contact_phone_p; + $scope.partner.legal_representative_email = $scope.partner.contact_email; + $scope.partner.legal_representative_job = $scope.partner.contact_job; + $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; + } + } + + $scope.partner.marketingSameAsContact = false; + $scope.checkMarketingSameAsContact = function (){ + $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); + if($scope.partner.marketingSameAsContact) { + $scope.partner.marketing_person = $scope.partner.contact_person; + $scope.partner.marketing_phone_a = $scope.partner.contact_phone_a; + $scope.partner.marketing_phone_c = $scope.partner.contact_phone_c; + $scope.partner.marketing_phone_p = $scope.partner.contact_phone_p; + $scope.partner.marketing_email = $scope.partner.contact_email; + $scope.partner.marketing_job = $scope.partner.contact_job; + $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; + } + } + + $scope.partner.sameAsAddress=false; + $scope.sameAddress = function (){ + $scope.partner.sameAsAddress = !($scope.partner.sameAsAddress); + if($scope.partner.sameAsAddress) { + $scope.partner.registered_address = $scope.partner.address; + $scope.partner.registered_suburb = $scope.partner.suburb; + $scope.partner.registered_postcode = $scope.partner.postcode; + $scope.partner.registered_state = $scope.partner.state; + } + } + + var compare = function (x, y) { + x = parseInt(x); + y = parseInt(y); + if (x < y) { + return -1; + } else if (x > y) { + return 1; + } else { + return 0; + } + } + $scope.toggleClientPayType = function (type) { + if ($scope.partner.client_pay_type == null || $scope.partner.client_pay_type == undefined) { + $scope.partner.client_pay_type = []; + } + var $idx = $scope.partner.client_pay_type.indexOf(type); + if ($idx >= 0) { + $scope.partner.client_pay_type.splice($idx, 1); + resetClientPayDescByTpey(type); + } else { + $scope.partner.client_pay_type.push(type); + $scope.partner.client_pay_type.sort(compare); + } + }; + $scope.toggleClientPayDesc = function (type) { + if ($scope.partner.client_pay_desc == null || $scope.partner.client_pay_desc == undefined) { + $scope.partner.client_pay_desc = []; + } + var $idx = $scope.partner.client_pay_desc.indexOf(type); + if ($idx >= 0) { + if (type == '203') { + removeClientPayDesc($scope.partner.client_pay_desc, '2030') + } + $scope.partner.client_pay_desc.splice($idx, 1); + } else { + $scope.partner.client_pay_desc.push(type); + $scope.partner.client_pay_desc.sort(compare); + } + }; + $scope.pagination = {}; + $scope.industries = industryMap.configs(); + $scope.upayIndustrys = upayIndustryMap.configs(); + $scope.states = stateMap.configs(); + $scope.countries = countryMap.configs(); + $scope.sectors = sectorMap.configs(); + $scope.business_structures = businessStructuresMap.configs(); + $scope.params = {textType: 'all', org_name: 'ALL'}; + $scope.merchantIsValid = false; + $scope.merchantCodeChecked = false; + + function remove(arr, val) { + if (angular.isArray(arr)) { + for (var i = arr.length; i--;) { + if (arr[i].value == val) { + arr.splice(i, 1); + break; + } + } + } + return arr; + } + + var industries = angular.copy($scope.industries); + $scope.industries = remove(industries, 331); + + $scope.listReferrers = function () { + $http.get('/sys/orgs/referrer').then(function (resp) { + $scope.referrers = resp.data; + }) + }; + $scope.listReferrers(); + + $scope.loadAlipayCategory = function () { + $http.get('/static/data/alipayMcc.json').then(function (resp) { + $scope.alipayMccCategory = resp.data; + }) + }; + $scope.loadAlipayCategory(); + $scope.loadJDindustry = function () { + $http.get('/static/data/jdindustry.json').then(function (resp) { + $scope.jdindustry = resp.data; + }) + }; + $scope.loadJDindustry(); + + $scope.loadLakalaPayindustry = function () { + $http.get('/static/data/lakalapayindustry.json').then(function (resp) { + $scope.lakalapayindustry = resp.data; + }) + }; + $scope.loadLakalaPayindustry(); + + $scope.loadLakalaPaySettle = function () { + $http.get('/static/data/lakalapaysettle.json').then(function (resp) { + $scope.lakalapaysettle = resp.data; + }) + }; + $scope.loadLakalaPaySettle(); + + $scope.loadLakalaPayGoods = function () { + $http.get('/static/data/lakalapaygoods.json').then(function (resp) { + $scope.lakalapaygoods = resp.data; + }) + }; + $scope.loadLakalaPayGoods(); + + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data; + }) + }; + $scope.loadRoyalpayindustry(); + + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hfindustry = resp.data; + }) + }; + $scope.loadHfindustry(); + + $scope.onAlipayMccSelect = function (selectedItem) { + $scope.partner.alipay_category = selectedItem.label; + $scope.partner.alipayindustry = selectedItem.mccCode; + }; + + $scope.onRoyalPayIndustrySelect = function (selectedItem) { + $scope.partner.royalpay_label = selectedItem.label; + $scope.partner.royalpayindustry = selectedItem.mccCode; + }; + + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.partner.hf_label = selectedItem.label; + $scope.partner.hfindustry = selectedItem.mccCode; + }; + + // $scope.t2city_map = angular.copy(t2city_map); + + $scope.timezones = timezone.configs(); + $scope.checkMerchantCodeIsValid = function (code) { + if (code.length != 4) { + $scope.merchantCodeChecked = false; + $scope.merchantIsValid = false; + return; + } + $http.get('/sys/partners/init/check_code_isvalid', {params: {clientMoniker: code}}).then(function (response) { + $scope.merchantIsValid = response.data; + $scope.merchantCodeChecked = true; + }); + }; + $scope.save = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true; + } + }); + return; + } + + if ($scope.partner.company_name.indexOf("Migration") != -1) { + alert("Company Name包含敏感词汇,请检查后重新提交!"); + return; + } + if ($scope.partner.company_phone_a && ('' + $scope.partner.company_phone_a != '')) { + if ($scope.partner.company_phone_a.indexOf('0') == 0) { + alert("Please remove the first character '0' of area code"); + return; + } + } + if ($scope.partner.contact_phone && ('' + $scope.partner.contact_phone != '')) { + if ($scope.partner.contact_phone.indexOf('0') == 0) { + alert("Please remove the first character '0' of area code"); + return; + } + } + $scope.partner.company_phone = '+' + $scope.partner.company_phone_c + ($scope.partner.company_phone_a || '') + $scope.partner.company_phone_p; + $scope.partner.contact_phone = '+' + $scope.partner.contact_phone_c + ($scope.partner.contact_phone_a || '') + $scope.partner.contact_phone_p; + $scope.partner.legal_representative_phone = '+' + $scope.partner.legal_representative_phone_c + ( $scope.partner.legal_representative_phone_a || '') + $scope.partner.legal_representative_phone_p; + $scope.partner.marketing_phone = '+' + $scope.partner.marketing_phone_c + ( $scope.partner.marketing_phone_a || '') + $scope.partner.marketing_phone_p; + if ($scope.partner.company_phone.indexOf(' ') != -1) { + alert('Company Phone can not contain space character'); + return; + } + if ($scope.partner.contact_phone.indexOf(' ') != -1) { + alert('Contact Phone can not contain space character'); + return; + } + if ($scope.partner.legal_representative_phone.indexOf(' ') != -1) { + alert('Representative phone can not contain space character'); + return; + } + if ($scope.partner.marketing_phone.indexOf(' ') != -1) { + alert('Marketing phone can not contain space character'); + return; + } + if ($scope.partner.contact_email.indexOf(' ') != -1) { + alert('Contact email Phone can not contain space character'); + return; + } + if ($scope.partner.legal_representative_email.indexOf(' ') != -1) { + alert('Representative email Phone can not contain space character'); + return; + } + + if ($scope.partner.marketing_email && $scope.partner.marketing_email.indexOf(' ') != -1) { + alert('Marketing email Phone can not contain space character'); + return; + } + if ($scope.partner.suburb.indexOf(' ') != -1) { + alert('suburb can not contain two and more continuous space characters'); + return; + } + if ($scope.partner.registered_suburb.indexOf(' ') != -1) { + alert('Registered suburb can not contain two and more continuous space characters'); + return; + } + if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { + if ($scope.partner.acn.length != 9) { + alert('Acn is not valid'); + return; + } + } + if (!$scope.partner.logo_url) { + alert("Logo is necessary!"); + return; + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary'); + return; + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary'); + return; + } + } + + if ($scope.partner.referrer_id) { + $scope.referrers.forEach(function (e) { + if ($scope.partner.referrer_id == e.org_id) { + $scope.partner.referrer_name = e.name; + return; + } + }) + } + + if ($scope.partner.client_pay_type.length == 0) { + alert('请选择商户支付场景') + return; + } + if ($scope.partner.client_pay_desc.length == 0) { + alert('请选择商户支付方式') + return; + } + if (typeof ($scope.partner.client_pay_type) == 'string' || typeof ($scope.partner.client_pay_desc) == 'string') { + $scope.partner.client_pay_type = $scope.partner.client_pay_type.split(","); + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.split(","); + + } + if ($scope.partner.client_pay_type.indexOf('1') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { + alert("请检查线上支付场景是否已选择支付方式"); + return; + } + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { + alert("请检查线下支付场景是否已选择支付方式"); + return; + } + } + if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { + alert("请检查线下支付是否已选择收银系统类型"); + return; + } + } + $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); + $http.post('/sys/partners', $scope.partner).then(function (resp) { + commonDialog.alert({title: 'Success', content: 'Register new partner successfully', type: 'success'}); + $scope.updateMerchantLocation(); + // $scope.loadPartners(); + $state.go('partners.detail', {clientMoniker: resp.data.client_moniker}) + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }); + }; + $scope.uploadLogo = function (file) { + if (file != null) { + if (file.size > 1 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error'}) + } else { + $scope.logoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.logoProgress; + $scope.partner.logo_id = resp.data.fileid; + $scope.partner.logo_url = resp.data.url; + }, function (resp) { + delete $scope.logoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.uploadShopPhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + $scope.shopPhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.shopPhotoProgress; + $scope.partner.company_photo = resp.data.url; + }, function (resp) { + delete $scope.shopPhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + $scope.storePhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.storePhotoProgress; + $scope.partner.store_photo = resp.data.url; + }, function (resp) { + delete $scope.storePhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.updateMerchantLocation = function () { + var params = window.frames['merchant_detail'].merchant_location; + if (params) { + $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { + }); + } + } + }]); + app.controller('partnerEditCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', 'partner','upayIndustryMap', + function ($scope, $http, $state, Upload, commonDialog, timezone, partner,upayIndustryMap) { + $scope.upayIndustrys = upayIndustryMap.configs(); + $scope.timezones = timezone.configs(); + $scope.partner = partner.data; + if (!$scope.partner.client_type) { + $scope.partner.client_type = 'cross-border'; + } + if($scope.partner.representativeInfo != null) + { + $scope.partner.registered_address = $scope.partner.representativeInfo.address; + $scope.partner.registered_suburb = $scope.partner.representativeInfo.suburb; + $scope.partner.registered_postcode = $scope.partner.representativeInfo.postcode; + $scope.partner.registered_state = $scope.partner.representativeInfo.state; + $scope.partner.legal_representative_person = $scope.partner.representativeInfo.representative_person; + $scope.partner.legal_representative_phone = $scope.partner.representativeInfo.phone; + $scope.partner.legal_representative_email = $scope.partner.representativeInfo.email; + $scope.partner.legal_representative_job = $scope.partner.representativeInfo.job_title; + + $scope.partner.marketing_person = $scope.partner.representativeInfo.marketing_person; + $scope.partner.marketing_phone = $scope.partner.representativeInfo.marketing_phone; + $scope.partner.marketing_email = $scope.partner.representativeInfo.marketing_email; + $scope.partner.marketing_job = $scope.partner.representativeInfo.marketing_job_title; + + $scope.partner.legal_representative_wechatid = $scope.partner.representativeInfo.legal_representative_wechatid; + $scope.partner.marketing_wechatid = $scope.partner.representativeInfo.marketing_wechatid; + } + + function hasRole() { + var rolenum; + switch (sessionStorage.getItem('role')) { + case "administrator": + rolenum = 1; + break; + case "bduser": + rolenum = 4; + break; + case "salesmanager": + rolenum = 8192; + break; + case "accountant": + rolenum = 8; + break; + case "sitemanager": + rolenum = 128; + break; + case "director": + rolenum = 64; + break; + case "developer": + rolenum = 256; + break; + case "compliance": + rolenum = 2; + break; + case "guest": + rolenum = 2048; + break; + case "orgmanager": + rolenum = 4096; + break; + case "riskmanager": + rolenum = 1024; + break; + default: + break; + } + if ((window.currentUser.role & rolenum) >0) { + return true; + }else { + sessionStorage.removeItem('role'); + return false; + } + } + + if (hasRole()) { + $scope.role = sessionStorage.getItem('role'); + } + + var origin_referrer_id = angular.copy($scope.partner.referrer_id); + var resetClientPayDescByTpey = function (type) { + type = parseInt(type); + if (type == 1) { + removeClientPayDesc($scope.partner.client_pay_desc, '10'); + } + if (type == 2) { + removeClientPayDesc($scope.partner.client_pay_desc, '20'); + } + }; + var compare = function (x, y) { + x = parseInt(x); + y = parseInt(y); + if (x < y) { + return -1; + } else if (x > y) { + return 1; + } else { + return 0; + } + } + $scope.toggleClientPayType = function (type) { + if (!$scope.partner.client_pay_type) { + $scope.partner.client_pay_type = []; + } + var $idx = $scope.partner.client_pay_type.indexOf(type); + if ($idx >= 0) { + $scope.partner.client_pay_type.splice($idx, 1); + resetClientPayDescByTpey(type); + } else { + $scope.partner.client_pay_type.push(type); + $scope.partner.client_pay_type.sort(compare); + } + }; + $scope.toggleClientPayDesc = function (type) { + if (!$scope.partner.client_pay_desc) { + $scope.partner.client_pay_desc = []; + } + var $idx = $scope.partner.client_pay_desc.indexOf(type); + if ($idx >= 0) { + if (type == '203') { + removeClientPayDesc($scope.partner.client_pay_desc, '2030') + } + $scope.partner.client_pay_desc.splice($idx, 1); + } else { + $scope.partner.client_pay_desc.push(type); + $scope.partner.client_pay_desc.sort(compare); + } + }; + + $scope.partner.sameAsContactPerson = false; + $scope.checkboxOnclick = function (){ + $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); + if($scope.partner.sameAsContactPerson) { + $scope.partner.legal_representative_person = $scope.partner.contact_person; + $scope.partner.legal_representative_phone = $scope.partner.contact_phone; + $scope.partner.legal_representative_email = $scope.partner.contact_email; + $scope.partner.legal_representative_job = $scope.partner.contact_job; + $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; + } + } + + $scope.partner.marketingSameAsContact = false; + $scope.checkMarketingSameAsContact = function (){ + $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); + if($scope.partner.marketingSameAsContact) { + $scope.partner.marketing_person = $scope.partner.contact_person; + $scope.partner.marketing_phone = $scope.partner.contact_phone; + $scope.partner.marketing_email = $scope.partner.contact_email; + $scope.partner.marketing_job = $scope.partner.contact_job; + $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; + } + } + + $scope.partner.sameAsAddress=false; + $scope.sameAddress = function (){ + $scope.partner.sameAsAddress=!($scope.partner.sameAsAddress); + if($scope.partner.sameAsAddress) { + $scope.partner.registered_address = $scope.partner.address; + $scope.partner.registered_suburb = $scope.partner.suburb; + $scope.partner.registered_postcode = $scope.partner.postcode; + $scope.partner.registered_state = $scope.partner.state; + } + } + + $scope.listReferrers = function () { + $http.get('/sys/orgs/referrer').then(function (resp) { + $scope.referrers = resp.data; + }) + }; + $scope.listReferrers(); + + $scope.loadAlipayCategory = function () { + $http.get('/static/data/alipayMcc.json').then(function (resp) { + $scope.alipayMccCategory = resp.data; + }) + }; + $scope.loadAlipayCategory(); + $scope.loadJDindustry = function () { + $http.get('/static/data/jdindustry.json').then(function (resp) { + $scope.jdindustry = resp.data; + }) + }; + $scope.loadJDindustry(); + + $scope.loadLakalaPayindustry = function () { + $http.get('/static/data/lakalapayindustry.json').then(function (resp) { + $scope.lakalapayindustry = resp.data; + }) + }; + $scope.loadLakalaPayindustry(); + + $scope.loadLakalaPaySettle = function () { + $http.get('/static/data/lakalapaysettle.json').then(function (resp) { + $scope.lakalapaysettle = resp.data; + }) + }; + $scope.loadLakalaPaySettle(); + + $scope.loadLakalaPayGoods = function () { + $http.get('/static/data/lakalapaygoods.json').then(function (resp) { + $scope.lakalapaygoods = resp.data; + }) + }; + $scope.loadLakalaPayGoods(); + + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data; + }) + }; + $scope.loadRoyalpayindustry(); + + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hfindustry = resp.data; + }) + }; + $scope.loadHfindustry(); + + $scope.onAlipayMccSelect = function (selectedItem) { + $scope.partner.alipay_category = selectedItem.label; + $scope.partner.alipayindustry = selectedItem.mccCode; + }; + $scope.onRoyalPayIndustrySelect = function (selectedItem) { + $scope.partner.royalpay_label = selectedItem.label; + $scope.partner.royalpayindustry = selectedItem.mccCode; + }; + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.partner.hf_label = selectedItem.label; + $scope.partner.hfindustry = selectedItem.mccCode; + }; + + + $scope.updatePartner = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true; + } + }); + return; + } + + if ($scope.partner.company_name.indexOf("Migration") != -1) { + alert("Company Name包含敏感词汇,请检查后重新提交!"); + return; + } + if ($scope.partner.company_phone.indexOf(' ') != -1) { + alert('Company Phone can not contain space character'); + return; + } + if ($scope.partner.contact_email.indexOf(' ') != -1) { + alert('Contact email Phone can not contain space character'); + return; + } + if ($scope.partner.suburb.indexOf(' ') != -1) { + alert('suburb can not contain two and more continuous space characters'); + return; + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary'); + return; + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary'); + return; + } + } + + if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { + if ($scope.partner.acn.length != 9) { + alert('Acn is not valid'); + } + } + if ($scope.partner.referrer_id) { + $scope.referrers.forEach(function (e) { + if ($scope.partner.referrer_id == e.org_id) { + $scope.partner.referrer_name = e.name; + return; + } + }) + } + var content = ''; + if (!origin_referrer_id && $scope.partner.referrer_id) { + content = 'Update partner info successfully,But You Had add new Referrer,Please Change the BD Commission Proportion!'; + } + if ($scope.partner.client_pay_type.length == 0) { + alert('请选择商户支付场景') + return; + } + if ($scope.partner.client_pay_desc.length == 0) { + alert('请选择商户支付方式') + return; + } + if ($scope.partner.client_pay_type.indexOf('1') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { + alert("请检查线上支付场景是否已选择支付方式"); + return; + } + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { + alert("请检查线下支付场景是否已选择支付方式"); + return; + } + } + if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { + alert("请检查线下支付是否已选择收银系统类型"); + return; + } + } + $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); + $http.put('/sys/partners/' + $scope.partner.client_moniker, $scope.partner).then(function () { + if (content != '') { + commonDialog.alert({ + title: 'Warning', + content: content, + type: 'error' + }); + } else { + commonDialog.alert({ + title: 'Success', + content: 'Update partner information successfully', + type: 'success' + }); + } + $scope.updateMerchantLocation(); + $scope.loadPartners(); + $state.go('^.detail', {clientMoniker: $scope.partner.client_moniker}, {reload: true}); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) + }); + }; + $scope.uploadLogo = function (file) { + if (file != null) { + if (file.size > 1 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error'}) + } else { + $scope.logoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.logoProgress; + $scope.partner.logo_id = resp.data.fileid; + $scope.partner.logo_url = resp.data.url; + }, function (resp) { + delete $scope.logoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.uploadShopPhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + $scope.shopPhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.shopPhotoProgress; + $scope.partner.company_photo = resp.data.url; + }, function (resp) { + delete $scope.shopPhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + $scope.storePhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.storePhotoProgress; + $scope.partner.store_photo = resp.data.url; + }, function (resp) { + delete $scope.storePhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.getMerchantLocation = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { + $scope.merchant_location = resp.data; + }); + }; + $scope.getMerchantLocation(); + + $scope.updateMerchantLocation = function () { + var params = window.frames['merchant_detail'].merchant_location; + if (params) { + $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { + }); + } + } + }]); + return app; +}); diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 558192fb3..6f74bc965 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -96,10 +96,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter templateUrl: '/static/payment/partner/templates/partners.html', controller: 'partnerListCtrl', data: {label: '商户列表'} - }).state('newPartners', { - url: '/partners/new', - templateUrl: '/static/payment/partner/templates/add_partner.html', - controller: 'addPartnerCtrl' }).state('businessCompliance', { url: '/partners/compliance', templateUrl: '/static/payment/partner/templates/partner_compliance.html', @@ -117,15 +113,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter return $http.get('/sys/partners/' + $stateParams.clientMoniker); }] } - }).state('partners.edit', { - url: '/{clientMoniker}/edit', - templateUrl: '/static/payment/partner/templates/partner_edit.html', - controller: 'partnerEditCtrl', - resolve: { - partner: ['$http', '$stateParams', function ($http, $stateParams) { - return $http.get('/sys/partners/' + $stateParams.clientMoniker); - }] - } }).state('partners.detail.payment_info', { url: '/payment', templateUrl: '/static/payment/partner/templates/partner_payment_info.html', @@ -161,13 +148,17 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).state('partners.detail.files', { url: '/files', templateUrl: '/static/payment/partner/templates/partner_auth_files.html', - controller: 'partnerAuthFileCtrl', + controller: 'partnerAuthFileCtrl' + }).state('partners.detail.files.CP_files', { + url: '/cp_files', + templateUrl: '/static/payment/partner/templates/partner_cp_auth_files.html', + controller: 'partnerCPAuthFileCtrl', resolve: { file: ['$http', '$stateParams', function ($http, $stateParams) { return $http.get('/sys/partners/' + $stateParams.clientMoniker + '/file'); }] } - }).state('partners.detail.MW_files', { + }).state('partners.detail.files.MW_files', { url: '/mw_files', templateUrl: '/static/payment/partner/templates/partner_mw_auth_files.html', controller: 'partnerMWAuthFileCtrl', @@ -427,436 +418,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; }]); - app.controller('addPartnerCtrl', ['$rootScope', '$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', 'businessStructuresMap', 'industryMap', 'stateMap', 'sectorMap', 'countryMap', function ($rootScope, $scope, $http, $state, Upload, commonDialog, timezone, businessStructuresMap, industryMap, stateMap, sectorMap, countryMap) { - if ($scope.partner_application) { - $scope.partner = angular.copy($scope.partner_application); - delete $rootScope.partner_application; - } else { - $scope.partner = {timezone: 'Australia/Melbourne'}; - } - $scope.initMerchantCode = function () { - $http.get('/sys/partners/init/merchant_code').then(function (response) { - $scope.partner.client_moniker = response.data.partner_code; - $scope.merchantCodeChecked = true; - $scope.merchantIsValid = true; - }); - }; - $scope.initMerchantCode(); - $scope.partner.company_phone_c = 61; - $scope.partner.contact_phone_c = 61; - $scope.partner.client_pay_type = []; - $scope.partner.client_pay_desc = []; - var resetClientPayDescByTpey = function (type) { - type = parseInt(type); - if (type == 1) { - removeClientPayDesc($scope.partner.client_pay_desc, '10'); - } - if (type == 2) { - removeClientPayDesc($scope.partner.client_pay_desc, '20'); - } - }; - $scope.partner.sameAsContactPerson = false; - $scope.checkboxOnclick = function (){ - $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); - if($scope.partner.sameAsContactPerson) { - $scope.partner.legal_representative_person = $scope.partner.contact_person; - $scope.partner.legal_representative_phone_a = $scope.partner.contact_phone_a; - $scope.partner.legal_representative_phone_c = $scope.partner.contact_phone_c; - $scope.partner.legal_representative_phone_p = $scope.partner.contact_phone_p; - $scope.partner.legal_representative_email = $scope.partner.contact_email; - $scope.partner.legal_representative_job = $scope.partner.contact_job; - $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.marketingSameAsContact = false; - $scope.checkMarketingSameAsContact = function (){ - $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); - if($scope.partner.marketingSameAsContact) { - $scope.partner.marketing_person = $scope.partner.contact_person; - $scope.partner.marketing_phone_a = $scope.partner.contact_phone_a; - $scope.partner.marketing_phone_c = $scope.partner.contact_phone_c; - $scope.partner.marketing_phone_p = $scope.partner.contact_phone_p; - $scope.partner.marketing_email = $scope.partner.contact_email; - $scope.partner.marketing_job = $scope.partner.contact_job; - $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.sameAsAddress=false; - $scope.sameAddress = function (){ - $scope.partner.sameAsAddress = !($scope.partner.sameAsAddress); - if($scope.partner.sameAsAddress) { - $scope.partner.registered_address = $scope.partner.address; - $scope.partner.registered_suburb = $scope.partner.suburb; - $scope.partner.registered_postcode = $scope.partner.postcode; - $scope.partner.registered_state = $scope.partner.state; - } - } - - var compare = function (x, y) { - x = parseInt(x); - y = parseInt(y); - if (x < y) { - return -1; - } else if (x > y) { - return 1; - } else { - return 0; - } - } - $scope.toggleClientPayType = function (type) { - if ($scope.partner.client_pay_type == null || $scope.partner.client_pay_type == undefined) { - $scope.partner.client_pay_type = []; - } - var $idx = $scope.partner.client_pay_type.indexOf(type); - if ($idx >= 0) { - $scope.partner.client_pay_type.splice($idx, 1); - resetClientPayDescByTpey(type); - } else { - $scope.partner.client_pay_type.push(type); - $scope.partner.client_pay_type.sort(compare); - } - }; - $scope.toggleClientPayDesc = function (type) { - if ($scope.partner.client_pay_desc == null || $scope.partner.client_pay_desc == undefined) { - $scope.partner.client_pay_desc = []; - } - var $idx = $scope.partner.client_pay_desc.indexOf(type); - if ($idx >= 0) { - if (type == '203') { - removeClientPayDesc($scope.partner.client_pay_desc, '2030') - } - $scope.partner.client_pay_desc.splice($idx, 1); - } else { - $scope.partner.client_pay_desc.push(type); - $scope.partner.client_pay_desc.sort(compare); - } - }; - $scope.pagination = {}; - $scope.industries = industryMap.configs(); - $scope.states = stateMap.configs(); - $scope.countries = countryMap.configs(); - $scope.sectors = sectorMap.configs(); - $scope.business_structures = businessStructuresMap.configs(); - $scope.clean_days = angular.copy(clean_days_map); - $scope.bd_citys = angular.copy(bd_city_map); - $scope.params = {textType: 'all', org_name: 'ALL'}; - $scope.merchantIsValid = false; - $scope.merchantCodeChecked = false; - - function remove(arr, val) { - if (angular.isArray(arr)) { - for (var i = arr.length; i--;) { - if (arr[i].value == val) { - arr.splice(i, 1); - break; - } - } - } - return arr; - } - - var industries = angular.copy($scope.industries); - $scope.industries = remove(industries, 331); - - $scope.listReferrers = function () { - $http.get('/sys/orgs/referrer').then(function (resp) { - $scope.referrers = resp.data; - }) - }; - $scope.listReferrers(); - - $scope.loadAlipayCategory = function () { - $http.get('/static/data/alipayMcc.json').then(function (resp) { - $scope.alipayMccCategory = resp.data; - }) - }; - $scope.loadAlipayCategory(); - $scope.loadJDindustry = function () { - $http.get('/static/data/jdindustry.json').then(function (resp) { - $scope.jdindustry = resp.data; - }) - }; - $scope.loadJDindustry(); - - $scope.loadLakalaPayindustry = function () { - $http.get('/static/data/lakalapayindustry.json').then(function (resp) { - $scope.lakalapayindustry = resp.data; - }) - }; - $scope.loadLakalaPayindustry(); - - $scope.loadLakalaPaySettle = function () { - $http.get('/static/data/lakalapaysettle.json').then(function (resp) { - $scope.lakalapaysettle = resp.data; - }) - }; - $scope.loadLakalaPaySettle(); - - $scope.loadLakalaPayGoods = function () { - $http.get('/static/data/lakalapaygoods.json').then(function (resp) { - $scope.lakalapaygoods = resp.data; - }) - }; - $scope.loadLakalaPayGoods(); - - $scope.loadRoyalpayindustry = function () { - $http.get('/static/data/royalpayindustry.json').then(function (resp) { - $scope.royalpayindustry = resp.data; - }) - }; - $scope.loadRoyalpayindustry(); - - $scope.loadHfindustry = function () { - $http.get('/static/data/hfindustry.json').then(function (resp) { - $scope.hfindustry = resp.data; - }) - }; - $scope.loadHfindustry(); - - $scope.onAlipayMccSelect = function (selectedItem) { - $scope.partner.alipay_category = selectedItem.label; - $scope.partner.alipayindustry = selectedItem.mccCode; - }; - - $scope.onRoyalPayIndustrySelect = function (selectedItem) { - $scope.partner.royalpay_label = selectedItem.label; - $scope.partner.royalpayindustry = selectedItem.mccCode; - }; - - $scope.onHfIndustrySelect = function (selectedItem) { - $scope.partner.hf_label = selectedItem.label; - $scope.partner.hfindustry = selectedItem.mccCode; - }; - - // $scope.t2city_map = angular.copy(t2city_map); - - $scope.timezones = timezone.configs(); - $scope.checkMerchantCodeIsValid = function (code) { - if (code.length != 4) { - $scope.merchantCodeChecked = false; - $scope.merchantIsValid = false; - return; - } - $http.get('/sys/partners/init/check_code_isvalid', {params: {clientMoniker: code}}).then(function (response) { - $scope.merchantIsValid = response.data; - $scope.merchantCodeChecked = true; - }); - }; - $scope.save = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - - if ($scope.partner.company_name.indexOf("Migration") != -1) { - alert("Company Name包含敏感词汇,请检查后重新提交!"); - return; - } - if ($scope.partner.company_phone_a && ('' + $scope.partner.company_phone_a != '')) { - if ($scope.partner.company_phone_a.indexOf('0') == 0) { - alert("Please remove the first character '0' of area code"); - return; - } - } - if ($scope.partner.contact_phone && ('' + $scope.partner.contact_phone != '')) { - if ($scope.partner.contact_phone.indexOf('0') == 0) { - alert("Please remove the first character '0' of area code"); - return; - } - } - $scope.partner.company_phone = '+' + $scope.partner.company_phone_c + ($scope.partner.company_phone_a || '') + $scope.partner.company_phone_p; - $scope.partner.contact_phone = '+' + $scope.partner.contact_phone_c + ($scope.partner.contact_phone_a || '') + $scope.partner.contact_phone_p; - $scope.partner.legal_representative_phone = '+' + $scope.partner.legal_representative_phone_c + ( $scope.partner.legal_representative_phone_a || '') + $scope.partner.legal_representative_phone_p; - $scope.partner.marketing_phone = '+' + $scope.partner.marketing_phone_c + ( $scope.partner.marketing_phone_a || '') + $scope.partner.marketing_phone_p; - if ($scope.partner.company_phone.indexOf(' ') != -1) { - alert('Company Phone can not contain space character'); - return; - } - if ($scope.partner.contact_phone.indexOf(' ') != -1) { - alert('Contact Phone can not contain space character'); - return; - } - if ($scope.partner.legal_representative_phone.indexOf(' ') != -1) { - alert('Representative phone can not contain space character'); - return; - } - if ($scope.partner.marketing_phone.indexOf(' ') != -1) { - alert('Marketing phone can not contain space character'); - return; - } - if ($scope.partner.contact_email.indexOf(' ') != -1) { - alert('Contact email Phone can not contain space character'); - return; - } - if ($scope.partner.legal_representative_email.indexOf(' ') != -1) { - alert('Representative email Phone can not contain space character'); - return; - } - if ($scope.partner.marketing_email.indexOf(' ') != -1) { - alert('Marketing email Phone can not contain space character'); - return; - } - if ($scope.partner.suburb.indexOf(' ') != -1) { - alert('suburb can not contain two and more continuous space characters'); - return; - } - if ($scope.partner.registered_suburb.indexOf(' ') != -1) { - alert('Registered suburb can not contain two and more continuous space characters'); - return; - } - if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { - if ($scope.partner.acn.length != 9) { - alert('Acn is not valid'); - return; - } - } - if (!$scope.partner.logo_url) { - alert("Logo is necessary!"); - return; - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if (!$scope.partner.company_photo) { - alert('Shop Photo1 is necessary'); - return; - } - if (!$scope.partner.store_photo) { - alert('Shop Photo2 is necessary'); - return; - } - } - - if ($scope.partner.referrer_id) { - $scope.referrers.forEach(function (e) { - if ($scope.partner.referrer_id == e.org_id) { - $scope.partner.referrer_name = e.name; - return; - } - }) - } - - if ($scope.partner.client_pay_type.length == 0) { - alert('请选择商户支付场景') - return; - } - if ($scope.partner.client_pay_desc.length == 0) { - alert('请选择商户支付方式') - return; - } - if (typeof ($scope.partner.client_pay_type) == 'string' || typeof ($scope.partner.client_pay_desc) == 'string') { - $scope.partner.client_pay_type = $scope.partner.client_pay_type.split(","); - $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.split(","); - - } - if ($scope.partner.client_pay_type.indexOf('1') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { - alert("请检查线上支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { - alert("请检查线下支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { - alert("请检查线下支付是否已选择收银系统类型"); - return; - } - } - $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); - $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); - $http.post('/sys/partners', $scope.partner).then(function (resp) { - commonDialog.alert({title: 'Success', content: 'Register new partner successfully', type: 'success'}); - $scope.updateMerchantLocation(); - // $scope.loadPartners(); - $state.go('partners.detail', {clientMoniker: resp.data.client_moniker}) - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }); - }; - $scope.uploadLogo = function (file) { - if (file != null) { - if (file.size > 1 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error'}) - } else { - $scope.logoProgress = {value: 0}; - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - delete $scope.logoProgress; - $scope.partner.logo_id = resp.data.fileid; - $scope.partner.logo_url = resp.data.url; - }, function (resp) { - delete $scope.logoProgress; - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }, function (evt) { - $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadShopPhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) - } else { - $scope.shopPhotoProgress = {value: 0}; - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - delete $scope.shopPhotoProgress; - $scope.partner.company_photo = resp.data.url; - }, function (resp) { - delete $scope.shopPhotoProgress; - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }, function (evt) { - $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.uploadStorePhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) - } else { - $scope.storePhotoProgress = {value: 0}; - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - delete $scope.storePhotoProgress; - $scope.partner.store_photo = resp.data.url; - }, function (resp) { - delete $scope.storePhotoProgress; - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }, function (evt) { - $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } - } - }; - - $scope.updateMerchantLocation = function () { - var params = window.frames['merchant_detail'].merchant_location; - if (params) { - $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { - }); - } - } - }]); app.controller('partnerDetailCtrl', ['$scope', '$http', '$state', '$uibModal', '$rootScope', 'Upload', 'commonDialog', 'partner', '$sce', function ($scope, $http, $state, $uibModal, $rootScope, Upload, commonDialog, partner, $sce) { $scope.init = {wechat_compliance: false, local_merchant: false}; $scope.partner = partner.data; @@ -1135,612 +696,198 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) } - }) - }; - $scope.apply2makeAgreeFile = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then(function () { - commonDialog.alert({ - title: 'Success!', - content: '已提交制作合同!', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - } - ); - }; - - $scope.commit2GreenChannel = function () { - commonDialog.confirm({ - title: 'Audit Partner', - content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' Green Channel?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/compliance/green_channel').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Commit to Green Channel successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - - }) - }; - - $scope.markAuditEmail = function () { - commonDialog.confirm({ - title: 'Warning', - content: 'Make sure you have send the email to client.' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/email_sending_status').then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - $scope.resendApproveEmail = function () { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will reset the password of admin user. Are you sure this email is correct ? Or you may update this information first.' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/send_email').then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - $scope.editBDUser = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', - controller: 'partnerChooseBDUserDialogCtrl', - resolve: { - bdUsers: ['$http', function ($http) { - return $http.get('/sys/manager_accounts/roles/bd_user'); - }], - partner: function () { - return $scope.partner; - }, - type: function () { - return 'edit'; - } - } - }).result.then(function () { - $state.reload(); - }) - }; - $scope.bindBDUser = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', - controller: 'partnerChooseBDUserDialogCtrl', - resolve: { - bdUsers: ['$http', function ($http) { - return $http.get('/sys/manager_accounts/roles/bd_user'); - }], - partner: function () { - return $scope.partner; - }, - type: function () { - return 'add'; - } - } - }).result.then(function () { - $state.reload(); - }) - }; - - $scope.configMasterMerchant = function () { - commonDialog.inputText({title: 'Input Master Merchant Code'}).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/master_configuration', {master_merchant: text}).then(function () { - commonDialog.alert({title: 'Success', content: "Master Merchant Code:" + text, type: 'success'}); - }, function (resp) { - commonDialog.alert({ - title: 'Config Master Merchant Failed', - content: resp.data.message, - type: 'error' - }); - }) - }) - }; - - $scope.getMerchantLocation = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { - $scope.merchant_location = resp.data; - }); - }; - $scope.getMerchantLocation(); - - - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - $rootScope.complianceCheck.clientInfo = true; - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; - } - } - }; - $scope.complianceChangeCheck(); - - $scope.changeWechatCompliance = function () { - if (!$scope.partner) { - return; - } - if (!$state.is('partners.detail')) { - $scope.init.wechat_compliance = false; - return; - } - if (!$scope.init.wechat_compliance) { - $scope.init.wechat_compliance = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_compliance_permission', {allow: $scope.partner.wechat_compliance}).then(function () { - - }, function (resp) { - commonDialog.alert({ - title: 'failed to change wechat_compliance permission status', - content: resp.data.message, - type: 'error' - }) - }) - }; - $scope.changeLocalMerchant = function () { - if (!$scope.partner) { - return; - } - if (!$state.is('partners.detail')) { - $scope.init.local_merchant = false; - return; - } - if (!$scope.init.local_merchant) { - $scope.init.local_merchant = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/local_merchant_permission', {allow: $scope.partner.local_merchant}).then(function () { - - }, function (resp) { - commonDialog.alert({ - title: 'failed to change local_merchant permission status', - content: resp.data.message, - type: 'error' - }) - }) - }; - - $scope.removeSub = function () { - $http.delete('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { - $state.reload(); - }); - }; - $scope.addSub = function () { - $http.put('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { - $state.reload(); - }); - }; - }]); - app.controller('partnerEditCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', 'partner', - function ($scope, $http, $state, Upload, commonDialog, timezone, partner) { - $scope.timezones = timezone.configs(); - $scope.partner = partner.data; - if($scope.partner.representativeInfo != null) - { - $scope.partner.registered_address = $scope.partner.representativeInfo.address; - $scope.partner.registered_suburb = $scope.partner.representativeInfo.suburb; - $scope.partner.registered_postcode = $scope.partner.representativeInfo.postcode; - $scope.partner.registered_state = $scope.partner.representativeInfo.state; - $scope.partner.legal_representative_person = $scope.partner.representativeInfo.representative_person; - $scope.partner.legal_representative_phone = $scope.partner.representativeInfo.phone; - $scope.partner.legal_representative_email = $scope.partner.representativeInfo.email; - $scope.partner.legal_representative_job = $scope.partner.representativeInfo.job_title; - - $scope.partner.marketing_person = $scope.partner.representativeInfo.marketing_person; - $scope.partner.marketing_phone = $scope.partner.representativeInfo.marketing_phone; - $scope.partner.marketing_email = $scope.partner.representativeInfo.marketing_email; - $scope.partner.marketing_job = $scope.partner.representativeInfo.marketing_job_title; - - $scope.partner.legal_representative_wechatid = $scope.partner.representativeInfo.legal_representative_wechatid; - $scope.partner.marketing_wechatid = $scope.partner.representativeInfo.marketing_wechatid; - } - - function hasRole() { - var rolenum; - switch (sessionStorage.getItem('role')) { - case "administrator": - rolenum = 1; - break; - case "bduser": - rolenum = 4; - break; - case "salesmanager": - rolenum = 8192; - break; - case "accountant": - rolenum = 8; - break; - case "sitemanager": - rolenum = 128; - break; - case "director": - rolenum = 64; - break; - case "developer": - rolenum = 256; - break; - case "compliance": - rolenum = 2; - break; - case "guest": - rolenum = 2048; - break; - case "orgmanager": - rolenum = 4096; - break; - case "riskmanager": - rolenum = 1024; - break; - default: - break; - } - if ((window.currentUser.role & rolenum) >0) { - return true; - }else { - sessionStorage.removeItem('role'); - return false; - } - } - - if (hasRole()) { - $scope.role = sessionStorage.getItem('role'); - } - - var origin_referrer_id = angular.copy($scope.partner.referrer_id); - var resetClientPayDescByTpey = function (type) { - type = parseInt(type); - if (type == 1) { - removeClientPayDesc($scope.partner.client_pay_desc, '10'); - } - if (type == 2) { - removeClientPayDesc($scope.partner.client_pay_desc, '20'); - } - }; - var compare = function (x, y) { - x = parseInt(x); - y = parseInt(y); - if (x < y) { - return -1; - } else if (x > y) { - return 1; - } else { - return 0; - } - } - $scope.toggleClientPayType = function (type) { - if (!$scope.partner.client_pay_type) { - $scope.partner.client_pay_type = []; - } - var $idx = $scope.partner.client_pay_type.indexOf(type); - if ($idx >= 0) { - $scope.partner.client_pay_type.splice($idx, 1); - resetClientPayDescByTpey(type); - } else { - $scope.partner.client_pay_type.push(type); - $scope.partner.client_pay_type.sort(compare); - } - }; - $scope.toggleClientPayDesc = function (type) { - if (!$scope.partner.client_pay_desc) { - $scope.partner.client_pay_desc = []; - } - var $idx = $scope.partner.client_pay_desc.indexOf(type); - if ($idx >= 0) { - if (type == '203') { - removeClientPayDesc($scope.partner.client_pay_desc, '2030') - } - $scope.partner.client_pay_desc.splice($idx, 1); - } else { - $scope.partner.client_pay_desc.push(type); - $scope.partner.client_pay_desc.sort(compare); - } - }; - - $scope.partner.sameAsContactPerson = false; - $scope.checkboxOnclick = function (){ - $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); - if($scope.partner.sameAsContactPerson) { - $scope.partner.legal_representative_person = $scope.partner.contact_person; - $scope.partner.legal_representative_phone = $scope.partner.contact_phone; - $scope.partner.legal_representative_email = $scope.partner.contact_email; - $scope.partner.legal_representative_job = $scope.partner.contact_job; - $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.marketingSameAsContact = false; - $scope.checkMarketingSameAsContact = function (){ - $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); - if($scope.partner.marketingSameAsContact) { - $scope.partner.marketing_person = $scope.partner.contact_person; - $scope.partner.marketing_phone = $scope.partner.contact_phone; - $scope.partner.marketing_email = $scope.partner.contact_email; - $scope.partner.marketing_job = $scope.partner.contact_job; - $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; - } - } - - $scope.partner.sameAsAddress=false; - $scope.sameAddress = function (){ - $scope.partner.sameAsAddress=!($scope.partner.sameAsAddress); - if($scope.partner.sameAsAddress) { - $scope.partner.registered_address = $scope.partner.address; - $scope.partner.registered_suburb = $scope.partner.suburb; - $scope.partner.registered_postcode = $scope.partner.postcode; - $scope.partner.registered_state = $scope.partner.state; - } - } - - $scope.listReferrers = function () { - $http.get('/sys/orgs/referrer').then(function (resp) { - $scope.referrers = resp.data; - }) - }; - $scope.listReferrers(); - - $scope.loadAlipayCategory = function () { - $http.get('/static/data/alipayMcc.json').then(function (resp) { - $scope.alipayMccCategory = resp.data; - }) - }; - $scope.loadAlipayCategory(); - $scope.loadJDindustry = function () { - $http.get('/static/data/jdindustry.json').then(function (resp) { - $scope.jdindustry = resp.data; - }) - }; - $scope.loadJDindustry(); - - $scope.loadLakalaPayindustry = function () { - $http.get('/static/data/lakalapayindustry.json').then(function (resp) { - $scope.lakalapayindustry = resp.data; - }) - }; - $scope.loadLakalaPayindustry(); - - $scope.loadLakalaPaySettle = function () { - $http.get('/static/data/lakalapaysettle.json').then(function (resp) { - $scope.lakalapaysettle = resp.data; - }) - }; - $scope.loadLakalaPaySettle(); - - $scope.loadLakalaPayGoods = function () { - $http.get('/static/data/lakalapaygoods.json').then(function (resp) { - $scope.lakalapaygoods = resp.data; - }) - }; - $scope.loadLakalaPayGoods(); - - $scope.loadRoyalpayindustry = function () { - $http.get('/static/data/royalpayindustry.json').then(function (resp) { - $scope.royalpayindustry = resp.data; - }) - }; - $scope.loadRoyalpayindustry(); - - $scope.loadHfindustry = function () { - $http.get('/static/data/hfindustry.json').then(function (resp) { - $scope.hfindustry = resp.data; - }) - }; - $scope.loadHfindustry(); - - $scope.onAlipayMccSelect = function (selectedItem) { - $scope.partner.alipay_category = selectedItem.label; - $scope.partner.alipayindustry = selectedItem.mccCode; - }; - $scope.onRoyalPayIndustrySelect = function (selectedItem) { - $scope.partner.royalpay_label = selectedItem.label; - $scope.partner.royalpayindustry = selectedItem.mccCode; - }; - $scope.onHfIndustrySelect = function (selectedItem) { - $scope.partner.hf_label = selectedItem.label; - $scope.partner.hfindustry = selectedItem.mccCode; - }; - - - $scope.updatePartner = function (form) { - if (form.$invalid) { - angular.forEach(form, function (item, key) { - if (key.indexOf('$') < 0) { - item.$dirty = true; - } - }); - return; - } - - if ($scope.partner.company_name.indexOf("Migration") != -1) { - alert("Company Name包含敏感词汇,请检查后重新提交!"); - return; - } - if ($scope.partner.company_phone.indexOf(' ') != -1) { - alert('Company Phone can not contain space character'); - return; - } - if ($scope.partner.contact_email.indexOf(' ') != -1) { - alert('Contact email Phone can not contain space character'); - return; - } - if ($scope.partner.suburb.indexOf(' ') != -1) { - alert('suburb can not contain two and more continuous space characters'); - return; - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if (!$scope.partner.company_photo) { - alert('Shop Photo1 is necessary'); - return; - } - if (!$scope.partner.store_photo) { - alert('Shop Photo2 is necessary'); - return; - } - } - - if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { - if ($scope.partner.acn.length != 9) { - alert('Acn is not valid'); - } - } - if ($scope.partner.referrer_id) { - $scope.referrers.forEach(function (e) { - if ($scope.partner.referrer_id == e.org_id) { - $scope.partner.referrer_name = e.name; - return; - } - }) - } - var content = ''; - if (!origin_referrer_id && $scope.partner.referrer_id) { - content = 'Update partner info successfully,But You Had add new Referrer,Please Change the BD Commission Proportion!'; - } - if ($scope.partner.client_pay_type.length == 0) { - alert('请选择商户支付场景') - return; - } - if ($scope.partner.client_pay_desc.length == 0) { - alert('请选择商户支付方式') - return; - } - if ($scope.partner.client_pay_type.indexOf('1') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { - alert("请检查线上支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_type.indexOf('2') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { - alert("请检查线下支付场景是否已选择支付方式"); - return; - } - } - if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { - if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { - alert("请检查线下支付是否已选择收银系统类型"); - return; - } - } - $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); - $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); - $http.put('/sys/partners/' + $scope.partner.client_moniker, $scope.partner).then(function () { - if (content != '') { - commonDialog.alert({ - title: 'Warning', - content: content, - type: 'error' - }); - } else { - commonDialog.alert({ - title: 'Success', - content: 'Update partner information successfully', - type: 'success' - }); - } - $scope.updateMerchantLocation(); - $scope.loadPartners(); - $state.go('^.detail', {clientMoniker: $scope.partner.client_moniker}, {reload: true}); + }) + }; + $scope.apply2makeAgreeFile = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then(function () { + commonDialog.alert({ + title: 'Success!', + content: '已提交制作合同!', + type: 'success' + }); + $state.reload(); }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) - }); - }; - $scope.uploadLogo = function (file) { - if (file != null) { - if (file.size > 1 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error'}) - } else { - $scope.logoProgress = {value: 0}; - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - delete $scope.logoProgress; - $scope.partner.logo_id = resp.data.fileid; - $scope.partner.logo_url = resp.data.url; - }, function (resp) { - delete $scope.logoProgress; - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }, function (evt) { - $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) - } + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); } - }; + ); + }; - $scope.uploadShopPhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) - } else { - $scope.shopPhotoProgress = {value: 0}; - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - delete $scope.shopPhotoProgress; - $scope.partner.company_photo = resp.data.url; - }, function (resp) { - delete $scope.shopPhotoProgress; - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }, function (evt) { - $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) + $scope.commit2GreenChannel = function () { + commonDialog.confirm({ + title: 'Audit Partner', + content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' Green Channel?' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/compliance/green_channel').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Commit to Green Channel successfully', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + + }) + }; + + $scope.markAuditEmail = function () { + commonDialog.confirm({ + title: 'Warning', + content: 'Make sure you have send the email to client.' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/email_sending_status').then(function () { + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + $scope.resendApproveEmail = function () { + commonDialog.confirm({ + title: 'Warning', + content: 'This operation will reset the password of admin user. Are you sure this email is correct ? Or you may update this information first.' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/send_email').then(function () { + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + $scope.editBDUser = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', + controller: 'partnerChooseBDUserDialogCtrl', + resolve: { + bdUsers: ['$http', function ($http) { + return $http.get('/sys/manager_accounts/roles/bd_user'); + }], + partner: function () { + return $scope.partner; + }, + type: function () { + return 'edit'; } } - }; - - $scope.uploadStorePhoto = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) - } else { - $scope.storePhotoProgress = {value: 0}; - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - delete $scope.storePhotoProgress; - $scope.partner.store_photo = resp.data.url; - }, function (resp) { - delete $scope.storePhotoProgress; - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }, function (evt) { - $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); - }) + }).result.then(function () { + $state.reload(); + }) + }; + $scope.bindBDUser = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', + controller: 'partnerChooseBDUserDialogCtrl', + resolve: { + bdUsers: ['$http', function ($http) { + return $http.get('/sys/manager_accounts/roles/bd_user'); + }], + partner: function () { + return $scope.partner; + }, + type: function () { + return 'add'; } } - }; - - $scope.getMerchantLocation = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { - $scope.merchant_location = resp.data; - }); - }; - $scope.getMerchantLocation(); + }).result.then(function () { + $state.reload(); + }) + }; - $scope.updateMerchantLocation = function () { - var params = window.frames['merchant_detail'].merchant_location; - if (params) { - $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { + $scope.configMasterMerchant = function () { + commonDialog.inputText({title: 'Input Master Merchant Code'}).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/master_configuration', {master_merchant: text}).then(function () { + commonDialog.alert({title: 'Success', content: "Master Merchant Code:" + text, type: 'success'}); + }, function (resp) { + commonDialog.alert({ + title: 'Config Master Merchant Failed', + content: resp.data.message, + type: 'error' }); + }) + }) + }; + + $scope.getMerchantLocation = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { + $scope.merchant_location = resp.data; + }); + }; + $scope.getMerchantLocation(); + + + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {}; + } + $rootScope.complianceCheck.client_id = $scope.partner.client_id; + $rootScope.complianceCheck.clientInfo = true; + }; + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck; } } - }]); + }; + $scope.complianceChangeCheck(); + + $scope.changeWechatCompliance = function () { + if (!$scope.partner) { + return; + } + if (!$state.is('partners.detail')) { + $scope.init.wechat_compliance = false; + return; + } + if (!$scope.init.wechat_compliance) { + $scope.init.wechat_compliance = true; + return; + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_compliance_permission', {allow: $scope.partner.wechat_compliance}).then(function () { + + }, function (resp) { + commonDialog.alert({ + title: 'failed to change wechat_compliance permission status', + content: resp.data.message, + type: 'error' + }) + }) + }; + $scope.changeLocalMerchant = function () { + if (!$scope.partner) { + return; + } + if (!$state.is('partners.detail')) { + $scope.init.local_merchant = false; + return; + } + if (!$scope.init.local_merchant) { + $scope.init.local_merchant = true; + return; + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/local_merchant_permission', {allow: $scope.partner.local_merchant}).then(function () { + + }, function (resp) { + commonDialog.alert({ + title: 'failed to change local_merchant permission status', + content: resp.data.message, + type: 'error' + }) + }) + }; + + $scope.removeSub = function () { + $http.delete('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { + $state.reload(); + }); + }; + $scope.addSub = function () { + $http.put('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { + $state.reload(); + }); + }; + }]); app.controller('partnerPaymentInfoCtrl', ['$scope', '$http', '$state', 'commonDialog', '$uibModal', '$sce', function ($scope, $http, $state, commonDialog, $uibModal, $sce) { $scope.convertExtParams = []; $scope.copyHfLink = function () { @@ -4114,7 +3261,14 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; $scope.listRedpackLogs(1); }]); - app.controller('partnerAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { + app.controller('partnerAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', function ($scope, $http, $rootScope, commonDialog, $state) { + if ($scope.partner.client_type=='card-payment'){ + $state.go('partners.detail.files.MW_files'); + }else { + $state.go('partners.detail.files.CP_files'); + } + }]); + app.controller('partnerCPAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { $scope.id_info_form = {edit: false}; $scope.file = file.data || {}; //audit files @@ -4366,7 +3520,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) }) -}; + }; $scope.updateFile = function () { @@ -4406,7 +3560,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.complianceChangeCheck(); }]); - app.controller('partnerMWAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { $scope.id_info_form = {edit: false}; $scope.file = file.data || {}; diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 6ebd8ff88..098a270da 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -16,6 +16,13 @@ background-color: #f7bf90; border-color: #adadad; } + .form-control-float { + float: left; + width: 93%; !important; + } + .form-control-span{ + height: 34px; + }

New Partner

@@ -26,11 +33,25 @@
  • New Partner
  • -
    +
    Partner Basic Information
    @@ -112,21 +133,40 @@
    -
    -
    + +
    + +
    +

    Required + Field

    +

    Less + Than 19 + Characters(including symbols and spaces)

    +
    +
    +
    +
    @@ -148,7 +188,7 @@
    -
    @@ -176,31 +216,19 @@
    - - - - - - - - - - - - - -
    - + ng-if="partner.business_structure != 'Company' || partner.client_type=='card-payment' || partner.client_type=='all'"> +
    +

    Required + Field

    Less Than 20 Characters(including symbols and spaces)

    @@ -209,7 +237,7 @@
    + ng-if="partner.business_structure == 'Company' && partner.client_type!='card-payment'">
    - - - - - - - - - - - - - - - - -
    -
    +
    @@ -296,7 +298,6 @@ Than 11 Characters

    -
    @@ -353,7 +354,7 @@ ng-click="toggleClientPayType('1')"> 线上 -
    -
    +
    @@ -420,7 +421,7 @@
    -
    +
    @@ -491,7 +492,7 @@
    -
    +
    1:  @@ -503,9 +504,9 @@ - +
    @@ -518,16 +519,48 @@ - +
    +
    + +
    + + $ +
    +

    Required + Field

    +
    +
    +
    +
    + +
    + + $ +
    +

    Required + Field

    +
    +
    +
    -
    +
    Alipay Information  (Optional)
    @@ -669,16 +702,6 @@ Characters(including symbols and spaces)

    - -
    - -
    - -
    -
    -
    @@ -707,16 +729,26 @@ maxlength="50">
    + +
    + +
    + +
    +
    -
    - -
    + +
    +
    -
    -
    + +
      Legal Representative
    @@ -791,7 +823,7 @@
    + E-mail
    -
    -
      Marketing Person
    -
    +
    +
      Marketing Person
    +
    @@ -1195,105 +1227,6 @@
    - - -
    Industry @@ -1318,7 +1251,7 @@
    -
    @@ -1337,7 +1270,7 @@
    -
    @@ -1356,6 +1289,44 @@
    + +
    + +
    + +
    +

    Required + Field

    +
    +
    +
    +
    + +
    + + + + + + +
    +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_auth_files.html index 12bf85c97..c77dffeed 100644 --- a/src/main/ui/static/payment/partner/templates/partner_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_auth_files.html @@ -3,366 +3,18 @@ width: 100%; } -
    -
    Audit Files     - - 一键下载 - +
    + -
    -
    -
    -

    - ID描述信息 - - -

    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    - - - - - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - {{file.id_type}} -
    -
    -
    -
    - -
    - - - - - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - - -
    - - - - - - - - - -
    1 - - - - -
    - - -
    -
    -
    -

    Example:请保证图片信息清晰可见,如下图

    - -
    -
    -
    - -
    - -
    -
    - - -
    - - - - - - - -
    1 - - - - -
    -
    -
    -
    -
    -

    Example:公司请提供以下文件图片

    - - -
    -
    -

    sole trade(个体户),partnership(合伙),trust(信托)请在http://abr.business.gov.au,将查询结果截图上传

    - -
    -
    -
    -
    - -
    - -
    -
    - - -
    - - - - - - - - -
    1 - - - - -
    -
    -
    -
    -
    -

    Example:请保证图片(护照或驾照)信息清晰可见,如下图

    - -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - - -
    - - - - - - - - -
    1 - - - - -
    -
    -
    -
    -

    Example:请保证图片信息清晰可见,如下图

    - -
    -
    -
    -
    - -
    -
    - -
    -
    - - -
    - - - - - - - - -
    1 - - - - -
    -
    -
    -
    -

    Example:请保证图片信息清晰可见,如下图

    - -
    -
    -
    -
    - -
    - -
    -
    - -

    - One utility bill (water, electricity or gas) that shows the residential address (*Mandatory if your uploaded ID is a passport)
    - 一份显示常住居所地址的账单(水费、电费或煤气费)(*必须上传 - 如您上传的ID是护照)
    -

    - -
    - - - - - - - - -
    1 - - - -
    -
    -
    -
    -
    -

    Example:请提供水电煤账单文件图片,如示例 - 水费.png -
    电费.jpg -

    -

    - 煤气.png -

    -
    -
    -
    -
    -
    -
    -
    - check -
    -
    - - - - +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html new file mode 100644 index 000000000..2d9035b04 --- /dev/null +++ b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html @@ -0,0 +1,363 @@ + + +
    Audit Files     + + 一键下载 + +
    +
    +
    +
    +

    + ID描述信息 + + +

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + + + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + {{file.id_type}} +
    +
    +
    +
    + +
    + + + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + + + +
    1 + + + + +
    + + +
    +
    +
    +

    Example:请保证图片信息清晰可见,如下图

    + +
    +
    +
    + +
    + +
    +
    + + +
    + + + + + + + +
    1 + + + + +
    +
    +
    +
    +
    +

    Example:公司请提供以下文件图片

    + + +
    +
    +

    sole trade(个体户),partnership(合伙),trust(信托)请在http://abr.business.gov.au,将查询结果截图上传

    + +
    +
    +
    +
    + +
    + +
    +
    + + +
    + + + + + + + + +
    1 + + + + +
    +
    +
    +
    +
    +

    Example:请保证图片(护照或驾照)信息清晰可见,如下图

    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + + +
    1 + + + + +
    +
    +
    +
    +

    Example:请保证图片信息清晰可见,如下图

    + +
    +
    +
    +
    + +
    +
    + +
    +
    + + +
    + + + + + + + + +
    1 + + + + +
    +
    +
    +
    +

    Example:请保证图片信息清晰可见,如下图

    + +
    +
    +
    +
    + +
    + +
    +
    + +

    + One utility bill (water, electricity or gas) that shows the residential address (*Mandatory if your uploaded ID is a passport)
    + 一份显示常住居所地址的账单(水费、电费或煤气费)(*必须上传 - 如您上传的ID是护照)
    +

    + +
    + + + + + + + + +
    1 + + + +
    +
    +
    +
    +
    +

    Example:请提供水电煤账单文件图片,如示例 + 水费.png +
    电费.jpg +

    +

    + 煤气.png +

    +
    +
    +
    +
    +
    +
    +
    + check +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index bb9a6182d..5514efada 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -277,9 +277,6 @@
  • Compliance Files
  • -
  • - Merchant Warrior Compliance Files -
  • diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index d9a07d714..0cecd2c54 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -10,6 +10,13 @@ background-color: #f7bf90; border-color: #adadad; } + .form-control-float { + float: left; + width: 93%; !important; + } + .form-control-span{ + height: 34px; + }

    @@ -26,6 +33,21 @@
    +
    Partner Basic Information
    @@ -82,7 +104,7 @@
    - +
    @@ -93,7 +115,7 @@
    -
    @@ -111,9 +133,7 @@
    -
    -
    @@ -162,7 +182,7 @@
    -
    @@ -181,8 +201,24 @@
    - -
    + +
    + +
    +

    Required + Field

    +

    Less + Than 19 + Characters(including symbols and spaces)

    +
    +
    +
    +
    @@ -206,20 +242,6 @@
    - - - - - - - - - - - - - -
    @@ -319,7 +341,7 @@ ng-click="toggleClientPayType('1')"> 线上 -
    -
    +
    @@ -386,7 +408,7 @@
    -
    +
    @@ -457,7 +479,7 @@
    -
    +
    1:  @@ -488,11 +510,43 @@
    +
    + +
    + + $ +
    +

    Required + Field

    +
    +
    +
    +
    + +
    + + $ +
    +

    Required + Field

    +
    +
    +
    -
    +
    Alipay Information   (Optional)
    @@ -578,16 +632,6 @@ Characters(including symbols and spaces)

    - -
    - -
    - -
    -
    + +
    + +
    + +
    +
    -
    +
    @@ -729,8 +783,8 @@
    -
      Marketing Person
    -
    +
      Marketing Person
    +
    @@ -1080,81 +1134,6 @@
    - -
    Industry
    @@ -1178,7 +1157,7 @@
    -
    @@ -1197,7 +1176,7 @@
    -
    @@ -1216,6 +1195,42 @@
    +
    + +
    + +
    +

    Required + Field

    +
    +
    +
    +
    + +
    + + + + + + +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index 079916613..371b91dbb 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -3,82 +3,81 @@ width: 100%; } -
    -
    Audit Files     - - 一键下载 - -
    -
    -
    -
    -

    - Merchant Warrior商户风险评级 - - -

    -
    -
    -
    - -
    -
    - -
    +
    Audit Files     + + 一键下载 + +
    +
    +
    +
    +

    + Merchant Warrior商户风险评级 + + +

    +
    +
    +
    + +
    +
    +
    -
    - -
    -
    - -
    +
    +
    + +
    +
    +
    -
    - -
    -
    - 低风险 - 中风险 - 高风险 -
    +
    +
    + +
    +
    + 低风险 + 中风险 + 高风险
    -
    - -
    -
    - -
    +
    +
    + +
    +
    +
    -
    -
    - -
    -
    - - - -
    - - + + +
    + +
    +
    + + + +
    + +
    -
    @@ -87,108 +86,107 @@
    + +
    +
    + +
    + +
    +
    + + +
    + + + + + + +
    + + +
    +
    +
    + +
    +
    + + + +
    + + + + + +
    + + +
    +
    +
    + +
    - +
    - +
    - + -
    - + +
    +
    +
    - +
    - - -
    - - - - - -
    - - -
    -
    -
    - -
    -
    - -
    -
    - - - -
    - - - - - - -
    - - -
    -
    -
    -
    - -
    -
    - -
    -
    - - - -
    - - - - - - -
    - - -
    + +
    + + + + + + +
    + + +
    -
    +
    From fc180b87d74f0f152fe002a7e402e941d7f454fe Mon Sep 17 00:00:00 2001 From: luoyang Date: Mon, 27 Apr 2020 11:53:31 +0800 Subject: [PATCH 022/110] fix notice length 200 --- src/main/ui/static/config/notice/templates/notice_add.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/config/notice/templates/notice_add.html b/src/main/ui/static/config/notice/templates/notice_add.html index 7512564d8..7137930a5 100644 --- a/src/main/ui/static/config/notice/templates/notice_add.html +++ b/src/main/ui/static/config/notice/templates/notice_add.html @@ -49,11 +49,11 @@
    + id="title-input" maxlength="200" name="title" required>

    Required Field

    -

    Less Than 100 +

    Less Than 200 Characters(including symbols and spaces)

    From a382441bf29473ee48aaed62011de2642eb911b5 Mon Sep 17 00:00:00 2001 From: dulingling Date: Mon, 27 Apr 2020 14:55:57 +0800 Subject: [PATCH 023/110] =?UTF-8?q?Upd:=E5=A2=9E=E5=8A=A0=E5=8D=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B=EF=BC=8C?= =?UTF-8?q?BD=E6=8F=90=E4=BA=A4=E8=B5=84=E6=96=99=EF=BC=8C=E5=90=88?= =?UTF-8?q?=E8=A7=84=E9=80=9A=E8=BF=87=EF=BC=8C=E5=90=88=E8=A7=84=E6=89=93?= =?UTF-8?q?=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/ClientAuditProcessMapper.java | 2 +- .../mappers/system/ClientCardFlowMapper.java | 31 ++ .../manage/merchants/beans/PartnerQuery.java | 12 + .../manage/merchants/core/ClientManager.java | 12 + .../core/impls/ClientManagerImpl.java | 443 ++++++++++++++---- .../web/PartnerManageController.java | 21 + .../manage/mappers/system/ClientMapper.xml | 18 + .../static/payment/partner/partner-manage.js | 95 ++++ .../partner/templates/partner_detail.html | 180 ++++++- .../payment/partner/templates/partners.html | 54 ++- 10 files changed, 742 insertions(+), 126 deletions(-) create mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAuditProcessMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAuditProcessMapper.java index 9ebfae667..c277cfa4b 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAuditProcessMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientAuditProcessMapper.java @@ -20,5 +20,5 @@ public interface ClientAuditProcessMapper { int update(JSONObject partner); @AutoSql(SqlType.SELECT) - PageList getAuditLog(@Param("client_id") int client_id, PageBounds pagination); + PageList getAuditLog(@Param("client_id") int client_id, @Param("type") int type, PageBounds pagination); } diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java new file mode 100644 index 000000000..485ef152c --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java @@ -0,0 +1,31 @@ +package au.com.royalpay.payment.manage.mappers.system; + +import com.alibaba.fastjson.JSONObject; +import com.github.miemiedev.mybatis.paginator.domain.PageBounds; +import com.github.miemiedev.mybatis.paginator.domain.PageList; +import com.yixsoft.support.mybatis.autosql.annotations.AdvanceSelect; +import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper; +import com.yixsoft.support.mybatis.autosql.annotations.AutoSql; +import com.yixsoft.support.mybatis.autosql.annotations.SqlType; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; + +import java.util.Date; +import java.util.List; + +/** + * Created by dulingling on 2020-04-26. + */ +@AutoMapper(tablename = "sys_clients_card_flow", pkName = "client_id", keyGenerator = Jdbc3KeyGenerator.class) +public interface ClientCardFlowMapper { + @AutoSql(SqlType.SELECT) + JSONObject findClient(@Param("client_id") int clientId); + + @AutoSql(SqlType.INSERT) + void save(JSONObject partner); + + @AutoSql(SqlType.UPDATE) + int update(JSONObject partner); + +} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/PartnerQuery.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/PartnerQuery.java index 56e39c370..4f2503bbd 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/PartnerQuery.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/PartnerQuery.java @@ -51,6 +51,7 @@ public class PartnerQuery { private boolean bd_upload_material = false; private boolean is_valid = false; private String merchant_id; + private boolean card_approving = false; public String getClient_moniker() { return StringUtils.isEmpty(client_moniker) ? null : client_moniker; @@ -120,6 +121,9 @@ public class PartnerQuery { if (approving) { param.put("approving", true); } + if(card_approving){ + param.put("card_approving",true); + } if (org_id != null) { param.put("org_id", org_id); } @@ -472,4 +476,12 @@ public class PartnerQuery { public void setSuburb(String suburb) { this.suburb = suburb; } + + public boolean isCard_approving() { + return card_approving; + } + + public void setCard_approving(boolean card_approving) { + this.card_approving = card_approving; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index 18eca9b1c..d95488795 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -81,6 +81,9 @@ public interface ClientManager { @Transactional(noRollbackFor = EmailException.class) void auditClient(JSONObject manager, String clientMoniker, int pass); + @Transactional(noRollbackFor = EmailException.class) + void auditCardClient(JSONObject manager, String clientMoniker, int pass); + @Transactional(noRollbackFor = EmailException.class) void auditClientGreenChannel(JSONObject manager, String clientMoniker); @@ -299,6 +302,13 @@ public interface ClientManager { void commitToDoAgreeFile(String clientMoniker, JSONObject manager); + /** + * 提交资料,申请卡支付 + * @param clientMoniker + * @param manager + */ + void commitToDoCardAgreeFile(String clientMoniker, JSONObject manager); + void commitToGreenChannel(String clientMoniker, JSONObject manager); void changePaymentPage(JSONObject manager, String clientMoniker, String paypad_version); @@ -335,6 +345,8 @@ public interface ClientManager { void refusePartner(String clientMoniker, JSONObject manager, String refuse_remark); + void cardRefusePartner(String clientMoniker, JSONObject manager, String refuse_remark); + JSONArray getAllClientIds(int clientId); void updateAppClient(JSONObject account, int client_id, AppClientBean appClientBean); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index b77ff85ce..3295258dc 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -328,6 +328,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid private RPayMerchantMapper rPayMerchantMapper; @Resource private SysClientUpayProfileMapper sysClientUpayProfileMapper; + @Resource + private ClientCardFlowMapper clientCardFlowMapper; + + @Resource private SmsSender smsSender; private static final String SOURCE_AGREE_FILE = "source_agree_file"; @@ -434,7 +438,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } client.putAll(clientConfig); JSONObject upayInfo = sysClientUpayProfileMapper.findInfo(client.getIntValue("client_id")); - client.putAll(upayInfo); + if(null != upayInfo){ + client.putAll(upayInfo); + } client.put("unsubscribe", mailUnsubMapper.findOneByClientMoniker(clientMoniker) == null ? false : true); client.put("show_all_permission", true); int role = manager != null ? manager.getIntValue("role") : 0; @@ -488,12 +494,24 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("min_customer_surcharge_rate", client.getBigDecimal("rate_value").add(new BigDecimal("0.1"))); } - // 商户审核过程日志 - PageList audit_logs = clientAuditProcessMapper.getAuditLog(client.getIntValue("client_id"), + // 商户跨境支付审核过程日志 + PageList audit_logs = clientAuditProcessMapper.getAuditLog(client.getIntValue("client_id"),1, new PageBounds(Order.formString("create_time"))); if (audit_logs != null && !audit_logs.isEmpty()) { client.put("audit_logs", audit_logs); } + //商户卡支付审核过程日志 + PageList audit_card_logs = clientAuditProcessMapper.getAuditLog(client.getIntValue("client_id"),2, + new PageBounds(Order.formString("create_time"))); + if (audit_card_logs != null && !audit_card_logs.isEmpty()) { + client.put("audit_card_logs", audit_card_logs); + } + + //插入卡支付审核状态 + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); + if(null != cardFlowInfo){ + client.put("card_flow_info",cardFlowInfo); + } //HF支付链接二维码 if (client.getString("hf_pay_url") != null) { @@ -568,6 +586,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid partner.put("expiry_time", DateUtils.addDays(partner.getDate("approve_time"), authDays)); partner.put("pass_timeout", DateUtils.addDays(partner.getDate("approve_time"), authDays).compareTo(new Date()) < 0); } + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(partner.getInteger("client_id")); + if(null != cardFlowInfo){ + partner.put("card_approve_flow_info",cardFlowInfo); + } } return PageListUtils.buildPageListResult(partners); } @@ -1161,30 +1183,71 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientModifySupport.processClientModify(auditModify); sendCommissionWechatMessage(client);// wxMessage if (pass == 1) { - createKycAuthStatus(manager,client); + createKycAuthStatus(manager, client); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); if (client.getIntValue("source") == 4 || client.getIntValue("source") == 5) { List accounts = clientAccountMapper.listAdminAccounts(client.getIntValue("client_id")); JSONObject account = accounts.get(0); sendInitEmail(client, account.getString("username"), "*****"); // sendInitEmail(manager, client, account.getString("username"), "*****"); - saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager); + saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager,1); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "common_sub_merchant_id", false)); gatewayMerchantApply.notifyOrgMerchantStatus(client); } else if (checkGreenChannel && client.getIntValue("open_status") == 5) { // 绿色通道通过后不发邮件 logger.info("PASS 绿色通道:" + clientMoniker); - saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager); + saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager,1); } else { initAdminUserAndSendEmail(manager, clientMoniker, client); - saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager); + saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager,1); } } clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id")); } - private void createKycAuthStatus(JSONObject manager,JSONObject client){ + @Override + public void auditCardClient(JSONObject manager, String clientMoniker, int pass) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + //检查商户是否进入平台黑名单 + int clientId = client.getIntValue("client_id"); + isRiskyMerchant(client, clientBankAccountMapper.clientBankAccounts(clientId).get(0)); + + if (client.getString("sub_merchant_id") == null || client.getString("sub_merchant_id").equals("")) { + throw new BadRequestException("该商户未设置微信 Sub Merchant ID!"); + } + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); + client.putAll(clientConfigService.find(client.getIntValue("client_id"))); + Integer open_status_to = cardFlowInfo != null? cardFlowInfo.getIntValue("open_status") : null; + cardFlowInfo.put("open_status",5); + cardFlowInfo.put("approve_result",1); + clientCardFlowMapper.update(cardFlowInfo); + sendCardCommissionWechatMessage(client);// wxMessage + if (pass == 1) { + createKycAuthStatus(manager, client); + clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); + if (client.getIntValue("source") == 4 || client.getIntValue("source") == 5) { + List accounts = clientAccountMapper.listAdminAccounts(client.getIntValue("client_id")); + JSONObject account = accounts.get(0); + //TODO 发送卡支付开通邮件 1.判断商户是否已开通跨境支付,若没有开通,init账号 +// sendInitEmail(client, account.getString("username"), "*****"); + saveClientAuditProcess(client.getIntValue("client_id"), open_status_to, 5, "合规通过", manager,2); + + clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); +// gatewayMerchantApply.notifyOrgMerchantStatus(client); + } else { + //TODO 发送卡支付开通邮件 1.判断商户是否已开通跨境支付,若没有开通,init账号 +// initAdminUserAndSendEmail(manager, clientMoniker, client); + saveClientAuditProcess(client.getIntValue("client_id"), open_status_to, 5, "合规通过", manager,2); + } + } + clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id")); + } + + private void createKycAuthStatus(JSONObject manager, JSONObject client) { JSONObject compliance = clientComplianceCompanyMapper.findKycFileByClientId(client.getIntValue("client_id")); if (compliance != null) { compliance.put("client_id", client.getIntValue("client_id")); @@ -1227,7 +1290,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new BadRequestException("该商户未设置微信 Sub Merchant ID!"); } clientModifySupport.processClientModify(new GreenChannelModify(manager, clientMoniker, manager.getString("manager_id"))); - saveClientAuditProcess(client.getIntValue("client_id"), 10, 1, "绿色通道申请通过", manager); + saveClientAuditProcess(client.getIntValue("client_id"), 10, 1, "绿色通道申请通过", manager,1); sendCommissionWechatMessage(client); initAdminUserAndSendEmail(manager, clientMoniker, client); } @@ -2051,7 +2114,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientRateMapper.updateConfig(rateLog); } if (StringUtils.equalsIgnoreCase("rpaypmt_card", config.getString("type"))) { - JSONObject extRateParams = new JSONObject(){{ + JSONObject extRateParams = new JSONObject() {{ put("domestic_rate_value", config.getBigDecimal("rate_value")); put("overseas_rate_value", config.getJSONObject("ext_rates").getBigDecimal("international_rate_value")); }}; @@ -2088,7 +2151,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid int clientId = client.getIntValue("client_id"); JSONObject changeRate = merchantInfoProvider.clientCurrentRate(clientId, new Date(), "Wechat"); int cleanDays = changeRate.getIntValue("clean_days"); - if (cleanDays != client.getIntValue("clean_days") && StringUtils.equalsIgnoreCase("Wechat",config.getRateName())) { + if (cleanDays != client.getIntValue("clean_days") && StringUtils.equalsIgnoreCase("Wechat", config.getRateName())) { clientModifySupport.processClientConfigModify(new ClearDaysModify(manager, clientMoniker, cleanDays)); } // clientMapper.updateCleanDays(clientId, config.getCleanDays()); @@ -2127,7 +2190,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid checkOrgPermission(manager, client); List listChildClients = clientMapper.listChildClients(client.getIntValue("client_id")); JSONObject mchConfig = merchantInfoProvider.getMchExtParams(client.getIntValue("client_id")); - if(mchConfig.getBooleanValue("hide_sub_mch")){ + if (mchConfig.getBooleanValue("hide_sub_mch")) { return new ArrayList<>(); } if (mchConfig.getBooleanValue("level3_mch_config")) { @@ -2145,7 +2208,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public JSONObject listSubClientsByPage(JSONObject manager, String clientMoniker,String searchText, int page) { + public JSONObject listSubClientsByPage(JSONObject manager, String clientMoniker, String searchText, int page) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); @@ -2153,7 +2216,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid checkOrgPermission(manager, client); PageBounds pageBounds; - pageBounds= new PageBounds(page, 20, Order.formString("create_time.desc")); + pageBounds = new PageBounds(page, 20, Order.formString("create_time.desc")); JSONObject params = new JSONObject() {{ put("parent_client_id", client.getIntValue("client_id")); }}; @@ -2753,7 +2816,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client_ids != null) { params.put("client_ids", Arrays.asList(client_ids)); params.remove("client_id"); - }else { + } else { queryModifyClientIds(client.getIntValue("client_id"), params); } List deviceIds = clientDeviceMapper.listClientDeviceIds(params); @@ -3304,7 +3367,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } if (manager != null) { - saveClientAuditProcess(client.getIntValue("client_id"), 1, 2, "Compliance合同制作中", manager); + saveClientAuditProcess(client.getIntValue("client_id"), 1, 2, "Compliance合同制作中", manager,1); } } } @@ -3321,7 +3384,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } client.put("open_status", 3); clientModifySupport.processClientModify(new OpenStatusModify(manager, clientMoniker, 3)); - saveClientAuditProcess(client.getIntValue("client_id"), 2, 3, "合同制作完成,等待BD处理", manager); + saveClientAuditProcess(client.getIntValue("client_id"), 2, 3, "合同制作完成,等待BD处理", manager,1); // sendAgreeFileMsgToBD(client,null); sendCommissionWechatMessage(client); } @@ -3514,7 +3577,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new InvalidShortIdException(); } - clientModifySupport.processClientModify( new SwitchAllowSurchargeCreditModify(manager, clientMoniker, "enable_presettle", presettle)); + clientModifySupport.processClientModify(new SwitchAllowSurchargeCreditModify(manager, clientMoniker, "enable_presettle", presettle)); } @Override @@ -3567,7 +3630,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new InvalidShortIdException(); } params.put("display_name", manager.getString("display_name")); - clientApproveIdInfo(params,client); + clientApproveIdInfo(params, client); } @Override @@ -3659,7 +3722,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Override public JSONObject getAllAuthFiles(JSONObject manager, String clientMoniker) { JSONObject client = getClientInfoByMoniker(clientMoniker); - String[] fileKeys = {"client_bank_file", "client_company_file", "client_id_file", "client_agree_file", "client_apply_file","kyc_utility_bill_file"}; + String[] fileKeys = {"client_bank_file", "client_company_file", "client_id_file", "client_agree_file", "client_apply_file", "kyc_utility_bill_file"}; if (client == null) { throw new InvalidShortIdException(); } @@ -3714,7 +3777,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid List clientFiles = clientFilesMapper.findClientFile(client.getIntValue("client_id")); JSONObject fileJson = new JSONObject(); JSONObject companyFile = clientComplianceCompanyMapper.findKycFileByClientId(client.getIntValue("client_id")); - fileJson.put("companyFile",companyFile); + fileJson.put("companyFile", companyFile); if (clientFiles != null && clientFiles.size() > 0) { for (String fileKey : fileKeys) { List clientFileUrl = clientFiles.stream() @@ -3925,7 +3988,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Override @Transactional - public List uploadKycFilesForWaitComplianceForApp(JSONObject account, String clientMoniker, JSONObject filesInfo,String fileType) { + public List uploadKycFilesForWaitComplianceForApp(JSONObject account, String clientMoniker, JSONObject filesInfo, String fileType) { JSONObject client = getClientInfoByMoniker(clientMoniker); List fileResult = new ArrayList<>(); if (client == null) { @@ -3933,7 +3996,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } int clientId = client.getIntValue("client_id"); try { - updateFilesForWaitAuditWithoutRepeatForApp(account,clientId, fileType, filesInfo.getString("url"),fileResult); + updateFilesForWaitAuditWithoutRepeatForApp(account, clientId, fileType, filesInfo.getString("url"), fileResult); } catch (Exception e) { logger.error("上传KYC文件失败", e); throw new BadRequestException("上传KYC文件失败" + e.getMessage()); @@ -3942,7 +4005,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } - @Override @Transactional public void commitAuthFilesToCompliance(String clientMoniker, JSONObject account, String source) { @@ -4521,14 +4583,14 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } client.put("open_status", 4); clientModifySupport.processClientModify(openStatusModify); - saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 4, "BD完成签字提交compliance审核", manager); + saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 4, "BD完成签字提交compliance审核", manager,1); if (manager != null) { // sendMessagetoCompliance(client, manager.getString("display_name")); sendCommissionWechatMessage(client); } } - private void saveClientAuditProcess(int client_id, Integer open_status_form, Integer open_status_to, String remark, JSONObject manager) { + private void saveClientAuditProcess(int client_id, Integer open_status_form, Integer open_status_to, String remark, JSONObject manager,int type) { JSONObject log = new JSONObject(); try { log.put("client_id", client_id); @@ -4539,6 +4601,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid log.put("operator_id", StringUtils.isNotEmpty(manager.getString("manager_id")) ? manager.getString("manager_id") : manager.getString("account_id")); log.put("operator", manager.getString("display_name")); log.put("create_time", new Date()); + log.put("type",type); log.put("remark", remark); clientAuditProcessMapper.save(log); } catch (Exception e) { @@ -4554,6 +4617,54 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new InvalidShortIdException(); } client.putAll(clientConfigService.find(client.getIntValue("client_id"))); + + beforeCommitToDoAgreeValid(client, manager); + + OpenStatusModify openStatusModify = new OpenStatusModify(manager, clientMoniker, 1); + openStatusModify.setApprove_result(4); + openStatusModify.setApprove_time(new Date()); + clientModifySupport.processClientModify(openStatusModify); + saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Card Payment Compliance制作合同", manager,1); + if (manager != null) { + // sendAgreeFileMsgtoCompliance(client, manager.getString("display_name")); + sendCommissionWechatMessage(client); + } + } + + @Override + @Transactional + public void commitToDoCardAgreeFile(String clientMoniker, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + int clientId = client.getIntValue("client_id"); + client.putAll(clientConfigService.find(clientId)); + beforeCommitToDoAgreeValid(client, manager); + + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); + if(null != cardFlowInfo){ + JSONObject cardFlow = new JSONObject(){{ + put("client_id",clientId); + put("approve_result",4); + put("open_status",1); + put("approve_time",new Date()); + }}; + clientCardFlowMapper.update(cardFlow); + }else{ + JSONObject cardFlow = new JSONObject(){{ + put("client_id",clientId); + put("open_status",1); + put("approve_result",4); + put("approve_time",new Date()); + }}; + clientCardFlowMapper.save(cardFlow); + } + + saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Compliance制作合同", manager,2); + } + + private void beforeCommitToDoAgreeValid(JSONObject client, JSONObject manager) { if (manager != null && ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { int bdOperatClientRole = clientBDMapper.checkBDPermission(client.getIntValue("client_id"), manager.getString("manager_id")); if (bdOperatClientRole <= 0) { @@ -4570,15 +4681,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (account == null || account.size() <= 0) { throw new BadRequestException("The Partner's Bank Account is not config!"); } - OpenStatusModify openStatusModify = new OpenStatusModify(manager, clientMoniker, 1); - openStatusModify.setApprove_result(4); - openStatusModify.setApprove_time(new Date()); - clientModifySupport.processClientModify(openStatusModify); - saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Compliance制作合同", manager); - if (manager != null) { - // sendAgreeFileMsgtoCompliance(client, manager.getString("display_name")); - sendCommissionWechatMessage(client); - } } @Override @@ -4610,7 +4712,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid openStatusModify.setApprove_result(4); openStatusModify.setApprove_time(new Date()); clientModifySupport.processClientModify(openStatusModify); - saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 10, "提交绿色通道申请Compliance审核", manager); + saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 10, "提交绿色通道申请Compliance审核", manager,1); if (manager != null) { // sendGreenChannelMessagetoCompliance(client, manager.getString("display_name")); sendCommissionWechatMessage(client); @@ -4900,7 +5002,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (refuse_remark != null && !refuse_remark.isEmpty()) { auditModify.setRefuse_remark(refuse_remark); } - saveClientAuditProcess(client.getIntValue("client_id"), open_status, client.getInteger("open_status"), "打回," + refuse_remark, manager); + saveClientAuditProcess(client.getIntValue("client_id"), open_status, client.getInteger("open_status"), "打回," + refuse_remark, manager,1); clientModifySupport.processClientModify(auditModify); try { @@ -4925,6 +5027,55 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } + @Override + public void cardRefusePartner(String clientMoniker, JSONObject manager, String refuse_remark) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + Integer clientId = client.getInteger("client_id"); + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); + Integer open_status = null; + if(null != cardFlowInfo){ + open_status = cardFlowInfo.getIntValue("open_status"); + if (open_status == 1) { + cardFlowInfo.put("open_status",null); + } else { + cardFlowInfo.put("open_status",open_status - 1); + } + if ( cardFlowInfo.getIntValue("approve_result") == 4 || client.getIntValue("source") == 4) { + cardFlowInfo.put("approve_result",5); + } + if (refuse_remark != null && !refuse_remark.isEmpty()) { + cardFlowInfo.put("refuse_remark",refuse_remark); + } + }else{ + cardFlowInfo.put("open_status",null); + } + saveClientAuditProcess(client.getIntValue("client_id"), open_status, cardFlowInfo.getIntValue("open_status"), "打回," + refuse_remark, manager,2); + clientCardFlowMapper.update(cardFlowInfo); + + try { + if (client.getIntValue("source") == 4) { + String contact_phone = client.getString("contact_phone"); + if (contact_phone.startsWith("+61")) { + ArrayList param = new ArrayList<>(); + param.add(refuse_remark); + try { + smsSender.getSender().sendWithParam("61", contact_phone.replace("+61", ""), REFUSE_CLIENT_TEMPLID, param, "RoyalPay", "", ""); + } catch (Exception ignore) { + throw new ServerErrorException("Phone number is wrong :" + contact_phone); + } + } + } + if (client.getIntValue("source") == 5) { + gatewayMerchantApply.notifyOrgMerchantStatus(client); + } + } catch (Exception e) { + logger.error("RefusePartnerError=======:" + clientMoniker + "," + e.getMessage()); + } + } + @Override @Cacheable(value = ":all_clients:", key = "''+#clientId") public JSONArray getAllClientIds(int clientId) { @@ -5442,6 +5593,94 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } + private void sendCardCommissionWechatMessage(JSONObject client) { + String bd_user_name = client.getString("bd_user_name"); + String client_moniker = "[" + client.getString("client_moniker") + "]"; + String short_name = client.getString("short_name"); + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); + if(null == cardFlowInfo){ + return; + } + if (cardFlowInfo.getIntValue("open_status") == 1) { + List complianceList = managerMapper.getOnlyCompliance(); + if (complianceList != null && complianceList.size() > 0) { + for (JSONObject compliance : complianceList) { + String wxopenid = compliance.getString("wx_openid"); + try { + MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); + TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), "BD申请制作卡支付合同" + client_moniker, + bd_user_name, "制作卡支付合同申请", "BD申请制作" + short_name + "的卡支付合同"); + paymentApi.sendTemplateMessage(msg); + } catch (WechatException e) { + logger.error("Wechat Message Error,open_status=1" + e.getMessage()); + publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=1,openid=" + wxopenid)); + } + } + } + return; + } + if (cardFlowInfo.getIntValue("open_status") == 3) { + List bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); + for (JSONObject bd : bds) { + String wxopenid = bd.getString("wx_openid"); + if (wxopenid != null) { + try { + MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); + TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "卡支付合同制作完成", + "Compliance", "合规材料", "上传完整合规材料,商户:" + short_name); + paymentApi.sendTemplateMessage(msg); + } catch (WechatException e) { + logger.error("Wechat Message Error,open_status=3" + e.getMessage()); + publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=3,openid=" + wxopenid)); + + } + } + + } + return; + } + if (cardFlowInfo.getIntValue("open_status") == 4) { + if (client.getIntValue("source") == 4 && !StringUtils.isNotEmpty(bd_user_name)) { + bd_user_name = "自助开通商户"; + } + List complianceList = managerMapper.getOnlyCompliance(); + if (complianceList != null && complianceList.size() > 0) { + for (JSONObject compliance : complianceList) { + String wxopenid = compliance.getString("wx_openid"); + try { + MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); + TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "卡支付合规材料已提交", + bd_user_name, "审核材料", "已提交合规材料,等待审核"); + paymentApi.sendTemplateMessage(msg); + } catch (WechatException e) { + logger.error("Wechat Message Error,open_status=1" + e.getMessage()); + publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=1,openid=" + wxopenid)); + } catch (Exception e) { + logger.error("Wechat Message Error,open_status=1" + e.getMessage()); + } + } + } + return; + } + if (cardFlowInfo.getIntValue("open_status") == 5) { + List bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); + for (JSONObject bd : bds) { + String wxopenid = bd.getString("wx_openid"); + if (wxopenid != null) { + try { + TemplateMessage msg = initTaskFinishTemplate(wxopenid, client_moniker + "已正式开通", "Card Payment Compliance审核通过", ""); + MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); + paymentApi.sendTemplateMessage(msg); + } catch (WechatException e) { + logger.error("Wechat Message Error,open_status=5" + e.getMessage()); + publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=5,openid=" + wxopenid)); + } + } + } + return; + } + } + @Override @Cacheable(value = ":all_sub_merchant_id_applices:", key = "#clientMoniker") public List listSubMerchantIdApplys(JSONObject manager, String clientMoniker) { @@ -6048,7 +6287,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } client.put("open_status", 4); clientModifySupport.processClientModify(openStatusModify); - saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 4, "自助开通商户提交compliance审核", client_account); + saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 4, "自助开通商户提交compliance审核", client_account,1); if (params != null) { params.put("display_name", client_account.getString("display_name")); @@ -6648,7 +6887,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public JSONObject isLessFiles(JSONObject partner){ + public JSONObject isLessFiles(JSONObject partner) { JSONObject client = clientMapper.findClientByMoniker(partner.getString("client_moniker")); if (client == null) { throw new InvalidShortIdException(); @@ -6656,7 +6895,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if ((client.getIntValue("approve_result") == 2 || client.getIntValue("open_status") == 10 || client.getIntValue("approve_result") == 1 || client.getIntValue("open_status") == 5)) { boolean lessKycFiles = isPartnerKycfilesComplete(partner.getString("client_moniker")); partner.put("lessKycFiles", lessKycFiles); - partner.put("lessComplianceFiles",signInAccountService.checkAuthFileStatus(partner.getJSONObject("client")).getBoolean("client_less_file")); + partner.put("lessComplianceFiles", signInAccountService.checkAuthFileStatus(partner.getJSONObject("client")).getBoolean("client_less_file")); } partner.put("lessKycFiles", false); partner.put("lessComplianceFiles", false); @@ -6679,14 +6918,14 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new InvalidShortIdException(); } JSONObject KycFilesAuth = clientComplianceCompanyMapper.findKycFileComplete(client.getIntValue("client_id")); - if(KycFilesAuth != null){ + if (KycFilesAuth != null) { lessKycFiles = false; } return lessKycFiles; } @Override - public JSONObject partnerIncrementalServiceInfo(String clientMoniker,String channel){ + public JSONObject partnerIncrementalServiceInfo(String clientMoniker, String channel) { JSONObject client = clientMapper.findClientByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); @@ -6700,16 +6939,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public JSONObject getClientIncrementalServiceLoginToken(JSONObject account,String sourceCode){ + public JSONObject getClientIncrementalServiceLoginToken(JSONObject account, String sourceCode) { JSONObject client = clientMapper.findClient(account.getIntValue("client_id")); if (client == null) { throw new InvalidShortIdException(); } JSONObject clientConfig = clientConfigMapper.find(account.getIntValue("client_id")); - if(!clientConfig.getBooleanValue("geek_shop_status")){ + if (!clientConfig.getBooleanValue("geek_shop_status")) { throw new BadRequestException("Merchant service not opened"); } - return retailRSvcService.getGeekSsoTokenInfo(sourceCode,client.getString("client_moniker")); + return retailRSvcService.getGeekSsoTokenInfo(sourceCode, client.getString("client_moniker")); } @Override @@ -6913,18 +7152,18 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public void changeExtParams(String clientMoniker,JSONObject manager, JSONObject params){ + public void changeExtParams(String clientMoniker, JSONObject manager, JSONObject params) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); } JSONObject extParmas = JSONObject.parseObject(client.getString("ext_params")); - if("true".equals(params.getString("value"))||"false".equals(params.getString("value"))){ - extParmas.put(params.getString("key"),params.getBoolean("value")); - }else{ - extParmas.put(params.getString("key"),params.getString("value")); + if ("true".equals(params.getString("value")) || "false".equals(params.getString("value"))) { + extParmas.put(params.getString("key"), params.getBoolean("value")); + } else { + extParmas.put(params.getString("key"), params.getString("value")); } - client.put("ext_params",extParmas.toString()); + client.put("ext_params", extParmas.toString()); clientMapper.update(client); } @@ -6970,7 +7209,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version){ + public void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); @@ -6981,26 +7220,26 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } @Override - public void exportLetterOfferPDF(String clientMoniker,HttpServletResponse response) { + public void exportLetterOfferPDF(String clientMoniker, HttpServletResponse response) { JSONObject info = convertClientLetterOfferInfo(clientMoniker); String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/letter_of_offer.pdf"; - String fileName = clientMoniker+"_Letter_of_Offer.pdf"; - publishExcelCardPDFFile(fileName,pdfPath,info,response); + String fileName = clientMoniker + "_Letter_of_Offer.pdf"; + publishExcelCardPDFFile(fileName, pdfPath, info, response); } - private JSONObject convertClientLetterOfferInfo(String clientMoniker){ + private JSONObject convertClientLetterOfferInfo(String clientMoniker) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); } //合规状态 - if(client.getIntValue("approve_result")!=1 && client.getIntValue("approve_result")==3){ + if (client.getIntValue("approve_result") != 1 && client.getIntValue("approve_result") == 3) { throw new BadRequestException("The merchant failed the audit!"); } //获取数据源 int clientId = client.getInteger("client_id"); JSONObject clientRate = clientRateMapper.latestChannelCleanDays("rpaypmt_card", clientId); - if(clientRate == null){ + if (clientRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } JSONObject cardRate = clientRate.getJSONObject("ext_rates"); @@ -7008,84 +7247,84 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid //装在数据 JSONObject info = new JSONObject(); - info.put("down_date",convertDateEnglish(new Date()));//下载文件日期 - info.put("bussiness_name",client.getString("business_name")+" ABN");//商圈类型 - info.put("partner_address",client.getString("address"));//商家店铺地址 - info.put("partner_country",client.getString("country"));//国家 - info.put("partner_state",client.getString("state"));//洲 - info.put("partner_bussiness_name",client.getString("business_name"));//商户商用名称 - info.put("clean_days",client.getInteger("clean_days"));//T+规则清算天数 - info.put("partner_industry_mcc",client.getInteger("industry"));//商户行业编码 - info.put("legal_bussiness",client.getString("contact_person")+" AS "+client.getString("business_name") + " ABN "+client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 - info.put("annual_rate","0");//年费率 - info.put("cost_per_transaction",clientRate.getString("transaction_fee"));//每次交易成本 - info.put("domestic_fee",cardRate.getString("domestic_rate_value"));//国内服务费 - info.put("international_fee",cardRate.getString("overseas_rate_value"));//国际服务费 - info.put("account_reserve","1000");//账户储备金 + info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 + info.put("bussiness_name", client.getString("business_name") + " ABN");//商圈类型 + info.put("partner_address", client.getString("address"));//商家店铺地址 + info.put("partner_country", client.getString("country"));//国家 + info.put("partner_state", client.getString("state"));//洲 + info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 + info.put("clean_days", client.getInteger("clean_days"));//T+规则清算天数 + info.put("partner_industry_mcc", client.getInteger("industry"));//商户行业编码 + info.put("legal_bussiness", client.getString("contact_person") + " AS " + client.getString("business_name") + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 + info.put("annual_rate", "0");//年费率 + info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 + info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 + info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 + info.put("account_reserve", "1000");//账户储备金 //银行账号信息 - info.put("account_name",bankAccountInfo.getString("account_name"));// - info.put("bsb",bankAccountInfo.getString("bsb_no")); - info.put("account_no",bankAccountInfo.getString("account_no")); - info.put("card_acceptor_name","xxxxxxxxxxxxx"); + info.put("account_name", bankAccountInfo.getString("account_name"));// + info.put("bsb", bankAccountInfo.getString("bsb_no")); + info.put("account_no", bankAccountInfo.getString("account_no")); + info.put("card_acceptor_name", "xxxxxxxxxxxxx"); return info; } @Override public void exportPromotionalOfferPDF(String clientMoniker, String date, HttpServletResponse response) { - JSONObject info = convertPromotionalOfferInfo(clientMoniker,date); + JSONObject info = convertPromotionalOfferInfo(clientMoniker, date); String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/promotional_offer.pdf"; - String fileName = clientMoniker+"_Promotional_Offer.pdf"; - publishExcelCardPDFFile(fileName,pdfPath,info,response); + String fileName = clientMoniker + "_Promotional_Offer.pdf"; + publishExcelCardPDFFile(fileName, pdfPath, info, response); } - private JSONObject convertPromotionalOfferInfo(String clientMoniker,String date){ + private JSONObject convertPromotionalOfferInfo(String clientMoniker, String date) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); } //合规状态 - if(client.getIntValue("approve_result")!=1 && client.getIntValue("approve_result")==3){ + if (client.getIntValue("approve_result") != 1 && client.getIntValue("approve_result") == 3) { throw new BadRequestException("The merchant failed the audit!"); } int clientId = client.getInteger("client_id"); JSONObject clientRate = clientRateMapper.latestChannelCleanDays("rpaypmt_card", clientId); - if(clientRate == null){ + if (clientRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } JSONObject cardRate = clientRate.getJSONObject("ext_rates"); JSONObject bankAccountInfo = clientBankAccountMapper.clientBankAccounts(clientId).get(0); JSONObject info = new JSONObject(); - info.put("down_date",convertDateEnglish(new Date()));//下载文件日期 - info.put("bussiness_name",client.getString("business_name")+" ABN");//商圈类型 - info.put("partner_address",client.getString("address"));//商家店铺地址 - info.put("partner_country",client.getString("country"));//国家 - info.put("partner_state",client.getString("state"));//洲 - info.put("partner_bussiness_name",client.getString("business_name"));//商户商用名称 - info.put("letter_offer_sub_time",date); - info.put("legal_bussiness",client.getString("contact_person")+" AS "+client.getString("business_name") + " ABN "+client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 - info.put("domestic_fee",cardRate.getString("domestic_rate_value"));//国内服务费 - info.put("international_fee",cardRate.getString("overseas_rate_value"));//国际服务费 - info.put("promotional_effective_date","xxxxxxxxx"); - info.put("promotional_period","xxxxxxxxx"); + info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 + info.put("bussiness_name", client.getString("business_name") + " ABN");//商圈类型 + info.put("partner_address", client.getString("address"));//商家店铺地址 + info.put("partner_country", client.getString("country"));//国家 + info.put("partner_state", client.getString("state"));//洲 + info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 + info.put("letter_offer_sub_time", date); + info.put("legal_bussiness", client.getString("contact_person") + " AS " + client.getString("business_name") + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 + info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 + info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 + info.put("promotional_effective_date", "xxxxxxxxx"); + info.put("promotional_period", "xxxxxxxxx"); return info; } @Override - public void exportTermsConditionsPDF(String clientMoniker,HttpServletResponse response) { + public void exportTermsConditionsPDF(String clientMoniker, HttpServletResponse response) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); } - if(client.getIntValue("approve_result")!=1 && client.getIntValue("approve_result")==3){ + if (client.getIntValue("approve_result") != 1 && client.getIntValue("approve_result") == 3) { throw new BadRequestException("The merchant failed the audit!"); } String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/terms_and_conditions.pdf"; - String fileName = clientMoniker+"_Terms_And_Conditions.pdf"; - publishExcelCardPDFFile(fileName,pdfPath,new JSONObject(),response); + String fileName = clientMoniker + "_Terms_And_Conditions.pdf"; + publishExcelCardPDFFile(fileName, pdfPath, new JSONObject(), response); } - private void publishExcelCardPDFFile (String fileName,String pdfPath,JSONObject info,HttpServletResponse response){ + private void publishExcelCardPDFFile(String fileName, String pdfPath, JSONObject info, HttpServletResponse response) { response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".pdf"); try { @@ -7105,14 +7344,14 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } - private String convertDateEnglish(Date date){ - String[] months= {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Spt","Oct","Nov","Dec"}; + private String convertDateEnglish(Date date) { + String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Spt", "Oct", "Nov", "Dec"}; Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); - return day+" "+ months[month]+" "+ year; + return day + " " + months[month] + " " + year; } public void saveLegalAndMarketingInfo(JSONObject partner) { diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 6da1c017c..8fc8d8cce 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -280,6 +280,11 @@ public class PartnerManageController { clientManager.auditClient(manager, clientMoniker, pass.getIntValue("pass")); } + @ManagerMapping(value = "/{clientMoniker}/card_audit", method = RequestMethod.PUT, role = ManagerRole.OPERATOR) + public void auditCardPartner(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String clientMoniker, @RequestBody JSONObject pass) { + clientManager.auditCardClient(manager, clientMoniker, pass.getIntValue("pass")); + } + @ManagerMapping(value = "/{clientMoniker}/aduit/green_channel", method = RequestMethod.PUT, role = ManagerRole.OPERATOR) public void auditPartnerGreenChannel(@ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @PathVariable String clientMoniker) { clientManager.auditClientGreenChannel(manager, clientMoniker); @@ -300,6 +305,11 @@ public class PartnerManageController { clientManager.refusePartner(clientMoniker, manager, refuse.getString("refuse_remark")); } + @ManagerMapping(value = "/{clientMoniker}/card_audit/refuse", method = RequestMethod.PUT, role = ManagerRole.OPERATOR) + public void cardRefusePartner(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, @RequestBody JSONObject refuse) { + clientManager.cardRefusePartner(clientMoniker, manager, refuse.getString("refuse_remark")); + } + @ManagerMapping(value = "/{clientMoniker}/common_sub_merchant_id", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR}) public void switchCommonSubMerchantId(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.switchPermission(manager, clientMoniker, "common_sub_merchant_id", pass.getBooleanValue("allow")); @@ -629,6 +639,17 @@ public class PartnerManageController { clientManager.commitToDoAgreeFile(clientMoniker, manager); } + //TODO BD提交申请卡合规 + /** + * 提交资料,申请卡支付 + * @param clientMoniker + * @param manager + */ + @ManagerMapping(value = "/{clientMoniker}/make_card_agree_file", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER}) + public void commitToDoCardAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.commitToDoCardAgreeFile(clientMoniker, manager); + } + @ManagerMapping(value = "/{clientMoniker}/compliance/green_channel", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.BD_USER}) public void commitToGreenChannel(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.commitToGreenChannel(clientMoniker, manager); diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index 79ccd5e88..086d71004 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml @@ -133,6 +133,24 @@ c.open_status=1 or c.open_status=2 or c.open_status=4) + + OR (c.client_id NOT IN ( + SELECT client_id FROM sys_clients_card_flow + ) + OR c.client_id IN ( + SELECT client_id FROM sys_clients_card_flow AS cardFlow + WHERE cardFlow.approve_result = 4 or approve_result = 1 + )) + + + AND (c.client_id NOT IN ( + SELECT client_id FROM sys_clients_card_flow + ) + OR c.client_id IN ( + SELECT client_id FROM sys_clients_card_flow AS cardFlow + WHERE cardFlow.approve_result = 4 or approve_result = 1 + )) + and c.source=4 diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 6f74bc965..20874bac1 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -533,6 +533,72 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }); }; + $scope.passCardClient = function () { + if (!$rootScope.complianceCheck) { + alert("please check first"); + return; + } + if (!$rootScope.complianceCheck.authFile) { + alert("Compliance Files not checked"); + return; + } + if (!$rootScope.complianceCheck.clientInfo) { + alert("Partner Detail not checked"); + return; + } + if (!$rootScope.complianceCheck.bankAccount) { + alert("Bank Account not checked"); + return; + } + var title = 'Audit Partner Card'; + var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; + var choises = ''; + var contentHtml = ''; + if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName + || $scope.isComplianceOfBusinessStructure) { + var info = []; + if ($scope.isComplianceOfCompanyName) { + info.push('Company Name'); + } + if ($scope.isComplianceOfShortName) { + info.push('Short Name'); + } + if ($scope.isComplianceOfBusinessStructure) { + info.push('Business Structure'); + } + title = 'Warning'; + contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); + choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, + {label: '确认提交', className: 'btn-success', key: '1'}]; + content = ''; + } + commonDialog.confirm({ + title: title, + content: content, + choises: choises, + contentHtml: contentHtml + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit', {pass: 1}).then(function () { + if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed!', + type: 'success' + }); + } else { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed! Email will send to contact email address soon.', + type: 'success' + }); + } + delete $rootScope.complianceCheck; + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }); + }; $scope.pass2GreenChannel = function () { commonDialog.confirm({ title: 'Green Channel Audit Partner', @@ -648,6 +714,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }; + $scope.cardRefuse = function(){ + commonDialog.inputText({title: 'refuse cause'}).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit/refuse', {refuse_remark: text}).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Card Audit application has been refused.', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + } + $scope.deleteClient = function () { commonDialog.confirm({ title: 'Delete Partner', @@ -712,6 +793,20 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter ); }; + $scope.apply2makeCardAgreeFile = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_card_agree_file').then(function () { + commonDialog.alert({ + title: 'Success!', + content: '已提交制作合同!', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + } + ); + }; + $scope.commit2GreenChannel = function () { commonDialog.confirm({ title: 'Audit Partner', diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 5514efada..f36ca7470 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -58,11 +58,11 @@
  • Partner Detail
  • -
    +
    -

    Compliance Compliance (Refused :{{partner.refuse_remark}}) @@ -95,6 +95,8 @@
    -
    下载合同 - + Notify BD @@ -155,14 +157,12 @@

    - -
    -

    Operation +

    + + RP Operation (Refused :{{partner.refuse_remark}} )

    + + + +
    +
    +

    + Compliance (Refused + :{{partner.refuse_remark}}) + (The Partner Using Green Channel Now!) + 【目前状态】- + + (自助申请)资料完善中 + (自助申请)已开通 + (自助申请)快速开通等待提交合规材料 + (自助申请)待审核(材料已提交) + + + 资料完善中 + 待审核(合同制作中) + 合同制作完成 + BD处理中 + 待审核(合规文件已提交) + 通过 + 不通过 + + (已禁用) +

    + +
    +
    +
    + + + + 制作全支付合同 + + 上传合同 (通用合同请选择制作合同,非通用合同模板请人工制作合同后上传) +
    +
    + + +
    + 下载合同 + + + Notify BD + +
    +
    +
    + +
    + +
    +
    + + +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Card Payment Operation + (Refused + :{{partner.card_flow_info.refuse_remark}} + )(The Partner Using Green Channel Now!) + 【目前状态】- + 资料完善中 + 待审核(合同制作中) + 合同制作完成 + BD处理中 + 待审核(合规文件已提交) + 通过 + 不通过 + 绿色通道申请中 +

    +
    +
    + + 下载合同 +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + + +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Solved

    +
    +
    +
    Make sure you have send the email to client.
    +
    + +
    +
    +
    + +
    diff --git a/src/main/ui/static/payment/partner/templates/partners.html b/src/main/ui/static/payment/partner/templates/partners.html index 34b0bfea2..c6ca05969 100644 --- a/src/main/ui/static/payment/partner/templates/partners.html +++ b/src/main/ui/static/payment/partner/templates/partners.html @@ -370,6 +370,16 @@ + + + + @@ -476,19 +486,37 @@ - - 通过({{partner.approve_time}}) - 资料完善中 - (自助开通)资料完善中 - 自助开通试用中({{partner.approve_time}}~{{partner.expiry_time}}) - 不通过({{partner.approve_time}}) - 申请打回({{partner.refuse_remark|limitTo:15}}) - 等待合规 - 自助开通(等待合规) - 合同制作完成 - 等待BD上传材料审核 - 绿色通道申请中 - 等待合规 + +
    + + 通过({{partner.approve_time}}) + 资料完善中 + (自助开通)资料完善中 + 自助开通试用中({{partner.approve_time}}~{{partner.expiry_time}}) + 不通过({{partner.approve_time}}) + 申请打回({{partner.refuse_remark|limitTo:15}}) + 等待合规 + 自助开通(等待合规) + 合同制作完成 + 等待BD上传材料审核 + 绿色通道申请中 + 等待合规 +
    +
    + 等待BD上传材料审核 +
    +
    + + 通过({{partner.card_approve_flow_info.approve_time}}) + 资料完善中 + (自助开通)资料完善中 + 不通过({{partner.card_approve_flow_info.approve_time}}) + 申请打回({{partner.card_approve_flow_info.refuse_remark|limitTo:15}}) + 等待合规 + 合同制作完成 + 等待BD上传材料审核 + 等待合规 +
    From 982f24c64a09714f38cf6a91e6e7e71a55188cc2 Mon Sep 17 00:00:00 2001 From: luoyang Date: Mon, 27 Apr 2020 18:06:55 +0800 Subject: [PATCH 024/110] =?UTF-8?q?add=20mw=E5=90=88=E8=A7=84=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=81=E8=B4=A2=E5=8A=A1=E6=8A=A5=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mappers/system/ClientMWFilesMapper.java | 3 +- .../beans/ClientMWAuthFilesInfo.java | 99 ++++-- .../core/impls/ClientManagerImpl.java | 26 +- .../merchants/enums/UPayAuthFileEnum.java | 26 +- .../manage/tradelog/core/TradeLogService.java | 2 + .../core/impls/TradeLogServiceImpl.java | 116 ++++++- .../tradelog/web/TradeFlowController.java | 6 + .../mappers/payment/TransactionMapper.xml | 4 +- .../jasper/partner_upay_invoice_gst.jasper | Bin 0 -> 83133 bytes src/main/ui/static/analysis/clearing-log.js | 4 + .../templates/settlement_transactions.html | 10 + .../commons/services/clearingDetailService.js | 4 + src/main/ui/static/config/bdprize/bdprize.js | 4 + .../static/payment/partner/partner-manage.js | 324 +++++++++++++----- .../partner/templates/add_partner.html | 2 +- .../partner/templates/partner_auth_files.html | 29 +- .../templates/partner_cp_auth_files.html | 2 +- .../partner/templates/partner_detail.html | 52 ++- .../partner/templates/partner_edit.html | 2 +- .../templates/partner_mw_auth_files.html | 221 +++++++----- .../partner/templates/partner_settlement.html | 7 +- .../tradelog/templates/balance_report.html | 3 +- .../templates/partner_settlement_dialog.html | 11 + .../templates/partner_settlement_logs.html | 5 + .../ui/static/payment/tradelog/transflow.js | 3 + 25 files changed, 728 insertions(+), 237 deletions(-) create mode 100644 src/main/resources/jasper/partner_upay_invoice_gst.jasper diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java index 88efbe614..e5064a1cf 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java @@ -1,6 +1,7 @@ package au.com.royalpay.payment.manage.mappers.system; import com.alibaba.fastjson.JSONObject; +import com.github.miemiedev.mybatis.paginator.domain.PageBounds; import com.yixsoft.support.mybatis.autosql.annotations.AdvanceSelect; import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper; import com.yixsoft.support.mybatis.autosql.annotations.AutoSql; @@ -22,5 +23,5 @@ public interface ClientMWFilesMapper { @AutoSql(SqlType.SELECT) @AdvanceSelect(addonWhereClause = "is_valid = 1") - List findClientFile(@Param("client_id") int clientId); + List findClientFile(@Param("client_id") int clientId, PageBounds pageBounds); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java index 51d263c92..45235245c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java @@ -7,11 +7,16 @@ import org.apache.commons.lang3.StringUtils; * Created by yishuqian on 07/03/2017. */ public class ClientMWAuthFilesInfo { - private String upay_application_form; - private String upay_agreement_file; + private String client_bank_file; + private String client_company_file; + private String refund_exchange_policy; + private String upay_privacy_policy; + private String card_security_policy; + private String upay_promotional_offer; + private String upay_terms_conditions; private String upay_offer_letter; private String upay_driver_license; - private String upay_residence_certificate; + private String kyc_utility_bill_file; private String upay_risk_level; private String upay_risk_remark; @@ -30,14 +35,6 @@ public class ClientMWAuthFilesInfo { return params; } - public String getUpay_agreement_file() { - return upay_agreement_file; - } - - public String getUpay_application_form() { - return upay_application_form; - } - public String getUpay_driver_license() { return upay_driver_license; } @@ -46,18 +43,6 @@ public class ClientMWAuthFilesInfo { return upay_offer_letter; } - public void setUpay_agreement_file(String upay_agreement_file) { - this.upay_agreement_file = upay_agreement_file; - } - - public void setUpay_application_form(String upay_application_form) { - this.upay_application_form = upay_application_form; - } - - public String getUpay_residence_certificate() { - return upay_residence_certificate; - } - public String getUpay_risk_level() { return upay_risk_level; } @@ -70,10 +55,6 @@ public class ClientMWAuthFilesInfo { this.upay_offer_letter = upay_offer_letter; } - public void setUpay_residence_certificate(String upay_residence_certificate) { - this.upay_residence_certificate = upay_residence_certificate; - } - public String getUpay_risk_remark() { return upay_risk_remark; } @@ -85,4 +66,68 @@ public class ClientMWAuthFilesInfo { public void setUpay_risk_remark(String upay_risk_remark) { this.upay_risk_remark = upay_risk_remark; } + + public String getCard_security_policy() { + return card_security_policy; + } + + public String getClient_bank_file() { + return client_bank_file; + } + + public String getClient_company_file() { + return client_company_file; + } + + public String getUpay_privacy_policy() { + return upay_privacy_policy; + } + + public String getUpay_promotional_offer() { + return upay_promotional_offer; + } + + public void setCard_security_policy(String card_security_policy) { + this.card_security_policy = card_security_policy; + } + + public String getUpay_terms_conditions() { + return upay_terms_conditions; + } + + public void setClient_bank_file(String client_bank_file) { + this.client_bank_file = client_bank_file; + } + + public void setClient_company_file(String client_company_file) { + this.client_company_file = client_company_file; + } + + public void setUpay_privacy_policy(String upay_privacy_policy) { + this.upay_privacy_policy = upay_privacy_policy; + } + + public void setUpay_promotional_offer(String upay_promotional_offer) { + this.upay_promotional_offer = upay_promotional_offer; + } + + public void setUpay_terms_conditions(String upay_terms_conditions) { + this.upay_terms_conditions = upay_terms_conditions; + } + + public String getRefund_exchange_policy() { + return refund_exchange_policy; + } + + public void setRefund_exchange_policy(String refund_exchange_policy) { + this.refund_exchange_policy = refund_exchange_policy; + } + + public String getKyc_utility_bill_file() { + return kyc_utility_bill_file; + } + + public void setKyc_utility_bill_file(String kyc_utility_bill_file) { + this.kyc_utility_bill_file = kyc_utility_bill_file; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 3295258dc..56088735f 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -438,7 +438,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } client.putAll(clientConfig); JSONObject upayInfo = sysClientUpayProfileMapper.findInfo(client.getIntValue("client_id")); - if(null != upayInfo){ + if (upayInfo != null) { client.putAll(upayInfo); } client.put("unsubscribe", mailUnsubMapper.findOneByClientMoniker(clientMoniker) == null ? false : true); @@ -3435,7 +3435,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new InvalidShortIdException(); } - List files = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id")); + List files = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id"), new PageBounds(1, 999999, Order.formString("last_update_date.asc"))); if (files != null && files.size() > 0) { List filePaths = new ArrayList<>(); for (JSONObject file : files) { @@ -3641,7 +3641,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } int clientId = client.getIntValue("client_id"); params.put("client_id", client.getIntValue("client_id")); - clientConfigMapper.update(params); + JSONObject upayInfo = sysClientUpayProfileMapper.findInfo(clientId); + if (upayInfo == null) { + sysClientUpayProfileMapper.save(params); + }else { + sysClientUpayProfileMapper.update(params); + } } @Override @@ -3759,7 +3764,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new InvalidShortIdException(); } - List clientFiles = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id")); + List clientFiles = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id"), new PageBounds(1,999999, Order.formString("last_update_date.asc"))); JSONObject fileJson = new JSONObject(); for (JSONObject file : clientFiles) { fileJson.put(file.getString("file_name"), file.getString("file_value")); @@ -3917,11 +3922,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } int clientId = client.getIntValue("client_id"); try { - updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_APPLICATION_FORM.getFileName(), filesInfo.getUpay_application_form()); - updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_AGREEMENT_FILE.getFileName(), filesInfo.getUpay_agreement_file()); - updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_OFFER_LETTER.getFileName(), filesInfo.getUpay_offer_letter()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.CLIENT_BANK_FILE.getFileName(), filesInfo.getClient_bank_file()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.CLIENT_COMPANY_FILE.getFileName(), filesInfo.getClient_company_file()); updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_DRIVER_LICENSE.getFileName(), filesInfo.getUpay_driver_license()); - updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_RESIDENCE_CERTIFICATE.getFileName(), filesInfo.getUpay_residence_certificate()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.REFUND_EXCHANGE_POLICY.getFileName(), filesInfo.getRefund_exchange_policy()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_PRIVACY_POLICY.getFileName(), filesInfo.getUpay_privacy_policy()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.CARD_SECURITY_POLICY.getFileName(), filesInfo.getCard_security_policy()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_OFFER_LETTER.getFileName(), filesInfo.getUpay_offer_letter()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_PROMOTIONAL_OFFER.getFileName(), filesInfo.getUpay_promotional_offer()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_TERMS_CONDITIONS.getFileName(), filesInfo.getUpay_terms_conditions()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.KYC_UTILITY_BILL_FILE.getFileName(), filesInfo.getKyc_utility_bill_file()); } catch (Exception e) { logger.error("上传合规文件失败", e); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java index 4118df321..992e1280c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java @@ -2,11 +2,16 @@ package au.com.royalpay.payment.manage.merchants.enums; public enum UPayAuthFileEnum { ALL(""), - UPAY_APPLICATION_FORM("upay_application_form"), - UPAY_AGREEMENT_FILE("upay_agreement_file"), - UPAY_OFFER_LETTER("upay_offer_letter"), + CLIENT_BANK_FILE("client_bank_file"), + CLIENT_COMPANY_FILE("client_company_file"), UPAY_DRIVER_LICENSE("upay_driver_license"), - UPAY_RESIDENCE_CERTIFICATE("upay_residence_certificate"); + REFUND_EXCHANGE_POLICY("refund_exchange_policy"), + UPAY_PRIVACY_POLICY("upay_privacy_policy"), + CARD_SECURITY_POLICY("card_security_policy"), + UPAY_OFFER_LETTER("upay_offer_letter"), + UPAY_PROMOTIONAL_OFFER("upay_promotional_offer"), + UPAY_TERMS_CONDITIONS("upay_terms_conditions"), + KYC_UTILITY_BILL_FILE("kyc_utility_bill_file"); private final String fileName; @@ -19,10 +24,15 @@ public enum UPayAuthFileEnum { } public String[] getFileNameArrays() { - return new String[]{UPAY_APPLICATION_FORM.getFileName(), - UPAY_AGREEMENT_FILE.getFileName(), + return new String[]{CLIENT_BANK_FILE.getFileName(), + CLIENT_COMPANY_FILE.getFileName(), + UPAY_OFFER_LETTER.getFileName(), + REFUND_EXCHANGE_POLICY.getFileName(), + UPAY_PRIVACY_POLICY.getFileName(), + CARD_SECURITY_POLICY.getFileName(), UPAY_OFFER_LETTER.getFileName(), - UPAY_DRIVER_LICENSE.getFileName(), - UPAY_RESIDENCE_CERTIFICATE.getFileName()}; + UPAY_PROMOTIONAL_OFFER.getFileName(), + UPAY_TERMS_CONDITIONS.getFileName(), + KYC_UTILITY_BILL_FILE.getFileName()}; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java index b7627151d..a9e3a978a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/TradeLogService.java @@ -36,6 +36,8 @@ public interface TradeLogService { void exportTransFlow(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception; + void exportUpayTransFlow(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception; + void exportTransFlowApi(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception; void exportExcel(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception; diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index 8d06b70dc..b6046766c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -136,6 +136,8 @@ public class TradeLogServiceImpl implements TradeLogService { private org.springframework.core.io.Resource trans_flow; @Value("classpath:/jasper/incremental_partner_invoice_gst.jasper") private org.springframework.core.io.Resource incremental_trans_flow; + @Value("classpath:/jasper/partner_upay_invoice_gst.jasper") + private org.springframework.core.io.Resource upay_trans_flow; @Value("classpath:/jasper/royalpay_logo.png") private org.springframework.core.io.Resource logo; @Value("classpath:/jasper/trans_excel.jasper") @@ -573,6 +575,30 @@ public class TradeLogServiceImpl implements TradeLogService { return result; } + private JSONObject listPartnerTransFlowByExportPdf(TradeLogQuery query, JSONObject partner, String[] channels) throws Exception { + int clientId = partner.getIntValue("client_id"); + String timezone = partner.getJSONObject("client").getString("timezone"); + JSONObject params = query.toParams(timezone); + params.put("channel", channels); + clientManager.validateClients(clientId, params); + params.put("client_id", clientId); + clientManager.queryModifyClientIds(clientId, params); + List logs = transactionMapper.listTransFlow(params); + TimeZoneUtils.switchTimeZoneToString(logs, timezone, "dd/MM/yyyy HH:mm:ss", Collections.singletonList("transaction_time")); + TimeZoneUtils.switchTimeZoneToString(logs, timezone, "dd/MM/yyyy", Collections.singletonList("clearing_time")); + + final JSONObject analysis = analysisTransLogs(logs); + + JSONObject result = new JSONObject(); + result.put("data", logs); + analysis.put("balance", transactionMapper.analysisBalance(params)); + if (analysis.containsKey("paid_fee") && analysis.containsKey("refund_fee")) { + analysis.put("actual_fee", analysis.getBigDecimal("paid_fee").add(analysis.getBigDecimal("refund_fee"))); + } + result.put("analysis", analysis); + return result; + } + private JSONObject analysisTransLogs(List logs) { final JSONObject analysis = new JSONObject(); analysis.put("order_count", logs.size()); @@ -633,10 +659,18 @@ public class TradeLogServiceImpl implements TradeLogService { .filter(log -> log.getBigDecimal("settle_amount") != null) .map(log -> getSymbol(log).multiply(log.getBigDecimal("incremental_surcharge"))) .reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + analysis.put("total_transaction_fee", logs.parallelStream() + .filter(log -> log.getBigDecimal("settle_amount") != null) + .map(log -> getSymbol(log).multiply(log.getBigDecimal("transaction_fee"))) + .reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); analysis.put("total_incremental_tax", logs.parallelStream() .filter(log -> log.getBigDecimal("settle_amount") != null) .map(log -> getSymbol(log).multiply(log.getBigDecimal("incremental_surcharge").divide(new BigDecimal(10), 2, RoundingMode.HALF_UP))) .reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); + analysis.put("total_transaction_fee_tax", logs.parallelStream() + .filter(log -> log.getBigDecimal("settle_amount") != null) + .map(log -> getSymbol(log).multiply(log.getBigDecimal("transaction_fee").divide(new BigDecimal(10), 2, RoundingMode.HALF_UP))) + .reduce(BigDecimal::add).orElse(BigDecimal.ZERO)); analysis.put("total_surcharge", logs.parallelStream() .filter(log -> log.getBigDecimal("settle_amount") != null) .map(log -> getSymbol(log).multiply(log.getBigDecimal("total_surcharge").add(log.getBigDecimal("tax_amount")))) @@ -679,7 +713,7 @@ public class TradeLogServiceImpl implements TradeLogService { @Override public void exportTransFlow(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception { - JSONObject transFlow = listPartnerTransFlow(query, partner); + JSONObject transFlow = listPartnerTransFlowByExportPdf(query, partner,new String[]{"Wechat","Alipay","AlipayOnline"}); JSONObject analysis = transFlow.getJSONObject("analysis"); JSONObject client = clientManager.getClientInfo(partner.getIntValue("client_id")); if (!transFlow.getJSONArray("data").isEmpty()) { @@ -736,7 +770,7 @@ public class TradeLogServiceImpl implements TradeLogService { }); JRDataSource jrDataSource = new JRBeanCollectionDataSource(dataList); response.setContentType("application/pdf"); - String fileName = client.getString("client_moniker") + "_" + parmerters.getString("dateRange").replaceAll("/", ""); + String fileName = client.getString("client_moniker") + "_Cross_Border_" + parmerters.getString("dateRange").replaceAll("/", ""); response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".pdf"); OutputStream outs = response.getOutputStream(); JSONObject clientIncrement = clientIncrementalMapper.findByClinetIdAndChannel(client.getIntValue("client_id"), "RP跨境商城"); @@ -752,6 +786,84 @@ public class TradeLogServiceImpl implements TradeLogService { } } + @Override + public void exportUpayTransFlow(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception { + JSONObject transFlow = listPartnerTransFlowByExportPdf(query, partner,new String[]{"rpaypmt_card","rpaypmt_dd"}); + JSONObject analysis = transFlow.getJSONObject("analysis"); + JSONObject client = clientManager.getClientInfo(partner.getIntValue("client_id")); + if (!transFlow.getJSONArray("data").isEmpty()) { + try { + List dataList = transFlow.getJSONArray("data").toJavaList(JSONObject.class); + JSONObject parmerters = new JSONObject(); + parmerters.put("dateFrom", StringUtils.isNotBlank(query.getDatefrom()) + ? DateFormatUtils.format(DateUtils.parseDate(query.getDatefrom(), "yyyyMMdd"), "dd/MM/yyyy") : ""); + parmerters.put("dateTo", + StringUtils.isNotBlank(query.getDateto()) + ? DateFormatUtils.format(DateUtils.parseDate(query.getDateto(), "yyyyMMdd"), "dd/MM/yyyy") + : DateFormatUtils.format(new Date(), "dd/MM/yyyy")); + parmerters.put("dateRange", (StringUtils.isNotBlank(parmerters.getString("dateFrom")) ? parmerters.getString("dateFrom") : "") + "~" + + parmerters.getString("dateTo")); + parmerters.put("partnerCode", client.getString("client_moniker")); + parmerters.put("clientName", client.getString("company_name")); + parmerters.put("clientAddress", client.getString("address")); + parmerters.put("balance", analysis.getDoubleValue("balance")); + parmerters.put("logo", logo.getInputStream()); + parmerters.put("actual_fee", takeDecimalOrDefault(analysis, "actual_fee", BigDecimal.ZERO)); + parmerters.put("totalSettledAmount", takeDecimalOrDefault(analysis, "total_settle_amount", BigDecimal.ZERO)); + parmerters.put("royalpay_charge", takeDecimalOrDefault(analysis, "total_royal_surcharge", BigDecimal.ZERO)); + parmerters.put("total_fee", takeDecimalOrDefault(analysis, "total_surcharge", BigDecimal.ZERO)); + parmerters.put("alipay_fee", takeDecimalOrDefault(analysis, "alipay_fee", BigDecimal.ZERO)); + parmerters.put("wechat_fee", takeDecimalOrDefault(analysis, "wechat_fee", BigDecimal.ZERO)); + parmerters.put("bestpay_fee", takeDecimalOrDefault(analysis, "bestpay_fee", BigDecimal.ZERO)); + parmerters.put("jd_fee", takeDecimalOrDefault(analysis, "jd_fee", BigDecimal.ZERO)); + parmerters.put("alipay_online_fee", takeDecimalOrDefault(analysis, "alipay_online_fee", BigDecimal.ZERO)); + parmerters.put("gst", takeDecimalOrDefault(analysis, "tax_amount", BigDecimal.ZERO)); + parmerters.put("royalpay_fee", takeDecimalOrDefault(analysis, "total_royalpay_fee", BigDecimal.ZERO)); + parmerters.put("incremental_fee", takeDecimalOrDefault(analysis, "total_incremental_surcharge", BigDecimal.ZERO)); + parmerters.put("incremental_gst", takeDecimalOrDefault(analysis, "total_incremental_tax", BigDecimal.ZERO)); + parmerters.put("royalpay_gst", analysis.getBigDecimal("tax_amount").subtract(analysis.getBigDecimal("total_incremental_tax")).setScale(2,RoundingMode.HALF_UP)); + parmerters.put("total_transaction_fee", analysis.getBigDecimal("total_transaction_fee").add(analysis.getBigDecimal("total_transaction_fee_tax")).setScale(2,RoundingMode.HALF_UP)); + parmerters.put("total_royalpay_fee", analysis.getBigDecimal("total_surcharge").subtract(parmerters.getBigDecimal("total_transaction_fee")).setScale(2,RoundingMode.HALF_UP)); + + dataList.parallelStream().forEach(item -> { + BigDecimal incrementalSurcharge = item.containsKey("incremental_surcharge") ? item.getBigDecimal("incremental_surcharge") : BigDecimal.ZERO; + BigDecimal taxAmount = item.containsKey("tax_amount") ? item.getBigDecimal("tax_amount") : BigDecimal.ZERO; + BigDecimal royalpaySurhcarge = item.containsKey("royal_surcharge") ? item.getBigDecimal("royal_surcharge") : BigDecimal.ZERO; + BigDecimal surhcargeBack = item.containsKey("surcharge_cashback") ? item.getBigDecimal("surcharge_cashback") : BigDecimal.ZERO; + BigDecimal channelSurcharge = item.containsKey("channel_surcharge") ? item.getBigDecimal("channel_surcharge") : BigDecimal.ZERO; + BigDecimal incrementalTax = incrementalSurcharge.divide(new BigDecimal(10), 2, RoundingMode.HALF_UP); + BigDecimal transactionFee = item.getBigDecimal("transaction_fee"); + BigDecimal transactionFeeTax = item.getBigDecimal("transaction_fee").divide(new BigDecimal(10), 2, RoundingMode.HALF_UP); + BigDecimal royalpayTax = taxAmount.subtract(incrementalTax).subtract(transactionFeeTax); + BigDecimal realRoyalpayCharge = item.getBigDecimal("total_surcharge").add(taxAmount).subtract(transactionFee).subtract(transactionFeeTax); + item.put("incremental_surcharge", incrementalSurcharge.add(incrementalTax).setScale(2, RoundingMode.HALF_UP)); + item.put("total_surcharge_intax", realRoyalpayCharge.setScale(2, RoundingMode.HALF_UP)); + item.put("transaction_fee_intax", transactionFee.add(transactionFeeTax).setScale(2,RoundingMode.HALF_UP)); + scaleDecimalVal(item, "display_amount", item.getString("currency")); + String platformCurrency = PlatformEnvironment.getEnv().getForeignCurrency(); + scaleDecimalVal(item, "clearing_amount", platformCurrency); + scaleDecimalVal(item, "settle_amount", platformCurrency); + scaleDecimalVal(item, "total_surcharge", platformCurrency); + }); + JRDataSource jrDataSource = new JRBeanCollectionDataSource(dataList); + response.setContentType("application/pdf"); + String fileName = client.getString("client_moniker") + "_Card_Payment_" + parmerters.getString("dateRange").replaceAll("/", ""); + response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".pdf"); + OutputStream outs = response.getOutputStream(); +// JSONObject clientIncrement = clientIncrementalMapper.findByClinetIdAndChannel(client.getIntValue("client_id"), "RP跨境商城"); +// InputStream jasper = clientIncrement == null ? trans_flow.getInputStream() : incremental_trans_flow.getInputStream(); + InputStream jasper = upay_trans_flow.getInputStream(); + byte[] bytes = JasperRunManager.runReportToPdf(jasper, parmerters, jrDataSource); + outs.write(bytes, 0, bytes.length); + outs.flush(); + outs.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + } + @Override public void exportTransFlowApi(TradeLogQuery query, JSONObject partner, HttpServletResponse response) throws Exception { query.setClearing_status(-1); diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java index 42c2660fa..ea744807d 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/web/TradeFlowController.java @@ -39,6 +39,12 @@ public class TradeFlowController { tradeLogService.exportTransFlow(query, partner, httpResponse); } + @PartnerMapping(value = "/report/upay_pdf", method = RequestMethod.GET) + @ReadOnlyConnection + public void exportUpayPDF(TradeLogQuery query, @ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner, HttpServletResponse httpResponse) throws Exception { + tradeLogService.exportUpayTransFlow(query, partner, httpResponse); + } + @PartnerMapping(value = "/report/excel", method = RequestMethod.GET) @ReadOnlyConnection public void exportExcel(TradeLogQuery query, @ModelAttribute(CommonConsts.PARTNER_STATUS) JSONObject partner, HttpServletResponse httpResponse) throws Exception { diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index a71c233a1..a4ee7285c 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -576,9 +576,11 @@ (SELECT min(r.rate_value) FROM sys_client_rates r WHERE r.client_id = t.client_id AND date(r.expiry_time) >= DATE(t.clearing_time) AND date(r.active_time) <= DATE(t.clearing_time)) rate, - t.clearing_order clear_detail_id + t.clearing_order clear_detail_id, + lc.balance_group FROM pmt_transactions t left join log_clearing_detail cd on cd.clear_detail_id=t.clearing_order + left join log_clearing lc on cd.clearing_id = lc.clearing_id left join sys_clients sc on t.client_id = sc.client_id WHERE t.channel='Settlement' diff --git a/src/main/resources/jasper/partner_upay_invoice_gst.jasper b/src/main/resources/jasper/partner_upay_invoice_gst.jasper new file mode 100644 index 0000000000000000000000000000000000000000..e017ea27964d50fd889e437919069bd62738e221 GIT binary patch literal 83133 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 literal 0 HcmV?d00001 diff --git a/src/main/ui/static/analysis/clearing-log.js b/src/main/ui/static/analysis/clearing-log.js index ab825af23..60993ba21 100644 --- a/src/main/ui/static/analysis/clearing-log.js +++ b/src/main/ui/static/analysis/clearing-log.js @@ -556,6 +556,10 @@ define(['angular', 'decimal', 'uiBootstrap', 'uiRouter', 'angularEcharts'], func return '/static/images/yeepay_sign_lg.png'; case 'LakalaPay': return '/static/images/lakalapay_sign_lg.png'; + case 'rpaypmt_card': + return '/static/images/card_payment_sign_lg.png'; + case 'rpaypmt_dd': + return '/static/images/direct_debit_sign_lg.png'; } } }); diff --git a/src/main/ui/static/analysis/templates/settlement_transactions.html b/src/main/ui/static/analysis/templates/settlement_transactions.html index 4b118af1c..4126077bc 100644 --- a/src/main/ui/static/analysis/templates/settlement_transactions.html +++ b/src/main/ui/static/analysis/templates/settlement_transactions.html @@ -53,6 +53,16 @@ +
  • + + + +
  • +
  • + + + +
  • diff --git a/src/main/ui/static/commons/services/clearingDetailService.js b/src/main/ui/static/commons/services/clearingDetailService.js index 7d347e1cf..7e0bd7faa 100644 --- a/src/main/ui/static/commons/services/clearingDetailService.js +++ b/src/main/ui/static/commons/services/clearingDetailService.js @@ -87,6 +87,10 @@ define(['../app','decimal'], function (app,Decimal) { return '/static/images/hf_sign_lg.png'; case 'Rpay': return '/static/images/rpayplus_sign_lg.png'; + case 'rpaypmt_card': + return '/static/images/card_payment_sign_lg.png'; + case 'rpaypmt_dd': + return '/static/images/direct_debit_sign_lg.png'; } } }); diff --git a/src/main/ui/static/config/bdprize/bdprize.js b/src/main/ui/static/config/bdprize/bdprize.js index 46acd352f..eaac60668 100644 --- a/src/main/ui/static/config/bdprize/bdprize.js +++ b/src/main/ui/static/config/bdprize/bdprize.js @@ -415,6 +415,10 @@ define(['angular', '../../analysis/bd/analysis-bd'], function (angular) { return '/static/images/yeepay_sign_lg.png'; case 'LakalaPay': return '/static/images/lakalapay_sign_lg.png'; + case 'rpaypmt_card': + return '/static/images/card_payment_sign_lg.png'; + case 'rpaypmt_dd': + return '/static/images/direct_debit_sign_lg.png'; } } }); diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 20874bac1..db73e6dfc 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -3658,9 +3658,53 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter app.controller('partnerMWAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { $scope.id_info_form = {edit: false}; $scope.file = file.data || {}; + $scope.uploadFile = {}; $scope.file.upay_risk_level = $scope.partner.upay_risk_level; $scope.file.upay_risk_remark = $scope.partner.upay_risk_remark; - $scope.uploadApplyFile = function (file) { + + $scope.bankIsImage = true; + $scope.asicIsImage = true; + $scope.idIsImage = true; + $scope.utilityIsImage = true; + $scope.refundIsImage = true; + $scope.privacyIsImage = true; + $scope.cardIsImage = true; + $scope.letterIsImage = true; + $scope.promotionalIsImage = true; + $scope.termsIsImage = true; + if ($scope.file.client_bank_file && $scope.file.client_bank_file.endsWith('pdf')) { + $scope.bankIsImage = false; + } + if ($scope.file.client_company_file && $scope.file.client_company_file.endsWith('pdf')) { + $scope.asicIsImage = false; + } + if ($scope.file.upay_driver_license && $scope.file.upay_driver_license.endsWith('pdf')) { + $scope.idIsImage = false; + } + if ($scope.file.kyc_utility_bill_file && $scope.file.kyc_utility_bill_file.endsWith('pdf')) { + $scope.utilityIsImage = false; + } + if ($scope.file.refund_exchange_policy && $scope.file.refund_exchange_policy.endsWith('pdf')) { + $scope.refundIsImage = false; + } + if ($scope.file.upay_privacy_policy && $scope.file.upay_privacy_policy.endsWith('pdf')) { + $scope.privacyIsImage = false; + } + if ($scope.file.card_security_policy && $scope.file.card_security_policy.endsWith('pdf')) { + $scope.cardIsImage = false; + } + if ($scope.file.upay_offer_letter && $scope.file.upay_offer_letter.endsWith('pdf')) { + $scope.letterIsImage = false; + } + if ($scope.file.upay_promotional_offer && $scope.file.upay_promotional_offer.endsWith('pdf')) { + $scope.promotionalIsImage = false; + } + if ($scope.file.upay_terms_conditions && $scope.file.upay_terms_conditions.endsWith('pdf')) { + $scope.termsIsImage = false; + } + + + $scope.uploadBankFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) @@ -3670,10 +3714,12 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter url: '/attachment/files', data: {file: file} }).then(function (resp) { + $scope.uploadFile = {}; delete $scope.bankFileProgress; - $scope.file.upay_application_form = resp.data.url; + $scope.file.client_bank_file = resp.data.url; + $scope.uploadFile.client_bank_file = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_application_form.endsWith('pdf')) { + if ($scope.file.client_bank_file.endsWith('pdf')) { $scope.bankIsImage = false; } else { $scope.bankIsImage = true; @@ -3687,136 +3733,268 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } } }; - $scope.agreeIsImage = true; - if ($scope.file.file_agreement_info && $scope.file.file_agreement_info.endsWith('pdf')) { - $scope.agreeIsImage = false; - } - $scope.bankIsImage = true; - if ($scope.file.upay_application_form && $scope.file.upay_application_form.endsWith('pdf')) { - $scope.bankIsImage = false; - } - $scope.companyIsImage = true; - if ($scope.file.file_company_info && $scope.file.file_company_info.endsWith('pdf')) { - $scope.companyIsImage = false; - } - $scope.applyIsImage = true; - if ($scope.file.file_apply_info && $scope.file.file_apply_info.endsWith('pdf')) { - $scope.applyIsImage = false; - } - $scope.idIsImage = true; - if ($scope.file.file_id_info && $scope.file.file_id_info.endsWith('pdf')) { - $scope.idIsImage = false; - } - - $scope.uploadAgreementFile = function (file) { + $scope.uploadASICFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) } else { - $scope.companyFileProgress = {value: 0}; + $scope.ASICProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.companyFileProgress; - $scope.file.upay_agreement_file = resp.data.url; + $scope.uploadFile = {}; + delete $scope.ASICProgress; + $scope.file.client_company_file = resp.data.url; + $scope.uploadFile.client_company_file = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_agreement_file.endsWith('pdf')) { - $scope.companyIsImage = false; + if ($scope.file.client_company_file.endsWith('pdf')) { + $scope.bankIsImage = false; } else { - $scope.companyIsImage = true; + $scope.bankIsImage = true; } }, function (resp) { - delete $scope.companyFileProgress; + delete $scope.ASICProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.companyFileProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.ASICProgress.value = parseInt(100 * evt.loaded / evt.total); }) } } }; - $scope.uploadOfferFile = function (file) { + $scope.uploadIdFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) } else { - $scope.idFileProgress = {value: 0}; + $scope.idProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.idFileProgress; - $scope.file.upay_offer_letter = resp.data.url; + $scope.uploadFile = {}; + delete $scope.idProgress; + $scope.file.upay_driver_license = resp.data.url; + $scope.uploadFile.upay_driver_license = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_offer_letter.endsWith('pdf')) { + if ($scope.file.upay_driver_license.endsWith('pdf')) { $scope.idIsImage = false; } else { $scope.idIsImage = true; } }, function (resp) { - delete $scope.idFileProgress; + delete $scope.idProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.idFileProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.idProgress.value = parseInt(100 * evt.loaded / evt.total); }) } } }; - $scope.uploadDriverFile = function (file) { + $scope.uploadResidenceFile = function (file) { if (file != null) { - if (file.size > 10 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过10MB,请压缩后重试', type: 'error'}) + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) } else { - $scope.agreementFileProgress = {value: 0}; + $scope.residenceFileProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.agreementFileProgress; - $scope.file.upay_driver_license = resp.data.url; + $scope.uploadFile = {}; + delete $scope.residenceFileProgress; + $scope.file.kyc_utility_bill_file = resp.data.url; + $scope.uploadFile.kyc_utility_bill_file = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_driver_license.endsWith('pdf')) { - $scope.agreeIsImage = false; + if ($scope.file.kyc_utility_bill_file.endsWith('pdf')) { + $scope.utilityIsImage = false; } else { - $scope.agreeIsImage = true; + $scope.utilityIsImage = true; } }, function (resp) { - delete $scope.agreementFileProgress; + delete $scope.residenceFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.agreementFileProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.residenceFileProgress.value = parseInt(100 * evt.loaded / evt.total); }) } } }; - $scope.uploadResidenceFile = function (file) { + $scope.uploadRefundPolicyFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) } else { - $scope.applyFileProgress = {value: 0}; + $scope.refundPolicyFileProgress = {value: 0}; Upload.upload({ url: '/attachment/files', data: {file: file} }).then(function (resp) { - delete $scope.applyFileProgress; - $scope.file.upay_residence_certificate = resp.data.url; + $scope.uploadFile = {}; + delete $scope.refundPolicyFileProgress; + $scope.file.refund_exchange_policy = resp.data.url; + $scope.uploadFile.refund_exchange_policy = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_residence_certificate.endsWith('pdf')) { - $scope.applyIsImage = false; + if ($scope.file.refund_exchange_policy.endsWith('pdf')) { + $scope.utilityIsImage = false; } else { - $scope.applyIsImage = true; + $scope.utilityIsImage = true; } }, function (resp) { - delete $scope.applyFileProgress; + delete $scope.refundPolicyFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) }, function (evt) { - $scope.applyFileProgress.value = parseInt(100 * evt.loaded / evt.total); + $scope.refundPolicyFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadPrivacyPolicyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.privacyFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.uploadFile = {}; + delete $scope.privacyFileProgress; + $scope.file.upay_privacy_policy = resp.data.url; + $scope.uploadFile.upay_privacy_policy = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_privacy_policy.endsWith('pdf')) { + $scope.privacyIsImage = false; + } else { + $scope.privacyIsImage = true; + } + }, function (resp) { + delete $scope.privacyFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.privacyFileProgress.value = parseInt(100 * evt.loaded / evt.total); }) - } } }; + $scope.uploadCardPolicyFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.cardFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.uploadFile = {}; + delete $scope.cardFileProgress; + $scope.file.card_security_policy = resp.data.url; + $scope.uploadFile.card_security_policy = resp.data.url; + $scope.updateFile(); + if ($scope.file.card_security_policy.endsWith('pdf')) { + $scope.privacyIsImage = false; + } else { + $scope.privacyIsImage = true; + } + }, function (resp) { + delete $scope.cardFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.cardFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadLetterOfOfferFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.letterFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.uploadFile = {}; + delete $scope.letterFileProgress; + $scope.file.upay_offer_letter = resp.data.url; + $scope.uploadFile.upay_offer_letter = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_offer_letter.endsWith('pdf')) { + $scope.letterIsImage = false; + } else { + $scope.letterIsImage = true; + } + }, function (resp) { + delete $scope.letterFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.letterFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadPromotionalFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.promotionalFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.uploadFile = {}; + delete $scope.promotionalFileProgress; + $scope.file.upay_promotional_offer = resp.data.url; + $scope.uploadFile.upay_promotional_offer = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_promotional_offer.endsWith('pdf')) { + $scope.promotionalIsImage = false; + } else { + $scope.promotionalIsImage = true; + } + }, function (resp) { + delete $scope.promotionalFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.promotionalFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.uploadTermsFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.termsFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.uploadFile = {}; + delete $scope.termsFileProgress; + $scope.file.upay_terms_conditions = resp.data.url; + $scope.uploadFile.upay_terms_conditions = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_terms_conditions.endsWith('pdf')) { + $scope.termsIsImage = false; + } else { + $scope.termsIsImage = true; + } + }, function (resp) { + delete $scope.termsFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.termsFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + $scope.saveIdInfo = function () { if (!$scope.file.upay_risk_level) { commonDialog.alert({title: 'Error', content: '请选择商户风险等级', type: 'error'}); @@ -3844,34 +4022,14 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter return url; }; - - $scope.deleteComplianceFiles = function (file_id) { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will delete the file, Are you sure?' - }).then(function () { - $http.put('/sys/partners/auth_file/' + file_id + '/delete').then(function (resp) { - commonDialog.alert({ - title: 'Success', - content: 'Delete Successful', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - - $scope.updateFile = function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_file', $scope.file).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/mw_file', $scope.uploadFile).then(function () { commonDialog.alert({ title: 'Success', content: 'Upload Successful', type: 'success' }); - $state.reload(); + $state.go('partners.detail.files.MW_files', {reload: true}); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 098a270da..8cdacf735 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -1290,7 +1290,7 @@
    -
    diff --git a/src/main/ui/static/payment/partner/templates/partner_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_auth_files.html index c77dffeed..4a6289d53 100644 --- a/src/main/ui/static/payment/partner/templates/partner_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_auth_files.html @@ -3,18 +3,21 @@ width: 100%; } -
    -
    - + -
    -
    diff --git a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html index 2d9035b04..2c927ce0e 100644 --- a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html @@ -4,7 +4,7 @@ } -
    Audit Files     +
    Audit Files     一键下载 diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index f36ca7470..c043063a9 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -474,13 +474,11 @@ ui-sref="partners.edit({clientMoniker:partner.client_moniker})"> Edit -
    -

    {{partner.client_moniker}} @@ -527,6 +525,12 @@

    +
    + +
    +

    +
    +
    @@ -815,6 +819,20 @@
    +
    + + +
    +

    +
    +
    +
    + + +
    +

    +
    +
    @@ -1238,6 +1256,36 @@ ng-if="$root.complianceCheck.clientInfo">
    +
    + +
    +

    + {{partner.mw_industry}} +

    + +
    +
    +
    + +
    + + + + + + +
    +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index 0cecd2c54..b525a376f 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -1195,7 +1195,7 @@
    -
    diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index 371b91dbb..b3b301792 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -3,7 +3,7 @@ width: 100%; } -
    Audit Files     +
    Audit Files     一键下载 @@ -66,126 +66,173 @@
    - +
    - +
    - - - - - - -
    - - -
    + + +
    -
    - +
    - +
    - - - - - - -
    - - -
    + + + +
    -
    - +
    - +
    - - - - - -
    - - -
    + + + +
    - -
    -
    - -
    -
    - - - -
    - - - - - - -
    - - -
    +
    + +
    +
    + + +
    + + + +
    - -
    -
    - -
    -
    - - - -
    - - - - - - -
    - - -
    +
    + +
    +
    + + + +
    + + + + +
    +
    +
    + +
    +
    + + + +
    + + + + +
    +
    +
    + +
    +
    + + + +
    + + + + +
    +
    +
    + +
    +
    + + + +
    + + + + +
    +
    +
    + +
    +
    + + + +
    + + + + +
    +
    +
    + +
    +
    + + +
    + + + +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_settlement.html b/src/main/ui/static/payment/partner/templates/partner_settlement.html index 32df9ee0a..a455f5aa6 100644 --- a/src/main/ui/static/payment/partner/templates/partner_settlement.html +++ b/src/main/ui/static/payment/partner/templates/partner_settlement.html @@ -220,6 +220,7 @@ Settle Time + Settle Version Transaction Amount to Merchant Service Fee @@ -229,11 +230,15 @@ - {{log.report_date}} + {{log.report_date|limitTo:10}}   + + Card Payment + Cross-border Payment + diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index aa142c3cd..c54962cbe 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -389,7 +389,8 @@
    diff --git a/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html index 2c18f8311..821e0d456 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_settlement_logs.html @@ -271,6 +271,7 @@ Date + Settle Version Transaction Amount(AUD) Transfer to Merchant(AUD) GST(AUD) @@ -285,6 +286,10 @@ {{log.clearing_time|limitTo:10}}   + + Card Payment + Cross-border Payment + diff --git a/src/main/ui/static/payment/tradelog/transflow.js b/src/main/ui/static/payment/tradelog/transflow.js index f58a24060..db1d86ed4 100644 --- a/src/main/ui/static/payment/tradelog/transflow.js +++ b/src/main/ui/static/payment/tradelog/transflow.js @@ -219,6 +219,9 @@ define(['angular', 'uiBootstrap', 'uiRouter'], function (angular) { if (type=='pdf'){ url = '/client/trans_flow/report/pdf'; } + if (type=='upay-pdf'){ + url = '/client/trans_flow/report/upay_pdf'; + } if (type=='excel'){ url='/client/trans_flow/report/excel'; } From 7dfb2f341b86952e693a6b2490173dd2782c6308 Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 11:00:54 +0800 Subject: [PATCH 025/110] =?UTF-8?q?add=20upay=20=E5=95=86=E6=88=B7invoice?= =?UTF-8?q?=E3=80=81settlement=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/services/clearingDetailService.js | 30 ++ .../tradelog/partner-settlement-log.js | 3 + .../tradelog/templates/balance_report.html | 2 +- .../templates/partner_settlement_logs.html | 13 + ...partner_settlement_upay_settle_dialog.html | 258 ++++++++++++++++++ 5 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 src/main/ui/static/payment/tradelog/templates/partner_settlement_upay_settle_dialog.html diff --git a/src/main/ui/static/commons/services/clearingDetailService.js b/src/main/ui/static/commons/services/clearingDetailService.js index 7e0bd7faa..1acf1105a 100644 --- a/src/main/ui/static/commons/services/clearingDetailService.js +++ b/src/main/ui/static/commons/services/clearingDetailService.js @@ -19,6 +19,21 @@ define(['../app','decimal'], function (app,Decimal) { size: 'lg' }) } + function openDetailOfUpaySettle(url, is_partner, client_id, detailId) { + $uibModal.open({ + templateUrl: '/static/payment/tradelog/templates/partner_settlement_upay_settle_dialog.html', + controller: 'clearingDetailOfUpaySettleCtrl', + resolve: { + detail: ['$http', function ($http) { + return $http.get(url); + }], + is_partner: is_partner, + client_id: client_id, + detailId: detailId + }, + size: 'lg' + }) + } function openDetailOfMergeSettle(url,client_id) { $uibModal.open({ templateUrl: '/static/payment/tradelog/templates/partner_settlement_merge_settle_dialog.html', @@ -37,6 +52,9 @@ define(['../app','decimal'], function (app,Decimal) { clientClearingDetail: function (client_id, detailId, is_partner) { openDetail('/client/clean_logs/' + client_id + '/settlement_logs/' + detailId, is_partner,client_id,detailId); }, + clientClearingDetailOfUpaySettle: function (client_id, detailId, is_partner) { + openDetailOfUpaySettle('/client/clean_logs/' + client_id + '/settlement_logs/' + detailId, is_partner,client_id,detailId); + }, clientClearingDetailOfMergeSettle: function (client_id, reportDate) { openDetailOfMergeSettle('/client/clean_logs/' + client_id + '/settlement_logs/report_date/' + reportDate, client_id); } @@ -55,6 +73,18 @@ define(['../app','decimal'], function (app,Decimal) { } $scope.channelAndDayOfAnalysis(); }]); + app.controller('clearingDetailOfUpaySettleCtrl', ['$scope', 'detail', 'is_partner','client_id','detailId','$http', function ($scope, detail, is_partner,client_id,detailId,$http) { + $scope.ctrl = {channel: null,day:null}; + $scope.report = detail.data; + $scope.is_partner = is_partner; + $scope.channelAndDayOfAnalysis = function () { + $http.get('/client/clean_logs/' + client_id + '/settlement_logs/' + detailId+'/analysis/'+$scope.ctrl.channel).then(function (resp) { + $scope.channelAndDayMap = resp.data; + $scope.index = 0; + }) + } + $scope.channelAndDayOfAnalysis(); + }]); app.controller('clearingDetailOfMergeSettleCtrl', ['$scope', 'detail','client_id','$http', function ($scope, detail,client_id,$http) { $scope.ctrl = {channel: null,day:null}; $scope.report = detail.data; diff --git a/src/main/ui/static/payment/tradelog/partner-settlement-log.js b/src/main/ui/static/payment/tradelog/partner-settlement-log.js index 0a0705f81..fd4179fe1 100644 --- a/src/main/ui/static/payment/tradelog/partner-settlement-log.js +++ b/src/main/ui/static/payment/tradelog/partner-settlement-log.js @@ -222,6 +222,9 @@ define(['angular', 'uiBootstrap', 'uiRouter'], function (angular) { $scope.getClearingTransactions = function (client_id, detailId) { clearingDetailService.clientClearingDetail(client_id, detailId, true) } + $scope.getClearingTransactionsOfUpaySettle = function (client_id, detailId) { + clearingDetailService.clientClearingDetailOfUpaySettle(client_id, detailId, true) + } $scope.getClearingTransactionsOfMergeSettle = function (client_id, reportDate) { clearingDetailService.clientClearingDetailOfMergeSettle(client_id, reportDate) } diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index c54962cbe..896b3fc43 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -390,7 +390,7 @@
    + From 432ea24894ef33eca7386891d88c33187afe2e7e Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 11:35:00 +0800 Subject: [PATCH 026/110] add citypartner support && upay application form --- .../impls/CityPartnerPrizeServiceImpl.java | 111 ++++-------------- .../beans/ClientMWAuthFilesInfo.java | 9 ++ .../core/impls/ClientManagerImpl.java | 1 + .../merchants/enums/UPayAuthFileEnum.java | 6 +- .../mappers/payment/TransactionMapper.xml | 4 +- .../static/payment/partner/partner-manage.js | 35 +++++- .../templates/partner_mw_auth_files.html | 17 +++ 7 files changed, 93 insertions(+), 90 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java index 349aa4013..50abd1285 100644 --- a/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/citypartner/core/impls/CityPartnerPrizeServiceImpl.java @@ -1,88 +1,39 @@ package au.com.royalpay.payment.manage.citypartner.core.impls; -import java.io.IOException; -import java.io.OutputStream; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; -import javax.swing.plaf.basic.BasicScrollPaneUI; - -import au.com.royalpay.payment.manage.mappers.system.ClientBankAccountMapper; -import au.com.royalpay.payment.manage.mappers.system.ClientRateMapper; -import au.com.royalpay.payment.tools.CommonConsts; -import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.commons.lang3.time.DateUtils; -import org.apache.poi.hssf.usermodel.HSSFCellStyle; -import org.apache.poi.hssf.usermodel.HSSFFont; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.hssf.util.HSSFColor; -import org.apache.poi.ss.usermodel.*; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.alibaba.fastjson.JSONObject; - import au.com.royalpay.payment.manage.citypartner.beans.AgentCommissionAnalysis; import au.com.royalpay.payment.manage.citypartner.beans.CityPartnerCommissionAnalysis; import au.com.royalpay.payment.manage.citypartner.beans.ReferrerCommissionAnalysis; import au.com.royalpay.payment.manage.citypartner.core.CityPartnerPrizeService; -import au.com.royalpay.payment.manage.mappers.financial.FinancialAgentCommissionDetailMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialAgentCommissionMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialPartnerCommissionDetailMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialPartnerCommissionMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialReferrerCommissionDetailMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialReferrerCommissionMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialSeniorPartnerCommissionDetailMapper; -import au.com.royalpay.payment.manage.mappers.financial.FinancialSeniorPartnerCommissionMapper; +import au.com.royalpay.payment.manage.mappers.financial.*; import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.system.OrgMapper; import au.com.royalpay.payment.tools.CommonConsts; import au.com.royalpay.payment.tools.env.SysConfigManager; import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.ServerErrorException; - +import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import com.alibaba.fastjson.JSONObject; - import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.OutputStream; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; /** * Created by yixian on 2017-03-08. @@ -476,6 +427,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { BigDecimal total_surage = BigDecimal.ZERO; BigDecimal net_surage = BigDecimal.ZERO; BigDecimal royalpay_surage = BigDecimal.ZERO; + BigDecimal transaction_fee = BigDecimal.ZERO; JSONObject json = new JSONObject(); String channel = oneChannel.getKey(); if ("hf".equals(oneChannel.getKey().toLowerCase()) || "yeepay".equals(oneChannel.getKey().toLowerCase()) || "lakalapay".equals(oneChannel.getKey().toLowerCase())) { @@ -491,7 +443,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { for (JSONObject params : oneChannel.getValue()) { BigDecimal tmpClearingAmount = params.getBooleanValue("customer_surcharge") ? params.getBigDecimal("settle_amount") : params.getBigDecimal("clearing_amount"); BigDecimal channelRate = params.get("org_rate") != null ? params.getBigDecimal("org_rate") : (orgInfo.getBigDecimal(channel.toLowerCase() + "_rate_value").divide(CommonConsts.HUNDRED, 4, RoundingMode.DOWN)); - BigDecimal tmpTotalSurcharge = params.getBigDecimal("total_surcharge").subtract(params.getBigDecimal("surcharge_cashback")); + BigDecimal tmpTotalSurcharge = params.getBigDecimal("total_surcharge").subtract(params.getBigDecimal("surcharge_cashback")).subtract(params.getBigDecimal("transaction_fee")); //增加货币判断 int i = currencyScale(params.getString("clearing_currency")); total = total.add(tmpClearingAmount); @@ -499,11 +451,13 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { royalpay_surage = royalpay_surage.add(tmpClearingAmount.multiply(channelRate).setScale(i, RoundingMode.HALF_UP)); // net_surage = net_surage.add(getThirdPartyCharge(params.getString("channel"), params.getBigDecimal("clearing_amount"), channelCharge)); net_surage = net_surage.add(params.getBigDecimal("channel_surcharge")); + transaction_fee = transaction_fee.add(params.getBigDecimal("transaction_fee")); } BigDecimal org_charge = total_surage.subtract(royalpay_surage); json.put("channel", oneChannel.getKey()); json.put("gross_amount", total); json.put("total_charge", total_surage); + json.put("transaction_fee", transaction_fee); json.put("net_charge", net_surage); json.put("org_rate", orgInfo.getBigDecimal(channel.toLowerCase() + "_rate_value")); json.put("royalpay_charge", royalpay_surage); @@ -525,6 +479,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { BigDecimal net_surage = BigDecimal.ZERO; BigDecimal royalpay_surage = BigDecimal.ZERO; BigDecimal share_surage = BigDecimal.ZERO; + BigDecimal transaction_fee = BigDecimal.ZERO; JSONObject json = new JSONObject(); String channel = oneChannel.getKey(); @@ -534,7 +489,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { for (JSONObject params : oneChannel.getValue()) { BigDecimal tmpClearingAmount = params.getBooleanValue("customer_surcharge") ? params.getBigDecimal("settle_amount") : params.getBigDecimal("clearing_amount"); BigDecimal channelRate = params.get("org_rate") != null ? params.getBigDecimal("org_rate") : (orgInfo.getBigDecimal(channel.toLowerCase() + "_rate_value").divide(CommonConsts.HUNDRED, 4, RoundingMode.DOWN)); - BigDecimal tmpTotalSurcharge = params.getBigDecimal("total_surcharge").subtract(params.getBigDecimal("surcharge_cashback")); + BigDecimal tmpTotalSurcharge = params.getBigDecimal("total_surcharge").subtract(params.getBigDecimal("surcharge_cashback")).subtract(params.getBigDecimal("transaction_fee")); //增加货币判断 int i = currencyScale(params.getString("clearing_currency")); BigDecimal parent_surage = tmpClearingAmount.multiply(parentOrgInfo.getBigDecimal(channel.toLowerCase() + "_rate_value").divide(CommonConsts.HUNDRED, 4, RoundingMode.DOWN)).setScale(i, RoundingMode.HALF_UP); @@ -545,6 +500,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { //net_surage = net_surage.add(getThirdPartyCharge(params.getString("channel"), params.getBigDecimal("clearing_amount"), channelCharge)); net_surage = net_surage.add(params.getBigDecimal("channel_surcharge")); share_surage = share_surage.add(roy_surage.subtract(parent_surage)).setScale(i, RoundingMode.HALF_UP); + transaction_fee = transaction_fee.add(params.getBigDecimal("transaction_fee")); } BigDecimal org_charge = total_surage.subtract(royalpay_surage); @@ -556,6 +512,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { json.put("partner_charge", royalpay_surage); json.put("share_charge", share_surage); json.put("org_charge", org_charge); + json.put("transaction_fee", transaction_fee); json.put("commission_type", "1"); json.put("create_time", new Date()); amountByChannel.add(json); @@ -579,6 +536,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { BigDecimal total_surage = BigDecimal.ZERO; BigDecimal net_surage = BigDecimal.ZERO; BigDecimal royalpay_surage = BigDecimal.ZERO; + BigDecimal transaction_fee = BigDecimal.ZERO; Date datefrom = new Date(); Date dateto = new Date(); JSONObject json = new JSONObject(); @@ -617,6 +575,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { royalpay_surage = royalpay_surage.add(tmpClearingAmount.multiply(channelRate).setScale(i, RoundingMode.HALF_UP)); //net_surage = net_surage.add(getThirdPartyCharge(params.getString("channel"), params.getBigDecimal("clearing_amount"), channelCharge)); net_surage = net_surage.add(params.getBigDecimal("channel_surcharge")); + transaction_fee = transaction_fee.add(params.getBigDecimal("transaction_fee")); } BigDecimal org_charge = total_surage.subtract(royalpay_surage); if (channel.toLowerCase().equals("alipay_direct")) { @@ -642,6 +601,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { json.put("org_net_charge", net_surage); } json.put("org_charge", org_charge); + json.put("transaction_fee", transaction_fee); json.put("commission_type", "1"); json.put("create_time", new Date()); json.put("date_from", DateFormatUtils.format(datefrom, "yyyy-MM-dd")); @@ -825,6 +785,7 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { temp.put("total_charge", 0); temp.put("royalpay_charge", 0); temp.put("org_charge", 0); + temp.put("transaction_fee", 0); temp.put("share_charge", 0); temp.put("channel", channel.getString("channel")); temp.put("net_charge", 0); @@ -839,28 +800,8 @@ public class CityPartnerPrizeServiceImpl implements CityPartnerPrizeService { mineCommission.put("share_charge", mineCommission.getBigDecimal("share_charge").subtract(channel.getBigDecimal("share_charge"))); financialPartnerCommissionMapper.update(mineCommission); } - channel.put("month", month); - channel.put("year", year); - channel.put("org_id", orgId); - //撤销agent表 -// financialAgentCommissionMapper.save(channel); } } - //撤销agent表 -// Map> groupByClientMap = transactionDetail.stream().collect(Collectors.groupingBy(e -> e.getInteger("client_id"))); -// for (Map.Entry> oneClient : groupByClientMap.entrySet()) { -// -// JSONObject org = orgMapper.findOne(oneClient.getValue().get(0).getInteger("org_id")); -// Map> groupByChannel = oneClient.getValue().stream().collect(Collectors.groupingBy(e -> e.getString("channel"))); -// -// List clientChannelAmount = clientChannelAmount(oneClient.getKey(),org, groupByChannel, channelCharge,year,month,2); -// for (JSONObject channel : clientChannelAmount) { -// financialAgentCommissionDetailMapper.save(channel); -// } -// -// } - - } @Override diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java index 45235245c..73f0db163 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientMWAuthFilesInfo.java @@ -19,6 +19,7 @@ public class ClientMWAuthFilesInfo { private String kyc_utility_bill_file; private String upay_risk_level; private String upay_risk_remark; + private String upay_application_form; public JSONObject toJson(){ return (JSONObject)JSONObject.toJSON(this); @@ -130,4 +131,12 @@ public class ClientMWAuthFilesInfo { public void setKyc_utility_bill_file(String kyc_utility_bill_file) { this.kyc_utility_bill_file = kyc_utility_bill_file; } + + public void setUpay_application_form(String upay_application_form) { + this.upay_application_form = upay_application_form; + } + + public String getUpay_application_form() { + return upay_application_form; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 56088735f..1482ad7a6 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -3932,6 +3932,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_PROMOTIONAL_OFFER.getFileName(), filesInfo.getUpay_promotional_offer()); updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_TERMS_CONDITIONS.getFileName(), filesInfo.getUpay_terms_conditions()); updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.KYC_UTILITY_BILL_FILE.getFileName(), filesInfo.getKyc_utility_bill_file()); + updateSysMWClientFiles(manager, clientId, UPayAuthFileEnum.UPAY_APPLICATION_FORM.getFileName(), filesInfo.getUpay_application_form()); } catch (Exception e) { logger.error("上传合规文件失败", e); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java index 992e1280c..202a44d5f 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java @@ -11,7 +11,8 @@ public enum UPayAuthFileEnum { UPAY_OFFER_LETTER("upay_offer_letter"), UPAY_PROMOTIONAL_OFFER("upay_promotional_offer"), UPAY_TERMS_CONDITIONS("upay_terms_conditions"), - KYC_UTILITY_BILL_FILE("kyc_utility_bill_file"); + KYC_UTILITY_BILL_FILE("kyc_utility_bill_file"), + UPAY_APPLICATION_FORM("upay_application_form"); private final String fileName; @@ -33,6 +34,7 @@ public enum UPayAuthFileEnum { UPAY_OFFER_LETTER.getFileName(), UPAY_PROMOTIONAL_OFFER.getFileName(), UPAY_TERMS_CONDITIONS.getFileName(), - KYC_UTILITY_BILL_FILE.getFileName()}; + KYC_UTILITY_BILL_FILE.getFileName(), + UPAY_APPLICATION_FORM.getFileName()}; } } diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index a4ee7285c..38e1504a7 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -940,6 +940,7 @@ t.transaction_time, if(t.transaction_type = 'Credit', t.clearing_amount, -t.clearing_amount) clearing_amount, if(t.transaction_type = 'Credit', t.total_surcharge, -t.total_surcharge) total_surcharge, + if(t.transaction_type = 'Credit', t.transaction_fee, -t.transaction_fee) transaction_fee, if(t.transaction_type = 'Credit', t.channel_surcharge, -t.channel_surcharge) channel_surcharge, if(t.transaction_type = 'Credit', t.settle_amount, -t.settle_amount) settle_amount, t.order_id, @@ -967,12 +968,13 @@ t.transaction_time, if(t.transaction_type = 'Credit', t.clearing_amount, -t.clearing_amount) clearing_amount, if(t.transaction_type = 'Credit', t.total_surcharge, -t.total_surcharge) total_surcharge, + if(t.transaction_type = 'Credit', t.transaction_fee, -t.transaction_fee) transaction_fee, if(t.transaction_type = 'Credit', t.channel_surcharge, -t.channel_surcharge) channel_surcharge, if(t.transaction_type = 'Credit', t.settle_amount, -t.settle_amount) settle_amount, t.order_id, t.org_rate, t.surcharge_cashback, - o.customer_surcharge + o.customer_surcharge, from pmt_transactions t LEFT JOIN pmt_orders o on o.order_id = t.order_id INNER JOIN sys_org so ON t.org_id = so.org_id AND so.is_valid = 1 diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index db73e6dfc..6bc6cf720 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -3672,6 +3672,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.letterIsImage = true; $scope.promotionalIsImage = true; $scope.termsIsImage = true; + $scope.applicationIsImage = true; if ($scope.file.client_bank_file && $scope.file.client_bank_file.endsWith('pdf')) { $scope.bankIsImage = false; } @@ -3702,8 +3703,38 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter if ($scope.file.upay_terms_conditions && $scope.file.upay_terms_conditions.endsWith('pdf')) { $scope.termsIsImage = false; } - - + if ($scope.file.upay_application_form && $scope.file.upay_application_form.endsWith('pdf')) { + $scope.applicationIsImage = false; + } + $scope.uploadApplicationFile = function (file) { + if (file != null) { + if (file.size > 3 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过3MB,请压缩后重试', type: 'error'}) + } else { + $scope.applicationFileProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.uploadFile = {}; + delete $scope.applicationFileProgress; + $scope.file.upay_application_form = resp.data.url; + $scope.uploadFile.upay_application_form = resp.data.url; + $scope.updateFile(); + if ($scope.file.upay_application_form.endsWith('pdf')) { + $scope.bankIsImage = false; + } else { + $scope.bankIsImage = true; + } + }, function (resp) { + delete $scope.applicationFileProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.applicationFileProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; $scope.uploadBankFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index b3b301792..64e766aa7 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -65,6 +65,23 @@
    +
    + +
    +
    + + + +
    + + + + +
    +
    From 9d9499cfc84207752670f46623cd51e0558a8a3e Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 11:52:04 +0800 Subject: [PATCH 027/110] =?UTF-8?q?add=20card=20=E5=BC=80=E9=80=9A?= =?UTF-8?q?=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/ClientManagerImpl.java | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 1482ad7a6..f44f84a20 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -1216,9 +1216,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid int clientId = client.getIntValue("client_id"); isRiskyMerchant(client, clientBankAccountMapper.clientBankAccounts(clientId).get(0)); - if (client.getString("sub_merchant_id") == null || client.getString("sub_merchant_id").equals("")) { - throw new BadRequestException("该商户未设置微信 Sub Merchant ID!"); - } JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); client.putAll(clientConfigService.find(client.getIntValue("client_id"))); Integer open_status_to = cardFlowInfo != null? cardFlowInfo.getIntValue("open_status") : null; @@ -1229,20 +1226,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (pass == 1) { createKycAuthStatus(manager, client); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); - if (client.getIntValue("source") == 4 || client.getIntValue("source") == 5) { - List accounts = clientAccountMapper.listAdminAccounts(client.getIntValue("client_id")); - JSONObject account = accounts.get(0); - //TODO 发送卡支付开通邮件 1.判断商户是否已开通跨境支付,若没有开通,init账号 -// sendInitEmail(client, account.getString("username"), "*****"); - saveClientAuditProcess(client.getIntValue("client_id"), open_status_to, 5, "合规通过", manager,2); - - clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); -// gatewayMerchantApply.notifyOrgMerchantStatus(client); - } else { - //TODO 发送卡支付开通邮件 1.判断商户是否已开通跨境支付,若没有开通,init账号 -// initAdminUserAndSendEmail(manager, clientMoniker, client); - saveClientAuditProcess(client.getIntValue("client_id"), open_status_to, 5, "合规通过", manager,2); + List accounts = clientAccountMapper.listAdminAccounts(clientId); + if (accounts != null && accounts.size() > 0) { + sendInitEmail(client, accounts.get(0).getString("username"), "*******"); + }else { + initAdminUserAndSendEmail(manager, clientMoniker, client); } + saveClientAuditProcess(client.getIntValue("client_id"), open_status_to, 5, "合规通过", manager,2); } clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id")); } @@ -1296,9 +1286,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } private void initAdminUserAndSendEmail(JSONObject manager, String clientMoniker, JSONObject client) { - if (StringUtils.isEmpty(client.getString("sub_merchant_id"))) { - throw new BadRequestException("Sub Merchant ID Can't be null "); - } String username = clientMoniker; boolean duplicated = true; String pwd = RandomStringUtils.random(8, true, true); From 4d4ad058b1b79324065e41dc3a92e453e2852cea Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 14:04:23 +0800 Subject: [PATCH 028/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mappers/system/ClientFilesMapper.java | 2 + .../mappers/system/ClientRateMapper.java | 2 + .../manage/merchants/core/ClientManager.java | 16 +- .../core/impls/ClientManagerImpl.java | 231 ++++++++-- .../web/PartnerManageController.java | 84 ++-- src/main/resources/application.yml | 11 + .../mappers/system/ClientFilesMapper.xml | 8 + .../mappers/system/ClientRateMapper.xml | 10 + .../templates/pdf/letter_of_offer.pdf | Bin 168390 -> 187904 bytes .../static/payment/partner/partner-manage.js | 137 +++++- .../partner/templates/partner_detail.html | 418 +++++++++--------- .../templates/partner_payment_info.html | 2 +- .../payment/partner/templates/partners.html | 4 +- 13 files changed, 642 insertions(+), 283 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.java index 1d036096e..d7169064e 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.java @@ -52,6 +52,8 @@ public interface ClientFilesMapper { JSONObject getSourceAgreeFilesByClientId(@Param("client_id") int clientId); + JSONObject getSourceCardAgreeFilesByClientId(@Param("client_id") int clientId,@Param("file_name")String file_name); + void deleteByClientAndFileId(@Param("file_id") String file_id); void deleteAggreeByClientId(@Param("client_id") int file_id); diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java index 98ecbd655..a6972d809 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java @@ -53,6 +53,8 @@ public interface ClientRateMapper { JSONObject latestChannelCleanDays(@Param("rate_name")String rate_name, @Param("client_id")int client_id); + JSONObject latestCardChannelCleanDays(@Param("rate_name")String rate_name, @Param("client_id")int client_id); + JSONObject latestExpiryConfig(@Param("client_id")int client_id,@Param("rate_name") String rate_name); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index d95488795..46267d2f2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -272,6 +272,8 @@ public interface ClientManager { JSONObject getSourceAgreeFiles(JSONObject manage, String clientMoniker); + JSONObject getSourceCardAgreeFiles(String clientMoniker, JSONObject manager, String fileName); + void deleteAuthFiles(String fileId); void deleteAuthFilesByAdmin(String fileId); @@ -300,6 +302,8 @@ public interface ClientManager { void commitToCompliance(String clientMoniker, JSONObject manager); + void commitToCardCompliance(String clientMoniker, JSONObject manager); + void commitToDoAgreeFile(String clientMoniker, JSONObject manager); /** @@ -387,6 +391,10 @@ public interface ClientManager { void getAggregateAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; + void getAggregateCardAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; + + void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal,Date promotionalEffectiveDate,int promotionalPeriod) throws Exception; + void getNewAggregateAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; void temporaryExportPdf(String clientMoniker, JSONObject manager, HttpServletResponse httpResponse) throws Exception; @@ -395,6 +403,8 @@ public interface ClientManager { void completeAgree(String clientMoniker, JSONObject manager); + void cardCompleteAgree(String clientMoniker, JSONObject manager); + void downloadComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception; void downloadMWComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception; @@ -596,10 +606,4 @@ public interface ClientManager { void selectBillCodeVersion(JSONObject manager, String clientMoniker, String version); - void exportLetterOfferPDF(String clientMoniker,HttpServletResponse response); - - void exportPromotionalOfferPDF(String moniker, String date, HttpServletResponse response); - - void exportTermsConditionsPDF(String clientMoniker,HttpServletResponse response); - } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index f44f84a20..1a557da70 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -183,6 +183,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Resource private ClientIncrementalMapper clientIncrementalMapper; + @Value("${client_card.account_reserve}") + private String cardAccountReserve; + @Value("${client_card.annual_rate}") + private String cardAnnualRate; + @Value("${app.redis.prefix}") private String redisPrefix; private ApplicationEventPublisher publisher; @@ -340,6 +345,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid private static final String CLIENT_AGREE_FILE = "client_agree_file"; private static final String CLIENT_COMPANY_FILE = "client_company_file"; private static final String CLIENT_APPLY_FILE = "client_apply_file"; + + //卡支付合同文件 + private static final String LETTER_OF_OFFER_FILE="letter_of_offer_file"; + private static final String PROMOTIONAL_OFFER_FILE="promotional_offer_file"; + private static final String TERMS_AND_CONDITIONS_FILE="terms_and_conditions_file"; + + private static final List tags = new ArrayList<>(); private static final String KYC_UTILITY_BILL_FILE = "kyc_utility_bill_file"; @@ -1642,7 +1654,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new InvalidShortIdException(); } - clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, permissionKey, allow)); + JSONObject upayProfileInfo = sysClientUpayProfileMapper.findInfo(client.getInteger("client_id")); + upayProfileInfo.put(permissionKey,allow); + sysClientUpayProfileMapper.update(upayProfileInfo); } @Override @@ -3157,6 +3171,35 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } + @Override + @Transactional + public void getAggregateCardAgreeFile(String clientMoniker, JSONObject manager, boolean renewal){ + JSONObject client = clientMapper.findClientByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + exportLetterOfferPDF(clientMoniker,manager); + exportTermsConditionsPDF(clientMoniker,manager); + + if (!renewal) { + JSONObject cardFlow = clientCardFlowMapper.findClient(client.getInteger("client_id")); + cardFlow.put("open_status",2); + clientCardFlowMapper.update(cardFlow); + } + if (manager != null) { + saveClientAuditProcess(client.getIntValue("client_id"), 1, 2, "Compliance合同制作中", manager,2); + } + } + @Override + @Transactional + public void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal,Date promotionalEffectiveDate,int promotionalPeriod){ + JSONObject client = clientMapper.findClientByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + exportPromotionalOfferPDF(clientMoniker,manager,promotionalEffectiveDate,promotionalPeriod); + } + @Override public void getNewAggregateAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception { JSONObject client = getClientInfoByMoniker(clientMoniker); @@ -3376,6 +3419,24 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid sendCommissionWechatMessage(client); } + @Override + public void cardCompleteAgree(String clientMoniker, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + List existLeffterFiles = clientFilesMapper.findFileByClientAndType(client.getIntValue("client_id"), LETTER_OF_OFFER_FILE); + List existConditionsFiles = clientFilesMapper.findFileByClientAndType(client.getIntValue("client_id"), TERMS_AND_CONDITIONS_FILE); + if (CollectionUtils.isEmpty(existLeffterFiles) && CollectionUtils.isEmpty(existConditionsFiles)) { + throw new BadRequestException("The Agree File is not Complete!"); + } + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); + cardFlowInfo.put("open_status", 3); + clientCardFlowMapper.update(cardFlowInfo); + saveClientAuditProcess(client.getIntValue("client_id"), 2, 3, "合同制作完成,等待BD处理", manager,2); + sendCardCommissionWechatMessage(client); + } + @Override public void downloadComplianceZip(String clientMoniker, HttpServletResponse response) throws Exception { JSONObject client = getClientInfoByMoniker(clientMoniker); @@ -3711,6 +3772,19 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return sourceFile; } + @Override + public JSONObject getSourceCardAgreeFiles(String clientMoniker, JSONObject manager, String fileName){ + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + JSONObject sourceFile = clientFilesMapper.getSourceCardAgreeFilesByClientId(client.getIntValue("client_id"),fileName); + if (sourceFile != null) { + sourceFile.put(sourceFile.getString("file_name"), sourceFile.getString("file_value")); + } + return sourceFile; + } + @Override public JSONObject getAllAuthFiles(JSONObject manager, String clientMoniker) { JSONObject client = getClientInfoByMoniker(clientMoniker); @@ -4588,6 +4662,45 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } + @Override + @Transactional + public void commitToCardCompliance(String clientMoniker, JSONObject manager) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + client.putAll(clientConfigService.find(client.getIntValue("client_id"))); + if (manager != null && ManagerRole.BD_USER.hasRole(manager.getIntValue("role"))) { + int bdOperatClientRole = clientBDMapper.checkBDPermission(client.getIntValue("client_id"), manager.getString("manager_id")); + if (bdOperatClientRole <= 0) { + throw new ForbiddenException(); + } + } + // 提交合规启用银行、费率验证 add by Tayl0r 2017/06/13 + JSONObject rate = merchantInfoProvider.clientCurrentRate(client.getIntValue("client_id"), new Date(), "rpaypmt_card"); + if (rate == null) { + throw new BadRequestException("The Partner's Rate is not config!"); + } + List clientFiles = clientFilesMapper.findClientFile(client.getIntValue("client_id")); + if (clientFiles == null || clientFiles.equals("")) { + throw new BadRequestException("The Compliance File Must Be Uploaded!"); + } + JSONObject account = getBankAccountByClientId(client.getIntValue("client_id")); + if (account == null) { + throw new BadRequestException("The Partner's Bank Account is not config!"); + } + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); + int open_status_from = cardFlowInfo.getIntValue("open_status"); + cardFlowInfo.put("approve_time",new Date()); + cardFlowInfo.put("approve_result",4); + cardFlowInfo.put("open_status", 4); + clientCardFlowMapper.update(cardFlowInfo); + saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 4, "BD完成签字提交compliance审核", manager,2); + if (manager != null) { + sendCardCommissionWechatMessage(client); + } + } + private void saveClientAuditProcess(int client_id, Integer open_status_form, Integer open_status_to, String remark, JSONObject manager,int type) { JSONObject log = new JSONObject(); try { @@ -4640,6 +4753,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.putAll(clientConfigService.find(clientId)); beforeCommitToDoAgreeValid(client, manager); + JSONObject surCharge = merchantInfoProvider.clientCurrentRate(client.getIntValue("client_id"), new Date(), "rpaypmt_card"); + if (surCharge == null || surCharge.size() <= 0) { + throw new BadRequestException("The Partner's Rpaypmt Card Rate is not config!"); + } + JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); if(null != cardFlowInfo){ JSONObject cardFlow = new JSONObject(){{ @@ -5606,7 +5724,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid String wxopenid = compliance.getString("wx_openid"); try { MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); - TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), "BD申请制作卡支付合同" + client_moniker, + TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), "BD申请制作信用卡支付合同" + client_moniker, bd_user_name, "制作卡支付合同申请", "BD申请制作" + short_name + "的卡支付合同"); paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { @@ -5624,7 +5742,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (wxopenid != null) { try { MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); - TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "卡支付合同制作完成", + TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "信用卡支付合同制作完成", "Compliance", "合规材料", "上传完整合规材料,商户:" + short_name); paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { @@ -5647,7 +5765,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid String wxopenid = compliance.getString("wx_openid"); try { MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); - TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "卡支付合规材料已提交", + TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "信用卡卡支付合规材料已提交", bd_user_name, "审核材料", "已提交合规材料,等待审核"); paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { @@ -7217,12 +7335,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientInfoCacheSupport.clearClientCache(client.getIntValue("client_id")); } - @Override - public void exportLetterOfferPDF(String clientMoniker, HttpServletResponse response) { + private void exportLetterOfferPDF(String clientMoniker,JSONObject manage) { JSONObject info = convertClientLetterOfferInfo(clientMoniker); String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/letter_of_offer.pdf"; String fileName = clientMoniker + "_Letter_of_Offer.pdf"; - publishExcelCardPDFFile(fileName, pdfPath, info, response); + publishExcelCardPDFFile(clientMoniker,manage,fileName, pdfPath, info,LETTER_OF_OFFER_FILE); } private JSONObject convertClientLetterOfferInfo(String clientMoniker) { @@ -7236,46 +7353,45 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } //获取数据源 int clientId = client.getInteger("client_id"); - JSONObject clientRate = clientRateMapper.latestChannelCleanDays("rpaypmt_card", clientId); + JSONObject clientRate = clientRateMapper.latestCardChannelCleanDays("rpaypmt_card", clientId); if (clientRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } JSONObject cardRate = clientRate.getJSONObject("ext_rates"); JSONObject bankAccountInfo = clientBankAccountMapper.clientBankAccounts(clientId).get(0); - + JSONObject upayProfileInfo = sysClientUpayProfileMapper.findInfo(clientId); //装在数据 JSONObject info = new JSONObject(); info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 - info.put("bussiness_name", client.getString("business_name") + " ABN");//商圈类型 + info.put("bussiness_name", (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN");//商圈类型 info.put("partner_address", client.getString("address"));//商家店铺地址 info.put("partner_country", client.getString("country"));//国家 info.put("partner_state", client.getString("state"));//洲 info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 info.put("clean_days", client.getInteger("clean_days"));//T+规则清算天数 - info.put("partner_industry_mcc", client.getInteger("industry"));//商户行业编码 - info.put("legal_bussiness", client.getString("contact_person") + " AS " + client.getString("business_name") + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 - info.put("annual_rate", "0");//年费率 + info.put("partner_industry_mcc", upayProfileInfo.getString("mv_industy"));//信用卡注册商户行业编码 + info.put("legal_bussiness", client.getString("contact_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 + info.put("annual_rate",cardAnnualRate);//年费率 info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 - info.put("account_reserve", "1000");//账户储备金 + info.put("account_reserve", cardAccountReserve);//账户储备金 //银行账号信息 info.put("account_name", bankAccountInfo.getString("account_name"));// info.put("bsb", bankAccountInfo.getString("bsb_no")); info.put("account_no", bankAccountInfo.getString("account_no")); - info.put("card_acceptor_name", "xxxxxxxxxxxxx"); + info.put("card_acceptor_name", upayProfileInfo.getString("acceptor_name")); return info; } - @Override - public void exportPromotionalOfferPDF(String clientMoniker, String date, HttpServletResponse response) { - JSONObject info = convertPromotionalOfferInfo(clientMoniker, date); + private void exportPromotionalOfferPDF(String clientMoniker,JSONObject manager,Date promotionalEffectiveDate,int promotionalPeriod) { + JSONObject info = convertPromotionalOfferInfo(clientMoniker,convertDateEnglish(promotionalEffectiveDate),promotionalPeriod); String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/promotional_offer.pdf"; String fileName = clientMoniker + "_Promotional_Offer.pdf"; - publishExcelCardPDFFile(fileName, pdfPath, info, response); + publishExcelCardPDFFile(clientMoniker,manager,fileName, pdfPath, info,PROMOTIONAL_OFFER_FILE); } - private JSONObject convertPromotionalOfferInfo(String clientMoniker, String date) { + private JSONObject convertPromotionalOfferInfo(String clientMoniker,String promotionalEffectiveDate,int promotionalPeriod) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); @@ -7285,7 +7401,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new BadRequestException("The merchant failed the audit!"); } int clientId = client.getInteger("client_id"); - JSONObject clientRate = clientRateMapper.latestChannelCleanDays("rpaypmt_card", clientId); + JSONObject clientRate = clientRateMapper.latestCardChannelCleanDays("rpaypmt_card", clientId); if (clientRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } @@ -7294,22 +7410,20 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid JSONObject info = new JSONObject(); info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 - info.put("bussiness_name", client.getString("business_name") + " ABN");//商圈类型 + info.put("bussiness_name", (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN");//商圈类型 info.put("partner_address", client.getString("address"));//商家店铺地址 info.put("partner_country", client.getString("country"));//国家 info.put("partner_state", client.getString("state"));//洲 info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 - info.put("letter_offer_sub_time", date); - info.put("legal_bussiness", client.getString("contact_person") + " AS " + client.getString("business_name") + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 + info.put("legal_bussiness", client.getString("contact_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 - info.put("promotional_effective_date", "xxxxxxxxx"); - info.put("promotional_period", "xxxxxxxxx"); + info.put("promotional_effective_date", promotionalEffectiveDate); + info.put("promotional_period", promotionalPeriod); return info; } - @Override - public void exportTermsConditionsPDF(String clientMoniker, HttpServletResponse response) { + private void exportTermsConditionsPDF(String clientMoniker,JSONObject manage) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); @@ -7319,24 +7433,26 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/terms_and_conditions.pdf"; String fileName = clientMoniker + "_Terms_And_Conditions.pdf"; - publishExcelCardPDFFile(fileName, pdfPath, new JSONObject(), response); + publishExcelCardPDFFile(clientMoniker,manage,fileName, pdfPath, new JSONObject(),TERMS_AND_CONDITIONS_FILE); } - private void publishExcelCardPDFFile(String fileName, String pdfPath, JSONObject info, HttpServletResponse response) { - response.setContentType("application/pdf"); - response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".pdf"); + private void publishExcelCardPDFFile(String clientMoniker,JSONObject manager, String fileName, String pdfPath, JSONObject info, String fileLabel) { try { - OutputStream outs = response.getOutputStream(); PdfUtils pdu = new PdfUtils(); pdu.setTemplatePdfPath(pdfPath); pdu.setPdfTemplate(info); - File file = new File(fileName); - ByteArrayOutputStream bos = pdu.templetPdfBos(file, "", ""); - outs.write(bos.toByteArray(), 0, bos.toByteArray().length); - outs.flush(); - outs.close(); - } catch (IOException e) { - e.printStackTrace(); + try { + File file = new File(fileName); + ByteArrayOutputStream bos = pdu.templetPdfBos(file); + InputStream stream = new ByteArrayInputStream(bos.toByteArray()); + JSONObject fileRes = attachmentClient.uploadFile(stream, fileName, false); + if (fileRes != null) { + importCardAgreeFile(clientMoniker, manager, fileRes.getString("url"), fileLabel); + } + stream.close(); + } catch (Exception e) { + logger.error("合同制作出现问题:", e); + } } catch (Exception e) { e.printStackTrace(); } @@ -7352,6 +7468,41 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return day + " " + months[month] + " " + year; } + private void importCardAgreeFile(String clientMoniker, JSONObject manager, String sourceFile, String fileLabel) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); + } + if (sourceFile != null) { + List existFiles = clientFilesMapper.findFileByClientAndType(client.getIntValue("client_id"), fileLabel); + JSONObject existFile = null; + if (!CollectionUtils.isEmpty(existFiles)) { + existFile = existFiles.get(0); + } + Date now = new Date(); + JSONObject file = new JSONObject(); + file.put("file_name", fileLabel); + file.put("file_value", sourceFile); + file.put("client_id", client.getIntValue("client_id")); + file.put("last_update_date", now); + file.put("status", 1); + file.put("is_valid", 1); + if (manager == null) { + file.put("last_update_by", "System Import"); + } else { + file.put("last_update_by", manager.getString("display_name")); + } + JSONObject contract = clientsContractMapper.findByClientId(client.getIntValue("client_id")); + if (contract == null || now.compareTo(contract.getDate("expiry_date")) > 0 || !contract.getBoolean("has_sign") || existFile == null + || existFile.isEmpty()) { + clientFilesMapper.save(file); + } else { + file.put("file_id", existFile.getString("file_id")); + clientFilesMapper.update(file); + } + } + } + public void saveLegalAndMarketingInfo(JSONObject partner) { JSONObject representativeInfo = new JSONObject(); representativeInfo.put("client_id", partner.getIntValue("client_id")); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 8fc8d8cce..d89fc146a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -595,6 +595,17 @@ public class PartnerManageController { return clientManager.getSourceAgreeFiles(manager, clientMoniker); } + /** + * 下载商户卡支付合规文件 + * + * @param clientMoniker + */ + @ManagerMapping(value = "/{clientMoniker}/file/source_card_agree_file", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT}) + public JSONObject getSourceCardAgreeAuthFiles(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, + @RequestParam("fileName") String fileName){ + return clientManager.getSourceCardAgreeFiles(clientMoniker,manager,fileName); + } + @ManagerMapping(value = "/auth_file/{fileId}/delete", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) public void deleteAuthFiles(@PathVariable String fileId, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.deleteAuthFilesByAdmin(fileId); @@ -634,12 +645,21 @@ public class PartnerManageController { clientManager.commitToCompliance(clientMoniker, manager); } + /** + * 提交资料,BD提交卡支付最终审核 + * @param clientMoniker + * @param manager + */ + @ManagerMapping(value = "/{clientMoniker}/to_card_compliance", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.BD_USER}) + public void commitToCardCompliance(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.commitToCardCompliance(clientMoniker, manager); + } + @ManagerMapping(value = "/{clientMoniker}/make_agree_file", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER}) public void commitToDoAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.commitToDoAgreeFile(clientMoniker, manager); } - //TODO BD提交申请卡合规 /** * 提交资料,申请卡支付 * @param clientMoniker @@ -665,6 +685,29 @@ public class PartnerManageController { clientManager.getAggregateAgreeFile(clientMoniker, manager, false); } + /** + * 制作卡支付合同 + * @param clientMoniker + * @param manager + * @throws Exception + */ + @ManagerMapping(value = "/{clientMoniker}/export/aggregate/card_agree_pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) + public void exportAggregateCardAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) throws Exception { + clientManager.getAggregateCardAgreeFile(clientMoniker, manager, false); + } + + /** + * 制作促销合同 + * @param clientMoniker + * @param manager + * @throws Exception + */ + @ManagerMapping(value = "/{clientMoniker}/export/aggregate/card_promotiona_agree_pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) + public void exportAggregateCardPromotionaAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, + @RequestParam("date") Date promotionalEffectiveDate,@RequestParam("period") int promotionalPeriod) throws Exception { + clientManager.getAggregateCardPromotionaAgreeFile(clientMoniker, manager, false,promotionalEffectiveDate,promotionalPeriod); + } + @ManagerMapping(value = "/{clientMoniker}/temp/export/pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) public void temporaryExportPDF(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse httpResponse) throws Exception { clientManager.temporaryExportPdf(clientMoniker, manager, httpResponse); @@ -680,6 +723,16 @@ public class PartnerManageController { clientManager.completeAgree(clientMoniker, manager); } + /** + * 信用卡合同生成完毕通知BD + * @param clientMoniker + * @param manager + */ + @ManagerMapping(value = "/{clientMoniker}/notify/cardCompleteAgree", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public void cardCompleteAgree(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.cardCompleteAgree(clientMoniker, manager); + } + @ManagerMapping(value = "/{clientMoniker}/download/complianceAsZIP", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) public void downloadComplianceZip(@PathVariable String clientMoniker, HttpServletResponse response) throws Exception { clientManager.downloadComplianceZip(clientMoniker, response); @@ -961,33 +1014,4 @@ public class PartnerManageController { clientManager.switchPermission(manager, clientMoniker, "enable_international_card", pass.getBooleanValue("allow")); } - /** - * 下载商户Letter of Offer pdf文件 - * - * @param clientMoniker - */ - @ManagerMapping(value = "/{clientMoniker}/export/letter_of_offer_pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void exportLetterOfferPDF(@PathVariable String clientMoniker,HttpServletResponse response){ - clientManager.exportLetterOfferPDF(clientMoniker,response); - } - - /** - * 下载商户Promotional Offer pdf文件 - * - * @param clientMoniker - */ - @ManagerMapping(value = "/{clientMoniker}/export/promotional_offer_pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void exportPromotionalOfferPDF(@PathVariable String clientMoniker, @RequestParam("date")String date, HttpServletResponse response){ - clientManager.exportPromotionalOfferPDF(clientMoniker,date,response); - } - - /** - * 下载Terms Conditions pdf文件 - * - * @param clientMoniker - */ - @ManagerMapping(value = "/{clientMoniker}/export/terms_conditions_pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void exportTermsConditionsPDF(@PathVariable String clientMoniker,HttpServletResponse response){ - clientManager.exportTermsConditionsPDF(clientMoniker,response); - } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0bde059ef..b57b9f590 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -68,6 +68,11 @@ app: tax: type: GST +client_card: + account_reserve: 1000 + annual_rate: 0 + + apple: message: apns: @@ -153,6 +158,12 @@ spring: port: 6379 thymeleaf: mode: HTML +logging: + level: + au: + com: + royalpay: + payment: debug diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.xml index 2fec0585a..e2914bf54 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientFilesMapper.xml @@ -19,6 +19,14 @@ and file_name = 'source_agree_file' order by last_update_date desc limit 1 + + + + +
    ' + + ' 请输入活动周期: '); + var choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, + {label: '确认提交', className: 'btn-success', key: '1'}]; + var content = ''; + $scope.showCardPromotionaBg = true; + commonDialog.confirm({ + title: title, + content: content, + choises: choises, + contentHtml: contentHtml + }).then(function (res) { + if(params != null){ + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_promotiona_agree_pdf').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Agreement File Generate Succeed! Please notify BD!', + type: 'success' + }); + $scope.showCardPromotionaBg = false; + $state.reload(); + }, function (resp) { + $scope.showCardPromotionaBg = false; + $state.reload(); + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }); + } + }); + + } + $scope.Export = function () { var url = '/dev/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf'; return url; @@ -681,6 +750,33 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } } }; + + $scope.uploadCardAgreeFile = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.agree_file_import = resp.data.url; + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', {source_agree_file: $scope.agree_file_import}).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Succeed Imported! Please notify BD', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }, function (resp) { + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }) + } + } + }; $scope.notifyBD = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/completeAgree').then(function () { commonDialog.alert({ @@ -694,6 +790,19 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }); }; + $scope.cardNotifyBD = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/cardCompleteAgree').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Notify BD Successed!.', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}); + }); + }; + $scope.downTempPdf = function () { var url = '/sys/partners/' + $scope.partner.client_moniker + '/temp/export/pdf'; return url; @@ -779,6 +888,30 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }) }; + + $scope.commitToCardCompliance = function(){ + commonDialog.confirm({ + title: 'Commit to Compliance', + content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', + choises: [ + {label: 'Submit', className: 'btn-success', key: 1}, + {label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true} + ] + }).then(function (choice) { + if (choice == 1) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_card_compliance', {}).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Commit to Compliance successfully', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + } + }) + } $scope.apply2makeAgreeFile = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then(function () { commonDialog.alert({ diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index c043063a9..7c83452cd 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -60,188 +60,178 @@
    -
    -
    -

    Compliance (Refused - :{{partner.refuse_remark}}) - (The Partner Using Green Channel Now!) - 【目前状态】- - - (自助申请)资料完善中 - (自助申请)已开通 - (自助申请)快速开通等待提交合规材料 - (自助申请)待审核(材料已提交) - - - 资料完善中 - 待审核(合同制作中) - 合同制作完成 - BD处理中 - 待审核(合规文件已提交) - 通过 - 不通过 - 绿色通道申请中 - - (已禁用) -

    - -
    -
    -
    - - - - 制作临时合同 - - 制作全支付合同 - - 上传合同 (通用合同请选择制作合同,非通用合同模板请人工制作合同后上传) -
    -
    - - -
    -
    - -
    - 下载合同 - - - Notify BD - -
    -
    - - - - - - -
    - -
    - -
    -
    - - -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -

    - - RP Operation - (Refused - :{{partner.refuse_remark}} - )(The Partner Using Green Channel Now!) - 【目前状态】- - 资料完善中 - 待审核(合同制作中) - 合同制作完成 - BD处理中 - 待审核(合规文件已提交) - 通过 - 不通过 - 绿色通道申请中 -

    -
    -
    - - 下载合同 -
    - -
    -
    - -
    -
    - -
    -
    -
    - - - - - - -
    - -
    - -
    -
    - - -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -

    Solved

    -
    -
    -
    Make sure you have send the email to client.
    -
    - -
    -
    -
    +
    +
    +

    Compliance (Refused + :{{partner.refuse_remark}}) + (The Partner Using Green Channel Now!) + 【目前状态】- + + (自助申请)资料完善中 + (自助申请)已开通 + (自助申请)快速开通等待提交合规材料 + (自助申请)待审核(材料已提交) + + + 资料完善中 + 待审核(合同制作中) + 合同制作完成 + BD处理中 + 待审核(合规文件已提交) + 通过 + 不通过 + 绿色通道申请中 + + (已禁用) +

    + +
    +
    +
    + + + + 制作临时合同 + + 制作全支付合同 + + 上传合同 (通用合同请选择制作合同,非通用合同模板请人工制作合同后上传) +
    +
    + + + +
    +
    + +
    + 下载合同 + + + Notify BD + +
    +
    + + + + + + +
    + +
    + +
    +
    + + +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +

    + + Operation + (Refused + :{{partner.refuse_remark}} + )(The Partner Using Green Channel Now!) + 【目前状态】- + 资料完善中 + 待审核(合同制作中) + 合同制作完成 + BD处理中 + 待审核(合规文件已提交) + 通过 + 不通过 + 绿色通道申请中 +

    +
    +
    + + 下载合同 +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + + + +
    + +
    + +
    +
    + + +
    + + +
    +
    +
    +
    +
    +
    @@ -277,29 +267,35 @@
    -
    +
    - - 制作全支付合同 - - 上传合同 (通用合同请选择制作合同,非通用合同模板请人工制作合同后上传) + + 制作卡支付合同 + + 制作促销合同
    +
    -
    - 下载合同 + 下载Letter Of Offer合同 + 下载Terms And Conditions合同 + 下载Promotional Offer合同 + ng-click="cardNotifyBD()"> Notify BD
    @@ -329,9 +325,9 @@
    + ng-class="{'box-warning':partner.card_flow_info.approve_result!=5,'box-danger':partner.card_flow_info.approve_result==5}">
    -

    Card Payment Operation +

    Operation (Refused :{{partner.card_flow_info.refuse_remark}} )

    - - 下载合同 + 下载Letter Of Offer合同 + 下载Terms And Conditions合同 + 下载Promotional Offer合同
    -
    +
    - -
    + + +

    Solved

    @@ -1293,7 +1307,7 @@
    diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index aff94a22e..6d9aff34c 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -490,7 +490,7 @@
    -
    +
    Card Payment Config
    diff --git a/src/main/ui/static/payment/partner/templates/partners.html b/src/main/ui/static/payment/partner/templates/partners.html index c6ca05969..cd0e03ebc 100644 --- a/src/main/ui/static/payment/partner/templates/partners.html +++ b/src/main/ui/static/payment/partner/templates/partners.html @@ -503,7 +503,7 @@ 等待合规
    - 等待BD上传材料审核 + 资料完善中
    @@ -511,7 +511,7 @@ 资料完善中 (自助开通)资料完善中 不通过({{partner.card_approve_flow_info.approve_time}}) - 申请打回({{partner.card_approve_flow_info.refuse_remark|limitTo:15}}) + 申请打回({{partner.card_approve_flow_info.refuse_remark|limitTo:15}}) 等待合规 合同制作完成 等待BD上传材料审核 From de5f731309c665602a17a35ef3d20df107719e02 Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 14:24:33 +0800 Subject: [PATCH 029/110] =?UTF-8?q?fix=20upay=E8=A1=A5=E5=85=85=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=A1=A8=E5=A2=9E=E5=8A=A0=E5=90=88=E8=A7=84=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mappers/system/ClientCardFlowMapper.java | 31 ---- .../core/impls/ClientManagerImpl.java | 146 +++++++++--------- .../manage/mappers/system/ClientMapper.xml | 12 +- .../payment/partner/templates/partners.html | 22 +-- 4 files changed, 94 insertions(+), 117 deletions(-) delete mode 100644 src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java deleted file mode 100644 index 485ef152c..000000000 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientCardFlowMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package au.com.royalpay.payment.manage.mappers.system; - -import com.alibaba.fastjson.JSONObject; -import com.github.miemiedev.mybatis.paginator.domain.PageBounds; -import com.github.miemiedev.mybatis.paginator.domain.PageList; -import com.yixsoft.support.mybatis.autosql.annotations.AdvanceSelect; -import com.yixsoft.support.mybatis.autosql.annotations.AutoMapper; -import com.yixsoft.support.mybatis.autosql.annotations.AutoSql; -import com.yixsoft.support.mybatis.autosql.annotations.SqlType; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; -import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; - -import java.util.Date; -import java.util.List; - -/** - * Created by dulingling on 2020-04-26. - */ -@AutoMapper(tablename = "sys_clients_card_flow", pkName = "client_id", keyGenerator = Jdbc3KeyGenerator.class) -public interface ClientCardFlowMapper { - @AutoSql(SqlType.SELECT) - JSONObject findClient(@Param("client_id") int clientId); - - @AutoSql(SqlType.INSERT) - void save(JSONObject partner); - - @AutoSql(SqlType.UPDATE) - int update(JSONObject partner); - -} diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 1a557da70..b6a5dba47 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -333,8 +333,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid private RPayMerchantMapper rPayMerchantMapper; @Resource private SysClientUpayProfileMapper sysClientUpayProfileMapper; - @Resource - private ClientCardFlowMapper clientCardFlowMapper; @Resource @@ -519,12 +517,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("audit_card_logs", audit_card_logs); } - //插入卡支付审核状态 - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); - if(null != cardFlowInfo){ - client.put("card_flow_info",cardFlowInfo); - } - //HF支付链接二维码 if (client.getString("hf_pay_url") != null) { String hfQrcodeUrl = PlatformEnvironment.getEnv().concatUrl("/api/v1.0/hf_gateway/partners/" + client.getString("client_moniker") + "/jump/app"); @@ -598,10 +590,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid partner.put("expiry_time", DateUtils.addDays(partner.getDate("approve_time"), authDays)); partner.put("pass_timeout", DateUtils.addDays(partner.getDate("approve_time"), authDays).compareTo(new Date()) < 0); } - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(partner.getInteger("client_id")); - if(null != cardFlowInfo){ - partner.put("card_approve_flow_info",cardFlowInfo); - } } return PageListUtils.buildPageListResult(partners); } @@ -1200,7 +1188,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client.getIntValue("source") == 4 || client.getIntValue("source") == 5) { List accounts = clientAccountMapper.listAdminAccounts(client.getIntValue("client_id")); JSONObject account = accounts.get(0); - sendInitEmail(client, account.getString("username"), "*****"); + sendInitEmail(client, account.getString("username"), "*****", false); // sendInitEmail(manager, client, account.getString("username"), "*****"); saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager,1); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); @@ -1211,7 +1199,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid logger.info("PASS 绿色通道:" + clientMoniker); saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager,1); } else { - initAdminUserAndSendEmail(manager, clientMoniker, client); + initAdminUserAndSendEmail(manager, clientMoniker, client, false); saveClientAuditProcess(client.getIntValue("client_id"), open_status, 5, "合规通过", manager,1); } } @@ -1228,21 +1216,21 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid int clientId = client.getIntValue("client_id"); isRiskyMerchant(client, clientBankAccountMapper.clientBankAccounts(clientId).get(0)); - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); + JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(clientId); client.putAll(clientConfigService.find(client.getIntValue("client_id"))); - Integer open_status_to = cardFlowInfo != null? cardFlowInfo.getIntValue("open_status") : null; - cardFlowInfo.put("open_status",5); - cardFlowInfo.put("approve_result",1); - clientCardFlowMapper.update(cardFlowInfo); + Integer open_status_to = cardFlowInfo != null? cardFlowInfo.getIntValue("upay_open_status") : null; + cardFlowInfo.put("upay_open_status",5); + cardFlowInfo.put("upay_approve_result",1); + sysClientUpayProfileMapper.update(cardFlowInfo); sendCardCommissionWechatMessage(client);// wxMessage if (pass == 1) { createKycAuthStatus(manager, client); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, "skip_clearing", false)); List accounts = clientAccountMapper.listAdminAccounts(clientId); if (accounts != null && accounts.size() > 0) { - sendInitEmail(client, accounts.get(0).getString("username"), "*******"); + sendInitEmail(client, accounts.get(0).getString("username"), "*******", true); }else { - initAdminUserAndSendEmail(manager, clientMoniker, client); + initAdminUserAndSendEmail(manager, clientMoniker, client, true); } saveClientAuditProcess(client.getIntValue("client_id"), open_status_to, 5, "合规通过", manager,2); } @@ -1294,10 +1282,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientModifySupport.processClientModify(new GreenChannelModify(manager, clientMoniker, manager.getString("manager_id"))); saveClientAuditProcess(client.getIntValue("client_id"), 10, 1, "绿色通道申请通过", manager,1); sendCommissionWechatMessage(client); - initAdminUserAndSendEmail(manager, clientMoniker, client); + initAdminUserAndSendEmail(manager, clientMoniker, client, false); } - private void initAdminUserAndSendEmail(JSONObject manager, String clientMoniker, JSONObject client) { + private void initAdminUserAndSendEmail(JSONObject manager, String clientMoniker, JSONObject client,boolean isUpayEmail) { String username = clientMoniker; boolean duplicated = true; String pwd = RandomStringUtils.random(8, true, true); @@ -1314,7 +1302,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid username += "0"; } } - sendInitEmail(client, username.toLowerCase(), pwd); + sendInitEmail(client, username.toLowerCase(), pwd, isUpayEmail); // sendInitEmail(manager, client, username, pwd); } @@ -1340,16 +1328,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client.getIntValue("source") == 4) { JSONObject account = accounts.get(0); // sendInitEmail(manager, client, account.getString("username"), "*****"); - sendInitEmail(client, account.getString("username"), "*****"); + sendInitEmail(client, account.getString("username"), "*****", false); } else { if (accounts.size() == 0) { - initAdminUserAndSendEmail(manager, clientMoniker, client); + initAdminUserAndSendEmail(manager, clientMoniker, client, false); } else { JSONObject account = accounts.get(0); String pwd = RandomStringUtils.random(8, true, true); resetAccountPwd(manager, clientMoniker, account.getString("account_id"), pwd); // sendInitEmail(manager, client, account.getString("username"), pwd); - sendInitEmail(client, account.getString("username"), pwd); + sendInitEmail(client, account.getString("username"), pwd, false); } } } @@ -1421,7 +1409,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid }.start(); } - public void sendInitEmail(final JSONObject client, String username, String pwd) { + public void sendInitEmail(final JSONObject client, String username, String pwd,boolean isUpayAuditPass) { logger.debug("sending email after comply"); JSONObject model = new JSONObject(); model.put("username", username); @@ -1471,16 +1459,30 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid mailService.sendEmail("Your RoyalPay Cross-border Payment has been set up", emails.isEmpty() ? "" : StringUtils.join(emails, ","), "", contentBd); JSONObject clientUpdate = new JSONObject(); - clientUpdate.put("client_id", client.getIntValue("client_id")); - clientUpdate.put("approve_email_send", 3); - clientUpdate.put("approve_email_id", emailId); - clientMapper.update(clientUpdate); + if (isUpayAuditPass) { + clientUpdate.put("client_id", client.getIntValue("client_id")); + clientUpdate.put("upay_approve_email_send", 3); + clientUpdate.put("upay_approve_email_id", emailId); + sysClientUpayProfileMapper.update(clientUpdate); + }else { + clientUpdate.put("client_id", client.getIntValue("client_id")); + clientUpdate.put("approve_email_send", 3); + clientUpdate.put("approve_email_id", emailId); + clientMapper.update(clientUpdate); + } } catch (Exception e) { JSONObject clientUpdate = new JSONObject(); - clientUpdate.put("client_id", client.getIntValue("client_id")); - clientUpdate.put("approve_email_send", 0); - clientUpdate.put("approve_email_id", null); - clientMapper.update(clientUpdate); + if (isUpayAuditPass) { + clientUpdate.put("client_id", client.getIntValue("client_id")); + clientUpdate.put("upay_approve_email_send", 0); + clientUpdate.put("upay_approve_email_id", null); + sysClientUpayProfileMapper.update(clientUpdate); + }else { + clientUpdate.put("client_id", client.getIntValue("client_id")); + clientUpdate.put("approve_email_send", 0); + clientUpdate.put("approve_email_id", null); + clientMapper.update(clientUpdate); + } throw new EmailException("Email Sending Failed", e); } } @@ -3182,9 +3184,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid exportTermsConditionsPDF(clientMoniker,manager); if (!renewal) { - JSONObject cardFlow = clientCardFlowMapper.findClient(client.getInteger("client_id")); - cardFlow.put("open_status",2); - clientCardFlowMapper.update(cardFlow); + JSONObject cardFlow = sysClientUpayProfileMapper.findInfo(client.getInteger("client_id")); + cardFlow.put("upay_open_status",2); + sysClientUpayProfileMapper.update(cardFlow); } if (manager != null) { saveClientAuditProcess(client.getIntValue("client_id"), 1, 2, "Compliance合同制作中", manager,2); @@ -3430,9 +3432,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (CollectionUtils.isEmpty(existLeffterFiles) && CollectionUtils.isEmpty(existConditionsFiles)) { throw new BadRequestException("The Agree File is not Complete!"); } - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); - cardFlowInfo.put("open_status", 3); - clientCardFlowMapper.update(cardFlowInfo); + JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(client.getInteger("client_id")); + cardFlowInfo.put("upay_open_status", 3); + sysClientUpayProfileMapper.update(cardFlowInfo); saveClientAuditProcess(client.getIntValue("client_id"), 2, 3, "合同制作完成,等待BD处理", manager,2); sendCardCommissionWechatMessage(client); } @@ -4683,18 +4685,18 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } List clientFiles = clientFilesMapper.findClientFile(client.getIntValue("client_id")); if (clientFiles == null || clientFiles.equals("")) { - throw new BadRequestException("The Compliance File Must Be Uploaded!"); + throw new BadRequestException("The Compliance File Must Be Uploaded!"); } JSONObject account = getBankAccountByClientId(client.getIntValue("client_id")); if (account == null) { throw new BadRequestException("The Partner's Bank Account is not config!"); } - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); - int open_status_from = cardFlowInfo.getIntValue("open_status"); - cardFlowInfo.put("approve_time",new Date()); - cardFlowInfo.put("approve_result",4); - cardFlowInfo.put("open_status", 4); - clientCardFlowMapper.update(cardFlowInfo); + JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(client.getInteger("client_id")); + int open_status_from = cardFlowInfo.getIntValue("upay_open_status"); + cardFlowInfo.put("upay_approve_time",new Date()); + cardFlowInfo.put("upay_approve_result",4); + cardFlowInfo.put("upay_open_status", 4); + sysClientUpayProfileMapper.update(cardFlowInfo); saveClientAuditProcess(client.getIntValue("client_id"), open_status_from, 4, "BD完成签字提交compliance审核", manager,2); if (manager != null) { sendCardCommissionWechatMessage(client); @@ -4758,23 +4760,23 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new BadRequestException("The Partner's Rpaypmt Card Rate is not config!"); } - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); + JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(clientId); if(null != cardFlowInfo){ JSONObject cardFlow = new JSONObject(){{ put("client_id",clientId); - put("approve_result",4); - put("open_status",1); - put("approve_time",new Date()); + put("upay_approve_result",4); + put("upay_open_status",1); + put("upay_approve_time",new Date()); }}; - clientCardFlowMapper.update(cardFlow); + sysClientUpayProfileMapper.save(cardFlow); }else{ JSONObject cardFlow = new JSONObject(){{ put("client_id",clientId); - put("open_status",1); - put("approve_result",4); - put("approve_time",new Date()); + put("upay_open_status",1); + put("upay_approve_result",4); + put("upay_approve_time",new Date()); }}; - clientCardFlowMapper.save(cardFlow); + sysClientUpayProfileMapper.save(cardFlow); } saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Compliance制作合同", manager,2); @@ -5150,26 +5152,26 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new InvalidShortIdException(); } Integer clientId = client.getInteger("client_id"); - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(clientId); + JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(clientId); Integer open_status = null; if(null != cardFlowInfo){ - open_status = cardFlowInfo.getIntValue("open_status"); + open_status = cardFlowInfo.getIntValue("upay_open_status"); if (open_status == 1) { - cardFlowInfo.put("open_status",null); + cardFlowInfo.put("upay_open_status",null); } else { - cardFlowInfo.put("open_status",open_status - 1); + cardFlowInfo.put("upay_open_status",open_status - 1); } - if ( cardFlowInfo.getIntValue("approve_result") == 4 || client.getIntValue("source") == 4) { - cardFlowInfo.put("approve_result",5); + if ( cardFlowInfo.getIntValue("upay_approve_result") == 4 || client.getIntValue("source") == 4) { + cardFlowInfo.put("upay_approve_result",5); } if (refuse_remark != null && !refuse_remark.isEmpty()) { - cardFlowInfo.put("refuse_remark",refuse_remark); + cardFlowInfo.put("upay_refuse_remark",refuse_remark); } }else{ - cardFlowInfo.put("open_status",null); + cardFlowInfo.put("upay_open_status",null); } saveClientAuditProcess(client.getIntValue("client_id"), open_status, cardFlowInfo.getIntValue("open_status"), "打回," + refuse_remark, manager,2); - clientCardFlowMapper.update(cardFlowInfo); + sysClientUpayProfileMapper.update(cardFlowInfo); try { if (client.getIntValue("source") == 4) { @@ -5713,11 +5715,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid String bd_user_name = client.getString("bd_user_name"); String client_moniker = "[" + client.getString("client_moniker") + "]"; String short_name = client.getString("short_name"); - JSONObject cardFlowInfo = clientCardFlowMapper.findClient(client.getInteger("client_id")); + JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(client.getInteger("client_id")); if(null == cardFlowInfo){ return; } - if (cardFlowInfo.getIntValue("open_status") == 1) { + if (cardFlowInfo.getIntValue("upay_open_status") == 1) { List complianceList = managerMapper.getOnlyCompliance(); if (complianceList != null && complianceList.size() > 0) { for (JSONObject compliance : complianceList) { @@ -5735,7 +5737,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } return; } - if (cardFlowInfo.getIntValue("open_status") == 3) { + if (cardFlowInfo.getIntValue("upay_open_status") == 3) { List bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); for (JSONObject bd : bds) { String wxopenid = bd.getString("wx_openid"); @@ -5755,7 +5757,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } return; } - if (cardFlowInfo.getIntValue("open_status") == 4) { + if (cardFlowInfo.getIntValue("upay_open_status") == 4) { if (client.getIntValue("source") == 4 && !StringUtils.isNotEmpty(bd_user_name)) { bd_user_name = "自助开通商户"; } @@ -5778,7 +5780,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } return; } - if (cardFlowInfo.getIntValue("open_status") == 5) { + if (cardFlowInfo.getIntValue("upay_open_status") == 5) { List bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); for (JSONObject bd : bds) { String wxopenid = bd.getString("wx_openid"); diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index 086d71004..3e964120b 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml @@ -38,11 +38,17 @@ order by display_name SELECT cr.*,c.clean_days c_clean_days FROM sys_client_rates cr INNER JOIN sys_clients c on c.client_id= cr.client_id and c.is_valid = 1 - INNER JOIN sys_clients_card_flow cf ON cf.client_id = c.client_id AND ( cf.approve_result = 4 AND cf.open_status NOT IN (0,5) ) + INNER JOIN sys_clients_card_flow cf ON cf.client_id = c.client_id AND ( cf.approve_result 4 AND cf.open_status NOT IN (0,5) ) where cr.client_id = #{client_id} and cr.rate_name = #{rate_name} order by cr.expiry_time desc diff --git a/src/main/ui/static/commons/templates/promotiona_commit.html b/src/main/ui/static/commons/templates/promotiona_commit.html new file mode 100644 index 000000000..1ee5f2610 --- /dev/null +++ b/src/main/ui/static/commons/templates/promotiona_commit.html @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 58f007f79..f29f5c844 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -424,6 +424,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.isComplianceOfCompanyName = false; $scope.isComplianceOfShortName = false; $scope.isComplianceOfBusinessStructure = false; + $scope.cardPromotionaparams={} var website = partner.data.company_website; if (website != null) { if (website.indexOf('http') != 0) { @@ -685,12 +686,15 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter //制作促销合同 $scope.exportCardPromotionaAgreegatePDF = function(){ - var title = 'Warning'; - $scope.cardPromotionaparams={} - var contentHtml = $sce.trustAsHtml('请选择优惠生效日:'+ '
    ' + - ' 请输入活动周期: '); + var title = '确认生成Promotional Offer合同'; + var promotiona_date=''; + var promotiona_period =''; + var contentHtml = $sce.trustAsHtml( + '请输入优惠生成日: '+ + ' (eg: 2020-02-01)' + + '
    ' + + '请输入活动周期数: ' + + ' (unit:week)'); var choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, {label: '确认提交', className: 'btn-success', key: '1'}]; var content = ''; @@ -701,8 +705,12 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter choises: choises, contentHtml: contentHtml }).then(function (res) { - if(params != null){ - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_promotiona_agree_pdf').then(function () { + var date = document.getElementById("promotiona_date").value; + var period = document.getElementById("promotiona_period").value; + if(date=='' || period==''){ + commonDialog.alert({title: 'Error', content: '选项不得未空', type: 'error'}); + }else{ + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_promotiona_agree_pdf?date='+date+'&period='+period).then(function () { commonDialog.alert({ title: 'Success', content: 'Agreement File Generate Succeed! Please notify BD!', @@ -716,8 +724,8 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }); } - }); + }); } $scope.Export = function () { From 22e8956d3415ac00270e2c07ae1aa43b1628a6f0 Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 15:42:28 +0800 Subject: [PATCH 032/110] fix --- .../payment/manage/mappers/system/ClientMapper.xml | 12 ++++++------ .../manage/mappers/system/ClientRateMapper.xml | 4 ++-- src/main/ui/static/payment/partner/partner-manage.js | 10 +++++----- .../static/payment/partner/templates/partners.html | 7 ++++--- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index 3e964120b..dbdfc3ffb 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml @@ -141,20 +141,20 @@ OR (c.client_id NOT IN ( - SELECT client_id FROM sys_clients_card_flow + SELECT client_id FROM sys_client_upay_profile ) OR c.client_id IN ( - SELECT client_id FROM sys_clients_card_flow AS cardFlow - WHERE cardFlow.approve_result = 4 or approve_result = 1 + SELECT client_id FROM sys_client_upay_profile AS cardFlow + WHERE cardFlow.upay_approve_result = 4 or upay_approve_result = 1 )) AND (c.client_id NOT IN ( - SELECT client_id FROM sys_clients_card_flow + SELECT client_id FROM sys_client_upay_profile ) OR c.client_id IN ( - SELECT client_id FROM sys_clients_card_flow AS cardFlow - WHERE cardFlow.approve_result = 4 or approve_result = 1 + SELECT client_id FROM sys_client_upay_profile AS cardFlow + WHERE cardFlow.upay_approve_result = 4 or upay_approve_result = 1 )) diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml index 3ab0d1fd2..469b5d65a 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.xml @@ -180,7 +180,7 @@ - \ No newline at end of file + diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index f29f5c844..daa561021 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -690,13 +690,13 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter var promotiona_date=''; var promotiona_period =''; var contentHtml = $sce.trustAsHtml( - '请输入优惠生成日: '+ - ' (eg: 2020-02-01)' + + '请输入优惠开始日期(eg:2020-02-01): '+ + '' + '
    ' + - '请输入活动周期数: ' + - ' (unit:week)'); + '请输入活动周数(unit:week): ' + + ''); var choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, - {label: '确认提交', className: 'btn-success', key: '1'}]; + {label: '确认生成', className: 'btn-success', key: '1'}]; var content = ''; $scope.showCardPromotionaBg = true; commonDialog.confirm({ diff --git a/src/main/ui/static/payment/partner/templates/partners.html b/src/main/ui/static/payment/partner/templates/partners.html index 0b66ae73e..f2f38480f 100644 --- a/src/main/ui/static/payment/partner/templates/partners.html +++ b/src/main/ui/static/payment/partner/templates/partners.html @@ -487,7 +487,7 @@ -
    +
    通过({{partner.approve_time}}) 资料完善中 @@ -502,10 +502,11 @@ 绿色通道申请中 等待合规
    -
    + +
    资料完善中
    -
    +
    通过({{partner.upay_approve_time}}) 资料完善中 From b12b62f73efec281493e03503fe4bb847235f77a Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 16:28:31 +0800 Subject: [PATCH 033/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/ClientManagerImpl.java | 32 +++---- src/main/ui/static/boot/manager-bootv2.js | 4 +- .../static/payment/partner/partner-manage.js | 2 +- .../partner/templates/partner_detail.html | 86 +++++++++---------- .../templates/partner_mw_auth_files.html | 3 + 5 files changed, 59 insertions(+), 68 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 60d784df4..7fedfb0f9 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -4762,24 +4762,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } JSONObject cardFlowInfo = sysClientUpayProfileMapper.findInfo(clientId); - if(null != cardFlowInfo){ - JSONObject cardFlow = new JSONObject(){{ - put("client_id",clientId); - put("upay_approve_result",4); - put("upay_open_status",1); - put("upay_approve_time",new Date()); - }}; - sysClientUpayProfileMapper.save(cardFlow); - }else{ - JSONObject cardFlow = new JSONObject(){{ - put("client_id",clientId); - put("upay_open_status",1); - put("upay_approve_result",4); - put("upay_approve_time",new Date()); - }}; - sysClientUpayProfileMapper.save(cardFlow); - } - + JSONObject cardFlow = new JSONObject(){{ + put("client_id",clientId); + put("upay_approve_result",4); + put("upay_open_status",1); + put("upay_approve_time",new Date()); + }}; + sysClientUpayProfileMapper.update(cardFlow); saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Compliance制作合同", manager,2); } @@ -7356,7 +7345,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } //获取数据源 int clientId = client.getInteger("client_id"); - JSONObject clientRate = clientRateMapper.latestCardChannelCleanDays("rpaypmt_card", clientId); + JSONObject clientRate = merchantInfoProvider.clientCurrentRate(clientId, new Date(), "rpaypmt_card"); if (clientRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } @@ -7372,7 +7361,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid info.put("partner_state", client.getString("state"));//洲 info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 info.put("clean_days", client.getInteger("clean_days"));//T+规则清算天数 - info.put("partner_industry_mcc", upayProfileInfo.getString("mv_industy"));//信用卡注册商户行业编码 + info.put("partner_industry_mcc", upayProfileInfo.getString("mv_industry"));//信用卡注册商户行业编码 info.put("legal_bussiness", client.getString("contact_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 info.put("annual_rate",cardAnnualRate);//年费率 info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 @@ -7405,12 +7394,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new BadRequestException("The merchant failed the audit!"); } int clientId = client.getInteger("client_id"); - JSONObject clientRate = clientRateMapper.latestCardChannelCleanDays("rpaypmt_card", clientId); + JSONObject clientRate = merchantInfoProvider.clientCurrentRate(clientId, new Date(), "rpaypmt_card"); if (clientRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } JSONObject cardRate = clientRate.getJSONObject("ext_rates"); - JSONObject bankAccountInfo = clientBankAccountMapper.clientBankAccounts(clientId).get(0); JSONObject info = new JSONObject(); info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 diff --git a/src/main/ui/static/boot/manager-bootv2.js b/src/main/ui/static/boot/manager-bootv2.js index c592cbe37..fec641d86 100644 --- a/src/main/ui/static/boot/manager-bootv2.js +++ b/src/main/ui/static/boot/manager-bootv2.js @@ -76,8 +76,8 @@ require(['angular', 'jquery'], function (angular, $) { }); function boot(user) { - var paths = ['static/boot/managerMainAppv2', 'static/menu/managerMenu','static/analysis/org/analysis-org', 'static/analysis/report/analysis-report', 'static/analysis/monitoring/analysis-monitoring', 'static/analysis/bd/analysis-bd','static/analysis/trans-analysis']; - var moduleNames = ['managerMainAppv2', 'listMenuApp','analysisTransaction', 'analysisBD', 'analysisOrg', 'analysisMonitoring', 'analysisReport']; + var paths = ['static/boot/managerMainAppv2', 'static/menu/managerMenu','static/analysis/org/analysis-org', 'static/analysis/report/analysis-report', 'static/analysis/monitoring/analysis-monitoring', 'static/analysis/bd/analysis-bd','static/analysis/trans-analysis','static/payment/partner/add-partner']; + var moduleNames = ['managerMainAppv2', 'listMenuApp','analysisTransaction', 'analysisBD', 'analysisOrg', 'analysisMonitoring', 'analysisReport','addPartnerApp']; window.currentUser = user; angular.forEach(user.modules, function (mod) { paths.push(mod.js_path); diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index f29f5c844..524509d01 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -593,7 +593,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter choises: choises, contentHtml: contentHtml }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_promotiona_agree_pdf', {pass: 1}).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit', {pass: 1}).then(function () { if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { commonDialog.alert({ title: 'Success', diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 7c83452cd..9e86ff7c5 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -238,27 +238,27 @@

    - Compliance (Refused :{{partner.refuse_remark}}) - (The Partner Using Green Channel Now!) 【目前状态】- - (自助申请)资料完善中 - (自助申请)已开通 - (自助申请)快速开通等待提交合规材料 - (自助申请)待审核(材料已提交) + (自助申请)资料完善中 + (自助申请)已开通 + (自助申请)快速开通等待提交合规材料 + (自助申请)待审核(材料已提交) - 资料完善中 - 待审核(合同制作中) - 合同制作完成 - BD处理中 - 待审核(合规文件已提交) - 通过 - 不通过 + 资料完善中 + 待审核(合同制作中) + 合同制作完成 + BD处理中 + 待审核(合规文件已提交) + 通过 + 不通过 (已禁用)

    @@ -267,20 +267,20 @@
    -
    +
    - -
    @@ -293,8 +293,8 @@ 下载Promotional Offer合同 - - + Notify BD @@ -310,11 +310,11 @@
    @@ -325,50 +325,50 @@
    + ng-class="{'box-warning':partner.upay_approve_result!=5,'box-danger':partner.upay_approve_result==5}">
    -

    Operation +

    Operation (Refused - :{{partner.card_flow_info.refuse_remark}} + :{{partner.upay_refuse_remark}} )(The Partner Using Green Channel Now!) 【目前状态】- - 资料完善中 - 待审核(合同制作中) - 合同制作完成 - BD处理中 - 待审核(合规文件已提交) - 通过 - 不通过 - 绿色通道申请中 + 资料完善中 + 待审核(合同制作中) + 合同制作完成 + BD处理中 + 待审核(合规文件已提交) + 通过 + 不通过 + 绿色通道申请中

    - 下载Letter Of Offer合同 - 下载Terms And Conditions合同 - 下载Promotional Offer合同 -
    +
    -
    +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index 64e766aa7..33e4f82aa 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -254,3 +254,6 @@
    +
    + check +
    \ No newline at end of file From b53bba9e2e7ade696db4ce8f87938477f5152bbb Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 17:14:11 +0800 Subject: [PATCH 034/110] fix edit rate --- .../manage/merchants/core/impls/ClientManagerImpl.java | 5 +++++ src/main/ui/static/payment/partner/partner-manage.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 7fedfb0f9..ee40d23c2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -2148,6 +2148,11 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid configJson.put("manager_id", manager.getString("manager_id")); configJson.put("manager_name", manager.getString("username")); configJson.put("update_time", new Date()); + if (StringUtils.equalsIgnoreCase("rpaypmt_card", config.getRateName())) { + JSONObject extParams = configJson.getJSONObject("ext_rates"); + extParams.put("domestic_rate_value", config.getRateValue()); + configJson.put("ext_rates", extParams.toJSONString()); + } clientRateMapper.updateConfig(configJson); // if ("Rpay".equals(configJson.getString("rate_name"))) { // rpayApi.modifySurchargeConfig(client); diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index bd2932d21..2d8ee2ea5 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -3337,7 +3337,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }, function (resp) { $scope.ctrl.sending = false; $scope.errmsg = resp.data.message; - }) + }); } else { $http.post('/sys/partners/' + clientMoniker + '/rates', $scope.rate).then(function () { $scope.ctrl.sending = false; @@ -3345,7 +3345,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }, function (resp) { $scope.ctrl.sending = false; $scope.errmsg = resp.data.message; - }) + }); } } }]); From 6956fb0dc520edad2116450c86ea36d641624641 Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 17:17:39 +0800 Subject: [PATCH 035/110] =?UTF-8?q?fix=20=E9=A3=8E=E9=99=A9=E7=AD=89?= =?UTF-8?q?=E7=BA=A7=E5=8F=AA=E5=85=81=E8=AE=B8=E5=90=88=E8=A7=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/partner/templates/partner_mw_auth_files.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index 33e4f82aa..d5f0666a5 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -13,7 +13,7 @@

    Merchant Warrior商户风险评级 - +

    @@ -256,4 +256,4 @@
    \ No newline at end of file +
    From d3ccf5f984f458c20dfadc80e5c36840df8f7823 Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 17:54:49 +0800 Subject: [PATCH 036/110] =?UTF-8?q?add=20=E5=90=88=E8=A7=84=E6=9D=90?= =?UTF-8?q?=E6=96=99=E4=B8=8A=E4=BC=A0=E6=9D=83=E9=99=90=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/partner_cp_auth_files.html | 24 +++++++++---------- .../templates/partner_mw_auth_files.html | 22 ++++++++--------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html index 2c927ce0e..25b334899 100644 --- a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html @@ -112,7 +112,7 @@
    - @@ -130,7 +130,7 @@ - + @@ -152,7 +152,7 @@
    - @@ -167,7 +167,7 @@ - + @@ -194,7 +194,7 @@
    - @@ -210,7 +210,7 @@ - + @@ -238,7 +238,7 @@
    - @@ -254,7 +254,7 @@ - + @@ -275,7 +275,7 @@
    - @@ -291,7 +291,7 @@ - + @@ -311,7 +311,7 @@
    - @@ -330,7 +330,7 @@ - diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index d5f0666a5..f522ad69f 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -69,7 +69,7 @@
    - @@ -86,7 +86,7 @@
    - @@ -103,7 +103,7 @@
    - @@ -120,7 +120,7 @@
    - @@ -137,7 +137,7 @@
    - @@ -154,7 +154,7 @@
    - @@ -171,7 +171,7 @@
    - @@ -188,7 +188,7 @@
    - @@ -205,7 +205,7 @@
    - @@ -222,7 +222,7 @@
    - @@ -239,7 +239,7 @@
    - From 0984e606e29549cc81fd1db1cddb2f1dc690703e Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 17:55:30 +0800 Subject: [PATCH 037/110] fix common --- src/main/resources/application-common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-common.yml b/src/main/resources/application-common.yml index f508af2eb..238e4f272 100644 --- a/src/main/resources/application-common.yml +++ b/src/main/resources/application-common.yml @@ -64,7 +64,7 @@ spring: time-between-eviction-runs-millis: 500 validation-query: select 1 mail: - host: smtp.o11ffice365.com + host: smtp.office365.com port: 587 thymeleaf: mode: HTML From 3b84cf18b6336a669ea4909b47a0e367f982b78e Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 17:58:16 +0800 Subject: [PATCH 038/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/ClientManagerImpl.java | 22 ++++++++++-------- .../templates/pdf/letter_of_offer.pdf | Bin 187904 -> 186807 bytes 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index ee40d23c2..f0befed9a 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -5675,7 +5675,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid try { TemplateMessage msg = initTaskFinishTemplate(wxopenid, client_moniker + "已正式开通", "Compliance审核通过", ""); MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); - paymentApi.sendTemplateMessage(msg); +// paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=5" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=5,openid=" + wxopenid)); @@ -5723,7 +5723,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), "BD申请制作信用卡支付合同" + client_moniker, bd_user_name, "制作卡支付合同申请", "BD申请制作" + short_name + "的卡支付合同"); - paymentApi.sendTemplateMessage(msg); +// paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=1" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=1,openid=" + wxopenid)); @@ -5741,7 +5741,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "信用卡支付合同制作完成", "Compliance", "合规材料", "上传完整合规材料,商户:" + short_name); - paymentApi.sendTemplateMessage(msg); +// paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=3" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=3,openid=" + wxopenid)); @@ -5764,7 +5764,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "信用卡卡支付合规材料已提交", bd_user_name, "审核材料", "已提交合规材料,等待审核"); - paymentApi.sendTemplateMessage(msg); +// paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=1" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=1,openid=" + wxopenid)); @@ -5783,7 +5783,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid try { TemplateMessage msg = initTaskFinishTemplate(wxopenid, client_moniker + "已正式开通", "Card Payment Compliance审核通过", ""); MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); - paymentApi.sendTemplateMessage(msg); +// paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=5" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=5,openid=" + wxopenid)); @@ -7357,17 +7357,18 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid JSONObject cardRate = clientRate.getJSONObject("ext_rates"); JSONObject bankAccountInfo = clientBankAccountMapper.clientBankAccounts(clientId).get(0); JSONObject upayProfileInfo = sysClientUpayProfileMapper.findInfo(clientId); + JSONObject legalInfo = sysClientLegalPersonMapper.findRepresentativeInfo(clientId); //装在数据 JSONObject info = new JSONObject(); info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 - info.put("bussiness_name", (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN");//商圈类型 + info.put("bussiness_name", (client.containsKey("business_name")?client.getString("business_name"):legalInfo.getString("representative_person")) + " "+client.getString("abn"));//商圈类型 info.put("partner_address", client.getString("address"));//商家店铺地址 info.put("partner_country", client.getString("country"));//国家 info.put("partner_state", client.getString("state"));//洲 info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 info.put("clean_days", client.getInteger("clean_days"));//T+规则清算天数 - info.put("partner_industry_mcc", upayProfileInfo.getString("mv_industry"));//信用卡注册商户行业编码 - info.put("legal_bussiness", client.getString("contact_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 + info.put("partner_industry_mcc", upayProfileInfo.getString("mw_industry"));//信用卡注册商户行业编码 + info.put("legal_bussiness", legalInfo.getString("representative_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):legalInfo.getString("representative_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 info.put("annual_rate",cardAnnualRate);//年费率 info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 @@ -7404,15 +7405,16 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new BadRequestException("rpaypmt_card rate Not configured"); } JSONObject cardRate = clientRate.getJSONObject("ext_rates"); + JSONObject legalInfo = sysClientLegalPersonMapper.findRepresentativeInfo(clientId); JSONObject info = new JSONObject(); info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 - info.put("bussiness_name", (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN");//商圈类型 + info.put("bussiness_name", (client.containsKey("business_name")?client.getString("business_name"):legalInfo.getString("representative_person")) + " "+client.getString("abn"));//商圈类型 info.put("partner_address", client.getString("address"));//商家店铺地址 info.put("partner_country", client.getString("country"));//国家 info.put("partner_state", client.getString("state"));//洲 info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 - info.put("legal_bussiness", client.getString("contact_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):client.getString("contact_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 + info.put("legal_bussiness", legalInfo.getString("representative_person") + " AS " + (client.containsKey("business_name")?client.getString("business_name"):legalInfo.getString("representative_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 info.put("promotional_effective_date", promotionalEffectiveDate); diff --git a/src/main/resources/templates/pdf/letter_of_offer.pdf b/src/main/resources/templates/pdf/letter_of_offer.pdf index ec8454d9176adb2e2b7bfc77d94c21c1594e6c07..2aa701a83747f56cb97fad26dcfc00e6285dfcc9 100644 GIT binary patch delta 51073 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 delta 52277 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�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 WbhL(oWJDZr4>hy?ex#)%fW}|ZuEOL1 From 5e8ac09f23a43aff814081b4aa74a8b61f54736b Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 17:59:42 +0800 Subject: [PATCH 039/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/static/payment/partner/templates/partner_detail.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 9e86ff7c5..9cb68dda6 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -268,10 +268,8 @@
    - - - 制作卡支付合同 + 制作信用卡支付合同 制作促销合同
    From 85ae04c0cd06b2eb229b539de37c9a5b15ef2e5b Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 18:00:43 +0800 Subject: [PATCH 040/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/static/payment/partner/templates/partner_detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 9cb68dda6..4cd4b5a2c 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -1303,7 +1303,7 @@
    From eabb8cba1200d8100e614ee2828a7ca2cbe798f5 Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 18:02:59 +0800 Subject: [PATCH 041/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../merchants/core/impls/ClientManagerImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index f0befed9a..3b6809dad 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -4745,7 +4745,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientModifySupport.processClientModify(openStatusModify); saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Card Payment Compliance制作合同", manager,1); if (manager != null) { - // sendAgreeFileMsgtoCompliance(client, manager.getString("display_name")); + sendAgreeFileMsgtoCompliance(client, manager.getString("display_name")); sendCommissionWechatMessage(client); } } @@ -5675,7 +5675,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid try { TemplateMessage msg = initTaskFinishTemplate(wxopenid, client_moniker + "已正式开通", "Compliance审核通过", ""); MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); -// paymentApi.sendTemplateMessage(msg); + paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=5" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=5,openid=" + wxopenid)); @@ -5723,7 +5723,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), "BD申请制作信用卡支付合同" + client_moniker, bd_user_name, "制作卡支付合同申请", "BD申请制作" + short_name + "的卡支付合同"); -// paymentApi.sendTemplateMessage(msg); + paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=1" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=1,openid=" + wxopenid)); @@ -5741,7 +5741,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "信用卡支付合同制作完成", "Compliance", "合规材料", "上传完整合规材料,商户:" + short_name); -// paymentApi.sendTemplateMessage(msg); + paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=3" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=3,openid=" + wxopenid)); @@ -5764,7 +5764,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); TemplateMessage msg = initSendCommissionTemplate(wxopenid, paymentApi.getTemplateId("commission"), client_moniker + "信用卡卡支付合规材料已提交", bd_user_name, "审核材料", "已提交合规材料,等待审核"); -// paymentApi.sendTemplateMessage(msg); + paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=1" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=1,openid=" + wxopenid)); @@ -5783,7 +5783,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid try { TemplateMessage msg = initTaskFinishTemplate(wxopenid, client_moniker + "已正式开通", "Card Payment Compliance审核通过", ""); MpWechatApi paymentApi = mpWechatApiProvider.getNewPaymentApi(); -// paymentApi.sendTemplateMessage(msg); + paymentApi.sendTemplateMessage(msg); } catch (WechatException e) { logger.error("Wechat Message Error,open_status=5" + e.getMessage()); publisher.publishEvent(new WechatExceptionEvent(this, e, "Audit,open_status=5,openid=" + wxopenid)); From 4643a9ffa8e689404cb2fdbacde990a144aef5cb Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 18:04:37 +0800 Subject: [PATCH 042/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/manage/merchants/core/impls/ClientManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 3b6809dad..6b667a1ad 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -4745,7 +4745,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientModifySupport.processClientModify(openStatusModify); saveClientAuditProcess(client.getIntValue("client_id"), null, 1, "提交Card Payment Compliance制作合同", manager,1); if (manager != null) { - sendAgreeFileMsgtoCompliance(client, manager.getString("display_name")); +// sendAgreeFileMsgtoCompliance(client, manager.getString("display_name")); sendCommissionWechatMessage(client); } } From c0710d4f3826af6dca950713c7e7df05c278d6ea Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 18:08:10 +0800 Subject: [PATCH 043/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/ui/static/payment/partner/partner-manage.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 2d8ee2ea5..c363162d4 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -668,17 +668,17 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter //制作卡支付合同 $scope.exportCardAgreegatePDF = function(){ - $scope.showCardBg = true; + $scope.showBg = true; $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_agree_pdf').then(function () { commonDialog.alert({ title: 'Success', content: 'Agreement File Generate Succeed! Please notify BD!', type: 'success' }); - $scope.showCardBg = false; + $scope.showBg = false; $state.reload(); }, function (resp) { - $scope.showCardBg = false; + $scope.showBg = false; $state.reload(); commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }); @@ -698,7 +698,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter var choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, {label: '确认生成', className: 'btn-success', key: '1'}]; var content = ''; - $scope.showCardPromotionaBg = true; + $scope.showBg = true; commonDialog.confirm({ title: title, content: content, @@ -716,10 +716,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter content: 'Agreement File Generate Succeed! Please notify BD!', type: 'success' }); - $scope.showCardPromotionaBg = false; + $scope.showBg = false; $state.reload(); }, function (resp) { - $scope.showCardPromotionaBg = false; + $scope.showBg = false; $state.reload(); commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }); From b94cad3e5f5adcf47590bb4aba81c39f924c714f Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 19:16:49 +0800 Subject: [PATCH 044/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/static/payment/partner/partner-manage.js | 3 ++- .../partner/templates/partner_bankaccounts.html | 2 +- .../payment/partner/templates/partner_detail.html | 13 +++++-------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index c363162d4..199dc4bb3 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -698,13 +698,14 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter var choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, {label: '确认生成', className: 'btn-success', key: '1'}]; var content = ''; - $scope.showBg = true; + commonDialog.confirm({ title: title, content: content, choises: choises, contentHtml: contentHtml }).then(function (res) { + $scope.showBg = true; var date = document.getElementById("promotiona_date").value; var period = document.getElementById("promotiona_period").value; if(date=='' || period==''){ diff --git a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html index 81a134cc8..9ff619fa9 100644 --- a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html +++ b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html @@ -214,7 +214,7 @@
  • CB_BankPay
  • Card Payment
  • Direct Debit
  • - diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 4cd4b5a2c..5a7e44e87 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -60,10 +60,9 @@
    -
    -

    Compliance Cross-border payment Compliance (Refused :{{partner.refuse_remark}}) @@ -238,12 +237,10 @@

    - Compliance (Refused - :{{partner.refuse_remark}}) - (The Partner Using Green Channel Now!) + Card Payment Compliance + (Refused + :{{partner.upay_refuse_remark}}) + 【目前状态】- (自助申请)资料完善中 From f6cbf6b35d038620365c99f7cdfd0a3135b92df7 Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 19:20:48 +0800 Subject: [PATCH 045/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/ui/static/boot/manager-bootv2.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/boot/manager-bootv2.js b/src/main/ui/static/boot/manager-bootv2.js index fec641d86..c592cbe37 100644 --- a/src/main/ui/static/boot/manager-bootv2.js +++ b/src/main/ui/static/boot/manager-bootv2.js @@ -76,8 +76,8 @@ require(['angular', 'jquery'], function (angular, $) { }); function boot(user) { - var paths = ['static/boot/managerMainAppv2', 'static/menu/managerMenu','static/analysis/org/analysis-org', 'static/analysis/report/analysis-report', 'static/analysis/monitoring/analysis-monitoring', 'static/analysis/bd/analysis-bd','static/analysis/trans-analysis','static/payment/partner/add-partner']; - var moduleNames = ['managerMainAppv2', 'listMenuApp','analysisTransaction', 'analysisBD', 'analysisOrg', 'analysisMonitoring', 'analysisReport','addPartnerApp']; + var paths = ['static/boot/managerMainAppv2', 'static/menu/managerMenu','static/analysis/org/analysis-org', 'static/analysis/report/analysis-report', 'static/analysis/monitoring/analysis-monitoring', 'static/analysis/bd/analysis-bd','static/analysis/trans-analysis']; + var moduleNames = ['managerMainAppv2', 'listMenuApp','analysisTransaction', 'analysisBD', 'analysisOrg', 'analysisMonitoring', 'analysisReport']; window.currentUser = user; angular.forEach(user.modules, function (mod) { paths.push(mod.js_path); From 3e151f1ef8916fef7fd91eb740c7e5a3f8c4c11a Mon Sep 17 00:00:00 2001 From: luoyang Date: Tue, 28 Apr 2020 19:53:41 +0800 Subject: [PATCH 046/110] fix --- .../merchants/beans/ClientRegisterInfo.java | 28 +++++----- .../core/impls/ClientManagerImpl.java | 8 ++- .../ui/static/payment/partner/add-partner.js | 11 +++- .../partner/templates/add_partner.html | 53 +++++++++---------- .../partner/templates/partner_edit.html | 47 ++++++++-------- .../templates/partner_payment_info.html | 24 --------- 6 files changed, 79 insertions(+), 92 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java index e6d7d0dbe..e7764f981 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/beans/ClientRegisterInfo.java @@ -3,7 +3,6 @@ package au.com.royalpay.payment.manage.merchants.beans; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.annotation.JSONField; -import org.apache.commons.lang3.StringUtils; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; @@ -115,8 +114,6 @@ public class ClientRegisterInfo { private String client_pay_desc; @JSONField(name = "it_contact_person_email") private String itContactPersonEmail; - @JSONField(name = "client_type") - private String clientType; @JSONField(name = "acceptor_name") private String acceptorName; @JSONField(name = "expected_card_revenue") @@ -127,7 +124,10 @@ public class ClientRegisterInfo { private String mwIndustry; @JSONField(name = "enable_international_card") private boolean enableInternaltionCard; - + @JSONField(name = "enable_cross_payment") + private boolean enableCrossPayment; + @JSONField(name = "enable_card_payment") + private boolean enableCardPayment; public JSONObject insertObject() { if (industry == null) { @@ -140,10 +140,6 @@ public class ClientRegisterInfo { return res; } - public boolean enableCardPayment() { - return StringUtils.equalsIgnoreCase("card-payment", clientType) || StringUtils.equalsIgnoreCase("all", clientType); - } - public JSONObject updateObject() { JSONObject obj = insertObject(); obj.remove("client_moniker"); @@ -622,11 +618,19 @@ public class ClientRegisterInfo { this.mwIndustry = mwIndustry; } - public String getClientType() { - return clientType; + public boolean isEnableCardPayment() { + return enableCardPayment; + } + + public boolean isEnableCrossPayment() { + return enableCrossPayment; + } + + public void setEnableCardPayment(boolean enableCardPayment) { + this.enableCardPayment = enableCardPayment; } - public void setClientType(String clientType) { - this.clientType = clientType; + public void setEnableCrossPayment(boolean enableCrossPayment) { + this.enableCrossPayment = enableCrossPayment; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 6b667a1ad..05ec8fbfa 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -834,11 +834,13 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientConfig.put("client_moniker", partner.getString("client_moniker")); clientConfig.put("client_pay_type", partner.getString("client_pay_type")); clientConfig.put("client_pay_desc", partner.get("client_pay_desc")); + clientConfig.put("enable_cross_payment", partner.get("enable_cross_payment")); + clientConfig.put("enable_card_payment", partner.get("enable_card_payment")); clientConfigService.save(clientConfig); permissionPartnerManagerImpl.permissionClientModuleSave(partner.getIntValue("client_id"), partner.getString("client_moniker")); saveLegalAndMarketingInfo(partner); - if (registery.enableCardPayment()) { + if (registery.isEnableCardPayment()) { sysClientUpayProfileMapper.save(partner); } } catch (Exception e) { @@ -917,7 +919,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid sysClientLegalPersonMapper.save(representativeInfo); } - if (info.enableCardPayment()) { + if (info.isEnableCardPayment()) { JSONObject upay = sysClientUpayProfileMapper.findInfo(clientId); if (upay == null) { sysClientUpayProfileMapper.save(updateInfo); @@ -942,6 +944,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid JSONObject clientConfig = new JSONObject(); clientConfig.put("client_id", clientId); clientConfig.put("client_moniker", client.getString("client_moniker")); + clientConfig.put("enable_cross_payment", updateInfo.getBooleanValue("enable_cross_payment")); + clientConfig.put("enable_card_payment", updateInfo.getBooleanValue("enable_card_payment")); if (StringUtils.isNotBlank(updateInfo.getString("client_pay_type")) && StringUtils.isNotBlank(updateInfo.getString("client_pay_desc"))) { clientConfig.put("client_pay_type", updateInfo.getString("client_pay_type")); clientConfig.put("client_pay_desc", updateInfo.getString("client_pay_desc")); diff --git a/src/main/ui/static/payment/partner/add-partner.js b/src/main/ui/static/payment/partner/add-partner.js index 8f2e8ae34..821e49bd0 100644 --- a/src/main/ui/static/payment/partner/add-partner.js +++ b/src/main/ui/static/payment/partner/add-partner.js @@ -38,7 +38,8 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } else { $scope.partner = {timezone: 'Australia/Melbourne'}; } - $scope.partner.client_type = 'cross-border'; + $scope.partner.enable_cross_payment = true; + $scope.partner.enable_cross_payment = false; $scope.initMerchantCode = function () { $http.get('/sys/partners/init/merchant_code').then(function (response) { $scope.partner.client_moniker = response.data.partner_code; @@ -61,6 +62,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }; $scope.partner.sameAsContactPerson = false; + + $scope.enablePaymentType = function (type) { + $scope.partner[type] = !$scope.partner[type]; + }; $scope.checkboxOnclick = function (){ $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); if($scope.partner.sameAsContactPerson) { @@ -490,6 +495,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.partner.marketing_wechatid = $scope.partner.representativeInfo.marketing_wechatid; } + $scope.enablePaymentType = function (type) { + $scope.partner[type] = !$scope.partner[type]; + }; + function hasRole() { var rolenum; switch (sessionStorage.getItem('role')) { diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 8cdacf735..45deacc9b 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -40,14 +40,11 @@

    -
    @@ -166,7 +163,7 @@

    -
    @@ -188,7 +185,7 @@
    -
    @@ -218,8 +215,8 @@
    - + ng-if="partner.business_structure != 'Company' || partner.enable_card_payment"> +
    + ng-if="partner.business_structure == 'Company' && partner.enable_cross_payment">
    线上 -
    -
    +
    @@ -421,7 +418,7 @@
    -
    +
    @@ -492,7 +489,7 @@
    -
    +
    1:  @@ -524,7 +521,7 @@
    -
    @@ -540,7 +537,7 @@
    -
    @@ -560,7 +557,7 @@
    -
    +
    Alipay Information  (Optional)
    @@ -744,7 +741,7 @@
    -
    +
    @@ -869,9 +866,9 @@
    -
    -
      Marketing Person
    -
    +
    +
      Marketing Person
    +
    @@ -1251,7 +1248,7 @@
    -
    @@ -1270,7 +1267,7 @@
    -
    @@ -1290,7 +1287,7 @@
    -
    @@ -1308,7 +1305,7 @@
    -
    +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index b525a376f..b2bd550f7 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -36,14 +36,11 @@
    -
    @@ -182,7 +179,7 @@
    -
    @@ -201,7 +198,7 @@
    -
    @@ -218,7 +215,7 @@
    -
    @@ -341,7 +338,7 @@ ng-click="toggleClientPayType('1')"> 线上 -
    -
    +
    @@ -408,7 +405,7 @@
    -
    +
    @@ -479,7 +476,7 @@
    -
    +
    1:  @@ -510,7 +507,7 @@
    -
    @@ -526,7 +523,7 @@
    -
    @@ -546,7 +543,7 @@
    -
    +
    Alipay Information   (Optional)
    @@ -671,7 +668,7 @@
    -
    +
    @@ -783,8 +780,8 @@
    -
      Marketing Person
    -
    +
      Marketing Person
    +
    @@ -1157,7 +1154,7 @@
    -
    @@ -1176,7 +1173,7 @@
    -
    @@ -1195,7 +1192,7 @@
    -
    @@ -1213,7 +1210,7 @@
    -
    +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 6d9aff34c..05445da42 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -205,36 +205,12 @@
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    From 1643d25ed2295ca740385757fc9cb7ca6250832e Mon Sep 17 00:00:00 2001 From: dulingling Date: Tue, 28 Apr 2020 19:59:04 +0800 Subject: [PATCH 047/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/ClientManagerImpl.java | 4 ++- .../manage/mappers/system/ClientMapper.xml | 7 ++-- .../partner/templates/partner_detail.html | 13 +++----- .../payment/partner/templates/partners.html | 32 ++++++++++--------- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 6b667a1ad..2c0dda9b0 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -466,7 +466,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("show_all_permission", checkBDPermission > 0); if (checkBDPermission > 0) { JSONObject org = orgMapper.findOne(manager.getIntValue("org_id")); - boolean bdRateEditable = client.getIntValue("approve_result") != 1 || org.getBooleanValue("rate_editable"); + boolean bdRateEditable = client.getIntValue("approve_result") != 1 || + (client.getIntValue("upay_approve_result") !=1 && !client.containsKey("upay_approve_result") && client.getIntValue("upay_approve_result") !=4) + || org.getBooleanValue("rate_editable"); client.put("rate_editable", bdRateEditable); } else { client.put("company_phone", "******"); diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index dbdfc3ffb..c3d60cc83 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml @@ -44,10 +44,13 @@ scup.upay_approve_time, scup.upay_refuse_remark, scup.upay_approve_email_send, - scup.upay_approve_email_id + scup.upay_approve_email_id, + config.enable_cross_payment, + config.enable_card_payment FROM sys_clients c inner join sys_client_config cc on cc.client_id = c.client_id inner join sys_org o on o.org_id=c.org_id + inner join sys_client_config config on c.client_id = config.client_id left join sys_client_upay_profile scup on scup.client_id = c.client_id INNER JOIN sys_client_bd d ON c.client_id = d.client_id AND d.bd_id = #{bd_user} and @@ -417,7 +420,7 @@ from sys_clients 跨境支付|Cross-border Payment
  • - 卡支付|Card Payment + 卡支付|Card Payment
  • diff --git a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html index 9ff619fa9..36ef11d4d 100644 --- a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html +++ b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html @@ -214,9 +214,9 @@
  • CB_BankPay
  • Card Payment
  • Direct Debit
  • - +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index ce2e83288..811b02888 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -363,7 +363,7 @@
    diff --git a/src/main/ui/static/payment/partner/templates/partner_edit.html b/src/main/ui/static/payment/partner/templates/partner_edit.html index b2bd550f7..01afef275 100644 --- a/src/main/ui/static/payment/partner/templates/partner_edit.html +++ b/src/main/ui/static/payment/partner/templates/partner_edit.html @@ -17,6 +17,10 @@ .form-control-span{ height: 34px; } + .check-box { + zoom: 130%; + margin-right: 5px; + }

    @@ -37,10 +41,16 @@ From f019290e2c43c9587156a752846c1c378a9cc0dd Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 12:03:29 +0800 Subject: [PATCH 051/110] =?UTF-8?q?fix=20=E5=90=88=E5=90=8C=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=8C=89=E9=92=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/partner_cp_auth_files.html | 24 +++++++++---------- .../templates/partner_mw_auth_files.html | 24 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html index 25b334899..c1b35090d 100644 --- a/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_cp_auth_files.html @@ -112,7 +112,7 @@
    - @@ -130,7 +130,7 @@
    @@ -152,7 +152,7 @@
    - @@ -167,7 +167,7 @@
    @@ -194,7 +194,7 @@
    - @@ -210,7 +210,7 @@
    @@ -238,7 +238,7 @@
    - @@ -254,7 +254,7 @@
    @@ -275,7 +275,7 @@
    - @@ -291,7 +291,7 @@
    @@ -311,7 +311,7 @@
    - @@ -330,7 +330,7 @@ - diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index dd8df6229..37833aa4b 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -69,7 +69,7 @@
    - @@ -86,7 +86,7 @@
    - @@ -103,7 +103,7 @@
    - @@ -120,7 +120,7 @@
    - @@ -137,7 +137,7 @@
    - @@ -154,7 +154,7 @@
    - @@ -171,7 +171,7 @@
    - @@ -188,7 +188,7 @@
    - @@ -205,7 +205,7 @@
    - @@ -222,7 +222,7 @@
    - @@ -239,7 +239,7 @@
    - @@ -256,7 +256,7 @@
    - From 0eb6734c1dc5d8768ca6d2c3b260019a7ea02564 Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 13:21:50 +0800 Subject: [PATCH 052/110] =?UTF-8?q?fix=20=E6=8A=BC=E9=87=91=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/manage/merchants/core/impls/ClientManagerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 92da4fffa..db524b05b 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -7380,7 +7380,8 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 - info.put("account_reserve", cardAccountReserve);//账户储备金 + BigDecimal reserve = (upayProfileInfo.getBigDecimal("expected_card_revenue").multiply(new BigDecimal(0.005)).setScale(0, RoundingMode.HALF_UP)); + info.put("account_reserve", reserve.compareTo(new BigDecimal(200)) <= 0 ? new BigDecimal(200).toPlainString() : reserve.toPlainString());//账户储备金 //银行账号信息 info.put("account_name", bankAccountInfo.getString("account_name"));// info.put("bsb", bankAccountInfo.getString("bsb_no")); From c300ef933b1e6fd52f637997f883ad75869b4bcd Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 13:23:31 +0800 Subject: [PATCH 053/110] fix yml --- src/main/resources/application-common.yml | 3 +++ src/main/resources/application.yml | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/resources/application-common.yml b/src/main/resources/application-common.yml index 238e4f272..6932e382e 100644 --- a/src/main/resources/application-common.yml +++ b/src/main/resources/application-common.yml @@ -73,3 +73,6 @@ spring: preferred-json-mapper: fastjson stockholder: mails: leo.huang@royalpay.com.au +client_card: + account_reserve: 1000 + annual_rate: 0 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4890b713f..2edc05835 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -68,11 +68,6 @@ app: tax: type: GST -client_card: - account_reserve: 1000 - annual_rate: 0 - - apple: message: apns: From 17c166eb6e7349e16fe174f8ac8ef1d5aa0b94bd Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 13:29:43 +0800 Subject: [PATCH 054/110] fix partner --- src/main/ui/static/payment/partner/add-partner.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/ui/static/payment/partner/add-partner.js b/src/main/ui/static/payment/partner/add-partner.js index ad947fe1d..ac6ad6580 100644 --- a/src/main/ui/static/payment/partner/add-partner.js +++ b/src/main/ui/static/payment/partner/add-partner.js @@ -265,6 +265,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }); return; } + if (!$scope.partner.enable_cross_payment && !$scope.partner.enable_card_payment) { + alert("商户至少开通一种支付方式,请检查是否选择了跨境支付或卡支付!"); + return; + } if ($scope.partner.company_name.indexOf("Migration") != -1) { alert("Company Name包含敏感词汇,请检查后重新提交!"); From 12420c022154eef0afeec3103f608db5bc03c14e Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 13:33:01 +0800 Subject: [PATCH 055/110] fix partner --- src/main/ui/static/boot/manager-bootv2.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/boot/manager-bootv2.js b/src/main/ui/static/boot/manager-bootv2.js index fec641d86..c592cbe37 100644 --- a/src/main/ui/static/boot/manager-bootv2.js +++ b/src/main/ui/static/boot/manager-bootv2.js @@ -76,8 +76,8 @@ require(['angular', 'jquery'], function (angular, $) { }); function boot(user) { - var paths = ['static/boot/managerMainAppv2', 'static/menu/managerMenu','static/analysis/org/analysis-org', 'static/analysis/report/analysis-report', 'static/analysis/monitoring/analysis-monitoring', 'static/analysis/bd/analysis-bd','static/analysis/trans-analysis','static/payment/partner/add-partner']; - var moduleNames = ['managerMainAppv2', 'listMenuApp','analysisTransaction', 'analysisBD', 'analysisOrg', 'analysisMonitoring', 'analysisReport','addPartnerApp']; + var paths = ['static/boot/managerMainAppv2', 'static/menu/managerMenu','static/analysis/org/analysis-org', 'static/analysis/report/analysis-report', 'static/analysis/monitoring/analysis-monitoring', 'static/analysis/bd/analysis-bd','static/analysis/trans-analysis']; + var moduleNames = ['managerMainAppv2', 'listMenuApp','analysisTransaction', 'analysisBD', 'analysisOrg', 'analysisMonitoring', 'analysisReport']; window.currentUser = user; angular.forEach(user.modules, function (mod) { paths.push(mod.js_path); From f5111d47e28f7cfb14f0c098de92c6cf46961303 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 29 Apr 2020 13:36:05 +0800 Subject: [PATCH 056/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E8=A7=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/impls/ClientManagerImpl.java | 6 +++--- .../templates/pdf/letter_of_offer.pdf | Bin 186807 -> 186831 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index db524b05b..75f188080 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -466,9 +466,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("show_all_permission", checkBDPermission > 0); if (checkBDPermission > 0) { JSONObject org = orgMapper.findOne(manager.getIntValue("org_id")); - boolean bdRateEditable = client.getIntValue("approve_result") != 1 || - (client.getIntValue("upay_approve_result") !=1 && !client.containsKey("upay_approve_result") && client.getIntValue("upay_approve_result") !=4) - || org.getBooleanValue("rate_editable"); + boolean bdRateEditable = client.getIntValue("approve_result") != 1 || org.getBooleanValue("rate_editable") || + //开起信用卡支付申请,并且申请结果不是:null.新建 1.通过 4.BD已提交资料状态 + ( !clientConfig.getBoolean("enable_card_payment") && !client.containsKey("upay_approve_result") && client.getIntValue("upay_approve_result") !=1 && client.getIntValue("upay_approve_result") !=4); client.put("rate_editable", bdRateEditable); } else { client.put("company_phone", "******"); diff --git a/src/main/resources/templates/pdf/letter_of_offer.pdf b/src/main/resources/templates/pdf/letter_of_offer.pdf index 2aa701a83747f56cb97fad26dcfc00e6285dfcc9..a6a8a6ade7a40a602f0dfebda5fedcbf380e7029 100644 GIT binary patch delta 13588 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

    g#?|v{cNhq(5;~%jqtq4hy*`wv4dYqY zcqg}IXh3_=M(3c=JKc^x52O8%snEL9V%C`?&s>`zs&fy-)`FWO*%^JWC#Rq;T^1Kr zE4MtYKzGq|C>^F1JJ{x&!8v=*X}Adv&kLQo_9R>PKG6J3PpcrXU1c7*$1|S5whrX( z^76Xp_0lMCxBJvj@YMX3-<#WRGanC~xWZDi9|GM!~a zbHrSsoQhVL`-;T2u~J>7z<_`En7*MR~PL2bc2%rgEX z*)%$zKM1w=YIESX7{5^L19KZ zzR|vL7tuNr`Pb$R#0s&aeFK1nw5^pt-)n#_It+6CZjUZ4Jf7CGTHKT6H1`55-E`X4 zoV<^d_qTyB?^ocfPyP>_p&Da0c18Suo$suLdG?yP7gL5lRA&ZDYB1B9`MJ}gN`|Nk z8O7D^#(5*xHi>%oMbu7I)e-nB4uXn;{@k!DA`|XOIZ#~#McZu5-9VTgu(hK-^+6pp zn>gBd(4OLDk39?k2Ew+cqIl-_+6kEeDy!pg!OX00*!pV1O@VPv{0tOUeCnHF=wv!->yon$W=MTW;H0a0 zpW`l*6aleKq|m=Eio(ra%|$MvmtoW>xe?ghKChz#>#5=4)TfX8!z)l8gO&N&_GEVg z@$_~@GYhq*QaobhY)L@cYLLwHe-q8fV?oQ%j?<+1^Zgno;bbot^A;}5Ex z%-p!^S0F+e*Nmi9A3+x>+yCBD7X_MUHb@kE9;?ID$o3#gx`bOuVGo07% zy*3XL6Z8vf`k56?U-%W`Og{iyUPOVc9==$6hxg+B00!eXDj~b%08wPra4X$PFL?;v zERzIBkT~{l9=ia9t}V#JMw(;5H$=5`y4$)rAj0Ts#T+IOsaAEe9u+}rz(_noqw@wn zA_NsstM&s%XO+lx)4z|LJ4CNvpKo8n1WKQSdK&#=S=RlLuo|W0XQWB%b1LD3)@{3G zvIh0c=20c|FQQhnmyUy9gyc3@))>#QSKcGNAH>z$j?LZf6lKP4QrF%v=g2p=itohC zKxDvu{s6ya+caQGE1&0lHoJ)(0wM1wiaY8k6X35z*t@aZtW!0v*`c=WjYR8)iXj2i zl1iBC!W}!!nE&RkZi=syKm3pZ^4Wan#`9{D7yyEuEF7TMX2h{H z%}*e}U7dqv7W+PUDqI86b`^ilATpr_9H%?Q3`EWBU4a}f9aw3^&#JTPLgnl@w1WNF zk$HdPkoczR^~#iTd%HSz2;J%9sy@|pZlX&pfD>lu+cEqQ;*0k;U=ekrBJ|b+O#z=v z-0Y;P0hS_}IMe(F#j=()d8jV!p;Q0`aET`2$X`G%Vl`+e;GXjn8=W@>ob)jp2>E&F zm-B$qXdBB*k`&yY$|yyX{6HUqi;>xan8}w)87^Xxin=^c(F^X+B4U+E3LWps6mpU) z_AG_sjLlq1>|ctQFCt@U&bo8m=6YhOI?7_Vd74EYK{QY8O4CaKtumV|A|)-NB)NhA zEkRWrJS)IP)FeO3$5}==c0M8jXagTZ$(|9dT((0+@3eDuPy-813|4{&$z~x^7lhY^ zMx1=;2gxT7qF1Dx2H?n)2DeI1c3CmwzfXYiW+v)G;!@1^2HIeT@B@uxce^9HV5DvZ z{Vq&$S1&v@R>L~Y z7cU1VFAICx&?JEW|J4zu0Ey%#Mn)Xm<|aH0JZ7eB4D6A42)mLM7}xDfu#PZeagF3ps{y;XgB{(X0Th zN&bJIf&`OLz%kP%RsiNefH{`G^wqDrDzNko7|O+e{ZAAKE2+rDtb26fruHxiHW9>$ zt`sYf5GZ3=U`rh6^7;_%_j$t>D0rh{@!4Oq64DeIJtQmiUo;#sg5>i*v@<4OtSp0j zsd*ZuhueyFnPp>3>7o`wpy From 508f650c9bb38fb964cd5781e32f2b8c778b9e47 Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 13:38:04 +0800 Subject: [PATCH 057/110] =?UTF-8?q?add=20=E5=8D=A1=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E6=AE=B5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b48a6e73a..528756fac 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.11 + 2.2.12 UTF-8 1.8.0 From ea034cc54efa51796fb7e3e5fc948130dd264a8b Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 14:39:50 +0800 Subject: [PATCH 058/110] =?UTF-8?q?fix=20=E5=90=8C=E6=AD=A5=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../manage/merchants/core/impls/ClientManagerImpl.java | 7 +++---- .../payment/partner/templates/partner_bankaccounts.html | 2 +- .../payment/partner/templates/partner_mw_auth_files.html | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 528756fac..9e39e2e15 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.12 + 2.2.13 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 75f188080..502f86752 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -466,11 +466,10 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("show_all_permission", checkBDPermission > 0); if (checkBDPermission > 0) { JSONObject org = orgMapper.findOne(manager.getIntValue("org_id")); - boolean bdRateEditable = client.getIntValue("approve_result") != 1 || org.getBooleanValue("rate_editable") || - //开起信用卡支付申请,并且申请结果不是:null.新建 1.通过 4.BD已提交资料状态 - ( !clientConfig.getBoolean("enable_card_payment") && !client.containsKey("upay_approve_result") && client.getIntValue("upay_approve_result") !=1 && client.getIntValue("upay_approve_result") !=4); + boolean bdRateEditable = client.getIntValue("approve_result") != 1 || org.getBooleanValue("rate_editable"); client.put("rate_editable", bdRateEditable); - } else { + boolean bdCardRateEditable = (clientConfig.getBoolean("enable_card_payment") && !client.containsKey("upay_approve_result")); + client.put("card_rate_editable", bdCardRateEditable); client.put("company_phone", "******"); client.put("contact_person", "******"); client.put("contact_phone", "******"); diff --git a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html index 36ef11d4d..be3c145e9 100644 --- a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html +++ b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html @@ -214,7 +214,7 @@

  • CB_BankPay
  • Card Payment
  • Direct Debit
  • - + Add Card Payment Rates diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index 37833aa4b..ed93c1215 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -219,7 +219,7 @@
    - +
    - + 制作信用卡支付合同 制作促销合同 From 0e45ced8dbfb8813f267f10d0772c094dd1ff579 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 29 Apr 2020 15:14:12 +0800 Subject: [PATCH 062/110] =?UTF-8?q?Upd:=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eda66a779..93b8a7e22 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.15 + 2.2.16 UTF-8 1.8.0 From e29d4cf0d94eff60eae22bdb67f175a3f2fb9734 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 29 Apr 2020 15:42:41 +0800 Subject: [PATCH 063/110] =?UTF-8?q?Upd:=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- src/main/ui/static/payment/partner/partner-manage.js | 2 -- .../static/payment/partner/templates/partner_payment_info.html | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 93b8a7e22..bd460038b 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.16 + 2.2.17 UTF-8 1.8.0 diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index acd67a9ac..fed52eaf4 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -1211,7 +1211,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter if($scope.extParams != null){ for(var key in $scope.extParams){ var obj = {} - console.log(1) if(typeof $scope.extParams[key] != 'boolean'){ obj.name = key; obj.value = $scope.extParams[key]; @@ -1231,7 +1230,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.reloadQRCode = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/qrcode', {params: $scope.qrConfig}).then(function (resp) { $scope.qrcode = resp.data; - console.log($scope.qrcode.url) }); }; $scope.reloadQRCode(); diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index 05445da42..4c031e5be 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -466,7 +466,7 @@
    -
    +
    Card Payment Config
    From ab2646e7366a32c319ce309bbb91c3eace5bffaf Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 29 Apr 2020 16:42:23 +0800 Subject: [PATCH 064/110] =?UTF-8?q?fix=20bd=E6=98=BE=E7=A4=BA=E5=95=86?= =?UTF-8?q?=E6=88=B7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../payment/manage/merchants/core/impls/ClientManagerImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bd460038b..63456bb80 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.17 + 2.2.18 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index d73b5a218..41d2f4bab 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -470,6 +470,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("rate_editable", bdRateEditable); boolean bdCardRateEditable = (clientConfig.getBoolean("enable_card_payment") && !client.containsKey("upay_approve_result")); client.put("card_rate_editable", bdCardRateEditable); + }else { client.put("company_phone", "******"); client.put("contact_person", "******"); client.put("contact_phone", "******"); From c0408944292ff7061f596bbca9935148e68a5c73 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 29 Apr 2020 17:00:00 +0800 Subject: [PATCH 065/110] =?UTF-8?q?Upd:=E8=B7=A8=E5=A2=83/=E5=8D=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=A1=E6=A0=B8=E6=9C=AA=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/static/payment/partner/templates/partner_detail.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 6134cfec2..081a0f80c 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -76,7 +76,7 @@ (自助申请)待审核(材料已提交) - 资料完善中 + 暂未提交申请 待审核(合同制作中) 合同制作完成 BD处理中 @@ -168,7 +168,7 @@ )(The Partner Using Green Channel Now!) 【目前状态】- - 资料完善中 + 暂未提交申请 待审核(合同制作中) 合同制作完成 BD处理中 From e15aa56cb902c8d9a817d03a9dde7e20bcca8d09 Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 29 Apr 2020 17:02:30 +0800 Subject: [PATCH 066/110] =?UTF-8?q?Upd:=E8=B7=A8=E5=A2=83/=E5=8D=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=A1=E6=A0=B8=E6=9C=AA=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/static/payment/partner/templates/partner_detail.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 081a0f80c..2b29d3961 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -249,7 +249,7 @@ (自助申请)待审核(材料已提交) - 资料完善中 + 暂未提交申请 待审核(合同制作中) 合同制作完成 BD处理中 @@ -325,7 +325,7 @@ )(The Partner Using Green Channel Now!) 【目前状态】- - 资料完善中 + 暂未提交申请 待审核(合同制作中) 合同制作完成 BD处理中 From d27d610e25030b8aa8d4c275cd013d8908964a49 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 30 Apr 2020 10:21:19 +0800 Subject: [PATCH 067/110] update 2.1.35 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 63456bb80..096da615a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.28 + 2.1.35 4.0.0 manage - 2.2.18 + 2.2.19 UTF-8 1.8.0 From f333d3801b5d7afb68b8c0dd4111ff9f23a70e66 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 30 Apr 2020 11:32:57 +0800 Subject: [PATCH 068/110] =?UTF-8?q?add=20mw=20=E5=90=88=E8=A7=84=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=A4=9A=E4=B8=AA=E3=80=81=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../mappers/system/ClientMWFilesMapper.java | 5 + .../manage/merchants/core/ClientManager.java | 2 + .../core/impls/ClientManagerImpl.java | 28 +- .../merchants/enums/UPayAuthFileEnum.java | 2 +- .../web/PartnerManageController.java | 6 +- .../mappers/system/ClientMWFilesMapper.xml | 8 + .../static/payment/partner/partner-manage.js | 126 ++------- .../templates/partner_mw_auth_files.html | 240 ++++++++++++++---- 9 files changed, 258 insertions(+), 161 deletions(-) create mode 100644 src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.xml diff --git a/pom.xml b/pom.xml index 096da615a..925a87734 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.19 + 2.2.20 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java index e5064a1cf..24d7e73d7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.java @@ -24,4 +24,9 @@ public interface ClientMWFilesMapper { @AutoSql(SqlType.SELECT) @AdvanceSelect(addonWhereClause = "is_valid = 1") List findClientFile(@Param("client_id") int clientId, PageBounds pageBounds); + + @AutoSql(SqlType.SELECT) + JSONObject findFileById(@Param("file_id") String file_id); + + void deleteByClientAndFileId(@Param("file_id") String file_id); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index b204554ce..88c64ed46 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -278,6 +278,8 @@ public interface ClientManager { void deleteAuthFilesByAdmin(String fileId); + void deleteMWAuthFilesByAdmin(String fileId); + void uploadAuthFiles(JSONObject manager, String clientMoniker, ClientAuthFilesInfo filesInfo); void uploadAuthFilesManager(JSONObject manager, String clientMoniker, ClientAuthFilesInfo filesInfo); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 41d2f4bab..eb3c9c259 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -3840,10 +3840,25 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid if (client == null) { throw new InvalidShortIdException(); } + String[] fileKeys = UPayAuthFileEnum.ALL.getFileNameArrays(); List clientFiles = clientMWAuthFilesInfo.findClientFile(client.getIntValue("client_id"), new PageBounds(1,999999, Order.formString("last_update_date.asc"))); JSONObject fileJson = new JSONObject(); - for (JSONObject file : clientFiles) { - fileJson.put(file.getString("file_name"), file.getString("file_value")); + if (clientFiles != null && clientFiles.size() > 0) { + for (String fileKey : fileKeys) { + List clientFileUrl = clientFiles.stream() + .filter(json -> (fileKey.equals(json.getString("file_name")))) + .sorted((log1, log2) -> log2.getDate("last_update_date").compareTo(log1.getDate("last_update_date"))) + .map(json -> { + JSONObject params = new JSONObject(); + params.put("file_id", json.getString("file_id")); + params.put("file_value", json.getString("file_value")); + return params; + }) + .collect(Collectors.toList()); + if (clientFileUrl != null && clientFileUrl.size() > 0) { + fileJson.put(fileKey, clientFileUrl); + } + } } return fileJson; } @@ -3929,6 +3944,15 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid clientFilesMapper.deleteByClientAndFileId(fileId); } + @Override + public void deleteMWAuthFilesByAdmin(String fileId) { + JSONObject file = clientMWAuthFilesInfo.findFileById(fileId); + if (file == null) { + throw new BadRequestException("The file has deleted"); + } + clientMWAuthFilesInfo.deleteByClientAndFileId(fileId); + } + @Override @Transactional public void uploadAuthFiles(JSONObject manager, String clientMoniker, ClientAuthFilesInfo filesInfo) { diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java index bdaa59ecf..c81cfb906 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/enums/UPayAuthFileEnum.java @@ -28,7 +28,7 @@ public enum UPayAuthFileEnum { public String[] getFileNameArrays() { return new String[]{CLIENT_BANK_FILE.getFileName(), CLIENT_COMPANY_FILE.getFileName(), - UPAY_OFFER_LETTER.getFileName(), + UPAY_DRIVER_LICENSE.getFileName(), REFUND_EXCHANGE_POLICY.getFileName(), UPAY_PRIVACY_POLICY.getFileName(), CARD_SECURITY_POLICY.getFileName(), diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 1ea7c90d1..958ddd64b 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -22,7 +22,6 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.io.OutputStream; -import java.util.Date; import java.util.List; /** @@ -611,6 +610,11 @@ public class PartnerManageController { clientManager.deleteAuthFilesByAdmin(fileId); } + @ManagerMapping(value = "/auth_file/{fileId}/mw_delete", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) + public void deleteMWAuthFiles(@PathVariable String fileId, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.deleteMWAuthFilesByAdmin(fileId); + } + @ManagerMapping(value = "/{clientMoniker}/file", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER}) public void uploadAuthFiles(@PathVariable String clientMoniker, @RequestBody ClientAuthFilesInfo filesInfo, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.xml new file mode 100644 index 000000000..5fbb5d9e0 --- /dev/null +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMWFilesMapper.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index fed52eaf4..86e1bcfa6 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -3837,54 +3837,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_risk_level = $scope.partner.upay_risk_level; $scope.file.upay_risk_remark = $scope.partner.upay_risk_remark; - $scope.bankIsImage = true; - $scope.asicIsImage = true; - $scope.idIsImage = true; - $scope.utilityIsImage = true; - $scope.refundIsImage = true; - $scope.privacyIsImage = true; - $scope.cardIsImage = true; - $scope.letterIsImage = true; - $scope.promotionalIsImage = true; - $scope.termsIsImage = true; - $scope.applicationIsImage = true; - $scope.descIsImage = true; - if ($scope.file.client_bank_file && $scope.file.client_bank_file.endsWith('pdf')) { - $scope.bankIsImage = false; - } - if ($scope.file.client_company_file && $scope.file.client_company_file.endsWith('pdf')) { - $scope.asicIsImage = false; - } - if ($scope.file.upay_driver_license && $scope.file.upay_driver_license.endsWith('pdf')) { - $scope.idIsImage = false; - } - if ($scope.file.kyc_utility_bill_file && $scope.file.kyc_utility_bill_file.endsWith('pdf')) { - $scope.utilityIsImage = false; - } - if ($scope.file.refund_exchange_policy && $scope.file.refund_exchange_policy.endsWith('pdf')) { - $scope.refundIsImage = false; - } - if ($scope.file.upay_privacy_policy && $scope.file.upay_privacy_policy.endsWith('pdf')) { - $scope.privacyIsImage = false; - } - if ($scope.file.card_security_policy && $scope.file.card_security_policy.endsWith('pdf')) { - $scope.cardIsImage = false; - } - if ($scope.file.upay_offer_letter && $scope.file.upay_offer_letter.endsWith('pdf')) { - $scope.letterIsImage = false; - } - if ($scope.file.upay_promotional_offer && $scope.file.upay_promotional_offer.endsWith('pdf')) { - $scope.promotionalIsImage = false; - } - if ($scope.file.upay_terms_conditions && $scope.file.upay_terms_conditions.endsWith('pdf')) { - $scope.termsIsImage = false; - } - if ($scope.file.upay_application_form && $scope.file.upay_application_form.endsWith('pdf')) { - $scope.applicationIsImage = false; - } - if ($scope.file.upay_desc_file && $scope.file.upay_desc_file.endsWith('pdf')) { - $scope.descIsImage = false; - } $scope.uploadApplicationFile = function (file) { if (file != null) { if (file.size > 3 * 1024 * 1024) { @@ -3900,11 +3852,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_application_form = resp.data.url; $scope.uploadFile.upay_application_form = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_application_form.endsWith('pdf')) { - $scope.bankIsImage = false; - } else { - $scope.bankIsImage = true; - } }, function (resp) { delete $scope.applicationFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -3929,11 +3876,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.client_bank_file = resp.data.url; $scope.uploadFile.client_bank_file = resp.data.url; $scope.updateFile(); - if ($scope.file.client_bank_file.endsWith('pdf')) { - $scope.bankIsImage = false; - } else { - $scope.bankIsImage = true; - } }, function (resp) { delete $scope.bankFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -3958,11 +3900,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.client_company_file = resp.data.url; $scope.uploadFile.client_company_file = resp.data.url; $scope.updateFile(); - if ($scope.file.client_company_file.endsWith('pdf')) { - $scope.bankIsImage = false; - } else { - $scope.bankIsImage = true; - } }, function (resp) { delete $scope.ASICProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -3987,11 +3924,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_driver_license = resp.data.url; $scope.uploadFile.upay_driver_license = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_driver_license.endsWith('pdf')) { - $scope.idIsImage = false; - } else { - $scope.idIsImage = true; - } }, function (resp) { delete $scope.idProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4016,11 +3948,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.kyc_utility_bill_file = resp.data.url; $scope.uploadFile.kyc_utility_bill_file = resp.data.url; $scope.updateFile(); - if ($scope.file.kyc_utility_bill_file.endsWith('pdf')) { - $scope.utilityIsImage = false; - } else { - $scope.utilityIsImage = true; - } }, function (resp) { delete $scope.residenceFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4045,11 +3972,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.refund_exchange_policy = resp.data.url; $scope.uploadFile.refund_exchange_policy = resp.data.url; $scope.updateFile(); - if ($scope.file.refund_exchange_policy.endsWith('pdf')) { - $scope.utilityIsImage = false; - } else { - $scope.utilityIsImage = true; - } }, function (resp) { delete $scope.refundPolicyFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4074,11 +3996,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_privacy_policy = resp.data.url; $scope.uploadFile.upay_privacy_policy = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_privacy_policy.endsWith('pdf')) { - $scope.privacyIsImage = false; - } else { - $scope.privacyIsImage = true; - } }, function (resp) { delete $scope.privacyFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4103,11 +4020,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.card_security_policy = resp.data.url; $scope.uploadFile.card_security_policy = resp.data.url; $scope.updateFile(); - if ($scope.file.card_security_policy.endsWith('pdf')) { - $scope.privacyIsImage = false; - } else { - $scope.privacyIsImage = true; - } }, function (resp) { delete $scope.cardFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4132,11 +4044,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_offer_letter = resp.data.url; $scope.uploadFile.upay_offer_letter = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_offer_letter.endsWith('pdf')) { - $scope.letterIsImage = false; - } else { - $scope.letterIsImage = true; - } }, function (resp) { delete $scope.letterFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4161,11 +4068,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_promotional_offer = resp.data.url; $scope.uploadFile.upay_promotional_offer = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_promotional_offer.endsWith('pdf')) { - $scope.promotionalIsImage = false; - } else { - $scope.promotionalIsImage = true; - } }, function (resp) { delete $scope.promotionalFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4190,11 +4092,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_terms_conditions = resp.data.url; $scope.uploadFile.upay_terms_conditions = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_terms_conditions.endsWith('pdf')) { - $scope.termsIsImage = false; - } else { - $scope.termsIsImage = true; - } }, function (resp) { delete $scope.termsFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4219,11 +4116,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.file.upay_desc_file = resp.data.url; $scope.uploadFile.upay_desc_file = resp.data.url; $scope.updateFile(); - if ($scope.file.upay_desc_file.endsWith('pdf')) { - $scope.descIsImage = false; - } else { - $scope.descIsImage = true; - } }, function (resp) { delete $scope.descFileProgress; commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) @@ -4297,6 +4189,24 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; $scope.complianceChangeCheck(); + $scope.deleteMWComplianceFiles = function (file_id) { + commonDialog.confirm({ + title: 'Warning', + content: 'This operation will delete the file, Are you sure?' + }).then(function () { + $http.put('/sys/partners/auth_file/' + file_id + '/mw_delete').then(function (resp) { + commonDialog.alert({ + title: 'Success', + content: 'Delete Successful', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + }]); app.controller('partnerKycFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', 'Upload', 'file', function ($scope, $http, $rootScope, commonDialog, $state, Upload, file) { diff --git a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html index ed93c1215..f5ce6cb1a 100644 --- a/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html +++ b/src/main/ui/static/payment/partner/templates/partner_mw_auth_files.html @@ -74,12 +74,24 @@ Upload -
    - - - +
    - +
    - +
    - +
    - +
    - +
    + + + + + + +
    1 + + + +
    @@ -91,12 +103,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -108,12 +132,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -125,12 +161,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -142,12 +190,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -159,12 +219,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -176,12 +248,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -193,12 +277,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -210,12 +306,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -227,12 +335,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -244,12 +364,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    @@ -261,12 +393,24 @@ Upload -
    - - - + + + + + + + +
    1 + + + +
    From 58a954eebea31ece42550721a2be8a3c330d515c Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 30 Apr 2020 12:03:36 +0800 Subject: [PATCH 069/110] fix --- src/main/ui/static/payment/partner/partner-manage.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 86e1bcfa6..4b767c770 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -3849,7 +3849,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.applicationFileProgress; - $scope.file.upay_application_form = resp.data.url; $scope.uploadFile.upay_application_form = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -3873,7 +3872,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.bankFileProgress; - $scope.file.client_bank_file = resp.data.url; $scope.uploadFile.client_bank_file = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -3897,7 +3895,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.ASICProgress; - $scope.file.client_company_file = resp.data.url; $scope.uploadFile.client_company_file = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -3921,7 +3918,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.idProgress; - $scope.file.upay_driver_license = resp.data.url; $scope.uploadFile.upay_driver_license = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -3945,7 +3941,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.residenceFileProgress; - $scope.file.kyc_utility_bill_file = resp.data.url; $scope.uploadFile.kyc_utility_bill_file = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -3969,7 +3964,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.refundPolicyFileProgress; - $scope.file.refund_exchange_policy = resp.data.url; $scope.uploadFile.refund_exchange_policy = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -3993,7 +3987,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.privacyFileProgress; - $scope.file.upay_privacy_policy = resp.data.url; $scope.uploadFile.upay_privacy_policy = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -4017,7 +4010,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.cardFileProgress; - $scope.file.card_security_policy = resp.data.url; $scope.uploadFile.card_security_policy = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -4041,7 +4033,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.letterFileProgress; - $scope.file.upay_offer_letter = resp.data.url; $scope.uploadFile.upay_offer_letter = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -4065,7 +4056,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.promotionalFileProgress; - $scope.file.upay_promotional_offer = resp.data.url; $scope.uploadFile.upay_promotional_offer = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -4089,7 +4079,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.termsFileProgress; - $scope.file.upay_terms_conditions = resp.data.url; $scope.uploadFile.upay_terms_conditions = resp.data.url; $scope.updateFile(); }, function (resp) { @@ -4113,7 +4102,6 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (resp) { $scope.uploadFile = {}; delete $scope.descFileProgress; - $scope.file.upay_desc_file = resp.data.url; $scope.uploadFile.upay_desc_file = resp.data.url; $scope.updateFile(); }, function (resp) { From 4b59cf44e094c5ab31adf788c677bf9a746f130e Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 30 Apr 2020 13:25:41 +0800 Subject: [PATCH 070/110] =?UTF-8?q?fix=20bd=20kpi=20=E5=A4=A7=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../bdprize/core/impls/BDPrizeServiceImpl.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 925a87734..13c37ea00 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.20 + 2.2.21 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java index 786156343..d1b4c31f3 100644 --- a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java @@ -468,12 +468,12 @@ public class BDPrizeServiceImpl implements BDPrizeService { financialBDCommissionConfigMapper.updateCommissionConfig(config); } else { String[] firLasDay = getMonthFisrtLastDay(month); - config.put("START_DATE", firLasDay[0]); - config.put("END_DATE", firLasDay[1]); - config.put("CREATION_DATE", new Date()); - config.put("CREATION_BY", manager.getString("display_name")); - config.put("LAST_UPDATE_DATE", new Date()); - config.put("LAST_UPDATE_BY", manager.getString("display_name")); + config.put("start_date", firLasDay[0]); + config.put("end_date", firLasDay[1]); + config.put("creation_date", new Date()); + config.put("creation_by", manager.getString("display_name")); + config.put("last_update_date", new Date()); + config.put("last_update_by", manager.getString("display_name")); financialBDCommissionConfigMapper.insertCommissionConfig(config); } } From 668d0ca87d2560e95650142417ee12b7d3a34cdf Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 30 Apr 2020 13:27:04 +0800 Subject: [PATCH 071/110] =?UTF-8?q?fix=20bd=20kpi=20=E5=A4=A7=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java index d1b4c31f3..24cb9145d 100644 --- a/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/bdprize/core/impls/BDPrizeServiceImpl.java @@ -463,8 +463,8 @@ public class BDPrizeServiceImpl implements BDPrizeService { } if (config.getString("bc_config_id") != null && !"".equals(config.getString("bc_config_id"))) { - config.put("LAST_UPDATE_DATE", new Date()); - config.put("LAST_UPDATE_BY", manager.getString("display_name")); + config.put("last_update_date", new Date()); + config.put("last_update_by", manager.getString("display_name")); financialBDCommissionConfigMapper.updateCommissionConfig(config); } else { String[] firLasDay = getMonthFisrtLastDay(month); From 74bfd1dff039b490ab8322465b2afa0158d8bc37 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 30 Apr 2020 13:50:06 +0800 Subject: [PATCH 072/110] =?UTF-8?q?fix=20=E4=B8=8A=E4=BC=A0=E5=90=88?= =?UTF-8?q?=E8=A7=84=E6=96=87=E4=BB=B6=E5=90=8E=E8=87=AA=E5=8A=A8=E5=88=B7?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/ui/static/payment/partner/partner-manage.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 4b767c770..d007f252c 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -147,6 +147,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter controller: 'partnerDeviceCtrl' }).state('partners.detail.files', { url: '/files', + params:{commitType:"cross-border"}, templateUrl: '/static/payment/partner/templates/partner_auth_files.html', controller: 'partnerAuthFileCtrl' }).state('partners.detail.files.CP_files', { @@ -3532,7 +3533,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.listRedpackLogs(1); }]); app.controller('partnerAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', function ($scope, $http, $rootScope, commonDialog, $state) { - if ($scope.partner.client_type=='card-payment'){ + if ($state.params.commitType=='card-payment'){ $state.go('partners.detail.files.MW_files'); }else { $state.go('partners.detail.files.CP_files'); @@ -4148,7 +4149,8 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter content: 'Upload Successful', type: 'success' }); - $state.go('partners.detail.files.MW_files', {reload: true}); + $state.go('partners.detail.files',{clientMoniker:$scope.partner.client_moniker, + commitType: "card-payment"}, {reload: true}); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) From 79d249de95fafcd2d47047e89b26e23659a8485d Mon Sep 17 00:00:00 2001 From: dulingling Date: Thu, 30 Apr 2020 13:51:55 +0800 Subject: [PATCH 073/110] =?UTF-8?q?Upd=EF=BC=9A=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=B5=81=E7=A8=8B=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../core/impls/RetailAppServiceImp.java | 4 + .../manage/mappers/system/ClientMapper.xml | 13 +- .../static/payment/partner/partner-manage.js | 20 +- .../templates/partner_cp_auth_files.html | 198 +++++++++--------- .../partner/templates/partner_detail.html | 9 +- .../payment/partner/templates/partners.html | 21 +- 7 files changed, 159 insertions(+), 108 deletions(-) diff --git a/pom.xml b/pom.xml index 13c37ea00..3b5d2b819 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.21 + 2.2.22 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index 9ca43cbfb..e027041ff 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -3115,6 +3115,10 @@ public class RetailAppServiceImp implements RetailAppService { if (cbBankPay.containsKey("channel")) { channels.add(cbBankPay); } + JSONObject cardPaymentPay = getChannel(clientId, now, "rpaypmt_card"); + if (cardPaymentPay.containsKey("channel")) { + channels.add(cardPaymentPay); + } res.put("channels", channels); if (res.containsKey("rate_value")) { BigDecimal minRate = res.getBigDecimal("rate_value").add(new BigDecimal(0.01)).setScale(2, RoundingMode.DOWN); diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml index b752401ef..512b90b4b 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/system/ClientMapper.xml @@ -513,13 +513,24 @@ SELECT sum(if(((c.approve_result=4 and c.open_status is null) or (c.approve_result=3 and c.open_status is null) or c.open_status=1 or c.open_status=2 or c.open_status=4),1,0)) wp, + + sum(if(((scup.upay_approve_result=4 and scup.upay_open_status is null) or (scup.upay_approve_result=3 and scup.upay_open_status is null) or + scup.upay_open_status=1 or scup.upay_open_status=2 or scup.upay_open_status=4),1,0)) cwp, + sum(if(c.approve_result is null and c.source= 4,1,0)) a_unagree, sum(if(((c.approve_result=4 and c.open_status is null) or (c.approve_result=3 and c.open_status is null) or c.open_status=1 or c.open_status=2 or c.open_status=4) and c.source = 4,1,0)) a_wp, + + sum(if(((scup.upay_approve_result=4 and scup.upay_open_status is null) or + scup.upay_open_status=1 or scup.upay_open_status=2 or scup.upay_open_status=4) and c.source = 4,1,0)) a_cwp, + sum(if(c.approve_result=2 and c.source = 4,1,0)) wa, sum(if(c.approve_result=1,1,0)) pass, + sum(if(scup.upay_approve_result=1,1,0)) upass, sum(if(c.approve_result=1 and c.source=2,1,0)) z_pass, + sum(if(scup.upay_approve_result=1 and c.source=2,1,0)) z_upass, sum(if(c.approve_result=1 and c.source = 4,1,0)) a_pass, + sum(if(scup.upay_approve_result=1 and c.source = 4,1,0)) a_upass, sum(if(c.approve_result=0,1,0)) not_pass, sum(if(c.source=4,1,0)) quick_pass @@ -527,7 +538,7 @@ FROM sys_clients c left join sys_client_config scc on scc.client_id = c.client_id - + left join sys_client_upay_profile scup on c.client_id = scup.client_id where c.is_valid = 1 - - - - -
    -
    -
    -
    - -
    - - - - - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - {{file.id_type}} -
    -
    -
    -
    - -
    - - - - - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    @@ -136,8 +39,6 @@ - -
    @@ -198,6 +99,7 @@ ngf-select="uploadIDFile($file)"> Upload +
    @@ -233,6 +135,102 @@
    +
    +

    + ID描述信息 +

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + + + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + {{file.id_type}} +
    +
    +
    +
    + +
    + + + + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    @@ -356,6 +354,8 @@
    + +
    diff --git a/src/main/ui/static/payment/partner/templates/partner_detail.html b/src/main/ui/static/payment/partner/templates/partner_detail.html index 2b29d3961..49fd981c6 100644 --- a/src/main/ui/static/payment/partner/templates/partner_detail.html +++ b/src/main/ui/static/payment/partner/templates/partner_detail.html @@ -289,6 +289,12 @@ Notify BD +
    + +

    @@ -346,8 +352,7 @@ type="button" ng-href="{{promotionalOfferFileManager.promotional_offer_file}}" target="_blank"> 下载Promotional Offer合同
    - +
    -
    +
    Card Payment Config
    From bca2ca36a1d927bc9b72dc342bf9627e6d266e10 Mon Sep 17 00:00:00 2001 From: luoyang Date: Wed, 6 May 2020 15:58:57 +0800 Subject: [PATCH 084/110] update 2.1.38 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 594dfc176..82258ddde 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.36 + 2.1.38 4.0.0 manage - 2.2.28 + 2.2.29 UTF-8 1.8.0 From 0347c890b31d7c19cd457d6acab2db47c2dae982 Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 7 May 2020 13:38:19 +0800 Subject: [PATCH 085/110] update 2.1.39 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 82258ddde..43ebf26b5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.38 + 2.1.39 4.0.0 manage - 2.2.29 + 2.2.30 UTF-8 1.8.0 From e0e23bf920888944294e070ed43e33fe5304b16f Mon Sep 17 00:00:00 2001 From: luoyang Date: Thu, 7 May 2020 15:02:18 +0800 Subject: [PATCH 086/110] fix abn --- src/main/ui/static/payment/partner/templates/add_partner.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index cd24bc7f2..952266506 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -220,7 +220,7 @@
    - +
    Date: Fri, 8 May 2020 09:48:04 +0800 Subject: [PATCH 087/110] update 2.2.32 --- pom.xml | 2 +- .../manage/appclient/core/impls/RetailAppServiceImp.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 43ebf26b5..e3edce957 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.2.30 + 2.2.32 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java index e027041ff..69ef8d993 100644 --- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java +++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailAppServiceImp.java @@ -290,11 +290,11 @@ public class RetailAppServiceImp implements RetailAppService { res.put("alipay_rate", paymentApi.channelApi("Alipay").queryExchangeRateDecimal(clientId)); } params.put("channel", "system"); - res.put("sys_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + res.put("sys_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)).setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); params.put("channel", "rpaypmt_card"); - res.put("rpaypmt_card_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + res.put("rpaypmt_card_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)).setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); params.put("channel", "rpaypmt_dd"); - res.put("rpaypmt_dd_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params))); + res.put("rpaypmt_dd_not_settled", new BigDecimal(transactionAnalysisMapper.analysisNotSettled(params)).setScale(2, BigDecimal.ROUND_DOWN).toPlainString()); return res; } @@ -870,7 +870,7 @@ public class RetailAppServiceImp implements RetailAppService { String clientType = device.getString("client_type"); deviceSupport.findRegister(clientType); int clientId = device.getIntValue("client_id"); - JSONObject client = clientManager.getClientInfo(9); + JSONObject client = clientManager.getClientInfo(clientId); String timezoneClient = client.getString("timezone"); if (timezoneClient != null && !timezone.isEmpty()) { timezone = timezoneClient; From 6e8bea6e43ad7ff9f6676954b10e4622dc1eceed Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 8 May 2020 11:32:31 +0800 Subject: [PATCH 088/110] update 2.1.40 fix refund error --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e3edce957..8c3b3f4ee 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.39 + 2.1.40 4.0.0 manage - 2.2.32 + 2.2.33 UTF-8 1.8.0 From 42c30ce9af854cab610ccd9c750e34b37cf65810 Mon Sep 17 00:00:00 2001 From: yixian Date: Fri, 8 May 2020 16:19:19 +1000 Subject: [PATCH 089/110] profile update --- src/main/resources/application-rppaysvc.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/application-rppaysvc.yml b/src/main/resources/application-rppaysvc.yml index 484d8a4f6..5acb434de 100644 --- a/src/main/resources/application-rppaysvc.yml +++ b/src/main/resources/application-rppaysvc.yml @@ -4,4 +4,7 @@ app: priv-key: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDE55tREo6t6m1hekGlaMmDivorV3a+MkA/Wna0k917u/CGYIf7FtmWk1um7VcBRdljluLjqThePZgbgtwqTdHWXJP2gPwoJjLUluVEyKh19blSgrq7K1FEryAzQ5XFLzMX//EMc1BNrqcREHC6XVlJeNzpOd8+C83cxGxL+ayLoQ/ePEyp/8yXBbA6t2yXyi7H1ry8WiFFg9RFf+zAeESFXlKIS72fw9I9GxG6PLUhbD8S+IIJ2A0ZudKUQIUw4M0wSilo40lfqp/xRyfUBZevKcPrO5/ZCJX6V2d154s1m5p0Z/eLtQ1ido0quVi/LzBb1KXDYNHV6hPJjNQmNbMnAgMBAAECggEAY/rqLW9LzVk0cwN947xiXg2qW2mM3KRtZP3NOoG+O37BcaoAQelnUILATfFDdVz/Ngc+a7TX71o9KvL2UfCztLHLW6ZA4y4KL1HzVkrA5yx/DjtdD36+RC7cHcuad8YwnmYSAm1nABrHr+12H9sYZCsfmLkO9tVNkWSXTLiY+UhJ1hTua2LYgaTsHR9lYLt/K+PNIBAToKuMcKFTEMWbrnekrFhXkPdeS3alFL/0X7csaPhLvZTDaAtpAytvnmN4nuZmnONnDqPJ3IEFjc7xwZ15D9Qgv/+g74q1VzU/0+2421S6BSijUK3kUdeHXASU3YvIczfnbr5t+NYL7nd68QKBgQDlLFNMz9rVFLd5b351tnld9rni8KzHi+V+eXeJpQ+zriTODOvvkFJrTSZKm+JQoBrpTI+EA1fovxLnDBhNnrR4HmHhudMTGqU6JOZLj+fk8UQKXDpVEGWO6QT68ds+Ii1ex1UEkbBkLWGrrHlFAdY0q+Af7L7Fe0osZX9382b+aQKBgQDb9EmDD79IFOxSjMJVnlN0g2P48hQ9M40cEzXRD/iyyBr9l8rE400Q6GT35ZgHKSrG2nXZehWCaQQqniHu+y6UHnJfhbC0LEYdcYRoyamlGwEFp8xSRJ88R2IoL+2g+XJ1Tc6eACjsEJWZooga6bqdrYjaAe0uSGid0Buh6JMTDwKBgGIfJFtS84MgJ55a2m5T/or4xIYiPhgCEfSg1Umd3qcz/JYseihMRr2ifq6bJ78VjfAt05TWSaFhjhpW12EEfoifmZEoGvOnCO9oNSJNLyCbHGLDMkaRiqoxouw++XwU7hASkJgwOLHrrFHwusuNCcXrgT6qAtRTAWMY4gbdtE9hAoGAWnZsTZUKbND+KS1vN9t4I3FuipK1tD4hiSx1c9iHxq/6OdZWNQfvSEbsT/CDyF4sE8EBu0I02n/qkMSc3Dc+fvjOvW60sEWNSMrJVHesaBVlJDhRFnzWqOoK+tBLgWtWodwwYFdcfUqM3LU2GSuL7xHSOSeVrvVk4ZMX6k1HQA0CgYAypY0eecX8Gc7SCt7wpYoNuL2MuZZIDXNZVMpWYMokA1Z74oX1uzecyTNLHgCFHpjiJPyc6KW1/pnDpcA9FuTmLUuNyuqsX85IEMZPkIqPFebAl4IvOuwzvXDPxxgh8B+XBQBydgFADeqgqXG8rxomC4PUrX47pKb1G89bTGp8Dw== pub-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmifNnVZG6HZBYdvLnCGyNm7rQTZKyl3w+7xdBGgjsQeaskdy/IgmrWRG4Ii1o82KV/ZA+bw86vE37axpoxbqOU3LYVb69nVYvmJOL018iBs74HhbZ8CtWtQmEIKqmX/rNUdp15OgwzDckvrK/EEzjdOoQfAkFB68wLOsTcsRwBB3JUL/uiHGK6b5Ofmh4PxYeAVNpWYHyCaQIuN6JH85VHBVS4etP25GbgWxl+ktuZucaPsQ2G25mwhlpNiC28J4la0wD33JKMfCNCjORlWkw2HcDvrRLqza4lJOXu0rFy3JuUkZ0hn834ZWd3MboqNNE6a2xe4ppZUJ9ccM9312JQIDAQAB server-root: https://channel.rpayplus.com/channel/v1/ + upload-file-keys: + - upay_application_form + - upay_desc_file From 86751b2c94527e515b3de303b6735ffe63a831ba Mon Sep 17 00:00:00 2001 From: luoyang Date: Fri, 8 May 2020 14:47:44 +0800 Subject: [PATCH 090/110] update 2.2.32 --- pom.xml | 4 +-- .../core/impls/TradeLogServiceImpl.java | 26 ++++++++++-------- ...ncremental_partner_upay_invoice_gst.jasper | Bin 0 -> 85632 bytes .../tradelog/templates/balance_report.html | 2 +- 4 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/jasper/incremental_partner_upay_invoice_gst.jasper diff --git a/pom.xml b/pom.xml index 8c3b3f4ee..cff7bc145 100644 --- a/pom.xml +++ b/pom.xml @@ -5,11 +5,11 @@ au.com.royalpay.payment payment-parent - 2.1.40 + 2.1.41 4.0.0 manage - 2.2.33 + 2.2.34 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index b6046766c..8982082ab 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -138,6 +138,8 @@ public class TradeLogServiceImpl implements TradeLogService { private org.springframework.core.io.Resource incremental_trans_flow; @Value("classpath:/jasper/partner_upay_invoice_gst.jasper") private org.springframework.core.io.Resource upay_trans_flow; + @Value("classpath:/jasper/incremental_partner_upay_invoice_gst.jasper") + private org.springframework.core.io.Resource incremental_upay_trans_flow; @Value("classpath:/jasper/royalpay_logo.png") private org.springframework.core.io.Resource logo; @Value("classpath:/jasper/trans_excel.jasper") @@ -822,20 +824,23 @@ public class TradeLogServiceImpl implements TradeLogService { parmerters.put("incremental_fee", takeDecimalOrDefault(analysis, "total_incremental_surcharge", BigDecimal.ZERO)); parmerters.put("incremental_gst", takeDecimalOrDefault(analysis, "total_incremental_tax", BigDecimal.ZERO)); parmerters.put("royalpay_gst", analysis.getBigDecimal("tax_amount").subtract(analysis.getBigDecimal("total_incremental_tax")).setScale(2,RoundingMode.HALF_UP)); - parmerters.put("total_transaction_fee", analysis.getBigDecimal("total_transaction_fee").add(analysis.getBigDecimal("total_transaction_fee_tax")).setScale(2,RoundingMode.HALF_UP)); - parmerters.put("total_royalpay_fee", analysis.getBigDecimal("total_surcharge").subtract(parmerters.getBigDecimal("total_transaction_fee")).setScale(2,RoundingMode.HALF_UP)); - + BigDecimal totalTransactionFee = analysis.getBigDecimal("total_transaction_fee").add(analysis.getBigDecimal("total_transaction_fee_tax")).setScale(2, RoundingMode.HALF_UP); + BigDecimal totalRoyalpayFee = analysis.getBigDecimal("total_surcharge") + .subtract(analysis.getBigDecimal("total_transaction_fee")) + .subtract(analysis.getBigDecimal("total_transaction_fee_tax")) + .subtract(analysis.getBigDecimal("total_incremental_surcharge")) + .subtract(analysis.getBigDecimal("total_incremental_tax")).setScale(2, RoundingMode.HALF_UP); + parmerters.put("total_transaction_fee", totalTransactionFee); + parmerters.put("total_royalpay_fee", totalRoyalpayFee); + parmerters.put("total_card_fee", totalRoyalpayFee.add(totalTransactionFee)); + parmerters.put("total_incremental_fee", parmerters.getBigDecimal("incremental_fee").add(parmerters.getBigDecimal("incremental_gst"))); dataList.parallelStream().forEach(item -> { BigDecimal incrementalSurcharge = item.containsKey("incremental_surcharge") ? item.getBigDecimal("incremental_surcharge") : BigDecimal.ZERO; BigDecimal taxAmount = item.containsKey("tax_amount") ? item.getBigDecimal("tax_amount") : BigDecimal.ZERO; - BigDecimal royalpaySurhcarge = item.containsKey("royal_surcharge") ? item.getBigDecimal("royal_surcharge") : BigDecimal.ZERO; - BigDecimal surhcargeBack = item.containsKey("surcharge_cashback") ? item.getBigDecimal("surcharge_cashback") : BigDecimal.ZERO; - BigDecimal channelSurcharge = item.containsKey("channel_surcharge") ? item.getBigDecimal("channel_surcharge") : BigDecimal.ZERO; BigDecimal incrementalTax = incrementalSurcharge.divide(new BigDecimal(10), 2, RoundingMode.HALF_UP); BigDecimal transactionFee = item.getBigDecimal("transaction_fee"); BigDecimal transactionFeeTax = item.getBigDecimal("transaction_fee").divide(new BigDecimal(10), 2, RoundingMode.HALF_UP); - BigDecimal royalpayTax = taxAmount.subtract(incrementalTax).subtract(transactionFeeTax); - BigDecimal realRoyalpayCharge = item.getBigDecimal("total_surcharge").add(taxAmount).subtract(transactionFee).subtract(transactionFeeTax); + BigDecimal realRoyalpayCharge = item.getBigDecimal("total_surcharge").add(taxAmount).subtract(transactionFee).subtract(transactionFeeTax).subtract(incrementalSurcharge).subtract(incrementalTax); item.put("incremental_surcharge", incrementalSurcharge.add(incrementalTax).setScale(2, RoundingMode.HALF_UP)); item.put("total_surcharge_intax", realRoyalpayCharge.setScale(2, RoundingMode.HALF_UP)); item.put("transaction_fee_intax", transactionFee.add(transactionFeeTax).setScale(2,RoundingMode.HALF_UP)); @@ -850,9 +855,8 @@ public class TradeLogServiceImpl implements TradeLogService { String fileName = client.getString("client_moniker") + "_Card_Payment_" + parmerters.getString("dateRange").replaceAll("/", ""); response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".pdf"); OutputStream outs = response.getOutputStream(); -// JSONObject clientIncrement = clientIncrementalMapper.findByClinetIdAndChannel(client.getIntValue("client_id"), "RP跨境商城"); -// InputStream jasper = clientIncrement == null ? trans_flow.getInputStream() : incremental_trans_flow.getInputStream(); - InputStream jasper = upay_trans_flow.getInputStream(); + JSONObject clientIncrement = clientIncrementalMapper.findByClinetIdAndChannel(client.getIntValue("client_id"), "RP跨境商城"); + InputStream jasper = clientIncrement == null ? upay_trans_flow.getInputStream() : incremental_upay_trans_flow.getInputStream(); byte[] bytes = JasperRunManager.runReportToPdf(jasper, parmerters, jrDataSource); outs.write(bytes, 0, bytes.length); outs.flush(); diff --git a/src/main/resources/jasper/incremental_partner_upay_invoice_gst.jasper b/src/main/resources/jasper/incremental_partner_upay_invoice_gst.jasper new file mode 100644 index 0000000000000000000000000000000000000000..cf6b40d3dc151a9c554f58ddfd6cfe221baaa6b9 GIT binary patch literal 85632 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 b$%_~`!uN9~T^ literal 0 HcmV?d00001 diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index 896b3fc43..c54962cbe 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -390,7 +390,7 @@
    -
    -
    - No more than 5.0% -
    -
    - No less than 0.6% -
    -
    - Required Field -
    -
    - -
    -
    -
    - -
    -
    - -
    %
    -
    -
    -
    - No more than 5.0% -
    -
    - No less than 0.6% -
    -
    - Required Field -
    -
    - -
    -
    - -
    diff --git a/src/main/ui/static/payment/partner/templates/partner_payment_info.html b/src/main/ui/static/payment/partner/templates/partner_payment_info.html index ad5e3c2b7..59c8f5422 100644 --- a/src/main/ui/static/payment/partner/templates/partner_payment_info.html +++ b/src/main/ui/static/payment/partner/templates/partner_payment_info.html @@ -56,14 +56,6 @@

    -
    - -
    -

    - {{paymentInfo.yeepay_sub_merchant_id||'初始化'}} -

    -
    -
    @@ -597,16 +589,6 @@ switch-change="toggleRequireRemark()">
    -
    - -
    - -
    -
    diff --git a/src/main/ui/static/payment/product/templates/partner_product.html b/src/main/ui/static/payment/product/templates/partner_product.html index ba9f8ffb2..c1e9c654c 100644 --- a/src/main/ui/static/payment/product/templates/partner_product.html +++ b/src/main/ui/static/payment/product/templates/partner_product.html @@ -14,10 +14,6 @@ class="channel-icon-mid"> - -
  • @@ -42,4 +38,4 @@
  • -
    \ No newline at end of file +
    diff --git a/src/main/ui/static/payment/tradelog/templates/balance_report.html b/src/main/ui/static/payment/tradelog/templates/balance_report.html index c54962cbe..2b284e8f3 100644 --- a/src/main/ui/static/payment/tradelog/templates/balance_report.html +++ b/src/main/ui/static/payment/tradelog/templates/balance_report.html @@ -154,18 +154,8 @@ ng-class="{'bg-primary':params.channel=='ALIPAYONLINE'}" ng-click="params.channel='ALIPAYONLINE';loadTradeLogs(1)">AlipayOnline | - BestPay | - JD Pay | - HF Pay | RPay + | - Yeepay | - LakalaPay | Card Payment | AlipayOnline | - BestPay | - JD Pay | - HF Pay | RPay + | - Yeepay | - LakalaPay | Card Payment | - - - - - - -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • -
  • - - - -
  • diff --git a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html index b715730be..49fa74723 100644 --- a/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html +++ b/src/main/ui/static/payment/tradelog/templates/partner_trade_logs.html @@ -208,18 +208,8 @@ ng-class="{'bg-primary':params.channel=='ALIPAYONLINE'}" ng-click="params.channel='ALIPAYONLINE';loadTradeLogs(1)">AlipayOnline | - BestPay | - JD Pay | - HF Pay | RPay+ | - Yeepay | - LakalaPay | Card Payment | - - {{trade.order_id}} @@ -170,4 +168,4 @@
  • -
    \ No newline at end of file +
    diff --git a/src/main/ui/static/risk/risk.js b/src/main/ui/static/risk/risk.js index 8d84298cd..bdf27ebc7 100644 --- a/src/main/ui/static/risk/risk.js +++ b/src/main/ui/static/risk/risk.js @@ -284,8 +284,7 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }; }]); app.controller('newRiskCtrl', ['$scope', '$http','commonDialog', function ($scope, $http,commonDialog) { - $scope.attentions = {"enjoin_wechat": true,"enjoin_alipay": true,"enjoin_bestpay": true, - "enjoin_jd": true,"enjoin_hf": true} + $scope.attentions = {"enjoin_wechat": true,"enjoin_alipay": true} $scope.save = function (attentions) { var params = angular.copy(attentions); $http.post('/sys/risk/attention/'+ attentions.client_moniker, params).then(function () { @@ -374,4 +373,4 @@ define(['angular', 'static/commons/commons', 'uiBootstrap', 'uiRouter', 'ngBootS }); return app; -}); \ No newline at end of file +}); diff --git a/src/main/ui/static/risk/templates/attention_merchants.html b/src/main/ui/static/risk/templates/attention_merchants.html index 6d98cbd24..99370c5f6 100644 --- a/src/main/ui/static/risk/templates/attention_merchants.html +++ b/src/main/ui/static/risk/templates/attention_merchants.html @@ -73,9 +73,6 @@ Wechat Alipay - Bestpay - JD - HF
    -
    \ No newline at end of file +
    diff --git a/src/main/ui/static/risk/templates/risk_add.html b/src/main/ui/static/risk/templates/risk_add.html index 0911e621e..3d83790ce 100644 --- a/src/main/ui/static/risk/templates/risk_add.html +++ b/src/main/ui/static/risk/templates/risk_add.html @@ -36,15 +36,6 @@ - - -

    @@ -58,4 +49,4 @@
    -
    \ No newline at end of file +
    diff --git a/src/main/ui/static/risk/templates/risk_merchant_edit.html b/src/main/ui/static/risk/templates/risk_merchant_edit.html index 49b7d7a06..106b4f2d3 100644 --- a/src/main/ui/static/risk/templates/risk_merchant_edit.html +++ b/src/main/ui/static/risk/templates/risk_merchant_edit.html @@ -28,15 +28,6 @@ - - -

    @@ -50,4 +41,4 @@
    -
    \ No newline at end of file +
    diff --git a/src/test/java/au/com/royalpay/payment/manage/process/aes/AESTest.java b/src/test/java/au/com/royalpay/payment/manage/process/aes/AESTest.java index 52585cd63..8d01280c3 100644 --- a/src/test/java/au/com/royalpay/payment/manage/process/aes/AESTest.java +++ b/src/test/java/au/com/royalpay/payment/manage/process/aes/AESTest.java @@ -1,7 +1,7 @@ package au.com.royalpay.payment.manage.process.aes; import au.com.royalpay.payment.tools.codec.AESCrypt; -import org.apache.commons.net.util.Base64; +import org.apache.commons.codec.binary.Base64; import org.junit.Test; import java.nio.charset.StandardCharsets; diff --git a/src/test/java/au/com/royalpay/payment/manage/valid/JPinYinTest.java b/src/test/java/au/com/royalpay/payment/manage/valid/JPinYinTest.java index 12160b5d6..1e6f60251 100644 --- a/src/test/java/au/com/royalpay/payment/manage/valid/JPinYinTest.java +++ b/src/test/java/au/com/royalpay/payment/manage/valid/JPinYinTest.java @@ -6,8 +6,8 @@ import au.com.royalpay.payment.tools.codec.AESCrypt; import au.com.royalpay.payment.tools.encryptalgorithm.SignUtils; import com.alibaba.fastjson.JSONObject; import com.github.stuxuhai.jpinyin.PinyinException; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.net.util.Base64; import org.junit.Test; import javax.crypto.BadPaddingException; diff --git a/src/test/java/au/com/royalpay/payment/manage/valid/QCloudSignTest.java b/src/test/java/au/com/royalpay/payment/manage/valid/QCloudSignTest.java index e10e6aac4..7a44b32aa 100644 --- a/src/test/java/au/com/royalpay/payment/manage/valid/QCloudSignTest.java +++ b/src/test/java/au/com/royalpay/payment/manage/valid/QCloudSignTest.java @@ -1,11 +1,10 @@ package au.com.royalpay.payment.manage.valid; import au.com.royalpay.payment.manage.support.serverless.qcloud.support.ServerLessFunctionInvokeRequest; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.net.util.Base64; import org.junit.Test; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.ResponseEntity; From a1bbc19efd270d467a8019cec505380af7646efc Mon Sep 17 00:00:00 2001 From: yixian Date: Tue, 12 May 2020 16:27:04 +1000 Subject: [PATCH 095/110] fix: client modify process --- .../manage/merchants/core/ClientManager.java | 17 +++-- .../merchants/core/ClientModifySupport.java | 8 +- .../core/impls/ClientManagerImpl.java | 20 +++-- .../core/impls/ClientModifySupportImpl.java | 33 +++++--- .../entity/ClientGatewaySignModify.java | 71 ++++-------------- .../manage/merchants/entity/ClientModify.java | 75 ++++--------------- ...Modify.java => ClientModifyOperation.java} | 59 ++++++--------- .../impls/CBBankPaypadVersionModify.java | 10 +-- .../entity/impls/ClearDaysModify.java | 15 ++-- .../entity/impls/CredentialCodeModify.java | 13 ++-- .../entity/impls/CustomSwitchModify.java | 43 +++++++++++ .../impls/CustomerSurchargeRateModify.java | 15 ++-- .../entity/impls/EmailSendStandByModify.java | 15 ++-- .../entity/impls/MaxOrderAmountModify.java | 15 ++-- .../entity/impls/OrderExpiryModify.java | 13 ++-- .../entity/impls/PaypadVersionModify.java | 13 ++-- .../entity/impls/RefundAuditModify.java | 9 +-- .../entity/impls/RefundPWDModify.java | 5 +- .../entity/impls/SettleHourModify.java | 15 ++-- .../entity/impls/SurchargeModeModify.java | 1 - .../SwitchAllowSurchargeCreditModify.java | 1 - .../entity/impls/SwitchPermissionModify.java | 12 ++- .../web/PartnerManageController.java | 2 +- 23 files changed, 219 insertions(+), 261 deletions(-) rename src/main/java/au/com/royalpay/payment/manage/merchants/entity/{ClientConfigModify.java => ClientModifyOperation.java} (53%) create mode 100644 src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomSwitchModify.java diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index 291435655..0d21c9e23 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -99,6 +99,9 @@ public interface ClientManager { @Transactional void switchPermission(JSONObject manager, String clientMoniker, String permissionKey, boolean allow); + @Transactional + void modifyUPayProfile(JSONObject manager, String clientMoniker, String profileKey, boolean allow); + @Transactional void switchChannelPermission(JSONObject manager, String clientMoniker, String channel, boolean allow); @@ -176,7 +179,7 @@ public interface ClientManager { List listSubClients(JSONObject manager, String clientMoniker); - JSONObject listSubClientsByPage(JSONObject manager, String clientMoniker,String searchText, int page); + JSONObject listSubClientsByPage(JSONObject manager, String clientMoniker, String searchText, int page); List listSubClients(int clientId); @@ -210,6 +213,7 @@ public interface ClientManager { /** * 获取所有设备Id分类 + * * @param clientMoniker * @param client_type * @param client_ids @@ -253,9 +257,9 @@ public interface ClientManager { void revertClient(String clientMoniker, JSONObject manager); - void updateClientIdInfo(String clientMoniker,JSONObject params, JSONObject manager); + void updateClientIdInfo(String clientMoniker, JSONObject params, JSONObject manager); - void updateMWRiskInfoByClient(String clientMoniker,JSONObject params, JSONObject manager); + void updateMWRiskInfoByClient(String clientMoniker, JSONObject params, JSONObject manager); JSONObject getAuthFiles(JSONObject manager, String clientMoniker); @@ -287,7 +291,7 @@ public interface ClientManager { List uploadKycFilesForWaitCompliance(JSONObject manager, String clientMoniker, ClientKycFilesInfo filesInfo); - List uploadKycFilesForWaitComplianceForApp(JSONObject account, String clientMoniker, JSONObject filesInfo,String fileType); + List uploadKycFilesForWaitComplianceForApp(JSONObject account, String clientMoniker, JSONObject filesInfo, String fileType); List uploadAuthFilesForWaitCompliance(JSONObject manager, String clientMoniker, ClientAuthFilesInfo filesInfo); @@ -307,6 +311,7 @@ public interface ClientManager { /** * 提交资料,申请卡支付 + * * @param clientMoniker * @param manager */ @@ -392,7 +397,7 @@ public interface ClientManager { void getAggregateCardAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; - void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal,String promotionalEffectiveDate,int promotionalPeriod) throws Exception; + void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal, String promotionalEffectiveDate, int promotionalPeriod) throws Exception; void getNewAggregateAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; @@ -587,7 +592,7 @@ public interface ClientManager { boolean getMergeSettleStatus(JSONObject client); - void changeExtParams(String clientMoniker,JSONObject manager, JSONObject params); + void changeExtParams(String clientMoniker, JSONObject manager, JSONObject params); RPayMerchantEntity applyMWMerchantId(String clientMoniker, JSONObject manager); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientModifySupport.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientModifySupport.java index 8d32edf4e..34b6a6fc1 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientModifySupport.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientModifySupport.java @@ -1,19 +1,21 @@ package au.com.royalpay.payment.manage.merchants.core; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; import au.com.royalpay.payment.manage.merchants.entity.ClientGatewaySignModify; import au.com.royalpay.payment.manage.merchants.entity.ClientModify; +import au.com.royalpay.payment.manage.merchants.entity.ClientModifyOperation; /** * Create by yixian at 2018-04-12 16:24 */ public interface ClientModifySupport { + void processModify(ClientModifyOperation modify); + void processClientModify(ClientModify clientModify); - void processClientConfigModify(ClientConfigModify clientConfigModify); + void processClientConfigModify(ClientModify clientConfigModify); - void processClientConfigModify(ClientConfigModify clientConfigModify, boolean onlyModifyConfig); + void processClientConfigModify(ClientModify clientConfigModify, boolean onlyModifyConfig); void processClientGatewaySignModify(ClientGatewaySignModify clientGatewaySignModify); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 9172a14c7..e16a698f5 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -1625,11 +1625,21 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new InvalidShortIdException(); } clientModifySupport.processClientConfigModify(new SwitchPermissionModify(manager, clientMoniker, permissionKey, allow)); - JSONObject upayProfileInfo = sysClientUpayProfileMapper.findInfo(client.getInteger("client_id")); - if (upayProfileInfo != null) { - upayProfileInfo.put(permissionKey, allow); - sysClientUpayProfileMapper.update(upayProfileInfo); + } + + @Override + @Transactional + public void modifyUPayProfile(JSONObject manager, String clientMoniker, String profileKey, boolean allow) { + JSONObject client = getClientInfoByMoniker(clientMoniker); + if (client == null) { + throw new InvalidShortIdException(); } + clientModifySupport.processModify(new CustomSwitchModify(manager, clientMoniker, profileKey, allow, cli -> { + JSONObject profileUpdate = new JSONObject(); + profileUpdate.put(profileKey, allow); + profileUpdate.put("client_id", cli.getIntValue("client_id")); + sysClientUpayProfileMapper.update(profileUpdate); + })); } @Override @@ -3142,7 +3152,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid client.put("clean_days", p.getString("clean_days")); } else if ("Alipay".equals(rate_name)) { client.put("alipay_rate", p.getBigDecimal("rate_value").setScale(2, BigDecimal.ROUND_DOWN)); - }else if ("AlipayOnline".equals(rate_name)) { + } else if ("AlipayOnline".equals(rate_name)) { client.put("alipay_online_rate", p.getBigDecimal("rate_value").setScale(2, BigDecimal.ROUND_DOWN)); } }); diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientModifySupportImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientModifySupportImpl.java index f1a1b002b..cbfe34003 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientModifySupportImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientModifySupportImpl.java @@ -5,11 +5,10 @@ import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.mappers.system.MerchantSignInfoMapper; import au.com.royalpay.payment.manage.merchants.core.ClientInfoCacheSupport; import au.com.royalpay.payment.manage.merchants.core.ClientModifySupport; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; import au.com.royalpay.payment.manage.merchants.entity.ClientGatewaySignModify; import au.com.royalpay.payment.manage.merchants.entity.ClientModify; +import au.com.royalpay.payment.manage.merchants.entity.ClientModifyOperation; import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; - import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; @@ -34,26 +33,36 @@ public class ClientModifySupportImpl implements ClientModifySupport { private MongoTemplate mongoTemplate; @Override - public void processClientModify(ClientModify modify) { - int clientId = modify.doModify(merchantInfoProvider, clientMapper,mongoTemplate); + public void processModify(ClientModifyOperation modify) { + int clientId = modify.processModify(merchantInfoProvider, mongoTemplate); clientInfoCacheSupport.clearClientCache(clientId); } @Override - public void processClientConfigModify(ClientConfigModify clientConfigModify) { - int clientId =clientConfigModify.doModify(merchantInfoProvider, clientConfigMapper,clientMapper,mongoTemplate); - clientInfoCacheSupport.clearClientCache(clientId); + public void processClientModify(ClientModify modify) { + processModify(modify.setModifyConsumer(modifyObj -> clientMapper.update(modifyObj))); } @Override - public void processClientConfigModify(ClientConfigModify clientConfigModify,boolean onlyModifyConfig) { - int clientId =clientConfigModify.doModify(merchantInfoProvider, clientConfigMapper,clientMapper,mongoTemplate,onlyModifyConfig); - clientInfoCacheSupport.clearClientConfigCache(clientId); + public void processClientConfigModify(ClientModify clientConfigModify) { + processModify(clientConfigModify.setModifyConsumer(modifyObj -> { + clientMapper.update(modifyObj); + clientConfigMapper.update(modifyObj); + })); + } + + @Override + public void processClientConfigModify(ClientModify clientConfigModify, boolean onlyModifyConfig) { + processModify(clientConfigModify.setModifyConsumer(modifyObj -> { + if (!onlyModifyConfig) { + clientMapper.update(modifyObj); + } + clientConfigMapper.update(modifyObj); + })); } @Override public void processClientGatewaySignModify(ClientGatewaySignModify clientGatewaySignModify) { - int clientId =clientGatewaySignModify.doModify(merchantInfoProvider, merchantSignInfoMapper,mongoTemplate); - clientInfoCacheSupport.clearClientCache(clientId); + processModify(clientGatewaySignModify.setMerchantSignInfoMapper(merchantSignInfoMapper)); } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientGatewaySignModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientGatewaySignModify.java index 2c72380bf..e3dd601ca 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientGatewaySignModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientGatewaySignModify.java @@ -1,78 +1,39 @@ package au.com.royalpay.payment.manage.merchants.entity; import au.com.royalpay.payment.manage.mappers.system.MerchantSignInfoMapper; -import au.com.royalpay.payment.manage.merchants.beans.mongo.ClientConfigLog; -import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; -import au.com.royalpay.payment.tools.utils.id.IdUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import org.apache.commons.lang3.StringUtils; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.transaction.annotation.Transactional; import java.util.Date; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.function.Consumer; /** * Create by yixian at 2018-04-12 16:19 */ -public abstract class ClientGatewaySignModify { +public abstract class ClientGatewaySignModify extends ClientModifyOperation { - private JSONObject account; - - private String clientMoniker; + private MerchantSignInfoMapper merchantSignInfoMapper; public ClientGatewaySignModify(JSONObject account, String clientMoniker) { - this.account = account; - this.clientMoniker = clientMoniker; + super(account, clientMoniker); } protected abstract String business(); protected abstract JSONObject getModifyResult(); - @Transactional - public int doModify(MerchantInfoProvider merchantInfoProvider, MerchantSignInfoMapper merchantSignInfoMapper, MongoTemplate mongoTemplate) { - JSONObject client = merchantInfoProvider.getClientInfoByMoniker(clientMoniker); - JSONObject clientGatewaySign = merchantSignInfoMapper.findClientSign(clientMoniker); - JSONObject modifyResult = getModifyResult(); - try { - saveModifyHistory(clientGatewaySign, modifyResult, mongoTemplate); - }catch (Exception e){ - - } - int clientId = client.getIntValue("client_id"); - modifyResult.put("client_moniker", clientMoniker); - modifyResult.put("last_update_by", account.getString("account_id")); - modifyResult.put("last_update_date", new Date()); - merchantSignInfoMapper.update(modifyResult); - return clientId; + @Override + protected Consumer getModifyProcess() { + return client -> { + JSONObject modifyResult = getModifyResult(); + modifyResult.put("client_moniker", getClientMoniker()); + modifyResult.put("last_update_by", getAccount().getString("account_id")); + modifyResult.put("last_update_date", new Date()); + merchantSignInfoMapper.update(modifyResult); + }; } - private void saveModifyHistory(JSONObject clientGatewaySign, JSONObject modifyResult, MongoTemplate mongoTemplate) { - if (account == null) { - return; - } - ClientConfigLog clientConfigLog = new ClientConfigLog(); - clientConfigLog.setId(IdUtil.getId()); - clientConfigLog.setBusiness(business()); - clientConfigLog.setClientId(clientGatewaySign.getIntValue("client_id")); - - boolean isPartner = true; - if (StringUtils.isNotEmpty(account.getString("account_id"))) { - isPartner = true; - } - if (StringUtils.isNotEmpty(account.getString("manager_id"))) { - isPartner = false; - } - clientConfigLog.setUserType(isPartner ? "Merchant" : "Manager"); - clientConfigLog.setCreateTime(new Date()); - clientConfigLog.setNewData(modifyResult.toJSONString()); - clientConfigLog.setUserId(isPartner ? account.getString("account_id") : account.getString("manager_id")); - Map beforeModify = modifyResult.keySet().stream().collect(Collectors.toMap(key -> key, clientGatewaySign::get)); - clientConfigLog.setOriginData(JSON.toJSONString(beforeModify)); - clientConfigLog.setUserName(isPartner ? account.getString("display_name") : account.getString("display_name")); - mongoTemplate.save(clientConfigLog); + public ClientGatewaySignModify setMerchantSignInfoMapper(MerchantSignInfoMapper merchantSignInfoMapper) { + this.merchantSignInfoMapper = merchantSignInfoMapper; + return this; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModify.java index cf33238d9..d0e036a35 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModify.java @@ -1,77 +1,32 @@ package au.com.royalpay.payment.manage.merchants.entity; -import au.com.royalpay.payment.manage.mappers.system.ClientMapper; -import au.com.royalpay.payment.manage.merchants.beans.mongo.ClientConfigLog; -import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; -import au.com.royalpay.payment.tools.utils.id.IdUtil; - -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import org.apache.commons.lang3.StringUtils; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Date; -import java.util.Map; -import java.util.stream.Collectors; +import java.util.function.Consumer; /** * Create by yixian at 2018-04-12 16:19 */ -public abstract class ClientModify { +public abstract class ClientModify extends ClientModifyOperation { - private JSONObject account; - - private String clientMoniker; + private Consumer modifyConsumer; public ClientModify(JSONObject account, String clientMoniker) { - this.account = account; - this.clientMoniker = clientMoniker; + super(account, clientMoniker); } - protected abstract String business(); - - protected abstract JSONObject getModifyResult(); - - @Transactional - public int doModify(MerchantInfoProvider merchantInfoProvider, ClientMapper clientMapper, MongoTemplate mongoTemplate) { - JSONObject client = merchantInfoProvider.getClientInfoByMoniker(clientMoniker); - JSONObject modifyResult = getModifyResult(); - try { - saveModifyHistory(client, modifyResult, mongoTemplate); - }catch (Exception e){ - - } - int clientId = client.getIntValue("client_id"); - modifyResult.put("client_id", clientId); - clientMapper.update(modifyResult); - return clientId; + @Override + protected Consumer getModifyProcess() { + return client -> { + JSONObject modifyResult = getModifyResult(); + int clientId = client.getIntValue("client_id"); + modifyResult.put("client_id", clientId); + modifyConsumer.accept(modifyResult); + }; } - private void saveModifyHistory(JSONObject client, JSONObject modifyResult, MongoTemplate mongoTemplate) { - if (account == null) { - return; - } - ClientConfigLog clientConfigLog = new ClientConfigLog(); - clientConfigLog.setId(IdUtil.getId()); - clientConfigLog.setBusiness(business()); - clientConfigLog.setClientId(client.getIntValue("client_id")); - - boolean isPartner = true; - if (StringUtils.isNotEmpty(account.getString("account_id"))) { - isPartner = true; - } - if (StringUtils.isNotEmpty(account.getString("manager_id"))) { - isPartner = false; - } - clientConfigLog.setUserType(isPartner ? "Merchant" : "Manager"); - clientConfigLog.setCreateTime(new Date()); - clientConfigLog.setNewData(modifyResult.toJSONString()); - clientConfigLog.setUserId(isPartner ? account.getString("account_id") : account.getString("manager_id")); - Map beforeModify = modifyResult.keySet().stream().collect(Collectors.toMap(key -> key, client::get)); - clientConfigLog.setOriginData(JSON.toJSONString(beforeModify)); - clientConfigLog.setUserName(isPartner ? account.getString("display_name") : account.getString("display_name")); - mongoTemplate.save(clientConfigLog); + public ClientModify setModifyConsumer(Consumer modifyConsumer) { + this.modifyConsumer = modifyConsumer; + return this; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientConfigModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModifyOperation.java similarity index 53% rename from src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientConfigModify.java rename to src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModifyOperation.java index 18c50176c..d84d8c4ca 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientConfigModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/ClientModifyOperation.java @@ -1,32 +1,26 @@ package au.com.royalpay.payment.manage.merchants.entity; -import au.com.royalpay.payment.manage.mappers.system.ClientConfigMapper; -import au.com.royalpay.payment.manage.mappers.system.ClientMapper; import au.com.royalpay.payment.manage.merchants.beans.mongo.ClientConfigLog; import au.com.royalpay.payment.tools.merchants.core.MerchantInfoProvider; import au.com.royalpay.payment.tools.utils.id.IdUtil; - import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; - import org.apache.commons.lang3.StringUtils; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.Map; +import java.util.function.Consumer; import java.util.stream.Collectors; /** - * Create by yixian at 2018-04-12 16:19 + * Create by davep at 2020-05-12 14:32 */ -public abstract class ClientConfigModify { - - private JSONObject account; - - private String clientMoniker; +public abstract class ClientModifyOperation { + private final JSONObject account; + private final String clientMoniker; - public ClientConfigModify(JSONObject account, String clientMoniker) { + protected ClientModifyOperation(JSONObject account, String clientMoniker) { this.account = account; this.clientMoniker = clientMoniker; } @@ -35,36 +29,21 @@ public abstract class ClientConfigModify { protected abstract JSONObject getModifyResult(); - public int doModify(MerchantInfoProvider merchantInfoProvider, ClientConfigMapper clientConfigMapper, ClientMapper clientMapper, MongoTemplate mongoTemplate) { - JSONObject client = merchantInfoProvider.getClientInfoByMoniker(clientMoniker); - JSONObject modifyResult = getModifyResult(); - try { - saveModifyHistory(client, modifyResult, mongoTemplate); - }catch (Exception e){ + protected abstract Consumer getModifyProcess(); - } - int clientId = client.getIntValue("client_id"); - modifyResult.put("client_id", clientId); - clientConfigMapper.update(modifyResult); - clientMapper.update(modifyResult); - return clientId; - } - - public int doModify(MerchantInfoProvider merchantInfoProvider, ClientConfigMapper clientConfigMapper, ClientMapper clientMapper, MongoTemplate mongoTemplate,boolean onlyModifyConfig) { - JSONObject clientConfig = merchantInfoProvider.getClientConfigInfoByMoniker(clientMoniker); + public int processModify(MerchantInfoProvider merchantInfoProvider, MongoTemplate mongoTemplate) { + JSONObject client = merchantInfoProvider.getClientInfoByMoniker(getClientMoniker()); JSONObject modifyResult = getModifyResult(); try { - saveModifyHistory(clientConfig, modifyResult, mongoTemplate); - }catch (Exception e){ + saveModifyHistory(client, modifyResult, mongoTemplate); + } catch (Exception e) { } - int clientId = clientConfig.getIntValue("client_id"); - modifyResult.put("client_id", clientId); - clientConfigMapper.update(modifyResult); - return clientId; + getModifyProcess().accept(client); + return client.getIntValue("client_id"); } - private void saveModifyHistory(JSONObject client, JSONObject modifyResult,MongoTemplate mongoTemplate) { + protected void saveModifyHistory(JSONObject client, JSONObject modifyResult, MongoTemplate mongoTemplate) { if (account == null) { return; } @@ -86,7 +65,15 @@ public abstract class ClientConfigModify { clientConfigLog.setUserId(isPartner ? account.getString("account_id") : account.getString("manager_id")); Map beforeModify = modifyResult.keySet().stream().collect(Collectors.toMap(key -> key, client::get)); clientConfigLog.setOriginData(JSON.toJSONString(beforeModify)); - clientConfigLog.setUserName(isPartner ? account.getString("display_name") : account.getString("display_name")); + clientConfigLog.setUserName(account.getString("display_name")); mongoTemplate.insert(clientConfigLog); } + + public JSONObject getAccount() { + return account; + } + + public String getClientMoniker() { + return clientMoniker; + } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CBBankPaypadVersionModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CBBankPaypadVersionModify.java index 4c4db3701..6d87f14ec 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CBBankPaypadVersionModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CBBankPaypadVersionModify.java @@ -1,17 +1,17 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class CBBankPaypadVersionModify extends ClientConfigModify { - private String cbbank_paypad_version; +public class CBBankPaypadVersionModify extends ClientModify { + private String cbbankPaypadVersion; public CBBankPaypadVersionModify(JSONObject account, String clientMoniker, String paypad_version) { super(account, clientMoniker); - this.cbbank_paypad_version = paypad_version; + this.cbbankPaypadVersion = paypad_version; } @Override @@ -23,7 +23,7 @@ public class CBBankPaypadVersionModify extends ClientConfigModify { @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("cbbank_paypad_version", cbbank_paypad_version); + modify.put("cbbank_paypad_version", cbbankPaypadVersion); return modify; } } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/ClearDaysModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/ClearDaysModify.java index b53b5289c..18d53654c 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/ClearDaysModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/ClearDaysModify.java @@ -1,30 +1,29 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class ClearDaysModify extends ClientConfigModify { - private int settle_hour; +public class ClearDaysModify extends ClientModify { + private int settleHour; - public ClearDaysModify(JSONObject account, String clientMoniker, int settle_hour) { + public ClearDaysModify(JSONObject account, String clientMoniker, int settleHour) { super(account, clientMoniker); - this.settle_hour = settle_hour; + this.settleHour = settleHour; } @Override protected String business() { - return "修改商户清算截止时间为:"+settle_hour; + return "修改商户清算截止时间为:" + settleHour; } @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("settle_hour", settle_hour); + modify.put("settle_hour", settleHour); return modify; } } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CredentialCodeModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CredentialCodeModify.java index b586c1761..83bf41b6e 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CredentialCodeModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CredentialCodeModify.java @@ -1,19 +1,18 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class CredentialCodeModify extends ClientConfigModify { - private String credential_code; +public class CredentialCodeModify extends ClientModify { + private String credentialCode; - public CredentialCodeModify(JSONObject account, String clientMoniker, String credential_code) { + public CredentialCodeModify(JSONObject account, String clientMoniker, String credentialCode) { super(account, clientMoniker); - this.credential_code = credential_code; + this.credentialCode = credentialCode; } @Override @@ -24,7 +23,7 @@ public class CredentialCodeModify extends ClientConfigModify { @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("credential_code", credential_code); + modify.put("credential_code", credentialCode); return modify; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomSwitchModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomSwitchModify.java new file mode 100644 index 000000000..82b180a0d --- /dev/null +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomSwitchModify.java @@ -0,0 +1,43 @@ +package au.com.royalpay.payment.manage.merchants.entity.impls; + +import au.com.royalpay.payment.manage.merchants.entity.ClientModifyOperation; +import com.alibaba.fastjson.JSONObject; + +import java.util.function.Consumer; + +/** + * Create by yixian at 2018-04-12 16:43 + */ +public class CustomSwitchModify extends ClientModifyOperation { + private final String key; + private final boolean value; + private final Consumer modifyProcess; + + + public CustomSwitchModify(JSONObject account, String clientMoniker, String key, boolean value, Consumer modifyProcess) { + super(account, clientMoniker); + this.key = key; + this.value = value; + this.modifyProcess = modifyProcess; + } + + @Override + protected String business() { + + return (value ? "开启 " : "关闭 ") + key; + } + + @Override + protected JSONObject getModifyResult() { + JSONObject modify = new JSONObject(); + modify.put(key, value); + return modify; + } + + @Override + protected Consumer getModifyProcess() { + return modifyProcess; + } + + +} \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomerSurchargeRateModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomerSurchargeRateModify.java index 23544c98e..1afc7b5f4 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomerSurchargeRateModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/CustomerSurchargeRateModify.java @@ -1,7 +1,6 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; import java.math.BigDecimal; @@ -9,24 +8,24 @@ import java.math.BigDecimal; /** * Create by yixian at 2018-04-12 16:43 */ -public class CustomerSurchargeRateModify extends ClientConfigModify { - private BigDecimal customer_surcharge_rate; +public class CustomerSurchargeRateModify extends ClientModify { + private BigDecimal customerSurchargeRate; - public CustomerSurchargeRateModify(JSONObject account, String clientMoniker, BigDecimal customer_surcharge_rate) { + public CustomerSurchargeRateModify(JSONObject account, String clientMoniker, BigDecimal customerSurchargeRate) { super(account, clientMoniker); - this.customer_surcharge_rate = customer_surcharge_rate; + this.customerSurchargeRate = customerSurchargeRate; } @Override protected String business() { - return "修改商户客户手续费率为:"+customer_surcharge_rate; + return "修改商户客户手续费率为:" + customerSurchargeRate; } @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("customer_surcharge_rate", customer_surcharge_rate); + modify.put("customer_surcharge_rate", customerSurchargeRate); return modify; } } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/EmailSendStandByModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/EmailSendStandByModify.java index f8e4f9323..ad9db9163 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/EmailSendStandByModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/EmailSendStandByModify.java @@ -1,7 +1,6 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; import java.math.BigDecimal; @@ -9,24 +8,24 @@ import java.math.BigDecimal; /** * Create by yixian at 2018-04-12 16:43 */ -public class EmailSendStandByModify extends ClientConfigModify { - private BigDecimal max_order_amount; +public class EmailSendStandByModify extends ClientModify { + private BigDecimal maxOrderAmount; - public EmailSendStandByModify(JSONObject account, String clientMoniker, BigDecimal max_order_amount) { + public EmailSendStandByModify(JSONObject account, String clientMoniker, BigDecimal maxOrderAmount) { super(account, clientMoniker); - this.max_order_amount = max_order_amount; + this.maxOrderAmount = maxOrderAmount; } @Override protected String business() { - return "修改商户最大订单额为:"+max_order_amount; + return "修改商户最大订单额为:" + maxOrderAmount; } @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("max_order_amount", max_order_amount); + modify.put("max_order_amount", maxOrderAmount); return modify; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/MaxOrderAmountModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/MaxOrderAmountModify.java index 87e75bee6..d1c186876 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/MaxOrderAmountModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/MaxOrderAmountModify.java @@ -1,7 +1,6 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; import java.math.BigDecimal; @@ -9,24 +8,24 @@ import java.math.BigDecimal; /** * Create by yixian at 2018-04-12 16:43 */ -public class MaxOrderAmountModify extends ClientConfigModify { - private BigDecimal max_order_amount; +public class MaxOrderAmountModify extends ClientModify { + private BigDecimal maxOrderAmount; - public MaxOrderAmountModify(JSONObject account, String clientMoniker, BigDecimal max_order_amount) { + public MaxOrderAmountModify(JSONObject account, String clientMoniker, BigDecimal maxOrderAmount) { super(account, clientMoniker); - this.max_order_amount = max_order_amount; + this.maxOrderAmount = maxOrderAmount; } @Override protected String business() { - return "修改商户最大订单额为:"+max_order_amount; + return "修改商户最大订单额为:" + maxOrderAmount; } @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("max_order_amount", max_order_amount); + modify.put("max_order_amount", maxOrderAmount); return modify; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/OrderExpiryModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/OrderExpiryModify.java index 6ca63adf8..163d874e7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/OrderExpiryModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/OrderExpiryModify.java @@ -1,19 +1,18 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class OrderExpiryModify extends ClientConfigModify { - private String order_expiry_config; +public class OrderExpiryModify extends ClientModify { + private String orderExpiryConfig; - public OrderExpiryModify(JSONObject account, String clientMoniker, String order_expiry_config) { + public OrderExpiryModify(JSONObject account, String clientMoniker, String orderExpiryConfig) { super(account, clientMoniker); - this.order_expiry_config = order_expiry_config; + this.orderExpiryConfig = orderExpiryConfig; } @Override @@ -24,7 +23,7 @@ public class OrderExpiryModify extends ClientConfigModify { @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("order_expiry_config", order_expiry_config); + modify.put("order_expiry_config", orderExpiryConfig); return modify; } } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/PaypadVersionModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/PaypadVersionModify.java index 6972662ec..ea81abe5d 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/PaypadVersionModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/PaypadVersionModify.java @@ -1,18 +1,17 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class PaypadVersionModify extends ClientConfigModify { - private String paypad_version; +public class PaypadVersionModify extends ClientModify { + private String paypadVersion; - public PaypadVersionModify(JSONObject account, String clientMoniker, String paypad_version) { + public PaypadVersionModify(JSONObject account, String clientMoniker, String paypadVersion) { super(account, clientMoniker); - this.paypad_version = paypad_version; + this.paypadVersion = paypadVersion; } @Override @@ -24,7 +23,7 @@ public class PaypadVersionModify extends ClientConfigModify { @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("paypad_version", paypad_version); + modify.put("paypad_version", paypadVersion); return modify; } } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundAuditModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundAuditModify.java index 52de0d4be..c68e90989 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundAuditModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundAuditModify.java @@ -1,23 +1,22 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class RefundAuditModify extends ClientConfigModify { +public class RefundAuditModify extends ClientModify { private boolean enable; public RefundAuditModify(JSONObject account, String clientMoniker, boolean enable) { - super( account, clientMoniker); + super(account, clientMoniker); this.enable = enable; } @Override protected String business() { - return (enable?"打开":"关闭")+"refund_audit"; + return (enable ? "打开" : "关闭") + "refund_audit"; } @Override diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundPWDModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundPWDModify.java index 15e252685..2c3bea1aa 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundPWDModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/RefundPWDModify.java @@ -1,13 +1,12 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class RefundPWDModify extends ClientConfigModify { +public class RefundPWDModify extends ClientModify { private String refund_pwd; private String refund_pwd_salt; diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SettleHourModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SettleHourModify.java index 8951f5294..cf963abc8 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SettleHourModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SettleHourModify.java @@ -1,30 +1,29 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class SettleHourModify extends ClientConfigModify { - private Integer settle_hour; +public class SettleHourModify extends ClientModify { + private Integer settleHour; - public SettleHourModify(JSONObject account, String clientMoniker, Integer settle_hour) { + public SettleHourModify(JSONObject account, String clientMoniker, Integer settleHour) { super(account, clientMoniker); - this.settle_hour = settle_hour; + this.settleHour = settleHour; } @Override protected String business() { - return "修改商户清算截止时间为:"+settle_hour; + return "修改商户清算截止时间为:" + settleHour; } @Override protected JSONObject getModifyResult() { JSONObject modify = new JSONObject(); - modify.put("settle_hour", settle_hour); + modify.put("settle_hour", settleHour); return modify; } } \ No newline at end of file diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SurchargeModeModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SurchargeModeModify.java index 28cd86c5c..4bd56b6c0 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SurchargeModeModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SurchargeModeModify.java @@ -1,6 +1,5 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchAllowSurchargeCreditModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchAllowSurchargeCreditModify.java index 50176f562..a6b676057 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchAllowSurchargeCreditModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchAllowSurchargeCreditModify.java @@ -1,6 +1,5 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchPermissionModify.java b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchPermissionModify.java index 0118080b0..c351fe7df 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchPermissionModify.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/entity/impls/SwitchPermissionModify.java @@ -1,15 +1,14 @@ package au.com.royalpay.payment.manage.merchants.entity.impls; -import au.com.royalpay.payment.manage.merchants.entity.ClientConfigModify; - +import au.com.royalpay.payment.manage.merchants.entity.ClientModify; import com.alibaba.fastjson.JSONObject; /** * Create by yixian at 2018-04-12 16:43 */ -public class SwitchPermissionModify extends ClientConfigModify { - private String key; - private boolean value; +public class SwitchPermissionModify extends ClientModify { + private final String key; + private final boolean value; public SwitchPermissionModify(JSONObject account, String clientMoniker, String key, boolean value) { super(account, clientMoniker); @@ -19,8 +18,7 @@ public class SwitchPermissionModify extends ClientConfigModify { @Override protected String business() { - - return (value?"开启 ":"关闭 ")+key; + return (value ? "开启 " : "关闭 ") + key; } @Override diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 59fae1acf..5ae92e4b2 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -990,7 +990,7 @@ public class PartnerManageController { */ @ManagerMapping(value = "/{clientMoniker}/payment_card_permission", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) public void switchInternationalCard(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ - clientManager.switchPermission(manager, clientMoniker, "enable_international_card", pass.getBooleanValue("allow")); + clientManager.modifyUPayProfile(manager, clientMoniker, "enable_international_card", pass.getBooleanValue("allow")); } } From 540fa49575f853b11cb18d1e6177d70dec303eef Mon Sep 17 00:00:00 2001 From: dulingling Date: Wed, 13 May 2020 09:24:07 +0800 Subject: [PATCH 096/110] =?UTF-8?q?Upd:=E4=BF=A1=E7=94=A8=E5=8D=A1?= =?UTF-8?q?=E5=90=88=E5=90=8C=E5=9B=BD=E9=99=85=E8=B4=B9=E7=94=A8=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../manage/merchants/core/impls/ClientManagerImpl.java | 5 +++-- src/main/resources/application-dev.yml | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index da2c73de3..998ba92f0 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 4.0.0 manage - 2.3.0 + 2.3.1 UTF-8 1.8.0 diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index e16a698f5..62f5b0e71 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -7149,7 +7149,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid info.put("annual_rate", cardAnnualRate);//年费率 info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 - info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 + info.put("international_fee", upayProfileInfo.getBoolean("enable_international_card")?cardRate.getString("overseas_rate_value"):"-");//国际服务费 BigDecimal reserve = (upayProfileInfo.getBigDecimal("expected_card_revenue").multiply(new BigDecimal(0.005)).setScale(0, RoundingMode.HALF_UP)); info.put("account_reserve", reserve.compareTo(new BigDecimal(200)) <= 0 ? new BigDecimal(200).toPlainString() : reserve.toPlainString());//账户储备金 //银行账号信息 @@ -7184,6 +7184,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } JSONObject cardRate = clientRate.getJSONObject("ext_rates"); JSONObject legalInfo = sysClientLegalPersonMapper.findRepresentativeInfo(clientId); + JSONObject upayProfileInfo = sysClientUpayProfileMapper.findInfo(clientId); JSONObject info = new JSONObject(); info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 @@ -7194,7 +7195,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 info.put("legal_bussiness", legalInfo.getString("representative_person") + " AS " + (client.containsKey("business_name") ? client.getString("business_name") : legalInfo.getString("representative_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 - info.put("international_fee", cardRate.getString("overseas_rate_value"));//国际服务费 + info.put("international_fee", upayProfileInfo.getBoolean("enable_international_card")?cardRate.getString("overseas_rate_value"):"-");//国际服务费 info.put("promotional_effective_date", promotionalEffectiveDate); info.put("promotional_period", promotionalPeriod); return info; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 3beef053f..8950b3d8d 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -3,13 +3,13 @@ spring: master: host: 192.168.0.84:3306 jdbc-url: jdbc:mysql://${spring.datasource.master.host}/${spring.datasource.master.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: rpayplus + password: rpayplus123 schema-name: royalpay username: root slave: host: 192.168.0.84:3306 jdbc-url: jdbc:mysql://${spring.datasource.slave.host}/${spring.datasource.slave.schema-name}?useUnicode=true&characterEncoding=utf8&useSSL=false - password: rpayplus + password: rpayplus123 schema-name: royalpay username: root type: com.zaxxer.hikari.HikariDataSource From d42a6fdcf6fbcf9dbef57d4febaf8b548491a2f8 Mon Sep 17 00:00:00 2001 From: "taylor.dang" Date: Wed, 13 May 2020 23:45:56 +0800 Subject: [PATCH 097/110] [Y] update upay --- pom.xml | 33 +- .../mappers/system/ClientRateMapper.java | 16 +- .../manage/merchants/core/ClientManager.java | 7 +- .../core/impls/ClientManagerImpl.java | 216 +- .../web/PartnerManageController.java | 77 +- .../core/impls/TradeLogServiceImpl.java | 10 +- .../mappers/payment/TransactionMapper.xml | 2 +- .../jasper/austrac_report20171228.jasper | Bin 190629 -> 0 bytes .../jasper/partner_invoice_20171201.jasper | Bin 78873 -> 0 bytes .../jasper/partner_invoice_gst20180409.jasper | Bin 84473 -> 0 bytes .../jasper/partner_invoice_gst20180412.jasper | Bin 80163 -> 0 bytes .../jasper/partner_invoice_gst20200410.jasper | Bin 80864 -> 0 bytes .../jasper/partner_invoice_gst_bak.jasper | Bin 80864 -> 0 bytes .../jasper/trans_excel20161008.jasper | Bin 40950 -> 0 bytes .../jasper/trans_excel20161009.jasper | Bin 42038 -> 0 bytes .../jasper/trans_excel20170516.jasper | Bin 42156 -> 0 bytes .../jasper/trans_excel20170531.jasper | Bin 43575 -> 0 bytes .../jasper/trans_excel20170704.jasper | Bin 44805 -> 0 bytes .../jasper/trans_excel20170822.jasper | Bin 45893 -> 0 bytes .../jasper/trans_excel20180412.jasper | Bin 46009 -> 0 bytes .../jasper/trans_flow20161008.jasper | Bin 73754 -> 0 bytes .../jasper/trans_flow20161009.jasper | Bin 74659 -> 0 bytes .../jasper/trans_flow_new20161107.jasper | Bin 76072 -> 0 bytes .../jasper/trans_flow_new20161202.jasper | Bin 76011 -> 0 bytes .../jasper/trans_flow_new20170302.jasper | Bin 78865 -> 0 bytes .../templates/mail/new_client_notice.html | 18 +- .../static/payment/partner/partner-manage.js | 1945 ++++++++++------- .../partner/templates/add_partner.html | 4 +- .../templates/partner_bankaccounts.html | 122 +- .../partner/templates/partner_compliance.html | 53 +- .../partner/templates/partner_detail.html | 25 +- .../partner/templates/partner_edit.html | 4 +- .../payment/partner/templates/partners.html | 17 - .../payment/manage/valid/CSVTest.java | 13 +- 34 files changed, 1444 insertions(+), 1118 deletions(-) delete mode 100644 src/main/resources/jasper/austrac_report20171228.jasper delete mode 100644 src/main/resources/jasper/partner_invoice_20171201.jasper delete mode 100644 src/main/resources/jasper/partner_invoice_gst20180409.jasper delete mode 100644 src/main/resources/jasper/partner_invoice_gst20180412.jasper delete mode 100644 src/main/resources/jasper/partner_invoice_gst20200410.jasper delete mode 100644 src/main/resources/jasper/partner_invoice_gst_bak.jasper delete mode 100644 src/main/resources/jasper/trans_excel20161008.jasper delete mode 100644 src/main/resources/jasper/trans_excel20161009.jasper delete mode 100644 src/main/resources/jasper/trans_excel20170516.jasper delete mode 100644 src/main/resources/jasper/trans_excel20170531.jasper delete mode 100644 src/main/resources/jasper/trans_excel20170704.jasper delete mode 100644 src/main/resources/jasper/trans_excel20170822.jasper delete mode 100644 src/main/resources/jasper/trans_excel20180412.jasper delete mode 100644 src/main/resources/jasper/trans_flow20161008.jasper delete mode 100644 src/main/resources/jasper/trans_flow20161009.jasper delete mode 100644 src/main/resources/jasper/trans_flow_new20161107.jasper delete mode 100644 src/main/resources/jasper/trans_flow_new20161202.jasper delete mode 100644 src/main/resources/jasper/trans_flow_new20170302.jasper diff --git a/pom.xml b/pom.xml index 998ba92f0..bfb3b872f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,14 +5,14 @@ au.com.royalpay.payment payment-parent - 2.1.41 + 2.1.45 4.0.0 manage - 2.3.1 + 2.3.2 UTF-8 - 1.8.0 + 2.2.0 ${project.version} @@ -247,9 +247,11 @@ ${docker-image.version} - - extra/ - + + + extra/ + + true @@ -277,11 +279,14 @@ hkccr.ccs.tencentyun.com/rpay/serverjre:openj9 - hkccr.ccs.tencentyun.com/cross-payment-dev/manage-dev:${docker-image.version} + hkccr.ccs.tencentyun.com/cross-payment-dev/manage-dev:${docker-image.version} + - - extra/ - + + + extra/ + + true @@ -311,9 +316,11 @@ hkccr.ccs.tencentyun.com/rpay/manage:${docker-image.version} - - extra/ - + + + extra/ + + true diff --git a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java index a6972d809..7b606adc5 100644 --- a/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java +++ b/src/main/java/au/com/royalpay/payment/manage/mappers/system/ClientRateMapper.java @@ -20,6 +20,9 @@ public interface ClientRateMapper { List listClientRates(@Param("client_id") int clientId, @Param("rate_name") String rateName); + @AutoSql(SqlType.SELECT) + JSONObject findRateByRateId(@Param("client_rate_id") String rateId); + @AutoSql(SqlType.INSERT) void saveRate(JSONObject rateConfig); @@ -39,23 +42,22 @@ public interface ClientRateMapper { @Param("clean_days") Integer cleanDays, @Param("rate_name") String rateName); - - List latestConfig(@Param("client_id")int client_id,@Param("rate_name") String rate_name); + List latestConfig(@Param("client_id") int client_id, @Param("rate_name") String rate_name); //Task - List maxChannelExpiryTime(@Param("client_id")int client_id,@Param("rate_name")String rate_name); + List maxChannelExpiryTime(@Param("client_id") int client_id, @Param("rate_name") String rate_name); - List getAllExpiry(@Param("expiry_date")Date expiry_date); + List getAllExpiry(@Param("expiry_date") Date expiry_date); List getAllClientRateExpiryMerchants(); void postponeMerchantRateByClientId(int clientId); - JSONObject latestChannelCleanDays(@Param("rate_name")String rate_name, @Param("client_id")int client_id); + JSONObject latestChannelCleanDays(@Param("rate_name") String rate_name, @Param("client_id") int client_id); - JSONObject latestCardChannelCleanDays(@Param("rate_name")String rate_name, @Param("client_id")int client_id); + JSONObject latestCardChannelCleanDays(@Param("rate_name") String rate_name, @Param("client_id") int client_id); - JSONObject latestExpiryConfig(@Param("client_id")int client_id,@Param("rate_name") String rate_name); + JSONObject latestExpiryConfig(@Param("client_id") int client_id, @Param("rate_name") String rate_name); } diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java index 0d21c9e23..b52df74a7 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/ClientManager.java @@ -86,16 +86,11 @@ public interface ClientManager { void checkAndSendInitEmail(JSONObject manager, String clientMoniker); - void sendOpenEmail(final JSONObject client, String username, String pwd); - -// void sendInitEmail(JSONObject account,JSONObject client, String username, String pwd); void markApproveEmailSendStatus(String clientMoniker, JSONObject manager); void checkEmailStatus(); - void newCheckEmailStatus(); - @Transactional void switchPermission(JSONObject manager, String clientMoniker, String permissionKey, boolean allow); @@ -397,7 +392,7 @@ public interface ClientManager { void getAggregateCardAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; - void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal, String promotionalEffectiveDate, int promotionalPeriod) throws Exception; + void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal,String rateid,HttpServletResponse httpResponse); void getNewAggregateAgreeFile(String clientMoniker, JSONObject manager, boolean renewal) throws Exception; diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java index 62f5b0e71..5645d1efe 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/core/impls/ClientManagerImpl.java @@ -33,14 +33,20 @@ import au.com.royalpay.payment.manage.gateway.core.GatewayMerchantApply; import au.com.royalpay.payment.manage.kyc.enums.FilesAuthEnum; import au.com.royalpay.payment.manage.management.sysconfig.core.impls.PermissionPartnerManagerImpl; import au.com.royalpay.payment.manage.mappers.financial.FinancialBDConfigMapper; -import au.com.royalpay.payment.manage.mappers.log.*; +import au.com.royalpay.payment.manage.mappers.log.ClearingDetailMapper; +import au.com.royalpay.payment.manage.mappers.log.ClearingLogMapper; +import au.com.royalpay.payment.manage.mappers.log.ClientsOperationLogMapper; +import au.com.royalpay.payment.manage.mappers.log.LogClientSubMerchantIdMapper; import au.com.royalpay.payment.manage.mappers.payment.CommonSubMerchantIdMapper; import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.redpack.ActClientInvitationCodeMapper; import au.com.royalpay.payment.manage.mappers.risk.RiskAttentionMerchantsMapper; import au.com.royalpay.payment.manage.mappers.system.*; import au.com.royalpay.payment.manage.merchants.beans.*; -import au.com.royalpay.payment.manage.merchants.core.*; +import au.com.royalpay.payment.manage.merchants.core.ClientConfigService; +import au.com.royalpay.payment.manage.merchants.core.ClientInfoCacheSupport; +import au.com.royalpay.payment.manage.merchants.core.ClientManager; +import au.com.royalpay.payment.manage.merchants.core.ClientModifySupport; import au.com.royalpay.payment.manage.merchants.entity.impls.*; import au.com.royalpay.payment.manage.merchants.enums.UPayAuthFileEnum; import au.com.royalpay.payment.manage.notice.core.MailService; @@ -102,6 +108,9 @@ import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.dom4j.Element; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -109,13 +118,11 @@ import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; -import org.springframework.context.MessageSource; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @@ -138,7 +145,6 @@ import java.security.InvalidParameterException; import java.security.KeyPair; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; import java.util.*; @@ -195,16 +201,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Resource private OrgMapper orgMapper; @Resource - private LogSettleMailMapper logSettleMailMapper; - @Resource - private CommoditiesMapper commoditiesMapper; - @Resource private ActClientInvitationCodeMapper actClientInvitationCodeMapper; @Resource private MailService mailService; - // todo 作用 - @Resource - private ClientComplyValidator[] validators; @Resource private ClientModifySupport clientModifySupport; @@ -260,8 +259,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Resource private ClientContractService clientContractService; @Resource - private MessageSource messageSource; - @Resource private ClientsOperationLogMapper clientsOperationLogMapper; @Resource private LogClientSubMerchantIdMapper logClientSubMerchantIdMapper; @@ -321,6 +318,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid private RPayMerchantMapper rPayMerchantMapper; @Resource private SysClientUpayProfileMapper sysClientUpayProfileMapper; + DateTimeFormatter formatter = DateTimeFormat.forPattern("dd MMM yyyy"); @Resource @@ -1310,73 +1308,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } - - @Override - public void sendOpenEmail(final JSONObject client, String username, String pwd) { - JSONObject model = new JSONObject(); - model.put("username", username); - model.put("password", pwd); - model.put("client_moniker", client.getString("client_moniker")); - model.put("contact_person", client.getString("contact_person")); - model.put("credential_code", client.getString("credential_code")); - List bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); - // todo Velocity - Context ctx = new Context(); - ctx.setVariable("bds", bds); - ctx.setVariable("short_name", client.getString("short_name")); - ctx.setVariable("password", pwd); - ctx.setVariable("username", username); - ctx.setVariable("client_moniker", client.getString("client_moniker")); - ctx.setVariable("contact_person", client.getString("contact_person")); - ctx.setVariable("credential_code", client.getString("credential_code")); - - final String content = thymeleaf.process("mail/new_client_notice", ctx); - // final String content = VelocityEngineUtils.mergeTemplateIntoString(null, "mail/new_client_notice.vm", - // "utf-8", model); - ctx.setVariable("password", "*****"); - final String contentBd = thymeleaf.process("mail/new_client_notice", ctx); - final List mailTos = new ArrayList<>(); - String mailTo = client.getString("contact_email"); - if (StringUtils.isEmpty(mailTo)) { - throw new EmailException("Client Contact Email is invalid"); - } - mailTos.add(mailTo); - JSONObject clientLegal = sysClientLegalPersonMapper.findRepresentativeInfo(client.getIntValue("client_id")); - if (clientLegal != null && StringUtils.isNotBlank(clientLegal.getString("email"))) { - mailTos.add(clientLegal.getString("email")); - } - - final List emails = new ArrayList<>(); - for (JSONObject bd : bds) { - String email = bd.getString("email"); - if (StringUtils.isNotEmpty(email)) { - emails.add(email); - } - } - new Thread() { - @Override - public void run() { - try { - String emailId = mailService.sendEmail("Your RoyalPay Cross-border Payment has been set up", StringUtils.join(mailTos, ","), "", content); - mailService.sendEmail("Your RoyalPay Cross-border Payment has been set up", emails.isEmpty() ? "" : StringUtils.join(emails, ","), - "", contentBd); - JSONObject clientUpdate = new JSONObject(); - clientUpdate.put("client_id", client.getIntValue("client_id")); - clientUpdate.put("approve_email_send", 3); - clientUpdate.put("approve_email_id", emailId); - clientMapper.update(clientUpdate); - } catch (Exception e) { - JSONObject clientUpdate = new JSONObject(); - clientUpdate.put("client_id", client.getIntValue("client_id")); - clientUpdate.put("approve_email_send", 0); - clientUpdate.put("approve_email_id", null); - clientMapper.update(clientUpdate); - throw new EmailException("Email Sending Failed", e); - } - } - }.start(); - } - public void sendInitEmail(final JSONObject client, String username, String pwd, boolean isUpayAuditPass) { logger.debug("sending email after comply"); JSONObject model = new JSONObject(); @@ -1386,7 +1317,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid model.put("contact_person", client.getString("contact_person")); model.put("credential_code", client.getString("credential_code")); List bds = clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); - // todo Velocity Context ctx = new Context(); ctx.setVariable("bds", bds); ctx.setVariable("short_name", client.getString("short_name")); @@ -1395,10 +1325,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid ctx.setVariable("client_moniker", client.getString("client_moniker")); ctx.setVariable("contact_person", client.getString("contact_person")); ctx.setVariable("credential_code", client.getString("credential_code")); + ctx.setVariable("card_approving", isUpayAuditPass); final String content = thymeleaf.process("mail/new_client_notice", ctx); - // final String content = VelocityEngineUtils.mergeTemplateIntoString(null, "mail/new_client_notice.vm", - // "utf-8", model); ctx.setVariable("password", "*****"); final String contentBd = thymeleaf.process("mail/new_client_notice", ctx); final List mailTos = new ArrayList<>(); @@ -1457,32 +1386,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid }.start(); } - /** - * public void sendInitEmail(JSONObject account, final JSONObject client, String username, String pwd) { - * logger.debug("sending email after comply"); JSONObject model = new JSONObject(); model.put("username", username); - * model.put("password", pwd); model.put("client_moniker", client.getString("client_moniker")); - * model.put("contact_person", client.getString("contact_person")); model.put("credential_code", - * client.getString("credential_code")); List bds = - * clientBDMapper.listClientBDInfoAvailable(client.getIntValue("client_id"), new Date()); // todo Velocity Context - * ctx = new Context(); ctx.setVariable("bds", bds); ctx.setVariable("password", pwd); ctx.setVariable("username", - * username); ctx.setVariable("client_moniker", client.getString("client_moniker")); - * ctx.setVariable("contact_person", client.getString("contact_person")); ctx.setVariable("credential_code", - * client.getString("credential_code")); ctx.setVariable("short_name", client.getString("short_name")); final String - * content = thymeleaf.process("mail/new_client_notice", ctx); // final String content = - * VelocityEngineUtils.mergeTemplateIntoString(null, "mail/new_client_notice.vm", // "utf-8", model); final String - * mailTo = client.getString("contact_email"); if (StringUtils.isEmpty(mailTo)) { throw new EmailException("Client - * Contact Email is invalid"); } final Set emails = new HashSet<>(); for (JSONObject bd : bds) { String - * email = bd.getString("email"); if (StringUtils.isNotEmpty(email)) { emails.add(email); } } new Thread() { - * - * @Override public void run() { try { SendMail sendMail = new SendMail(); Set to = new HashSet<>(); - * to.add(mailTo); sendMail.setFrom("info@mail.royalpay.com.au"); sendMail.setMailTos(to); - * sendMail.setMailCcs(emails); sendMail.setTitle("Your RoyalPay Cross-border Payment has been set up"); - * sendMail.setContent(content); sendMail.setTags(tags); JSONObject mailResult = - * mailGunService.sendMail(sendMail); clientModifySupport.processClientModify(new EmailModify(account, - * client.getString("client_moniker"), 3, mailResult.getString("mail_id"))); } catch (Exception e) { - * clientModifySupport.processClientModify(new EmailModify(account, client.getString("client_moniker"), 0, - * null)); throw new EmailException("Email Sending Failed", e); } } }.start(); } - */ public void sendAuthInitEmail(JSONObject account, final JSONObject client) { logger.debug("sending email after comply about a new partner opening by quick access"); @@ -1587,37 +1490,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } - @Override - public void newCheckEmailStatus() { - List clients = clientMapper.listClientsWithEmailNotVerify(); - for (JSONObject client : clients) { - try { - String emailId = client.getString("approve_email_id"); - JSONObject status = mailSendMapper.find(emailId, client.getString("contact_email")); - if (status != null) { - int statusNo = status.getIntValue("status"); - logger.debug("get mail status:" + emailId + "--" + statusNo); - int mailStatus = 3; - switch (statusNo) { - case 1: - mailStatus = 1; - break; - case 2: - mailStatus = 2; - break; - } - updateClientApproveEmailStatus(mailStatus, null, client.getString("client_moniker")); - } else { - logger.debug("get mail status:" + emailId + "-- none"); - // updateClientApproveEmailStatus(client.getIntValue("client_id"), 0); - } - - } catch (Exception e) { - logger.error("check email status failed", e); - } - } - } - @Override public void switchPermission(JSONObject manager, String clientMoniker, String permissionKey, boolean allow) { JSONObject client = getClientInfoByMoniker(clientMoniker); @@ -1740,7 +1612,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid JSONObject account = clientAccountMapper.findById(accountId); if (clientMoniker != null) { JSONObject client = getClientInfoByMoniker(clientMoniker); - Assert.notNull(client); //父商户全局管理子商户时候,跳过 if (account.getIntValue("client_id") != client.getIntValue("client_id")) { //登录用户所属商户 @@ -1863,7 +1734,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Override public void togglePayNotice(JSONObject account, String clientMoniker, boolean enable) { JSONObject partner = getClientInfoByMoniker(clientMoniker); - Assert.notNull(partner); clientModifySupport.processClientConfigModify(new SwitchPermissionModify(account, clientMoniker, "enable_pay_notice", enable)); clientInfoCacheSupport.clearClientCache(partner.getIntValue("client_id")); } @@ -2075,11 +1945,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid config.getDoubleValue("rate_value"), config.getInteger("clean_days"), channel).isEmpty()) { return; } - List existRate = clientRateMapper.listCurrentClientRates(clientId, config.getDate("active_time"), channel); - for (JSONObject rateLog : existRate) { - rateLog.put("expiry_time", DateUtils.addDays(config.getDate("active_time"), -1)); - clientRateMapper.updateConfig(rateLog); - } if (StringUtils.equalsIgnoreCase("rpaypmt_card", config.getString("type"))) { JSONObject extRateParams = new JSONObject() {{ put("domestic_rate_value", config.getBigDecimal("rate_value")); @@ -3112,12 +2977,12 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid @Override @Transactional - public void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal, String promotionalEffectiveDate, int promotionalPeriod) throws ParseException { + public void getAggregateCardPromotionaAgreeFile(String clientMoniker, JSONObject manager, boolean renewal, String rateid, HttpServletResponse httpResponse) { JSONObject client = clientMapper.findClientByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); } - exportPromotionalOfferPDF(clientMoniker, manager, promotionalEffectiveDate, promotionalPeriod); + exportPromotionalOfferPDF(clientMoniker, manager, rateid, httpResponse); } @Override @@ -7137,7 +7002,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid JSONObject legalInfo = sysClientLegalPersonMapper.findRepresentativeInfo(clientId); //装在数据 JSONObject info = new JSONObject(); - info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 + info.put("down_date", formatter.print(new DateTime()));//下载文件日期 info.put("bussiness_name", (client.containsKey("business_name") ? client.getString("business_name") : legalInfo.getString("representative_person")) + " " + client.getString("abn"));//商圈类型 info.put("partner_address", client.getString("address"));//商家店铺地址 info.put("partner_country", client.getString("country"));//国家 @@ -7149,7 +7014,7 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid info.put("annual_rate", cardAnnualRate);//年费率 info.put("cost_per_transaction", clientRate.getString("transaction_fee"));//每次交易成本 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 - info.put("international_fee", upayProfileInfo.getBoolean("enable_international_card")?cardRate.getString("overseas_rate_value"):"-");//国际服务费 + info.put("international_fee", upayProfileInfo.getBoolean("enable_international_card") ? cardRate.getString("overseas_rate_value") : "-");//国际服务费 BigDecimal reserve = (upayProfileInfo.getBigDecimal("expected_card_revenue").multiply(new BigDecimal(0.005)).setScale(0, RoundingMode.HALF_UP)); info.put("account_reserve", reserve.compareTo(new BigDecimal(200)) <= 0 ? new BigDecimal(200).toPlainString() : reserve.toPlainString());//账户储备金 //银行账号信息 @@ -7160,15 +7025,25 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid return info; } - private void exportPromotionalOfferPDF(String clientMoniker, JSONObject manager, String promotionalEffectiveDate, int promotionalPeriod) throws ParseException { - Date date = DateUtils.parseDate(promotionalEffectiveDate, "yyyy-MM-dd"); - JSONObject info = convertPromotionalOfferInfo(clientMoniker, convertDateEnglish(date), promotionalPeriod); - String pdfPath = this.getClass().getClassLoader().getResource("").getPath() + "/templates/pdf/promotional_offer.pdf"; + private void exportPromotionalOfferPDF(String clientMoniker, JSONObject manager, String rateid, HttpServletResponse httpResponse) { + httpResponse.setContentType("application/pdf"); + httpResponse.setHeader("content-disposition", "attachment;filename=" + clientMoniker + "_PROMOTIONAL_OFFER_" + new Date() + ".pdf"); + JSONObject info = convertPromotionalOfferInfo(clientMoniker, rateid); + String pdfPath = Objects.requireNonNull(this.getClass().getClassLoader().getResource("")).getPath() + "templates/pdf/promotional_offer.pdf"; String fileName = clientMoniker + "_Promotional_Offer.pdf"; - publishExcelCardPDFFile(clientMoniker, manager, fileName, pdfPath, info, PROMOTIONAL_OFFER_FILE); + try (ServletOutputStream sos = httpResponse.getOutputStream()) { + File file = new File(fileName); + PdfUtils pdu = new PdfUtils(); + pdu.setTemplatePdfPath(pdfPath); + pdu.setPdfTemplate(info); + ByteArrayOutputStream bos = pdu.templetPdfBos(file); + sos.write(bos.toByteArray()); + } catch (Exception e) { + throw new ServerErrorException(); + } } - private JSONObject convertPromotionalOfferInfo(String clientMoniker, String promotionalEffectiveDate, int promotionalPeriod) { + private JSONObject convertPromotionalOfferInfo(String clientMoniker, String rateid) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { throw new InvalidShortIdException(); @@ -7178,16 +7053,15 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid throw new BadRequestException("The merchant failed the audit!"); } int clientId = client.getInteger("client_id"); - JSONObject clientRate = merchantInfoProvider.clientCurrentRate(clientId, new Date(), "rpaypmt_card"); - if (clientRate == null) { + JSONObject currentRate = clientRateMapper.findRateByRateId(rateid); + if (currentRate == null) { throw new BadRequestException("rpaypmt_card rate Not configured"); } - JSONObject cardRate = clientRate.getJSONObject("ext_rates"); + JSONObject cardRate = currentRate.getJSONObject("ext_rates"); JSONObject legalInfo = sysClientLegalPersonMapper.findRepresentativeInfo(clientId); JSONObject upayProfileInfo = sysClientUpayProfileMapper.findInfo(clientId); - JSONObject info = new JSONObject(); - info.put("down_date", convertDateEnglish(new Date()));//下载文件日期 + info.put("down_date", formatter.print(new DateTime()));//下载文件日期 info.put("bussiness_name", (client.containsKey("business_name") ? client.getString("business_name") : legalInfo.getString("representative_person")) + " " + client.getString("abn"));//商圈类型 info.put("partner_address", client.getString("address"));//商家店铺地址 info.put("partner_country", client.getString("country"));//国家 @@ -7195,9 +7069,9 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid info.put("partner_bussiness_name", client.getString("business_name"));//商户商用名称 info.put("legal_bussiness", legalInfo.getString("representative_person") + " AS " + (client.containsKey("business_name") ? client.getString("business_name") : legalInfo.getString("representative_person")) + " ABN " + client.getString("abn"));//拼接规则:法人名 AS 商用名称 ABD 编码 info.put("domestic_fee", cardRate.getString("domestic_rate_value"));//国内服务费 - info.put("international_fee", upayProfileInfo.getBoolean("enable_international_card")?cardRate.getString("overseas_rate_value"):"-");//国际服务费 - info.put("promotional_effective_date", promotionalEffectiveDate); - info.put("promotional_period", promotionalPeriod); + info.put("international_fee", upayProfileInfo.getBoolean("enable_international_card") ? cardRate.getString("overseas_rate_value") : "-");//国际服务费 + info.put("promotional_effective_date", formatter.print(currentRate.getDate("active_time").getTime())); + info.put("promotional_period", formatter.print(currentRate.getDate("expiry_time").getTime())); return info; } @@ -7236,16 +7110,6 @@ public class ClientManagerImpl implements ClientManager, ManagerTodoNoticeProvid } } - private String convertDateEnglish(Date date) { - String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Spt", "Oct", "Nov", "Dec"}; - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - int year = calendar.get(Calendar.YEAR); - int month = calendar.get(Calendar.MONTH); - int day = calendar.get(Calendar.DAY_OF_MONTH); - return day + " " + months[month] + " " + year; - } - private void importCardAgreeFile(String clientMoniker, JSONObject manager, String sourceFile, String fileLabel) { JSONObject client = getClientInfoByMoniker(clientMoniker); if (client == null) { diff --git a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java index 5ae92e4b2..516966b08 100644 --- a/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java +++ b/src/main/java/au/com/royalpay/payment/manage/merchants/web/PartnerManageController.java @@ -56,7 +56,7 @@ public class PartnerManageController { } - @RequestMapping(value = "/init/merchant_code", method = RequestMethod.GET,produces = "application/json") + @RequestMapping(value = "/init/merchant_code", method = RequestMethod.GET, produces = "application/json") public JSONObject initMerchantCode() { JSONObject result = new JSONObject(); result.put("partner_code", clientManager.initMerchantCode()); @@ -311,7 +311,7 @@ public class PartnerManageController { @ManagerMapping(value = "/{clientMoniker}/selectBillVersion", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) public void selectBillVersion(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { - clientManager.selectBillCodeVersion(manager, clientMoniker, pass.getString("version")); + clientManager.selectBillCodeVersion(manager, clientMoniker, pass.getString("version")); } /** @@ -527,10 +527,10 @@ public class PartnerManageController { } @ManagerMapping(value = "/{clientMoniker}/sub_clients/page", method = RequestMethod.GET) - public JSONObject listSubClientsByPage(@PathVariable String clientMoniker,@RequestParam(defaultValue = "1") int page, + public JSONObject listSubClientsByPage(@PathVariable String clientMoniker, @RequestParam(defaultValue = "1") int page, @RequestParam(required = false) String searchText, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { - return clientManager.listSubClientsByPage(manager, clientMoniker,searchText,page); + return clientManager.listSubClientsByPage(manager, clientMoniker, searchText, page); } //创建子商户 @@ -596,8 +596,8 @@ public class PartnerManageController { */ @ManagerMapping(value = "/{clientMoniker}/file/source_card_agree_file", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER, ManagerRole.SERVANT}) public JSONObject getSourceCardAgreeAuthFiles(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, - @RequestParam("fileName") String fileName){ - return clientManager.getSourceCardAgreeFiles(clientMoniker,manager,fileName); + @RequestParam("fileName") String fileName) { + return clientManager.getSourceCardAgreeFiles(clientMoniker, manager, fileName); } @ManagerMapping(value = "/auth_file/{fileId}/delete", method = RequestMethod.PUT, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) @@ -618,13 +618,13 @@ public class PartnerManageController { @ManagerMapping(value = "/{clientMoniker}/mw_file", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER}) public void uploadMWAuthFiles(@PathVariable String clientMoniker, @RequestBody ClientMWAuthFilesInfo filesInfo, - @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.uploadMWAuthFilesManager(manager, clientMoniker, filesInfo); } @ManagerMapping(value = "/{clientMoniker}/kycFile", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR, ManagerRole.BD_USER}) public void uploadKycFiles(@PathVariable String clientMoniker, @RequestBody ClientKycFilesInfo filesInfo, - @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.uploadKycFiles(manager, clientMoniker, filesInfo); } @@ -646,6 +646,7 @@ public class PartnerManageController { /** * 提交资料,BD提交卡支付最终审核 + * * @param clientMoniker * @param manager */ @@ -661,6 +662,7 @@ public class PartnerManageController { /** * 提交资料,申请卡支付 + * * @param clientMoniker * @param manager */ @@ -686,6 +688,7 @@ public class PartnerManageController { /** * 制作卡支付合同 + * * @param clientMoniker * @param manager * @throws Exception @@ -697,14 +700,18 @@ public class PartnerManageController { /** * 制作促销合同 + * * @param clientMoniker * @param manager * @throws Exception */ - @ManagerMapping(value = "/{clientMoniker}/export/aggregate/card_promotiona_agree_pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) - public void exportAggregateCardPromotionaAgreeFile(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, - @RequestParam("date") String promotionalEffectiveDate,@RequestParam("period") int promotionalPeriod) throws Exception { - clientManager.getAggregateCardPromotionaAgreeFile(clientMoniker, manager, false,promotionalEffectiveDate,promotionalPeriod); + @GetMapping(value = "/{clientMoniker}/export/aggregate/card_promotion_agree_pdf") + public void exportAggregateCardPromotionaAgreeFile(@PathVariable String clientMoniker, + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, + @RequestParam("rateid") String rateid, + HttpServletResponse httpResponse + ) { + clientManager.getAggregateCardPromotionaAgreeFile(clientMoniker, manager, false, rateid, httpResponse); } @ManagerMapping(value = "/{clientMoniker}/temp/export/pdf", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.BD_USER, ManagerRole.DIRECTOR, ManagerRole.OPERATOR}) @@ -724,6 +731,7 @@ public class PartnerManageController { /** * 信用卡合同生成完毕通知BD + * * @param clientMoniker * @param manager */ @@ -755,8 +763,8 @@ public class PartnerManageController { @GetMapping(value = "/{clientMoniker}/lists_settlements/excel") @ReadOnlyConnection - public void excelSettlements(@PathVariable String clientMoniker, TradeLogQuery query, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager,HttpServletResponse response){ - clientManager.excelSettlementLog(manager, clientMoniker, query,response); + public void excelSettlements(@PathVariable String clientMoniker, TradeLogQuery query, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, HttpServletResponse response) { + clientManager.excelSettlementLog(manager, clientMoniker, query, response); } @ManagerMapping(value = "/{clientMoniker}/requireCustinfo", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.BD_USER}) @@ -805,6 +813,7 @@ public class PartnerManageController { public List listRpaySubMerchantIdApplys(@PathVariable String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { return clientManager.listRpaySubMerchantIdApplys(manager, clientMoniker); } + @ManagerMapping(value = "/{clientMoniker}/sub_apply", method = RequestMethod.POST, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN}) public String subMerchantApplication(@PathVariable String clientMoniker, @RequestBody SubMerchantIdApply subMerchantIdApply, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { return clientManager.subMerchantApplication(clientMoniker, subMerchantIdApply, manager); @@ -932,51 +941,54 @@ public class PartnerManageController { /** * 获取商户所有增值服务 + * * @param clientMoniker * @return */ @ManagerMapping(value = "/{clientMoniker}/incremental_service", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public JSONObject getClientIncrementalService(@PathVariable String clientMoniker){ - return clientManager.partnerIncrementalService(clientMoniker); + public JSONObject getClientIncrementalService(@PathVariable String clientMoniker) { + return clientManager.partnerIncrementalService(clientMoniker); } /** * 保存/修改增值服务配置 + * * @param clientMoniker * @param incrementalService */ @ManagerMapping(value = "/{clientMoniker}/incremental_service", method = RequestMethod.POST, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void updateClientIncrementalService(@PathVariable("clientMoniker") String clientMoniker,@RequestBody JSONObject incrementalService, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ - clientManager.changePartnerIncrementalService(clientMoniker,incrementalService,manager); + public void updateClientIncrementalService(@PathVariable("clientMoniker") String clientMoniker, @RequestBody JSONObject incrementalService, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.changePartnerIncrementalService(clientMoniker, incrementalService, manager); } /** * 禁用/启用增值服务 + * * @param clientMoniker * @param incrementalService */ @ManagerMapping(value = "/{clientMoniker}/incremental_service/status", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void switchClientIncrementalService(@PathVariable("clientMoniker") String clientMoniker,@RequestBody JSONObject incrementalService, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ - clientManager.changeSwitchIncrementalService(clientMoniker,incrementalService,manager); + public void switchClientIncrementalService(@PathVariable("clientMoniker") String clientMoniker, @RequestBody JSONObject incrementalService, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + clientManager.changeSwitchIncrementalService(clientMoniker, incrementalService, manager); } @ManagerMapping(value = "/{clientMoniker}/ext_config", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void changeClientExtConfigs(@PathVariable("clientMoniker")String clientMoniker, + public void changeClientExtConfigs(@PathVariable("clientMoniker") String clientMoniker, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager, - @RequestBody JSONObject params){ - clientManager.changeExtParams(clientMoniker,manager,params); + @RequestBody JSONObject params) { + clientManager.changeExtParams(clientMoniker, manager, params); } - @ManagerMapping(value = "/{clientMoniker}/applyMWMerchantId",method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public RPayMerchantEntity applyMWMerchantId(@PathVariable("clientMoniker")String clientMoniker, - @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ - return clientManager.applyMWMerchantId(clientMoniker,manager); + @ManagerMapping(value = "/{clientMoniker}/applyMWMerchantId", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public RPayMerchantEntity applyMWMerchantId(@PathVariable("clientMoniker") String clientMoniker, + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + return clientManager.applyMWMerchantId(clientMoniker, manager); } - @ManagerMapping(value = "/{clientMoniker}/queryMWMerchantIdStatus",method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public RPayMerchantEntity queryMWMerchantIdStatus(@PathVariable("clientMoniker")String clientMoniker, - @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ - return clientManager.queryMWMerchantIdStatus(clientMoniker,manager); + @ManagerMapping(value = "/{clientMoniker}/queryMWMerchantIdStatus", method = RequestMethod.GET, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) + public RPayMerchantEntity queryMWMerchantIdStatus(@PathVariable("clientMoniker") String clientMoniker, + @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { + return clientManager.queryMWMerchantIdStatus(clientMoniker, manager); } @ManagerMapping(value = "/{clientMoniker}/query/mw_info", method = RequestMethod.GET, role = {ManagerRole.OPERATOR, ManagerRole.ADMIN}) @@ -986,10 +998,11 @@ public class PartnerManageController { /** * 启用/禁用国际卡支付 + * * @param clientMoniker */ @ManagerMapping(value = "/{clientMoniker}/payment_card_permission", method = RequestMethod.PUT, role = {ManagerRole.ADMIN, ManagerRole.OPERATOR}) - public void switchInternationalCard(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager){ + public void switchInternationalCard(@PathVariable String clientMoniker, @RequestBody JSONObject pass, @ModelAttribute(CommonConsts.MANAGER_STATUS) JSONObject manager) { clientManager.modifyUPayProfile(manager, clientMoniker, "enable_international_card", pass.getBooleanValue("allow")); } diff --git a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java index 6183230d5..6679d26c9 100644 --- a/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java +++ b/src/main/java/au/com/royalpay/payment/manage/tradelog/core/impls/TradeLogServiceImpl.java @@ -12,7 +12,10 @@ import au.com.royalpay.payment.core.exceptions.ParamInvalidException; import au.com.royalpay.payment.manage.mappers.client.ClientCustomersMapper; import au.com.royalpay.payment.manage.mappers.log.ClearingDetailMapper; import au.com.royalpay.payment.manage.mappers.log.ClearingLogMapper; -import au.com.royalpay.payment.manage.mappers.payment.*; +import au.com.royalpay.payment.manage.mappers.payment.AustracDataMapper; +import au.com.royalpay.payment.manage.mappers.payment.OrderMapper; +import au.com.royalpay.payment.manage.mappers.payment.RefundMapper; +import au.com.royalpay.payment.manage.mappers.payment.TransactionMapper; import au.com.royalpay.payment.manage.mappers.system.*; import au.com.royalpay.payment.manage.merchants.core.ClientManager; import au.com.royalpay.payment.manage.organizations.core.OrgManager; @@ -56,7 +59,6 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.ui.Model; @@ -88,8 +90,6 @@ public class TradeLogServiceImpl implements TradeLogService { @Resource private RefundMapper refundMapper; @Resource - private RefundAuditionMapper refundAuditionMapper; - @Resource private ClientAccountMapper clientAccountMapper; @Resource private ClientManager clientManager; @@ -116,8 +116,6 @@ public class TradeLogServiceImpl implements TradeLogService { @Resource private ClearingLogMapper clearingLogMapper; @Resource - private StringRedisTemplate stringRedisTemplate; - @Resource private OrgManager orgManager; @Resource private ClientMapper clientMapper; diff --git a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml index 38e1504a7..b7508e323 100644 --- a/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml +++ b/src/main/resources/au/com/royalpay/payment/manage/mappers/payment/TransactionMapper.xml @@ -952,7 +952,7 @@ INNER JOIN sys_org so ON t.org_id = so.org_id AND so.is_valid = 1 AND so.type = 0 AND so.citypartner = 1 AND so.commission = 1 - AND year(t.transaction_time) = #{year} AND month(t.transaction_time) = #{month} + AND year(t.create_time) = #{year} AND month(t.create_time) = #{month} AND t.channel != 'Settlement' AND t.channel != 'System' AND t.system_generate = 0 ORDER BY t.client_id asc ]]> diff --git a/src/main/resources/jasper/austrac_report20171228.jasper b/src/main/resources/jasper/austrac_report20171228.jasper deleted file mode 100644 index bc48e6dab6043c6c78385df334711efa6fc6cf57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190629 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ⅅt|NSN}!laz|12jI~)&+z#T(gcx9$Ne)iJ853b*{ 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 F{y*}lC@=s3 diff --git a/src/main/resources/jasper/partner_invoice_20171201.jasper b/src/main/resources/jasper/partner_invoice_20171201.jasper deleted file mode 100644 index 5e336bbee6630f49abeaf96508f46e162f1a1a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78873 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 diff --git a/src/main/resources/jasper/partner_invoice_gst20180412.jasper b/src/main/resources/jasper/partner_invoice_gst20180412.jasper deleted file mode 100644 index 9c01d8c81de50984d1a7c48605a33fa76fc37c03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80163 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 diff --git a/src/main/resources/jasper/partner_invoice_gst20200410.jasper b/src/main/resources/jasper/partner_invoice_gst20200410.jasper deleted file mode 100644 index a5111a4faf1648300d179f1fecb47806aacba7f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80864 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

    wNlT+($r`??h&3bDW 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 Q+ofmW#=m-fLv-x_0Y+VKc>n+a diff --git a/src/main/resources/jasper/partner_invoice_gst_bak.jasper b/src/main/resources/jasper/partner_invoice_gst_bak.jasper deleted file mode 100644 index a5111a4faf1648300d179f1fecb47806aacba7f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80864 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

    +

    I'm + happy to let you know + Congratulations, you have passed the compliance review and be granted a RoyalPay account. + You can start to do IT integration. At the same time, please contact BD regarding the invoice of security + deposit. We will set up your account live in the production environment after receiving the security deposit + from your company. +
    + 恭喜您已通过 CardPayment 合规审核,您可开始做IT对接. 请联系BD沟通支付保证金事宜。我司会在收到贵司提交的保证金后,开启您的 CardPayment 权限。

    Please kindly log on the website below to manage your accounts and transactions:
    @@ -94,7 +102,7 @@ Store to download APP for IOS,which helps check your payment receiving records.

    您可以在APP Store里搜索"RoyalPay"下载royalpay的app,来进行收款和接收到账提醒等。 + href="https://itunes.apple.com/app/royalpay/id1049566852?l=en&mt=8">RoyalPay"下载royalpay的app,来进行收款和接收到账提醒等。


    @@ -154,7 +162,8 @@
    - +
    Tel:
    1300 10 77 50
    Level 14, 383 Kent Street, Sydney NSW 2000
    Tunnel Show Pty Ltd trading as RoyalPay
    @@ -173,10 +182,7 @@
    - - -
    - \ No newline at end of file + diff --git a/src/main/ui/static/payment/partner/partner-manage.js b/src/main/ui/static/payment/partner/partner-manage.js index 3c0d71eb3..21ca834d7 100644 --- a/src/main/ui/static/payment/partner/partner-manage.js +++ b/src/main/ui/static/payment/partner/partner-manage.js @@ -147,7 +147,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter controller: 'partnerDeviceCtrl' }).state('partners.detail.files', { url: '/files', - params:{commitType:"cross-border"}, + params: {commitType: "cross-border"}, templateUrl: '/static/payment/partner/templates/partner_auth_files.html', controller: 'partnerAuthFileCtrl' }).state('partners.detail.files.CP_files', { @@ -211,8 +211,447 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter url: '/incremental_service', templateUrl: 'static/payment/partner/templates/incremental_service.html', controller: 'incrementalServiceCtrl' + }).state('partners.edit', { + url: '/{clientMoniker}/edit', + params: {"commitCardPayment": false, "commitCrossBorderPayment": false}, + templateUrl: 'static/payment/partner/templates/partner_edit.html', + controller: 'partnerEditCtrl', + resolve: { + partner: ['$http', '$stateParams', function ($http, $stateParams) { + return $http.get('/sys/partners/' + $stateParams.clientMoniker); + }] + } }); }]); + app.controller('partnerEditCtrl', ['$scope', '$http', '$state', 'Upload', 'commonDialog', 'timezone', 'partner', 'upayIndustryMap', + function ($scope, $http, $state, Upload, commonDialog, timezone, partner, upayIndustryMap) { + $scope.upayIndustrys = upayIndustryMap.configs(); + $scope.timezones = timezone.configs(); + $scope.partner = partner.data; + if (!$scope.partner.client_type) { + $scope.partner.client_type = 'cross-border'; + } + if ($scope.partner.representativeInfo != null) { + $scope.partner.registered_address = $scope.partner.representativeInfo.address; + $scope.partner.registered_suburb = $scope.partner.representativeInfo.suburb; + $scope.partner.registered_postcode = $scope.partner.representativeInfo.postcode; + $scope.partner.registered_state = $scope.partner.representativeInfo.state; + $scope.partner.legal_representative_person = $scope.partner.representativeInfo.representative_person; + $scope.partner.legal_representative_phone = $scope.partner.representativeInfo.phone; + $scope.partner.legal_representative_email = $scope.partner.representativeInfo.email; + $scope.partner.legal_representative_job = $scope.partner.representativeInfo.job_title; + + $scope.partner.marketing_person = $scope.partner.representativeInfo.marketing_person; + $scope.partner.marketing_phone = $scope.partner.representativeInfo.marketing_phone; + $scope.partner.marketing_email = $scope.partner.representativeInfo.marketing_email; + $scope.partner.marketing_job = $scope.partner.representativeInfo.marketing_job_title; + + $scope.partner.legal_representative_wechatid = $scope.partner.representativeInfo.legal_representative_wechatid; + $scope.partner.marketing_wechatid = $scope.partner.representativeInfo.marketing_wechatid; + } + + $scope.enablePaymentType = function (type) { + $scope.partner[type] = !$scope.partner[type]; + }; + + if ($state.params.commitCardPayment) { + $scope.enablePaymentType('enable_card_payment'); + } + + if ($state.params.commitCrossBorderPayment) { + $scope.enablePaymentType('enable_cross_payment'); + } + + function hasRole() { + var rolenum; + switch (sessionStorage.getItem('role')) { + case "administrator": + rolenum = 1; + break; + case "bduser": + rolenum = 4; + break; + case "salesmanager": + rolenum = 8192; + break; + case "accountant": + rolenum = 8; + break; + case "sitemanager": + rolenum = 128; + break; + case "director": + rolenum = 64; + break; + case "developer": + rolenum = 256; + break; + case "compliance": + rolenum = 2; + break; + case "guest": + rolenum = 2048; + break; + case "orgmanager": + rolenum = 4096; + break; + case "riskmanager": + rolenum = 1024; + break; + default: + break; + } + if ((window.currentUser.role & rolenum) > 0) { + return true; + } else { + sessionStorage.removeItem('role'); + return false; + } + } + + if (hasRole()) { + $scope.role = sessionStorage.getItem('role'); + } + + var origin_referrer_id = angular.copy($scope.partner.referrer_id); + var resetClientPayDescByTpey = function (type) { + type = parseInt(type); + if (type == 1) { + removeClientPayDesc($scope.partner.client_pay_desc, '10'); + } + if (type == 2) { + removeClientPayDesc($scope.partner.client_pay_desc, '20'); + } + }; + var compare = function (x, y) { + x = parseInt(x); + y = parseInt(y); + if (x < y) { + return -1; + } else if (x > y) { + return 1; + } else { + return 0; + } + } + $scope.toggleClientPayType = function (type) { + if (!$scope.partner.client_pay_type) { + $scope.partner.client_pay_type = []; + } + var $idx = $scope.partner.client_pay_type.indexOf(type); + if ($idx >= 0) { + $scope.partner.client_pay_type.splice($idx, 1); + resetClientPayDescByTpey(type); + } else { + $scope.partner.client_pay_type.push(type); + $scope.partner.client_pay_type.sort(compare); + } + }; + $scope.toggleClientPayDesc = function (type) { + if (!$scope.partner.client_pay_desc) { + $scope.partner.client_pay_desc = []; + } + var $idx = $scope.partner.client_pay_desc.indexOf(type); + if ($idx >= 0) { + if (type == '203') { + removeClientPayDesc($scope.partner.client_pay_desc, '2030') + } + $scope.partner.client_pay_desc.splice($idx, 1); + } else { + $scope.partner.client_pay_desc.push(type); + $scope.partner.client_pay_desc.sort(compare); + } + }; + + $scope.partner.sameAsContactPerson = false; + $scope.checkboxOnclick = function () { + $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); + if ($scope.partner.sameAsContactPerson) { + $scope.partner.legal_representative_person = $scope.partner.contact_person; + $scope.partner.legal_representative_phone = $scope.partner.contact_phone; + $scope.partner.legal_representative_email = $scope.partner.contact_email; + $scope.partner.legal_representative_job = $scope.partner.contact_job; + $scope.partner.legal_representative_wechatid = $scope.partner.contact_wechatid; + } + } + + $scope.partner.marketingSameAsContact = false; + $scope.checkMarketingSameAsContact = function () { + $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); + if ($scope.partner.marketingSameAsContact) { + $scope.partner.marketing_person = $scope.partner.contact_person; + $scope.partner.marketing_phone = $scope.partner.contact_phone; + $scope.partner.marketing_email = $scope.partner.contact_email; + $scope.partner.marketing_job = $scope.partner.contact_job; + $scope.partner.marketing_wechatid = $scope.partner.contact_wechatid; + } + } + + $scope.partner.sameAsAddress = false; + $scope.sameAddress = function () { + $scope.partner.sameAsAddress = !($scope.partner.sameAsAddress); + if ($scope.partner.sameAsAddress) { + $scope.partner.registered_address = $scope.partner.address; + $scope.partner.registered_suburb = $scope.partner.suburb; + $scope.partner.registered_postcode = $scope.partner.postcode; + $scope.partner.registered_state = $scope.partner.state; + } + } + + $scope.listReferrers = function () { + $http.get('/sys/orgs/referrer').then(function (resp) { + $scope.referrers = resp.data; + }) + }; + $scope.listReferrers(); + + $scope.loadAlipayCategory = function () { + $http.get('/static/data/alipayMcc.json').then(function (resp) { + $scope.alipayMccCategory = resp.data; + }) + }; + $scope.loadAlipayCategory(); + $scope.loadJDindustry = function () { + $http.get('/static/data/jdindustry.json').then(function (resp) { + $scope.jdindustry = resp.data; + }) + }; + $scope.loadJDindustry(); + + $scope.loadLakalaPayindustry = function () { + $http.get('/static/data/lakalapayindustry.json').then(function (resp) { + $scope.lakalapayindustry = resp.data; + }) + }; + $scope.loadLakalaPayindustry(); + + $scope.loadLakalaPaySettle = function () { + $http.get('/static/data/lakalapaysettle.json').then(function (resp) { + $scope.lakalapaysettle = resp.data; + }) + }; + $scope.loadLakalaPaySettle(); + + $scope.loadLakalaPayGoods = function () { + $http.get('/static/data/lakalapaygoods.json').then(function (resp) { + $scope.lakalapaygoods = resp.data; + }) + }; + $scope.loadLakalaPayGoods(); + + $scope.loadRoyalpayindustry = function () { + $http.get('/static/data/royalpayindustry.json').then(function (resp) { + $scope.royalpayindustry = resp.data; + }) + }; + $scope.loadRoyalpayindustry(); + + $scope.loadHfindustry = function () { + $http.get('/static/data/hfindustry.json').then(function (resp) { + $scope.hfindustry = resp.data; + }) + }; + $scope.loadHfindustry(); + + $scope.onAlipayMccSelect = function (selectedItem) { + $scope.partner.alipay_category = selectedItem.label; + $scope.partner.alipayindustry = selectedItem.mccCode; + }; + $scope.onRoyalPayIndustrySelect = function (selectedItem) { + $scope.partner.royalpay_label = selectedItem.label; + $scope.partner.royalpayindustry = selectedItem.mccCode; + }; + $scope.onHfIndustrySelect = function (selectedItem) { + $scope.partner.hf_label = selectedItem.label; + $scope.partner.hfindustry = selectedItem.mccCode; + }; + + + $scope.updatePartner = function (form) { + if (form.$invalid) { + angular.forEach(form, function (item, key) { + if (key.indexOf('$') < 0) { + item.$dirty = true; + } + }); + return; + } + + if ($scope.partner.company_name.indexOf("Migration") != -1) { + alert("Company Name包含敏感词汇,请检查后重新提交!"); + return; + } + if ($scope.partner.company_phone.indexOf(' ') != -1) { + alert('Company Phone can not contain space character'); + return; + } + if ($scope.partner.contact_email.indexOf(' ') != -1) { + alert('Contact email Phone can not contain space character'); + return; + } + if ($scope.partner.suburb.indexOf(' ') != -1) { + alert('suburb can not contain two and more continuous space characters'); + return; + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if (!$scope.partner.company_photo) { + alert('Shop Photo1 is necessary'); + return; + } + if (!$scope.partner.store_photo) { + alert('Shop Photo2 is necessary'); + return; + } + } + + if ($scope.partner.acn && $scope.partner.business_structure == 'Company') { + if ($scope.partner.acn.length != 9) { + alert('Acn is not valid'); + } + } + if ($scope.partner.referrer_id) { + $scope.referrers.forEach(function (e) { + if ($scope.partner.referrer_id == e.org_id) { + $scope.partner.referrer_name = e.name; + return; + } + }) + } + var content = ''; + if (!origin_referrer_id && $scope.partner.referrer_id) { + content = 'Update partner info successfully,But You Had add new Referrer,Please Change the BD Commission Proportion!'; + } + if ($scope.partner.client_pay_type.length == 0) { + alert('请选择商户支付场景') + return; + } + if ($scope.partner.client_pay_desc.length == 0) { + alert('请选择商户支付方式') + return; + } + if ($scope.partner.client_pay_type.indexOf('1') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('10') < 0) { + alert("请检查线上支付场景是否已选择支付方式"); + return; + } + } + if ($scope.partner.client_pay_type.indexOf('2') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('20') < 0) { + alert("请检查线下支付场景是否已选择支付方式"); + return; + } + } + if ($scope.partner.client_pay_desc.join(',').indexOf('203') >= 0) { + if ($scope.partner.client_pay_desc.join(',').indexOf('2030') < 0 && $scope.partner.client_pay_desc.join(',').indexOf('20399') < 0) { + alert("请检查线下支付是否已选择收银系统类型"); + return; + } + } + $scope.partner.client_pay_type = $scope.partner.client_pay_type.join(','); + $scope.partner.client_pay_desc = $scope.partner.client_pay_desc.join(','); + $http.put('/sys/partners/' + $scope.partner.client_moniker, $scope.partner).then(function () { + if (content != '') { + commonDialog.alert({ + title: 'Warning', + content: content, + type: 'error' + }); + } else { + commonDialog.alert({ + title: 'Success', + content: 'Update partner information successfully', + type: 'success' + }); + } + $scope.updateMerchantLocation(); + $scope.loadPartners(); + $state.go('^.detail', {clientMoniker: $scope.partner.client_moniker}, {reload: true}); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}) + }); + }; + $scope.uploadLogo = function (file) { + if (file != null) { + if (file.size > 1 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过1MB,请压缩后重试', type: 'error'}) + } else { + $scope.logoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.logoProgress; + $scope.partner.logo_id = resp.data.fileid; + $scope.partner.logo_url = resp.data.url; + }, function (resp) { + delete $scope.logoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.logoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.uploadShopPhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + $scope.shopPhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.shopPhotoProgress; + $scope.partner.company_photo = resp.data.url; + }, function (resp) { + delete $scope.shopPhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.shopPhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.uploadStorePhoto = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + $scope.storePhotoProgress = {value: 0}; + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + delete $scope.storePhotoProgress; + $scope.partner.store_photo = resp.data.url; + }, function (resp) { + delete $scope.storePhotoProgress; + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }, function (evt) { + $scope.storePhotoProgress.value = parseInt(100 * evt.loaded / evt.total); + }) + } + } + }; + + $scope.getMerchantLocation = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { + $scope.merchant_location = resp.data; + }); + }; + $scope.getMerchantLocation(); + + $scope.updateMerchantLocation = function () { + var params = window.frames['merchant_detail'].merchant_location; + if (params) { + $http.put('/sys/partners/modify/' + $scope.partner.client_moniker + '/location', params).then(function () { + }); + } + } + }]); app.controller('partnerListCtrl', ['$scope', '$sce', '$http', '$filter', '$uibModal', 'businessStructuresMap', 'industryMap', 'stateMap', 'sectorMap', 'countryMap', function ($scope, $sce, $http, $filter, $uibModal, businessStructuresMap, industryMap, stateMap, sectorMap, countryMap) { @@ -239,7 +678,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter var selectAll = { "label": "All", "mccCode": "0", - "children":{} + "children": {} }; $scope.royalpayindustry.unshift(selectAll); }) @@ -271,7 +710,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } return key + '=' + encodeURIComponent(value) }).join('&'); - window.open('/sys/partners/exporting_excel?'+param_str) + window.open('/sys/partners/exporting_excel?' + param_str) }; /*$scope.loadLocations = function () { @@ -419,748 +858,701 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; }]); - app.controller('partnerDetailCtrl', ['$scope', '$http', '$state', '$uibModal', '$rootScope', 'Upload', 'commonDialog', 'partner', '$sce', function ($scope, $http, $state, $uibModal, $rootScope, Upload, commonDialog, partner, $sce) { - $scope.init = {wechat_compliance: false, local_merchant: false}; - $scope.partner = partner.data; - $scope.isComplianceOfCompanyName = false; - $scope.isComplianceOfShortName = false; - $scope.isComplianceOfBusinessStructure = false; - $scope.cardPromotionaparams={} - var website = partner.data.company_website; - if (website != null) { - if (website.indexOf('http') != 0) { - $scope.partner.company_website = 'http://' + angular.copy(website); + app.controller('partnerDetailCtrl', ['$scope', '$http', '$state', '$uibModal', '$rootScope', 'Upload', 'commonDialog', 'partner', '$sce', + function ($scope, $http, $state, $uibModal, $rootScope, Upload, commonDialog, partner, $sce) { + $scope.init = {wechat_compliance: false, local_merchant: false}; + $scope.partner = partner.data; + $scope.isComplianceOfCompanyName = false; + $scope.isComplianceOfShortName = false; + $scope.isComplianceOfBusinessStructure = false; + $scope.cardPromotionaparams = {}; + var website = partner.data.company_website; + if (website != null) { + if (website.indexOf('http') !== 0) { + $scope.partner.company_website = 'http://' + angular.copy(website); + } } - } - $scope.decideCompliance = function (name) { - var keywords = ['education', 'financial', 'train', 'immigrant', 'invest', - '律师咨询', '会计事务所', '移民', '留学', '娱乐', '金融', '地产', '投资']; - for (var i = 0; i < keywords.length; i++) { - if (name.indexOf(keywords[i]) != -1) { - return true; + $scope.decideCompliance = function (name) { + var keywords = ['education', 'financial', 'train', 'immigrant', 'invest', + '律师咨询', '会计事务所', '移民', '留学', '娱乐', '金融', '地产', '投资']; + for (var i = 0; i < keywords.length; i++) { + if (name.indexOf(keywords[i]) !== -1) { + return true; + } } + return false; + }; + if (partner.data.company_name != null) { + $scope.isComplianceOfCompanyName = $scope.decideCompliance(partner.data.company_name); } - return false; - }; - if (partner.data.company_name != null) { - $scope.isComplianceOfCompanyName = $scope.decideCompliance(partner.data.company_name); - } - if (partner.data.short_name != null) { - $scope.isComplianceOfShortName = $scope.decideCompliance(partner.data.short_name); - } - if (partner.data.business_structure != null) { - $scope.isComplianceOfBusinessStructure = $scope.decideCompliance(partner.data.business_structure); - } - $scope.showDBUsers = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bd_user').then(function (resp) { - $scope.partner.client_bds = resp.data; - }) - }; - $scope.showDBUsers(); - $scope.showFile = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_agree_file').then(function (resp) { - $scope.fileManager = resp.data; - }); - }; + if (partner.data.short_name != null) { + $scope.isComplianceOfShortName = $scope.decideCompliance(partner.data.short_name); + } + if (partner.data.business_structure != null) { + $scope.isComplianceOfBusinessStructure = $scope.decideCompliance(partner.data.business_structure); + } + $scope.showDBUsers = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/bd_user').then(function (resp) { + $scope.partner.client_bds = resp.data; + }) + }; + $scope.showDBUsers(); + $scope.showFile = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_agree_file').then(function (resp) { + $scope.fileManager = resp.data; + }); + }; - $scope.showCardFile = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=letter_of_offer_file').then(function (resp) { - $scope.letterOfOfferFileManager = resp.data; - }); - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=promotional_offer_file').then(function (resp) { - $scope.promotionalOfferFileManager = resp.data; - }); - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=terms_and_conditions_file').then(function (resp) { - $scope.termsAndConditionsFile = resp.data; - }); - }; + $scope.showCardFile = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=letter_of_offer_file').then(function (resp) { + $scope.letterOfOfferFileManager = resp.data; + }); + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=promotional_offer_file').then(function (resp) { + $scope.promotionalOfferFileManager = resp.data; + }); + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/file/source_card_agree_file?fileName=terms_and_conditions_file').then(function (resp) { + $scope.termsAndConditionsFile = resp.data; + }); + }; - $scope.showFile(); - $scope.showCardFile(); - $scope.passClient = function () { - if ($scope.partner.enable_hf) { - if ($scope.partner.hfindustry == null) { - alert("已开启HF支付通道,HF行业不可为空!"); + $scope.showFile(); + $scope.showCardFile(); + $scope.passClient = function () { + if (!$rootScope.complianceCheck) { + alert("please check first"); return; } - } - if (!$rootScope.complianceCheck) { - alert("please check first"); - return; - } - if (!$rootScope.complianceCheck.authFile) { - alert("Compliance Files not checked"); - return; - } - if (!$rootScope.complianceCheck.clientInfo) { - alert("Partner Detail not checked"); - return; - } - if (!$rootScope.complianceCheck.bankAccount) { - alert("Bank Account not checked"); - return; - } - var title = 'Audit Partner'; - var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; - var choises = ''; - var contentHtml = ''; - if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName - || $scope.isComplianceOfBusinessStructure) { - var info = []; - if ($scope.isComplianceOfCompanyName) { - info.push('Company Name'); + if (!$rootScope.complianceCheck.authFile) { + alert("Compliance Files not checked"); + return; } - if ($scope.isComplianceOfShortName) { - info.push('Short Name'); + if (!$rootScope.complianceCheck.clientInfo) { + alert("Partner Detail not checked"); + return; } - if ($scope.isComplianceOfBusinessStructure) { - info.push('Business Structure'); + if (!$rootScope.complianceCheck.bankAccount) { + alert("Bank Account not checked"); + return; } - title = 'Warning'; - contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); - choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, - {label: '确认提交', className: 'btn-success', key: '1'}]; - content = ''; - } - commonDialog.confirm({ - title: title, - content: content, - choises: choises, - contentHtml: contentHtml - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit', {pass: 1}).then(function () { - if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed!', - type: 'success' - }); - } else { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed! Email will send to contact email address soon.', - type: 'success' - }); + var title = 'Audit Partner'; + var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; + var choises = ''; + var contentHtml = ''; + if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName + || $scope.isComplianceOfBusinessStructure) { + var info = []; + if ($scope.isComplianceOfCompanyName) { + info.push('Company Name'); } - delete $rootScope.complianceCheck; - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }); - }; - $scope.passCardClient = function () { - if (!$rootScope.complianceCheck) { - alert("please check first"); - return; - } - if (!$rootScope.complianceCheck.authFile) { - alert("Compliance Files not checked"); - return; - } - if (!$rootScope.complianceCheck.clientInfo) { - alert("Partner Detail not checked"); - return; - } - if (!$rootScope.complianceCheck.bankAccount) { - alert("Bank Account not checked"); - return; - } - var title = 'Audit Partner Card'; - var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; - var choises = ''; - var contentHtml = ''; - if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName - || $scope.isComplianceOfBusinessStructure) { - var info = []; - if ($scope.isComplianceOfCompanyName) { - info.push('Company Name'); + if ($scope.isComplianceOfShortName) { + info.push('Short Name'); + } + if ($scope.isComplianceOfBusinessStructure) { + info.push('Business Structure'); + } + title = 'Warning'; + contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); + choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, + {label: '确认提交', className: 'btn-success', key: '1'}]; + content = ''; } - if ($scope.isComplianceOfShortName) { - info.push('Short Name'); + commonDialog.confirm({ + title: title, + content: content, + choises: choises, + contentHtml: contentHtml + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit', {pass: 1}).then(function () { + if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed!', + type: 'success' + }); + } else { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed! Email will send to contact email address soon.', + type: 'success' + }); + } + delete $rootScope.complianceCheck; + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }); + }; + $scope.passCardClient = function () { + if (!$rootScope.complianceCheck) { + alert("please check first"); + return; } - if ($scope.isComplianceOfBusinessStructure) { - info.push('Business Structure'); + if (!$rootScope.complianceCheck.authFile) { + alert("Compliance Files not checked"); + return; } - title = 'Warning'; - contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); - choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, - {label: '确认提交', className: 'btn-success', key: '1'}]; - content = ''; - } - commonDialog.confirm({ - title: title, - content: content, - choises: choises, - contentHtml: contentHtml - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit', {pass: 1}).then(function () { - if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { - commonDialog.alert({ - title: 'Success', - content: 'Comply Passed!', - type: 'success' - }); - } else { + if (!$rootScope.complianceCheck.clientInfo) { + alert("Partner Detail not checked"); + return; + } + if (!$rootScope.complianceCheck.bankAccount) { + alert("Bank Account not checked"); + return; + } + var title = 'Audit Partner Card'; + var content = 'Are you sure to mark partner ' + $scope.partner.company_name + ' audited?'; + var choises = ''; + var contentHtml = ''; + if ($scope.isComplianceOfCompanyName || $scope.isComplianceOfShortName + || $scope.isComplianceOfBusinessStructure) { + var info = []; + if ($scope.isComplianceOfCompanyName) { + info.push('Company Name'); + } + if ($scope.isComplianceOfShortName) { + info.push('Short Name'); + } + if ($scope.isComplianceOfBusinessStructure) { + info.push('Business Structure'); + } + title = 'Warning'; + contentHtml = $sce.trustAsHtml('本次提交的商户[' + $scope.partner.company_name + '],' + info.toString() + '存在微信渠道不合规信息'); + choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, + {label: '确认提交', className: 'btn-success', key: '1'}]; + content = ''; + } + commonDialog.confirm({ + title: title, + content: content, + choises: choises, + contentHtml: contentHtml + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit', {pass: 1}).then(function () { + if ($scope.partner.approve_result == 2 && ($scope.partner.source == 1 || $scope.partner.source == 2)) { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed!', + type: 'success' + }); + } else { + commonDialog.alert({ + title: 'Success', + content: 'Comply Passed! Email will send to contact email address soon.', + type: 'success' + }); + } + delete $rootScope.complianceCheck; + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }); + }; + $scope.pass2GreenChannel = function () { + commonDialog.confirm({ + title: 'Green Channel Audit Partner', + content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' green channel audited ?' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/aduit/green_channel').then(function () { commonDialog.alert({ title: 'Success', content: 'Comply Passed! Email will send to contact email address soon.', type: 'success' }); - } - delete $rootScope.complianceCheck; + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + $scope.showBg = false; + $scope.exportPDF = function () { + $scope.showBg = true; + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/agreepdf').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Agreement File Generate Succeed! Please notify BD!', + type: 'success' + }); + $scope.showBg = false; $state.reload(); }, function (resp) { + $scope.showBg = false; + $state.reload(); commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }); - }; - $scope.pass2GreenChannel = function () { - commonDialog.confirm({ - title: 'Green Channel Audit Partner', - content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' green channel audited ?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/aduit/green_channel').then(function () { + }); + + }; + $scope.exportAgreegatePDF = function () { + $scope.showBg = true; + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf').then(function () { commonDialog.alert({ title: 'Success', - content: 'Comply Passed! Email will send to contact email address soon.', + content: 'Agreement File Generate Succeed! Please notify BD!', type: 'success' }); + $scope.showBg = false; $state.reload(); }, function (resp) { + $scope.showBg = false; + $state.reload(); commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - $scope.showBg = false; - $scope.exportPDF = function () { - $scope.showBg = true; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/agreepdf').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', - type: 'success' }); - $scope.showBg = false; - $state.reload(); - }, function (resp) { - $scope.showBg = false; - $state.reload(); - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }); + }; - }; - $scope.exportAgreegatePDF = function () { - $scope.showBg = true; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', - type: 'success' + //制作卡支付合同 + $scope.exportCardAgreegatePDF = function () { + $scope.showBg = true; + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_agree_pdf').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Agreement File Generate Succeed! Please notify BD!', + type: 'success' + }); + $scope.showBg = false; + $state.reload(); + }, function (resp) { + $scope.showBg = false; + $state.reload(); + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }); - $scope.showBg = false; - $state.reload(); - }, function (resp) { - $scope.showBg = false; - $state.reload(); - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }); - }; + } + $scope.Export = function () { + var url = '/dev/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf'; + return url; + } + $scope.uploadAgreeFile = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.agree_file_import = resp.data.url; + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', {source_agree_file: $scope.agree_file_import}).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Succeed Imported! Please notify BD', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }, function (resp) { + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }) + } + } + }; - //制作卡支付合同 - $scope.exportCardAgreegatePDF = function(){ - $scope.showBg = true; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_agree_pdf').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', - type: 'success' + $scope.uploadCardAgreeFile = function (file) { + if (file != null) { + if (file.size > 2 * 1024 * 1024) { + commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) + } else { + Upload.upload({ + url: '/attachment/files', + data: {file: file} + }).then(function (resp) { + $scope.agree_file_import = resp.data.url; + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', {source_agree_file: $scope.agree_file_import}).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Succeed Imported! Please notify BD', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }, function (resp) { + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) + }) + } + } + }; + $scope.notifyBD = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/completeAgree').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Notify BD Successed!.', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}); }); - $scope.showBg = false; - $state.reload(); - }, function (resp) { - $scope.showBg = false; - $state.reload(); - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }); - } + }; + + $scope.cardNotifyBD = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/cardCompleteAgree').then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Notify BD Successed!.', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}); + }); + }; - //制作促销合同 - $scope.exportCardPromotionaAgreegatePDF = function(){ - var title = '确认生成Promotional Offer合同'; - var promotiona_date=''; - var promotiona_period =''; - var contentHtml = $sce.trustAsHtml( - '请输入优惠开始日期(eg:2020-02-01): '+ - '' + - '
    ' + - '请输入活动周数(unit:week): ' + - ''); - var choises = [{label: '取消', className: 'btn-danger', key: '2', dismiss: true}, - {label: '确认生成', className: 'btn-success', key: '1'}]; - var content = ''; + $scope.downTempPdf = function () { + return '/sys/partners/' + $scope.partner.client_moniker + '/temp/export/pdf'; + } - commonDialog.confirm({ - title: title, - content: content, - choises: choises, - contentHtml: contentHtml - }).then(function (res) { - $scope.showBg = true; - var date = document.getElementById("promotiona_date").value; - var period = document.getElementById("promotiona_period").value; - if(date=='' || period==''){ - commonDialog.alert({title: 'Error', content: '选项不得未空', type: 'error'}); - }else{ - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/export/aggregate/card_promotiona_agree_pdf?date='+date+'&period='+period).then(function () { + $scope.refuse = function () { + commonDialog.inputText({title: 'refuse cause'}).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/refuse', {refuse_remark: text}).then(function () { commonDialog.alert({ title: 'Success', - content: 'Agreement File Generate Succeed! Please notify BD!', + content: 'Audit application has been refused.', type: 'success' }); - $scope.showBg = false; $state.reload(); }, function (resp) { - $scope.showBg = false; + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + + $scope.cardRefuse = function () { + commonDialog.inputText({title: 'refuse cause'}).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit/refuse', {refuse_remark: text}).then(function () { + commonDialog.alert({ + title: 'Success', + content: 'Card Audit application has been refused.', + type: 'success' + }); $state.reload(); + }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }); - } + }) + }) + } - }); - } + $scope.deleteClient = function () { + commonDialog.confirm({ + title: 'Delete Partner', + content: 'Are you sure to delete ' + $scope.partner.company_name + '?' + }).then(function () { + $http.delete('/sys/partners/' + $scope.partner.client_moniker).then(function () { + $state.go('^'); + commonDialog.alert({title: 'Delete', content: 'Partner Already Disabled', type: 'error'}); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + $scope.revertClient = function () { + commonDialog.confirm({ + title: 'Revert Partner', + content: 'Are you sure to Revert ' + $scope.partner.company_name + '?' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/revert').then(function () { + $state.go('^'); + commonDialog.alert({title: 'Revert', content: 'Partner Already Revert', type: 'success'}); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; - $scope.Export = function () { - var url = '/dev/' + $scope.partner.client_moniker + '/export/aggregate/agreepdf'; - return url; - } - $scope.uploadAgreeFile = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) - } else { - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - $scope.agree_file_import = resp.data.url; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', {source_agree_file: $scope.agree_file_import}).then(function () { + $scope.commitToCompliance = function () { + commonDialog.confirm({ + title: 'Commit to Compliance', + content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', + choises: [ + {label: 'Submit', className: 'btn-success', key: 1}, + {label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true} + ] + }).then(function (choice) { + if (choice == 1) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_compliance', {}).then(function () { commonDialog.alert({ title: 'Success', - content: 'Succeed Imported! Please notify BD', + content: 'Commit to Compliance successfully', type: 'success' }); $state.reload(); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) - }, function (resp) { - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }) - } - } - }; + } + }) + }; - $scope.uploadCardAgreeFile = function (file) { - if (file != null) { - if (file.size > 2 * 1024 * 1024) { - commonDialog.alert({title: 'Error', content: '文件大小不能超过2MB,请压缩后重试', type: 'error'}) - } else { - Upload.upload({ - url: '/attachment/files', - data: {file: file} - }).then(function (resp) { - $scope.agree_file_import = resp.data.url; - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/import/agreepdf', {source_agree_file: $scope.agree_file_import}).then(function () { + $scope.commitToCardCompliance = function () { + commonDialog.confirm({ + title: 'Commit to Compliance', + content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', + choises: [ + {label: 'Submit', className: 'btn-success', key: 1}, + {label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true} + ] + }).then(function (choice) { + if (choice == 1) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_card_compliance', {}).then(function () { commonDialog.alert({ title: 'Success', - content: 'Succeed Imported! Please notify BD', + content: 'Commit to Compliance successfully', type: 'success' }); $state.reload(); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) - }, function (resp) { - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}) - }) - } + } + }) } - }; - $scope.notifyBD = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/completeAgree').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Notify BD Successed!.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}); - }); - }; - - $scope.cardNotifyBD = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/notify/cardCompleteAgree').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Notify BD Successed!.', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Upload Failed', content: resp.data.message, type: 'error'}); - }); - }; - - $scope.downTempPdf = function () { - var url = '/sys/partners/' + $scope.partner.client_moniker + '/temp/export/pdf'; - return url; - } - - $scope.refuse = function () { - commonDialog.inputText({title: 'refuse cause'}).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/refuse', {refuse_remark: text}).then(function () { + $scope.apply2makeAgreeFile = function () { + if (!$scope.partner.enable_cross_payment) { commonDialog.alert({ - title: 'Success', - content: 'Audit application has been refused.', - type: 'success' + title: 'Error!', + content: '请完善商户跨境支付基本信息、签约费率、合规文件!', + type: 'error' }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; + $state.go('partners.edit', { + clientMoniker: $scope.partner.client_moniker, + commitCardPayment: false, + commitCrossBorderPayment: true + }); + return; + } + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then(function () { + commonDialog.alert({ + title: 'Success!', + content: '已提交制作合同!', + type: 'success' + }); + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + } + ); + }; - $scope.cardRefuse = function(){ - commonDialog.inputText({title: 'refuse cause'}).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/card_audit/refuse', {refuse_remark: text}).then(function () { + $scope.apply2makeCardAgreeFile = function () { + if (!$scope.partner.enable_card_payment) { commonDialog.alert({ - title: 'Success', - content: 'Card Audit application has been refused.', - type: 'success' + title: 'Error!', + content: '请完善商户卡支付基本信息、签约费率、合规文件!', + type: 'error' }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - } - - $scope.deleteClient = function () { - commonDialog.confirm({ - title: 'Delete Partner', - content: 'Are you sure to delete ' + $scope.partner.company_name + '?' - }).then(function () { - $http.delete('/sys/partners/' + $scope.partner.client_moniker).then(function () { - $state.go('^'); - commonDialog.alert({title: 'Delete', content: 'Partner Already Disabled', type: 'error'}); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - $scope.revertClient = function () { - commonDialog.confirm({ - title: 'Revert Partner', - content: 'Are you sure to Revert ' + $scope.partner.company_name + '?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/revert').then(function () { - $state.go('^'); - commonDialog.alert({title: 'Revert', content: 'Partner Already Revert', type: 'success'}); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; + $state.go('partners.edit', { + clientMoniker: $scope.partner.client_moniker, + commitCardPayment: true, + commitCrossBorderPayment: false + }); + return; + } + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_card_agree_file').then(function () { + commonDialog.alert({ + title: 'Success!', + content: '已提交制作合同!', + type: 'success' + }); + $state.reload(); + }, function (resp) { + if (String(resp.data.message).match("No Rate Config")) { + commonDialog.alert({ + title: 'Error!', + content: '商户卡支付签约费率未配置,请添加商户卡支付签约费率!', + type: 'error' + }); + $state.go('partners.detail.rates', { + clientMoniker: $scope.partner.client_moniker + }); + } else { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + } + } + ); + }; - $scope.commitToCompliance = function () { - commonDialog.confirm({ - title: 'Commit to Compliance', - content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', - choises: [ - {label: 'Submit', className: 'btn-success', key: 1}, - {label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true} - ] - }).then(function (choice) { - if (choice == 1) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_compliance', {}).then(function () { + $scope.commit2GreenChannel = function () { + commonDialog.confirm({ + title: 'Audit Partner', + content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' Green Channel?' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/compliance/green_channel').then(function () { commonDialog.alert({ title: 'Success', - content: 'Commit to Compliance successfully', + content: 'Commit to Green Channel successfully', type: 'success' }); $state.reload(); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) - } - }) - }; - $scope.commitToCardCompliance = function(){ - commonDialog.confirm({ - title: 'Commit to Compliance', - content: 'Are you sure to commit ' + $scope.partner.company_name + ' to compliance?', - choises: [ - {label: 'Submit', className: 'btn-success', key: 1}, - {label: 'Cancel', className: 'btn-warning', key: 0, dismiss: true} - ] - }).then(function (choice) { - if (choice == 1) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/to_card_compliance', {}).then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Commit to Compliance successfully', - type: 'success' - }); + }) + }; + + $scope.markAuditEmail = function () { + commonDialog.confirm({ + title: 'Warning', + content: 'Make sure you have send the email to client.' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/email_sending_status').then(function () { $state.reload(); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) - } - }) - } - $scope.apply2makeAgreeFile = function () { - if (!$scope.partner.enable_cross_payment) { - commonDialog.alert({ - title: 'Error!', - content: '请完善商户跨境支付基本信息、签约费率、合规文件!', - type: 'error' - }); - $state.go('partners.edit',{ - clientMoniker:$scope.partner.client_moniker, - commitCardPayment:false, - commitCrossBorderPayment:true}); - return; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_agree_file').then(function () { - commonDialog.alert({ - title: 'Success!', - content: '已提交制作合同!', - type: 'success' - }); + }) + }; + $scope.resendApproveEmail = function () { + commonDialog.confirm({ + title: 'Warning', + content: 'This operation will reset the password of admin user. Are you sure this email is correct ? Or you may update this information first.' + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/send_email').then(function () { + $state.reload(); + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) + }) + }; + $scope.editBDUser = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', + controller: 'partnerChooseBDUserDialogCtrl', + resolve: { + bdUsers: ['$http', function ($http) { + return $http.get('/sys/manager_accounts/roles/bd_user'); + }], + partner: function () { + return $scope.partner; + }, + type: function () { + return 'edit'; + } + } + }).result.then(function () { $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - } - ); - }; - - $scope.apply2makeCardAgreeFile = function () { - if (!$scope.partner.enable_card_payment) { - commonDialog.alert({ - title: 'Error!', - content: '请完善商户卡支付基本信息、签约费率、合规文件!', - type: 'error' - }); - $state.go('partners.edit',{ - clientMoniker:$scope.partner.client_moniker, - commitCardPayment:true, - commitCrossBorderPayment: false}); - return; - } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/make_card_agree_file').then(function () { - commonDialog.alert({ - title: 'Success!', - content: '已提交制作合同!', - type: 'success' - }); + }) + }; + $scope.bindBDUser = function () { + $uibModal.open({ + templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', + controller: 'partnerChooseBDUserDialogCtrl', + resolve: { + bdUsers: ['$http', function ($http) { + return $http.get('/sys/manager_accounts/roles/bd_user'); + }], + partner: function () { + return $scope.partner; + }, + type: function () { + return 'add'; + } + } + }).result.then(function () { $state.reload(); - }, function (resp) { - if (String(resp.data.message).match("No Rate Config")) { - commonDialog.alert({ - title: 'Error!', - content: '商户卡支付签约费率未配置,请添加商户卡支付签约费率!', - type: 'error' - }); - $state.go('partners.detail.rates', { - clientMoniker: $scope.partner.client_moniker - }); - }else { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - } - } - ); - }; + }) + }; - $scope.commit2GreenChannel = function () { - commonDialog.confirm({ - title: 'Audit Partner', - content: 'Are you sure to mark partner ' + $scope.partner.company_name + ' Green Channel?' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/compliance/green_channel').then(function () { - commonDialog.alert({ - title: 'Success', - content: 'Commit to Green Channel successfully', - type: 'success' - }); - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + $scope.configMasterMerchant = function () { + commonDialog.inputText({title: 'Input Master Merchant Code'}).then(function (text) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/master_configuration', {master_merchant: text}).then(function () { + commonDialog.alert({ + title: 'Success', + content: "Master Merchant Code:" + text, + type: 'success' + }); + }, function (resp) { + commonDialog.alert({ + title: 'Config Master Merchant Failed', + content: resp.data.message, + type: 'error' + }); + }) }) + }; + $scope.getMerchantLocation = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { + $scope.merchant_location = resp.data; + }); + }; + $scope.getMerchantLocation(); - }) - }; - $scope.markAuditEmail = function () { - commonDialog.confirm({ - title: 'Warning', - content: 'Make sure you have send the email to client.' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/email_sending_status').then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - $scope.resendApproveEmail = function () { - commonDialog.confirm({ - title: 'Warning', - content: 'This operation will reset the password of admin user. Are you sure this email is correct ? Or you may update this information first.' - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/audit/send_email').then(function () { - $state.reload(); - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); - }) - }) - }; - $scope.editBDUser = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', - controller: 'partnerChooseBDUserDialogCtrl', - resolve: { - bdUsers: ['$http', function ($http) { - return $http.get('/sys/manager_accounts/roles/bd_user'); - }], - partner: function () { - return $scope.partner; - }, - type: function () { - return 'edit'; - } + $scope.complianceCheck = function () { + if (!$rootScope.complianceCheck) { + $rootScope.complianceCheck = {}; } - }).result.then(function () { - $state.reload(); - }) - }; - $scope.bindBDUser = function () { - $uibModal.open({ - templateUrl: '/static/payment/partner/templates/bd_user_choose_dialog.html', - controller: 'partnerChooseBDUserDialogCtrl', - resolve: { - bdUsers: ['$http', function ($http) { - return $http.get('/sys/manager_accounts/roles/bd_user'); - }], - partner: function () { - return $scope.partner; - }, - type: function () { - return 'add'; + $rootScope.complianceCheck.client_id = $scope.partner.client_id; + $rootScope.complianceCheck.clientInfo = true; + }; + $scope.complianceChangeCheck = function () { + if ($rootScope.complianceCheck) { + if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { + delete $rootScope.complianceCheck; } } - }).result.then(function () { - $state.reload(); - }) - }; + }; + $scope.complianceChangeCheck(); + + $scope.changeWechatCompliance = function () { + if (!$scope.partner) { + return; + } + if (!$state.is('partners.detail')) { + $scope.init.wechat_compliance = false; + return; + } + if (!$scope.init.wechat_compliance) { + $scope.init.wechat_compliance = true; + return; + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_compliance_permission', {allow: $scope.partner.wechat_compliance}).then(function () { - $scope.configMasterMerchant = function () { - commonDialog.inputText({title: 'Input Master Merchant Code'}).then(function (text) { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/master_configuration', {master_merchant: text}).then(function () { - commonDialog.alert({title: 'Success', content: "Master Merchant Code:" + text, type: 'success'}); }, function (resp) { commonDialog.alert({ - title: 'Config Master Merchant Failed', + title: 'failed to change wechat_compliance permission status', content: resp.data.message, type: 'error' - }); + }) }) - }) - }; - - $scope.getMerchantLocation = function () { - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/location').then(function (resp) { - $scope.merchant_location = resp.data; - }); - }; - $scope.getMerchantLocation(); - - - $scope.complianceCheck = function () { - if (!$rootScope.complianceCheck) { - $rootScope.complianceCheck = {}; - } - $rootScope.complianceCheck.client_id = $scope.partner.client_id; - $rootScope.complianceCheck.clientInfo = true; - }; - $scope.complianceChangeCheck = function () { - if ($rootScope.complianceCheck) { - if ($scope.partner.client_id != $rootScope.complianceCheck.client_id) { - delete $rootScope.complianceCheck; + }; + $scope.changeLocalMerchant = function () { + if (!$scope.partner) { + return; } - } - }; - $scope.complianceChangeCheck(); - - $scope.changeWechatCompliance = function () { - if (!$scope.partner) { - return; - } - if (!$state.is('partners.detail')) { - $scope.init.wechat_compliance = false; - return; - } - if (!$scope.init.wechat_compliance) { - $scope.init.wechat_compliance = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/wechat_compliance_permission', {allow: $scope.partner.wechat_compliance}).then(function () { - - }, function (resp) { - commonDialog.alert({ - title: 'failed to change wechat_compliance permission status', - content: resp.data.message, - type: 'error' - }) - }) - }; - $scope.changeLocalMerchant = function () { - if (!$scope.partner) { - return; - } - if (!$state.is('partners.detail')) { - $scope.init.local_merchant = false; - return; - } - if (!$scope.init.local_merchant) { - $scope.init.local_merchant = true; - return; - } - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/local_merchant_permission', {allow: $scope.partner.local_merchant}).then(function () { + if (!$state.is('partners.detail')) { + $scope.init.local_merchant = false; + return; + } + if (!$scope.init.local_merchant) { + $scope.init.local_merchant = true; + return; + } + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/local_merchant_permission', {allow: $scope.partner.local_merchant}).then(function () { - }, function (resp) { - commonDialog.alert({ - title: 'failed to change local_merchant permission status', - content: resp.data.message, - type: 'error' + }, function (resp) { + commonDialog.alert({ + title: 'failed to change local_merchant permission status', + content: resp.data.message, + type: 'error' + }) }) - }) - }; + }; - $scope.removeSub = function () { - $http.delete('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { - $state.reload(); - }); - }; - $scope.addSub = function () { - $http.put('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { - $state.reload(); - }); - }; - }]); + $scope.removeSub = function () { + $http.delete('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { + $state.reload(); + }); + }; + $scope.addSub = function () { + $http.put('/sys/partners/unsub/' + $scope.partner.client_moniker).then(function (resp) { + $state.reload(); + }); + }; + }]); app.controller('partnerPaymentInfoCtrl', ['$scope', '$http', '$state', 'commonDialog', '$uibModal', '$sce', function ($scope, $http, $state, commonDialog, $uibModal, $sce) { $scope.convertExtParams = []; $scope.copyHfLink = function () { @@ -1197,7 +1589,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $http.get('/sys/partners/' + $scope.partner.client_moniker).then(function (resp) { $scope.extParams = {}; $scope.paymentInfo = resp.data; - $scope.extParams = $scope.paymentInfo.ext_params?JSON.parse($scope.paymentInfo.ext_params):null; + $scope.extParams = $scope.paymentInfo.ext_params ? JSON.parse($scope.paymentInfo.ext_params) : null; $scope.convertExtParams = $scope.extParamsEditFlags() $scope.ctrl.editSubMerchant = false; $scope.ctrl.editAliSubMerchant = false; @@ -1207,17 +1599,17 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.ctrl.editRefundCreditLine = false; }) }; - $scope.extParamsEditFlags = function(){ + $scope.extParamsEditFlags = function () { var paramList = [] - if($scope.extParams != null){ - for(var key in $scope.extParams){ + if ($scope.extParams != null) { + for (var key in $scope.extParams) { var obj = {} - if(typeof $scope.extParams[key] != 'boolean'){ + if (typeof $scope.extParams[key] != 'boolean') { obj.name = key; obj.value = $scope.extParams[key]; obj.type = 'string'; - obj.flag =false; - }else{ + obj.flag = false; + } else { obj.name = key; obj.value = $scope.extParams[key]; obj.type = 'boolean' @@ -1934,7 +2326,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }; - $scope.changeBillCodeVersion = function() { + $scope.changeBillCodeVersion = function () { if (!$scope.paymentInfo) { return; } @@ -1949,15 +2341,18 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }) }; - $scope.extChangeParam = function(name,value){ + $scope.extChangeParam = function (name, value) { var flag = true; $scope.convertExtParams.forEach(function (params) { - if(params.name == name && value=='' && params.type == 'string'){ - flag = false; + if (params.name == name && value == '' && params.type == 'string') { + flag = false; } }) - if(flag){ - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ext_config',{key:name,value:value}).then(function () { + if (flag) { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/ext_config', { + key: name, + value: value + }).then(function () { $scope.loadPartnerPaymentInfo(); }) } @@ -1993,7 +2388,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.loadSubClients = function (page) { var params = {}; params.page = page || $scope.pagination.page || 1; - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page',{params : params}).then(function (resp) { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', {params: params}).then(function (resp) { $scope.subPartners = resp.data.data; $scope.pagination = resp.data.pagination; }); @@ -2053,7 +2448,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }]); - app.controller('partnerRatesCtrl', ['$scope', '$rootScope', '$http', '$uibModal', 'commonDialog', '$sce','$state', function ($scope, $rootScope, $http, $uibModal, commonDialog, $sce,$state) { + app.controller('partnerRatesCtrl', ['$scope', '$rootScope', '$http', '$uibModal', 'commonDialog', '$sce', '$state', function ($scope, $rootScope, $http, $uibModal, commonDialog, $sce, $state) { $scope.bankCtrl = {edit: true, rate_name: 'Wechat'}; $scope.init = { skip_clearing: false, @@ -2301,6 +2696,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.getRates(); }); }; + $scope.complianceCheck = function () { if (!$rootScope.complianceCheck) { $rootScope.complianceCheck = {}; @@ -2383,7 +2779,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter if ($scope.card_payment_normal) { $scope.cardRateConfig = $scope.card_payment[0]; $scope.card_payment_switch_title = "Direct Debit"; - }else { + } else { $scope.cardRateConfig = $scope.card_payment[1]; $scope.card_payment_switch_title = "Card Payment"; } @@ -2740,9 +3136,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter // $scope.t2city_map = angular.copy(t2city_map); $scope.partner.sameAsContactPerson = false; - $scope.checkboxOnclick = function (){ + $scope.checkboxOnclick = function () { $scope.partner.sameAsContactPerson = !($scope.partner.sameAsContactPerson); - if($scope.partner.sameAsContactPerson) { + if ($scope.partner.sameAsContactPerson) { $scope.partner.legal_representative_person = $scope.partner.contact_person; $scope.partner.legal_representative_phone_a = $scope.partner.contact_phone_a; $scope.partner.legal_representative_phone_c = $scope.partner.contact_phone_c; @@ -2755,9 +3151,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.partner.marketingSameAsContact = false; - $scope.checkMarketingSameAsContact = function (){ + $scope.checkMarketingSameAsContact = function () { $scope.partner.marketingSameAsContact = !($scope.partner.marketingSameAsContact); - if($scope.partner.marketingSameAsContact) { + if ($scope.partner.marketingSameAsContact) { $scope.partner.marketing_person = $scope.partner.contact_person; $scope.partner.marketing_phone_a = $scope.partner.contact_phone_a; $scope.partner.marketing_phone_c = $scope.partner.contact_phone_c; @@ -2768,10 +3164,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } } - $scope.partner.sameAsAddress=false; - $scope.sameAddress = function (){ - $scope.partner.sameAsAddress=!($scope.partner.sameAsAddress); - if($scope.partner.sameAsAddress) { + $scope.partner.sameAsAddress = false; + $scope.sameAddress = function () { + $scope.partner.sameAsAddress = !($scope.partner.sameAsAddress); + if ($scope.partner.sameAsAddress) { $scope.partner.registered_address = $scope.partner.address; $scope.partner.registered_suburb = $scope.partner.suburb; $scope.partner.registered_postcode = $scope.partner.postcode; @@ -2822,8 +3218,8 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } $scope.partner.company_phone = '+' + $scope.partner.company_phone_c + ($scope.partner.company_phone_a || '') + $scope.partner.company_phone_p; $scope.partner.contact_phone = '+' + $scope.partner.contact_phone_c + ($scope.partner.contact_phone_a || '') + $scope.partner.contact_phone_p; - $scope.partner.legal_representative_phone = '+' + $scope.partner.legal_representative_phone_c + ( $scope.partner.legal_representative_phone_a || '') + $scope.partner.legal_representative_phone_p; - $scope.partner.marketing_phone = '+' + $scope.partner.marketing_phone_c + ( $scope.partner.marketing_phone_a || '') + $scope.partner.marketing_phone_p; + $scope.partner.legal_representative_phone = '+' + $scope.partner.legal_representative_phone_c + ($scope.partner.legal_representative_phone_a || '') + $scope.partner.legal_representative_phone_p; + $scope.partner.marketing_phone = '+' + $scope.partner.marketing_phone_c + ($scope.partner.marketing_phone_a || '') + $scope.partner.marketing_phone_p; if ($scope.partner.company_phone.indexOf(' ') != -1) { alert('Company Phone can not contain space character'); @@ -3033,25 +3429,25 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); } params.page = page || $scope.pagination.page || 1; - if(params.gateway){ - if((params.gateway.sort().toString()!=[0,1].toString()) && (params.gateway.sort().toString()!=[5,6].toString())){ + if (params.gateway) { + if ((params.gateway.sort().toString() != [0, 1].toString()) && (params.gateway.sort().toString() != [5, 6].toString())) { delete params.gatewayChilds; delete params.gatewayChild; } - if(params.gatewayChilds){ + if (params.gatewayChilds) { var exist = false params.gatewayChilds.forEach(function (child) { - if(child==params.gatewayChild){ + if (child == params.gatewayChild) { exist = true } }) - if(!exist){ + if (!exist) { params.gatewayChild = null } - }else{ + } else { delete params.gatewayChild; } - }else{ + } else { delete params.gatewayChilds; delete params.gatewayChild; } @@ -3065,9 +3461,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }); }; - $scope.initGatewayChild = function(){ + $scope.initGatewayChild = function () { $scope.params.gatewayChilds = $scope.params.gateway; - $scope.params.gatewayChild=null; + $scope.params.gatewayChild = null; $scope.loadTradeLogs(1); } $scope.gatewaySelected = function (arr) { @@ -3129,7 +3525,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } $scope.loadTradeLogs(); }; - $scope.searchSubClients = function (subSearchText,page) { + $scope.searchSubClients = function (subSearchText, page) { $scope.subClientTable1 = [$scope.partner]; $scope.subClientTable2 = []; var params = {}; @@ -3138,13 +3534,13 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.subSearchText = subSearchText; params.searchText = subSearchText; } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page',{params: params}).then(function (resp) { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', {params: params}).then(function (resp) { var clientList = resp.data.data; $scope.subClientPagination = resp.data.pagination; clientList.forEach(function (client) { if ($scope.subClientTable1.length < 11) { $scope.subClientTable1.push(client); - }else { + } else { $scope.subClientTable2.push(client); } $scope.clients.push(client); @@ -3153,7 +3549,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; if ($scope.partner.has_children && !$scope.partner.hide_sub_mch) { - $scope.searchSubClients('',1); + $scope.searchSubClients('', 1); $scope.loadTradeLogs(1); } else { $scope.loadTradeLogs(1); @@ -3518,9 +3914,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.listRedpackLogs(1); }]); app.controller('partnerAuthFileCtrl', ['$scope', '$http', '$rootScope', 'commonDialog', '$state', function ($scope, $http, $rootScope, commonDialog, $state) { - if ($state.params.commitType=='card-payment'){ + if ($state.params.commitType == 'card-payment') { $state.go('partners.detail.files.MW_files'); - }else { + } else { $state.go('partners.detail.files.CP_files'); } }]); @@ -3731,7 +4127,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter commonDialog.alert({title: 'Error', content: '请选择ID Type', type: 'error'}); return; } - if ($scope.file.beneficiary_id_title!="Ultimate beneficiary owner") { + if ($scope.file.beneficiary_id_title != "Ultimate beneficiary owner") { if (!$scope.file.other_id_title_desc) { commonDialog.alert({title: 'Error', content: '请简要告知为何无法提供受益股东的资料', type: 'error'}); return; @@ -3752,7 +4148,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.cancelIdInfo = function () { $state.reload(); - $scope.id_info_form.edit=false + $scope.id_info_form.edit = false }; $scope.downloadAsZip = function () { @@ -4119,7 +4515,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.cancelIdInfo = function () { $state.reload(); - $scope.id_info_form.edit=false + $scope.id_info_form.edit = false }; $scope.downloadAsZip = function () { @@ -4134,8 +4530,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter content: 'Upload Successful', type: 'success' }); - $state.go('partners.detail.files',{clientMoniker:$scope.partner.client_moniker, - commitType: "card-payment"}, {reload: true}); + $state.go('partners.detail.files', { + clientMoniker: $scope.partner.client_moniker, + commitType: "card-payment" + }, {reload: true}); }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) @@ -4155,19 +4553,19 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $rootScope.complianceCheck.authFile = true; $rootScope.complianceCheck.client_id = $scope.partner.client_id; - if($scope.file.upay_application_form==null || $scope.file.upay_application_form ==''){ + if ($scope.file.upay_application_form == null || $scope.file.upay_application_form == '') { commonDialog.alert({type: 'error', title: 'Error', content: '请补充商户申请表合规文件'}) $rootScope.complianceCheck.authFile = false; - }else if($scope.file.client_bank_file==null || $scope.file.client_bank_file ==''){ + } else if ($scope.file.client_bank_file == null || $scope.file.client_bank_file == '') { commonDialog.alert({type: 'error', title: 'Error', content: '请补六个月银行对账单合规文件'}) $rootScope.complianceCheck.authFile = false; - }else if($scope.file.client_company_file==null || $scope.file.client_company_file ==''){ + } else if ($scope.file.client_company_file == null || $scope.file.client_company_file == '') { commonDialog.alert({type: 'error', title: 'Error', content: '请补充当前公司信息摘录合规文件'}) $rootScope.complianceCheck.authFile = false; - }else if($scope.file.upay_driver_license==null || $scope.file.upay_driver_license ==''){ + } else if ($scope.file.upay_driver_license == null || $scope.file.upay_driver_license == '') { commonDialog.alert({type: 'error', title: 'Error', content: '请补充法人身份证明合规文件'}) $rootScope.complianceCheck.authFile = false; - } else if($scope.file.kyc_utility_bill_file==null || $scope.file.kyc_utility_bill_file ==''){ + } else if ($scope.file.kyc_utility_bill_file == null || $scope.file.kyc_utility_bill_file == '') { commonDialog.alert({type: 'error', title: 'Error', content: '请补充家庭住址证明 (一个水电煤网账单)合规文件'}) $rootScope.complianceCheck.authFile = false; } @@ -4306,10 +4704,10 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }; -/* $scope.downloadAsZip = function () { - var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/complianceAsZIP'; - return url; - };*/ + /* $scope.downloadAsZip = function () { + var url = '/sys/partners/' + $scope.partner.client_moniker + '/download/complianceAsZIP'; + return url; + };*/ $scope.deleteComplianceFiles = function (file_id) { commonDialog.confirm({ @@ -4377,7 +4775,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.isAll = true; $scope.more20ChoseSubClient = false; $scope.choseSubClientNow = 'More'; - $scope.searchSubClients = function (subSearchText,page) { + $scope.searchSubClients = function (subSearchText, page) { $scope.subClientTable1 = [$scope.partner]; $scope.subClientTable2 = []; @@ -4387,31 +4785,31 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.subSearchText = subSearchText; params.searchText = subSearchText; } - $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page',{params: params}).then(function (resp) { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/sub_clients/page', {params: params}).then(function (resp) { var clientList = resp.data.data; $scope.subClientPagination = resp.data.pagination; clientList.forEach(function (client) { if ($scope.subClientTable1.length < 11) { $scope.subClientTable1.push(client); - }else { + } else { $scope.subClientTable2.push(client); } $scope.clients.push(client); }); }); }; - $scope.initClientInfo = function(){ - $http.get('/sys/partners/'+clientMoniker).then(function (resp) { + $scope.initClientInfo = function () { + $http.get('/sys/partners/' + clientMoniker).then(function (resp) { $scope.client = resp.data; $scope.clients = [$scope.client]; if ($scope.client.has_children && !$scope.client.hide_sub_mch) { - $scope.searchSubClients('',1); + $scope.searchSubClients('', 1); $scope.params.dateto = new Date(); var day = new Date(); day.setDate(day.getDate() - 7); $scope.params.datefrom = day; $scope.chooseClient('all'); - }else { + } else { $scope.params.dateto = new Date(); var day = new Date(); day.setDate(day.getDate() - 7); @@ -4422,9 +4820,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } $scope.initClientInfo(); - $scope.exportSettlementLogs = function() { + $scope.exportSettlementLogs = function () { var params = angular.copy($scope.params); - var url = '/sys/partners/'+clientMoniker+'/lists_settlements/excel'; + var url = '/sys/partners/' + clientMoniker + '/lists_settlements/excel'; var connectSymbol = '?'; if (params.datefrom) { params.datefrom = $filter('date')(params.datefrom, 'yyyyMMdd'); @@ -4435,7 +4833,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter params.dateto = $filter('date')(params.dateto, 'yyyyMMdd'); url += connectSymbol + 'dateto=' + params.dateto; } - if (params.client_ids && !$scope.isAll){ + if (params.client_ids && !$scope.isAll) { params.client_ids.forEach(function (i) { url += connectSymbol + 'client_ids=' + i; connectSymbol = '&'; @@ -4652,7 +5050,7 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; $scope.channelAndDayOfAnalysis(1); }]); - app.controller('managerSettlementDetailOfMergeSettleCtrl', ['$scope', 'detail','client_id','$http', function ($scope, detail,client_id,$http) { + app.controller('managerSettlementDetailOfMergeSettleCtrl', ['$scope', 'detail', 'client_id', '$http', function ($scope, detail, client_id, $http) { $scope.ctrl = {channel: null}; $scope.show = true; $scope.report = detail.data; @@ -4805,21 +5203,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.applyMWSubMerchantId = function () { $http.get('/sys/partners/' + $scope.partner.client_moniker + '/query/mw_info').then(function (resp) { commonDialog.confirm({ - title: 'Apply Merchant Warrior Sub Merchant Id', - contentHtml: $sce.trustAsHtml('Are you sure to apply merchant Warrior sub merchant id for [' + $scope.partner.company_name + ']?'), - json: resp.data - }).then(function () { - $http.put('/sys/partners/' + $scope.partner.client_moniker + '/applyMWMerchantId').then(function (res) { - commonDialog.alert({ - title: 'Success', - content: 'Apply Merchant Warrior Sub Merchant ID successfully', - type: 'success' - }); - $scope.partner.cardInfo = res.data; - }, function (resp) { - commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + title: 'Apply Merchant Warrior Sub Merchant Id', + contentHtml: $sce.trustAsHtml('Are you sure to apply merchant Warrior sub merchant id for [' + $scope.partner.company_name + ']?'), + json: resp.data + }).then(function () { + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/applyMWMerchantId').then(function (res) { + commonDialog.alert({ + title: 'Success', + content: 'Apply Merchant Warrior Sub Merchant ID successfully', + type: 'success' + }); + $scope.partner.cardInfo = res.data; + }, function (resp) { + commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); + }) }) - }) }); }; $scope.applyRpaySubMerchantId = function () { @@ -5680,48 +6078,45 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }; }]); - app.controller('incrementalServiceCtrl',['$scope', '$http', '$uibModal', '$state', '$filter', 'commonDialog',function($scope, $http, $uibModal, $state, $filter, commonDialog){ + app.controller('incrementalServiceCtrl', ['$scope', '$http', '$uibModal', '$state', '$filter', 'commonDialog', function ($scope, $http, $uibModal, $state, $filter, commonDialog) { $scope.serviceAll = {}; - $scope.channelOptions=[]; - $scope.initData = function(){ - $http.get('/sys/partners/' + $scope.partner.client_moniker+'/incremental_service').then(function(res){ + $scope.channelOptions = []; + $scope.initData = function () { + $http.get('/sys/partners/' + $scope.partner.client_moniker + '/incremental_service').then(function (res) { $scope.serviceAll = res.data.all_service; - $scope.serviceAll.forEach(function(service){ - service.logo_url = '/static/images/'+service.channel+'.jpg' - service.logo_url = $scope.CheckImgExists(service.logo_url)?service.logo_url:'/static/images/royalpay_sign.png' + $scope.serviceAll.forEach(function (service) { + service.logo_url = '/static/images/' + service.channel + '.jpg' + service.logo_url = $scope.CheckImgExists(service.logo_url) ? service.logo_url : '/static/images/royalpay_sign.png' }) - $scope.channelOptions=res.data.incremental_channel; + $scope.channelOptions = res.data.incremental_channel; }) } - $scope.CheckImgExists =function (url) { - var xmlHttp ; - if (window.ActiveXObject) - { - xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); - } - else if (window.XMLHttpRequest) - { - xmlHttp = new XMLHttpRequest(); - } - xmlHttp.open("Get",url,false); - xmlHttp.send(); - if(xmlHttp.status==404) - return false; - else - return true; + $scope.CheckImgExists = function (url) { + var xmlHttp; + if (window.ActiveXObject) { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } else if (window.XMLHttpRequest) { + xmlHttp = new XMLHttpRequest(); + } + xmlHttp.open("Get", url, false); + xmlHttp.send(); + if (xmlHttp.status == 404) + return false; + else + return true; } $scope.initData(); - $scope.newServiceChannelDialog = function (){ + $scope.newServiceChannelDialog = function () { $uibModal.open({ templateUrl: '/static/payment/partner/templates/incremental_service_dialog.html', controller: 'incrementalServiceDialogCtrl', resolve: { - params: function(){ + params: function () { return { - isCreate:true, - clientMoniker:$scope.partner.client_moniker, - channelOptions:$scope.channelOptions, - serviceChannel:null + isCreate: true, + clientMoniker: $scope.partner.client_moniker, + channelOptions: $scope.channelOptions, + serviceChannel: null } } } @@ -5729,17 +6124,17 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.initData(); }); } - $scope.editServiceChannelDialog = function (serviceChannel){ + $scope.editServiceChannelDialog = function (serviceChannel) { $uibModal.open({ templateUrl: '/static/payment/partner/templates/incremental_service_dialog.html', controller: 'incrementalServiceDialogCtrl', resolve: { - params: function(){ + params: function () { return { - isCreate:false, - clientMoniker:$scope.partner.client_moniker, - channelOptions:$scope.channelOptions, - serviceChannel:serviceChannel + isCreate: false, + clientMoniker: $scope.partner.client_moniker, + channelOptions: $scope.channelOptions, + serviceChannel: serviceChannel } } } @@ -5747,9 +6142,9 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter $scope.initData(); }); } - $scope.updateStatus = function(service){ + $scope.updateStatus = function (service) { commonDialog.confirm({ - title: 'Update '+service.channel+ ' Incremental Service Status', + title: 'Update ' + service.channel + ' Incremental Service Status', content: 'Are you sure update ' + service.channel + ' status?', choises: [ {label: 'Submit', className: 'btn-success', key: 1}, @@ -5758,14 +6153,14 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter }).then(function (choice) { if (choice == 1) { service.is_valid = !service.is_valid; - $http.put('/sys/partners/'+$scope.partner.client_moniker+'/incremental_service/status',service).then(function(res){ + $http.put('/sys/partners/' + $scope.partner.client_moniker + '/incremental_service/status', service).then(function (res) { commonDialog.alert({ title: 'Success', content: 'Update Service Successful!', type: 'success' }); $scope.initData(); - },function (resp) { + }, function (resp) { commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); $scope.initData(); }) @@ -5774,21 +6169,21 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter } }]); - app.controller('incrementalServiceDialogCtrl',['$scope','$http','params','commonDialog',function($scope ,$http,params,commonDialog){ - $scope.model ={}; + app.controller('incrementalServiceDialogCtrl', ['$scope', '$http', 'params', 'commonDialog', function ($scope, $http, params, commonDialog) { + $scope.model = {}; $scope.ctrl = {sending: false}; - $scope.isCreate = true; - $scope.initData =function(){ + $scope.isCreate = true; + $scope.initData = function () { $scope.isCreate = angular.copy(params.isCreate); - if($scope.isCreate){ - $scope.model.channel= angular.copy(params.channelOptions[0]) - $scope.model.channelOptions= angular.copy(params.channelOptions) - }else{ + if ($scope.isCreate) { + $scope.model.channel = angular.copy(params.channelOptions[0]) + $scope.model.channelOptions = angular.copy(params.channelOptions) + } else { $scope.model = angular.copy(params.serviceChannel); } } $scope.initData(); - $scope.save = function(form){ + $scope.save = function (form) { if (form.$invalid) { angular.forEach(form, function (item, key) { if (key.indexOf('$') < 0) { @@ -5798,15 +6193,15 @@ define(['angular', 'decimal', 'static/commons/commons', 'uiBootstrap', 'uiRouter return; } $scope.ctrl.sending = true; - $http.post('/sys/partners/'+params.clientMoniker+'/incremental_service',$scope.model).then(function(res){ + $http.post('/sys/partners/' + params.clientMoniker + '/incremental_service', $scope.model).then(function (res) { commonDialog.alert({ title: 'Success', - content: $scope.isCreate?'Create Service Successful!':'Update Service Successful!', + content: $scope.isCreate ? 'Create Service Successful!' : 'Update Service Successful!', type: 'success' }); $scope.ctrl.sending = false; $scope.$close(); - },function (resp) { + }, function (resp) { $scope.ctrl.sending = false; commonDialog.alert({title: 'Error', content: resp.data.message, type: 'error'}); }) diff --git a/src/main/ui/static/payment/partner/templates/add_partner.html b/src/main/ui/static/payment/partner/templates/add_partner.html index 952266506..c51dcc45f 100644 --- a/src/main/ui/static/payment/partner/templates/add_partner.html +++ b/src/main/ui/static/payment/partner/templates/add_partner.html @@ -1317,13 +1317,13 @@

    wNlT+($r`??h&3bDW zjO}ZfuP;@*Z9n;rAE#0!N3(0H7jGPH*?HQQ{Ry{pbW5@wc5@;&b3tvT6CbF;why1g zsj6#xa1-Zb(7k-fEOYY;9?o(OinK-&hj3<%95tJ>EP^a_XBI0CvI17v4I=AdL6*&O z=&dBka@E`6K^9PNWkJ?Wy;THRclCBeko8b+)j<|iZ?!?zQ@zazvR>+KUXb-xZwrDr z7A(JURFL&mZ*@WJ97(%Skmaej`XKAC-oimPK)p2v*+BIc39>=zZAp*~W;;=uTY_w7 z^%f1{u#>b~8e~J%TRg~ys<-wa+f}_S53=3V+sYuzS8qQHvSI4&_#hju-cAg%-PPOb zAlpN|tqHO{)!QjSwwHQ4EyzZww=;rlqayQd611&Z|4Wu-sg}Q+1Y;TYk|3L?-YyH`po6r#BFOepZ&wA`zUpm5kWE%^*96%V^>$s5 z?Wf+Z53;H1?ZzP6U%lNNWCy6XjX`#xdb=&i4pMKo2id{u?am-OM7`Y|WQVG^dxLBm z8;xF_X0YY$Eepf38tOYa>s8+#Pefaw)uf>Wm5#FsBTGpS*?3yD8DAD^J1{*tYIb*U zY;%x3#2)6XJ5}6D8mHr&^-GRP`P~v^k2-#5(8wC6C>{&4tz;dbC}xLZ@c?^*v%XH> zX^U_@*i-D8T=q1ENKZP0>{<34nhY+r;A}7bX{gC)9AB|;F_tS19Hla1TII6mk>Rci zgaP&<+Ncr)1MFoa#3NY+*ekHo=~kj&fV~DGQd>DPUx2-C*xJHgfW7J3I#OPMz3tjM z;$48fivh^~fN$wgNwQmj{Sn2j z-3*~Ez&=3@)Am|g3$RZy2HJLpm=<84W60MIKJrf?VRHNY{?aqr*`@EnlNpd8=(DdhUgGWeWxY z-p5R_8nFVrA8L!4Z#T;RV7nAm%4^FCi>q?^KrYX+bv7q6rK|uSj8gXzuL68$FkCwr zf>nSIL7qJ#Re??p^Yf;#6X4VEc_(GAm=oZIC=;)M z6VMj}Vf+~|vc#ujMyVFBfPy1hWRB}BU&(-ey?r_n2ym!J{24qEM0cRrIt z7%JeUkev`cMyRiNd5~A|N;CtE4|1s*)qSMTmvea)T96wj^e4X^ zBaPF;^${Fk&&APq)=#>`mo|^D0k6Q8mNv8*JCha74U~d;K|Y^S&;u!el} zC!Y}UEsgvoqR%^lTQe9@(EE+J|W1- zC&W1Ugb*j65aHw#0-St8e3MTIZ}JJzO+F#G$tT1%`Gn9WpAgyP69SujLR^zi2y5~Q zQB6J}sL3b9H2H*(CZ7<|b9PnS4SV zlTQd^@(EE)J|T$7C&V!Mgb*g55W(;aphO|Y!z@B!4o7)%te_4beJ`6nn%~W4kTH{t zS!9%wQBFoB8C7J|kTIK#xn#^I<47`&CgT_~7Lw6G#v(GB$XHB9Ga0R9w2=`bBSFS8 zGFFgrEE&g;;IG2p`$hd%vwPajK#>He@O2*}6TuH`y zGOi}$S~7k~#tmfLM8+*-+)BnKGVUPbE;8=99lYc0KA4|F{G~mYEYyQ;m`e1*Bq9&f zhryUQ48@dTI3^1tFijYX)-w^*6if;Z#B^X9CIZEn0?dMI1;qXu2>kO0lp9hhB9b&r_V)|7O(62?Syb(hAt%&_j2;%oa z1b+y^_pcy!KZ&nBhjM-iCH)#o`Ykq{y@#)V$Y!ul*kSC?Y$p3FD`DRvHQ%$txy4F( zfR*u{tep2_6?_n@Hb{+5PMRn5ZvEg+RWcv1#;}d)b4d$KJ~x8NK(t>{l*# zh%byCh2G+5O#bRHojV3$AfBrjcoh8!7G`XwsI9~G@YiBRBW$b-ao-g3z2ey*;V#k8nnD1!jS1IPR@9_06 z_1C|mra7kH-(0d8dn7;cQ^5*wrY& zYd~GgHlYD+VZUTAvg^@9-hifaBL>8qcpr8%&u6#r32Y;u#%|@6>^6Q3+r-=0?YRA= zh)>5(QZc@i1!@NMjoD|R@GZuy+j!Y7H{pq&{M!%aXZU@KUN0LzR69NtKY$K7kV?D& zKf>6}!!L~AQv8m`?+pCb;kN<5jriS<-{bhbgx@>(eT?7VFoq+!q9=ZkO2nS{O~mhD z{7Ue{POu2!*Mi?l{7%8|eEhD!??(LY#_v)5w&C{{euz_ijkIUuhi=FkhTnMn5TA88 zen_L$h+jK?Yw$x{)>RMkne(#l<+IAJ7k3%&HyH1i)4QeooM+gdY}l_b?3)eyV+{Km z!+xe=e~@86!LZ-MupeyL2Mv4X+Vj7<_WX~A{o989i-!GH!~QjlPSmxQCZ*;YXBR z&t3*~vO{eJb*!Xj!tEYV$2rsupcXqmF9mhFL!Aw(RZ`UmcLJzYj$0e3gyXglRI@|X zfNFDm&H%N{p{9a5Nm8|lb2O+^B}FM40_p_Etrw`64mWlanx+)&_%j$y8Txp^9z-|r z2pa4b_D{AIjrMT}M^B^SKEwNC&2A`rf# zZoX37$B!3}@)N{Xev;V6*N7MSY2qz@x_FnLEk5Swh)?Ny_W%G-y0Kd%2 zL+JSs>+v76Z}}(aL_bI8`Dd(Bf5rRqzoNtZh7aZ6@_ha;bd2Bgu|n|4 z!a`@5i%u}Wr;8vjLnm1&`to_AA3stILUI?s<>NU=mr6wP8^(IyTSOT{$N zE=t5QQ7VoVwc=+8c_Kor5)I;H(IQTPuQS9-ai%yI}Dh>yj+;#2XU_*!fh--#_& zws_PEh{vrw@q{%{JYx+L&suwk7p(E(MQf6H#X4BLYE2VwSci)@t#a|MHBbE3I#T@J zY7`$>i^U(UcJZ;bLVRYe5uaP9ioaOri?6J;;%nfT0jFD2c$u{yue1*2^Q?pTk&p+&RsnCaiuqD&22WVC`077KEKvFns2n~AV1baZfxM2ttS4s6@jeS!e6pl`72h8zhlMud)9J} zj*5S39moG>9nZh9Rts*OB(l(H^|VeCeXO&@PS)9Ch;^RW6P?&dYn_;AT`2aoE)@q` zmx*cU&`PZJqSU%p)LPexxz>#$WZfhhtXoBkb(?6j?i4GnyTozUec}}BesQ|>kT~CZ zSgf^vC9bd@6YH%f#f{ce;uh;UaksTi+-JRnj`wA;)p|{Avwnll_AT+2^)@=#_t2rf zFFv(CL?`+O@tyUFm2LgW3Rr)(@~khcf!1HGVblX9cWzS>3E7vwB*MS-q^qS^cc`tUPN))*x$5)?n+@tRdFL-`bf-(gw%5*@$r8LP@4n>;p``c#&(Wib&J6V76RPA1A%p5 z8z!IxsD8(T2P)#gK{`gN9!dzsg9uAm;2>3t9Hc66tQx5b9IHmE0>`S6s(@~2q$+T% z8mS5#t468<$EuO4z_DtiDsZeCsR|scMydkGs*$R|v1+6$aI6}s3LL9Os)ih-YQ2M0 z1&&oCRe@vGNLAoiHBxnngH#2MRU=h_W7SAi;8-`S6s=%>o zq$+T%8mS5#t468<$EuO4z_DtiDsZeCsR|scMydkGs*$Q29HiFjQTgB zO>YXao3SyJ5!&?DAiK@+>!M8om%W3m4YcW9{%F&C*nPR|ULdF>#>Ym*25C#a%V^Wh z+l4lL*g%_ZK|(xu&j9-stTZUjMw@PRv7!dr^a;b(mV^TADc9B!fdW`(ckrr?>=Ph- zZHH)6AZa^5o4yE?mrkJf+>iv%+D^%6(^v2<9V!KF`Whft+RcMD1)eqqZTcp#W7=<# z2W|RxCuq}mlhLN{dC{i7>oVH(1C*4fCzhC6U$iOkv@Y8869aAfsRSW zqxs&DH8>Er8tVBzpAh5|2}IjD)N@}{-&Ck4aI_sjJprW60P6WZKQIUoEmE+3P|tlZ z-`@fC1egMR_|JlR5_A)CElj{M_@_u8$1@Ai%|i&HIE{=#GNzO9--P769i_zq;$Z+g zPKNn^4V+0J%ym`n z+~$&m*aQ~Tj*1YQz=GN&AvS>pwMjy30t;%BgxCZY)FuhB2`s2h5@HirP@5#g<~uIA z&}EM^xy05~v=hPMddz(%mL3E;p8AeM^(6MFX+0^&arJpt@J5$s(B_O1qdPXcq-fW0S!y{CY^ zr-HqwfxV}Ly=Q>EXM(+FfxTygt(Zn>wzg>OWnaPu0xU(Zx_ zJ0PaEyTob&VrtV8s|kpyO-rmMAf`4gv6_IG+O))K=DD=QY7TH|iPZ!a)b=m2n!tkE zw8Uxx3u@C6t2xxAC027cmzG$~VJh>I|i7^Hee=K0W*0XFq7+nncM`--*xy=S{}mhY5ZQr?|u9}!|z-4-`V)}#cwEn zqwqsV{y)Y>0*@&Wr`Qd@z3~HbU*aO?;2Fj*{vaPs*u}Bfg#@n8c?W33c?Yg@PO#2{Zy^-S{nhAC2n+>P}Mx z8Ub1l)M&U7Xas0I?M9%HCP__(8-YfED%5TS8Uf}{Q-teV?lqi_To0sauw zeq|ao0-1mxz{*j@Hp));1{{^R9ev4NI4Z)e=WuM|RrD{fP zY(8V#P~~4j<$M`9z}HYge*+xgTd1UO0|)pXD(d?@pMA(j;cV(y_6aKNpMV4WGb-&D z05<#;IKaOF2ly>;fZt&s?R($=f8b5r;!APdG6A^C@w^*f#e4EIcrSi7PC%~XdB6b< z0uFF6aDYRA0~`t*;4t6-hXV(=7jS?hfCC%@9N<{s04D$kI1xC&$-n_l0S@p0-~bN< z^yN@MU8ac~z+C$BV$q+Mh~4-sF`So+y?F)TE7jsaUIWO=TtHOj0snWDn8S}2^Z7y% z=Jle9H;Oo*Fw1zeSWTC&^8I%-bG!NQ9nD;JgE)32oB08rX09pS%t0B=T)XLJ4$5fe z+D$ieP3dN?ed=beDc#ILr8aYbYXv`%-N4td+xf}tE`BuBb0pqameW)3hc z{~en7@6pUZLNos(n)#<_=AYp!U!s}+1;_TIZWlG|E-{xq zB<8U#;wbjCIGQ~t7P41GJ$qd=viC(3`#?0a&u|Fl3$c`aD`M=Q7~itRavl&r<9&f~ z?=M#Ip&0M-fps4xP6cH2Oh87@0%Y{(fQ+7pv2-mUqw4?}y#!g* zWb|4S^B2*~UqUl~70vuLH1jvn%-=#Y|1FyNduZk#pqYP&X8ti6_a|uPpQAzl z8O{7FH1ofrnSX<3{whPtXvTXkaL+86sv*5;`|UuLcsH^AWg1> zsmu!VYrHvq>6o${Vs`U)djd5hx$Fsd3 z=I7{ai+K{HQeV)}fcpoa>?So%XWz_|I|nm>rDrz}iyP`>Hu}0&3)P)oKay@egTJx@ zsLvVIB6T|r8x?M9nxl zj0Oj6y^2Qt2-PRrL(M9shPp+aQd_B_@$rRFz0ej~sX`dlGt?X*>u75;v>z$ges0#N zzRie5TR7XvwT#i_9ux?AGh$Q~Gti@GCS83|mg$e6UeVwarM4!iD8fi&LgnkU|^i8@KPju-69bXj|1Kc$IKMbQvWgd)w@=u?)y%4HlzIJ>Nl zjnM<>bf^{?ht3aO*|fc^gms3!)*|WIn?>)U(-BT2pbb%N&7rGOwvJz0pAYu_luI(E z2kl)s*o;c$liIz-CYTX-oo$&`TVo&Nn{`Sf<$s9+M_1ir9O`14YiRgIU2vdP^)v)y z0O?5SAHYpVu&QoYV+FWLEBynwNh|#WxJg5)0B+JyDuA0blq%#vsQ_-$P^z#4r2@D~ zL#Y66(oiaZn>3UP;3f^F0=P*-sQ_-$P%40%G?WV9CJm(mxJfJh1Gq^m{R6mZuu}gA zaMMoe4dAAo)!S+URpn6L0B#zh-cBJm0 z`Swl_n+Njkw?S5_-rf)5?iy+L`yiG8<=clr=w6X;9|f`QJrix=-vkr;G>8Sn&ohIG zeGz0|I(}z3N(sLTLP-mvFkoVTNB5U1L-%0cu)AE-KEW_fdywX@ImUFZm+7h+Y zEN9y~qI3WYJ4v@81xT-)?a>jQrQ$dPoJ8v4a+J6%RmA0LIaw-)>i|oJ#iI_fWLViX zu1=R&7C&eiX^E594@%u|-CgNds)h4tCBzaH>+dJ;1_-5M>y5sVzWPeb~3A$#>k zk|sBs#Ysp$ti!P!C7TBL3`Drx5lRD4$Cd)iQ=#O|{d8D*0of1f1j`pVm8iHql zG^-i9AW4f`CVJytU67>VEeV|`RlAvDl9H_ge6E4cgHks~7bI36SvOmJniSwiqbM8! z%np1EYPlIHNkaj?5KuBxybSOLFxywQ4Ddzxj3ZbEu-3_XC&`cjzSyn?t^gU}kUWz0 zNVdWX`uAPYF~Hk=!G1iJoNxmBVS&{E`|)LFj%~2t3gk_)LCcB(ek`h($pc$B4e;Yo zcchDy5(E5%WH{ie?STWHgxcnF6d}M*Ms4y_K6xs*k^~1lJp~SUCemsupFBGS4tOqn zxME*`pNG0)3w&Kg#;rphT(Fv<1o0w&WZZ=uV$Ko#QX3h^kKmUF`4#+16j-N95Z9xC zg2xi93jXJz{&M7M zB?Nc*gxD^h5ZdJvBD;J-V3$vb>+%UMTRtIh%O}Kb`Gl}7pAfa>6N0vULd=#=2-)%p z5nDbXV9O`OYx#t5EuRpr$asy6 z*U5O3jJL^nmyGww_#GJ^knsnC+Hm$q7~?QC`oD*X>_}l{72k_h^D(Rjs@rOT$(RlN z#~gkrn+r_FJYK@)^K!O;SF6##Q?QwQsJfeInZzb)_qM_%YTsqRSAx> zNx&E-YR#sBW0Z;#Z5lvEiDI*9AQ`2iM4JYbQKHyvdLhw3vDq}xg;G(XO#@yi6(!m< z@P$%QqD=!}C^Z<`G!TY)94I!M2ErA9-W2Gme$G_+}84W&jyn?8x?F>ZP#3J@9%ZFh+RghoS~ zmMB1IG_+}n0^G-?B?@q|OG^|WG#c9eB?=H44Q*PY0HM*)rX>pSV3(FCz(ZYHq5unA zTA~1pTw0<4i(Oix01tC%i2^KfX^8?n+@-H2ew4ZNFWm}!lhg~m0u^^9R=keIs?yJ} zhI1TNOpb>R*Aq~!PlUM&sxMaq6L=Ez&8`7p>SXpjz?ts?ocTGxncuV1fpa~B@5;_Z zcXJlD8P7&DJBJ_5&gHG_=lleA9?%!(^DEf}{8si0{xDn1pJ(g%yX->#IlG8|&n_0d z*d=0DcBvT0E)$2a%SAc6LLAMm6s_zk;0V`?bJ+$oEUc5Lh6N2kN|UTqwppRF#*ZLv zzQ}5|OW#CvtxMlR^c0c4O#HF_q-QvAgVL-3Q?SdhT$VF`qq%9(yyN2Ea}wuHra`JpyH$TTtX!1Jk|n zHdW;8d`i;sI!Pzepa^=kOTSL^8kc^P=u=$!ZK6+e>34}f!=>LN`Yf0J9nt5w^an)$ z+@;;Y7Hz3J2HU5=lBdCvXTXwY!II~|l5Jqg^I*vfV9ASM$xGOdKOcA`0X&kz(5@ws z$vR$RXd@a!+W=Sk+ZDev@LPx92K+YScRzlQ9he(wV>wT z!>`%Gi8>4v0H&a>1+_n@BOSLfprANX`y2}DXou?kAphmOd-)9rlm!Q9n}oL;fqwZr zs8`g-^7zg7@Qn}h+bJP;!tG7CJ!2;X0@_{d4u^Ue)ID}MyllJ#Dzbqxl~z|>&vNqk zeTd>B(;G6?fj5HCZBaoHh>)^RI21wXUb}~H-oh`08zE&~iXe18H6JL~ z-T5w9ksJaHYd(&v4daIbP(BL_on^S`VlGgw3;1|mk9EpLScqH-&|LyZ)N`=Bcpg>^ zFN5zZp@jEFEd1Sq1-=(?6~nI)@@uTmeaEW+ma7&4K1bvMdq z;)|dGvr$arOT^(oxt8-bF%Kx7BYC@M1bmS5hjuhd*@$(ce7NIA38$Z~QPRgcYLqG= zcB9mkZj>sVr%}QxrBNzxo<`~MrW+;Mxs6g&x=}vrX_T7MjZ#zF+bH>|7$;7LRCP9_ zrgPZE{Cu_n)%03^A@oyU1ijRkVHmv}!{>S^tKEQO_1CeNu*mfazX^(IZ$_iM4UKXW z8s%MRly{?1-j7E402<}PXp)bhQ9g!dxD}1^DKyHb(I~f}Q9h4m_A(kJHLc&EQNE5w z`8FEmJ7|>eqf!12jq(p@lpmo{{t1opQ#8si&?vt|qx>5h<=+wVJ2c9F!2CgE19ujH z_QO294HVtPFwq?d)m~yeu&k3{dobW_)5KtLIIyhcVyKu0EbEbgx;2W?Xq3O&(J0ME zxnrc118N2%ksVUtkHMPBsQsAt#n9R-=`?Gc808C*HVH?Du>{?O8HUd<=Nz7#T zixRdOXw}Ctoq0-Bv6p~YeMQV+?*Os-o;Z?y48-cEB817nLiU|l#IrC4<%%V|pJ?U- zpoKYKEakh4c4&59#wUtnq0RYcIN@<3PIRmSBK2g9Z>K<8^BFj~aVEyKb1{zn9B9;E zK;!aSexA6PUk1eLmC)D>MW7stK>3S6to~YD&%Xv@^*bm6&4wb-02G1dK@sRcC;}ZO z?nR?~5RGy(8s!!=%16;CA4j8n0*&$+G|FeuC|^LM{0$oA6Ob0rsuOI0ue!HH`b+Jd Q+ofmW#=m-fLv-x_0Y+VKc>n+a diff --git a/src/main/resources/jasper/trans_excel20161008.jasper b/src/main/resources/jasper/trans_excel20161008.jasper deleted file mode 100644 index 4540bd75854750247cf3ebce4ca7898c47b2f527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40950 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 diff --git a/src/main/resources/jasper/trans_excel20161009.jasper b/src/main/resources/jasper/trans_excel20161009.jasper deleted file mode 100644 index 8f1c479c2e8d19de3e2465fe24eb1a2f2e5d0f84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42038 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�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 diff --git a/src/main/resources/jasper/trans_excel20170516.jasper b/src/main/resources/jasper/trans_excel20170516.jasper deleted file mode 100644 index 92f6d53b83b2e24e8c76ec60aba8dcc6c97c9903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42156 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 Ee?`t#b^rhX diff --git a/src/main/resources/jasper/trans_excel20170704.jasper b/src/main/resources/jasper/trans_excel20170704.jasper deleted file mode 100644 index 6a3088df427ba233f32bc171dbc001844d5dfde5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44805 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 diff --git a/src/main/resources/jasper/trans_excel20180412.jasper b/src/main/resources/jasper/trans_excel20180412.jasper deleted file mode 100644 index 70a83612865fd0d9020cb1d6e66a1c41c22a471e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46009 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 bzBtcw5@((|i8IeVs&rO(dAQy_ZZ!5^bYpa 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 VSDovb>l}PK2PZSt>BCE7{}0H^!TtaM diff --git a/src/main/resources/jasper/trans_flow_new20161107.jasper b/src/main/resources/jasper/trans_flow_new20161107.jasper deleted file mode 100644 index 781826752eb3eb1ae15ae89913aedd2264c53b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76072 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 diff --git a/src/main/resources/jasper/trans_flow_new20161202.jasper b/src/main/resources/jasper/trans_flow_new20161202.jasper deleted file mode 100644 index cbb4e4e8acab2f0c0f484ec58935baa3e8f69ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76011 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 diff --git a/src/main/resources/jasper/trans_flow_new20170302.jasper b/src/main/resources/jasper/trans_flow_new20170302.jasper deleted file mode 100644 index aeccc6c99eed0e7dddea5a140fbcaa3123db6055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78865 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≦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'm happy to let you know that your RoyalPay Cross-border Payment account has been set up.
    很高兴通知您,贵司RoyalPay跨境全支付已经开通

    diff --git a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html index 29eb38502..949c9ecad 100644 --- a/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html +++ b/src/main/ui/static/payment/partner/templates/partner_bankaccounts.html @@ -1,5 +1,5 @@