PageSourceSearch

https://fxboss.firstcitizens.com/app/components/payments/transfer_controller.js?v=31082026-1758

js firstcitizens.com collected 2026-09-24 21:51:16 UTC 81,610 bytes, 2,164 lines download raw bytes

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.