1var app = angular.module('bossApp'); 2app.controller('transferCtrl', ['$scope', '$rootScope', '$http', '$timeout','$state', '$interval','AccountSummaryService', 'PaymentService','$anchorScroll', '$location','TwoFAService','$stateParams','CommonService','PinService','$interpolate','$filter','$modal','LegalEntityService', 3 function($scope, $rootScope, $http, $timeout, $state, $interval , AccountSummaryService, PaymentService,$anchorScroll, $location,TwoFAService,$stateParams,CommonService,PinService,$interpolate,$filter,$modal,LegalEntityService) { 4 var EXCHANGE_RATE_REJECTED_USER_MSG = 'Exchange Rate Rejected. You can Request Another Rate.'; 5 $scope.isExchangeRateRejectedBannerVisible = function () { 6 return $scope.expMsg === EXCHANGE_RATE_REJECTED_USER_MSG; 7 }; 8 var _user = angular.copy($rootScope.currentUser); 9 $scope.valueDate = new Date(); 10 $scope.disableConfirmation=true; 11 $scope.pinVerifyCallBackRequired = true; 12 $scope.numberOfDecimals = 2; 13 $scope.waitForGetRate=true; 14 $scope.pinVerified=false; 15 $scope.showCancelButton=true; 16 $scope.ratetxtInverse = ""; 17 $scope.paymentProcessed = false; 18 $scope.isCurrentUserFinalApprover = false; 19 $scope.noOfApprovalsRequiredForTransfer = null; 20 $scope.isSavePaymentEnabled = $rootScope.isSavePaymentEnabled; 21 $scope.isDualApprovalEnabled = $rootScope.isDualApprovalEnabled; 22 function updateTransferCancelButtonVisibility() { 23 if ($scope.displayRateTimer || ($scope.isStramingRate && !$scope.rateaccepted)) { 24 $scope.showCancelButton = false; 25 return; 26 } 27 $scope.showCancelButton = !($scope.editTransferMode && !$scope.isSavePaymentEnabled); 28 } 29 function setAccountSelectsDisabled() { 30 var locked = !!$scope.editTransferMode; 31 $("select[name='fromAccount']").prop("disabled", locked); 32 $("select[name='toAccount']").prop("disabled", locked); 33 } 34 $scope.missedTransferRepriceGotRate = false; 35 $scope.showGetRateForPricingCustomerMessage = false; 36 $scope.initiatorIndicativeDisclaimerAfterSuccessfulRate = false; 37 $scope.lockUiForStreamingCrossCcySession = function () { 38 if (!$scope.isStramingRate || $scope.rateaccepted) { 39 return false; 40 } 41 // Streaming poll leaves isStramingRate true until accept; dual-save first approver may save once priced data is shown (same idea as reviewTransfer + displayExRateInfo). Final approver stays locked via isFinalApproverStreamingFormLockActive(). 42 if ($scope.isTransferDualSaveFlow() && $scope.exchangeRateInformation) { 43 return false; 44 } 45 return true; 46 }; 47 $scope.indicativeRateDisclaimerPrefix = "Rates shown are indicative"; 48 49 var transfer = { 50 customerId : undefined, 51 customerName : undefined, 52 submitterId : undefined, 53 submitterName : undefined, 54 paymentDeliveryMethod : undefined, 55 detailsOfCharges: undefined, 56 fxSpotForward : { 57 debitCcy : undefined, 58 creditCcy : undefined, 59 dealCcy : undefined, 60 debitCcyAmount : undefined, 61 creditCcyAmount : undefined, 62 allInRate : undefined, 63 64 baseCcySettlementAccountId : undefined, 65 quoteCcySettlementAccountId : undefined, 66 debitAccountNo : undefined, 67 creditAccountNo : undefined, 68 debitAccountType : undefined, 69 creditAccountType : undefined, 70 paymentNotes : undefined, 71 deliveryType:"Transfer" 72 } 73 } 74 $scope.transfer = angular.copy(transfer); 75 if("view" == $stateParams.view){ 76 $scope.viewOnly = true; 77 } 78 79 $rootScope.getSrefUrl = function(toState, $event) { 80 if ($event && angular.isFunction($event.preventDefault)) { 81 $event.preventDefault(); 82 $event.stopPropagation(); 83 } 84 if (!bypassStateRecurrsion) { 85 $scope.showWarningDialog({ menuNavigation: true }, toState, {}); 86 return false; 87 } 88 if ($rootScope.showUiSref) { 89 $state.go(toState, {}, { reload: true, inherit: false, notify: false }); 90 } else { 91 return false; 92 } 93 } 94 95 /*************************************************** 96 * | Confirm box if user navigates away from Form | 97 **************************************************/ 98 let bypassStateRecurrsion; 99 $scope.$on('$stateChangeStart',function(event, toState, toParams, fromState ) { 100 if (bypassStateRecurrsion) return; 101 $scope.showWarningDialog(event,toState,toParams); 102 }); 103 104 $rootScope.redirectToFxweb = function(url) { 105 if ($scope.transferForm && $scope.transferForm.$dirty && !$scope.paymentProcessed) { 106 $scope.showWarningDialog($scope,url,null,PaymentService.loadFxweb); 107 }else{ 108 PaymentService.loadFxweb(url); 109 } 110 } 111 112 $rootScope.redirectToEximweb = function(id) { 113 var url = $(id).attr("data-redirectURL"); 114 if ($scope.transferForm && $scope.transferForm.$dirty && !$scope.paymentProcessed) { 115 $scope.showWarningDialog($scope,url,null,PaymentService.loadEximweb); 116 }else{ 117 PaymentService.loadEximweb(url); 118 } 119 } 120 121 $rootScope.redirectToMicroService = function(appUrl) { 122 if ($scope.transferForm && $scope.transferForm.$dirty && !$scope.paymentProcessed) { 123 $scope.showWarningDialog($scope,appUrl,null,PaymentService.loadMicroservices); 124 }else{ 125 PaymentService.loadMicroservices(appUrl); 126 } 127 } 128 129 $timeout(function(){ 130 $('#sidebar-menu a').each(function() { 131 $(this).removeAttr('href'); 132 $(this).css('cursor', 'pointer'); 133 }); 134 }); 135 136 $scope.showWarningDialog = function(event, toState, toParams, callback) { 137 var menuNavigation = event && event.menuNavigation; 138 if(!menuNavigation && !$scope.editPaymentMode && !$scope.showCancelButton && !$scope.rateaccepted){ 139 if(event.currentScope){ 140 event.preventDefault(); 141 } 142 let toastrMsg = $scope.askConfirmCancel ? "Please Click Back Button" : "Please Accept or Reject the Rate" 143 $.jGrowl(toastrMsg, {
144 sticky: false, 145 position: 'top-right', 146 theme: 'notification-size notification-error' 147 }); 148 return; 149 } 150 var confirmationMessage = "All changes will be lost. Do you want to continue?"; 151 var _scope = menuNavigation ? $scope : (event.currentScope ? event.currentScope : event); 152 if (_scope.transferForm && _scope.transferForm.$dirty && !$scope.paymentProcessed) { 153 bypassStateRecurrsion = true; 154 if (event.currentScope) { 155 event.preventDefault(); 156 } 157 bootbox.confirm({ 158 title: "Discard Changes?", 159 message: confirmationMessage, 160 swapButtonOrder: true, 161 closeButton: false, 162 buttons: { 163 confirm: { label: 'Yes', className: 'btn-primary' }, 164 cancel: { label: 'No', className: 'btn-danger' } 165 }, 166 callback: function(result) { 167 if (result) { 168 if ($scope.transfer.status == "WaitingRFQ" && !$scope.rateaccepted) { 169 canPoll = false; 170 $scope.cancelRate(); 171 } 172 if(callback){ 173 callback(toState); 174 }else{ 175 $state.go(toState, toParams, { reload: true, inherit: false, notify: true }); 176 } 177 bypassStateRecurrsion = true; 178 return result; 179 } else { 180 canPoll = true; 181 bypassStateRecurrsion = false; 182 if ($scope.rateaccepted) { 183 $("select[name='fromAccount']").prop('disabled', true); 184 $("select[name='toAccount']").prop('disabled', true); 185 $("select[name='transferMethod']").prop('disabled', true); 186 $("input[name='amountOption']").prop('disabled', true); 187 $("input[name='internationalAmount']").prop('disabled', true); 188 $scope.disableTransferFields = true; 189 $scope.hideGetRateBtn = false; 190 } 191 } 192 } 193 }); // End confirm box 194 }else{ 195 if(callback){ 196 callback(toState); 197 }else{ 198 bypassStateRecurrsion = true; 199 $state.go(toState, toParams, { reload: true, inherit: false, notify: false }); 200 $timeout(function() { 201 bypassStateRecurrsion = false; 202 }, 0); 203 return; 204 } 205 } 206 } 207 208 /*************************************************** 209 * | Get All available MCA accounts for the user 210 * entity | 211 **************************************************/ 212 213 $scope.loadAccounts = function(accIds,responseTranfer){ 214 AccountSummaryService.bankAccount_list(accIds).then(function(response) { 215 if (response.errorResponse != null) { 216 $scope.noDataErrorMsg = response.errorResponse ? response.errorResponse : 'Payment Not Found'; 217 return; 218 } 219 $scope.filterUserActiveAccounts(response); 220 $scope.mcaAccountList = CommonService 221 .maskAccountNumber($scope.stageAccountList); 222 $scope.fromAccountList = angular 223 .copy($scope.mcaAccountList); 224 $scope.loadTransferObj(responseTranfer); 225 }); 226 } 227 228 if($stateParams.transferId){ 229 $scope.noDataErrorMsg = ''; 230 PaymentService.getPayment($stateParams.transferId).then(function(response){ 231 if(!response.success){ 232 $scope.noDataErrorMsg = response.errorResponse ? response.errorResponse: 'Transfer Not Found'; 233 return 234 } 235 var transfer = response.responseObj; 236 var accIds = transfer.fromAccId +","+transfer.toAccId; 237 $scope.loadAccounts(accIds,response); 238 }); 239 }else{ 240 $scope.loadAccounts(null,null); 241 } 242 243 /****** 244 ** Filter active from accountlist by user 245 */ 246 $scope.filterUserActiveAccounts =function(response) 247 { 248 var accountsMap={}; 249 angular.forEach(response.responseObj, function(account) { 250 accountsMap[account.id]=account; 251 }); 252 var userAccountList=angular.copy(response.responseObj); 253 $scope.stageAccountList = angular.copy(userAccountList); 254 $scope.accountsMap=angular.copy(accountsMap); 255 $scope.accountList = CommonService.maskAccountNumber($scope.stageAccountList); 256 } 257 258 $scope.fromAccountOnChange = function() { 259 $scope.formErrorMessage=undefined; 260 $scope.getRateError = ""; 261 $scope.toAccount = null; 262 var filterdata = []; 263 angular.forEach($scope.fromAccountList,function(value, key) { 264 if ($scope.fromAccount.id != value.id) { 265 filterdata.push(value); 266 } 267 }) 268 $scope.toAccountList = angular.copy(filterdata); 269 $scope.getAvailableBalance(); 270 } 271 272 $scope.isSameCurrency=function(){ 273 var fromAccCCY=$scope.fromAccount.depositCcy; 274 var toAccCCY=$scope.toAccount.depositCcy; 275 $scope.isSameCurrencyTransfer=fromAccCCY==toAccCCY; 276 var _dealCcy; 277 if($scope.isSameCurrencyTransfer){ 278 _dealCcy=toAccCCY; 279 if(!$stateParams.transferId){ 280 $scope.filterDeliveryType="SameDayPayment"; 281 $scope.transferMethod="SameDayPayment"; 282 $scope.onSelectDeliveryMethod(); 283 } 284 }else{ 285 $scope.filterDeliveryType="!FuturePayment"; 286 if(!$stateParams.transferId){ 287 $scope.transferMethod=undefined; 288 $scope.transfer.fxSpotForward.valueDate=undefined; 289 } 290 if($scope.amountOption && $scope.amountOption=="equivalent"){ 291 _dealCcy = $scope.fromAccount.depositCcy; 292 }else{ 293 _dealCcy = $scope.toAccount.depositCcy; 294 } 295 } 296 $scope.transfer.fxSpotForward.dealCcy=_dealCcy; 297 } 298 299 /** 300 * Get currency pair for selected to & from account CCY. 301 */ 302 $scope.getCcyPair = function(){ 303 var fromAccCCY=$scope.fromAccount.depositCcy; 304 var toAccCCY=$scope.toAccount.depositCcy; 305 var isDDATransfer=$scope.fromAccount.accountType=="DDA" && $scope.toAccount.accountType=="DDA"; 306 if(!isDDATransfer){ 307 PaymentService.getCcyPair(fromAccCCY,toAccCCY).then(function(response){ 308 if(response.errorResponse){ 309 $scope.transferNotAllowed = true; 310 $scope.ccyError = response.errorResponse; 311 } else if(response.responseObj && response.responseObj.ccyPair != undefined){ 312 $scope.transferNotAllowed = angular.copy(false); 313 var _ccyPair = response.responseObj.ccyPair; 314 $scope.baseCcy = angular.copy(_ccyPair.substr(0,3)); 315 $scope.quoteCcy = angular.copy(_ccyPair.substr(3,3)); 316 $scope.baseCcyAmountPrecision = response.responseObj.baseCcyAmountPrecision; 317 $scope.quoteCcyAmountPrecision = response.responseObj.quoteCcyAmountPrecision; 318 319 updateAmountPrecision(); 320 321 $scope.transfer.fxSpotForward.debitCcy = fromAccCCY; 322 $scope.transfer.fxSpotForward.creditCcy = toAccCCY; 323 var account=$scope.accountsMap[$scope.toAccount.id]; 324 $scope.transfer.fxSpotForward.baseCcySettlementAccountId = $scope.fromAccount.id; 325 $scope.transfer.fxSpotForward.quoteCcySettlementAccountId = $scope.toAccount.id; 326 $scope.transfer.fxSpotForward.creditAccountNo = account.accountNumber; 327 $scope.transfer.fxSpotForward.creditAccountType = $scope.toAccount.accountType; 328 $scope.ccyError = undefined; 329 $scope.isSameCurrency(); 330 $scope.getDeliveryMethod($scope.fromAccount); 331 if(_ccyPair){ 332 PaymentService.getPollTimeout($scope.baseCcy,$scope.quoteCcy).then(function(response){ 333 if(response.responseObj){ 334 $scope.PollDuration = response.responseObj; 335 } 336 }); 337 } 338 } 339 340 }); 341 }else{ 342 $scope.transferNotAllowed = true; 343 $scope.ccyError = "DDA to DDA Account transfer is not allowed"; 344 } 345 } 346 347 $scope.getAvailableBalance = function(){ 348 var _id=$scope.fromAccount.id; 349 var account=$scope.accountsMap[_id]; 350 $scope.transfer.fxSpotForward.debitAccountNo = account.accountNumber; 351 $scope.transfer.fxSpotForward.debitAccountType = $scope.fromAccount.accountType; 352 AccountSummaryService.getAccountBalance(_id).then(function(response) { 353 if(response.success){ 354 $scope.fromAccount.accountBalance = response.responseObj.availableBalance; 355 $scope.fromAccount.ledgerBalance = response.responseObj.ledgerBalance; 356 } 357 }); 358 } 359 360 $scope.cancelTransfer = function() { 361 $scope.transfer={}; 362 $scope.transferForm.$setPristine(); 363 $scope.defaultFormData = angular.copy($scope.resetCopy); 364 $scope.transferForm.$setPristine(); 365 $scope.transferForm.$setValidity(); 366 $scope.transferForm.$setUntouched(); 367 // in my case I had to call $apply to refresh the page, you may also need this. 368 $scope.$apply(); 369 } 370 LegalEntityService.getLE().then(function(data){ 371 $scope.le = angular.copy(data.legalEntity); 372 $scope.deliveryMethodMap = angular.copy(data.deliveryMethodMap); 373 }); 374 375 $scope.isTransferAutoAuthorizeOn = function () { 376 var auto = $rootScope.isAutoAuthorizeTransferEnabled; 377 if (auto === undefined || auto === null) { 378 return true; 379 } 380 return !!auto; 381 }; 382 383 $scope.isTransferDualSaveFlow = function () { 384 return !!($rootScope.isSavePaymentEnabled && $rootScope.isDualApprovalEnabled && !$scope.isTransferAutoAuthorizeOn()); 385 }; 386 387 function needsTransferApproverVisibilityRefresh() { 388 if (!$scope.editTransferMode || !$scope.privateTrade) { 389 return false;
390 } 391 if ($scope.isTransferDualSaveFlow()) { 392 return true; 393 } 394 var st = $scope.privateTrade.status && $scope.privateTrade.status.id; 395 return $scope.isTransferAutoAuthorizeOn() && (st === "PendingApproval" || st === "PartiallyApproved"); 396 } 397 398 function parseSystemTradeDate() { 399 var s = $rootScope.systemTradeDate; 400 if (!s) { 401 return null; 402 } 403 var parts = String(s).split(/[-,]/); 404 if (parts.length === 3) { 405 var y = parseInt(parts[0], 10); 406 var m = parseInt(parts[1], 10) - 1; 407 var d = parseInt(parts[2], 10); 408 if (!isNaN(y) && !isNaN(m) && !isNaN(d)) { 409 return new Date(y, m, d); 410 } 411 } 412 return null; 413 } 414 415 function dateAtMidnight(dateLike) { 416 if (!dateLike) return null; 417 var d = new Date(dateLike); 418 if (isNaN(d.getTime())) return null; 419 d.setHours(0, 0, 0, 0); 420 return d; 421 } 422 423 function rememberMissedTransferRepriceIfNeeded(trade) { 424 if (!trade || !trade.id || trade.tradeDate === undefined || trade.tradeDate === null || trade.tradeDate === "") { 425 return; 426 } 427 var tradeDay = dateAtMidnight(trade.tradeDate); 428 var systemDate = parseSystemTradeDate(); 429 if (!tradeDay || !systemDate || tradeDay.getTime() >= systemDate.getTime()) { 430 return; 431 } 432 try { 433 sessionStorage.setItem("bossMissedTransferReprice_" + trade.id, "1"); 434 } catch (e) {} 435 } 436 437 function clearMissedTransferRepriceSessionIfFinalApprover() { 438 if (!$scope.transfer || !$scope.transfer.id) { 439 return; 440 } 441 var req = $scope.noOfApprovalsRequiredForTransfer != null ? $scope.noOfApprovalsRequiredForTransfer : $rootScope.noOfApprovalsRequired; 442 var isFinalApprovalStep = $scope.isCurrentUserFinalApprover || req == null || req <= 1; 443 if (!isFinalApprovalStep) { 444 return; 445 } 446 try { 447 sessionStorage.removeItem("bossMissedTransferReprice_" + $scope.transfer.id); 448 } catch (e) {} 449 } 450 451 $scope.isMissedTransferForReprice = function () { 452 if (!$scope.editTransferMode) return false; 453 if ($scope.missedTransferRepriceGotRate) return false; 454 var pt = $scope.privateTrade; 455 var tr = $scope.transfer; 456 var tradeDateRaw = pt && pt.tradeDate !== undefined && pt.tradeDate !== null && pt.tradeDate !== "" ? pt.tradeDate : (tr && tr.tradeDate); 457 if (tradeDateRaw === undefined || tradeDateRaw === null || tradeDateRaw === "") { 458 return false; 459 } 460 var tradeDay = dateAtMidnight(tradeDateRaw); 461 var systemDate = parseSystemTradeDate(); 462 var dateIsStale = !!(tradeDay && systemDate && tradeDay.getTime() < systemDate.getTime()); 463 var id = ($scope.privateTrade && $scope.privateTrade.id) || ($scope.transfer && $scope.transfer.id); 464 var persisted = false; 465 if (id) { 466 try { 467 persisted = sessionStorage.getItem("bossMissedTransferReprice_" + id) === "1"; 468 } catch (e) {} 469 } 470 if (dateIsStale) return true; 471 if (!persisted) return false; 472 if ($scope.isSameCurrencyTransfer) return true; 473 if ($scope.canShowGetRateButton && $scope.canShowGetRateButton()) return true; 474 return false; 475 }; 476 477 $scope.isAllowedStatusForMissedPayments = function(privateTrade) { 478 return privateTrade && privateTrade.status && (privateTrade.status.id === 'PendingApproval' || privateTrade.status.id === 'PartiallyApproved'); 479 }; 480 481 $scope.showTransferTimerAcceptReject = function () { 482 var streamingAutoQuoted = $scope.isTransferAutoAuthorizeOn() && $scope.isStramingRate && $scope.exchangeRateInformation; 483 var autoAuthNonStreamingPriced = $scope.isTransferAutoAuthorizeOn() && !$scope.isStramingRate && $scope.exchangeRateInformation; 484 if (!$scope.displayRateTimer && !streamingAutoQuoted && !autoAuthNonStreamingPriced) return false; 485 if (!$scope.editTransferMode) { 486 return true; 487 } 488 if ($scope.isTransferAutoAuthorizeOn()) { 489 return !!$scope.isAllowedToApproveTransfer; 490 } 491 return !($rootScope.isSavePaymentEnabled && $rootScope.isDualApprovalEnabled && !$scope.isCurrentUserFinalApprover) || ($scope.noOfApprovalsRequiredForTransfer === 0); 492 }; 493 494 $scope.isTransferTimerAcceptRejectDisabled = function () { 495 if ($scope.acceptRateBtnDisable) return true; 496 if (!$scope.editTransferMode || $scope.isTransferAutoAuthorizeOn()) return false;
497 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) return false; 498 if ($scope.isTransferDualSaveFlow() && (isUsdAmountBelowFirstApproverLimit() || $scope.noOfApprovalsRequiredForTransfer === 0)) { 499 return false; 500 } 501 return true; 502 }; 503 504 $scope.isTransferTimerKnobRowVisible = function () { 505 var streamingAutoQuoted = $scope.isTransferAutoAuthorizeOn() && $scope.isStramingRate && $scope.exchangeRateInformation; 506 if (!($scope.displayRateTimer || streamingAutoQuoted) || !$scope.showTransferTimerAcceptReject()) return false; 507 return !!$scope.displayRateTimer; 508 }; 509 510 $scope.isTransferApproveTransferDisabled = function () { 511 if (!$scope.isAllowedToApproveTransfer) return true; 512 if ($scope.lockUiForStreamingCrossCcySession()) return true; 513 if ($scope.isSameCurrencyTransfer) return false; 514 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) return true; 515 return false; 516 }; 517 518 function getTransferUsdAmount(paymentOrTrade) { 519 if (!paymentOrTrade) { 520 return null; 521 } 522 var amt = null; 523 if (paymentOrTrade.usdAmount != null && paymentOrTrade.usdAmount !== undefined) { 524 amt = parseFloat(paymentOrTrade.usdAmount); 525 } else if (paymentOrTrade.fxSpotForward) { 526 var fx = paymentOrTrade.fxSpotForward; 527 var dealCcy = (fx.dealCcy || "").toUpperCase(); 528 if (dealCcy === "USD" && paymentOrTrade.paymentAmount != null) { 529 amt = parseFloat(paymentOrTrade.paymentAmount); 530 } else if ((fx.debitCcy || "").toUpperCase() === "USD" && fx.debitCcyAmount != null) { 531 amt = parseFloat(fx.debitCcyAmount); 532 } else if ((fx.creditCcy || "").toUpperCase() === "USD" && fx.creditCcyAmount != null) { 533 amt = parseFloat(fx.creditCcyAmount); 534 } else if (paymentOrTrade.paymentAmount != null && dealCcy === "USD") { 535 amt = parseFloat(paymentOrTrade.paymentAmount); 536 } 537 } 538 return (amt != null && !isNaN(amt)) ? amt : null; 539 } 540 541 function isUsdAmountBelowFirstApproverLimit() { 542 if (!$rootScope.isDualApprovalEnabled) { 543 return false; 544 } 545 var le = $scope.le; 546 if (!le || le.paymentLimitForFirstApprover == null) { 547 return false; 548 } 549 var limitFirst = parseFloat(String(le.paymentLimitForFirstApprover)); 550 if (isNaN(limitFirst)) { 551 return false; 552 } 553 var usdAmount = getTransferUsdAmount($scope.privateTrade || $scope.transfer); 554 if (usdAmount == null) { 555 return false; 556 } 557 return usdAmount < limitFirst; 558 } 559 560 function isUsdAmountStrictlyAboveFirstApproverLimit() { 561 if (!$rootScope.isDualApprovalEnabled) { 562 return false; 563 } 564 var le = $scope.le; 565 if (!le || le.paymentLimitForFirstApprover == null) { 566 return false; 567 } 568 var limitFirst = parseFloat(String(le.paymentLimitForFirstApprover)); 569 if (isNaN(limitFirst)) { 570 return false; 571 } 572 var usdAmount = getTransferUsdAmount($scope.privateTrade || $scope.transfer); 573 if (usdAmount == null) { 574 return false; 575 } 576 return usdAmount >= limitFirst; 577 } 578 579 function getAcceptedRateHeaderForTransfer() { 580 if ($rootScope.isSavePaymentEnabled && $rootScope.isDualApprovalEnabled && isUsdAmountStrictlyAboveFirstApproverLimit()) { 581 return "Accepted Indicative Rate:"; 582 } 583 return "Accepted Rate:"; 584 } 585 $scope.isUsdAmountBelowFirstApproverLimit = function () { 586 return isUsdAmountBelowFirstApproverLimit(); 587 }; 588 589 function computeNoOfApprovalsRequiredFromEntity() { 590 var le = $scope.le; 591 if (!le) { 592 return $rootScope.noOfApprovalsRequired; 593 } 594 if (le.isDualApprovalRequiredForPayment === false) { 595 return 0; 596 } 597 var noOfRequired = le.noOfRequiredTradeAuth != null ? parseInt(le.noOfRequiredTradeAuth, 10) : ($rootScope.noOfApprovalsRequired || 0); 598 if (isNaN(noOfRequired) || noOfRequired <= 0) { 599 return 0; 600 } 601 var usdAmount = getTransferUsdAmount($scope.privateTrade || $scope.transfer); 602 if (usdAmount == null) { 603 return $rootScope.noOfApprovalsRequired; 604 } 605 var limitFirst = le.paymentLimitForFirstApprover != null ? parseFloat(String(le.paymentLimitForFirstApprover)) : null; 606 var limitSecond = le.paymentLimitForSecondApprover != null ? parseFloat(String(le.paymentLimitForSecondApprover)) : null; 607 if (limitFirst == null || isNaN(limitFirst)) { 608 return $rootScope.noOfApprovalsRequired; 609 } 610 if (usdAmount <= limitFirst) { 611 return 0; 612 } 613 if (limitSecond == null || isNaN(limitSecond) || usdAmount < limitSecond) { 614 return Math.min(1, noOfRequired); 615 } 616 return Math.min(2, noOfRequired); 617 } 618 619 $scope.isPrivateTradeApprovedOrBooked = function () { 620 var st = $scope.privateTrade && $scope.privateTrade.status && $scope.privateTrade.status.id; 621 return st === "Approved" || st === "Booked"; 622 }; 623 624 function getIndicativeDisclaimerDatePartForTransfer() { 625 var s = $rootScope.systemTradeDate; 626 if (!s) return ""; 627 var d = parseSystemTradeDate(); 628 return (d && !isNaN(d.getTime())) ? $filter("date")(d, "MM/dd/yyyy") : String(s); 629 } 630 631 function indicativeDisclaimerBaseConditionsMetForTransfer() { 632 if ($scope.isPrivateTradeApprovedOrBooked()) return false;
633 if (!$rootScope.isSavePaymentEnabled || !$rootScope.isDualApprovalEnabled) return false; 634 if (!isUsdAmountStrictlyAboveFirstApproverLimit()) return false; 635 if ($scope.isTransferAutoAuthorizeOn()) return false; 636 if ($scope.isSameCurrencyTransfer) return false; 637 return true; 638 } 639 640 function getIndicativeRateMessageForTransfer() { 641 if (!indicativeDisclaimerBaseConditionsMetForTransfer()) return ""; 642 643 var date = getIndicativeDisclaimerDatePartForTransfer(); 644 var prefix = $scope.indicativeRateDisclaimerPrefix; 645 var deliveryLine = " The delivery date will be updated if the payment is not approved by today (" + date + ")."; 646 647 if ($scope.isFinalApproverRateAcceptanceRequired()) { 648 if ($scope.loadingScreen || $scope.displayRateTimer || $scope.isStramingRate) { 649 return ""; 650 } 651 return prefix + ". Please use 'Get Rate' to retrieve the final rate and approve the payment." + deliveryLine; 652 } 653 654 if ($scope.editTransferMode && !$scope.loadingScreen) { 655 return prefix + ". Final rates will be provided upon payment approval." + deliveryLine; 656 } 657 658 if (!$scope.editTransferMode) { 659 if ($scope.initiatorIndicativeDisclaimerAfterSuccessfulRate && $rootScope.isSavePaymentEnabled && $scope.displayExRateInfo && !$scope.loadingScreen && !$scope.displayRateTimer) { 660 return prefix + ". Final rates will be provided upon payment approval." + deliveryLine + " Please submit the payment for approval."; 661 } 662 } 663 664 return ""; 665 } 666 667 $scope.getIndicativeRateMessage = function () { 668 return getIndicativeRateMessageForTransfer(); 669 }; 670 671 function shouldShowTransferIndicativeRatePath() { 672 if ($scope.isTransferAutoAuthorizeOn()) { 673 return false; 674 } 675 return !!($rootScope.isSavePaymentEnabled && $rootScope.isDualApprovalEnabled && !$scope.isFinalApproverRateAcceptanceRequired() && isUsdAmountStrictlyAboveFirstApproverLimit()); 676 } 677 678 function setTransferRateDisplayLinesFromFx(fx) { 679 $scope.ratetxtInverse = ""; 680 if (!fx || fx.allInRate == null || fx.allInRate === undefined) { 681 $scope.ratetxt = ""; 682 return; 683 } 684 var base = $scope.baseCcy || fx.debitCcy; 685 var quote = $scope.quoteCcy || fx.creditCcy; 686 if (!base || !quote) { 687 $scope.ratetxt = ""; 688 return; 689 } 690 var rate = parseFloat(fx.allInRate); 691 if (isNaN(rate) || rate === 0) { 692 $scope.ratetxt = ""; 693 return; 694 } 695 var inv = 1 / rate; 696 $scope.ratetxt = "1 " + base + " = " + fx.allInRate + " " + quote; 697 $scope.ratetxtInverse = "1 " + quote + " = " + inv.toFixed(4) + " " + base; 698 } 699 700 function applyCrossCcyPricedRate(ro) { 701 if (!ro) { 702 return; 703 } 704 $scope.getRateError = undefined; 705 if (ro.id) { 706 try { 707 sessionStorage.removeItem("bossMissedTransferReprice_" + ro.id); 708 } catch (e) {} 709 } 710 updatePaymentObjectFromServer(ro); 711 $scope.loadingScreen = false; 712 setTransferRateDisplayLinesFromFx(ro.fxSpotForward); 713 $scope.exchangeRateInformation = ro.fxSpotForward; 714 $scope.expiryValue = ro.priceExpiresInSeconds; 715 $scope.displayExRateInfo = true; 716 $scope.transfer.paymentFee = null; 717 $scope.tradeNo = ro.externalRefId; 718 $scope.setAmountAfterPricing(ro); 719 $scope.noOfApprovalsRequiredForTransfer = computeNoOfApprovalsRequiredFromEntity(); 720 if (shouldShowTransferIndicativeRatePath()) { 721 $scope.displayRateTimer = false; 722 var _fx = ro.fxSpotForward; 723 if (_fx) { 724 $scope.transfer.fxSpotForward.allInRate = _fx.allInRate; 725 $scope.transfer.fxSpotForward.debitCcyAmount = _fx.debitCcyAmount; 726 $scope.transfer.fxSpotForward.creditCcyAmount = _fx.creditCcyAmount; 727 } 728 $scope.privateTrade = ro; 729 if (!$scope.editTransferMode) { 730 $scope.initiatorIndicativeDisclaimerAfterSuccessfulRate = true; 731 } 732 $scope.expMsg = getIndicativeRateMessageForTransfer(); 733 $scope.hideGetRateBtn = true; 734 } else { 735 if ($scope.isFinalApproverRateAcceptanceRequired()) { 736 $scope.expMsg = ""; 737 } 738 $scope.displayRateTimer = true; 739 $scope.startKnob(); 740 updateTransferCancelButtonVisibility(); 741 $scope.askConfirmCancel = false; 742 $("select[name='fromAccount']").prop("disabled", true); 743 $("select[name='toAccount']").prop("disabled", true); 744 $scope.disableTransferFields = true; 745 } 746 } 747 748 $scope.isFinalApproverRateAcceptanceRequired = function () { 749 return !!($scope.editTransferMode && $scope.isCurrentUserFinalApprover && $scope.isAllowedToApproveTransfer); 750 }; 751 752 $scope.isFinalApproverStreamingFormLockActive = function () { 753 if (!$scope.isTransferDualSaveFlow()) { 754 return false;
755 } 756 if (!$scope.isFinalApproverRateAcceptanceRequired()) { 757 return false; 758 } 759 if ($scope.isSameCurrencyTransfer) { 760 return false; 761 } 762 if ($scope.rateaccepted) { 763 return false; 764 } 765 if ($scope.getRateError) { 766 return false; 767 } 768 return !!($scope.displayRateTimer || $scope.isStramingRate); 769 }; 770 771 $scope.isIndicativeTransferRateDisclaimerActive = function () { 772 return !!getIndicativeRateMessageForTransfer(); 773 }; 774 775 $scope.suppressIndicativeExpMsgForFinalStatus = function () { 776 if (!$scope.isPrivateTradeApprovedOrBooked() || !$scope.expMsg) return false; 777 return $scope.expMsg.indexOf($scope.indicativeRateDisclaimerPrefix) === 0; 778 }; 779 780 function determineApproverLevelForTransfer() { 781 if (!$scope.privateTrade) { 782 $scope.isCurrentUserFinalApprover = false; 783 $scope.noOfApprovalsRequiredForTransfer = $rootScope.noOfApprovalsRequired; 784 return; 785 } 786 var approvalsMade = 0; 787 var tradeStatus = $scope.privateTrade.status && $scope.privateTrade.status.id; 788 if (tradeStatus === "PendingApproval") { 789 approvalsMade = 0; 790 } else if (tradeStatus === "PartiallyApproved") { 791 approvalsMade = 1; 792 } else { 793 if ($scope.privateTrade.approval1Time) { 794 approvalsMade++; 795 } 796 if ($scope.privateTrade.approval2Time) { 797 approvalsMade++; 798 } 799 } 800 $scope.currentApprovalLevel = approvalsMade + 1; 801 802 var pendingOrPartial = (tradeStatus === "PendingApproval" || tradeStatus === "PartiallyApproved"); 803 var dualSave = $rootScope.isSavePaymentEnabled && $rootScope.isDualApprovalEnabled; 804 var autoOn = $scope.isTransferAutoAuthorizeOn(); 805 if (pendingOrPartial && dualSave && !autoOn && !$scope.le) { 806 $scope.hideGetRateBtn = true; 807 $scope.isCurrentUserFinalApprover = false; 808 $scope.noOfApprovalsRequiredForTransfer = $rootScope.noOfApprovalsRequired; 809 return; 810 } 811 812 var requiredForTransfer = computeNoOfApprovalsRequiredFromEntity(); 813 $scope.noOfApprovalsRequiredForTransfer = requiredForTransfer; 814 if (requiredForTransfer == null || requiredForTransfer === undefined || requiredForTransfer === 0) { 815 $scope.isCurrentUserFinalApprover = false; 816 return; 817 } 818 $scope.isCurrentUserFinalApprover = ($scope.currentApprovalLevel >= requiredForTransfer); 819 if (pendingOrPartial && $scope.isTransferDualSaveFlow()) { 820 if ($scope.isCurrentUserFinalApprover && $scope.isAllowedToApproveTransfer) { 821 $scope.hideGetRateBtn = false; 822 } else { 823 $scope.hideGetRateBtn = true; 824 } 825 } else if (pendingOrPartial) { 826 $scope.hideGetRateBtn = true; 827 } 828 } 829 830 $scope.canShowGetRateButton = function () { 831 if ($scope.hideGetRateBtn) { 832 return false; 833 } 834 if ($scope.showGetRateForPricingCustomerMessage && !$scope.isStramingRate) { 835 if ($scope.isSameCurrencyTransfer) { 836 return false; 837 } 838 return true; 839 } 840 if ($scope.isStramingRate) { 841 return false; 842 } 843 if ($scope.rateaccepted) { 844 var st = $scope.privateTrade && $scope.privateTrade.status && $scope.privateTrade.status.id; 845 var pendingOrPartialApproval = st === 'PendingApproval' || st === 'PartiallyApproved'; 846 var finalApproverReprices = $scope.isTransferDualSaveFlow() && pendingOrPartialApproval && $scope.isFinalApproverRateAcceptanceRequired(); 847 if (!finalApproverReprices) { 848 return false; 849 } 850 } 851 if ($scope.displayExRateInfo && $scope.displayRateTimer) { 852 return false; 853 } 854 var finalApproverDualSave = $scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired(); 855 if ($scope.displayRateTimer && !finalApproverDualSave) { 856 return false; 857 } 858 if ($scope.isSameCurrencyTransfer) { 859 return false; 860 } 861 if (!$scope.editTransferMode) { 862 return true; 863 } 864 return !!($scope.isTransferDualSaveFlow() && $scope.isCurrentUserFinalApprover && $scope.isAllowedToApproveTransfer); 865 }; 866 867 $scope.isGetRateButtonDisabled = function () { 868 if ($scope.transferNotAllowed || $scope.askConfirmCancel) { 869 return true; 870 } 871 if ($scope.isStramingRate) { 872 return true; 873 } 874 var finalApproverRateSession = $scope.isFinalApproverRateAcceptanceRequired() && ($scope.displayRateTimer || $scope.isStramingRate) 875 && $scope.isTransferDualSaveFlow(); 876 if ($scope.loadingScreen && !finalApproverRateSession) { 877 return true; 878 } 879 if ($scope.isSameCurrencyTransfer) { 880 return true; 881 } 882 if ($scope.editTransferMode) { 883 var st = $scope.privateTrade && $scope.privateTrade.status && $scope.privateTrade.status.id; 884 var pendingOrPartial = st === "PendingApproval" || st === "PartiallyApproved"; 885 if (pendingOrPartial && !$scope.isAllowedToApproveTransfer) { 886 return true; 887 } 888 } 889 if ($scope.isTransferDualSaveFlow() && $scope.editTransferMode) { 890 var n = $scope.noOfApprovalsRequiredForTransfer; 891 if (n != null && n !== 0 && !$scope.isCurrentUserFinalApprover) { 892 return true; 893 } 894 } 895 if ($scope.privateTrade && $scope.entitlements && $scope.entitlements.indexOf('FXWEB_AUTHORIZE_PAYMENT') == -1) { 896 return true; 897 } 898 return false;
899 }; 900 901 $scope.$watch("le", function (newLe) { 902 if (newLe && $scope.editTransferMode && $scope.privateTrade && ($scope.privateTrade.status.id === "PendingApproval" || $scope.privateTrade.status.id === "PartiallyApproved")) { 903 determineApproverLevelForTransfer(); 904 } 905 if (newLe && !$scope.editTransferMode && $scope.transfer) { 906 $scope.noOfApprovalsRequiredForTransfer = computeNoOfApprovalsRequiredFromEntity(); 907 } 908 }, true); 909 910 $scope.$watch(function () { 911 var t = $scope.transfer; 912 return t && (t.paymentAmount != null || (t.fxSpotForward && (t.fxSpotForward.dealCcy || t.fxSpotForward.debitCcy || t.fxSpotForward.creditCcy))); 913 }, function () { 914 if (!$scope.editTransferMode && $scope.le && $scope.transfer) { 915 $scope.noOfApprovalsRequiredForTransfer = computeNoOfApprovalsRequiredFromEntity(); 916 } 917 }); 918 919 /*** Edit Transfer Starts ***/ 920 921 $scope.loadTransferObj = function(response){ 922 if($stateParams.transferId){ 923 $scope.viewTransferMode=$stateParams.view=='view'?true:false; 924 $scope.privateTrade = response.responseObj; 925 rememberMissedTransferRepriceIfNeeded($scope.privateTrade); 926 $scope.missedTransferRepriceGotRate = false; 927 $scope.editTransferMode = true; 928 $scope.isStramingRate = false; 929 $scope.displayRateTimer = false; 930 $scope.displayExRateInfo = false; 931 $scope.quoteId = undefined; 932 $scope.ticketId = undefined; 933 $timeout.cancel(timer); 934 if ($scope.stopKnob) { 935 $scope.stopKnob(); 936 } 937 updateTransferCancelButtonVisibility(); 938 $scope.displayExRateInfo = true; 939 $scope.transfer=$scope.privateTrade; 940 $scope.rateaccepted = true; 941 942 $scope.transfer.isoCurrency=$scope.privateTrade.fxSpotForward.debitCcy; 943 var fromAccount=angular.copy($scope.getAccountById($scope.privateTrade.fromAccId)); 944 var toAccount=angular.copy($scope.getAccountById($scope.privateTrade.toAccId)); 945 $scope.fromAccount=fromAccount; 946 $scope.fromAccountOnChange(); 947 $scope.toAccount=toAccount; 948 $scope.transfer.paymentDate=$scope.privateTrade.fxSpotForward.valueDate; 949 $scope.transfer.tradeDate=$scope.privateTrade.tradeDate; 950 $scope.transfer=formatPaymentDate($scope.transfer); 951 $scope.isAllowedToApprove(); 952 if (needsTransferApproverVisibilityRefresh()) { 953 determineApproverLevelForTransfer(); 954 } 955 $scope.getCcyPair(); 956 $scope.expMsg="Accepted Rate:"; 957 $scope.exchangeRateInformation=$scope.privateTrade.fxSpotForward; 958 setTransferRateDisplayLinesFromFx(response.responseObj.fxSpotForward); 959 var _pricingStatus=$scope.privateTrade.pricingStatus; 960 if(_pricingStatus.id=="Cancelled" || _pricingStatus.id=="RejectedByTrader" 961 || _pricingStatus.id=="Declined" || _pricingStatus.id=="RejectedBySystem"){ 962 $scope.ratetxt = null; 963 $scope.ratetxtInverse = ""; 964 $scope.expMsg = null; 965 $scope.exchangeRateInformation =null; 966 $scope.viwTradeError= _pricingStatus.desc + "<br><strong> Reason: " + $scope.privateTrade.messageToCustomer + "</strong>"; 967 } else { 968 var fx = response.responseObj.fxSpotForward; 969 if (fx && fx.allInRate) { 970 $scope.previousAcceptedRate = { fxSpotForward: angular.copy(fx), externalRefId: response.responseObj.externalRefId }; 971 } 972 } 973 if($scope.privateTrade.fxSpotForward.dealCcy == toAccount.depositCcy){ 974 $scope.amountOption = "notEquivalent"; 975 }else{ 976 $scope.amountOption = "equivalent"; 977 } 978 if($scope.privateTrade.status.id == "Cancelled" || $scope.privateTrade.status.id == "Approved" || $scope.privateTrade.status.id == "Booked"){ 979 $scope.showCancelButton=false; 980 } 981 $scope.isSameCurrency(); 982 $scope.getDeliveryMethod($scope.fromAccount); 983 setAccountSelectsDisabled(); 984 //}); 985 } 986 } 987 988 /*** Set user eligibility to approve Transfer ***/ 989 $scope.isAllowedToApprove= function(){ 990 var userId = _user.userId.toLowerCase(); 991 var submitter = $scope.transfer.submitterId?$scope.transfer.submitterId.toLowerCase():""; 992 var authorizedBy = $scope.transfer.approver1Id?$scope.transfer.approver1Id.toLowerCase():""; 993 if(submitter == userId){ 994 $scope.disabledMsg = "Same user is not allowed to Approve."; 995 $scope.isAllowedToApproveTransfer = false;
996 }else if(authorizedBy == userId){ 997 $scope.disabledMsg = "You've already Approved."; 998 $scope.isAllowedToApproveTransfer = false; 999 }else{ 1000 $scope.disabledMsg = ""; 1001 $scope.isAllowedToApproveTransfer=true; 1002 } 1003 if (needsTransferApproverVisibilityRefresh()) { 1004 determineApproverLevelForTransfer(); 1005 } 1006 } 1007 1008 $scope.approveTransfer = function () { 1009 $scope.formErrorMessage = ""; 1010 $scope.formError = false; 1011 var isFinalApprover = $rootScope.isSavePaymentEnabled && $scope.isCurrentUserFinalApprover; 1012 PaymentService.oobaWithCallBack(null, "ApprovePayment", $scope.transfer.id, null, isFinalApprover).then(function (response) { 1013 if (typeof response.result === 'object') { 1014 callbackApprovePayment(response.result); 1015 } else { 1016 $("#payment_ooba").html(response.result); 1017 $("select[name='fromAccount']").prop('disabled', true); 1018 $("select[name='toAccount']").prop('disabled', true); 1019 $scope.disableTransferFields = true; 1020 $scope.loadingScreen = false; 1021 $scope.hideGetRateBtn = true; 1022 $scope.viewTransferMode = true; 1023 $scope.initiateOOBA(callbackApprovePayment, null, "ApprovePayment", $scope.transfer.id); 1024 } 1025 }); 1026 } 1027 1028 function callbackApprovePayment(data){ 1029 if(data.errorResponse){ 1030 $scope.formErrorMessage = data.errorMessage?data.errorMessage:data.errorResponse; 1031 $scope.formError = true; 1032 $scope.viewTransferMode = false; 1033 }else{ 1034 $state.go("home.makePayment.paymentActivity",{}); 1035 } 1036 } 1037 1038 $scope.getAccountById= function(accountId){ 1039 var account={}; 1040 angular.forEach($scope.mcaAccountList,function(value, key) { 1041 if (accountId == value.id) { 1042 account=value; 1043 } 1044 }); 1045 return account; 1046 } 1047 1048 $scope.pinVerifyCallBack = function(){ 1049 $scope.pinVerified = angular.copy(true); 1050 } 1051 1052 $scope.waitingForGetRate = function(){ 1053 $scope.waitForGetRate=true; 1054 } 1055 $scope.amountChanged = function(){ 1056 if($scope.transfer.paymentAmount){ 1057 $scope.disableConfirmation = false; 1058 }else{ 1059 $scope.disableConfirmation = true; 1060 } 1061 } 1062 1063 /****** 1064 ** Amount Selection validation. 1065 */ 1066 $scope.$watch('amountOption', function() { 1067 if(!$rootScope.isUndefined($scope.fromAccount) && !$rootScope.isUndefined($scope.toAccount)){ 1068 setFxSpotforward(); 1069 } 1070 }); 1071 1072 function setFxSpotforward(){ 1073 var _dealCcy; 1074 let fundingAcctId=$scope.fromAccount.id; 1075 if($scope.amountOption && $scope.amountOption=="equivalent"){ 1076 _dealCcy = $scope.fromAccount.depositCcy; 1077 }else{ 1078 _dealCcy = $scope.toAccount.depositCcy; 1079 } 1080 updateAmountPrecision(); 1081 $scope.transfer.fxSpotForward.dealCcy=_dealCcy; 1082 } 1083 1084 function updateAmountPrecision(){ 1085 var _dealCcy = (!$rootScope.isUndefined($scope.amountOption) && $scope.amountOption == "equivalent") ? $scope.fromAccount.depositCcy : $scope.toAccount.depositCcy; 1086 if(!$rootScope.isUndefined($scope.baseCcyAmountPrecision) || !$rootScope.isUndefined($scope.quoteCcyAmountPrecision)){ 1087 if(_dealCcy == $scope.baseCcy){ 1088 $scope.numberOfDecimals = $scope.baseCcyAmountPrecision; 1089 } 1090 else{ 1091 $scope.numberOfDecimals = $scope.quoteCcyAmountPrecision; 1092 } 1093 if ($scope.transfer.paymentAmount && $scope.transfer.paymentAmount !== '') { 1094 $scope.transfer.paymentAmount = parseFloat($scope.transfer.paymentAmount).toFixed($scope.numberOfDecimals); 1095 } 1096 } 1097 1098 } 1099 1100 /******************** 1101 ***** Get Rate ****** 1102 ********************/ 1103 $scope.getRate = function(){ 1104 $scope.isStramingRate = false; 1105 $scope.loadingScreen = true; 1106 $scope.displayExRateInfo = false; 1107 $scope.getRateError = undefined; 1108 $scope.showGetRateForPricingCustomerMessage = false; 1109 $scope.expMsg = ""; 1110 $scope.initiatorIndicativeDisclaimerAfterSuccessfulRate = false; 1111 $scope.invalidAmount =false; 1112 $scope.getPinNotVerifiedError =""; 1113 $scope.formErrorMessage =""; 1114 if($scope.transfer.paymentAmount && parseFloat($scope.transfer.paymentAmount)<=parseFloat("0") || $rootScope.isUndefined($scope.transfer.paymentAmount) || $rootScope.isUndefined($scope.transferMethod) 1115 ){ 1116 if(parseFloat($scope.transfer.paymentAmount)<=parseFloat("0")){ 1117 $scope.getRateError = "Please enter currency amount greater than zero."; 1118 $scope.invalidAmount =true; 1119 }else{ 1120 $scope.getRateError = ""; 1121 if( !$scope.transfer.paymentAmount ){
1122 $scope.getRateError = $scope.getRateError + "Please provide amount." + "<br>"; 1123 } 1124 if( $rootScope.isUndefined($scope.transferMethod)){ 1125 $scope.getRateError = $scope.getRateError + "Please select delivery method." + "<br>"; 1126 } 1127 } 1128 1129 $scope.requiredToGetRate = true; 1130 $scope.loadingScreen = false; 1131 }else{ 1132 1133 if(parseFloat($scope.transfer.paymentAmount)<=parseFloat("0")){ 1134 $scope.getRateError = "Please enter currency amount greater than zero."; 1135 $scope.invalidAmount =true; 1136 $scope.loadingScreen = false; 1137 }else{ 1138 1139 // get rate main functionality. 1140 $scope.transfer.fromAccId=$scope.fromAccount.id; 1141 $scope.transfer.toAccId=$scope.toAccount.id; 1142 let _transfer = angular.copy($scope.transfer); 1143 let _paymentAmount = angular.copy(_transfer.paymentAmount); 1144 if($scope.amountOption == "equivalent"){ 1145 if(_transfer.fxSpotForward.debitCcy == $scope.fromAccount.depositCcy){ 1146 _transfer.fxSpotForward.debitCcyAmount = angular.copy(_paymentAmount); 1147 }else if(_transfer.fxSpotForward.creditCcy == $scope.fromAccount.depositCcy){ 1148 _transfer.fxSpotForward.creditCcyAmount = angular.copy(_paymentAmount); 1149 } 1150 }else{ 1151 if(_transfer.fxSpotForward.debitCcy == $scope.toAccount.depositCcy){ 1152 _transfer.fxSpotForward.debitCcyAmount = angular.copy(_paymentAmount); 1153 }else if(_transfer.fxSpotForward.creditCcy == $scope.toAccount.depositCcy){ 1154 _transfer.fxSpotForward.creditCcyAmount = angular.copy(_paymentAmount); 1155 } 1156 } 1157 1158 _transfer.detailsOfCharges = null; 1159 _transfer.paymentDeliveryMethod = angular.copy($scope.transferMethod); 1160 let _formatedPayment = formatPaymentDate(_transfer); 1161 // Keep server-assigned id on repricing (do not strip). If scope.transfer lost id, use privateTrade. 1162 if (!_formatedPayment.id && $scope.privateTrade && $scope.privateTrade.id) { 1163 _formatedPayment.id = $scope.privateTrade.id; 1164 } 1165 if ($scope.editTransferMode && !_formatedPayment.id) { 1166 $scope.loadingScreen = false; 1167 $scope.getRateError = "Transfer reference is missing. Please reload and try again."; 1168 return; 1169 } 1170 if (_formatedPayment.id) { 1171 $scope.transfer.id = _formatedPayment.id; 1172 } 1173 var _transferStatus = _transfer.status; 1174 if (!_transferStatus && $scope.privateTrade && $scope.privateTrade.status) { 1175 _transferStatus = $scope.privateTrade.status; 1176 } 1177 var normalizedTransferStatus = normalizePaymentStatusForRequest(_transferStatus); 1178 if (normalizedTransferStatus) { 1179 _formatedPayment.status = normalizedTransferStatus.id; 1180 } else { 1181 delete _formatedPayment.status; 1182 } 1183 $scope.paymentRequest = angular.copy(_formatedPayment); 1184 $scope.missedTransferRepriceGotRate = true; 1185 var isFinalApproverGetRate = $scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired(); 1186 if (!_formatedPayment.businessUnitId) { 1187 _formatedPayment.externalRefId = null; 1188 } 1189 if($scope.privateTrade && $scope.privateTrade.externalRefId){ 1190 _formatedPayment.externalRefId = $scope.privateTrade.externalRefId; 1191 } 1192 PaymentService.oobaWithCallBack(_formatedPayment, "GetRate", _formatedPayment.id, null, isFinalApproverGetRate).then(function (response) { 1193 if (typeof response.result === 'object') { 1194 getRateCallBack(response.result); 1195 } else { 1196 $("#differentCCY_ooba").html(response.result); 1197 $("select[name='fromAccount']").prop('disabled',true); 1198 $("select[name='toAccount']").prop('disabled',true); 1199 $scope.disableTransferFields = true; 1200 $scope.loadingScreen = false; 1201 $scope.hideGetRateBtn = true; 1202 $scope.initiateOOBA(getRateCallBack, _formatedPayment, "GetRate", _formatedPayment.id); 1203 } 1204 }).catch(function (err) { 1205 $scope.missedTransferRepriceGotRate = false; 1206 $scope.loadingScreen = false; 1207 $scope.disableTransferFields = false; 1208 $scope.hideGetRateBtn = false; 1209 setAccountSelectsDisabled(); 1210 $timeout(function () { 1211 $scope.getRateError = (err.data && (err.data.errorResponse || err.data.message)) || (err.data && err.data.responseObj && err.data.responseObj.messageToCustomer) || "Unable to get rate. Please try again."; 1212 }, 500); 1213 }); 1214 } 1215 } 1216 } 1217 1218 function getRateCallBack(response) { 1219 if (response.responseObj) { 1220 updatePaymentObjectFromServer(response.responseObj); 1221 } 1222 if (response.success) { 1223 $("select[name='fromAccount']").prop('disabled', true); 1224 $("select[name='toAccount']").prop('disabled', true); 1225 $scope.disableTransferFields = true; 1226 $scope.loadingScreen = false;
1227 $timeout.cancel(timer); 1228 applyCrossCcyPricedRate(response.responseObj); 1229 } else { 1230 setAccountSelectsDisabled(); 1231 $scope.disableTransferFields = false; 1232 var _pricingDesc = response.responseObj && response.responseObj.pricingStatus 1233 && (response.responseObj.pricingStatus.desc || response.responseObj.pricingStatus.id); 1234 if (response.errorResponse == "WaitingRFQ") { 1235 $scope.loadingScreen = true; 1236 $scope.hideGetRateBtn = false; 1237 $timeout(function () { 1238 $scope.getRateError = _pricingDesc || response.errorResponse; 1239 }, 500); 1240 $scope.poll(response.responseObj.id); 1241 $scope.tradeNo = response.responseObj.externalRefId; 1242 $scope.transfer.status = response.errorResponse; 1243 } else if (response.errorResponse == "WaitingRFP") { 1244 $scope.loadingScreen = true; 1245 $scope.hideGetRateBtn = false; 1246 $timeout(function () { 1247 $scope.getRateError = _pricingDesc || response.errorResponse; 1248 }, 500); 1249 $scope.ticketId = response.responseObj.quoteId; 1250 $scope.isStramingRate = true; 1251 $scope.transfer.executionVenue = response.responseObj.executionVenue; 1252 updateTransferCancelButtonVisibility(); 1253 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) { 1254 $("select[name='fromAccount']").prop("disabled", true); 1255 $("select[name='toAccount']").prop("disabled", true); 1256 $scope.disableTransferFields = true; 1257 } 1258 $scope.pollStreamingRate($scope.ticketId); 1259 } else if (!response.success) { 1260 $scope.missedTransferRepriceGotRate = false; 1261 $scope.loadingScreen = false; 1262 $timeout(function () { 1263 $scope.getRateError = response.errorResponse || (response.responseObj && response.responseObj.messageToCustomer) || "An error occurred while getting the rate."; 1264 }, 500); 1265 $scope.hideGetRateBtn = false; 1266 } 1267 } 1268 } 1269 1270 $scope.initiateOOBA = function (callBackfunc, requestObj, action, paymentId) { 1271 function getDeliveryMethod() { 1272 return $('input[name="deliveryMethod"]:checked').val(); 1273 } 1274 1275 $(".btnCreateSubmit").click(function () { 1276 var deliveryMethod = getDeliveryMethod(); 1277 $("#deliveryMethodError").val(""); 1278 if (!deliveryMethod) { 1279 $("#deliveryMethodError").val("Please select delivery method.") 1280 return; 1281 } 1282 1283 PinService.requestPin(deliveryMethod).then(function (response) { 1284 $("#ooba_create").hide(); 1285 $("#ooba_validate").show(); 1286 }); 1287 }); 1288 1289 $(".btnValidateResent").click(function () { 1290 $("#otp_text").val(""); 1291 $(".error-message").text(""); 1292 $("#ooba_create").show(); 1293 $("#ooba_validate").hide(); 1294 }); 1295 1296 $(".btnValidateSubmit").click(function () { 1297 var otp = $("#otp_text").val(); 1298 if (!otp) { 1299 $('#invalid-error').val('Please enter the pin.'); 1300 return; 1301 } 1302 1303 PinService.validatePaymentPin(otp, requestObj, action, paymentId).then(function (response) { 1304 $("#payment_ooba").html(""); 1305 $("#differentCCY_ooba").html(""); 1306 if (typeof response.result === 'object') { 1307 callBackfunc(response.result); 1308 $scope.pinVerified = true; 1309 } else { 1310 if (action === "GetRate") { 1311 $("#differentCCY_ooba").html(response.result); 1312 } else { 1313 $("#payment_ooba").html(response.result); 1314 } 1315 $scope.initiateOOBA(callBackfunc, requestObj, action, paymentId); 1316 } 1317 }); 1318 }); 1319 } 1320 1321 $scope.setAmountAfterPricing=function(_transfer){ 1322 if(_transfer.fxSpotForward.dealCcy==_transfer.fxSpotForward.debitCcy){ 1323 $scope.transfer.paymentAmount=_transfer.fxSpotForward.debitCcyAmount; 1324 }else{ 1325 $scope.transfer.paymentAmount=_transfer.fxSpotForward.creditCcyAmount; 1326 } 1327 } 1328 1329 function updatePaymentObjectFromServer(_transfer) { 1330 if (!_transfer) { 1331 return; 1332 } 1333 if (_transfer.fxSpotForward && _transfer.fxSpotForward.valueDate !== undefined && _transfer.fxSpotForward.valueDate !== null && _transfer.fxSpotForward.valueDate !== "") { 1334 var _valueDate = angular.copy(_transfer.fxSpotForward.valueDate); 1335 var _vd = new Date(_valueDate); 1336 if (!isNaN(_vd.getTime())) { 1337 _transfer.fxSpotForward.valueDate = angular.copy(_vd); 1338 if ($scope.transfer && $scope.transfer.fxSpotForward) { 1339 $scope.transfer.fxSpotForward.valueDate = angular.copy(_vd); 1340 } 1341 } 1342 } 1343 $scope.transfer.id = _transfer.id; 1344 if (_transfer.externalRefId != null && _transfer.externalRefId !== "") { 1345 $scope.transfer.externalRefId = _transfer.externalRefId; 1346 } 1347 if (_transfer.usdAmount != null && _transfer.usdAmount !== undefined) { 1348 $scope.transfer.usdAmount = _transfer.usdAmount; 1349 } 1350 } 1351 1352 function formatPaymentDate(_payment){ 1353 if(_payment.deliveryDate){ 1354 let _deliveryDate = new Date(_payment.deliveryDate); 1355 _payment.deliveryDate = formatDateMMDDYYYY(_deliveryDate); 1356 } 1357 if(_payment.tradeDate){ 1358 let _tradeDate = new Date(_payment.tradeDate); 1359 _payment.tradeDate = formatDateMMDDYYYY(_tradeDate); 1360 } 1361 if(_payment.fxSpotForward.valueDate){ 1362 let _valueDate = new Date(_payment.fxSpotForward.valueDate); 1363 _payment.fxSpotForward.valueDate = formatDateMMDDYYYY(_valueDate); 1364 } 1365 return _payment; 1366 } 1367 1368 function normalizePaymentStatusForRequest(st) { 1369 if (st == null || st === '') { 1370 return undefined; 1371 }
1372 if (typeof st === 'object' && st !== null && st.id) { 1373 return { id: st.id, desc: st.desc != null ? st.desc : st.id }; 1374 } 1375 if (typeof st === 'string') { 1376 return { id: st }; 1377 } 1378 return undefined; 1379 } 1380 1381 function formatDateMMDDYYYY(date){ 1382 let _date = new Date(date); 1383 let dd = _date.getDate(); 1384 let mm = _date.getMonth()+1; //January is 0! 1385 1386 let yyyy = _date.getFullYear(); 1387 if(dd<10){ 1388 dd='0'+dd; 1389 } 1390 if(mm<10){ 1391 mm='0'+mm; 1392 } 1393 return (mm+'/'+dd+'/'+yyyy); 1394 } 1395 $scope.displayRate=function(payment){ 1396 $scope.getRateError = undefined; 1397 setTransferRateDisplayLinesFromFx(payment.fxSpotForward); 1398 $scope.tradeNo=payment.externalRefId; 1399 $scope.exchangeRateInformation = payment.fxSpotForward; 1400 $scope.displayExRateInfo = true; 1401 } 1402 1403 function applyTransferPricedWithCustomerMessageRecovery(customerMessage, isStreamingPoll) { 1404 $scope.loadingScreen = false; 1405 $timeout.cancel(timer); 1406 setAccountSelectsDisabled(); 1407 $scope.disableTransferFields = false; 1408 if (isStreamingPoll) { 1409 $scope.isStramingRate = false; 1410 } 1411 $scope.missedTransferRepriceGotRate = false; 1412 $scope.displayRateTimer = false; 1413 if ($scope.stopKnob) { 1414 $scope.stopKnob(); 1415 } 1416 $scope.displayExRateInfo = false; 1417 $timeout(function () { 1418 $scope.getRateError = customerMessage; 1419 }, 500); 1420 var previousAcceptedRate = $scope.previousAcceptedRate; 1421 if ($stateParams.transferId && previousAcceptedRate && $scope.transfer && $scope.transfer.fxSpotForward) { 1422 angular.extend($scope.transfer.fxSpotForward, previousAcceptedRate.fxSpotForward); 1423 $scope.exchangeRateInformation = $scope.transfer.fxSpotForward; 1424 setTransferRateDisplayLinesFromFx($scope.exchangeRateInformation); 1425 $scope.displayExRateInfo = true; 1426 if (previousAcceptedRate.externalRefId) { 1427 $scope.tradeNo = previousAcceptedRate.externalRefId; 1428 $scope.transfer.externalRefId = previousAcceptedRate.externalRefId; 1429 } 1430 } 1431 $scope.hideGetRateBtn = false; 1432 $scope.showGetRateForPricingCustomerMessage = true; 1433 } 1434 1435 /***** 1436 ** Poll Continuiosly to get the rate when Waiting RFQ 1437 */ 1438 var timer; 1439 $scope.poll = function( _paymentId ){ 1440 timer = $timeout(function () { 1441 PaymentService.poll(_paymentId).then(function(response){ 1442 var data = response; 1443 if(data.errorResponse && data.errorResponse.indexOf("Rejected By Trader") != -1 && !data.success){ 1444 $scope.missedTransferRepriceGotRate = false; 1445 setAccountSelectsDisabled(); 1446 $scope.disableTransferFields = false; 1447 $scope.loadingScreen = false; 1448 $timeout.cancel(timer); 1449 $timeout(function () { 1450 $scope.getRateError = data.errorResponse; 1451 }, 500); 1452 } else if(!data.success && data.errorResponse){ 1453 $scope.loadingScreen = false; 1454 $timeout.cancel(timer); 1455 $timeout(function () { 1456 $scope.getRateError = data.errorResponse; 1457 }, 500); 1458 $scope.cancelRate(); 1459 } else if(data.errorResponse == "Declined" && !data.success){ 1460 $scope.missedTransferRepriceGotRate = false; 1461 } else if(data.success && data.responseObj.pricingStatus.id == "Priced" && data.responseObj.messageToCustomer){ 1462 applyTransferPricedWithCustomerMessageRecovery(data.responseObj.messageToCustomer, false); 1463 } else if(data.success && data.responseObj.pricingStatus.id == "Priced"){ 1464 $("select[name='fromAccount']").prop('disabled', true); 1465 $("select[name='toAccount']").prop('disabled', true); 1466 $scope.disableTransferFields = true; 1467 applyCrossCcyPricedRate(data.responseObj); 1468 } else if( data.responseObj){ 1469 $scope.poll( _paymentId ); 1470 } 1471 }); 1472 }, 1000); 1473 } 1474 1475 $scope.pollStreamingRateCount=0; 1476 /***** 1477 ** Streaming Rates 1478 ** Poll Every 5 Seconds to get the Streaming Rates 1479 **/ 1480 $scope.pollStreamingRate = function( ticketId ){ 1481 $scope.pollStreamingRateCount+=3; 1482 var stopPolling=$scope.PollDuration?parseInt($scope.PollDuration):15; 1483 let beneAcctId = angular.copy($scope.toAccount.id); 1484 $scope.paymentRequest.quoteId = ticketId; 1485 timer = $timeout(function () { 1486 PaymentService.pollRFP($scope.paymentRequest).then(function(response){ 1487 $scope.loadingScreen = false;
1488 var data = response; 1489 if(data.errorResponse == "RejectedByTrader" && !data.success ){ 1490 $scope.missedTransferRepriceGotRate = false; 1491 $scope.loadingScreen = false; 1492 $timeout.cancel(timer); 1493 setAccountSelectsDisabled(); 1494 $scope.disableTransferFields = false; 1495 $scope.hideGetRateBtn = false; 1496 $scope.isStramingRate = false; 1497 $scope.displayExRateInfo = false; 1498 updateTransferCancelButtonVisibility(); 1499 $timeout(function () { 1500 $scope.getRateError = (data.responseObj && data.responseObj.messageToCustomer) || data.errorResponse || data.errorCode; 1501 }, 500); 1502 } else if(data.errorResponse == "Declined" && !data.success){ 1503 $scope.missedTransferRepriceGotRate = false; 1504 $timeout.cancel(timer); 1505 setAccountSelectsDisabled(); 1506 $scope.disableTransferFields = false; 1507 $scope.hideGetRateBtn = false; 1508 $scope.isStramingRate = false; 1509 $scope.displayExRateInfo = false; 1510 updateTransferCancelButtonVisibility(); 1511 $timeout(function () { 1512 $scope.getRateError = (data.responseObj && data.responseObj.messageToCustomer) || data.errorResponse || data.errorCode; 1513 }, 500); 1514 } else if (!data.success) { 1515 if(!data.errorResponse && $scope.pollStreamingRateCount<stopPolling){ 1516 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) { 1517 $("select[name='fromAccount']").prop("disabled", true); 1518 $("select[name='toAccount']").prop("disabled", true); 1519 $scope.disableTransferFields = true; 1520 } 1521 $scope.pollStreamingRate( ticketId ); 1522 $scope.loadingScreen = true; 1523 }else{ 1524 $scope.missedTransferRepriceGotRate = false; 1525 $timeout.cancel(timer); 1526 setAccountSelectsDisabled(); 1527 $scope.disableTransferFields = false; 1528 $scope.hideGetRateBtn = false; 1529 $scope.isStramingRate = false; 1530 $scope.displayExRateInfo = false; 1531 updateTransferCancelButtonVisibility(); 1532 $timeout(function () { 1533 $scope.getRateError = data.errorResponse || data.errorCode || (data.responseObj && data.responseObj.messageToCustomer) || $rootScope.streamingRateError || 'Unable to get streaming rate.'; 1534 }, 500); 1535 } 1536 } else if(data.success && data.responseObj.pricingStatus && data.responseObj.pricingStatus.id == "Priced" && data.responseObj.messageToCustomer){ 1537 applyTransferPricedWithCustomerMessageRecovery(data.responseObj.messageToCustomer, true); 1538 } else if(data.success){ 1539 var _payment=data.responseObj; 1540 $scope.loadingScreen = false; 1541 $timeout.cancel(timer); 1542 if(_payment && _payment.fxSpotForward.creditCcyAmount){ 1543 $scope.transfer.fxSpotForward.debitCcyAmount =_payment.fxSpotForward.debitCcyAmount; 1544 $scope.transfer.fxSpotForward.creditCcyAmount =_payment.fxSpotForward.creditCcyAmount; 1545 $scope.transfer.fxSpotForward.allInRate =_payment.fxSpotForward.allInRate; 1546 $scope.quoteId=_payment.quoteId; 1547 if(_payment.paymentFee){ 1548 $scope.transfer.paymentFee=_payment.paymentFee; 1549 } 1550 applyCrossCcyPricedRate(data.responseObj); 1551 }else{ 1552 if($scope.pollStreamingRateCount<stopPolling){ 1553 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) { 1554 $("select[name='fromAccount']").prop("disabled", true); 1555 $("select[name='toAccount']").prop("disabled", true); 1556 $scope.disableTransferFields = true; 1557 } 1558 $scope.pollStreamingRate( ticketId ); 1559 $scope.loadingScreen = true; 1560 }else{ 1561 $scope.missedTransferRepriceGotRate = false; 1562 $scope.loadingScreen = false; 1563 $scope.pollStreamingRateCount=0; 1564 setAccountSelectsDisabled(); 1565 $scope.disableTransferFields = false; 1566 $scope.hideGetRateBtn = false; 1567 $scope.isStramingRate = false; 1568 updateTransferCancelButtonVisibility(); 1569 $timeout(function () { 1570 $scope.getRateError = $rootScope.streamingRateError; 1571 }, 500); 1572 } 1573 } 1574 } 1575 }); 1576 }, 3000); 1577 } 1578 1579 /** 1580 * This function will start the timer 1581 */ 1582 $scope.startKnob = function() { 1583 1584 /******************* 1585 NG-KNOB Options 1586 *******************/ 1587 var options = { 1588 subText: { 1589 enabled: true, 1590 text: '', 1591 color: 'black', 1592 font: '11' 1593 }, 1594 min: 0, 1595 max: $scope.expiryValue, 1596 scale: { 1597 enabled: true, 1598 type: 'lines', 1599 color: 'gray', 1600 width: 0, 1601 quantity: 0, 1602 height: 2 1603 }, 1604 animate: { 1605 enabled: true, 1606 duration: 2000,
1607 ease: 'linear' 1608 }, 1609 size: 140, 1610 fontSize: 30, 1611 trackWidth: 5, 1612 readOnly: true, 1613 barWidth: 5, 1614 step: 1, 1615 trackColor: 'rgba(52,152,219,.1)', 1616 barColor: '#00a792', 1617 barCap: 5, 1618 dynamicOptions: true, 1619 1620 }; 1621 $scope.knobOptions = angular.copy(options); 1622 1623 //KNOB PRE-DEFINED OPTIONS 1624 /* $scope.expiryValue = 0; 1625 $scope.knobValue = 0; 1626 $scope.knobOptions = {};*/ 1627 $scope.knobValue = 0; 1628 $scope.timerVal = 0; 1629 var _val = 0; 1630 var started = Date.now(); 1631 if(!$scope.loopStart){ 1632 $scope.interval = $interval(function() { 1633 $scope.loopStart = true; 1634 var _int = $scope.expiryValue * 1000; 1635 if (Date.now() - started >= _int) { 1636 $scope.stopKnob(); 1637 $scope.showCancelButton=true; 1638 $scope.displayExRateInfo = false; 1639 $scope.cancelRate(); 1640 } else { 1641 $scope.knobValue = _val; 1642 $scope.timerVal = angular.copy($scope.expiryValue - ($scope.knobValue)); 1643 _val = _val + 0.01; 1644 } 1645 }, 10); 1646 } 1647 }; 1648 $scope.rejectRate = function(_val){ 1649 $scope.missedTransferRepriceGotRate = false; 1650 $scope.initiatorIndicativeDisclaimerAfterSuccessfulRate = false; 1651 $scope.stopKnob(); 1652 $scope.rateaccepted = false; 1653 $scope.isStramingRate = false; 1654 $scope.displayExRateInfo = false; 1655 $scope.exchangeRateInformation=undefined; 1656 $scope.ratetxt=""; 1657 $scope.ratetxtInverse = ""; 1658 $scope.expMsg=(_val)?"":EXCHANGE_RATE_REJECTED_USER_MSG; 1659 if (_val !== "watch" && $scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) { 1660 $scope.expMsg = getAcceptedRateHeaderForTransfer(); 1661 } 1662 setAccountSelectsDisabled(); 1663 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) { 1664 $scope.disableTransferFields = true; 1665 $scope.disableAmount = !!$scope.isSameCurrencyTransfer; 1666 } else { 1667 $scope.disableTransferFields = false; 1668 $scope.disableAmount = false; 1669 } 1670 $timeout.cancel(timer); 1671 updateTransferCancelButtonVisibility(); 1672 if ($scope.editTransferMode && $scope.privateTrade && ($scope.privateTrade.status.id === 'PendingApproval' || $scope.privateTrade.status.id === 'PartiallyApproved')) { 1673 determineApproverLevelForTransfer(); 1674 } else { 1675 $scope.hideGetRateBtn = false; 1676 } 1677 } 1678 1679 $scope.cancelRate = function(){ 1680 $scope.rejectRate(); 1681 if(($scope.tradeNo!=null && $scope.tradeNo!="") || $scope.ticketId){ 1682 PaymentService.rejectRate($scope.tradeNo,$scope.ticketId).then(function(response){ 1683 if(response.success){ 1684 $scope.rejectRate(); 1685 var previousAcceptedRate = $scope.previousAcceptedRate; 1686 if ($stateParams.transferId && previousAcceptedRate && $scope.transfer && $scope.transfer.fxSpotForward) { 1687 angular.extend($scope.transfer.fxSpotForward, previousAcceptedRate.fxSpotForward); 1688 $scope.exchangeRateInformation = $scope.transfer.fxSpotForward; 1689 setTransferRateDisplayLinesFromFx($scope.exchangeRateInformation); 1690 $scope.displayExRateInfo = true; 1691 if (previousAcceptedRate.externalRefId) { 1692 $scope.tradeNo = previousAcceptedRate.externalRefId; 1693 $scope.transfer.externalRefId = previousAcceptedRate.externalRefId; 1694 } 1695 if ($scope.isTransferDualSaveFlow() && $scope.isFinalApproverRateAcceptanceRequired()) { 1696 $scope.expMsg = getAcceptedRateHeaderForTransfer(); 1697 } 1698 } 1699 } 1700 }); 1701 } 1702 } 1703 1704 $scope.acceptRate = function(){ 1705 $scope.stopKnob(); 1706 $scope.showCancelButton=false; 1707 $scope.disableConfirmation=false; 1708 var quoteId=null; 1709 var ticketId=null; 1710 if($scope.isStramingRate){ 1711 $timeout.cancel(timer); 1712 quoteId=$scope.quoteId; 1713 ticketId=$scope.ticketId; 1714 let _payment=angular.copy($scope.transfer); 1715 _payment.paymentDeliveryMethod = angular.copy($scope.transferMethod); 1716 _payment=formatPaymentDate(_payment); 1717 PaymentService.acceptStreamingRate(_payment,ticketId,quoteId).then(function(response){ 1718 var data = response; 1719 var responseObj = response.responseObj; 1720 if( responseObj ){ 1721 $timeout(function(){ 1722 clearMissedTransferRepriceSessionIfFinalApprover(); 1723 $scope.expMsg="Accepted Rate:"; 1724 $scope.displayExRateInfo = true; 1725 $scope.rateaccepted = angular.copy(true); 1726 $scope.isStramingRate = false;
1727 $scope.disablePaymentFields = true; 1728 $scope.transfer.externalRefId = responseObj.externalRefId; 1729 updatePaymentObjectFromServer(responseObj); 1730 $scope.showCancelButton = false; 1731 $scope.paymentProcessed = true; 1732 $state.go("home.makePayment.transferConfirmation",{transferId:$scope.transfer.id}); 1733 }); 1734 }else if("POLL_FOR_TRADE" === data.errorCode) { 1735 $scope.rateaccepted = angular.copy(false); 1736 $scope.POLL_FOR_TRADE($scope.ticketId,_payment); 1737 }else{ 1738 $scope.rejectRate(); 1739 $timeout(function () { 1740 $scope.getRateError = response.errorResponse; 1741 }, 500); 1742 } 1743 }); 1744 }else{ 1745 PaymentService.accept_rate( $scope.transfer.id).then(function(response){ 1746 var data = response; 1747 var responseObj = response.responseObj; 1748 if( responseObj ){ 1749 $timeout(function(){ 1750 clearMissedTransferRepriceSessionIfFinalApprover(); 1751 $scope.expMsg="Accepted Rate:"; 1752 $scope.displayExRateInfo = true; 1753 $scope.rateaccepted = angular.copy(true); 1754 $scope.isStramingRate = false; 1755 $scope.disablePaymentFields = true; 1756 $scope.transfer.externalRefId = responseObj.externalRefId; 1757 $scope.showCancelButton = false; 1758 $scope.paymentProcessed = true; 1759 $state.go("home.makePayment.transferConfirmation",{transferId:$scope.transfer.id}); 1760 }); 1761 }else{ 1762 $scope.rejectRate(); 1763 $timeout(function () { 1764 $scope.getRateError = response.errorResponse; 1765 }, 500); 1766 } 1767 }); 1768 } 1769 } 1770 1771 $scope.POLL_FOR_TRADE=function(ticketId,_payment){ 1772 PaymentService.POLL_FOR_TRADE(ticketId,_payment.executionVenue, _payment).then(function(response){ 1773 var data = response; 1774 var responseObj = response.responseObj; 1775 if( responseObj ){ 1776 $timeout(function(){ 1777 clearMissedTransferRepriceSessionIfFinalApprover(); 1778 $scope.expMsg="Accepted Rate:"; 1779 $scope.displayExRateInfo = true; 1780 $scope.rateaccepted = angular.copy(true); 1781 $scope.disablePaymentFields = true; 1782 $scope.transfer.externalRefId = responseObj.externalRefId; 1783 updatePaymentObjectFromServer(responseObj); 1784 $scope.showCancelButton = false; 1785 }); 1786 } else if("POLL_FOR_TRADE" === data.errorResponse) { 1787 $scope.rateaccepted = angular.copy(false); 1788 $scope.POLL_FOR_TRADE( ticketId,_payment); 1789 }else{ 1790 $scope.rejectRate(); 1791 $timeout(function () { 1792 $scope.getRateError = response.errorResponse; 1793 }, 500); 1794 } 1795 }); 1796 } 1797 $scope.stopKnob = function() { 1798 $scope.loopStart = false;
1799 $scope.knobValue = 0; 1800 $interval.cancel($scope.interval); 1801 $scope.displayRateTimer = false; 1802 } 1803 1804 $scope.saveTransferToConfirmation = function () { 1805 if (!$scope.exchangeRateInformation) { 1806 return; 1807 } 1808 var tid = ($scope.transfer && $scope.transfer.id) || ($scope.privateTrade && $scope.privateTrade.id); 1809 if (!tid) { 1810 return; 1811 } 1812 $scope.rateaccepted=true; 1813 $scope.paymentProcessed = true; 1814 $state.go("home.makePayment.transferConfirmation", { transferId: tid }); 1815 }; 1816 1817 $scope.reviewTransfer = function(){ 1818 $scope.formError = false; 1819 $scope.transfer.fromAccId=$scope.fromAccount.id; 1820 $scope.transfer.toAccId=$scope.toAccount.id; 1821 let feeAmount = ($scope.transfer.paymentAmount)?$scope.transfer.paymentAmount:1; 1822 if(feeAmount && parseFloat(feeAmount)<=parseFloat("0")){ 1823 $scope.formErrorMessage = "Please enter currency amount greater than zero."; 1824 $scope.formError = true; 1825 $scope.invalidAmount =true; 1826 return; 1827 } 1828 if (!$scope.isSameCurrencyTransfer && !$scope.rateaccepted && !($scope.isTransferDualSaveFlow() && $scope.displayExRateInfo)) { 1829 $scope.formErrorMessage = "Please get the rate."; 1830 $scope.formError = true; 1831 return; 1832 } 1833 $scope.disableConfirmation=true; 1834 $scope.transfer.paymentDeliveryMethod = angular.copy($scope.transferMethod); 1835 $scope.disableConfirmation=true; 1836 if($scope.isSameCurrencyTransfer){ 1837 $scope.makeSameCcyTransfer(); 1838 }else{ 1839 $scope.postTransfer(); 1840 } 1841 } 1842 1843 $scope.makeSameCcyTransfer = function () { 1844 $scope.transfer.fxSpotForward.debitCcy = $scope.fromAccount.depositCcy; 1845 $scope.transfer.fxSpotForward.creditCcy = $scope.toAccount.depositCcy; 1846 let _transfer = angular.copy($scope.transfer); 1847 _transfer.paymentAmount = $scope.transfer.paymentAmount; 1848 let fundingAcctId = angular.copy($scope.fromAccount.id); 1849 let beneAcctId = angular.copy($scope.toAccount.id); 1850 _transfer.fxSpotForward.debitCcyAmount = $scope.transfer.paymentAmount; 1851 _transfer.fxSpotForward.creditCcyAmount = $scope.transfer.paymentAmount; 1852 _transfer.fxSpotForward.dealCcyAmount = $scope.transfer.paymentAmount; 1853 _transfer.fxSpotForward.baseCcySettlementAccountId = fundingAcctId; 1854 _transfer.fxSpotForward.quoteCcySettlementAccountId = beneAcctId; 1855 1856 let _formatedTransfer = formatPaymentDate(_transfer); 1857 PaymentService.oobaWithCallBack(_formatedTransfer, "sameCcyPayment").then(function (response) { 1858 if (typeof response.result === 'object') { 1859 sameCcyPaymentCallBack(response.result); 1860 } else { 1861 $("#payment_ooba").html(response.result); 1862 $("select[name='fromAccount']").prop('disabled', true); 1863 $("select[name='toAccount']").prop('disabled', true); 1864 $scope.disableTransferFields = true; 1865 $scope.disableAmount = true; 1866 $scope.loadingScreen = false; 1867 $scope.hideGetRateBtn = true; 1868 $scope.initiateOOBA(sameCcyPaymentCallBack, _formatedTransfer, "sameCcyPayment"); 1869 } 1870 }); 1871 } 1872 1873 function sameCcyPaymentCallBack(response) { 1874 if (response.success) { 1875 $scope.paymentProcessed = true; 1876 $state.go("home.makePayment.transferConfirmation", { transferId: response.responseObj.id }); 1877 } else {
1878 setAccountSelectsDisabled(); 1879 $scope.disableTransferFields = false; 1880 $("input[name='transferAmount']").prop('disabled', false); 1881 $scope.formErrorMessage = response.errorResponse; 1882 $scope.disableConfirmation = false; 1883 } 1884 } 1885 1886 $scope.postTransfer=function(){ 1887 let _formatedPayment = formatPaymentDate($scope.transfer); 1888 PaymentService.savePaymentInfo({},_formatedPayment, null, $scope.transfer.detailsOfCharges).then(function(response){ 1889 if(response.success){ 1890 $scope.paymentProcessed = true; 1891 $state.go("home.makePayment.transferConfirmation",{transferId:$scope.transfer.id}); 1892 }else{ 1893 // Error While submitting the payment. 1894 $scope.formErrorMessage = response.errorResponse; 1895 $scope.disableConfirmation=false; 1896 } 1897 }); 1898 } 1899 1900 $scope.isDomesticPaymentMethod = function (deliveryMethod) { 1901 var deliveryMethodMap = { 1902 "ACHSameDay": true, 1903 "ACHRegular": true, 1904 "FedWireRealTime": true, 1905 "RTPRealTime": true 1906 }; 1907 return deliveryMethodMap[deliveryMethod]; 1908 }; 1909 1910 $scope.setDeliveryMethodNote = function (deliveryMethod) { 1911 $scope.isACHRegular = false; 1912 var noteMap = { 1913 "ACHSameDay": "Expected delivery date for the transfer is same day.", 1914 "FedWireRealTime": "Expected delivery date for the transfer is in real time.", 1915 "RTPRealTime": "Expected delivery date for the transfer is in real time." 1916 }; 1917 if (deliveryMethod == "ACHRegular") { 1918 $scope.isACHRegular = true; 1919 $scope.dateNew = new Date(); 1920 $scope.transfer.fxSpotForward.valueDate = angular.copy(new Date($scope.dateNew.setDate($scope.dateNew.getDate() + 2))); 1921 noteMap.ACHRegular = "Expected delivery date for the transfer is"; 1922 } 1923 $scope.deliveryMethodNote = noteMap[deliveryMethod]; 1924 }; 1925 1926 $scope.onSelectDeliveryMethod = function () { 1927 $scope.isFutureDatedPayment = false; 1928 $scope.displayExRateInfo = false; 1929 if ($scope.editTransferMode && $scope.privateTrade && ($scope.privateTrade.status.id === 'PendingApproval' || $scope.privateTrade.status.id === 'PartiallyApproved')) { 1930 determineApproverLevelForTransfer(); 1931 } else { 1932 $scope.hideGetRateBtn = false; 1933 } 1934 $scope.rateaccepted = false; 1935 if ($("#transferMethod").val() != null) { 1936 $("#transferMethod").removeClass("txtbxReq"); 1937 } 1938 $timeout(function () { 1939 if ($scope.transferMethod) { 1940 $scope.isDomesticPayment = $scope.isDomesticPaymentMethod($scope.transferMethod) ? true : false; 1941 if ($scope.isDomesticPayment) { 1942 $scope.setDeliveryMethodNote($scope.transferMethod); 1943 } else { 1944 $scope.deliveryMethodNote = null; 1945 } 1946 $scope.getDateByTenor(); 1947 } 1948 }, 300); 1949 }; 1950 1951 $scope.getDateByTenor=function(){ 1952 PaymentService.getTenorDateMap($scope.fromAccount.depositCcy, $scope.toAccount.depositCcy).then(function(response){ 1953 var tenorMap,paymentDate; 1954 tenorMap=response.responseObj; 1955 var deliveryMethod=$scope.transferMethod; 1956 var sameDay=["SameDayPayment","ACHSameDay","FedWireRealTime","RTPRealTime"]; 1957 if(sameDay.indexOf(deliveryMethod)!=-1){ 1958 paymentDate=tenorMap["ON"]; 1959 }else if(deliveryMethod=="NextDayPayment"){ 1960 paymentDate=tenorMap["TN"]; 1961 }else if(deliveryMethod=="SpotPayment"){ 1962 paymentDate=tenorMap["SPOT"]; 1963 } 1964 if(paymentDate){ 1965 let _parts = paymentDate.split("-"); 1966 let valueDate = new Date(parseInt(_parts[0]), parseInt(_parts[1]) - 1, parseInt(_parts[2])); 1967 if(deliveryMethod=="FuturePayment" && !$stateParams.transferId){ 1968 valueDate.setDate(valueDate.getDate() + 1); 1969 $scope.minDate =angular.copy(valueDate); 1970 $scope.transfer.fxSpotForward.valueDate=null; 1971 }else{ 1972 $scope.transfer.fxSpotForward.valueDate = angular.copy(valueDate); 1973 } 1974 $scope.getDeliveryDate(); 1975 } 1976 }); 1977 }; 1978 1979 /****** 1980 ** Get Delivery Date. 1981 */ 1982 $scope.getDeliveryDate = function() { 1983 $scope.isFutureDatedPayment = false; 1984 $scope.isHoliday = false; 1985 $scope.holidayError = ""; 1986 // check for holiday 1987 // check if tradeDate is greater than spot date(today fior now) it is future dated payment. 1988 var tradeDate = new Date($scope.transfer.fxSpotForward.valueDate); 1989 var del_ethod = $scope.transferMethod; 1990 if(del_ethod=="FuturePayment"){ 1991 $scope.isFutureDatedPayment = true; 1992 $scope.rejectRate(); 1993 $scope.displayExRateInfo = true; 1994 $scope.displayRateTimer = false;
1995 $scope.rateaccepted = true; 1996 $scope.expMsg = $rootScope.paymentFutureDatedMessage; 1997 $scope.ratetxt = ""; 1998 $scope.ratetxtInverse = ""; 1999 $scope.exchangeRateInformation = undefined; 2000 let hasFutureEntitlement = $filter("contains")($rootScope.entitlements, 'FXWEB_SCHEDULED_PAYMENTS'); 2001 if(!hasFutureEntitlement){ 2002 $scope.isHoliday = true; 2003 $scope.holidayError = "You do not have permission to make FUTURE payment."; 2004 } 2005 }else if(tradeDate < $scope.today){ 2006 $scope.isHoliday = true; 2007 $scope.holidayError = "Payment date cannot be older dates. Please select "+ formatDate($scope.today) +" of after."; 2008 }else if(!$scope.transfer.id){ 2009 $scope.displayExRateInfo = false; 2010 $scope.rateaccepted = false; 2011 $scope.displayRateTimer = false; 2012 $scope.expMsg = ""; 2013 } 2014 // check for holiday. 2015 if(!$rootScope.isUndefined(tradeDate) && !isNaN(tradeDate) && 2016 !$rootScope.isUndefined($scope.fromAccount) && 2017 !$rootScope.isUndefined($scope.toAccount) && 2018 !$scope.isHoliday 2019 ){ 2020 PaymentService.checkHoliday(tradeDate, $scope.fromAccount.depositCcy, $scope.toAccount.depositCcy).then(function(response){ 2021 // Selected Date is on Holiday for either or both selected currency. 2022 if(response.success){ 2023 $scope.isHoliday = angular.copy(response.responseObj); 2024 $scope.holidayError = "Sorry cannot process payment on Holiday. Please select some other date."; 2025 }else{ 2026 $scope.isHoliday = angular.copy(true); 2027 $scope.holidayError = response.errorResponse; 2028 } 2029 2030 }); 2031 } 2032 }; 2033 2034 /****** 2035 ** To account selection get delivery method and Ccy pair. 2036 */ 2037 $scope.getDeliveryMethod = function(_account){ 2038 if(_account){ 2039 PaymentService.getPaymentDeliveryMethod($scope.transfer.fxSpotForward,$scope.isSameCurrencyTransfer).then(function(response){ 2040 $scope.deliveryMethodList=response.responseObj; 2041 selectDeliveryMethod(); 2042 }); 2043 } 2044 } 2045 2046 function selectDeliveryMethod(){ 2047 $timeout(function(){ 2048 if($stateParams.transferId){ 2049 let deliveryMethod = $scope.privateTrade.paymentDeliveryMethod; 2050 $scope.transferMethod = angular.copy(deliveryMethod); 2051 $scope.isDomesticPayment = $scope.isDomesticPaymentMethod($scope.transferMethod) ? true : false; 2052 if ($scope.isDomesticPayment) { 2053 $scope.setDeliveryMethodNote($scope.transferMethod); 2054 } else { 2055 $scope.deliveryMethodNote = null; 2056 } 2057 $scope.getDateByTenor(); 2058 } 2059 },300); 2060 } 2061 2062 /****** 2063 ** If To acocunt or from account is changed remove all updation for transfer object. 2064 */ 2065 $scope.revertPaymentObject = function(){ 2066 $scope.transfer.fxSpotForward.valueDate = undefined; 2067 $scope.transfer.paymentFee = {}; 2068 $scope.transfer.paymentAmount = undefined; 2069 $scope.transfer.fxSpotForward.paymentNotes = undefined; 2070 $scope.rejectRate("watch"); 2071 $timeout.cancel(timer); 2072 $scope.loadingScreen = false; 2073 $scope.displayExRateInfo=false; 2074 $scope.isHoliday = false; 2075 $scope.transferMethod = undefined; 2076 $scope.deliveryMethodNote = null; 2077 $scope.isACHRegular = false; 2078 $scope.exception=undefined; 2079 $scope.transfer.id=null; 2080 $scope.disableConfirmation=true; 2081 } 2082 $scope.cancelAccountTransfer = function(){ 2083 $scope.showCancelButton = false; 2084 $scope.askConfirmCancel = true; 2085 } 2086 2087 $scope.confirmCancel = function(){ 2088 if (!$scope.transfer.id && !$scope.isSameCurrencyTransfer && ($scope.tradeNo || $scope.ticketId)) { 2089 var _xferCancelPs = ($scope.privateTrade && $scope.privateTrade.pricingStatus && $scope.privateTrade.pricingStatus.id) 2090 || ($scope.transfer && $scope.transfer.pricingStatus && $scope.transfer.pricingStatus.id); 2091 if (_xferCancelPs !== "PriceInFuture") { 2092 $timeout.cancel(timer); 2093 $scope.cancelRate(); 2094 $scope.askConfirmCancel = false; 2095 bypassStateRecurrsion = true; 2096 $state.go("home.makePayment"); 2097 return; 2098 } 2099 } 2100 if(!$scope.transfer.id){ 2101 $scope.cancelRate(); 2102 bypassStateRecurrsion = true; 2103 $state.go("home.makePayment"); 2104 }else if($scope.isSavePaymentEnabled && $scope.transfer.id){ 2105 PaymentService.cancelPayment($scope.transfer.id, 0).then(function (response) {
2106 bypassStateRecurrsion = true; 2107 $state.go("home.makePayment"); 2108 }); 2109 }else{ 2110 bypassStateRecurrsion = true; 2111 $state.go("home.makePayment"); 2112 } 2113 } 2114 2115 $scope.cancelCancellation = function(){ 2116 $scope.askConfirmCancel = false; 2117 updateTransferCancelButtonVisibility(); 2118 } 2119 2120 $scope.canShowOOBA = function(){ 2121 var isOOBARequired = false; 2122 if($stateParams.transferId && $scope.privateTrade){ // View Transfer 2123 var status = $scope.privateTrade.status.id; 2124 var pricingStatus = $scope.privateTrade.pricingStatus.id; 2125 if(pricingStatus!="PriceInFuture"){ 2126 var isStatusEligibleToApprove = (status == "PendingApproval" || status == "PartiallyApproved"); 2127 var isUserAllowedToApprove = $scope.le.is2FARequiredToApprovePayment && $scope.isAllowedToApproveTransfer; 2128 isOOBARequired = isStatusEligibleToApprove && isUserAllowedToApprove; 2129 } 2130 }else{ // New Transfer 2131 isOOBARequired = $scope.twoFARequired && $scope.isSameCurrencyTransfer; 2132 } 2133 return isOOBARequired; 2134 } 2135 2136 $scope.isSaveTransferDisabled = function () { 2137 if ($scope.askConfirmCancel) { 2138 return true; 2139 } 2140 2141 if (!(($scope.transfer && $scope.transfer.id) || 2142 ($scope.privateTrade && $scope.privateTrade.id))) { 2143 return true; 2144 } 2145 2146 if ( $scope.isFinalApproverStreamingFormLockActive() || $scope.lockUiForStreamingCrossCcySession()) { 2147 return true; 2148 } 2149 if(!$scope.isSavePaymentEnabled){ 2150 if ($scope.displayRateTimer || ($scope.isStramingRate && !$scope.rateaccepted)) { 2151 return true; 2152 } 2153 } 2154 2155 if ($scope.isSavePaymentEnabled && $scope.isDualApprovalEnabled 2156 && ($scope.isUsdAmountBelowFirstApproverLimit() || $scope.isTransferAutoAuthorizeOn()) 2157 && !$scope.rateaccepted) { 2158 return true; 2159 } 2160 2161 return false; 2162 }; 2163 2164} ]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.